{"version":3,"file":"usage-tracker.mjs","names":[],"sources":["../../../src/services/usage-tracker.ts"],"sourcesContent":["/**\n * Usage Tracker — provider-aware LLM usage reporting.\n *\n * For Bankr: fetches real usage data from their API.\n * For other providers: reports active config + links to their dashboard\n * (we can't get real token counts from the plugin layer).\n *\n * Pricing reference table for cost awareness.\n */\n\nimport { getActiveProvider, PROVIDERS } from './keychain-secrets.js';\nimport { guardedFetch } from './endpoint-allowlist.js';\nimport { getCredentialVault } from './credential-vault.js';\n\n// ─── Pricing (per 1M tokens, USD) ────────────────────────────────────────\n\nexport interface ModelPricing {\n  inputPer1M: number;\n  outputPer1M: number;\n  cachePer1M?: number;\n}\n\nexport const PRICING: Record<string, ModelPricing> = {\n  'claude-opus-4-6':     { inputPer1M: 15,    outputPer1M: 75,   cachePer1M: 1.875 },\n  'claude-sonnet-4-6':   { inputPer1M: 3,     outputPer1M: 15,   cachePer1M: 0.375 },\n  'claude-haiku-3-5':    { inputPer1M: 0.8,   outputPer1M: 4,    cachePer1M: 0.1 },\n  'gpt-4o':              { inputPer1M: 2.5,   outputPer1M: 10 },\n  'gpt-4o-mini':         { inputPer1M: 0.15,  outputPer1M: 0.6 },\n  'o3':                  { inputPer1M: 10,     outputPer1M: 40 },\n};\n\n// ─── Provider dashboards ─────────────────────────────────────────────────\n\nexport const PROVIDER_DASHBOARDS: Record<string, string> = {\n  anthropic:    'https://console.anthropic.com/settings/billing',\n  openrouter:   'https://openrouter.ai/credits',\n  openai:       'https://platform.openai.com/usage',\n  bankr:        'https://bankr.bot/llm',\n  'bankr-agent': 'https://bankr.bot',\n};\n\n// ─── Bankr usage fetch ──────────────────────────────────────────────────\n\nconst BANKR_BASE = 'https://llm.bankr.bot';\n\nexport interface BankrUsageData {\n  totals: {\n    totalRequests: number;\n    totalInputTokens: number;\n    totalOutputTokens: number;\n    totalCacheReadInputTokens: number;\n    totalCost: number;\n  };\n  byModel: Array<{\n    model: string;\n    requests: number;\n    totalCost: number;\n  }>;\n  credits?: {\n    balance: number;\n  };\n}\n\n/**\n * Fetch real usage data from Bankr LLM API.\n * Returns null if Bankr is not configured or the call fails.\n */\nexport async function fetchBankrUsage(days = 30): Promise<BankrUsageData | null> {\n  const key = process.env.BANKR_LLM_KEY;\n  if (!key) return null;\n\n  try {\n    const [usageRes, creditsRes] = await Promise.all([\n      guardedFetch(`${BANKR_BASE}/v1/usage?days=${days}`, {\n        headers: { 'X-API-Key': key, 'Content-Type': 'application/json' },\n        signal: AbortSignal.timeout(10_000),\n      }),\n      guardedFetch(`${BANKR_BASE}/v1/credits`, {\n        headers: { 'X-API-Key': key, 'Content-Type': 'application/json' },\n        signal: AbortSignal.timeout(10_000),\n      }),\n    ]);\n\n    if (!usageRes.ok) return null;\n    const data = await usageRes.json() as any;\n    \n    let credits: { balance: number } | undefined;\n    if (creditsRes.ok) {\n      const creditsData = await creditsRes.json() as any;\n      credits = { balance: creditsData?.balance ?? creditsData?.credits ?? 0 };\n    }\n\n    return {\n      totals: data.totals ?? { totalRequests: 0, totalInputTokens: 0, totalOutputTokens: 0, totalCacheReadInputTokens: 0, totalCost: 0 },\n      byModel: data.byModel ?? [],\n      credits,\n    };\n  } catch {\n    return null;\n  }\n}\n"],"mappings":";;;AAsBA,MAAa,UAAwC;CACnD,mBAAuB;EAAE,YAAY;EAAO,aAAa;EAAM,YAAY;EAAO;CAClF,qBAAuB;EAAE,YAAY;EAAO,aAAa;EAAM,YAAY;EAAO;CAClF,oBAAuB;EAAE,YAAY;EAAO,aAAa;EAAM,YAAY;EAAK;CAChF,UAAuB;EAAE,YAAY;EAAO,aAAa;EAAI;CAC7D,eAAuB;EAAE,YAAY;EAAO,aAAa;EAAK;CAC9D,MAAuB;EAAE,YAAY;EAAQ,aAAa;EAAI;CAC/D;AAID,MAAa,sBAA8C;CACzD,WAAc;CACd,YAAc;CACd,QAAc;CACd,OAAc;CACd,eAAe;CAChB;AAID,MAAM,aAAa;;;;;AAwBnB,eAAsB,gBAAgB,OAAO,IAAoC;CAC/E,MAAM,MAAM,QAAQ,IAAI;AACxB,KAAI,CAAC,IAAK,QAAO;AAEjB,KAAI;EACF,MAAM,CAAC,UAAU,cAAc,MAAM,QAAQ,IAAI,CAC/C,aAAa,GAAG,WAAW,iBAAiB,QAAQ;GAClD,SAAS;IAAE,aAAa;IAAK,gBAAgB;IAAoB;GACjE,QAAQ,YAAY,QAAQ,IAAO;GACpC,CAAC,EACF,aAAa,GAAG,WAAW,cAAc;GACvC,SAAS;IAAE,aAAa;IAAK,gBAAgB;IAAoB;GACjE,QAAQ,YAAY,QAAQ,IAAO;GACpC,CAAC,CACH,CAAC;AAEF,MAAI,CAAC,SAAS,GAAI,QAAO;EACzB,MAAM,OAAO,MAAM,SAAS,MAAM;EAElC,IAAI;AACJ,MAAI,WAAW,IAAI;GACjB,MAAM,cAAc,MAAM,WAAW,MAAM;AAC3C,aAAU,EAAE,SAAS,aAAa,WAAW,aAAa,WAAW,GAAG;;AAG1E,SAAO;GACL,QAAQ,KAAK,UAAU;IAAE,eAAe;IAAG,kBAAkB;IAAG,mBAAmB;IAAG,2BAA2B;IAAG,WAAW;IAAG;GAClI,SAAS,KAAK,WAAW,EAAE;GAC3B;GACD;SACK;AACN,SAAO"}