vibezcheck 0.1.0 → 0.2.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.
@@ -0,0 +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"]}