paprflare-sdk 0.0.21 → 0.0.23

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/utils/utils.ts","../src/utils/stream-writer.ts","../src/utils/stream-utils.ts","../src/utils/errors.ts","../src/utils/ui-stream.ts","../src/cache/cache-manager.ts","../src/database/drizzle-adapter/adapter.ts","../src/database/manager.ts","../src/database/memory/adapter.ts","../src/database/prisma-adapter/adapter.ts","../src/threads/threads-manager.ts","../src/threads/threads-pool.ts","../src/client/client.ts","../src/provider/anthropic/client.ts","../src/provider/google/client.ts","../src/provider/openai/client.ts","../src/provider/sarvam/client.ts"],"names":["generateId","prefix","id","nanoid","createCacheKey","data","stringify","formatMessages","messages","msg","retry","fn","options","lastError","delay","attempt","error","sleep","ms","resolve","chunk","array","size","chunks","i","debounce","timeoutId","args","throttle","limit","inThrottle","safeJsonParse","json","isPlainObject","value","deepMerge","target","sources","source","key","streamToArray","stream","result","item","measureTime","start","duration","StreamWriter","EventEmitter","text","now","deltaTime","chunkData","name","toolData","tool","delta","input","toolId","content","success","tokens","message","buffered","event","finalMessage","status","createStreamWriter","parseSSEStream","reader","decoder","buffer","parser","createParser","_interval","done","parsed","toReadableStream","generator","encoder","controller","pipeToResponse","response","headers","res","mergeStreams","generators","promises","gen","items","results","transformStream","transformer","transformed","filterStream","predicate","collectStream","events","takeStream","count","taken","batchStream","timeoutMs","batch","flushBatch","toFlush","flushed","remaining","PaprFlareError","code","statusCode","details","RateLimitError","retryAfter","ValidationError","ProviderError","provider","toUIStream","messageId","fullText","currentMessage","lastArtifact","processStream","handlers","uiStream","collectText","createUIMessageStream","writer","merge","t","executePromise","err","errorMessage","streamToConsole","icon","toHTTPResponse","createStreamableValue","initialValue","isDone","RedisCache","Redis","times","ttl","actualTTL","keys","MemoryCache","LRUCache","CacheManager","config","cacheData","m","cacheKey","cached","DrizzleAdapter","db","schema","sql","userId","metadata","conversation","conversationId","eq","offset","desc","updates","convIds","row","query","and","like","asc","role","existing","newId","DatabaseManager","adapter","systemPrompt","MemoryAdapter","conv","b","c","lower","found","index","convId","PrismaAdapter","prisma","conversations","ThreadManager","client","threadId","thread","upToMessageId","idx","newThread","targetThreadId","sourceThreadId","merged","a","filter","statuses","tag","q","previousStatus","priority","title","tags","fullMessage","keepLast","threads","totalMessages","sum","totalTokens","timestamps","stats","maxAge","toDelete","sort","field","dir","av","bv","ThreadPool","manager","all","allThreads","s","exports","PaprFlare","_PaprFlare","Mutex","rateLimitConfig","PQueue","formattedMessages","retryConfig","finalStream","cachedStream","rawShape","schemaDescription","val","typeName","systemMessage","lastUserMessage","enhancedMessages","textContent","e","jsonText","validated","doneEvent","cleaned","objectMatch","arrayMatch","lines","jsonLines","inJSON","braceCount","line","trimmed","streams","callback","body","usageEvent","threadClient","structuredOutput","AnthropicProvider","Anthropic","chatConfig","conversationMessages","currentToolUse","toolInputBuffer","toolCall","tools","createAnthropicProvider","GoogleProvider","GoogleGenerativeAI","model","lastMessage","history","chunkText","functionCalls","call","createGoogleProvider","OpenAIProvider","OpenAI","lastChunkWithUsage","currentToolCallIndex","toolCallBuffer","currentToolCall","allChunks","completion","tc","createOpenAIProvider","SarvamProvider","createSarvamProvider"],"mappings":"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","file":"index.js","sourcesContent":["import { nanoid } from 'nanoid';\r\nimport stringify from 'fast-json-stable-stringify';\r\nimport type { Message } from '../types';\r\n\r\n/**\r\n * Generate a unique ID\r\n */\r\nexport function generateId(prefix?: string): string {\r\n const id = nanoid();\r\n return prefix ? `${prefix}_${id}` : id;\r\n}\r\n\r\n/**\r\n * Create a stable hash for cache keys\r\n */\r\nexport function createCacheKey(data: unknown): string {\r\n return stringify(data);\r\n}\r\n\r\n/**\r\n * Format messages for provider APIs\r\n */\r\nexport function formatMessages(messages: Message[]): Message[] {\r\n return messages.map((msg) => ({\r\n ...msg,\r\n id: msg.id || generateId('msg'),\r\n timestamp: msg.timestamp || Date.now(),\r\n }));\r\n}\r\n\r\n/**\r\n * Retry with exponential backoff\r\n */\r\nexport async function retry<T>(\r\n fn: () => Promise<T>,\r\n options: {\r\n maxAttempts: number;\r\n initialDelay: number;\r\n maxDelay: number;\r\n backoffMultiplier: number;\r\n onRetry?: (attempt: number, error: Error) => void;\r\n }\r\n): Promise<T> {\r\n let lastError: Error;\r\n let delay = options.initialDelay;\r\n\r\n for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error as Error;\r\n\r\n if (attempt === options.maxAttempts) {\r\n throw lastError;\r\n }\r\n\r\n if (options.onRetry) {\r\n options.onRetry(attempt, lastError);\r\n }\r\n\r\n await sleep(Math.min(delay, options.maxDelay));\r\n delay *= options.backoffMultiplier;\r\n }\r\n }\r\n\r\n throw lastError!;\r\n}\r\n\r\n/**\r\n * Sleep for a given duration\r\n */\r\nexport function sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * Chunk an array into smaller arrays\r\n */\r\nexport function chunk<T>(array: T[], size: number): T[][] {\r\n const chunks: T[][] = [];\r\n for (let i = 0; i < array.length; i += size) {\r\n chunks.push(array.slice(i, i + size));\r\n }\r\n return chunks;\r\n}\r\n\r\n/**\r\n * Debounce a function\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n fn: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: NodeJS.Timeout;\r\n\r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(() => fn(...args), delay);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle a function\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n fn: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean;\r\n\r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n fn(...args);\r\n inThrottle = true;\r\n setTimeout(() => (inThrottle = false), limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Safely parse JSON\r\n */\r\nexport function safeJsonParse<T = unknown>(json: string): T | null {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a value is a plain object\r\n */\r\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n value.constructor === Object\r\n );\r\n}\r\n\r\n/**\r\n * Deep merge objects\r\n */\r\nexport function deepMerge<T extends Record<string, any>>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n): T {\r\n if (!sources.length) return target;\r\n\r\n const source = sources.shift();\r\n\r\n if (isPlainObject(target) && isPlainObject(source)) {\r\n for (const key in source) {\r\n if (isPlainObject(source[key])) {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n deepMerge(target[key], source[key] as any);\r\n } else {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return deepMerge(target, ...sources);\r\n}\r\n\r\n/**\r\n * Convert async generator to array\r\n */\r\nexport async function streamToArray<T>(\r\n stream: AsyncGenerator<T>\r\n): Promise<T[]> {\r\n const result: T[] = [];\r\n for await (const item of stream) {\r\n result.push(item);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Measure execution time\r\n */\r\nexport async function measureTime<T>(\r\n fn: () => Promise<T>\r\n): Promise<{ result: T; duration: number }> {\r\n const start = performance.now();\r\n const result = await fn();\r\n const duration = performance.now() - start;\r\n return { result, duration };\r\n}","import { EventEmitter } from 'eventemitter3';\r\nimport type { StreamEvent } from '../types';\r\nimport type { StreamWriterEvents, ChunkData, StreamStatus, ToolUseData, ToolResultData } from '../types/stream-writer';\r\n\r\n/**\r\n * StreamWriter for handling streaming text and tool execution\r\n * Provides real-time events for live UI updates\r\n */\r\nexport class StreamWriter extends EventEmitter<StreamWriterEvents> {\r\n private events: StreamEvent[] = [];\r\n private closed = false;\r\n private fullText = '';\r\n private startTime: number = 0;\r\n private lastChunkTime: number = 0;\r\n private chunkIndex: number = 0;\r\n private status: StreamStatus = 'idle';\r\n\r\n // Tool call tracking\r\n private activeTools: Map<string, ToolUseData> = new Map();\r\n private currentToolCall: {\r\n id: string;\r\n name: string;\r\n argumentsBuffer: string;\r\n } | null = null;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Start the stream\r\n */\r\n start(): void {\r\n if (this.startTime === 0) {\r\n this.startTime = Date.now();\r\n this.lastChunkTime = this.startTime;\r\n this.updateStatus('starting');\r\n this.emit('start');\r\n setTimeout(() => this.updateStatus('streaming'), 50);\r\n }\r\n }\r\n\r\n /**\r\n * Write text content\r\n */\r\n writeText(text: string): void {\r\n if (this.closed) return;\r\n\r\n // Auto-start if not started\r\n if (this.startTime === 0) {\r\n this.start();\r\n }\r\n\r\n this.fullText += text;\r\n\r\n // Track chunk timing\r\n const now = Date.now();\r\n const deltaTime = now - this.lastChunkTime;\r\n this.lastChunkTime = now;\r\n\r\n const chunkData: ChunkData = {\r\n text,\r\n index: this.chunkIndex++,\r\n timestamp: now,\r\n deltaTime,\r\n };\r\n\r\n this.events.push({\r\n type: 'text-delta',\r\n delta: text,\r\n });\r\n\r\n this.emit('chunk', chunkData);\r\n this.emit('write', text);\r\n }\r\n\r\n /**\r\n * Legacy write method (for backward compatibility)\r\n */\r\n write(text: string): void {\r\n this.writeText(text);\r\n }\r\n\r\n /**\r\n * Start a tool call\r\n */\r\n startToolCall(name: string, id: string): void {\r\n this.currentToolCall = {\r\n id,\r\n name,\r\n argumentsBuffer: '',\r\n };\r\n\r\n const toolData: ToolUseData = {\r\n id,\r\n name,\r\n input: {},\r\n status: 'starting',\r\n timestamp: Date.now(),\r\n };\r\n\r\n this.activeTools.set(id, toolData);\r\n this.updateStatus('tool_executing');\r\n this.emit('toolUse', toolData);\r\n\r\n // Update to running\r\n setTimeout(() => {\r\n const tool = this.activeTools.get(id);\r\n if (tool) {\r\n tool.status = 'running';\r\n this.emit('toolUse', tool);\r\n }\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Write tool call delta (incremental arguments)\r\n */\r\n writeToolCallDelta(delta: string): void {\r\n if (!this.currentToolCall) return;\r\n this.currentToolCall.argumentsBuffer += delta;\r\n }\r\n\r\n /**\r\n * End a tool call with final arguments\r\n */\r\n endToolCall(args: Record<string, unknown>): void {\r\n if (!this.currentToolCall) return;\r\n\r\n const tool = this.activeTools.get(this.currentToolCall.id);\r\n if (tool) {\r\n tool.input = args;\r\n tool.status = 'completed';\r\n this.emit('toolUse', tool);\r\n\r\n const duration = Date.now() - tool.timestamp;\r\n this.emit('toolResult', {\r\n toolId: this.currentToolCall.id,\r\n content: args,\r\n success: true,\r\n duration,\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.activeTools.delete(this.currentToolCall.id);\r\n }\r\n\r\n this.currentToolCall = null;\r\n\r\n // Return to streaming if no more tools\r\n if (this.activeTools.size === 0) {\r\n this.updateStatus('streaming');\r\n }\r\n }\r\n\r\n /**\r\n * Legacy startTool method (for backward compatibility)\r\n */\r\n startTool(id: string, name: string, input: any): void {\r\n this.startToolCall(name, id);\r\n if (input) {\r\n this.endToolCall(input);\r\n }\r\n }\r\n\r\n /**\r\n * Complete a tool (legacy method for backward compatibility)\r\n */\r\n completeTool(\r\n toolId: string,\r\n content: any,\r\n success: boolean = true,\r\n error?: string\r\n ): void {\r\n const tool = this.activeTools.get(toolId);\r\n if (!tool) return;\r\n\r\n const duration = Date.now() - tool.timestamp;\r\n\r\n tool.status = success ? 'completed' : 'failed';\r\n this.emit('toolUse', tool);\r\n\r\n this.emit('toolResult', {\r\n toolId,\r\n content,\r\n success,\r\n error,\r\n duration,\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.activeTools.delete(toolId);\r\n\r\n // Return to streaming if no more tools\r\n if (this.activeTools.size === 0) {\r\n this.updateStatus('streaming');\r\n }\r\n }\r\n\r\n /**\r\n * Write usage information\r\n */\r\n writeUsage(tokens: {\r\n promptTokens: number;\r\n completionTokens: number;\r\n totalTokens: number\r\n }): void {\r\n if (this.closed) return;\r\n\r\n this.events.push({\r\n type: 'usage',\r\n usage: {\r\n promptTokens: tokens.promptTokens,\r\n completionTokens: tokens.completionTokens,\r\n totalTokens: tokens.totalTokens,\r\n },\r\n });\r\n\r\n this.emit('usage', {\r\n prompt: tokens.promptTokens,\r\n completion: tokens.completionTokens,\r\n total: tokens.totalTokens,\r\n });\r\n }\r\n\r\n /**\r\n * Legacy usage method (for backward compatibility)\r\n */\r\n usage(tokens: { prompt: number; completion: number; total: number }): void {\r\n this.writeUsage({\r\n promptTokens: tokens.prompt,\r\n completionTokens: tokens.completion,\r\n totalTokens: tokens.total,\r\n });\r\n }\r\n\r\n /**\r\n * Write error\r\n */\r\n error(message: string): void {\r\n if (this.closed) return;\r\n\r\n this.events.push({\r\n type: 'error',\r\n error: message,\r\n });\r\n\r\n this.updateStatus('error');\r\n this.emit('error', message);\r\n }\r\n\r\n /**\r\n * Flush all currently buffered events as an async generator.\r\n * CRITICAL: This clears the events array to prevent duplication\r\n */\r\n async *flush(): AsyncGenerator<StreamEvent> {\r\n const buffered = [...this.events];\r\n this.events = []; // Clear to prevent re-yielding\r\n for (const event of buffered) {\r\n yield event;\r\n }\r\n }\r\n\r\n /**\r\n * Mark stream as done\r\n */\r\n done(finalMessage?: any): void {\r\n if (this.closed) return;\r\n\r\n this.updateStatus('completing');\r\n\r\n const message = finalMessage || {\r\n id: `msg_${Date.now()}`,\r\n role: 'assistant' as const,\r\n content: this.fullText,\r\n timestamp: Date.now(),\r\n };\r\n\r\n this.events.push({\r\n type: 'done',\r\n finalMessage: message,\r\n });\r\n\r\n this.closed = true;\r\n this.updateStatus('done');\r\n this.emit('done', message);\r\n }\r\n\r\n /**\r\n * Update stream status\r\n */\r\n private updateStatus(status: StreamStatus): void {\r\n this.status = status;\r\n this.emit('statusChange', status);\r\n }\r\n\r\n /**\r\n * Get current status\r\n */\r\n getStatus(): StreamStatus {\r\n return this.status;\r\n }\r\n\r\n /**\r\n * Check if stream is closed\r\n */\r\n isClosed(): boolean {\r\n return this.closed;\r\n }\r\n\r\n /**\r\n * Get accumulated text\r\n */\r\n getText(): string {\r\n return this.fullText;\r\n }\r\n\r\n /**\r\n * Get active tools\r\n */\r\n getActiveTools(): ToolUseData[] {\r\n return Array.from(this.activeTools.values());\r\n }\r\n\r\n /**\r\n * Get all events\r\n */\r\n getEvents(): StreamEvent[] {\r\n return [...this.events];\r\n }\r\n\r\n /**\r\n * Convert to async generator (legacy method)\r\n */\r\n async *toGenerator(): AsyncGenerator<StreamEvent> {\r\n yield* this.flush();\r\n }\r\n\r\n /**\r\n * Reset the writer\r\n */\r\n reset(): void {\r\n this.events = [];\r\n this.fullText = '';\r\n this.closed = false;\r\n this.status = 'idle';\r\n this.startTime = 0;\r\n this.lastChunkTime = 0;\r\n this.chunkIndex = 0;\r\n this.activeTools.clear();\r\n this.currentToolCall = null;\r\n this.removeAllListeners();\r\n }\r\n}\r\n\r\n/**\r\n * Create StreamWriter instance\r\n */\r\nexport function createStreamWriter(): StreamWriter {\r\n return new StreamWriter();\r\n}\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * // 1. Basic streaming\r\n * const writer = new StreamWriter();\r\n * writer.start();\r\n * writer.writeText(\"Hello \");\r\n * writer.writeText(\"World! 🌍\");\r\n * writer.done();\r\n *\r\n * // 2. With tool execution\r\n * const writer = new StreamWriter();\r\n * writer.start();\r\n * writer.startToolCall(\"web_search\", \"tool_1\");\r\n * writer.writeToolCallDelta('{\"query\": \"');\r\n * writer.writeToolCallDelta('AI news\"}');\r\n * writer.endToolCall({ query: \"AI news\" });\r\n * writer.writeText(\"Based on the search results...\");\r\n * writer.done();\r\n *\r\n * // 3. Usage in providers\r\n * for await (const chunk of stream) {\r\n * if (chunk.text) {\r\n * writer.writeText(chunk.text);\r\n * yield* writer.flush();\r\n * }\r\n * }\r\n * writer.writeUsage({ promptTokens, completionTokens, totalTokens });\r\n * writer.done();\r\n * yield* writer.flush();\r\n */","import { createParser, type EventSourceMessage } from 'eventsource-parser';\r\nimport type { StreamEvent } from '../types';\r\n\r\n/**\r\n * Parse SSE stream into structured events\r\n */\r\nexport async function* parseSSEStream(\r\n stream: ReadableStream<Uint8Array>\r\n): AsyncGenerator<StreamEvent> {\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n let buffer = '';\r\n\r\n const parser = createParser({\r\n onEvent: (event: EventSourceMessage) => {\r\n buffer = event.data;\r\n },\r\n onRetry: (_interval: number) => {\r\n // Optional: handle retry interval if needed\r\n },\r\n });\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 const chunk = decoder.decode(value, { stream: true });\r\n parser.feed(chunk);\r\n\r\n if (buffer) {\r\n try {\r\n const parsed = JSON.parse(buffer);\r\n\r\n // Convert parsed data to StreamEvent\r\n if (parsed.type) {\r\n yield parsed as StreamEvent;\r\n }\r\n\r\n buffer = '';\r\n } catch (error) {\r\n // If parsing fails, it might be incomplete - continue\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n // Flush any remaining data at end of stream\r\n parser.reset({ consume: true });\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n}\r\n\r\n/**\r\n * Convert async generator to ReadableStream\r\n */\r\nexport function toReadableStream(\r\n generator: AsyncGenerator<StreamEvent>\r\n): ReadableStream<Uint8Array> {\r\n const encoder = new TextEncoder();\r\n\r\n return new ReadableStream({\r\n async start(controller) {\r\n try {\r\n for await (const event of generator) {\r\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\r\n controller.enqueue(encoder.encode(data));\r\n }\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Pipe stream to HTTP response (h3 compatible)\r\n */\r\nexport async function pipeToResponse(\r\n generator: AsyncGenerator<StreamEvent>,\r\n response: any // h3 event or native Response\r\n): Promise<void> {\r\n const stream = toReadableStream(generator);\r\n\r\n // Set SSE headers\r\n const headers = {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n };\r\n\r\n // Handle h3 response\r\n if (response.node && response.node.res) {\r\n const res = response.node.res;\r\n\r\n Object.entries(headers).forEach(([key, value]) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\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 const text = decoder.decode(value, { stream: true });\r\n res.write(text);\r\n }\r\n } finally {\r\n res.end();\r\n }\r\n }\r\n // Handle native Response\r\n else if (response instanceof Response || typeof response.body !== 'undefined') {\r\n return; // Stream is already set as body\r\n }\r\n // Handle raw Node.js response\r\n else {\r\n Object.entries(headers).forEach(([key, value]) => {\r\n response.setHeader(key, value);\r\n });\r\n\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\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 const text = decoder.decode(value, { stream: true });\r\n response.write(text);\r\n }\r\n } finally {\r\n response.end();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Merge multiple streams into one\r\n */\r\nexport async function* mergeStreams(\r\n ...generators: AsyncGenerator<StreamEvent>[]\r\n): AsyncGenerator<StreamEvent> {\r\n const promises = generators.map(async (gen) => {\r\n const items: StreamEvent[] = [];\r\n for await (const item of gen) {\r\n items.push(item);\r\n }\r\n return items;\r\n });\r\n\r\n const results = await Promise.all(promises);\r\n\r\n // Yield all items in order\r\n for (const items of results) {\r\n for (const item of items) {\r\n yield item;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Transform stream events\r\n */\r\nexport async function* transformStream<T>(\r\n generator: AsyncGenerator<StreamEvent>,\r\n transformer: (event: StreamEvent) => T | null\r\n): AsyncGenerator<T> {\r\n for await (const event of generator) {\r\n const transformed = transformer(event);\r\n if (transformed !== null) {\r\n yield transformed;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Filter stream events\r\n */\r\nexport async function* filterStream(\r\n generator: AsyncGenerator<StreamEvent>,\r\n predicate: (event: StreamEvent) => boolean\r\n): AsyncGenerator<StreamEvent> {\r\n for await (const event of generator) {\r\n if (predicate(event)) {\r\n yield event;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Collect stream into array\r\n */\r\nexport async function collectStream(\r\n generator: AsyncGenerator<StreamEvent>\r\n): Promise<StreamEvent[]> {\r\n const events: StreamEvent[] = [];\r\n\r\n for await (const event of generator) {\r\n events.push(event);\r\n }\r\n\r\n return events;\r\n}\r\n\r\n/**\r\n * Take first N events from stream\r\n */\r\nexport async function* takeStream(\r\n generator: AsyncGenerator<StreamEvent>,\r\n count: number\r\n): AsyncGenerator<StreamEvent> {\r\n let taken = 0;\r\n\r\n for await (const event of generator) {\r\n if (taken >= count) break;\r\n yield event;\r\n taken++;\r\n }\r\n}\r\n\r\n/**\r\n * Batch stream events\r\n */\r\nexport async function* batchStream(\r\n generator: AsyncGenerator<StreamEvent>,\r\n size: number,\r\n timeoutMs?: number\r\n): AsyncGenerator<StreamEvent[]> {\r\n let batch: StreamEvent[] = [];\r\n let timeoutId: NodeJS.Timeout | null = null;\r\n\r\n const flushBatch = async () => {\r\n if (batch.length > 0) {\r\n const toFlush = [...batch];\r\n batch = [];\r\n return toFlush;\r\n }\r\n return null;\r\n };\r\n\r\n try {\r\n for await (const event of generator) {\r\n batch.push(event);\r\n\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n\r\n if (batch.length >= size) {\r\n const flushed = await flushBatch();\r\n if (flushed) yield flushed;\r\n } else if (timeoutMs) {\r\n timeoutId = setTimeout(async () => {\r\n const flushed = await flushBatch();\r\n if (flushed) {\r\n // Note: This won't work perfectly with async generators\r\n // Consider using a different batching strategy for time-based batching\r\n }\r\n }, timeoutMs);\r\n }\r\n }\r\n\r\n // Flush remaining\r\n const remaining = await flushBatch();\r\n if (remaining) yield remaining;\r\n } finally {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n }\r\n}","\r\n// Error Types\r\nexport class PaprFlareError extends Error {\r\n constructor(\r\n message: string,\r\n public code: string,\r\n public statusCode?: number,\r\n public details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'PaprFlareError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends PaprFlareError {\r\n constructor(message: string, public retryAfter?: number) {\r\n super(message, 'RATE_LIMIT_ERROR', 429);\r\n }\r\n}\r\n\r\nexport class ValidationError extends PaprFlareError {\r\n constructor(message: string, details?: unknown) {\r\n super(message, 'VALIDATION_ERROR', 400, details);\r\n }\r\n}\r\n\r\nexport class ProviderError extends PaprFlareError {\r\n constructor(message: string, public provider: string, statusCode?: number) {\r\n super(message, 'PROVIDER_ERROR', statusCode);\r\n }\r\n}","import type { StreamEvent, TokenUsage, ToolCall, ToolResult } from '../types';\r\nimport { StreamWriter } from './stream-writer';\r\nimport type {\r\n ToolUseData,\r\n ToolResultData,\r\n StreamStatus,\r\n} from '../types/stream-writer';\r\n\r\n/**\r\n * UI Stream Event Types\r\n */\r\nexport type UIStreamEvent =\r\n | {\r\n type: 'message-start';\r\n messageId: string;\r\n }\r\n | {\r\n type: 'text-delta';\r\n delta: string;\r\n }\r\n | {\r\n type: 'text-complete';\r\n fullText: string;\r\n }\r\n | {\r\n type: 'tool-call-start';\r\n toolCallId: string;\r\n toolName: string;\r\n }\r\n | {\r\n type: 'tool-call-complete';\r\n toolCallId: string;\r\n arguments: any;\r\n }\r\n | {\r\n type: 'tool-result';\r\n toolCallId: string;\r\n result: any;\r\n success: boolean;\r\n }\r\n | {\r\n type: 'usage';\r\n tokens: {\r\n prompt: number;\r\n completion: number;\r\n total: number;\r\n };\r\n }\r\n | {\r\n type: 'error';\r\n error: string;\r\n }\r\n | {\r\n type: 'message-complete';\r\n message: UIMessage;\r\n }\r\n | {\r\n type: 'status-change';\r\n status: StreamStatus;\r\n };\r\n\r\n/**\r\n * UI Message Type\r\n */\r\nexport interface UIMessage {\r\n id: string;\r\n role: 'user' | 'assistant' | 'system';\r\n content: string;\r\n toolCalls?: ToolCall[];\r\n toolResults?: ToolResult[];\r\n metadata?: {\r\n usage?: TokenUsage;\r\n artifacts?: Array<{\r\n id: string;\r\n type: string;\r\n content: string;\r\n [key: string]: any;\r\n }>;\r\n [key: string]: any;\r\n };\r\n timestamp: number;\r\n isComplete?: boolean;\r\n}\r\n\r\n/**\r\n * Stream handler callbacks\r\n */\r\nexport interface StreamHandlers {\r\n onStart?: (messageId: string) => void | Promise<void>;\r\n onText?: (delta: string) => void | Promise<void>;\r\n onComplete?: (message: UIMessage) => void | Promise<void>;\r\n onError?: (error: string) => void | Promise<void>;\r\n onToolCall?: (toolName: string, args: any) => void | Promise<void>;\r\n onToolResult?: (result: ToolResultData) => void | Promise<void>;\r\n onUsage?: (tokens: {\r\n prompt: number;\r\n completion: number;\r\n total: number;\r\n }) => void | Promise<void>;\r\n onStatusChange?: (status: StreamStatus) => void | Promise<void>;\r\n}\r\n\r\n/**\r\n * Convert internal stream events to simplified UI events\r\n */\r\nexport async function* toUIStream(\r\n stream: AsyncGenerator<StreamEvent>\r\n): AsyncGenerator<UIStreamEvent> {\r\n let messageId = `msg_${Date.now()}`;\r\n let fullText = '';\r\n let currentMessage: Partial<UIMessage> = {\r\n id: messageId,\r\n role: 'assistant',\r\n content: '',\r\n timestamp: Date.now(),\r\n isComplete: false,\r\n };\r\n\r\n yield { type: 'message-start', messageId };\r\n\r\n try {\r\n for await (const event of stream) {\r\n switch (event.type) {\r\n case 'text-delta':\r\n fullText += event.delta;\r\n currentMessage.content = fullText;\r\n yield { type: 'text-delta', delta: event.delta };\r\n break;\r\n\r\n case 'tool-call-start':\r\n if (!currentMessage.toolCalls) {\r\n currentMessage.toolCalls = [];\r\n }\r\n currentMessage.toolCalls.push(event.toolCall);\r\n yield {\r\n type: 'tool-call-start',\r\n toolCallId: event.toolCall.id,\r\n toolName: event.toolCall.name,\r\n };\r\n break;\r\n\r\n case 'tool-call-end':\r\n yield {\r\n type: 'tool-call-complete',\r\n toolCallId: event.toolCall.id,\r\n arguments: event.toolCall.arguments,\r\n };\r\n break;\r\n\r\n case 'tool-result':\r\n if (!currentMessage.toolResults) {\r\n currentMessage.toolResults = [];\r\n }\r\n currentMessage.toolResults.push(event.result);\r\n yield {\r\n type: 'tool-result',\r\n toolCallId: event.result.toolCallId,\r\n result: event.result.result,\r\n success: !event.result.error,\r\n };\r\n break;\r\n\r\n case 'usage':\r\n if (!currentMessage.metadata) {\r\n currentMessage.metadata = {};\r\n }\r\n currentMessage.metadata.usage = event.usage;\r\n yield {\r\n type: 'usage',\r\n tokens: {\r\n prompt: event.usage.promptTokens,\r\n completion: event.usage.completionTokens,\r\n total: event.usage.totalTokens,\r\n },\r\n };\r\n break;\r\n\r\n case 'metadata':\r\n if (!currentMessage.metadata) {\r\n currentMessage.metadata = {};\r\n }\r\n currentMessage.metadata = {\r\n ...currentMessage.metadata,\r\n ...event.metadata,\r\n };\r\n break;\r\n\r\n case 'artifact-start':\r\n if (!currentMessage.metadata) {\r\n currentMessage.metadata = {};\r\n }\r\n if (!currentMessage.metadata.artifacts) {\r\n currentMessage.metadata.artifacts = [];\r\n }\r\n currentMessage.metadata.artifacts.push({\r\n ...event.artifact,\r\n content: '',\r\n });\r\n break;\r\n\r\n case 'artifact-delta':\r\n if (currentMessage.metadata?.artifacts) {\r\n const lastArtifact =\r\n currentMessage.metadata.artifacts[\r\n currentMessage.metadata.artifacts.length - 1\r\n ];\r\n if (lastArtifact) {\r\n lastArtifact.content += event.delta;\r\n }\r\n }\r\n break;\r\n\r\n case 'artifact-end':\r\n if (currentMessage.metadata?.artifacts) {\r\n const lastArtifact =\r\n currentMessage.metadata.artifacts[\r\n currentMessage.metadata.artifacts.length - 1\r\n ];\r\n if (lastArtifact) {\r\n Object.assign(lastArtifact, event.artifact);\r\n }\r\n }\r\n break;\r\n\r\n case 'done':\r\n currentMessage.isComplete = true;\r\n currentMessage.content = fullText;\r\n const finalMessage = {\r\n ...currentMessage,\r\n ...event.finalMessage,\r\n } as UIMessage;\r\n\r\n yield { type: 'text-complete', fullText };\r\n yield {\r\n type: 'message-complete',\r\n message: finalMessage,\r\n };\r\n break;\r\n\r\n case 'error':\r\n yield { type: 'error', error: event.error };\r\n break;\r\n }\r\n }\r\n } catch (error: any) {\r\n yield { type: 'error', error: error.message || 'Stream error' };\r\n }\r\n}\r\n\r\n/**\r\n * Process stream with simple callbacks\r\n *\r\n * @example\r\n * await processStream(response.stream, {\r\n * onText: (delta) => process.stdout.write(delta),\r\n * onComplete: (message) => console.log('Done!', message),\r\n * });\r\n */\r\nexport async function processStream(\r\n stream: AsyncGenerator<StreamEvent>,\r\n handlers: StreamHandlers\r\n): Promise<UIMessage> {\r\n const uiStream = toUIStream(stream);\r\n let finalMessage: UIMessage | null = null;\r\n\r\n for await (const event of uiStream) {\r\n switch (event.type) {\r\n case 'message-start':\r\n await handlers.onStart?.(event.messageId);\r\n break;\r\n\r\n case 'text-delta':\r\n await handlers.onText?.(event.delta);\r\n break;\r\n\r\n case 'message-complete':\r\n finalMessage = event.message;\r\n await handlers.onComplete?.(event.message);\r\n break;\r\n\r\n case 'error':\r\n await handlers.onError?.(event.error);\r\n throw new Error(event.error);\r\n\r\n case 'tool-call-complete':\r\n await handlers.onToolCall?.(event.toolCallId, event.arguments);\r\n break;\r\n\r\n case 'tool-result':\r\n await handlers.onToolResult?.({\r\n toolId: event.toolCallId,\r\n content: event.result,\r\n success: event.success,\r\n duration: 0,\r\n timestamp: Date.now(),\r\n });\r\n break;\r\n\r\n case 'usage':\r\n await handlers.onUsage?.(event.tokens);\r\n break;\r\n\r\n case 'status-change':\r\n await handlers.onStatusChange?.(event.status);\r\n break;\r\n }\r\n }\r\n\r\n if (!finalMessage) {\r\n throw new Error('Stream completed without final message');\r\n }\r\n\r\n return finalMessage;\r\n}\r\n\r\n/**\r\n * Collect full response as text (simple helper)\r\n *\r\n * @example\r\n * const text = await collectText(response.stream);\r\n * console.log(text);\r\n */\r\nexport async function collectText(\r\n stream: AsyncGenerator<StreamEvent>\r\n): Promise<string> {\r\n let text = '';\r\n\r\n for await (const event of stream) {\r\n if (event.type === 'text-delta') {\r\n text += event.delta;\r\n }\r\n }\r\n\r\n return text;\r\n}\r\n\r\n/**\r\n * Create UI message stream with advanced control and live updates\r\n *\r\n * @example\r\n * const stream = createUIMessageStream({\r\n * async execute({ writer, merge }) {\r\n * writer.write('Hello ');\r\n *\r\n * // Merge another stream\r\n * const aiResponse = await client.chat(messages);\r\n * await merge(aiResponse.stream);\r\n * },\r\n * onFinish: ({ message }) => {\r\n * console.log('Complete:', message);\r\n * }\r\n * });\r\n */\r\nexport async function* createUIMessageStream(options: {\r\n execute: (context: {\r\n writer: StreamWriter;\r\n merge: (stream: AsyncGenerator<StreamEvent>) => Promise<void>;\r\n }) => Promise<void>;\r\n onError?: (error: Error) => string;\r\n onFinish?: (result: { message: UIMessage }) => void | Promise<void>;\r\n onToolUse?: (tool: ToolUseData) => void | Promise<void>;\r\n onToolResult?: (result: ToolResultData) => void | Promise<void>;\r\n onStatusChange?: (status: StreamStatus) => void | Promise<void>;\r\n}): AsyncGenerator<UIStreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n let error: Error | null = null;\r\n let finalMessage: UIMessage | null = null;\r\n\r\n // Set up event listeners for live updates\r\n if (options.onToolUse) {\r\n writer.on('toolUse', options.onToolUse);\r\n }\r\n\r\n if (options.onToolResult) {\r\n writer.on('toolResult', options.onToolResult);\r\n }\r\n\r\n if (options.onStatusChange) {\r\n writer.on('statusChange', options.onStatusChange);\r\n }\r\n\r\n /**\r\n * Merge external stream into writer\r\n */\r\n const merge = async (stream: AsyncGenerator<StreamEvent>): Promise<void> => {\r\n for await (const event of stream) {\r\n switch (event.type) {\r\n case 'text-delta':\r\n writer.write(event.delta);\r\n break;\r\n\r\n case 'tool-call-start':\r\n writer.startTool(\r\n event.toolCall.id,\r\n event.toolCall.name,\r\n event.toolCall.arguments\r\n );\r\n break;\r\n\r\n case 'tool-call-end':\r\n const tool = writer\r\n .getActiveTools()\r\n .find((t) => t.id === event.toolCall.id);\r\n if (tool) {\r\n writer.completeTool(\r\n event.toolCall.id,\r\n event.toolCall.arguments,\r\n true\r\n );\r\n }\r\n break;\r\n\r\n case 'tool-result':\r\n writer.completeTool(\r\n event.result.toolCallId,\r\n event.result.result,\r\n !event.result.error,\r\n event.result.error\r\n );\r\n break;\r\n\r\n case 'usage':\r\n writer.usage({\r\n prompt: event.usage.promptTokens,\r\n completion: event.usage.completionTokens,\r\n total: event.usage.totalTokens,\r\n });\r\n break;\r\n\r\n case 'error':\r\n writer.error(event.error);\r\n break;\r\n\r\n case 'done':\r\n writer.done(event.finalMessage);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n // Execute user's function\r\n const executePromise = (async () => {\r\n try {\r\n writer.start();\r\n await options.execute({ writer, merge });\r\n\r\n if (!writer.isClosed()) {\r\n writer.done();\r\n }\r\n } catch (err: any) {\r\n error = err;\r\n const errorMessage = options.onError?.(err) || err.message;\r\n writer.error(errorMessage);\r\n writer.done();\r\n }\r\n })();\r\n\r\n // Stream UI events\r\n try {\r\n for await (const event of toUIStream(writer.toGenerator())) {\r\n yield event;\r\n\r\n // Capture final message\r\n if (event.type === 'message-complete') {\r\n finalMessage = event.message;\r\n }\r\n }\r\n\r\n // Wait for execution to complete\r\n await executePromise;\r\n\r\n // Call onFinish callback\r\n if (options.onFinish && finalMessage) {\r\n await options.onFinish({ message: finalMessage });\r\n }\r\n } catch (err: any) {\r\n error = err;\r\n throw err;\r\n }\r\n}\r\n\r\n/**\r\n * Stream to console with formatting\r\n *\r\n * @example\r\n * await streamToConsole(response.stream);\r\n */\r\nexport async function streamToConsole(\r\n stream: AsyncGenerator<StreamEvent>\r\n): Promise<void> {\r\n const writer = new StreamWriter();\r\n\r\n // Merge the stream into writer\r\n for await (const event of stream) {\r\n switch (event.type) {\r\n case 'text-delta':\r\n process.stdout.write(event.delta);\r\n break;\r\n\r\n case 'tool-call-start':\r\n console.log(`\\n🔧 Tool: ${event.toolCall.name}`);\r\n break;\r\n\r\n case 'tool-result':\r\n const icon = event.result.error ? '❌' : '✅';\r\n console.log(`${icon} Tool completed`);\r\n break;\r\n\r\n case 'usage':\r\n console.log(\r\n `\\n\\n📊 Tokens: ${event.usage.promptTokens} prompt + ${event.usage.completionTokens} completion = ${event.usage.totalTokens} total`\r\n );\r\n break;\r\n\r\n case 'error':\r\n console.error('\\n❌ Error:', event.error);\r\n break;\r\n\r\n case 'done':\r\n console.log('\\n\\n✅ Stream completed');\r\n break;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Convert stream to HTTP Response (one-liner for API routes)\r\n * Works with Next.js, Express, Node.js HTTP, etc.\r\n *\r\n * @example\r\n * // Next.js API Route\r\n * export async function POST(req: Request) {\r\n * const response = await client.chat(messages, { stream: true });\r\n * return toHTTPResponse(response.stream);\r\n * }\r\n *\r\n * @example\r\n * // Express\r\n * app.post('/chat', async (req, res) => {\r\n * const response = await client.chat(messages, { stream: true });\r\n * await toHTTPResponse(response.stream, res);\r\n * });\r\n */\r\nexport async function toHTTPResponse(\r\n stream: AsyncGenerator<StreamEvent>,\r\n target?: any\r\n): Promise<Response | void> {\r\n const uiStream = toUIStream(stream);\r\n\r\n // For Next.js / Fetch API - return Response\r\n if (!target) {\r\n return new Response(\r\n new ReadableStream({\r\n async start(controller) {\r\n const encoder = new TextEncoder();\r\n\r\n try {\r\n for await (const event of uiStream) {\r\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\r\n controller.enqueue(encoder.encode(data));\r\n }\r\n // Send final done marker\r\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\r\n } catch (error) {\r\n controller.error(error);\r\n } finally {\r\n controller.close();\r\n }\r\n },\r\n }),\r\n {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n Connection: 'keep-alive',\r\n },\r\n }\r\n );\r\n }\r\n\r\n // For Express / Node.js HTTP - stream to response\r\n target.setHeader('Content-Type', 'text/event-stream');\r\n target.setHeader('Cache-Control', 'no-cache');\r\n target.setHeader('Connection', 'keep-alive');\r\n\r\n for await (const event of uiStream) {\r\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\r\n target.write(data);\r\n }\r\n\r\n target.write('data: [DONE]\\n\\n');\r\n target.end();\r\n}\r\n\r\n/**\r\n * Create a streamable value\r\n *\r\n * @example\r\n * const stream = createStreamableValue('initial');\r\n * stream.update('updated');\r\n * stream.done('final');\r\n * return stream.value; // Returns AsyncGenerator\r\n */\r\nexport function createStreamableValue<T = any>(initialValue?: T) {\r\n const writer = new StreamWriter();\r\n let isDone = false;\r\n\r\n return {\r\n value: (async function* () {\r\n if (initialValue !== undefined) {\r\n yield initialValue;\r\n }\r\n\r\n for await (const event of writer.toGenerator()) {\r\n if (event.type === 'text-delta') {\r\n yield event.delta as T;\r\n } else if (event.type === 'done') {\r\n yield event.finalMessage.content as T;\r\n }\r\n }\r\n })(),\r\n\r\n update(value: T) {\r\n if (isDone) throw new Error('Stream already done');\r\n writer.write(String(value));\r\n },\r\n\r\n done(value?: T) {\r\n if (isDone) return;\r\n if (value !== undefined) {\r\n writer.write(String(value));\r\n }\r\n writer.done();\r\n isDone = true;\r\n },\r\n\r\n error(error: string) {\r\n writer.error(error);\r\n isDone = true;\r\n },\r\n };\r\n}","import Redis from 'ioredis';\r\nimport { LRUCache } from 'lru-cache';\r\nimport { createCacheKey } from '../utils';\r\nimport type { Message, ChatConfig, StreamEvent } from '../types';\r\n\r\nexport interface CacheOptions {\r\n type: 'redis' | 'memory';\r\n ttl?: number; // Time to live in seconds\r\n redis?: {\r\n host: string;\r\n port: number;\r\n password?: string;\r\n db?: number;\r\n keyPrefix?: string;\r\n };\r\n memory?: {\r\n maxSize: number; // Maximum number of items\r\n maxAge?: number; // Maximum age in ms\r\n };\r\n}\r\n\r\n/**\r\n * Abstract cache interface\r\n */\r\nexport interface ICache {\r\n get(key: string): Promise<string | null>;\r\n set(key: string, value: string, ttl?: number): Promise<void>;\r\n delete(key: string): Promise<void>;\r\n clear(): Promise<void>;\r\n has(key: string): Promise<boolean>;\r\n}\r\n\r\n/**\r\n * Redis cache implementation for distributed caching\r\n */\r\nexport class RedisCache implements ICache {\r\n private client: Redis;\r\n private keyPrefix: string;\r\n private defaultTTL: number;\r\n\r\n constructor(options: CacheOptions['redis'] & { ttl?: number }) {\r\n this.client = new Redis({\r\n host: options.host,\r\n port: options.port,\r\n password: options.password,\r\n db: options.db || 0,\r\n retryStrategy: (times) => {\r\n const delay = Math.min(times * 50, 2000);\r\n return delay;\r\n },\r\n maxRetriesPerRequest: 3,\r\n enableReadyCheck: true,\r\n lazyConnect: false,\r\n });\r\n\r\n this.keyPrefix = options.keyPrefix || 'paprflare:';\r\n this.defaultTTL = options.ttl || 3600; // 1 hour default\r\n\r\n // Handle errors\r\n this.client.on('error', (err) => {\r\n console.error('Redis cache error:', err);\r\n });\r\n }\r\n\r\n private getKey(key: string): string {\r\n return `${this.keyPrefix}${key}`;\r\n }\r\n\r\n async get(key: string): Promise<string | null> {\r\n try {\r\n return await this.client.get(this.getKey(key));\r\n } catch (error) {\r\n console.error('Redis get error:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async set(key: string, value: string, ttl?: number): Promise<void> {\r\n try {\r\n const actualTTL = ttl || this.defaultTTL;\r\n await this.client.setex(this.getKey(key), actualTTL, value);\r\n } catch (error) {\r\n console.error('Redis set error:', error);\r\n }\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n try {\r\n await this.client.del(this.getKey(key));\r\n } catch (error) {\r\n console.error('Redis delete error:', error);\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n try {\r\n const keys = await this.client.keys(`${this.keyPrefix}*`);\r\n if (keys.length > 0) {\r\n await this.client.del(...keys);\r\n }\r\n } catch (error) {\r\n console.error('Redis clear error:', error);\r\n }\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n try {\r\n const exists = await this.client.exists(this.getKey(key));\r\n return exists === 1;\r\n } catch (error) {\r\n console.error('Redis has error:', error);\r\n return false;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n await this.client.quit();\r\n }\r\n}\r\n\r\n/**\r\n * In-memory LRU cache for single-instance or development use\r\n */\r\nexport class MemoryCache implements ICache {\r\n private cache: LRUCache<string, string>;\r\n\r\n constructor(options: CacheOptions['memory']) {\r\n this.cache = new LRUCache<string, string>({\r\n max: options?.maxSize || 1000,\r\n ttl: options?.maxAge || 3600000, // 1 hour default\r\n updateAgeOnGet: true,\r\n updateAgeOnHas: true,\r\n });\r\n }\r\n\r\n async get(key: string): Promise<string | null> {\r\n return this.cache.get(key) || null;\r\n }\r\n\r\n async set(key: string, value: string): Promise<void> {\r\n this.cache.set(key, value);\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n this.cache.delete(key);\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.cache.clear();\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n return this.cache.has(key);\r\n }\r\n}\r\n\r\n/**\r\n * Cache manager with automatic cache key generation\r\n */\r\nexport class CacheManager {\r\n private cache: ICache;\r\n private enabled: boolean;\r\n\r\n constructor(options: CacheOptions) {\r\n this.enabled = true;\r\n\r\n if (options.type === 'redis') {\r\n this.cache = new RedisCache({\r\n ...options.redis!,\r\n ttl: options.ttl,\r\n });\r\n } else {\r\n this.cache = new MemoryCache(options.memory!);\r\n }\r\n }\r\n\r\n /**\r\n * Generate cache key from messages and config\r\n */\r\n private generateCacheKey(messages: Message[], config: ChatConfig): string {\r\n const cacheData = {\r\n messages: messages.map((m) => ({\r\n role: m.role,\r\n content: m.content,\r\n toolCalls: m.toolCalls,\r\n })),\r\n model: config.model,\r\n temperature: config.temperature,\r\n maxTokens: config.maxTokens,\r\n tools: config.tools?.map((t) => t.name),\r\n };\r\n\r\n return createCacheKey(cacheData);\r\n }\r\n\r\n /**\r\n * Get cached response\r\n */\r\n async getCachedResponse(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): Promise<StreamEvent[] | null> {\r\n if (!this.enabled || config.cache?.enabled === false) {\r\n return null;\r\n }\r\n\r\n const cacheKey = config.cache?.key || this.generateCacheKey(messages, config);\r\n const cached = await this.cache.get(cacheKey);\r\n\r\n if (cached) {\r\n try {\r\n return JSON.parse(cached) as StreamEvent[];\r\n } catch (error) {\r\n console.error('Cache parse error:', error);\r\n await this.cache.delete(cacheKey);\r\n return null;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Cache response\r\n */\r\n async cacheResponse(\r\n messages: Message[],\r\n config: ChatConfig,\r\n events: StreamEvent[]\r\n ): Promise<void> {\r\n if (!this.enabled || config.cache?.enabled === false) {\r\n return;\r\n }\r\n\r\n const cacheKey = config.cache?.key || this.generateCacheKey(messages, config);\r\n const ttl = config.cache?.ttl;\r\n\r\n await this.cache.set(cacheKey, JSON.stringify(events), ttl);\r\n }\r\n\r\n /**\r\n * Invalidate cache\r\n */\r\n async invalidate(messages: Message[], config: ChatConfig): Promise<void> {\r\n const cacheKey = this.generateCacheKey(messages, config);\r\n await this.cache.delete(cacheKey);\r\n }\r\n\r\n /**\r\n * Clear all cache\r\n */\r\n async clearAll(): Promise<void> {\r\n await this.cache.clear();\r\n }\r\n\r\n /**\r\n * Disable caching\r\n */\r\n disable(): void {\r\n this.enabled = false;\r\n }\r\n\r\n /**\r\n * Enable caching\r\n */\r\n enable(): void {\r\n this.enabled = true;\r\n }\r\n}","import type { Message } from '../../types';\r\nimport type { Conversation, ConversationExport, DatabaseAdapter } from '../base';\r\nimport { eq, and, like, desc, asc, sql } from 'drizzle-orm';\r\n\r\n/**\r\n * Drizzle ORM adapter\r\n */\r\nexport class DrizzleAdapter implements DatabaseAdapter {\r\n constructor(private db: any, private schema: any) { }\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n async connect(): Promise<void> { }\r\n\r\n async disconnect(): Promise<void> { }\r\n\r\n async healthCheck(): Promise<boolean> {\r\n try {\r\n await this.db.select(sql`1`);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async purge(): Promise<void> {\r\n await this.db.delete(this.schema.messages);\r\n await this.db.delete(this.schema.conversations);\r\n }\r\n\r\n // ─── Conversations ────────────────────────────────────────────────────────\r\n\r\n async createConversation(userId: string, metadata?: Record<string, unknown>): Promise<string> {\r\n const [conversation] = await this.db\r\n .insert(this.schema.conversations)\r\n .values({ userId, metadata: metadata || {} })\r\n .returning();\r\n return conversation.id;\r\n }\r\n\r\n async getConversation(conversationId: string): Promise<Conversation | null> {\r\n const [conversation] = await this.db\r\n .select()\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n return conversation || null;\r\n }\r\n\r\n async listConversations(userId: string, limit = 50, offset = 0): Promise<Conversation[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId))\r\n .orderBy(desc(this.schema.conversations.updatedAt))\r\n .limit(limit)\r\n .offset(offset);\r\n }\r\n\r\n async updateConversation(conversationId: string, updates: Partial<Conversation>): Promise<void> {\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ ...updates, updatedAt: new Date() })\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async deleteConversation(conversationId: string): Promise<void> {\r\n await this.db\r\n .delete(this.schema.conversations)\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async deleteAllConversations(userId: string): Promise<void> {\r\n const convIds = await this.db\r\n .select({ id: this.schema.conversations.id })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId));\r\n\r\n for (const { id } of convIds) {\r\n await this.db\r\n .delete(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, id));\r\n }\r\n\r\n await this.db\r\n .delete(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId));\r\n }\r\n\r\n async countConversations(userId: string): Promise<number> {\r\n const [{ count }] = await this.db\r\n .select({ count: sql<number>`count(*)` })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId));\r\n return Number(count);\r\n }\r\n\r\n async conversationExists(conversationId: string): Promise<boolean> {\r\n const [row] = await this.db\r\n .select({ id: this.schema.conversations.id })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n return !!row;\r\n }\r\n\r\n async searchConversations(userId: string, query: string): Promise<Conversation[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.conversations)\r\n .where(\r\n and(\r\n eq(this.schema.conversations.userId, userId),\r\n like(this.schema.conversations.title, `%${query}%`)\r\n )\r\n );\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n async saveMessage(conversationId: string, message: Message): Promise<void> {\r\n await this.db.insert(this.schema.messages).values({\r\n id: message.id,\r\n conversationId,\r\n role: message.role,\r\n content: message.content,\r\n toolCalls: message.toolCalls || [],\r\n toolResults: message.toolResults || [],\r\n metadata: message.metadata || {},\r\n timestamp: message.timestamp || Date.now(),\r\n });\r\n\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ updatedAt: new Date() })\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async saveManyMessages(conversationId: string, messages: Message[]): Promise<void> {\r\n if (messages.length === 0) return;\r\n\r\n await this.db.insert(this.schema.messages).values(\r\n messages.map(m => ({\r\n id: m.id,\r\n conversationId,\r\n role: m.role,\r\n content: m.content,\r\n toolCalls: m.toolCalls || [],\r\n toolResults: m.toolResults || [],\r\n metadata: m.metadata || {},\r\n timestamp: m.timestamp || Date.now(),\r\n }))\r\n );\r\n\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ updatedAt: new Date() })\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async getMessage(messageId: string): Promise<Message | null> {\r\n const [message] = await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(eq(this.schema.messages.id, messageId));\r\n return message || null;\r\n }\r\n\r\n async getMessages(conversationId: string, limit = 100, offset = 0): Promise<Message[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, conversationId))\r\n .orderBy(asc(this.schema.messages.timestamp))\r\n .limit(limit)\r\n .offset(offset);\r\n }\r\n\r\n async getMessagesByRole(conversationId: string, role: Message['role']): Promise<Message[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(\r\n and(\r\n eq(this.schema.messages.conversationId, conversationId),\r\n eq(this.schema.messages.role, role)\r\n )\r\n )\r\n .orderBy(asc(this.schema.messages.timestamp));\r\n }\r\n\r\n async updateMessage(messageId: string, updates: Partial<Message>): Promise<void> {\r\n await this.db\r\n .update(this.schema.messages)\r\n .set(updates)\r\n .where(eq(this.schema.messages.id, messageId));\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.db\r\n .delete(this.schema.messages)\r\n .where(eq(this.schema.messages.id, messageId));\r\n }\r\n\r\n async deleteAllMessages(conversationId: string): Promise<void> {\r\n await this.db\r\n .delete(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, conversationId));\r\n }\r\n\r\n async countMessages(conversationId: string): Promise<number> {\r\n const [{ count }] = await this.db\r\n .select({ count: sql<number>`count(*)` })\r\n .from(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, conversationId));\r\n return Number(count);\r\n }\r\n\r\n async getLastMessage(conversationId: string): Promise<Message | null> {\r\n const [message] = await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, conversationId))\r\n .orderBy(desc(this.schema.messages.timestamp))\r\n .limit(1);\r\n return message || null;\r\n }\r\n\r\n async searchMessages(conversationId: string, query: string): Promise<Message[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(\r\n and(\r\n eq(this.schema.messages.conversationId, conversationId),\r\n like(this.schema.messages.content, `%${query}%`)\r\n )\r\n )\r\n .orderBy(asc(this.schema.messages.timestamp));\r\n }\r\n\r\n // ─── Metadata ─────────────────────────────────────────────────────────────\r\n\r\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ metadata, updatedAt: new Date() })\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async getConversationMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\r\n const [row] = await this.db\r\n .select({ metadata: this.schema.conversations.metadata })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n return row?.metadata || null;\r\n }\r\n\r\n async deleteConversationMetadata(conversationId: string, keys: string[]): Promise<void> {\r\n const existing = await this.getConversationMetadata(conversationId);\r\n if (!existing) return;\r\n for (const key of keys) delete existing[key];\r\n await this.updateConversationMetadata(conversationId, existing);\r\n }\r\n\r\n // ─── Users ────────────────────────────────────────────────────────────────\r\n\r\n async userExists(userId: string): Promise<boolean> {\r\n const [row] = await this.db\r\n .select({ id: this.schema.conversations.id })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId))\r\n .limit(1);\r\n return !!row;\r\n }\r\n\r\n async deleteUser(userId: string): Promise<void> {\r\n await this.deleteAllConversations(userId);\r\n }\r\n\r\n // ─── Bulk ─────────────────────────────────────────────────────────────────\r\n\r\n async exportConversation(conversationId: string): Promise<ConversationExport> {\r\n const conversation = await this.getConversation(conversationId);\r\n if (!conversation) throw new Error(`Conversation ${conversationId} not found`);\r\n const messages = await this.getMessages(conversationId);\r\n return { conversation, messages, exportedAt: new Date() };\r\n }\r\n\r\n async importConversation(userId: string, data: ConversationExport): Promise<string> {\r\n const newId = await this.createConversation(userId, data.conversation.metadata);\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ title: data.conversation.title, createdAt: data.conversation.createdAt })\r\n .where(eq(this.schema.conversations.id, newId));\r\n await this.saveManyMessages(newId, data.messages);\r\n return newId;\r\n }\r\n}","import type { Message } from '../types';\r\nimport type { Conversation, ConversationExport, DatabaseAdapter } from './base';\r\n\r\n/**\r\n * Database manager with automatic persistence\r\n */\r\nexport class DatabaseManager {\r\n constructor(private adapter: DatabaseAdapter) { }\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n async connect(): Promise<void> {\r\n await this.adapter.connect();\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n await this.adapter.disconnect();\r\n }\r\n\r\n async healthCheck(): Promise<boolean> {\r\n return await this.adapter.healthCheck();\r\n }\r\n\r\n async purge(): Promise<void> {\r\n await this.adapter.purge();\r\n }\r\n\r\n // ─── Conversations ────────────────────────────────────────────────────────\r\n\r\n async create(userId: string, systemPrompt?: string): Promise<string> {\r\n return await this.adapter.createConversation(userId, { systemPrompt });\r\n }\r\n\r\n async getConversation(conversationId: string): Promise<Conversation | null> {\r\n return await this.adapter.getConversation(conversationId);\r\n }\r\n\r\n async listConversations(userId: string, limit?: number, offset?: number): Promise<Conversation[]> {\r\n return await this.adapter.listConversations(userId, limit, offset);\r\n }\r\n\r\n async updateConversation(conversationId: string, updates: Partial<Conversation>): Promise<void> {\r\n await this.adapter.updateConversation(conversationId, updates);\r\n }\r\n\r\n async deleteConversation(conversationId: string): Promise<void> {\r\n await this.adapter.deleteConversation(conversationId);\r\n }\r\n\r\n async deleteAllConversations(userId: string): Promise<void> {\r\n await this.adapter.deleteAllConversations(userId);\r\n }\r\n\r\n async countConversations(userId: string): Promise<number> {\r\n return await this.adapter.countConversations(userId);\r\n }\r\n\r\n async conversationExists(conversationId: string): Promise<boolean> {\r\n return await this.adapter.conversationExists(conversationId);\r\n }\r\n\r\n async searchConversations(userId: string, query: string): Promise<Conversation[]> {\r\n return await this.adapter.searchConversations(userId, query);\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n async addMessage(conversationId: string, message: Message): Promise<void> {\r\n await this.adapter.saveMessage(conversationId, message);\r\n }\r\n\r\n async addManyMessages(conversationId: string, messages: Message[]): Promise<void> {\r\n await this.adapter.saveManyMessages(conversationId, messages);\r\n }\r\n\r\n async getMessage(messageId: string): Promise<Message | null> {\r\n return await this.adapter.getMessage(messageId);\r\n }\r\n\r\n async getConversationHistory(conversationId: string, limit?: number, offset?: number): Promise<Message[]> {\r\n return await this.adapter.getMessages(conversationId, limit, offset);\r\n }\r\n\r\n async getMessagesByRole(conversationId: string, role: Message['role']): Promise<Message[]> {\r\n return await this.adapter.getMessagesByRole(conversationId, role);\r\n }\r\n\r\n async updateMessage(messageId: string, updates: Partial<Message>): Promise<void> {\r\n await this.adapter.updateMessage(messageId, updates);\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.adapter.deleteMessage(messageId);\r\n }\r\n\r\n async deleteAllMessages(conversationId: string): Promise<void> {\r\n await this.adapter.deleteAllMessages(conversationId);\r\n }\r\n\r\n async countMessages(conversationId: string): Promise<number> {\r\n return await this.adapter.countMessages(conversationId);\r\n }\r\n\r\n async getLastMessage(conversationId: string): Promise<Message | null> {\r\n return await this.adapter.getLastMessage(conversationId);\r\n }\r\n\r\n async searchMessages(conversationId: string, query: string): Promise<Message[]> {\r\n return await this.adapter.searchMessages(conversationId, query);\r\n }\r\n\r\n // ─── Metadata ─────────────────────────────────────────────────────────────\r\n\r\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\r\n await this.adapter.updateConversationMetadata(conversationId, metadata);\r\n }\r\n\r\n async getConversationMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\r\n return await this.adapter.getConversationMetadata(conversationId);\r\n }\r\n\r\n async deleteConversationMetadata(conversationId: string, keys: string[]): Promise<void> {\r\n await this.adapter.deleteConversationMetadata(conversationId, keys);\r\n }\r\n\r\n // ─── Users ────────────────────────────────────────────────────────────────\r\n\r\n async userExists(userId: string): Promise<boolean> {\r\n return await this.adapter.userExists(userId);\r\n }\r\n\r\n async deleteUser(userId: string): Promise<void> {\r\n await this.adapter.deleteUser(userId);\r\n }\r\n\r\n // ─── Bulk ─────────────────────────────────────────────────────────────────\r\n\r\n async exportConversation(conversationId: string): Promise<ConversationExport> {\r\n return await this.adapter.exportConversation(conversationId);\r\n }\r\n\r\n async importConversation(userId: string, data: ConversationExport): Promise<string> {\r\n return await this.adapter.importConversation(userId, data);\r\n }\r\n}","import type { Message } from '../../types';\r\nimport type { Conversation, ConversationExport, DatabaseAdapter } from '../base';\r\n\r\n/**\r\n * Simple in-memory adapter for development\r\n */\r\nexport class MemoryAdapter implements DatabaseAdapter {\r\n private conversations: Map<string, Conversation> = new Map();\r\n private messages: Map<string, Message[]> = new Map();\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n async connect(): Promise<void> { }\r\n\r\n async disconnect(): Promise<void> { }\r\n\r\n async healthCheck(): Promise<boolean> {\r\n return true;\r\n }\r\n\r\n async purge(): Promise<void> {\r\n this.conversations.clear();\r\n this.messages.clear();\r\n }\r\n\r\n // ─── Conversations ────────────────────────────────────────────────────────\r\n\r\n async createConversation(userId: string, metadata?: Record<string, unknown>): Promise<string> {\r\n const id = `conv_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n const conversation: Conversation = {\r\n id,\r\n userId,\r\n metadata: metadata || {},\r\n createdAt: new Date(),\r\n updatedAt: new Date(),\r\n };\r\n this.conversations.set(id, conversation);\r\n this.messages.set(id, []);\r\n return id;\r\n }\r\n\r\n async getConversation(conversationId: string): Promise<Conversation | null> {\r\n return this.conversations.get(conversationId) || null;\r\n }\r\n\r\n async listConversations(userId: string, limit = 50, offset = 0): Promise<Conversation[]> {\r\n return Array.from(this.conversations.values())\r\n .filter(conv => conv.userId === userId)\r\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\r\n .slice(offset, offset + limit);\r\n }\r\n\r\n async updateConversation(conversationId: string, updates: Partial<Conversation>): Promise<void> {\r\n const conversation = this.conversations.get(conversationId);\r\n if (conversation) {\r\n Object.assign(conversation, updates, { updatedAt: new Date() });\r\n }\r\n }\r\n\r\n async deleteConversation(conversationId: string): Promise<void> {\r\n this.conversations.delete(conversationId);\r\n this.messages.delete(conversationId);\r\n }\r\n\r\n async deleteAllConversations(userId: string): Promise<void> {\r\n for (const [id, conv] of this.conversations) {\r\n if (conv.userId === userId) {\r\n this.conversations.delete(id);\r\n this.messages.delete(id);\r\n }\r\n }\r\n }\r\n\r\n async countConversations(userId: string): Promise<number> {\r\n return Array.from(this.conversations.values()).filter(c => c.userId === userId).length;\r\n }\r\n\r\n async conversationExists(conversationId: string): Promise<boolean> {\r\n return this.conversations.has(conversationId);\r\n }\r\n\r\n async searchConversations(userId: string, query: string): Promise<Conversation[]> {\r\n const lower = query.toLowerCase();\r\n return Array.from(this.conversations.values()).filter(\r\n c => c.userId === userId && c.title?.toLowerCase().includes(lower)\r\n );\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n async saveMessage(conversationId: string, message: Message): Promise<void> {\r\n const messages = this.messages.get(conversationId) || [];\r\n messages.push(message);\r\n this.messages.set(conversationId, messages);\r\n\r\n const conversation = this.conversations.get(conversationId);\r\n if (conversation) {\r\n conversation.updatedAt = new Date();\r\n }\r\n }\r\n\r\n async saveManyMessages(conversationId: string, messages: Message[]): Promise<void> {\r\n for (const message of messages) {\r\n await this.saveMessage(conversationId, message);\r\n }\r\n }\r\n\r\n async getMessage(messageId: string): Promise<Message | null> {\r\n for (const messages of this.messages.values()) {\r\n const found = messages.find(m => m.id === messageId);\r\n if (found) return found;\r\n }\r\n return null;\r\n }\r\n\r\n async getMessages(conversationId: string, limit = 100, offset = 0): Promise<Message[]> {\r\n const messages = this.messages.get(conversationId) || [];\r\n return messages.slice(offset, offset + limit);\r\n }\r\n\r\n async getMessagesByRole(conversationId: string, role: Message['role']): Promise<Message[]> {\r\n const messages = this.messages.get(conversationId) || [];\r\n return messages.filter(m => m.role === role);\r\n }\r\n\r\n async updateMessage(messageId: string, updates: Partial<Message>): Promise<void> {\r\n for (const messages of this.messages.values()) {\r\n const index = messages.findIndex(m => m.id === messageId);\r\n if (index !== -1) {\r\n messages[index] = { ...messages[index], ...updates } as Message;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n for (const [convId, messages] of this.messages) {\r\n const index = messages.findIndex(m => m.id === messageId);\r\n if (index !== -1) {\r\n messages.splice(index, 1);\r\n this.messages.set(convId, messages);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n async deleteAllMessages(conversationId: string): Promise<void> {\r\n this.messages.set(conversationId, []);\r\n }\r\n\r\n async countMessages(conversationId: string): Promise<number> {\r\n return (this.messages.get(conversationId) || []).length;\r\n }\r\n\r\n async getLastMessage(conversationId: string): Promise<Message | null> {\r\n const messages = this.messages.get(conversationId) || [];\r\n return messages[messages.length - 1] || null;\r\n }\r\n\r\n async searchMessages(conversationId: string, query: string): Promise<Message[]> {\r\n const lower = query.toLowerCase();\r\n const messages = this.messages.get(conversationId) || [];\r\n return messages.filter(\r\n m => typeof m.content === 'string' && m.content.toLowerCase().includes(lower)\r\n );\r\n }\r\n\r\n // ─── Metadata ─────────────────────────────────────────────────────────────\r\n\r\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\r\n const conversation = this.conversations.get(conversationId);\r\n if (conversation) {\r\n conversation.metadata = { ...conversation.metadata, ...metadata };\r\n conversation.updatedAt = new Date();\r\n }\r\n }\r\n\r\n async getConversationMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\r\n return this.conversations.get(conversationId)?.metadata || null;\r\n }\r\n\r\n async deleteConversationMetadata(conversationId: string, keys: string[]): Promise<void> {\r\n const conversation = this.conversations.get(conversationId);\r\n if (conversation?.metadata) {\r\n for (const key of keys) {\r\n delete conversation.metadata[key];\r\n }\r\n conversation.updatedAt = new Date();\r\n }\r\n }\r\n\r\n // ─── Users ────────────────────────────────────────────────────────────────\r\n\r\n async userExists(userId: string): Promise<boolean> {\r\n return Array.from(this.conversations.values()).some(c => c.userId === userId);\r\n }\r\n\r\n async deleteUser(userId: string): Promise<void> {\r\n await this.deleteAllConversations(userId);\r\n }\r\n\r\n // ─── Bulk ─────────────────────────────────────────────────────────────────\r\n\r\n async exportConversation(conversationId: string): Promise<ConversationExport> {\r\n const conversation = await this.getConversation(conversationId);\r\n if (!conversation) throw new Error(`Conversation ${conversationId} not found`);\r\n const messages = await this.getMessages(conversationId);\r\n return { conversation, messages, exportedAt: new Date() };\r\n }\r\n\r\n async importConversation(userId: string, data: ConversationExport): Promise<string> {\r\n const newId = await this.createConversation(userId, data.conversation.metadata);\r\n const conv = this.conversations.get(newId)!;\r\n conv.title = data.conversation.title;\r\n conv.createdAt = data.conversation.createdAt;\r\n await this.saveManyMessages(newId, data.messages);\r\n return newId;\r\n }\r\n}","import type { Message } from '../../types';\r\nimport type { Conversation, ConversationExport, DatabaseAdapter } from '../base';\r\n\r\n/**\r\n * Prisma database adapter\r\n */\r\nexport class PrismaAdapter implements DatabaseAdapter {\r\n constructor(private prisma: any) { }\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n async connect(): Promise<void> {\r\n await this.prisma.$connect();\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n await this.prisma.$disconnect();\r\n }\r\n\r\n async healthCheck(): Promise<boolean> {\r\n try {\r\n await this.prisma.$queryRaw`SELECT 1`;\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async purge(): Promise<void> {\r\n await this.prisma.message.deleteMany();\r\n await this.prisma.conversation.deleteMany();\r\n }\r\n\r\n // ─── Conversations ────────────────────────────────────────────────────────\r\n\r\n async createConversation(userId: string, metadata?: Record<string, unknown>): Promise<string> {\r\n const conversation = await this.prisma.conversation.create({\r\n data: { userId, metadata: metadata || {} },\r\n });\r\n return conversation.id;\r\n }\r\n\r\n async getConversation(conversationId: string): Promise<Conversation | null> {\r\n return await this.prisma.conversation.findUnique({\r\n where: { id: conversationId },\r\n });\r\n }\r\n\r\n async listConversations(userId: string, limit = 50, offset = 0): Promise<Conversation[]> {\r\n return await this.prisma.conversation.findMany({\r\n where: { userId },\r\n orderBy: { updatedAt: 'desc' },\r\n take: limit,\r\n skip: offset,\r\n });\r\n }\r\n\r\n async updateConversation(conversationId: string, updates: Partial<Conversation>): Promise<void> {\r\n await this.prisma.conversation.update({\r\n where: { id: conversationId },\r\n data: { ...updates, updatedAt: new Date() },\r\n });\r\n }\r\n\r\n async deleteConversation(conversationId: string): Promise<void> {\r\n await this.prisma.conversation.delete({\r\n where: { id: conversationId },\r\n });\r\n }\r\n\r\n async deleteAllConversations(userId: string): Promise<void> {\r\n const conversations = await this.prisma.conversation.findMany({\r\n where: { userId },\r\n select: { id: true },\r\n });\r\n\r\n await this.prisma.message.deleteMany({\r\n where: { conversationId: { in: conversations.map((c: any) => c.id) } },\r\n });\r\n\r\n await this.prisma.conversation.deleteMany({ where: { userId } });\r\n }\r\n\r\n async countConversations(userId: string): Promise<number> {\r\n return await this.prisma.conversation.count({ where: { userId } });\r\n }\r\n\r\n async conversationExists(conversationId: string): Promise<boolean> {\r\n const count = await this.prisma.conversation.count({\r\n where: { id: conversationId },\r\n });\r\n return count > 0;\r\n }\r\n\r\n async searchConversations(userId: string, query: string): Promise<Conversation[]> {\r\n return await this.prisma.conversation.findMany({\r\n where: {\r\n userId,\r\n title: { contains: query, mode: 'insensitive' },\r\n },\r\n orderBy: { updatedAt: 'desc' },\r\n });\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n private toMessage(msg: any): Message {\r\n return {\r\n id: msg.id,\r\n role: msg.role,\r\n content: msg.content,\r\n toolCalls: msg.toolCalls,\r\n toolResults: msg.toolResults,\r\n metadata: msg.metadata,\r\n timestamp: msg.timestamp,\r\n };\r\n }\r\n\r\n async saveMessage(conversationId: string, message: Message): Promise<void> {\r\n await this.prisma.message.create({\r\n data: {\r\n id: message.id,\r\n conversationId,\r\n role: message.role,\r\n content: message.content,\r\n toolCalls: message.toolCalls || [],\r\n toolResults: message.toolResults || [],\r\n metadata: message.metadata || {},\r\n timestamp: message.timestamp || Date.now(),\r\n },\r\n });\r\n\r\n await this.prisma.conversation.update({\r\n where: { id: conversationId },\r\n data: { updatedAt: new Date() },\r\n });\r\n }\r\n\r\n async saveManyMessages(conversationId: string, messages: Message[]): Promise<void> {\r\n if (messages.length === 0) return;\r\n\r\n await this.prisma.message.createMany({\r\n data: messages.map(m => ({\r\n id: m.id,\r\n conversationId,\r\n role: m.role,\r\n content: m.content,\r\n toolCalls: m.toolCalls || [],\r\n toolResults: m.toolResults || [],\r\n metadata: m.metadata || {},\r\n timestamp: m.timestamp || Date.now(),\r\n })),\r\n });\r\n\r\n await this.prisma.conversation.update({\r\n where: { id: conversationId },\r\n data: { updatedAt: new Date() },\r\n });\r\n }\r\n\r\n async getMessage(messageId: string): Promise<Message | null> {\r\n const msg = await this.prisma.message.findUnique({ where: { id: messageId } });\r\n return msg ? this.toMessage(msg) : null;\r\n }\r\n\r\n async getMessages(conversationId: string, limit = 100, offset = 0): Promise<Message[]> {\r\n const messages = await this.prisma.message.findMany({\r\n where: { conversationId },\r\n orderBy: { timestamp: 'asc' },\r\n take: limit,\r\n skip: offset,\r\n });\r\n return messages.map(this.toMessage);\r\n }\r\n\r\n async getMessagesByRole(conversationId: string, role: Message['role']): Promise<Message[]> {\r\n const messages = await this.prisma.message.findMany({\r\n where: { conversationId, role },\r\n orderBy: { timestamp: 'asc' },\r\n });\r\n return messages.map(this.toMessage);\r\n }\r\n\r\n async updateMessage(messageId: string, updates: Partial<Message>): Promise<void> {\r\n await this.prisma.message.update({\r\n where: { id: messageId },\r\n data: updates,\r\n });\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.prisma.message.delete({ where: { id: messageId } });\r\n }\r\n\r\n async deleteAllMessages(conversationId: string): Promise<void> {\r\n await this.prisma.message.deleteMany({ where: { conversationId } });\r\n }\r\n\r\n async countMessages(conversationId: string): Promise<number> {\r\n return await this.prisma.message.count({ where: { conversationId } });\r\n }\r\n\r\n async getLastMessage(conversationId: string): Promise<Message | null> {\r\n const msg = await this.prisma.message.findFirst({\r\n where: { conversationId },\r\n orderBy: { timestamp: 'desc' },\r\n });\r\n return msg ? this.toMessage(msg) : null;\r\n }\r\n\r\n async searchMessages(conversationId: string, query: string): Promise<Message[]> {\r\n const messages = await this.prisma.message.findMany({\r\n where: {\r\n conversationId,\r\n content: { contains: query, mode: 'insensitive' },\r\n },\r\n orderBy: { timestamp: 'asc' },\r\n });\r\n return messages.map(this.toMessage);\r\n }\r\n\r\n // ─── Metadata ─────────────────────────────────────────────────────────────\r\n\r\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\r\n await this.prisma.conversation.update({\r\n where: { id: conversationId },\r\n data: { metadata, updatedAt: new Date() },\r\n });\r\n }\r\n\r\n async getConversationMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\r\n const conv = await this.prisma.conversation.findUnique({\r\n where: { id: conversationId },\r\n select: { metadata: true },\r\n });\r\n return conv?.metadata || null;\r\n }\r\n\r\n async deleteConversationMetadata(conversationId: string, keys: string[]): Promise<void> {\r\n const existing = await this.getConversationMetadata(conversationId);\r\n if (!existing) return;\r\n for (const key of keys) delete existing[key];\r\n await this.updateConversationMetadata(conversationId, existing);\r\n }\r\n\r\n // ─── Users ────────────────────────────────────────────────────────────────\r\n\r\n async userExists(userId: string): Promise<boolean> {\r\n const count = await this.prisma.conversation.count({ where: { userId } });\r\n return count > 0;\r\n }\r\n\r\n async deleteUser(userId: string): Promise<void> {\r\n await this.deleteAllConversations(userId);\r\n }\r\n\r\n // ─── Bulk ─────────────────────────────────────────────────────────────────\r\n\r\n async exportConversation(conversationId: string): Promise<ConversationExport> {\r\n const conversation = await this.getConversation(conversationId);\r\n if (!conversation) throw new Error(`Conversation ${conversationId} not found`);\r\n const messages = await this.getMessages(conversationId);\r\n return { conversation, messages, exportedAt: new Date() };\r\n }\r\n\r\n async importConversation(userId: string, data: ConversationExport): Promise<string> {\r\n const newId = await this.createConversation(userId, data.conversation.metadata);\r\n await this.prisma.conversation.update({\r\n where: { id: newId },\r\n data: { title: data.conversation.title, createdAt: data.conversation.createdAt },\r\n });\r\n await this.saveManyMessages(newId, data.messages);\r\n return newId;\r\n }\r\n}","import EventEmitter from 'eventemitter3';\r\nimport { generateId } from '../utils';\r\nimport type { PaprFlare } from '../client';\r\nimport type { Message, ChatConfig } from '../types';\r\nimport type {\r\n Thread,\r\n ThreadEvent,\r\n ThreadFilter,\r\n ThreadPaginationOptions,\r\n ThreadStats,\r\n ThreadExport,\r\n} from './base';\r\n\r\n/**\r\n * Thread Manager for handling multiple concurrent conversations\r\n * Optimized for high throughput with event-driven architecture\r\n */\r\nexport class ThreadManager extends EventEmitter {\r\n threads: Map<string, Thread> = new Map();\r\n\r\n constructor(private client: PaprFlare) {\r\n super();\r\n }\r\n\r\n // ─── Creation ─────────────────────────────────────────────────────────────\r\n\r\n async createThread(\r\n userId: string,\r\n config?: ChatConfig,\r\n metadata?: Record<string, unknown>,\r\n options?: { title?: string; tags?: string[]; priority?: Thread['priority'] }\r\n ): Promise<string> {\r\n const threadId = generateId('thread');\r\n const now = Date.now();\r\n\r\n const thread: Thread = {\r\n id: threadId,\r\n userId,\r\n messages: [],\r\n config,\r\n metadata: metadata || {},\r\n tags: options?.tags || [],\r\n title: options?.title,\r\n createdAt: now,\r\n updatedAt: now,\r\n lastActiveAt: now,\r\n status: 'active',\r\n priority: options?.priority || 'normal',\r\n messageCount: 0,\r\n errorCount: 0,\r\n };\r\n\r\n this.threads.set(threadId, thread);\r\n this.emit('event', { type: 'thread-created', threadId, thread } as ThreadEvent);\r\n\r\n return threadId;\r\n }\r\n\r\n /**\r\n * Fork a thread — creates a new thread with a copy of messages up to a given point\r\n */\r\n async forkThread(\r\n threadId: string,\r\n upToMessageId?: string\r\n ): Promise<string> {\r\n const thread = this.requireThread(threadId);\r\n\r\n let messages = [...thread.messages];\r\n if (upToMessageId) {\r\n const idx = messages.findIndex(m => m.id === upToMessageId);\r\n if (idx !== -1) messages = messages.slice(0, idx + 1);\r\n }\r\n\r\n const newId = await this.createThread(thread.userId, thread.config, { ...thread.metadata });\r\n const newThread = this.requireThread(newId);\r\n newThread.messages = messages.map(m => ({ ...m }));\r\n newThread.messageCount = messages.length;\r\n newThread.tags = [...thread.tags];\r\n newThread.title = thread.title ? `Fork of ${thread.title}` : undefined;\r\n\r\n this.emit('event', { type: 'thread-forked', threadId: newId, parentThreadId: threadId } as ThreadEvent);\r\n\r\n return newId;\r\n }\r\n\r\n /**\r\n * Merge another thread's messages into this thread\r\n */\r\n async mergeThread(targetThreadId: string, sourceThreadId: string): Promise<void> {\r\n const target = this.requireThread(targetThreadId);\r\n const source = this.requireThread(sourceThreadId);\r\n\r\n const merged = [...target.messages, ...source.messages].sort(\r\n (a, b) => (a.timestamp || 0) - (b.timestamp || 0)\r\n );\r\n\r\n target.messages = merged;\r\n target.messageCount = merged.length;\r\n target.updatedAt = Date.now();\r\n\r\n this.emit('event', { type: 'thread-merged', threadId: targetThreadId, sourceThreadId } as ThreadEvent);\r\n }\r\n\r\n // ─── Retrieval ────────────────────────────────────────────────────────────\r\n\r\n getThread(threadId: string): Thread | null {\r\n return this.threads.get(threadId) || null;\r\n }\r\n\r\n threadExists(threadId: string): boolean {\r\n return this.threads.has(threadId);\r\n }\r\n\r\n getUserThreads(\r\n userId: string,\r\n options?: ThreadPaginationOptions\r\n ): Thread[] {\r\n let results = Array.from(this.threads.values()).filter(t => t.userId === userId);\r\n\r\n results = this.sortThreads(results, options?.sort);\r\n\r\n const offset = options?.offset || 0;\r\n const limit = options?.limit ?? results.length;\r\n return results.slice(offset, offset + limit);\r\n }\r\n\r\n filterThreads(\r\n userId: string,\r\n filter: ThreadFilter,\r\n options?: ThreadPaginationOptions\r\n ): Thread[] {\r\n let results = Array.from(this.threads.values()).filter(t => t.userId === userId);\r\n\r\n if (filter.status) {\r\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\r\n results = results.filter(t => statuses.includes(t.status));\r\n }\r\n if (filter.priority) {\r\n results = results.filter(t => t.priority === filter.priority);\r\n }\r\n if (filter.tags?.length) {\r\n results = results.filter(t => filter.tags!.every(tag => t.tags.includes(tag)));\r\n }\r\n if (filter.createdAfter !== undefined) {\r\n results = results.filter(t => t.createdAt >= filter.createdAfter!);\r\n }\r\n if (filter.createdBefore !== undefined) {\r\n results = results.filter(t => t.createdAt <= filter.createdBefore!);\r\n }\r\n if (filter.updatedAfter !== undefined) {\r\n results = results.filter(t => t.updatedAt >= filter.updatedAfter!);\r\n }\r\n if (filter.search) {\r\n const q = filter.search.toLowerCase();\r\n results = results.filter(\r\n t =>\r\n t.title?.toLowerCase().includes(q) ||\r\n t.messages.some(m => typeof m.content === 'string' && m.content.toLowerCase().includes(q))\r\n );\r\n }\r\n\r\n results = this.sortThreads(results, options?.sort);\r\n\r\n const offset = options?.offset || 0;\r\n const limit = options?.limit ?? results.length;\r\n return results.slice(offset, offset + limit);\r\n }\r\n\r\n countThreads(userId: string, filter?: ThreadFilter): number {\r\n return this.filterThreads(userId, filter || {}).length;\r\n }\r\n\r\n // ─── Status & Metadata ────────────────────────────────────────────────────\r\n\r\n updateThreadStatus(threadId: string, status: Thread['status']): void {\r\n const thread = this.requireThread(threadId);\r\n const previousStatus = thread.status;\r\n thread.status = status;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'status-changed', threadId, status, previousStatus } as ThreadEvent);\r\n }\r\n\r\n updateThreadPriority(threadId: string, priority: Thread['priority']): void {\r\n const thread = this.requireThread(threadId);\r\n thread.priority = priority;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'priority-changed', threadId, priority } as ThreadEvent);\r\n }\r\n\r\n updateThreadMetadata(threadId: string, metadata: Record<string, unknown>): void {\r\n const thread = this.requireThread(threadId);\r\n thread.metadata = { ...thread.metadata, ...metadata };\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'metadata-updated', threadId, metadata: thread.metadata } as ThreadEvent);\r\n }\r\n\r\n setThreadTitle(threadId: string, title: string): void {\r\n const thread = this.requireThread(threadId);\r\n thread.title = title;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'title-updated', threadId, title } as ThreadEvent);\r\n }\r\n\r\n updateThreadConfig(threadId: string, config: Partial<ChatConfig>): void {\r\n const thread = this.requireThread(threadId);\r\n thread.config = { ...thread.config, ...config } as ChatConfig;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'config-updated', threadId, config: thread.config } as ThreadEvent);\r\n }\r\n\r\n // ─── Tags ─────────────────────────────────────────────────────────────────\r\n\r\n addTags(threadId: string, tags: string[]): void {\r\n const thread = this.requireThread(threadId);\r\n thread.tags = [...new Set([...thread.tags, ...tags])];\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'tags-updated', threadId, tags: thread.tags } as ThreadEvent);\r\n }\r\n\r\n removeTags(threadId: string, tags: string[]): void {\r\n const thread = this.requireThread(threadId);\r\n thread.tags = thread.tags.filter(t => !tags.includes(t));\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'tags-updated', threadId, tags: thread.tags } as ThreadEvent);\r\n }\r\n\r\n setTags(threadId: string, tags: string[]): void {\r\n const thread = this.requireThread(threadId);\r\n thread.tags = [...new Set(tags)];\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'tags-updated', threadId, tags: thread.tags } as ThreadEvent);\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n async addMessage(threadId: string, message: Message): Promise<void> {\r\n const thread = this.requireThread(threadId);\r\n const now = Date.now();\r\n\r\n const fullMessage: Message = {\r\n ...message,\r\n id: message.id || generateId('msg'),\r\n timestamp: message.timestamp || now,\r\n };\r\n\r\n thread.messages.push(fullMessage);\r\n thread.messageCount = thread.messages.length;\r\n thread.updatedAt = now;\r\n thread.lastActiveAt = now;\r\n\r\n this.emit('event', { type: 'message-added', threadId, message: fullMessage } as ThreadEvent);\r\n }\r\n\r\n async addManyMessages(threadId: string, messages: Message[]): Promise<void> {\r\n for (const message of messages) {\r\n await this.addMessage(threadId, message);\r\n }\r\n }\r\n\r\n getMessage(threadId: string, messageId: string): Message | null {\r\n const thread = this.requireThread(threadId);\r\n return thread.messages.find(m => m.id === messageId) || null;\r\n }\r\n\r\n getMessages(\r\n threadId: string,\r\n options?: { limit?: number; offset?: number; role?: Message['role'] }\r\n ): Message[] {\r\n const thread = this.requireThread(threadId);\r\n let messages = [...thread.messages];\r\n\r\n if (options?.role) {\r\n messages = messages.filter(m => m.role === options.role);\r\n }\r\n\r\n const offset = options?.offset || 0;\r\n const limit = options?.limit ?? messages.length;\r\n return messages.slice(offset, offset + limit);\r\n }\r\n\r\n getLastMessage(threadId: string): Message | null {\r\n const thread = this.requireThread(threadId);\r\n return thread.messages[thread.messages.length - 1] || null;\r\n }\r\n\r\n updateMessage(threadId: string, messageId: string, updates: Partial<Message>): void {\r\n const thread = this.requireThread(threadId);\r\n const idx = thread.messages.findIndex(m => m.id === messageId);\r\n if (idx === -1) throw new Error(`Message ${messageId} not found in thread ${threadId}`);\r\n\r\n thread.messages[idx] = { ...thread.messages[idx], ...updates } as Message;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'message-updated', threadId, messageId, updates } as ThreadEvent);\r\n }\r\n\r\n deleteMessage(threadId: string, messageId: string): void {\r\n const thread = this.requireThread(threadId);\r\n const idx = thread.messages.findIndex(m => m.id === messageId);\r\n if (idx === -1) throw new Error(`Message ${messageId} not found in thread ${threadId}`);\r\n\r\n thread.messages.splice(idx, 1);\r\n thread.messageCount = thread.messages.length;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'message-deleted', threadId, messageId } as ThreadEvent);\r\n }\r\n\r\n searchMessages(threadId: string, query: string): Message[] {\r\n const thread = this.requireThread(threadId);\r\n const lower = query.toLowerCase();\r\n return thread.messages.filter(\r\n m => typeof m.content === 'string' && m.content.toLowerCase().includes(lower)\r\n );\r\n }\r\n\r\n clearThread(threadId: string): void {\r\n const thread = this.requireThread(threadId);\r\n thread.messages = [];\r\n thread.messageCount = 0;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'thread-cleared', threadId } as ThreadEvent);\r\n }\r\n\r\n trimThread(threadId: string, keepLast: number): void {\r\n const thread = this.requireThread(threadId);\r\n if (thread.messages.length > keepLast) {\r\n thread.messages = thread.messages.slice(-keepLast);\r\n thread.messageCount = thread.messages.length;\r\n thread.updatedAt = Date.now();\r\n }\r\n }\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n archiveThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'archived');\r\n this.emit('event', { type: 'thread-archived', threadId } as ThreadEvent);\r\n }\r\n\r\n restoreThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'active');\r\n this.emit('event', { type: 'thread-restored', threadId } as ThreadEvent);\r\n }\r\n\r\n pauseThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'paused');\r\n }\r\n\r\n resumeThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'active');\r\n }\r\n\r\n completeThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'completed');\r\n }\r\n\r\n markThreadError(threadId: string, error: Error): void {\r\n const thread = this.requireThread(threadId);\r\n thread.errorCount += 1;\r\n thread.lastError = error.message;\r\n this.updateThreadStatus(threadId, 'error');\r\n this.emit('event', { type: 'error', threadId, error } as ThreadEvent);\r\n }\r\n\r\n deleteThread(threadId: string): void {\r\n this.threads.delete(threadId);\r\n this.emit('event', { type: 'thread-deleted', threadId } as ThreadEvent);\r\n }\r\n\r\n deleteAllThreads(userId: string): void {\r\n for (const [id, thread] of this.threads) {\r\n if (thread.userId === userId) {\r\n this.threads.delete(id);\r\n this.emit('event', { type: 'thread-deleted', threadId: id } as ThreadEvent);\r\n }\r\n }\r\n }\r\n\r\n // ─── Stats ────────────────────────────────────────────────────────────────\r\n\r\n getStats(userId?: string): ThreadStats {\r\n const threads = userId\r\n ? Array.from(this.threads.values()).filter(t => t.userId === userId)\r\n : Array.from(this.threads.values());\r\n\r\n const totalMessages = threads.reduce((sum, t) => sum + t.messageCount, 0);\r\n const totalTokens = threads.reduce((sum, t) => sum + (t.tokenCount || 0), 0);\r\n const timestamps = threads.map(t => t.createdAt);\r\n\r\n const stats: ThreadStats = {\r\n total: threads.length,\r\n active: threads.filter(t => t.status === 'active').length,\r\n paused: threads.filter(t => t.status === 'paused').length,\r\n completed: threads.filter(t => t.status === 'completed').length,\r\n error: threads.filter(t => t.status === 'error').length,\r\n archived: threads.filter(t => t.status === 'archived').length,\r\n totalMessages,\r\n totalTokens,\r\n averageMessagesPerThread: threads.length ? totalMessages / threads.length : 0,\r\n oldestThread: timestamps.length ? Math.min(...timestamps) : undefined,\r\n newestThread: timestamps.length ? Math.max(...timestamps) : undefined,\r\n };\r\n\r\n this.emit('event', { type: 'pool-stats', stats } as ThreadEvent);\r\n return stats;\r\n }\r\n\r\n // ─── Bulk / Export ────────────────────────────────────────────────────────\r\n\r\n exportThread(threadId: string): ThreadExport {\r\n const thread = this.requireThread(threadId);\r\n return {\r\n thread: { ...thread },\r\n messages: thread.messages.map(m => ({ ...m })),\r\n exportedAt: Date.now(),\r\n version: '1.0',\r\n };\r\n }\r\n\r\n importThread(userId: string, data: ThreadExport): string {\r\n const newId = generateId('thread');\r\n const now = Date.now();\r\n\r\n const thread: Thread = {\r\n ...data.thread,\r\n id: newId,\r\n userId,\r\n messages: data.messages.map(m => ({ ...m })),\r\n createdAt: now,\r\n updatedAt: now,\r\n lastActiveAt: now,\r\n };\r\n\r\n this.threads.set(newId, thread);\r\n this.emit('event', { type: 'thread-created', threadId: newId, thread } as ThreadEvent);\r\n\r\n return newId;\r\n }\r\n\r\n // ─── Cleanup ──────────────────────────────────────────────────────────────\r\n\r\n cleanup(maxAge: number = 3600000): void {\r\n const now = Date.now();\r\n const toDelete: string[] = [];\r\n\r\n for (const [threadId, thread] of this.threads) {\r\n if (thread.status !== 'active' && now - thread.updatedAt > maxAge) {\r\n toDelete.push(threadId);\r\n }\r\n }\r\n\r\n for (const threadId of toDelete) {\r\n this.threads.delete(threadId);\r\n }\r\n\r\n this.emit('event', { type: 'cleanup', deletedCount: toDelete.length } as ThreadEvent);\r\n }\r\n\r\n // ─── Helpers ──────────────────────────────────────────────────────────────\r\n\r\n private requireThread(threadId: string): Thread {\r\n const thread = this.threads.get(threadId);\r\n if (!thread) throw new Error(`Thread ${threadId} not found`);\r\n return thread;\r\n }\r\n\r\n private sortThreads(threads: Thread[], sort?: ThreadPaginationOptions['sort']): Thread[] {\r\n const field = sort?.field || 'updatedAt';\r\n const dir = sort?.direction === 'asc' ? 1 : -1;\r\n\r\n return [...threads].sort((a, b) => {\r\n const av = a[field] as number;\r\n const bv = b[field] as number;\r\n return dir * (av - bv);\r\n });\r\n }\r\n}","import type { PaprFlare } from '../client';\r\nimport type { Thread, ThreadFilter, ThreadPaginationOptions, ThreadStats, ThreadExport } from './base';\r\nimport { ThreadManager } from './threads-manager';\r\n\r\n/**\r\n * Thread pool for managing multiple threads across multiple users efficiently\r\n */\r\nexport class ThreadPool {\r\n private managers: Map<string, ThreadManager> = new Map();\r\n\r\n constructor(private client: PaprFlare) { }\r\n\r\n // ─── Manager Lifecycle ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Get or create a thread manager for a user\r\n */\r\n getManager(userId: string): ThreadManager {\r\n if (!this.managers.has(userId)) {\r\n this.managers.set(userId, new ThreadManager(this.client));\r\n }\r\n return this.managers.get(userId)!;\r\n }\r\n\r\n /**\r\n * Check if a manager exists for a user\r\n */\r\n hasManager(userId: string): boolean {\r\n return this.managers.has(userId);\r\n }\r\n\r\n /**\r\n * Remove and destroy a user's thread manager\r\n */\r\n removeManager(userId: string): void {\r\n const manager = this.managers.get(userId);\r\n if (manager) {\r\n manager.removeAllListeners();\r\n this.managers.delete(userId);\r\n }\r\n }\r\n\r\n /**\r\n * List all user IDs that have active managers\r\n */\r\n listUsers(): string[] {\r\n return Array.from(this.managers.keys());\r\n }\r\n\r\n /**\r\n * Total number of managers (users) in the pool\r\n */\r\n managerCount(): number {\r\n return this.managers.size;\r\n }\r\n\r\n // ─── Cross-user Thread Queries ────────────────────────────────────────────\r\n\r\n /**\r\n * Get all threads across all users\r\n */\r\n getAllThreads(): Thread[] {\r\n const all: Thread[] = [];\r\n for (const manager of this.managers.values()) {\r\n all.push(...Array.from(manager.threads.values()));\r\n }\r\n return all;\r\n }\r\n\r\n /**\r\n * Get all active threads across all users\r\n */\r\n getAllActiveThreads(): Thread[] {\r\n return this.getAllThreads().filter(t => t.status === 'active');\r\n }\r\n\r\n /**\r\n * Get all threads matching a filter across all users\r\n */\r\n findThreads(filter: ThreadFilter, options?: ThreadPaginationOptions): Thread[] {\r\n let results: Thread[] = [];\r\n\r\n for (const [userId, manager] of this.managers) {\r\n results.push(...manager.filterThreads(userId, filter, options));\r\n }\r\n\r\n const field = options?.sort?.field || 'updatedAt';\r\n const dir = options?.sort?.direction === 'asc' ? 1 : -1;\r\n results.sort((a, b) => dir * ((a[field] as number) - (b[field] as number)));\r\n\r\n const offset = options?.offset || 0;\r\n const limit = options?.limit ?? results.length;\r\n return results.slice(offset, offset + limit);\r\n }\r\n\r\n /**\r\n * Find a specific thread by ID across all users\r\n */\r\n findThread(threadId: string): Thread | null {\r\n for (const manager of this.managers.values()) {\r\n const thread = manager.getThread(threadId);\r\n if (thread) return thread;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Find which user owns a thread\r\n */\r\n findThreadOwner(threadId: string): string | null {\r\n for (const [userId, manager] of this.managers) {\r\n if (manager.threadExists(threadId)) return userId;\r\n }\r\n return null;\r\n }\r\n\r\n // ─── Cross-user Stats ─────────────────────────────────────────────────────\r\n\r\n /**\r\n * Aggregate stats across all users\r\n */\r\n getGlobalStats(): ThreadStats & { userCount: number } {\r\n const allThreads = this.getAllThreads();\r\n const totalMessages = allThreads.reduce((s, t) => s + t.messageCount, 0);\r\n const totalTokens = allThreads.reduce((s, t) => s + (t.tokenCount || 0), 0);\r\n const timestamps = allThreads.map(t => t.createdAt);\r\n\r\n return {\r\n userCount: this.managers.size,\r\n total: allThreads.length,\r\n active: allThreads.filter(t => t.status === 'active').length,\r\n paused: allThreads.filter(t => t.status === 'paused').length,\r\n completed: allThreads.filter(t => t.status === 'completed').length,\r\n error: allThreads.filter(t => t.status === 'error').length,\r\n archived: allThreads.filter(t => t.status === 'archived').length,\r\n totalMessages,\r\n totalTokens,\r\n averageMessagesPerThread: allThreads.length ? totalMessages / allThreads.length : 0,\r\n oldestThread: timestamps.length ? Math.min(...timestamps) : undefined,\r\n newestThread: timestamps.length ? Math.max(...timestamps) : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Get per-user stats summary\r\n */\r\n getUserStats(): Record<string, ThreadStats> {\r\n const result: Record<string, ThreadStats> = {};\r\n for (const [userId, manager] of this.managers) {\r\n result[userId] = manager.getStats(userId);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Total thread count across all users\r\n */\r\n totalThreadCount(): number {\r\n let count = 0;\r\n for (const manager of this.managers.values()) {\r\n count += manager.threads.size;\r\n }\r\n return count;\r\n }\r\n\r\n // ─── Bulk Operations ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Cleanup inactive threads across all managers\r\n */\r\n cleanupAll(maxAge: number = 3600000): void {\r\n for (const manager of this.managers.values()) {\r\n manager.cleanup(maxAge);\r\n }\r\n\r\n // Remove empty managers after cleanup\r\n for (const [userId, manager] of this.managers) {\r\n if (manager.threads.size === 0) {\r\n manager.removeAllListeners();\r\n this.managers.delete(userId);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Archive all completed or errored threads older than maxAge\r\n */\r\n archiveStale(maxAge: number = 86400000): number {\r\n const now = Date.now();\r\n let count = 0;\r\n\r\n for (const manager of this.managers.values()) {\r\n for (const thread of manager.threads.values()) {\r\n if (\r\n (thread.status === 'completed' || thread.status === 'error') &&\r\n now - thread.updatedAt > maxAge\r\n ) {\r\n manager.archiveThread(thread.id);\r\n count++;\r\n }\r\n }\r\n }\r\n\r\n return count;\r\n }\r\n\r\n /**\r\n * Delete all threads and managers for a user\r\n */\r\n deleteUser(userId: string): void {\r\n const manager = this.managers.get(userId);\r\n if (manager) {\r\n manager.deleteAllThreads(userId);\r\n manager.removeAllListeners();\r\n this.managers.delete(userId);\r\n }\r\n }\r\n\r\n /**\r\n * Delete all threads and managers across the entire pool\r\n */\r\n purge(): void {\r\n for (const [userId, manager] of this.managers) {\r\n manager.deleteAllThreads(userId);\r\n manager.removeAllListeners();\r\n }\r\n this.managers.clear();\r\n }\r\n\r\n // ─── Export / Import ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Export a thread by ID, searching across all managers\r\n */\r\n exportThread(threadId: string): ThreadExport | null {\r\n for (const manager of this.managers.values()) {\r\n if (manager.threadExists(threadId)) {\r\n return manager.exportThread(threadId);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Import a thread for a user\r\n */\r\n importThread(userId: string, data: ThreadExport): string {\r\n return this.getManager(userId).importThread(userId, data);\r\n }\r\n\r\n /**\r\n * Export all threads for a user\r\n */\r\n exportUserThreads(userId: string): ThreadExport[] {\r\n const manager = this.managers.get(userId);\r\n if (!manager) return [];\r\n\r\n return Array.from(manager.threads.keys()).map(id => manager.exportThread(id));\r\n }\r\n\r\n /**\r\n * Import multiple threads for a user\r\n */\r\n importUserThreads(userId: string, exports: ThreadExport[]): string[] {\r\n return exports.map(data => this.importThread(userId, data));\r\n }\r\n}","import { z } from 'zod';\r\nimport PQueue from 'p-queue';\r\nimport { Mutex } from 'async-mutex';\r\nimport type {\r\n Message,\r\n StreamEvent,\r\n ProviderCallback,\r\n ChatResponse,\r\n StreamingChatResponse,\r\n TokenUsage,\r\n CloudModeConfig,\r\n CommonConfig,\r\n PaprFlareConfig,\r\n ChatOptions,\r\n SelfManagedConfig,\r\n} from '../types';\r\nimport { CacheManager } from '../cache';\r\nimport { DatabaseManager } from '../database';\r\nimport { ThreadManager } from '../threads';\r\nimport {\r\n toReadableStream,\r\n pipeToResponse,\r\n mergeStreams,\r\n collectStream,\r\n generateId,\r\n retry,\r\n formatMessages,\r\n PaprFlareError,\r\n collectText,\r\n processStream,\r\n streamToConsole,\r\n toHTTPResponse,\r\n toUIStream,\r\n} from '../utils';\r\n\r\n/**\r\n * Main PaprFlare client with automatic type inference\r\n */\r\nexport class PaprFlare {\r\n private mode: 'cloud' | 'self-managed';\r\n private cloudConfig?: CloudModeConfig;\r\n private providerCallback?: ProviderCallback;\r\n private cacheManager?: CacheManager;\r\n private databaseManager?: DatabaseManager;\r\n private threadManager?: ThreadManager;\r\n private queue: PQueue;\r\n private mutex: Mutex;\r\n private defaultRetryConfig: Required<NonNullable<CommonConfig['retry']>>;\r\n\r\n constructor(config: PaprFlareConfig) {\r\n this.mode = config.mode;\r\n this.mutex = new Mutex();\r\n\r\n // Initialize rate limiting\r\n const rateLimitConfig = config.rateLimit || {};\r\n this.queue = new PQueue({\r\n concurrency: rateLimitConfig.maxConcurrent || 100,\r\n interval: rateLimitConfig.interval || 1000,\r\n intervalCap: rateLimitConfig.intervalCap || 100,\r\n timeout: 30000,\r\n });\r\n\r\n // Default retry configuration\r\n this.defaultRetryConfig = {\r\n maxAttempts: config.retry?.maxAttempts || 3,\r\n initialDelay: config.retry?.initialDelay || 1000,\r\n maxDelay: config.retry?.maxDelay || 10000,\r\n backoffMultiplier: config.retry?.backoffMultiplier || 2,\r\n };\r\n\r\n if (config.mode === 'cloud') {\r\n this.cloudConfig = config;\r\n } else {\r\n this.providerCallback = config.provider;\r\n\r\n // Initialize cache if configured\r\n if (config.cache) {\r\n this.cacheManager = new CacheManager(config.cache);\r\n }\r\n\r\n // Initialize database if configured\r\n if (config.database) {\r\n this.databaseManager = new DatabaseManager(config.database);\r\n }\r\n\r\n // Initialize thread manager if configured\r\n if (config.threads?.enabled) {\r\n if (!this.providerCallback) {\r\n throw new PaprFlareError(\r\n 'Provider callback required for thread management',\r\n 'INVALID_CONFIG'\r\n );\r\n }\r\n // ThreadManager will be created lazily when needed\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Simplified chat API with automatic type inference\r\n * \r\n * @example\r\n * // Streaming (auto-typed as StreamingChatResponse)\r\n * const response = await client.chat({\r\n * messages: [{ role: 'user', content: 'Hello' }],\r\n * stream: true,\r\n * });\r\n * await response.toConsole(); // ✅ No type casting needed!\r\n * \r\n * @example\r\n * // Non-streaming (auto-typed as ChatResponse)\r\n * const response = await client.chat({\r\n * messages: [{ role: 'user', content: 'Hello' }],\r\n * });\r\n * console.log(response.message.content); // ✅ Direct access!\r\n */\r\n async chat<S extends boolean = false>(\r\n options: ChatOptions<S> & { messages: Message[] }\r\n ): Promise<S extends true ? StreamingChatResponse : ChatResponse>;\r\n\r\n async chat(\r\n options: ChatOptions & { messages: Message[] }\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n const { messages, ...config } = options;\r\n\r\n // Validate and format messages\r\n const formattedMessages = formatMessages(messages);\r\n\r\n // Validate configuration\r\n this.validateConfig(config);\r\n\r\n // Check cache if enabled\r\n if (this.cacheManager && config.cache?.enabled !== false) {\r\n const cached = await this.cacheManager.getCachedResponse(\r\n formattedMessages,\r\n config as any\r\n );\r\n\r\n if (cached) {\r\n if (config.stream) {\r\n return this.createStreamingResponse(\r\n this.eventsToGenerator(cached)\r\n );\r\n } else {\r\n return this.eventsToResponse(cached);\r\n }\r\n }\r\n }\r\n\r\n // Add to queue for rate limiting\r\n return this.queue.add(async () => {\r\n return this.executeChat(formattedMessages, config);\r\n }) as Promise<ChatResponse | StreamingChatResponse>;\r\n }\r\n\r\n /**\r\n * Execute chat with retry logic\r\n */\r\n private async executeChat(\r\n messages: Message[],\r\n config: ChatOptions\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n const retryConfig = { ...this.defaultRetryConfig, ...config.cache };\r\n\r\n return retry(\r\n async () => {\r\n if (this.mode === 'cloud') {\r\n return this.executeCloudChat(messages, config);\r\n } else {\r\n return this.executeSelfManagedChat(messages, config);\r\n }\r\n },\r\n {\r\n ...retryConfig,\r\n onRetry: (attempt, error) => {\r\n console.warn(\r\n `[PaprFlare] Retry attempt ${attempt}/${retryConfig.maxAttempts}:`,\r\n error.message\r\n );\r\n },\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Execute chat in cloud mode\r\n */\r\n private async executeCloudChat(\r\n messages: Message[],\r\n config: ChatOptions\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n const response = await fetch(\r\n `${this.cloudConfig!.baseURL || 'https://api.paprflare.in'}/v1/chat`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${this.cloudConfig!.apiKey}`,\r\n },\r\n body: JSON.stringify({\r\n messages,\r\n ...config,\r\n }),\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n throw new PaprFlareError(\r\n `Cloud API error: ${response.statusText}`,\r\n 'CLOUD_API_ERROR',\r\n response.status\r\n );\r\n }\r\n\r\n if (config.stream) {\r\n const stream = this.parseCloudStream(response.body!);\r\n return this.createStreamingResponse(stream);\r\n } else {\r\n const data = await response.json();\r\n return data as ChatResponse;\r\n }\r\n }\r\n\r\n /**\r\n * Execute chat in self-managed mode\r\n */\r\n private async executeSelfManagedChat(\r\n messages: Message[],\r\n config: ChatOptions\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n if (!this.providerCallback) {\r\n throw new PaprFlareError(\r\n 'Provider callback not configured',\r\n 'INVALID_CONFIG'\r\n );\r\n }\r\n\r\n // Handle structured output\r\n if (config.output?.schema) {\r\n return this.executeStructuredOutput(messages, config);\r\n }\r\n\r\n // Execute provider callback\r\n const stream = this.providerCallback(messages, config as any);\r\n\r\n if (config.stream) {\r\n let finalStream: AsyncGenerator<StreamEvent>;\r\n\r\n if (this.cacheManager && config.cache?.enabled !== false) {\r\n const events: StreamEvent[] = [];\r\n const cachedStream = this.cacheStream(stream, events);\r\n finalStream = this.withFinally(cachedStream, () =>\r\n this.cacheManager!.cacheResponse(messages, config as any, events)\r\n );\r\n } else {\r\n finalStream = stream;\r\n }\r\n\r\n return this.createStreamingResponse(finalStream);\r\n } else {\r\n const events = await collectStream(stream);\r\n\r\n if (this.cacheManager && config.cache?.enabled !== false) {\r\n await this.cacheManager.cacheResponse(messages, config as any, events);\r\n }\r\n\r\n return this.eventsToResponse(events);\r\n }\r\n }\r\n\r\n /**\r\n * Execute structured output generation\r\n */\r\n private async executeStructuredOutput(\r\n messages: Message[],\r\n config: ChatOptions\r\n ): Promise<ChatResponse> {\r\n const rawShape = (config.output!.schema as any)._def?.shape;\r\n const schema = typeof rawShape === 'function' ? rawShape() : rawShape;\r\n\r\n const schemaDescription = schema\r\n ? Object.entries(schema)\r\n .map(([key, val]: [string, any]) => {\r\n const typeName: string =\r\n val?._def?.typeName ?? val?.constructor?.name ?? 'unknown';\r\n return ` - \"${key}\": ${typeName}`;\r\n })\r\n .join('\\n')\r\n : '(schema shape unavailable)';\r\n\r\n const systemMessage: Message = {\r\n id: generateId('msg'),\r\n role: 'system',\r\n content: `You are a JSON generator. You MUST respond with ONLY valid JSON that matches this exact schema:\r\n${schemaDescription}\r\n\r\nRules:\r\n1. Include ALL fields listed above - do not omit any\r\n2. NO explanatory text before or after the JSON\r\n3. NO markdown code blocks or formatting\r\n4. NO comments in the JSON\r\n5. Return ONLY the raw JSON object\r\n6. The JSON must be parseable and valid`,\r\n timestamp: Date.now(),\r\n };\r\n // Enhance user message with explicit JSON instruction\r\n const lastUserMessage = messages[messages.length - 1];\r\n const enhancedMessages = [\r\n systemMessage,\r\n ...messages.slice(0, -1),\r\n {\r\n ...lastUserMessage,\r\n // AFTER:\r\n content: `${lastUserMessage?.content}\r\n\r\nCRITICAL: Your response must be ONLY valid JSON containing ALL of these fields: ${schema ? Object.keys(schema).join(', ') : 'all required fields'\r\n }. Start directly with { and end with }. No other text.`,\r\n },\r\n ] as Message[];\r\n\r\n const stream = this.providerCallback!(enhancedMessages, {\r\n ...config,\r\n stream: false,\r\n temperature: 0.1, // Very low temperature for structured output\r\n } as any);\r\n\r\n const events = await collectStream(stream);\r\n let textContent = events\r\n .filter((e) => e.type === 'text-delta')\r\n .map((e) => (e.type === 'text-delta' ? e.delta : ''))\r\n .join('');\r\n\r\n // Try multiple extraction strategies\r\n let jsonText = this.extractJSON(textContent);\r\n\r\n // Parse and validate against schema\r\n try {\r\n const parsed = JSON.parse(jsonText);\r\n\r\n // Guard: if schema.parse is not available (minification issue), skip validation\r\n const validated = (typeof schema?.parse === 'function')\r\n ? schema.parse(parsed)\r\n : parsed;\r\n\r\n const doneEvent = events.find((e) => e.type === 'done');\r\n const message: Message =\r\n doneEvent && doneEvent.type === 'done'\r\n ? {\r\n ...doneEvent.finalMessage,\r\n content: JSON.stringify(validated, null, 2),\r\n }\r\n : {\r\n id: generateId('msg'),\r\n role: 'assistant',\r\n content: JSON.stringify(validated, null, 2),\r\n timestamp: Date.now(),\r\n };\r\n\r\n return {\r\n message,\r\n usage: events.find((e) => e.type === 'usage' && 'usage' in e)?.[\r\n 'usage'\r\n ] as TokenUsage,\r\n };\r\n } catch (error: any) {\r\n // Provide detailed error with raw response\r\n console.error('\\n[Structured Output Error]');\r\n console.error('Raw response:', textContent);\r\n console.error('Extracted JSON attempt:', jsonText.substring(0, 500));\r\n console.error('Parse error:', error.message);\r\n\r\n throw new PaprFlareError(\r\n `Failed to parse structured output. The model returned: \"${textContent.substring(0, 100)}...\" \r\n\r\nPlease ensure:\r\n1. The model supports JSON output\r\n2. Try using a model like GPT-4 or Claude\r\n3. For list output, wrap in object: { items: [...] }\r\n\r\nParse error: ${error.message}`,\r\n 'VALIDATION_ERROR',\r\n 400,\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Extract JSON from text with multiple strategies\r\n */\r\n private extractJSON(text: string): string {\r\n // Strategy 1: Remove markdown code blocks\r\n let cleaned = text.replace(/```json\\s*/gi, '').replace(/```\\s*/g, '');\r\n\r\n // Strategy 2: Find JSON object or array with better regex\r\n // Look for { ... } or [ ... ] with proper nesting\r\n const objectMatch = cleaned.match(/\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})*\\}/);\r\n const arrayMatch = cleaned.match(/\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\]/);\r\n\r\n // Prefer object over array if both exist\r\n if (objectMatch) {\r\n return objectMatch[0].trim();\r\n }\r\n\r\n if (arrayMatch) {\r\n return arrayMatch[0].trim();\r\n }\r\n\r\n // Strategy 3: Try to find JSON between specific markers\r\n const lines = cleaned.split('\\n');\r\n let jsonLines: string[] = [];\r\n let inJSON = false;\r\n let braceCount = 0;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Check if line starts JSON\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n inJSON = true;\r\n jsonLines = [line];\r\n braceCount = (line.match(/\\{/g) || []).length - (line.match(/\\}/g) || []).length;\r\n braceCount += (line.match(/\\[/g) || []).length - (line.match(/\\]/g) || []).length;\r\n\r\n if (braceCount === 0) {\r\n // Complete JSON on one line\r\n return line.trim();\r\n }\r\n continue;\r\n }\r\n\r\n if (inJSON) {\r\n jsonLines.push(line);\r\n braceCount += (line.match(/\\{/g) || []).length - (line.match(/\\}/g) || []).length;\r\n braceCount += (line.match(/\\[/g) || []).length - (line.match(/\\]/g) || []).length;\r\n\r\n if (braceCount === 0) {\r\n return jsonLines.join('\\n').trim();\r\n }\r\n }\r\n }\r\n\r\n // Strategy 4: Return cleaned text if nothing else worked\r\n return cleaned.trim();\r\n }\r\n\r\n /**\r\n * Create streaming response with all helper methods\r\n */\r\n private createStreamingResponse(\r\n stream: AsyncGenerator<StreamEvent>\r\n ): StreamingChatResponse {\r\n return {\r\n stream,\r\n toReadableStream: () => toReadableStream(stream),\r\n pipeToResponse: async (response: Response) => {\r\n await pipeToResponse(stream, response);\r\n },\r\n mergeStreams: (...streams: AsyncGenerator<StreamEvent>[]) => {\r\n return mergeStreams(stream, ...streams);\r\n },\r\n toUIStream: () => toUIStream(stream),\r\n process: (handlers: any) => processStream(stream, handlers),\r\n toText: () => collectText(stream),\r\n toConsole: () =>\r\n streamToConsole(stream),\r\n toResponse: (target?: any) => toHTTPResponse(stream, target),\r\n };\r\n }\r\n\r\n /**\r\n * Wraps generator with finally callback\r\n */\r\n private async *withFinally(\r\n generator: AsyncGenerator<StreamEvent>,\r\n callback: () => void | Promise<void>\r\n ): AsyncGenerator<StreamEvent> {\r\n try {\r\n yield* generator;\r\n } finally {\r\n await callback();\r\n }\r\n }\r\n\r\n /**\r\n * Parse cloud API stream\r\n */\r\n private async *parseCloudStream(\r\n body: ReadableStream<Uint8Array>\r\n ): AsyncGenerator<StreamEvent> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\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 const text = decoder.decode(value, { stream: true });\r\n const lines = text.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n const data = line.slice(6);\r\n if (data === '[DONE]') break;\r\n\r\n try {\r\n const event = JSON.parse(data) as StreamEvent;\r\n yield event;\r\n } catch (error) {\r\n console.error('Failed to parse event:', error);\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 * Cache stream events\r\n */\r\n private async *cacheStream(\r\n stream: AsyncGenerator<StreamEvent>,\r\n events: StreamEvent[]\r\n ): AsyncGenerator<StreamEvent> {\r\n for await (const event of stream) {\r\n events.push(event);\r\n yield event;\r\n }\r\n }\r\n\r\n /**\r\n * Convert events to generator\r\n */\r\n private async *eventsToGenerator(\r\n events: StreamEvent[]\r\n ): AsyncGenerator<StreamEvent> {\r\n for (const event of events) {\r\n yield event;\r\n }\r\n }\r\n\r\n /**\r\n * Convert events to response\r\n */\r\n private eventsToResponse(events: StreamEvent[]): ChatResponse {\r\n const doneEvent = events.find((e) => e.type === 'done');\r\n const usageEvent = events.find((e) => e.type === 'usage');\r\n\r\n if (!doneEvent || doneEvent.type !== 'done') {\r\n throw new PaprFlareError(\r\n 'No completion event found in response',\r\n 'INVALID_RESPONSE'\r\n );\r\n }\r\n\r\n return {\r\n message: doneEvent.finalMessage,\r\n usage:\r\n usageEvent && usageEvent.type === 'usage'\r\n ? usageEvent.usage\r\n : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Validate configuration\r\n */\r\n private validateConfig(config: ChatOptions): void {\r\n if (config.temperature !== undefined) {\r\n if (config.temperature < 0 || config.temperature > 2) {\r\n throw new PaprFlareError(\r\n 'Temperature must be between 0 and 2',\r\n 'VALIDATION_ERROR',\r\n 400\r\n );\r\n }\r\n }\r\n\r\n if (config.maxTokens !== undefined && config.maxTokens < 1) {\r\n throw new PaprFlareError(\r\n 'Max tokens must be greater than 0',\r\n 'VALIDATION_ERROR',\r\n 400\r\n );\r\n }\r\n\r\n if (config.output?.schema && config.stream) {\r\n throw new PaprFlareError(\r\n 'Structured output requires stream: false',\r\n 'VALIDATION_ERROR',\r\n 400\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get database manager (self-managed mode only)\r\n */\r\n get database(): DatabaseManager | undefined {\r\n if (this.mode === 'cloud') {\r\n throw new PaprFlareError(\r\n 'Database is not available in cloud mode',\r\n 'INVALID_MODE'\r\n );\r\n }\r\n return this.databaseManager;\r\n }\r\n\r\n /**\r\n * Get thread manager (self-managed mode only)\r\n */\r\n get threads(): ThreadManager {\r\n if (this.mode === 'cloud') {\r\n throw new PaprFlareError(\r\n 'Threads are not available in cloud mode',\r\n 'INVALID_MODE'\r\n );\r\n }\r\n\r\n if (!this.threadManager) {\r\n if (!this.providerCallback) {\r\n throw new PaprFlareError(\r\n 'Provider callback required for thread management',\r\n 'INVALID_CONFIG'\r\n );\r\n }\r\n // Create client instance for thread manager\r\n const threadClient = new PaprFlare({\r\n mode: 'self-managed',\r\n provider: this.providerCallback,\r\n } as SelfManagedConfig);\r\n this.threadManager = new ThreadManager(threadClient as any);\r\n }\r\n\r\n return this.threadManager;\r\n }\r\n\r\n /**\r\n * Get queue statistics\r\n */\r\n getQueueStats() {\r\n return {\r\n size: this.queue.size,\r\n pending: this.queue.pending,\r\n concurrency: this.queue.concurrency,\r\n };\r\n }\r\n\r\n /**\r\n * Clear cache\r\n */\r\n async clearCache(): Promise<void> {\r\n if (this.cacheManager) {\r\n await this.cacheManager.clearAll();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create structured output helper\r\n */\r\nexport function structuredOutput<T extends z.ZodSchema>(schema: T) {\r\n return {\r\n schema,\r\n mode: 'json' as const,\r\n };\r\n}","import Anthropic from '@anthropic-ai/sdk';\r\nimport type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface AnthropicConfig extends ProviderConfig {\r\n model?: string;\r\n anthropicVersion?: string;\r\n}\r\n\r\n/**\r\n * Anthropic (Claude) provider for PaprFlare using official SDK\r\n */\r\nexport class AnthropicProvider {\r\n private client: Anthropic;\r\n private defaultModel: string;\r\n\r\n constructor(config: AnthropicConfig) {\r\n this.client = new Anthropic({\r\n apiKey: config.apiKey,\r\n baseURL: config.baseURL,\r\n timeout: config.timeout || 30000,\r\n maxRetries: config.maxRetries || 3,\r\n defaultHeaders: config.headers,\r\n });\r\n this.defaultModel = config.model || 'claude-3-5-sonnet-20241022';\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n const systemMessage = messages.find((m) => m.role === 'system');\r\n const conversationMessages = messages.filter((m) => m.role !== 'system');\r\n\r\n const stream = this.client.messages.stream({\r\n model: config.model || this.defaultModel,\r\n messages: this.formatMessages(conversationMessages) as any,\r\n max_tokens: config.maxTokens || 4096,\r\n temperature: config.temperature,\r\n top_p: config.topP,\r\n stop_sequences: config.stop,\r\n ...(systemMessage && { system: systemMessage.content }),\r\n ...(config.tools && {\r\n tools: this.formatTools(config.tools) as any,\r\n }),\r\n });\r\n\r\n let currentToolUse: any = null;\r\n let toolInputBuffer = '';\r\n\r\n // Iterate raw SSE events directly — no .on() handlers\r\n for await (const event of stream) {\r\n if (event.type === 'content_block_start') {\r\n if (event.content_block?.type === 'tool_use') {\r\n currentToolUse = event.content_block;\r\n toolInputBuffer = '';\r\n writer.startToolCall(currentToolUse.name, currentToolUse.id);\r\n }\r\n }\r\n\r\n if (event.type === 'content_block_delta') {\r\n if (event.delta?.type === 'text_delta') {\r\n writer.writeText(event.delta.text);\r\n }\r\n if (event.delta?.type === 'input_json_delta') {\r\n toolInputBuffer += event.delta.partial_json;\r\n writer.writeToolCallDelta(event.delta.partial_json);\r\n }\r\n }\r\n\r\n if (event.type === 'content_block_stop') {\r\n if (currentToolUse) {\r\n try {\r\n const args = JSON.parse(\r\n currentToolUse.input\r\n ? JSON.stringify(currentToolUse.input)\r\n : toolInputBuffer || '{}'\r\n );\r\n writer.endToolCall(args);\r\n } catch {\r\n writer.endToolCall({});\r\n }\r\n currentToolUse = null;\r\n toolInputBuffer = '';\r\n }\r\n }\r\n\r\n yield* writer.flush(); // drain whatever was just written\r\n }\r\n\r\n // Usage from final message\r\n const finalMessage = await stream.finalMessage();\r\n if (finalMessage.usage) {\r\n writer.writeUsage({\r\n promptTokens: finalMessage.usage.input_tokens,\r\n completionTokens: finalMessage.usage.output_tokens,\r\n totalTokens:\r\n finalMessage.usage.input_tokens + finalMessage.usage.output_tokens,\r\n });\r\n }\r\n\r\n writer.done();\r\n yield* writer.flush();\r\n } catch (error: any) {\r\n if (error instanceof Anthropic.APIError) {\r\n throw new ProviderError(error.message, 'anthropic', error.status);\r\n }\r\n throw new ProviderError(`Anthropic provider error: ${error.message}`, 'anthropic');\r\n }\r\n }\r\n /**\r\n * Format messages for Anthropic API\r\n */\r\n private formatMessages(messages: Message[]) {\r\n return messages.map((msg) => {\r\n const content: any[] = [];\r\n\r\n // Add text content\r\n if (msg.content) {\r\n content.push({\r\n type: 'text',\r\n text: msg.content,\r\n });\r\n }\r\n\r\n // Add tool use\r\n if (msg.toolCalls) {\r\n for (const toolCall of msg.toolCalls) {\r\n content.push({\r\n type: 'tool_use',\r\n id: toolCall.id,\r\n name: toolCall.name,\r\n input: toolCall.arguments,\r\n });\r\n }\r\n }\r\n\r\n // Add tool results\r\n if (msg.toolResults) {\r\n for (const result of msg.toolResults) {\r\n content.push({\r\n type: 'tool_result',\r\n tool_use_id: result.toolCallId,\r\n content: JSON.stringify(result.result),\r\n ...(result.error && { is_error: true }),\r\n });\r\n }\r\n }\r\n\r\n return {\r\n role: msg.role === 'assistant' ? 'assistant' : 'user',\r\n content: content.length === 1 && content[0].type === 'text'\r\n ? content[0].text\r\n : content,\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Format tools for Anthropic API\r\n */\r\n private formatTools(tools: ChatConfig['tools']) {\r\n if (!tools) return [];\r\n\r\n return tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description,\r\n input_schema: {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n },\r\n }));\r\n }\r\n}\r\n\r\n/**\r\n * Create Anthropic provider instance\r\n */\r\nexport function createAnthropicProvider(config: AnthropicConfig): ProviderCallback {\r\n const provider = new AnthropicProvider(config);\r\n return provider.createCallback();\r\n}","import { GoogleGenerativeAI } from '@google/generative-ai';\r\nimport type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface GoogleConfig extends ProviderConfig {\r\n model?: string;\r\n}\r\n\r\n/**\r\n * Google (Gemini) provider for PaprFlare using official SDK\r\n */\r\nexport class GoogleProvider {\r\n private client: GoogleGenerativeAI;\r\n private defaultModel: string;\r\n\r\n constructor(config: GoogleConfig) {\r\n this.client = new GoogleGenerativeAI(config.apiKey);\r\n this.defaultModel = config.model || 'gemini-1.5-flash'; // gemini-pro is deprecated\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n /**\r\n * Stream chat completion using official SDK\r\n */\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n // Extract system prompt if present\r\n const systemMessage = messages.find((m) => m.role === 'system');\r\n\r\n const model = this.client.getGenerativeModel({\r\n model: config.model || this.defaultModel,\r\n // Pass system instruction separately — Google requires this\r\n ...(systemMessage && {\r\n systemInstruction: systemMessage.content,\r\n }),\r\n generationConfig: {\r\n temperature: config.temperature,\r\n maxOutputTokens: config.maxTokens,\r\n topP: config.topP,\r\n stopSequences: config.stop,\r\n },\r\n });\r\n\r\n const formattedMessages = this.formatMessages(messages);\r\n\r\n if (formattedMessages.length === 0) {\r\n throw new ProviderError('No messages to send', 'google');\r\n }\r\n\r\n const lastMessage = formattedMessages[formattedMessages.length - 1]!;\r\n const history = formattedMessages.slice(0, -1);\r\n\r\n // Always use startChat for consistency — works for single messages too\r\n const chat = model.startChat({\r\n history,\r\n });\r\n\r\n // sendMessageStream accepts string or Part[]\r\n const result = await chat.sendMessageStream(lastMessage.parts);\r\n\r\n // Stream responses\r\n for await (const chunk of result.stream) {\r\n const chunkText = chunk.text();\r\n if (chunkText) {\r\n writer.writeText(chunkText);\r\n // Yield immediately per chunk so consumers see tokens as they arrive\r\n yield* writer.flush();\r\n }\r\n\r\n // Handle function calls if present\r\n const functionCalls = chunk.functionCalls();\r\n if (functionCalls) {\r\n for (const call of functionCalls) {\r\n writer.startToolCall(call.name, call.name);\r\n writer.endToolCall(call.args as Record<string, unknown>);\r\n yield* writer.flush();\r\n }\r\n }\r\n }\r\n\r\n // result.response resolves after stream is fully consumed\r\n const response = await result.response;\r\n if (response.usageMetadata) {\r\n writer.writeUsage({\r\n promptTokens: response.usageMetadata.promptTokenCount ?? 0,\r\n // Use totalTokenCount - promptTokenCount as fallback if candidatesTokenCount missing\r\n completionTokens:\r\n response.usageMetadata.candidatesTokenCount ??\r\n (response.usageMetadata.totalTokenCount ?? 0) -\r\n (response.usageMetadata.promptTokenCount ?? 0),\r\n totalTokens: response.usageMetadata.totalTokenCount ?? 0,\r\n });\r\n }\r\n\r\n writer.done();\r\n yield* writer.flush();\r\n } catch (error: any) {\r\n throw new ProviderError(\r\n `Google provider error: ${error.message}`,\r\n 'google'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Format messages for Google AI API\r\n * Filters system messages (handled via systemInstruction above)\r\n */\r\n private formatMessages(messages: Message[]) {\r\n return messages\r\n .filter((m) => m.role !== 'system')\r\n .map((msg) => ({\r\n role: msg.role === 'assistant' ? 'model' : 'user',\r\n parts: [{ text: msg.content }],\r\n }));\r\n }\r\n\r\n /**\r\n * Format tools for Google AI API\r\n */\r\n private formatTools(tools: ChatConfig['tools']) {\r\n if (!tools) return [];\r\n\r\n return tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n },\r\n }));\r\n }\r\n}\r\n\r\n/**\r\n * Create Google provider instance\r\n */\r\nexport function createGoogleProvider(config: GoogleConfig): ProviderCallback {\r\n const provider = new GoogleProvider(config);\r\n return provider.createCallback();\r\n}","import OpenAI from 'openai';\r\nimport type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface OpenAIConfig extends ProviderConfig {\r\n model?: string;\r\n}\r\n\r\n/**\r\n * OpenAI provider for PaprFlare using official OpenAI SDK\r\n */\r\nexport class OpenAIProvider {\r\n private client: OpenAI;\r\n private defaultModel: string;\r\n\r\n constructor(config: OpenAIConfig) {\r\n this.client = new OpenAI({\r\n apiKey: config.apiKey,\r\n baseURL: config.baseURL,\r\n organization: config.organization,\r\n timeout: config.timeout || 30000,\r\n maxRetries: config.maxRetries || 3,\r\n defaultHeaders: config.headers,\r\n });\r\n this.defaultModel = config.model || 'gpt-4-turbo-preview';\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n /**\r\n * Collect all chunks from a stream and return the final chat completion.\r\n * Replaces the missing finalChatCompletion() from beta API.\r\n */\r\n private async getFinalChatCompletion(\r\n chunks: OpenAI.Chat.Completions.ChatCompletionChunk[]\r\n ): Promise<{ usage: OpenAI.Chat.Completions.ChatCompletionChunk['usage'] } | null> {\r\n // The last chunk with usage is emitted when stream_options.include_usage is true\r\n const lastChunkWithUsage = [...chunks].reverse().find((c) => c.usage != null);\r\n if (!lastChunkWithUsage?.usage) return null;\r\n return { usage: lastChunkWithUsage.usage };\r\n }\r\n\r\n /**\r\n * Stream chat completion using official SDK\r\n */\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n const stream = await this.client.chat.completions.create({\r\n model: config.model || this.defaultModel,\r\n messages: this.formatMessages(messages) as any,\r\n temperature: config.temperature,\r\n max_tokens: config.maxTokens,\r\n top_p: config.topP,\r\n frequency_penalty: config.frequencyPenalty,\r\n presence_penalty: config.presencePenalty,\r\n stop: config.stop,\r\n stream: true,\r\n stream_options: { include_usage: true }, // instructs API to include usage in last chunk\r\n ...(config.tools && {\r\n tools: this.formatTools(config.tools) as any,\r\n tool_choice: config.toolChoice as any,\r\n }),\r\n });\r\n\r\n let currentToolCallIndex: number | null = null;\r\n let toolCallBuffer = '';\r\n let currentToolCall: any = null;\r\n const allChunks: OpenAI.Chat.Completions.ChatCompletionChunk[] = [];\r\n\r\n for await (const chunk of stream) {\r\n allChunks.push(chunk);\r\n\r\n const delta = chunk.choices[0]?.delta;\r\n\r\n if (!delta) continue;\r\n\r\n if (delta.content) {\r\n writer.writeText(delta.content);\r\n }\r\n\r\n if (delta.tool_calls) {\r\n for (const toolCall of delta.tool_calls) {\r\n const index = toolCall.index;\r\n\r\n if (toolCall.id) {\r\n if (currentToolCall && toolCallBuffer) {\r\n try {\r\n const args = JSON.parse(toolCallBuffer);\r\n writer.endToolCall(args);\r\n } catch {\r\n // Skip invalid JSON\r\n }\r\n toolCallBuffer = '';\r\n }\r\n\r\n currentToolCallIndex = index;\r\n currentToolCall = toolCall;\r\n writer.startToolCall(toolCall.function?.name || '', toolCall.id);\r\n }\r\n\r\n if (toolCall.function?.arguments) {\r\n toolCallBuffer += toolCall.function.arguments;\r\n writer.writeToolCallDelta(toolCall.function.arguments);\r\n }\r\n }\r\n }\r\n\r\n if (chunk.choices[0]?.finish_reason) {\r\n if (currentToolCall && toolCallBuffer) {\r\n try {\r\n const args = JSON.parse(toolCallBuffer);\r\n writer.endToolCall(args);\r\n } catch {\r\n // Skip invalid JSON\r\n }\r\n }\r\n }\r\n\r\n yield* writer.flush(); // ← was writer.toGenerator()\r\n }\r\n\r\n const completion = await this.getFinalChatCompletion(allChunks);\r\n if (completion?.usage) {\r\n writer.writeUsage({\r\n promptTokens: completion.usage.prompt_tokens,\r\n completionTokens: completion.usage.completion_tokens,\r\n totalTokens: completion.usage.total_tokens,\r\n });\r\n }\r\n\r\n writer.done();\r\n yield* writer.flush(); // ← was writer.toGenerator()\r\n } catch (error: any) {\r\n if (error instanceof OpenAI.APIError) {\r\n throw new ProviderError(\r\n error.message,\r\n 'openai',\r\n error.status\r\n );\r\n }\r\n throw new ProviderError(\r\n `OpenAI provider error: ${error.message}`,\r\n 'openai'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Format messages for OpenAI API\r\n */\r\n private formatMessages(messages: Message[]) {\r\n return messages.map((msg) => ({\r\n role: msg.role,\r\n content: msg.content,\r\n ...(msg.toolCalls && {\r\n tool_calls: msg.toolCalls.map((tc) => ({\r\n id: tc.id,\r\n type: 'function' as const,\r\n function: {\r\n name: tc.name,\r\n arguments: JSON.stringify(tc.arguments),\r\n },\r\n })),\r\n }),\r\n ...(msg.toolResults && msg.role === 'tool' && {\r\n tool_call_id: msg.toolResults[0]?.toolCallId,\r\n }),\r\n }));\r\n }\r\n\r\n /**\r\n * Format tools for OpenAI API\r\n */\r\n private formatTools(tools: ChatConfig['tools']) {\r\n if (!tools) return [];\r\n\r\n return tools.map((tool) => ({\r\n type: 'function' as const,\r\n function: {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n },\r\n },\r\n }));\r\n }\r\n}\r\n\r\n/**\r\n * Create OpenAI provider instance\r\n */\r\nexport function createOpenAIProvider(config: OpenAIConfig): ProviderCallback {\r\n const provider = new OpenAIProvider(config);\r\n return provider.createCallback();\r\n}","import type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface SarvamConfig extends ProviderConfig {\r\n model?: string;\r\n}\r\n\r\n/**\r\n * Sarvam AI provider - Indian multilingual LLM\r\n * Supports 10+ Indian languages\r\n */\r\nexport class SarvamProvider {\r\n private config: SarvamConfig;\r\n private baseURL: string;\r\n\r\n constructor(config: SarvamConfig) {\r\n this.config = config;\r\n this.baseURL = config.baseURL || 'https://api.sarvam.ai/v1';\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n /**\r\n * Stream chat completion with Indian language support\r\n */\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n const response = await fetch(`${this.baseURL}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${this.config.apiKey}`,\r\n ...this.config.headers,\r\n },\r\n body: JSON.stringify({\r\n model: config.model || this.config.model || 'sarvam-m',\r\n messages: this.formatMessages(messages),\r\n temperature: config.temperature,\r\n max_tokens: config.maxTokens,\r\n stream: true,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({})) as any;\r\n throw new ProviderError(\r\n error.error?.message || 'Sarvam AI API error',\r\n 'sarvam',\r\n response.status\r\n );\r\n }\r\n\r\n yield* this.parseStream(response.body!, writer);\r\n } catch (error) {\r\n if (error instanceof ProviderError) {\r\n throw error;\r\n }\r\n throw new ProviderError(\r\n `Sarvam provider error: ${error}`,\r\n 'sarvam'\r\n );\r\n }\r\n }\r\n\r\n private async *parseStream(\r\n body: ReadableStream<Uint8Array>,\r\n writer: StreamWriter\r\n ): AsyncGenerator<StreamEvent> {\r\n const reader = 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.trim() || !line.startsWith('data: ')) continue;\r\n\r\n const data = line.slice(6);\r\n if (data === '[DONE]') {\r\n writer.done();\r\n yield* writer.flush(); // ← was writer.toGenerator()\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(data);\r\n\r\n if (parsed.choices?.[0]) {\r\n const delta = parsed.choices[0].delta;\r\n\r\n if (delta?.content) {\r\n writer.writeText(delta.content);\r\n }\r\n\r\n if (parsed.choices[0].finish_reason) {\r\n writer.done();\r\n yield* writer.flush(); // ← was writer.toGenerator()\r\n return;\r\n }\r\n }\r\n\r\n if (parsed.usage) {\r\n writer.writeUsage({\r\n promptTokens: parsed.usage.prompt_tokens || 0,\r\n completionTokens: parsed.usage.completion_tokens || 0,\r\n totalTokens: parsed.usage.total_tokens || 0,\r\n });\r\n }\r\n\r\n yield* writer.flush(); // ← was writer.toGenerator()\r\n } catch (error) {\r\n console.error('Failed to parse Sarvam chunk:', error);\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n /**\r\n * Format messages for Sarvam AI API\r\n */\r\n private formatMessages(messages: Message[]): any[] {\r\n return messages.map((msg) => ({\r\n role: msg.role,\r\n content: msg.content,\r\n }));\r\n }\r\n}\r\n\r\n/**\r\n * Create Sarvam provider instance\r\n */\r\nexport function createSarvamProvider(config: SarvamConfig): ProviderCallback {\r\n const provider = new SarvamProvider(config);\r\n return provider.createCallback();\r\n}"]}
1
+ {"version":3,"sources":["../src/utils/utils.ts","../src/utils/stream-writer.ts","../src/utils/stream-utils.ts","../src/utils/errors.ts","../src/utils/ui-stream.ts","../src/cache/cache-manager.ts","../src/database/drizzle-adapter/adapter.ts","../src/database/manager.ts","../src/database/memory/adapter.ts","../src/database/prisma-adapter/adapter.ts","../src/threads/threads-manager.ts","../src/threads/threads-pool.ts","../src/client/client.ts","../src/provider/anthropic/client.ts","../src/provider/google/client.ts","../src/provider/openai/client.ts","../src/provider/sarvam/client.ts"],"names":["generateId","prefix","id","nanoid","createCacheKey","data","stringify","formatMessages","messages","msg","retry","fn","options","lastError","delay","attempt","error","sleep","ms","resolve","chunk","array","size","chunks","i","debounce","timeoutId","args","throttle","limit","inThrottle","safeJsonParse","json","isPlainObject","value","deepMerge","target","sources","source","key","streamToArray","stream","result","item","measureTime","start","duration","StreamWriter","EventEmitter","text","now","deltaTime","chunkData","name","toolData","tool","delta","input","toolId","content","success","tokens","message","buffered","event","finalMessage","status","createStreamWriter","parseSSEStream","reader","decoder","buffer","parser","createParser","_interval","done","parsed","toReadableStream","generator","encoder","controller","pipeToResponse","response","headers","res","mergeStreams","generators","promises","gen","items","results","transformStream","transformer","transformed","filterStream","predicate","collectStream","events","takeStream","count","taken","batchStream","timeoutMs","batch","flushBatch","toFlush","flushed","remaining","PaprFlareError","code","statusCode","details","RateLimitError","retryAfter","ValidationError","ProviderError","provider","toUIStream","messageId","fullText","currentMessage","lastArtifact","processStream","handlers","uiStream","collectText","createUIMessageStream","writer","merge","t","executePromise","err","errorMessage","streamToConsole","icon","toHTTPResponse","createStreamableValue","initialValue","isDone","RedisCache","Redis","times","ttl","actualTTL","keys","MemoryCache","LRUCache","CacheManager","config","cacheData","m","cacheKey","cached","DrizzleAdapter","db","schema","sql","userId","metadata","conversation","conversationId","eq","offset","desc","updates","convIds","row","query","and","like","asc","role","existing","newId","DatabaseManager","adapter","systemPrompt","MemoryAdapter","conv","b","c","lower","found","index","convId","PrismaAdapter","prisma","conversations","ThreadManager","client","threadId","thread","upToMessageId","idx","newThread","targetThreadId","sourceThreadId","merged","a","filter","statuses","tag","q","previousStatus","priority","title","tags","fullMessage","keepLast","threads","totalMessages","sum","totalTokens","timestamps","stats","maxAge","toDelete","sort","field","dir","av","bv","ThreadPool","manager","all","allThreads","s","exports","PaprFlare","_PaprFlare","Mutex","rateLimitConfig","PQueue","formattedMessages","retryConfig","finalStream","cachedStream","rawShape","schemaDescription","val","typeName","systemMessage","lastUserMessage","enhancedMessages","textContent","e","jsonText","validated","doneEvent","cleaned","objectMatch","arrayMatch","lines","jsonLines","inJSON","braceCount","line","trimmed","streams","callback","body","usageEvent","threadClient","structuredOutput","AnthropicProvider","Anthropic","chatConfig","conversationMessages","currentToolUse","toolInputBuffer","toolCall","tools","toolChoice","zodType","def","properties","required","shape","createAnthropicProvider","GoogleProvider","GoogleGenerativeAI","model","lastMessage","history","chunkText","functionCalls","call","parts","toolResult","tc","parameters","zodDef","acc","FunctionCallingMode","createGoogleProvider","OpenAIProvider","OpenAI","lastChunkWithUsage","toolCallsBuffer","allChunks","completion","formatted","createOpenAIProvider","SarvamProvider","requestBody","createSarvamProvider"],"mappings":"0wBAOO,SAASA,CAAAA,CAAWC,CAAAA,CAAyB,CAChD,IAAMC,CAAAA,CAAKC,aAAAA,EAAO,CAClB,OAAOF,CAAAA,CAAS,CAAA,EAAGA,CAAM,CAAA,CAAA,EAAIC,CAAE,CAAA,CAAA,CAAKA,CACxC,CAKO,SAASE,CAAAA,CAAeC,CAAAA,CAAuB,CAClD,OAAOC,mBAAAA,CAAUD,CAAI,CACzB,CAKO,SAASE,CAAAA,CAAeC,CAAAA,CAAgC,CAC3D,OAAOA,CAAAA,CAAS,GAAA,CAAKC,CAAAA,GAAS,CAC1B,GAAGA,CAAAA,CACH,EAAA,CAAIA,CAAAA,CAAI,EAAA,EAAMT,CAAAA,CAAW,KAAK,CAAA,CAC9B,UAAWS,CAAAA,CAAI,SAAA,EAAa,IAAA,CAAK,GAAA,EACrC,CAAA,CAAE,CACN,CAKA,eAAsBC,CAAAA,CAClBC,CAAAA,CACAC,CAAAA,CAOU,CACV,IAAIC,CAAAA,CACAC,CAAAA,CAAQF,CAAAA,CAAQ,YAAA,CAEpB,IAAA,IAASG,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAWH,CAAAA,CAAQ,WAAA,CAAaG,CAAAA,EAAAA,CAClD,GAAI,CACA,OAAO,MAAMJ,CAAAA,EACjB,CAAA,MAASK,CAAAA,CAAO,CAGZ,GAFAH,CAAAA,CAAYG,CAAAA,CAERD,CAAAA,GAAYH,CAAAA,CAAQ,WAAA,CACpB,MAAMC,CAAAA,CAGND,CAAAA,CAAQ,SACRA,CAAAA,CAAQ,OAAA,CAAQG,CAAAA,CAASF,CAAS,CAAA,CAGtC,MAAMI,EAAAA,CAAM,IAAA,CAAK,IAAIH,CAAAA,CAAOF,CAAAA,CAAQ,QAAQ,CAAC,CAAA,CAC7CE,CAAAA,EAASF,CAAAA,CAAQ,kBACrB,CAGJ,MAAMC,CACV,CAKO,SAASI,EAAAA,CAAMC,CAAAA,CAA2B,CAC7C,OAAO,IAAI,OAAA,CAASC,CAAAA,EAAY,UAAA,CAAWA,CAAAA,CAASD,CAAE,CAAC,CAC3D,CAKO,SAASE,EAAAA,CAASC,CAAAA,CAAYC,CAAAA,CAAqB,CACtD,IAAMC,CAAAA,CAAgB,EAAC,CACvB,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIH,CAAAA,CAAM,MAAA,CAAQG,CAAAA,EAAKF,CAAAA,CACnCC,EAAO,IAAA,CAAKF,CAAAA,CAAM,KAAA,CAAMG,CAAAA,CAAGA,CAAAA,CAAIF,CAAI,CAAC,CAAA,CAExC,OAAOC,CACX,CAKO,SAASE,EAAAA,CACZd,CAAAA,CACAG,CAAAA,CACgC,CAChC,IAAIY,EAEJ,OAAO,CAAA,GAAIC,CAAAA,GAAwB,CAC/B,YAAA,CAAaD,CAAS,CAAA,CACtBA,CAAAA,CAAY,WAAW,IAAMf,CAAAA,CAAG,GAAGgB,CAAI,CAAA,CAAGb,CAAK,EACnD,CACJ,CAKO,SAASc,EAAAA,CACZjB,CAAAA,CACAkB,CAAAA,CACgC,CAChC,IAAIC,CAAAA,CAEJ,OAAO,IAAIH,CAAAA,GAAwB,CAC1BG,CAAAA,GACDnB,CAAAA,CAAG,GAAGgB,CAAI,CAAA,CACVG,CAAAA,CAAa,KACb,UAAA,CAAW,IAAOA,CAAAA,CAAa,KAAA,CAAQD,CAAK,CAAA,EAEpD,CACJ,CAKO,SAASE,EAAAA,CAA2BC,CAAAA,CAAwB,CAC/D,GAAI,CACA,OAAO,IAAA,CAAK,MAAMA,CAAI,CAC1B,CAAA,KAAQ,CACJ,OAAO,IACX,CACJ,CAKO,SAASC,CAAAA,CAAcC,CAAAA,CAAkD,CAC5E,OACI,OAAOA,CAAAA,EAAU,QAAA,EACjBA,CAAAA,GAAU,MACVA,CAAAA,CAAM,WAAA,GAAgB,MAE9B,CAKO,SAASC,CAAAA,CACZC,CAAAA,CAAAA,GACGC,CAAAA,CACF,CACD,GAAI,CAACA,CAAAA,CAAQ,MAAA,CAAQ,OAAOD,CAAAA,CAE5B,IAAME,CAAAA,CAASD,EAAQ,KAAA,EAAM,CAE7B,GAAIJ,CAAAA,CAAcG,CAAM,CAAA,EAAKH,CAAAA,CAAcK,CAAM,EAC7C,IAAA,IAAWC,CAAAA,IAAOD,CAAAA,CACVL,CAAAA,CAAcK,CAAAA,CAAOC,CAAG,CAAC,CAAA,EACpBH,EAAOG,CAAG,CAAA,EAAG,MAAA,CAAO,MAAA,CAAOH,CAAAA,CAAQ,CAAE,CAACG,CAAG,EAAG,EAAG,CAAC,CAAA,CACrDJ,CAAAA,CAAUC,CAAAA,CAAOG,CAAG,EAAGD,CAAAA,CAAOC,CAAG,CAAQ,CAAA,EAEzC,MAAA,CAAO,MAAA,CAAOH,CAAAA,CAAQ,CAAE,CAACG,CAAG,EAAGD,CAAAA,CAAOC,CAAG,CAAE,CAAC,CAAA,CAKxD,OAAOJ,EAAUC,CAAAA,CAAQ,GAAGC,CAAO,CACvC,CAKA,eAAsBG,EAAAA,CAClBC,CAAAA,CACY,CACZ,IAAMC,CAAAA,CAAc,EAAC,CACrB,UAAA,IAAiBC,CAAAA,IAAQF,CAAAA,CACrBC,EAAO,IAAA,CAAKC,CAAI,CAAA,CAEpB,OAAOD,CACX,CAKA,eAAsBE,EAAAA,CAClBjC,EACwC,CACxC,IAAMkC,CAAAA,CAAQ,WAAA,CAAY,GAAA,EAAI,CACxBH,CAAAA,CAAS,MAAM/B,GAAG,CAClBmC,CAAAA,CAAW,WAAA,CAAY,GAAA,EAAI,CAAID,CAAAA,CACrC,OAAO,CAAE,MAAA,CAAAH,CAAAA,CAAQ,QAAA,CAAAI,CAAS,CAC9B,CCrLO,IAAMC,CAAAA,CAAN,cAA2BC,eAAiC,CACvD,MAAA,CAAwB,GACxB,MAAA,CAAS,KAAA,CACT,QAAA,CAAW,EAAA,CACX,SAAA,CAAoB,CAAA,CACpB,aAAA,CAAwB,CAAA,CACxB,WAAqB,CAAA,CACrB,MAAA,CAAuB,MAAA,CAGvB,WAAA,CAAwC,IAAI,GAAA,CAC5C,eAAA,CAIG,IAAA,CAEX,aAAc,CACV,KAAA,GACJ,CAKA,KAAA,EAAc,CACN,IAAA,CAAK,SAAA,GAAc,IACnB,IAAA,CAAK,SAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAC1B,IAAA,CAAK,aAAA,CAAgB,IAAA,CAAK,UAC1B,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA,CAC5B,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,CACjB,WAAW,IAAM,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA,CAAG,EAAE,CAAA,EAE3D,CAKA,SAAA,CAAUC,CAAAA,CAAoB,CAC1B,GAAI,IAAA,CAAK,MAAA,CAAQ,OAGb,IAAA,CAAK,YAAc,CAAA,EACnB,IAAA,CAAK,KAAA,EAAM,CAGf,IAAA,CAAK,QAAA,EAAYA,CAAAA,CAGjB,IAAMC,EAAM,IAAA,CAAK,GAAA,EAAI,CACfC,CAAAA,CAAYD,CAAAA,CAAM,IAAA,CAAK,aAAA,CAC7B,IAAA,CAAK,cAAgBA,CAAAA,CAErB,IAAME,CAAAA,CAAuB,CACzB,IAAA,CAAAH,CAAAA,CACA,KAAA,CAAO,IAAA,CAAK,aACZ,SAAA,CAAWC,CAAAA,CACX,SAAA,CAAAC,CACJ,CAAA,CAEA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CACb,IAAA,CAAM,YAAA,CACN,KAAA,CAAOF,CACX,CAAC,CAAA,CAED,IAAA,CAAK,IAAA,CAAK,QAASG,CAAS,CAAA,CAC5B,IAAA,CAAK,IAAA,CAAK,OAAA,CAASH,CAAI,EAC3B,CAKA,MAAMA,CAAAA,CAAoB,CACtB,IAAA,CAAK,SAAA,CAAUA,CAAI,EACvB,CAKA,aAAA,CAAcI,CAAAA,CAAcnD,CAAAA,CAAkB,CAC1C,IAAA,CAAK,eAAA,CAAkB,CACnB,EAAA,CAAAA,CAAAA,CACA,KAAAmD,CAAAA,CACA,eAAA,CAAiB,EACrB,CAAA,CAEA,IAAMC,CAAAA,CAAwB,CAC1B,EAAA,CAAApD,EACA,IAAA,CAAAmD,CAAAA,CACA,KAAA,CAAO,EAAC,CACR,MAAA,CAAQ,UAAA,CACR,SAAA,CAAW,KAAK,GAAA,EACpB,CAAA,CAEA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAInD,CAAAA,CAAIoD,CAAQ,EACjC,IAAA,CAAK,YAAA,CAAa,gBAAgB,CAAA,CAClC,IAAA,CAAK,IAAA,CAAK,SAAA,CAAWA,CAAQ,EAG7B,UAAA,CAAW,IAAM,CACb,IAAMC,CAAAA,CAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAIrD,CAAE,CAAA,CAChCqD,CAAAA,GACAA,CAAAA,CAAK,MAAA,CAAS,SAAA,CACd,IAAA,CAAK,IAAA,CAAK,SAAA,CAAWA,CAAI,CAAA,EAEjC,CAAA,CAAG,GAAG,EACV,CAKA,kBAAA,CAAmBC,CAAAA,CAAqB,CAC/B,IAAA,CAAK,eAAA,GACV,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAmBA,CAAAA,EAC5C,CAKA,WAAA,CAAY7B,EAAqC,CAC7C,GAAI,CAAC,IAAA,CAAK,eAAA,CAAiB,OAE3B,IAAM4B,CAAAA,CAAO,KAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA,CACzD,GAAIA,CAAAA,CAAM,CACNA,CAAAA,CAAK,KAAA,CAAQ5B,CAAAA,CACb4B,CAAAA,CAAK,MAAA,CAAS,WAAA,CACd,IAAA,CAAK,IAAA,CAAK,SAAA,CAAWA,CAAI,CAAA,CAEzB,IAAMT,CAAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAIS,EAAK,SAAA,CACnC,IAAA,CAAK,IAAA,CAAK,YAAA,CAAc,CACpB,MAAA,CAAQ,IAAA,CAAK,eAAA,CAAgB,GAC7B,OAAA,CAAS5B,CAAAA,CACT,OAAA,CAAS,IAAA,CACT,QAAA,CAAAmB,CAAAA,CACA,SAAA,CAAW,IAAA,CAAK,KACpB,CAAC,CAAA,CAED,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,eAAA,CAAgB,EAAE,EACnD,CAEA,IAAA,CAAK,eAAA,CAAkB,IAAA,CAGnB,IAAA,CAAK,WAAA,CAAY,OAAS,CAAA,EAC1B,IAAA,CAAK,YAAA,CAAa,WAAW,EAErC,CAKA,SAAA,CAAU5C,CAAAA,CAAYmD,EAAcI,CAAAA,CAAkB,CAClD,IAAA,CAAK,aAAA,CAAcJ,CAAAA,CAAMnD,CAAE,CAAA,CACvBuD,CAAAA,EACA,KAAK,WAAA,CAAYA,CAAK,EAE9B,CAKA,YAAA,CACIC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAAmB,KACnB5C,CAAAA,CACI,CACJ,IAAMuC,CAAAA,CAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAIG,CAAM,EACxC,GAAI,CAACH,CAAAA,CAAM,OAEX,IAAMT,CAAAA,CAAW,IAAA,CAAK,GAAA,GAAQS,CAAAA,CAAK,SAAA,CAEnCA,CAAAA,CAAK,MAAA,CAASK,CAAAA,CAAU,WAAA,CAAc,QAAA,CACtC,IAAA,CAAK,KAAK,SAAA,CAAWL,CAAI,CAAA,CAEzB,IAAA,CAAK,IAAA,CAAK,YAAA,CAAc,CACpB,MAAA,CAAAG,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAA5C,CAAAA,CACA,QAAA,CAAA8B,EACA,SAAA,CAAW,IAAA,CAAK,GAAA,EACpB,CAAC,CAAA,CAED,IAAA,CAAK,WAAA,CAAY,OAAOY,CAAM,CAAA,CAG1B,IAAA,CAAK,WAAA,CAAY,IAAA,GAAS,CAAA,EAC1B,IAAA,CAAK,YAAA,CAAa,WAAW,EAErC,CAKA,UAAA,CAAWG,CAAAA,CAIF,CACD,IAAA,CAAK,MAAA,GAET,IAAA,CAAK,OAAO,IAAA,CAAK,CACb,IAAA,CAAM,OAAA,CACN,KAAA,CAAO,CACH,YAAA,CAAcA,CAAAA,CAAO,aACrB,gBAAA,CAAkBA,CAAAA,CAAO,gBAAA,CACzB,WAAA,CAAaA,CAAAA,CAAO,WACxB,CACJ,CAAC,EAED,IAAA,CAAK,IAAA,CAAK,OAAA,CAAS,CACf,MAAA,CAAQA,CAAAA,CAAO,YAAA,CACf,UAAA,CAAYA,EAAO,gBAAA,CACnB,KAAA,CAAOA,CAAAA,CAAO,WAClB,CAAC,CAAA,EACL,CAKA,KAAA,CAAMA,CAAAA,CAAqE,CACvE,IAAA,CAAK,UAAA,CAAW,CACZ,YAAA,CAAcA,CAAAA,CAAO,MAAA,CACrB,iBAAkBA,CAAAA,CAAO,UAAA,CACzB,WAAA,CAAaA,CAAAA,CAAO,KACxB,CAAC,EACL,CAKA,MAAMC,CAAAA,CAAuB,CACrB,IAAA,CAAK,MAAA,GAET,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CACb,KAAM,OAAA,CACN,KAAA,CAAOA,CACX,CAAC,CAAA,CAED,IAAA,CAAK,YAAA,CAAa,OAAO,EACzB,IAAA,CAAK,IAAA,CAAK,OAAA,CAASA,CAAO,CAAA,EAC9B,CAMA,MAAO,KAAA,EAAqC,CACxC,IAAMC,CAAAA,CAAW,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,CAChC,IAAA,CAAK,OAAS,EAAC,CACf,IAAA,IAAWC,CAAAA,IAASD,CAAAA,CAChB,MAAMC,EAEd,CAKA,KAAKC,CAAAA,CAA0B,CAC3B,GAAI,IAAA,CAAK,MAAA,CAAQ,OAEjB,IAAA,CAAK,YAAA,CAAa,YAAY,CAAA,CAE9B,IAAMH,CAAAA,CAAUG,CAAAA,EAAgB,CAC5B,EAAA,CAAI,CAAA,IAAA,EAAO,KAAK,GAAA,EAAK,CAAA,CAAA,CACrB,IAAA,CAAM,WAAA,CACN,OAAA,CAAS,IAAA,CAAK,QAAA,CACd,UAAW,IAAA,CAAK,GAAA,EACpB,CAAA,CAEA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CACb,KAAM,MAAA,CACN,YAAA,CAAcH,CAClB,CAAC,CAAA,CAED,IAAA,CAAK,MAAA,CAAS,IAAA,CACd,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,CACxB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAQA,CAAO,EAC7B,CAKQ,YAAA,CAAaI,CAAAA,CAA4B,CAC7C,IAAA,CAAK,MAAA,CAASA,CAAAA,CACd,IAAA,CAAK,KAAK,cAAA,CAAgBA,CAAM,EACpC,CAKA,SAAA,EAA0B,CACtB,OAAO,IAAA,CAAK,MAChB,CAKA,QAAA,EAAoB,CAChB,OAAO,IAAA,CAAK,MAChB,CAKA,OAAA,EAAkB,CACd,OAAO,IAAA,CAAK,QAChB,CAKA,cAAA,EAAgC,CAC5B,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAC/C,CAKA,SAAA,EAA2B,CACvB,OAAO,CAAC,GAAG,IAAA,CAAK,MAAM,CAC1B,CAKA,MAAO,aAA2C,CAC9C,MAAO,IAAA,CAAK,KAAA,GAChB,CAKA,KAAA,EAAc,CACV,KAAK,MAAA,CAAS,EAAC,CACf,IAAA,CAAK,QAAA,CAAW,EAAA,CAChB,IAAA,CAAK,MAAA,CAAS,MACd,IAAA,CAAK,MAAA,CAAS,MAAA,CACd,IAAA,CAAK,SAAA,CAAY,CAAA,CACjB,IAAA,CAAK,aAAA,CAAgB,EACrB,IAAA,CAAK,UAAA,CAAa,CAAA,CAClB,IAAA,CAAK,WAAA,CAAY,KAAA,EAAM,CACvB,IAAA,CAAK,gBAAkB,IAAA,CACvB,IAAA,CAAK,kBAAA,GACT,CACJ,EAKO,SAASC,EAAAA,EAAmC,CAC/C,OAAO,IAAIpB,CACf,CClWA,eAAuBqB,EAAAA,CACnB3B,CAAAA,CAC2B,CAC3B,IAAM4B,CAAAA,CAAS5B,CAAAA,CAAO,SAAA,GAChB6B,CAAAA,CAAU,IAAI,WAAA,CAEhBC,CAAAA,CAAS,EAAA,CAEPC,CAAAA,CAASC,8BAAAA,CAAa,CACxB,QAAUT,CAAAA,EAA8B,CACpCO,CAAAA,CAASP,CAAAA,CAAM,KACnB,CAAA,CACA,OAAA,CAAUU,CAAAA,EAAsB,CAEhC,CACJ,CAAC,CAAA,CAED,GAAI,CACA,OAAa,CACT,GAAM,CAAE,IAAA,CAAAC,CAAAA,CAAM,KAAA,CAAAzC,CAAM,CAAA,CAAI,MAAMmC,CAAAA,CAAO,IAAA,GAErC,GAAIM,CAAAA,CAAM,MAEV,IAAMvD,CAAAA,CAAQkD,CAAAA,CAAQ,MAAA,CAAOpC,CAAAA,CAAO,CAAE,MAAA,CAAQ,CAAA,CAAK,CAAC,CAAA,CAGpD,GAFAsC,CAAAA,CAAO,IAAA,CAAKpD,CAAK,CAAA,CAEbmD,CAAAA,CACA,GAAI,CACA,IAAMK,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAML,CAAM,CAAA,CAG5BK,CAAAA,CAAO,IAAA,GACP,MAAMA,CAAAA,CAAAA,CAGVL,CAAAA,CAAS,GACb,CAAA,KAAgB,CAEZ,QACJ,CAER,CAGAC,CAAAA,CAAO,KAAA,CAAM,CAAE,OAAA,CAAS,CAAA,CAAK,CAAC,EAClC,CAAA,OAAE,CACEH,CAAAA,CAAO,WAAA,GACX,CACJ,CAKO,SAASQ,CAAAA,CACZC,CAAAA,CAC0B,CAC1B,IAAMC,CAAAA,CAAU,IAAI,WAAA,CAEpB,OAAO,IAAI,cAAA,CAAe,CACtB,MAAM,KAAA,CAAMC,CAAAA,CAAY,CACpB,GAAI,CACA,cAAiBhB,CAAAA,IAASc,CAAAA,CAAW,CACjC,IAAMzE,CAAAA,CAAO,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU2D,CAAK,CAAC;;AAAA,CAAA,CAC3CgB,CAAAA,CAAW,OAAA,CAAQD,CAAAA,CAAQ,MAAA,CAAO1E,CAAI,CAAC,EAC3C,CACA2E,CAAAA,CAAW,QACf,CAAA,MAAShE,CAAAA,CAAO,CACZgE,EAAW,KAAA,CAAMhE,CAAK,EAC1B,CACJ,CACJ,CAAC,CACL,CAKA,eAAsBiE,CAAAA,CAClBH,CAAAA,CACAI,CAAAA,CACa,CACb,IAAMzC,CAAAA,CAASoC,CAAAA,CAAiBC,CAAS,CAAA,CAGnCK,EAAU,CACZ,cAAA,CAAgB,mBAAA,CAChB,eAAA,CAAiB,UAAA,CACjB,UAAA,CAAc,YAClB,CAAA,CAGA,GAAID,CAAAA,CAAS,IAAA,EAAQA,CAAAA,CAAS,IAAA,CAAK,IAAK,CACpC,IAAME,CAAAA,CAAMF,CAAAA,CAAS,KAAK,GAAA,CAE1B,MAAA,CAAO,OAAA,CAAQC,CAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC5C,EAAKL,CAAK,CAAA,GAAM,CAC9CkD,CAAAA,CAAI,UAAU7C,CAAAA,CAAKL,CAAK,EAC5B,CAAC,EAED,IAAMmC,CAAAA,CAAS5B,CAAAA,CAAO,SAAA,EAAU,CAC1B6B,CAAAA,CAAU,IAAI,WAAA,CAEpB,GAAI,CACA,OAAa,CACT,GAAM,CAAE,IAAA,CAAAK,CAAAA,CAAM,KAAA,CAAAzC,CAAM,EAAI,MAAMmC,CAAAA,CAAO,IAAA,EAAK,CAC1C,GAAIM,CAAAA,CAAM,MAEV,IAAM1B,EAAOqB,CAAAA,CAAQ,MAAA,CAAOpC,CAAAA,CAAO,CAAE,OAAQ,CAAA,CAAK,CAAC,CAAA,CACnDkD,CAAAA,CAAI,MAAMnC,CAAI,EAClB,CACJ,CAAA,OAAE,CACEmC,CAAAA,CAAI,GAAA,GACR,CACJ,CAAA,KAEK,CAAA,GAAIF,CAAAA,YAAoB,QAAA,EAAY,OAAOA,CAAAA,CAAS,IAAA,CAAS,GAAA,CAC9D,OAGC,CACD,MAAA,CAAO,OAAA,CAAQC,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAC5C,CAAAA,CAAKL,CAAK,IAAM,CAC9CgD,CAAAA,CAAS,SAAA,CAAU3C,CAAAA,CAAKL,CAAK,EACjC,CAAC,CAAA,CAED,IAAMmC,EAAS5B,CAAAA,CAAO,SAAA,EAAU,CAC1B6B,CAAAA,CAAU,IAAI,WAAA,CAEpB,GAAI,CACA,OAAa,CACT,GAAM,CAAE,IAAA,CAAAK,EAAM,KAAA,CAAAzC,CAAM,CAAA,CAAI,MAAMmC,EAAO,IAAA,EAAK,CAC1C,GAAIM,CAAAA,CAAM,MAEV,IAAM1B,CAAAA,CAAOqB,CAAAA,CAAQ,OAAOpC,CAAAA,CAAO,CAAE,MAAA,CAAQ,CAAA,CAAK,CAAC,CAAA,CACnDgD,CAAAA,CAAS,KAAA,CAAMjC,CAAI,EACvB,CACJ,CAAA,OAAE,CACEiC,CAAAA,CAAS,GAAA,GACb,CACJ,CAAA,CACJ,CAKA,eAAuBG,CAAAA,CAAAA,GAChBC,CAAAA,CACwB,CAC3B,IAAMC,CAAAA,CAAWD,CAAAA,CAAW,GAAA,CAAI,MAAOE,GAAQ,CAC3C,IAAMC,CAAAA,CAAuB,EAAC,CAC9B,UAAA,IAAiB9C,CAAAA,IAAQ6C,CAAAA,CACrBC,EAAM,IAAA,CAAK9C,CAAI,CAAA,CAEnB,OAAO8C,CACX,CAAC,CAAA,CAEKC,CAAAA,CAAU,MAAM,QAAQ,GAAA,CAAIH,CAAQ,CAAA,CAG1C,IAAA,IAAWE,CAAAA,IAASC,CAAAA,CAChB,IAAA,IAAW/C,CAAAA,IAAQ8C,EACf,MAAM9C,EAGlB,CAKA,eAAuBgD,GACnBb,CAAAA,CACAc,CAAAA,CACiB,CACjB,UAAA,IAAiB5B,KAASc,CAAAA,CAAW,CACjC,IAAMe,CAAAA,CAAcD,CAAAA,CAAY5B,CAAK,CAAA,CACjC6B,CAAAA,GAAgB,OAChB,MAAMA,CAAAA,EAEd,CACJ,CAKA,eAAuBC,EAAAA,CACnBhB,CAAAA,CACAiB,CAAAA,CAC2B,CAC3B,cAAiB/B,CAAAA,IAASc,CAAAA,CAClBiB,CAAAA,CAAU/B,CAAK,CAAA,GACf,MAAMA,CAAAA,EAGlB,CAKA,eAAsBgC,CAAAA,CAClBlB,CAAAA,CACsB,CACtB,IAAMmB,EAAwB,EAAC,CAE/B,UAAA,IAAiBjC,CAAAA,IAASc,EACtBmB,CAAAA,CAAO,IAAA,CAAKjC,CAAK,CAAA,CAGrB,OAAOiC,CACX,CAKA,eAAuBC,EAAAA,CACnBpB,EACAqB,CAAAA,CAC2B,CAC3B,IAAIC,CAAAA,CAAQ,EAEZ,UAAA,IAAiBpC,CAAAA,IAASc,CAAAA,CAAW,CACjC,GAAIsB,CAAAA,EAASD,CAAAA,CAAO,MACpB,MAAMnC,CAAAA,CACNoC,CAAAA,GACJ,CACJ,CAKA,eAAuBC,EAAAA,CACnBvB,CAAAA,CACAxD,CAAAA,CACAgF,CAAAA,CAC6B,CAC7B,IAAIC,CAAAA,CAAuB,EAAC,CACxB7E,EAAmC,IAAA,CAEjC8E,CAAAA,CAAa,SAAY,CAC3B,GAAID,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAG,CAClB,IAAME,CAAAA,CAAU,CAAC,GAAGF,CAAK,CAAA,CACzB,OAAAA,CAAAA,CAAQ,GACDE,CACX,CACA,OAAO,IACX,CAAA,CAEA,GAAI,CACA,UAAA,IAAiBzC,KAASc,CAAAA,CAQtB,GAPAyB,CAAAA,CAAM,IAAA,CAAKvC,CAAK,CAAA,CAEZtC,CAAAA,GACA,YAAA,CAAaA,CAAS,EACtBA,CAAAA,CAAY,IAAA,CAAA,CAGZ6E,CAAAA,CAAM,MAAA,EAAUjF,CAAAA,CAAM,CACtB,IAAMoF,CAAAA,CAAU,MAAMF,CAAAA,EAAW,CAC7BE,CAAAA,GAAS,MAAMA,GACvB,CAAA,KAAWJ,CAAAA,GACP5E,CAAAA,CAAY,UAAA,CAAW,SAAY,CAC/B,IAAMgF,CAAAA,CAAU,MAAMF,CAAAA,GAK1B,CAAA,CAAGF,CAAS,GAKpB,IAAMK,CAAAA,CAAY,MAAMH,CAAAA,GACpBG,CAAAA,GAAW,MAAMA,CAAAA,EACzB,CAAA,OAAE,CACMjF,CAAAA,EACA,YAAA,CAAaA,CAAS,EAE9B,CACJ,CCtRO,IAAMkF,CAAAA,CAAN,cAA6B,KAAM,CACtC,WAAA,CACI9C,CAAAA,CACO+C,EACAC,CAAAA,CACAC,CAAAA,CACT,CACE,KAAA,CAAMjD,CAAO,CAAA,CAJN,IAAA,CAAA,IAAA,CAAA+C,CAAAA,CACA,IAAA,CAAA,UAAA,CAAAC,CAAAA,CACA,IAAA,CAAA,OAAA,CAAAC,CAAAA,CAGP,IAAA,CAAK,KAAO,iBAChB,CACJ,CAAA,CAEaC,CAAAA,CAAN,cAA6BJ,CAAe,CAC/C,WAAA,CAAY9C,CAAAA,CAAwBmD,EAAqB,CACrD,KAAA,CAAMnD,CAAAA,CAAS,kBAAA,CAAoB,GAAG,CAAA,CADN,IAAA,CAAA,UAAA,CAAAmD,EAEpC,CACJ,EAEaC,CAAAA,CAAN,cAA8BN,CAAe,CAChD,YAAY9C,CAAAA,CAAiBiD,CAAAA,CAAmB,CAC5C,KAAA,CAAMjD,EAAS,kBAAA,CAAoB,GAAA,CAAKiD,CAAO,EACnD,CACJ,CAAA,CAEaI,CAAAA,CAAN,cAA4BP,CAAe,CAC9C,WAAA,CAAY9C,CAAAA,CAAwBsD,CAAAA,CAAkBN,EAAqB,CACvE,KAAA,CAAMhD,CAAAA,CAAS,gBAAA,CAAkBgD,CAAU,CAAA,CADX,IAAA,CAAA,QAAA,CAAAM,EAEpC,CACJ,EC2EA,eAAuBC,CAAAA,CACnB5E,CAAAA,CAC6B,CAC7B,IAAI6E,CAAAA,CAAY,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK,CAAA,CAAA,CAC7BC,CAAAA,CAAW,EAAA,CACXC,EAAqC,CACrC,EAAA,CAAIF,CAAAA,CACJ,IAAA,CAAM,WAAA,CACN,OAAA,CAAS,EAAA,CACT,SAAA,CAAW,KAAK,GAAA,EAAI,CACpB,UAAA,CAAY,KAChB,EAEA,MAAM,CAAE,IAAA,CAAM,eAAA,CAAiB,UAAAA,CAAU,CAAA,CAEzC,GAAI,CACA,UAAA,IAAiBtD,CAAAA,IAASvB,CAAAA,CACtB,OAAQuB,EAAM,IAAA,EACV,KAAK,YAAA,CACDuD,GAAYvD,CAAAA,CAAM,KAAA,CAClBwD,CAAAA,CAAe,OAAA,CAAUD,EACzB,MAAM,CAAE,IAAA,CAAM,YAAA,CAAc,KAAA,CAAOvD,CAAAA,CAAM,KAAM,CAAA,CAC/C,MAEJ,KAAK,iBAAA,CACIwD,CAAAA,CAAe,SAAA,GAChBA,EAAe,SAAA,CAAY,EAAC,CAAA,CAEhCA,CAAAA,CAAe,UAAU,IAAA,CAAKxD,CAAAA,CAAM,QAAQ,CAAA,CAC5C,MAAM,CACF,IAAA,CAAM,iBAAA,CACN,WAAYA,CAAAA,CAAM,QAAA,CAAS,EAAA,CAC3B,QAAA,CAAUA,EAAM,QAAA,CAAS,IAC7B,CAAA,CACA,MAEJ,KAAK,eAAA,CACD,MAAM,CACF,IAAA,CAAM,oBAAA,CACN,UAAA,CAAYA,CAAAA,CAAM,QAAA,CAAS,GAC3B,SAAA,CAAWA,CAAAA,CAAM,QAAA,CAAS,SAC9B,EACA,MAEJ,KAAK,aAAA,CACIwD,CAAAA,CAAe,cAChBA,CAAAA,CAAe,WAAA,CAAc,EAAC,CAAA,CAElCA,EAAe,WAAA,CAAY,IAAA,CAAKxD,CAAAA,CAAM,MAAM,EAC5C,MAAM,CACF,IAAA,CAAM,aAAA,CACN,WAAYA,CAAAA,CAAM,MAAA,CAAO,UAAA,CACzB,MAAA,CAAQA,EAAM,MAAA,CAAO,MAAA,CACrB,OAAA,CAAS,CAACA,CAAAA,CAAM,MAAA,CAAO,KAC3B,CAAA,CACA,MAEJ,KAAK,OAAA,CACIwD,CAAAA,CAAe,QAAA,GAChBA,EAAe,QAAA,CAAW,EAAC,CAAA,CAE/BA,CAAAA,CAAe,SAAS,KAAA,CAAQxD,CAAAA,CAAM,KAAA,CACtC,MAAM,CACF,IAAA,CAAM,OAAA,CACN,MAAA,CAAQ,CACJ,MAAA,CAAQA,CAAAA,CAAM,KAAA,CAAM,YAAA,CACpB,WAAYA,CAAAA,CAAM,KAAA,CAAM,gBAAA,CACxB,KAAA,CAAOA,EAAM,KAAA,CAAM,WACvB,CACJ,CAAA,CACA,MAEJ,KAAK,UAAA,CACIwD,CAAAA,CAAe,WAChBA,CAAAA,CAAe,QAAA,CAAW,EAAC,CAAA,CAE/BA,EAAe,QAAA,CAAW,CACtB,GAAGA,CAAAA,CAAe,SAClB,GAAGxD,CAAAA,CAAM,QACb,CAAA,CACA,MAEJ,KAAK,gBAAA,CACIwD,CAAAA,CAAe,WAChBA,CAAAA,CAAe,QAAA,CAAW,EAAC,CAAA,CAE1BA,EAAe,QAAA,CAAS,SAAA,GACzBA,CAAAA,CAAe,QAAA,CAAS,UAAY,EAAC,CAAA,CAEzCA,CAAAA,CAAe,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,CACnC,GAAGxD,EAAM,QAAA,CACT,OAAA,CAAS,EACb,CAAC,EACD,MAEJ,KAAK,gBAAA,CACD,GAAIwD,EAAe,QAAA,EAAU,SAAA,CAAW,CACpC,IAAMC,CAAAA,CACFD,CAAAA,CAAe,QAAA,CAAS,SAAA,CACxBA,EAAe,QAAA,CAAS,SAAA,CAAU,MAAA,CAAS,CAC3C,EACAC,CAAAA,GACAA,CAAAA,CAAa,OAAA,EAAWzD,CAAAA,CAAM,OAEtC,CACA,MAEJ,KAAK,cAAA,CACD,GAAIwD,CAAAA,CAAe,QAAA,EAAU,SAAA,CAAW,CACpC,IAAMC,CAAAA,CACFD,CAAAA,CAAe,QAAA,CAAS,UACxBA,CAAAA,CAAe,QAAA,CAAS,SAAA,CAAU,MAAA,CAAS,CAC3C,CAAA,CACAC,CAAAA,EACA,MAAA,CAAO,MAAA,CAAOA,EAAczD,CAAAA,CAAM,QAAQ,EAElD,CACA,MAEJ,KAAK,MAAA,CACDwD,CAAAA,CAAe,UAAA,CAAa,GAC5BA,CAAAA,CAAe,OAAA,CAAUD,CAAAA,CACzB,IAAMtD,EAAe,CACjB,GAAGuD,CAAAA,CACH,GAAGxD,CAAAA,CAAM,YACb,CAAA,CAEA,MAAM,CAAE,IAAA,CAAM,eAAA,CAAiB,QAAA,CAAAuD,CAAS,EACxC,MAAM,CACF,IAAA,CAAM,kBAAA,CACN,QAAStD,CACb,CAAA,CACA,MAEJ,KAAK,OAAA,CACD,MAAM,CAAE,IAAA,CAAM,QAAS,KAAA,CAAOD,CAAAA,CAAM,KAAM,CAAA,CAC1C,KACR,CAER,CAAA,MAAShD,CAAAA,CAAY,CACjB,MAAM,CAAE,IAAA,CAAM,OAAA,CAAS,KAAA,CAAOA,CAAAA,CAAM,OAAA,EAAW,cAAe,EAClE,CACJ,CAWA,eAAsB0G,CAAAA,CAClBjF,CAAAA,CACAkF,EACkB,CAClB,IAAMC,CAAAA,CAAWP,CAAAA,CAAW5E,CAAM,CAAA,CAC9BwB,CAAAA,CAAiC,IAAA,CAErC,UAAA,IAAiBD,CAAAA,IAAS4D,CAAAA,CACtB,OAAQ5D,CAAAA,CAAM,MACV,KAAK,eAAA,CACD,MAAM2D,EAAS,OAAA,GAAU3D,CAAAA,CAAM,SAAS,CAAA,CACxC,MAEJ,KAAK,YAAA,CACD,MAAM2D,CAAAA,CAAS,MAAA,GAAS3D,CAAAA,CAAM,KAAK,CAAA,CACnC,MAEJ,KAAK,kBAAA,CACDC,CAAAA,CAAeD,CAAAA,CAAM,QACrB,MAAM2D,CAAAA,CAAS,UAAA,GAAa3D,CAAAA,CAAM,OAAO,CAAA,CACzC,MAEJ,KAAK,OAAA,CACD,MAAA,MAAM2D,CAAAA,CAAS,OAAA,GAAU3D,CAAAA,CAAM,KAAK,CAAA,CAC9B,IAAI,KAAA,CAAMA,CAAAA,CAAM,KAAK,CAAA,CAE/B,KAAK,oBAAA,CACD,MAAM2D,EAAS,UAAA,GAAa3D,CAAAA,CAAM,UAAA,CAAYA,CAAAA,CAAM,SAAS,CAAA,CAC7D,MAEJ,KAAK,cACD,MAAM2D,CAAAA,CAAS,YAAA,GAAe,CAC1B,OAAQ3D,CAAAA,CAAM,UAAA,CACd,OAAA,CAASA,CAAAA,CAAM,OACf,OAAA,CAASA,CAAAA,CAAM,OAAA,CACf,QAAA,CAAU,EACV,SAAA,CAAW,IAAA,CAAK,GAAA,EACpB,CAAC,CAAA,CACD,MAEJ,KAAK,OAAA,CACD,MAAM2D,CAAAA,CAAS,OAAA,GAAU3D,CAAAA,CAAM,MAAM,EACrC,MAEJ,KAAK,eAAA,CACD,MAAM2D,CAAAA,CAAS,cAAA,GAAiB3D,CAAAA,CAAM,MAAM,EAC5C,KACR,CAGJ,GAAI,CAACC,EACD,MAAM,IAAI,KAAA,CAAM,wCAAwC,EAG5D,OAAOA,CACX,CASA,eAAsB4D,CAAAA,CAClBpF,CAAAA,CACe,CACf,IAAIQ,EAAO,EAAA,CAEX,UAAA,IAAiBe,CAAAA,IAASvB,CAAAA,CAClBuB,EAAM,IAAA,GAAS,YAAA,GACff,CAAAA,EAAQe,CAAAA,CAAM,OAItB,OAAOf,CACX,CAmBA,eAAuB6E,EAAAA,CAAsBlH,CAAAA,CAUX,CAC9B,IAAMmH,EAAS,IAAIhF,CAAAA,CAGfkB,EAAiC,KAGjCrD,CAAAA,CAAQ,SAAA,EACRmH,CAAAA,CAAO,GAAG,SAAA,CAAWnH,CAAAA,CAAQ,SAAS,CAAA,CAGtCA,CAAAA,CAAQ,YAAA,EACRmH,CAAAA,CAAO,EAAA,CAAG,aAAcnH,CAAAA,CAAQ,YAAY,CAAA,CAG5CA,CAAAA,CAAQ,gBACRmH,CAAAA,CAAO,EAAA,CAAG,cAAA,CAAgBnH,CAAAA,CAAQ,cAAc,CAAA,CAMpD,IAAMoH,CAAAA,CAAQ,MAAOvF,CAAAA,EAAuD,CACxE,UAAA,IAAiBuB,CAAAA,IAASvB,EACtB,OAAQuB,CAAAA,CAAM,IAAA,EACV,KAAK,YAAA,CACD+D,CAAAA,CAAO,KAAA,CAAM/D,CAAAA,CAAM,KAAK,CAAA,CACxB,MAEJ,KAAK,iBAAA,CACD+D,CAAAA,CAAO,SAAA,CACH/D,CAAAA,CAAM,QAAA,CAAS,GACfA,CAAAA,CAAM,QAAA,CAAS,IAAA,CACfA,CAAAA,CAAM,SAAS,SACnB,CAAA,CACA,MAEJ,KAAK,gBACY+D,CAAAA,CACR,cAAA,EAAe,CACf,IAAA,CAAME,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAOjE,CAAAA,CAAM,SAAS,EAAE,CAAA,EAEvC+D,CAAAA,CAAO,YAAA,CACH/D,EAAM,QAAA,CAAS,EAAA,CACfA,CAAAA,CAAM,QAAA,CAAS,UACf,IACJ,CAAA,CAEJ,MAEJ,KAAK,cACD+D,CAAAA,CAAO,YAAA,CACH/D,CAAAA,CAAM,MAAA,CAAO,WACbA,CAAAA,CAAM,MAAA,CAAO,MAAA,CACb,CAACA,EAAM,MAAA,CAAO,KAAA,CACdA,CAAAA,CAAM,MAAA,CAAO,KACjB,CAAA,CACA,MAEJ,KAAK,OAAA,CACD+D,CAAAA,CAAO,KAAA,CAAM,CACT,MAAA,CAAQ/D,EAAM,KAAA,CAAM,YAAA,CACpB,UAAA,CAAYA,CAAAA,CAAM,MAAM,gBAAA,CACxB,KAAA,CAAOA,CAAAA,CAAM,KAAA,CAAM,WACvB,CAAC,CAAA,CACD,MAEJ,KAAK,OAAA,CACD+D,CAAAA,CAAO,KAAA,CAAM/D,CAAAA,CAAM,KAAK,CAAA,CACxB,MAEJ,KAAK,MAAA,CACD+D,EAAO,IAAA,CAAK/D,CAAAA,CAAM,YAAY,CAAA,CAC9B,KACR,CAER,CAAA,CAGMkE,CAAAA,CAAAA,CAAkB,SAAY,CAChC,GAAI,CACAH,CAAAA,CAAO,OAAM,CACb,MAAMnH,CAAAA,CAAQ,OAAA,CAAQ,CAAE,MAAA,CAAAmH,CAAAA,CAAQ,KAAA,CAAAC,CAAM,CAAC,CAAA,CAElCD,CAAAA,CAAO,QAAA,EAAS,EACjBA,CAAAA,CAAO,IAAA,GAEf,CAAA,MAASI,EAAU,CAEf,IAAMC,EAAexH,CAAAA,CAAQ,OAAA,GAAUuH,CAAG,CAAA,EAAKA,EAAI,OAAA,CACnDJ,CAAAA,CAAO,KAAA,CAAMK,CAAY,CAAA,CACzBL,CAAAA,CAAO,IAAA,GACX,CACJ,CAAA,GAAG,CAGH,GAAI,CACA,cAAiB/D,CAAAA,IAASqD,CAAAA,CAAWU,CAAAA,CAAO,WAAA,EAAa,CAAA,CACrD,MAAM/D,CAAAA,CAGFA,CAAAA,CAAM,IAAA,GAAS,kBAAA,GACfC,CAAAA,CAAeD,CAAAA,CAAM,SAK7B,MAAMkE,CAAAA,CAGFtH,CAAAA,CAAQ,QAAA,EAAYqD,GACpB,MAAMrD,CAAAA,CAAQ,QAAA,CAAS,CAAE,QAASqD,CAAa,CAAC,EAExD,CAAA,MAASkE,CAAAA,CAAU,CACf,MACMA,CACV,CACJ,CAQA,eAAsBE,EAClB5F,CAAAA,CACa,CACE,IAAIM,EAGnB,UAAA,IAAiBiB,CAAAA,IAASvB,CAAAA,CACtB,OAAQuB,CAAAA,CAAM,IAAA,EACV,KAAK,aACD,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAMA,CAAAA,CAAM,KAAK,CAAA,CAChC,MAEJ,KAAK,iBAAA,CACD,QAAQ,GAAA,CAAI;AAAA,gBAAA,EAAcA,CAAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA,CAC/C,MAEJ,KAAK,aAAA,CACD,IAAMsE,CAAAA,CAAOtE,CAAAA,CAAM,MAAA,CAAO,MAAQ,QAAA,CAAM,QAAA,CACxC,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAGsE,CAAI,CAAA,eAAA,CAAiB,CAAA,CACpC,MAEJ,KAAK,OAAA,CACD,OAAA,CAAQ,GAAA,CACJ;;AAAA,kBAAA,EAAkBtE,EAAM,KAAA,CAAM,YAAY,CAAA,UAAA,EAAaA,CAAAA,CAAM,MAAM,gBAAgB,CAAA,cAAA,EAAiBA,CAAAA,CAAM,KAAA,CAAM,WAAW,CAAA,MAAA,CAC/H,CAAA,CACA,MAEJ,KAAK,OAAA,CACD,QAAQ,KAAA,CAAM;AAAA,aAAA,CAAA,CAAcA,EAAM,KAAK,CAAA,CACvC,MAEJ,KAAK,MAAA,CACD,QAAQ,GAAA,CAAI;;AAAA,uBAAA,CAAwB,EACpC,KACR,CAER,CAoBA,eAAsBuE,CAAAA,CAClB9F,EACAL,CAAAA,CACwB,CACxB,IAAMwF,CAAAA,CAAWP,CAAAA,CAAW5E,CAAM,CAAA,CAGlC,GAAI,CAACL,CAAAA,CACD,OAAO,IAAI,QAAA,CACP,IAAI,eAAe,CACf,MAAM,MAAM4C,CAAAA,CAAY,CACpB,IAAMD,CAAAA,CAAU,IAAI,YAEpB,GAAI,CACA,cAAiBf,CAAAA,IAAS4D,CAAAA,CAAU,CAChC,IAAMvH,CAAAA,CAAO,SAAS,IAAA,CAAK,SAAA,CAAU2D,CAAK,CAAC;;AAAA,CAAA,CAC3CgB,CAAAA,CAAW,OAAA,CAAQD,CAAAA,CAAQ,MAAA,CAAO1E,CAAI,CAAC,EAC3C,CAEA2E,CAAAA,CAAW,OAAA,CAAQD,CAAAA,CAAQ,MAAA,CAAO,CAAA;;AAAA,CAAkB,CAAC,EACzD,CAAA,MAAS/D,CAAAA,CAAO,CACZgE,EAAW,KAAA,CAAMhE,CAAK,EAC1B,CAAA,OAAE,CACEgE,CAAAA,CAAW,QACf,CACJ,CACJ,CAAC,CAAA,CACD,CACI,OAAA,CAAS,CACL,cAAA,CAAgB,mBAAA,CAChB,eAAA,CAAiB,UAAA,CACjB,UAAA,CAAY,YAChB,CACJ,CACJ,CAAA,CAIJ5C,CAAAA,CAAO,SAAA,CAAU,cAAA,CAAgB,mBAAmB,CAAA,CACpDA,CAAAA,CAAO,SAAA,CAAU,eAAA,CAAiB,UAAU,CAAA,CAC5CA,CAAAA,CAAO,SAAA,CAAU,aAAc,YAAY,CAAA,CAE3C,UAAA,IAAiB4B,CAAAA,IAAS4D,CAAAA,CAAU,CAChC,IAAMvH,CAAAA,CAAO,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU2D,CAAK,CAAC;;AAAA,CAAA,CAC3C5B,EAAO,KAAA,CAAM/B,CAAI,EACrB,CAEA+B,EAAO,KAAA,CAAM,CAAA;;AAAA,CAAkB,CAAA,CAC/BA,EAAO,GAAA,GACX,CAWO,SAASoG,EAAAA,CAA+BC,EAAkB,CAC7D,IAAMV,EAAS,IAAIhF,CAAAA,CACf2F,EAAS,KAAA,CAEb,OAAO,CACH,KAAA,CAAA,CAAQ,iBAAmB,CACnBD,CAAAA,GAAiB,MAAA,GACjB,MAAMA,GAGV,UAAA,IAAiBzE,CAAAA,IAAS+D,EAAO,WAAA,EAAY,CACrC/D,EAAM,IAAA,GAAS,YAAA,CACf,MAAMA,CAAAA,CAAM,KAAA,CACLA,CAAAA,CAAM,OAAS,MAAA,GACtB,MAAMA,EAAM,YAAA,CAAa,OAAA,EAGrC,IAAG,CAEH,MAAA,CAAO9B,CAAAA,CAAU,CACb,GAAIwG,CAAAA,CAAQ,MAAM,IAAI,KAAA,CAAM,qBAAqB,CAAA,CACjDX,CAAAA,CAAO,MAAM,MAAA,CAAO7F,CAAK,CAAC,EAC9B,CAAA,CAEA,IAAA,CAAKA,EAAW,CACRwG,CAAAA,GACAxG,IAAU,MAAA,EACV6F,CAAAA,CAAO,MAAM,MAAA,CAAO7F,CAAK,CAAC,CAAA,CAE9B6F,CAAAA,CAAO,IAAA,GACPW,CAAAA,CAAS,IAAA,EACb,EAEA,KAAA,CAAM1H,CAAAA,CAAe,CACjB+G,CAAAA,CAAO,KAAA,CAAM/G,CAAK,CAAA,CAClB0H,CAAAA,CAAS,KACb,CACJ,CACJ,KC/lBaC,CAAAA,CAAN,KAAmC,CAC9B,MAAA,CACA,SAAA,CACA,UAAA,CAER,WAAA,CAAY/H,CAAAA,CAAmD,CAC3D,KAAK,MAAA,CAAS,IAAIgI,oBAAM,CACpB,IAAA,CAAMhI,EAAQ,IAAA,CACd,IAAA,CAAMA,EAAQ,IAAA,CACd,QAAA,CAAUA,EAAQ,QAAA,CAClB,EAAA,CAAIA,EAAQ,EAAA,EAAM,CAAA,CAClB,cAAgBiI,CAAAA,EACE,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAQ,EAAA,CAAI,GAAI,EAG3C,oBAAA,CAAsB,CAAA,CACtB,iBAAkB,IAAA,CAClB,WAAA,CAAa,KACjB,CAAC,CAAA,CAED,IAAA,CAAK,SAAA,CAAYjI,CAAAA,CAAQ,SAAA,EAAa,aACtC,IAAA,CAAK,UAAA,CAAaA,EAAQ,GAAA,EAAO,IAAA,CAGjC,KAAK,MAAA,CAAO,EAAA,CAAG,OAAA,CAAUuH,CAAAA,EAAQ,CAC7B,OAAA,CAAQ,MAAM,oBAAA,CAAsBA,CAAG,EAC3C,CAAC,EACL,CAEQ,MAAA,CAAO5F,CAAAA,CAAqB,CAChC,OAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,EAAGA,CAAG,EAClC,CAEA,MAAM,IAAIA,CAAAA,CAAqC,CAC3C,GAAI,CACA,OAAO,MAAM,KAAK,MAAA,CAAO,GAAA,CAAI,KAAK,MAAA,CAAOA,CAAG,CAAC,CACjD,CAAA,MAASvB,CAAAA,CAAO,CACZ,OAAA,OAAA,CAAQ,KAAA,CAAM,mBAAoBA,CAAK,CAAA,CAChC,IACX,CACJ,CAEA,MAAM,GAAA,CAAIuB,CAAAA,CAAaL,CAAAA,CAAe4G,CAAAA,CAA6B,CAC/D,GAAI,CACA,IAAMC,CAAAA,CAAYD,GAAO,IAAA,CAAK,UAAA,CAC9B,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,IAAA,CAAK,MAAA,CAAOvG,CAAG,CAAA,CAAGwG,CAAAA,CAAW7G,CAAK,EAC9D,CAAA,MAASlB,EAAO,CACZ,OAAA,CAAQ,KAAA,CAAM,kBAAA,CAAoBA,CAAK,EAC3C,CACJ,CAEA,MAAM,OAAOuB,CAAAA,CAA4B,CACrC,GAAI,CACA,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,OAAOA,CAAG,CAAC,EAC1C,CAAA,MAASvB,CAAAA,CAAO,CACZ,OAAA,CAAQ,KAAA,CAAM,qBAAA,CAAuBA,CAAK,EAC9C,CACJ,CAEA,MAAM,KAAA,EAAuB,CACzB,GAAI,CACA,IAAMgI,CAAAA,CAAO,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,CAAA,CAAG,EACpDA,CAAAA,CAAK,MAAA,CAAS,GACd,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAGA,CAAI,EAErC,CAAA,MAAShI,CAAAA,CAAO,CACZ,OAAA,CAAQ,KAAA,CAAM,qBAAsBA,CAAK,EAC7C,CACJ,CAEA,MAAM,GAAA,CAAIuB,EAA+B,CACrC,GAAI,CAEA,OADe,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAOA,CAAG,CAAC,IACtC,CACtB,CAAA,MAASvB,EAAO,CACZ,OAAA,OAAA,CAAQ,MAAM,kBAAA,CAAoBA,CAAK,EAChC,KACX,CACJ,CAEA,MAAM,UAAA,EAA4B,CAC9B,MAAM,IAAA,CAAK,OAAO,IAAA,GACtB,CACJ,CAAA,CAKaiI,CAAAA,CAAN,KAAoC,CAC/B,KAAA,CAER,WAAA,CAAYrI,EAAiC,CACzC,IAAA,CAAK,MAAQ,IAAIsI,iBAAAA,CAAyB,CACtC,GAAA,CAAKtI,CAAAA,EAAS,OAAA,EAAW,IACzB,GAAA,CAAKA,CAAAA,EAAS,QAAU,IAAA,CACxB,cAAA,CAAgB,KAChB,cAAA,CAAgB,IACpB,CAAC,EACL,CAEA,MAAM,IAAI2B,CAAAA,CAAqC,CAC3C,OAAO,IAAA,CAAK,KAAA,CAAM,IAAIA,CAAG,CAAA,EAAK,IAClC,CAEA,MAAM,GAAA,CAAIA,EAAaL,CAAAA,CAA8B,CACjD,KAAK,KAAA,CAAM,GAAA,CAAIK,EAAKL,CAAK,EAC7B,CAEA,MAAM,MAAA,CAAOK,CAAAA,CAA4B,CACrC,IAAA,CAAK,KAAA,CAAM,OAAOA,CAAG,EACzB,CAEA,MAAM,KAAA,EAAuB,CACzB,IAAA,CAAK,KAAA,CAAM,KAAA,GACf,CAEA,MAAM,IAAIA,CAAAA,CAA+B,CACrC,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,CAAG,CAC7B,CACJ,EAKa4G,CAAAA,CAAN,KAAmB,CACd,KAAA,CACA,OAAA,CAER,YAAYvI,CAAAA,CAAuB,CAC/B,KAAK,OAAA,CAAU,IAAA,CAEXA,EAAQ,IAAA,GAAS,OAAA,CACjB,KAAK,KAAA,CAAQ,IAAI+H,EAAW,CACxB,GAAG/H,CAAAA,CAAQ,KAAA,CACX,GAAA,CAAKA,CAAAA,CAAQ,GACjB,CAAC,CAAA,CAED,KAAK,KAAA,CAAQ,IAAIqI,EAAYrI,CAAAA,CAAQ,MAAO,EAEpD,CAKQ,gBAAA,CAAiBJ,CAAAA,CAAqB4I,EAA4B,CACtE,IAAMC,EAAY,CACd,QAAA,CAAU7I,EAAS,GAAA,CAAK8I,CAAAA,GAAO,CAC3B,IAAA,CAAMA,CAAAA,CAAE,IAAA,CACR,QAASA,CAAAA,CAAE,OAAA,CACX,UAAWA,CAAAA,CAAE,SACjB,EAAE,CAAA,CACF,KAAA,CAAOF,CAAAA,CAAO,KAAA,CACd,WAAA,CAAaA,CAAAA,CAAO,YACpB,SAAA,CAAWA,CAAAA,CAAO,UAClB,KAAA,CAAOA,CAAAA,CAAO,OAAO,GAAA,CAAKnB,CAAAA,EAAMA,CAAAA,CAAE,IAAI,CAC1C,CAAA,CAEA,OAAO7H,CAAAA,CAAeiJ,CAAS,CACnC,CAKA,MAAM,kBACF7I,CAAAA,CACA4I,CAAAA,CAC6B,CAC7B,GAAI,CAAC,IAAA,CAAK,SAAWA,CAAAA,CAAO,KAAA,EAAO,UAAY,KAAA,CAC3C,OAAO,KAGX,IAAMG,CAAAA,CAAWH,CAAAA,CAAO,KAAA,EAAO,GAAA,EAAO,IAAA,CAAK,iBAAiB5I,CAAAA,CAAU4I,CAAM,EACtEI,CAAAA,CAAS,MAAM,KAAK,KAAA,CAAM,GAAA,CAAID,CAAQ,CAAA,CAE5C,GAAIC,EACA,GAAI,CACA,OAAO,IAAA,CAAK,KAAA,CAAMA,CAAM,CAC5B,CAAA,MAASxI,CAAAA,CAAO,CACZ,OAAA,OAAA,CAAQ,KAAA,CAAM,qBAAsBA,CAAK,CAAA,CACzC,MAAM,IAAA,CAAK,KAAA,CAAM,OAAOuI,CAAQ,CAAA,CACzB,IACX,CAGJ,OAAO,IACX,CAKA,MAAM,aAAA,CACF/I,EACA4I,CAAAA,CACAnD,CAAAA,CACa,CACb,GAAI,CAAC,IAAA,CAAK,OAAA,EAAWmD,CAAAA,CAAO,KAAA,EAAO,UAAY,KAAA,CAC3C,OAGJ,IAAMG,CAAAA,CAAWH,CAAAA,CAAO,OAAO,GAAA,EAAO,IAAA,CAAK,gBAAA,CAAiB5I,CAAAA,CAAU4I,CAAM,CAAA,CACtEN,EAAMM,CAAAA,CAAO,KAAA,EAAO,IAE1B,MAAM,IAAA,CAAK,MAAM,GAAA,CAAIG,CAAAA,CAAU,IAAA,CAAK,SAAA,CAAUtD,CAAM,CAAA,CAAG6C,CAAG,EAC9D,CAKA,MAAM,UAAA,CAAWtI,CAAAA,CAAqB4I,EAAmC,CACrE,IAAMG,CAAAA,CAAW,IAAA,CAAK,gBAAA,CAAiB/I,CAAAA,CAAU4I,CAAM,CAAA,CACvD,MAAM,KAAK,KAAA,CAAM,MAAA,CAAOG,CAAQ,EACpC,CAKA,MAAM,QAAA,EAA0B,CAC5B,MAAM,KAAK,KAAA,CAAM,KAAA,GACrB,CAKA,OAAA,EAAgB,CACZ,IAAA,CAAK,OAAA,CAAU,MACnB,CAKA,MAAA,EAAe,CACX,IAAA,CAAK,OAAA,CAAU,KACnB,CACJ,MCrQaE,EAAAA,CAAN,KAAgD,CACnD,WAAA,CAAoBC,CAAAA,CAAiBC,CAAAA,CAAa,CAA9B,IAAA,CAAA,EAAA,CAAAD,CAAAA,CAAiB,YAAAC,EAAe,CAIpD,MAAM,OAAA,EAAyB,CAAE,CAEjC,MAAM,UAAA,EAA4B,CAAE,CAEpC,MAAM,WAAA,EAAgC,CAClC,GAAI,CACA,aAAM,IAAA,CAAK,EAAA,CAAG,OAAOC,cAAAA,CAAAA,CAAAA,CAAM,CAAA,CACpB,CAAA,CACX,CAAA,KAAQ,CACJ,OAAO,MACX,CACJ,CAEA,MAAM,KAAA,EAAuB,CACzB,MAAM,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,EACzC,MAAM,IAAA,CAAK,GAAG,MAAA,CAAO,IAAA,CAAK,OAAO,aAAa,EAClD,CAIA,MAAM,kBAAA,CAAmBC,CAAAA,CAAgBC,EAAqD,CAC1F,GAAM,CAACC,CAAY,CAAA,CAAI,MAAM,IAAA,CAAK,EAAA,CAC7B,OAAO,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,CAChC,MAAA,CAAO,CAAE,MAAA,CAAAF,CAAAA,CAAQ,SAAUC,CAAAA,EAAY,EAAG,CAAC,CAAA,CAC3C,SAAA,GACL,OAAOC,CAAAA,CAAa,EACxB,CAEA,MAAM,gBAAgBC,CAAAA,CAAsD,CACxE,GAAM,CAACD,CAAY,CAAA,CAAI,MAAM,IAAA,CAAK,EAAA,CAC7B,QAAO,CACP,IAAA,CAAK,KAAK,MAAA,CAAO,aAAa,CAAA,CAC9B,KAAA,CAAME,aAAAA,CAAG,IAAA,CAAK,OAAO,aAAA,CAAc,EAAA,CAAID,CAAc,CAAC,CAAA,CAC3D,OAAOD,CAAAA,EAAgB,IAC3B,CAEA,MAAM,iBAAA,CAAkBF,CAAAA,CAAgBhI,EAAQ,EAAA,CAAIqI,CAAAA,CAAS,EAA4B,CACrF,OAAO,MAAM,IAAA,CAAK,EAAA,CACb,MAAA,EAAO,CACP,IAAA,CAAK,IAAA,CAAK,OAAO,aAAa,CAAA,CAC9B,MAAMD,aAAAA,CAAG,IAAA,CAAK,OAAO,aAAA,CAAc,MAAA,CAAQJ,CAAM,CAAC,CAAA,CAClD,OAAA,CAAQM,gBAAK,IAAA,CAAK,MAAA,CAAO,cAAc,SAAS,CAAC,EACjD,KAAA,CAAMtI,CAAK,CAAA,CACX,MAAA,CAAOqI,CAAM,CACtB,CAEA,MAAM,kBAAA,CAAmBF,EAAwBI,CAAAA,CAA+C,CAC5F,MAAM,IAAA,CAAK,EAAA,CACN,OAAO,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,CAChC,GAAA,CAAI,CAAE,GAAGA,CAAAA,CAAS,UAAW,IAAI,IAAO,CAAC,CAAA,CACzC,KAAA,CAAMH,aAAAA,CAAG,KAAK,MAAA,CAAO,aAAA,CAAc,GAAID,CAAc,CAAC,EAC/D,CAEA,MAAM,kBAAA,CAAmBA,CAAAA,CAAuC,CAC5D,MAAM,KAAK,EAAA,CACN,MAAA,CAAO,KAAK,MAAA,CAAO,aAAa,EAChC,KAAA,CAAMC,aAAAA,CAAG,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,EAAA,CAAID,CAAc,CAAC,EAC/D,CAEA,MAAM,sBAAA,CAAuBH,EAA+B,CACxD,IAAMQ,CAAAA,CAAU,MAAM,IAAA,CAAK,EAAA,CACtB,OAAO,CAAE,EAAA,CAAI,KAAK,MAAA,CAAO,aAAA,CAAc,EAAG,CAAC,CAAA,CAC3C,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,aAAa,EAC9B,KAAA,CAAMJ,aAAAA,CAAG,KAAK,MAAA,CAAO,aAAA,CAAc,OAAQJ,CAAM,CAAC,CAAA,CAEvD,IAAA,GAAW,CAAE,EAAA,CAAA3J,CAAG,CAAA,GAAKmK,CAAAA,CACjB,MAAM,IAAA,CAAK,EAAA,CACN,OAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAC3B,KAAA,CAAMJ,aAAAA,CAAG,KAAK,MAAA,CAAO,QAAA,CAAS,eAAgB/J,CAAE,CAAC,EAG1D,MAAM,IAAA,CAAK,GACN,MAAA,CAAO,IAAA,CAAK,OAAO,aAAa,CAAA,CAChC,MAAM+J,aAAAA,CAAG,IAAA,CAAK,OAAO,aAAA,CAAc,MAAA,CAAQJ,CAAM,CAAC,EAC3D,CAEA,MAAM,kBAAA,CAAmBA,CAAAA,CAAiC,CACtD,GAAM,CAAC,CAAE,KAAA,CAAA1D,CAAM,CAAC,CAAA,CAAI,MAAM,IAAA,CAAK,GAC1B,MAAA,CAAO,CAAE,MAAOyD,cAAAA,CAAAA,QAAAA,CAAsB,CAAC,EACvC,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,CAC9B,KAAA,CAAMK,cAAG,IAAA,CAAK,MAAA,CAAO,cAAc,MAAA,CAAQJ,CAAM,CAAC,CAAA,CACvD,OAAO,MAAA,CAAO1D,CAAK,CACvB,CAEA,MAAM,kBAAA,CAAmB6D,CAAAA,CAA0C,CAC/D,GAAM,CAACM,CAAG,CAAA,CAAI,MAAM,IAAA,CAAK,EAAA,CACpB,MAAA,CAAO,CAAE,GAAI,IAAA,CAAK,MAAA,CAAO,cAAc,EAAG,CAAC,EAC3C,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,CAC9B,KAAA,CAAML,cAAG,IAAA,CAAK,MAAA,CAAO,cAAc,EAAA,CAAID,CAAc,CAAC,CAAA,CAC3D,OAAO,CAAC,CAACM,CACb,CAEA,MAAM,mBAAA,CAAoBT,CAAAA,CAAgBU,EAAwC,CAC9E,OAAO,MAAM,IAAA,CAAK,EAAA,CACb,QAAO,CACP,IAAA,CAAK,KAAK,MAAA,CAAO,aAAa,EAC9B,KAAA,CACGC,cAAAA,CACIP,cAAG,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,MAAA,CAAQJ,CAAM,CAAA,CAC3CY,gBAAK,IAAA,CAAK,MAAA,CAAO,cAAc,KAAA,CAAO,CAAA,CAAA,EAAIF,CAAK,CAAA,CAAA,CAAG,CACtD,CACJ,CACR,CAIA,MAAM,YAAYP,CAAAA,CAAwBlG,CAAAA,CAAiC,CACvE,MAAM,IAAA,CAAK,GAAG,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,CAAO,CAC9C,EAAA,CAAIA,CAAAA,CAAQ,GACZ,cAAA,CAAAkG,CAAAA,CACA,KAAMlG,CAAAA,CAAQ,IAAA,CACd,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,SAAA,CAAWA,EAAQ,SAAA,EAAa,GAChC,WAAA,CAAaA,CAAAA,CAAQ,aAAe,EAAC,CACrC,QAAA,CAAUA,CAAAA,CAAQ,QAAA,EAAY,GAC9B,SAAA,CAAWA,CAAAA,CAAQ,WAAa,IAAA,CAAK,GAAA,EACzC,CAAC,CAAA,CAED,MAAM,IAAA,CAAK,EAAA,CACN,MAAA,CAAO,KAAK,MAAA,CAAO,aAAa,EAChC,GAAA,CAAI,CAAE,UAAW,IAAI,IAAO,CAAC,CAAA,CAC7B,KAAA,CAAMmG,aAAAA,CAAG,KAAK,MAAA,CAAO,aAAA,CAAc,GAAID,CAAc,CAAC,EAC/D,CAEA,MAAM,iBAAiBA,CAAAA,CAAwBxJ,CAAAA,CAAoC,CAC3EA,CAAAA,CAAS,MAAA,GAAW,IAExB,MAAM,IAAA,CAAK,GAAG,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,CACvCA,EAAS,GAAA,CAAI8I,CAAAA,GAAM,CACf,EAAA,CAAIA,CAAAA,CAAE,GACN,cAAA,CAAAU,CAAAA,CACA,IAAA,CAAMV,CAAAA,CAAE,IAAA,CACR,OAAA,CAASA,EAAE,OAAA,CACX,SAAA,CAAWA,EAAE,SAAA,EAAa,GAC1B,WAAA,CAAaA,CAAAA,CAAE,WAAA,EAAe,EAAC,CAC/B,QAAA,CAAUA,EAAE,QAAA,EAAY,GACxB,SAAA,CAAWA,CAAAA,CAAE,WAAa,IAAA,CAAK,GAAA,EACnC,CAAA,CAAE,CACN,CAAA,CAEA,MAAM,IAAA,CAAK,EAAA,CACN,OAAO,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,CAChC,GAAA,CAAI,CAAE,SAAA,CAAW,IAAI,IAAO,CAAC,CAAA,CAC7B,KAAA,CAAMW,cAAG,IAAA,CAAK,MAAA,CAAO,cAAc,EAAA,CAAID,CAAc,CAAC,CAAA,EAC/D,CAEA,MAAM,WAAW1C,CAAAA,CAA4C,CACzD,GAAM,CAACxD,CAAO,EAAI,MAAM,IAAA,CAAK,EAAA,CACxB,MAAA,EAAO,CACP,IAAA,CAAK,KAAK,MAAA,CAAO,QAAQ,EACzB,KAAA,CAAMmG,aAAAA,CAAG,KAAK,MAAA,CAAO,QAAA,CAAS,GAAI3C,CAAS,CAAC,EACjD,OAAOxD,CAAAA,EAAW,IACtB,CAEA,MAAM,YAAYkG,CAAAA,CAAwBnI,CAAAA,CAAQ,GAAA,CAAKqI,CAAAA,CAAS,CAAA,CAAuB,CACnF,OAAO,MAAM,IAAA,CAAK,GACb,MAAA,EAAO,CACP,KAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CACzB,KAAA,CAAMD,aAAAA,CAAG,KAAK,MAAA,CAAO,QAAA,CAAS,eAAgBD,CAAc,CAAC,EAC7D,OAAA,CAAQU,cAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,SAAS,CAAC,CAAA,CAC3C,KAAA,CAAM7I,CAAK,CAAA,CACX,MAAA,CAAOqI,CAAM,CACtB,CAEA,MAAM,iBAAA,CAAkBF,CAAAA,CAAwBW,CAAAA,CAA2C,CACvF,OAAO,MAAM,KAAK,EAAA,CACb,MAAA,GACA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CACzB,KAAA,CACGH,eACIP,aAAAA,CAAG,IAAA,CAAK,OAAO,QAAA,CAAS,cAAA,CAAgBD,CAAc,CAAA,CACtDC,aAAAA,CAAG,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAMU,CAAI,CACtC,CACJ,EACC,OAAA,CAAQD,cAAAA,CAAI,KAAK,MAAA,CAAO,QAAA,CAAS,SAAS,CAAC,CACpD,CAEA,MAAM,aAAA,CAAcpD,CAAAA,CAAmB8C,EAA0C,CAC7E,MAAM,KAAK,EAAA,CACN,MAAA,CAAO,KAAK,MAAA,CAAO,QAAQ,EAC3B,GAAA,CAAIA,CAAO,EACX,KAAA,CAAMH,aAAAA,CAAG,KAAK,MAAA,CAAO,QAAA,CAAS,EAAA,CAAI3C,CAAS,CAAC,EACrD,CAEA,MAAM,aAAA,CAAcA,EAAkC,CAClD,MAAM,KAAK,EAAA,CACN,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAC3B,MAAM2C,aAAAA,CAAG,IAAA,CAAK,OAAO,QAAA,CAAS,EAAA,CAAI3C,CAAS,CAAC,EACrD,CAEA,MAAM,iBAAA,CAAkB0C,CAAAA,CAAuC,CAC3D,MAAM,IAAA,CAAK,GACN,MAAA,CAAO,IAAA,CAAK,OAAO,QAAQ,CAAA,CAC3B,KAAA,CAAMC,aAAAA,CAAG,IAAA,CAAK,MAAA,CAAO,SAAS,cAAA,CAAgBD,CAAc,CAAC,EACtE,CAEA,MAAM,aAAA,CAAcA,CAAAA,CAAyC,CACzD,GAAM,CAAC,CAAE,MAAA7D,CAAM,CAAC,EAAI,MAAM,IAAA,CAAK,GAC1B,MAAA,CAAO,CAAE,KAAA,CAAOyD,cAAAA,CAAAA,QAAAA,CAAsB,CAAC,CAAA,CACvC,KAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CACzB,KAAA,CAAMK,cAAG,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,cAAA,CAAgBD,CAAc,CAAC,EAClE,OAAO,MAAA,CAAO7D,CAAK,CACvB,CAEA,MAAM,cAAA,CAAe6D,CAAAA,CAAiD,CAClE,GAAM,CAAClG,CAAO,CAAA,CAAI,MAAM,KAAK,EAAA,CACxB,MAAA,GACA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CACzB,KAAA,CAAMmG,cAAG,IAAA,CAAK,MAAA,CAAO,SAAS,cAAA,CAAgBD,CAAc,CAAC,CAAA,CAC7D,OAAA,CAAQG,eAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,SAAS,CAAC,CAAA,CAC5C,MAAM,CAAC,CAAA,CACZ,OAAOrG,CAAAA,EAAW,IACtB,CAEA,MAAM,cAAA,CAAekG,CAAAA,CAAwBO,EAAmC,CAC5E,OAAO,MAAM,IAAA,CAAK,EAAA,CACb,QAAO,CACP,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CACzB,MACGC,cAAAA,CACIP,aAAAA,CAAG,KAAK,MAAA,CAAO,QAAA,CAAS,eAAgBD,CAAc,CAAA,CACtDS,eAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAS,CAAA,CAAA,EAAIF,CAAK,GAAG,CACnD,CACJ,EACC,OAAA,CAAQG,cAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,SAAS,CAAC,CACpD,CAIA,MAAM,0BAAA,CAA2BV,CAAAA,CAAwBF,EAAkD,CACvG,MAAM,IAAA,CAAK,EAAA,CACN,MAAA,CAAO,IAAA,CAAK,OAAO,aAAa,CAAA,CAChC,IAAI,CAAE,QAAA,CAAAA,EAAU,SAAA,CAAW,IAAI,IAAO,CAAC,CAAA,CACvC,MAAMG,aAAAA,CAAG,IAAA,CAAK,OAAO,aAAA,CAAc,EAAA,CAAID,CAAc,CAAC,EAC/D,CAEA,MAAM,uBAAA,CAAwBA,CAAAA,CAAiE,CAC3F,GAAM,CAACM,CAAG,CAAA,CAAI,MAAM,KAAK,EAAA,CACpB,MAAA,CAAO,CAAE,QAAA,CAAU,IAAA,CAAK,MAAA,CAAO,cAAc,QAAS,CAAC,EACvD,IAAA,CAAK,IAAA,CAAK,OAAO,aAAa,CAAA,CAC9B,KAAA,CAAML,aAAAA,CAAG,IAAA,CAAK,MAAA,CAAO,cAAc,EAAA,CAAID,CAAc,CAAC,CAAA,CAC3D,OAAOM,GAAK,QAAA,EAAY,IAC5B,CAEA,MAAM,0BAAA,CAA2BN,CAAAA,CAAwBhB,EAA+B,CACpF,IAAM4B,EAAW,MAAM,IAAA,CAAK,wBAAwBZ,CAAc,CAAA,CAClE,GAAKY,CAAAA,CACL,CAAA,IAAA,IAAWrI,CAAAA,IAAOyG,EAAM,OAAO4B,CAAAA,CAASrI,CAAG,CAAA,CAC3C,MAAM,KAAK,0BAAA,CAA2ByH,CAAAA,CAAgBY,CAAQ,EAAA,CAClE,CAIA,MAAM,WAAWf,CAAAA,CAAkC,CAC/C,GAAM,CAACS,CAAG,EAAI,MAAM,IAAA,CAAK,EAAA,CACpB,MAAA,CAAO,CAAE,EAAA,CAAI,KAAK,MAAA,CAAO,aAAA,CAAc,EAAG,CAAC,CAAA,CAC3C,KAAK,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,CAC9B,KAAA,CAAML,cAAG,IAAA,CAAK,MAAA,CAAO,cAAc,MAAA,CAAQJ,CAAM,CAAC,CAAA,CAClD,KAAA,CAAM,CAAC,CAAA,CACZ,OAAO,CAAC,CAACS,CACb,CAEA,MAAM,UAAA,CAAWT,CAAAA,CAA+B,CAC5C,MAAM,IAAA,CAAK,sBAAA,CAAuBA,CAAM,EAC5C,CAIA,MAAM,kBAAA,CAAmBG,CAAAA,CAAqD,CAC1E,IAAMD,CAAAA,CAAe,MAAM,IAAA,CAAK,eAAA,CAAgBC,CAAc,CAAA,CAC9D,GAAI,CAACD,EAAc,MAAM,IAAI,MAAM,CAAA,aAAA,EAAgBC,CAAc,YAAY,CAAA,CAC7E,IAAMxJ,CAAAA,CAAW,MAAM,IAAA,CAAK,WAAA,CAAYwJ,CAAc,CAAA,CACtD,OAAO,CAAE,YAAA,CAAAD,CAAAA,CAAc,SAAAvJ,CAAAA,CAAU,UAAA,CAAY,IAAI,IAAO,CAC5D,CAEA,MAAM,kBAAA,CAAmBqJ,CAAAA,CAAgBxJ,EAA2C,CAChF,IAAMwK,EAAQ,MAAM,IAAA,CAAK,kBAAA,CAAmBhB,CAAAA,CAAQxJ,CAAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,CAC9E,OAAA,MAAM,KAAK,EAAA,CACN,MAAA,CAAO,KAAK,MAAA,CAAO,aAAa,CAAA,CAChC,GAAA,CAAI,CAAE,KAAA,CAAOA,EAAK,YAAA,CAAa,KAAA,CAAO,UAAWA,CAAAA,CAAK,YAAA,CAAa,SAAU,CAAC,CAAA,CAC9E,MAAM4J,aAAAA,CAAG,IAAA,CAAK,OAAO,aAAA,CAAc,EAAA,CAAIY,CAAK,CAAC,CAAA,CAClD,MAAM,IAAA,CAAK,gBAAA,CAAiBA,CAAAA,CAAOxK,CAAAA,CAAK,QAAQ,CAAA,CACzCwK,CACX,CACJ,MClSaC,CAAAA,CAAN,KAAsB,CACzB,WAAA,CAAoBC,CAAAA,CAA0B,CAA1B,IAAA,CAAA,OAAA,CAAAA,EAA4B,CAIhD,MAAM,OAAA,EAAyB,CAC3B,MAAM,IAAA,CAAK,OAAA,CAAQ,UACvB,CAEA,MAAM,UAAA,EAA4B,CAC9B,MAAM,KAAK,OAAA,CAAQ,UAAA,GACvB,CAEA,MAAM,aAAgC,CAClC,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAC9B,CAEA,MAAM,OAAuB,CACzB,MAAM,KAAK,OAAA,CAAQ,KAAA,GACvB,CAIA,MAAM,MAAA,CAAOlB,EAAgBmB,CAAAA,CAAwC,CACjE,OAAO,MAAM,IAAA,CAAK,QAAQ,kBAAA,CAAmBnB,CAAAA,CAAQ,CAAE,YAAA,CAAAmB,CAAa,CAAC,CACzE,CAEA,MAAM,gBAAgBhB,CAAAA,CAAsD,CACxE,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgBA,CAAc,CAC5D,CAEA,MAAM,iBAAA,CAAkBH,EAAgBhI,CAAAA,CAAgBqI,CAAAA,CAA0C,CAC9F,OAAO,MAAM,KAAK,OAAA,CAAQ,iBAAA,CAAkBL,EAAQhI,CAAAA,CAAOqI,CAAM,CACrE,CAEA,MAAM,mBAAmBF,CAAAA,CAAwBI,CAAAA,CAA+C,CAC5F,MAAM,IAAA,CAAK,OAAA,CAAQ,mBAAmBJ,CAAAA,CAAgBI,CAAO,EACjE,CAEA,MAAM,mBAAmBJ,CAAAA,CAAuC,CAC5D,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmBA,CAAc,EACxD,CAEA,MAAM,sBAAA,CAAuBH,CAAAA,CAA+B,CACxD,MAAM,IAAA,CAAK,OAAA,CAAQ,sBAAA,CAAuBA,CAAM,EACpD,CAEA,MAAM,kBAAA,CAAmBA,EAAiC,CACtD,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmBA,CAAM,CACvD,CAEA,MAAM,kBAAA,CAAmBG,CAAAA,CAA0C,CAC/D,OAAO,MAAM,KAAK,OAAA,CAAQ,kBAAA,CAAmBA,CAAc,CAC/D,CAEA,MAAM,oBAAoBH,CAAAA,CAAgBU,CAAAA,CAAwC,CAC9E,OAAO,MAAM,KAAK,OAAA,CAAQ,mBAAA,CAAoBV,CAAAA,CAAQU,CAAK,CAC/D,CAIA,MAAM,UAAA,CAAWP,CAAAA,CAAwBlG,EAAiC,CACtE,MAAM,KAAK,OAAA,CAAQ,WAAA,CAAYkG,CAAAA,CAAgBlG,CAAO,EAC1D,CAEA,MAAM,eAAA,CAAgBkG,CAAAA,CAAwBxJ,EAAoC,CAC9E,MAAM,KAAK,OAAA,CAAQ,gBAAA,CAAiBwJ,EAAgBxJ,CAAQ,EAChE,CAEA,MAAM,UAAA,CAAW8G,EAA4C,CACzD,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAWA,CAAS,CAClD,CAEA,MAAM,sBAAA,CAAuB0C,CAAAA,CAAwBnI,EAAgBqI,CAAAA,CAAqC,CACtG,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAYF,CAAAA,CAAgBnI,CAAAA,CAAOqI,CAAM,CACvE,CAEA,MAAM,iBAAA,CAAkBF,CAAAA,CAAwBW,EAA2C,CACvF,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkBX,EAAgBW,CAAI,CACpE,CAEA,MAAM,aAAA,CAAcrD,EAAmB8C,CAAAA,CAA0C,CAC7E,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc9C,EAAW8C,CAAO,EACvD,CAEA,MAAM,aAAA,CAAc9C,EAAkC,CAClD,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAcA,CAAS,EAC9C,CAEA,MAAM,kBAAkB0C,CAAAA,CAAuC,CAC3D,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkBA,CAAc,EACvD,CAEA,MAAM,aAAA,CAAcA,CAAAA,CAAyC,CACzD,OAAO,MAAM,KAAK,OAAA,CAAQ,aAAA,CAAcA,CAAc,CAC1D,CAEA,MAAM,eAAeA,CAAAA,CAAiD,CAClE,OAAO,MAAM,IAAA,CAAK,QAAQ,cAAA,CAAeA,CAAc,CAC3D,CAEA,MAAM,eAAeA,CAAAA,CAAwBO,CAAAA,CAAmC,CAC5E,OAAO,MAAM,KAAK,OAAA,CAAQ,cAAA,CAAeP,CAAAA,CAAgBO,CAAK,CAClE,CAIA,MAAM,0BAAA,CAA2BP,CAAAA,CAAwBF,EAAkD,CACvG,MAAM,KAAK,OAAA,CAAQ,0BAAA,CAA2BE,CAAAA,CAAgBF,CAAQ,EAC1E,CAEA,MAAM,uBAAA,CAAwBE,CAAAA,CAAiE,CAC3F,OAAO,MAAM,KAAK,OAAA,CAAQ,uBAAA,CAAwBA,CAAc,CACpE,CAEA,MAAM,2BAA2BA,CAAAA,CAAwBhB,CAAAA,CAA+B,CACpF,MAAM,IAAA,CAAK,QAAQ,0BAAA,CAA2BgB,CAAAA,CAAgBhB,CAAI,EACtE,CAIA,MAAM,WAAWa,CAAAA,CAAkC,CAC/C,OAAO,MAAM,IAAA,CAAK,QAAQ,UAAA,CAAWA,CAAM,CAC/C,CAEA,MAAM,UAAA,CAAWA,EAA+B,CAC5C,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAWA,CAAM,EACxC,CAIA,MAAM,kBAAA,CAAmBG,CAAAA,CAAqD,CAC1E,OAAO,MAAM,IAAA,CAAK,QAAQ,kBAAA,CAAmBA,CAAc,CAC/D,CAEA,MAAM,kBAAA,CAAmBH,CAAAA,CAAgBxJ,CAAAA,CAA2C,CAChF,OAAO,MAAM,IAAA,CAAK,QAAQ,kBAAA,CAAmBwJ,CAAAA,CAAQxJ,CAAI,CAC7D,CACJ,EC1IO,IAAM4K,EAAAA,CAAN,KAA+C,CAC1C,aAAA,CAA2C,IAAI,GAAA,CAC/C,QAAA,CAAmC,IAAI,GAAA,CAI/C,MAAM,OAAA,EAAyB,CAAE,CAEjC,MAAM,YAA4B,CAAE,CAEpC,MAAM,WAAA,EAAgC,CAClC,OAAO,KACX,CAEA,MAAM,KAAA,EAAuB,CACzB,IAAA,CAAK,cAAc,KAAA,EAAM,CACzB,KAAK,QAAA,CAAS,KAAA,GAClB,CAIA,MAAM,kBAAA,CAAmBpB,CAAAA,CAAgBC,CAAAA,CAAqD,CAC1F,IAAM5J,CAAAA,CAAK,CAAA,KAAA,EAAQ,KAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,OAAO,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAClE6J,CAAAA,CAA6B,CAC/B,EAAA,CAAA7J,CAAAA,CACA,MAAA,CAAA2J,CAAAA,CACA,QAAA,CAAUC,CAAAA,EAAY,EAAC,CACvB,SAAA,CAAW,IAAI,IAAA,CACf,SAAA,CAAW,IAAI,IACnB,CAAA,CACA,OAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI5J,CAAAA,CAAI6J,CAAY,CAAA,CACvC,IAAA,CAAK,SAAS,GAAA,CAAI7J,CAAAA,CAAI,EAAE,CAAA,CACjBA,CACX,CAEA,MAAM,eAAA,CAAgB8J,EAAsD,CACxE,OAAO,KAAK,aAAA,CAAc,GAAA,CAAIA,CAAc,CAAA,EAAK,IACrD,CAEA,MAAM,iBAAA,CAAkBH,EAAgBhI,CAAAA,CAAQ,EAAA,CAAIqI,EAAS,CAAA,CAA4B,CACrF,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,EACxC,MAAA,CAAOgB,CAAAA,EAAQA,EAAK,MAAA,GAAWrB,CAAM,EACrC,IAAA,CAAK,CAAC,CAAA,CAAGsB,CAAAA,GAAMA,CAAAA,CAAE,SAAA,CAAU,SAAQ,CAAI,CAAA,CAAE,UAAU,OAAA,EAAS,EAC5D,KAAA,CAAMjB,CAAAA,CAAQA,CAAAA,CAASrI,CAAK,CACrC,CAEA,MAAM,kBAAA,CAAmBmI,CAAAA,CAAwBI,EAA+C,CAC5F,IAAML,EAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAIC,CAAc,CAAA,CACtDD,CAAAA,EACA,OAAO,MAAA,CAAOA,CAAAA,CAAcK,EAAS,CAAE,SAAA,CAAW,IAAI,IAAO,CAAC,EAEtE,CAEA,MAAM,kBAAA,CAAmBJ,EAAuC,CAC5D,IAAA,CAAK,cAAc,MAAA,CAAOA,CAAc,EACxC,IAAA,CAAK,QAAA,CAAS,MAAA,CAAOA,CAAc,EACvC,CAEA,MAAM,sBAAA,CAAuBH,CAAAA,CAA+B,CACxD,IAAA,GAAW,CAAC3J,EAAIgL,CAAI,CAAA,GAAK,IAAA,CAAK,aAAA,CACtBA,CAAAA,CAAK,MAAA,GAAWrB,IAChB,IAAA,CAAK,aAAA,CAAc,OAAO3J,CAAE,CAAA,CAC5B,KAAK,QAAA,CAAS,MAAA,CAAOA,CAAE,CAAA,EAGnC,CAEA,MAAM,kBAAA,CAAmB2J,CAAAA,CAAiC,CACtD,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAOuB,GAAKA,CAAAA,CAAE,MAAA,GAAWvB,CAAM,CAAA,CAAE,MACpF,CAEA,MAAM,kBAAA,CAAmBG,CAAAA,CAA0C,CAC/D,OAAO,IAAA,CAAK,cAAc,GAAA,CAAIA,CAAc,CAChD,CAEA,MAAM,oBAAoBH,CAAAA,CAAgBU,CAAAA,CAAwC,CAC9E,IAAMc,CAAAA,CAAQd,CAAAA,CAAM,aAAY,CAChC,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,cAAc,MAAA,EAAQ,CAAA,CAAE,MAAA,CAC3Ca,CAAAA,EAAKA,CAAAA,CAAE,SAAWvB,CAAAA,EAAUuB,CAAAA,CAAE,OAAO,WAAA,EAAY,CAAE,SAASC,CAAK,CACrE,CACJ,CAIA,MAAM,WAAA,CAAYrB,EAAwBlG,CAAAA,CAAiC,CACvE,IAAMtD,CAAAA,CAAW,IAAA,CAAK,SAAS,GAAA,CAAIwJ,CAAc,CAAA,EAAK,EAAC,CACvDxJ,CAAAA,CAAS,KAAKsD,CAAO,CAAA,CACrB,KAAK,QAAA,CAAS,GAAA,CAAIkG,EAAgBxJ,CAAQ,CAAA,CAE1C,IAAMuJ,CAAAA,CAAe,IAAA,CAAK,aAAA,CAAc,IAAIC,CAAc,CAAA,CACtDD,IACAA,CAAAA,CAAa,SAAA,CAAY,IAAI,IAAA,EAErC,CAEA,MAAM,gBAAA,CAAiBC,CAAAA,CAAwBxJ,EAAoC,CAC/E,IAAA,IAAWsD,KAAWtD,CAAAA,CAClB,MAAM,KAAK,WAAA,CAAYwJ,CAAAA,CAAgBlG,CAAO,EAEtD,CAEA,MAAM,WAAWwD,CAAAA,CAA4C,CACzD,QAAW9G,CAAAA,IAAY,IAAA,CAAK,SAAS,MAAA,EAAO,CAAG,CAC3C,IAAM8K,CAAAA,CAAQ9K,CAAAA,CAAS,KAAK8I,CAAAA,EAAKA,CAAAA,CAAE,KAAOhC,CAAS,CAAA,CACnD,GAAIgE,CAAAA,CAAO,OAAOA,CACtB,CACA,OAAO,IACX,CAEA,MAAM,WAAA,CAAYtB,EAAwBnI,CAAAA,CAAQ,GAAA,CAAKqI,EAAS,CAAA,CAAuB,CAEnF,OAAA,CADiB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIF,CAAc,CAAA,EAAK,IACtC,KAAA,CAAME,CAAAA,CAAQA,EAASrI,CAAK,CAChD,CAEA,MAAM,iBAAA,CAAkBmI,CAAAA,CAAwBW,EAA2C,CAEvF,OAAA,CADiB,KAAK,QAAA,CAAS,GAAA,CAAIX,CAAc,CAAA,EAAK,EAAC,EACvC,MAAA,CAAOV,CAAAA,EAAKA,CAAAA,CAAE,OAASqB,CAAI,CAC/C,CAEA,MAAM,aAAA,CAAcrD,EAAmB8C,CAAAA,CAA0C,CAC7E,IAAA,IAAW5J,CAAAA,IAAY,IAAA,CAAK,QAAA,CAAS,QAAO,CAAG,CAC3C,IAAM+K,CAAAA,CAAQ/K,CAAAA,CAAS,UAAU8I,CAAAA,EAAKA,CAAAA,CAAE,KAAOhC,CAAS,CAAA,CACxD,GAAIiE,CAAAA,GAAU,EAAA,CAAI,CACd/K,CAAAA,CAAS+K,CAAK,EAAI,CAAE,GAAG/K,CAAAA,CAAS+K,CAAK,CAAA,CAAG,GAAGnB,CAAQ,CAAA,CACnD,KACJ,CACJ,CACJ,CAEA,MAAM,aAAA,CAAc9C,CAAAA,CAAkC,CAClD,IAAA,GAAW,CAACkE,CAAAA,CAAQhL,CAAQ,CAAA,GAAK,IAAA,CAAK,SAAU,CAC5C,IAAM+K,EAAQ/K,CAAAA,CAAS,SAAA,CAAU8I,CAAAA,EAAKA,CAAAA,CAAE,EAAA,GAAOhC,CAAS,EACxD,GAAIiE,CAAAA,GAAU,GAAI,CACd/K,CAAAA,CAAS,OAAO+K,CAAAA,CAAO,CAAC,CAAA,CACxB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIC,EAAQhL,CAAQ,CAAA,CAClC,KACJ,CACJ,CACJ,CAEA,MAAM,iBAAA,CAAkBwJ,CAAAA,CAAuC,CAC3D,IAAA,CAAK,QAAA,CAAS,IAAIA,CAAAA,CAAgB,EAAE,EACxC,CAEA,MAAM,aAAA,CAAcA,CAAAA,CAAyC,CACzD,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,IAAIA,CAAc,CAAA,EAAK,EAAC,EAAG,MACrD,CAEA,MAAM,cAAA,CAAeA,CAAAA,CAAiD,CAClE,IAAMxJ,CAAAA,CAAW,KAAK,QAAA,CAAS,GAAA,CAAIwJ,CAAc,CAAA,EAAK,GACtD,OAAOxJ,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,GAAK,IAC5C,CAEA,MAAM,cAAA,CAAewJ,CAAAA,CAAwBO,EAAmC,CAC5E,IAAMc,CAAAA,CAAQd,CAAAA,CAAM,WAAA,EAAY,CAEhC,QADiB,IAAA,CAAK,QAAA,CAAS,IAAIP,CAAc,CAAA,EAAK,EAAC,EACvC,MAAA,CACZV,CAAAA,EAAK,OAAOA,CAAAA,CAAE,OAAA,EAAY,UAAYA,CAAAA,CAAE,OAAA,CAAQ,aAAY,CAAE,QAAA,CAAS+B,CAAK,CAChF,CACJ,CAIA,MAAM,0BAAA,CAA2BrB,CAAAA,CAAwBF,EAAkD,CACvG,IAAMC,EAAe,IAAA,CAAK,aAAA,CAAc,IAAIC,CAAc,CAAA,CACtDD,CAAAA,GACAA,CAAAA,CAAa,QAAA,CAAW,CAAE,GAAGA,CAAAA,CAAa,QAAA,CAAU,GAAGD,CAAS,CAAA,CAChEC,EAAa,SAAA,CAAY,IAAI,IAAA,EAErC,CAEA,MAAM,uBAAA,CAAwBC,EAAiE,CAC3F,OAAO,KAAK,aAAA,CAAc,GAAA,CAAIA,CAAc,CAAA,EAAG,QAAA,EAAY,IAC/D,CAEA,MAAM,0BAAA,CAA2BA,EAAwBhB,CAAAA,CAA+B,CACpF,IAAMe,CAAAA,CAAe,IAAA,CAAK,cAAc,GAAA,CAAIC,CAAc,CAAA,CAC1D,GAAID,CAAAA,EAAc,QAAA,CAAU,CACxB,IAAA,IAAWxH,CAAAA,IAAOyG,EACd,OAAOe,CAAAA,CAAa,SAASxH,CAAG,CAAA,CAEpCwH,EAAa,SAAA,CAAY,IAAI,KACjC,CACJ,CAIA,MAAM,UAAA,CAAWF,CAAAA,CAAkC,CAC/C,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAKuB,GAAKA,CAAAA,CAAE,MAAA,GAAWvB,CAAM,CAChF,CAEA,MAAM,UAAA,CAAWA,CAAAA,CAA+B,CAC5C,MAAM,IAAA,CAAK,sBAAA,CAAuBA,CAAM,EAC5C,CAIA,MAAM,kBAAA,CAAmBG,CAAAA,CAAqD,CAC1E,IAAMD,CAAAA,CAAe,MAAM,KAAK,eAAA,CAAgBC,CAAc,EAC9D,GAAI,CAACD,EAAc,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgBC,CAAc,CAAA,UAAA,CAAY,EAC7E,IAAMxJ,CAAAA,CAAW,MAAM,IAAA,CAAK,WAAA,CAAYwJ,CAAc,CAAA,CACtD,OAAO,CAAE,YAAA,CAAAD,CAAAA,CAAc,QAAA,CAAAvJ,EAAU,UAAA,CAAY,IAAI,IAAO,CAC5D,CAEA,MAAM,kBAAA,CAAmBqJ,CAAAA,CAAgBxJ,CAAAA,CAA2C,CAChF,IAAMwK,CAAAA,CAAQ,MAAM,IAAA,CAAK,kBAAA,CAAmBhB,EAAQxJ,CAAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,CACxE6K,CAAAA,CAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAIL,CAAK,EACzC,OAAAK,CAAAA,CAAK,MAAQ7K,CAAAA,CAAK,YAAA,CAAa,MAC/B6K,CAAAA,CAAK,SAAA,CAAY7K,EAAK,YAAA,CAAa,SAAA,CACnC,MAAM,IAAA,CAAK,gBAAA,CAAiBwK,EAAOxK,CAAAA,CAAK,QAAQ,EACzCwK,CACX,CACJ,ECpNO,IAAMY,EAAAA,CAAN,KAA+C,CAClD,WAAA,CAAoBC,CAAAA,CAAa,CAAb,IAAA,CAAA,MAAA,CAAAA,EAAe,CAInC,MAAM,OAAA,EAAyB,CAC3B,MAAM,IAAA,CAAK,MAAA,CAAO,WACtB,CAEA,MAAM,UAAA,EAA4B,CAC9B,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,GACtB,CAEA,MAAM,aAAgC,CAClC,GAAI,CACA,OAAA,MAAM,IAAA,CAAK,OAAO,SAAA,CAAA,QAAA,CAAA,CACX,CAAA,CACX,CAAA,KAAQ,CACJ,OAAO,MACX,CACJ,CAEA,MAAM,OAAuB,CACzB,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAA,EAAW,CACrC,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA,GACnC,CAIA,MAAM,mBAAmB7B,CAAAA,CAAgBC,CAAAA,CAAqD,CAI1F,OAAA,CAHqB,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,MAAA,CAAO,CACvD,IAAA,CAAM,CAAE,OAAAD,CAAAA,CAAQ,QAAA,CAAUC,CAAAA,EAAY,EAAG,CAC7C,CAAC,CAAA,EACmB,EACxB,CAEA,MAAM,eAAA,CAAgBE,EAAsD,CACxE,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,aAAa,UAAA,CAAW,CAC7C,MAAO,CAAE,EAAA,CAAIA,CAAe,CAChC,CAAC,CACL,CAEA,MAAM,iBAAA,CAAkBH,EAAgBhI,CAAAA,CAAQ,EAAA,CAAIqI,EAAS,CAAA,CAA4B,CACrF,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,QAAA,CAAS,CAC3C,MAAO,CAAE,MAAA,CAAAL,CAAO,CAAA,CAChB,OAAA,CAAS,CAAE,SAAA,CAAW,MAAO,CAAA,CAC7B,IAAA,CAAMhI,CAAAA,CACN,IAAA,CAAMqI,CACV,CAAC,CACL,CAEA,MAAM,kBAAA,CAAmBF,EAAwBI,CAAAA,CAA+C,CAC5F,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,OAAO,CAClC,KAAA,CAAO,CAAE,EAAA,CAAIJ,CAAe,EAC5B,IAAA,CAAM,CAAE,GAAGI,CAAAA,CAAS,SAAA,CAAW,IAAI,IAAO,CAC9C,CAAC,EACL,CAEA,MAAM,mBAAmBJ,CAAAA,CAAuC,CAC5D,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,OAAO,CAClC,KAAA,CAAO,CAAE,EAAA,CAAIA,CAAe,CAChC,CAAC,EACL,CAEA,MAAM,sBAAA,CAAuBH,CAAAA,CAA+B,CACxD,IAAM8B,CAAAA,CAAgB,MAAM,IAAA,CAAK,MAAA,CAAO,aAAa,QAAA,CAAS,CAC1D,MAAO,CAAE,MAAA,CAAA9B,CAAO,CAAA,CAChB,MAAA,CAAQ,CAAE,EAAA,CAAI,IAAK,CACvB,CAAC,CAAA,CAED,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CACjC,KAAA,CAAO,CAAE,cAAA,CAAgB,CAAE,GAAI8B,CAAAA,CAAc,GAAA,CAAKP,CAAAA,EAAWA,CAAAA,CAAE,EAAE,CAAE,CAAE,CACzE,CAAC,EAED,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA,CAAW,CAAE,KAAA,CAAO,CAAE,MAAA,CAAAvB,CAAO,CAAE,CAAC,EACnE,CAEA,MAAM,mBAAmBA,CAAAA,CAAiC,CACtD,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,aAAa,KAAA,CAAM,CAAE,MAAO,CAAE,MAAA,CAAAA,CAAO,CAAE,CAAC,CACrE,CAEA,MAAM,kBAAA,CAAmBG,EAA0C,CAI/D,OAHc,MAAM,IAAA,CAAK,MAAA,CAAO,aAAa,KAAA,CAAM,CAC/C,KAAA,CAAO,CAAE,EAAA,CAAIA,CAAe,CAChC,CAAC,CAAA,CACc,CACnB,CAEA,MAAM,oBAAoBH,CAAAA,CAAgBU,CAAAA,CAAwC,CAC9E,OAAO,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,QAAA,CAAS,CAC3C,KAAA,CAAO,CACH,OAAAV,CAAAA,CACA,KAAA,CAAO,CAAE,QAAA,CAAUU,CAAAA,CAAO,IAAA,CAAM,aAAc,CAClD,CAAA,CACA,QAAS,CAAE,SAAA,CAAW,MAAO,CACjC,CAAC,CACL,CAIQ,SAAA,CAAU9J,CAAAA,CAAmB,CACjC,OAAO,CACH,GAAIA,CAAAA,CAAI,EAAA,CACR,KAAMA,CAAAA,CAAI,IAAA,CACV,OAAA,CAASA,CAAAA,CAAI,OAAA,CACb,SAAA,CAAWA,EAAI,SAAA,CACf,WAAA,CAAaA,EAAI,WAAA,CACjB,QAAA,CAAUA,EAAI,QAAA,CACd,SAAA,CAAWA,CAAAA,CAAI,SACnB,CACJ,CAEA,MAAM,WAAA,CAAYuJ,CAAAA,CAAwBlG,EAAiC,CACvE,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAC7B,IAAA,CAAM,CACF,GAAIA,CAAAA,CAAQ,EAAA,CACZ,eAAAkG,CAAAA,CACA,IAAA,CAAMlG,EAAQ,IAAA,CACd,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,SAAA,CAAWA,CAAAA,CAAQ,WAAa,EAAC,CACjC,YAAaA,CAAAA,CAAQ,WAAA,EAAe,EAAC,CACrC,QAAA,CAAUA,CAAAA,CAAQ,QAAA,EAAY,EAAC,CAC/B,UAAWA,CAAAA,CAAQ,SAAA,EAAa,KAAK,GAAA,EACzC,CACJ,CAAC,CAAA,CAED,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,OAAO,CAClC,KAAA,CAAO,CAAE,EAAA,CAAIkG,CAAe,EAC5B,IAAA,CAAM,CAAE,UAAW,IAAI,IAAO,CAClC,CAAC,EACL,CAEA,MAAM,gBAAA,CAAiBA,EAAwBxJ,CAAAA,CAAoC,CAC3EA,CAAAA,CAAS,MAAA,GAAW,CAAA,GAExB,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CACjC,IAAA,CAAMA,EAAS,GAAA,CAAI8I,CAAAA,GAAM,CACrB,EAAA,CAAIA,CAAAA,CAAE,EAAA,CACN,eAAAU,CAAAA,CACA,IAAA,CAAMV,EAAE,IAAA,CACR,OAAA,CAASA,EAAE,OAAA,CACX,SAAA,CAAWA,CAAAA,CAAE,SAAA,EAAa,EAAC,CAC3B,YAAaA,CAAAA,CAAE,WAAA,EAAe,EAAC,CAC/B,QAAA,CAAUA,EAAE,QAAA,EAAY,EAAC,CACzB,SAAA,CAAWA,CAAAA,CAAE,SAAA,EAAa,KAAK,GAAA,EACnC,EAAE,CACN,CAAC,EAED,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,CAClC,MAAO,CAAE,EAAA,CAAIU,CAAe,CAAA,CAC5B,IAAA,CAAM,CAAE,SAAA,CAAW,IAAI,IAAO,CAClC,CAAC,CAAA,EACL,CAEA,MAAM,UAAA,CAAW1C,EAA4C,CACzD,IAAM7G,EAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,CAAE,MAAO,CAAE,EAAA,CAAI6G,CAAU,CAAE,CAAC,EAC7E,OAAO7G,CAAAA,CAAM,KAAK,SAAA,CAAUA,CAAG,EAAI,IACvC,CAEA,MAAM,WAAA,CAAYuJ,CAAAA,CAAwBnI,EAAQ,GAAA,CAAKqI,CAAAA,CAAS,CAAA,CAAuB,CAOnF,OAAA,CANiB,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAChD,KAAA,CAAO,CAAE,cAAA,CAAAF,CAAe,CAAA,CACxB,OAAA,CAAS,CAAE,SAAA,CAAW,KAAM,CAAA,CAC5B,IAAA,CAAMnI,EACN,IAAA,CAAMqI,CACV,CAAC,CAAA,EACe,GAAA,CAAI,IAAA,CAAK,SAAS,CACtC,CAEA,MAAM,iBAAA,CAAkBF,CAAAA,CAAwBW,EAA2C,CAKvF,OAAA,CAJiB,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,CAChD,KAAA,CAAO,CAAE,cAAA,CAAAX,CAAAA,CAAgB,KAAAW,CAAK,CAAA,CAC9B,QAAS,CAAE,SAAA,CAAW,KAAM,CAChC,CAAC,CAAA,EACe,IAAI,IAAA,CAAK,SAAS,CACtC,CAEA,MAAM,cAAcrD,CAAAA,CAAmB8C,CAAAA,CAA0C,CAC7E,MAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,MAAA,CAAO,CAC7B,MAAO,CAAE,EAAA,CAAI9C,CAAU,CAAA,CACvB,IAAA,CAAM8C,CACV,CAAC,EACL,CAEA,MAAM,aAAA,CAAc9C,CAAAA,CAAkC,CAClD,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAE,KAAA,CAAO,CAAE,GAAIA,CAAU,CAAE,CAAC,EACjE,CAEA,MAAM,iBAAA,CAAkB0C,CAAAA,CAAuC,CAC3D,MAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,UAAA,CAAW,CAAE,MAAO,CAAE,cAAA,CAAAA,CAAe,CAAE,CAAC,EACtE,CAEA,MAAM,aAAA,CAAcA,EAAyC,CACzD,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAA,CAAM,CAAE,KAAA,CAAO,CAAE,cAAA,CAAAA,CAAe,CAAE,CAAC,CACxE,CAEA,MAAM,cAAA,CAAeA,EAAiD,CAClE,IAAMvJ,CAAAA,CAAM,MAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,SAAA,CAAU,CAC5C,MAAO,CAAE,cAAA,CAAAuJ,CAAe,CAAA,CACxB,OAAA,CAAS,CAAE,SAAA,CAAW,MAAO,CACjC,CAAC,CAAA,CACD,OAAOvJ,EAAM,IAAA,CAAK,SAAA,CAAUA,CAAG,CAAA,CAAI,IACvC,CAEA,MAAM,cAAA,CAAeuJ,CAAAA,CAAwBO,EAAmC,CAQ5E,OAAA,CAPiB,MAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,QAAA,CAAS,CAChD,KAAA,CAAO,CACH,cAAA,CAAAP,CAAAA,CACA,QAAS,CAAE,QAAA,CAAUO,EAAO,IAAA,CAAM,aAAc,CACpD,CAAA,CACA,OAAA,CAAS,CAAE,SAAA,CAAW,KAAM,CAChC,CAAC,CAAA,EACe,IAAI,IAAA,CAAK,SAAS,CACtC,CAIA,MAAM,0BAAA,CAA2BP,CAAAA,CAAwBF,CAAAA,CAAkD,CACvG,MAAM,IAAA,CAAK,MAAA,CAAO,aAAa,MAAA,CAAO,CAClC,MAAO,CAAE,EAAA,CAAIE,CAAe,CAAA,CAC5B,IAAA,CAAM,CAAE,SAAAF,CAAAA,CAAU,SAAA,CAAW,IAAI,IAAO,CAC5C,CAAC,EACL,CAEA,MAAM,uBAAA,CAAwBE,CAAAA,CAAiE,CAK3F,QAJa,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA,CAAW,CACnD,KAAA,CAAO,CAAE,EAAA,CAAIA,CAAe,CAAA,CAC5B,MAAA,CAAQ,CAAE,QAAA,CAAU,IAAK,CAC7B,CAAC,CAAA,GACY,UAAY,IAC7B,CAEA,MAAM,0BAAA,CAA2BA,CAAAA,CAAwBhB,CAAAA,CAA+B,CACpF,IAAM4B,CAAAA,CAAW,MAAM,IAAA,CAAK,uBAAA,CAAwBZ,CAAc,CAAA,CAClE,GAAKY,CAAAA,CACL,CAAA,IAAA,IAAWrI,CAAAA,IAAOyG,CAAAA,CAAM,OAAO4B,CAAAA,CAASrI,CAAG,EAC3C,MAAM,IAAA,CAAK,2BAA2ByH,CAAAA,CAAgBY,CAAQ,EAAA,CAClE,CAIA,MAAM,UAAA,CAAWf,EAAkC,CAE/C,OADc,MAAM,IAAA,CAAK,MAAA,CAAO,aAAa,KAAA,CAAM,CAAE,MAAO,CAAE,MAAA,CAAAA,CAAO,CAAE,CAAC,EACzD,CACnB,CAEA,MAAM,UAAA,CAAWA,CAAAA,CAA+B,CAC5C,MAAM,IAAA,CAAK,sBAAA,CAAuBA,CAAM,EAC5C,CAIA,MAAM,kBAAA,CAAmBG,CAAAA,CAAqD,CAC1E,IAAMD,CAAAA,CAAe,MAAM,IAAA,CAAK,eAAA,CAAgBC,CAAc,EAC9D,GAAI,CAACD,EAAc,MAAM,IAAI,MAAM,CAAA,aAAA,EAAgBC,CAAc,CAAA,UAAA,CAAY,CAAA,CAC7E,IAAMxJ,CAAAA,CAAW,MAAM,IAAA,CAAK,WAAA,CAAYwJ,CAAc,CAAA,CACtD,OAAO,CAAE,YAAA,CAAAD,CAAAA,CAAc,QAAA,CAAAvJ,CAAAA,CAAU,UAAA,CAAY,IAAI,IAAO,CAC5D,CAEA,MAAM,kBAAA,CAAmBqJ,CAAAA,CAAgBxJ,EAA2C,CAChF,IAAMwK,CAAAA,CAAQ,MAAM,IAAA,CAAK,kBAAA,CAAmBhB,EAAQxJ,CAAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,CAC9E,OAAA,MAAM,KAAK,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,CAClC,KAAA,CAAO,CAAE,GAAIwK,CAAM,CAAA,CACnB,KAAM,CAAE,KAAA,CAAOxK,EAAK,YAAA,CAAa,KAAA,CAAO,SAAA,CAAWA,CAAAA,CAAK,YAAA,CAAa,SAAU,CACnF,CAAC,CAAA,CACD,MAAM,IAAA,CAAK,gBAAA,CAAiBwK,EAAOxK,CAAAA,CAAK,QAAQ,EACzCwK,CACX,CACJ,ECjQO,IAAMe,CAAAA,CAAN,cAA4B5I,mBAAa,CAG5C,WAAA,CAAoB6I,CAAAA,CAAmB,CACnC,KAAA,GADgB,IAAA,CAAA,MAAA,CAAAA,EAEpB,CAJA,OAAA,CAA+B,IAAI,IAQnC,MAAM,YAAA,CACFhC,CAAAA,CACAT,CAAAA,CACAU,CAAAA,CACAlJ,CAAAA,CACe,CACf,IAAMkL,CAAAA,CAAW9L,EAAW,QAAQ,CAAA,CAC9BkD,EAAM,IAAA,CAAK,GAAA,EAAI,CAEf6I,CAAAA,CAAiB,CACnB,EAAA,CAAID,EACJ,MAAA,CAAAjC,CAAAA,CACA,SAAU,EAAC,CACX,OAAAT,CAAAA,CACA,QAAA,CAAUU,CAAAA,EAAY,EAAC,CACvB,IAAA,CAAMlJ,GAAS,IAAA,EAAQ,GACvB,KAAA,CAAOA,CAAAA,EAAS,MAChB,SAAA,CAAWsC,CAAAA,CACX,SAAA,CAAWA,CAAAA,CACX,YAAA,CAAcA,CAAAA,CACd,OAAQ,QAAA,CACR,QAAA,CAAUtC,GAAS,QAAA,EAAY,QAAA,CAC/B,aAAc,CAAA,CACd,UAAA,CAAY,CAChB,CAAA,CAEA,OAAA,IAAA,CAAK,OAAA,CAAQ,IAAIkL,CAAAA,CAAUC,CAAM,EACjC,IAAA,CAAK,IAAA,CAAK,QAAS,CAAE,IAAA,CAAM,gBAAA,CAAkB,QAAA,CAAAD,CAAAA,CAAU,MAAA,CAAAC,CAAO,CAAgB,CAAA,CAEvED,CACX,CAKA,MAAM,WACFA,CAAAA,CACAE,CAAAA,CACe,CACf,IAAMD,CAAAA,CAAS,KAAK,aAAA,CAAcD,CAAQ,EAEtCtL,CAAAA,CAAW,CAAC,GAAGuL,CAAAA,CAAO,QAAQ,CAAA,CAClC,GAAIC,CAAAA,CAAe,CACf,IAAMC,CAAAA,CAAMzL,CAAAA,CAAS,UAAU8I,CAAAA,EAAKA,CAAAA,CAAE,KAAO0C,CAAa,CAAA,CACtDC,CAAAA,GAAQ,EAAA,GAAIzL,CAAAA,CAAWA,CAAAA,CAAS,MAAM,CAAA,CAAGyL,CAAAA,CAAM,CAAC,CAAA,EACxD,CAEA,IAAMpB,CAAAA,CAAQ,MAAM,IAAA,CAAK,YAAA,CAAakB,CAAAA,CAAO,MAAA,CAAQA,EAAO,MAAA,CAAQ,CAAE,GAAGA,CAAAA,CAAO,QAAS,CAAC,CAAA,CACpFG,CAAAA,CAAY,IAAA,CAAK,aAAA,CAAcrB,CAAK,CAAA,CAC1C,OAAAqB,CAAAA,CAAU,QAAA,CAAW1L,EAAS,GAAA,CAAI8I,CAAAA,GAAM,CAAE,GAAGA,CAAE,CAAA,CAAE,CAAA,CACjD4C,CAAAA,CAAU,YAAA,CAAe1L,EAAS,MAAA,CAClC0L,CAAAA,CAAU,KAAO,CAAC,GAAGH,EAAO,IAAI,CAAA,CAChCG,CAAAA,CAAU,KAAA,CAAQH,CAAAA,CAAO,KAAA,CAAQ,WAAWA,CAAAA,CAAO,KAAK,GAAK,MAAA,CAE7D,IAAA,CAAK,KAAK,OAAA,CAAS,CAAE,IAAA,CAAM,eAAA,CAAiB,QAAA,CAAUlB,CAAAA,CAAO,eAAgBiB,CAAS,CAAgB,EAE/FjB,CACX,CAKA,MAAM,WAAA,CAAYsB,CAAAA,CAAwBC,EAAuC,CAC7E,IAAMhK,EAAS,IAAA,CAAK,aAAA,CAAc+J,CAAc,CAAA,CAC1C7J,CAAAA,CAAS,KAAK,aAAA,CAAc8J,CAAc,CAAA,CAE1CC,CAAAA,CAAS,CAAC,GAAGjK,EAAO,QAAA,CAAU,GAAGE,EAAO,QAAQ,CAAA,CAAE,KACpD,CAACgK,CAAAA,CAAGnB,CAAAA,GAAAA,CAAOmB,CAAAA,CAAE,SAAA,EAAa,CAAA,GAAMnB,EAAE,SAAA,EAAa,CAAA,CACnD,EAEA/I,CAAAA,CAAO,QAAA,CAAWiK,EAClBjK,CAAAA,CAAO,YAAA,CAAeiK,CAAAA,CAAO,MAAA,CAC7BjK,CAAAA,CAAO,SAAA,CAAY,KAAK,GAAA,EAAI,CAE5B,KAAK,IAAA,CAAK,OAAA,CAAS,CAAE,IAAA,CAAM,eAAA,CAAiB,QAAA,CAAU+J,CAAAA,CAAgB,cAAA,CAAAC,CAAe,CAAgB,EACzG,CAIA,UAAUN,CAAAA,CAAiC,CACvC,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAIA,CAAQ,CAAA,EAAK,IACzC,CAEA,YAAA,CAAaA,CAAAA,CAA2B,CACpC,OAAO,IAAA,CAAK,QAAQ,GAAA,CAAIA,CAAQ,CACpC,CAEA,cAAA,CACIjC,CAAAA,CACAjJ,EACQ,CACR,IAAI8E,EAAU,KAAA,CAAM,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAOuC,CAAAA,EAAKA,EAAE,MAAA,GAAW4B,CAAM,EAE/EnE,CAAAA,CAAU,IAAA,CAAK,YAAYA,CAAAA,CAAS9E,CAAAA,EAAS,IAAI,CAAA,CAEjD,IAAMsJ,EAAStJ,CAAAA,EAAS,MAAA,EAAU,EAC5BiB,CAAAA,CAAQjB,CAAAA,EAAS,OAAS8E,CAAAA,CAAQ,MAAA,CACxC,OAAOA,CAAAA,CAAQ,KAAA,CAAMwE,CAAAA,CAAQA,EAASrI,CAAK,CAC/C,CAEA,aAAA,CACIgI,CAAAA,CACA0C,EACA3L,CAAAA,CACQ,CACR,IAAI8E,CAAAA,CAAU,KAAA,CAAM,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAOuC,GAAKA,CAAAA,CAAE,MAAA,GAAW4B,CAAM,CAAA,CAE/E,GAAI0C,CAAAA,CAAO,OAAQ,CACf,IAAMC,EAAW,KAAA,CAAM,OAAA,CAAQD,EAAO,MAAM,CAAA,CAAIA,CAAAA,CAAO,MAAA,CAAS,CAACA,CAAAA,CAAO,MAAM,CAAA,CAC9E7G,CAAAA,CAAUA,EAAQ,MAAA,CAAOuC,CAAAA,EAAKuE,EAAS,QAAA,CAASvE,CAAAA,CAAE,MAAM,CAAC,EAC7D,CAgBA,GAfIsE,CAAAA,CAAO,QAAA,GACP7G,EAAUA,CAAAA,CAAQ,MAAA,CAAOuC,GAAKA,CAAAA,CAAE,QAAA,GAAasE,CAAAA,CAAO,QAAQ,CAAA,CAAA,CAE5DA,CAAAA,CAAO,MAAM,MAAA,GACb7G,CAAAA,CAAUA,EAAQ,MAAA,CAAOuC,CAAAA,EAAKsE,EAAO,IAAA,CAAM,KAAA,CAAME,CAAAA,EAAOxE,CAAAA,CAAE,IAAA,CAAK,QAAA,CAASwE,CAAG,CAAC,CAAC,GAE7EF,CAAAA,CAAO,YAAA,GAAiB,SACxB7G,CAAAA,CAAUA,CAAAA,CAAQ,OAAOuC,CAAAA,EAAKA,CAAAA,CAAE,WAAasE,CAAAA,CAAO,YAAa,GAEjEA,CAAAA,CAAO,aAAA,GAAkB,SACzB7G,CAAAA,CAAUA,CAAAA,CAAQ,MAAA,CAAOuC,CAAAA,EAAKA,CAAAA,CAAE,SAAA,EAAasE,EAAO,aAAc,CAAA,CAAA,CAElEA,EAAO,YAAA,GAAiB,MAAA,GACxB7G,EAAUA,CAAAA,CAAQ,MAAA,CAAOuC,CAAAA,EAAKA,CAAAA,CAAE,SAAA,EAAasE,CAAAA,CAAO,YAAa,CAAA,CAAA,CAEjEA,CAAAA,CAAO,OAAQ,CACf,IAAMG,EAAIH,CAAAA,CAAO,MAAA,CAAO,WAAA,EAAY,CACpC7G,CAAAA,CAAUA,CAAAA,CAAQ,OACduC,CAAAA,EACIA,CAAAA,CAAE,OAAO,WAAA,EAAY,CAAE,SAASyE,CAAC,CAAA,EACjCzE,CAAAA,CAAE,QAAA,CAAS,IAAA,CAAKqB,CAAAA,EAAK,OAAOA,CAAAA,CAAE,OAAA,EAAY,UAAYA,CAAAA,CAAE,OAAA,CAAQ,aAAY,CAAE,QAAA,CAASoD,CAAC,CAAC,CACjG,EACJ,CAEAhH,CAAAA,CAAU,IAAA,CAAK,YAAYA,CAAAA,CAAS9E,CAAAA,EAAS,IAAI,CAAA,CAEjD,IAAMsJ,CAAAA,CAAStJ,CAAAA,EAAS,MAAA,EAAU,CAAA,CAC5BiB,EAAQjB,CAAAA,EAAS,KAAA,EAAS8E,EAAQ,MAAA,CACxC,OAAOA,EAAQ,KAAA,CAAMwE,CAAAA,CAAQA,CAAAA,CAASrI,CAAK,CAC/C,CAEA,aAAagI,CAAAA,CAAgB0C,CAAAA,CAA+B,CACxD,OAAO,IAAA,CAAK,cAAc1C,CAAAA,CAAQ0C,CAAAA,EAAU,EAAE,CAAA,CAAE,MACpD,CAIA,kBAAA,CAAmBT,EAAkB5H,CAAAA,CAAgC,CACjE,IAAM6H,CAAAA,CAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,CAAA,CACpCa,CAAAA,CAAiBZ,EAAO,MAAA,CAC9BA,CAAAA,CAAO,OAAS7H,CAAAA,CAChB6H,CAAAA,CAAO,UAAY,IAAA,CAAK,GAAA,EAAI,CAC5B,IAAA,CAAK,IAAA,CAAK,OAAA,CAAS,CAAE,IAAA,CAAM,gBAAA,CAAkB,SAAAD,CAAAA,CAAU,MAAA,CAAA5H,EAAQ,cAAA,CAAAyI,CAAe,CAAgB,EAClG,CAEA,oBAAA,CAAqBb,EAAkBc,CAAAA,CAAoC,CACvE,IAAMb,CAAAA,CAAS,IAAA,CAAK,cAAcD,CAAQ,CAAA,CAC1CC,CAAAA,CAAO,QAAA,CAAWa,CAAAA,CAClBb,CAAAA,CAAO,UAAY,IAAA,CAAK,GAAA,GACxB,IAAA,CAAK,IAAA,CAAK,QAAS,CAAE,IAAA,CAAM,kBAAA,CAAoB,QAAA,CAAAD,CAAAA,CAAU,QAAA,CAAAc,CAAS,CAAgB,EACtF,CAEA,oBAAA,CAAqBd,CAAAA,CAAkBhC,EAAyC,CAC5E,IAAMiC,CAAAA,CAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,EAC1CC,CAAAA,CAAO,QAAA,CAAW,CAAE,GAAGA,CAAAA,CAAO,SAAU,GAAGjC,CAAS,CAAA,CACpDiC,CAAAA,CAAO,SAAA,CAAY,IAAA,CAAK,KAAI,CAC5B,IAAA,CAAK,KAAK,OAAA,CAAS,CAAE,KAAM,kBAAA,CAAoB,QAAA,CAAAD,EAAU,QAAA,CAAUC,CAAAA,CAAO,QAAS,CAAgB,EACvG,CAEA,cAAA,CAAeD,CAAAA,CAAkBe,EAAqB,CAClD,IAAMd,CAAAA,CAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,EAC1CC,CAAAA,CAAO,KAAA,CAAQc,EACfd,CAAAA,CAAO,SAAA,CAAY,KAAK,GAAA,EAAI,CAC5B,IAAA,CAAK,IAAA,CAAK,OAAA,CAAS,CAAE,KAAM,eAAA,CAAiB,QAAA,CAAAD,EAAU,KAAA,CAAAe,CAAM,CAAgB,EAChF,CAEA,kBAAA,CAAmBf,CAAAA,CAAkB1C,CAAAA,CAAmC,CACpE,IAAM2C,CAAAA,CAAS,IAAA,CAAK,cAAcD,CAAQ,CAAA,CAC1CC,EAAO,MAAA,CAAS,CAAE,GAAGA,CAAAA,CAAO,MAAA,CAAQ,GAAG3C,CAAO,CAAA,CAC9C2C,CAAAA,CAAO,UAAY,IAAA,CAAK,GAAA,GACxB,IAAA,CAAK,IAAA,CAAK,OAAA,CAAS,CAAE,IAAA,CAAM,gBAAA,CAAkB,SAAAD,CAAAA,CAAU,MAAA,CAAQC,EAAO,MAAO,CAAgB,EACjG,CAIA,OAAA,CAAQD,CAAAA,CAAkBgB,CAAAA,CAAsB,CAC5C,IAAMf,EAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,CAAA,CAC1CC,CAAAA,CAAO,KAAO,CAAC,GAAG,IAAI,GAAA,CAAI,CAAC,GAAGA,EAAO,IAAA,CAAM,GAAGe,CAAI,CAAC,CAAC,EACpDf,CAAAA,CAAO,SAAA,CAAY,KAAK,GAAA,EAAI,CAC5B,KAAK,IAAA,CAAK,OAAA,CAAS,CAAE,IAAA,CAAM,cAAA,CAAgB,SAAAD,CAAAA,CAAU,IAAA,CAAMC,CAAAA,CAAO,IAAK,CAAgB,EAC3F,CAEA,UAAA,CAAWD,CAAAA,CAAkBgB,EAAsB,CAC/C,IAAMf,EAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,CAAA,CAC1CC,CAAAA,CAAO,IAAA,CAAOA,EAAO,IAAA,CAAK,MAAA,CAAO9D,GAAK,CAAC6E,CAAAA,CAAK,SAAS7E,CAAC,CAAC,CAAA,CACvD8D,CAAAA,CAAO,SAAA,CAAY,IAAA,CAAK,KAAI,CAC5B,IAAA,CAAK,KAAK,OAAA,CAAS,CAAE,KAAM,cAAA,CAAgB,QAAA,CAAAD,CAAAA,CAAU,IAAA,CAAMC,CAAAA,CAAO,IAAK,CAAgB,EAC3F,CAEA,QAAQD,CAAAA,CAAkBgB,CAAAA,CAAsB,CAC5C,IAAMf,CAAAA,CAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,CAAA,CAC1CC,EAAO,IAAA,CAAO,CAAC,GAAG,IAAI,GAAA,CAAIe,CAAI,CAAC,CAAA,CAC/Bf,CAAAA,CAAO,SAAA,CAAY,IAAA,CAAK,GAAA,GACxB,IAAA,CAAK,IAAA,CAAK,QAAS,CAAE,IAAA,CAAM,eAAgB,QAAA,CAAAD,CAAAA,CAAU,IAAA,CAAMC,CAAAA,CAAO,IAAK,CAAgB,EAC3F,CAIA,MAAM,WAAWD,CAAAA,CAAkBhI,CAAAA,CAAiC,CAChE,IAAMiI,CAAAA,CAAS,KAAK,aAAA,CAAcD,CAAQ,EACpC5I,CAAAA,CAAM,IAAA,CAAK,KAAI,CAEf6J,CAAAA,CAAuB,CACzB,GAAGjJ,CAAAA,CACH,EAAA,CAAIA,CAAAA,CAAQ,EAAA,EAAM9D,CAAAA,CAAW,KAAK,CAAA,CAClC,SAAA,CAAW8D,EAAQ,SAAA,EAAaZ,CACpC,EAEA6I,CAAAA,CAAO,QAAA,CAAS,IAAA,CAAKgB,CAAW,CAAA,CAChChB,CAAAA,CAAO,aAAeA,CAAAA,CAAO,QAAA,CAAS,OACtCA,CAAAA,CAAO,SAAA,CAAY7I,EACnB6I,CAAAA,CAAO,YAAA,CAAe7I,CAAAA,CAEtB,IAAA,CAAK,IAAA,CAAK,OAAA,CAAS,CAAE,IAAA,CAAM,eAAA,CAAiB,SAAA4I,CAAAA,CAAU,OAAA,CAASiB,CAAY,CAAgB,EAC/F,CAEA,MAAM,eAAA,CAAgBjB,CAAAA,CAAkBtL,EAAoC,CACxE,IAAA,IAAWsD,KAAWtD,CAAAA,CAClB,MAAM,KAAK,UAAA,CAAWsL,CAAAA,CAAUhI,CAAO,EAE/C,CAEA,UAAA,CAAWgI,EAAkBxE,CAAAA,CAAmC,CAE5D,OADe,IAAA,CAAK,aAAA,CAAcwE,CAAQ,CAAA,CAC5B,QAAA,CAAS,IAAA,CAAKxC,CAAAA,EAAKA,CAAAA,CAAE,EAAA,GAAOhC,CAAS,CAAA,EAAK,IAC5D,CAEA,WAAA,CACIwE,CAAAA,CACAlL,EACS,CAET,IAAIJ,CAAAA,CAAW,CAAC,GADD,IAAA,CAAK,cAAcsL,CAAQ,CAAA,CAChB,QAAQ,CAAA,CAE9BlL,CAAAA,EAAS,OACTJ,CAAAA,CAAWA,CAAAA,CAAS,OAAO8I,CAAAA,EAAKA,CAAAA,CAAE,OAAS1I,CAAAA,CAAQ,IAAI,GAG3D,IAAMsJ,CAAAA,CAAStJ,GAAS,MAAA,EAAU,CAAA,CAC5BiB,CAAAA,CAAQjB,CAAAA,EAAS,KAAA,EAASJ,CAAAA,CAAS,OACzC,OAAOA,CAAAA,CAAS,MAAM0J,CAAAA,CAAQA,CAAAA,CAASrI,CAAK,CAChD,CAEA,cAAA,CAAeiK,CAAAA,CAAkC,CAC7C,IAAMC,EAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,CAAA,CAC1C,OAAOC,EAAO,QAAA,CAASA,CAAAA,CAAO,QAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAK,IAC1D,CAEA,aAAA,CAAcD,EAAkBxE,CAAAA,CAAmB8C,CAAAA,CAAiC,CAChF,IAAM2B,CAAAA,CAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,CAAA,CACpCG,EAAMF,CAAAA,CAAO,QAAA,CAAS,UAAUzC,CAAAA,EAAKA,CAAAA,CAAE,KAAOhC,CAAS,CAAA,CAC7D,GAAI2E,CAAAA,GAAQ,EAAA,CAAI,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW3E,CAAS,CAAA,qBAAA,EAAwBwE,CAAQ,EAAE,CAAA,CAEtFC,CAAAA,CAAO,QAAA,CAASE,CAAG,CAAA,CAAI,CAAE,GAAGF,CAAAA,CAAO,QAAA,CAASE,CAAG,CAAA,CAAG,GAAG7B,CAAQ,CAAA,CAC7D2B,CAAAA,CAAO,SAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAC5B,KAAK,IAAA,CAAK,OAAA,CAAS,CAAE,IAAA,CAAM,iBAAA,CAAmB,SAAAD,CAAAA,CAAU,SAAA,CAAAxE,CAAAA,CAAW,OAAA,CAAA8C,CAAQ,CAAgB,EAC/F,CAEA,aAAA,CAAc0B,EAAkBxE,CAAAA,CAAyB,CACrD,IAAMyE,CAAAA,CAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,CAAA,CACpCG,CAAAA,CAAMF,EAAO,QAAA,CAAS,SAAA,CAAUzC,GAAKA,CAAAA,CAAE,EAAA,GAAOhC,CAAS,CAAA,CAC7D,GAAI2E,CAAAA,GAAQ,EAAA,CAAI,MAAM,IAAI,MAAM,CAAA,QAAA,EAAW3E,CAAS,wBAAwBwE,CAAQ,CAAA,CAAE,EAEtFC,CAAAA,CAAO,QAAA,CAAS,MAAA,CAAOE,CAAAA,CAAK,CAAC,CAAA,CAC7BF,EAAO,YAAA,CAAeA,CAAAA,CAAO,SAAS,MAAA,CACtCA,CAAAA,CAAO,UAAY,IAAA,CAAK,GAAA,EAAI,CAC5B,IAAA,CAAK,IAAA,CAAK,OAAA,CAAS,CAAE,IAAA,CAAM,iBAAA,CAAmB,SAAAD,CAAAA,CAAU,SAAA,CAAAxE,CAAU,CAAgB,EACtF,CAEA,cAAA,CAAewE,CAAAA,CAAkBvB,CAAAA,CAA0B,CACvD,IAAMwB,CAAAA,CAAS,KAAK,aAAA,CAAcD,CAAQ,EACpCT,CAAAA,CAAQd,CAAAA,CAAM,WAAA,EAAY,CAChC,OAAOwB,CAAAA,CAAO,SAAS,MAAA,CACnBzC,CAAAA,EAAK,OAAOA,CAAAA,CAAE,OAAA,EAAY,UAAYA,CAAAA,CAAE,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS+B,CAAK,CAChF,CACJ,CAEA,YAAYS,CAAAA,CAAwB,CAChC,IAAMC,CAAAA,CAAS,IAAA,CAAK,cAAcD,CAAQ,CAAA,CAC1CC,EAAO,QAAA,CAAW,GAClBA,CAAAA,CAAO,YAAA,CAAe,EACtBA,CAAAA,CAAO,SAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAC5B,IAAA,CAAK,KAAK,OAAA,CAAS,CAAE,KAAM,gBAAA,CAAkB,QAAA,CAAAD,CAAS,CAAgB,EAC1E,CAEA,UAAA,CAAWA,CAAAA,CAAkBkB,CAAAA,CAAwB,CACjD,IAAMjB,CAAAA,CAAS,KAAK,aAAA,CAAcD,CAAQ,EACtCC,CAAAA,CAAO,QAAA,CAAS,MAAA,CAASiB,CAAAA,GACzBjB,CAAAA,CAAO,QAAA,CAAWA,EAAO,QAAA,CAAS,KAAA,CAAM,CAACiB,CAAQ,CAAA,CACjDjB,EAAO,YAAA,CAAeA,CAAAA,CAAO,QAAA,CAAS,MAAA,CACtCA,CAAAA,CAAO,SAAA,CAAY,KAAK,GAAA,EAAI,EAEpC,CAIA,aAAA,CAAcD,CAAAA,CAAwB,CAClC,IAAA,CAAK,kBAAA,CAAmBA,CAAAA,CAAU,UAAU,CAAA,CAC5C,IAAA,CAAK,KAAK,OAAA,CAAS,CAAE,KAAM,iBAAA,CAAmB,QAAA,CAAAA,CAAS,CAAgB,EAC3E,CAEA,aAAA,CAAcA,CAAAA,CAAwB,CAClC,KAAK,kBAAA,CAAmBA,CAAAA,CAAU,QAAQ,CAAA,CAC1C,IAAA,CAAK,KAAK,OAAA,CAAS,CAAE,IAAA,CAAM,iBAAA,CAAmB,QAAA,CAAAA,CAAS,CAAgB,EAC3E,CAEA,YAAYA,CAAAA,CAAwB,CAChC,KAAK,kBAAA,CAAmBA,CAAAA,CAAU,QAAQ,EAC9C,CAEA,aAAaA,CAAAA,CAAwB,CACjC,KAAK,kBAAA,CAAmBA,CAAAA,CAAU,QAAQ,EAC9C,CAEA,cAAA,CAAeA,CAAAA,CAAwB,CACnC,IAAA,CAAK,mBAAmBA,CAAAA,CAAU,WAAW,EACjD,CAEA,eAAA,CAAgBA,EAAkB9K,CAAAA,CAAoB,CAClD,IAAM+K,CAAAA,CAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,CAAA,CAC1CC,CAAAA,CAAO,YAAc,CAAA,CACrBA,CAAAA,CAAO,UAAY/K,CAAAA,CAAM,OAAA,CACzB,IAAA,CAAK,kBAAA,CAAmB8K,CAAAA,CAAU,OAAO,EACzC,IAAA,CAAK,IAAA,CAAK,QAAS,CAAE,IAAA,CAAM,QAAS,QAAA,CAAAA,CAAAA,CAAU,KAAA,CAAA9K,CAAM,CAAgB,EACxE,CAEA,YAAA,CAAa8K,CAAAA,CAAwB,CACjC,IAAA,CAAK,OAAA,CAAQ,OAAOA,CAAQ,CAAA,CAC5B,IAAA,CAAK,IAAA,CAAK,OAAA,CAAS,CAAE,KAAM,gBAAA,CAAkB,QAAA,CAAAA,CAAS,CAAgB,EAC1E,CAEA,gBAAA,CAAiBjC,CAAAA,CAAsB,CACnC,IAAA,GAAW,CAAC3J,CAAAA,CAAI6L,CAAM,CAAA,GAAK,IAAA,CAAK,QACxBA,CAAAA,CAAO,MAAA,GAAWlC,IAClB,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO3J,CAAE,CAAA,CACtB,IAAA,CAAK,KAAK,OAAA,CAAS,CAAE,KAAM,gBAAA,CAAkB,QAAA,CAAUA,CAAG,CAAgB,CAAA,EAGtF,CAIA,QAAA,CAAS2J,CAAAA,CAA8B,CACnC,IAAMoD,CAAAA,CAAUpD,EACV,KAAA,CAAM,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO5B,CAAAA,EAAKA,EAAE,MAAA,GAAW4B,CAAM,EACjE,KAAA,CAAM,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAEhCqD,CAAAA,CAAgBD,CAAAA,CAAQ,OAAO,CAACE,CAAAA,CAAKlF,IAAMkF,CAAAA,CAAMlF,CAAAA,CAAE,aAAc,CAAC,CAAA,CAClEmF,CAAAA,CAAcH,CAAAA,CAAQ,MAAA,CAAO,CAACE,EAAKlF,CAAAA,GAAMkF,CAAAA,EAAOlF,EAAE,UAAA,EAAc,CAAA,CAAA,CAAI,CAAC,CAAA,CACrEoF,CAAAA,CAAaJ,CAAAA,CAAQ,GAAA,CAAIhF,CAAAA,EAAKA,CAAAA,CAAE,SAAS,CAAA,CAEzCqF,CAAAA,CAAqB,CACvB,KAAA,CAAOL,CAAAA,CAAQ,OACf,MAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAOhF,CAAAA,EAAKA,CAAAA,CAAE,MAAA,GAAW,QAAQ,CAAA,CAAE,MAAA,CACnD,OAAQgF,CAAAA,CAAQ,MAAA,CAAOhF,GAAKA,CAAAA,CAAE,MAAA,GAAW,QAAQ,CAAA,CAAE,MAAA,CACnD,SAAA,CAAWgF,EAAQ,MAAA,CAAOhF,CAAAA,EAAKA,EAAE,MAAA,GAAW,WAAW,EAAE,MAAA,CACzD,KAAA,CAAOgF,CAAAA,CAAQ,MAAA,CAAOhF,CAAAA,EAAKA,CAAAA,CAAE,SAAW,OAAO,CAAA,CAAE,OACjD,QAAA,CAAUgF,CAAAA,CAAQ,OAAOhF,CAAAA,EAAKA,CAAAA,CAAE,SAAW,UAAU,CAAA,CAAE,OACvD,aAAA,CAAAiF,CAAAA,CACA,YAAAE,CAAAA,CACA,wBAAA,CAA0BH,EAAQ,MAAA,CAASC,CAAAA,CAAgBD,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAC5E,YAAA,CAAcI,EAAW,MAAA,CAAS,IAAA,CAAK,IAAI,GAAGA,CAAU,EAAI,MAAA,CAC5D,YAAA,CAAcA,CAAAA,CAAW,MAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAGA,CAAU,CAAA,CAAI,MAChE,CAAA,CAEA,OAAA,IAAA,CAAK,KAAK,OAAA,CAAS,CAAE,IAAA,CAAM,YAAA,CAAc,KAAA,CAAAC,CAAM,CAAgB,CAAA,CACxDA,CACX,CAIA,YAAA,CAAaxB,CAAAA,CAAgC,CACzC,IAAMC,CAAAA,CAAS,IAAA,CAAK,aAAA,CAAcD,CAAQ,CAAA,CAC1C,OAAO,CACH,MAAA,CAAQ,CAAE,GAAGC,CAAO,EACpB,QAAA,CAAUA,CAAAA,CAAO,QAAA,CAAS,GAAA,CAAIzC,CAAAA,GAAM,CAAE,GAAGA,CAAE,CAAA,CAAE,EAC7C,UAAA,CAAY,IAAA,CAAK,KAAI,CACrB,OAAA,CAAS,KACb,CACJ,CAEA,YAAA,CAAaO,EAAgBxJ,CAAAA,CAA4B,CACrD,IAAMwK,CAAAA,CAAQ7K,CAAAA,CAAW,QAAQ,CAAA,CAC3BkD,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAEf6I,CAAAA,CAAiB,CACnB,GAAG1L,CAAAA,CAAK,OACR,EAAA,CAAIwK,CAAAA,CACJ,OAAAhB,CAAAA,CACA,QAAA,CAAUxJ,EAAK,QAAA,CAAS,GAAA,CAAIiJ,IAAM,CAAE,GAAGA,CAAE,CAAA,CAAE,CAAA,CAC3C,UAAWpG,CAAAA,CACX,SAAA,CAAWA,CAAAA,CACX,YAAA,CAAcA,CAClB,CAAA,CAEA,YAAK,OAAA,CAAQ,GAAA,CAAI2H,EAAOkB,CAAM,CAAA,CAC9B,KAAK,IAAA,CAAK,OAAA,CAAS,CAAE,IAAA,CAAM,gBAAA,CAAkB,QAAA,CAAUlB,EAAO,MAAA,CAAAkB,CAAO,CAAgB,CAAA,CAE9ElB,CACX,CAIA,OAAA,CAAQ0C,CAAAA,CAAiB,IAAA,CAAe,CACpC,IAAMrK,CAAAA,CAAM,KAAK,GAAA,EAAI,CACfsK,EAAqB,EAAC,CAE5B,OAAW,CAAC1B,CAAAA,CAAUC,CAAM,CAAA,GAAK,IAAA,CAAK,OAAA,CAC9BA,EAAO,MAAA,GAAW,QAAA,EAAY7I,EAAM6I,CAAAA,CAAO,SAAA,CAAYwB,GACvDC,CAAAA,CAAS,IAAA,CAAK1B,CAAQ,CAAA,CAI9B,IAAA,IAAWA,CAAAA,IAAY0B,EACnB,IAAA,CAAK,OAAA,CAAQ,OAAO1B,CAAQ,CAAA,CAGhC,KAAK,IAAA,CAAK,OAAA,CAAS,CAAE,IAAA,CAAM,SAAA,CAAW,YAAA,CAAc0B,EAAS,MAAO,CAAgB,EACxF,CAIQ,aAAA,CAAc1B,EAA0B,CAC5C,IAAMC,CAAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAID,CAAQ,CAAA,CACxC,GAAI,CAACC,CAAAA,CAAQ,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAUD,CAAQ,CAAA,UAAA,CAAY,CAAA,CAC3D,OAAOC,CACX,CAEQ,YAAYkB,CAAAA,CAAmBQ,CAAAA,CAAkD,CACrF,IAAMC,CAAAA,CAAQD,CAAAA,EAAM,KAAA,EAAS,WAAA,CACvBE,CAAAA,CAAMF,GAAM,SAAA,GAAc,KAAA,CAAQ,EAAI,EAAA,CAE5C,OAAO,CAAC,GAAGR,CAAO,CAAA,CAAE,IAAA,CAAK,CAACX,CAAAA,CAAGnB,IAAM,CAC/B,IAAMyC,EAAKtB,CAAAA,CAAEoB,CAAK,EACZG,CAAAA,CAAK1C,CAAAA,CAAEuC,CAAK,CAAA,CAClB,OAAOC,CAAAA,EAAOC,EAAKC,CAAAA,CACvB,CAAC,CACL,CACJ,MCpdaC,EAAAA,CAAN,KAAiB,CAGpB,WAAA,CAAoBjC,CAAAA,CAAmB,CAAnB,YAAAA,EAAqB,CAFjC,SAAuC,IAAI,GAAA,CASnD,WAAWhC,CAAAA,CAA+B,CACtC,OAAK,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIA,CAAM,CAAA,EACzB,IAAA,CAAK,SAAS,GAAA,CAAIA,CAAAA,CAAQ,IAAI+B,CAAAA,CAAc,IAAA,CAAK,MAAM,CAAC,CAAA,CAErD,IAAA,CAAK,SAAS,GAAA,CAAI/B,CAAM,CACnC,CAKA,UAAA,CAAWA,EAAyB,CAChC,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIA,CAAM,CACnC,CAKA,aAAA,CAAcA,EAAsB,CAChC,IAAMkE,EAAU,IAAA,CAAK,QAAA,CAAS,IAAIlE,CAAM,CAAA,CACpCkE,IACAA,CAAAA,CAAQ,kBAAA,GACR,IAAA,CAAK,QAAA,CAAS,OAAOlE,CAAM,CAAA,EAEnC,CAKA,SAAA,EAAsB,CAClB,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,SAAS,IAAA,EAAM,CAC1C,CAKA,YAAA,EAAuB,CACnB,OAAO,IAAA,CAAK,QAAA,CAAS,IACzB,CAOA,aAAA,EAA0B,CACtB,IAAMmE,CAAAA,CAAgB,EAAC,CACvB,IAAA,IAAWD,CAAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,GAChCC,CAAAA,CAAI,IAAA,CAAK,GAAG,KAAA,CAAM,IAAA,CAAKD,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA,CAEpD,OAAOC,CACX,CAKA,mBAAA,EAAgC,CAC5B,OAAO,IAAA,CAAK,eAAc,CAAE,MAAA,CAAO,CAAA,EAAK,CAAA,CAAE,MAAA,GAAW,QAAQ,CACjE,CAKA,WAAA,CAAYzB,EAAsB3L,CAAAA,CAA6C,CAC3E,IAAI8E,CAAAA,CAAoB,EAAC,CAEzB,IAAA,GAAW,CAACmE,CAAAA,CAAQkE,CAAO,CAAA,GAAK,IAAA,CAAK,SACjCrI,CAAAA,CAAQ,IAAA,CAAK,GAAGqI,CAAAA,CAAQ,aAAA,CAAclE,CAAAA,CAAQ0C,CAAAA,CAAQ3L,CAAO,CAAC,EAGlE,IAAM8M,CAAAA,CAAQ9M,GAAS,IAAA,EAAM,KAAA,EAAS,YAChC+M,CAAAA,CAAM/M,CAAAA,EAAS,MAAM,SAAA,GAAc,KAAA,CAAQ,EAAI,EAAA,CACrD8E,CAAAA,CAAQ,KAAK,CAAC4G,CAAAA,CAAGnB,IAAMwC,CAAAA,EAAQrB,CAAAA,CAAEoB,CAAK,CAAA,CAAgBvC,CAAAA,CAAEuC,CAAK,EAAa,CAAA,CAE1E,IAAMxD,EAAStJ,CAAAA,EAAS,MAAA,EAAU,EAC5BiB,CAAAA,CAAQjB,CAAAA,EAAS,KAAA,EAAS8E,CAAAA,CAAQ,MAAA,CACxC,OAAOA,EAAQ,KAAA,CAAMwE,CAAAA,CAAQA,EAASrI,CAAK,CAC/C,CAKA,UAAA,CAAWiK,CAAAA,CAAiC,CACxC,IAAA,IAAWiC,CAAAA,IAAW,IAAA,CAAK,SAAS,MAAA,EAAO,CAAG,CAC1C,IAAMhC,CAAAA,CAASgC,EAAQ,SAAA,CAAUjC,CAAQ,CAAA,CACzC,GAAIC,CAAAA,CAAQ,OAAOA,CACvB,CACA,OAAO,IACX,CAKA,eAAA,CAAgBD,EAAiC,CAC7C,IAAA,GAAW,CAACjC,CAAAA,CAAQkE,CAAO,CAAA,GAAK,KAAK,QAAA,CACjC,GAAIA,EAAQ,YAAA,CAAajC,CAAQ,EAAG,OAAOjC,CAAAA,CAE/C,OAAO,IACX,CAOA,cAAA,EAAsD,CAClD,IAAMoE,CAAAA,CAAa,KAAK,aAAA,EAAc,CAChCf,EAAgBe,CAAAA,CAAW,MAAA,CAAO,CAACC,CAAAA,CAAGjG,CAAAA,GAAMiG,CAAAA,CAAIjG,EAAE,YAAA,CAAc,CAAC,EACjEmF,CAAAA,CAAca,CAAAA,CAAW,OAAO,CAACC,CAAAA,CAAGjG,IAAMiG,CAAAA,EAAKjG,CAAAA,CAAE,YAAc,CAAA,CAAA,CAAI,CAAC,EACpEoF,CAAAA,CAAaY,CAAAA,CAAW,IAAIhG,CAAAA,EAAKA,CAAAA,CAAE,SAAS,CAAA,CAElD,OAAO,CACH,UAAW,IAAA,CAAK,QAAA,CAAS,KACzB,KAAA,CAAOgG,CAAAA,CAAW,OAClB,MAAA,CAAQA,CAAAA,CAAW,MAAA,CAAOhG,CAAAA,EAAKA,CAAAA,CAAE,MAAA,GAAW,QAAQ,CAAA,CAAE,MAAA,CACtD,OAAQgG,CAAAA,CAAW,MAAA,CAAOhG,GAAKA,CAAAA,CAAE,MAAA,GAAW,QAAQ,CAAA,CAAE,MAAA,CACtD,SAAA,CAAWgG,EAAW,MAAA,CAAOhG,CAAAA,EAAKA,EAAE,MAAA,GAAW,WAAW,EAAE,MAAA,CAC5D,KAAA,CAAOgG,CAAAA,CAAW,MAAA,CAAOhG,CAAAA,EAAKA,CAAAA,CAAE,SAAW,OAAO,CAAA,CAAE,OACpD,QAAA,CAAUgG,CAAAA,CAAW,OAAOhG,CAAAA,EAAKA,CAAAA,CAAE,MAAA,GAAW,UAAU,CAAA,CAAE,MAAA,CAC1D,cAAAiF,CAAAA,CACA,WAAA,CAAAE,EACA,wBAAA,CAA0Ba,CAAAA,CAAW,OAASf,CAAAA,CAAgBe,CAAAA,CAAW,MAAA,CAAS,CAAA,CAClF,YAAA,CAAcZ,CAAAA,CAAW,OAAS,IAAA,CAAK,GAAA,CAAI,GAAGA,CAAU,CAAA,CAAI,OAC5D,YAAA,CAAcA,CAAAA,CAAW,MAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAGA,CAAU,CAAA,CAAI,MAChE,CACJ,CAKA,YAAA,EAA4C,CACxC,IAAM3K,CAAAA,CAAsC,EAAC,CAC7C,IAAA,GAAW,CAACmH,CAAAA,CAAQkE,CAAO,IAAK,IAAA,CAAK,QAAA,CACjCrL,EAAOmH,CAAM,CAAA,CAAIkE,CAAAA,CAAQ,QAAA,CAASlE,CAAM,CAAA,CAE5C,OAAOnH,CACX,CAKA,kBAA2B,CACvB,IAAIyD,EAAQ,CAAA,CACZ,IAAA,IAAW4H,CAAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,GAChC5H,CAAAA,EAAS4H,CAAAA,CAAQ,QAAQ,IAAA,CAE7B,OAAO5H,CACX,CAOA,UAAA,CAAWoH,CAAAA,CAAiB,IAAA,CAAe,CACvC,IAAA,IAAWQ,KAAW,IAAA,CAAK,QAAA,CAAS,QAAO,CACvCA,CAAAA,CAAQ,QAAQR,CAAM,CAAA,CAI1B,IAAA,GAAW,CAAC1D,CAAAA,CAAQkE,CAAO,IAAK,IAAA,CAAK,QAAA,CAC7BA,EAAQ,OAAA,CAAQ,IAAA,GAAS,IACzBA,CAAAA,CAAQ,kBAAA,EAAmB,CAC3B,IAAA,CAAK,QAAA,CAAS,MAAA,CAAOlE,CAAM,CAAA,EAGvC,CAKA,aAAa0D,CAAAA,CAAiB,KAAA,CAAkB,CAC5C,IAAMrK,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CACjBiD,CAAAA,CAAQ,EAEZ,IAAA,IAAW4H,CAAAA,IAAW,KAAK,QAAA,CAAS,MAAA,GAChC,IAAA,IAAWhC,CAAAA,IAAUgC,CAAAA,CAAQ,OAAA,CAAQ,MAAA,EAAO,CAAA,CAEnChC,EAAO,MAAA,GAAW,WAAA,EAAeA,EAAO,MAAA,GAAW,OAAA,GACpD7I,EAAM6I,CAAAA,CAAO,SAAA,CAAYwB,IAEzBQ,CAAAA,CAAQ,aAAA,CAAchC,EAAO,EAAE,CAAA,CAC/B5F,KAKZ,OAAOA,CACX,CAKA,UAAA,CAAW0D,CAAAA,CAAsB,CAC7B,IAAMkE,CAAAA,CAAU,IAAA,CAAK,SAAS,GAAA,CAAIlE,CAAM,EACpCkE,CAAAA,GACAA,CAAAA,CAAQ,iBAAiBlE,CAAM,CAAA,CAC/BkE,CAAAA,CAAQ,kBAAA,EAAmB,CAC3B,IAAA,CAAK,SAAS,MAAA,CAAOlE,CAAM,GAEnC,CAKA,KAAA,EAAc,CACV,IAAA,GAAW,CAACA,CAAAA,CAAQkE,CAAO,CAAA,GAAK,IAAA,CAAK,SACjCA,CAAAA,CAAQ,gBAAA,CAAiBlE,CAAM,CAAA,CAC/BkE,CAAAA,CAAQ,oBAAmB,CAE/B,IAAA,CAAK,QAAA,CAAS,KAAA,GAClB,CAOA,aAAajC,CAAAA,CAAuC,CAChD,QAAWiC,CAAAA,IAAW,IAAA,CAAK,SAAS,MAAA,EAAO,CACvC,GAAIA,CAAAA,CAAQ,YAAA,CAAajC,CAAQ,EAC7B,OAAOiC,CAAAA,CAAQ,aAAajC,CAAQ,CAAA,CAG5C,OAAO,IACX,CAKA,YAAA,CAAajC,CAAAA,CAAgBxJ,CAAAA,CAA4B,CACrD,OAAO,IAAA,CAAK,UAAA,CAAWwJ,CAAM,CAAA,CAAE,YAAA,CAAaA,EAAQxJ,CAAI,CAC5D,CAKA,iBAAA,CAAkBwJ,CAAAA,CAAgC,CAC9C,IAAMkE,CAAAA,CAAU,IAAA,CAAK,SAAS,GAAA,CAAIlE,CAAM,EACxC,OAAKkE,CAAAA,CAEE,MAAM,IAAA,CAAKA,CAAAA,CAAQ,QAAQ,IAAA,EAAM,EAAE,GAAA,CAAI7N,CAAAA,EAAM6N,EAAQ,YAAA,CAAa7N,CAAE,CAAC,CAAA,CAFvD,EAGzB,CAKA,iBAAA,CAAkB2J,CAAAA,CAAgBsE,EAAmC,CACjE,OAAOA,EAAQ,GAAA,CAAI9N,CAAAA,EAAQ,IAAA,CAAK,YAAA,CAAawJ,CAAAA,CAAQxJ,CAAI,CAAC,CAC9D,CACJ,ECpOO,IAAM+N,EAAAA,CAAN,MAAMC,CAAU,CACX,IAAA,CACA,WAAA,CACA,gBAAA,CACA,YAAA,CACA,gBACA,aAAA,CACA,KAAA,CACA,MACA,kBAAA,CAER,WAAA,CAAYjF,EAAyB,CACjC,IAAA,CAAK,IAAA,CAAOA,CAAAA,CAAO,IAAA,CACnB,IAAA,CAAK,MAAQ,IAAIkF,gBAAAA,CAGjB,IAAMC,CAAAA,CAAkBnF,CAAAA,CAAO,WAAa,EAAC,CAgB7C,GAfA,IAAA,CAAK,KAAA,CAAQ,IAAIoF,oBAAO,CACpB,WAAA,CAAaD,EAAgB,aAAA,EAAiB,GAAA,CAC9C,SAAUA,CAAAA,CAAgB,QAAA,EAAY,GAAA,CACtC,WAAA,CAAaA,CAAAA,CAAgB,WAAA,EAAe,IAC5C,OAAA,CAAS,GACb,CAAC,CAAA,CAGD,IAAA,CAAK,mBAAqB,CACtB,WAAA,CAAanF,CAAAA,CAAO,KAAA,EAAO,WAAA,EAAe,CAAA,CAC1C,aAAcA,CAAAA,CAAO,KAAA,EAAO,cAAgB,GAAA,CAC5C,QAAA,CAAUA,EAAO,KAAA,EAAO,QAAA,EAAY,IACpC,iBAAA,CAAmBA,CAAAA,CAAO,OAAO,iBAAA,EAAqB,CAC1D,EAEIA,CAAAA,CAAO,IAAA,GAAS,QAChB,IAAA,CAAK,WAAA,CAAcA,CAAAA,CAAAA,KAAAA,GAEnB,IAAA,CAAK,gBAAA,CAAmBA,CAAAA,CAAO,SAG3BA,CAAAA,CAAO,KAAA,GACP,KAAK,YAAA,CAAe,IAAID,EAAaC,CAAAA,CAAO,KAAK,CAAA,CAAA,CAIjDA,CAAAA,CAAO,QAAA,GACP,IAAA,CAAK,gBAAkB,IAAI0B,CAAAA,CAAgB1B,EAAO,QAAQ,CAAA,CAAA,CAI1DA,EAAO,OAAA,EAAS,OAAA,EACZ,CAAC,IAAA,CAAK,gBAAA,CACN,MAAM,IAAIxC,CAAAA,CACN,kDAAA,CACA,gBACJ,CAKhB,CAwBA,MAAM,IAAA,CACFhG,CAAAA,CAC6C,CAC7C,GAAM,CAAE,QAAA,CAAAJ,EAAU,GAAG4I,CAAO,EAAIxI,CAAAA,CAG1B6N,CAAAA,CAAoBlO,EAAeC,CAAQ,CAAA,CAMjD,GAHA,IAAA,CAAK,cAAA,CAAe4I,CAAM,EAGtB,IAAA,CAAK,YAAA,EAAgBA,EAAO,KAAA,EAAO,OAAA,GAAY,MAAO,CACtD,IAAMI,CAAAA,CAAS,MAAM,IAAA,CAAK,YAAA,CAAa,kBACnCiF,CAAAA,CACArF,CACJ,EAEA,GAAII,CAAAA,CACA,OAAIJ,CAAAA,CAAO,MAAA,CACA,IAAA,CAAK,uBAAA,CACR,IAAA,CAAK,iBAAA,CAAkBI,CAAM,CACjC,CAAA,CAEO,KAAK,gBAAA,CAAiBA,CAAM,CAG/C,CAGA,OAAO,KAAK,KAAA,CAAM,GAAA,CAAI,SACX,IAAA,CAAK,WAAA,CAAYiF,EAAmBrF,CAAM,CACpD,CACL,CAKA,MAAc,WAAA,CACV5I,CAAAA,CACA4I,CAAAA,CAC6C,CAC7C,IAAMsF,CAAAA,CAAc,CAAE,GAAG,IAAA,CAAK,kBAAA,CAAoB,GAAGtF,CAAAA,CAAO,KAAM,CAAA,CAElE,OAAO1I,CAAAA,CACH,SACQ,KAAK,IAAA,GAAS,OAAA,CACP,KAAK,gBAAA,CAAiBF,CAAAA,CAAU4I,CAAM,CAAA,CAEtC,IAAA,CAAK,sBAAA,CAAuB5I,CAAAA,CAAU4I,CAAM,CAAA,CAG3D,CACI,GAAGsF,CAAAA,CACH,QAAS,CAAC3N,CAAAA,CAASC,IAAU,CACzB,OAAA,CAAQ,IAAA,CACJ,CAAA,0BAAA,EAA6BD,CAAO,CAAA,CAAA,EAAI2N,EAAY,WAAW,CAAA,CAAA,CAAA,CAC/D1N,EAAM,OACV,EACJ,CACJ,CACJ,CACJ,CAKA,MAAc,gBAAA,CACVR,CAAAA,CACA4I,EAC6C,CAC7C,IAAMlE,EAAW,MAAM,KAAA,CACnB,GAAG,IAAA,CAAK,WAAA,CAAa,OAAA,EAAW,0BAA0B,CAAA,QAAA,CAAA,CAC1D,CACI,OAAQ,MAAA,CACR,OAAA,CAAS,CACL,cAAA,CAAgB,kBAAA,CAChB,cAAe,CAAA,OAAA,EAAU,IAAA,CAAK,WAAA,CAAa,MAAM,CAAA,CACrD,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CACjB,QAAA,CAAA1E,CAAAA,CACA,GAAG4I,CACP,CAAC,CACL,CACJ,CAAA,CAEA,GAAI,CAAClE,CAAAA,CAAS,GACV,MAAM,IAAI0B,EACN,CAAA,iBAAA,EAAoB1B,CAAAA,CAAS,UAAU,CAAA,CAAA,CACvC,iBAAA,CACAA,CAAAA,CAAS,MACb,CAAA,CAGJ,GAAIkE,EAAO,MAAA,CAAQ,CACf,IAAM3G,CAAAA,CAAS,IAAA,CAAK,gBAAA,CAAiByC,CAAAA,CAAS,IAAK,CAAA,CACnD,OAAO,IAAA,CAAK,uBAAA,CAAwBzC,CAAM,CAC9C,CAAA,YACiB,MAAMyC,CAAAA,CAAS,IAAA,EAGpC,CAKA,MAAc,uBACV1E,CAAAA,CACA4I,CAAAA,CAC6C,CAC7C,GAAI,CAAC,KAAK,gBAAA,CACN,MAAM,IAAIxC,CAAAA,CACN,kCAAA,CACA,gBACJ,EAIJ,GAAIwC,CAAAA,CAAO,QAAQ,MAAA,CACf,OAAO,KAAK,uBAAA,CAAwB5I,CAAAA,CAAU4I,CAAM,CAAA,CAIxD,IAAM3G,CAAAA,CAAS,KAAK,gBAAA,CAAiBjC,CAAAA,CAAU4I,CAAa,CAAA,CAE5D,GAAIA,EAAO,MAAA,CAAQ,CACf,IAAIuF,CAAAA,CAEJ,GAAI,IAAA,CAAK,cAAgBvF,CAAAA,CAAO,KAAA,EAAO,UAAY,KAAA,CAAO,CACtD,IAAMnD,CAAAA,CAAwB,EAAC,CACzB2I,CAAAA,CAAe,IAAA,CAAK,WAAA,CAAYnM,EAAQwD,CAAM,CAAA,CACpD0I,EAAc,IAAA,CAAK,WAAA,CAAYC,EAAc,IACzC,IAAA,CAAK,YAAA,CAAc,aAAA,CAAcpO,CAAAA,CAAU4I,CAAAA,CAAenD,CAAM,CACpE,EACJ,MACI0I,CAAAA,CAAclM,CAAAA,CAGlB,OAAO,IAAA,CAAK,uBAAA,CAAwBkM,CAAW,CACnD,CAAA,KAAO,CACH,IAAM1I,CAAAA,CAAS,MAAMD,EAAcvD,CAAM,CAAA,CAEzC,OAAI,IAAA,CAAK,YAAA,EAAgB2G,CAAAA,CAAO,KAAA,EAAO,OAAA,GAAY,KAAA,EAC/C,MAAM,IAAA,CAAK,YAAA,CAAa,cAAc5I,CAAAA,CAAU4I,CAAAA,CAAenD,CAAM,CAAA,CAGlE,IAAA,CAAK,gBAAA,CAAiBA,CAAM,CACvC,CACJ,CAKA,MAAc,uBAAA,CACVzF,EACA4I,CAAAA,CACqB,CACrB,IAAMyF,CAAAA,CAAYzF,CAAAA,CAAO,MAAA,CAAQ,MAAA,CAAe,IAAA,EAAM,KAAA,CAChDO,EAAS,OAAOkF,CAAAA,EAAa,WAAaA,CAAAA,EAAS,CAAIA,EAEvDC,CAAAA,CAAoBnF,CAAAA,CACpB,MAAA,CAAO,OAAA,CAAQA,CAAM,CAAA,CAClB,IAAI,CAAC,CAACpH,EAAKwM,CAAG,CAAA,GAAqB,CAChC,IAAMC,CAAAA,CACFD,CAAAA,EAAK,IAAA,EAAM,QAAA,EAAYA,CAAAA,EAAK,aAAa,IAAA,EAAQ,SAAA,CACrD,OAAO,CAAA,KAAA,EAAQxM,CAAG,MAAMyM,CAAQ,CAAA,CACpC,CAAC,CAAA,CACA,IAAA,CAAK;AAAA,CAAI,CAAA,CACZ,4BAAA,CAEAC,CAAAA,CAAyB,CAC3B,EAAA,CAAIjP,EAAW,KAAK,CAAA,CACpB,IAAA,CAAM,QAAA,CACN,OAAA,CAAS,CAAA;AAAA,EACnB8O,CAAiB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAAA,CAAA,CASP,SAAA,CAAW,IAAA,CAAK,GAAA,EACpB,CAAA,CAEMI,CAAAA,CAAkB1O,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CAC9C2O,CAAAA,CAAmB,CACrBF,EACA,GAAGzO,CAAAA,CAAS,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CACvB,CACI,GAAG0O,CAAAA,CAEH,OAAA,CAAS,CAAA,EAAGA,CAAAA,EAAiB,OAAO;;AAAA,gFAAA,EAE8BvF,CAAAA,CAAS,MAAA,CAAO,IAAA,CAAKA,CAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAI,qBACxG,CAAA,sDAAA,CACR,CACJ,CAAA,CAEMlH,EAAS,IAAA,CAAK,gBAAA,CAAkB0M,CAAAA,CAAkB,CACpD,GAAG/F,CAAAA,CACH,MAAA,CAAQ,KAAA,CACR,WAAA,CAAa,EACjB,CAAQ,CAAA,CAEFnD,CAAAA,CAAS,MAAMD,CAAAA,CAAcvD,CAAM,EACrC2M,CAAAA,CAAcnJ,CAAAA,CACb,MAAA,CAAQoJ,CAAAA,EAAMA,CAAAA,CAAE,IAAA,GAAS,YAAY,CAAA,CACrC,GAAA,CAAKA,CAAAA,EAAOA,CAAAA,CAAE,IAAA,GAAS,YAAA,CAAeA,CAAAA,CAAE,KAAA,CAAQ,EAAG,EACnD,IAAA,CAAK,EAAE,CAAA,CAGRC,CAAAA,CAAW,IAAA,CAAK,WAAA,CAAYF,CAAW,CAAA,CAG3C,GAAI,CACA,IAAMxK,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAM0K,CAAQ,CAAA,CAG5BC,CAAAA,CAAa,OAAO5F,CAAAA,EAAQ,KAAA,EAAU,UAAA,CACtCA,CAAAA,CAAO,KAAA,CAAM/E,CAAM,CAAA,CACnBA,CAAAA,CAEA4K,CAAAA,CAAYvJ,CAAAA,CAAO,IAAA,CAAMoJ,CAAAA,EAAMA,CAAAA,CAAE,IAAA,GAAS,MAAM,CAAA,CActD,OAAO,CACH,OAAA,CAbAG,CAAAA,EAAaA,CAAAA,CAAU,IAAA,GAAS,MAAA,CAC1B,CACE,GAAGA,EAAU,YAAA,CACb,OAAA,CAAS,IAAA,CAAK,SAAA,CAAUD,CAAAA,CAAW,IAAA,CAAM,CAAC,CAC9C,EACE,CACE,EAAA,CAAIvP,CAAAA,CAAW,KAAK,CAAA,CACpB,IAAA,CAAM,WAAA,CACN,OAAA,CAAS,IAAA,CAAK,SAAA,CAAUuP,CAAAA,CAAW,IAAA,CAAM,CAAC,CAAA,CAC1C,SAAA,CAAW,IAAA,CAAK,KACpB,CAAA,CAIJ,KAAA,CAAOtJ,CAAAA,CAAO,IAAA,CAAMoJ,CAAAA,EAAMA,CAAAA,CAAE,IAAA,GAAS,SAAW,OAAA,GAAWA,CAAC,CAAA,EACxD,KAER,CACJ,CAAA,MAASrO,CAAAA,CAAY,CAEjB,cAAQ,KAAA,CAAM;AAAA,yBAAA,CAA6B,CAAA,CAC3C,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAiBoO,CAAW,CAAA,CAC1C,OAAA,CAAQ,KAAA,CAAM,yBAAA,CAA2BE,CAAAA,CAAS,SAAA,CAAU,CAAA,CAAG,GAAG,CAAC,CAAA,CACnE,OAAA,CAAQ,KAAA,CAAM,cAAA,CAAgBtO,CAAAA,CAAM,OAAO,CAAA,CAErC,IAAI4F,CAAAA,CACN,CAAA,wDAAA,EAA2DwI,CAAAA,CAAY,SAAA,CAAU,CAAA,CAAG,GAAG,CAAC,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,aAAA,EAOzFpO,CAAAA,CAAM,OAAO,CAAA,CAAA,CACZ,kBAAA,CACA,GAAA,CACAA,CACJ,CACJ,CACJ,CAKQ,WAAA,CAAYiC,CAAAA,CAAsB,CAEtC,IAAIwM,CAAAA,CAAUxM,CAAAA,CAAK,OAAA,CAAQ,cAAA,CAAgB,EAAE,CAAA,CAAE,QAAQ,SAAA,CAAW,EAAE,CAAA,CAI9DyM,CAAAA,CAAcD,CAAAA,CAAQ,KAAA,CAAM,0CAA0C,CAAA,CACtEE,CAAAA,CAAaF,CAAAA,CAAQ,KAAA,CAAM,gDAAgD,CAAA,CAGjF,GAAIC,CAAAA,CACA,OAAOA,CAAAA,CAAY,CAAC,CAAA,CAAE,IAAA,GAG1B,GAAIC,CAAAA,CACA,OAAOA,CAAAA,CAAW,CAAC,CAAA,CAAE,MAAK,CAI9B,IAAMC,CAAAA,CAAQH,CAAAA,CAAQ,KAAA,CAAM;AAAA,CAAI,CAAA,CAC5BI,CAAAA,CAAsB,EAAC,CACvBC,CAAAA,CAAS,MACTC,CAAAA,CAAa,CAAA,CAEjB,IAAA,IAAWC,CAAAA,IAAQJ,CAAAA,CAAO,CACtB,IAAMK,CAAAA,CAAUD,CAAAA,CAAK,IAAA,EAAK,CAG1B,GAAIC,CAAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAKA,CAAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,CAAG,CAMpD,GALAH,CAAAA,CAAS,IAAA,CACTD,CAAAA,CAAY,CAACG,CAAI,CAAA,CACjBD,GAAcC,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,EAAC,EAAG,QAAUA,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,EAAC,EAAG,MAAA,CAC1ED,CAAAA,EAAAA,CAAeC,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,EAAC,EAAG,QAAUA,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,EAAC,EAAG,OAEvED,CAAAA,GAAe,CAAA,CAEf,OAAOC,CAAAA,CAAK,IAAA,EAAK,CAErB,QACJ,CAEA,GAAIF,CAAAA,GACAD,CAAAA,CAAU,IAAA,CAAKG,CAAI,CAAA,CACnBD,CAAAA,EAAAA,CAAeC,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,EAAC,EAAG,QAAUA,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,EAAC,EAAG,OAC3ED,CAAAA,EAAAA,CAAeC,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,IAAI,MAAA,CAAA,CAAUA,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,EAAC,EAAG,MAAA,CAEvED,CAAAA,GAAe,CAAA,CAAA,CACf,OAAOF,CAAAA,CAAU,IAAA,CAAK;AAAA,CAAI,CAAA,CAAE,IAAA,EAGxC,CAGA,OAAOJ,CAAAA,CAAQ,IAAA,EACnB,CAKQ,uBAAA,CACJhN,CAAAA,CACqB,CACrB,OAAO,CACH,MAAA,CAAAA,CAAAA,CACA,gBAAA,CAAkB,IAAMoC,CAAAA,CAAiBpC,CAAM,CAAA,CAC/C,cAAA,CAAgB,MAAOyC,CAAAA,EAAuB,CAC1C,MAAMD,CAAAA,CAAexC,CAAAA,CAAQyC,CAAQ,EACzC,CAAA,CACA,YAAA,CAAc,CAAA,GAAIgL,CAAAA,GACP7K,CAAAA,CAAa5C,CAAAA,CAAQ,GAAGyN,CAAO,CAAA,CAE1C,UAAA,CAAY,IAAM7I,CAAAA,CAAW5E,CAAM,CAAA,CACnC,OAAA,CAAUkF,CAAAA,EAAkBD,CAAAA,CAAcjF,CAAAA,CAAQkF,CAAQ,CAAA,CAC1D,MAAA,CAAQ,IAAME,CAAAA,CAAYpF,CAAM,CAAA,CAChC,SAAA,CAAW,IACP4F,CAAAA,CAAgB5F,CAAM,CAAA,CAC1B,UAAA,CAAaL,CAAAA,EAAiBmG,CAAAA,CAAe9F,CAAAA,CAAQL,CAAM,CAC/D,CACJ,CAKA,MAAe,WAAA,CACX0C,CAAAA,CACAqL,CAAAA,CAC2B,CAC3B,GAAI,CACA,MAAOrL,EACX,CAAA,OAAE,CACE,MAAMqL,CAAAA,GACV,CACJ,CAKA,MAAe,gBAAA,CACXC,CAAAA,CAC2B,CAC3B,IAAM/L,CAAAA,CAAS+L,CAAAA,CAAK,SAAA,EAAU,CACxB9L,CAAAA,CAAU,IAAI,WAAA,CAEpB,GAAI,CACA,OAAa,CACT,GAAM,CAAE,IAAA,CAAAK,CAAAA,CAAM,KAAA,CAAAzC,CAAM,CAAA,CAAI,MAAMmC,CAAAA,CAAO,IAAA,EAAK,CAC1C,GAAIM,CAAAA,CAAM,MAGV,IAAMiL,CAAAA,CADOtL,CAAAA,CAAQ,MAAA,CAAOpC,CAAAA,CAAO,CAAE,MAAA,CAAQ,CAAA,CAAK,CAAC,CAAA,CAChC,KAAA,CAAM;AAAA,CAAI,EAE7B,IAAA,IAAW8N,CAAAA,IAAQJ,EACf,GAAII,CAAAA,CAAK,WAAW,QAAQ,CAAA,CAAG,CAC3B,IAAM3P,EAAO2P,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CACzB,GAAI3P,IAAS,QAAA,CAAU,MAEvB,GAAI,CAEA,MADc,IAAA,CAAK,KAAA,CAAMA,CAAI,EAEjC,CAAA,MAASW,EAAO,CACZ,OAAA,CAAQ,KAAA,CAAM,wBAAA,CAA0BA,CAAK,EACjD,CACJ,CAER,CACJ,CAAA,OAAE,CACEqD,CAAAA,CAAO,WAAA,GACX,CACJ,CAKA,MAAe,WAAA,CACX5B,EACAwD,CAAAA,CAC2B,CAC3B,cAAiBjC,CAAAA,IAASvB,CAAAA,CACtBwD,CAAAA,CAAO,IAAA,CAAKjC,CAAK,CAAA,CACjB,MAAMA,EAEd,CAKA,MAAe,kBACXiC,CAAAA,CAC2B,CAC3B,IAAA,IAAWjC,CAAAA,IAASiC,EAChB,MAAMjC,EAEd,CAKQ,gBAAA,CAAiBiC,CAAAA,CAAqC,CAC1D,IAAMuJ,CAAAA,CAAYvJ,CAAAA,CAAO,IAAA,CAAMoJ,GAAMA,CAAAA,CAAE,IAAA,GAAS,MAAM,CAAA,CAChDgB,CAAAA,CAAapK,EAAO,IAAA,CAAMoJ,CAAAA,EAAMA,CAAAA,CAAE,IAAA,GAAS,OAAO,CAAA,CAExD,GAAI,CAACG,CAAAA,EAAaA,CAAAA,CAAU,OAAS,MAAA,CACjC,MAAM,IAAI5I,CAAAA,CACN,wCACA,kBACJ,CAAA,CAGJ,OAAO,CACH,OAAA,CAAS4I,EAAU,YAAA,CACnB,KAAA,CACIa,CAAAA,EAAcA,CAAAA,CAAW,OAAS,OAAA,CAC5BA,CAAAA,CAAW,MACX,MACd,CACJ,CAKQ,cAAA,CAAejH,CAAAA,CAA2B,CAC9C,GAAIA,EAAO,WAAA,GAAgB,MAAA,GACnBA,EAAO,WAAA,CAAc,CAAA,EAAKA,EAAO,WAAA,CAAc,CAAA,CAAA,CAC/C,MAAM,IAAIxC,EACN,qCAAA,CACA,kBAAA,CACA,GACJ,CAAA,CAIR,GAAIwC,EAAO,SAAA,GAAc,MAAA,EAAaA,CAAAA,CAAO,SAAA,CAAY,EACrD,MAAM,IAAIxC,EACN,mCAAA,CACA,kBAAA,CACA,GACJ,CAAA,CAGJ,GAAIwC,CAAAA,CAAO,MAAA,EAAQ,QAAUA,CAAAA,CAAO,MAAA,CAChC,MAAM,IAAIxC,CAAAA,CACN,2CACA,kBAAA,CACA,GACJ,CAER,CAKA,IAAI,QAAA,EAAwC,CACxC,GAAI,IAAA,CAAK,IAAA,GAAS,QACd,MAAM,IAAIA,CAAAA,CACN,yCAAA,CACA,cACJ,CAAA,CAEJ,OAAO,KAAK,eAChB,CAKA,IAAI,OAAA,EAAyB,CACzB,GAAI,IAAA,CAAK,OAAS,OAAA,CACd,MAAM,IAAIA,CAAAA,CACN,yCAAA,CACA,cACJ,CAAA,CAGJ,GAAI,CAAC,IAAA,CAAK,cAAe,CACrB,GAAI,CAAC,IAAA,CAAK,gBAAA,CACN,MAAM,IAAIA,CAAAA,CACN,kDAAA,CACA,gBACJ,EAGJ,IAAM0J,CAAAA,CAAe,IAAIjC,CAAAA,CAAU,CAC/B,KAAM,cAAA,CACN,QAAA,CAAU,IAAA,CAAK,gBACnB,CAAsB,CAAA,CACtB,IAAA,CAAK,cAAgB,IAAIzC,CAAAA,CAAc0E,CAAmB,EAC9D,CAEA,OAAO,IAAA,CAAK,aAChB,CAKA,aAAA,EAAgB,CACZ,OAAO,CACH,KAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CACjB,OAAA,CAAS,KAAK,KAAA,CAAM,OAAA,CACpB,YAAa,IAAA,CAAK,KAAA,CAAM,WAC5B,CACJ,CAKA,MAAM,UAAA,EAA4B,CAC1B,IAAA,CAAK,YAAA,EACL,MAAM,IAAA,CAAK,YAAA,CAAa,WAEhC,CACJ,EAKO,SAASC,GAAwC5G,CAAAA,CAAW,CAC/D,OAAO,CACH,MAAA,CAAAA,EACA,IAAA,CAAM,MACV,CACJ,KC1oBa6G,CAAAA,CAAN,KAAwB,CACnB,MAAA,CACA,YAAA,CAER,WAAA,CAAYpH,CAAAA,CAAyB,CACjC,IAAA,CAAK,MAAA,CAAS,IAAIqH,mBAAAA,CAAU,CACxB,OAAQrH,CAAAA,CAAO,MAAA,CACf,OAAA,CAASA,CAAAA,CAAO,QAChB,OAAA,CAASA,CAAAA,CAAO,SAAW,GAAA,CAC3B,UAAA,CAAYA,EAAO,UAAA,EAAc,CAAA,CACjC,cAAA,CAAgBA,CAAAA,CAAO,OAC3B,CAAC,CAAA,CACD,KAAK,YAAA,CAAeA,CAAAA,CAAO,OAAS,6BACxC,CAKA,cAAA,EAAmC,CAC/B,OAAO,CAAC5I,CAAAA,CAAqBkQ,IAClB,IAAA,CAAK,UAAA,CAAWlQ,EAAUkQ,CAAU,CAEnD,CAEA,MAAe,WACXlQ,CAAAA,CACA4I,CAAAA,CAC2B,CAC3B,IAAMrB,CAAAA,CAAS,IAAIhF,CAAAA,CAEnB,GAAI,CACA,IAAMkM,CAAAA,CAAgBzO,EAAS,IAAA,CAAM8I,CAAAA,EAAMA,EAAE,IAAA,GAAS,QAAQ,EACxDqH,CAAAA,CAAuBnQ,CAAAA,CAAS,MAAA,CAAQ8I,CAAAA,EAAMA,EAAE,IAAA,GAAS,QAAQ,EAEjE7G,CAAAA,CAAS,IAAA,CAAK,OAAO,QAAA,CAAS,MAAA,CAAO,CACvC,KAAA,CAAO2G,EAAO,KAAA,EAAS,IAAA,CAAK,aAC5B,QAAA,CAAU,IAAA,CAAK,eAAeuH,CAAoB,CAAA,CAClD,UAAA,CAAYvH,CAAAA,CAAO,WAAa,IAAA,CAChC,WAAA,CAAaA,EAAO,WAAA,CACpB,KAAA,CAAOA,EAAO,IAAA,CACd,cAAA,CAAgBA,CAAAA,CAAO,IAAA,CACvB,GAAI6F,CAAAA,EAAiB,CAAE,OAAQA,CAAAA,CAAc,OAAQ,EACrD,GAAI7F,CAAAA,CAAO,KAAA,EAASA,CAAAA,CAAO,MAAM,MAAA,CAAS,CAAA,EAAK,CAC3C,KAAA,CAAO,IAAA,CAAK,YAAYA,CAAAA,CAAO,KAAK,CACxC,CAAA,CACA,GAAIA,CAAAA,CAAO,UAAA,EAAcA,EAAO,UAAA,GAAe,MAAA,EAAU,CACrD,WAAA,CAAa,IAAA,CAAK,gBAAA,CAAiBA,CAAAA,CAAO,UAAU,CACxD,CACJ,CAAC,CAAA,CAEGwH,CAAAA,CAAsB,KACtBC,CAAAA,CAAkB,EAAA,CAGtB,UAAA,IAAiB7M,CAAAA,IAASvB,EAAQ,CAmB9B,GAlBIuB,EAAM,IAAA,GAAS,qBAAA,EACXA,EAAM,aAAA,EAAe,IAAA,GAAS,UAAA,GAC9B4M,CAAAA,CAAiB5M,EAAM,aAAA,CACvB6M,CAAAA,CAAkB,GAClB9I,CAAAA,CAAO,aAAA,CAAc6I,EAAe,IAAA,CAAMA,CAAAA,CAAe,EAAE,CAAA,CAAA,CAI/D5M,EAAM,IAAA,GAAS,qBAAA,GACXA,EAAM,KAAA,EAAO,IAAA,GAAS,cACtB+D,CAAAA,CAAO,SAAA,CAAU/D,CAAAA,CAAM,KAAA,CAAM,IAAI,CAAA,CAEjCA,CAAAA,CAAM,OAAO,IAAA,GAAS,kBAAA,GACtB6M,GAAmB7M,CAAAA,CAAM,KAAA,CAAM,YAAA,CAC/B+D,CAAAA,CAAO,mBAAmB/D,CAAAA,CAAM,KAAA,CAAM,YAAY,CAAA,CAAA,CAAA,CAItDA,CAAAA,CAAM,OAAS,oBAAA,EACX4M,CAAAA,CAAgB,CAChB,GAAI,CACA,IAAMjP,CAAAA,CAAO,KAAK,KAAA,CACdiP,CAAAA,CAAe,MACT,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAe,KAAK,EACnCC,CAAAA,EAAmB,IAC7B,EACA9I,CAAAA,CAAO,WAAA,CAAYpG,CAAI,EAC3B,CAAA,MAAS0N,CAAAA,CAAG,CACR,QAAQ,KAAA,CAAM,iCAAA,CAAmCA,CAAC,CAAA,CAClDtH,CAAAA,CAAO,YAAY,EAAE,EACzB,CACA6I,EAAiB,IAAA,CACjBC,CAAAA,CAAkB,GACtB,CAGJ,MAAO9I,EAAO,KAAA,GAClB,CAGA,IAAM9D,EAAe,MAAMxB,CAAAA,CAAO,cAAa,CAC3CwB,CAAAA,CAAa,OACb8D,CAAAA,CAAO,UAAA,CAAW,CACd,YAAA,CAAc9D,EAAa,KAAA,CAAM,YAAA,CACjC,iBAAkBA,CAAAA,CAAa,KAAA,CAAM,cACrC,WAAA,CACIA,CAAAA,CAAa,KAAA,CAAM,YAAA,CAAeA,EAAa,KAAA,CAAM,aAC7D,CAAC,CAAA,CAGL8D,CAAAA,CAAO,MAAK,CACZ,MAAOA,CAAAA,CAAO,KAAA,GAClB,CAAA,MAAS/G,CAAAA,CAAY,CACjB,MAAIA,CAAAA,YAAiByP,oBAAU,QAAA,CACrB,IAAItJ,CAAAA,CAAcnG,CAAAA,CAAM,QAAS,WAAA,CAAaA,CAAAA,CAAM,MAAM,CAAA,CAE9D,IAAImG,EAAc,CAAA,0BAAA,EAA6BnG,CAAAA,CAAM,OAAO,CAAA,CAAA,CAAI,WAAW,CACrF,CACJ,CAKQ,cAAA,CAAeR,CAAAA,CAAqB,CACxC,OAAOA,CAAAA,CAAS,GAAA,CAAKC,CAAAA,EAAQ,CACzB,IAAMkD,CAAAA,CAAiB,EAAC,CAWxB,GARIlD,EAAI,OAAA,EACJkD,CAAAA,CAAQ,IAAA,CAAK,CACT,KAAM,MAAA,CACN,IAAA,CAAMlD,EAAI,OACd,CAAC,EAIDA,CAAAA,CAAI,SAAA,CACJ,IAAA,IAAWqQ,CAAAA,IAAYrQ,EAAI,SAAA,CACvBkD,CAAAA,CAAQ,KAAK,CACT,IAAA,CAAM,WACN,EAAA,CAAImN,CAAAA,CAAS,EAAA,CACb,IAAA,CAAMA,EAAS,IAAA,CACf,KAAA,CAAOA,EAAS,SACpB,CAAC,EAKT,GAAIrQ,CAAAA,CAAI,WAAA,CACJ,IAAA,IAAWiC,KAAUjC,CAAAA,CAAI,WAAA,CACrBkD,EAAQ,IAAA,CAAK,CACT,KAAM,aAAA,CACN,WAAA,CAAajB,CAAAA,CAAO,UAAA,CACpB,QAAS,IAAA,CAAK,SAAA,CAAUA,EAAO,MAAM,CAAA,CACrC,GAAIA,CAAAA,CAAO,KAAA,EAAS,CAAE,QAAA,CAAU,IAAK,CACzC,CAAC,EAIT,OAAO,CACH,KAAMjC,CAAAA,CAAI,IAAA,GAAS,WAAA,CAAc,WAAA,CAAc,OAC/C,OAAA,CAASkD,CAAAA,CAAQ,SAAW,CAAA,EAAKA,CAAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,GAAS,MAAA,CAC/CA,CAAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,CACXA,CACV,CACJ,CAAC,CACL,CAKQ,WAAA,CAAYoN,EAAe,CAC/B,OAAOA,EAAM,GAAA,CAAKxN,CAAAA,GAAU,CACxB,IAAA,CAAMA,CAAAA,CAAK,KACX,WAAA,CAAaA,CAAAA,CAAK,WAAA,CAClB,YAAA,CAAc,KAAK,eAAA,CAAgBA,CAAAA,CAAK,UAAU,CACtD,CAAA,CAAE,CACN,CAKQ,gBAAA,CAAiByN,CAAAA,CAA2C,CAChE,GAAIA,CAAAA,GAAe,MAAA,CAKnB,OAAIA,CAAAA,GAAe,UAAA,CACR,CAAE,IAAA,CAAM,KAAM,CAAA,CAIrB,OAAOA,GAAe,QAAA,EAAY,MAAA,GAAUA,EACrC,CACH,IAAA,CAAM,OACN,IAAA,CAAMA,CAAAA,CAAW,IACrB,CAAA,CAGG,CAAE,IAAA,CAAM,MAAO,CAC1B,CAKQ,eAAA,CAAgBC,EAAmB,CACvC,IAAMC,CAAAA,CAAMD,CAAAA,CAAQ,KAEpB,GAAI,CAACC,EACD,OAAO,CACH,KAAM,QAAA,CACN,UAAA,CAAY,EAAC,CACb,SAAU,EACd,EAGJ,OAAQA,CAAAA,CAAI,UACR,KAAK,WAAA,CACD,OAAO,CACH,IAAA,CAAM,QAAA,CACN,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,EACJ,KAAK,WAAA,CACD,OAAO,CACH,IAAA,CAAM,SACN,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,YAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,aACD,OAAO,CACH,IAAA,CAAM,SAAA,CACN,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,UAAA,CACD,OAAO,CACH,IAAA,CAAM,QACN,KAAA,CAAO,IAAA,CAAK,gBAAgBA,CAAAA,CAAI,IAAI,CAAA,CACpC,GAAIA,EAAI,WAAA,EAAe,CAAE,YAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,WAAA,CACD,IAAMC,EAAkC,EAAC,CACnCC,EAAqB,EAAC,CACtBC,EAAQH,CAAAA,CAAI,KAAA,EAAM,CAExB,IAAA,GAAW,CAAC3O,CAAAA,CAAKL,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQmP,CAAK,CAAA,CAC3CF,CAAAA,CAAW5O,CAAG,CAAA,CAAI,KAAK,eAAA,CAAgBL,CAAK,EACtCA,CAAAA,CAAc,UAAA,MAChBkP,CAAAA,CAAS,IAAA,CAAK7O,CAAG,CAAA,CAIzB,OAAO,CACH,IAAA,CAAM,SACN,UAAA,CAAA4O,CAAAA,CACA,GAAIC,CAAAA,CAAS,MAAA,CAAS,CAAA,EAAK,CAAE,SAAAA,CAAS,CAAA,CACtC,GAAIF,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,EACJ,KAAK,SAAA,CACD,OAAO,CACH,IAAA,CAAM,SACN,IAAA,CAAMA,CAAAA,CAAI,MAAA,CACV,GAAIA,EAAI,WAAA,EAAe,CAAE,YAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,aAAA,CACD,OAAO,KAAK,eAAA,CAAgBA,CAAAA,CAAI,SAAS,CAAA,CAC7C,KAAK,cACD,OAAO,CACH,GAAG,IAAA,CAAK,gBAAgBA,CAAAA,CAAI,SAAS,EACrC,QAAA,CAAU,IACd,EACJ,KAAK,UAAA,CAED,OAAIA,CAAAA,CAAI,SAAWA,CAAAA,CAAI,OAAA,CAAQ,OAAS,CAAA,CAC7B,IAAA,CAAK,gBAAgBA,CAAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,EAEvC,CAAE,IAAA,CAAM,QAAS,CAAA,CAC5B,KAAK,aACD,OAAO,CACH,IAAA,CAAM,OAAOA,EAAI,KAAA,CACjB,IAAA,CAAM,CAACA,CAAAA,CAAI,KAAK,EAChB,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,YAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,aACD,OAAO,CACH,GAAG,IAAA,CAAK,gBAAgBA,CAAAA,CAAI,SAAS,EACrC,OAAA,CAASA,CAAAA,CAAI,cACjB,CAAA,CACJ,QACI,OAAA,OAAA,CAAQ,KAAK,CAAA,sBAAA,EAAyBA,CAAAA,CAAI,QAAQ,CAAA,wBAAA,CAA0B,CAAA,CACrE,CAAE,IAAA,CAAM,QAAS,CAChC,CACJ,CACJ,EAKO,SAASI,GAAwBlI,CAAAA,CAA2C,CAE/E,OADiB,IAAIoH,CAAAA,CAAkBpH,CAAM,CAAA,CAC7B,gBACpB,CCxSO,IAAMmI,CAAAA,CAAN,KAAqB,CAChB,MAAA,CACA,aAER,WAAA,CAAYnI,CAAAA,CAAsB,CAC9B,IAAA,CAAK,MAAA,CAAS,IAAIoI,+BAAAA,CAAmBpI,EAAO,MAAM,CAAA,CAClD,KAAK,YAAA,CAAeA,CAAAA,CAAO,OAAS,mBACxC,CAKA,gBAAmC,CAC/B,OAAO,CAAC5I,CAAAA,CAAqBkQ,CAAAA,GAClB,KAAK,UAAA,CAAWlQ,CAAAA,CAAUkQ,CAAU,CAEnD,CAKA,MAAe,UAAA,CACXlQ,EACA4I,CAAAA,CAC2B,CAC3B,IAAMrB,CAAAA,CAAS,IAAIhF,EAEnB,GAAI,CAEA,IAAMkM,CAAAA,CAAgBzO,EAAS,IAAA,CAAM,CAAA,EAAM,EAAE,IAAA,GAAS,QAAQ,EAExDiR,CAAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,kBAAA,CAAmB,CACzC,KAAA,CAAOrI,CAAAA,CAAO,OAAS,IAAA,CAAK,YAAA,CAE5B,GAAI6F,CAAAA,EAAiB,CACjB,iBAAA,CAAmBA,CAAAA,CAAc,OACrC,CAAA,CACA,gBAAA,CAAkB,CACd,WAAA,CAAa7F,CAAAA,CAAO,YACpB,eAAA,CAAiBA,CAAAA,CAAO,SAAA,CACxB,IAAA,CAAMA,EAAO,IAAA,CACb,aAAA,CAAeA,EAAO,IAC1B,CAAA,CAEA,GAAIA,CAAAA,CAAO,KAAA,EAASA,CAAAA,CAAO,KAAA,CAAM,OAAS,CAAA,EAAK,CAC3C,MAAO,CACH,CACI,qBAAsB,IAAA,CAAK,WAAA,CAAYA,CAAAA,CAAO,KAAK,CACvD,CACJ,CACJ,EAEA,GAAIA,CAAAA,CAAO,YAAcA,CAAAA,CAAO,UAAA,GAAe,MAAA,EAAU,CACrD,WAAY,IAAA,CAAK,gBAAA,CAAiBA,EAAO,UAAU,CACvD,CACJ,CAAC,CAAA,CAEKqF,CAAAA,CAAoB,IAAA,CAAK,eAAejO,CAAQ,CAAA,CAEtD,GAAIiO,CAAAA,CAAkB,MAAA,GAAW,EAC7B,MAAM,IAAItH,CAAAA,CAAc,qBAAA,CAAuB,QAAQ,CAAA,CAG3D,IAAMuK,EAAcjD,CAAAA,CAAkBA,CAAAA,CAAkB,OAAS,CAAC,CAAA,CAC5DkD,CAAAA,CAAUlD,CAAAA,CAAkB,MAAM,CAAA,CAAG,CAAA,CAAE,EAQvC/L,CAAAA,CAAS,MALF+O,EAAM,SAAA,CAAU,CACzB,OAAA,CAAAE,CACJ,CAAC,CAAA,CAGyB,iBAAA,CAAkBD,EAAY,KAAK,CAAA,CAG7D,cAAiBtQ,CAAAA,IAASsB,CAAAA,CAAO,MAAA,CAAQ,CACrC,IAAMkP,CAAAA,CAAYxQ,CAAAA,CAAM,MAAK,CACzBwQ,CAAAA,GACA7J,EAAO,SAAA,CAAU6J,CAAS,CAAA,CAE1B,MAAO7J,EAAO,KAAA,EAAM,CAAA,CAIxB,IAAM8J,CAAAA,CAAgBzQ,CAAAA,CAAM,eAAc,CAC1C,GAAIyQ,CAAAA,CACA,IAAA,IAAWC,KAAQD,CAAAA,CAAe,CAE9B,IAAMnO,CAAAA,CAAS,CAAA,KAAA,EAAQ,KAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,MAAA,CAAO,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAE5EqE,CAAAA,CAAO,aAAA,CAAc+J,EAAK,IAAA,CAAMpO,CAAM,EACtCqE,CAAAA,CAAO,WAAA,CAAY+J,EAAK,IAA+B,CAAA,CACvD,MAAO/J,CAAAA,CAAO,QAClB,CAER,CAGA,IAAM7C,CAAAA,CAAW,MAAMxC,CAAAA,CAAO,QAAA,CAC1BwC,CAAAA,CAAS,aAAA,EACT6C,EAAO,UAAA,CAAW,CACd,aAAc7C,CAAAA,CAAS,aAAA,CAAc,kBAAoB,CAAA,CAEzD,gBAAA,CACIA,CAAAA,CAAS,aAAA,CAAc,uBACtBA,CAAAA,CAAS,aAAA,CAAc,iBAAmB,CAAA,GAC1CA,CAAAA,CAAS,cAAc,gBAAA,EAAoB,CAAA,CAAA,CAChD,WAAA,CAAaA,CAAAA,CAAS,cAAc,eAAA,EAAmB,CAC3D,CAAC,CAAA,CAGL6C,CAAAA,CAAO,MAAK,CACZ,MAAOA,CAAAA,CAAO,KAAA,GAClB,CAAA,MAAS/G,CAAAA,CAAY,CACjB,MAAM,IAAImG,EACN,CAAA,uBAAA,EAA0BnG,CAAAA,CAAM,OAAO,CAAA,CAAA,CACvC,QACJ,CACJ,CACJ,CAOQ,cAAA,CAAeR,CAAAA,CAAqB,CACxC,OAAOA,CAAAA,CACF,MAAA,CAAQ8I,CAAAA,EAAMA,EAAE,IAAA,GAAS,QAAQ,EACjC,GAAA,CAAK7I,CAAAA,EAAQ,CACV,IAAMsR,CAAAA,CAAe,EAAC,CAQtB,GALItR,CAAAA,CAAI,OAAA,EACJsR,EAAM,IAAA,CAAK,CAAE,KAAMtR,CAAAA,CAAI,OAAQ,CAAC,CAAA,CAIhCA,EAAI,SAAA,EAAaA,CAAAA,CAAI,UAAU,MAAA,CAAS,CAAA,CACxC,QAAWqQ,CAAAA,IAAYrQ,CAAAA,CAAI,SAAA,CACvBsR,CAAAA,CAAM,KAAK,CACP,YAAA,CAAc,CACV,IAAA,CAAMjB,CAAAA,CAAS,KACf,IAAA,CAAMA,CAAAA,CAAS,SACnB,CACJ,CAAC,CAAA,CAKT,GAAIrQ,EAAI,WAAA,EAAeA,CAAAA,CAAI,YAAY,MAAA,CAAS,CAAA,CAC5C,IAAA,IAAWuR,CAAAA,IAAcvR,EAAI,WAAA,CAAa,CAEtC,IAAMqQ,CAAAA,CAAWtQ,CAAAA,CACZ,QAAQ8I,CAAAA,EAAKA,CAAAA,CAAE,SAAA,EAAa,EAAE,CAAA,CAC9B,IAAA,CAAK2I,GAAMA,CAAAA,CAAG,EAAA,GAAOD,EAAW,UAAU,CAAA,CAE/CD,CAAAA,CAAM,IAAA,CAAK,CACP,gBAAA,CAAkB,CACd,KAAMjB,CAAAA,EAAU,IAAA,EAAQ,UACxB,QAAA,CAAU,CACN,OAAQkB,CAAAA,CAAW,MAAA,CACnB,GAAIA,CAAAA,CAAW,KAAA,EAAS,CAAE,KAAA,CAAOA,CAAAA,CAAW,KAAM,CACtD,CACJ,CACJ,CAAC,EACL,CAGJ,OAAO,CACH,IAAA,CAAMvR,CAAAA,CAAI,OAAS,WAAA,EAAeA,CAAAA,CAAI,IAAA,GAAS,MAAA,CAAS,QAAU,MAAA,CAClE,KAAA,CAAOsR,EAAM,MAAA,CAAS,CAAA,CAAIA,EAAQ,CAAC,CAAE,IAAA,CAAMtR,CAAAA,CAAI,SAAW,EAAG,CAAC,CAClE,CACJ,CAAC,CACT,CAMQ,WAAA,CAAYsQ,CAAAA,CAAe,CAC/B,OAAOA,CAAAA,CAAM,GAAA,CAAKxN,GAAS,CAEvB,IAAI2O,EAAkB,CAClB,IAAA,CAAM,QAAA,CACN,UAAA,CAAY,EAAC,CACb,QAAA,CAAU,EACd,CAAA,CAIA,GAAI3O,CAAAA,CAAK,UAAA,EAAc,OAAOA,CAAAA,CAAK,YAAe,QAAA,CAC9C,GAAI,CAEA,IAAM4O,CAAAA,CAAU5O,EAAK,UAAA,CAAmB,IAAA,CACxC,GAAI4O,CAAAA,EAEIA,EAAO,QAAA,GAAa,WAAA,EAAeA,EAAO,KAAA,CAAO,CACjD,IAAMd,CAAAA,CAAQc,CAAAA,CAAO,KAAA,EAAM,CAC3BD,EAAW,UAAA,CAAa,MAAA,CAAO,QAAQb,CAAK,CAAA,CAAE,OAC1C,CAACe,CAAAA,CAAK,CAAC7P,CAAAA,CAAKL,CAAK,CAAA,IACbkQ,CAAAA,CAAI7P,CAAG,CAAA,CAAI,IAAA,CAAK,gBAAgBL,CAAK,CAAA,CAChCA,CAAAA,CAAM,UAAA,MACPgQ,CAAAA,CAAW,QAAA,CAAS,KAAK3P,CAAG,CAAA,CAEzB6P,GAEX,EACJ,EACJ,CAER,OAASpR,CAAAA,CAAO,CAEZ,QAAQ,IAAA,CAAK,CAAA,sCAAA,EAAyCuC,EAAK,IAAI,CAAA,CAAA,CAAA,CAAKvC,CAAK,EAC7E,CAGJ,OAAO,CACH,KAAMuC,CAAAA,CAAK,IAAA,CACX,YAAaA,CAAAA,CAAK,WAAA,CAClB,UAAA,CAAA2O,CACJ,CACJ,CAAC,CACL,CAKQ,eAAA,CAAgBjB,CAAAA,CAAmB,CACvC,IAAMC,CAAAA,CAAMD,CAAAA,CAAQ,IAAA,CAEpB,GAAI,CAACC,CAAAA,CACD,OAAO,CAAE,IAAA,CAAM,QAAS,CAAA,CAG5B,OAAQA,CAAAA,CAAI,QAAA,EACR,KAAK,WAAA,CACD,OAAO,CAAE,IAAA,CAAM,SAAU,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,YAAaA,CAAAA,CAAI,WAAY,CAAG,CAAA,CACtF,KAAK,YACD,OAAO,CAAE,IAAA,CAAM,QAAA,CAAU,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAAG,CAAA,CACtF,KAAK,YAAA,CACD,OAAO,CAAE,IAAA,CAAM,UAAW,GAAIA,CAAAA,CAAI,aAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAAG,CAAA,CACvF,KAAK,WACD,OAAO,CACH,KAAM,OAAA,CACN,KAAA,CAAO,IAAA,CAAK,eAAA,CAAgBA,EAAI,IAAI,CAAA,CACpC,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,EACJ,KAAK,WAAA,CACD,IAAMC,CAAAA,CAAkC,GAClCC,CAAAA,CAAqB,EAAC,CACtBC,CAAAA,CAAQH,EAAI,KAAA,EAAM,CAExB,OAAW,CAAC3O,CAAAA,CAAKL,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQmP,CAAK,EAC3CF,CAAAA,CAAW5O,CAAG,EAAI,IAAA,CAAK,eAAA,CAAgBL,CAAK,CAAA,CACtCA,CAAAA,CAAc,UAAA,IAAa,EAC7BkP,EAAS,IAAA,CAAK7O,CAAG,EAIzB,OAAO,CACH,KAAM,QAAA,CACN,UAAA,CAAA4O,CAAAA,CACA,GAAIC,EAAS,MAAA,CAAS,CAAA,EAAK,CAAE,QAAA,CAAAA,CAAS,EACtC,GAAIF,CAAAA,CAAI,WAAA,EAAe,CAAE,YAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,UACD,OAAO,CACH,IAAA,CAAM,QAAA,CACN,KAAMA,CAAAA,CAAI,MAAA,CACV,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,EACJ,KAAK,aAAA,CACD,OAAO,IAAA,CAAK,eAAA,CAAgBA,EAAI,SAAS,CAAA,CAC7C,KAAK,aAAA,CACD,OAAO,CACH,GAAG,KAAK,eAAA,CAAgBA,CAAAA,CAAI,SAAS,CAAA,CACrC,QAAA,CAAU,IACd,CAAA,CACJ,QACI,OAAO,CAAE,KAAM,QAAS,CAChC,CACJ,CAKQ,gBAAA,CAAiBF,CAAAA,CAAsC,CAC3D,OAAIA,CAAAA,GAAe,MAAA,CACR,CACH,qBAAA,CAAuB,CACnB,KAAMqB,gCAAAA,CAAoB,IAC9B,CACJ,CAAA,CAGArB,CAAAA,GAAe,WACR,CACH,qBAAA,CAAuB,CACnB,IAAA,CAAMqB,gCAAAA,CAAoB,GAC9B,CACJ,CAAA,CAIA,OAAOrB,CAAAA,EAAe,UAAY,MAAA,GAAUA,CAAAA,CACrC,CACH,qBAAA,CAAuB,CACnB,KAAMqB,gCAAAA,CAAoB,GAAA,CAC1B,oBAAA,CAAsB,CAACrB,EAAW,IAAI,CAC1C,CACJ,CAAA,CAIG,CACH,sBAAuB,CACnB,IAAA,CAAMqB,gCAAAA,CAAoB,IAC9B,CACJ,CACJ,CACJ,EAKO,SAASC,EAAAA,CAAqBlJ,EAAwC,CAEzE,OADiB,IAAImI,CAAAA,CAAenI,CAAM,CAAA,CAC1B,cAAA,EACpB,CCzUO,IAAMmJ,CAAAA,CAAN,KAAqB,CAChB,MAAA,CACA,YAAA,CAER,YAAYnJ,CAAAA,CAAsB,CAC9B,KAAK,MAAA,CAAS,IAAIoJ,mBAAAA,CAAO,CACrB,OAAQpJ,CAAAA,CAAO,MAAA,CACf,QAASA,CAAAA,CAAO,OAAA,CAChB,aAAcA,CAAAA,CAAO,YAAA,CACrB,OAAA,CAASA,CAAAA,CAAO,SAAW,GAAA,CAC3B,UAAA,CAAYA,EAAO,UAAA,EAAc,CAAA,CACjC,eAAgBA,CAAAA,CAAO,OAC3B,CAAC,CAAA,CACD,KAAK,YAAA,CAAeA,CAAAA,CAAO,OAAS,sBACxC,CAKA,gBAAmC,CAC/B,OAAO,CAAC5I,CAAAA,CAAqBkQ,IAClB,IAAA,CAAK,UAAA,CAAWlQ,EAAUkQ,CAAU,CAEnD,CAMA,MAAc,sBAAA,CACVnP,CAAAA,CAC+E,CAE/E,IAAMkR,CAAAA,CAAqB,CAAC,GAAGlR,CAAM,CAAA,CAAE,SAAQ,CAAE,IAAA,CAAM6J,CAAAA,EAAMA,CAAAA,CAAE,OAAS,IAAI,CAAA,CAC5E,OAAKqH,CAAAA,EAAoB,KAAA,CAClB,CAAE,KAAA,CAAOA,CAAAA,CAAmB,KAAM,CAAA,CADF,IAE3C,CAKA,MAAe,WACXjS,CAAAA,CACA4I,CAAAA,CAC2B,CAC3B,IAAMrB,CAAAA,CAAS,IAAIhF,CAAAA,CAEnB,GAAI,CACA,IAAMN,EAAS,MAAM,IAAA,CAAK,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CACrD,MAAO2G,CAAAA,CAAO,KAAA,EAAS,KAAK,YAAA,CAC5B,QAAA,CAAU,KAAK,cAAA,CAAe5I,CAAQ,CAAA,CACtC,WAAA,CAAa4I,EAAO,WAAA,CACpB,UAAA,CAAYA,EAAO,SAAA,CACnB,KAAA,CAAOA,EAAO,IAAA,CACd,iBAAA,CAAmBA,EAAO,gBAAA,CAC1B,gBAAA,CAAkBA,EAAO,eAAA,CACzB,IAAA,CAAMA,EAAO,IAAA,CACb,MAAA,CAAQ,GACR,cAAA,CAAgB,CAAE,aAAA,CAAe,CAAA,CAAK,EACtC,GAAIA,CAAAA,CAAO,OAASA,CAAAA,CAAO,KAAA,CAAM,OAAS,CAAA,EAAK,CAC3C,KAAA,CAAO,IAAA,CAAK,YAAYA,CAAAA,CAAO,KAAK,EACpC,WAAA,CAAa,IAAA,CAAK,iBAAiBA,CAAAA,CAAO,UAAU,CACxD,CACJ,CAAC,CAAA,CAGKsJ,CAAAA,CAAgF,IAAI,GAAA,CACpFC,CAAAA,CAA2D,EAAC,CAElE,UAAA,IAAiBvR,CAAAA,IAASqB,CAAAA,CAAQ,CAC9BkQ,CAAAA,CAAU,IAAA,CAAKvR,CAAK,CAAA,CAEpB,IAAMoC,EAAQpC,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,MAEhC,GAAKoC,CAAAA,CAQL,IALIA,CAAAA,CAAM,OAAA,EACNuE,EAAO,SAAA,CAAUvE,CAAAA,CAAM,OAAO,CAAA,CAI9BA,EAAM,UAAA,CACN,IAAA,IAAWsN,KAAYtN,CAAAA,CAAM,UAAA,CAAY,CACrC,IAAM+H,CAAAA,CAAQuF,CAAAA,CAAS,KAAA,CAGlB4B,EAAgB,GAAA,CAAInH,CAAK,GAC1BmH,CAAAA,CAAgB,GAAA,CAAInH,EAAO,CACvB,EAAA,CAAI,EAAA,CACJ,IAAA,CAAM,GACN,SAAA,CAAW,EACf,CAAC,CAAA,CAGL,IAAMxH,EAAW2O,CAAAA,CAAgB,GAAA,CAAInH,CAAK,CAAA,CAGtCuF,EAAS,EAAA,GACT/M,CAAAA,CAAS,GAAK+M,CAAAA,CAAS,EAAA,CAAA,CAGvBA,EAAS,QAAA,EAAU,IAAA,GACnB/M,CAAAA,CAAS,IAAA,CAAO+M,EAAS,QAAA,CAAS,IAAA,CAElC/I,EAAO,aAAA,CAAchE,CAAAA,CAAS,KAAMA,CAAAA,CAAS,EAAE,CAAA,CAAA,CAG/C+M,CAAAA,CAAS,UAAU,SAAA,GACnB/M,CAAAA,CAAS,WAAa+M,CAAAA,CAAS,QAAA,CAAS,UACxC/I,CAAAA,CAAO,kBAAA,CAAmB+I,CAAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAE7D,CAIJ,GAAI1P,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,aAAA,EACdA,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,CAAE,aAAA,GAAkB,aAAc,CAEjD,IAAA,GAAW,CAACmK,CAAAA,CAAOxH,CAAQ,CAAA,GAAK2O,CAAAA,CAAgB,SAAQ,CACpD,GAAI,CACA,IAAM/Q,CAAAA,CAAO,KAAK,KAAA,CAAMoC,CAAAA,CAAS,SAAA,EAAa,IAAI,EAClDgE,CAAAA,CAAO,WAAA,CAAYpG,CAAI,EAC3B,CAAA,MAAS0N,EAAG,CACR,OAAA,CAAQ,MAAM,CAAA,wCAAA,EAA2CtL,CAAAA,CAAS,IAAI,CAAA,CAAA,CAAA,CAAKsL,CAAC,EAC5EtH,CAAAA,CAAO,WAAA,CAAY,EAAE,EACzB,CAEJ2K,CAAAA,CAAgB,QACpB,CAGJ,MAAO3K,CAAAA,CAAO,KAAA,IAClB,CAEA,IAAM6K,CAAAA,CAAa,MAAM,KAAK,sBAAA,CAAuBD,CAAS,EAC1DC,CAAAA,EAAY,KAAA,EACZ7K,EAAO,UAAA,CAAW,CACd,YAAA,CAAc6K,CAAAA,CAAW,MAAM,aAAA,CAC/B,gBAAA,CAAkBA,EAAW,KAAA,CAAM,iBAAA,CACnC,YAAaA,CAAAA,CAAW,KAAA,CAAM,YAClC,CAAC,EAGL7K,CAAAA,CAAO,IAAA,GACP,MAAOA,CAAAA,CAAO,QAClB,CAAA,MAAS/G,CAAAA,CAAY,CACjB,MAAIA,CAAAA,YAAiBwR,mBAAAA,CAAO,SAClB,IAAIrL,CAAAA,CACNnG,EAAM,OAAA,CACN,QAAA,CACAA,CAAAA,CAAM,MACV,EAEE,IAAImG,CAAAA,CACN,0BAA0BnG,CAAAA,CAAM,OAAO,GACvC,QACJ,CACJ,CACJ,CAKQ,eAAeR,CAAAA,CAAqB,CACxC,OAAOA,CAAAA,CAAS,GAAA,CAAKC,GAAQ,CACzB,IAAMoS,CAAAA,CAAiB,CACnB,KAAMpS,CAAAA,CAAI,IAAA,CACV,QAASA,CAAAA,CAAI,OAAA,EAAW,IAC5B,CAAA,CAGA,OAAIA,CAAAA,CAAI,SAAA,EAAaA,EAAI,SAAA,CAAU,MAAA,CAAS,IACxCoS,CAAAA,CAAU,UAAA,CAAapS,EAAI,SAAA,CAAU,GAAA,CAAKwR,CAAAA,GAAQ,CAC9C,GAAIA,CAAAA,CAAG,EAAA,CACP,KAAM,UAAA,CACN,QAAA,CAAU,CACN,IAAA,CAAMA,CAAAA,CAAG,IAAA,CACT,SAAA,CAAW,KAAK,SAAA,CAAUA,CAAAA,CAAG,SAAS,CAC1C,CACJ,EAAE,CAAA,CAAA,CAIFxR,CAAAA,CAAI,IAAA,GAAS,MAAA,EAAUA,EAAI,WAAA,EAAeA,CAAAA,CAAI,YAAY,MAAA,CAAS,CAAA,GACnEoS,EAAU,YAAA,CAAepS,CAAAA,CAAI,WAAA,CAAY,CAAC,GAAG,UAAA,CAC7CoS,CAAAA,CAAU,QAAU,IAAA,CAAK,SAAA,CAAUpS,EAAI,WAAA,CAAY,CAAC,CAAA,EAAG,MAAM,GAG1DoS,CACX,CAAC,CACL,CAKQ,WAAA,CAAY9B,EAAe,CAC/B,OAAOA,CAAAA,CAAM,GAAA,CAAKxN,IAAU,CACxB,IAAA,CAAM,WACN,QAAA,CAAU,CACN,KAAMA,CAAAA,CAAK,IAAA,CACX,WAAA,CAAaA,CAAAA,CAAK,YAClB,UAAA,CAAY,IAAA,CAAK,gBAAgBA,CAAAA,CAAK,UAAU,CACpD,CACJ,CAAA,CAAE,CACN,CAKQ,iBAAiByN,CAAAA,CAA2C,CAChE,OAAI,CAACA,CAAAA,EAAcA,IAAe,MAAA,CACvB,MAAA,CAGPA,CAAAA,GAAe,MAAA,CACR,OAGPA,CAAAA,GAAe,UAAA,CACR,WAIP,OAAOA,CAAAA,EAAe,UAAY,MAAA,GAAUA,CAAAA,CACrC,CACH,IAAA,CAAM,WACN,QAAA,CAAU,CACN,KAAMA,CAAAA,CAAW,IACrB,CACJ,CAAA,CAGG,MACX,CAKQ,eAAA,CAAgBC,EAAmB,CACvC,IAAMC,EAAMD,CAAAA,CAAQ,IAAA,CAEpB,GAAI,CAACC,CAAAA,CACD,OAAO,CACH,KAAM,QAAA,CACN,UAAA,CAAY,EAAC,CACb,QAAA,CAAU,EACd,CAAA,CAGJ,OAAQA,CAAAA,CAAI,UACR,KAAK,YACD,OAAO,CACH,KAAM,QAAA,CACN,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,WAAA,CACD,OAAO,CACH,IAAA,CAAM,SACN,GAAIA,CAAAA,CAAI,aAAe,CAAE,WAAA,CAAaA,EAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,aACD,OAAO,CACH,KAAM,SAAA,CACN,GAAIA,EAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,UAAA,CACD,OAAO,CACH,IAAA,CAAM,OAAA,CACN,KAAA,CAAO,IAAA,CAAK,gBAAgBA,CAAAA,CAAI,IAAI,EACpC,GAAIA,CAAAA,CAAI,aAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,YACD,IAAMC,CAAAA,CAAkC,EAAC,CACnCC,CAAAA,CAAqB,EAAC,CACtBC,EAAQH,CAAAA,CAAI,KAAA,GAElB,IAAA,GAAW,CAAC3O,EAAKL,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQmP,CAAK,CAAA,CAC3CF,CAAAA,CAAW5O,CAAG,CAAA,CAAI,IAAA,CAAK,gBAAgBL,CAAK,CAAA,CACtCA,CAAAA,CAAc,UAAA,MAChBkP,CAAAA,CAAS,IAAA,CAAK7O,CAAG,CAAA,CAIzB,OAAO,CACH,IAAA,CAAM,QAAA,CACN,WAAA4O,CAAAA,CACA,GAAIC,EAAS,MAAA,CAAS,CAAA,EAAK,CAAE,QAAA,CAAAA,CAAS,EACtC,GAAIF,CAAAA,CAAI,WAAA,EAAe,CAAE,YAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,UACD,OAAO,CACH,IAAA,CAAM,QAAA,CACN,KAAMA,CAAAA,CAAI,MAAA,CACV,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,EACJ,KAAK,aAAA,CACD,OAAO,IAAA,CAAK,eAAA,CAAgBA,EAAI,SAAS,CAAA,CAC7C,KAAK,aAAA,CACD,OAAO,CACH,GAAG,KAAK,eAAA,CAAgBA,CAAAA,CAAI,SAAS,CAAA,CACrC,QAAA,CAAU,IACd,CAAA,CACJ,KAAK,UAAA,CAED,OAAIA,EAAI,OAAA,EAAWA,CAAAA,CAAI,QAAQ,MAAA,CAAS,CAAA,CAC7B,IAAA,CAAK,eAAA,CAAgBA,EAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAEvC,CAAE,KAAM,QAAS,CAAA,CAC5B,KAAK,YAAA,CACD,OAAO,CACH,IAAA,CAAM,OAAOA,CAAAA,CAAI,KAAA,CACjB,KAAM,CAACA,CAAAA,CAAI,KAAK,CAAA,CAChB,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,YAAA,CACD,OAAO,CACH,GAAG,KAAK,eAAA,CAAgBA,CAAAA,CAAI,SAAS,CAAA,CACrC,OAAA,CAASA,CAAAA,CAAI,YAAA,EACjB,CAAA,CACJ,QACI,eAAQ,IAAA,CAAK,CAAA,sBAAA,EAAyBA,EAAI,QAAQ,CAAA,wBAAA,CAA0B,CAAA,CACrE,CAAE,KAAM,QAAS,CAChC,CACJ,CACJ,EAKO,SAAS4B,EAAAA,CAAqB1J,CAAAA,CAAwC,CAEzE,OADiB,IAAImJ,CAAAA,CAAenJ,CAAM,EAC1B,cAAA,EACpB,CC7UO,IAAM2J,CAAAA,CAAN,KAAqB,CAChB,OACA,OAAA,CAER,WAAA,CAAY3J,EAAsB,CAC9B,IAAA,CAAK,OAASA,CAAAA,CACd,IAAA,CAAK,OAAA,CAAUA,CAAAA,CAAO,SAAW,2BACrC,CAKA,gBAAmC,CAC/B,OAAO,CAAC5I,CAAAA,CAAqBkQ,CAAAA,GAClB,IAAA,CAAK,UAAA,CAAWlQ,EAAUkQ,CAAU,CAEnD,CAKA,MAAe,UAAA,CACXlQ,EACA4I,CAAAA,CAC2B,CAC3B,IAAMrB,CAAAA,CAAS,IAAIhF,EAEnB,GAAI,CACA,IAAMiQ,CAAAA,CAAmB,CACrB,MAAO5J,CAAAA,CAAO,KAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAS,UAAA,CAC5C,QAAA,CAAU,KAAK,cAAA,CAAe5I,CAAQ,EACtC,WAAA,CAAa4I,CAAAA,CAAO,WAAA,CACpB,UAAA,CAAYA,EAAO,SAAA,CACnB,MAAA,CAAQ,EACZ,CAAA,CAGIA,CAAAA,CAAO,OAASA,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,CAAA,GACtC4J,EAAY,KAAA,CAAQ,IAAA,CAAK,YAAY5J,CAAAA,CAAO,KAAK,GAIjDA,CAAAA,CAAO,UAAA,EAAcA,CAAAA,CAAO,UAAA,GAAe,SAC3C4J,CAAAA,CAAY,WAAA,CAAc,KAAK,gBAAA,CAAiB5J,CAAAA,CAAO,UAAU,CAAA,CAAA,CAGrE,IAAMlE,CAAAA,CAAW,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,iBAAA,CAAA,CAAqB,CAC7D,OAAQ,MAAA,CACR,OAAA,CAAS,CACL,cAAA,CAAgB,mBAChB,aAAA,CAAiB,CAAA,OAAA,EAAU,KAAK,MAAA,CAAO,MAAM,GAC7C,GAAG,IAAA,CAAK,MAAA,CAAO,OACnB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU8N,CAAW,CACpC,CAAC,CAAA,CAED,GAAI,CAAC9N,CAAAA,CAAS,GAAI,CACd,IAAMlE,EAAQ,MAAMkE,CAAAA,CAAS,MAAK,CAAE,KAAA,CAAM,KAAO,GAAG,CAAA,CACpD,MAAM,IAAIiC,CAAAA,CACNnG,CAAAA,CAAM,OAAO,OAAA,EAAW,qBAAA,CACxB,QAAA,CACAkE,CAAAA,CAAS,MACb,CACJ,CAEA,MAAO,IAAA,CAAK,WAAA,CAAYA,EAAS,IAAA,CAAO6C,CAAM,EAClD,CAAA,MAAS/G,EAAO,CACZ,MAAIA,aAAiBmG,CAAAA,CACXnG,CAAAA,CAEJ,IAAImG,CAAAA,CACN,CAAA,uBAAA,EAA0BnG,CAAK,CAAA,CAAA,CAC/B,QACJ,CACJ,CACJ,CAEA,MAAe,WAAA,CACXoP,EACArI,CAAAA,CAC2B,CAC3B,IAAM1D,CAAAA,CAAS+L,EAAK,SAAA,EAAU,CACxB9L,EAAU,IAAI,WAAA,CAChBC,EAAS,EAAA,CAGPmO,CAAAA,CAAgF,IAAI,GAAA,CAE1F,GAAI,CACA,OAAa,CACT,GAAM,CAAE,KAAA/N,CAAAA,CAAM,KAAA,CAAAzC,CAAM,CAAA,CAAI,MAAMmC,CAAAA,CAAO,IAAA,GACrC,GAAIM,CAAAA,CAAM,MAEVJ,CAAAA,EAAUD,CAAAA,CAAQ,OAAOpC,CAAAA,CAAO,CAAE,OAAQ,CAAA,CAAK,CAAC,EAChD,IAAM0N,CAAAA,CAAQrL,EAAO,KAAA,CAAM;AAAA,CAAI,EAC/BA,CAAAA,CAASqL,CAAAA,CAAM,GAAA,EAAI,EAAK,GAExB,IAAA,IAAWI,CAAAA,IAAQJ,CAAAA,CAAO,CACtB,GAAI,CAACI,CAAAA,CAAK,MAAK,EAAK,CAACA,EAAK,UAAA,CAAW,QAAQ,CAAA,CAAG,SAEhD,IAAM3P,CAAAA,CAAO2P,CAAAA,CAAK,KAAA,CAAM,CAAC,EACzB,GAAI3P,CAAAA,GAAS,QAAA,CAAU,CACnB0H,EAAO,IAAA,EAAK,CACZ,MAAOA,CAAAA,CAAO,KAAA,GACd,MACJ,CAEA,GAAI,CACA,IAAMnD,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMvE,CAAI,EAE9B,GAAIuE,CAAAA,CAAO,OAAA,GAAU,CAAC,EAAG,CACrB,IAAMpB,EAAQoB,CAAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,CAQhC,GALIpB,CAAAA,EAAO,SACPuE,CAAAA,CAAO,SAAA,CAAUvE,EAAM,OAAO,CAAA,CAI9BA,GAAO,UAAA,CACP,IAAA,IAAWsN,CAAAA,IAAYtN,CAAAA,CAAM,WAAY,CACrC,IAAM+H,EAAQuF,CAAAA,CAAS,KAAA,EAAS,EAG3B4B,CAAAA,CAAgB,GAAA,CAAInH,CAAK,CAAA,EAC1BmH,EAAgB,GAAA,CAAInH,CAAAA,CAAO,CACvB,EAAA,CAAIuF,EAAS,EAAA,EAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAIvF,CAAK,GAC9C,IAAA,CAAM,EAAA,CACN,UAAW,EACf,CAAC,CAAA,CAGL,IAAMxH,EAAW2O,CAAAA,CAAgB,GAAA,CAAInH,CAAK,CAAA,CAGtCuF,EAAS,EAAA,GACT/M,CAAAA,CAAS,EAAA,CAAK+M,CAAAA,CAAS,IAGvBA,CAAAA,CAAS,QAAA,EAAU,OACnB/M,CAAAA,CAAS,IAAA,CAAO+M,EAAS,QAAA,CAAS,IAAA,CAElC/I,CAAAA,CAAO,aAAA,CAAchE,EAAS,IAAA,CAAMA,CAAAA,CAAS,EAAE,CAAA,CAAA,CAG/C+M,EAAS,QAAA,EAAU,SAAA,GACnB/M,CAAAA,CAAS,SAAA,EAAa+M,EAAS,QAAA,CAAS,SAAA,CAExC/I,EAAO,kBAAA,CAAmB+I,CAAAA,CAAS,SAAS,SAAS,CAAA,EAE7D,CAIJ,GAAIlM,EAAO,OAAA,CAAQ,CAAC,EAAE,aAAA,CAAe,CAEjC,GAAIA,CAAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,gBAAkB,YAAA,CAAc,CAClD,OAAW,CAAC2G,CAAAA,CAAOxH,CAAQ,CAAA,GAAK2O,CAAAA,CAAgB,OAAA,EAAQ,CACpD,GAAI,CAEA,IAAM/Q,CAAAA,CAAOoC,CAAAA,CAAS,UAChB,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAS,SAAS,EAC7B,EAAC,CACPgE,EAAO,WAAA,CAAYpG,CAAI,EAC3B,CAAA,MAAS0N,CAAAA,CAAG,CACR,OAAA,CAAQ,MAAM,CAAA,wCAAA,EAA2CtL,CAAAA,CAAS,IAAI,CAAA,CAAA,CAAA,CAAKsL,CAAC,CAAA,CAC5EtH,CAAAA,CAAO,WAAA,CAAY,EAAE,EACzB,CAEJ2K,EAAgB,KAAA,GACpB,CAEA3K,CAAAA,CAAO,IAAA,EAAK,CACZ,MAAOA,EAAO,KAAA,EAAM,CACpB,MACJ,CACJ,CAEInD,CAAAA,CAAO,KAAA,EACPmD,CAAAA,CAAO,UAAA,CAAW,CACd,YAAA,CAAcnD,CAAAA,CAAO,MAAM,aAAA,EAAiB,CAAA,CAC5C,iBAAkBA,CAAAA,CAAO,KAAA,CAAM,iBAAA,EAAqB,CAAA,CACpD,YAAaA,CAAAA,CAAO,KAAA,CAAM,cAAgB,CAC9C,CAAC,EAGL,MAAOmD,CAAAA,CAAO,KAAA,GAClB,OAAS/G,CAAAA,CAAO,CACZ,QAAQ,KAAA,CAAM,+BAAA,CAAiCA,CAAK,EACxD,CACJ,CACJ,CACJ,QAAE,CACEqD,CAAAA,CAAO,WAAA,GACX,CACJ,CAMQ,cAAA,CAAe7D,CAAAA,CAA4B,CAC/C,OAAOA,CAAAA,CAAS,GAAA,CAAKC,GAAQ,CACzB,IAAMoS,EAAiB,CACnB,IAAA,CAAMpS,CAAAA,CAAI,IAAA,GAAS,OAAS,MAAA,CAASA,CAAAA,CAAI,IAAA,CACzC,OAAA,CAASA,EAAI,OAAA,EAAW,IAC5B,CAAA,CAGA,OAAIA,EAAI,SAAA,EAAaA,CAAAA,CAAI,UAAU,MAAA,CAAS,CAAA,GACxCoS,EAAU,UAAA,CAAapS,CAAAA,CAAI,SAAA,CAAU,GAAA,CAAKwR,IAAQ,CAC9C,EAAA,CAAIA,CAAAA,CAAG,EAAA,CACP,KAAM,UAAA,CACN,QAAA,CAAU,CACN,IAAA,CAAMA,EAAG,IAAA,CACT,SAAA,CAAW,KAAK,SAAA,CAAUA,CAAAA,CAAG,SAAS,CAC1C,CACJ,CAAA,CAAE,CAAA,CAAA,CAIFxR,EAAI,IAAA,GAAS,MAAA,EAAUA,EAAI,WAAA,EAAeA,CAAAA,CAAI,YAAY,MAAA,CAAS,CAAA,GAEnEoS,CAAAA,CAAU,YAAA,CAAepS,EAAI,WAAA,CAAY,CAAC,GAAG,UAAA,CAC7CoS,CAAAA,CAAU,QAAU,IAAA,CAAK,SAAA,CAAUpS,CAAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,MAAM,CAAA,CAAA,CAG1DoS,CACX,CAAC,CACL,CAKQ,WAAA,CAAY9B,CAAAA,CAAsB,CACtC,OAAOA,CAAAA,CAAM,IAAKxN,CAAAA,GAAU,CACxB,KAAM,UAAA,CACN,QAAA,CAAU,CACN,IAAA,CAAMA,EAAK,IAAA,CACX,WAAA,CAAaA,CAAAA,CAAK,WAAA,CAClB,WAAY,IAAA,CAAK,eAAA,CAAgBA,CAAAA,CAAK,UAAU,CACpD,CACJ,CAAA,CAAE,CACN,CAKQ,gBAAA,CAAiByN,EAA2C,CAChE,OAAIA,CAAAA,GAAe,MAAA,CACR,OAGPA,CAAAA,GAAe,UAAA,CACR,UAAA,CAIP,OAAOA,GAAe,QAAA,EAAY,MAAA,GAAUA,CAAAA,CACrC,CACH,KAAM,UAAA,CACN,QAAA,CAAU,CACN,IAAA,CAAMA,CAAAA,CAAW,IACrB,CACJ,CAAA,CAGG,MACX,CAKQ,gBAAgBC,CAAAA,CAAmB,CACvC,IAAMC,CAAAA,CAAMD,CAAAA,CAAQ,KAEpB,GAAI,CAACC,CAAAA,CACD,OAAO,CACH,IAAA,CAAM,QAAA,CACN,WAAY,EAAC,CACb,SAAU,EACd,CAAA,CAGJ,OAAQA,EAAI,QAAA,EACR,KAAK,WAAA,CACD,OAAO,CACH,IAAA,CAAM,QAAA,CACN,GAAIA,EAAI,WAAA,EAAe,CAAE,YAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,WAAA,CACD,OAAO,CACH,IAAA,CAAM,QAAA,CACN,GAAIA,CAAAA,CAAI,aAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,aACD,OAAO,CACH,KAAM,SAAA,CACN,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,EACJ,KAAK,UAAA,CACD,OAAO,CACH,KAAM,OAAA,CACN,KAAA,CAAO,KAAK,eAAA,CAAgBA,CAAAA,CAAI,IAAI,CAAA,CACpC,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,WAAA,CACD,IAAMC,CAAAA,CAAkC,GAClCC,CAAAA,CAAqB,GACrBC,CAAAA,CAAQH,CAAAA,CAAI,OAAM,CAExB,IAAA,GAAW,CAAC3O,CAAAA,CAAKL,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQmP,CAAK,EAC3CF,CAAAA,CAAW5O,CAAG,CAAA,CAAI,IAAA,CAAK,gBAAgBL,CAAK,CAAA,CACtCA,EAAc,UAAA,IAAa,EAC7BkP,EAAS,IAAA,CAAK7O,CAAG,CAAA,CAIzB,OAAO,CACH,IAAA,CAAM,QAAA,CACN,UAAA,CAAA4O,CAAAA,CACA,GAAIC,CAAAA,CAAS,MAAA,CAAS,CAAA,EAAK,CAAE,SAAAA,CAAS,CAAA,CACtC,GAAIF,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,EACJ,KAAK,SAAA,CACD,OAAO,CACH,KAAM,QAAA,CACN,IAAA,CAAMA,CAAAA,CAAI,MAAA,CACV,GAAIA,CAAAA,CAAI,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,aAAA,CACD,OAAO,IAAA,CAAK,eAAA,CAAgBA,EAAI,SAAS,CAAA,CAC7C,KAAK,aAAA,CACD,OAAO,CACH,GAAG,KAAK,eAAA,CAAgBA,CAAAA,CAAI,SAAS,CAAA,CACrC,QAAA,CAAU,IACd,CAAA,CACJ,KAAK,UAAA,CAED,OAAIA,EAAI,OAAA,EAAWA,CAAAA,CAAI,OAAA,CAAQ,MAAA,CAAS,EAC7B,IAAA,CAAK,eAAA,CAAgBA,CAAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAEvC,CAAE,IAAA,CAAM,QAAS,EAC5B,KAAK,YAAA,CACD,OAAO,CACH,KAAM,OAAOA,CAAAA,CAAI,KAAA,CACjB,IAAA,CAAM,CAACA,CAAAA,CAAI,KAAK,CAAA,CAChB,GAAIA,EAAI,WAAA,EAAe,CAAE,YAAaA,CAAAA,CAAI,WAAY,CAC1D,CAAA,CACJ,KAAK,YAAA,CACD,OAAO,CACH,GAAG,IAAA,CAAK,eAAA,CAAgBA,CAAAA,CAAI,SAAS,CAAA,CACrC,OAAA,CAASA,CAAAA,CAAI,YAAA,EACjB,CAAA,CACJ,QACI,eAAQ,IAAA,CAAK,CAAA,sBAAA,EAAyBA,EAAI,QAAQ,CAAA,wBAAA,CAA0B,CAAA,CACrE,CAAE,KAAM,QAAS,CAChC,CACJ,CACJ,EAKO,SAAS+B,EAAAA,CAAqB7J,CAAAA,CAAwC,CAEzE,OADiB,IAAI2J,CAAAA,CAAe3J,CAAM,EAC1B,cAAA,EACpB","file":"index.js","sourcesContent":["import { nanoid } from 'nanoid';\r\nimport stringify from 'fast-json-stable-stringify';\r\nimport type { Message } from '../types';\r\n\r\n/**\r\n * Generate a unique ID\r\n */\r\nexport function generateId(prefix?: string): string {\r\n const id = nanoid();\r\n return prefix ? `${prefix}_${id}` : id;\r\n}\r\n\r\n/**\r\n * Create a stable hash for cache keys\r\n */\r\nexport function createCacheKey(data: unknown): string {\r\n return stringify(data);\r\n}\r\n\r\n/**\r\n * Format messages for provider APIs\r\n */\r\nexport function formatMessages(messages: Message[]): Message[] {\r\n return messages.map((msg) => ({\r\n ...msg,\r\n id: msg.id || generateId('msg'),\r\n timestamp: msg.timestamp || Date.now(),\r\n }));\r\n}\r\n\r\n/**\r\n * Retry with exponential backoff\r\n */\r\nexport async function retry<T>(\r\n fn: () => Promise<T>,\r\n options: {\r\n maxAttempts: number;\r\n initialDelay: number;\r\n maxDelay: number;\r\n backoffMultiplier: number;\r\n onRetry?: (attempt: number, error: Error) => void;\r\n }\r\n): Promise<T> {\r\n let lastError: Error;\r\n let delay = options.initialDelay;\r\n\r\n for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error as Error;\r\n\r\n if (attempt === options.maxAttempts) {\r\n throw lastError;\r\n }\r\n\r\n if (options.onRetry) {\r\n options.onRetry(attempt, lastError);\r\n }\r\n\r\n await sleep(Math.min(delay, options.maxDelay));\r\n delay *= options.backoffMultiplier;\r\n }\r\n }\r\n\r\n throw lastError!;\r\n}\r\n\r\n/**\r\n * Sleep for a given duration\r\n */\r\nexport function sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * Chunk an array into smaller arrays\r\n */\r\nexport function chunk<T>(array: T[], size: number): T[][] {\r\n const chunks: T[][] = [];\r\n for (let i = 0; i < array.length; i += size) {\r\n chunks.push(array.slice(i, i + size));\r\n }\r\n return chunks;\r\n}\r\n\r\n/**\r\n * Debounce a function\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n fn: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: NodeJS.Timeout;\r\n\r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(() => fn(...args), delay);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle a function\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n fn: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean;\r\n\r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n fn(...args);\r\n inThrottle = true;\r\n setTimeout(() => (inThrottle = false), limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Safely parse JSON\r\n */\r\nexport function safeJsonParse<T = unknown>(json: string): T | null {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a value is a plain object\r\n */\r\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n value.constructor === Object\r\n );\r\n}\r\n\r\n/**\r\n * Deep merge objects\r\n */\r\nexport function deepMerge<T extends Record<string, any>>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n): T {\r\n if (!sources.length) return target;\r\n\r\n const source = sources.shift();\r\n\r\n if (isPlainObject(target) && isPlainObject(source)) {\r\n for (const key in source) {\r\n if (isPlainObject(source[key])) {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n deepMerge(target[key], source[key] as any);\r\n } else {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return deepMerge(target, ...sources);\r\n}\r\n\r\n/**\r\n * Convert async generator to array\r\n */\r\nexport async function streamToArray<T>(\r\n stream: AsyncGenerator<T>\r\n): Promise<T[]> {\r\n const result: T[] = [];\r\n for await (const item of stream) {\r\n result.push(item);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Measure execution time\r\n */\r\nexport async function measureTime<T>(\r\n fn: () => Promise<T>\r\n): Promise<{ result: T; duration: number }> {\r\n const start = performance.now();\r\n const result = await fn();\r\n const duration = performance.now() - start;\r\n return { result, duration };\r\n}","import { EventEmitter } from 'eventemitter3';\r\nimport type { StreamEvent } from '../types';\r\nimport type { StreamWriterEvents, ChunkData, StreamStatus, ToolUseData, ToolResultData } from '../types/stream-writer';\r\n\r\n/**\r\n * StreamWriter for handling streaming text and tool execution\r\n * Provides real-time events for live UI updates\r\n */\r\nexport class StreamWriter extends EventEmitter<StreamWriterEvents> {\r\n private events: StreamEvent[] = [];\r\n private closed = false;\r\n private fullText = '';\r\n private startTime: number = 0;\r\n private lastChunkTime: number = 0;\r\n private chunkIndex: number = 0;\r\n private status: StreamStatus = 'idle';\r\n\r\n // Tool call tracking\r\n private activeTools: Map<string, ToolUseData> = new Map();\r\n private currentToolCall: {\r\n id: string;\r\n name: string;\r\n argumentsBuffer: string;\r\n } | null = null;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Start the stream\r\n */\r\n start(): void {\r\n if (this.startTime === 0) {\r\n this.startTime = Date.now();\r\n this.lastChunkTime = this.startTime;\r\n this.updateStatus('starting');\r\n this.emit('start');\r\n setTimeout(() => this.updateStatus('streaming'), 50);\r\n }\r\n }\r\n\r\n /**\r\n * Write text content\r\n */\r\n writeText(text: string): void {\r\n if (this.closed) return;\r\n\r\n // Auto-start if not started\r\n if (this.startTime === 0) {\r\n this.start();\r\n }\r\n\r\n this.fullText += text;\r\n\r\n // Track chunk timing\r\n const now = Date.now();\r\n const deltaTime = now - this.lastChunkTime;\r\n this.lastChunkTime = now;\r\n\r\n const chunkData: ChunkData = {\r\n text,\r\n index: this.chunkIndex++,\r\n timestamp: now,\r\n deltaTime,\r\n };\r\n\r\n this.events.push({\r\n type: 'text-delta',\r\n delta: text,\r\n });\r\n\r\n this.emit('chunk', chunkData);\r\n this.emit('write', text);\r\n }\r\n\r\n /**\r\n * Legacy write method (for backward compatibility)\r\n */\r\n write(text: string): void {\r\n this.writeText(text);\r\n }\r\n\r\n /**\r\n * Start a tool call\r\n */\r\n startToolCall(name: string, id: string): void {\r\n this.currentToolCall = {\r\n id,\r\n name,\r\n argumentsBuffer: '',\r\n };\r\n\r\n const toolData: ToolUseData = {\r\n id,\r\n name,\r\n input: {},\r\n status: 'starting',\r\n timestamp: Date.now(),\r\n };\r\n\r\n this.activeTools.set(id, toolData);\r\n this.updateStatus('tool_executing');\r\n this.emit('toolUse', toolData);\r\n\r\n // Update to running\r\n setTimeout(() => {\r\n const tool = this.activeTools.get(id);\r\n if (tool) {\r\n tool.status = 'running';\r\n this.emit('toolUse', tool);\r\n }\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Write tool call delta (incremental arguments)\r\n */\r\n writeToolCallDelta(delta: string): void {\r\n if (!this.currentToolCall) return;\r\n this.currentToolCall.argumentsBuffer += delta;\r\n }\r\n\r\n /**\r\n * End a tool call with final arguments\r\n */\r\n endToolCall(args: Record<string, unknown>): void {\r\n if (!this.currentToolCall) return;\r\n\r\n const tool = this.activeTools.get(this.currentToolCall.id);\r\n if (tool) {\r\n tool.input = args;\r\n tool.status = 'completed';\r\n this.emit('toolUse', tool);\r\n\r\n const duration = Date.now() - tool.timestamp;\r\n this.emit('toolResult', {\r\n toolId: this.currentToolCall.id,\r\n content: args,\r\n success: true,\r\n duration,\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.activeTools.delete(this.currentToolCall.id);\r\n }\r\n\r\n this.currentToolCall = null;\r\n\r\n // Return to streaming if no more tools\r\n if (this.activeTools.size === 0) {\r\n this.updateStatus('streaming');\r\n }\r\n }\r\n\r\n /**\r\n * Legacy startTool method (for backward compatibility)\r\n */\r\n startTool(id: string, name: string, input: any): void {\r\n this.startToolCall(name, id);\r\n if (input) {\r\n this.endToolCall(input);\r\n }\r\n }\r\n\r\n /**\r\n * Complete a tool (legacy method for backward compatibility)\r\n */\r\n completeTool(\r\n toolId: string,\r\n content: any,\r\n success: boolean = true,\r\n error?: string\r\n ): void {\r\n const tool = this.activeTools.get(toolId);\r\n if (!tool) return;\r\n\r\n const duration = Date.now() - tool.timestamp;\r\n\r\n tool.status = success ? 'completed' : 'failed';\r\n this.emit('toolUse', tool);\r\n\r\n this.emit('toolResult', {\r\n toolId,\r\n content,\r\n success,\r\n error,\r\n duration,\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.activeTools.delete(toolId);\r\n\r\n // Return to streaming if no more tools\r\n if (this.activeTools.size === 0) {\r\n this.updateStatus('streaming');\r\n }\r\n }\r\n\r\n /**\r\n * Write usage information\r\n */\r\n writeUsage(tokens: {\r\n promptTokens: number;\r\n completionTokens: number;\r\n totalTokens: number\r\n }): void {\r\n if (this.closed) return;\r\n\r\n this.events.push({\r\n type: 'usage',\r\n usage: {\r\n promptTokens: tokens.promptTokens,\r\n completionTokens: tokens.completionTokens,\r\n totalTokens: tokens.totalTokens,\r\n },\r\n });\r\n\r\n this.emit('usage', {\r\n prompt: tokens.promptTokens,\r\n completion: tokens.completionTokens,\r\n total: tokens.totalTokens,\r\n });\r\n }\r\n\r\n /**\r\n * Legacy usage method (for backward compatibility)\r\n */\r\n usage(tokens: { prompt: number; completion: number; total: number }): void {\r\n this.writeUsage({\r\n promptTokens: tokens.prompt,\r\n completionTokens: tokens.completion,\r\n totalTokens: tokens.total,\r\n });\r\n }\r\n\r\n /**\r\n * Write error\r\n */\r\n error(message: string): void {\r\n if (this.closed) return;\r\n\r\n this.events.push({\r\n type: 'error',\r\n error: message,\r\n });\r\n\r\n this.updateStatus('error');\r\n this.emit('error', message);\r\n }\r\n\r\n /**\r\n * Flush all currently buffered events as an async generator.\r\n * CRITICAL: This clears the events array to prevent duplication\r\n */\r\n async *flush(): AsyncGenerator<StreamEvent> {\r\n const buffered = [...this.events];\r\n this.events = []; // Clear to prevent re-yielding\r\n for (const event of buffered) {\r\n yield event;\r\n }\r\n }\r\n\r\n /**\r\n * Mark stream as done\r\n */\r\n done(finalMessage?: any): void {\r\n if (this.closed) return;\r\n\r\n this.updateStatus('completing');\r\n\r\n const message = finalMessage || {\r\n id: `msg_${Date.now()}`,\r\n role: 'assistant' as const,\r\n content: this.fullText,\r\n timestamp: Date.now(),\r\n };\r\n\r\n this.events.push({\r\n type: 'done',\r\n finalMessage: message,\r\n });\r\n\r\n this.closed = true;\r\n this.updateStatus('done');\r\n this.emit('done', message);\r\n }\r\n\r\n /**\r\n * Update stream status\r\n */\r\n private updateStatus(status: StreamStatus): void {\r\n this.status = status;\r\n this.emit('statusChange', status);\r\n }\r\n\r\n /**\r\n * Get current status\r\n */\r\n getStatus(): StreamStatus {\r\n return this.status;\r\n }\r\n\r\n /**\r\n * Check if stream is closed\r\n */\r\n isClosed(): boolean {\r\n return this.closed;\r\n }\r\n\r\n /**\r\n * Get accumulated text\r\n */\r\n getText(): string {\r\n return this.fullText;\r\n }\r\n\r\n /**\r\n * Get active tools\r\n */\r\n getActiveTools(): ToolUseData[] {\r\n return Array.from(this.activeTools.values());\r\n }\r\n\r\n /**\r\n * Get all events\r\n */\r\n getEvents(): StreamEvent[] {\r\n return [...this.events];\r\n }\r\n\r\n /**\r\n * Convert to async generator (legacy method)\r\n */\r\n async *toGenerator(): AsyncGenerator<StreamEvent> {\r\n yield* this.flush();\r\n }\r\n\r\n /**\r\n * Reset the writer\r\n */\r\n reset(): void {\r\n this.events = [];\r\n this.fullText = '';\r\n this.closed = false;\r\n this.status = 'idle';\r\n this.startTime = 0;\r\n this.lastChunkTime = 0;\r\n this.chunkIndex = 0;\r\n this.activeTools.clear();\r\n this.currentToolCall = null;\r\n this.removeAllListeners();\r\n }\r\n}\r\n\r\n/**\r\n * Create StreamWriter instance\r\n */\r\nexport function createStreamWriter(): StreamWriter {\r\n return new StreamWriter();\r\n}\r\n\r\n/**\r\n * Example Usage:\r\n *\r\n * // 1. Basic streaming\r\n * const writer = new StreamWriter();\r\n * writer.start();\r\n * writer.writeText(\"Hello \");\r\n * writer.writeText(\"World! 🌍\");\r\n * writer.done();\r\n *\r\n * // 2. With tool execution\r\n * const writer = new StreamWriter();\r\n * writer.start();\r\n * writer.startToolCall(\"web_search\", \"tool_1\");\r\n * writer.writeToolCallDelta('{\"query\": \"');\r\n * writer.writeToolCallDelta('AI news\"}');\r\n * writer.endToolCall({ query: \"AI news\" });\r\n * writer.writeText(\"Based on the search results...\");\r\n * writer.done();\r\n *\r\n * // 3. Usage in providers\r\n * for await (const chunk of stream) {\r\n * if (chunk.text) {\r\n * writer.writeText(chunk.text);\r\n * yield* writer.flush();\r\n * }\r\n * }\r\n * writer.writeUsage({ promptTokens, completionTokens, totalTokens });\r\n * writer.done();\r\n * yield* writer.flush();\r\n */","import { createParser, type EventSourceMessage } from 'eventsource-parser';\r\nimport type { StreamEvent } from '../types';\r\n\r\n/**\r\n * Parse SSE stream into structured events\r\n */\r\nexport async function* parseSSEStream(\r\n stream: ReadableStream<Uint8Array>\r\n): AsyncGenerator<StreamEvent> {\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n let buffer = '';\r\n\r\n const parser = createParser({\r\n onEvent: (event: EventSourceMessage) => {\r\n buffer = event.data;\r\n },\r\n onRetry: (_interval: number) => {\r\n // Optional: handle retry interval if needed\r\n },\r\n });\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 const chunk = decoder.decode(value, { stream: true });\r\n parser.feed(chunk);\r\n\r\n if (buffer) {\r\n try {\r\n const parsed = JSON.parse(buffer);\r\n\r\n // Convert parsed data to StreamEvent\r\n if (parsed.type) {\r\n yield parsed as StreamEvent;\r\n }\r\n\r\n buffer = '';\r\n } catch (error) {\r\n // If parsing fails, it might be incomplete - continue\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n // Flush any remaining data at end of stream\r\n parser.reset({ consume: true });\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n}\r\n\r\n/**\r\n * Convert async generator to ReadableStream\r\n */\r\nexport function toReadableStream(\r\n generator: AsyncGenerator<StreamEvent>\r\n): ReadableStream<Uint8Array> {\r\n const encoder = new TextEncoder();\r\n\r\n return new ReadableStream({\r\n async start(controller) {\r\n try {\r\n for await (const event of generator) {\r\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\r\n controller.enqueue(encoder.encode(data));\r\n }\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Pipe stream to HTTP response (h3 compatible)\r\n */\r\nexport async function pipeToResponse(\r\n generator: AsyncGenerator<StreamEvent>,\r\n response: any // h3 event or native Response\r\n): Promise<void> {\r\n const stream = toReadableStream(generator);\r\n\r\n // Set SSE headers\r\n const headers = {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n };\r\n\r\n // Handle h3 response\r\n if (response.node && response.node.res) {\r\n const res = response.node.res;\r\n\r\n Object.entries(headers).forEach(([key, value]) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\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 const text = decoder.decode(value, { stream: true });\r\n res.write(text);\r\n }\r\n } finally {\r\n res.end();\r\n }\r\n }\r\n // Handle native Response\r\n else if (response instanceof Response || typeof response.body !== 'undefined') {\r\n return; // Stream is already set as body\r\n }\r\n // Handle raw Node.js response\r\n else {\r\n Object.entries(headers).forEach(([key, value]) => {\r\n response.setHeader(key, value);\r\n });\r\n\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\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 const text = decoder.decode(value, { stream: true });\r\n response.write(text);\r\n }\r\n } finally {\r\n response.end();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Merge multiple streams into one\r\n */\r\nexport async function* mergeStreams(\r\n ...generators: AsyncGenerator<StreamEvent>[]\r\n): AsyncGenerator<StreamEvent> {\r\n const promises = generators.map(async (gen) => {\r\n const items: StreamEvent[] = [];\r\n for await (const item of gen) {\r\n items.push(item);\r\n }\r\n return items;\r\n });\r\n\r\n const results = await Promise.all(promises);\r\n\r\n // Yield all items in order\r\n for (const items of results) {\r\n for (const item of items) {\r\n yield item;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Transform stream events\r\n */\r\nexport async function* transformStream<T>(\r\n generator: AsyncGenerator<StreamEvent>,\r\n transformer: (event: StreamEvent) => T | null\r\n): AsyncGenerator<T> {\r\n for await (const event of generator) {\r\n const transformed = transformer(event);\r\n if (transformed !== null) {\r\n yield transformed;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Filter stream events\r\n */\r\nexport async function* filterStream(\r\n generator: AsyncGenerator<StreamEvent>,\r\n predicate: (event: StreamEvent) => boolean\r\n): AsyncGenerator<StreamEvent> {\r\n for await (const event of generator) {\r\n if (predicate(event)) {\r\n yield event;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Collect stream into array\r\n */\r\nexport async function collectStream(\r\n generator: AsyncGenerator<StreamEvent>\r\n): Promise<StreamEvent[]> {\r\n const events: StreamEvent[] = [];\r\n\r\n for await (const event of generator) {\r\n events.push(event);\r\n }\r\n\r\n return events;\r\n}\r\n\r\n/**\r\n * Take first N events from stream\r\n */\r\nexport async function* takeStream(\r\n generator: AsyncGenerator<StreamEvent>,\r\n count: number\r\n): AsyncGenerator<StreamEvent> {\r\n let taken = 0;\r\n\r\n for await (const event of generator) {\r\n if (taken >= count) break;\r\n yield event;\r\n taken++;\r\n }\r\n}\r\n\r\n/**\r\n * Batch stream events\r\n */\r\nexport async function* batchStream(\r\n generator: AsyncGenerator<StreamEvent>,\r\n size: number,\r\n timeoutMs?: number\r\n): AsyncGenerator<StreamEvent[]> {\r\n let batch: StreamEvent[] = [];\r\n let timeoutId: NodeJS.Timeout | null = null;\r\n\r\n const flushBatch = async () => {\r\n if (batch.length > 0) {\r\n const toFlush = [...batch];\r\n batch = [];\r\n return toFlush;\r\n }\r\n return null;\r\n };\r\n\r\n try {\r\n for await (const event of generator) {\r\n batch.push(event);\r\n\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n\r\n if (batch.length >= size) {\r\n const flushed = await flushBatch();\r\n if (flushed) yield flushed;\r\n } else if (timeoutMs) {\r\n timeoutId = setTimeout(async () => {\r\n const flushed = await flushBatch();\r\n if (flushed) {\r\n // Note: This won't work perfectly with async generators\r\n // Consider using a different batching strategy for time-based batching\r\n }\r\n }, timeoutMs);\r\n }\r\n }\r\n\r\n // Flush remaining\r\n const remaining = await flushBatch();\r\n if (remaining) yield remaining;\r\n } finally {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n }\r\n}","\r\n// Error Types\r\nexport class PaprFlareError extends Error {\r\n constructor(\r\n message: string,\r\n public code: string,\r\n public statusCode?: number,\r\n public details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'PaprFlareError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends PaprFlareError {\r\n constructor(message: string, public retryAfter?: number) {\r\n super(message, 'RATE_LIMIT_ERROR', 429);\r\n }\r\n}\r\n\r\nexport class ValidationError extends PaprFlareError {\r\n constructor(message: string, details?: unknown) {\r\n super(message, 'VALIDATION_ERROR', 400, details);\r\n }\r\n}\r\n\r\nexport class ProviderError extends PaprFlareError {\r\n constructor(message: string, public provider: string, statusCode?: number) {\r\n super(message, 'PROVIDER_ERROR', statusCode);\r\n }\r\n}","import type { StreamEvent, TokenUsage, ToolCall, ToolResult } from '../types';\r\nimport { StreamWriter } from './stream-writer';\r\nimport type {\r\n ToolUseData,\r\n ToolResultData,\r\n StreamStatus,\r\n} from '../types/stream-writer';\r\n\r\n/**\r\n * UI Stream Event Types\r\n */\r\nexport type UIStreamEvent =\r\n | {\r\n type: 'message-start';\r\n messageId: string;\r\n }\r\n | {\r\n type: 'text-delta';\r\n delta: string;\r\n }\r\n | {\r\n type: 'text-complete';\r\n fullText: string;\r\n }\r\n | {\r\n type: 'tool-call-start';\r\n toolCallId: string;\r\n toolName: string;\r\n }\r\n | {\r\n type: 'tool-call-complete';\r\n toolCallId: string;\r\n arguments: any;\r\n }\r\n | {\r\n type: 'tool-result';\r\n toolCallId: string;\r\n result: any;\r\n success: boolean;\r\n }\r\n | {\r\n type: 'usage';\r\n tokens: {\r\n prompt: number;\r\n completion: number;\r\n total: number;\r\n };\r\n }\r\n | {\r\n type: 'error';\r\n error: string;\r\n }\r\n | {\r\n type: 'message-complete';\r\n message: UIMessage;\r\n }\r\n | {\r\n type: 'status-change';\r\n status: StreamStatus;\r\n };\r\n\r\n/**\r\n * UI Message Type\r\n */\r\nexport interface UIMessage {\r\n id: string;\r\n role: 'user' | 'assistant' | 'system';\r\n content: string;\r\n toolCalls?: ToolCall[];\r\n toolResults?: ToolResult[];\r\n metadata?: {\r\n usage?: TokenUsage;\r\n artifacts?: Array<{\r\n id: string;\r\n type: string;\r\n content: string;\r\n [key: string]: any;\r\n }>;\r\n [key: string]: any;\r\n };\r\n timestamp: number;\r\n isComplete?: boolean;\r\n}\r\n\r\n/**\r\n * Stream handler callbacks\r\n */\r\nexport interface StreamHandlers {\r\n onStart?: (messageId: string) => void | Promise<void>;\r\n onText?: (delta: string) => void | Promise<void>;\r\n onComplete?: (message: UIMessage) => void | Promise<void>;\r\n onError?: (error: string) => void | Promise<void>;\r\n onToolCall?: (toolName: string, args: any) => void | Promise<void>;\r\n onToolResult?: (result: ToolResultData) => void | Promise<void>;\r\n onUsage?: (tokens: {\r\n prompt: number;\r\n completion: number;\r\n total: number;\r\n }) => void | Promise<void>;\r\n onStatusChange?: (status: StreamStatus) => void | Promise<void>;\r\n}\r\n\r\n/**\r\n * Convert internal stream events to simplified UI events\r\n */\r\nexport async function* toUIStream(\r\n stream: AsyncGenerator<StreamEvent>\r\n): AsyncGenerator<UIStreamEvent> {\r\n let messageId = `msg_${Date.now()}`;\r\n let fullText = '';\r\n let currentMessage: Partial<UIMessage> = {\r\n id: messageId,\r\n role: 'assistant',\r\n content: '',\r\n timestamp: Date.now(),\r\n isComplete: false,\r\n };\r\n\r\n yield { type: 'message-start', messageId };\r\n\r\n try {\r\n for await (const event of stream) {\r\n switch (event.type) {\r\n case 'text-delta':\r\n fullText += event.delta;\r\n currentMessage.content = fullText;\r\n yield { type: 'text-delta', delta: event.delta };\r\n break;\r\n\r\n case 'tool-call-start':\r\n if (!currentMessage.toolCalls) {\r\n currentMessage.toolCalls = [];\r\n }\r\n currentMessage.toolCalls.push(event.toolCall);\r\n yield {\r\n type: 'tool-call-start',\r\n toolCallId: event.toolCall.id,\r\n toolName: event.toolCall.name,\r\n };\r\n break;\r\n\r\n case 'tool-call-end':\r\n yield {\r\n type: 'tool-call-complete',\r\n toolCallId: event.toolCall.id,\r\n arguments: event.toolCall.arguments,\r\n };\r\n break;\r\n\r\n case 'tool-result':\r\n if (!currentMessage.toolResults) {\r\n currentMessage.toolResults = [];\r\n }\r\n currentMessage.toolResults.push(event.result);\r\n yield {\r\n type: 'tool-result',\r\n toolCallId: event.result.toolCallId,\r\n result: event.result.result,\r\n success: !event.result.error,\r\n };\r\n break;\r\n\r\n case 'usage':\r\n if (!currentMessage.metadata) {\r\n currentMessage.metadata = {};\r\n }\r\n currentMessage.metadata.usage = event.usage;\r\n yield {\r\n type: 'usage',\r\n tokens: {\r\n prompt: event.usage.promptTokens,\r\n completion: event.usage.completionTokens,\r\n total: event.usage.totalTokens,\r\n },\r\n };\r\n break;\r\n\r\n case 'metadata':\r\n if (!currentMessage.metadata) {\r\n currentMessage.metadata = {};\r\n }\r\n currentMessage.metadata = {\r\n ...currentMessage.metadata,\r\n ...event.metadata,\r\n };\r\n break;\r\n\r\n case 'artifact-start':\r\n if (!currentMessage.metadata) {\r\n currentMessage.metadata = {};\r\n }\r\n if (!currentMessage.metadata.artifacts) {\r\n currentMessage.metadata.artifacts = [];\r\n }\r\n currentMessage.metadata.artifacts.push({\r\n ...event.artifact,\r\n content: '',\r\n });\r\n break;\r\n\r\n case 'artifact-delta':\r\n if (currentMessage.metadata?.artifacts) {\r\n const lastArtifact =\r\n currentMessage.metadata.artifacts[\r\n currentMessage.metadata.artifacts.length - 1\r\n ];\r\n if (lastArtifact) {\r\n lastArtifact.content += event.delta;\r\n }\r\n }\r\n break;\r\n\r\n case 'artifact-end':\r\n if (currentMessage.metadata?.artifacts) {\r\n const lastArtifact =\r\n currentMessage.metadata.artifacts[\r\n currentMessage.metadata.artifacts.length - 1\r\n ];\r\n if (lastArtifact) {\r\n Object.assign(lastArtifact, event.artifact);\r\n }\r\n }\r\n break;\r\n\r\n case 'done':\r\n currentMessage.isComplete = true;\r\n currentMessage.content = fullText;\r\n const finalMessage = {\r\n ...currentMessage,\r\n ...event.finalMessage,\r\n } as UIMessage;\r\n\r\n yield { type: 'text-complete', fullText };\r\n yield {\r\n type: 'message-complete',\r\n message: finalMessage,\r\n };\r\n break;\r\n\r\n case 'error':\r\n yield { type: 'error', error: event.error };\r\n break;\r\n }\r\n }\r\n } catch (error: any) {\r\n yield { type: 'error', error: error.message || 'Stream error' };\r\n }\r\n}\r\n\r\n/**\r\n * Process stream with simple callbacks\r\n *\r\n * @example\r\n * await processStream(response.stream, {\r\n * onText: (delta) => process.stdout.write(delta),\r\n * onComplete: (message) => console.log('Done!', message),\r\n * });\r\n */\r\nexport async function processStream(\r\n stream: AsyncGenerator<StreamEvent>,\r\n handlers: StreamHandlers\r\n): Promise<UIMessage> {\r\n const uiStream = toUIStream(stream);\r\n let finalMessage: UIMessage | null = null;\r\n\r\n for await (const event of uiStream) {\r\n switch (event.type) {\r\n case 'message-start':\r\n await handlers.onStart?.(event.messageId);\r\n break;\r\n\r\n case 'text-delta':\r\n await handlers.onText?.(event.delta);\r\n break;\r\n\r\n case 'message-complete':\r\n finalMessage = event.message;\r\n await handlers.onComplete?.(event.message);\r\n break;\r\n\r\n case 'error':\r\n await handlers.onError?.(event.error);\r\n throw new Error(event.error);\r\n\r\n case 'tool-call-complete':\r\n await handlers.onToolCall?.(event.toolCallId, event.arguments);\r\n break;\r\n\r\n case 'tool-result':\r\n await handlers.onToolResult?.({\r\n toolId: event.toolCallId,\r\n content: event.result,\r\n success: event.success,\r\n duration: 0,\r\n timestamp: Date.now(),\r\n });\r\n break;\r\n\r\n case 'usage':\r\n await handlers.onUsage?.(event.tokens);\r\n break;\r\n\r\n case 'status-change':\r\n await handlers.onStatusChange?.(event.status);\r\n break;\r\n }\r\n }\r\n\r\n if (!finalMessage) {\r\n throw new Error('Stream completed without final message');\r\n }\r\n\r\n return finalMessage;\r\n}\r\n\r\n/**\r\n * Collect full response as text (simple helper)\r\n *\r\n * @example\r\n * const text = await collectText(response.stream);\r\n * console.log(text);\r\n */\r\nexport async function collectText(\r\n stream: AsyncGenerator<StreamEvent>\r\n): Promise<string> {\r\n let text = '';\r\n\r\n for await (const event of stream) {\r\n if (event.type === 'text-delta') {\r\n text += event.delta;\r\n }\r\n }\r\n\r\n return text;\r\n}\r\n\r\n/**\r\n * Create UI message stream with advanced control and live updates\r\n *\r\n * @example\r\n * const stream = createUIMessageStream({\r\n * async execute({ writer, merge }) {\r\n * writer.write('Hello ');\r\n *\r\n * // Merge another stream\r\n * const aiResponse = await client.chat(messages);\r\n * await merge(aiResponse.stream);\r\n * },\r\n * onFinish: ({ message }) => {\r\n * console.log('Complete:', message);\r\n * }\r\n * });\r\n */\r\nexport async function* createUIMessageStream(options: {\r\n execute: (context: {\r\n writer: StreamWriter;\r\n merge: (stream: AsyncGenerator<StreamEvent>) => Promise<void>;\r\n }) => Promise<void>;\r\n onError?: (error: Error) => string;\r\n onFinish?: (result: { message: UIMessage }) => void | Promise<void>;\r\n onToolUse?: (tool: ToolUseData) => void | Promise<void>;\r\n onToolResult?: (result: ToolResultData) => void | Promise<void>;\r\n onStatusChange?: (status: StreamStatus) => void | Promise<void>;\r\n}): AsyncGenerator<UIStreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n let error: Error | null = null;\r\n let finalMessage: UIMessage | null = null;\r\n\r\n // Set up event listeners for live updates\r\n if (options.onToolUse) {\r\n writer.on('toolUse', options.onToolUse);\r\n }\r\n\r\n if (options.onToolResult) {\r\n writer.on('toolResult', options.onToolResult);\r\n }\r\n\r\n if (options.onStatusChange) {\r\n writer.on('statusChange', options.onStatusChange);\r\n }\r\n\r\n /**\r\n * Merge external stream into writer\r\n */\r\n const merge = async (stream: AsyncGenerator<StreamEvent>): Promise<void> => {\r\n for await (const event of stream) {\r\n switch (event.type) {\r\n case 'text-delta':\r\n writer.write(event.delta);\r\n break;\r\n\r\n case 'tool-call-start':\r\n writer.startTool(\r\n event.toolCall.id,\r\n event.toolCall.name,\r\n event.toolCall.arguments\r\n );\r\n break;\r\n\r\n case 'tool-call-end':\r\n const tool = writer\r\n .getActiveTools()\r\n .find((t) => t.id === event.toolCall.id);\r\n if (tool) {\r\n writer.completeTool(\r\n event.toolCall.id,\r\n event.toolCall.arguments,\r\n true\r\n );\r\n }\r\n break;\r\n\r\n case 'tool-result':\r\n writer.completeTool(\r\n event.result.toolCallId,\r\n event.result.result,\r\n !event.result.error,\r\n event.result.error\r\n );\r\n break;\r\n\r\n case 'usage':\r\n writer.usage({\r\n prompt: event.usage.promptTokens,\r\n completion: event.usage.completionTokens,\r\n total: event.usage.totalTokens,\r\n });\r\n break;\r\n\r\n case 'error':\r\n writer.error(event.error);\r\n break;\r\n\r\n case 'done':\r\n writer.done(event.finalMessage);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n // Execute user's function\r\n const executePromise = (async () => {\r\n try {\r\n writer.start();\r\n await options.execute({ writer, merge });\r\n\r\n if (!writer.isClosed()) {\r\n writer.done();\r\n }\r\n } catch (err: any) {\r\n error = err;\r\n const errorMessage = options.onError?.(err) || err.message;\r\n writer.error(errorMessage);\r\n writer.done();\r\n }\r\n })();\r\n\r\n // Stream UI events\r\n try {\r\n for await (const event of toUIStream(writer.toGenerator())) {\r\n yield event;\r\n\r\n // Capture final message\r\n if (event.type === 'message-complete') {\r\n finalMessage = event.message;\r\n }\r\n }\r\n\r\n // Wait for execution to complete\r\n await executePromise;\r\n\r\n // Call onFinish callback\r\n if (options.onFinish && finalMessage) {\r\n await options.onFinish({ message: finalMessage });\r\n }\r\n } catch (err: any) {\r\n error = err;\r\n throw err;\r\n }\r\n}\r\n\r\n/**\r\n * Stream to console with formatting\r\n *\r\n * @example\r\n * await streamToConsole(response.stream);\r\n */\r\nexport async function streamToConsole(\r\n stream: AsyncGenerator<StreamEvent>\r\n): Promise<void> {\r\n const writer = new StreamWriter();\r\n\r\n // Merge the stream into writer\r\n for await (const event of stream) {\r\n switch (event.type) {\r\n case 'text-delta':\r\n process.stdout.write(event.delta);\r\n break;\r\n\r\n case 'tool-call-start':\r\n console.log(`\\n🔧 Tool: ${event.toolCall.name}`);\r\n break;\r\n\r\n case 'tool-result':\r\n const icon = event.result.error ? '❌' : '✅';\r\n console.log(`${icon} Tool completed`);\r\n break;\r\n\r\n case 'usage':\r\n console.log(\r\n `\\n\\n📊 Tokens: ${event.usage.promptTokens} prompt + ${event.usage.completionTokens} completion = ${event.usage.totalTokens} total`\r\n );\r\n break;\r\n\r\n case 'error':\r\n console.error('\\n❌ Error:', event.error);\r\n break;\r\n\r\n case 'done':\r\n console.log('\\n\\n✅ Stream completed');\r\n break;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Convert stream to HTTP Response (one-liner for API routes)\r\n * Works with Next.js, Express, Node.js HTTP, etc.\r\n *\r\n * @example\r\n * // Next.js API Route\r\n * export async function POST(req: Request) {\r\n * const response = await client.chat(messages, { stream: true });\r\n * return toHTTPResponse(response.stream);\r\n * }\r\n *\r\n * @example\r\n * // Express\r\n * app.post('/chat', async (req, res) => {\r\n * const response = await client.chat(messages, { stream: true });\r\n * await toHTTPResponse(response.stream, res);\r\n * });\r\n */\r\nexport async function toHTTPResponse(\r\n stream: AsyncGenerator<StreamEvent>,\r\n target?: any\r\n): Promise<Response | void> {\r\n const uiStream = toUIStream(stream);\r\n\r\n // For Next.js / Fetch API - return Response\r\n if (!target) {\r\n return new Response(\r\n new ReadableStream({\r\n async start(controller) {\r\n const encoder = new TextEncoder();\r\n\r\n try {\r\n for await (const event of uiStream) {\r\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\r\n controller.enqueue(encoder.encode(data));\r\n }\r\n // Send final done marker\r\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\r\n } catch (error) {\r\n controller.error(error);\r\n } finally {\r\n controller.close();\r\n }\r\n },\r\n }),\r\n {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n Connection: 'keep-alive',\r\n },\r\n }\r\n );\r\n }\r\n\r\n // For Express / Node.js HTTP - stream to response\r\n target.setHeader('Content-Type', 'text/event-stream');\r\n target.setHeader('Cache-Control', 'no-cache');\r\n target.setHeader('Connection', 'keep-alive');\r\n\r\n for await (const event of uiStream) {\r\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\r\n target.write(data);\r\n }\r\n\r\n target.write('data: [DONE]\\n\\n');\r\n target.end();\r\n}\r\n\r\n/**\r\n * Create a streamable value\r\n *\r\n * @example\r\n * const stream = createStreamableValue('initial');\r\n * stream.update('updated');\r\n * stream.done('final');\r\n * return stream.value; // Returns AsyncGenerator\r\n */\r\nexport function createStreamableValue<T = any>(initialValue?: T) {\r\n const writer = new StreamWriter();\r\n let isDone = false;\r\n\r\n return {\r\n value: (async function* () {\r\n if (initialValue !== undefined) {\r\n yield initialValue;\r\n }\r\n\r\n for await (const event of writer.toGenerator()) {\r\n if (event.type === 'text-delta') {\r\n yield event.delta as T;\r\n } else if (event.type === 'done') {\r\n yield event.finalMessage.content as T;\r\n }\r\n }\r\n })(),\r\n\r\n update(value: T) {\r\n if (isDone) throw new Error('Stream already done');\r\n writer.write(String(value));\r\n },\r\n\r\n done(value?: T) {\r\n if (isDone) return;\r\n if (value !== undefined) {\r\n writer.write(String(value));\r\n }\r\n writer.done();\r\n isDone = true;\r\n },\r\n\r\n error(error: string) {\r\n writer.error(error);\r\n isDone = true;\r\n },\r\n };\r\n}","import Redis from 'ioredis';\r\nimport { LRUCache } from 'lru-cache';\r\nimport { createCacheKey } from '../utils';\r\nimport type { Message, ChatConfig, StreamEvent } from '../types';\r\n\r\nexport interface CacheOptions {\r\n type: 'redis' | 'memory';\r\n ttl?: number; // Time to live in seconds\r\n redis?: {\r\n host: string;\r\n port: number;\r\n password?: string;\r\n db?: number;\r\n keyPrefix?: string;\r\n };\r\n memory?: {\r\n maxSize: number; // Maximum number of items\r\n maxAge?: number; // Maximum age in ms\r\n };\r\n}\r\n\r\n/**\r\n * Abstract cache interface\r\n */\r\nexport interface ICache {\r\n get(key: string): Promise<string | null>;\r\n set(key: string, value: string, ttl?: number): Promise<void>;\r\n delete(key: string): Promise<void>;\r\n clear(): Promise<void>;\r\n has(key: string): Promise<boolean>;\r\n}\r\n\r\n/**\r\n * Redis cache implementation for distributed caching\r\n */\r\nexport class RedisCache implements ICache {\r\n private client: Redis;\r\n private keyPrefix: string;\r\n private defaultTTL: number;\r\n\r\n constructor(options: CacheOptions['redis'] & { ttl?: number }) {\r\n this.client = new Redis({\r\n host: options.host,\r\n port: options.port,\r\n password: options.password,\r\n db: options.db || 0,\r\n retryStrategy: (times) => {\r\n const delay = Math.min(times * 50, 2000);\r\n return delay;\r\n },\r\n maxRetriesPerRequest: 3,\r\n enableReadyCheck: true,\r\n lazyConnect: false,\r\n });\r\n\r\n this.keyPrefix = options.keyPrefix || 'paprflare:';\r\n this.defaultTTL = options.ttl || 3600; // 1 hour default\r\n\r\n // Handle errors\r\n this.client.on('error', (err) => {\r\n console.error('Redis cache error:', err);\r\n });\r\n }\r\n\r\n private getKey(key: string): string {\r\n return `${this.keyPrefix}${key}`;\r\n }\r\n\r\n async get(key: string): Promise<string | null> {\r\n try {\r\n return await this.client.get(this.getKey(key));\r\n } catch (error) {\r\n console.error('Redis get error:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async set(key: string, value: string, ttl?: number): Promise<void> {\r\n try {\r\n const actualTTL = ttl || this.defaultTTL;\r\n await this.client.setex(this.getKey(key), actualTTL, value);\r\n } catch (error) {\r\n console.error('Redis set error:', error);\r\n }\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n try {\r\n await this.client.del(this.getKey(key));\r\n } catch (error) {\r\n console.error('Redis delete error:', error);\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n try {\r\n const keys = await this.client.keys(`${this.keyPrefix}*`);\r\n if (keys.length > 0) {\r\n await this.client.del(...keys);\r\n }\r\n } catch (error) {\r\n console.error('Redis clear error:', error);\r\n }\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n try {\r\n const exists = await this.client.exists(this.getKey(key));\r\n return exists === 1;\r\n } catch (error) {\r\n console.error('Redis has error:', error);\r\n return false;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n await this.client.quit();\r\n }\r\n}\r\n\r\n/**\r\n * In-memory LRU cache for single-instance or development use\r\n */\r\nexport class MemoryCache implements ICache {\r\n private cache: LRUCache<string, string>;\r\n\r\n constructor(options: CacheOptions['memory']) {\r\n this.cache = new LRUCache<string, string>({\r\n max: options?.maxSize || 1000,\r\n ttl: options?.maxAge || 3600000, // 1 hour default\r\n updateAgeOnGet: true,\r\n updateAgeOnHas: true,\r\n });\r\n }\r\n\r\n async get(key: string): Promise<string | null> {\r\n return this.cache.get(key) || null;\r\n }\r\n\r\n async set(key: string, value: string): Promise<void> {\r\n this.cache.set(key, value);\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n this.cache.delete(key);\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.cache.clear();\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n return this.cache.has(key);\r\n }\r\n}\r\n\r\n/**\r\n * Cache manager with automatic cache key generation\r\n */\r\nexport class CacheManager {\r\n private cache: ICache;\r\n private enabled: boolean;\r\n\r\n constructor(options: CacheOptions) {\r\n this.enabled = true;\r\n\r\n if (options.type === 'redis') {\r\n this.cache = new RedisCache({\r\n ...options.redis!,\r\n ttl: options.ttl,\r\n });\r\n } else {\r\n this.cache = new MemoryCache(options.memory!);\r\n }\r\n }\r\n\r\n /**\r\n * Generate cache key from messages and config\r\n */\r\n private generateCacheKey(messages: Message[], config: ChatConfig): string {\r\n const cacheData = {\r\n messages: messages.map((m) => ({\r\n role: m.role,\r\n content: m.content,\r\n toolCalls: m.toolCalls,\r\n })),\r\n model: config.model,\r\n temperature: config.temperature,\r\n maxTokens: config.maxTokens,\r\n tools: config.tools?.map((t) => t.name),\r\n };\r\n\r\n return createCacheKey(cacheData);\r\n }\r\n\r\n /**\r\n * Get cached response\r\n */\r\n async getCachedResponse(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): Promise<StreamEvent[] | null> {\r\n if (!this.enabled || config.cache?.enabled === false) {\r\n return null;\r\n }\r\n\r\n const cacheKey = config.cache?.key || this.generateCacheKey(messages, config);\r\n const cached = await this.cache.get(cacheKey);\r\n\r\n if (cached) {\r\n try {\r\n return JSON.parse(cached) as StreamEvent[];\r\n } catch (error) {\r\n console.error('Cache parse error:', error);\r\n await this.cache.delete(cacheKey);\r\n return null;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Cache response\r\n */\r\n async cacheResponse(\r\n messages: Message[],\r\n config: ChatConfig,\r\n events: StreamEvent[]\r\n ): Promise<void> {\r\n if (!this.enabled || config.cache?.enabled === false) {\r\n return;\r\n }\r\n\r\n const cacheKey = config.cache?.key || this.generateCacheKey(messages, config);\r\n const ttl = config.cache?.ttl;\r\n\r\n await this.cache.set(cacheKey, JSON.stringify(events), ttl);\r\n }\r\n\r\n /**\r\n * Invalidate cache\r\n */\r\n async invalidate(messages: Message[], config: ChatConfig): Promise<void> {\r\n const cacheKey = this.generateCacheKey(messages, config);\r\n await this.cache.delete(cacheKey);\r\n }\r\n\r\n /**\r\n * Clear all cache\r\n */\r\n async clearAll(): Promise<void> {\r\n await this.cache.clear();\r\n }\r\n\r\n /**\r\n * Disable caching\r\n */\r\n disable(): void {\r\n this.enabled = false;\r\n }\r\n\r\n /**\r\n * Enable caching\r\n */\r\n enable(): void {\r\n this.enabled = true;\r\n }\r\n}","import type { Message } from '../../types';\r\nimport type { Conversation, ConversationExport, DatabaseAdapter } from '../base';\r\nimport { eq, and, like, desc, asc, sql } from 'drizzle-orm';\r\n\r\n/**\r\n * Drizzle ORM adapter\r\n */\r\nexport class DrizzleAdapter implements DatabaseAdapter {\r\n constructor(private db: any, private schema: any) { }\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n async connect(): Promise<void> { }\r\n\r\n async disconnect(): Promise<void> { }\r\n\r\n async healthCheck(): Promise<boolean> {\r\n try {\r\n await this.db.select(sql`1`);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async purge(): Promise<void> {\r\n await this.db.delete(this.schema.messages);\r\n await this.db.delete(this.schema.conversations);\r\n }\r\n\r\n // ─── Conversations ────────────────────────────────────────────────────────\r\n\r\n async createConversation(userId: string, metadata?: Record<string, unknown>): Promise<string> {\r\n const [conversation] = await this.db\r\n .insert(this.schema.conversations)\r\n .values({ userId, metadata: metadata || {} })\r\n .returning();\r\n return conversation.id;\r\n }\r\n\r\n async getConversation(conversationId: string): Promise<Conversation | null> {\r\n const [conversation] = await this.db\r\n .select()\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n return conversation || null;\r\n }\r\n\r\n async listConversations(userId: string, limit = 50, offset = 0): Promise<Conversation[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId))\r\n .orderBy(desc(this.schema.conversations.updatedAt))\r\n .limit(limit)\r\n .offset(offset);\r\n }\r\n\r\n async updateConversation(conversationId: string, updates: Partial<Conversation>): Promise<void> {\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ ...updates, updatedAt: new Date() })\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async deleteConversation(conversationId: string): Promise<void> {\r\n await this.db\r\n .delete(this.schema.conversations)\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async deleteAllConversations(userId: string): Promise<void> {\r\n const convIds = await this.db\r\n .select({ id: this.schema.conversations.id })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId));\r\n\r\n for (const { id } of convIds) {\r\n await this.db\r\n .delete(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, id));\r\n }\r\n\r\n await this.db\r\n .delete(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId));\r\n }\r\n\r\n async countConversations(userId: string): Promise<number> {\r\n const [{ count }] = await this.db\r\n .select({ count: sql<number>`count(*)` })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId));\r\n return Number(count);\r\n }\r\n\r\n async conversationExists(conversationId: string): Promise<boolean> {\r\n const [row] = await this.db\r\n .select({ id: this.schema.conversations.id })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n return !!row;\r\n }\r\n\r\n async searchConversations(userId: string, query: string): Promise<Conversation[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.conversations)\r\n .where(\r\n and(\r\n eq(this.schema.conversations.userId, userId),\r\n like(this.schema.conversations.title, `%${query}%`)\r\n )\r\n );\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n async saveMessage(conversationId: string, message: Message): Promise<void> {\r\n await this.db.insert(this.schema.messages).values({\r\n id: message.id,\r\n conversationId,\r\n role: message.role,\r\n content: message.content,\r\n toolCalls: message.toolCalls || [],\r\n toolResults: message.toolResults || [],\r\n metadata: message.metadata || {},\r\n timestamp: message.timestamp || Date.now(),\r\n });\r\n\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ updatedAt: new Date() })\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async saveManyMessages(conversationId: string, messages: Message[]): Promise<void> {\r\n if (messages.length === 0) return;\r\n\r\n await this.db.insert(this.schema.messages).values(\r\n messages.map(m => ({\r\n id: m.id,\r\n conversationId,\r\n role: m.role,\r\n content: m.content,\r\n toolCalls: m.toolCalls || [],\r\n toolResults: m.toolResults || [],\r\n metadata: m.metadata || {},\r\n timestamp: m.timestamp || Date.now(),\r\n }))\r\n );\r\n\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ updatedAt: new Date() })\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async getMessage(messageId: string): Promise<Message | null> {\r\n const [message] = await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(eq(this.schema.messages.id, messageId));\r\n return message || null;\r\n }\r\n\r\n async getMessages(conversationId: string, limit = 100, offset = 0): Promise<Message[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, conversationId))\r\n .orderBy(asc(this.schema.messages.timestamp))\r\n .limit(limit)\r\n .offset(offset);\r\n }\r\n\r\n async getMessagesByRole(conversationId: string, role: Message['role']): Promise<Message[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(\r\n and(\r\n eq(this.schema.messages.conversationId, conversationId),\r\n eq(this.schema.messages.role, role)\r\n )\r\n )\r\n .orderBy(asc(this.schema.messages.timestamp));\r\n }\r\n\r\n async updateMessage(messageId: string, updates: Partial<Message>): Promise<void> {\r\n await this.db\r\n .update(this.schema.messages)\r\n .set(updates)\r\n .where(eq(this.schema.messages.id, messageId));\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.db\r\n .delete(this.schema.messages)\r\n .where(eq(this.schema.messages.id, messageId));\r\n }\r\n\r\n async deleteAllMessages(conversationId: string): Promise<void> {\r\n await this.db\r\n .delete(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, conversationId));\r\n }\r\n\r\n async countMessages(conversationId: string): Promise<number> {\r\n const [{ count }] = await this.db\r\n .select({ count: sql<number>`count(*)` })\r\n .from(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, conversationId));\r\n return Number(count);\r\n }\r\n\r\n async getLastMessage(conversationId: string): Promise<Message | null> {\r\n const [message] = await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(eq(this.schema.messages.conversationId, conversationId))\r\n .orderBy(desc(this.schema.messages.timestamp))\r\n .limit(1);\r\n return message || null;\r\n }\r\n\r\n async searchMessages(conversationId: string, query: string): Promise<Message[]> {\r\n return await this.db\r\n .select()\r\n .from(this.schema.messages)\r\n .where(\r\n and(\r\n eq(this.schema.messages.conversationId, conversationId),\r\n like(this.schema.messages.content, `%${query}%`)\r\n )\r\n )\r\n .orderBy(asc(this.schema.messages.timestamp));\r\n }\r\n\r\n // ─── Metadata ─────────────────────────────────────────────────────────────\r\n\r\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ metadata, updatedAt: new Date() })\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n }\r\n\r\n async getConversationMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\r\n const [row] = await this.db\r\n .select({ metadata: this.schema.conversations.metadata })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.id, conversationId));\r\n return row?.metadata || null;\r\n }\r\n\r\n async deleteConversationMetadata(conversationId: string, keys: string[]): Promise<void> {\r\n const existing = await this.getConversationMetadata(conversationId);\r\n if (!existing) return;\r\n for (const key of keys) delete existing[key];\r\n await this.updateConversationMetadata(conversationId, existing);\r\n }\r\n\r\n // ─── Users ────────────────────────────────────────────────────────────────\r\n\r\n async userExists(userId: string): Promise<boolean> {\r\n const [row] = await this.db\r\n .select({ id: this.schema.conversations.id })\r\n .from(this.schema.conversations)\r\n .where(eq(this.schema.conversations.userId, userId))\r\n .limit(1);\r\n return !!row;\r\n }\r\n\r\n async deleteUser(userId: string): Promise<void> {\r\n await this.deleteAllConversations(userId);\r\n }\r\n\r\n // ─── Bulk ─────────────────────────────────────────────────────────────────\r\n\r\n async exportConversation(conversationId: string): Promise<ConversationExport> {\r\n const conversation = await this.getConversation(conversationId);\r\n if (!conversation) throw new Error(`Conversation ${conversationId} not found`);\r\n const messages = await this.getMessages(conversationId);\r\n return { conversation, messages, exportedAt: new Date() };\r\n }\r\n\r\n async importConversation(userId: string, data: ConversationExport): Promise<string> {\r\n const newId = await this.createConversation(userId, data.conversation.metadata);\r\n await this.db\r\n .update(this.schema.conversations)\r\n .set({ title: data.conversation.title, createdAt: data.conversation.createdAt })\r\n .where(eq(this.schema.conversations.id, newId));\r\n await this.saveManyMessages(newId, data.messages);\r\n return newId;\r\n }\r\n}","import type { Message } from '../types';\r\nimport type { Conversation, ConversationExport, DatabaseAdapter } from './base';\r\n\r\n/**\r\n * Database manager with automatic persistence\r\n */\r\nexport class DatabaseManager {\r\n constructor(private adapter: DatabaseAdapter) { }\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n async connect(): Promise<void> {\r\n await this.adapter.connect();\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n await this.adapter.disconnect();\r\n }\r\n\r\n async healthCheck(): Promise<boolean> {\r\n return await this.adapter.healthCheck();\r\n }\r\n\r\n async purge(): Promise<void> {\r\n await this.adapter.purge();\r\n }\r\n\r\n // ─── Conversations ────────────────────────────────────────────────────────\r\n\r\n async create(userId: string, systemPrompt?: string): Promise<string> {\r\n return await this.adapter.createConversation(userId, { systemPrompt });\r\n }\r\n\r\n async getConversation(conversationId: string): Promise<Conversation | null> {\r\n return await this.adapter.getConversation(conversationId);\r\n }\r\n\r\n async listConversations(userId: string, limit?: number, offset?: number): Promise<Conversation[]> {\r\n return await this.adapter.listConversations(userId, limit, offset);\r\n }\r\n\r\n async updateConversation(conversationId: string, updates: Partial<Conversation>): Promise<void> {\r\n await this.adapter.updateConversation(conversationId, updates);\r\n }\r\n\r\n async deleteConversation(conversationId: string): Promise<void> {\r\n await this.adapter.deleteConversation(conversationId);\r\n }\r\n\r\n async deleteAllConversations(userId: string): Promise<void> {\r\n await this.adapter.deleteAllConversations(userId);\r\n }\r\n\r\n async countConversations(userId: string): Promise<number> {\r\n return await this.adapter.countConversations(userId);\r\n }\r\n\r\n async conversationExists(conversationId: string): Promise<boolean> {\r\n return await this.adapter.conversationExists(conversationId);\r\n }\r\n\r\n async searchConversations(userId: string, query: string): Promise<Conversation[]> {\r\n return await this.adapter.searchConversations(userId, query);\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n async addMessage(conversationId: string, message: Message): Promise<void> {\r\n await this.adapter.saveMessage(conversationId, message);\r\n }\r\n\r\n async addManyMessages(conversationId: string, messages: Message[]): Promise<void> {\r\n await this.adapter.saveManyMessages(conversationId, messages);\r\n }\r\n\r\n async getMessage(messageId: string): Promise<Message | null> {\r\n return await this.adapter.getMessage(messageId);\r\n }\r\n\r\n async getConversationHistory(conversationId: string, limit?: number, offset?: number): Promise<Message[]> {\r\n return await this.adapter.getMessages(conversationId, limit, offset);\r\n }\r\n\r\n async getMessagesByRole(conversationId: string, role: Message['role']): Promise<Message[]> {\r\n return await this.adapter.getMessagesByRole(conversationId, role);\r\n }\r\n\r\n async updateMessage(messageId: string, updates: Partial<Message>): Promise<void> {\r\n await this.adapter.updateMessage(messageId, updates);\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.adapter.deleteMessage(messageId);\r\n }\r\n\r\n async deleteAllMessages(conversationId: string): Promise<void> {\r\n await this.adapter.deleteAllMessages(conversationId);\r\n }\r\n\r\n async countMessages(conversationId: string): Promise<number> {\r\n return await this.adapter.countMessages(conversationId);\r\n }\r\n\r\n async getLastMessage(conversationId: string): Promise<Message | null> {\r\n return await this.adapter.getLastMessage(conversationId);\r\n }\r\n\r\n async searchMessages(conversationId: string, query: string): Promise<Message[]> {\r\n return await this.adapter.searchMessages(conversationId, query);\r\n }\r\n\r\n // ─── Metadata ─────────────────────────────────────────────────────────────\r\n\r\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\r\n await this.adapter.updateConversationMetadata(conversationId, metadata);\r\n }\r\n\r\n async getConversationMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\r\n return await this.adapter.getConversationMetadata(conversationId);\r\n }\r\n\r\n async deleteConversationMetadata(conversationId: string, keys: string[]): Promise<void> {\r\n await this.adapter.deleteConversationMetadata(conversationId, keys);\r\n }\r\n\r\n // ─── Users ────────────────────────────────────────────────────────────────\r\n\r\n async userExists(userId: string): Promise<boolean> {\r\n return await this.adapter.userExists(userId);\r\n }\r\n\r\n async deleteUser(userId: string): Promise<void> {\r\n await this.adapter.deleteUser(userId);\r\n }\r\n\r\n // ─── Bulk ─────────────────────────────────────────────────────────────────\r\n\r\n async exportConversation(conversationId: string): Promise<ConversationExport> {\r\n return await this.adapter.exportConversation(conversationId);\r\n }\r\n\r\n async importConversation(userId: string, data: ConversationExport): Promise<string> {\r\n return await this.adapter.importConversation(userId, data);\r\n }\r\n}","import type { Message } from '../../types';\r\nimport type { Conversation, ConversationExport, DatabaseAdapter } from '../base';\r\n\r\n/**\r\n * Simple in-memory adapter for development\r\n */\r\nexport class MemoryAdapter implements DatabaseAdapter {\r\n private conversations: Map<string, Conversation> = new Map();\r\n private messages: Map<string, Message[]> = new Map();\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n async connect(): Promise<void> { }\r\n\r\n async disconnect(): Promise<void> { }\r\n\r\n async healthCheck(): Promise<boolean> {\r\n return true;\r\n }\r\n\r\n async purge(): Promise<void> {\r\n this.conversations.clear();\r\n this.messages.clear();\r\n }\r\n\r\n // ─── Conversations ────────────────────────────────────────────────────────\r\n\r\n async createConversation(userId: string, metadata?: Record<string, unknown>): Promise<string> {\r\n const id = `conv_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n const conversation: Conversation = {\r\n id,\r\n userId,\r\n metadata: metadata || {},\r\n createdAt: new Date(),\r\n updatedAt: new Date(),\r\n };\r\n this.conversations.set(id, conversation);\r\n this.messages.set(id, []);\r\n return id;\r\n }\r\n\r\n async getConversation(conversationId: string): Promise<Conversation | null> {\r\n return this.conversations.get(conversationId) || null;\r\n }\r\n\r\n async listConversations(userId: string, limit = 50, offset = 0): Promise<Conversation[]> {\r\n return Array.from(this.conversations.values())\r\n .filter(conv => conv.userId === userId)\r\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\r\n .slice(offset, offset + limit);\r\n }\r\n\r\n async updateConversation(conversationId: string, updates: Partial<Conversation>): Promise<void> {\r\n const conversation = this.conversations.get(conversationId);\r\n if (conversation) {\r\n Object.assign(conversation, updates, { updatedAt: new Date() });\r\n }\r\n }\r\n\r\n async deleteConversation(conversationId: string): Promise<void> {\r\n this.conversations.delete(conversationId);\r\n this.messages.delete(conversationId);\r\n }\r\n\r\n async deleteAllConversations(userId: string): Promise<void> {\r\n for (const [id, conv] of this.conversations) {\r\n if (conv.userId === userId) {\r\n this.conversations.delete(id);\r\n this.messages.delete(id);\r\n }\r\n }\r\n }\r\n\r\n async countConversations(userId: string): Promise<number> {\r\n return Array.from(this.conversations.values()).filter(c => c.userId === userId).length;\r\n }\r\n\r\n async conversationExists(conversationId: string): Promise<boolean> {\r\n return this.conversations.has(conversationId);\r\n }\r\n\r\n async searchConversations(userId: string, query: string): Promise<Conversation[]> {\r\n const lower = query.toLowerCase();\r\n return Array.from(this.conversations.values()).filter(\r\n c => c.userId === userId && c.title?.toLowerCase().includes(lower)\r\n );\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n async saveMessage(conversationId: string, message: Message): Promise<void> {\r\n const messages = this.messages.get(conversationId) || [];\r\n messages.push(message);\r\n this.messages.set(conversationId, messages);\r\n\r\n const conversation = this.conversations.get(conversationId);\r\n if (conversation) {\r\n conversation.updatedAt = new Date();\r\n }\r\n }\r\n\r\n async saveManyMessages(conversationId: string, messages: Message[]): Promise<void> {\r\n for (const message of messages) {\r\n await this.saveMessage(conversationId, message);\r\n }\r\n }\r\n\r\n async getMessage(messageId: string): Promise<Message | null> {\r\n for (const messages of this.messages.values()) {\r\n const found = messages.find(m => m.id === messageId);\r\n if (found) return found;\r\n }\r\n return null;\r\n }\r\n\r\n async getMessages(conversationId: string, limit = 100, offset = 0): Promise<Message[]> {\r\n const messages = this.messages.get(conversationId) || [];\r\n return messages.slice(offset, offset + limit);\r\n }\r\n\r\n async getMessagesByRole(conversationId: string, role: Message['role']): Promise<Message[]> {\r\n const messages = this.messages.get(conversationId) || [];\r\n return messages.filter(m => m.role === role);\r\n }\r\n\r\n async updateMessage(messageId: string, updates: Partial<Message>): Promise<void> {\r\n for (const messages of this.messages.values()) {\r\n const index = messages.findIndex(m => m.id === messageId);\r\n if (index !== -1) {\r\n messages[index] = { ...messages[index], ...updates } as Message;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n for (const [convId, messages] of this.messages) {\r\n const index = messages.findIndex(m => m.id === messageId);\r\n if (index !== -1) {\r\n messages.splice(index, 1);\r\n this.messages.set(convId, messages);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n async deleteAllMessages(conversationId: string): Promise<void> {\r\n this.messages.set(conversationId, []);\r\n }\r\n\r\n async countMessages(conversationId: string): Promise<number> {\r\n return (this.messages.get(conversationId) || []).length;\r\n }\r\n\r\n async getLastMessage(conversationId: string): Promise<Message | null> {\r\n const messages = this.messages.get(conversationId) || [];\r\n return messages[messages.length - 1] || null;\r\n }\r\n\r\n async searchMessages(conversationId: string, query: string): Promise<Message[]> {\r\n const lower = query.toLowerCase();\r\n const messages = this.messages.get(conversationId) || [];\r\n return messages.filter(\r\n m => typeof m.content === 'string' && m.content.toLowerCase().includes(lower)\r\n );\r\n }\r\n\r\n // ─── Metadata ─────────────────────────────────────────────────────────────\r\n\r\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\r\n const conversation = this.conversations.get(conversationId);\r\n if (conversation) {\r\n conversation.metadata = { ...conversation.metadata, ...metadata };\r\n conversation.updatedAt = new Date();\r\n }\r\n }\r\n\r\n async getConversationMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\r\n return this.conversations.get(conversationId)?.metadata || null;\r\n }\r\n\r\n async deleteConversationMetadata(conversationId: string, keys: string[]): Promise<void> {\r\n const conversation = this.conversations.get(conversationId);\r\n if (conversation?.metadata) {\r\n for (const key of keys) {\r\n delete conversation.metadata[key];\r\n }\r\n conversation.updatedAt = new Date();\r\n }\r\n }\r\n\r\n // ─── Users ────────────────────────────────────────────────────────────────\r\n\r\n async userExists(userId: string): Promise<boolean> {\r\n return Array.from(this.conversations.values()).some(c => c.userId === userId);\r\n }\r\n\r\n async deleteUser(userId: string): Promise<void> {\r\n await this.deleteAllConversations(userId);\r\n }\r\n\r\n // ─── Bulk ─────────────────────────────────────────────────────────────────\r\n\r\n async exportConversation(conversationId: string): Promise<ConversationExport> {\r\n const conversation = await this.getConversation(conversationId);\r\n if (!conversation) throw new Error(`Conversation ${conversationId} not found`);\r\n const messages = await this.getMessages(conversationId);\r\n return { conversation, messages, exportedAt: new Date() };\r\n }\r\n\r\n async importConversation(userId: string, data: ConversationExport): Promise<string> {\r\n const newId = await this.createConversation(userId, data.conversation.metadata);\r\n const conv = this.conversations.get(newId)!;\r\n conv.title = data.conversation.title;\r\n conv.createdAt = data.conversation.createdAt;\r\n await this.saveManyMessages(newId, data.messages);\r\n return newId;\r\n }\r\n}","import type { Message } from '../../types';\r\nimport type { Conversation, ConversationExport, DatabaseAdapter } from '../base';\r\n\r\n/**\r\n * Prisma database adapter\r\n */\r\nexport class PrismaAdapter implements DatabaseAdapter {\r\n constructor(private prisma: any) { }\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n async connect(): Promise<void> {\r\n await this.prisma.$connect();\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n await this.prisma.$disconnect();\r\n }\r\n\r\n async healthCheck(): Promise<boolean> {\r\n try {\r\n await this.prisma.$queryRaw`SELECT 1`;\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async purge(): Promise<void> {\r\n await this.prisma.message.deleteMany();\r\n await this.prisma.conversation.deleteMany();\r\n }\r\n\r\n // ─── Conversations ────────────────────────────────────────────────────────\r\n\r\n async createConversation(userId: string, metadata?: Record<string, unknown>): Promise<string> {\r\n const conversation = await this.prisma.conversation.create({\r\n data: { userId, metadata: metadata || {} },\r\n });\r\n return conversation.id;\r\n }\r\n\r\n async getConversation(conversationId: string): Promise<Conversation | null> {\r\n return await this.prisma.conversation.findUnique({\r\n where: { id: conversationId },\r\n });\r\n }\r\n\r\n async listConversations(userId: string, limit = 50, offset = 0): Promise<Conversation[]> {\r\n return await this.prisma.conversation.findMany({\r\n where: { userId },\r\n orderBy: { updatedAt: 'desc' },\r\n take: limit,\r\n skip: offset,\r\n });\r\n }\r\n\r\n async updateConversation(conversationId: string, updates: Partial<Conversation>): Promise<void> {\r\n await this.prisma.conversation.update({\r\n where: { id: conversationId },\r\n data: { ...updates, updatedAt: new Date() },\r\n });\r\n }\r\n\r\n async deleteConversation(conversationId: string): Promise<void> {\r\n await this.prisma.conversation.delete({\r\n where: { id: conversationId },\r\n });\r\n }\r\n\r\n async deleteAllConversations(userId: string): Promise<void> {\r\n const conversations = await this.prisma.conversation.findMany({\r\n where: { userId },\r\n select: { id: true },\r\n });\r\n\r\n await this.prisma.message.deleteMany({\r\n where: { conversationId: { in: conversations.map((c: any) => c.id) } },\r\n });\r\n\r\n await this.prisma.conversation.deleteMany({ where: { userId } });\r\n }\r\n\r\n async countConversations(userId: string): Promise<number> {\r\n return await this.prisma.conversation.count({ where: { userId } });\r\n }\r\n\r\n async conversationExists(conversationId: string): Promise<boolean> {\r\n const count = await this.prisma.conversation.count({\r\n where: { id: conversationId },\r\n });\r\n return count > 0;\r\n }\r\n\r\n async searchConversations(userId: string, query: string): Promise<Conversation[]> {\r\n return await this.prisma.conversation.findMany({\r\n where: {\r\n userId,\r\n title: { contains: query, mode: 'insensitive' },\r\n },\r\n orderBy: { updatedAt: 'desc' },\r\n });\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n private toMessage(msg: any): Message {\r\n return {\r\n id: msg.id,\r\n role: msg.role,\r\n content: msg.content,\r\n toolCalls: msg.toolCalls,\r\n toolResults: msg.toolResults,\r\n metadata: msg.metadata,\r\n timestamp: msg.timestamp,\r\n };\r\n }\r\n\r\n async saveMessage(conversationId: string, message: Message): Promise<void> {\r\n await this.prisma.message.create({\r\n data: {\r\n id: message.id,\r\n conversationId,\r\n role: message.role,\r\n content: message.content,\r\n toolCalls: message.toolCalls || [],\r\n toolResults: message.toolResults || [],\r\n metadata: message.metadata || {},\r\n timestamp: message.timestamp || Date.now(),\r\n },\r\n });\r\n\r\n await this.prisma.conversation.update({\r\n where: { id: conversationId },\r\n data: { updatedAt: new Date() },\r\n });\r\n }\r\n\r\n async saveManyMessages(conversationId: string, messages: Message[]): Promise<void> {\r\n if (messages.length === 0) return;\r\n\r\n await this.prisma.message.createMany({\r\n data: messages.map(m => ({\r\n id: m.id,\r\n conversationId,\r\n role: m.role,\r\n content: m.content,\r\n toolCalls: m.toolCalls || [],\r\n toolResults: m.toolResults || [],\r\n metadata: m.metadata || {},\r\n timestamp: m.timestamp || Date.now(),\r\n })),\r\n });\r\n\r\n await this.prisma.conversation.update({\r\n where: { id: conversationId },\r\n data: { updatedAt: new Date() },\r\n });\r\n }\r\n\r\n async getMessage(messageId: string): Promise<Message | null> {\r\n const msg = await this.prisma.message.findUnique({ where: { id: messageId } });\r\n return msg ? this.toMessage(msg) : null;\r\n }\r\n\r\n async getMessages(conversationId: string, limit = 100, offset = 0): Promise<Message[]> {\r\n const messages = await this.prisma.message.findMany({\r\n where: { conversationId },\r\n orderBy: { timestamp: 'asc' },\r\n take: limit,\r\n skip: offset,\r\n });\r\n return messages.map(this.toMessage);\r\n }\r\n\r\n async getMessagesByRole(conversationId: string, role: Message['role']): Promise<Message[]> {\r\n const messages = await this.prisma.message.findMany({\r\n where: { conversationId, role },\r\n orderBy: { timestamp: 'asc' },\r\n });\r\n return messages.map(this.toMessage);\r\n }\r\n\r\n async updateMessage(messageId: string, updates: Partial<Message>): Promise<void> {\r\n await this.prisma.message.update({\r\n where: { id: messageId },\r\n data: updates,\r\n });\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.prisma.message.delete({ where: { id: messageId } });\r\n }\r\n\r\n async deleteAllMessages(conversationId: string): Promise<void> {\r\n await this.prisma.message.deleteMany({ where: { conversationId } });\r\n }\r\n\r\n async countMessages(conversationId: string): Promise<number> {\r\n return await this.prisma.message.count({ where: { conversationId } });\r\n }\r\n\r\n async getLastMessage(conversationId: string): Promise<Message | null> {\r\n const msg = await this.prisma.message.findFirst({\r\n where: { conversationId },\r\n orderBy: { timestamp: 'desc' },\r\n });\r\n return msg ? this.toMessage(msg) : null;\r\n }\r\n\r\n async searchMessages(conversationId: string, query: string): Promise<Message[]> {\r\n const messages = await this.prisma.message.findMany({\r\n where: {\r\n conversationId,\r\n content: { contains: query, mode: 'insensitive' },\r\n },\r\n orderBy: { timestamp: 'asc' },\r\n });\r\n return messages.map(this.toMessage);\r\n }\r\n\r\n // ─── Metadata ─────────────────────────────────────────────────────────────\r\n\r\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\r\n await this.prisma.conversation.update({\r\n where: { id: conversationId },\r\n data: { metadata, updatedAt: new Date() },\r\n });\r\n }\r\n\r\n async getConversationMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\r\n const conv = await this.prisma.conversation.findUnique({\r\n where: { id: conversationId },\r\n select: { metadata: true },\r\n });\r\n return conv?.metadata || null;\r\n }\r\n\r\n async deleteConversationMetadata(conversationId: string, keys: string[]): Promise<void> {\r\n const existing = await this.getConversationMetadata(conversationId);\r\n if (!existing) return;\r\n for (const key of keys) delete existing[key];\r\n await this.updateConversationMetadata(conversationId, existing);\r\n }\r\n\r\n // ─── Users ────────────────────────────────────────────────────────────────\r\n\r\n async userExists(userId: string): Promise<boolean> {\r\n const count = await this.prisma.conversation.count({ where: { userId } });\r\n return count > 0;\r\n }\r\n\r\n async deleteUser(userId: string): Promise<void> {\r\n await this.deleteAllConversations(userId);\r\n }\r\n\r\n // ─── Bulk ─────────────────────────────────────────────────────────────────\r\n\r\n async exportConversation(conversationId: string): Promise<ConversationExport> {\r\n const conversation = await this.getConversation(conversationId);\r\n if (!conversation) throw new Error(`Conversation ${conversationId} not found`);\r\n const messages = await this.getMessages(conversationId);\r\n return { conversation, messages, exportedAt: new Date() };\r\n }\r\n\r\n async importConversation(userId: string, data: ConversationExport): Promise<string> {\r\n const newId = await this.createConversation(userId, data.conversation.metadata);\r\n await this.prisma.conversation.update({\r\n where: { id: newId },\r\n data: { title: data.conversation.title, createdAt: data.conversation.createdAt },\r\n });\r\n await this.saveManyMessages(newId, data.messages);\r\n return newId;\r\n }\r\n}","import EventEmitter from 'eventemitter3';\r\nimport { generateId } from '../utils';\r\nimport type { PaprFlare } from '../client';\r\nimport type { Message, ChatConfig } from '../types';\r\nimport type {\r\n Thread,\r\n ThreadEvent,\r\n ThreadFilter,\r\n ThreadPaginationOptions,\r\n ThreadStats,\r\n ThreadExport,\r\n} from './base';\r\n\r\n/**\r\n * Thread Manager for handling multiple concurrent conversations\r\n * Optimized for high throughput with event-driven architecture\r\n */\r\nexport class ThreadManager extends EventEmitter {\r\n threads: Map<string, Thread> = new Map();\r\n\r\n constructor(private client: PaprFlare) {\r\n super();\r\n }\r\n\r\n // ─── Creation ─────────────────────────────────────────────────────────────\r\n\r\n async createThread(\r\n userId: string,\r\n config?: ChatConfig,\r\n metadata?: Record<string, unknown>,\r\n options?: { title?: string; tags?: string[]; priority?: Thread['priority'] }\r\n ): Promise<string> {\r\n const threadId = generateId('thread');\r\n const now = Date.now();\r\n\r\n const thread: Thread = {\r\n id: threadId,\r\n userId,\r\n messages: [],\r\n config,\r\n metadata: metadata || {},\r\n tags: options?.tags || [],\r\n title: options?.title,\r\n createdAt: now,\r\n updatedAt: now,\r\n lastActiveAt: now,\r\n status: 'active',\r\n priority: options?.priority || 'normal',\r\n messageCount: 0,\r\n errorCount: 0,\r\n };\r\n\r\n this.threads.set(threadId, thread);\r\n this.emit('event', { type: 'thread-created', threadId, thread } as ThreadEvent);\r\n\r\n return threadId;\r\n }\r\n\r\n /**\r\n * Fork a thread — creates a new thread with a copy of messages up to a given point\r\n */\r\n async forkThread(\r\n threadId: string,\r\n upToMessageId?: string\r\n ): Promise<string> {\r\n const thread = this.requireThread(threadId);\r\n\r\n let messages = [...thread.messages];\r\n if (upToMessageId) {\r\n const idx = messages.findIndex(m => m.id === upToMessageId);\r\n if (idx !== -1) messages = messages.slice(0, idx + 1);\r\n }\r\n\r\n const newId = await this.createThread(thread.userId, thread.config, { ...thread.metadata });\r\n const newThread = this.requireThread(newId);\r\n newThread.messages = messages.map(m => ({ ...m }));\r\n newThread.messageCount = messages.length;\r\n newThread.tags = [...thread.tags];\r\n newThread.title = thread.title ? `Fork of ${thread.title}` : undefined;\r\n\r\n this.emit('event', { type: 'thread-forked', threadId: newId, parentThreadId: threadId } as ThreadEvent);\r\n\r\n return newId;\r\n }\r\n\r\n /**\r\n * Merge another thread's messages into this thread\r\n */\r\n async mergeThread(targetThreadId: string, sourceThreadId: string): Promise<void> {\r\n const target = this.requireThread(targetThreadId);\r\n const source = this.requireThread(sourceThreadId);\r\n\r\n const merged = [...target.messages, ...source.messages].sort(\r\n (a, b) => (a.timestamp || 0) - (b.timestamp || 0)\r\n );\r\n\r\n target.messages = merged;\r\n target.messageCount = merged.length;\r\n target.updatedAt = Date.now();\r\n\r\n this.emit('event', { type: 'thread-merged', threadId: targetThreadId, sourceThreadId } as ThreadEvent);\r\n }\r\n\r\n // ─── Retrieval ────────────────────────────────────────────────────────────\r\n\r\n getThread(threadId: string): Thread | null {\r\n return this.threads.get(threadId) || null;\r\n }\r\n\r\n threadExists(threadId: string): boolean {\r\n return this.threads.has(threadId);\r\n }\r\n\r\n getUserThreads(\r\n userId: string,\r\n options?: ThreadPaginationOptions\r\n ): Thread[] {\r\n let results = Array.from(this.threads.values()).filter(t => t.userId === userId);\r\n\r\n results = this.sortThreads(results, options?.sort);\r\n\r\n const offset = options?.offset || 0;\r\n const limit = options?.limit ?? results.length;\r\n return results.slice(offset, offset + limit);\r\n }\r\n\r\n filterThreads(\r\n userId: string,\r\n filter: ThreadFilter,\r\n options?: ThreadPaginationOptions\r\n ): Thread[] {\r\n let results = Array.from(this.threads.values()).filter(t => t.userId === userId);\r\n\r\n if (filter.status) {\r\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\r\n results = results.filter(t => statuses.includes(t.status));\r\n }\r\n if (filter.priority) {\r\n results = results.filter(t => t.priority === filter.priority);\r\n }\r\n if (filter.tags?.length) {\r\n results = results.filter(t => filter.tags!.every(tag => t.tags.includes(tag)));\r\n }\r\n if (filter.createdAfter !== undefined) {\r\n results = results.filter(t => t.createdAt >= filter.createdAfter!);\r\n }\r\n if (filter.createdBefore !== undefined) {\r\n results = results.filter(t => t.createdAt <= filter.createdBefore!);\r\n }\r\n if (filter.updatedAfter !== undefined) {\r\n results = results.filter(t => t.updatedAt >= filter.updatedAfter!);\r\n }\r\n if (filter.search) {\r\n const q = filter.search.toLowerCase();\r\n results = results.filter(\r\n t =>\r\n t.title?.toLowerCase().includes(q) ||\r\n t.messages.some(m => typeof m.content === 'string' && m.content.toLowerCase().includes(q))\r\n );\r\n }\r\n\r\n results = this.sortThreads(results, options?.sort);\r\n\r\n const offset = options?.offset || 0;\r\n const limit = options?.limit ?? results.length;\r\n return results.slice(offset, offset + limit);\r\n }\r\n\r\n countThreads(userId: string, filter?: ThreadFilter): number {\r\n return this.filterThreads(userId, filter || {}).length;\r\n }\r\n\r\n // ─── Status & Metadata ────────────────────────────────────────────────────\r\n\r\n updateThreadStatus(threadId: string, status: Thread['status']): void {\r\n const thread = this.requireThread(threadId);\r\n const previousStatus = thread.status;\r\n thread.status = status;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'status-changed', threadId, status, previousStatus } as ThreadEvent);\r\n }\r\n\r\n updateThreadPriority(threadId: string, priority: Thread['priority']): void {\r\n const thread = this.requireThread(threadId);\r\n thread.priority = priority;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'priority-changed', threadId, priority } as ThreadEvent);\r\n }\r\n\r\n updateThreadMetadata(threadId: string, metadata: Record<string, unknown>): void {\r\n const thread = this.requireThread(threadId);\r\n thread.metadata = { ...thread.metadata, ...metadata };\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'metadata-updated', threadId, metadata: thread.metadata } as ThreadEvent);\r\n }\r\n\r\n setThreadTitle(threadId: string, title: string): void {\r\n const thread = this.requireThread(threadId);\r\n thread.title = title;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'title-updated', threadId, title } as ThreadEvent);\r\n }\r\n\r\n updateThreadConfig(threadId: string, config: Partial<ChatConfig>): void {\r\n const thread = this.requireThread(threadId);\r\n thread.config = { ...thread.config, ...config } as ChatConfig;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'config-updated', threadId, config: thread.config } as ThreadEvent);\r\n }\r\n\r\n // ─── Tags ─────────────────────────────────────────────────────────────────\r\n\r\n addTags(threadId: string, tags: string[]): void {\r\n const thread = this.requireThread(threadId);\r\n thread.tags = [...new Set([...thread.tags, ...tags])];\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'tags-updated', threadId, tags: thread.tags } as ThreadEvent);\r\n }\r\n\r\n removeTags(threadId: string, tags: string[]): void {\r\n const thread = this.requireThread(threadId);\r\n thread.tags = thread.tags.filter(t => !tags.includes(t));\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'tags-updated', threadId, tags: thread.tags } as ThreadEvent);\r\n }\r\n\r\n setTags(threadId: string, tags: string[]): void {\r\n const thread = this.requireThread(threadId);\r\n thread.tags = [...new Set(tags)];\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'tags-updated', threadId, tags: thread.tags } as ThreadEvent);\r\n }\r\n\r\n // ─── Messages ─────────────────────────────────────────────────────────────\r\n\r\n async addMessage(threadId: string, message: Message): Promise<void> {\r\n const thread = this.requireThread(threadId);\r\n const now = Date.now();\r\n\r\n const fullMessage: Message = {\r\n ...message,\r\n id: message.id || generateId('msg'),\r\n timestamp: message.timestamp || now,\r\n };\r\n\r\n thread.messages.push(fullMessage);\r\n thread.messageCount = thread.messages.length;\r\n thread.updatedAt = now;\r\n thread.lastActiveAt = now;\r\n\r\n this.emit('event', { type: 'message-added', threadId, message: fullMessage } as ThreadEvent);\r\n }\r\n\r\n async addManyMessages(threadId: string, messages: Message[]): Promise<void> {\r\n for (const message of messages) {\r\n await this.addMessage(threadId, message);\r\n }\r\n }\r\n\r\n getMessage(threadId: string, messageId: string): Message | null {\r\n const thread = this.requireThread(threadId);\r\n return thread.messages.find(m => m.id === messageId) || null;\r\n }\r\n\r\n getMessages(\r\n threadId: string,\r\n options?: { limit?: number; offset?: number; role?: Message['role'] }\r\n ): Message[] {\r\n const thread = this.requireThread(threadId);\r\n let messages = [...thread.messages];\r\n\r\n if (options?.role) {\r\n messages = messages.filter(m => m.role === options.role);\r\n }\r\n\r\n const offset = options?.offset || 0;\r\n const limit = options?.limit ?? messages.length;\r\n return messages.slice(offset, offset + limit);\r\n }\r\n\r\n getLastMessage(threadId: string): Message | null {\r\n const thread = this.requireThread(threadId);\r\n return thread.messages[thread.messages.length - 1] || null;\r\n }\r\n\r\n updateMessage(threadId: string, messageId: string, updates: Partial<Message>): void {\r\n const thread = this.requireThread(threadId);\r\n const idx = thread.messages.findIndex(m => m.id === messageId);\r\n if (idx === -1) throw new Error(`Message ${messageId} not found in thread ${threadId}`);\r\n\r\n thread.messages[idx] = { ...thread.messages[idx], ...updates } as Message;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'message-updated', threadId, messageId, updates } as ThreadEvent);\r\n }\r\n\r\n deleteMessage(threadId: string, messageId: string): void {\r\n const thread = this.requireThread(threadId);\r\n const idx = thread.messages.findIndex(m => m.id === messageId);\r\n if (idx === -1) throw new Error(`Message ${messageId} not found in thread ${threadId}`);\r\n\r\n thread.messages.splice(idx, 1);\r\n thread.messageCount = thread.messages.length;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'message-deleted', threadId, messageId } as ThreadEvent);\r\n }\r\n\r\n searchMessages(threadId: string, query: string): Message[] {\r\n const thread = this.requireThread(threadId);\r\n const lower = query.toLowerCase();\r\n return thread.messages.filter(\r\n m => typeof m.content === 'string' && m.content.toLowerCase().includes(lower)\r\n );\r\n }\r\n\r\n clearThread(threadId: string): void {\r\n const thread = this.requireThread(threadId);\r\n thread.messages = [];\r\n thread.messageCount = 0;\r\n thread.updatedAt = Date.now();\r\n this.emit('event', { type: 'thread-cleared', threadId } as ThreadEvent);\r\n }\r\n\r\n trimThread(threadId: string, keepLast: number): void {\r\n const thread = this.requireThread(threadId);\r\n if (thread.messages.length > keepLast) {\r\n thread.messages = thread.messages.slice(-keepLast);\r\n thread.messageCount = thread.messages.length;\r\n thread.updatedAt = Date.now();\r\n }\r\n }\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n archiveThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'archived');\r\n this.emit('event', { type: 'thread-archived', threadId } as ThreadEvent);\r\n }\r\n\r\n restoreThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'active');\r\n this.emit('event', { type: 'thread-restored', threadId } as ThreadEvent);\r\n }\r\n\r\n pauseThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'paused');\r\n }\r\n\r\n resumeThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'active');\r\n }\r\n\r\n completeThread(threadId: string): void {\r\n this.updateThreadStatus(threadId, 'completed');\r\n }\r\n\r\n markThreadError(threadId: string, error: Error): void {\r\n const thread = this.requireThread(threadId);\r\n thread.errorCount += 1;\r\n thread.lastError = error.message;\r\n this.updateThreadStatus(threadId, 'error');\r\n this.emit('event', { type: 'error', threadId, error } as ThreadEvent);\r\n }\r\n\r\n deleteThread(threadId: string): void {\r\n this.threads.delete(threadId);\r\n this.emit('event', { type: 'thread-deleted', threadId } as ThreadEvent);\r\n }\r\n\r\n deleteAllThreads(userId: string): void {\r\n for (const [id, thread] of this.threads) {\r\n if (thread.userId === userId) {\r\n this.threads.delete(id);\r\n this.emit('event', { type: 'thread-deleted', threadId: id } as ThreadEvent);\r\n }\r\n }\r\n }\r\n\r\n // ─── Stats ────────────────────────────────────────────────────────────────\r\n\r\n getStats(userId?: string): ThreadStats {\r\n const threads = userId\r\n ? Array.from(this.threads.values()).filter(t => t.userId === userId)\r\n : Array.from(this.threads.values());\r\n\r\n const totalMessages = threads.reduce((sum, t) => sum + t.messageCount, 0);\r\n const totalTokens = threads.reduce((sum, t) => sum + (t.tokenCount || 0), 0);\r\n const timestamps = threads.map(t => t.createdAt);\r\n\r\n const stats: ThreadStats = {\r\n total: threads.length,\r\n active: threads.filter(t => t.status === 'active').length,\r\n paused: threads.filter(t => t.status === 'paused').length,\r\n completed: threads.filter(t => t.status === 'completed').length,\r\n error: threads.filter(t => t.status === 'error').length,\r\n archived: threads.filter(t => t.status === 'archived').length,\r\n totalMessages,\r\n totalTokens,\r\n averageMessagesPerThread: threads.length ? totalMessages / threads.length : 0,\r\n oldestThread: timestamps.length ? Math.min(...timestamps) : undefined,\r\n newestThread: timestamps.length ? Math.max(...timestamps) : undefined,\r\n };\r\n\r\n this.emit('event', { type: 'pool-stats', stats } as ThreadEvent);\r\n return stats;\r\n }\r\n\r\n // ─── Bulk / Export ────────────────────────────────────────────────────────\r\n\r\n exportThread(threadId: string): ThreadExport {\r\n const thread = this.requireThread(threadId);\r\n return {\r\n thread: { ...thread },\r\n messages: thread.messages.map(m => ({ ...m })),\r\n exportedAt: Date.now(),\r\n version: '1.0',\r\n };\r\n }\r\n\r\n importThread(userId: string, data: ThreadExport): string {\r\n const newId = generateId('thread');\r\n const now = Date.now();\r\n\r\n const thread: Thread = {\r\n ...data.thread,\r\n id: newId,\r\n userId,\r\n messages: data.messages.map(m => ({ ...m })),\r\n createdAt: now,\r\n updatedAt: now,\r\n lastActiveAt: now,\r\n };\r\n\r\n this.threads.set(newId, thread);\r\n this.emit('event', { type: 'thread-created', threadId: newId, thread } as ThreadEvent);\r\n\r\n return newId;\r\n }\r\n\r\n // ─── Cleanup ──────────────────────────────────────────────────────────────\r\n\r\n cleanup(maxAge: number = 3600000): void {\r\n const now = Date.now();\r\n const toDelete: string[] = [];\r\n\r\n for (const [threadId, thread] of this.threads) {\r\n if (thread.status !== 'active' && now - thread.updatedAt > maxAge) {\r\n toDelete.push(threadId);\r\n }\r\n }\r\n\r\n for (const threadId of toDelete) {\r\n this.threads.delete(threadId);\r\n }\r\n\r\n this.emit('event', { type: 'cleanup', deletedCount: toDelete.length } as ThreadEvent);\r\n }\r\n\r\n // ─── Helpers ──────────────────────────────────────────────────────────────\r\n\r\n private requireThread(threadId: string): Thread {\r\n const thread = this.threads.get(threadId);\r\n if (!thread) throw new Error(`Thread ${threadId} not found`);\r\n return thread;\r\n }\r\n\r\n private sortThreads(threads: Thread[], sort?: ThreadPaginationOptions['sort']): Thread[] {\r\n const field = sort?.field || 'updatedAt';\r\n const dir = sort?.direction === 'asc' ? 1 : -1;\r\n\r\n return [...threads].sort((a, b) => {\r\n const av = a[field] as number;\r\n const bv = b[field] as number;\r\n return dir * (av - bv);\r\n });\r\n }\r\n}","import type { PaprFlare } from '../client';\r\nimport type { Thread, ThreadFilter, ThreadPaginationOptions, ThreadStats, ThreadExport } from './base';\r\nimport { ThreadManager } from './threads-manager';\r\n\r\n/**\r\n * Thread pool for managing multiple threads across multiple users efficiently\r\n */\r\nexport class ThreadPool {\r\n private managers: Map<string, ThreadManager> = new Map();\r\n\r\n constructor(private client: PaprFlare) { }\r\n\r\n // ─── Manager Lifecycle ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Get or create a thread manager for a user\r\n */\r\n getManager(userId: string): ThreadManager {\r\n if (!this.managers.has(userId)) {\r\n this.managers.set(userId, new ThreadManager(this.client));\r\n }\r\n return this.managers.get(userId)!;\r\n }\r\n\r\n /**\r\n * Check if a manager exists for a user\r\n */\r\n hasManager(userId: string): boolean {\r\n return this.managers.has(userId);\r\n }\r\n\r\n /**\r\n * Remove and destroy a user's thread manager\r\n */\r\n removeManager(userId: string): void {\r\n const manager = this.managers.get(userId);\r\n if (manager) {\r\n manager.removeAllListeners();\r\n this.managers.delete(userId);\r\n }\r\n }\r\n\r\n /**\r\n * List all user IDs that have active managers\r\n */\r\n listUsers(): string[] {\r\n return Array.from(this.managers.keys());\r\n }\r\n\r\n /**\r\n * Total number of managers (users) in the pool\r\n */\r\n managerCount(): number {\r\n return this.managers.size;\r\n }\r\n\r\n // ─── Cross-user Thread Queries ────────────────────────────────────────────\r\n\r\n /**\r\n * Get all threads across all users\r\n */\r\n getAllThreads(): Thread[] {\r\n const all: Thread[] = [];\r\n for (const manager of this.managers.values()) {\r\n all.push(...Array.from(manager.threads.values()));\r\n }\r\n return all;\r\n }\r\n\r\n /**\r\n * Get all active threads across all users\r\n */\r\n getAllActiveThreads(): Thread[] {\r\n return this.getAllThreads().filter(t => t.status === 'active');\r\n }\r\n\r\n /**\r\n * Get all threads matching a filter across all users\r\n */\r\n findThreads(filter: ThreadFilter, options?: ThreadPaginationOptions): Thread[] {\r\n let results: Thread[] = [];\r\n\r\n for (const [userId, manager] of this.managers) {\r\n results.push(...manager.filterThreads(userId, filter, options));\r\n }\r\n\r\n const field = options?.sort?.field || 'updatedAt';\r\n const dir = options?.sort?.direction === 'asc' ? 1 : -1;\r\n results.sort((a, b) => dir * ((a[field] as number) - (b[field] as number)));\r\n\r\n const offset = options?.offset || 0;\r\n const limit = options?.limit ?? results.length;\r\n return results.slice(offset, offset + limit);\r\n }\r\n\r\n /**\r\n * Find a specific thread by ID across all users\r\n */\r\n findThread(threadId: string): Thread | null {\r\n for (const manager of this.managers.values()) {\r\n const thread = manager.getThread(threadId);\r\n if (thread) return thread;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Find which user owns a thread\r\n */\r\n findThreadOwner(threadId: string): string | null {\r\n for (const [userId, manager] of this.managers) {\r\n if (manager.threadExists(threadId)) return userId;\r\n }\r\n return null;\r\n }\r\n\r\n // ─── Cross-user Stats ─────────────────────────────────────────────────────\r\n\r\n /**\r\n * Aggregate stats across all users\r\n */\r\n getGlobalStats(): ThreadStats & { userCount: number } {\r\n const allThreads = this.getAllThreads();\r\n const totalMessages = allThreads.reduce((s, t) => s + t.messageCount, 0);\r\n const totalTokens = allThreads.reduce((s, t) => s + (t.tokenCount || 0), 0);\r\n const timestamps = allThreads.map(t => t.createdAt);\r\n\r\n return {\r\n userCount: this.managers.size,\r\n total: allThreads.length,\r\n active: allThreads.filter(t => t.status === 'active').length,\r\n paused: allThreads.filter(t => t.status === 'paused').length,\r\n completed: allThreads.filter(t => t.status === 'completed').length,\r\n error: allThreads.filter(t => t.status === 'error').length,\r\n archived: allThreads.filter(t => t.status === 'archived').length,\r\n totalMessages,\r\n totalTokens,\r\n averageMessagesPerThread: allThreads.length ? totalMessages / allThreads.length : 0,\r\n oldestThread: timestamps.length ? Math.min(...timestamps) : undefined,\r\n newestThread: timestamps.length ? Math.max(...timestamps) : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Get per-user stats summary\r\n */\r\n getUserStats(): Record<string, ThreadStats> {\r\n const result: Record<string, ThreadStats> = {};\r\n for (const [userId, manager] of this.managers) {\r\n result[userId] = manager.getStats(userId);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Total thread count across all users\r\n */\r\n totalThreadCount(): number {\r\n let count = 0;\r\n for (const manager of this.managers.values()) {\r\n count += manager.threads.size;\r\n }\r\n return count;\r\n }\r\n\r\n // ─── Bulk Operations ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Cleanup inactive threads across all managers\r\n */\r\n cleanupAll(maxAge: number = 3600000): void {\r\n for (const manager of this.managers.values()) {\r\n manager.cleanup(maxAge);\r\n }\r\n\r\n // Remove empty managers after cleanup\r\n for (const [userId, manager] of this.managers) {\r\n if (manager.threads.size === 0) {\r\n manager.removeAllListeners();\r\n this.managers.delete(userId);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Archive all completed or errored threads older than maxAge\r\n */\r\n archiveStale(maxAge: number = 86400000): number {\r\n const now = Date.now();\r\n let count = 0;\r\n\r\n for (const manager of this.managers.values()) {\r\n for (const thread of manager.threads.values()) {\r\n if (\r\n (thread.status === 'completed' || thread.status === 'error') &&\r\n now - thread.updatedAt > maxAge\r\n ) {\r\n manager.archiveThread(thread.id);\r\n count++;\r\n }\r\n }\r\n }\r\n\r\n return count;\r\n }\r\n\r\n /**\r\n * Delete all threads and managers for a user\r\n */\r\n deleteUser(userId: string): void {\r\n const manager = this.managers.get(userId);\r\n if (manager) {\r\n manager.deleteAllThreads(userId);\r\n manager.removeAllListeners();\r\n this.managers.delete(userId);\r\n }\r\n }\r\n\r\n /**\r\n * Delete all threads and managers across the entire pool\r\n */\r\n purge(): void {\r\n for (const [userId, manager] of this.managers) {\r\n manager.deleteAllThreads(userId);\r\n manager.removeAllListeners();\r\n }\r\n this.managers.clear();\r\n }\r\n\r\n // ─── Export / Import ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Export a thread by ID, searching across all managers\r\n */\r\n exportThread(threadId: string): ThreadExport | null {\r\n for (const manager of this.managers.values()) {\r\n if (manager.threadExists(threadId)) {\r\n return manager.exportThread(threadId);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Import a thread for a user\r\n */\r\n importThread(userId: string, data: ThreadExport): string {\r\n return this.getManager(userId).importThread(userId, data);\r\n }\r\n\r\n /**\r\n * Export all threads for a user\r\n */\r\n exportUserThreads(userId: string): ThreadExport[] {\r\n const manager = this.managers.get(userId);\r\n if (!manager) return [];\r\n\r\n return Array.from(manager.threads.keys()).map(id => manager.exportThread(id));\r\n }\r\n\r\n /**\r\n * Import multiple threads for a user\r\n */\r\n importUserThreads(userId: string, exports: ThreadExport[]): string[] {\r\n return exports.map(data => this.importThread(userId, data));\r\n }\r\n}","import { z } from 'zod';\r\nimport PQueue from 'p-queue';\r\nimport { Mutex } from 'async-mutex';\r\nimport type {\r\n Message,\r\n StreamEvent,\r\n ProviderCallback,\r\n ChatResponse,\r\n StreamingChatResponse,\r\n TokenUsage,\r\n CloudModeConfig,\r\n CommonConfig,\r\n PaprFlareConfig,\r\n ChatOptions,\r\n SelfManagedConfig,\r\n} from '../types';\r\nimport { CacheManager } from '../cache';\r\nimport { DatabaseManager } from '../database';\r\nimport { ThreadManager } from '../threads';\r\nimport {\r\n toReadableStream,\r\n pipeToResponse,\r\n mergeStreams,\r\n collectStream,\r\n generateId,\r\n retry,\r\n formatMessages,\r\n PaprFlareError,\r\n collectText,\r\n processStream,\r\n streamToConsole,\r\n toHTTPResponse,\r\n toUIStream,\r\n} from '../utils';\r\n\r\n/**\r\n * Main PaprFlare client with automatic type inference\r\n */\r\nexport class PaprFlare {\r\n private mode: 'cloud' | 'self-managed';\r\n private cloudConfig?: CloudModeConfig;\r\n private providerCallback?: ProviderCallback;\r\n private cacheManager?: CacheManager;\r\n private databaseManager?: DatabaseManager;\r\n private threadManager?: ThreadManager;\r\n private queue: PQueue;\r\n private mutex: Mutex;\r\n private defaultRetryConfig: Required<NonNullable<CommonConfig['retry']>>;\r\n\r\n constructor(config: PaprFlareConfig) {\r\n this.mode = config.mode;\r\n this.mutex = new Mutex();\r\n\r\n // Initialize rate limiting\r\n const rateLimitConfig = config.rateLimit || {};\r\n this.queue = new PQueue({\r\n concurrency: rateLimitConfig.maxConcurrent || 100,\r\n interval: rateLimitConfig.interval || 1000,\r\n intervalCap: rateLimitConfig.intervalCap || 100,\r\n timeout: 30000,\r\n });\r\n\r\n // Default retry configuration\r\n this.defaultRetryConfig = {\r\n maxAttempts: config.retry?.maxAttempts || 3,\r\n initialDelay: config.retry?.initialDelay || 1000,\r\n maxDelay: config.retry?.maxDelay || 10000,\r\n backoffMultiplier: config.retry?.backoffMultiplier || 2,\r\n };\r\n\r\n if (config.mode === 'cloud') {\r\n this.cloudConfig = config;\r\n } else {\r\n this.providerCallback = config.provider;\r\n\r\n // Initialize cache if configured\r\n if (config.cache) {\r\n this.cacheManager = new CacheManager(config.cache);\r\n }\r\n\r\n // Initialize database if configured\r\n if (config.database) {\r\n this.databaseManager = new DatabaseManager(config.database);\r\n }\r\n\r\n // Initialize thread manager if configured\r\n if (config.threads?.enabled) {\r\n if (!this.providerCallback) {\r\n throw new PaprFlareError(\r\n 'Provider callback required for thread management',\r\n 'INVALID_CONFIG'\r\n );\r\n }\r\n // ThreadManager will be created lazily when needed\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Simplified chat API with automatic type inference\r\n * \r\n * @example\r\n * // Streaming (auto-typed as StreamingChatResponse)\r\n * const response = await client.chat({\r\n * messages: [{ role: 'user', content: 'Hello' }],\r\n * stream: true,\r\n * });\r\n * await response.toConsole(); // ✅ No type casting needed!\r\n * \r\n * @example\r\n * // Non-streaming (auto-typed as ChatResponse)\r\n * const response = await client.chat({\r\n * messages: [{ role: 'user', content: 'Hello' }],\r\n * });\r\n * console.log(response.message.content); // ✅ Direct access!\r\n */\r\n async chat<S extends boolean = false>(\r\n options: ChatOptions<S> & { messages: Message[] }\r\n ): Promise<S extends true ? StreamingChatResponse : ChatResponse>;\r\n\r\n async chat(\r\n options: ChatOptions & { messages: Message[] }\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n const { messages, ...config } = options;\r\n\r\n // Validate and format messages\r\n const formattedMessages = formatMessages(messages);\r\n\r\n // Validate configuration\r\n this.validateConfig(config);\r\n\r\n // Check cache if enabled\r\n if (this.cacheManager && config.cache?.enabled !== false) {\r\n const cached = await this.cacheManager.getCachedResponse(\r\n formattedMessages,\r\n config as any\r\n );\r\n\r\n if (cached) {\r\n if (config.stream) {\r\n return this.createStreamingResponse(\r\n this.eventsToGenerator(cached)\r\n );\r\n } else {\r\n return this.eventsToResponse(cached);\r\n }\r\n }\r\n }\r\n\r\n // Add to queue for rate limiting\r\n return this.queue.add(async () => {\r\n return this.executeChat(formattedMessages, config);\r\n }) as Promise<ChatResponse | StreamingChatResponse>;\r\n }\r\n\r\n /**\r\n * Execute chat with retry logic\r\n */\r\n private async executeChat(\r\n messages: Message[],\r\n config: ChatOptions\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n const retryConfig = { ...this.defaultRetryConfig, ...config.cache };\r\n\r\n return retry(\r\n async () => {\r\n if (this.mode === 'cloud') {\r\n return this.executeCloudChat(messages, config);\r\n } else {\r\n return this.executeSelfManagedChat(messages, config);\r\n }\r\n },\r\n {\r\n ...retryConfig,\r\n onRetry: (attempt, error) => {\r\n console.warn(\r\n `[PaprFlare] Retry attempt ${attempt}/${retryConfig.maxAttempts}:`,\r\n error.message\r\n );\r\n },\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Execute chat in cloud mode\r\n */\r\n private async executeCloudChat(\r\n messages: Message[],\r\n config: ChatOptions\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n const response = await fetch(\r\n `${this.cloudConfig!.baseURL || 'https://api.paprflare.in'}/v1/chat`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${this.cloudConfig!.apiKey}`,\r\n },\r\n body: JSON.stringify({\r\n messages,\r\n ...config,\r\n }),\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n throw new PaprFlareError(\r\n `Cloud API error: ${response.statusText}`,\r\n 'CLOUD_API_ERROR',\r\n response.status\r\n );\r\n }\r\n\r\n if (config.stream) {\r\n const stream = this.parseCloudStream(response.body!);\r\n return this.createStreamingResponse(stream);\r\n } else {\r\n const data = await response.json();\r\n return data as ChatResponse;\r\n }\r\n }\r\n\r\n /**\r\n * Execute chat in self-managed mode\r\n */\r\n private async executeSelfManagedChat(\r\n messages: Message[],\r\n config: ChatOptions\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n if (!this.providerCallback) {\r\n throw new PaprFlareError(\r\n 'Provider callback not configured',\r\n 'INVALID_CONFIG'\r\n );\r\n }\r\n\r\n // Handle structured output\r\n if (config.output?.schema) {\r\n return this.executeStructuredOutput(messages, config);\r\n }\r\n\r\n // Execute provider callback\r\n const stream = this.providerCallback(messages, config as any);\r\n\r\n if (config.stream) {\r\n let finalStream: AsyncGenerator<StreamEvent>;\r\n\r\n if (this.cacheManager && config.cache?.enabled !== false) {\r\n const events: StreamEvent[] = [];\r\n const cachedStream = this.cacheStream(stream, events);\r\n finalStream = this.withFinally(cachedStream, () =>\r\n this.cacheManager!.cacheResponse(messages, config as any, events)\r\n );\r\n } else {\r\n finalStream = stream;\r\n }\r\n\r\n return this.createStreamingResponse(finalStream);\r\n } else {\r\n const events = await collectStream(stream);\r\n\r\n if (this.cacheManager && config.cache?.enabled !== false) {\r\n await this.cacheManager.cacheResponse(messages, config as any, events);\r\n }\r\n\r\n return this.eventsToResponse(events);\r\n }\r\n }\r\n\r\n /**\r\n * Execute structured output generation\r\n */\r\n private async executeStructuredOutput(\r\n messages: Message[],\r\n config: ChatOptions\r\n ): Promise<ChatResponse> {\r\n const rawShape = (config.output!.schema as any)._def?.shape;\r\n const schema = typeof rawShape === 'function' ? rawShape() : rawShape;\r\n\r\n const schemaDescription = schema\r\n ? Object.entries(schema)\r\n .map(([key, val]: [string, any]) => {\r\n const typeName: string =\r\n val?._def?.typeName ?? val?.constructor?.name ?? 'unknown';\r\n return ` - \"${key}\": ${typeName}`;\r\n })\r\n .join('\\n')\r\n : '(schema shape unavailable)';\r\n\r\n const systemMessage: Message = {\r\n id: generateId('msg'),\r\n role: 'system',\r\n content: `You are a JSON generator. You MUST respond with ONLY valid JSON that matches this exact schema:\r\n${schemaDescription}\r\n\r\nRules:\r\n1. Include ALL fields listed above - do not omit any\r\n2. NO explanatory text before or after the JSON\r\n3. NO markdown code blocks or formatting\r\n4. NO comments in the JSON\r\n5. Return ONLY the raw JSON object\r\n6. The JSON must be parseable and valid`,\r\n timestamp: Date.now(),\r\n };\r\n // Enhance user message with explicit JSON instruction\r\n const lastUserMessage = messages[messages.length - 1];\r\n const enhancedMessages = [\r\n systemMessage,\r\n ...messages.slice(0, -1),\r\n {\r\n ...lastUserMessage,\r\n // AFTER:\r\n content: `${lastUserMessage?.content}\r\n\r\nCRITICAL: Your response must be ONLY valid JSON containing ALL of these fields: ${schema ? Object.keys(schema).join(', ') : 'all required fields'\r\n }. Start directly with { and end with }. No other text.`,\r\n },\r\n ] as Message[];\r\n\r\n const stream = this.providerCallback!(enhancedMessages, {\r\n ...config,\r\n stream: false,\r\n temperature: 0.1, // Very low temperature for structured output\r\n } as any);\r\n\r\n const events = await collectStream(stream);\r\n let textContent = events\r\n .filter((e) => e.type === 'text-delta')\r\n .map((e) => (e.type === 'text-delta' ? e.delta : ''))\r\n .join('');\r\n\r\n // Try multiple extraction strategies\r\n let jsonText = this.extractJSON(textContent);\r\n\r\n // Parse and validate against schema\r\n try {\r\n const parsed = JSON.parse(jsonText);\r\n\r\n // Guard: if schema.parse is not available (minification issue), skip validation\r\n const validated = (typeof schema?.parse === 'function')\r\n ? schema.parse(parsed)\r\n : parsed;\r\n\r\n const doneEvent = events.find((e) => e.type === 'done');\r\n const message: Message =\r\n doneEvent && doneEvent.type === 'done'\r\n ? {\r\n ...doneEvent.finalMessage,\r\n content: JSON.stringify(validated, null, 2),\r\n }\r\n : {\r\n id: generateId('msg'),\r\n role: 'assistant',\r\n content: JSON.stringify(validated, null, 2),\r\n timestamp: Date.now(),\r\n };\r\n\r\n return {\r\n message,\r\n usage: events.find((e) => e.type === 'usage' && 'usage' in e)?.[\r\n 'usage'\r\n ] as TokenUsage,\r\n };\r\n } catch (error: any) {\r\n // Provide detailed error with raw response\r\n console.error('\\n[Structured Output Error]');\r\n console.error('Raw response:', textContent);\r\n console.error('Extracted JSON attempt:', jsonText.substring(0, 500));\r\n console.error('Parse error:', error.message);\r\n\r\n throw new PaprFlareError(\r\n `Failed to parse structured output. The model returned: \"${textContent.substring(0, 100)}...\" \r\n\r\nPlease ensure:\r\n1. The model supports JSON output\r\n2. Try using a model like GPT-4 or Claude\r\n3. For list output, wrap in object: { items: [...] }\r\n\r\nParse error: ${error.message}`,\r\n 'VALIDATION_ERROR',\r\n 400,\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Extract JSON from text with multiple strategies\r\n */\r\n private extractJSON(text: string): string {\r\n // Strategy 1: Remove markdown code blocks\r\n let cleaned = text.replace(/```json\\s*/gi, '').replace(/```\\s*/g, '');\r\n\r\n // Strategy 2: Find JSON object or array with better regex\r\n // Look for { ... } or [ ... ] with proper nesting\r\n const objectMatch = cleaned.match(/\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})*\\}/);\r\n const arrayMatch = cleaned.match(/\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\]/);\r\n\r\n // Prefer object over array if both exist\r\n if (objectMatch) {\r\n return objectMatch[0].trim();\r\n }\r\n\r\n if (arrayMatch) {\r\n return arrayMatch[0].trim();\r\n }\r\n\r\n // Strategy 3: Try to find JSON between specific markers\r\n const lines = cleaned.split('\\n');\r\n let jsonLines: string[] = [];\r\n let inJSON = false;\r\n let braceCount = 0;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Check if line starts JSON\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n inJSON = true;\r\n jsonLines = [line];\r\n braceCount = (line.match(/\\{/g) || []).length - (line.match(/\\}/g) || []).length;\r\n braceCount += (line.match(/\\[/g) || []).length - (line.match(/\\]/g) || []).length;\r\n\r\n if (braceCount === 0) {\r\n // Complete JSON on one line\r\n return line.trim();\r\n }\r\n continue;\r\n }\r\n\r\n if (inJSON) {\r\n jsonLines.push(line);\r\n braceCount += (line.match(/\\{/g) || []).length - (line.match(/\\}/g) || []).length;\r\n braceCount += (line.match(/\\[/g) || []).length - (line.match(/\\]/g) || []).length;\r\n\r\n if (braceCount === 0) {\r\n return jsonLines.join('\\n').trim();\r\n }\r\n }\r\n }\r\n\r\n // Strategy 4: Return cleaned text if nothing else worked\r\n return cleaned.trim();\r\n }\r\n\r\n /**\r\n * Create streaming response with all helper methods\r\n */\r\n private createStreamingResponse(\r\n stream: AsyncGenerator<StreamEvent>\r\n ): StreamingChatResponse {\r\n return {\r\n stream,\r\n toReadableStream: () => toReadableStream(stream),\r\n pipeToResponse: async (response: Response) => {\r\n await pipeToResponse(stream, response);\r\n },\r\n mergeStreams: (...streams: AsyncGenerator<StreamEvent>[]) => {\r\n return mergeStreams(stream, ...streams);\r\n },\r\n toUIStream: () => toUIStream(stream),\r\n process: (handlers: any) => processStream(stream, handlers),\r\n toText: () => collectText(stream),\r\n toConsole: () =>\r\n streamToConsole(stream),\r\n toResponse: (target?: any) => toHTTPResponse(stream, target),\r\n };\r\n }\r\n\r\n /**\r\n * Wraps generator with finally callback\r\n */\r\n private async *withFinally(\r\n generator: AsyncGenerator<StreamEvent>,\r\n callback: () => void | Promise<void>\r\n ): AsyncGenerator<StreamEvent> {\r\n try {\r\n yield* generator;\r\n } finally {\r\n await callback();\r\n }\r\n }\r\n\r\n /**\r\n * Parse cloud API stream\r\n */\r\n private async *parseCloudStream(\r\n body: ReadableStream<Uint8Array>\r\n ): AsyncGenerator<StreamEvent> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\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 const text = decoder.decode(value, { stream: true });\r\n const lines = text.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n const data = line.slice(6);\r\n if (data === '[DONE]') break;\r\n\r\n try {\r\n const event = JSON.parse(data) as StreamEvent;\r\n yield event;\r\n } catch (error) {\r\n console.error('Failed to parse event:', error);\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 * Cache stream events\r\n */\r\n private async *cacheStream(\r\n stream: AsyncGenerator<StreamEvent>,\r\n events: StreamEvent[]\r\n ): AsyncGenerator<StreamEvent> {\r\n for await (const event of stream) {\r\n events.push(event);\r\n yield event;\r\n }\r\n }\r\n\r\n /**\r\n * Convert events to generator\r\n */\r\n private async *eventsToGenerator(\r\n events: StreamEvent[]\r\n ): AsyncGenerator<StreamEvent> {\r\n for (const event of events) {\r\n yield event;\r\n }\r\n }\r\n\r\n /**\r\n * Convert events to response\r\n */\r\n private eventsToResponse(events: StreamEvent[]): ChatResponse {\r\n const doneEvent = events.find((e) => e.type === 'done');\r\n const usageEvent = events.find((e) => e.type === 'usage');\r\n\r\n if (!doneEvent || doneEvent.type !== 'done') {\r\n throw new PaprFlareError(\r\n 'No completion event found in response',\r\n 'INVALID_RESPONSE'\r\n );\r\n }\r\n\r\n return {\r\n message: doneEvent.finalMessage,\r\n usage:\r\n usageEvent && usageEvent.type === 'usage'\r\n ? usageEvent.usage\r\n : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Validate configuration\r\n */\r\n private validateConfig(config: ChatOptions): void {\r\n if (config.temperature !== undefined) {\r\n if (config.temperature < 0 || config.temperature > 2) {\r\n throw new PaprFlareError(\r\n 'Temperature must be between 0 and 2',\r\n 'VALIDATION_ERROR',\r\n 400\r\n );\r\n }\r\n }\r\n\r\n if (config.maxTokens !== undefined && config.maxTokens < 1) {\r\n throw new PaprFlareError(\r\n 'Max tokens must be greater than 0',\r\n 'VALIDATION_ERROR',\r\n 400\r\n );\r\n }\r\n\r\n if (config.output?.schema && config.stream) {\r\n throw new PaprFlareError(\r\n 'Structured output requires stream: false',\r\n 'VALIDATION_ERROR',\r\n 400\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get database manager (self-managed mode only)\r\n */\r\n get database(): DatabaseManager | undefined {\r\n if (this.mode === 'cloud') {\r\n throw new PaprFlareError(\r\n 'Database is not available in cloud mode',\r\n 'INVALID_MODE'\r\n );\r\n }\r\n return this.databaseManager;\r\n }\r\n\r\n /**\r\n * Get thread manager (self-managed mode only)\r\n */\r\n get threads(): ThreadManager {\r\n if (this.mode === 'cloud') {\r\n throw new PaprFlareError(\r\n 'Threads are not available in cloud mode',\r\n 'INVALID_MODE'\r\n );\r\n }\r\n\r\n if (!this.threadManager) {\r\n if (!this.providerCallback) {\r\n throw new PaprFlareError(\r\n 'Provider callback required for thread management',\r\n 'INVALID_CONFIG'\r\n );\r\n }\r\n // Create client instance for thread manager\r\n const threadClient = new PaprFlare({\r\n mode: 'self-managed',\r\n provider: this.providerCallback,\r\n } as SelfManagedConfig);\r\n this.threadManager = new ThreadManager(threadClient as any);\r\n }\r\n\r\n return this.threadManager;\r\n }\r\n\r\n /**\r\n * Get queue statistics\r\n */\r\n getQueueStats() {\r\n return {\r\n size: this.queue.size,\r\n pending: this.queue.pending,\r\n concurrency: this.queue.concurrency,\r\n };\r\n }\r\n\r\n /**\r\n * Clear cache\r\n */\r\n async clearCache(): Promise<void> {\r\n if (this.cacheManager) {\r\n await this.cacheManager.clearAll();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create structured output helper\r\n */\r\nexport function structuredOutput<T extends z.ZodSchema>(schema: T) {\r\n return {\r\n schema,\r\n mode: 'json' as const,\r\n };\r\n}","import Anthropic from '@anthropic-ai/sdk';\r\nimport type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n Tool,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface AnthropicConfig extends ProviderConfig {\r\n model?: string;\r\n anthropicVersion?: string;\r\n}\r\n\r\n/**\r\n * Anthropic (Claude) provider for PaprFlare using official SDK\r\n */\r\nexport class AnthropicProvider {\r\n private client: Anthropic;\r\n private defaultModel: string;\r\n\r\n constructor(config: AnthropicConfig) {\r\n this.client = new Anthropic({\r\n apiKey: config.apiKey,\r\n baseURL: config.baseURL,\r\n timeout: config.timeout || 30000,\r\n maxRetries: config.maxRetries || 3,\r\n defaultHeaders: config.headers,\r\n });\r\n this.defaultModel = config.model || 'claude-3-5-sonnet-20241022';\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n const systemMessage = messages.find((m) => m.role === 'system');\r\n const conversationMessages = messages.filter((m) => m.role !== 'system');\r\n\r\n const stream = this.client.messages.stream({\r\n model: config.model || this.defaultModel,\r\n messages: this.formatMessages(conversationMessages) as any,\r\n max_tokens: config.maxTokens || 4096,\r\n temperature: config.temperature,\r\n top_p: config.topP,\r\n stop_sequences: config.stop,\r\n ...(systemMessage && { system: systemMessage.content }),\r\n ...(config.tools && config.tools.length > 0 && {\r\n tools: this.formatTools(config.tools) as any,\r\n }),\r\n ...(config.toolChoice && config.toolChoice !== 'auto' && {\r\n tool_choice: this.formatToolChoice(config.toolChoice) as any,\r\n }),\r\n });\r\n\r\n let currentToolUse: any = null;\r\n let toolInputBuffer = '';\r\n\r\n // Iterate raw SSE events directly — no .on() handlers\r\n for await (const event of stream) {\r\n if (event.type === 'content_block_start') {\r\n if (event.content_block?.type === 'tool_use') {\r\n currentToolUse = event.content_block;\r\n toolInputBuffer = '';\r\n writer.startToolCall(currentToolUse.name, currentToolUse.id);\r\n }\r\n }\r\n\r\n if (event.type === 'content_block_delta') {\r\n if (event.delta?.type === 'text_delta') {\r\n writer.writeText(event.delta.text);\r\n }\r\n if (event.delta?.type === 'input_json_delta') {\r\n toolInputBuffer += event.delta.partial_json;\r\n writer.writeToolCallDelta(event.delta.partial_json);\r\n }\r\n }\r\n\r\n if (event.type === 'content_block_stop') {\r\n if (currentToolUse) {\r\n try {\r\n const args = JSON.parse(\r\n currentToolUse.input\r\n ? JSON.stringify(currentToolUse.input)\r\n : toolInputBuffer || '{}'\r\n );\r\n writer.endToolCall(args);\r\n } catch (e) {\r\n console.error('Failed to parse tool arguments:', e);\r\n writer.endToolCall({});\r\n }\r\n currentToolUse = null;\r\n toolInputBuffer = '';\r\n }\r\n }\r\n\r\n yield* writer.flush();\r\n }\r\n\r\n // Usage from final message\r\n const finalMessage = await stream.finalMessage();\r\n if (finalMessage.usage) {\r\n writer.writeUsage({\r\n promptTokens: finalMessage.usage.input_tokens,\r\n completionTokens: finalMessage.usage.output_tokens,\r\n totalTokens:\r\n finalMessage.usage.input_tokens + finalMessage.usage.output_tokens,\r\n });\r\n }\r\n\r\n writer.done();\r\n yield* writer.flush();\r\n } catch (error: any) {\r\n if (error instanceof Anthropic.APIError) {\r\n throw new ProviderError(error.message, 'anthropic', error.status);\r\n }\r\n throw new ProviderError(`Anthropic provider error: ${error.message}`, 'anthropic');\r\n }\r\n }\r\n\r\n /**\r\n * Format messages for Anthropic API\r\n */\r\n private formatMessages(messages: Message[]) {\r\n return messages.map((msg) => {\r\n const content: any[] = [];\r\n\r\n // Add text content\r\n if (msg.content) {\r\n content.push({\r\n type: 'text',\r\n text: msg.content,\r\n });\r\n }\r\n\r\n // Add tool use\r\n if (msg.toolCalls) {\r\n for (const toolCall of msg.toolCalls) {\r\n content.push({\r\n type: 'tool_use',\r\n id: toolCall.id,\r\n name: toolCall.name,\r\n input: toolCall.arguments,\r\n });\r\n }\r\n }\r\n\r\n // Add tool results\r\n if (msg.toolResults) {\r\n for (const result of msg.toolResults) {\r\n content.push({\r\n type: 'tool_result',\r\n tool_use_id: result.toolCallId,\r\n content: JSON.stringify(result.result),\r\n ...(result.error && { is_error: true }),\r\n });\r\n }\r\n }\r\n\r\n return {\r\n role: msg.role === 'assistant' ? 'assistant' : 'user',\r\n content: content.length === 1 && content[0].type === 'text'\r\n ? content[0].text\r\n : content,\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Format tools for Anthropic API with Zod schema conversion\r\n */\r\n private formatTools(tools: Tool[]) {\r\n return tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description,\r\n input_schema: this.zodToJsonSchema(tool.parameters),\r\n }));\r\n }\r\n\r\n /**\r\n * Format tool choice for Anthropic API\r\n */\r\n private formatToolChoice(toolChoice: ChatConfig['toolChoice']): any {\r\n if (toolChoice === 'none') {\r\n // Anthropic doesn't have explicit \"none\" - omit tools instead\r\n return undefined;\r\n }\r\n\r\n if (toolChoice === 'required') {\r\n return { type: 'any' };\r\n }\r\n\r\n // If toolChoice is an object with a name, specify that tool\r\n if (typeof toolChoice === 'object' && 'name' in toolChoice) {\r\n return {\r\n type: 'tool',\r\n name: toolChoice.name,\r\n };\r\n }\r\n\r\n return { type: 'auto' };\r\n }\r\n\r\n /**\r\n * Convert Zod schema to JSON Schema for Anthropic\r\n */\r\n private zodToJsonSchema(zodType: any): any {\r\n const def = zodType._def;\r\n\r\n if (!def) {\r\n return {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n };\r\n }\r\n\r\n switch (def.typeName) {\r\n case 'ZodString':\r\n return {\r\n type: 'string',\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodNumber':\r\n return {\r\n type: 'number',\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodBoolean':\r\n return {\r\n type: 'boolean',\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodArray':\r\n return {\r\n type: 'array',\r\n items: this.zodToJsonSchema(def.type),\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodObject':\r\n const properties: Record<string, any> = {};\r\n const required: string[] = [];\r\n const shape = def.shape();\r\n\r\n for (const [key, value] of Object.entries(shape)) {\r\n properties[key] = this.zodToJsonSchema(value);\r\n if (!(value as any).isOptional?.()) {\r\n required.push(key);\r\n }\r\n }\r\n\r\n return {\r\n type: 'object',\r\n properties,\r\n ...(required.length > 0 && { required }),\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodEnum':\r\n return {\r\n type: 'string',\r\n enum: def.values,\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodOptional':\r\n return this.zodToJsonSchema(def.innerType);\r\n case 'ZodNullable':\r\n return {\r\n ...this.zodToJsonSchema(def.innerType),\r\n nullable: true,\r\n };\r\n case 'ZodUnion':\r\n // Handle unions by taking the first type (basic support)\r\n if (def.options && def.options.length > 0) {\r\n return this.zodToJsonSchema(def.options[0]);\r\n }\r\n return { type: 'string' };\r\n case 'ZodLiteral':\r\n return {\r\n type: typeof def.value,\r\n enum: [def.value],\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodDefault':\r\n return {\r\n ...this.zodToJsonSchema(def.innerType),\r\n default: def.defaultValue(),\r\n };\r\n default:\r\n console.warn(`Unsupported Zod type: ${def.typeName}, falling back to string`);\r\n return { type: 'string' };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create Anthropic provider instance\r\n */\r\nexport function createAnthropicProvider(config: AnthropicConfig): ProviderCallback {\r\n const provider = new AnthropicProvider(config);\r\n return provider.createCallback();\r\n}","import { GoogleGenerativeAI, FunctionCallingMode } from '@google/generative-ai';\r\nimport type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n Tool,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface GoogleConfig extends ProviderConfig {\r\n model?: string;\r\n}\r\n\r\n/**\r\n * Google (Gemini) provider for PaprFlare using official SDK\r\n */\r\nexport class GoogleProvider {\r\n private client: GoogleGenerativeAI;\r\n private defaultModel: string;\r\n\r\n constructor(config: GoogleConfig) {\r\n this.client = new GoogleGenerativeAI(config.apiKey);\r\n this.defaultModel = config.model || 'gemini-2.5-flash'; // gemini-pro is deprecated\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n /**\r\n * Stream chat completion using official SDK\r\n */\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n // Extract system prompt if present\r\n const systemMessage = messages.find((m) => m.role === 'system');\r\n\r\n const model = this.client.getGenerativeModel({\r\n model: config.model || this.defaultModel,\r\n // Pass system instruction separately — Google requires this\r\n ...(systemMessage && {\r\n systemInstruction: systemMessage.content,\r\n }),\r\n generationConfig: {\r\n temperature: config.temperature,\r\n maxOutputTokens: config.maxTokens,\r\n topP: config.topP,\r\n stopSequences: config.stop,\r\n },\r\n // Add tools/functions if provided\r\n ...(config.tools && config.tools.length > 0 && {\r\n tools: [\r\n {\r\n functionDeclarations: this.formatTools(config.tools),\r\n },\r\n ],\r\n }),\r\n // Add tool config if specified\r\n ...(config.toolChoice && config.toolChoice !== 'auto' && {\r\n toolConfig: this.formatToolConfig(config.toolChoice),\r\n }),\r\n });\r\n\r\n const formattedMessages = this.formatMessages(messages);\r\n\r\n if (formattedMessages.length === 0) {\r\n throw new ProviderError('No messages to send', 'google');\r\n }\r\n\r\n const lastMessage = formattedMessages[formattedMessages.length - 1]!;\r\n const history = formattedMessages.slice(0, -1);\r\n\r\n // Always use startChat for consistency — works for single messages too\r\n const chat = model.startChat({\r\n history,\r\n });\r\n\r\n // sendMessageStream accepts string or Part[]\r\n const result = await chat.sendMessageStream(lastMessage.parts);\r\n\r\n // Stream responses\r\n for await (const chunk of result.stream) {\r\n const chunkText = chunk.text();\r\n if (chunkText) {\r\n writer.writeText(chunkText);\r\n // Yield immediately per chunk so consumers see tokens as they arrive\r\n yield* writer.flush();\r\n }\r\n\r\n // Handle function calls if present\r\n const functionCalls = chunk.functionCalls();\r\n if (functionCalls) {\r\n for (const call of functionCalls) {\r\n // Generate unique ID for each tool call\r\n const toolId = `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n // Google returns complete function calls (not streaming)\r\n writer.startToolCall(call.name, toolId);\r\n writer.endToolCall(call.args as Record<string, unknown>);\r\n yield* writer.flush();\r\n }\r\n }\r\n }\r\n\r\n // result.response resolves after stream is fully consumed\r\n const response = await result.response;\r\n if (response.usageMetadata) {\r\n writer.writeUsage({\r\n promptTokens: response.usageMetadata.promptTokenCount ?? 0,\r\n // Use totalTokenCount - promptTokenCount as fallback if candidatesTokenCount missing\r\n completionTokens:\r\n response.usageMetadata.candidatesTokenCount ??\r\n (response.usageMetadata.totalTokenCount ?? 0) -\r\n (response.usageMetadata.promptTokenCount ?? 0),\r\n totalTokens: response.usageMetadata.totalTokenCount ?? 0,\r\n });\r\n }\r\n\r\n writer.done();\r\n yield* writer.flush();\r\n } catch (error: any) {\r\n throw new ProviderError(\r\n `Google provider error: ${error.message}`,\r\n 'google'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Format messages for Google AI API\r\n * Filters system messages (handled via systemInstruction above)\r\n * Handles tool calls and tool results\r\n */\r\n private formatMessages(messages: Message[]) {\r\n return messages\r\n .filter((m) => m.role !== 'system')\r\n .map((msg) => {\r\n const parts: any[] = [];\r\n\r\n // Add text content if present\r\n if (msg.content) {\r\n parts.push({ text: msg.content });\r\n }\r\n\r\n // Add function calls if present (assistant messages)\r\n if (msg.toolCalls && msg.toolCalls.length > 0) {\r\n for (const toolCall of msg.toolCalls) {\r\n parts.push({\r\n functionCall: {\r\n name: toolCall.name,\r\n args: toolCall.arguments,\r\n },\r\n });\r\n }\r\n }\r\n\r\n // Add function responses if present (tool messages)\r\n if (msg.toolResults && msg.toolResults.length > 0) {\r\n for (const toolResult of msg.toolResults) {\r\n // Find the corresponding tool call to get the function name\r\n const toolCall = messages\r\n .flatMap(m => m.toolCalls || [])\r\n .find(tc => tc.id === toolResult.toolCallId);\r\n\r\n parts.push({\r\n functionResponse: {\r\n name: toolCall?.name || 'unknown',\r\n response: {\r\n result: toolResult.result,\r\n ...(toolResult.error && { error: toolResult.error }),\r\n },\r\n },\r\n });\r\n }\r\n }\r\n\r\n return {\r\n role: msg.role === 'assistant' || msg.role === 'tool' ? 'model' : 'user',\r\n parts: parts.length > 0 ? parts : [{ text: msg.content || '' }],\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Format tools for Google AI API\r\n * Converts Zod schemas to Google's JSON schema format\r\n */\r\n private formatTools(tools: Tool[]) {\r\n return tools.map((tool) => {\r\n // Convert Zod schema to JSON schema if possible\r\n let parameters: any = {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n };\r\n\r\n // Try to extract schema information from Zod\r\n // This is a basic conversion - you may need to enhance it based on your needs\r\n if (tool.parameters && typeof tool.parameters === 'object') {\r\n try {\r\n // If the Zod schema has a _def property, we can extract some info\r\n const zodDef = (tool.parameters as any)._def;\r\n if (zodDef) {\r\n // For ZodObject types\r\n if (zodDef.typeName === 'ZodObject' && zodDef.shape) {\r\n const shape = zodDef.shape();\r\n parameters.properties = Object.entries(shape).reduce(\r\n (acc, [key, value]: [string, any]) => {\r\n acc[key] = this.zodToJsonSchema(value);\r\n if (!value.isOptional?.()) {\r\n parameters.required.push(key);\r\n }\r\n return acc;\r\n },\r\n {} as Record<string, any>\r\n );\r\n }\r\n }\r\n } catch (error) {\r\n // Fallback to empty schema if conversion fails\r\n console.warn(`Failed to convert Zod schema for tool ${tool.name}:`, error);\r\n }\r\n }\r\n\r\n return {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters,\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Convert Zod schema to JSON Schema (basic implementation)\r\n */\r\n private zodToJsonSchema(zodType: any): any {\r\n const def = zodType._def;\r\n\r\n if (!def) {\r\n return { type: 'string' };\r\n }\r\n\r\n switch (def.typeName) {\r\n case 'ZodString':\r\n return { type: 'string', ...(def.description && { description: def.description }) };\r\n case 'ZodNumber':\r\n return { type: 'number', ...(def.description && { description: def.description }) };\r\n case 'ZodBoolean':\r\n return { type: 'boolean', ...(def.description && { description: def.description }) };\r\n case 'ZodArray':\r\n return {\r\n type: 'array',\r\n items: this.zodToJsonSchema(def.type),\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodObject':\r\n const properties: Record<string, any> = {};\r\n const required: string[] = [];\r\n const shape = def.shape();\r\n\r\n for (const [key, value] of Object.entries(shape)) {\r\n properties[key] = this.zodToJsonSchema(value);\r\n if (!(value as any).isOptional?.()) {\r\n required.push(key);\r\n }\r\n }\r\n\r\n return {\r\n type: 'object',\r\n properties,\r\n ...(required.length > 0 && { required }),\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodEnum':\r\n return {\r\n type: 'string',\r\n enum: def.values,\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodOptional':\r\n return this.zodToJsonSchema(def.innerType);\r\n case 'ZodNullable':\r\n return {\r\n ...this.zodToJsonSchema(def.innerType),\r\n nullable: true,\r\n };\r\n default:\r\n return { type: 'string' };\r\n }\r\n }\r\n\r\n /**\r\n * Format tool config for Google AI API\r\n */\r\n private formatToolConfig(toolChoice: ChatConfig['toolChoice']) {\r\n if (toolChoice === 'none') {\r\n return {\r\n functionCallingConfig: {\r\n mode: FunctionCallingMode.NONE,\r\n },\r\n };\r\n }\r\n\r\n if (toolChoice === 'required') {\r\n return {\r\n functionCallingConfig: {\r\n mode: FunctionCallingMode.ANY,\r\n },\r\n };\r\n }\r\n\r\n // If toolChoice is an object with a name, force that specific function\r\n if (typeof toolChoice === 'object' && 'name' in toolChoice) {\r\n return {\r\n functionCallingConfig: {\r\n mode: FunctionCallingMode.ANY,\r\n allowedFunctionNames: [toolChoice.name],\r\n },\r\n };\r\n }\r\n\r\n // Default to AUTO\r\n return {\r\n functionCallingConfig: {\r\n mode: FunctionCallingMode.AUTO,\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Create Google provider instance\r\n */\r\nexport function createGoogleProvider(config: GoogleConfig): ProviderCallback {\r\n const provider = new GoogleProvider(config);\r\n return provider.createCallback();\r\n}","import OpenAI from 'openai';\r\nimport type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n Tool,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface OpenAIConfig extends ProviderConfig {\r\n model?: string;\r\n}\r\n\r\n/**\r\n * OpenAI provider for PaprFlare using official OpenAI SDK\r\n */\r\nexport class OpenAIProvider {\r\n private client: OpenAI;\r\n private defaultModel: string;\r\n\r\n constructor(config: OpenAIConfig) {\r\n this.client = new OpenAI({\r\n apiKey: config.apiKey,\r\n baseURL: config.baseURL,\r\n organization: config.organization,\r\n timeout: config.timeout || 30000,\r\n maxRetries: config.maxRetries || 3,\r\n defaultHeaders: config.headers,\r\n });\r\n this.defaultModel = config.model || 'gpt-4-turbo-preview';\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n /**\r\n * Collect all chunks from a stream and return the final chat completion.\r\n * Replaces the missing finalChatCompletion() from beta API.\r\n */\r\n private async getFinalChatCompletion(\r\n chunks: OpenAI.Chat.Completions.ChatCompletionChunk[]\r\n ): Promise<{ usage: OpenAI.Chat.Completions.ChatCompletionChunk['usage'] } | null> {\r\n // The last chunk with usage is emitted when stream_options.include_usage is true\r\n const lastChunkWithUsage = [...chunks].reverse().find((c) => c.usage != null);\r\n if (!lastChunkWithUsage?.usage) return null;\r\n return { usage: lastChunkWithUsage.usage };\r\n }\r\n\r\n /**\r\n * Stream chat completion using official SDK\r\n */\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n const stream = await this.client.chat.completions.create({\r\n model: config.model || this.defaultModel,\r\n messages: this.formatMessages(messages) as any,\r\n temperature: config.temperature,\r\n max_tokens: config.maxTokens,\r\n top_p: config.topP,\r\n frequency_penalty: config.frequencyPenalty,\r\n presence_penalty: config.presencePenalty,\r\n stop: config.stop,\r\n stream: true,\r\n stream_options: { include_usage: true }, // instructs API to include usage in last chunk\r\n ...(config.tools && config.tools.length > 0 && {\r\n tools: this.formatTools(config.tools) as any,\r\n tool_choice: this.formatToolChoice(config.toolChoice) as any,\r\n }),\r\n });\r\n\r\n // Track tool calls by index\r\n const toolCallsBuffer: Map<number, { id: string; name: string; arguments: string }> = new Map();\r\n const allChunks: OpenAI.Chat.Completions.ChatCompletionChunk[] = [];\r\n\r\n for await (const chunk of stream) {\r\n allChunks.push(chunk);\r\n\r\n const delta = chunk.choices[0]?.delta;\r\n\r\n if (!delta) continue;\r\n\r\n // Handle text content\r\n if (delta.content) {\r\n writer.writeText(delta.content);\r\n }\r\n\r\n // Handle tool calls\r\n if (delta.tool_calls) {\r\n for (const toolCall of delta.tool_calls) {\r\n const index = toolCall.index;\r\n\r\n // Initialize buffer for this tool call if needed\r\n if (!toolCallsBuffer.has(index)) {\r\n toolCallsBuffer.set(index, {\r\n id: '',\r\n name: '',\r\n arguments: '',\r\n });\r\n }\r\n\r\n const buffered = toolCallsBuffer.get(index)!;\r\n\r\n // Update tool call data\r\n if (toolCall.id) {\r\n buffered.id = toolCall.id;\r\n }\r\n\r\n if (toolCall.function?.name) {\r\n buffered.name = toolCall.function.name;\r\n // Start tool call when we first see the name\r\n writer.startToolCall(buffered.name, buffered.id);\r\n }\r\n\r\n if (toolCall.function?.arguments) {\r\n buffered.arguments += toolCall.function.arguments;\r\n writer.writeToolCallDelta(toolCall.function.arguments);\r\n }\r\n }\r\n }\r\n\r\n // Handle finish reason\r\n if (chunk.choices[0]?.finish_reason) {\r\n if (chunk.choices[0].finish_reason === 'tool_calls') {\r\n // Finalize all tool calls\r\n for (const [index, buffered] of toolCallsBuffer.entries()) {\r\n try {\r\n const args = JSON.parse(buffered.arguments || '{}');\r\n writer.endToolCall(args);\r\n } catch (e) {\r\n console.error(`Failed to parse tool call arguments for ${buffered.name}:`, e);\r\n writer.endToolCall({});\r\n }\r\n }\r\n toolCallsBuffer.clear();\r\n }\r\n }\r\n\r\n yield* writer.flush();\r\n }\r\n\r\n const completion = await this.getFinalChatCompletion(allChunks);\r\n if (completion?.usage) {\r\n writer.writeUsage({\r\n promptTokens: completion.usage.prompt_tokens,\r\n completionTokens: completion.usage.completion_tokens,\r\n totalTokens: completion.usage.total_tokens,\r\n });\r\n }\r\n\r\n writer.done();\r\n yield* writer.flush();\r\n } catch (error: any) {\r\n if (error instanceof OpenAI.APIError) {\r\n throw new ProviderError(\r\n error.message,\r\n 'openai',\r\n error.status\r\n );\r\n }\r\n throw new ProviderError(\r\n `OpenAI provider error: ${error.message}`,\r\n 'openai'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Format messages for OpenAI API\r\n */\r\n private formatMessages(messages: Message[]) {\r\n return messages.map((msg) => {\r\n const formatted: any = {\r\n role: msg.role,\r\n content: msg.content || null,\r\n };\r\n\r\n // Add tool calls if present\r\n if (msg.toolCalls && msg.toolCalls.length > 0) {\r\n formatted.tool_calls = msg.toolCalls.map((tc) => ({\r\n id: tc.id,\r\n type: 'function' as const,\r\n function: {\r\n name: tc.name,\r\n arguments: JSON.stringify(tc.arguments),\r\n },\r\n }));\r\n }\r\n\r\n // Add tool_call_id for tool result messages\r\n if (msg.role === 'tool' && msg.toolResults && msg.toolResults.length > 0) {\r\n formatted.tool_call_id = msg.toolResults[0]?.toolCallId;\r\n formatted.content = JSON.stringify(msg.toolResults[0]?.result);\r\n }\r\n\r\n return formatted;\r\n });\r\n }\r\n\r\n /**\r\n * Format tools for OpenAI API with Zod schema conversion\r\n */\r\n private formatTools(tools: Tool[]) {\r\n return tools.map((tool) => ({\r\n type: 'function' as const,\r\n function: {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: this.zodToJsonSchema(tool.parameters),\r\n },\r\n }));\r\n }\r\n\r\n /**\r\n * Format tool choice for OpenAI API\r\n */\r\n private formatToolChoice(toolChoice: ChatConfig['toolChoice']): any {\r\n if (!toolChoice || toolChoice === 'auto') {\r\n return 'auto';\r\n }\r\n\r\n if (toolChoice === 'none') {\r\n return 'none';\r\n }\r\n\r\n if (toolChoice === 'required') {\r\n return 'required';\r\n }\r\n\r\n // If toolChoice is an object with a name\r\n if (typeof toolChoice === 'object' && 'name' in toolChoice) {\r\n return {\r\n type: 'function',\r\n function: {\r\n name: toolChoice.name,\r\n },\r\n };\r\n }\r\n\r\n return 'auto';\r\n }\r\n\r\n /**\r\n * Convert Zod schema to JSON Schema\r\n */\r\n private zodToJsonSchema(zodType: any): any {\r\n const def = zodType._def;\r\n\r\n if (!def) {\r\n return {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n };\r\n }\r\n\r\n switch (def.typeName) {\r\n case 'ZodString':\r\n return {\r\n type: 'string',\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodNumber':\r\n return {\r\n type: 'number',\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodBoolean':\r\n return {\r\n type: 'boolean',\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodArray':\r\n return {\r\n type: 'array',\r\n items: this.zodToJsonSchema(def.type),\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodObject':\r\n const properties: Record<string, any> = {};\r\n const required: string[] = [];\r\n const shape = def.shape();\r\n\r\n for (const [key, value] of Object.entries(shape)) {\r\n properties[key] = this.zodToJsonSchema(value);\r\n if (!(value as any).isOptional?.()) {\r\n required.push(key);\r\n }\r\n }\r\n\r\n return {\r\n type: 'object',\r\n properties,\r\n ...(required.length > 0 && { required }),\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodEnum':\r\n return {\r\n type: 'string',\r\n enum: def.values,\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodOptional':\r\n return this.zodToJsonSchema(def.innerType);\r\n case 'ZodNullable':\r\n return {\r\n ...this.zodToJsonSchema(def.innerType),\r\n nullable: true,\r\n };\r\n case 'ZodUnion':\r\n // Handle unions by taking the first type (basic support)\r\n if (def.options && def.options.length > 0) {\r\n return this.zodToJsonSchema(def.options[0]);\r\n }\r\n return { type: 'string' };\r\n case 'ZodLiteral':\r\n return {\r\n type: typeof def.value,\r\n enum: [def.value],\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodDefault':\r\n return {\r\n ...this.zodToJsonSchema(def.innerType),\r\n default: def.defaultValue(),\r\n };\r\n default:\r\n console.warn(`Unsupported Zod type: ${def.typeName}, falling back to string`);\r\n return { type: 'string' };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create OpenAI provider instance\r\n */\r\nexport function createOpenAIProvider(config: OpenAIConfig): ProviderCallback {\r\n const provider = new OpenAIProvider(config);\r\n return provider.createCallback();\r\n}","import type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n Tool,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface SarvamConfig extends ProviderConfig {\r\n model?: string;\r\n}\r\n\r\n/**\r\n * Sarvam AI provider - Indian multilingual LLM\r\n * Supports 10+ Indian languages\r\n */\r\nexport class SarvamProvider {\r\n private config: SarvamConfig;\r\n private baseURL: string;\r\n\r\n constructor(config: SarvamConfig) {\r\n this.config = config;\r\n this.baseURL = config.baseURL || 'https://api.sarvam.ai/v1';\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n /**\r\n * Stream chat completion with Indian language support\r\n */\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n const requestBody: any = {\r\n model: config.model || this.config.model || 'sarvam-m',\r\n messages: this.formatMessages(messages),\r\n temperature: config.temperature,\r\n max_tokens: config.maxTokens,\r\n stream: true,\r\n };\r\n\r\n // Add tools if provided\r\n if (config.tools && config.tools.length > 0) {\r\n requestBody.tools = this.formatTools(config.tools);\r\n }\r\n\r\n // Add tool choice if specified\r\n if (config.toolChoice && config.toolChoice !== 'auto') {\r\n requestBody.tool_choice = this.formatToolChoice(config.toolChoice);\r\n }\r\n\r\n const response = await fetch(`${this.baseURL}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${this.config.apiKey}`,\r\n ...this.config.headers,\r\n },\r\n body: JSON.stringify(requestBody),\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({})) as any;\r\n throw new ProviderError(\r\n error.error?.message || 'Sarvam AI API error',\r\n 'sarvam',\r\n response.status\r\n );\r\n }\r\n\r\n yield* this.parseStream(response.body!, writer);\r\n } catch (error) {\r\n if (error instanceof ProviderError) {\r\n throw error;\r\n }\r\n throw new ProviderError(\r\n `Sarvam provider error: ${error}`,\r\n 'sarvam'\r\n );\r\n }\r\n }\r\n\r\n private async *parseStream(\r\n body: ReadableStream<Uint8Array>,\r\n writer: StreamWriter\r\n ): AsyncGenerator<StreamEvent> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n // Track tool calls locally to accumulate arguments\r\n const toolCallsBuffer: Map<number, { id: string; name: string; arguments: string }> = new Map();\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.trim() || !line.startsWith('data: ')) continue;\r\n\r\n const data = line.slice(6);\r\n if (data === '[DONE]') {\r\n writer.done();\r\n yield* writer.flush();\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(data);\r\n\r\n if (parsed.choices?.[0]) {\r\n const delta = parsed.choices[0].delta;\r\n\r\n // Handle text content\r\n if (delta?.content) {\r\n writer.writeText(delta.content);\r\n }\r\n\r\n // Handle tool calls\r\n if (delta?.tool_calls) {\r\n for (const toolCall of delta.tool_calls) {\r\n const index = toolCall.index ?? 0;\r\n\r\n // Initialize tool call buffer if needed\r\n if (!toolCallsBuffer.has(index)) {\r\n toolCallsBuffer.set(index, {\r\n id: toolCall.id || `call_${Date.now()}_${index}`,\r\n name: '',\r\n arguments: '',\r\n });\r\n }\r\n\r\n const buffered = toolCallsBuffer.get(index)!;\r\n\r\n // Update tool call data\r\n if (toolCall.id) {\r\n buffered.id = toolCall.id;\r\n }\r\n\r\n if (toolCall.function?.name) {\r\n buffered.name = toolCall.function.name;\r\n // Start tool call when we first see the name\r\n writer.startToolCall(buffered.name, buffered.id);\r\n }\r\n\r\n if (toolCall.function?.arguments) {\r\n buffered.arguments += toolCall.function.arguments;\r\n // Write delta for streaming\r\n writer.writeToolCallDelta(toolCall.function.arguments);\r\n }\r\n }\r\n }\r\n\r\n // Handle finish reason\r\n if (parsed.choices[0].finish_reason) {\r\n // If finish reason is tool_calls, finalize all tool calls\r\n if (parsed.choices[0].finish_reason === 'tool_calls') {\r\n for (const [index, buffered] of toolCallsBuffer.entries()) {\r\n try {\r\n // Parse the accumulated arguments\r\n const args = buffered.arguments\r\n ? JSON.parse(buffered.arguments)\r\n : {};\r\n writer.endToolCall(args);\r\n } catch (e) {\r\n console.error(`Failed to parse tool call arguments for ${buffered.name}:`, e);\r\n writer.endToolCall({});\r\n }\r\n }\r\n toolCallsBuffer.clear();\r\n }\r\n\r\n writer.done();\r\n yield* writer.flush();\r\n return;\r\n }\r\n }\r\n\r\n if (parsed.usage) {\r\n writer.writeUsage({\r\n promptTokens: parsed.usage.prompt_tokens || 0,\r\n completionTokens: parsed.usage.completion_tokens || 0,\r\n totalTokens: parsed.usage.total_tokens || 0,\r\n });\r\n }\r\n\r\n yield* writer.flush();\r\n } catch (error) {\r\n console.error('Failed to parse Sarvam chunk:', error);\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n /**\r\n * Format messages for Sarvam AI API\r\n * Handles tool calls and tool results\r\n */\r\n private formatMessages(messages: Message[]): any[] {\r\n return messages.map((msg) => {\r\n const formatted: any = {\r\n role: msg.role === 'tool' ? 'tool' : msg.role,\r\n content: msg.content || null,\r\n };\r\n\r\n // Add tool calls if present (for assistant messages)\r\n if (msg.toolCalls && msg.toolCalls.length > 0) {\r\n formatted.tool_calls = msg.toolCalls.map((tc) => ({\r\n id: tc.id,\r\n type: 'function',\r\n function: {\r\n name: tc.name,\r\n arguments: JSON.stringify(tc.arguments),\r\n },\r\n }));\r\n }\r\n\r\n // Add tool call ID if this is a tool result message\r\n if (msg.role === 'tool' && msg.toolResults && msg.toolResults.length > 0) {\r\n // For tool messages, Sarvam expects tool_call_id\r\n formatted.tool_call_id = msg.toolResults[0]?.toolCallId;\r\n formatted.content = JSON.stringify(msg.toolResults[0]?.result);\r\n }\r\n\r\n return formatted;\r\n });\r\n }\r\n\r\n /**\r\n * Format tools for Sarvam AI API (OpenAI-compatible format)\r\n */\r\n private formatTools(tools: Tool[]): any[] {\r\n return tools.map((tool) => ({\r\n type: 'function',\r\n function: {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: this.zodToJsonSchema(tool.parameters),\r\n },\r\n }));\r\n }\r\n\r\n /**\r\n * Format tool choice for Sarvam AI API\r\n */\r\n private formatToolChoice(toolChoice: ChatConfig['toolChoice']): any {\r\n if (toolChoice === 'none') {\r\n return 'none';\r\n }\r\n\r\n if (toolChoice === 'required') {\r\n return 'required';\r\n }\r\n\r\n // If toolChoice is an object with a name, specify that function\r\n if (typeof toolChoice === 'object' && 'name' in toolChoice) {\r\n return {\r\n type: 'function',\r\n function: {\r\n name: toolChoice.name,\r\n },\r\n };\r\n }\r\n\r\n return 'auto';\r\n }\r\n\r\n /**\r\n * Convert Zod schema to JSON Schema\r\n */\r\n private zodToJsonSchema(zodType: any): any {\r\n const def = zodType._def;\r\n\r\n if (!def) {\r\n return {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n };\r\n }\r\n\r\n switch (def.typeName) {\r\n case 'ZodString':\r\n return {\r\n type: 'string',\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodNumber':\r\n return {\r\n type: 'number',\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodBoolean':\r\n return {\r\n type: 'boolean',\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodArray':\r\n return {\r\n type: 'array',\r\n items: this.zodToJsonSchema(def.type),\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodObject':\r\n const properties: Record<string, any> = {};\r\n const required: string[] = [];\r\n const shape = def.shape();\r\n\r\n for (const [key, value] of Object.entries(shape)) {\r\n properties[key] = this.zodToJsonSchema(value);\r\n if (!(value as any).isOptional?.()) {\r\n required.push(key);\r\n }\r\n }\r\n\r\n return {\r\n type: 'object',\r\n properties,\r\n ...(required.length > 0 && { required }),\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodEnum':\r\n return {\r\n type: 'string',\r\n enum: def.values,\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodOptional':\r\n return this.zodToJsonSchema(def.innerType);\r\n case 'ZodNullable':\r\n return {\r\n ...this.zodToJsonSchema(def.innerType),\r\n nullable: true,\r\n };\r\n case 'ZodUnion':\r\n // Handle unions by taking the first type (basic support)\r\n if (def.options && def.options.length > 0) {\r\n return this.zodToJsonSchema(def.options[0]);\r\n }\r\n return { type: 'string' };\r\n case 'ZodLiteral':\r\n return {\r\n type: typeof def.value,\r\n enum: [def.value],\r\n ...(def.description && { description: def.description }),\r\n };\r\n case 'ZodDefault':\r\n return {\r\n ...this.zodToJsonSchema(def.innerType),\r\n default: def.defaultValue(),\r\n };\r\n default:\r\n console.warn(`Unsupported Zod type: ${def.typeName}, falling back to string`);\r\n return { type: 'string' };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create Sarvam provider instance\r\n */\r\nexport function createSarvamProvider(config: SarvamConfig): ProviderCallback {\r\n const provider = new SarvamProvider(config);\r\n return provider.createCallback();\r\n}"]}