{"version":3,"sources":["../src/cli.ts","../src/storage/index.ts","../src/core/context.ts","../src/cloud/pricingFetcher.ts","../src/config/index.ts","../src/cloud/index.ts","../src/features/hooks.ts","../src/features/recommendations.ts","../src/core/Tracker.ts","../src/dashboard/server.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { tracker } from './core/Tracker.js';\nimport { createDashboardServer } from './dashboard/server.js';\nimport open from 'open';\n\nconst program = new Command();\n\nprogram\n  .name('ai-cost-tracker')\n  .description('CLI to track AI usage and costs')\n  .version('1.0.0');\n\nprogram\n  .command('dev')\n  .description('Start the local development dashboard')\n  .option('-p, --port <number>', 'Port to run the dashboard on', '3001')\n  .action(async (options) => {\n    const port = parseInt(options.port);\n    createDashboardServer(port);\n    await open(`http://localhost:${port}`);\n  });\n\nprogram\n  .command('report')\n  .description('Print a usage report')\n  .action(async () => {\n    const report = await tracker.getUsageReport();\n    const suggestions = await tracker.getOptimizationSuggestions();\n\n    console.log(chalk.bold('\\nAI Cost Report'));\n    console.log(chalk.gray('--------------\\n'));\n\n    console.log(chalk.blue.bold('Model Usage'));\n    for (const [model, stats] of Object.entries(report.usageByModel)) {\n      console.log(`${chalk.yellow(model)}: ${chalk.green(`$${stats.cost.toFixed(4)}`)} (${stats.tokens} tokens, ${stats.count} reqs)`);\n    }\n\n    console.log(chalk.blue.bold('\\nProvider Usage'));\n    for (const [provider, stats] of Object.entries(report.usageByProvider)) {\n      console.log(`${chalk.magenta(provider)}: ${chalk.green(`$${stats.cost.toFixed(4)}`)} (${stats.tokens} tokens)`);\n    }\n\n    console.log(chalk.gray('\\n--------------'));\n    console.log(`${chalk.bold('Total Tokens Used:')} ${chalk.cyan(report.totalTokens)}`);\n    console.log(`${chalk.bold('Total Cost:')} ${chalk.green(`$${report.totalCost.toFixed(4)}`)}`);\n\n    if (suggestions.length > 0) {\n      console.log(chalk.magenta.bold('\\nOptimization Suggestions'));\n      suggestions.forEach(s => {\n        console.log(`${chalk.blue('➜')} ${chalk.bold(s.currentModel)} → ${chalk.bold(s.suggestedModel)}`);\n        console.log(`  ${chalk.gray(s.reason)}`);\n        console.log(`  ${chalk.green(`Potential Savings: ~${s.potentialSavings}%`)}`);\n      });\n    }\n    console.log('');\n  });\n\nprogram\n  .command('upgrade')\n  .description('Learn about Pro features and upgrade your account')\n  .action(() => {\n    console.log(chalk.bold.magenta('\\n🚀 AI Cost Tracker Pro'));\n    console.log(chalk.gray('Take your AI monitoring to the next level.\\n'));\n    \n    console.log(chalk.bold('Pro Features:'));\n    console.log(`${chalk.green('✔')} ${chalk.bold('Team-wide Analytics')}: Aggregate data across all developers.`);\n    console.log(`${chalk.green('✔')} ${chalk.bold('Cost Alerts')}: Get notified before you break the budget.`);\n    console.log(`${chalk.green('✔')} ${chalk.bold('Advanced Recommendations')}: Save up to 80% on token costs.`);\n    console.log(`${chalk.green('✔')} ${chalk.bold('Webhooks & Hooks')}: Integrate tracking into your CI/CD pipelines.`);\n    \n    console.log(chalk.bold('\\nPlans:'));\n    console.log(`- ${chalk.bold('Pro ($19/mo)')}: Perfect for individual power users.`);\n    console.log(`- ${chalk.bold('Team ($79/mo)')}: Best for growing engineering teams.`);\n    \n    console.log(`\\nReady to upgrade? Visit: ${chalk.cyan.underline('https://ai-cost-tracker.com/pricing')}`);\n    console.log(chalk.gray('Or run the local dashboard to see your current savings.\\n'));\n  });\n\nprogram\n  .command('init-readme')\n  .description('Generate a badge for your project README')\n  .action(() => {\n    console.log(chalk.bold('\\n🛡️ README Badge Generator'));\n    console.log(chalk.gray('Add this to your README.md to show you track AI costs responsibly.\\n'));\n    \n    const badge = '[![AI Cost Tracked](https://img.shields.io/badge/AI_Cost-Tracked-blue?style=flat-square&logo=openai)](https://github.com/your-repo)';\n    \n    console.log(chalk.bgBlack.white(`  ${badge}  `));\n    console.log(chalk.gray('\\nCopy the markdown above into your README.md file.\\n'));\n  });\n\nprogram.parse();\n","import fs from 'fs';\nimport path from 'path';\nimport { UsageMetrics } from '../types/index.js';\n\nexport interface StorageProvider {\n  save(metrics: UsageMetrics): Promise<void>;\n  getAll(): Promise<UsageMetrics[]>;\n}\n\nexport class JSONStorage implements StorageProvider {\n  private filePath: string;\n\n  constructor(filePath?: string) {\n    this.filePath = filePath || path.join(process.cwd(), '.ai-usage.json');\n  }\n\n  private async ensureFile(): Promise<void> {\n    if (!fs.existsSync(this.filePath)) {\n      await fs.promises.writeFile(this.filePath, JSON.stringify([], null, 2));\n    }\n  }\n\n  async save(metrics: UsageMetrics): Promise<void> {\n    await this.ensureFile();\n    const data = await this.getAll();\n    data.push(metrics);\n    await fs.promises.writeFile(this.filePath, JSON.stringify(data, null, 2));\n  }\n\n  async getAll(): Promise<UsageMetrics[]> {\n    await this.ensureFile();\n    const content = await fs.promises.readFile(this.filePath, 'utf-8');\n    try {\n      return JSON.parse(content);\n    } catch (e) {\n      return [];\n    }\n  }\n}\n","import { AsyncLocalStorage } from 'async_hooks';\nimport { AITrackingContext } from '../types/index.js';\n\nconst contextStorage = new AsyncLocalStorage<AITrackingContext>();\n\nexport function setGlobalAIContext(context: AITrackingContext) {\n  // This sets a default for the current execution context\n  const current = contextStorage.getStore() || {};\n  contextStorage.enterWith({ ...current, ...context });\n}\n\nexport function getGlobalAIContext(): AITrackingContext {\n  return contextStorage.getStore() || {};\n}\n\nexport { contextStorage };\n","import fs from 'fs';\nimport path from 'path';\nimport { OPENAI_COSTS, ANTHROPIC_COSTS, GEMINI_COSTS } from '../utils/costs.js';\n\nconst CACHE_FILE = path.join(process.cwd(), '.ai-pricing.json');\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst PRICING_URL = 'https://ai-monitor-740g.onrender.com/api/v1/meta/pricing';\n\nfunction applyPricing(data: any) {\n  if (data?.pricing?.openai) Object.assign(OPENAI_COSTS, data.pricing.openai);\n  if (data?.pricing?.anthropic) Object.assign(ANTHROPIC_COSTS, data.pricing.anthropic);\n  if (data?.pricing?.google) Object.assign(GEMINI_COSTS, data.pricing.google);\n}\n\nexport function loadFromCache(): boolean {\n  try {\n    if (!fs.existsSync(CACHE_FILE)) return false;\n    \n    const raw = fs.readFileSync(CACHE_FILE, 'utf-8');\n    const data = JSON.parse(raw);\n    \n    // Check TTL\n    const age = Date.now() - new Date(data.lastUpdated).getTime();\n    if (age > CACHE_TTL_MS) return false; // Cache is stale\n    \n    applyPricing(data);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport async function fetchLatestPricing(): Promise<void> {\n  try {\n    const response = await fetch(PRICING_URL, { signal: AbortSignal.timeout(5000) });\n    if (!response.ok) throw new Error(`HTTP ${response.status}`);\n    \n    const data = await response.json();\n    \n    // Persist to cache\n    fs.writeFileSync(CACHE_FILE, JSON.stringify(data, null, 2), 'utf-8');\n    \n    applyPricing(data);\n    console.log('[AI Cost Tracker] Pricing updated from cloud ☁️');\n  } catch {\n    // Silent fail — hardcoded fallbacks in costs.ts remain active\n  }\n}\n","import { AITrackerConfig } from '../types/index.js';\nimport { loadFromCache, fetchLatestPricing } from '../cloud/pricingFetcher.js';\n\nlet config: AITrackerConfig = {};\n\nexport function configureAITracker(newConfig: AITrackerConfig) {\n  config = { ...config, ...newConfig };\n\n  // 1. Load cached pricing immediately (sync, no latency)\n  loadFromCache();\n\n  // 2. Refresh from cloud in background (non-blocking)\n  fetchLatestPricing().catch(() => {\n    // Silent fail — hardcoded defaults in costs.ts remain active\n  });\n}\n\nexport function getConfig(): AITrackerConfig {\n  return config;\n}\n\nexport function isProEnabled(): boolean {\n  return !!config.apiKey;\n}\n","import { UsageMetrics } from '../types/index.js';\nimport { getConfig } from '../config/index.js';\n\nexport async function sendUsageToCloud(metrics: UsageMetrics, retries = 3): Promise<void> {\n  const config = getConfig();\n  if (!config.apiKey) return;\n\n  const endpoint = config.endpoint || 'https://ai-monitor-backend.onrender.com/api/v1/usage';\n\n  const attemptSync = async (remaining: number): Promise<void> => {\n    try {\n      const response = await fetch(endpoint, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'x-api-key': config.apiKey!,\n        },\n        body: JSON.stringify(metrics),\n      });\n\n      if (!response.ok && remaining > 0) {\n        // Simple exponential backoff or just wait a bit\n        await new Promise(resolve => setTimeout(resolve, 1000 * (4 - remaining)));\n        return attemptSync(remaining - 1);\n      }\n    } catch (error) {\n      if (remaining > 0) {\n        await new Promise(resolve => setTimeout(resolve, 1000 * (4 - remaining)));\n        return attemptSync(remaining - 1);\n      }\n      // Fail silently as requested\n    }\n  };\n\n  // Start attempt (non-blocking call from Tracker usually, but here we just return the promise)\n  return attemptSync(retries);\n}\n\n// Alias for backward compatibility if needed, but the user specifically asked for sendUsageToCloud\nexport const trackToCloud = sendUsageToCloud;\n","import { UsageMetrics } from '../types/index.js';\nimport { requirePro } from '../core/gating.js';\nimport EventEmitter from 'events';\n\nconst usageEmitter = new EventEmitter();\n\nexport function onUsage(callback: (data: UsageMetrics) => void) {\n  requirePro('Real-Time Hooks');\n  usageEmitter.on('usage', callback);\n}\n\nexport function emitUsage(metrics: UsageMetrics) {\n  usageEmitter.emit('usage', metrics);\n}\n","import { UsageMetrics } from '../types/index.js';\n\nexport interface ModelMetadata {\n  id: string;\n  name: string;\n  provider: string;\n  promptCost: number; // per 1M tokens\n  completionCost: number; // per 1M tokens\n  capability: number; // 1-5 scale\n}\n\nconst MODELS: Record<string, ModelMetadata> = {\n  'gpt-4': { id: 'gpt-4', name: 'GPT-4', provider: 'OpenAI', promptCost: 30, completionCost: 60, capability: 5 },\n  'gpt-4o': { id: 'gpt-4o', name: 'GPT-4o', provider: 'OpenAI', promptCost: 5, completionCost: 15, capability: 5 },\n  'gpt-4o-mini': { id: 'gpt-4o-mini', name: 'GPT-4o-mini', provider: 'OpenAI', promptCost: 0.15, completionCost: 0.60, capability: 3 },\n  'claude-3-opus': { id: 'claude-3-opus', name: 'Claude 3 Opus', provider: 'Anthropic', promptCost: 15, completionCost: 75, capability: 5 },\n  'claude-3-5-sonnet': { id: 'claude-3-5-sonnet', name: 'Claude 3.5 Sonnet', provider: 'Anthropic', promptCost: 3, completionCost: 15, capability: 5 },\n  'claude-3-haiku': { id: 'claude-3-haiku', name: 'Claude 3 Haiku', provider: 'Anthropic', promptCost: 0.25, completionCost: 1.25, capability: 2 },\n  'gemini-2.5-pro': { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', provider: 'Google', promptCost: 1.25, completionCost: 3.75, capability: 5 },\n  'gemini-2.5-flash': { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', provider: 'Google', promptCost: 0.1, completionCost: 0.4, capability: 3 },\n};\n\nexport interface Recommendation {\n  currentModel: string;\n  suggestedModel: string;\n  reason: string;\n  potentialSavings: number; // percentage\n}\n\nexport function generateRecommendations(metrics: UsageMetrics[]): Recommendation[] {\n  const modelUsage = metrics.reduce((acc: any, m) => {\n    acc[m.model] = (acc[m.model] || 0) + m.cost;\n    return acc;\n  }, {});\n\n  const recommendations: Recommendation[] = [];\n\n  // Logic: If using GPT-4, suggest GPT-4o\n  if (modelUsage['gpt-4']) {\n    recommendations.push({\n      currentModel: 'gpt-4',\n      suggestedModel: 'gpt-4o',\n      reason: 'GPT-4o is faster and ~80% cheaper for the same capability level.',\n      potentialSavings: 80\n    });\n  }\n\n  // Logic: If using Opus, suggest Sonnet 3.5\n  if (modelUsage['claude-3-opus']) {\n    recommendations.push({\n      currentModel: 'claude-3-opus',\n      suggestedModel: 'claude-3-5-sonnet',\n      reason: 'Claude 3.5 Sonnet is significantly cheaper and outperforms Opus in many benchmarks.',\n      potentialSavings: 75\n    });\n  }\n\n  // Logic: If using Gemini 2.5 Pro, suggest Gemini 2.5 Flash\n  if (modelUsage['gemini-2.5-pro']) {\n    recommendations.push({\n      currentModel: 'gemini-2.5-pro',\n      suggestedModel: 'gemini-2.5-flash',\n      reason: 'Gemini 2.5 Flash is significantly cheaper and offers excellent performance for high-volume tasks.',\n      potentialSavings: 90\n    });\n  }\n\n  // Logic: If high volume but low complexity tasks (simple heuristic: low token count/req)\n  // This could be expanded later with task_type metadata\n  \n  return recommendations;\n}\n","import { UsageMetrics, UsageReport, AITrackingContext } from '../types/index.js';\nimport { StorageProvider, JSONStorage } from '../storage/index.js';\nimport { getGlobalAIContext } from './context.js';\nimport { sendUsageToCloud } from '../cloud/index.js';\nimport { isProEnabled } from '../config/index.js';\nimport { emitUsage } from '../features/hooks.js';\nimport { generateRecommendations, Recommendation } from '../features/recommendations.js';\nimport chalk from 'chalk';\n\nexport class CostTracker {\n  private storage: StorageProvider;\n\n  constructor(storage?: StorageProvider) {\n    this.storage = storage || new JSONStorage();\n  }\n\n  async recordUsage(metrics: UsageMetrics, context?: AITrackingContext): Promise<void> {\n    const globalContext = getGlobalAIContext();\n    \n    // Merge context: Request context overrides Global context\n    const finalMetrics: UsageMetrics = {\n      ...globalContext,\n      ...metrics,\n      ...context, // Request specific context\n      timestamp: metrics.timestamp || Date.now(),\n    };\n\n    await this.storage.save(finalMetrics);\n\n    // Sync to cloud if Pro is enabled (non-blocking)\n    if (isProEnabled()) {\n      emitUsage(finalMetrics);\n      sendUsageToCloud(finalMetrics).catch(() => {\n        // Silent failure already handled in sendUsageToCloud\n      });\n    } else {\n      // Viral Nudges for Free users\n      this.checkMilestones(finalMetrics.totalTokens);\n      this.maybeLogNudge();\n    }\n  }\n\n  private async checkMilestones(newTokens: number): Promise<void> {\n    const report = await this.getUsageReport();\n    const oldTokens = report.totalTokens - newTokens;\n    \n    const milestone = 10000;\n    if (Math.floor(report.totalTokens / milestone) > Math.floor(oldTokens / milestone)) {\n      console.log(chalk.green(`\\n✨ Milestone Reached: You've tracked over ${chalk.bold(Math.floor(report.totalTokens / milestone) * milestone)} tokens with AI Cost Tracker!`));\n      console.log(chalk.gray(`View your full report with: ${chalk.cyan('npx ai-cost-tracker report')}\\n`));\n    }\n  }\n\n  private maybeLogNudge(): void {\n    // 5% chance to show a subtle nudge\n    if (Math.random() < 0.05) {\n      const nudges = [\n        \"🚀 Tip: Upgrade to Pro for team-wide analytics and cost alerts.\",\n        \"💡 Pro users save an average of 30% using advanced model recommendations.\",\n        \"📱 Monitor your costs on the go with our SaaS dashboard.\",\n        \"🔗 Run 'npx ai-cost-tracker upgrade' to see what you're missing!\",\n      ];\n      const nudge = nudges[Math.floor(Math.random() * nudges.length)];\n      console.log(chalk.blue.dim(`\\n${nudge}\\n`));\n    }\n  }\n\n  async getUsageReport(): Promise<UsageReport> {\n    const allMetrics = await this.storage.getAll();\n    \n    const report: UsageReport = {\n      totalCost: 0,\n      totalTokens: 0,\n      usageByModel: {},\n      usageByProvider: {},\n    };\n\n    for (const m of allMetrics) {\n      report.totalCost += m.cost;\n      report.totalTokens += m.totalTokens;\n\n      // Model grouping\n      if (!report.usageByModel[m.model]) {\n        report.usageByModel[m.model] = { cost: 0, tokens: 0, count: 0 };\n      }\n      report.usageByModel[m.model].cost += m.cost;\n      report.usageByModel[m.model].tokens += m.totalTokens;\n      report.usageByModel[m.model].count += 1;\n\n      // Provider grouping\n      if (!report.usageByProvider[m.provider]) {\n        report.usageByProvider[m.provider] = { cost: 0, tokens: 0, count: 0 };\n      }\n      report.usageByProvider[m.provider].cost += m.cost;\n      report.usageByProvider[m.provider].tokens += m.totalTokens;\n      report.usageByProvider[m.provider].count += 1;\n    }\n\n    // Round total cost\n    report.totalCost = Number(report.totalCost.toFixed(6));\n    \n    // Round model costs\n    for (const model in report.usageByModel) {\n      report.usageByModel[model].cost = Number(report.usageByModel[model].cost.toFixed(6));\n    }\n\n    return report;\n  }\n\n  async getTotalCost(): Promise<number> {\n    const report = await this.getUsageReport();\n    return report.totalCost;\n  }\n\n  async getUsageByUser(userId: string): Promise<UsageMetrics[]> {\n    const all = await this.storage.getAll();\n    return all.filter(m => m.userId === userId);\n  }\n\n  async getUsageByFeature(feature: string): Promise<UsageMetrics[]> {\n    const all = await this.storage.getAll();\n    return all.filter(m => m.feature === feature);\n  }\n\n  async getUsageByTeam(teamId: string): Promise<UsageMetrics[]> {\n    const all = await this.storage.getAll();\n    return all.filter(m => m.teamId === teamId);\n  }\n\n  async getOptimizationSuggestions(): Promise<Recommendation[]> {\n    const all = await this.storage.getAll();\n    return generateRecommendations(all);\n  }\n}\n\n// Singleton for easy access\nexport const tracker = new CostTracker();\n","import express from 'express';\nimport cors from 'cors';\nimport { tracker } from '../core/Tracker.js';\nimport { JSONStorage } from '../storage/index.js';\nimport path from 'path';\nimport fs from 'fs';\nimport { fileURLToPath } from 'url';\n\n// Robust __dirname for both ESM and CJS\nconst getDirname = () => {\n  try {\n    return path.dirname(fileURLToPath(import.meta.url));\n  } catch (e) {\n    return __dirname;\n  }\n};\n\nconst currentDir = getDirname();\n\nexport function createDashboardServer(port: number = 3001) {\n  const app = express();\n  \n  app.use(cors());\n  app.use(express.json());\n\n  // Serve static files from the built UI\n  const uiPath = path.resolve(currentDir, '../../dashboard-ui/dist');\n  console.log(`[ai-cost-tracker] Serving dashboard from: ${uiPath}`);\n  \n  if (!fs.existsSync(uiPath)) {\n    console.error(`[ai-cost-tracker] ❌ Dashboard UI directory not found at: ${uiPath}`);\n  }\n  \n  app.use(express.static(uiPath));\n\n  app.get('/api/usage', async (req, res) => {\n    try {\n      const storage = (tracker as any).storage as JSONStorage;\n      const usage = await storage.getAll();\n      res.json(usage);\n    } catch (error) {\n      res.status(500).json({ error: 'Failed to fetch usage' });\n    }\n  });\n\n  app.get('/api/analytics', async (req, res) => {\n    try {\n      const report = await tracker.getUsageReport();\n      res.json(report);\n    } catch (error) {\n      res.status(500).json({ error: 'Failed to fetch analytics' });\n    }\n  });\n\n  app.get('/api/recommendations', async (req, res) => {\n    try {\n      const suggestions = await tracker.getOptimizationSuggestions();\n      res.json(suggestions);\n    } catch (error) {\n      res.status(500).json({ error: 'Failed to fetch recommendations' });\n    }\n  });\n\n  // Fallback to index.html for SPA\n  app.get('*', (req, res) => {\n    res.sendFile(path.join(uiPath, 'index.html'));\n  });\n\n  return app.listen(port, () => {\n    console.log(`[ai-cost-tracker] Dashboard running at http://localhost:${port}`);\n  });\n}\n"],"mappings":"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","names":["import_chalk","path","fs","import_path","path","config","EventEmitter","chalk","import_path","import_fs","path","express","cors","fs","open","chalk"]}