vibezcheck 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -191
- package/bin/vibezcheck.js +4 -0
- package/dist/ai-sdk/index.d.mts +43 -7
- package/dist/ai-sdk/index.d.ts +43 -7
- package/dist/ai-sdk/index.js +115 -55
- package/dist/ai-sdk/index.js.map +1 -1
- package/dist/ai-sdk/index.mjs +121 -55
- package/dist/ai-sdk/index.mjs.map +1 -1
- package/dist/cli/index.d.mts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +232 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +209 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/{client-MJ3tl7bz.d.mts → client-C67DW_tR.d.mts} +1 -1
- package/dist/{client-txrE0D_D.d.ts → client-S3qmTXTR.d.ts} +1 -1
- package/dist/index.d.mts +49 -26
- package/dist/index.d.ts +49 -26
- package/dist/index.js +136 -94
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +141 -94
- package/dist/index.mjs.map +1 -1
- package/dist/meter/index.d.mts +2 -2
- package/dist/meter/index.d.ts +2 -2
- package/dist/pricing/index.d.mts +1 -1
- package/dist/pricing/index.d.ts +1 -1
- package/dist/react/index.d.mts +70 -18
- package/dist/react/index.d.ts +70 -18
- package/dist/react/index.js +345 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +346 -3
- package/dist/react/index.mjs.map +1 -1
- package/dist/{types-CSrSmsd1.d.mts → types-DCuzLVyc.d.mts} +48 -3
- package/dist/{types-CSrSmsd1.d.ts → types-DCuzLVyc.d.ts} +48 -3
- package/package.json +5 -1
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/index.ts","../../src/react/context.tsx","../../src/pricing/table.ts","../../src/pricing/calculator.ts","../../src/react/hooks.ts","../../src/react/widget.tsx","../../src/react/badge.tsx"],"sourcesContent":["export * from './types';\nexport * from './context';\nexport * from './hooks';\nexport * from './widget';\nexport * from './badge';\n","import React, { createContext, useState, useEffect, useCallback, useMemo } from 'react';\nimport type {\n SessionState,\n SessionTurnRecord,\n VibezSessionProviderProps,\n VibezSessionContextValue,\n} from './types';\nimport type { TokenUsage, InferenceCost } from '../types';\nimport { calculateUsageCost } from '../pricing/calculator';\n\nconst INITIAL_USAGE: TokenUsage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n reasoningTokens: 0,\n visibleOutputTokens: 0,\n cachedTokens: 0,\n};\n\nconst INITIAL_COST: InferenceCost = {\n inputCostUSD: 0,\n outputCostUSD: 0,\n reasoningCostUSD: 0,\n cachedDiscountUSD: 0,\n totalUSD: 0,\n currency: 'USD',\n};\n\nexport const VibezSessionContext = createContext<VibezSessionContextValue | null>(null);\n\nfunction generateId(): string {\n return 'sess_' + Math.random().toString(36).substring(2, 11) + '_' + Date.now().toString(36);\n}\n\nexport const VibezSessionProvider: React.FC<VibezSessionProviderProps> = ({\n children,\n sessionId: customSessionId,\n persist = 'memory',\n storage,\n storageKey = 'vibez_session_',\n markupMultiplier,\n onTurnRecorded,\n}) => {\n const [sessionId, setSessionId] = useState<string>(() => customSessionId || generateId());\n const [turnCount, setTurnCount] = useState<number>(0);\n const [sessionUsage, setSessionUsage] = useState<TokenUsage>(INITIAL_USAGE);\n const [sessionCost, setSessionCost] = useState<InferenceCost>(INITIAL_COST);\n const [byModel, setByModel] = useState<SessionState['byModel']>({});\n const [history, setHistory] = useState<SessionTurnRecord[]>([]);\n\n const fullStorageKey = useMemo(() => `${storageKey}${sessionId}`, [storageKey, sessionId]);\n\n // 1. Load persisted state on mount (if persist is enabled)\n useEffect(() => {\n if (persist === 'memory') return;\n\n try {\n if (persist === 'sessionStorage' && typeof window !== 'undefined' && window.sessionStorage) {\n const data = window.sessionStorage.getItem(fullStorageKey);\n if (data) {\n const parsed: SessionState = JSON.parse(data);\n setTurnCount(parsed.turnCount);\n setSessionUsage(parsed.sessionUsage);\n setSessionCost(parsed.sessionCost);\n setByModel(parsed.byModel);\n setHistory(parsed.history);\n }\n } else if (persist === 'localStorage' && typeof window !== 'undefined' && window.localStorage) {\n const data = window.localStorage.getItem(fullStorageKey);\n if (data) {\n const parsed: SessionState = JSON.parse(data);\n setTurnCount(parsed.turnCount);\n setSessionUsage(parsed.sessionUsage);\n setSessionCost(parsed.sessionCost);\n setByModel(parsed.byModel);\n setHistory(parsed.history);\n }\n } else if (persist === 'custom' && storage) {\n const res = storage.getItem(fullStorageKey);\n if (res instanceof Promise) {\n res.then((data) => {\n if (data) {\n const parsed: SessionState = JSON.parse(data);\n setTurnCount(parsed.turnCount);\n setSessionUsage(parsed.sessionUsage);\n setSessionCost(parsed.sessionCost);\n setByModel(parsed.byModel);\n setHistory(parsed.history);\n }\n });\n } else if (res) {\n const parsed: SessionState = JSON.parse(res);\n setTurnCount(parsed.turnCount);\n setSessionUsage(parsed.sessionUsage);\n setSessionCost(parsed.sessionCost);\n setByModel(parsed.byModel);\n setHistory(parsed.history);\n }\n }\n } catch {\n // Ignore storage parse errors\n }\n }, [persist, fullStorageKey, storage]);\n\n // Helper to persist state\n const saveState = useCallback(\n (newState: SessionState) => {\n if (persist === 'memory') return;\n\n try {\n const json = JSON.stringify(newState);\n if (persist === 'sessionStorage' && typeof window !== 'undefined' && window.sessionStorage) {\n window.sessionStorage.setItem(fullStorageKey, json);\n } else if (persist === 'localStorage' && typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.setItem(fullStorageKey, json);\n } else if (persist === 'custom' && storage) {\n storage.setItem(fullStorageKey, json);\n }\n } catch {\n // Ignore storage write errors\n }\n },\n [persist, fullStorageKey, storage]\n );\n\n /**\n * Record a completed chat turn and update live session totals\n */\n const recordTurn = useCallback<VibezSessionContextValue['recordTurn']>(\n ({ model, usage: rawUsage, metadata }) => {\n const inputTokens = rawUsage.promptTokens ?? rawUsage.inputTokens ?? 0;\n const outputTokens = rawUsage.completionTokens ?? rawUsage.outputTokens ?? 0;\n const reasoningTokens =\n rawUsage.reasoningTokens ?? rawUsage.completionTokensDetails?.reasoning_tokens ?? 0;\n const cachedTokens =\n rawUsage.cachedTokens ?? rawUsage.promptTokensDetails?.cached_tokens ?? 0;\n const cacheWriteTokens = rawUsage.cacheWriteTokens ?? 0;\n\n const turnUsage: TokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: rawUsage.totalTokens ?? inputTokens + outputTokens,\n reasoningTokens: reasoningTokens > 0 ? reasoningTokens : undefined,\n visibleOutputTokens: Math.max(0, outputTokens - reasoningTokens),\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n cacheWriteTokens: cacheWriteTokens > 0 ? cacheWriteTokens : undefined,\n };\n\n const turnCost = calculateUsageCost(model, turnUsage, markupMultiplier);\n\n const record: SessionTurnRecord = {\n id: 'turn_' + Math.random().toString(36).substring(2, 9) + '_' + Date.now().toString(36),\n timestamp: new Date().toISOString(),\n model,\n usage: turnUsage,\n cost: turnCost,\n metadata,\n };\n\n // 1. Update Turn Count\n const newTurnCount = turnCount + 1;\n setTurnCount(newTurnCount);\n\n // 2. Update Aggregated Session Usage\n const newUsage: TokenUsage = {\n inputTokens: sessionUsage.inputTokens + inputTokens,\n outputTokens: sessionUsage.outputTokens + outputTokens,\n totalTokens: sessionUsage.totalTokens + turnUsage.totalTokens,\n reasoningTokens: (sessionUsage.reasoningTokens ?? 0) + (turnUsage.reasoningTokens ?? 0),\n visibleOutputTokens:\n (sessionUsage.visibleOutputTokens ?? 0) + (turnUsage.visibleOutputTokens ?? outputTokens),\n cachedTokens: (sessionUsage.cachedTokens ?? 0) + (turnUsage.cachedTokens ?? 0),\n cacheWriteTokens: (sessionUsage.cacheWriteTokens ?? 0) + (turnUsage.cacheWriteTokens ?? 0),\n };\n setSessionUsage(newUsage);\n\n // 3. Update Aggregated Session Cost\n const newCost: InferenceCost = {\n inputCostUSD: Number((sessionCost.inputCostUSD + turnCost.inputCostUSD).toFixed(6)),\n outputCostUSD: Number((sessionCost.outputCostUSD + turnCost.outputCostUSD).toFixed(6)),\n reasoningCostUSD:\n turnCost.reasoningCostUSD !== undefined || sessionCost.reasoningCostUSD !== undefined\n ? Number(\n (\n (sessionCost.reasoningCostUSD ?? 0) + (turnCost.reasoningCostUSD ?? 0)\n ).toFixed(6)\n )\n : undefined,\n cachedDiscountUSD:\n turnCost.cachedDiscountUSD !== undefined || sessionCost.cachedDiscountUSD !== undefined\n ? Number(\n (\n (sessionCost.cachedDiscountUSD ?? 0) + (turnCost.cachedDiscountUSD ?? 0)\n ).toFixed(6)\n )\n : undefined,\n totalUSD: Number((sessionCost.totalUSD + turnCost.totalUSD).toFixed(6)),\n retailUSD:\n turnCost.retailUSD !== undefined || sessionCost.retailUSD !== undefined\n ? Number(((sessionCost.retailUSD ?? 0) + (turnCost.retailUSD ?? 0)).toFixed(6))\n : undefined,\n currency: turnCost.currency || 'USD',\n };\n setSessionCost(newCost);\n\n // 4. Update By-Model Breakdown\n const prevModelStats = byModel[model] || {\n turns: 0,\n usage: { ...INITIAL_USAGE },\n cost: { ...INITIAL_COST },\n };\n\n const newModelStats = {\n turns: prevModelStats.turns + 1,\n usage: {\n inputTokens: prevModelStats.usage.inputTokens + inputTokens,\n outputTokens: prevModelStats.usage.outputTokens + outputTokens,\n totalTokens: prevModelStats.usage.totalTokens + turnUsage.totalTokens,\n reasoningTokens:\n (prevModelStats.usage.reasoningTokens ?? 0) + (turnUsage.reasoningTokens ?? 0),\n visibleOutputTokens:\n (prevModelStats.usage.visibleOutputTokens ?? 0) +\n (turnUsage.visibleOutputTokens ?? outputTokens),\n cachedTokens: (prevModelStats.usage.cachedTokens ?? 0) + (turnUsage.cachedTokens ?? 0),\n },\n cost: {\n inputCostUSD: Number(\n (prevModelStats.cost.inputCostUSD + turnCost.inputCostUSD).toFixed(6)\n ),\n outputCostUSD: Number(\n (prevModelStats.cost.outputCostUSD + turnCost.outputCostUSD).toFixed(6)\n ),\n totalUSD: Number((prevModelStats.cost.totalUSD + turnCost.totalUSD).toFixed(6)),\n currency: turnCost.currency || 'USD',\n },\n };\n\n const newByModel = {\n ...byModel,\n [model]: newModelStats,\n };\n setByModel(newByModel);\n\n // 5. Update History\n const newHistory = [...history, record];\n setHistory(newHistory);\n\n const updatedState: SessionState = {\n sessionId,\n turnCount: newTurnCount,\n sessionUsage: newUsage,\n sessionCost: newCost,\n byModel: newByModel,\n history: newHistory,\n };\n\n saveState(updatedState);\n\n if (onTurnRecorded) {\n onTurnRecorded(record, updatedState);\n }\n\n return record;\n },\n [\n turnCount,\n sessionUsage,\n sessionCost,\n byModel,\n history,\n sessionId,\n markupMultiplier,\n onTurnRecorded,\n saveState,\n ]\n );\n\n /**\n * Reset session state\n */\n const resetSession = useCallback(\n (newSessionId?: string) => {\n const nextId = newSessionId || generateId();\n setSessionId(nextId);\n setTurnCount(0);\n setSessionUsage(INITIAL_USAGE);\n setSessionCost(INITIAL_COST);\n setByModel({});\n setHistory([]);\n\n if (persist === 'sessionStorage' && typeof window !== 'undefined' && window.sessionStorage) {\n window.sessionStorage.removeItem(fullStorageKey);\n } else if (\n persist === 'localStorage' &&\n typeof window !== 'undefined' &&\n window.localStorage\n ) {\n window.localStorage.removeItem(fullStorageKey);\n } else if (persist === 'custom' && storage) {\n storage.removeItem(fullStorageKey);\n }\n },\n [persist, fullStorageKey, storage]\n );\n\n const value: VibezSessionContextValue = useMemo(\n () => ({\n sessionId,\n turnCount,\n sessionUsage,\n sessionCost,\n byModel,\n history,\n recordTurn,\n resetSession,\n }),\n [sessionId, turnCount, sessionUsage, sessionCost, byModel, history, recordTurn, resetSession]\n );\n\n return <VibezSessionContext.Provider value={value}>{children}</VibezSessionContext.Provider>;\n};\n","import type { ModelPricingRates } from '../types';\n\n/**\n * Built-in Registry of Model Pricing (USD per 1 Million Tokens)\n * Sourced from official 2026 provider pricing tables.\n */\nexport const MODEL_PRICING_TABLE: Record<string, ModelPricingRates> = {\n // --- OpenAI ---\n 'gpt-5.6-sol': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\n 'gpt-5.6-terra': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.2 },\n 'gpt-5.6-luna': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\n 'gpt-5': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\n 'gpt-5-mini': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\n 'o1': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\n 'o1-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\n 'o3': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\n 'o3-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\n 'gpt-4o': { inputPer1M: 2.5, outputPer1M: 10.0, cachedInputPer1M: 1.25 },\n 'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.075 },\n 'gpt-4.1': { inputPer1M: 2.0, outputPer1M: 8.0, cachedInputPer1M: 1.0 },\n 'gpt-4.1-nano': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.05 },\n 'text-embedding-3-small': { inputPer1M: 0.02, outputPer1M: 0.0 },\n 'text-embedding-3-large': { inputPer1M: 0.13, outputPer1M: 0.0 },\n\n // --- Anthropic ---\n 'claude-3-7-sonnet': { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },\n 'claude-sonnet-5': { inputPer1M: 2.0, outputPer1M: 10.0, cachedInputPer1M: 0.3 },\n 'claude-3-5-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\n 'claude-3-5-haiku': { inputPer1M: 0.8, outputPer1M: 4.0, cachedInputPer1M: 0.08 },\n 'haiku-4.5': { inputPer1M: 1.0, outputPer1M: 5.0, cachedInputPer1M: 0.1 },\n 'claude-opus-5': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 1.5 },\n 'claude-3-opus': { inputPer1M: 15.0, outputPer1M: 75.0, cachedInputPer1M: 1.5 },\n\n // --- Google Gemini ---\n 'gemini-3.7-flash': { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },\n 'gemini-3.1-pro': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.5 },\n 'gemini-3.5-flash': { inputPer1M: 1.5, outputPer1M: 9.0, cachedInputPer1M: 0.38 },\n 'gemini-3.1-flash-lite': { inputPer1M: 0.25, outputPer1M: 1.5, cachedInputPer1M: 0.06 },\n 'gemini-2.0-flash': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.025 },\n 'gemini-1.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\n 'gemini-1.5-flash': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\n\n // --- xAI Grok ---\n 'grok-4.6': { inputPer1M: 3.0, outputPer1M: 15.0 },\n 'grok-2': { inputPer1M: 2.0, outputPer1M: 10.0 },\n 'grok-2-vision': { inputPer1M: 2.0, outputPer1M: 10.0 },\n 'grok-beta': { inputPer1M: 5.0, outputPer1M: 15.0 },\n\n // --- Mistral ---\n 'mistral-large-3': { inputPer1M: 2.0, outputPer1M: 6.0 },\n 'mistral-large-latest': { inputPer1M: 2.0, outputPer1M: 6.0 },\n 'codestral-latest': { inputPer1M: 0.3, outputPer1M: 0.9 },\n 'mistral-small-latest': { inputPer1M: 0.2, outputPer1M: 0.6 },\n 'ministral-8b-latest': { inputPer1M: 0.1, outputPer1M: 0.1 },\n\n // --- Groq LPUs ---\n 'llama-3.3-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\n 'llama-3.1-8b-instant': { inputPer1M: 0.05, outputPer1M: 0.08 },\n 'deepseek-r1-distill-llama-70b': { inputPer1M: 0.75, outputPer1M: 0.99 },\n 'qwen-2.5-32b': { inputPer1M: 0.29, outputPer1M: 0.39 },\n\n // --- DeepSeek ---\n 'deepseek-v4-pro': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\n 'deepseek-v4-flash': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\n 'deepseek-chat': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\n 'deepseek-reasoner': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\n\n // --- Cohere ---\n 'command-r-plus': { inputPer1M: 2.5, outputPer1M: 10.0 },\n 'command-r': { inputPer1M: 0.15, outputPer1M: 0.6 },\n};\n\n/**\n * Dynamic in-memory registry allowing runtime custom price registration\n */\nconst customPricingRegistry: Record<string, ModelPricingRates> = {};\n\n/**\n * Normalize model identifier to match pricing table keys\n */\nexport function normalizeModelKey(rawModel: string): string {\n if (!rawModel) return 'unknown';\n\n let model = rawModel.toLowerCase().trim();\n\n // Strip provider prefix if present (e.g. 'openai/gpt-4o' -> 'gpt-4o')\n if (model.includes('/')) {\n model = model.split('/')[1] || model;\n }\n\n // Remove date suffixes like -20240307 or -20250219\n model = model.replace(/-\\d{8}$/, '');\n model = model.replace(/-\\d{4}-\\d{2}-\\d{2}$/, '');\n\n return model;\n}\n\n/**\n * Retrieve pricing rates for a given model\n */\nexport function getModelPricing(modelName: string): ModelPricingRates {\n const normalized = normalizeModelKey(modelName);\n\n // Check custom registry first\n if (customPricingRegistry[normalized]) {\n return customPricingRegistry[normalized];\n }\n if (customPricingRegistry[modelName]) {\n return customPricingRegistry[modelName];\n }\n\n // Check built-in table\n if (MODEL_PRICING_TABLE[normalized]) {\n return MODEL_PRICING_TABLE[normalized];\n }\n if (MODEL_PRICING_TABLE[modelName]) {\n return MODEL_PRICING_TABLE[modelName];\n }\n\n // Fallback defaults for unknown models (conservative estimates: $1.00 in, $3.00 out)\n return {\n inputPer1M: 1.0,\n outputPer1M: 3.0,\n cachedInputPer1M: 0.5,\n };\n}\n\n/**\n * Register or override pricing rates for a custom model\n */\nexport function registerModelPricing(modelName: string, rates: ModelPricingRates): void {\n const normalized = normalizeModelKey(modelName);\n customPricingRegistry[normalized] = rates;\n customPricingRegistry[modelName] = rates;\n}\n","import type { InferenceCost, TokenUsage } from '../types';\nimport { getModelPricing } from './table';\n\nexport interface CalculateCostParams {\n model: string;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedTokens?: number;\n cacheWriteTokens?: number;\n markupMultiplier?: number;\n}\n\n/**\n * Calculates exact inference cost for an LLM call or usage breakdown in USD.\n */\nexport function calculateCost(params: CalculateCostParams): InferenceCost {\n const rates = getModelPricing(params.model);\n\n const inputTokens = params.inputTokens ?? 0;\n const outputTokens = params.outputTokens ?? 0;\n const reasoningTokens = params.reasoningTokens ?? 0;\n const cachedTokens = params.cachedTokens ?? 0;\n\n // Regular input tokens (minus any cached tokens)\n const regularInputTokens = Math.max(0, inputTokens - cachedTokens);\n\n // Input costs\n const regularInputCost = (regularInputTokens / 1_000_000) * rates.inputPer1M;\n const cachedRate = rates.cachedInputPer1M ?? rates.inputPer1M * 0.5;\n const cachedInputCost = (cachedTokens / 1_000_000) * cachedRate;\n const inputCostUSD = regularInputCost + cachedInputCost;\n\n // Output costs (reasoning tokens are billed as output tokens in standard APIs)\n const outputCostUSD = (outputTokens / 1_000_000) * rates.outputPer1M;\n\n // Reasoning breakdown cost\n const reasoningRate = rates.reasoningPer1M ?? rates.outputPer1M;\n const reasoningCostUSD = (reasoningTokens / 1_000_000) * reasoningRate;\n\n // Cache savings discount\n const standardCacheCost = (cachedTokens / 1_000_000) * rates.inputPer1M;\n const cachedDiscountUSD = Math.max(0, standardCacheCost - cachedInputCost);\n\n // Total base cost\n const totalUSD = inputCostUSD + outputCostUSD;\n\n // Retail price calculation (if markup multiplier provided)\n const markup = params.markupMultiplier ?? 1.0;\n const retailUSD = markup !== 1.0 ? totalUSD * markup : undefined;\n\n return {\n inputCostUSD: Number(inputCostUSD.toFixed(8)),\n outputCostUSD: Number(outputCostUSD.toFixed(8)),\n reasoningCostUSD: reasoningTokens > 0 ? Number(reasoningCostUSD.toFixed(8)) : undefined,\n cachedDiscountUSD: cachedTokens > 0 ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n totalUSD: Number(totalUSD.toFixed(8)),\n retailUSD: retailUSD ? Number(retailUSD.toFixed(8)) : undefined,\n currency: rates.currency || 'USD',\n };\n}\n\n/**\n * Calculates cost directly from a TokenUsage object\n */\nexport function calculateUsageCost(\n model: string,\n usage: TokenUsage,\n markupMultiplier?: number\n): InferenceCost {\n return calculateCost({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens: usage.reasoningTokens,\n cachedTokens: usage.cachedTokens,\n cacheWriteTokens: usage.cacheWriteTokens,\n markupMultiplier,\n });\n}\n","import { useContext } from 'react';\nimport { VibezSessionContext } from './context';\nimport type { VibezSessionContextValue } from './types';\n\n/**\n * Hook to access live session usage, cost totals, and turn recorder\n *\n * @example\n * ```tsx\n * const { sessionUsage, sessionCost, recordTurn, resetSession } = useVibezSession();\n *\n * // Inside useChat onFinish:\n * onFinish: (message, { usage }) => {\n * recordTurn({ model: 'gpt-5.6-sol', usage });\n * }\n * ```\n */\nexport function useVibezSession(): VibezSessionContextValue {\n const context = useContext(VibezSessionContext);\n\n if (!context) {\n throw new Error(\n '[vibezcheck/react] useVibezSession must be used within a <VibezSessionProvider>.'\n );\n }\n\n return context;\n}\n\n/**\n * Convenient alias\n */\nexport const useVibez = useVibezSession;\n","import React, { useState } from 'react';\nimport { useVibezSession } from './hooks';\nimport type { VibezSessionWidgetProps } from './types';\n\nexport const VibezSessionWidget: React.FC<VibezSessionWidgetProps> = ({\n position = 'bottom-right',\n showCost = true,\n showTokens = true,\n showReasoning = true,\n theme = 'auto',\n className,\n style,\n}) => {\n const { sessionUsage, sessionCost, turnCount, byModel } = useVibezSession();\n const [expanded, setExpanded] = useState(false);\n\n // If no turns yet and 0 tokens, render minimal idle pill\n const hasUsage = sessionUsage.totalTokens > 0;\n\n const isDark =\n theme === 'dark' ||\n (theme === 'auto' &&\n typeof window !== 'undefined' &&\n window.matchMedia?.('(prefers-color-scheme: dark)').matches);\n\n const colors = {\n bg: isDark ? '#171717' : '#ffffff',\n text: isDark ? '#f5f5f5' : '#171717',\n subtext: isDark ? '#a3a3a3' : '#737373',\n border: isDark ? '#262626' : '#e5e5e5',\n accent: '#8b5cf6',\n reasoningBg: isDark ? '#2e1065' : '#f3e8ff',\n reasoningText: isDark ? '#c084fc' : '#7c3aed',\n };\n\n const getPositionStyles = (): React.CSSProperties => {\n if (position === 'inline') return {};\n const base: React.CSSProperties = { position: 'fixed', zIndex: 9999 };\n switch (position) {\n case 'bottom-right':\n return { ...base, bottom: '20px', right: '20px' };\n case 'bottom-left':\n return { ...base, bottom: '20px', left: '20px' };\n case 'top-right':\n return { ...base, top: '20px', right: '20px' };\n case 'top-left':\n return { ...base, top: '20px', left: '20px' };\n default:\n return base;\n }\n };\n\n const formatTokens = (num: number) => {\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(1) + 'M';\n if (num >= 1_000) return (num / 1_000).toFixed(1) + 'k';\n return num.toString();\n };\n\n return (\n <div\n className={className}\n style={{\n ...getPositionStyles(),\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n fontSize: '13px',\n ...style,\n }}\n >\n {/* Main Pill Button */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 14px',\n backgroundColor: colors.bg,\n color: colors.text,\n border: `1px solid ${colors.border}`,\n borderRadius: '9999px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.08)',\n cursor: 'pointer',\n userSelect: 'none',\n transition: 'all 0.15s ease',\n }}\n >\n <span style={{ color: colors.accent, fontWeight: 'bold' }}>⚡</span>\n\n {showTokens && (\n <span style={{ fontWeight: 600 }}>\n {formatTokens(sessionUsage.totalTokens)} tokens\n </span>\n )}\n\n {showCost && (\n <span style={{ color: colors.subtext }}>\n (${sessionCost.totalUSD.toFixed(4)})\n </span>\n )}\n\n {showReasoning && sessionUsage.reasoningTokens! > 0 && (\n <span\n style={{\n fontSize: '11px',\n padding: '2px 6px',\n borderRadius: '6px',\n backgroundColor: colors.reasoningBg,\n color: colors.reasoningText,\n fontWeight: 500,\n }}\n >\n 🧠 {formatTokens(sessionUsage.reasoningTokens!)}\n </span>\n )}\n\n <span style={{ color: colors.subtext, fontSize: '10px' }}>\n {expanded ? '▲' : '▼'}\n </span>\n </div>\n\n {/* Expanded Breakdown Popover */}\n {expanded && (\n <div\n style={{\n marginTop: '8px',\n padding: '14px',\n backgroundColor: colors.bg,\n color: colors.text,\n border: `1px solid ${colors.border}`,\n borderRadius: '12px',\n boxShadow: '0 10px 25px rgba(0,0,0,0.15)',\n width: '260px',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontWeight: 600,\n marginBottom: '8px',\n paddingBottom: '6px',\n borderBottom: `1px solid ${colors.border}`,\n }}\n >\n <span>Live Session Usage</span>\n <span style={{ color: colors.subtext }}>{turnCount} turns</span>\n </div>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', fontSize: '12px' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <span style={{ color: colors.subtext }}>Prompt Input:</span>\n <span>{sessionUsage.inputTokens.toLocaleString()}</span>\n </div>\n\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <span style={{ color: colors.subtext }}>Output Tokens:</span>\n <span>{sessionUsage.outputTokens.toLocaleString()}</span>\n </div>\n\n {sessionUsage.reasoningTokens! > 0 && (\n <div style={{ display: 'flex', justifyContent: 'space-between', color: colors.reasoningText }}>\n <span>🧠 Thinking Tokens:</span>\n <span>{sessionUsage.reasoningTokens!.toLocaleString()}</span>\n </div>\n )}\n\n {sessionUsage.cachedTokens! > 0 && (\n <div style={{ display: 'flex', justifyContent: 'space-between', color: '#10b981' }}>\n <span>⚡ Cached Tokens:</span>\n <span>{sessionUsage.cachedTokens!.toLocaleString()}</span>\n </div>\n )}\n\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontWeight: 600,\n marginTop: '6px',\n paddingTop: '6px',\n borderTop: `1px solid ${colors.border}`,\n }}\n >\n <span>Session Cost:</span>\n <span>${sessionCost.totalUSD.toFixed(5)} {sessionCost.currency}</span>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { useVibezSession } from './hooks';\nimport type { VibezSessionBadgeProps } from './types';\n\n/**\n * Compact inline badge for chat input bars, headers, or navbars\n */\nexport const VibezSessionBadge: React.FC<VibezSessionBadgeProps> = ({\n showCost = true,\n showTokens = true,\n className,\n style,\n}) => {\n const { sessionUsage, sessionCost } = useVibezSession();\n\n const formatTokens = (num: number) => {\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(1) + 'M';\n if (num >= 1_000) return (num / 1_000).toFixed(1) + 'k';\n return num.toString();\n };\n\n return (\n <span\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '5px',\n padding: '3px 8px',\n fontSize: '11px',\n fontWeight: 500,\n borderRadius: '9999px',\n backgroundColor: 'rgba(139, 92, 246, 0.1)',\n color: '#8b5cf6',\n border: '1px solid rgba(139, 92, 246, 0.2)',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n ...style,\n }}\n >\n <span>⚡</span>\n {showTokens && <span>{formatTokens(sessionUsage.totalTokens)} tok</span>}\n {showCost && <span>(${sessionCost.totalUSD.toFixed(4)})</span>}\n </span>\n );\n};\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.ts","../../src/react/context.tsx","../../src/pricing/table.ts","../../src/pricing/calculator.ts","../../src/react/hooks.ts","../../src/react/widget.tsx","../../src/react/badge.tsx","../../src/react/billing-modal.tsx"],"sourcesContent":["export * from './types';\nexport * from './context';\nexport * from './hooks';\nexport * from './widget';\nexport * from './badge';\nexport * from './billing-modal';\n","import React, { createContext, useState, useEffect, useCallback, useMemo } from 'react';\nimport type {\n SessionState,\n SessionTurnRecord,\n VibezSessionProviderProps,\n VibezSessionContextValue,\n} from './types';\nimport type { TokenUsage, InferenceCost } from '../types';\nimport { calculateUsageCost } from '../pricing/calculator';\n\nconst INITIAL_USAGE: TokenUsage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n reasoningTokens: 0,\n visibleOutputTokens: 0,\n cachedTokens: 0,\n};\n\nconst INITIAL_COST: InferenceCost = {\n inputCostUSD: 0,\n outputCostUSD: 0,\n reasoningCostUSD: 0,\n cachedDiscountUSD: 0,\n totalUSD: 0,\n currency: 'USD',\n};\n\nexport const VibezSessionContext = createContext<VibezSessionContextValue | null>(null);\n\nfunction generateId(): string {\n return 'sess_' + Math.random().toString(36).substring(2, 11) + '_' + Date.now().toString(36);\n}\n\nexport const VibezSessionProvider: React.FC<VibezSessionProviderProps> = ({\n children,\n sessionId: customSessionId,\n persist = 'memory',\n storage,\n storageKey = 'vibez_session_',\n markupMultiplier,\n onTurnRecorded,\n}) => {\n const [sessionId, setSessionId] = useState<string>(() => customSessionId || generateId());\n const [turnCount, setTurnCount] = useState<number>(0);\n const [sessionUsage, setSessionUsage] = useState<TokenUsage>(INITIAL_USAGE);\n const [sessionCost, setSessionCost] = useState<InferenceCost>(INITIAL_COST);\n const [byModel, setByModel] = useState<SessionState['byModel']>({});\n const [history, setHistory] = useState<SessionTurnRecord[]>([]);\n\n const fullStorageKey = useMemo(() => `${storageKey}${sessionId}`, [storageKey, sessionId]);\n\n // 1. Load persisted state on mount (if persist is enabled)\n useEffect(() => {\n if (persist === 'memory') return;\n\n try {\n if (persist === 'sessionStorage' && typeof window !== 'undefined' && window.sessionStorage) {\n const data = window.sessionStorage.getItem(fullStorageKey);\n if (data) {\n const parsed: SessionState = JSON.parse(data);\n setTurnCount(parsed.turnCount);\n setSessionUsage(parsed.sessionUsage);\n setSessionCost(parsed.sessionCost);\n setByModel(parsed.byModel);\n setHistory(parsed.history);\n }\n } else if (persist === 'localStorage' && typeof window !== 'undefined' && window.localStorage) {\n const data = window.localStorage.getItem(fullStorageKey);\n if (data) {\n const parsed: SessionState = JSON.parse(data);\n setTurnCount(parsed.turnCount);\n setSessionUsage(parsed.sessionUsage);\n setSessionCost(parsed.sessionCost);\n setByModel(parsed.byModel);\n setHistory(parsed.history);\n }\n } else if (persist === 'custom' && storage) {\n const res = storage.getItem(fullStorageKey);\n if (res instanceof Promise) {\n res.then((data) => {\n if (data) {\n const parsed: SessionState = JSON.parse(data);\n setTurnCount(parsed.turnCount);\n setSessionUsage(parsed.sessionUsage);\n setSessionCost(parsed.sessionCost);\n setByModel(parsed.byModel);\n setHistory(parsed.history);\n }\n });\n } else if (res) {\n const parsed: SessionState = JSON.parse(res);\n setTurnCount(parsed.turnCount);\n setSessionUsage(parsed.sessionUsage);\n setSessionCost(parsed.sessionCost);\n setByModel(parsed.byModel);\n setHistory(parsed.history);\n }\n }\n } catch {\n // Ignore storage parse errors\n }\n }, [persist, fullStorageKey, storage]);\n\n // Helper to persist state\n const saveState = useCallback(\n (newState: SessionState) => {\n if (persist === 'memory') return;\n\n try {\n const json = JSON.stringify(newState);\n if (persist === 'sessionStorage' && typeof window !== 'undefined' && window.sessionStorage) {\n window.sessionStorage.setItem(fullStorageKey, json);\n } else if (persist === 'localStorage' && typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.setItem(fullStorageKey, json);\n } else if (persist === 'custom' && storage) {\n storage.setItem(fullStorageKey, json);\n }\n } catch {\n // Ignore storage write errors\n }\n },\n [persist, fullStorageKey, storage]\n );\n\n /**\n * Record a completed chat turn and update live session totals\n */\n const recordTurn = useCallback<VibezSessionContextValue['recordTurn']>(\n ({ model, usage: rawUsage, metadata }) => {\n const inputTokens = rawUsage.promptTokens ?? rawUsage.inputTokens ?? 0;\n const outputTokens = rawUsage.completionTokens ?? rawUsage.outputTokens ?? 0;\n const reasoningTokens =\n rawUsage.reasoningTokens ?? rawUsage.completionTokensDetails?.reasoning_tokens ?? 0;\n const cachedTokens =\n rawUsage.cachedTokens ?? rawUsage.promptTokensDetails?.cached_tokens ?? 0;\n const cacheWriteTokens = rawUsage.cacheWriteTokens ?? 0;\n\n const turnUsage: TokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: rawUsage.totalTokens ?? inputTokens + outputTokens,\n reasoningTokens: reasoningTokens > 0 ? reasoningTokens : undefined,\n visibleOutputTokens: Math.max(0, outputTokens - reasoningTokens),\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n cacheWriteTokens: cacheWriteTokens > 0 ? cacheWriteTokens : undefined,\n };\n\n const turnCost = calculateUsageCost(model, turnUsage, markupMultiplier);\n\n const record: SessionTurnRecord = {\n id: 'turn_' + Math.random().toString(36).substring(2, 9) + '_' + Date.now().toString(36),\n timestamp: new Date().toISOString(),\n model,\n usage: turnUsage,\n cost: turnCost,\n metadata,\n };\n\n // 1. Update Turn Count\n const newTurnCount = turnCount + 1;\n setTurnCount(newTurnCount);\n\n // 2. Update Aggregated Session Usage\n const newUsage: TokenUsage = {\n inputTokens: sessionUsage.inputTokens + inputTokens,\n outputTokens: sessionUsage.outputTokens + outputTokens,\n totalTokens: sessionUsage.totalTokens + turnUsage.totalTokens,\n reasoningTokens: (sessionUsage.reasoningTokens ?? 0) + (turnUsage.reasoningTokens ?? 0),\n visibleOutputTokens:\n (sessionUsage.visibleOutputTokens ?? 0) + (turnUsage.visibleOutputTokens ?? outputTokens),\n cachedTokens: (sessionUsage.cachedTokens ?? 0) + (turnUsage.cachedTokens ?? 0),\n cacheWriteTokens: (sessionUsage.cacheWriteTokens ?? 0) + (turnUsage.cacheWriteTokens ?? 0),\n };\n setSessionUsage(newUsage);\n\n // 3. Update Aggregated Session Cost\n const newCost: InferenceCost = {\n inputCostUSD: Number((sessionCost.inputCostUSD + turnCost.inputCostUSD).toFixed(6)),\n outputCostUSD: Number((sessionCost.outputCostUSD + turnCost.outputCostUSD).toFixed(6)),\n reasoningCostUSD:\n turnCost.reasoningCostUSD !== undefined || sessionCost.reasoningCostUSD !== undefined\n ? Number(\n (\n (sessionCost.reasoningCostUSD ?? 0) + (turnCost.reasoningCostUSD ?? 0)\n ).toFixed(6)\n )\n : undefined,\n cachedDiscountUSD:\n turnCost.cachedDiscountUSD !== undefined || sessionCost.cachedDiscountUSD !== undefined\n ? Number(\n (\n (sessionCost.cachedDiscountUSD ?? 0) + (turnCost.cachedDiscountUSD ?? 0)\n ).toFixed(6)\n )\n : undefined,\n totalUSD: Number((sessionCost.totalUSD + turnCost.totalUSD).toFixed(6)),\n retailUSD:\n turnCost.retailUSD !== undefined || sessionCost.retailUSD !== undefined\n ? Number(((sessionCost.retailUSD ?? 0) + (turnCost.retailUSD ?? 0)).toFixed(6))\n : undefined,\n currency: turnCost.currency || 'USD',\n };\n setSessionCost(newCost);\n\n // 4. Update By-Model Breakdown\n const prevModelStats = byModel[model] || {\n turns: 0,\n usage: { ...INITIAL_USAGE },\n cost: { ...INITIAL_COST },\n };\n\n const newModelStats = {\n turns: prevModelStats.turns + 1,\n usage: {\n inputTokens: prevModelStats.usage.inputTokens + inputTokens,\n outputTokens: prevModelStats.usage.outputTokens + outputTokens,\n totalTokens: prevModelStats.usage.totalTokens + turnUsage.totalTokens,\n reasoningTokens:\n (prevModelStats.usage.reasoningTokens ?? 0) + (turnUsage.reasoningTokens ?? 0),\n visibleOutputTokens:\n (prevModelStats.usage.visibleOutputTokens ?? 0) +\n (turnUsage.visibleOutputTokens ?? outputTokens),\n cachedTokens: (prevModelStats.usage.cachedTokens ?? 0) + (turnUsage.cachedTokens ?? 0),\n },\n cost: {\n inputCostUSD: Number(\n (prevModelStats.cost.inputCostUSD + turnCost.inputCostUSD).toFixed(6)\n ),\n outputCostUSD: Number(\n (prevModelStats.cost.outputCostUSD + turnCost.outputCostUSD).toFixed(6)\n ),\n totalUSD: Number((prevModelStats.cost.totalUSD + turnCost.totalUSD).toFixed(6)),\n currency: turnCost.currency || 'USD',\n },\n };\n\n const newByModel = {\n ...byModel,\n [model]: newModelStats,\n };\n setByModel(newByModel);\n\n // 5. Update History\n const newHistory = [...history, record];\n setHistory(newHistory);\n\n const updatedState: SessionState = {\n sessionId,\n turnCount: newTurnCount,\n sessionUsage: newUsage,\n sessionCost: newCost,\n byModel: newByModel,\n history: newHistory,\n };\n\n saveState(updatedState);\n\n if (onTurnRecorded) {\n onTurnRecorded(record, updatedState);\n }\n\n return record;\n },\n [\n turnCount,\n sessionUsage,\n sessionCost,\n byModel,\n history,\n sessionId,\n markupMultiplier,\n onTurnRecorded,\n saveState,\n ]\n );\n\n /**\n * Reset session state\n */\n const resetSession = useCallback(\n (newSessionId?: string) => {\n const nextId = newSessionId || generateId();\n setSessionId(nextId);\n setTurnCount(0);\n setSessionUsage(INITIAL_USAGE);\n setSessionCost(INITIAL_COST);\n setByModel({});\n setHistory([]);\n\n if (persist === 'sessionStorage' && typeof window !== 'undefined' && window.sessionStorage) {\n window.sessionStorage.removeItem(fullStorageKey);\n } else if (\n persist === 'localStorage' &&\n typeof window !== 'undefined' &&\n window.localStorage\n ) {\n window.localStorage.removeItem(fullStorageKey);\n } else if (persist === 'custom' && storage) {\n storage.removeItem(fullStorageKey);\n }\n },\n [persist, fullStorageKey, storage]\n );\n\n const value: VibezSessionContextValue = useMemo(\n () => ({\n sessionId,\n turnCount,\n sessionUsage,\n sessionCost,\n byModel,\n history,\n recordTurn,\n resetSession,\n }),\n [sessionId, turnCount, sessionUsage, sessionCost, byModel, history, recordTurn, resetSession]\n );\n\n return <VibezSessionContext.Provider value={value}>{children}</VibezSessionContext.Provider>;\n};\n","import type { ModelPricingRates } from '../types';\n\n/**\n * Built-in Registry of Model Pricing (USD per 1 Million Tokens)\n * Sourced from official 2026 provider pricing tables.\n */\nexport const MODEL_PRICING_TABLE: Record<string, ModelPricingRates> = {\n // --- OpenAI ---\n 'gpt-5.6-sol': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\n 'gpt-5.6-terra': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.2 },\n 'gpt-5.6-luna': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\n 'gpt-5': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\n 'gpt-5-mini': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\n 'o1': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\n 'o1-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\n 'o3': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\n 'o3-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\n 'gpt-4o': { inputPer1M: 2.5, outputPer1M: 10.0, cachedInputPer1M: 1.25 },\n 'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.075 },\n 'gpt-4.1': { inputPer1M: 2.0, outputPer1M: 8.0, cachedInputPer1M: 1.0 },\n 'gpt-4.1-nano': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.05 },\n 'text-embedding-3-small': { inputPer1M: 0.02, outputPer1M: 0.0 },\n 'text-embedding-3-large': { inputPer1M: 0.13, outputPer1M: 0.0 },\n\n // --- Anthropic ---\n 'claude-3-7-sonnet': { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },\n 'claude-sonnet-5': { inputPer1M: 2.0, outputPer1M: 10.0, cachedInputPer1M: 0.3 },\n 'claude-3-5-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\n 'claude-3-5-haiku': { inputPer1M: 0.8, outputPer1M: 4.0, cachedInputPer1M: 0.08 },\n 'haiku-4.5': { inputPer1M: 1.0, outputPer1M: 5.0, cachedInputPer1M: 0.1 },\n 'claude-opus-5': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 1.5 },\n 'claude-3-opus': { inputPer1M: 15.0, outputPer1M: 75.0, cachedInputPer1M: 1.5 },\n\n // --- Google Gemini ---\n 'gemini-3.7-flash': { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },\n 'gemini-3.1-pro': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.5 },\n 'gemini-3.5-flash': { inputPer1M: 1.5, outputPer1M: 9.0, cachedInputPer1M: 0.38 },\n 'gemini-3.1-flash-lite': { inputPer1M: 0.25, outputPer1M: 1.5, cachedInputPer1M: 0.06 },\n 'gemini-2.0-flash': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.025 },\n 'gemini-1.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\n 'gemini-1.5-flash': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\n\n // --- xAI Grok ---\n 'grok-4.6': { inputPer1M: 3.0, outputPer1M: 15.0 },\n 'grok-2': { inputPer1M: 2.0, outputPer1M: 10.0 },\n 'grok-2-vision': { inputPer1M: 2.0, outputPer1M: 10.0 },\n 'grok-beta': { inputPer1M: 5.0, outputPer1M: 15.0 },\n\n // --- Mistral ---\n 'mistral-large-3': { inputPer1M: 2.0, outputPer1M: 6.0 },\n 'mistral-large-latest': { inputPer1M: 2.0, outputPer1M: 6.0 },\n 'codestral-latest': { inputPer1M: 0.3, outputPer1M: 0.9 },\n 'mistral-small-latest': { inputPer1M: 0.2, outputPer1M: 0.6 },\n 'ministral-8b-latest': { inputPer1M: 0.1, outputPer1M: 0.1 },\n\n // --- Groq LPUs ---\n 'llama-3.3-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\n 'llama-3.1-8b-instant': { inputPer1M: 0.05, outputPer1M: 0.08 },\n 'deepseek-r1-distill-llama-70b': { inputPer1M: 0.75, outputPer1M: 0.99 },\n 'qwen-2.5-32b': { inputPer1M: 0.29, outputPer1M: 0.39 },\n\n // --- DeepSeek ---\n 'deepseek-v4-pro': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\n 'deepseek-v4-flash': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\n 'deepseek-chat': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\n 'deepseek-reasoner': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\n\n // --- Cohere ---\n 'command-r-plus': { inputPer1M: 2.5, outputPer1M: 10.0 },\n 'command-r': { inputPer1M: 0.15, outputPer1M: 0.6 },\n};\n\n/**\n * Dynamic in-memory registry allowing runtime custom price registration\n */\nconst customPricingRegistry: Record<string, ModelPricingRates> = {};\n\n/**\n * Normalize model identifier to match pricing table keys\n */\nexport function normalizeModelKey(rawModel: string): string {\n if (!rawModel) return 'unknown';\n\n let model = rawModel.toLowerCase().trim();\n\n // Strip provider prefix if present (e.g. 'openai/gpt-4o' -> 'gpt-4o')\n if (model.includes('/')) {\n model = model.split('/')[1] || model;\n }\n\n // Remove date suffixes like -20240307 or -20250219\n model = model.replace(/-\\d{8}$/, '');\n model = model.replace(/-\\d{4}-\\d{2}-\\d{2}$/, '');\n\n return model;\n}\n\n/**\n * Retrieve pricing rates for a given model\n */\nexport function getModelPricing(modelName: string): ModelPricingRates {\n const normalized = normalizeModelKey(modelName);\n\n // Check custom registry first\n if (customPricingRegistry[normalized]) {\n return customPricingRegistry[normalized];\n }\n if (customPricingRegistry[modelName]) {\n return customPricingRegistry[modelName];\n }\n\n // Check built-in table\n if (MODEL_PRICING_TABLE[normalized]) {\n return MODEL_PRICING_TABLE[normalized];\n }\n if (MODEL_PRICING_TABLE[modelName]) {\n return MODEL_PRICING_TABLE[modelName];\n }\n\n // Fallback defaults for unknown models (conservative estimates: $1.00 in, $3.00 out)\n return {\n inputPer1M: 1.0,\n outputPer1M: 3.0,\n cachedInputPer1M: 0.5,\n };\n}\n\n/**\n * Register or override pricing rates for a custom model\n */\nexport function registerModelPricing(modelName: string, rates: ModelPricingRates): void {\n const normalized = normalizeModelKey(modelName);\n customPricingRegistry[normalized] = rates;\n customPricingRegistry[modelName] = rates;\n}\n","import type { InferenceCost, TokenUsage } from '../types';\nimport { getModelPricing } from './table';\n\nexport interface CalculateCostParams {\n model: string;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedTokens?: number;\n cacheWriteTokens?: number;\n markupMultiplier?: number;\n}\n\n/**\n * Calculates exact inference cost for an LLM call or usage breakdown in USD.\n */\nexport function calculateCost(params: CalculateCostParams): InferenceCost {\n const rates = getModelPricing(params.model);\n\n const inputTokens = params.inputTokens ?? 0;\n const outputTokens = params.outputTokens ?? 0;\n const reasoningTokens = params.reasoningTokens ?? 0;\n const cachedTokens = params.cachedTokens ?? 0;\n\n // Regular input tokens (minus any cached tokens)\n const regularInputTokens = Math.max(0, inputTokens - cachedTokens);\n\n // Input costs\n const regularInputCost = (regularInputTokens / 1_000_000) * rates.inputPer1M;\n const cachedRate = rates.cachedInputPer1M ?? rates.inputPer1M * 0.5;\n const cachedInputCost = (cachedTokens / 1_000_000) * cachedRate;\n const inputCostUSD = regularInputCost + cachedInputCost;\n\n // Output costs (reasoning tokens are billed as output tokens in standard APIs)\n const outputCostUSD = (outputTokens / 1_000_000) * rates.outputPer1M;\n\n // Reasoning breakdown cost\n const reasoningRate = rates.reasoningPer1M ?? rates.outputPer1M;\n const reasoningCostUSD = (reasoningTokens / 1_000_000) * reasoningRate;\n\n // Cache savings discount\n const standardCacheCost = (cachedTokens / 1_000_000) * rates.inputPer1M;\n const cachedDiscountUSD = Math.max(0, standardCacheCost - cachedInputCost);\n\n // Total base cost\n const totalUSD = inputCostUSD + outputCostUSD;\n\n // Retail price calculation (if markup multiplier provided)\n const markup = params.markupMultiplier ?? 1.0;\n const retailUSD = markup !== 1.0 ? totalUSD * markup : undefined;\n\n return {\n inputCostUSD: Number(inputCostUSD.toFixed(8)),\n outputCostUSD: Number(outputCostUSD.toFixed(8)),\n reasoningCostUSD: reasoningTokens > 0 ? Number(reasoningCostUSD.toFixed(8)) : undefined,\n cachedDiscountUSD: cachedTokens > 0 ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n totalUSD: Number(totalUSD.toFixed(8)),\n retailUSD: retailUSD ? Number(retailUSD.toFixed(8)) : undefined,\n currency: rates.currency || 'USD',\n };\n}\n\n/**\n * Calculates cost directly from a TokenUsage object\n */\nexport function calculateUsageCost(\n model: string,\n usage: TokenUsage,\n markupMultiplier?: number\n): InferenceCost {\n return calculateCost({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens: usage.reasoningTokens,\n cachedTokens: usage.cachedTokens,\n cacheWriteTokens: usage.cacheWriteTokens,\n markupMultiplier,\n });\n}\n","import { useContext, useState, useCallback, useRef } from 'react';\nimport { VibezSessionContext } from './context';\nimport type { VibezSessionContextValue } from './types';\n\n/**\n * Hook to access live session usage, cost totals, and turn recorder\n */\nexport function useVibezSession(): VibezSessionContextValue {\n const context = useContext(VibezSessionContext);\n\n if (!context) {\n throw new Error(\n '[vibezcheck/react] useVibezSession must be used within a <VibezSessionProvider>.'\n );\n }\n\n return context;\n}\n\nexport const useVibez = useVibezSession;\n\nexport interface VibezChatMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n annotations?: Array<{ type: string; reasoning?: string; [key: string]: any }>;\n createdAt?: Date;\n}\n\nexport interface UseVibezChatOptions {\n api?: string;\n model?: string;\n customer?: string;\n body?: Record<string, any>;\n initialMessages?: VibezChatMessage[];\n onFinish?: (message: VibezChatMessage, usage: any) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Declarative, 1-line Chat Streaming Hook with automatic VibezCheck session tracking.\n *\n * @example\n * ```tsx\n * const { messages, input, handleInputChange, handleSubmit, isLoading } = useVibezChat({\n * model: 'gpt-4o-mini',\n * customer: 'alex@example.com',\n * });\n * ```\n */\nexport function useVibezChat(options: UseVibezChatOptions = {}) {\n const {\n api = '/api/chat',\n model = 'gpt-4o-mini',\n customer = 'anonymous',\n body = {},\n initialMessages = [],\n onFinish,\n onError,\n } = options;\n\n const session = useContext(VibezSessionContext);\n\n const [messages, setMessages] = useState<VibezChatMessage[]>(initialMessages);\n const [input, setInput] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setInput(e.target.value);\n },\n []\n );\n\n const append = useCallback(\n async (userMessage: VibezChatMessage) => {\n const updatedMessages = [...messages, userMessage];\n setMessages(updatedMessages);\n setIsLoading(true);\n\n const assistantId = 'msg_' + Math.random().toString(36).substring(2, 9);\n let assistantContent = '';\n let detectedReasoning = '';\n let detectedUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n reasoningTokens: 0,\n };\n\n setMessages((prev) => [\n ...prev,\n {\n id: assistantId,\n role: 'assistant',\n content: '',\n createdAt: new Date(),\n },\n ]);\n\n try {\n abortControllerRef.current = new AbortController();\n\n const res = await fetch(api, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages: updatedMessages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n model,\n customer,\n ...body,\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!res.ok) {\n const errData = await res.json().catch(() => ({}));\n throw new Error(errData.error || `HTTP error! status: ${res.status}`);\n }\n\n const reader = res.body?.getReader();\n if (!reader) throw new Error('No stream body available');\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n if (line.startsWith('0:')) {\n try {\n assistantContent += JSON.parse(line.substring(2));\n } catch {\n assistantContent += line.substring(2).replace(/^\"|\"$/g, '');\n }\n } else if (line.startsWith('d:')) {\n try {\n const data = JSON.parse(line.substring(2));\n if (data.usage) {\n detectedUsage = {\n promptTokens: data.usage.promptTokens ?? 0,\n completionTokens: data.usage.completionTokens ?? 0,\n totalTokens:\n (data.usage.promptTokens ?? 0) + (data.usage.completionTokens ?? 0),\n reasoningTokens: data.usage.reasoningTokens ?? 0,\n };\n }\n } catch {\n // ignore\n }\n } else if (line.startsWith('e:') || line.startsWith('g:')) {\n try {\n detectedReasoning += JSON.parse(line.substring(2));\n } catch {\n detectedReasoning += line.substring(2);\n }\n } else if (!line.startsWith('f:') && !line.startsWith('2:')) {\n assistantContent += line;\n }\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantId\n ? {\n ...msg,\n content: assistantContent,\n annotations: detectedReasoning\n ? [{ type: 'reasoning', reasoning: detectedReasoning }]\n : undefined,\n }\n : msg\n )\n );\n }\n }\n\n if (detectedUsage.promptTokens === 0 && detectedUsage.completionTokens === 0) {\n const promptWords = updatedMessages.reduce(\n (acc, m) => acc + m.content.split(/\\s+/).length,\n 0\n );\n const outputWords = assistantContent.split(/\\s+/).length;\n detectedUsage = {\n promptTokens: Math.ceil(promptWords * 1.3),\n completionTokens: Math.ceil(outputWords * 1.3),\n totalTokens: Math.ceil((promptWords + outputWords) * 1.3),\n reasoningTokens: detectedReasoning\n ? Math.ceil(detectedReasoning.split(/\\s+/).length * 1.3)\n : 0,\n };\n }\n\n // Automatically record turn into VibezSessionContext\n if (session) {\n session.recordTurn({\n model,\n usage: detectedUsage,\n });\n }\n\n const finalMsg: VibezChatMessage = {\n id: assistantId,\n role: 'assistant',\n content: assistantContent,\n annotations: detectedReasoning\n ? [{ type: 'reasoning', reasoning: detectedReasoning }]\n : undefined,\n createdAt: new Date(),\n };\n\n if (onFinish) {\n onFinish(finalMsg, detectedUsage);\n }\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n console.error('[useVibezChat Error]', err);\n if (onError) onError(err);\n } finally {\n setIsLoading(false);\n }\n },\n [api, model, customer, body, messages, session, onFinish, onError]\n );\n\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n if (!input.trim() || isLoading) return;\n\n const userMsg: VibezChatMessage = {\n id: 'msg_' + Math.random().toString(36).substring(2, 9),\n role: 'user',\n content: input.trim(),\n createdAt: new Date(),\n };\n\n setInput('');\n append(userMsg);\n },\n [input, isLoading, append]\n );\n\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setIsLoading(false);\n }\n }, []);\n\n return {\n messages,\n setMessages,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n isLoading,\n stop,\n append,\n };\n}\n","import React, { useState } from 'react';\nimport { useVibezSession } from './hooks';\nimport type { VibezSessionWidgetProps } from './types';\n\nexport const VibezSessionWidget: React.FC<VibezSessionWidgetProps> = ({\n position = 'bottom-right',\n showCost = true,\n showTokens = true,\n showReasoning = true,\n theme = 'auto',\n className,\n style,\n}) => {\n const { sessionUsage, sessionCost, turnCount, byModel } = useVibezSession();\n const [expanded, setExpanded] = useState(false);\n\n // If no turns yet and 0 tokens, render minimal idle pill\n const hasUsage = sessionUsage.totalTokens > 0;\n\n const isDark =\n theme === 'dark' ||\n (theme === 'auto' &&\n typeof window !== 'undefined' &&\n window.matchMedia?.('(prefers-color-scheme: dark)').matches);\n\n const colors = {\n bg: isDark ? '#171717' : '#ffffff',\n text: isDark ? '#f5f5f5' : '#171717',\n subtext: isDark ? '#a3a3a3' : '#737373',\n border: isDark ? '#262626' : '#e5e5e5',\n accent: '#8b5cf6',\n reasoningBg: isDark ? '#2e1065' : '#f3e8ff',\n reasoningText: isDark ? '#c084fc' : '#7c3aed',\n };\n\n const getPositionStyles = (): React.CSSProperties => {\n if (position === 'inline') return {};\n const base: React.CSSProperties = { position: 'fixed', zIndex: 9999 };\n switch (position) {\n case 'bottom-right':\n return { ...base, bottom: '20px', right: '20px' };\n case 'bottom-left':\n return { ...base, bottom: '20px', left: '20px' };\n case 'top-right':\n return { ...base, top: '20px', right: '20px' };\n case 'top-left':\n return { ...base, top: '20px', left: '20px' };\n default:\n return base;\n }\n };\n\n const formatTokens = (num: number) => {\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(1) + 'M';\n if (num >= 1_000) return (num / 1_000).toFixed(1) + 'k';\n return num.toString();\n };\n\n return (\n <div\n className={className}\n style={{\n ...getPositionStyles(),\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n fontSize: '13px',\n ...style,\n }}\n >\n {/* Main Pill Button */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 14px',\n backgroundColor: colors.bg,\n color: colors.text,\n border: `1px solid ${colors.border}`,\n borderRadius: '9999px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.08)',\n cursor: 'pointer',\n userSelect: 'none',\n transition: 'all 0.15s ease',\n }}\n >\n <span style={{ color: colors.accent, fontWeight: 'bold' }}>⚡</span>\n\n {showTokens && (\n <span style={{ fontWeight: 600 }}>\n {formatTokens(sessionUsage.totalTokens)} tokens\n </span>\n )}\n\n {showCost && (\n <span style={{ color: colors.subtext }}>\n (${sessionCost.totalUSD.toFixed(4)})\n </span>\n )}\n\n {showReasoning && sessionUsage.reasoningTokens! > 0 && (\n <span\n style={{\n fontSize: '11px',\n padding: '2px 6px',\n borderRadius: '6px',\n backgroundColor: colors.reasoningBg,\n color: colors.reasoningText,\n fontWeight: 500,\n }}\n >\n 🧠 {formatTokens(sessionUsage.reasoningTokens!)}\n </span>\n )}\n\n <span style={{ color: colors.subtext, fontSize: '10px' }}>\n {expanded ? '▲' : '▼'}\n </span>\n </div>\n\n {/* Expanded Breakdown Popover */}\n {expanded && (\n <div\n style={{\n marginTop: '8px',\n padding: '14px',\n backgroundColor: colors.bg,\n color: colors.text,\n border: `1px solid ${colors.border}`,\n borderRadius: '12px',\n boxShadow: '0 10px 25px rgba(0,0,0,0.15)',\n width: '260px',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontWeight: 600,\n marginBottom: '8px',\n paddingBottom: '6px',\n borderBottom: `1px solid ${colors.border}`,\n }}\n >\n <span>Live Session Usage</span>\n <span style={{ color: colors.subtext }}>{turnCount} turns</span>\n </div>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', fontSize: '12px' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <span style={{ color: colors.subtext }}>Prompt Input:</span>\n <span>{sessionUsage.inputTokens.toLocaleString()}</span>\n </div>\n\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <span style={{ color: colors.subtext }}>Output Tokens:</span>\n <span>{sessionUsage.outputTokens.toLocaleString()}</span>\n </div>\n\n {sessionUsage.reasoningTokens! > 0 && (\n <div style={{ display: 'flex', justifyContent: 'space-between', color: colors.reasoningText }}>\n <span>🧠 Thinking Tokens:</span>\n <span>{sessionUsage.reasoningTokens!.toLocaleString()}</span>\n </div>\n )}\n\n {sessionUsage.cachedTokens! > 0 && (\n <div style={{ display: 'flex', justifyContent: 'space-between', color: '#10b981' }}>\n <span>⚡ Cached Tokens:</span>\n <span>{sessionUsage.cachedTokens!.toLocaleString()}</span>\n </div>\n )}\n\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontWeight: 600,\n marginTop: '6px',\n paddingTop: '6px',\n borderTop: `1px solid ${colors.border}`,\n }}\n >\n <span>Session Cost:</span>\n <span>${sessionCost.totalUSD.toFixed(5)} {sessionCost.currency}</span>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { useVibezSession } from './hooks';\nimport type { VibezSessionBadgeProps } from './types';\n\n/**\n * Compact inline badge for chat input bars, headers, or navbars\n */\nexport const VibezSessionBadge: React.FC<VibezSessionBadgeProps> = ({\n showCost = true,\n showTokens = true,\n className,\n style,\n}) => {\n const { sessionUsage, sessionCost } = useVibezSession();\n\n const formatTokens = (num: number) => {\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(1) + 'M';\n if (num >= 1_000) return (num / 1_000).toFixed(1) + 'k';\n return num.toString();\n };\n\n return (\n <span\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '5px',\n padding: '3px 8px',\n fontSize: '11px',\n fontWeight: 500,\n borderRadius: '9999px',\n backgroundColor: 'rgba(139, 92, 246, 0.1)',\n color: '#8b5cf6',\n border: '1px solid rgba(139, 92, 246, 0.2)',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n ...style,\n }}\n >\n <span>⚡</span>\n {showTokens && <span>{formatTokens(sessionUsage.totalTokens)} tok</span>}\n {showCost && <span>(${sessionCost.totalUSD.toFixed(4)})</span>}\n </span>\n );\n};\n","'use client';\n\nimport React, { useState } from 'react';\n\nexport interface VibezBillingNotice {\n status?: 'requires_payment' | 'limit_reached' | 'upgrade_required';\n customerId?: string;\n customerEmail?: string;\n checkoutUrl?: string;\n tokensUsed?: number;\n costUSD?: number;\n message?: string;\n}\n\nexport interface VibezBillingModalProps {\n notice?: VibezBillingNotice | null;\n isOpen?: boolean;\n onClose?: () => void;\n onSuccess?: () => void;\n theme?: 'light' | 'dark';\n testMode?: boolean;\n}\n\n// Inline pure SVG Icons to ensure zero external runtime dependencies\nconst CreditCardIcon = () => (\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" strokeWidth=\"2\" />\n <line x1=\"2\" y1=\"10\" x2=\"22\" y2=\"10\" strokeWidth=\"2\" />\n </svg>\n);\n\nconst ShieldCheckIcon = () => (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\n </svg>\n);\n\nconst ZapIcon = () => (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <polyline points=\"20 6 9 17 4 12\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ArrowRightIcon = () => (\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <polyline points=\"12 5 19 12 12 19\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n/**\n * Intuitive React Modal for Stripe Top-Up, Card Registration & Paywall\n */\nexport const VibezBillingModal: React.FC<VibezBillingModalProps> = ({\n notice,\n isOpen: explicitIsOpen,\n onClose,\n onSuccess,\n theme = 'light',\n testMode = true,\n}) => {\n const [loading, setLoading] = useState(false);\n const [successState, setSuccessState] = useState(false);\n const [selectedPlan, setSelectedPlan] = useState<'starter' | 'pro'>('starter');\n\n const isVisible = explicitIsOpen !== undefined ? explicitIsOpen : Boolean(notice);\n\n if (!isVisible) return null;\n\n const handleSimulatePayment = async () => {\n setLoading(true);\n if (notice?.checkoutUrl) {\n window.location.href = notice.checkoutUrl;\n return;\n }\n\n await new Promise((r) => setTimeout(r, 1200));\n setLoading(false);\n setSuccessState(true);\n\n setTimeout(() => {\n setSuccessState(false);\n if (onSuccess) onSuccess();\n if (onClose) onClose();\n }, 1500);\n };\n\n const isLight = theme === 'light';\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-slate-900/60 backdrop-blur-sm animate-in fade-in duration-200\">\n <div\n className={`relative w-full max-w-md rounded-2xl shadow-2xl border transition-all overflow-hidden ${\n isLight ? 'bg-white border-slate-200 text-slate-900' : 'bg-slate-900 border-slate-800 text-white'\n }`}\n >\n {/* Top Accent Gradient */}\n <div className=\"h-1.5 w-full bg-gradient-to-r from-indigo-500 via-purple-500 to-emerald-500\" />\n\n {/* Close Button */}\n {onClose && (\n <button\n onClick={onClose}\n className=\"absolute top-3.5 right-3.5 p-1 rounded-lg text-slate-400 hover:text-slate-700 hover:bg-slate-100 transition\"\n >\n <CloseIcon />\n </button>\n )}\n\n <div className=\"p-6 space-y-5\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <div className=\"h-10 w-10 rounded-xl bg-indigo-600 flex items-center justify-center text-white shadow-md shadow-indigo-500/20 shrink-0\">\n <CreditCardIcon />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-bold text-base tracking-tight\">\n {notice?.status === 'limit_reached' ? 'Token Limit Reached' : 'Add Billing Credits'}\n </h3>\n {testMode && (\n <span className=\"text-[10px] uppercase font-bold px-2 py-0.5 rounded-full bg-amber-50 text-amber-700 border border-amber-200\">\n Stripe Sandbox\n </span>\n )}\n </div>\n <p className=\"text-xs text-slate-500 mt-0.5\">\n {notice?.message || 'Top up your account to continue streaming AI tokens.'}\n </p>\n </div>\n </div>\n\n {/* Usage Metrics Banner */}\n {(notice?.tokensUsed || notice?.costUSD) && (\n <div\n className={`p-3 rounded-xl border flex items-center justify-between text-xs ${\n isLight ? 'bg-slate-50 border-slate-200' : 'bg-slate-800 border-slate-700'\n }`}\n >\n <div>\n <span className=\"text-slate-400\">Tokens Metered:</span>{' '}\n <strong className=\"text-slate-800 font-semibold\">\n {notice.tokensUsed?.toLocaleString() || 0}\n </strong>\n </div>\n <div>\n <span className=\"text-slate-400\">Cost:</span>{' '}\n <strong className=\"text-indigo-600 font-semibold\">\n ${notice.costUSD?.toFixed(4) || '0.0000'} USD\n </strong>\n </div>\n </div>\n )}\n\n {/* Tier Selection */}\n <div className=\"space-y-2\">\n <label className=\"text-xs font-semibold text-slate-500 uppercase tracking-wider\">\n Select Top-Up Option\n </label>\n\n <div className=\"grid grid-cols-2 gap-2.5\">\n <button\n type=\"button\"\n onClick={() => setSelectedPlan('starter')}\n className={`p-3 rounded-xl border text-left transition relative ${\n selectedPlan === 'starter'\n ? 'border-indigo-600 bg-indigo-50/60 ring-2 ring-indigo-500/20'\n : isLight\n ? 'border-slate-200 bg-white hover:border-slate-300'\n : 'border-slate-800 bg-slate-800/50'\n }`}\n >\n <div className=\"text-xs font-bold text-slate-900\">$5.00 Top-Up</div>\n <div className=\"text-[11px] text-slate-500 mt-0.5\">500k AI Tokens</div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => setSelectedPlan('pro')}\n className={`p-3 rounded-xl border text-left transition relative ${\n selectedPlan === 'pro'\n ? 'border-indigo-600 bg-indigo-50/60 ring-2 ring-indigo-500/20'\n : isLight\n ? 'border-slate-200 bg-white hover:border-slate-300'\n : 'border-slate-800 bg-slate-800/50'\n }`}\n >\n <div className=\"text-xs font-bold text-slate-900\">$20.00 Pro</div>\n <div className=\"text-[11px] text-slate-500 mt-0.5\">2.5M AI Tokens</div>\n </button>\n </div>\n </div>\n\n {/* Action Button */}\n <button\n onClick={handleSimulatePayment}\n disabled={loading || successState}\n className=\"w-full py-2.5 px-4 rounded-xl bg-indigo-600 hover:bg-indigo-500 disabled:opacity-50 text-white text-sm font-semibold flex items-center justify-center gap-2 shadow-md shadow-indigo-500/20 transition\"\n >\n {loading ? (\n <span>Processing Stripe Sandbox Checkout...</span>\n ) : successState ? (\n <span className=\"flex items-center gap-1.5 text-emerald-300 font-semibold\">\n <CheckIcon /> Credits Added Successfully!\n </span>\n ) : (\n <span className=\"flex items-center gap-1.5\">\n <span>Checkout with Stripe</span>\n <ArrowRightIcon />\n </span>\n )}\n </button>\n\n {/* Footer Security Badges */}\n <div className=\"flex items-center justify-center gap-4 text-[11px] text-slate-400 pt-1 border-t border-slate-100\">\n <div className=\"flex items-center gap-1\">\n <ShieldCheckIcon />\n <span>Stripe v2 Meter Events</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <ZapIcon />\n <span>Zero Latency Telemetry</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAgF;;;ACMzE,IAAM,sBAAyD;AAAA;AAAA,EAEpE,eAAe,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC3E,iBAAiB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC7E,gBAAgB,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EAC5E,SAAS,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EACrE,cAAc,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EAC1E,MAAM,EAAE,YAAY,IAAM,aAAa,IAAM,kBAAkB,IAAI;AAAA,EACnE,WAAW,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EACvE,MAAM,EAAE,YAAY,IAAM,aAAa,IAAM,kBAAkB,IAAI;AAAA,EACnE,WAAW,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EACvE,UAAU,EAAE,YAAY,KAAK,aAAa,IAAM,kBAAkB,KAAK;AAAA,EACvE,eAAe,EAAE,YAAY,MAAM,aAAa,KAAK,kBAAkB,MAAM;AAAA,EAC7E,WAAW,EAAE,YAAY,GAAK,aAAa,GAAK,kBAAkB,EAAI;AAAA,EACtE,gBAAgB,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EAC5E,0BAA0B,EAAE,YAAY,MAAM,aAAa,EAAI;AAAA,EAC/D,0BAA0B,EAAE,YAAY,MAAM,aAAa,EAAI;AAAA;AAAA,EAG/D,qBAAqB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,IAAI;AAAA,EAClF,mBAAmB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC/E,qBAAqB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EACjF,oBAAoB,EAAE,YAAY,KAAK,aAAa,GAAK,kBAAkB,KAAK;AAAA,EAChF,aAAa,EAAE,YAAY,GAAK,aAAa,GAAK,kBAAkB,IAAI;AAAA,EACxE,iBAAiB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC7E,iBAAiB,EAAE,YAAY,IAAM,aAAa,IAAM,kBAAkB,IAAI;AAAA;AAAA,EAG9E,oBAAoB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA,EAClF,kBAAkB,EAAE,YAAY,GAAK,aAAa,IAAM,kBAAkB,IAAI;AAAA,EAC9E,oBAAoB,EAAE,YAAY,KAAK,aAAa,GAAK,kBAAkB,KAAK;AAAA,EAChF,yBAAyB,EAAE,YAAY,MAAM,aAAa,KAAK,kBAAkB,KAAK;AAAA,EACtF,oBAAoB,EAAE,YAAY,KAAK,aAAa,KAAK,kBAAkB,MAAM;AAAA,EACjF,kBAAkB,EAAE,YAAY,MAAM,aAAa,GAAK,kBAAkB,OAAO;AAAA,EACjF,oBAAoB,EAAE,YAAY,OAAO,aAAa,KAAK,kBAAkB,QAAQ;AAAA;AAAA,EAGrF,YAAY,EAAE,YAAY,GAAK,aAAa,GAAK;AAAA,EACjD,UAAU,EAAE,YAAY,GAAK,aAAa,GAAK;AAAA,EAC/C,iBAAiB,EAAE,YAAY,GAAK,aAAa,GAAK;AAAA,EACtD,aAAa,EAAE,YAAY,GAAK,aAAa,GAAK;AAAA;AAAA,EAGlD,mBAAmB,EAAE,YAAY,GAAK,aAAa,EAAI;AAAA,EACvD,wBAAwB,EAAE,YAAY,GAAK,aAAa,EAAI;AAAA,EAC5D,oBAAoB,EAAE,YAAY,KAAK,aAAa,IAAI;AAAA,EACxD,wBAAwB,EAAE,YAAY,KAAK,aAAa,IAAI;AAAA,EAC5D,uBAAuB,EAAE,YAAY,KAAK,aAAa,IAAI;AAAA;AAAA,EAG3D,2BAA2B,EAAE,YAAY,MAAM,aAAa,KAAK;AAAA,EACjE,wBAAwB,EAAE,YAAY,MAAM,aAAa,KAAK;AAAA,EAC9D,iCAAiC,EAAE,YAAY,MAAM,aAAa,KAAK;AAAA,EACvE,gBAAgB,EAAE,YAAY,MAAM,aAAa,KAAK;AAAA;AAAA,EAGtD,mBAAmB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA,EACjF,qBAAqB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA,EACnF,iBAAiB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA,EAC/E,qBAAqB,EAAE,YAAY,MAAM,aAAa,MAAM,kBAAkB,KAAK;AAAA;AAAA,EAGnF,kBAAkB,EAAE,YAAY,KAAK,aAAa,GAAK;AAAA,EACvD,aAAa,EAAE,YAAY,MAAM,aAAa,IAAI;AACpD;AAKA,IAAM,wBAA2D,CAAC;AAK3D,SAAS,kBAAkB,UAA0B;AAC1D,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,QAAQ,SAAS,YAAY,EAAE,KAAK;AAGxC,MAAI,MAAM,SAAS,GAAG,GAAG;AACvB,YAAQ,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,EACjC;AAGA,UAAQ,MAAM,QAAQ,WAAW,EAAE;AACnC,UAAQ,MAAM,QAAQ,uBAAuB,EAAE;AAE/C,SAAO;AACT;AAKO,SAAS,gBAAgB,WAAsC;AACpE,QAAM,aAAa,kBAAkB,SAAS;AAG9C,MAAI,sBAAsB,UAAU,GAAG;AACrC,WAAO,sBAAsB,UAAU;AAAA,EACzC;AACA,MAAI,sBAAsB,SAAS,GAAG;AACpC,WAAO,sBAAsB,SAAS;AAAA,EACxC;AAGA,MAAI,oBAAoB,UAAU,GAAG;AACnC,WAAO,oBAAoB,UAAU;AAAA,EACvC;AACA,MAAI,oBAAoB,SAAS,GAAG;AAClC,WAAO,oBAAoB,SAAS;AAAA,EACtC;AAGA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,kBAAkB;AAAA,EACpB;AACF;;;AC7GO,SAAS,cAAc,QAA4C;AACxE,QAAM,QAAQ,gBAAgB,OAAO,KAAK;AAE1C,QAAM,cAAc,OAAO,eAAe;AAC1C,QAAM,eAAe,OAAO,gBAAgB;AAC5C,QAAM,kBAAkB,OAAO,mBAAmB;AAClD,QAAM,eAAe,OAAO,gBAAgB;AAG5C,QAAM,qBAAqB,KAAK,IAAI,GAAG,cAAc,YAAY;AAGjE,QAAM,mBAAoB,qBAAqB,MAAa,MAAM;AAClE,QAAM,aAAa,MAAM,oBAAoB,MAAM,aAAa;AAChE,QAAM,kBAAmB,eAAe,MAAa;AACrD,QAAM,eAAe,mBAAmB;AAGxC,QAAM,gBAAiB,eAAe,MAAa,MAAM;AAGzD,QAAM,gBAAgB,MAAM,kBAAkB,MAAM;AACpD,QAAM,mBAAoB,kBAAkB,MAAa;AAGzD,QAAM,oBAAqB,eAAe,MAAa,MAAM;AAC7D,QAAM,oBAAoB,KAAK,IAAI,GAAG,oBAAoB,eAAe;AAGzE,QAAM,WAAW,eAAe;AAGhC,QAAM,SAAS,OAAO,oBAAoB;AAC1C,QAAM,YAAY,WAAW,IAAM,WAAW,SAAS;AAEvD,SAAO;AAAA,IACL,cAAc,OAAO,aAAa,QAAQ,CAAC,CAAC;AAAA,IAC5C,eAAe,OAAO,cAAc,QAAQ,CAAC,CAAC;AAAA,IAC9C,kBAAkB,kBAAkB,IAAI,OAAO,iBAAiB,QAAQ,CAAC,CAAC,IAAI;AAAA,IAC9E,mBAAmB,eAAe,IAAI,OAAO,kBAAkB,QAAQ,CAAC,CAAC,IAAI;AAAA,IAC7E,UAAU,OAAO,SAAS,QAAQ,CAAC,CAAC;AAAA,IACpC,WAAW,YAAY,OAAO,UAAU,QAAQ,CAAC,CAAC,IAAI;AAAA,IACtD,UAAU,MAAM,YAAY;AAAA,EAC9B;AACF;AAKO,SAAS,mBACd,OACA,OACA,kBACe;AACf,SAAO,cAAc;AAAA,IACnB;AAAA,IACA,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,iBAAiB,MAAM;AAAA,IACvB,cAAc,MAAM;AAAA,IACpB,kBAAkB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC;AACH;;;AFgPS;AArTT,IAAM,gBAA4B;AAAA,EAChC,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,cAAc;AAChB;AAEA,IAAM,eAA8B;AAAA,EAClC,cAAc;AAAA,EACd,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,UAAU;AACZ;AAEO,IAAM,0BAAsB,4BAA+C,IAAI;AAEtF,SAAS,aAAqB;AAC5B,SAAO,UAAU,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,IAAI,MAAM,KAAK,IAAI,EAAE,SAAS,EAAE;AAC7F;AAEO,IAAM,uBAA4D,CAAC;AAAA,EACxE;AAAA,EACA,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAiB,MAAM,mBAAmB,WAAW,CAAC;AACxF,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAiB,CAAC;AACpD,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAqB,aAAa;AAC1E,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAwB,YAAY;AAC1E,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAkC,CAAC,CAAC;AAClE,QAAM,CAAC,SAAS,UAAU,QAAI,uBAA8B,CAAC,CAAC;AAE9D,QAAM,qBAAiB,sBAAQ,MAAM,GAAG,UAAU,GAAG,SAAS,IAAI,CAAC,YAAY,SAAS,CAAC;AAGzF,8BAAU,MAAM;AACd,QAAI,YAAY,SAAU;AAE1B,QAAI;AACF,UAAI,YAAY,oBAAoB,OAAO,WAAW,eAAe,OAAO,gBAAgB;AAC1F,cAAM,OAAO,OAAO,eAAe,QAAQ,cAAc;AACzD,YAAI,MAAM;AACR,gBAAM,SAAuB,KAAK,MAAM,IAAI;AAC5C,uBAAa,OAAO,SAAS;AAC7B,0BAAgB,OAAO,YAAY;AACnC,yBAAe,OAAO,WAAW;AACjC,qBAAW,OAAO,OAAO;AACzB,qBAAW,OAAO,OAAO;AAAA,QAC3B;AAAA,MACF,WAAW,YAAY,kBAAkB,OAAO,WAAW,eAAe,OAAO,cAAc;AAC7F,cAAM,OAAO,OAAO,aAAa,QAAQ,cAAc;AACvD,YAAI,MAAM;AACR,gBAAM,SAAuB,KAAK,MAAM,IAAI;AAC5C,uBAAa,OAAO,SAAS;AAC7B,0BAAgB,OAAO,YAAY;AACnC,yBAAe,OAAO,WAAW;AACjC,qBAAW,OAAO,OAAO;AACzB,qBAAW,OAAO,OAAO;AAAA,QAC3B;AAAA,MACF,WAAW,YAAY,YAAY,SAAS;AAC1C,cAAM,MAAM,QAAQ,QAAQ,cAAc;AAC1C,YAAI,eAAe,SAAS;AAC1B,cAAI,KAAK,CAAC,SAAS;AACjB,gBAAI,MAAM;AACR,oBAAM,SAAuB,KAAK,MAAM,IAAI;AAC5C,2BAAa,OAAO,SAAS;AAC7B,8BAAgB,OAAO,YAAY;AACnC,6BAAe,OAAO,WAAW;AACjC,yBAAW,OAAO,OAAO;AACzB,yBAAW,OAAO,OAAO;AAAA,YAC3B;AAAA,UACF,CAAC;AAAA,QACH,WAAW,KAAK;AACd,gBAAM,SAAuB,KAAK,MAAM,GAAG;AAC3C,uBAAa,OAAO,SAAS;AAC7B,0BAAgB,OAAO,YAAY;AACnC,yBAAe,OAAO,WAAW;AACjC,qBAAW,OAAO,OAAO;AACzB,qBAAW,OAAO,OAAO;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,SAAS,gBAAgB,OAAO,CAAC;AAGrC,QAAM,gBAAY;AAAA,IAChB,CAAC,aAA2B;AAC1B,UAAI,YAAY,SAAU;AAE1B,UAAI;AACF,cAAM,OAAO,KAAK,UAAU,QAAQ;AACpC,YAAI,YAAY,oBAAoB,OAAO,WAAW,eAAe,OAAO,gBAAgB;AAC1F,iBAAO,eAAe,QAAQ,gBAAgB,IAAI;AAAA,QACpD,WAAW,YAAY,kBAAkB,OAAO,WAAW,eAAe,OAAO,cAAc;AAC7F,iBAAO,aAAa,QAAQ,gBAAgB,IAAI;AAAA,QAClD,WAAW,YAAY,YAAY,SAAS;AAC1C,kBAAQ,QAAQ,gBAAgB,IAAI;AAAA,QACtC;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,IACA,CAAC,SAAS,gBAAgB,OAAO;AAAA,EACnC;AAKA,QAAM,iBAAa;AAAA,IACjB,CAAC,EAAE,OAAO,OAAO,UAAU,SAAS,MAAM;AACxC,YAAM,cAAc,SAAS,gBAAgB,SAAS,eAAe;AACrE,YAAM,eAAe,SAAS,oBAAoB,SAAS,gBAAgB;AAC3E,YAAM,kBACJ,SAAS,mBAAmB,SAAS,yBAAyB,oBAAoB;AACpF,YAAM,eACJ,SAAS,gBAAgB,SAAS,qBAAqB,iBAAiB;AAC1E,YAAM,mBAAmB,SAAS,oBAAoB;AAEtD,YAAM,YAAwB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,aAAa,SAAS,eAAe,cAAc;AAAA,QACnD,iBAAiB,kBAAkB,IAAI,kBAAkB;AAAA,QACzD,qBAAqB,KAAK,IAAI,GAAG,eAAe,eAAe;AAAA,QAC/D,cAAc,eAAe,IAAI,eAAe;AAAA,QAChD,kBAAkB,mBAAmB,IAAI,mBAAmB;AAAA,MAC9D;AAEA,YAAM,WAAW,mBAAmB,OAAO,WAAW,gBAAgB;AAEtE,YAAM,SAA4B;AAAA,QAChC,IAAI,UAAU,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE,SAAS,EAAE;AAAA,QACvF,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC;AAAA,QACA,OAAO;AAAA,QACP,MAAM;AAAA,QACN;AAAA,MACF;AAGA,YAAM,eAAe,YAAY;AACjC,mBAAa,YAAY;AAGzB,YAAM,WAAuB;AAAA,QAC3B,aAAa,aAAa,cAAc;AAAA,QACxC,cAAc,aAAa,eAAe;AAAA,QAC1C,aAAa,aAAa,cAAc,UAAU;AAAA,QAClD,kBAAkB,aAAa,mBAAmB,MAAM,UAAU,mBAAmB;AAAA,QACrF,sBACG,aAAa,uBAAuB,MAAM,UAAU,uBAAuB;AAAA,QAC9E,eAAe,aAAa,gBAAgB,MAAM,UAAU,gBAAgB;AAAA,QAC5E,mBAAmB,aAAa,oBAAoB,MAAM,UAAU,oBAAoB;AAAA,MAC1F;AACA,sBAAgB,QAAQ;AAGxB,YAAM,UAAyB;AAAA,QAC7B,cAAc,QAAQ,YAAY,eAAe,SAAS,cAAc,QAAQ,CAAC,CAAC;AAAA,QAClF,eAAe,QAAQ,YAAY,gBAAgB,SAAS,eAAe,QAAQ,CAAC,CAAC;AAAA,QACrF,kBACE,SAAS,qBAAqB,UAAa,YAAY,qBAAqB,SACxE;AAAA,YAEK,YAAY,oBAAoB,MAAM,SAAS,oBAAoB,IACpE,QAAQ,CAAC;AAAA,QACb,IACA;AAAA,QACN,mBACE,SAAS,sBAAsB,UAAa,YAAY,sBAAsB,SAC1E;AAAA,YAEK,YAAY,qBAAqB,MAAM,SAAS,qBAAqB,IACtE,QAAQ,CAAC;AAAA,QACb,IACA;AAAA,QACN,UAAU,QAAQ,YAAY,WAAW,SAAS,UAAU,QAAQ,CAAC,CAAC;AAAA,QACtE,WACE,SAAS,cAAc,UAAa,YAAY,cAAc,SAC1D,SAAS,YAAY,aAAa,MAAM,SAAS,aAAa,IAAI,QAAQ,CAAC,CAAC,IAC5E;AAAA,QACN,UAAU,SAAS,YAAY;AAAA,MACjC;AACA,qBAAe,OAAO;AAGtB,YAAM,iBAAiB,QAAQ,KAAK,KAAK;AAAA,QACvC,OAAO;AAAA,QACP,OAAO,EAAE,GAAG,cAAc;AAAA,QAC1B,MAAM,EAAE,GAAG,aAAa;AAAA,MAC1B;AAEA,YAAM,gBAAgB;AAAA,QACpB,OAAO,eAAe,QAAQ;AAAA,QAC9B,OAAO;AAAA,UACL,aAAa,eAAe,MAAM,cAAc;AAAA,UAChD,cAAc,eAAe,MAAM,eAAe;AAAA,UAClD,aAAa,eAAe,MAAM,cAAc,UAAU;AAAA,UAC1D,kBACG,eAAe,MAAM,mBAAmB,MAAM,UAAU,mBAAmB;AAAA,UAC9E,sBACG,eAAe,MAAM,uBAAuB,MAC5C,UAAU,uBAAuB;AAAA,UACpC,eAAe,eAAe,MAAM,gBAAgB,MAAM,UAAU,gBAAgB;AAAA,QACtF;AAAA,QACA,MAAM;AAAA,UACJ,cAAc;AAAA,aACX,eAAe,KAAK,eAAe,SAAS,cAAc,QAAQ,CAAC;AAAA,UACtE;AAAA,UACA,eAAe;AAAA,aACZ,eAAe,KAAK,gBAAgB,SAAS,eAAe,QAAQ,CAAC;AAAA,UACxE;AAAA,UACA,UAAU,QAAQ,eAAe,KAAK,WAAW,SAAS,UAAU,QAAQ,CAAC,CAAC;AAAA,UAC9E,UAAU,SAAS,YAAY;AAAA,QACjC;AAAA,MACF;AAEA,YAAM,aAAa;AAAA,QACjB,GAAG;AAAA,QACH,CAAC,KAAK,GAAG;AAAA,MACX;AACA,iBAAW,UAAU;AAGrB,YAAM,aAAa,CAAC,GAAG,SAAS,MAAM;AACtC,iBAAW,UAAU;AAErB,YAAM,eAA6B;AAAA,QACjC;AAAA,QACA,WAAW;AAAA,QACX,cAAc;AAAA,QACd,aAAa;AAAA,QACb,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAEA,gBAAU,YAAY;AAEtB,UAAI,gBAAgB;AAClB,uBAAe,QAAQ,YAAY;AAAA,MACrC;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAKA,QAAM,mBAAe;AAAA,IACnB,CAAC,iBAA0B;AACzB,YAAM,SAAS,gBAAgB,WAAW;AAC1C,mBAAa,MAAM;AACnB,mBAAa,CAAC;AACd,sBAAgB,aAAa;AAC7B,qBAAe,YAAY;AAC3B,iBAAW,CAAC,CAAC;AACb,iBAAW,CAAC,CAAC;AAEb,UAAI,YAAY,oBAAoB,OAAO,WAAW,eAAe,OAAO,gBAAgB;AAC1F,eAAO,eAAe,WAAW,cAAc;AAAA,MACjD,WACE,YAAY,kBACZ,OAAO,WAAW,eAClB,OAAO,cACP;AACA,eAAO,aAAa,WAAW,cAAc;AAAA,MAC/C,WAAW,YAAY,YAAY,SAAS;AAC1C,gBAAQ,WAAW,cAAc;AAAA,MACnC;AAAA,IACF;AAAA,IACA,CAAC,SAAS,gBAAgB,OAAO;AAAA,EACnC;AAEA,QAAM,YAAkC;AAAA,IACtC,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,WAAW,WAAW,cAAc,aAAa,SAAS,SAAS,YAAY,YAAY;AAAA,EAC9F;AAEA,SAAO,4CAAC,oBAAoB,UAApB,EAA6B,OAAe,UAAS;AAC/D;;;AGhUA,IAAAA,gBAA0D;AAOnD,SAAS,kBAA4C;AAC1D,QAAM,cAAU,0BAAW,mBAAmB;AAE9C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,WAAW;AA+BjB,SAAS,aAAa,UAA+B,CAAC,GAAG;AAC9D,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO,CAAC;AAAA,IACR,kBAAkB,CAAC;AAAA,IACnB;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,cAAU,0BAAW,mBAAmB;AAE9C,QAAM,CAAC,UAAU,WAAW,QAAI,wBAA6B,eAAe;AAC5E,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAiB,EAAE;AAC7C,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAkB,KAAK;AACzD,QAAM,yBAAqB,sBAA+B,IAAI;AAE9D,QAAM,wBAAoB;AAAA,IACxB,CAAC,MAAiE;AAChE,eAAS,EAAE,OAAO,KAAK;AAAA,IACzB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,aAAS;AAAA,IACb,OAAO,gBAAkC;AACvC,YAAM,kBAAkB,CAAC,GAAG,UAAU,WAAW;AACjD,kBAAY,eAAe;AAC3B,mBAAa,IAAI;AAEjB,YAAM,cAAc,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACtE,UAAI,mBAAmB;AACvB,UAAI,oBAAoB;AACxB,UAAI,gBAAgB;AAAA,QAClB,cAAc;AAAA,QACd,kBAAkB;AAAA,QAClB,aAAa;AAAA,QACb,iBAAiB;AAAA,MACnB;AAEA,kBAAY,CAAC,SAAS;AAAA,QACpB,GAAG;AAAA,QACH;AAAA,UACE,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,WAAW,oBAAI,KAAK;AAAA,QACtB;AAAA,MACF,CAAC;AAED,UAAI;AACF,2BAAmB,UAAU,IAAI,gBAAgB;AAEjD,cAAM,MAAM,MAAM,MAAM,KAAK;AAAA,UAC3B,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU;AAAA,YACnB,UAAU,gBAAgB,IAAI,CAAC,OAAO;AAAA,cACpC,MAAM,EAAE;AAAA,cACR,SAAS,EAAE;AAAA,YACb,EAAE;AAAA,YACF;AAAA,YACA;AAAA,YACA,GAAG;AAAA,UACL,CAAC;AAAA,UACD,QAAQ,mBAAmB,QAAQ;AAAA,QACrC,CAAC;AAED,YAAI,CAAC,IAAI,IAAI;AACX,gBAAM,UAAU,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACjD,gBAAM,IAAI,MAAM,QAAQ,SAAS,uBAAuB,IAAI,MAAM,EAAE;AAAA,QACtE;AAEA,cAAM,SAAS,IAAI,MAAM,UAAU;AACnC,YAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AAEvD,cAAM,UAAU,IAAI,YAAY;AAChC,YAAI,SAAS;AAEb,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,cAAI,KAAM;AAEV,oBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,gBAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,mBAAS,MAAM,IAAI,KAAK;AAExB,qBAAW,QAAQ,OAAO;AACxB,gBAAI,CAAC,KAAK,KAAK,EAAG;AAElB,gBAAI,KAAK,WAAW,IAAI,GAAG;AACzB,kBAAI;AACF,oCAAoB,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,cAClD,QAAQ;AACN,oCAAoB,KAAK,UAAU,CAAC,EAAE,QAAQ,UAAU,EAAE;AAAA,cAC5D;AAAA,YACF,WAAW,KAAK,WAAW,IAAI,GAAG;AAChC,kBAAI;AACF,sBAAM,OAAO,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;AACzC,oBAAI,KAAK,OAAO;AACd,kCAAgB;AAAA,oBACd,cAAc,KAAK,MAAM,gBAAgB;AAAA,oBACzC,kBAAkB,KAAK,MAAM,oBAAoB;AAAA,oBACjD,cACG,KAAK,MAAM,gBAAgB,MAAM,KAAK,MAAM,oBAAoB;AAAA,oBACnE,iBAAiB,KAAK,MAAM,mBAAmB;AAAA,kBACjD;AAAA,gBACF;AAAA,cACF,QAAQ;AAAA,cAER;AAAA,YACF,WAAW,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,IAAI,GAAG;AACzD,kBAAI;AACF,qCAAqB,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,cACnD,QAAQ;AACN,qCAAqB,KAAK,UAAU,CAAC;AAAA,cACvC;AAAA,YACF,WAAW,CAAC,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,WAAW,IAAI,GAAG;AAC3D,kCAAoB;AAAA,YACtB;AAEA;AAAA,cAAY,CAAC,SACX,KAAK;AAAA,gBAAI,CAAC,QACR,IAAI,OAAO,cACP;AAAA,kBACE,GAAG;AAAA,kBACH,SAAS;AAAA,kBACT,aAAa,oBACT,CAAC,EAAE,MAAM,aAAa,WAAW,kBAAkB,CAAC,IACpD;AAAA,gBACN,IACA;AAAA,cACN;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,cAAc,iBAAiB,KAAK,cAAc,qBAAqB,GAAG;AAC5E,gBAAM,cAAc,gBAAgB;AAAA,YAClC,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE;AAAA,YACzC;AAAA,UACF;AACA,gBAAM,cAAc,iBAAiB,MAAM,KAAK,EAAE;AAClD,0BAAgB;AAAA,YACd,cAAc,KAAK,KAAK,cAAc,GAAG;AAAA,YACzC,kBAAkB,KAAK,KAAK,cAAc,GAAG;AAAA,YAC7C,aAAa,KAAK,MAAM,cAAc,eAAe,GAAG;AAAA,YACxD,iBAAiB,oBACb,KAAK,KAAK,kBAAkB,MAAM,KAAK,EAAE,SAAS,GAAG,IACrD;AAAA,UACN;AAAA,QACF;AAGA,YAAI,SAAS;AACX,kBAAQ,WAAW;AAAA,YACjB;AAAA,YACA,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAEA,cAAM,WAA6B;AAAA,UACjC,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,aAAa,oBACT,CAAC,EAAE,MAAM,aAAa,WAAW,kBAAkB,CAAC,IACpD;AAAA,UACJ,WAAW,oBAAI,KAAK;AAAA,QACtB;AAEA,YAAI,UAAU;AACZ,mBAAS,UAAU,aAAa;AAAA,QAClC;AAAA,MACF,SAAS,KAAU;AACjB,YAAI,IAAI,SAAS,aAAc;AAC/B,gBAAQ,MAAM,wBAAwB,GAAG;AACzC,YAAI,QAAS,SAAQ,GAAG;AAAA,MAC1B,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,OAAO,UAAU,MAAM,UAAU,SAAS,UAAU,OAAO;AAAA,EACnE;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,MAAwB;AACvB,UAAI,EAAG,GAAE,eAAe;AACxB,UAAI,CAAC,MAAM,KAAK,KAAK,UAAW;AAEhC,YAAM,UAA4B;AAAA,QAChC,IAAI,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAAA,QACtD,MAAM;AAAA,QACN,SAAS,MAAM,KAAK;AAAA,QACpB,WAAW,oBAAI,KAAK;AAAA,MACtB;AAEA,eAAS,EAAE;AACX,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,CAAC,OAAO,WAAW,MAAM;AAAA,EAC3B;AAEA,QAAM,WAAO,2BAAY,MAAM;AAC7B,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,MAAM;AACjC,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AChRA,IAAAC,gBAAgC;AAuFxB,IAAAC,sBAAA;AAnFD,IAAM,qBAAwD,CAAC;AAAA,EACpE,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,cAAc,aAAa,WAAW,QAAQ,IAAI,gBAAgB;AAC1E,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,KAAK;AAG9C,QAAM,WAAW,aAAa,cAAc;AAE5C,QAAM,SACJ,UAAU,UACT,UAAU,UACT,OAAO,WAAW,eAClB,OAAO,aAAa,8BAA8B,EAAE;AAExD,QAAM,SAAS;AAAA,IACb,IAAI,SAAS,YAAY;AAAA,IACzB,MAAM,SAAS,YAAY;AAAA,IAC3B,SAAS,SAAS,YAAY;AAAA,IAC9B,QAAQ,SAAS,YAAY;AAAA,IAC7B,QAAQ;AAAA,IACR,aAAa,SAAS,YAAY;AAAA,IAClC,eAAe,SAAS,YAAY;AAAA,EACtC;AAEA,QAAM,oBAAoB,MAA2B;AACnD,QAAI,aAAa,SAAU,QAAO,CAAC;AACnC,UAAM,OAA4B,EAAE,UAAU,SAAS,QAAQ,KAAK;AACpE,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,MAClD,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,QAAQ,QAAQ,MAAM,OAAO;AAAA,MACjD,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,KAAK,QAAQ,OAAO,OAAO;AAAA,MAC/C,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,KAAK,QAAQ,MAAM,OAAO;AAAA,MAC9C;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,QAAgB;AACpC,QAAI,OAAO,IAAW,SAAQ,MAAM,KAAW,QAAQ,CAAC,IAAI;AAC5D,QAAI,OAAO,IAAO,SAAQ,MAAM,KAAO,QAAQ,CAAC,IAAI;AACpD,WAAO,IAAI,SAAS;AAAA,EACtB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,GAAG,kBAAkB;AAAA,QACrB,YACE;AAAA,QACF,UAAU;AAAA,QACV,GAAG;AAAA,MACL;AAAA,MAGA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,YAAY,CAAC,QAAQ;AAAA,YACpC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB,OAAO;AAAA,cACxB,OAAO,OAAO;AAAA,cACd,QAAQ,aAAa,OAAO,MAAM;AAAA,cAClC,cAAc;AAAA,cACd,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,2DAAC,UAAK,OAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,OAAO,GAAG,oBAAC;AAAA,cAE3D,cACC,8CAAC,UAAK,OAAO,EAAE,YAAY,IAAI,GAC5B;AAAA,6BAAa,aAAa,WAAW;AAAA,gBAAE;AAAA,iBAC1C;AAAA,cAGD,YACC,8CAAC,UAAK,OAAO,EAAE,OAAO,OAAO,QAAQ,GAAG;AAAA;AAAA,gBACnC,YAAY,SAAS,QAAQ,CAAC;AAAA,gBAAE;AAAA,iBACrC;AAAA,cAGD,iBAAiB,aAAa,kBAAmB,KAChD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,iBAAiB,OAAO;AAAA,oBACxB,OAAO,OAAO;AAAA,oBACd,YAAY;AAAA,kBACd;AAAA,kBACD;AAAA;AAAA,oBACK,aAAa,aAAa,eAAgB;AAAA;AAAA;AAAA,cAChD;AAAA,cAGF,6CAAC,UAAK,OAAO,EAAE,OAAO,OAAO,SAAS,UAAU,OAAO,GACpD,qBAAW,WAAM,UACpB;AAAA;AAAA;AAAA,QACF;AAAA,QAGC,YACC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,SAAS;AAAA,cACT,iBAAiB,OAAO;AAAA,cACxB,OAAO,OAAO;AAAA,cACd,QAAQ,aAAa,OAAO,MAAM;AAAA,cAClC,cAAc;AAAA,cACd,WAAW;AAAA,cACX,OAAO;AAAA,YACT;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,gBAAgB;AAAA,oBAChB,YAAY;AAAA,oBACZ,cAAc;AAAA,oBACd,eAAe;AAAA,oBACf,cAAc,aAAa,OAAO,MAAM;AAAA,kBAC1C;AAAA,kBAEA;AAAA,iEAAC,UAAK,gCAAkB;AAAA,oBACxB,8CAAC,UAAK,OAAO,EAAE,OAAO,OAAO,QAAQ,GAAI;AAAA;AAAA,sBAAU;AAAA,uBAAM;AAAA;AAAA;AAAA,cAC3D;AAAA,cAEA,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,UAAU,OAAO,GACnF;AAAA,8DAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,gBAAgB,GAC7D;AAAA,+DAAC,UAAK,OAAO,EAAE,OAAO,OAAO,QAAQ,GAAG,2BAAa;AAAA,kBACrD,6CAAC,UAAM,uBAAa,YAAY,eAAe,GAAE;AAAA,mBACnD;AAAA,gBAEA,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,gBAAgB,GAC7D;AAAA,+DAAC,UAAK,OAAO,EAAE,OAAO,OAAO,QAAQ,GAAG,4BAAc;AAAA,kBACtD,6CAAC,UAAM,uBAAa,aAAa,eAAe,GAAE;AAAA,mBACpD;AAAA,gBAEC,aAAa,kBAAmB,KAC/B,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,OAAO,OAAO,cAAc,GAC1F;AAAA,+DAAC,UAAK,wCAAmB;AAAA,kBACzB,6CAAC,UAAM,uBAAa,gBAAiB,eAAe,GAAE;AAAA,mBACxD;AAAA,gBAGD,aAAa,eAAgB,KAC5B,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,OAAO,UAAU,GAC/E;AAAA,+DAAC,UAAK,mCAAgB;AAAA,kBACtB,6CAAC,UAAM,uBAAa,aAAc,eAAe,GAAE;AAAA,mBACrD;AAAA,gBAGF;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,gBAAgB;AAAA,sBAChB,YAAY;AAAA,sBACZ,WAAW;AAAA,sBACX,YAAY;AAAA,sBACZ,WAAW,aAAa,OAAO,MAAM;AAAA,oBACvC;AAAA,oBAEA;AAAA,mEAAC,UAAK,2BAAa;AAAA,sBACnB,8CAAC,UAAK;AAAA;AAAA,wBAAE,YAAY,SAAS,QAAQ,CAAC;AAAA,wBAAE;AAAA,wBAAE,YAAY;AAAA,yBAAS;AAAA;AAAA;AAAA,gBACjE;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACxJM,IAAAC,sBAAA;AAjCC,IAAM,oBAAsD,CAAC;AAAA,EAClE,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,cAAc,YAAY,IAAI,gBAAgB;AAEtD,QAAM,eAAe,CAAC,QAAgB;AACpC,QAAI,OAAO,IAAW,SAAQ,MAAM,KAAW,QAAQ,CAAC,IAAI;AAC5D,QAAI,OAAO,IAAO,SAAQ,MAAM,KAAO,QAAQ,CAAC,IAAI;AACpD,WAAO,IAAI,SAAS;AAAA,EACtB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YACE;AAAA,QACF,GAAG;AAAA,MACL;AAAA,MAEA;AAAA,qDAAC,UAAK,oBAAC;AAAA,QACN,cAAc,8CAAC,UAAM;AAAA,uBAAa,aAAa,WAAW;AAAA,UAAE;AAAA,WAAI;AAAA,QAChE,YAAY,8CAAC,UAAK;AAAA;AAAA,UAAG,YAAY,SAAS,QAAQ,CAAC;AAAA,UAAE;AAAA,WAAC;AAAA;AAAA;AAAA,EACzD;AAEJ;;;AC3CA,IAAAC,gBAAgC;AAuB9B,IAAAC,sBAAA;AADF,IAAM,iBAAiB,MACrB,8CAAC,SAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAC9D;AAAA,+CAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,aAAY,KAAI;AAAA,EAChE,6CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,aAAY,KAAI;AAAA,GACvD;AAGF,IAAM,kBAAkB,MACtB,6CAAC,SAAI,WAAU,eAAc,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAClE,uDAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAY,KAAI,GAAE,kMAAiM,GACxQ;AAGF,IAAM,UAAU,MACd,6CAAC,SAAI,WAAU,eAAc,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAClE,uDAAC,aAAQ,QAAO,0CAAyC,aAAY,KAAI,gBAAe,SAAQ,GAClG;AAGF,IAAM,YAAY,MAChB,8CAAC,SAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAC9D;AAAA,+CAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,aAAY,KAAI,eAAc,SAAQ;AAAA,EAC1E,6CAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,aAAY,KAAI,eAAc,SAAQ;AAAA,GAC5E;AAGF,IAAM,YAAY,MAChB,6CAAC,SAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAC9D,uDAAC,cAAS,QAAO,kBAAiB,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,GACjG;AAGF,IAAM,iBAAiB,MACrB,8CAAC,SAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAC9D;AAAA,+CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,aAAY,KAAI,eAAc,SAAQ;AAAA,EAC3E,6CAAC,cAAS,QAAO,oBAAmB,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ;AAAA,GACnG;AAMK,IAAM,oBAAsD,CAAC;AAAA,EAClE;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AACb,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,CAAC,cAAc,eAAe,QAAI,wBAA4B,SAAS;AAE7E,QAAM,YAAY,mBAAmB,SAAY,iBAAiB,QAAQ,MAAM;AAEhF,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,wBAAwB,YAAY;AACxC,eAAW,IAAI;AACf,QAAI,QAAQ,aAAa;AACvB,aAAO,SAAS,OAAO,OAAO;AAC9B;AAAA,IACF;AAEA,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAC5C,eAAW,KAAK;AAChB,oBAAgB,IAAI;AAEpB,eAAW,MAAM;AACf,sBAAgB,KAAK;AACrB,UAAI,UAAW,WAAU;AACzB,UAAI,QAAS,SAAQ;AAAA,IACvB,GAAG,IAAI;AAAA,EACT;AAEA,QAAM,UAAU,UAAU;AAE1B,SACE,6CAAC,SAAI,WAAU,4HACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,yFACT,UAAU,6CAA6C,0CACzD;AAAA,MAGA;AAAA,qDAAC,SAAI,WAAU,+EAA8E;AAAA,QAG5F,WACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YAEV,uDAAC,aAAU;AAAA;AAAA,QACb;AAAA,QAGF,8CAAC,SAAI,WAAU,iBAEb;AAAA,wDAAC,SAAI,WAAU,2BACb;AAAA,yDAAC,SAAI,WAAU,0HACb,uDAAC,kBAAe,GAClB;AAAA,YACA,8CAAC,SACC;AAAA,4DAAC,SAAI,WAAU,2BACb;AAAA,6DAAC,QAAG,WAAU,sCACX,kBAAQ,WAAW,kBAAkB,wBAAwB,uBAChE;AAAA,gBACC,YACC,6CAAC,UAAK,WAAU,+GAA8G,4BAE9H;AAAA,iBAEJ;AAAA,cACA,6CAAC,OAAE,WAAU,iCACV,kBAAQ,WAAW,wDACtB;AAAA,eACF;AAAA,aACF;AAAA,WAGE,QAAQ,cAAc,QAAQ,YAC9B;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,mEACT,UAAU,iCAAiC,+BAC7C;AAAA,cAEA;AAAA,8DAAC,SACC;AAAA,+DAAC,UAAK,WAAU,kBAAiB,6BAAe;AAAA,kBAAQ;AAAA,kBACxD,6CAAC,YAAO,WAAU,gCACf,iBAAO,YAAY,eAAe,KAAK,GAC1C;AAAA,mBACF;AAAA,gBACA,8CAAC,SACC;AAAA,+DAAC,UAAK,WAAU,kBAAiB,mBAAK;AAAA,kBAAQ;AAAA,kBAC9C,8CAAC,YAAO,WAAU,iCAAgC;AAAA;AAAA,oBAC9C,OAAO,SAAS,QAAQ,CAAC,KAAK;AAAA,oBAAS;AAAA,qBAC3C;AAAA,mBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAIF,8CAAC,SAAI,WAAU,aACb;AAAA,yDAAC,WAAM,WAAU,iEAAgE,kCAEjF;AAAA,YAEA,8CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,gBAAgB,SAAS;AAAA,kBACxC,WAAW,uDACT,iBAAiB,YACb,gEACA,UACA,qDACA,kCACN;AAAA,kBAEA;AAAA,iEAAC,SAAI,WAAU,oCAAmC,0BAAY;AAAA,oBAC9D,6CAAC,SAAI,WAAU,qCAAoC,4BAAc;AAAA;AAAA;AAAA,cACnE;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,gBAAgB,KAAK;AAAA,kBACpC,WAAW,uDACT,iBAAiB,QACb,gEACA,UACA,qDACA,kCACN;AAAA,kBAEA;AAAA,iEAAC,SAAI,WAAU,oCAAmC,wBAAU;AAAA,oBAC5D,6CAAC,SAAI,WAAU,qCAAoC,4BAAc;AAAA;AAAA;AAAA,cACnE;AAAA,eACF;AAAA,aACF;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,UAAU,WAAW;AAAA,cACrB,WAAU;AAAA,cAET,oBACC,6CAAC,UAAK,mDAAqC,IACzC,eACF,8CAAC,UAAK,WAAU,4DACd;AAAA,6DAAC,aAAU;AAAA,gBAAE;AAAA,iBACf,IAEA,8CAAC,UAAK,WAAU,6BACd;AAAA,6DAAC,UAAK,kCAAoB;AAAA,gBAC1B,6CAAC,kBAAe;AAAA,iBAClB;AAAA;AAAA,UAEJ;AAAA,UAGA,8CAAC,SAAI,WAAU,oGACb;AAAA,0DAAC,SAAI,WAAU,2BACb;AAAA,2DAAC,mBAAgB;AAAA,cACjB,6CAAC,UAAK,oCAAsB;AAAA,eAC9B;AAAA,YACA,8CAAC,SAAI,WAAU,2BACb;AAAA,2DAAC,WAAQ;AAAA,cACT,6CAAC,UAAK,oCAAsB;AAAA,eAC9B;AAAA,aACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":["import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
|