vibezcheck 0.4.2 → 0.5.3

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.
Files changed (80) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +249 -273
  3. package/bin/vibezcheck.js +4 -4
  4. package/dist/ai-sdk/index.d.mts +28 -59
  5. package/dist/ai-sdk/index.d.ts +28 -59
  6. package/dist/ai-sdk/index.js +307 -69
  7. package/dist/ai-sdk/index.js.map +1 -1
  8. package/dist/ai-sdk/index.mjs +307 -69
  9. package/dist/ai-sdk/index.mjs.map +1 -1
  10. package/dist/ai-sdk/middleware.d.mts +15 -0
  11. package/dist/ai-sdk/middleware.d.ts +15 -0
  12. package/dist/ai-sdk/middleware.js +1433 -0
  13. package/dist/ai-sdk/middleware.js.map +1 -0
  14. package/dist/ai-sdk/middleware.mjs +1396 -0
  15. package/dist/ai-sdk/middleware.mjs.map +1 -0
  16. package/dist/auth/index.js.map +1 -1
  17. package/dist/auth/index.mjs.map +1 -1
  18. package/dist/billing/index.d.mts +90 -1
  19. package/dist/billing/index.d.ts +90 -1
  20. package/dist/billing/index.js +1542 -2
  21. package/dist/billing/index.js.map +1 -1
  22. package/dist/billing/index.mjs +1537 -1
  23. package/dist/billing/index.mjs.map +1 -1
  24. package/dist/cli/index.js +59 -7
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/index.mjs +59 -7
  27. package/dist/cli/index.mjs.map +1 -1
  28. package/dist/{client-ynfWcHX6.d.ts → client-BORmJy8s.d.ts} +1 -1
  29. package/dist/{client-w_hWhQ6g.d.mts → client-CbuXmoXz.d.mts} +1 -1
  30. package/dist/compat/stripe-meter.d.mts +21 -0
  31. package/dist/compat/stripe-meter.d.ts +21 -0
  32. package/dist/compat/stripe-meter.js +1451 -0
  33. package/dist/compat/stripe-meter.js.map +1 -0
  34. package/dist/compat/stripe-meter.mjs +1414 -0
  35. package/dist/compat/stripe-meter.mjs.map +1 -0
  36. package/dist/compat/stripe-provider.d.mts +34 -0
  37. package/dist/compat/stripe-provider.d.ts +34 -0
  38. package/dist/compat/stripe-provider.js +1620 -0
  39. package/dist/compat/stripe-provider.js.map +1 -0
  40. package/dist/compat/stripe-provider.mjs +1587 -0
  41. package/dist/compat/stripe-provider.mjs.map +1 -0
  42. package/dist/compat/token-meter.d.mts +28 -0
  43. package/dist/compat/token-meter.d.ts +28 -0
  44. package/dist/compat/token-meter.js +1320 -0
  45. package/dist/compat/token-meter.js.map +1 -0
  46. package/dist/compat/token-meter.mjs +1283 -0
  47. package/dist/compat/token-meter.mjs.map +1 -0
  48. package/dist/customers/index.d.mts +1 -1
  49. package/dist/customers/index.d.ts +1 -1
  50. package/dist/customers/index.js.map +1 -1
  51. package/dist/customers/index.mjs.map +1 -1
  52. package/dist/index.d.mts +25 -11
  53. package/dist/index.d.ts +25 -11
  54. package/dist/index.js +810 -72
  55. package/dist/index.js.map +1 -1
  56. package/dist/index.mjs +798 -72
  57. package/dist/index.mjs.map +1 -1
  58. package/dist/meter/index.d.mts +2 -2
  59. package/dist/meter/index.d.ts +2 -2
  60. package/dist/meter/index.js +176 -42
  61. package/dist/meter/index.js.map +1 -1
  62. package/dist/meter/index.mjs +176 -42
  63. package/dist/meter/index.mjs.map +1 -1
  64. package/dist/pricing/index.d.mts +15 -4
  65. package/dist/pricing/index.d.ts +15 -4
  66. package/dist/pricing/index.js +165 -29
  67. package/dist/pricing/index.js.map +1 -1
  68. package/dist/pricing/index.mjs +164 -29
  69. package/dist/pricing/index.mjs.map +1 -1
  70. package/dist/react/index.d.mts +46 -2
  71. package/dist/react/index.d.ts +46 -2
  72. package/dist/react/index.js +471 -29
  73. package/dist/react/index.js.map +1 -1
  74. package/dist/react/index.mjs +469 -29
  75. package/dist/react/index.mjs.map +1 -1
  76. package/dist/{types-Mozk4-Mr.d.mts → types-6P71CXAD.d.mts} +16 -6
  77. package/dist/{types-Mozk4-Mr.d.ts → types-6P71CXAD.d.ts} +16 -6
  78. package/dist/with-billing-Bj6Ya_Iy.d.ts +49 -0
  79. package/dist/with-billing-DndWGxL8.d.mts +49 -0
  80. package/package.json +35 -10
@@ -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","../../src/react/receipt.tsx","../../src/react/billing-modal.tsx"],"sourcesContent":["export * from './types';\nexport * from './context';\nexport * from './hooks';\nexport * from './widget';\nexport * from './badge';\nexport * from './receipt';\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, InlineRateConfig, ModelPricingRates } 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 minimumChargeUSD?: number;\n customRate?: InlineRateConfig;\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 let rates: ModelPricingRates;\n\n if (params.customRate) {\n const outRate = params.customRate.out ?? params.customRate.output ?? 0;\n rates = {\n inputPer1M: params.customRate.in,\n outputPer1M: outRate,\n reasoningPer1M: params.customRate.reasoning ?? outRate,\n cachedInputPer1M: params.customRate.cached ?? params.customRate.in * 0.15,\n currency: 'USD',\n };\n } else {\n rates = getModelPricing(params.model);\n }\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.15; // 85% discount default for cached\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 let totalUSD = inputCostUSD + outputCostUSD;\n\n // Retail price calculation (if markup multiplier provided)\n const markup = params.markupMultiplier ?? 1.0;\n let retailUSD: number | undefined = undefined;\n\n if (markup !== 1.0 || params.minimumChargeUSD !== undefined) {\n retailUSD = totalUSD * markup;\n if (params.minimumChargeUSD !== undefined && retailUSD < params.minimumChargeUSD) {\n retailUSD = params.minimumChargeUSD;\n }\n }\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 !== undefined ? 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 optionsOrMarkup?: number | { markupMultiplier?: number; minimumChargeUSD?: number; customRate?: InlineRateConfig }\n): InferenceCost {\n const options =\n typeof optionsOrMarkup === 'number'\n ? { markupMultiplier: optionsOrMarkup }\n : optionsOrMarkup || {};\n\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: options.markupMultiplier,\n minimumChargeUSD: options.minimumChargeUSD,\n customRate: options.customRate,\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 from 'react';\n\nexport interface VibezReceiptProps {\n /** Chat message object from Vercel AI SDK or custom chat state */\n message?: {\n id?: string;\n role?: string;\n content?: string;\n annotations?: any[];\n [key: string]: any;\n };\n /** Explicit model name override */\n model?: string;\n /** Explicit total tokens override */\n tokens?: number;\n /** Explicit reasoning tokens override */\n reasoningTokens?: number;\n /** Explicit cost in USD override */\n costUSD?: number;\n /** Latency in milliseconds */\n latencyMs?: number;\n /** Style variant */\n variant?: 'minimal' | 'pill' | 'card';\n /** Custom CSS class names */\n className?: string;\n}\n\nexport const VibezReceipt: React.FC<VibezReceiptProps> = ({\n message,\n model = 'ai-model',\n tokens,\n reasoningTokens,\n costUSD,\n latencyMs,\n variant = 'minimal',\n className = '',\n}) => {\n // Extract usage/cost data from message annotations or meta if available\n let resolvedTokens = tokens;\n let resolvedReasoning = reasoningTokens;\n let resolvedCost = costUSD;\n let resolvedModel = model;\n let resolvedLatency = latencyMs;\n\n if (message?.annotations && Array.isArray(message.annotations)) {\n for (const ann of message.annotations) {\n if (ann && typeof ann === 'object') {\n if (ann.type === 'vibezcheck' || ann.usage || ann.cost) {\n resolvedTokens = resolvedTokens ?? ann.usage?.totalTokens;\n resolvedReasoning = resolvedReasoning ?? ann.usage?.reasoningTokens;\n resolvedCost = resolvedCost ?? ann.cost?.totalUSD ?? ann.cost;\n resolvedModel = resolvedModel === 'ai-model' ? (ann.model || resolvedModel) : resolvedModel;\n resolvedLatency = resolvedLatency ?? ann.latencyMs;\n }\n }\n }\n }\n\n // Format token numbers cleanly (e.g. 1,420 or 12.4k)\n const formatTokens = (num?: number) => {\n if (num === undefined) return null;\n if (num >= 10000) return `${(num / 1000).toFixed(1)}k tokens`;\n return `${num.toLocaleString()} tokens`;\n };\n\n // Format cost cleanly (e.g. $0.00021)\n const formatCost = (cost?: number) => {\n if (cost === undefined) return null;\n if (cost < 0.0001) return `<$0.0001`;\n if (cost < 0.01) return `$${cost.toFixed(4)}`;\n return `$${cost.toFixed(3)}`;\n };\n\n // Shorten model identifier (e.g. 'openai/gpt-4o-mini' -> 'gpt-4o-mini')\n const cleanModel = resolvedModel.includes('/') ? resolvedModel.split('/')[1] : resolvedModel;\n\n return (\n <div\n className={`inline-flex items-center gap-2 py-1 px-2.5 rounded-lg text-[11px] font-mono select-none transition-colors duration-150 ${\n variant === 'pill'\n ? 'bg-slate-900 text-slate-200 border border-slate-800 shadow-xs'\n : variant === 'card'\n ? 'bg-cream-50 text-slate-700 border border-slate-200/80 shadow-2xs'\n : 'bg-slate-50 hover:bg-slate-100/80 text-slate-600 border border-slate-200/70'\n } ${className}`}\n >\n {/* Electric Lime Sparkle Icon */}\n <div className=\"flex items-center justify-center shrink-0\">\n <svg\n className=\"h-3 w-3 text-lime-500\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n <circle cx=\"12\" cy=\"12\" r=\"2.5\" fill=\"#D4FF32\" />\n </svg>\n </div>\n\n {/* Model Name */}\n <span className=\"font-semibold text-slate-800\">{cleanModel}</span>\n\n {/* Token count */}\n {resolvedTokens !== undefined && (\n <>\n <span className=\"text-slate-300\">•</span>\n <span>{formatTokens(resolvedTokens)}</span>\n </>\n )}\n\n {/* Reasoning tokens indicator if applicable */}\n {resolvedReasoning !== undefined && resolvedReasoning > 0 && (\n <>\n <span className=\"text-slate-300\">•</span>\n <span className=\"text-stripe-indigo font-medium\">{resolvedReasoning} thought tokens</span>\n </>\n )}\n\n {/* Cost in USD */}\n {resolvedCost !== undefined && (\n <>\n <span className=\"text-slate-300\">•</span>\n <span className=\"text-emerald-600 font-semibold\">{formatCost(resolvedCost)}</span>\n </>\n )}\n\n {/* Latency if supplied */}\n {resolvedLatency !== undefined && (\n <>\n <span className=\"text-slate-300\">•</span>\n <span className=\"text-slate-400\">{resolvedLatency}ms</span>\n </>\n )}\n\n {/* Verified Badge */}\n <span className=\"text-slate-300\">•</span>\n <span className=\"text-[10px] text-slate-400 font-sans font-medium\">Verified by VibezCheck</span>\n </div>\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":"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","names":["import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","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/receipt.tsx","../../src/react/billing-modal.tsx","../../src/react/vibezcheck-ui.tsx"],"sourcesContent":["export * from './types';\nexport * from './context';\nexport * from './hooks';\nexport * from './widget';\nexport * from './badge';\nexport * from './receipt';\nexport * from './billing-modal';\nexport * from './vibezcheck-ui';\n","import React, { createContext, useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type {\r\n SessionState,\r\n SessionTurnRecord,\r\n VibezSessionProviderProps,\r\n VibezSessionContextValue,\r\n} from './types';\r\nimport type { TokenUsage, InferenceCost } from '../types';\r\nimport { calculateUsageCost } from '../pricing/calculator';\r\n\r\nconst INITIAL_USAGE: TokenUsage = {\r\n inputTokens: 0,\r\n outputTokens: 0,\r\n totalTokens: 0,\r\n reasoningTokens: 0,\r\n visibleOutputTokens: 0,\r\n cachedTokens: 0,\r\n};\r\n\r\nconst INITIAL_COST: InferenceCost = {\r\n inputCostUSD: 0,\r\n outputCostUSD: 0,\r\n reasoningCostUSD: 0,\r\n cachedDiscountUSD: 0,\r\n totalUSD: 0,\r\n currency: 'USD',\r\n};\r\n\r\nexport const VibezSessionContext = createContext<VibezSessionContextValue | null>(null);\r\n\r\nfunction generateId(): string {\r\n return 'sess_' + Math.random().toString(36).substring(2, 11) + '_' + Date.now().toString(36);\r\n}\r\n\r\nexport const VibezSessionProvider: React.FC<VibezSessionProviderProps> = ({\r\n children,\r\n sessionId: customSessionId,\r\n persist = 'memory',\r\n storage,\r\n storageKey = 'vibez_session_',\r\n markupMultiplier,\r\n onTurnRecorded,\r\n}) => {\r\n const [sessionId, setSessionId] = useState<string>(() => customSessionId || generateId());\r\n const [turnCount, setTurnCount] = useState<number>(0);\r\n const [sessionUsage, setSessionUsage] = useState<TokenUsage>(INITIAL_USAGE);\r\n const [sessionCost, setSessionCost] = useState<InferenceCost>(INITIAL_COST);\r\n const [byModel, setByModel] = useState<SessionState['byModel']>({});\r\n const [history, setHistory] = useState<SessionTurnRecord[]>([]);\r\n\r\n const fullStorageKey = useMemo(() => `${storageKey}${sessionId}`, [storageKey, sessionId]);\r\n\r\n // 1. Load persisted state on mount (if persist is enabled)\r\n useEffect(() => {\r\n if (persist === 'memory') return;\r\n\r\n try {\r\n if (persist === 'sessionStorage' && typeof window !== 'undefined' && window.sessionStorage) {\r\n const data = window.sessionStorage.getItem(fullStorageKey);\r\n if (data) {\r\n const parsed: SessionState = JSON.parse(data);\r\n setTurnCount(parsed.turnCount);\r\n setSessionUsage(parsed.sessionUsage);\r\n setSessionCost(parsed.sessionCost);\r\n setByModel(parsed.byModel);\r\n setHistory(parsed.history);\r\n }\r\n } else if (persist === 'localStorage' && typeof window !== 'undefined' && window.localStorage) {\r\n const data = window.localStorage.getItem(fullStorageKey);\r\n if (data) {\r\n const parsed: SessionState = JSON.parse(data);\r\n setTurnCount(parsed.turnCount);\r\n setSessionUsage(parsed.sessionUsage);\r\n setSessionCost(parsed.sessionCost);\r\n setByModel(parsed.byModel);\r\n setHistory(parsed.history);\r\n }\r\n } else if (persist === 'custom' && storage) {\r\n const res = storage.getItem(fullStorageKey);\r\n if (res instanceof Promise) {\r\n res.then((data) => {\r\n if (data) {\r\n const parsed: SessionState = JSON.parse(data);\r\n setTurnCount(parsed.turnCount);\r\n setSessionUsage(parsed.sessionUsage);\r\n setSessionCost(parsed.sessionCost);\r\n setByModel(parsed.byModel);\r\n setHistory(parsed.history);\r\n }\r\n });\r\n } else if (res) {\r\n const parsed: SessionState = JSON.parse(res);\r\n setTurnCount(parsed.turnCount);\r\n setSessionUsage(parsed.sessionUsage);\r\n setSessionCost(parsed.sessionCost);\r\n setByModel(parsed.byModel);\r\n setHistory(parsed.history);\r\n }\r\n }\r\n } catch {\r\n // Ignore storage parse errors\r\n }\r\n }, [persist, fullStorageKey, storage]);\r\n\r\n // Helper to persist state\r\n const saveState = useCallback(\r\n (newState: SessionState) => {\r\n if (persist === 'memory') return;\r\n\r\n try {\r\n const json = JSON.stringify(newState);\r\n if (persist === 'sessionStorage' && typeof window !== 'undefined' && window.sessionStorage) {\r\n window.sessionStorage.setItem(fullStorageKey, json);\r\n } else if (persist === 'localStorage' && typeof window !== 'undefined' && window.localStorage) {\r\n window.localStorage.setItem(fullStorageKey, json);\r\n } else if (persist === 'custom' && storage) {\r\n storage.setItem(fullStorageKey, json);\r\n }\r\n } catch {\r\n // Ignore storage write errors\r\n }\r\n },\r\n [persist, fullStorageKey, storage]\r\n );\r\n\r\n /**\r\n * Record a completed chat turn and update live session totals\r\n */\r\n const recordTurn = useCallback<VibezSessionContextValue['recordTurn']>(\r\n ({ model, usage: rawUsage, metadata }) => {\r\n const inputTokens = rawUsage.promptTokens ?? rawUsage.inputTokens ?? 0;\r\n const outputTokens = rawUsage.completionTokens ?? rawUsage.outputTokens ?? 0;\r\n const reasoningTokens =\r\n rawUsage.reasoningTokens ?? rawUsage.completionTokensDetails?.reasoning_tokens ?? 0;\r\n const cachedTokens =\r\n rawUsage.cachedTokens ?? rawUsage.promptTokensDetails?.cached_tokens ?? 0;\r\n const cacheWriteTokens = rawUsage.cacheWriteTokens ?? 0;\r\n\r\n const turnUsage: TokenUsage = {\r\n inputTokens,\r\n outputTokens,\r\n totalTokens: rawUsage.totalTokens ?? inputTokens + outputTokens,\r\n reasoningTokens: reasoningTokens > 0 ? reasoningTokens : undefined,\r\n visibleOutputTokens: Math.max(0, outputTokens - reasoningTokens),\r\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\r\n cacheWriteTokens: cacheWriteTokens > 0 ? cacheWriteTokens : undefined,\r\n };\r\n\r\n const turnCost = calculateUsageCost(model, turnUsage, markupMultiplier);\r\n\r\n const record: SessionTurnRecord = {\r\n id: 'turn_' + Math.random().toString(36).substring(2, 9) + '_' + Date.now().toString(36),\r\n timestamp: new Date().toISOString(),\r\n model,\r\n usage: turnUsage,\r\n cost: turnCost,\r\n metadata,\r\n };\r\n\r\n // 1. Update Turn Count\r\n const newTurnCount = turnCount + 1;\r\n setTurnCount(newTurnCount);\r\n\r\n // 2. Update Aggregated Session Usage\r\n const newUsage: TokenUsage = {\r\n inputTokens: sessionUsage.inputTokens + inputTokens,\r\n outputTokens: sessionUsage.outputTokens + outputTokens,\r\n totalTokens: sessionUsage.totalTokens + turnUsage.totalTokens,\r\n reasoningTokens: (sessionUsage.reasoningTokens ?? 0) + (turnUsage.reasoningTokens ?? 0),\r\n visibleOutputTokens:\r\n (sessionUsage.visibleOutputTokens ?? 0) + (turnUsage.visibleOutputTokens ?? outputTokens),\r\n cachedTokens: (sessionUsage.cachedTokens ?? 0) + (turnUsage.cachedTokens ?? 0),\r\n cacheWriteTokens: (sessionUsage.cacheWriteTokens ?? 0) + (turnUsage.cacheWriteTokens ?? 0),\r\n };\r\n setSessionUsage(newUsage);\r\n\r\n // 3. Update Aggregated Session Cost\r\n const newCost: InferenceCost = {\r\n inputCostUSD: Number((sessionCost.inputCostUSD + turnCost.inputCostUSD).toFixed(6)),\r\n outputCostUSD: Number((sessionCost.outputCostUSD + turnCost.outputCostUSD).toFixed(6)),\r\n reasoningCostUSD:\r\n turnCost.reasoningCostUSD !== undefined || sessionCost.reasoningCostUSD !== undefined\r\n ? Number(\r\n (\r\n (sessionCost.reasoningCostUSD ?? 0) + (turnCost.reasoningCostUSD ?? 0)\r\n ).toFixed(6)\r\n )\r\n : undefined,\r\n cachedDiscountUSD:\r\n turnCost.cachedDiscountUSD !== undefined || sessionCost.cachedDiscountUSD !== undefined\r\n ? Number(\r\n (\r\n (sessionCost.cachedDiscountUSD ?? 0) + (turnCost.cachedDiscountUSD ?? 0)\r\n ).toFixed(6)\r\n )\r\n : undefined,\r\n totalUSD: Number((sessionCost.totalUSD + turnCost.totalUSD).toFixed(6)),\r\n retailUSD:\r\n turnCost.retailUSD !== undefined || sessionCost.retailUSD !== undefined\r\n ? Number(((sessionCost.retailUSD ?? 0) + (turnCost.retailUSD ?? 0)).toFixed(6))\r\n : undefined,\r\n currency: turnCost.currency || 'USD',\r\n };\r\n setSessionCost(newCost);\r\n\r\n // 4. Update By-Model Breakdown\r\n const prevModelStats = byModel[model] || {\r\n turns: 0,\r\n usage: { ...INITIAL_USAGE },\r\n cost: { ...INITIAL_COST },\r\n };\r\n\r\n const newModelStats = {\r\n turns: prevModelStats.turns + 1,\r\n usage: {\r\n inputTokens: prevModelStats.usage.inputTokens + inputTokens,\r\n outputTokens: prevModelStats.usage.outputTokens + outputTokens,\r\n totalTokens: prevModelStats.usage.totalTokens + turnUsage.totalTokens,\r\n reasoningTokens:\r\n (prevModelStats.usage.reasoningTokens ?? 0) + (turnUsage.reasoningTokens ?? 0),\r\n visibleOutputTokens:\r\n (prevModelStats.usage.visibleOutputTokens ?? 0) +\r\n (turnUsage.visibleOutputTokens ?? outputTokens),\r\n cachedTokens: (prevModelStats.usage.cachedTokens ?? 0) + (turnUsage.cachedTokens ?? 0),\r\n },\r\n cost: {\r\n inputCostUSD: Number(\r\n (prevModelStats.cost.inputCostUSD + turnCost.inputCostUSD).toFixed(6)\r\n ),\r\n outputCostUSD: Number(\r\n (prevModelStats.cost.outputCostUSD + turnCost.outputCostUSD).toFixed(6)\r\n ),\r\n totalUSD: Number((prevModelStats.cost.totalUSD + turnCost.totalUSD).toFixed(6)),\r\n currency: turnCost.currency || 'USD',\r\n },\r\n };\r\n\r\n const newByModel = {\r\n ...byModel,\r\n [model]: newModelStats,\r\n };\r\n setByModel(newByModel);\r\n\r\n // 5. Update History\r\n const newHistory = [...history, record];\r\n setHistory(newHistory);\r\n\r\n const updatedState: SessionState = {\r\n sessionId,\r\n turnCount: newTurnCount,\r\n sessionUsage: newUsage,\r\n sessionCost: newCost,\r\n byModel: newByModel,\r\n history: newHistory,\r\n };\r\n\r\n saveState(updatedState);\r\n\r\n if (onTurnRecorded) {\r\n onTurnRecorded(record, updatedState);\r\n }\r\n\r\n return record;\r\n },\r\n [\r\n turnCount,\r\n sessionUsage,\r\n sessionCost,\r\n byModel,\r\n history,\r\n sessionId,\r\n markupMultiplier,\r\n onTurnRecorded,\r\n saveState,\r\n ]\r\n );\r\n\r\n /**\r\n * Reset session state\r\n */\r\n const resetSession = useCallback(\r\n (newSessionId?: string) => {\r\n const nextId = newSessionId || generateId();\r\n setSessionId(nextId);\r\n setTurnCount(0);\r\n setSessionUsage(INITIAL_USAGE);\r\n setSessionCost(INITIAL_COST);\r\n setByModel({});\r\n setHistory([]);\r\n\r\n if (persist === 'sessionStorage' && typeof window !== 'undefined' && window.sessionStorage) {\r\n window.sessionStorage.removeItem(fullStorageKey);\r\n } else if (\r\n persist === 'localStorage' &&\r\n typeof window !== 'undefined' &&\r\n window.localStorage\r\n ) {\r\n window.localStorage.removeItem(fullStorageKey);\r\n } else if (persist === 'custom' && storage) {\r\n storage.removeItem(fullStorageKey);\r\n }\r\n },\r\n [persist, fullStorageKey, storage]\r\n );\r\n\r\n const value: VibezSessionContextValue = useMemo(\r\n () => ({\r\n sessionId,\r\n turnCount,\r\n sessionUsage,\r\n sessionCost,\r\n byModel,\r\n history,\r\n recordTurn,\r\n resetSession,\r\n }),\r\n [sessionId, turnCount, sessionUsage, sessionCost, byModel, history, recordTurn, resetSession]\r\n );\r\n\r\n return <VibezSessionContext.Provider value={value}>{children}</VibezSessionContext.Provider>;\r\n};\r\n","import type { ModelPricingRates } from '../types';\r\n\r\n/**\r\n * Built-in Registry of Model Pricing (USD per 1 Million Tokens)\r\n * Sourced from official 2026 provider pricing tables.\r\n */\r\nexport const MODEL_PRICING_TABLE: Record<string, ModelPricingRates> = {\r\n // --- OpenAI (Modern & Reasoning) ---\r\n 'gpt-5.6-sol': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\r\n 'gpt-5.6-terra': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.2 },\r\n 'gpt-5.6-luna': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\r\n 'gpt-5': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\r\n 'gpt-5-mini': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\r\n 'o1': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\r\n 'o1-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\r\n 'o3': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\r\n 'o3-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\r\n 'gpt-4o': { inputPer1M: 2.5, outputPer1M: 10.0, cachedInputPer1M: 1.25 },\r\n 'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.075 },\r\n 'gpt-4.5': { inputPer1M: 75.0, outputPer1M: 150.0, cachedInputPer1M: 37.5 },\r\n 'gpt-4.5-preview': { inputPer1M: 75.0, outputPer1M: 150.0, cachedInputPer1M: 37.5 },\r\n 'chatgpt-4o-latest': { inputPer1M: 5.0, outputPer1M: 15.0 },\r\n 'gpt-4.1': { inputPer1M: 2.0, outputPer1M: 8.0, cachedInputPer1M: 1.0 },\r\n 'gpt-4.1-nano': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.05 },\r\n\r\n // --- OpenAI (Legacy & Backward Compatibility) ---\r\n 'gpt-4-turbo': { inputPer1M: 10.0, outputPer1M: 30.0, cachedInputPer1M: 5.0 },\r\n 'gpt-4-turbo-preview': { inputPer1M: 10.0, outputPer1M: 30.0, cachedInputPer1M: 5.0 },\r\n 'gpt-4': { inputPer1M: 30.0, outputPer1M: 60.0 },\r\n 'gpt-4-32k': { inputPer1M: 60.0, outputPer1M: 120.0 },\r\n 'gpt-3.5-turbo': { inputPer1M: 0.5, outputPer1M: 1.5 },\r\n 'gpt-3.5-turbo-16k': { inputPer1M: 3.0, outputPer1M: 4.0 },\r\n 'text-embedding-3-small': { inputPer1M: 0.02, outputPer1M: 0.0 },\r\n 'text-embedding-3-large': { inputPer1M: 0.13, outputPer1M: 0.0 },\r\n 'text-embedding-ada-002': { inputPer1M: 0.10, outputPer1M: 0.0 },\r\n\r\n // --- Anthropic (Modern & Extended Thinking) ---\r\n 'claude-3-7-sonnet': { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },\r\n 'claude-sonnet-5': { inputPer1M: 2.0, outputPer1M: 10.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-5-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-5-haiku': { inputPer1M: 0.8, outputPer1M: 4.0, cachedInputPer1M: 0.08 },\r\n 'haiku-4.5': { inputPer1M: 1.0, outputPer1M: 5.0, cachedInputPer1M: 0.1 },\r\n 'claude-opus-5': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 1.5 },\r\n 'claude-3-opus': { inputPer1M: 15.0, outputPer1M: 75.0, cachedInputPer1M: 1.5 },\r\n\r\n // --- Anthropic (Legacy & Backward Compatibility) ---\r\n 'claude-3-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-haiku': { inputPer1M: 0.25, outputPer1M: 1.25, cachedInputPer1M: 0.025 },\r\n 'claude-2.1': { inputPer1M: 8.0, outputPer1M: 24.0 },\r\n 'claude-2.0': { inputPer1M: 8.0, outputPer1M: 24.0 },\r\n 'claude-instant-1.2': { inputPer1M: 1.63, outputPer1M: 5.51 },\r\n\r\n // --- Google Gemini (Modern & Thoughts) ---\r\n 'gemini-3.7-flash': { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },\r\n 'gemini-3.1-pro': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.5 },\r\n 'gemini-3.5-flash': { inputPer1M: 1.5, outputPer1M: 9.0, cachedInputPer1M: 0.38 },\r\n 'gemini-3.1-flash-lite': { inputPer1M: 0.25, outputPer1M: 1.5, cachedInputPer1M: 0.06 },\r\n 'gemini-2.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n 'gemini-2.5-flash': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.0375 },\r\n 'gemini-2.0-flash': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.025 },\r\n 'gemini-2.0-flash-lite': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\r\n 'gemini-2.0-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n\r\n // --- Google Gemini (Legacy & Backward Compatibility) ---\r\n 'gemini-1.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n 'gemini-1.5-flash': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\r\n 'gemini-1.5-flash-8b': { inputPer1M: 0.0375, outputPer1M: 0.15, cachedInputPer1M: 0.009375 },\r\n 'gemini-1.0-pro': { inputPer1M: 0.5, outputPer1M: 1.5 },\r\n\r\n // --- xAI Grok ---\r\n 'grok-4.6': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'grok-3': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'grok-3-mini': { inputPer1M: 0.3, outputPer1M: 1.5 },\r\n 'grok-2': { inputPer1M: 2.0, outputPer1M: 10.0 },\r\n 'grok-2-vision': { inputPer1M: 2.0, outputPer1M: 10.0 },\r\n 'grok-beta': { inputPer1M: 5.0, outputPer1M: 15.0 },\r\n\r\n // --- Mistral ---\r\n 'mistral-large-3': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'mistral-large-latest': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'mistral-large-2411': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'codestral-latest': { inputPer1M: 0.3, outputPer1M: 0.9 },\r\n 'mistral-medium-latest': { inputPer1M: 2.7, outputPer1M: 8.1 },\r\n 'mistral-small-latest': { inputPer1M: 0.2, outputPer1M: 0.6 },\r\n 'ministral-8b-latest': { inputPer1M: 0.1, outputPer1M: 0.1 },\r\n 'ministral-3b-latest': { inputPer1M: 0.04, outputPer1M: 0.04 },\r\n 'open-mistral-7b': { inputPer1M: 0.2, outputPer1M: 0.2 },\r\n 'open-mixtral-8x7b': { inputPer1M: 0.7, outputPer1M: 0.7 },\r\n 'open-mixtral-8x22b': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n\r\n // --- Groq & Meta Llama LPUs ---\r\n 'llama-3.3-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\r\n 'llama-3.1-405b': { inputPer1M: 3.0, outputPer1M: 3.0 },\r\n 'llama-3.1-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\r\n 'llama-3.1-8b-instant': { inputPer1M: 0.05, outputPer1M: 0.08 },\r\n 'llama-3.2-1b-preview': { inputPer1M: 0.04, outputPer1M: 0.04 },\r\n 'llama-3.2-3b-preview': { inputPer1M: 0.06, outputPer1M: 0.06 },\r\n 'llama-3.2-11b-vision': { inputPer1M: 0.18, outputPer1M: 0.18 },\r\n 'llama-3.2-90b-vision': { inputPer1M: 0.90, outputPer1M: 0.90 },\r\n 'deepseek-r1-distill-llama-70b': { inputPer1M: 0.75, outputPer1M: 0.99 },\r\n 'deepseek-r1-distill-qwen-32b': { inputPer1M: 0.49, outputPer1M: 0.49 },\r\n 'qwen-2.5-32b': { inputPer1M: 0.29, outputPer1M: 0.39 },\r\n 'qwen-2.5-72b': { inputPer1M: 0.35, outputPer1M: 0.40 },\r\n 'mixtral-8x7b-32768': { inputPer1M: 0.24, outputPer1M: 0.24 },\r\n 'gemma2-9b-it': { inputPer1M: 0.20, outputPer1M: 0.20 },\r\n\r\n // --- DeepSeek ---\r\n 'deepseek-v4-pro': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\r\n 'deepseek-v4-flash': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\r\n 'deepseek-v3': { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },\r\n 'deepseek-chat': { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },\r\n 'deepseek-r1': { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },\r\n 'deepseek-reasoner': { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },\r\n\r\n // --- Cohere ---\r\n 'command-r-plus': { inputPer1M: 2.5, outputPer1M: 10.0 },\r\n 'command-r': { inputPer1M: 0.15, outputPer1M: 0.6 },\r\n 'command': { inputPer1M: 1.0, outputPer1M: 2.0 },\r\n 'command-light': { inputPer1M: 0.3, outputPer1M: 0.6 },\r\n 'embed-english-v3.0': { inputPer1M: 0.10, outputPer1M: 0.0 },\r\n\r\n // --- Perplexity ---\r\n 'sonar': { inputPer1M: 1.0, outputPer1M: 1.0 },\r\n 'sonar-pro': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'sonar-reasoning': { inputPer1M: 1.0, outputPer1M: 5.0 },\r\n 'sonar-reasoning-pro': { inputPer1M: 2.0, outputPer1M: 8.0 },\r\n};\r\n\r\n/**\r\n * Common model alias map to normalize nicknames, shorthands, and legacy IDs\r\n */\r\nexport const MODEL_ALIASES: Record<string, string> = {\r\n // OpenAI Shorthands & Aliases\r\n 'gpt4': 'gpt-4',\r\n 'gpt4o': 'gpt-4o',\r\n 'gpt-4-preview': 'gpt-4-turbo',\r\n 'gpt-4-0125-preview': 'gpt-4-turbo',\r\n 'gpt-4-1106-preview': 'gpt-4-turbo',\r\n 'gpt-3.5': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-0125': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-1106': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-16k-0613': 'gpt-3.5-turbo-16k',\r\n\r\n // Anthropic Shorthands\r\n 'sonnet': 'claude-3-5-sonnet',\r\n 'sonnet-3.7': 'claude-3-7-sonnet',\r\n 'sonnet-3.5': 'claude-3-5-sonnet',\r\n 'haiku': 'claude-3-5-haiku',\r\n 'haiku-3.5': 'claude-3-5-haiku',\r\n 'opus': 'claude-3-opus',\r\n 'claude-2': 'claude-2.0',\r\n 'claude-instant': 'claude-instant-1.2',\r\n\r\n // DeepSeek Shorthands\r\n 'r1': 'deepseek-r1',\r\n 'v3': 'deepseek-v3',\r\n\r\n // Gemini Shorthands\r\n 'flash': 'gemini-2.0-flash',\r\n 'pro': 'gemini-1.5-pro',\r\n\r\n // Meta / Groq Shorthands\r\n 'llama-3.3-70b': 'llama-3.3-70b-versatile',\r\n 'llama-3.1-70b': 'llama-3.1-70b-versatile',\r\n 'llama-3.1-8b': 'llama-3.1-8b-instant',\r\n 'llama-3-70b': 'llama-3.1-70b-versatile',\r\n 'llama-3-8b': 'llama-3.1-8b-instant',\r\n\r\n // Mistral Shorthands\r\n 'codestral': 'codestral-latest',\r\n 'mistral-large': 'mistral-large-latest',\r\n 'mistral-small': 'mistral-small-latest',\r\n};\r\n\r\n/**\r\n * Dynamic in-memory registry allowing runtime custom price registration\r\n */\r\nconst customPricingRegistry: Record<string, ModelPricingRates> = {};\r\n\r\n/**\r\n * Normalize model identifier to match pricing table keys:\r\n * - Strips AWS Bedrock prefixes (e.g. 'anthropic.claude-3-5-sonnet-20241022-v2:0' -> 'claude-3-5-sonnet')\r\n * - Strips provider prefixes (e.g. 'openai/gpt-4o' -> 'gpt-4o', 'deepseek/deepseek-r1' -> 'deepseek-r1')\r\n * - Strips date suffixes (e.g. '-20240307', '-20250219')\r\n * - Resolves shorthands and aliases\r\n */\r\nexport function normalizeModelKey(rawModel: string): string {\r\n if (!rawModel) return 'unknown';\r\n\r\n let model = rawModel.toLowerCase().trim();\r\n\r\n // Strip AWS Bedrock model prefix (e.g. 'us.anthropic.claude-3-5-sonnet...', 'meta.llama3-...')\r\n model = model.replace(/^[a-z0-9_-]+\\.(anthropic|meta|amazon|cohere|mistral|ai21)\\./i, '');\r\n model = model.replace(/^(anthropic|meta|amazon|cohere|mistral|ai21)\\./i, '');\r\n\r\n // Strip AWS Bedrock version suffix (e.g. '-v1:0', '-v2:0', ':0')\r\n model = model.replace(/-v\\d+(:\\d+)?$/, '');\r\n model = model.replace(/:\\d+$/, '');\r\n\r\n // Strip provider prefix if present (e.g. 'openai/gpt-4o' -> 'gpt-4o', 'meta-llama/llama-3.3-70b-instruct' -> 'llama-3.3-70b-instruct')\r\n if (model.includes('/')) {\r\n model = model.split('/').slice(1).join('/');\r\n }\r\n\r\n // Remove trailing version/mode tags (e.g. ':latest', ':free', ':beta')\r\n model = model.replace(/:(latest|free|beta)$/, '');\r\n\r\n // Remove date suffixes like -20240307 or -20250219 or -2024-08-06\r\n model = model.replace(/-\\d{8}$/, '');\r\n model = model.replace(/-\\d{4}-\\d{2}-\\d{2}$/, '');\r\n\r\n // Normalize Bedrock Meta format (e.g. llama3-1-70b -> llama-3.1-70b)\r\n model = model.replace(/llama(\\d+)-(\\d+)-/g, 'llama-$1.$2-');\r\n model = model.replace(/llama(\\d+)\\.(\\d+)-/g, 'llama-$1.$2-');\r\n\r\n // Check aliases before fine-tuning\r\n if (MODEL_ALIASES[model]) {\r\n return MODEL_ALIASES[model];\r\n }\r\n\r\n // Remove common modifier suffixes if not directly matching table\r\n if (!MODEL_PRICING_TABLE[model]) {\r\n const withoutInstruct = model.replace(/-(instruct|chat|preview)$/, '');\r\n if (MODEL_PRICING_TABLE[withoutInstruct]) {\r\n return withoutInstruct;\r\n }\r\n if (MODEL_ALIASES[withoutInstruct]) {\r\n return MODEL_ALIASES[withoutInstruct];\r\n }\r\n }\r\n\r\n return model;\r\n}\r\n\r\n/**\r\n * Retrieve pricing rates for a given model\r\n */\r\nexport function getModelPricing(modelName: string): ModelPricingRates {\r\n const normalized = normalizeModelKey(modelName);\r\n\r\n // Check custom registry first\r\n if (customPricingRegistry[normalized]) {\r\n return customPricingRegistry[normalized];\r\n }\r\n if (customPricingRegistry[modelName]) {\r\n return customPricingRegistry[modelName];\r\n }\r\n\r\n // Check built-in table with normalized key\r\n if (MODEL_PRICING_TABLE[normalized]) {\r\n return MODEL_PRICING_TABLE[normalized];\r\n }\r\n // Check built-in table with direct key\r\n if (MODEL_PRICING_TABLE[modelName]) {\r\n return MODEL_PRICING_TABLE[modelName];\r\n }\r\n\r\n // Check alias table fallback\r\n const alias = MODEL_ALIASES[modelName.toLowerCase().trim()];\r\n if (alias && MODEL_PRICING_TABLE[alias]) {\r\n return MODEL_PRICING_TABLE[alias];\r\n }\r\n\r\n // Fallback defaults for unknown models (conservative estimates: $1.00 in, $3.00 out)\r\n return {\r\n inputPer1M: 1.0,\r\n outputPer1M: 3.0,\r\n cachedInputPer1M: 0.5,\r\n };\r\n}\r\n\r\n/**\r\n * Register or override pricing rates for a custom model\r\n */\r\nexport function registerModelPricing(modelName: string, rates: ModelPricingRates): void {\r\n const normalized = normalizeModelKey(modelName);\r\n customPricingRegistry[normalized] = rates;\r\n customPricingRegistry[modelName] = rates;\r\n}\r\n","import type { InferenceCost, TokenUsage, InlineRateConfig, ModelPricingRates } 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 minimumChargeUSD?: number;\n customRate?: InlineRateConfig;\n}\n\n/**\n * BigInt Nano-Precision Financial Math Engine\n * 1 USD = 1,000,000,000 Nano-USD (10^9)\n * 1 token at $1.00 / 1M = $0.000001 = 1,000 Nano-USD\n * Prevents IEEE 754 floating point precision drift on micro-transactions.\n */\nexport function calculateCost(params: CalculateCostParams): InferenceCost {\n let rates: ModelPricingRates;\n\n if (params.customRate) {\n const outRate = params.customRate.out ?? params.customRate.output ?? 0;\n rates = {\n inputPer1M: params.customRate.in,\n outputPer1M: outRate,\n reasoningPer1M: params.customRate.reasoning ?? outRate,\n cachedInputPer1M: params.customRate.cached ?? params.customRate.in * 0.15,\n currency: 'USD',\n };\n } else {\n rates = getModelPricing(params.model);\n }\n\n const inputTokens = BigInt(Math.max(0, params.inputTokens ?? 0));\n const outputTokens = BigInt(Math.max(0, params.outputTokens ?? 0));\n const reasoningTokens = BigInt(Math.max(0, params.reasoningTokens ?? 0));\n const cachedTokens = BigInt(Math.max(0, params.cachedTokens ?? 0));\n\n // Regular input tokens (minus any cached tokens)\n const regularInputTokens = inputTokens > cachedTokens ? inputTokens - cachedTokens : 0n;\n\n // Convert rate per 1M tokens to integer nano-dollars per single token (rate * 1,000)\n // Using 10^9 nano-precision\n const rateInputNano = BigInt(Math.round(rates.inputPer1M * 1_000));\n const cachedPer1M = rates.cachedInputPer1M ?? rates.inputPer1M * 0.15;\n const rateCachedNano = BigInt(Math.round(cachedPer1M * 1_000));\n const rateOutputNano = BigInt(Math.round(rates.outputPer1M * 1_000));\n const reasoningPer1M = rates.reasoningPer1M ?? rates.outputPer1M;\n const rateReasoningNano = BigInt(Math.round(reasoningPer1M * 1_000));\n\n // Compute component nano costs\n const regularInputCostNano = regularInputTokens * rateInputNano;\n const cachedInputCostNano = cachedTokens * rateCachedNano;\n const inputCostNano = regularInputCostNano + cachedInputCostNano;\n const outputCostNano = outputTokens * rateOutputNano;\n const reasoningCostNano = reasoningTokens * rateReasoningNano;\n\n // Prompt cache savings discount\n const standardCacheCostNano = cachedTokens * rateInputNano;\n const cachedDiscountNano =\n standardCacheCostNano > cachedInputCostNano ? standardCacheCostNano - cachedInputCostNano : 0n;\n\n // Total wholesale cost\n const wholesaleNano = inputCostNano + outputCostNano;\n\n // Retail calculation\n const markup = params.markupMultiplier ?? 1.0;\n let billedNano = wholesaleNano;\n let hasRetail = false;\n\n if (markup !== 1.0 || params.minimumChargeUSD !== undefined) {\n hasRetail = true;\n const markupMultiplierNano = BigInt(Math.round(markup * 1_000));\n billedNano = (wholesaleNano * markupMultiplierNano) / 1_000n;\n\n if (params.minimumChargeUSD !== undefined && params.minimumChargeUSD > 0) {\n const minChargeNano = BigInt(Math.round(params.minimumChargeUSD * 1_000_000_000));\n if (billedNano < minChargeNano) {\n billedNano = minChargeNano;\n }\n }\n }\n\n const inputCostUSD = Number(inputCostNano) / 1_000_000_000;\n const outputCostUSD = Number(outputCostNano) / 1_000_000_000;\n const reasoningCostUSD = Number(reasoningCostNano) / 1_000_000_000;\n const cachedDiscountUSD = Number(cachedDiscountNano) / 1_000_000_000;\n const totalUSD = Number(wholesaleNano) / 1_000_000_000;\n const wholesaleTotalUSD = totalUSD;\n const billedUSD = Number(billedNano) / 1_000_000_000;\n const profitUSD = Math.max(0, billedUSD - wholesaleTotalUSD);\n const retailUSD = hasRetail ? billedUSD : undefined;\n\n return {\n inputCostUSD: Number(inputCostUSD.toFixed(8)),\n outputCostUSD: Number(outputCostUSD.toFixed(8)),\n reasoningCostUSD: reasoningTokens > 0n ? Number(reasoningCostUSD.toFixed(8)) : undefined,\n cachedDiscountUSD: cachedTokens > 0n ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n totalUSD: Number(totalUSD.toFixed(8)),\n wholesaleTotalUSD: Number(wholesaleTotalUSD.toFixed(8)),\n billedUSD: Number(billedUSD.toFixed(8)),\n profitUSD: Number(profitUSD.toFixed(8)),\n retailUSD: retailUSD !== undefined ? 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 optionsOrMarkup?: number | { markupMultiplier?: number; minimumChargeUSD?: number; customRate?: InlineRateConfig }\n): InferenceCost {\n const options =\n typeof optionsOrMarkup === 'number'\n ? { markupMultiplier: optionsOrMarkup }\n : optionsOrMarkup || {};\n\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: options.markupMultiplier,\n minimumChargeUSD: options.minimumChargeUSD,\n customRate: options.customRate,\n });\n}\n","import { useContext, useState, useCallback, useRef } from 'react';\r\nimport { VibezSessionContext } from './context';\r\nimport type { VibezSessionContextValue } from './types';\r\n\r\n/**\r\n * Hook to access live session usage, cost totals, and turn recorder\r\n */\r\nexport function useVibezSession(): VibezSessionContextValue {\r\n const context = useContext(VibezSessionContext);\r\n\r\n if (!context) {\r\n throw new Error(\r\n '[vibezcheck/react] useVibezSession must be used within a <VibezSessionProvider>.'\r\n );\r\n }\r\n\r\n return context;\r\n}\r\n\r\nexport const useVibez = useVibezSession;\r\n\r\nexport interface VibezChatMessage {\r\n id: string;\r\n role: 'user' | 'assistant' | 'system';\r\n content: string;\r\n annotations?: Array<{ type: string; reasoning?: string; [key: string]: any }>;\r\n createdAt?: Date;\r\n}\r\n\r\nexport interface UseVibezChatOptions {\r\n api?: string;\r\n model?: string;\r\n customer?: string;\r\n body?: Record<string, any>;\r\n initialMessages?: VibezChatMessage[];\r\n onFinish?: (message: VibezChatMessage, usage: any) => void;\r\n onError?: (error: Error) => void;\r\n}\r\n\r\n/**\r\n * Declarative, 1-line Chat Streaming Hook with automatic VibezCheck session tracking.\r\n *\r\n * @example\r\n * ```tsx\r\n * const { messages, input, handleInputChange, handleSubmit, isLoading } = useVibezChat({\r\n * model: 'gpt-4o-mini',\r\n * customer: 'alex@example.com',\r\n * });\r\n * ```\r\n */\r\nexport function useVibezChat(options: UseVibezChatOptions = {}) {\r\n const {\r\n api = '/api/chat',\r\n model = 'gpt-4o-mini',\r\n customer = 'anonymous',\r\n body = {},\r\n initialMessages = [],\r\n onFinish,\r\n onError,\r\n } = options;\r\n\r\n const session = useContext(VibezSessionContext);\r\n\r\n const [messages, setMessages] = useState<VibezChatMessage[]>(initialMessages);\r\n const [input, setInput] = useState<string>('');\r\n const [isLoading, setIsLoading] = useState<boolean>(false);\r\n const abortControllerRef = useRef<AbortController | null>(null);\r\n\r\n const handleInputChange = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\r\n setInput(e.target.value);\r\n },\r\n []\r\n );\r\n\r\n const append = useCallback(\r\n async (userMessage: VibezChatMessage) => {\r\n const updatedMessages = [...messages, userMessage];\r\n setMessages(updatedMessages);\r\n setIsLoading(true);\r\n\r\n const assistantId = 'msg_' + Math.random().toString(36).substring(2, 9);\r\n let assistantContent = '';\r\n let detectedReasoning = '';\r\n let detectedUsage = {\r\n promptTokens: 0,\r\n completionTokens: 0,\r\n totalTokens: 0,\r\n reasoningTokens: 0,\r\n };\r\n\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n id: assistantId,\r\n role: 'assistant',\r\n content: '',\r\n createdAt: new Date(),\r\n },\r\n ]);\r\n\r\n try {\r\n abortControllerRef.current = new AbortController();\r\n\r\n const res = await fetch(api, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n messages: updatedMessages.map((m) => ({\r\n role: m.role,\r\n content: m.content,\r\n })),\r\n model,\r\n customer,\r\n ...body,\r\n }),\r\n signal: abortControllerRef.current.signal,\r\n });\r\n\r\n if (!res.ok) {\r\n const errData = await res.json().catch(() => ({}));\r\n throw new Error(errData.error || `HTTP error! status: ${res.status}`);\r\n }\r\n\r\n const reader = res.body?.getReader();\r\n if (!reader) throw new Error('No stream body available');\r\n\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (!line.trim()) continue;\r\n\r\n if (line.startsWith('0:')) {\r\n try {\r\n assistantContent += JSON.parse(line.substring(2));\r\n } catch {\r\n assistantContent += line.substring(2).replace(/^\"|\"$/g, '');\r\n }\r\n } else if (line.startsWith('d:')) {\r\n try {\r\n const data = JSON.parse(line.substring(2));\r\n if (data.usage) {\r\n detectedUsage = {\r\n promptTokens: data.usage.promptTokens ?? 0,\r\n completionTokens: data.usage.completionTokens ?? 0,\r\n totalTokens:\r\n (data.usage.promptTokens ?? 0) + (data.usage.completionTokens ?? 0),\r\n reasoningTokens: data.usage.reasoningTokens ?? 0,\r\n };\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n } else if (line.startsWith('e:') || line.startsWith('g:')) {\r\n try {\r\n detectedReasoning += JSON.parse(line.substring(2));\r\n } catch {\r\n detectedReasoning += line.substring(2);\r\n }\r\n } else if (!line.startsWith('f:') && !line.startsWith('2:')) {\r\n assistantContent += line;\r\n }\r\n\r\n setMessages((prev) =>\r\n prev.map((msg) =>\r\n msg.id === assistantId\r\n ? {\r\n ...msg,\r\n content: assistantContent,\r\n annotations: detectedReasoning\r\n ? [{ type: 'reasoning', reasoning: detectedReasoning }]\r\n : undefined,\r\n }\r\n : msg\r\n )\r\n );\r\n }\r\n }\r\n\r\n if (detectedUsage.promptTokens === 0 && detectedUsage.completionTokens === 0) {\r\n const promptWords = updatedMessages.reduce(\r\n (acc, m) => acc + m.content.split(/\\s+/).length,\r\n 0\r\n );\r\n const outputWords = assistantContent.split(/\\s+/).length;\r\n detectedUsage = {\r\n promptTokens: Math.ceil(promptWords * 1.3),\r\n completionTokens: Math.ceil(outputWords * 1.3),\r\n totalTokens: Math.ceil((promptWords + outputWords) * 1.3),\r\n reasoningTokens: detectedReasoning\r\n ? Math.ceil(detectedReasoning.split(/\\s+/).length * 1.3)\r\n : 0,\r\n };\r\n }\r\n\r\n // Automatically record turn into VibezSessionContext\r\n if (session) {\r\n session.recordTurn({\r\n model,\r\n usage: detectedUsage,\r\n });\r\n }\r\n\r\n const finalMsg: VibezChatMessage = {\r\n id: assistantId,\r\n role: 'assistant',\r\n content: assistantContent,\r\n annotations: detectedReasoning\r\n ? [{ type: 'reasoning', reasoning: detectedReasoning }]\r\n : undefined,\r\n createdAt: new Date(),\r\n };\r\n\r\n if (onFinish) {\r\n onFinish(finalMsg, detectedUsage);\r\n }\r\n } catch (err: any) {\r\n if (err.name === 'AbortError') return;\r\n console.error('[useVibezChat Error]', err);\r\n if (onError) onError(err);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [api, model, customer, body, messages, session, onFinish, onError]\r\n );\r\n\r\n const handleSubmit = useCallback(\r\n (e?: React.FormEvent) => {\r\n if (e) e.preventDefault();\r\n if (!input.trim() || isLoading) return;\r\n\r\n const userMsg: VibezChatMessage = {\r\n id: 'msg_' + Math.random().toString(36).substring(2, 9),\r\n role: 'user',\r\n content: input.trim(),\r\n createdAt: new Date(),\r\n };\r\n\r\n setInput('');\r\n append(userMsg);\r\n },\r\n [input, isLoading, append]\r\n );\r\n\r\n const stop = useCallback(() => {\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n setIsLoading(false);\r\n }\r\n }, []);\r\n\r\n return {\r\n messages,\r\n setMessages,\r\n input,\r\n setInput,\r\n handleInputChange,\r\n handleSubmit,\r\n isLoading,\r\n stop,\r\n append,\r\n };\r\n}\r\n","import React, { useState } from 'react';\r\nimport { useVibezSession } from './hooks';\r\nimport type { VibezSessionWidgetProps } from './types';\r\n\r\nexport const VibezSessionWidget: React.FC<VibezSessionWidgetProps> = ({\r\n position = 'bottom-right',\r\n showCost = true,\r\n showTokens = true,\r\n showReasoning = true,\r\n theme = 'auto',\r\n className,\r\n style,\r\n}) => {\r\n const { sessionUsage, sessionCost, turnCount, byModel } = useVibezSession();\r\n const [expanded, setExpanded] = useState(false);\r\n\r\n // If no turns yet and 0 tokens, render minimal idle pill\r\n const hasUsage = sessionUsage.totalTokens > 0;\r\n\r\n const isDark =\r\n theme === 'dark' ||\r\n (theme === 'auto' &&\r\n typeof window !== 'undefined' &&\r\n window.matchMedia?.('(prefers-color-scheme: dark)').matches);\r\n\r\n const colors = {\r\n bg: isDark ? '#171717' : '#ffffff',\r\n text: isDark ? '#f5f5f5' : '#171717',\r\n subtext: isDark ? '#a3a3a3' : '#737373',\r\n border: isDark ? '#262626' : '#e5e5e5',\r\n accent: '#8b5cf6',\r\n reasoningBg: isDark ? '#2e1065' : '#f3e8ff',\r\n reasoningText: isDark ? '#c084fc' : '#7c3aed',\r\n };\r\n\r\n const getPositionStyles = (): React.CSSProperties => {\r\n if (position === 'inline') return {};\r\n const base: React.CSSProperties = { position: 'fixed', zIndex: 9999 };\r\n switch (position) {\r\n case 'bottom-right':\r\n return { ...base, bottom: '20px', right: '20px' };\r\n case 'bottom-left':\r\n return { ...base, bottom: '20px', left: '20px' };\r\n case 'top-right':\r\n return { ...base, top: '20px', right: '20px' };\r\n case 'top-left':\r\n return { ...base, top: '20px', left: '20px' };\r\n default:\r\n return base;\r\n }\r\n };\r\n\r\n const formatTokens = (num: number) => {\r\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(1) + 'M';\r\n if (num >= 1_000) return (num / 1_000).toFixed(1) + 'k';\r\n return num.toString();\r\n };\r\n\r\n return (\r\n <div\r\n className={className}\r\n style={{\r\n ...getPositionStyles(),\r\n fontFamily:\r\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\r\n fontSize: '13px',\r\n ...style,\r\n }}\r\n >\r\n {/* Main Pill Button */}\r\n <div\r\n onClick={() => setExpanded(!expanded)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '8px 14px',\r\n backgroundColor: colors.bg,\r\n color: colors.text,\r\n border: `1px solid ${colors.border}`,\r\n borderRadius: '9999px',\r\n boxShadow: '0 4px 12px rgba(0,0,0,0.08)',\r\n cursor: 'pointer',\r\n userSelect: 'none',\r\n transition: 'all 0.15s ease',\r\n }}\r\n >\r\n <span style={{ color: colors.accent, fontWeight: 'bold' }}>⚡</span>\r\n\r\n {showTokens && (\r\n <span style={{ fontWeight: 600 }}>\r\n {formatTokens(sessionUsage.totalTokens)} tokens\r\n </span>\r\n )}\r\n\r\n {showCost && (\r\n <span style={{ color: colors.subtext }}>\r\n (${sessionCost.totalUSD.toFixed(4)})\r\n </span>\r\n )}\r\n\r\n {showReasoning && sessionUsage.reasoningTokens! > 0 && (\r\n <span\r\n style={{\r\n fontSize: '11px',\r\n padding: '2px 6px',\r\n borderRadius: '6px',\r\n backgroundColor: colors.reasoningBg,\r\n color: colors.reasoningText,\r\n fontWeight: 500,\r\n }}\r\n >\r\n 🧠 {formatTokens(sessionUsage.reasoningTokens!)}\r\n </span>\r\n )}\r\n\r\n <span style={{ color: colors.subtext, fontSize: '10px' }}>\r\n {expanded ? '▲' : '▼'}\r\n </span>\r\n </div>\r\n\r\n {/* Expanded Breakdown Popover */}\r\n {expanded && (\r\n <div\r\n style={{\r\n marginTop: '8px',\r\n padding: '14px',\r\n backgroundColor: colors.bg,\r\n color: colors.text,\r\n border: `1px solid ${colors.border}`,\r\n borderRadius: '12px',\r\n boxShadow: '0 10px 25px rgba(0,0,0,0.15)',\r\n width: '260px',\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n fontWeight: 600,\r\n marginBottom: '8px',\r\n paddingBottom: '6px',\r\n borderBottom: `1px solid ${colors.border}`,\r\n }}\r\n >\r\n <span>Live Session Usage</span>\r\n <span style={{ color: colors.subtext }}>{turnCount} turns</span>\r\n </div>\r\n\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', fontSize: '12px' }}>\r\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\r\n <span style={{ color: colors.subtext }}>Prompt Input:</span>\r\n <span>{sessionUsage.inputTokens.toLocaleString()}</span>\r\n </div>\r\n\r\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\r\n <span style={{ color: colors.subtext }}>Output Tokens:</span>\r\n <span>{sessionUsage.outputTokens.toLocaleString()}</span>\r\n </div>\r\n\r\n {sessionUsage.reasoningTokens! > 0 && (\r\n <div style={{ display: 'flex', justifyContent: 'space-between', color: colors.reasoningText }}>\r\n <span>🧠 Thinking Tokens:</span>\r\n <span>{sessionUsage.reasoningTokens!.toLocaleString()}</span>\r\n </div>\r\n )}\r\n\r\n {sessionUsage.cachedTokens! > 0 && (\r\n <div style={{ display: 'flex', justifyContent: 'space-between', color: '#10b981' }}>\r\n <span>⚡ Cached Tokens:</span>\r\n <span>{sessionUsage.cachedTokens!.toLocaleString()}</span>\r\n </div>\r\n )}\r\n\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n fontWeight: 600,\r\n marginTop: '6px',\r\n paddingTop: '6px',\r\n borderTop: `1px solid ${colors.border}`,\r\n }}\r\n >\r\n <span>Session Cost:</span>\r\n <span>${sessionCost.totalUSD.toFixed(5)} {sessionCost.currency}</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useVibezSession } from './hooks';\r\nimport type { VibezSessionBadgeProps } from './types';\r\n\r\n/**\r\n * Compact inline badge for chat input bars, headers, or navbars\r\n */\r\nexport const VibezSessionBadge: React.FC<VibezSessionBadgeProps> = ({\r\n showCost = true,\r\n showTokens = true,\r\n className,\r\n style,\r\n}) => {\r\n const { sessionUsage, sessionCost } = useVibezSession();\r\n\r\n const formatTokens = (num: number) => {\r\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(1) + 'M';\r\n if (num >= 1_000) return (num / 1_000).toFixed(1) + 'k';\r\n return num.toString();\r\n };\r\n\r\n return (\r\n <span\r\n className={className}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: '5px',\r\n padding: '3px 8px',\r\n fontSize: '11px',\r\n fontWeight: 500,\r\n borderRadius: '9999px',\r\n backgroundColor: 'rgba(139, 92, 246, 0.1)',\r\n color: '#8b5cf6',\r\n border: '1px solid rgba(139, 92, 246, 0.2)',\r\n fontFamily:\r\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\r\n ...style,\r\n }}\r\n >\r\n <span>⚡</span>\r\n {showTokens && <span>{formatTokens(sessionUsage.totalTokens)} tok</span>}\r\n {showCost && <span>(${sessionCost.totalUSD.toFixed(4)})</span>}\r\n </span>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React from 'react';\r\n\r\nexport interface VibezReceiptProps {\r\n /** Chat message object from Vercel AI SDK or custom chat state */\r\n message?: {\r\n id?: string;\r\n role?: string;\r\n content?: string;\r\n annotations?: any[];\r\n [key: string]: any;\r\n };\r\n /** Explicit model name override */\r\n model?: string;\r\n /** Explicit total tokens override */\r\n tokens?: number;\r\n /** Explicit reasoning tokens override */\r\n reasoningTokens?: number;\r\n /** Explicit cost in USD override */\r\n costUSD?: number;\r\n /** Latency in milliseconds */\r\n latencyMs?: number;\r\n /** Style variant */\r\n variant?: 'minimal' | 'pill' | 'card';\r\n /** Custom CSS class names */\r\n className?: string;\r\n}\r\n\r\nexport const VibezReceipt: React.FC<VibezReceiptProps> = ({\r\n message,\r\n model = 'ai-model',\r\n tokens,\r\n reasoningTokens,\r\n costUSD,\r\n latencyMs,\r\n variant = 'minimal',\r\n className = '',\r\n}) => {\r\n // Extract usage/cost data from message annotations or meta if available\r\n let resolvedTokens = tokens;\r\n let resolvedReasoning = reasoningTokens;\r\n let resolvedCost = costUSD;\r\n let resolvedModel = model;\r\n let resolvedLatency = latencyMs;\r\n\r\n if (message?.annotations && Array.isArray(message.annotations)) {\r\n for (const ann of message.annotations) {\r\n if (ann && typeof ann === 'object') {\r\n if (ann.type === 'vibezcheck' || ann.usage || ann.cost) {\r\n resolvedTokens = resolvedTokens ?? ann.usage?.totalTokens;\r\n resolvedReasoning = resolvedReasoning ?? ann.usage?.reasoningTokens;\r\n resolvedCost = resolvedCost ?? ann.cost?.totalUSD ?? ann.cost;\r\n resolvedModel = resolvedModel === 'ai-model' ? (ann.model || resolvedModel) : resolvedModel;\r\n resolvedLatency = resolvedLatency ?? ann.latencyMs;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Format token numbers cleanly (e.g. 1,420 or 12.4k)\r\n const formatTokens = (num?: number) => {\r\n if (num === undefined) return null;\r\n if (num >= 10000) return `${(num / 1000).toFixed(1)}k tokens`;\r\n return `${num.toLocaleString()} tokens`;\r\n };\r\n\r\n // Format cost cleanly (e.g. $0.00021)\r\n const formatCost = (cost?: number) => {\r\n if (cost === undefined) return null;\r\n if (cost < 0.0001) return `<$0.0001`;\r\n if (cost < 0.01) return `$${cost.toFixed(4)}`;\r\n return `$${cost.toFixed(3)}`;\r\n };\r\n\r\n // Shorten model identifier (e.g. 'openai/gpt-4o-mini' -> 'gpt-4o-mini')\r\n const cleanModel = resolvedModel.includes('/') ? resolvedModel.split('/')[1] : resolvedModel;\r\n\r\n return (\r\n <div\r\n className={`inline-flex items-center gap-2 py-1 px-2.5 rounded-lg text-[11px] font-mono select-none transition-colors duration-150 ${\r\n variant === 'pill'\r\n ? 'bg-slate-900 text-slate-200 border border-slate-800 shadow-xs'\r\n : variant === 'card'\r\n ? 'bg-cream-50 text-slate-700 border border-slate-200/80 shadow-2xs'\r\n : 'bg-slate-50 hover:bg-slate-100/80 text-slate-600 border border-slate-200/70'\r\n } ${className}`}\r\n >\r\n {/* Electric Lime Sparkle Icon */}\r\n <div className=\"flex items-center justify-center shrink-0\">\r\n <svg\r\n className=\"h-3 w-3 text-lime-500\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"2.5\" fill=\"#D4FF32\" />\r\n </svg>\r\n </div>\r\n\r\n {/* Model Name */}\r\n <span className=\"font-semibold text-slate-800\">{cleanModel}</span>\r\n\r\n {/* Token count */}\r\n {resolvedTokens !== undefined && (\r\n <>\r\n <span className=\"text-slate-300\">•</span>\r\n <span>{formatTokens(resolvedTokens)}</span>\r\n </>\r\n )}\r\n\r\n {/* Reasoning tokens indicator if applicable */}\r\n {resolvedReasoning !== undefined && resolvedReasoning > 0 && (\r\n <>\r\n <span className=\"text-slate-300\">•</span>\r\n <span className=\"text-stripe-indigo font-medium\">{resolvedReasoning} thought tokens</span>\r\n </>\r\n )}\r\n\r\n {/* Cost in USD */}\r\n {resolvedCost !== undefined && (\r\n <>\r\n <span className=\"text-slate-300\">•</span>\r\n <span className=\"text-emerald-600 font-semibold\">{formatCost(resolvedCost)}</span>\r\n </>\r\n )}\r\n\r\n {/* Latency if supplied */}\r\n {resolvedLatency !== undefined && (\r\n <>\r\n <span className=\"text-slate-300\">•</span>\r\n <span className=\"text-slate-400\">{resolvedLatency}ms</span>\r\n </>\r\n )}\r\n\r\n {/* Verified Badge */}\r\n <span className=\"text-slate-300\">•</span>\r\n <span className=\"text-[10px] text-slate-400 font-sans font-medium\">Verified by VibezCheck</span>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\n\r\nexport interface VibezBillingNotice {\r\n status?: 'requires_payment' | 'limit_reached' | 'upgrade_required';\r\n customerId?: string;\r\n customerEmail?: string;\r\n checkoutUrl?: string;\r\n tokensUsed?: number;\r\n costUSD?: number;\r\n message?: string;\r\n}\r\n\r\nexport interface VibezBillingModalProps {\r\n notice?: VibezBillingNotice | null;\r\n isOpen?: boolean;\r\n onClose?: () => void;\r\n onSuccess?: () => void;\r\n theme?: 'light' | 'dark';\r\n testMode?: boolean;\r\n}\r\n\r\n// Inline pure SVG Icons to ensure zero external runtime dependencies\r\nconst CreditCardIcon = () => (\r\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" strokeWidth=\"2\" />\r\n <line x1=\"2\" y1=\"10\" x2=\"22\" y2=\"10\" strokeWidth=\"2\" />\r\n </svg>\r\n);\r\n\r\nconst ShieldCheckIcon = () => (\r\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\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\" />\r\n </svg>\r\n);\r\n\r\nconst ZapIcon = () => (\r\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\r\n </svg>\r\n);\r\n\r\nconst CloseIcon = () => (\r\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n </svg>\r\n);\r\n\r\nconst CheckIcon = () => (\r\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <polyline points=\"20 6 9 17 4 12\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n);\r\n\r\nconst ArrowRightIcon = () => (\r\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n <polyline points=\"12 5 19 12 12 19\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n);\r\n\r\n/**\r\n * Intuitive React Modal for Stripe Top-Up, Card Registration & Paywall\r\n */\r\nexport const VibezBillingModal: React.FC<VibezBillingModalProps> = ({\r\n notice,\r\n isOpen: explicitIsOpen,\r\n onClose,\r\n onSuccess,\r\n theme = 'light',\r\n testMode = true,\r\n}) => {\r\n const [loading, setLoading] = useState(false);\r\n const [successState, setSuccessState] = useState(false);\r\n const [selectedPlan, setSelectedPlan] = useState<'starter' | 'pro'>('starter');\r\n\r\n const isVisible = explicitIsOpen !== undefined ? explicitIsOpen : Boolean(notice);\r\n\r\n if (!isVisible) return null;\r\n\r\n const handleSimulatePayment = async () => {\r\n setLoading(true);\r\n if (notice?.checkoutUrl) {\r\n window.location.href = notice.checkoutUrl;\r\n return;\r\n }\r\n\r\n await new Promise((r) => setTimeout(r, 1200));\r\n setLoading(false);\r\n setSuccessState(true);\r\n\r\n setTimeout(() => {\r\n setSuccessState(false);\r\n if (onSuccess) onSuccess();\r\n if (onClose) onClose();\r\n }, 1500);\r\n };\r\n\r\n const isLight = theme === 'light';\r\n\r\n return (\r\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\">\r\n <div\r\n className={`relative w-full max-w-md rounded-2xl shadow-2xl border transition-all overflow-hidden ${\r\n isLight ? 'bg-white border-slate-200 text-slate-900' : 'bg-slate-900 border-slate-800 text-white'\r\n }`}\r\n >\r\n {/* Top Accent Gradient */}\r\n <div className=\"h-1.5 w-full bg-gradient-to-r from-indigo-500 via-purple-500 to-emerald-500\" />\r\n\r\n {/* Close Button */}\r\n {onClose && (\r\n <button\r\n onClick={onClose}\r\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\"\r\n >\r\n <CloseIcon />\r\n </button>\r\n )}\r\n\r\n <div className=\"p-6 space-y-5\">\r\n {/* Header */}\r\n <div className=\"flex items-center gap-3\">\r\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\">\r\n <CreditCardIcon />\r\n </div>\r\n <div>\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"font-bold text-base tracking-tight\">\r\n {notice?.status === 'limit_reached' ? 'Token Limit Reached' : 'Add Billing Credits'}\r\n </h3>\r\n {testMode && (\r\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\">\r\n Stripe Sandbox\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-xs text-slate-500 mt-0.5\">\r\n {notice?.message || 'Top up your account to continue streaming AI tokens.'}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Usage Metrics Banner */}\r\n {(notice?.tokensUsed || notice?.costUSD) && (\r\n <div\r\n className={`p-3 rounded-xl border flex items-center justify-between text-xs ${\r\n isLight ? 'bg-slate-50 border-slate-200' : 'bg-slate-800 border-slate-700'\r\n }`}\r\n >\r\n <div>\r\n <span className=\"text-slate-400\">Tokens Metered:</span>{' '}\r\n <strong className=\"text-slate-800 font-semibold\">\r\n {notice.tokensUsed?.toLocaleString() || 0}\r\n </strong>\r\n </div>\r\n <div>\r\n <span className=\"text-slate-400\">Cost:</span>{' '}\r\n <strong className=\"text-indigo-600 font-semibold\">\r\n ${notice.costUSD?.toFixed(4) || '0.0000'} USD\r\n </strong>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Tier Selection */}\r\n <div className=\"space-y-2\">\r\n <label className=\"text-xs font-semibold text-slate-500 uppercase tracking-wider\">\r\n Select Top-Up Option\r\n </label>\r\n\r\n <div className=\"grid grid-cols-2 gap-2.5\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setSelectedPlan('starter')}\r\n className={`p-3 rounded-xl border text-left transition relative ${\r\n selectedPlan === 'starter'\r\n ? 'border-indigo-600 bg-indigo-50/60 ring-2 ring-indigo-500/20'\r\n : isLight\r\n ? 'border-slate-200 bg-white hover:border-slate-300'\r\n : 'border-slate-800 bg-slate-800/50'\r\n }`}\r\n >\r\n <div className=\"text-xs font-bold text-slate-900\">$5.00 Top-Up</div>\r\n <div className=\"text-[11px] text-slate-500 mt-0.5\">500k AI Tokens</div>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setSelectedPlan('pro')}\r\n className={`p-3 rounded-xl border text-left transition relative ${\r\n selectedPlan === 'pro'\r\n ? 'border-indigo-600 bg-indigo-50/60 ring-2 ring-indigo-500/20'\r\n : isLight\r\n ? 'border-slate-200 bg-white hover:border-slate-300'\r\n : 'border-slate-800 bg-slate-800/50'\r\n }`}\r\n >\r\n <div className=\"text-xs font-bold text-slate-900\">$20.00 Pro</div>\r\n <div className=\"text-[11px] text-slate-500 mt-0.5\">2.5M AI Tokens</div>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Action Button */}\r\n <button\r\n onClick={handleSimulatePayment}\r\n disabled={loading || successState}\r\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\"\r\n >\r\n {loading ? (\r\n <span>Processing Stripe Sandbox Checkout...</span>\r\n ) : successState ? (\r\n <span className=\"flex items-center gap-1.5 text-emerald-300 font-semibold\">\r\n <CheckIcon /> Credits Added Successfully!\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1.5\">\r\n <span>Checkout with Stripe</span>\r\n <ArrowRightIcon />\r\n </span>\r\n )}\r\n </button>\r\n\r\n {/* Footer Security Badges */}\r\n <div className=\"flex items-center justify-center gap-4 text-[11px] text-slate-400 pt-1 border-t border-slate-100\">\r\n <div className=\"flex items-center gap-1\">\r\n <ShieldCheckIcon />\r\n <span>Stripe v2 Meter Events</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <ZapIcon />\r\n <span>Zero Latency Telemetry</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useMemo, useEffect } from 'react';\nimport type { UsageEvent } from '../types';\n\nexport interface VibezCheckProps {\n /** Messages array from AI SDK useChat() — automatically aggregates tokens & costs */\n messages?: any[];\n /** Array of raw UsageEvents (if using event-driven telemetry) */\n events?: UsageEvent[];\n /** Target model for local rate calculations (default: 'gpt-4o') */\n model?: string;\n /** Developer profit margin multiplier (default: 1.25 for +25% margin) */\n margin?: number;\n /** Manual total cost override in USD */\n totalCostUSD?: number;\n /** Manual total tokens override */\n totalTokens?: number;\n /** Remaining customer credit balance in USD */\n remainingBalanceUSD?: number;\n /** Screen position (default: 'bottom-center') */\n position?: 'bottom-center' | 'bottom-right' | 'bottom-left' | 'top-center';\n /** Color theme (default: 'dark') */\n theme?: 'dark' | 'light' | 'auto';\n /** Force dev mode banner on/off (defaults to auto-detect) */\n devMode?: boolean;\n /** Additional CSS class names */\n className?: string;\n /** Callback triggered when user clicks '+ Top Up Credits' */\n onTopUp?: () => void;\n /** Callback fired whenever cost or token counts update */\n onCostUpdate?: (summary: {\n totalCostUSD: number;\n wholesaleUSD: number;\n profitUSD: number;\n totalTokens: number;\n isDevMode: boolean;\n }) => void;\n}\n\n// Built-in fallback rate cards per 1M tokens for local Zero-DB Dev Mode\nconst DEV_RATES: Record<string, { input: number; output: number }> = {\n 'gpt-4o': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'claude-3-5-sonnet': { input: 3.0, output: 15.0 },\n 'claude-3-7-sonnet': { input: 3.0, output: 15.0 },\n 'gemini-1.5-pro': { input: 1.25, output: 5.0 },\n 'gemini-1.5-flash': { input: 0.075, output: 0.3 },\n 'deepseek-chat': { input: 0.14, output: 0.28 },\n default: { input: 2.0, output: 8.0 },\n};\n\n/**\n * ✦ <VibezCheck /> (from 'vibezcheck/ui' or 'vibezcheck/react')\n *\n * The 1-Line Token Meter & Financial HUD.\n * Works 100% out of the box in local dev mode with ZERO database and ZERO Stripe setup.\n * Computes exact tokens, wholesale provider costs, profit margins, and customer bills.\n */\nexport function VibezCheck({\n messages,\n events,\n model = 'gpt-4o',\n margin = 1.25,\n totalCostUSD: manualCost,\n totalTokens: manualTokens,\n remainingBalanceUSD,\n position = 'bottom-center',\n theme = 'dark',\n devMode,\n className = '',\n onTopUp,\n onCostUpdate,\n}: VibezCheckProps) {\n const [isOpen, setIsOpen] = useState(false);\n\n const normalizedModel = useMemo(() => {\n const clean = model.toLowerCase().replace(/^(openai|anthropic|google)\\//, '');\n return Object.keys(DEV_RATES).find((k) => clean.includes(k)) || 'default';\n }, [model]);\n\n // Aggregation Engine: Auto-extracts from server telemetry or falls back to Zero-DB token math\n const stats = useMemo(() => {\n let hasServerTelemetry = false;\n let wholesaleUSD = 0;\n let billedUSD = manualCost ?? 0;\n let totalTokens = manualTokens ?? 0;\n let promptTokens = 0;\n let completionTokens = 0;\n let cachedTokens = 0;\n let reasoningTokens = 0;\n let turns = 0;\n\n // 1. Check explicit raw events\n if (events && events.length > 0) {\n hasServerTelemetry = true;\n for (const ev of events) {\n billedUSD += ev.cost?.retailUSD ?? ev.cost?.billedUSD ?? ev.cost?.totalUSD ?? 0;\n wholesaleUSD += ev.cost?.wholesaleTotalUSD ?? ev.cost?.totalUSD ?? 0;\n totalTokens += ev.usage?.totalTokens ?? 0;\n promptTokens += ev.usage?.inputTokens ?? 0;\n completionTokens += ev.usage?.outputTokens ?? 0;\n cachedTokens += ev.usage?.cachedTokens ?? 0;\n reasoningTokens += ev.usage?.reasoningTokens ?? 0;\n turns++;\n }\n }\n\n // 2. Scan conversation messages\n if (messages && messages.length > 0) {\n for (const msg of messages) {\n turns++;\n let eventFound: UsageEvent | null = null;\n\n // Check annotations (AI SDK 4 & 5)\n if (Array.isArray(msg.annotations)) {\n for (const ann of msg.annotations) {\n if (ann && (ann.cost || ann.usage || ann.vibez)) {\n eventFound = ann.vibez || ann;\n break;\n }\n }\n }\n\n // Check parts (AI SDK 5)\n if (!eventFound && Array.isArray(msg.parts)) {\n for (const part of msg.parts) {\n if (part && (part.type === 'data' || part.type === 'custom') && part.data?.vibez) {\n eventFound = part.data.vibez;\n break;\n }\n }\n }\n\n if (eventFound) {\n hasServerTelemetry = true;\n billedUSD += eventFound.cost?.retailUSD ?? eventFound.cost?.billedUSD ?? eventFound.cost?.totalUSD ?? 0;\n wholesaleUSD += eventFound.cost?.wholesaleTotalUSD ?? eventFound.cost?.totalUSD ?? 0;\n totalTokens += eventFound.usage?.totalTokens ?? 0;\n promptTokens += eventFound.usage?.inputTokens ?? 0;\n completionTokens += eventFound.usage?.outputTokens ?? 0;\n cachedTokens += eventFound.usage?.cachedTokens ?? 0;\n reasoningTokens += eventFound.usage?.reasoningTokens ?? 0;\n } else {\n // Zero-DB Dev Mode: Extract text content and calculate character-token approximation\n let text = '';\n if (typeof msg.content === 'string') {\n text = msg.content;\n } else if (Array.isArray(msg.parts)) {\n text = msg.parts\n .filter((p: any) => p.type === 'text')\n .map((p: any) => p.text)\n .join(' ');\n }\n\n const estimatedTok = Math.ceil(text.length / 3.8);\n if (msg.role === 'user') {\n promptTokens += estimatedTok;\n } else if (msg.role === 'assistant') {\n completionTokens += estimatedTok;\n } else {\n promptTokens += estimatedTok;\n }\n totalTokens += estimatedTok;\n }\n }\n\n // If no server annotations found, compute local Dev Mode pricing\n if (!hasServerTelemetry && totalTokens > 0) {\n const rates = DEV_RATES[normalizedModel] || DEV_RATES.default;\n wholesaleUSD = (promptTokens * rates.input + completionTokens * rates.output) / 1_000_000;\n billedUSD = wholesaleUSD * margin;\n }\n }\n\n const profitUSD = Math.max(0, billedUSD - wholesaleUSD);\n const isDev = devMode !== undefined ? devMode : !hasServerTelemetry;\n\n return {\n wholesaleUSD,\n billedUSD,\n profitUSD,\n totalTokens,\n promptTokens,\n completionTokens,\n cachedTokens,\n reasoningTokens,\n turns,\n isDevMode: isDev,\n };\n }, [messages, events, manualCost, manualTokens, normalizedModel, margin, devMode]);\n\n // Fire onCostUpdate callback whenever numbers change\n useEffect(() => {\n if (onCostUpdate) {\n onCostUpdate({\n totalCostUSD: stats.billedUSD,\n wholesaleUSD: stats.wholesaleUSD,\n profitUSD: stats.profitUSD,\n totalTokens: stats.totalTokens,\n isDevMode: stats.isDevMode,\n });\n }\n }, [stats.billedUSD, stats.totalTokens, stats.isDevMode, onCostUpdate]);\n\n const isDark = theme === 'dark' || theme === 'auto';\n\n const positionStyles: React.CSSProperties = useMemo(() => {\n const base: React.CSSProperties = { position: 'fixed', zIndex: 9999 };\n switch (position) {\n case 'bottom-center':\n return { ...base, bottom: '24px', left: '50%', transform: 'translateX(-50%)' };\n case 'bottom-right':\n return { ...base, bottom: '24px', right: '24px' };\n case 'bottom-left':\n return { ...base, bottom: '24px', left: '24px' };\n case 'top-center':\n return { ...base, top: '24px', left: '50%', transform: 'translateX(-50%)' };\n default:\n return { ...base, bottom: '24px', left: '50%', transform: 'translateX(-50%)' };\n }\n }, [position]);\n\n const formatTokens = (num: number) => {\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(2) + 'M';\n if (num >= 1_000) return (num / 1_000).toFixed(1) + 'k';\n return num.toLocaleString();\n };\n\n return (\n <div style={positionStyles} className={`vibezcheck-ui-root font-sans text-xs select-none ${className}`}>\n {/* Expanded HUD Card */}\n {isOpen && (\n <div\n style={{\n background: isDark ? 'rgba(15, 23, 42, 0.96)' : 'rgba(255, 255, 255, 0.98)',\n backdropFilter: 'blur(16px)',\n borderColor: isDark ? '#334155' : '#e2e8f0',\n color: isDark ? '#f8fafc' : '#0f172a',\n }}\n className=\"mb-3 p-4 rounded-2xl border shadow-2xl w-84 space-y-3.5 transition-all animate-in fade-in slide-in-from-bottom-2\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b pb-2 border-slate-700/50\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lime-400 font-bold text-sm\">✦</span>\n <span className=\"font-semibold tracking-wide uppercase text-[11px] text-lime-400\">\n VibezCheck Financial Meter\n </span>\n </div>\n <button\n onClick={() => setIsOpen(false)}\n className=\"text-slate-400 hover:text-white text-xs px-1.5 py-0.5 rounded cursor-pointer transition\"\n >\n ✕\n </button>\n </div>\n\n {/* Dev Mode Banner (Zero Database Guarantee) */}\n {stats.isDevMode ? (\n <div className=\"bg-amber-950/40 border border-amber-500/30 rounded-lg p-2 text-[10px] text-amber-300 flex items-center justify-between\">\n <span className=\"flex items-center gap-1.5 font-medium\">\n <span className=\"w-2 h-2 rounded-full bg-amber-400 animate-ping\" />\n Zero-DB Dev Mode (Simulated Bill)\n </span>\n <span className=\"text-[9px] bg-amber-500/20 px-1.5 py-0.5 rounded font-mono\">\n +{Math.round((margin - 1) * 100)}% Margin\n </span>\n </div>\n ) : (\n <div className=\"bg-emerald-950/40 border border-emerald-500/30 rounded-lg p-2 text-[10px] text-emerald-300 flex items-center gap-1.5\">\n <span className=\"w-2 h-2 rounded-full bg-emerald-400\" />\n <span>Live Stripe Usage Meter Active</span>\n </div>\n )}\n\n {/* Financial Breakdown (Wholesale vs Billed vs Net Profit) */}\n <div className=\"bg-slate-800/60 p-2.5 rounded-lg border border-slate-700/40 space-y-2 text-[11px]\">\n <div className=\"flex justify-between items-center text-slate-400\">\n <span>Provider Cost (Wholesale):</span>\n <span className=\"font-mono text-slate-300\">${stats.wholesaleUSD.toFixed(4)}</span>\n </div>\n\n <div className=\"flex justify-between items-center text-slate-400\">\n <span>Your Profit (+{Math.round((margin - 1) * 100)}%):</span>\n <span className=\"font-mono text-lime-400 font-medium\">+${stats.profitUSD.toFixed(4)}</span>\n </div>\n\n <div className=\"border-t border-slate-700/60 pt-1.5 flex justify-between items-center font-bold\">\n <span className=\"text-white\">Customer Billed Total:</span>\n <span className=\"font-mono text-lime-400 text-sm\">${stats.billedUSD.toFixed(4)}</span>\n </div>\n </div>\n\n {/* Token Breakdown */}\n <div className=\"bg-slate-800/40 p-2.5 rounded-lg border border-slate-700/30 space-y-1.5 text-[11px]\">\n <div className=\"flex justify-between text-slate-400\">\n <span>Prompt Tokens:</span>\n <span className=\"font-mono text-slate-200\">{formatTokens(stats.promptTokens)}</span>\n </div>\n {stats.cachedTokens > 0 && (\n <div className=\"flex justify-between text-[10px] text-lime-300\">\n <span>↳ Cache Savings (85% off):</span>\n <span className=\"font-mono\">-{formatTokens(stats.cachedTokens)}</span>\n </div>\n )}\n <div className=\"flex justify-between text-slate-400\">\n <span>Completion Tokens:</span>\n <span className=\"font-mono text-slate-200\">{formatTokens(stats.completionTokens)}</span>\n </div>\n {stats.reasoningTokens > 0 && (\n <div className=\"flex justify-between text-[10px] text-purple-300\">\n <span>↳ Thinking / Reasoning:</span>\n <span className=\"font-mono\">{formatTokens(stats.reasoningTokens)}</span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-slate-700/50 pt-1 font-semibold text-slate-300\">\n <span>Total Tokens:</span>\n <span className=\"font-mono text-white\">{formatTokens(stats.totalTokens)}</span>\n </div>\n </div>\n\n {/* Balance & Top Up Action */}\n {typeof remainingBalanceUSD === 'number' && (\n <div className=\"flex justify-between items-center text-[11px] px-1\">\n <span className=\"text-slate-400\">Remaining Balance:</span>\n <span\n className={`font-mono font-bold ${\n remainingBalanceUSD < 1 ? 'text-amber-400' : 'text-slate-200'\n }`}\n >\n ${remainingBalanceUSD.toFixed(2)}\n </span>\n </div>\n )}\n\n {onTopUp && (\n <button\n onClick={onTopUp}\n className=\"w-full py-2 px-3 rounded-lg bg-lime-500 hover:bg-lime-400 text-slate-950 font-semibold text-xs transition cursor-pointer shadow-md active:scale-98\"\n >\n + Add / Top Up Credits\n </button>\n )}\n\n {stats.isDevMode && (\n <p className=\"text-[9px] text-slate-500 text-center leading-tight\">\n Zero-DB Dev Mode: Running in local memory without database or Stripe dependencies.\n </p>\n )}\n </div>\n )}\n\n {/* Floating Bottom Pill */}\n <div\n onClick={() => setIsOpen(!isOpen)}\n style={{\n background: isDark ? 'rgba(15, 23, 42, 0.90)' : 'rgba(255, 255, 255, 0.95)',\n backdropFilter: 'blur(12px)',\n borderColor: isDark ? '#334155' : '#e2e8f0',\n color: isDark ? '#f8fafc' : '#0f172a',\n }}\n className=\"flex items-center gap-2.5 px-3.5 py-1.5 rounded-full border shadow-xl cursor-pointer hover:scale-105 active:scale-95 transition-all select-none\"\n >\n <span className=\"text-lime-400 font-bold text-xs animate-pulse\">✦</span>\n <span className=\"font-mono font-semibold text-lime-400 text-xs\">\n ${stats.billedUSD.toFixed(4)}\n </span>\n <span className=\"text-slate-500\">•</span>\n <span className=\"font-mono text-slate-300 text-xs\">\n {formatTokens(stats.totalTokens)} tok\n </span>\n {stats.isDevMode && (\n <span className=\"text-[9px] font-mono text-amber-400 bg-amber-400/10 px-1 py-0.2 rounded\">\n DEV\n </span>\n )}\n <span className=\"text-[10px] text-slate-400 ml-0.5\">{isOpen ? '▼' : '▲'}</span>\n </div>\n </div>\n );\n}\n\nexport const VibezPill = VibezCheck;\nexport default VibezCheck;\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}