agent-usage-all-in-one 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/README.zh-CN.md +2 -2
- package/dist/cli.js +37 -11
- package/dist/cli.js.map +1 -1
- package/dist/web/_app/immutable/chunks/BxFVQ2kE.js +1 -0
- package/dist/web/_app/immutable/entry/{app.Cum34GuE.js → app.DoE5iRPD.js} +2 -2
- package/dist/web/_app/immutable/entry/start.-kFQj1Re.js +1 -0
- package/dist/web/_app/immutable/nodes/{1.DfK51mq1.js → 1.CO2k9heq.js} +1 -1
- package/dist/web/_app/immutable/nodes/2.C49HhYIP.js +28 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/index.html +6 -6
- package/package.json +1 -1
- package/dist/web/_app/immutable/chunks/D5pAC-T7.js +0 -1
- package/dist/web/_app/immutable/entry/start.C5EjL_LL.js +0 -1
- package/dist/web/_app/immutable/nodes/2.DJI_veG-.js +0 -28
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/redaction.ts","../src/server/daemon-state.ts","../src/core/diagnostic-category.ts","../src/core/usage-export.ts","../src/core/token-normalization.ts","../src/core/retail-pricing.ts","../src/core/plan-pricing.ts","../src/core/usage-application.ts","../src/connectors/catalog.ts","../src/connectors/claude-code/claude-code-connector.ts","../src/connectors/otlp.ts","../src/connectors/claude-code/claude-otlp.ts","../src/connectors/claude-code/claude-usage-screen-client.ts","../src/connectors/codex/codex-connector.ts","../src/connectors/codex/stdio-codex-account-client.ts","../src/connectors/opencode-local/opencode-local-connector.ts","../src/connectors/opencode-go/local-opencode-history-client.ts","../src/connectors/opencode-go/official-opencode-go-client.ts","../src/connectors/opencode-go/opencode-auth-reader.ts","../src/connectors/opencode-go/opencode-go-connector.ts","../src/connectors/grok-build/grok-build-connector.ts","../src/server/zstd-frames.ts","../src/server/local-transcript-usage-client.ts","../src/connectors/dsh/dsh-connector.ts","../src/server/antigravity-quota-client.ts","../src/connectors/antigravity/antigravity-connector.ts","../src/server/antigravity-sqlite-usage-client.ts","../src/connectors/grok-build/grok-telemetry.ts","../src/connectors/grok-build/stdio-grok-billing-client.ts","../src/connectors/xai-api/xai-api-connector.ts","../src/server/collection-scheduler.ts","../src/server/ecb-exchange-rate-provider.ts","../src/server/keychain-secret-store.ts","../src/server/macos-notifier.ts","../src/server/macos-start-at-login-manager.ts","../src/server/otlp-protobuf.ts","../src/server/local-server.ts","../src/server/path-discovery-probe.ts","../src/server/sqlite-usage-repository.ts","../src/server/runtime.ts","../src/cli.ts"],"sourcesContent":["export function redactSensitiveText(value: string): string {\n return value\n .replace(/Bearer\\s+\\S+/gi, 'Bearer [REDACTED]')\n .replace(/\\b(sk-[A-Za-z0-9_-]{8,}|xai-[A-Za-z0-9_-]{8,})\\b/g, '[REDACTED]')\n .replace(\n /((?:api[-_ ]?key|token|secret|key)\\s*(?::|=|is|was)?\\s*)[A-Za-z0-9._-]{8,}/gi,\n '$1[REDACTED]'\n );\n}\n\nexport function publicErrorMessage(error: unknown): string {\n return redactSensitiveText(error instanceof Error ? error.message : 'Unexpected error');\n}\n","import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { z } from 'zod';\n\nexport const daemonStateSchema = z.object({\n pid: z.number().int().positive(),\n origin: z.string().url(),\n apiToken: z.string().min(1)\n});\n\nexport type DaemonState = z.infer<typeof daemonStateSchema>;\n\nexport async function readDaemonState(home: string): Promise<DaemonState> {\n const content = await readFile(join(home, 'daemon.json'), 'utf8');\n return daemonStateSchema.parse(JSON.parse(content));\n}\n\nexport async function writeDaemonState(home: string, state: DaemonState): Promise<void> {\n await mkdir(home, { recursive: true, mode: 0o700 });\n const temporaryPath = join(home, `daemon.${process.pid}.tmp`);\n const statePath = join(home, 'daemon.json');\n await writeFile(temporaryPath, JSON.stringify(state), { mode: 0o600 });\n await rename(temporaryPath, statePath);\n}\n","import type { DiagnosticCategory } from './types.js';\n\nexport function classifyDiagnosticCategory(code: string, message: string): DiagnosticCategory {\n const value = `${code} ${message}`.toLowerCase();\n if (/missing|binary|not[ -]?installed/.test(value)) return 'missing-binary';\n if (/not[ -]?configured|credential.*missing|key.*missing/.test(value)) {\n return 'not-configured';\n }\n if (/unauthori[sz]ed|permission|forbidden|\\b401\\b|\\b403\\b/.test(value)) {\n return 'unauthorized';\n }\n if (/unsupported|capability/.test(value)) return 'unsupported';\n if (/schema|shape|parse/.test(value)) return 'schema-mismatch';\n if (/rate[ -]?limit|\\b429\\b/.test(value)) return 'rate-limited';\n if (/timeout|timed out/.test(value)) return 'timeout';\n if (/stale/.test(value)) return 'stale';\n return 'unavailable';\n}\n","import { redactSensitiveText } from './redaction.js';\nimport type { UsageExportArtifact, UsageExportRequest, UsageOverview } from './types.js';\n\nexport function buildUsageExport(\n overview: UsageOverview,\n request: UsageExportRequest,\n accountIdentifiers: Record<string, string> = {}\n): UsageExportArtifact {\n const usageObservationAliases = new Map<string, string>();\n const costObservationAliases = new Map<string, string>();\n const usageObservationAlias = (\n providerId: string,\n billingDomainId: string,\n observationId: string | null | undefined\n ): string | null => {\n if (!observationId) return null;\n const key = `${providerId}\\u0000${billingDomainId}\\u0000${observationId}`;\n const existing = usageObservationAliases.get(key);\n if (existing) return existing;\n const alias = `usage-observation-${usageObservationAliases.size + 1}`;\n usageObservationAliases.set(key, alias);\n return alias;\n };\n const costObservationAlias = (\n providerId: string,\n billingDomainId: string,\n costId: string\n ): string => {\n const key = `${providerId}\\u0000${billingDomainId}\\u0000${costId}`;\n const existing = costObservationAliases.get(key);\n if (existing) return existing;\n const alias = `cost-observation-${costObservationAliases.size + 1}`;\n costObservationAliases.set(key, alias);\n return alias;\n };\n const rows = overview.providers.flatMap((provider) =>\n provider.billingDomains.flatMap((domain) => {\n const history = domain.history;\n const tokenAuthority = exportAuthority(\n history.authorities ??\n (domain.tokenAuthority && domain.tokenAuthority !== 'mixed'\n ? [domain.tokenAuthority]\n : [])\n );\n const tokenRow = {\n window: history.window,\n windowStart: history.start,\n windowEnd: history.end,\n timeZone: history.timeZone,\n provider: redactSensitiveText(provider.displayName),\n billingDomain: redactSensitiveText(domain.displayName),\n ...(request.includeAccountIdentifiers\n ? { accountIdentifier: accountIdentifiers[provider.id] ?? null }\n : {}),\n freshness: domain.freshness.status,\n lastSuccessAt: domain.freshness.lastSuccessAt,\n recordType: 'tokens',\n recordId: null,\n model: null,\n usageObservationId: null,\n observedAt: history.lastObservedAt ?? null,\n timePrecision: null,\n authority: tokenAuthority,\n totalTokens: history.tokenTotals.total,\n recordedTokens: history.tokenEvidence.recordedTokens,\n sourceReportedTokens: history.tokenEvidence.sourceReportedTokens,\n sourceReportedObservationCount: history.tokenEvidence.sourceReportedObservationCount,\n observationCount: history.tokenEvidence.observationCount,\n unclassifiedTokens: history.tokenEvidence.unclassifiedTokens,\n classifiedTokens: history.tokenEvidence.classifiedTokens,\n classificationCoverage: history.tokenEvidence.classificationCoverage,\n totalDerivations: history.tokenEvidence.totalDerivations,\n timePrecisions: history.tokenEvidence.timePrecisions,\n usageScopes: history.tokenEvidence.usageScopes,\n aggregationTemporalities: history.tokenEvidence.aggregationTemporalities,\n reasoningSemantics: null,\n cacheReadSemantics: null,\n cacheWriteSemantics: null,\n inputTokens: history.tokenTotals.input,\n outputTokens: history.tokenTotals.output,\n reasoningTokens: history.tokenTotals.reasoning,\n cacheReadTokens: history.tokenTotals.cacheRead,\n cacheWriteTokens: history.tokenTotals.cacheWrite,\n costKind: null,\n costPurpose: null,\n legacyPurposeUnknown: false,\n amount: null,\n currency: null,\n pricedTokens: null,\n unpricedTokens: null,\n pricingCoverage: null,\n priceVersions: null,\n priceCanonicalModels: null,\n priceEffectiveAts: null,\n priceEffectiveUntils: null,\n priceCurrencies: null,\n priceRatesPerMillion: null,\n priceSourceUrls: null,\n priceContextTiers: null,\n priceLineItems: null,\n calculatedAt: null\n };\n const modelObservations = history.models.flatMap((model) =>\n (model.observations ?? []).map((observation) => ({\n model: model.model,\n observation\n }))\n );\n const modelObservationIds = new Set(\n modelObservations.map(({ observation }) => observation.id)\n );\n const tokenObservationRows = [\n ...modelObservations,\n ...(history.unclassified.observations ?? [])\n .filter((observation) => !modelObservationIds.has(observation.id))\n .map((observation) => ({\n model: observation.model,\n observation\n }))\n ].map(({ model, observation }) => {\n const recordedTokens = observation.recordedTokens;\n const classifiedTokens = observation.classifiedTokens;\n const exportId = usageObservationAlias(provider.id, domain.id, observation.id);\n return {\n ...tokenRow,\n recordType: 'token-observation',\n recordId: exportId,\n model,\n usageObservationId: exportId,\n observedAt: observation.observedAt,\n timePrecision: observation.timePrecision,\n authority: observation.authority,\n totalTokens: recordedTokens,\n recordedTokens,\n sourceReportedTokens: observation.sourceReportedTotalTokens,\n sourceReportedObservationCount: observation.sourceReportedTotalTokens === null ? 0 : 1,\n observationCount: 1,\n unclassifiedTokens: observation.unclassifiedTokens,\n classifiedTokens,\n classificationCoverage: recordedTokens === 0 ? null : classifiedTokens / recordedTokens,\n totalDerivations: [observation.totalDerivation],\n timePrecisions: [observation.timePrecision],\n usageScopes: [observation.usageScope],\n aggregationTemporalities: [observation.aggregationTemporality],\n reasoningSemantics: observation.tokenSemantics.reasoning,\n cacheReadSemantics: observation.tokenSemantics.cacheRead,\n cacheWriteSemantics: observation.tokenSemantics.cacheWrite,\n inputTokens: observation.tokenTotals.input,\n outputTokens: observation.tokenTotals.output,\n reasoningTokens: observation.tokenTotals.reasoning,\n cacheReadTokens: observation.tokenTotals.cacheRead,\n cacheWriteTokens: observation.tokenTotals.cacheWrite\n };\n });\n const observationsById = new Map([\n ...history.models.flatMap((model) =>\n (model.observations ?? []).map((observation) => [observation.id, observation] as const)\n ),\n ...(history.unclassified.observations ?? []).map(\n (observation) => [observation.id, observation] as const\n )\n ]);\n const costRows = history.costs.map((cost) => {\n const authorities = (domain.costs ?? [])\n .filter(\n (candidate) =>\n candidate.kind === cost.kind &&\n candidate.currency.toUpperCase() === cost.currency.toUpperCase() &&\n candidate.observedAt >= history.start &&\n candidate.observedAt < history.end\n )\n .map((candidate) => candidate.authority);\n return {\n ...tokenRow,\n recordType: 'cost',\n observedAt: cost.observedAt ?? null,\n authority: exportAuthority(authorities),\n totalTokens: null,\n recordedTokens: cost.pricingEvidence?.recordedTokens ?? null,\n sourceReportedTokens: null,\n sourceReportedObservationCount: null,\n observationCount: null,\n unclassifiedTokens: null,\n classifiedTokens: null,\n classificationCoverage: null,\n totalDerivations: null,\n timePrecisions: null,\n usageScopes: null,\n aggregationTemporalities: null,\n inputTokens: null,\n outputTokens: null,\n reasoningTokens: null,\n cacheReadTokens: null,\n cacheWriteTokens: null,\n costKind: cost.kind,\n costPurpose: cost.kind === 'legacy-unknown' ? null : cost.kind,\n legacyPurposeUnknown: cost.kind === 'legacy-unknown',\n amount: cost.amount,\n currency: cost.currency,\n pricedTokens: cost.pricingEvidence?.pricedTokens ?? null,\n unpricedTokens: cost.pricingEvidence?.unpricedTokens ?? null,\n pricingCoverage: cost.pricingEvidence?.pricingCoverage ?? null,\n priceVersions: cost.priceSnapshots.map((snapshot) => snapshot.version),\n priceCanonicalModels: cost.priceSnapshots.map((snapshot) => snapshot.canonicalModel),\n priceEffectiveAts: cost.priceSnapshots.map((snapshot) => snapshot.effectiveAt),\n priceEffectiveUntils: cost.priceSnapshots.map((snapshot) => snapshot.effectiveUntil),\n priceCurrencies: cost.priceSnapshots.map((snapshot) => snapshot.currency),\n priceRatesPerMillion: cost.priceSnapshots.map((snapshot) =>\n JSON.stringify(snapshot.ratesPerMillion)\n ),\n priceSourceUrls: cost.priceSnapshots.flatMap((snapshot) =>\n snapshot.sourceUrl ? [snapshot.sourceUrl] : []\n ),\n priceContextTiers: cost.priceSnapshots.flatMap((snapshot) =>\n snapshot.contextTier ? [snapshot.contextTier] : []\n ),\n priceLineItems: null,\n calculatedAt: null\n };\n });\n const costObservationRows = (domain.costs ?? [])\n .filter((cost) => cost.observedAt >= history.start && cost.observedAt < history.end)\n .map((cost) => {\n const snapshot = cost.priceSnapshot ?? null;\n const observation = cost.usageObservationId\n ? observationsById.get(cost.usageObservationId)\n : null;\n return {\n ...tokenRow,\n recordType: 'cost-observation',\n recordId: costObservationAlias(provider.id, domain.id, cost.id),\n model: cost.model ?? null,\n usageObservationId: usageObservationAlias(\n provider.id,\n domain.id,\n cost.usageObservationId\n ),\n observedAt: cost.observedAt ?? null,\n timePrecision: observation?.timePrecision ?? null,\n authority: cost.authority,\n totalTokens: null,\n recordedTokens: null,\n sourceReportedTokens: null,\n sourceReportedObservationCount: null,\n observationCount: null,\n unclassifiedTokens: null,\n classifiedTokens: null,\n classificationCoverage: null,\n totalDerivations: null,\n timePrecisions: null,\n usageScopes: null,\n aggregationTemporalities: null,\n inputTokens: null,\n outputTokens: null,\n reasoningTokens: null,\n cacheReadTokens: null,\n cacheWriteTokens: null,\n costKind: cost.kind,\n costPurpose: cost.kind === 'legacy-unknown' ? null : cost.kind,\n legacyPurposeUnknown: cost.kind === 'legacy-unknown',\n amount: cost.amount,\n currency: cost.currency,\n pricedTokens: cost.pricedTokens,\n unpricedTokens: null,\n pricingCoverage: null,\n priceVersions: snapshot ? [snapshot.version] : [],\n priceCanonicalModels: snapshot ? [snapshot.canonicalModel] : [],\n priceEffectiveAts: snapshot ? [snapshot.effectiveAt] : [],\n priceEffectiveUntils: snapshot ? [snapshot.effectiveUntil] : [],\n priceCurrencies: snapshot ? [snapshot.currency] : [],\n priceRatesPerMillion: snapshot ? [JSON.stringify(snapshot.ratesPerMillion)] : [],\n priceSourceUrls: snapshot?.sourceUrl ? [snapshot.sourceUrl] : [],\n priceContextTiers: snapshot?.contextTier ? [snapshot.contextTier] : [],\n priceLineItems: cost.lineItems ? JSON.stringify(cost.lineItems) : null,\n calculatedAt: cost.calculatedAt ?? null\n };\n });\n return [tokenRow, ...tokenObservationRows, ...costRows, ...costObservationRows];\n })\n );\n const generatedDay = overview.generatedAt.slice(0, 10);\n const filename = `agent-usage-${request.window ?? '24h'}-${generatedDay}.${request.format}`;\n if (request.format === 'csv') {\n return {\n format: 'csv',\n filename,\n contentType: 'text/csv; charset=utf-8',\n body: rowsToCsv(rows)\n };\n }\n const firstHistory = overview.providers[0]?.billingDomains[0]?.history;\n return {\n format: 'json',\n filename,\n contentType: 'application/json; charset=utf-8',\n body: JSON.stringify({\n version: 2,\n generatedAt: overview.generatedAt,\n query: {\n window: request.window ?? '24h',\n timeZone: firstHistory?.timeZone ?? request.timeZone ?? 'UTC',\n start: firstHistory?.start ?? null,\n end: firstHistory?.end ?? overview.generatedAt\n },\n privacy: {\n accountIdentifiersIncluded: Boolean(request.includeAccountIdentifiers),\n secretsIncluded: false\n },\n rows\n })\n };\n}\n\nfunction exportAuthority(values: string[]): string {\n const unique = [...new Set(values.filter(Boolean))].sort();\n return unique.length === 0 ? 'unavailable' : unique.length === 1 ? unique[0] : 'mixed';\n}\n\nconst CSV_COLUMNS = [\n 'window',\n 'windowStart',\n 'windowEnd',\n 'timeZone',\n 'provider',\n 'billingDomain',\n 'accountIdentifier',\n 'freshness',\n 'lastSuccessAt',\n 'recordType',\n 'recordId',\n 'model',\n 'usageObservationId',\n 'observedAt',\n 'timePrecision',\n 'authority',\n 'totalTokens',\n 'recordedTokens',\n 'sourceReportedTokens',\n 'sourceReportedObservationCount',\n 'observationCount',\n 'unclassifiedTokens',\n 'classifiedTokens',\n 'classificationCoverage',\n 'totalDerivations',\n 'timePrecisions',\n 'usageScopes',\n 'aggregationTemporalities',\n 'reasoningSemantics',\n 'cacheReadSemantics',\n 'cacheWriteSemantics',\n 'inputTokens',\n 'outputTokens',\n 'reasoningTokens',\n 'cacheReadTokens',\n 'cacheWriteTokens',\n 'costKind',\n 'costPurpose',\n 'legacyPurposeUnknown',\n 'amount',\n 'currency',\n 'pricedTokens',\n 'unpricedTokens',\n 'pricingCoverage',\n 'priceVersions',\n 'priceCanonicalModels',\n 'priceEffectiveAts',\n 'priceEffectiveUntils',\n 'priceCurrencies',\n 'priceRatesPerMillion',\n 'priceSourceUrls',\n 'priceContextTiers',\n 'priceLineItems',\n 'calculatedAt'\n] as const;\n\nfunction rowsToCsv(rows: Array<Record<string, unknown>>): string {\n return [\n CSV_COLUMNS.join(','),\n ...rows.map((row) => CSV_COLUMNS.map((column) => csvCell(row[column])).join(','))\n ].join('\\n');\n}\n\nfunction csvCell(value: unknown): string {\n if (value === null || value === undefined) return '';\n const text = String(value);\n return /[\",\\r\\n]/.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\n}\n","import type {\n NormalizedUsageObservation,\n TokenModelAttribution,\n TokenSemantics,\n UsageObservation\n} from './types.js';\n\nconst LEGACY_TOKEN_SEMANTICS: TokenSemantics = {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n};\n\nexport function normalizeTokenObservation(\n observation: UsageObservation\n): NormalizedUsageObservation {\n const inputTokens = tokenCount(observation.inputTokens, 'inputTokens');\n const outputTokens = tokenCount(observation.outputTokens, 'outputTokens');\n const reasoningTokens = tokenCount(observation.reasoningTokens ?? 0, 'reasoningTokens');\n const cacheReadTokens = tokenCount(observation.cacheReadTokens, 'cacheReadTokens');\n const cacheWriteTokens = tokenCount(observation.cacheWriteTokens, 'cacheWriteTokens');\n const cacheWriteTokenBreakdown = observation.cacheWriteTokenBreakdown\n ? {\n fiveMinute: tokenCount(\n observation.cacheWriteTokenBreakdown.fiveMinute,\n 'cacheWriteTokenBreakdown.fiveMinute'\n ),\n oneHour: tokenCount(\n observation.cacheWriteTokenBreakdown.oneHour,\n 'cacheWriteTokenBreakdown.oneHour'\n )\n }\n : null;\n if (\n cacheWriteTokenBreakdown &&\n cacheWriteTokenBreakdown.fiveMinute + cacheWriteTokenBreakdown.oneHour !== cacheWriteTokens\n ) {\n throw new Error('cacheWriteTokenBreakdown must equal cacheWriteTokens');\n }\n const tokenSemantics = observation.tokenSemantics ?? LEGACY_TOKEN_SEMANTICS;\n const categorizedTokens =\n inputTokens +\n outputTokens +\n (tokenSemantics.reasoning === 'separate' ? reasoningTokens : 0) +\n (tokenSemantics.cacheRead === 'separate' ? cacheReadTokens : 0) +\n (tokenSemantics.cacheWrite === 'separate' ? cacheWriteTokens : 0);\n const sourceReportedTotalTokens = nullableTokenCount(\n observation.sourceReportedTotalTokens,\n 'sourceReportedTotalTokens'\n );\n const reconciledRemainderTokens = nullableTokenCount(\n observation.reconciledRemainderTokens,\n 'reconciledRemainderTokens'\n );\n if (sourceReportedTotalTokens !== null && reconciledRemainderTokens !== null) {\n throw new Error(\n 'sourceReportedTotalTokens and reconciledRemainderTokens are mutually exclusive'\n );\n }\n if (sourceReportedTotalTokens !== null && sourceReportedTotalTokens < categorizedTokens) {\n throw new Error(\n 'sourceReportedTotalTokens must be greater than or equal to categorized tokens'\n );\n }\n if (reconciledRemainderTokens !== null && categorizedTokens !== 0) {\n throw new Error('reconciledRemainderTokens must not contain categorized tokens');\n }\n const totalDerivation =\n sourceReportedTotalTokens !== null\n ? ('source-reported' as const)\n : reconciledRemainderTokens !== null\n ? ('reconciled-remainder' as const)\n : ('categorized' as const);\n const recordedTokens =\n sourceReportedTotalTokens ?? reconciledRemainderTokens ?? categorizedTokens;\n const inferredModelAttribution = inferModelAttribution(observation.model);\n const modelAttribution =\n inferredModelAttribution === 'unclassified'\n ? 'unclassified'\n : (observation.modelAttribution ?? inferredModelAttribution);\n const unclassifiedTokens =\n modelAttribution === 'unclassified'\n ? recordedTokens\n : Math.max(0, recordedTokens - categorizedTokens);\n\n return {\n ...observation,\n inputTokens,\n outputTokens,\n reasoningTokens,\n cacheReadTokens,\n cacheWriteTokens,\n cacheWriteTokenBreakdown,\n sourceReportedTotalTokens,\n reconciledRemainderTokens,\n tokenSemantics,\n modelAttribution,\n timePrecision: observation.timePrecision ?? 'unknown',\n usageScope: observation.usageScope ?? 'unknown',\n aggregationTemporality: observation.aggregationTemporality ?? 'unknown',\n recordedTokens,\n unclassifiedTokens,\n totalDerivation\n };\n}\n\nfunction inferModelAttribution(model: string | null): TokenModelAttribution {\n const normalized = model?.trim().toLowerCase();\n return !normalized ||\n normalized === 'all-models' ||\n normalized === 'unknown' ||\n normalized === 'unknown-model'\n ? 'unclassified'\n : 'known';\n}\n\nfunction nullableTokenCount(value: number | null | undefined, field: string): number | null {\n return value === null || value === undefined ? null : tokenCount(value, field);\n}\n\nfunction tokenCount(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${field} must be a non-negative safe integer`);\n }\n return value;\n}\n","import { normalizeTokenObservation } from './token-normalization.js';\nimport type {\n ConnectorSnapshot,\n CostRecord,\n CustomModelRate,\n RetailPriceLineItem,\n RetailTokenKind,\n UsageObservation\n} from './types.js';\n\nexport interface RetailPriceCatalogEntry {\n id: string;\n priceVersion: string;\n providerId: string;\n billingDomainId: string;\n canonicalModel: string;\n aliases: string[];\n currency: 'USD';\n effectiveFrom: string;\n effectiveUntil: string | null;\n contextTier: string;\n contextRule?: RetailPriceContextRule;\n ratesPerMillion: Record<RetailTokenKind, number | null>;\n cacheWriteRatesPerMillion?: {\n fiveMinute: number;\n oneHour: number;\n };\n source: {\n title: string;\n url: string;\n retrievedAt: string;\n };\n}\n\nexport type RetailPriceContextRule =\n | { kind: 'fixed' }\n | {\n kind: 'prompt-tokens';\n minimumExclusive?: number;\n maximumInclusive?: number;\n }\n | {\n kind: 'utc-schedule';\n weekdays: number[];\n ranges: Array<{ startHour: number; endHour: number }>;\n match: 'inside' | 'outside';\n };\n\nexport interface RetailPriceCatalog {\n version: string;\n entries: RetailPriceCatalogEntry[];\n}\n\nexport type RetailPricingUnavailableReason =\n | 'model-unclassified'\n | 'model-unrecognized'\n | 'price-not-effective'\n | 'token-kinds-incomplete'\n | 'pricing-tier-ambiguous';\n\nexport interface RetailPricingDecision {\n observationId: string;\n status: 'priced' | 'unavailable';\n reason: RetailPricingUnavailableReason | null;\n pricedTokens: number;\n}\n\nexport interface RetailPricingResult {\n costs: CostRecord[];\n decisions: RetailPricingDecision[];\n}\n\nexport const ANTHROPIC_PRICING_CATALOG: RetailPriceCatalog = {\n version: '2026-08-28',\n entries: [\n anthropicEntry({\n id: 'anthropic-fable-5-1-2026-09-01',\n priceVersion: 'anthropic-2026-09-01',\n model: 'claude-fable-5-1',\n aliases: [\n 'Claude Fable 5.1',\n 'claude-fable-5.1',\n 'claude-fable-5-1-20260901',\n 'claude-fable-5.1-20260901',\n 'fable-5.1',\n 'fable-5-1'\n ],\n effectiveFrom: '2026-09-01T00:00:00.000Z',\n input: 10,\n output: 50,\n cacheRead: 0.25,\n sourceUrl: 'https://platform.claude.com/docs/en/about-claude/pricing',\n retrievedAt: '2026-09-03'\n }),\n {\n id: 'anthropic-fable-5-2026-06-09',\n priceVersion: 'anthropic-2026-06-09',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n canonicalModel: 'claude-fable-5',\n aliases: ['Claude Fable 5'],\n currency: 'USD',\n effectiveFrom: '2026-06-09T00:00:00.000Z',\n effectiveUntil: null,\n contextTier: 'standard-api',\n contextRule: { kind: 'fixed' },\n ratesPerMillion: {\n input: 10,\n output: 50,\n reasoning: null,\n 'cache-read': 1,\n // Anthropic publishes different 5-minute and 1-hour write rates.\n 'cache-write': null\n },\n cacheWriteRatesPerMillion: { fiveMinute: 12.5, oneHour: 20 },\n source: {\n title: 'Anthropic Claude API pricing',\n url: 'https://platform.claude.com/docs/en/about-claude/pricing',\n retrievedAt: '2026-08-28'\n }\n },\n anthropicEntry({\n id: 'anthropic-sonnet-5-2026-06-30',\n priceVersion: 'anthropic-2026-06-30',\n model: 'claude-sonnet-5',\n aliases: ['Claude Sonnet 5', 'claude-sonnet-5[1m]'],\n effectiveFrom: '2026-06-30T00:00:00.000Z',\n input: 2,\n output: 10,\n cacheRead: 0.2,\n sourceUrl: 'https://www.anthropic.com/news/claude-sonnet-5'\n }),\n anthropicEntry({\n id: 'anthropic-opus-5-2026-07-24',\n priceVersion: 'anthropic-2026-07-24',\n model: 'claude-opus-5',\n aliases: ['Claude Opus 5', 'claude-opus-5[1m]'],\n effectiveFrom: '2026-07-24T00:00:00.000Z',\n input: 5,\n output: 25,\n cacheRead: 0.5,\n sourceUrl: 'https://www.anthropic.com/news/claude-opus-5'\n }),\n anthropicEntry({\n id: 'anthropic-opus-4.8-2026-05-28',\n priceVersion: 'anthropic-2026-05-28',\n model: 'claude-opus-4-8',\n aliases: ['Claude Opus 4.8'],\n effectiveFrom: '2026-05-28T00:00:00.000Z',\n input: 5,\n output: 25,\n cacheRead: 0.5,\n sourceUrl: 'https://www.anthropic.com/news/claude-opus-4-8'\n }),\n anthropicEntry({\n id: 'anthropic-haiku-4.5-2025-10-01',\n priceVersion: 'anthropic-2025-10-01',\n model: 'claude-haiku-4-5-20251001',\n aliases: ['Claude Haiku 4.5', 'claude-haiku-4-5'],\n effectiveFrom: '2025-10-01T00:00:00.000Z',\n input: 1,\n output: 5,\n cacheRead: 0.1,\n sourceUrl: 'https://platform.claude.com/docs/en/about-claude/pricing'\n })\n ]\n};\n\nfunction anthropicEntry(options: {\n id: string;\n priceVersion: string;\n model: string;\n aliases: string[];\n effectiveFrom: string;\n input: number;\n output: number;\n cacheRead: number;\n sourceUrl: string;\n retrievedAt?: string;\n}): RetailPriceCatalogEntry {\n return {\n id: options.id,\n priceVersion: options.priceVersion,\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n canonicalModel: options.model,\n aliases: options.aliases,\n currency: 'USD',\n effectiveFrom: options.effectiveFrom,\n effectiveUntil: null,\n contextTier: 'standard-api',\n contextRule: { kind: 'fixed' },\n ratesPerMillion: {\n input: options.input,\n output: options.output,\n reasoning: null,\n 'cache-read': options.cacheRead,\n // Claude transcripts preserve total cache writes but pricing differs by cache lifetime.\n 'cache-write': null\n },\n cacheWriteRatesPerMillion: {\n fiveMinute: options.input * 1.25,\n oneHour: options.input * 2\n },\n source: {\n title: 'Anthropic Claude API pricing',\n url: options.sourceUrl,\n retrievedAt: options.retrievedAt ?? '2026-08-28'\n }\n };\n}\n\nconst OPENCODE_GO_SOURCE = {\n title: 'OpenCode Go model pricing',\n url: 'https://dev.opencode.ai/docs/go/',\n retrievedAt: '2026-08-28'\n};\nconst XAI_PRICING_SOURCE = {\n title: 'xAI API model pricing',\n url: 'https://docs.x.ai/developers/pricing',\n retrievedAt: '2026-08-28'\n};\nconst OPENAI_GPT_56_SOURCE = {\n title: 'OpenAI GPT-5.6 pricing',\n url: 'https://openai.com/index/gpt-5-6/',\n retrievedAt: '2026-08-28'\n};\nconst OPENAI_GPT_6_ASTRA_SOURCE = {\n title: 'OpenAI GPT-6 Astra pricing',\n url: 'https://developers.openai.com/api/docs/models/gpt-6-astra',\n retrievedAt: '2026-09-05'\n};\nconst OPEN_CODE_GO_SOURCE_PATH = 'packages/web/src/content/docs/go.mdx';\nconst openCodeHistory = (commit: string, effectiveFrom: string) => ({\n effectiveFrom,\n sourceUrl: `https://github.com/anomalyco/opencode/blob/${commit}/${OPEN_CODE_GO_SOURCE_PATH}`\n});\nconst OPEN_CODE_BASE_HISTORY = openCodeHistory(\n '51213520f5f69ce2c6c741adcb2785e017488ade',\n '2026-07-16T23:20:17.000Z'\n);\nconst OPEN_CODE_PRICE_HISTORY: Record<string, { effectiveFrom: string; sourceUrl: string }> = {\n 'glm-5.3-flash': openCodeHistory(\n '830aaf2059e87eab3105dda4c19556206d60c443',\n '2026-08-26T13:49:06.000Z'\n ),\n 'glm-5.3': openCodeHistory(\n 'e23586af2623f1bc2e8e6965d2d7acf7bd03d5c3',\n '2026-08-14T05:48:32.000Z'\n ),\n 'glm-5.2': OPEN_CODE_BASE_HISTORY,\n 'glm-5.1': OPEN_CODE_BASE_HISTORY,\n 'kimi-k3': OPEN_CODE_BASE_HISTORY,\n 'kimi-k2.7-code': OPEN_CODE_BASE_HISTORY,\n 'kimi-k2.6': OPEN_CODE_BASE_HISTORY,\n 'longcat-2.0': openCodeHistory(\n '6bb772215b08b4b7d9243c27286950d85b9f678d',\n '2026-08-24T10:02:51.000Z'\n ),\n 'mimo-v2.5': OPEN_CODE_BASE_HISTORY,\n 'mimo-v2.5-pro': openCodeHistory(\n 'be08207a88f3ae208b782832dc071863375cf734',\n '2026-07-17T15:15:48.000Z'\n ),\n 'minimax-m3': OPEN_CODE_BASE_HISTORY,\n 'minimax-m2.7': OPEN_CODE_BASE_HISTORY,\n 'minimax-m2.5': OPEN_CODE_BASE_HISTORY,\n 'muse-spark-1.2-contributor': openCodeHistory(\n 'e2505d434a6d78904ecfe546c4a1980d26bd8cd1',\n '2026-08-19T19:03:41.000Z'\n ),\n 'qwen3.8-max': openCodeHistory(\n 'e9e747245681127c9f3e300aa8c46f2554fdb294',\n '2026-08-03T06:48:57.000Z'\n ),\n 'qwen3.7-max': OPEN_CODE_BASE_HISTORY,\n 'qwen3.7-plus': OPEN_CODE_BASE_HISTORY,\n 'qwen3.6-plus': OPEN_CODE_BASE_HISTORY,\n hy3: openCodeHistory('411eff73f026d4950c07947c4d983788cb615baa', '2026-07-22T16:41:48.000Z'),\n 'grok-4.6': openCodeHistory(\n 'ac1c048e6420eb4c728fd3e343a1ba7b076cba92',\n '2026-08-25T17:27:48.000Z'\n ),\n 'gpt-5.6-luna': openCodeHistory(\n 'da59457ca4ff55aca0147d4ddb33c495dc72be31',\n '2026-07-31T05:23:25.000Z'\n ),\n 'deepseek-v4-pro': openCodeHistory(\n 'a0f8dccbfe139ffc7137d1eaf6fee6e4195af599',\n '2026-08-16T16:01:15.000Z'\n ),\n 'deepseek-v4-flash': openCodeHistory(\n 'a0f8dccbfe139ffc7137d1eaf6fee6e4195af599',\n '2026-08-16T16:01:15.000Z'\n ),\n 'deepseek-v4-flash-vision-exp': openCodeHistory(\n '813e6f3cec1bfb2cec4f50ca6cb19e225e747e95',\n '2026-08-21T12:57:25.000Z'\n )\n};\nconst OPEN_CODE_FLAT_MODELS: Array<\n [model: string, input: number, output: number, cacheRead: number, cacheWrite?: number]\n> = [\n ['glm-5.3-flash', 0.15, 0.5, 0.03],\n ['glm-5.3', 1.4, 4.4, 0.26],\n ['glm-5.2', 1.4, 4.4, 0.26],\n ['glm-5.1', 1.4, 4.4, 0.26],\n ['kimi-k3', 3, 15, 0.3],\n ['kimi-k2.7-code', 0.95, 4, 0.19],\n ['kimi-k2.6', 0.95, 4, 0.16],\n ['longcat-2.0', 0.3, 1.2, 0.006],\n ['mimo-v2.5', 0.14, 0.28, 0.0028],\n ['mimo-v2.5-pro', 0.435, 0.87, 0.003625],\n ['minimax-m3', 0.3, 1.2, 0.06],\n ['minimax-m2.7', 0.3, 1.2, 0.06, 0.375],\n ['minimax-m2.5', 0.3, 1.2, 0.06, 0.375],\n ['muse-spark-1.2-contributor', 0.1, 0.2, 0.002],\n ['qwen3.8-max', 2, 6, 0.25, 2.5],\n ['qwen3.7-max', 2.5, 7.5, 0.5, 3.125],\n ['hy3', 0.14, 0.58, 0.035]\n];\nconst OPEN_CODE_CONTEXT_MODELS: Array<\n [\n model: string,\n threshold: number,\n short: [input: number, output: number, cacheRead: number, cacheWrite: number | null],\n long: [input: number, output: number, cacheRead: number, cacheWrite: number | null]\n ]\n> = [\n ['grok-4.6', 200_000, [2, 6, 0.5, null], [4, 12, 1, null]],\n ['gpt-5.6-luna', 272_000, [0.2, 1.2, 0.02, 0.25], [0.4, 1.8, 0.04, 0.5]],\n ['qwen3.7-plus', 256_000, [0.4, 1.6, 0.04, 0.5], [1.2, 4.8, 0.12, 1.5]],\n ['qwen3.6-plus', 256_000, [0.5, 3, 0.05, 0.625], [2, 6, 0.2, 2.5]]\n];\nconst DEEPSEEK_GO_MODELS: Array<[model: string, input: number, output: number, cacheRead: number]> =\n [\n ['deepseek-v4-pro', 0.66, 1.98, 0.022],\n ['deepseek-v4-flash', 0.22, 0.66, 0.007],\n ['deepseek-v4-flash-vision-exp', 0.22, 0.66, 0.007]\n ];\nconst WEEKDAY_PEAK_RANGES = [\n { startHour: 1, endHour: 4 },\n { startHour: 6, endHour: 10 }\n];\nconst DEEPSEEK_OFFICIAL_SOURCE = {\n title: 'DeepSeek API pricing',\n url: 'https://api-docs.deepseek.com/quick_start/pricing',\n retrievedAt: '2026-09-01'\n};\n/**\n * DeepSeek's own off-peak rates per million Tokens, read from its published API\n * pricing table. These are deliberately not shared with the OpenCode Go entries\n * above: the two happen to agree today, but each price answers to its own\n * source, so a future reseller markup must not silently move DeepSeek's rates.\n */\nconst DEEPSEEK_OFFICIAL_MODELS: Array<\n [model: string, input: number, output: number, cacheRead: number]\n> = [\n ['deepseek-v4-pro', 0.66, 1.98, 0.022],\n ['deepseek-v4-flash', 0.22, 0.66, 0.007],\n ['deepseek-v4-flash-vision-exp', 0.22, 0.66, 0.007]\n];\n/**\n * DeepSeek published the peak/off-peak schedule for 2026-08-16 but documents no\n * switch instant inside that day, so the interval opens at the first complete\n * day. An earlier request stays unpriced instead of being priced at rates that\n * may not have applied to it yet.\n */\nconst DEEPSEEK_OFFICIAL_EFFECTIVE_FROM = '2026-08-17T00:00:00.000Z';\n\nconst GOOGLE_ANTIGRAVITY_SOURCE = {\n title: 'Google Gemini API pricing',\n url: 'https://ai.google.dev/pricing',\n retrievedAt: '2026-09-02'\n};\n\nconst GOOGLE_ANTIGRAVITY_EFFECTIVE_FROM = '2026-01-01T00:00:00.000Z';\n\nfunction antigravityEntry(options: {\n id: string;\n model: string;\n aliases: string[];\n input: number;\n output: number;\n cacheRead?: number | null;\n source?: { title: string; url: string; retrievedAt: string };\n}): RetailPriceCatalogEntry {\n const versionDate = '2026-09-02';\n return {\n id: options.id,\n priceVersion: `antigravity-${versionDate}`,\n providerId: 'antigravity',\n billingDomainId: 'code-assist-subscription',\n canonicalModel: options.model,\n aliases: options.aliases,\n currency: 'USD',\n effectiveFrom: GOOGLE_ANTIGRAVITY_EFFECTIVE_FROM,\n effectiveUntil: null,\n contextTier: 'standard-api',\n contextRule: { kind: 'fixed' },\n ratesPerMillion: {\n input: options.input,\n output: options.output,\n reasoning: options.output,\n 'cache-read': options.cacheRead ?? null,\n 'cache-write': null\n },\n source: options.source ?? GOOGLE_ANTIGRAVITY_SOURCE\n };\n}\n\nconst DIRECT_OFFICIAL_PRICING_CATALOG: RetailPriceCatalog = {\n version: '2026-08-28-grok-4.6-build',\n entries: [\n ...ANTHROPIC_PRICING_CATALOG.entries,\n ...openAiGpt56Entries('gpt-5.6-sol', [\n ['2026-07-09T00:00:00.000Z', '2026-08-21T00:00:00.000Z', 5, 30],\n ['2026-08-21T00:00:00.000Z', null, 4, 20]\n ]),\n ...openAiGpt56Entries('gpt-5.6-terra', [\n ['2026-07-09T00:00:00.000Z', '2026-07-30T00:00:00.000Z', 2.5, 15],\n ['2026-07-30T00:00:00.000Z', null, 2, 12]\n ]),\n ...openAiGpt56Entries('gpt-5.6-luna', [\n ['2026-07-09T00:00:00.000Z', '2026-07-30T00:00:00.000Z', 1, 6],\n ['2026-07-30T00:00:00.000Z', null, 0.2, 1.2]\n ]),\n ...openAiGpt6AstraEntries(\n 'gpt-6-astra',\n [['2026-09-03T00:00:00.000Z', null, 10, 50]],\n ['GPT-6 Astra', 'gpt-6-astra-2026-09-03', 'gpt-6-astra-20260903', 'astra']\n ),\n ...OPEN_CODE_FLAT_MODELS.map(([model, input, output, cacheRead, cacheWrite]) =>\n openCodeGoEntry(model, 'standard', input, output, cacheRead, cacheWrite ?? null, {\n kind: 'fixed'\n })\n ),\n ...OPEN_CODE_CONTEXT_MODELS.flatMap(([model, threshold, short, long]) => [\n openCodeGoEntry(\n model,\n `prompt-at-or-below-${threshold / 1000}k`,\n short[0],\n short[1],\n short[2],\n short[3],\n { kind: 'prompt-tokens', maximumInclusive: threshold }\n ),\n openCodeGoEntry(\n model,\n `prompt-above-${threshold / 1000}k`,\n long[0],\n long[1],\n long[2],\n long[3],\n { kind: 'prompt-tokens', minimumExclusive: threshold }\n )\n ]),\n ...DEEPSEEK_GO_MODELS.flatMap(([model, input, output, cacheRead]) => [\n openCodeGoEntry(model, 'off-peak', input, output, cacheRead, null, {\n kind: 'utc-schedule',\n weekdays: [1, 2, 3, 4, 5],\n ranges: WEEKDAY_PEAK_RANGES,\n match: 'outside'\n }),\n openCodeGoEntry(model, 'peak', input * 2, output * 2, cacheRead * 2, null, {\n kind: 'utc-schedule',\n weekdays: [1, 2, 3, 4, 5],\n ranges: WEEKDAY_PEAK_RANGES,\n match: 'inside'\n })\n ]),\n ...DEEPSEEK_OFFICIAL_MODELS.flatMap(([model, input, output, cacheRead]) => [\n dshDeepSeekEntry(model, 'off-peak', input, output, cacheRead),\n dshDeepSeekEntry(model, 'peak', input * 2, output * 2, cacheRead * 2)\n ]),\n xaiEntry({\n id: 'xai-grok-build-0.1-short-2026-05-19',\n priceVersion: 'xai-2026-05-19',\n billingDomainId: 'grok-build-subscription',\n model: 'grok-build-0.1',\n aliases: ['grok-build', 'grok-code-fast-1', 'grok-code-fast', 'grok-code-fast-1-0825'],\n effectiveFrom: '2026-05-19T00:00:00.000Z',\n contextTier: 'prompt-at-or-below-200k',\n input: 1,\n output: 2,\n cacheRead: 0.2,\n contextRule: { kind: 'prompt-tokens', maximumInclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-build-0.1-long-2026-05-19',\n priceVersion: 'xai-2026-05-19',\n billingDomainId: 'grok-build-subscription',\n model: 'grok-build-0.1',\n aliases: ['grok-build', 'grok-code-fast-1', 'grok-code-fast', 'grok-code-fast-1-0825'],\n effectiveFrom: '2026-05-19T00:00:00.000Z',\n contextTier: 'prompt-above-200k',\n input: 2,\n output: 4,\n cacheRead: 0.4,\n contextRule: { kind: 'prompt-tokens', minimumExclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-4.6-build-short-2026-08-12',\n priceVersion: 'xai-2026-08-12',\n billingDomainId: 'grok-build-subscription',\n model: 'grok-4.6',\n aliases: ['grok-4.6-build', 'grok-4.6-latest'],\n effectiveFrom: '2026-08-12T00:00:00.000Z',\n contextTier: 'prompt-at-or-below-200k',\n input: 2,\n output: 6,\n cacheRead: 0.5,\n contextRule: { kind: 'prompt-tokens', maximumInclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-4.6-build-long-2026-08-12',\n priceVersion: 'xai-2026-08-12',\n billingDomainId: 'grok-build-subscription',\n model: 'grok-4.6',\n aliases: ['grok-4.6-build', 'grok-4.6-latest'],\n effectiveFrom: '2026-08-12T00:00:00.000Z',\n contextTier: 'prompt-above-200k',\n input: 4,\n output: 12,\n cacheRead: 1,\n contextRule: { kind: 'prompt-tokens', minimumExclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-4.6-short-2026-08-12',\n priceVersion: 'xai-2026-08-12',\n billingDomainId: 'xai-api',\n model: 'grok-4.6',\n aliases: ['grok-4.6-latest'],\n effectiveFrom: '2026-08-12T00:00:00.000Z',\n contextTier: 'prompt-at-or-below-200k',\n input: 2,\n output: 6,\n cacheRead: 0.5,\n contextRule: { kind: 'prompt-tokens', maximumInclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-4.6-long-2026-08-12',\n priceVersion: 'xai-2026-08-12',\n billingDomainId: 'xai-api',\n model: 'grok-4.6',\n aliases: ['grok-4.6-latest'],\n effectiveFrom: '2026-08-12T00:00:00.000Z',\n contextTier: 'prompt-above-200k',\n input: 4,\n output: 12,\n cacheRead: 1,\n contextRule: { kind: 'prompt-tokens', minimumExclusive: 200_000 }\n }),\n antigravityEntry({\n id: 'antigravity-gemini-3.7-flash-2026-09-02',\n model: 'gemini-3.7-flash',\n aliases: [\n 'gemini-3.7-flash-high',\n 'gemini-3.7-flash-medium',\n 'gemini-3.7-flash-low',\n 'gemini-3p7-flash-exp-d',\n 'gemini-3.7-flash-exp',\n 'Gemini 3.7 Flash (High)',\n 'Gemini 3.7 Flash (Medium)',\n 'Gemini 3.7 Flash (Low)'\n ],\n input: 0.1,\n output: 0.4,\n cacheRead: 0.025\n }),\n antigravityEntry({\n id: 'antigravity-gemini-3.6-flash-2026-09-02',\n model: 'gemini-3.6-flash',\n aliases: [\n 'gemini-3.6-flash-high',\n 'gemini-3.6-flash-medium',\n 'gemini-3.6-flash-low',\n 'Gemini 3.6 Flash (High)',\n 'Gemini 3.6 Flash (Medium)',\n 'Gemini 3.6 Flash (Low)'\n ],\n input: 0.1,\n output: 0.4,\n cacheRead: 0.025\n }),\n antigravityEntry({\n id: 'antigravity-gemini-3.1-pro-2026-09-02',\n model: 'gemini-3.1-pro',\n aliases: [\n 'gemini-3.1-pro-high',\n 'gemini-3.1-pro-low',\n 'gemini-3p1-pro-exp',\n 'Gemini 3.1 Pro (High)',\n 'Gemini 3.1 Pro (Low)'\n ],\n input: 1.25,\n output: 5.0,\n cacheRead: 0.3125\n }),\n antigravityEntry({\n id: 'antigravity-claude-sonnet-4-6-2026-09-02',\n model: 'claude-sonnet-4-6',\n aliases: ['claude-sonnet-4-6-thinking', 'Claude Sonnet 4.6 (Thinking)'],\n input: 3.0,\n output: 15.0,\n cacheRead: 0.3,\n source: {\n title: 'Anthropic Claude API pricing',\n url: 'https://platform.claude.com/docs/en/about-claude/pricing',\n retrievedAt: '2026-09-02'\n }\n }),\n antigravityEntry({\n id: 'antigravity-claude-opus-4-6-2026-09-02',\n model: 'claude-opus-4-6-thinking',\n aliases: ['claude-opus-4-6', 'Claude Opus 4.6 (Thinking)'],\n input: 15.0,\n output: 75.0,\n cacheRead: 1.5,\n source: {\n title: 'Anthropic Claude API pricing',\n url: 'https://platform.claude.com/docs/en/about-claude/pricing',\n retrievedAt: '2026-09-02'\n }\n }),\n antigravityEntry({\n id: 'antigravity-gpt-oss-120b-2026-09-02',\n model: 'gpt-oss-120b-medium',\n aliases: ['gpt-oss-120b', 'GPT-OSS 120B (Medium)'],\n input: 0.15,\n output: 0.6,\n cacheRead: 0.05\n })\n ]\n};\n\nexport const OFFICIAL_PRICING_CATALOG: RetailPriceCatalog = {\n version: '2026-09-05-gpt-6-astra',\n\n entries: [\n ...DIRECT_OFFICIAL_PRICING_CATALOG.entries,\n ...openCodeLocalHistoryEntries(DIRECT_OFFICIAL_PRICING_CATALOG.entries)\n ]\n};\n\ntype OpenAiPricePeriod = [\n effectiveFrom: string,\n effectiveUntil: string | null,\n input: number,\n output: number\n];\n\nfunction openAiCodexEntries(options: {\n model: string;\n aliases?: string[];\n periods: OpenAiPricePeriod[];\n priceVersionPrefix: string;\n source: { title: string; url: string; retrievedAt: string };\n}): RetailPriceCatalogEntry[] {\n const aliases = options.aliases ?? [];\n return options.periods.flatMap(([effectiveFrom, effectiveUntil, input, output]) => {\n const versionDate = effectiveFrom.slice(0, 10);\n const entry = (tier: 'standard' | 'prompt-above-272k'): RetailPriceCatalogEntry => {\n const long = tier === 'prompt-above-272k';\n const tierInput = long ? input * 2 : input;\n const tierOutput = long ? output * 1.5 : output;\n return {\n id: `openai-${options.model}-${tier}-${versionDate}`,\n priceVersion: `${options.priceVersionPrefix}-${versionDate}`,\n providerId: 'codex',\n billingDomainId: 'subscription',\n canonicalModel: options.model,\n aliases,\n currency: 'USD',\n effectiveFrom,\n effectiveUntil,\n contextTier: tier,\n contextRule: long\n ? { kind: 'prompt-tokens', minimumExclusive: 272_000 }\n : { kind: 'prompt-tokens', maximumInclusive: 272_000 },\n ratesPerMillion: {\n input: tierInput,\n output: tierOutput,\n reasoning: tierOutput,\n 'cache-read': tierInput * 0.1,\n 'cache-write': tierInput * 1.25\n },\n source: options.source\n };\n };\n return [entry('standard'), entry('prompt-above-272k')];\n });\n}\n\nfunction openAiGpt56Entries(\n model: string,\n periods: OpenAiPricePeriod[]\n): RetailPriceCatalogEntry[] {\n return openAiCodexEntries({\n model,\n periods,\n priceVersionPrefix: 'openai-gpt-5.6',\n source: OPENAI_GPT_56_SOURCE\n });\n}\n\nfunction openAiGpt6AstraEntries(\n model: string,\n periods: OpenAiPricePeriod[],\n aliases: string[] = []\n): RetailPriceCatalogEntry[] {\n return openAiCodexEntries({\n model,\n aliases,\n periods,\n priceVersionPrefix: 'openai-gpt-6-astra',\n source: OPENAI_GPT_6_ASTRA_SOURCE\n });\n}\n\nfunction openCodeGoEntry(\n model: string,\n tier: string,\n input: number,\n output: number,\n cacheRead: number,\n cacheWrite: number | null,\n contextRule: RetailPriceContextRule\n): RetailPriceCatalogEntry {\n const history = OPEN_CODE_PRICE_HISTORY[model];\n if (!history) throw new Error(`Missing pinned OpenCode Go price history for ${model}.`);\n const effectiveFrom = history.effectiveFrom;\n const versionDate = effectiveFrom.slice(0, 10);\n return {\n id: `opencode-go-${model}-${tier}-${versionDate}`,\n priceVersion: `opencode-go-${versionDate}`,\n providerId: 'opencode-go',\n billingDomainId: 'go-subscription',\n canonicalModel: model,\n aliases: [`opencode-go/${model}`],\n currency: 'USD',\n effectiveFrom,\n effectiveUntil: null,\n contextTier: tier === 'peak' ? 'weekday-peak-utc' : tier === 'off-peak' ? 'off-peak-utc' : tier,\n contextRule,\n ratesPerMillion: {\n input,\n output,\n reasoning: output,\n 'cache-read': cacheRead,\n 'cache-write': cacheWrite\n },\n source: { ...OPENCODE_GO_SOURCE, url: history.sourceUrl }\n };\n}\n\n/**\n * One DeepSeek API price interval for the dsh Provider.\n *\n * dsh answers through provider routes, so its billing domain is the route key\n * the session log records; `deepseek-official` is the domain DeepSeek's own\n * published rates apply to. Cache writes carry no rate because DeepSeek's table\n * bills only cache-hit and cache-miss input.\n * @param model - DeepSeek model id as the log reports it.\n * @param tier - which side of the published UTC schedule this interval prices.\n * @param input - cache-miss input rate per million Tokens.\n * @param output - output rate per million Tokens.\n * @param cacheRead - cache-hit input rate per million Tokens.\n */\nfunction dshDeepSeekEntry(\n model: string,\n tier: 'off-peak' | 'peak',\n input: number,\n output: number,\n cacheRead: number\n): RetailPriceCatalogEntry {\n const versionDate = DEEPSEEK_OFFICIAL_EFFECTIVE_FROM.slice(0, 10);\n return {\n id: `dsh-deepseek-${model}-${tier}-${versionDate}`,\n priceVersion: `deepseek-official-${versionDate}`,\n providerId: 'dsh',\n billingDomainId: 'deepseek-official',\n canonicalModel: model,\n aliases: [],\n currency: 'USD',\n effectiveFrom: DEEPSEEK_OFFICIAL_EFFECTIVE_FROM,\n effectiveUntil: null,\n contextTier: tier === 'peak' ? 'weekday-peak-utc' : 'off-peak-utc',\n contextRule: {\n kind: 'utc-schedule',\n weekdays: [1, 2, 3, 4, 5],\n ranges: WEEKDAY_PEAK_RANGES,\n match: tier === 'peak' ? 'inside' : 'outside'\n },\n ratesPerMillion: {\n input,\n output,\n reasoning: output,\n 'cache-read': cacheRead,\n 'cache-write': null\n },\n source: DEEPSEEK_OFFICIAL_SOURCE\n };\n}\n\nfunction xaiEntry(options: {\n id: string;\n priceVersion: string;\n billingDomainId: string;\n model: string;\n aliases: string[];\n effectiveFrom: string;\n contextTier: string;\n input: number;\n output: number;\n cacheRead: number;\n contextRule: RetailPriceContextRule;\n}): RetailPriceCatalogEntry {\n return {\n id: options.id,\n priceVersion: options.priceVersion,\n providerId: 'grok',\n billingDomainId: options.billingDomainId,\n canonicalModel: options.model,\n aliases: options.aliases,\n currency: 'USD',\n effectiveFrom: options.effectiveFrom,\n effectiveUntil: null,\n contextTier: options.contextTier,\n contextRule: options.contextRule,\n ratesPerMillion: {\n input: options.input,\n output: options.output,\n reasoning: options.output,\n 'cache-read': options.cacheRead,\n 'cache-write': null\n },\n source: XAI_PRICING_SOURCE\n };\n}\n\nfunction openCodeLocalHistoryEntries(\n entries: RetailPriceCatalogEntry[]\n): RetailPriceCatalogEntry[] {\n return entries.flatMap((entry) => {\n const modelPrefix = openCodeLocalModelPrefix(entry);\n if (!modelPrefix) return [];\n const localModel = (model: string) => (model.includes('/') ? model : `${modelPrefix}/${model}`);\n const canonicalModel = localModel(entry.canonicalModel);\n return [\n {\n ...entry,\n id: `opencode-local-${entry.id}`,\n providerId: 'opencode',\n billingDomainId: 'local-history',\n canonicalModel,\n aliases: [\n ...new Set(\n [entry.canonicalModel, ...entry.aliases]\n .map(localModel)\n .filter((model) => model !== canonicalModel)\n )\n ]\n }\n ];\n });\n}\n\nfunction openCodeLocalModelPrefix(entry: RetailPriceCatalogEntry): string | null {\n if (entry.providerId === 'claude-code' && entry.billingDomainId === 'subscription') {\n return 'anthropic';\n }\n if (entry.providerId === 'codex' && entry.billingDomainId === 'subscription') {\n return 'openai';\n }\n if (entry.providerId === 'grok' && entry.billingDomainId === 'xai-api') return 'xai';\n if (entry.providerId === 'opencode-go' && entry.billingDomainId === 'go-subscription') {\n return 'opencode-go';\n }\n if (entry.providerId === 'antigravity' && entry.billingDomainId === 'code-assist-subscription') {\n return 'google';\n }\n return null;\n}\n\nexport function customModelRateToCatalogEntry(rate: CustomModelRate): RetailPriceCatalogEntry {\n const versionDate = rate.updatedAt.slice(0, 10);\n return {\n id: `custom-rate-${rate.id}`,\n priceVersion: `custom-${rate.id}-${rate.updatedAt}`,\n providerId: rate.providerId,\n billingDomainId: rate.billingDomainId ?? '*',\n canonicalModel: rate.model,\n aliases: [],\n currency: 'USD',\n effectiveFrom: '2020-01-01T00:00:00.000Z',\n effectiveUntil: null,\n contextTier: 'custom-rate',\n contextRule: { kind: 'fixed' },\n ratesPerMillion: {\n input: rate.ratesPerMillion.input,\n output: rate.ratesPerMillion.output,\n reasoning: rate.ratesPerMillion.output,\n 'cache-read': rate.ratesPerMillion.cacheRead,\n 'cache-write': null\n },\n source: {\n title: 'User-configured custom model rate',\n url: 'local://settings/rates',\n retrievedAt: versionDate\n }\n };\n}\n\nexport function mergeCatalogWithCustomRates(\n catalog: RetailPriceCatalog,\n customRates: CustomModelRate[]\n): RetailPriceCatalog {\n if (!customRates || customRates.length === 0) return catalog;\n const customEntries = customRates.map(customModelRateToCatalogEntry);\n const rateFingerprints = customRates\n .map((r) => `${r.id}:${r.updatedAt}`)\n .sort()\n .join(';');\n return {\n version: `${catalog.version}+custom:${rateFingerprints}`,\n entries: [...customEntries, ...catalog.entries]\n };\n}\n\nexport function deriveRetailEquivalentCosts(\n snapshot: ConnectorSnapshot,\n catalog: RetailPriceCatalog = ANTHROPIC_PRICING_CATALOG,\n calculatedAt = snapshot.observedAt\n): RetailPricingResult {\n const costs: CostRecord[] = [];\n const decisions: RetailPricingDecision[] = [];\n for (const observation of snapshot.usage) {\n const result = priceObservation(snapshot.provider.id, observation, catalog, calculatedAt);\n decisions.push(result.decision);\n if (result.cost) costs.push(result.cost);\n }\n return { costs, decisions };\n}\n\nfunction priceObservation(\n providerId: string,\n observation: UsageObservation,\n catalog: RetailPriceCatalog,\n calculatedAt: string\n): { cost: CostRecord | null; decision: RetailPricingDecision } {\n const unavailable = (reason: RetailPricingUnavailableReason) => ({\n cost: null,\n decision: {\n observationId: observation.id,\n status: 'unavailable' as const,\n reason,\n pricedTokens: 0\n }\n });\n const normalized = normalizeTokenObservation(observation);\n if (normalized.modelAttribution !== 'known' || !normalized.model) {\n return unavailable('model-unclassified');\n }\n const normalizedModel = normalized.model.trim().toLowerCase();\n const matchingCandidates = catalog.entries.filter(\n (entry) =>\n entry.providerId === providerId &&\n (entry.billingDomainId === observation.billingDomainId || entry.billingDomainId === '*') &&\n [entry.canonicalModel, ...entry.aliases].some(\n (model) => model.trim().toLowerCase() === normalizedModel\n )\n );\n\n let selectedEntries: RetailPriceCatalogEntry[];\n const customExact = matchingCandidates.filter(\n (e) => e.contextTier === 'custom-rate' && e.billingDomainId === observation.billingDomainId\n );\n if (customExact.length > 0) {\n selectedEntries = customExact;\n } else {\n const customWildcard = matchingCandidates.filter(\n (e) => e.contextTier === 'custom-rate' && e.billingDomainId === '*'\n );\n if (customWildcard.length > 0) {\n selectedEntries = customWildcard;\n } else {\n selectedEntries = matchingCandidates.filter(\n (e) => e.contextTier !== 'custom-rate' && e.billingDomainId === observation.billingDomainId\n );\n }\n }\n\n if (selectedEntries.length === 0) return unavailable('model-unrecognized');\n const timeActiveEntries = selectedEntries.filter(\n (entry) =>\n observation.observedAt >= entry.effectiveFrom &&\n (!entry.effectiveUntil || observation.observedAt < entry.effectiveUntil)\n );\n if (timeActiveEntries.length === 0) return unavailable('price-not-effective');\n const contextMatches = timeActiveEntries.map((entry) => ({\n entry,\n match: matchContext(entry.contextRule ?? { kind: 'fixed' }, normalized)\n }));\n if (contextMatches.some((candidate) => candidate.match === 'unknown')) {\n return unavailable('pricing-tier-ambiguous');\n }\n const activeEntries = contextMatches\n .filter((candidate) => candidate.match === 'match')\n .map((candidate) => candidate.entry);\n if (activeEntries.length !== 1) return unavailable('pricing-tier-ambiguous');\n if (normalized.unclassifiedTokens > 0) return unavailable('token-kinds-incomplete');\n\n const entry = activeEntries[0];\n const billableTokens: Array<{ tokenKind: RetailTokenKind; tokens: number }> = [\n { tokenKind: 'input', tokens: normalized.inputTokens },\n { tokenKind: 'output', tokens: normalized.outputTokens },\n {\n tokenKind: 'reasoning',\n tokens: normalized.tokenSemantics.reasoning === 'separate' ? normalized.reasoningTokens : 0\n },\n {\n tokenKind: 'cache-read',\n tokens: normalized.tokenSemantics.cacheRead === 'separate' ? normalized.cacheReadTokens : 0\n }\n ];\n const cacheWriteTokens =\n normalized.tokenSemantics.cacheWrite === 'separate' ? normalized.cacheWriteTokens : 0;\n const exactCacheWriteItems =\n cacheWriteTokens > 0 && normalized.cacheWriteTokenBreakdown && entry.cacheWriteRatesPerMillion\n ? [\n {\n tokenKind: 'cache-write' as const,\n tokens: normalized.cacheWriteTokenBreakdown.fiveMinute,\n ratePerMillion: entry.cacheWriteRatesPerMillion.fiveMinute\n },\n {\n tokenKind: 'cache-write' as const,\n tokens: normalized.cacheWriteTokenBreakdown.oneHour,\n ratePerMillion: entry.cacheWriteRatesPerMillion.oneHour\n }\n ].filter((item) => item.tokens > 0)\n : null;\n // A null cache-write rate with no explicit write tiers means the provider does\n // not bill cache writes at all (for example OpenCode Go DeepSeek V4, which\n // documents Cached Write as not charged). Treat those tokens as free instead\n // of refusing the whole observation. Models with tiered cache-write rates stay\n // ambiguous until the transcript provides the 5-minute / 1-hour split.\n const cacheWriteFree =\n cacheWriteTokens > 0 &&\n !exactCacheWriteItems &&\n entry.ratesPerMillion['cache-write'] === null &&\n !entry.cacheWriteRatesPerMillion;\n const cacheWriteBillable = cacheWriteTokens > 0 && !exactCacheWriteItems && !cacheWriteFree;\n if (cacheWriteBillable) {\n billableTokens.push({ tokenKind: 'cache-write', tokens: cacheWriteTokens });\n }\n const nonZero = billableTokens.filter((item) => item.tokens > 0);\n if (nonZero.some((item) => entry.ratesPerMillion[item.tokenKind] === null)) {\n return unavailable(\n normalized.cacheWriteTokens > 0 && !cacheWriteFree\n ? 'pricing-tier-ambiguous'\n : 'token-kinds-incomplete'\n );\n }\n const lineItems: RetailPriceLineItem[] = nonZero.map((item) => {\n const ratePerMillion = entry.ratesPerMillion[item.tokenKind]!;\n return {\n ...item,\n ratePerMillion,\n amount: preciseMoney((item.tokens * ratePerMillion) / 1_000_000)\n };\n });\n if (exactCacheWriteItems) {\n lineItems.push(\n ...exactCacheWriteItems.map((item) => ({\n ...item,\n amount: preciseMoney((item.tokens * item.ratePerMillion) / 1_000_000)\n }))\n );\n }\n if (cacheWriteFree) {\n lineItems.push({\n tokenKind: 'cache-write',\n tokens: cacheWriteTokens,\n ratePerMillion: 0,\n amount: 0\n });\n }\n const pricedTokens = lineItems.reduce((total, item) => total + item.tokens, 0);\n if (pricedTokens !== normalized.recordedTokens) return unavailable('token-kinds-incomplete');\n const amount = preciseMoney(lineItems.reduce((total, item) => total + item.amount, 0));\n return {\n cost: {\n id: `retail-equivalent:${observation.id}:${entry.id}`,\n sourceId: observation.id,\n billingDomainId: observation.billingDomainId,\n observedAt: observation.observedAt,\n kind: 'retail-equivalent',\n amount,\n currency: entry.currency,\n authority: 'estimate',\n model: observation.model?.trim() || entry.canonicalModel,\n usageObservationId: observation.id,\n pricedTokens,\n lineItems,\n calculatedAt,\n priceSnapshot: {\n id: entry.id,\n version: entry.priceVersion,\n source: entry.source.title,\n canonicalModel: entry.canonicalModel,\n effectiveAt: entry.effectiveFrom,\n effectiveUntil: entry.effectiveUntil,\n currency: entry.currency,\n ratesPerMillion: { ...entry.ratesPerMillion },\n ...(entry.cacheWriteRatesPerMillion\n ? { cacheWriteRatesPerMillion: { ...entry.cacheWriteRatesPerMillion } }\n : {}),\n sourceUrl: entry.source.url,\n contextTier: entry.contextTier\n }\n },\n decision: {\n observationId: observation.id,\n status: 'priced',\n reason: null,\n pricedTokens\n }\n };\n}\n\nfunction matchContext(\n rule: RetailPriceContextRule,\n observation: ReturnType<typeof normalizeTokenObservation>\n): 'match' | 'no-match' | 'unknown' {\n if (rule.kind === 'fixed') return 'match';\n if (observation.timePrecision !== 'event') return 'unknown';\n if (rule.kind === 'prompt-tokens') {\n if (observation.aggregationTemporality !== 'delta') return 'unknown';\n const promptTokens = observation.inputTokens + observation.cacheReadTokens;\n if (rule.minimumExclusive !== undefined && promptTokens <= rule.minimumExclusive) {\n return 'no-match';\n }\n if (rule.maximumInclusive !== undefined && promptTokens > rule.maximumInclusive) {\n return 'no-match';\n }\n return 'match';\n }\n const observedAt = new Date(observation.observedAt);\n if (Number.isNaN(observedAt.getTime())) return 'unknown';\n const inWeekday = rule.weekdays.includes(observedAt.getUTCDay());\n const hour = observedAt.getUTCHours();\n const inRange = inWeekday\n ? rule.ranges.some((range) => hour >= range.startHour && hour < range.endHour)\n : false;\n return (rule.match === 'inside' ? inRange : !inRange) ? 'match' : 'no-match';\n}\n\nfunction preciseMoney(value: number): number {\n return Number(value.toFixed(12));\n}\n","import type {\n DataAuthority,\n ExchangeRateSnapshot,\n PlanBillingPeriod,\n PlanCatalog,\n PlanCatalogEntry,\n PlanSubscription,\n WorkbenchMoneyMetric,\n WorkbenchPlanBillingPeriod,\n WorkbenchPlanMoneyAmount,\n WorkbenchPlanValue,\n WorkbenchPlanValueEntry,\n WorkbenchPlanValueMeteredDomain,\n WorkbenchPlanValueUnconfiguredDomain\n} from './types.js';\n\nexport type { PlanCatalog, PlanCatalogEntry };\n\n/**\n * Average calendar lengths. A plan price is prorated over the average length of\n * its own billing period so a 30-day window is not silently charged a full\n * month.\n */\nexport const PLAN_PERIOD_DAYS: Record<PlanBillingPeriod, number> = {\n monthly: 365.25 / 12,\n annual: 365.25\n};\n\nconst MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;\nconst STALE_RATE_MILLISECONDS = 7 * MILLISECONDS_PER_DAY;\n\n/**\n * Preset subscription prices. Every entry cites the official page it was read\n * from; a plan whose official price could not be read is absent rather than\n * guessed, and the user enters it manually. Presets stay editable because\n * regional pricing, annual billing, and team seats are not represented here.\n */\nexport const SUBSCRIPTION_PLAN_CATALOG: PlanCatalog = {\n version: '2026-08-30',\n entries: [\n {\n id: 'claude-pro-monthly',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n displayName: 'Claude Pro',\n amount: 20,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'Claude plans and pricing',\n url: 'https://claude.com/pricing',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'claude-pro-annual',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n displayName: 'Claude Pro (annual billing)',\n amount: 17 * 12,\n currency: 'USD',\n billingPeriod: 'annual',\n source: {\n title: 'Claude plans and pricing',\n url: 'https://claude.com/pricing',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'claude-max-5x',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n displayName: 'Claude Max 5x',\n amount: 100,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'What is the Max plan?',\n url: 'https://support.claude.com/en/articles/11049741-what-is-the-max-plan',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'claude-max-20x',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n displayName: 'Claude Max 20x',\n amount: 200,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'What is the Max plan?',\n url: 'https://support.claude.com/en/articles/11049741-what-is-the-max-plan',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'chatgpt-plus',\n providerId: 'codex',\n billingDomainId: 'subscription',\n displayName: 'ChatGPT Plus',\n amount: 20,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'ChatGPT pricing',\n url: 'https://chatgpt.com/pricing/',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'chatgpt-pro-100',\n providerId: 'codex',\n billingDomainId: 'subscription',\n displayName: 'ChatGPT Pro (5x)',\n amount: 100,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'About ChatGPT Pro tiers',\n url: 'https://help.openai.com/en/articles/9793128-about-chatgpt-pro-tiers',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'chatgpt-pro-200',\n providerId: 'codex',\n billingDomainId: 'subscription',\n displayName: 'ChatGPT Pro (20x)',\n amount: 200,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'About ChatGPT Pro tiers',\n url: 'https://help.openai.com/en/articles/9793128-about-chatgpt-pro-tiers',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'chatgpt-business-seat',\n providerId: 'codex',\n billingDomainId: 'subscription',\n displayName: 'ChatGPT Business (one seat)',\n amount: 25,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'ChatGPT Business pricing',\n url: 'https://openai.com/business/chatgpt-pricing/',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'opencode-go-monthly',\n providerId: 'opencode-go',\n billingDomainId: 'go-subscription',\n displayName: 'OpenCode Go',\n amount: 10,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'OpenCode Go',\n url: 'https://opencode.ai/go',\n retrievedAt: '2026-08-30'\n }\n }\n ]\n};\n\n/**\n * Measures the subscription's own period to date against the whole period\n * price. Elapsed and total days travel with it so a cycle that has barely\n * started is never read as a poor result.\n */\nfunction buildBillingPeriod(\n subscription: PlanSubscription,\n summary: PlanBillingPeriodSummary | undefined,\n comparisonCurrency: string,\n rates: ExchangeRateSnapshot[]\n): WorkbenchPlanBillingPeriod | null {\n if (!summary) return null;\n const start = new Date(summary.start).getTime();\n const end = new Date(summary.end).getTime();\n const observedThrough = new Date(summary.observedThrough).getTime();\n const totalDays = (end - start) / MILLISECONDS_PER_DAY;\n const elapsedDays = Math.max(0, Math.min(observedThrough, end) - start) / MILLISECONDS_PER_DAY;\n const periodCost = planMoneyAmount(\n preciseAmount(subscription.amount),\n subscription.currency,\n comparisonCurrency,\n // The period's own rate evidence first, so a short rolling window cannot\n // leave a cycle amount unconverted.\n [...summary.retailEquivalent.exchangeRates, ...rates],\n summary.observedThrough\n );\n const retailAmount =\n summary.retailEquivalent.status === 'available' ? summary.retailEquivalent.amount : null;\n const breakEvenRatio =\n periodCost.amount !== null && periodCost.amount > 0 && retailAmount !== null\n ? preciseAmount(retailAmount / periodCost.amount)\n : null;\n return {\n start: summary.start,\n end: summary.end,\n elapsedDays: preciseAmount(elapsedDays),\n totalDays: preciseAmount(totalDays),\n progress: totalDays > 0 ? preciseAmount(Math.min(1, elapsedDays / totalDays)) : 0,\n periodCost,\n recordedTokens: summary.observationCount > 0 ? summary.recordedTokens : null,\n retailEquivalent: summary.retailEquivalent,\n breakEvenRatio,\n ratioBound: ratioBoundFor(breakEvenRatio, summary.retailEquivalent.pricingCoverage)\n };\n}\n\nexport function planCatalogEntry(catalog: PlanCatalog, id: string): PlanCatalogEntry | null {\n return catalog.entries.find((entry) => entry.id === id) ?? null;\n}\n\nexport function planCatalogEntriesForDomain(\n catalog: PlanCatalog,\n providerId: string,\n billingDomainId: string\n): PlanCatalogEntry[] {\n return catalog.entries.filter(\n (entry) => entry.providerId === providerId && entry.billingDomainId === billingDomainId\n );\n}\n\nexport function planCatalogDomains(\n catalog: PlanCatalog\n): Array<{ providerId: string; billingDomainId: string }> {\n const seen = new Map<string, { providerId: string; billingDomainId: string }>();\n for (const entry of catalog.entries) {\n seen.set(`${entry.providerId}:${entry.billingDomainId}`, {\n providerId: entry.providerId,\n billingDomainId: entry.billingDomainId\n });\n }\n return [...seen.values()];\n}\n\nfunction addMonths(date: Date, months: number): Date {\n const day = date.getUTCDate();\n const shifted = new Date(\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth() + months,\n 1,\n date.getUTCHours(),\n date.getUTCMinutes(),\n date.getUTCSeconds(),\n date.getUTCMilliseconds()\n )\n );\n // A 31st anchor lands on the last day of a shorter month, the way billing\n // providers clamp it.\n const lastDayOfMonth = new Date(\n Date.UTC(shifted.getUTCFullYear(), shifted.getUTCMonth() + 1, 0)\n ).getUTCDate();\n shifted.setUTCDate(Math.min(day, lastDayOfMonth));\n return shifted;\n}\n\n/**\n * The billing period that contains `at`, derived by stepping a declared renewal\n * date forward or backward by whole periods. Any past or future renewal date\n * therefore resolves the same current period.\n */\nexport function billingPeriodContaining(\n anchorDate: string,\n billingPeriod: PlanBillingPeriod,\n at: Date\n): { start: Date; end: Date } | null {\n const anchor = new Date(anchorDate.length === 10 ? `${anchorDate}T00:00:00.000Z` : anchorDate);\n if (Number.isNaN(anchor.getTime())) return null;\n const step = billingPeriod === 'monthly' ? 1 : 12;\n const monthsApart =\n (at.getUTCFullYear() - anchor.getUTCFullYear()) * 12 +\n (at.getUTCMonth() - anchor.getUTCMonth());\n let index = Math.floor(monthsApart / step);\n let start = addMonths(anchor, index * step);\n while (start.getTime() > at.getTime()) {\n index -= 1;\n start = addMonths(anchor, index * step);\n }\n let end = addMonths(anchor, (index + 1) * step);\n while (end.getTime() <= at.getTime()) {\n index += 1;\n start = end;\n end = addMonths(anchor, (index + 1) * step);\n }\n return { start, end };\n}\n\nexport function windowDays(start: string, end: string): number {\n const span = new Date(end).getTime() - new Date(start).getTime();\n return span > 0 ? span / MILLISECONDS_PER_DAY : 0;\n}\n\n/**\n * The share of one plan price that the selected window covers. It is a\n * comparison denominator computed at read time and never a stored cost record.\n */\nexport function proratePlanPrice(\n amount: number,\n billingPeriod: PlanBillingPeriod,\n days: number\n): number {\n return (amount * days) / PLAN_PERIOD_DAYS[billingPeriod];\n}\n\ninterface ConvertedPlanAmount {\n amount: number | null;\n reason: WorkbenchPlanMoneyAmount['conversionUnavailableReason'];\n rate: ExchangeRateSnapshot | null;\n}\n\nfunction convertPlanAmount(\n amount: number,\n currency: string,\n comparisonCurrency: string,\n rates: ExchangeRateSnapshot[],\n end: string\n): ConvertedPlanAmount {\n if (currency.toUpperCase() === comparisonCurrency.toUpperCase()) {\n return { amount, reason: null, rate: null };\n }\n const rate = rates.find(\n (candidate) =>\n candidate.baseCurrency.toUpperCase() === currency.toUpperCase() &&\n candidate.quoteCurrency.toUpperCase() === comparisonCurrency.toUpperCase()\n );\n if (!rate) return { amount: null, reason: 'missing-rate', rate: null };\n if (new Date(end).getTime() - new Date(rate.observedAt).getTime() > STALE_RATE_MILLISECONDS) {\n return { amount: null, reason: 'stale-rate', rate };\n }\n return { amount: amount * rate.rate, reason: null, rate };\n}\n\nfunction preciseAmount(value: number): number {\n return Number(value.toPrecision(12));\n}\n\nfunction planMoneyAmount(\n nativeAmount: number,\n nativeCurrency: string,\n comparisonCurrency: string,\n rates: ExchangeRateSnapshot[],\n end: string\n): WorkbenchPlanMoneyAmount {\n const converted = convertPlanAmount(nativeAmount, nativeCurrency, comparisonCurrency, rates, end);\n return {\n status: converted.amount === null ? 'unavailable' : 'available',\n amount: converted.amount === null ? null : preciseAmount(converted.amount),\n nativeAmount,\n nativeCurrency,\n comparisonCurrency,\n conversionUnavailableReason: converted.reason,\n exchangeRates: converted.rate ? [converted.rate] : []\n };\n}\n\n/**\n * Partly priced Tokens can only prove a floor: the ratio is reported as a lower\n * bound rather than an exact multiple.\n */\nfunction ratioBoundFor(\n ratio: number | null,\n pricingCoverage: number | null\n): WorkbenchPlanValueEntry['ratioBound'] {\n if (ratio === null) return 'unavailable';\n return pricingCoverage !== null && pricingCoverage < 0.999 ? 'lower' : 'exact';\n}\n\nfunction unitPricePerMillion(amount: number | null, tokens: number): number | null {\n if (amount === null || tokens <= 0) return null;\n return preciseAmount(amount / (tokens / 1_000_000));\n}\n\nexport interface PlanBillingPeriodSummary {\n start: string;\n end: string;\n observedThrough: string;\n recordedTokens: number;\n observationCount: number;\n retailEquivalent: WorkbenchMoneyMetric;\n}\n\nexport interface PlanValueDomainInput {\n providerId: string;\n providerDisplayName: string;\n billingDomainId: string;\n billingDomainDisplayName: string;\n includedInHeadline: boolean;\n recordedTokens: number;\n observationCount: number;\n retailEquivalent: WorkbenchMoneyMetric;\n actualCost: WorkbenchMoneyMetric;\n authorities: DataAuthority[];\n lastObservedAt: string | null;\n}\n\nexport interface BuildPlanValueOptions {\n domains: PlanValueDomainInput[];\n subscriptions: PlanSubscription[];\n comparisonCurrency: string;\n start: string;\n end: string;\n rates: ExchangeRateSnapshot[];\n /** Cycle-to-date evidence keyed by `providerId:billingDomainId`. */\n billingPeriods?: Map<string, PlanBillingPeriodSummary>;\n}\n\n/**\n * Compares what one subscription costs for the selected window against the API\n * retail equivalent of the Tokens it produced. The two amounts keep their\n * separate purposes: the result is a ratio, never a combined total.\n */\nexport function buildWorkbenchPlanValue(options: BuildPlanValueOptions): WorkbenchPlanValue {\n const { comparisonCurrency, start, end, rates } = options;\n const days = windowDays(start, end);\n const subscriptionByDomain = new Map(\n options.subscriptions.map((subscription) => [\n `${subscription.providerId}:${subscription.billingDomainId}`,\n subscription\n ])\n );\n\n const entries: WorkbenchPlanValueEntry[] = [];\n const metered: WorkbenchPlanValueMeteredDomain[] = [];\n const unconfigured: WorkbenchPlanValueUnconfiguredDomain[] = [];\n\n for (const domain of options.domains) {\n const subscription = subscriptionByDomain.get(`${domain.providerId}:${domain.billingDomainId}`);\n if (!subscription) {\n if (domain.actualCost.records > 0) {\n metered.push({\n providerId: domain.providerId,\n providerDisplayName: domain.providerDisplayName,\n billingDomainId: domain.billingDomainId,\n billingDomainDisplayName: domain.billingDomainDisplayName,\n recordedTokens: domain.observationCount > 0 ? domain.recordedTokens : null,\n actualCost: domain.actualCost,\n retailEquivalent: domain.retailEquivalent\n });\n continue;\n }\n if (domain.observationCount > 0) {\n unconfigured.push({\n providerId: domain.providerId,\n providerDisplayName: domain.providerDisplayName,\n billingDomainId: domain.billingDomainId,\n billingDomainDisplayName: domain.billingDomainDisplayName,\n recordedTokens: domain.recordedTokens\n });\n }\n continue;\n }\n\n const windowPlanCost = planMoneyAmount(\n preciseAmount(proratePlanPrice(subscription.amount, subscription.billingPeriod, days)),\n subscription.currency,\n comparisonCurrency,\n rates,\n end\n );\n\n const retail = domain.retailEquivalent;\n const retailAmount = retail.status === 'available' ? retail.amount : null;\n const valueRatio =\n windowPlanCost.amount !== null && windowPlanCost.amount > 0 && retailAmount !== null\n ? preciseAmount(retailAmount / windowPlanCost.amount)\n : null;\n const ratioBound = ratioBoundFor(valueRatio, retail.pricingCoverage);\n const billingPeriod = buildBillingPeriod(\n subscription,\n options.billingPeriods?.get(`${domain.providerId}:${domain.billingDomainId}`),\n comparisonCurrency,\n rates\n );\n\n entries.push({\n providerId: domain.providerId,\n providerDisplayName: domain.providerDisplayName,\n billingDomainId: domain.billingDomainId,\n billingDomainDisplayName: domain.billingDomainDisplayName,\n includedInHeadline: domain.includedInHeadline,\n plan: {\n planId: subscription.planId,\n displayName: subscription.displayName,\n amount: subscription.amount,\n currency: subscription.currency,\n billingPeriod: subscription.billingPeriod,\n anchorDate: subscription.anchorDate,\n priceSource: subscription.priceSource,\n updatedAt: subscription.updatedAt\n },\n windowDays: preciseAmount(days),\n windowPlanCost,\n billingPeriod,\n recordedTokens: domain.observationCount > 0 ? domain.recordedTokens : null,\n retailEquivalent: retail,\n valueRatio,\n ratioBound,\n status:\n valueRatio === null ? 'unavailable' : ratioBound === 'lower' ? 'partial' : 'available',\n effectiveUnitPrice: unitPricePerMillion(windowPlanCost.amount, domain.recordedTokens),\n retailUnitPrice: unitPricePerMillion(retailAmount, retail.pricedTokens),\n pricingCoverage: retail.pricingCoverage,\n authorities: domain.authorities,\n lastObservedAt: domain.lastObservedAt\n });\n }\n\n const rank = (entry: WorkbenchPlanValueEntry): number => entry.valueRatio ?? -1;\n entries.sort(\n (left, right) =>\n rank(right) - rank(left) ||\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n metered.sort((left, right) =>\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n unconfigured.sort(\n (left, right) =>\n right.recordedTokens - left.recordedTokens ||\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n\n return {\n windowDays: preciseAmount(days),\n comparisonCurrency,\n catalogVersion: SUBSCRIPTION_PLAN_CATALOG.version,\n entries,\n meteredDomains: metered,\n unconfiguredDomains: unconfigured\n };\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type {\n AgentProviderIndex,\n Connector,\n ConnectorSnapshot,\n ConnectorDiagnostic,\n ConnectorFailure,\n ConnectorPolicy,\n CollectionMode,\n CustomModelRate,\n CustomModelRateInput,\n DoctorReport,\n ExchangeRateProvider,\n LocalNotification,\n LocalNotifier,\n MonitoringSettings,\n PlanBillingPeriod,\n PlanCatalog,\n PlanEligibleDomain,\n PlanSettings,\n StartAtLoginManager,\n TelemetryIngestor,\n UsageOverview,\n UsageExportArtifact,\n UsageExportRequest,\n UsageQuery,\n UsageRepository,\n RetentionStatus,\n ProcessingModuleId,\n ProcessingStatus,\n ProviderOverview\n} from './types.js';\nimport type {\n ConfigureConnectorInput,\n ConnectorDefinition,\n ConnectorStatus,\n ConnectorStatusRecord,\n DiscoveryProbe,\n SecretStore\n} from './onboarding-types.js';\nimport { classifyDiagnosticCategory } from './diagnostic-category.js';\nimport { redactSensitiveText } from './redaction.js';\nimport { buildUsageExport } from './usage-export.js';\nimport {\n OFFICIAL_PRICING_CATALOG,\n deriveRetailEquivalentCosts,\n mergeCatalogWithCustomRates,\n type RetailPriceCatalog\n} from './retail-pricing.js';\nimport {\n SUBSCRIPTION_PLAN_CATALOG,\n planCatalogEntriesForDomain,\n planCatalogEntry\n} from './plan-pricing.js';\n\nexport interface PlanSubscriptionInput {\n providerId: string;\n billingDomainId: string;\n plan: {\n planId: string | null;\n amount?: number;\n currency?: string;\n billingPeriod?: PlanBillingPeriod;\n anchorDate?: string | null;\n } | null;\n}\n\nexport interface UsageApplicationOptions {\n repository: UsageRepository;\n connectors: Connector[];\n clock?: () => Date;\n connectorDefinitions?: ConnectorDefinition[];\n discoveryProbe?: DiscoveryProbe;\n secretStore?: SecretStore;\n telemetryIngestors?: TelemetryIngestor[];\n exchangeRateProvider?: ExchangeRateProvider;\n connectorPolicies?: Record<string, ConnectorPolicy>;\n notifier?: LocalNotifier;\n startAtLoginManager?: StartAtLoginManager;\n priceCatalog?: RetailPriceCatalog | null;\n planCatalog?: PlanCatalog;\n}\n\nexport interface RefreshOptions {\n userInitiated?: boolean;\n mode?: CollectionMode;\n}\n\nexport interface BackgroundProcessingOptions {\n userInitiated?: boolean;\n}\n\nexport class UsageApplication {\n readonly #repository: UsageRepository;\n readonly #connectors: Connector[];\n readonly #clock: () => Date;\n readonly #connectorDefinitions: ConnectorDefinition[];\n readonly #discoveryProbe?: DiscoveryProbe;\n readonly #secretStore?: SecretStore;\n readonly #telemetryIngestors: TelemetryIngestor[];\n readonly #exchangeRateProvider?: ExchangeRateProvider;\n readonly #connectorPolicies: Record<string, ConnectorPolicy>;\n readonly #notifier?: LocalNotifier;\n readonly #startAtLoginManager?: StartAtLoginManager;\n readonly #basePriceCatalog: RetailPriceCatalog | null;\n #priceCatalog: RetailPriceCatalog | null;\n readonly #planCatalog: PlanCatalog;\n #refreshPromise: Promise<void> | null = null;\n #refreshMode: CollectionMode | null = null;\n #backgroundPromise: Promise<void> | null = null;\n #queuedHardRebuildPromise: Promise<void> | null = null;\n #queuedUserProcessingPromise: Promise<void> | null = null;\n #userInitiatedProcessing = false;\n #databaseWriteQueue: Promise<void> = Promise.resolve();\n #processingStatus: ProcessingStatus;\n\n constructor(options: UsageApplicationOptions) {\n this.#repository = options.repository;\n this.#connectors = options.connectors;\n this.#clock = options.clock ?? (() => new Date());\n this.#connectorDefinitions = options.connectorDefinitions ?? [];\n this.#discoveryProbe = options.discoveryProbe;\n this.#secretStore = options.secretStore;\n this.#telemetryIngestors = options.telemetryIngestors ?? [];\n this.#exchangeRateProvider = options.exchangeRateProvider;\n this.#connectorPolicies = options.connectorPolicies ?? {};\n this.#notifier = options.notifier;\n this.#startAtLoginManager = options.startAtLoginManager;\n this.#basePriceCatalog =\n options.priceCatalog === undefined ? OFFICIAL_PRICING_CATALOG : options.priceCatalog;\n this.#priceCatalog = this.#resolvePriceCatalog();\n this.#planCatalog = options.planCatalog ?? SUBSCRIPTION_PLAN_CATALOG;\n this.#processingStatus = createProcessingStatus(this.#clock().toISOString(), false);\n }\n\n #resolvePriceCatalog(): RetailPriceCatalog | null {\n if (!this.#basePriceCatalog) return null;\n const customRates = this.#repository.getCustomModelRates?.() ?? [];\n return mergeCatalogWithCustomRates(this.#basePriceCatalog, customRates);\n }\n\n async #backfillRetailCosts(mode: CollectionMode): Promise<void> {\n if (\n !this.#priceCatalog ||\n (!this.#repository.getRetailPricingBackfillPage &&\n !this.#repository.getRetailPricingBackfillSnapshots) ||\n !this.#repository.saveDerivedCosts\n ) {\n return;\n }\n const catalogVersionKey = 'retail-pricing-catalog-version';\n if (\n mode === 'incremental' &&\n this.#repository.getApplicationState?.(catalogVersionKey) === this.#priceCatalog.version\n ) {\n return;\n }\n const calculatedAt = this.#clock().toISOString();\n if (mode === 'hard-rebuild') {\n this.#repository.saveApplicationState?.(catalogVersionKey, `rebuilding:${calculatedAt}`);\n if (this.#repository.deleteDerivedRetailCostsAsync) {\n await this.#repository.deleteDerivedRetailCostsAsync();\n } else {\n this.#repository.deleteDerivedRetailCosts?.();\n }\n }\n if (this.#repository.getRetailPricingBackfillPage) {\n let cursor = null;\n do {\n const page = this.#repository.getRetailPricingBackfillPage(cursor, 250);\n for (const snapshot of page.snapshots) {\n const costs = deriveRetailEquivalentCosts(\n snapshot,\n this.#priceCatalog,\n calculatedAt\n ).costs;\n if (costs.length > 0) this.#repository.saveDerivedCosts(snapshot.provider.id, costs);\n }\n cursor = page.nextCursor;\n if (cursor) await yieldToEventLoop();\n } while (cursor);\n } else {\n for (const snapshot of this.#repository.getRetailPricingBackfillSnapshots?.() ?? []) {\n const costs = deriveRetailEquivalentCosts(snapshot, this.#priceCatalog, calculatedAt).costs;\n if (costs.length > 0) this.#repository.saveDerivedCosts(snapshot.provider.id, costs);\n await yieldToEventLoop();\n }\n }\n this.#repository.saveApplicationState?.(catalogVersionKey, this.#priceCatalog.version);\n }\n\n getProcessingStatus(): ProcessingStatus {\n return structuredClone(this.#processingStatus);\n }\n\n startBackgroundProcessing(options: BackgroundProcessingOptions = {}): Promise<void> {\n return this.#startProcessing('incremental', options.userInitiated === true);\n }\n\n startHardRebuild(): Promise<void> {\n return this.#startProcessing('hard-rebuild', true);\n }\n\n #startProcessing(mode: CollectionMode, userInitiated: boolean): Promise<void> {\n if (this.#backgroundPromise) {\n if (mode === 'hard-rebuild' && !this.#processingStatus.hardRebuild) {\n this.#queuedHardRebuildPromise ??= this.#backgroundPromise\n .then(\n () => this.#startProcessing('hard-rebuild', true),\n () => this.#startProcessing('hard-rebuild', true)\n )\n .finally(() => {\n this.#queuedHardRebuildPromise = null;\n });\n return this.#queuedHardRebuildPromise;\n }\n // A person asking for fresh data must not inherit a scheduled run that\n // skips every connector still inside its collection interval.\n if (userInitiated && !this.#userInitiatedProcessing) {\n this.#queuedUserProcessingPromise ??= this.#backgroundPromise\n .then(\n () => this.#startProcessing(mode, true),\n () => this.#startProcessing(mode, true)\n )\n .finally(() => {\n this.#queuedUserProcessingPromise = null;\n });\n return this.#queuedUserProcessingPromise;\n }\n return this.#backgroundPromise;\n }\n this.#userInitiatedProcessing = userInitiated || mode === 'hard-rebuild';\n this.#processingStatus = createProcessingStatus(\n this.#clock().toISOString(),\n mode === 'hard-rebuild'\n );\n this.#backgroundPromise = this.#runProcessing(mode, this.#userInitiatedProcessing).finally(\n () => {\n this.#backgroundPromise = null;\n this.#userInitiatedProcessing = false;\n }\n );\n return this.#backgroundPromise;\n }\n\n async #runProcessing(mode: CollectionMode, userInitiated: boolean): Promise<void> {\n await this.#runModule('discovery', () => this.discoverConnectors().then(() => undefined));\n await this.#runModule('usage', () => this.refresh({ userInitiated, mode }));\n await this.#runModule('pricing', () =>\n this.#queueDatabaseWrite(async () => {\n await this.#repository.ensureQueryIndexes?.();\n await this.#backfillRetailCosts(mode);\n })\n );\n await this.#runModule('retention', async () => {\n await this.compactRetention();\n });\n }\n\n async #runModule(id: ProcessingModuleId, action: () => Promise<void>): Promise<void> {\n const module = this.#processingStatus.modules[id];\n module.state = 'running';\n module.startedAt = this.#clock().toISOString();\n module.message = null;\n try {\n await action();\n module.state = 'ready';\n } catch (error) {\n module.state = 'failed';\n module.message = redactSensitiveText(error instanceof Error ? error.message : String(error));\n } finally {\n module.completedAt = this.#clock().toISOString();\n }\n }\n\n refresh(options: RefreshOptions = {}): Promise<void> {\n const requestedMode = options.mode ?? 'incremental';\n if (this.#refreshPromise) {\n if (requestedMode === 'hard-rebuild' && this.#refreshMode !== 'hard-rebuild') {\n return this.#refreshPromise.then(\n () => this.refresh(options),\n () => this.refresh(options)\n );\n }\n return this.#refreshPromise;\n }\n this.#refreshMode = requestedMode;\n this.#refreshPromise = this.#queueDatabaseWrite(() => this.#performRefresh(options)).finally(\n () => {\n this.#refreshPromise = null;\n this.#refreshMode = null;\n }\n );\n return this.#refreshPromise;\n }\n\n async #performRefresh(options: RefreshOptions): Promise<void> {\n if (this.#exchangeRateProvider) {\n try {\n for (const rate of await this.#exchangeRateProvider.readRates()) {\n this.#repository.saveExchangeRateSnapshot(rate);\n }\n } catch {\n // Native amounts remain available when the optional comparison rate is unavailable.\n }\n }\n const connectorStates = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status.state])\n );\n const runtimeStates = new Map(\n this.#repository.getConnectorRuntimeStates().map((state) => [state.id, state])\n );\n await Promise.all(\n this.#connectors.map(async (connector) => {\n if (connector.consentId && connectorStates.get(connector.consentId) !== 'connected') {\n return;\n }\n const now = this.#clock();\n const runtime = runtimeStates.get(connector.id);\n if (\n !options.userInitiated &&\n runtime?.nextAllowedAt &&\n new Date(runtime.nextAllowedAt).getTime() > now.getTime()\n ) {\n return;\n }\n const policy = this.#connectorPolicies[connector.id] ?? {\n minimumIntervalMs: 0,\n timeoutMs: 30_000\n };\n try {\n const snapshot = await withTimeout(\n connector.collect({ mode: options.mode ?? 'incremental' }),\n policy.timeoutMs,\n `${connector.id} timed out`\n );\n this.#repository.saveSnapshot(this.#withRetailCosts(snapshot));\n if (snapshot.warnings && snapshot.warnings.length > 0) {\n const failure = redactFailure(combineFailures(snapshot.warnings));\n this.#repository.recordFailure(snapshot.provider, this.#clock().toISOString(), failure);\n this.#saveConnectorDiagnostic(\n connector,\n snapshot.provider.id,\n snapshot.billingDomains[0]?.id ??\n defaultBillingDomain(connector.id, this.#connectorDefinitions),\n failure\n );\n this.#recordConnectorOutcome(\n connector.id,\n now,\n policy,\n false,\n runtime?.failureCount ?? 0\n );\n } else {\n this.#saveHealthyConnectorDiagnostic(\n connector,\n snapshot.provider.id,\n snapshot.billingDomains[0]?.id ??\n defaultBillingDomain(connector.id, this.#connectorDefinitions),\n snapshot.observedAt\n );\n this.#recordConnectorOutcome(\n connector.id,\n now,\n policy,\n true,\n runtime?.failureCount ?? 0\n );\n }\n } catch (error) {\n const providerId = providerForConnector(connector.id, this.#connectorDefinitions);\n const failure = redactFailure(safeConnectorFailure(error));\n this.#repository.recordFailure(\n {\n id: providerId,\n displayName: displayNameForProvider(providerId, connector.displayName)\n },\n this.#clock().toISOString(),\n failure\n );\n this.#saveConnectorDiagnostic(\n connector,\n providerId,\n defaultBillingDomain(connector.id, this.#connectorDefinitions),\n failure\n );\n this.#recordConnectorOutcome(\n connector.id,\n now,\n policy,\n false,\n runtime?.failureCount ?? 0\n );\n }\n })\n );\n if (this.#repository.getMonitoringSettings().notificationsEnabled) {\n await this.#sendNotificationTransitions();\n }\n }\n\n #saveHealthyConnectorDiagnostic(\n connector: Connector,\n providerId: string,\n billingDomainId: string,\n lastSuccessAt: string\n ): void {\n this.#repository.saveConnectorDiagnostic({\n id: connector.id,\n providerId,\n billingDomainId,\n status: 'healthy',\n category: null,\n message: null,\n recovery: null,\n affectedCoverage: [],\n lastAttemptAt: this.#clock().toISOString(),\n lastSuccessAt\n });\n }\n\n #saveConnectorDiagnostic(\n connector: Connector,\n providerId: string,\n billingDomainId: string,\n failure: ConnectorFailure\n ): void {\n const prior = this.#repository\n .getConnectorDiagnostics()\n .find((diagnostic) => diagnostic.id === connector.id);\n this.#repository.saveConnectorDiagnostic({\n id: connector.id,\n providerId,\n billingDomainId,\n status: 'degraded',\n category: classifyDiagnosticCategory(failure.code, failure.message),\n message: failure.message,\n recovery: failure.recovery,\n affectedCoverage: expectedCoverageForConnector(connector.id, this.#connectorDefinitions),\n lastAttemptAt: this.#clock().toISOString(),\n lastSuccessAt: prior?.lastSuccessAt ?? null\n });\n }\n\n #recordConnectorOutcome(\n id: string,\n now: Date,\n policy: ConnectorPolicy,\n success: boolean,\n priorFailures: number\n ): void {\n const failureCount = success ? 0 : priorFailures + 1;\n const backoff = success\n ? policy.minimumIntervalMs\n : Math.max(\n policy.minimumIntervalMs,\n Math.min(60 * 60 * 1000, 60 * 1000 * 2 ** Math.max(0, failureCount - 1))\n );\n this.#repository.saveConnectorRuntimeState({\n id,\n lastAttemptAt: now.toISOString(),\n nextAllowedAt: new Date(now.getTime() + backoff).toISOString(),\n failureCount,\n outcome: success ? 'success' : 'failure'\n });\n if (success) this.#repository.saveNotificationState(`failure:${id}`, 'clear');\n }\n\n async getMonitoringSettings(): Promise<MonitoringSettings> {\n return this.#repository.getMonitoringSettings();\n }\n\n async updateMonitoringSettings(\n changes: Partial<MonitoringSettings>\n ): Promise<MonitoringSettings> {\n const current = this.#repository.getMonitoringSettings();\n const updated = { ...current, ...changes };\n if (updated.intervalMinutes < 1 || updated.intervalMinutes > 1_440) {\n throw new Error('Collection interval must be between 1 and 1440 minutes');\n }\n if (changes.startAtLogin !== undefined) {\n if (!this.#startAtLoginManager) throw new Error('Start-at-login management is unavailable');\n await this.#startAtLoginManager.setEnabled(changes.startAtLogin);\n }\n this.#repository.saveMonitoringSettings(updated);\n return updated;\n }\n\n async getMonitoringStatus(): Promise<{\n settings: MonitoringSettings;\n connectors: ReturnType<UsageRepository['getConnectorRuntimeStates']>;\n }> {\n return {\n settings: this.#repository.getMonitoringSettings(),\n connectors: this.#repository.getConnectorRuntimeStates()\n };\n }\n\n async getPlanSettings(): Promise<PlanSettings> {\n return {\n catalogVersion: this.#planCatalog.version,\n domains: this.#planEligibleDomains(),\n subscriptions: this.#repository.getPlanSubscriptions()\n };\n }\n\n async updatePlanSubscription(input: PlanSubscriptionInput): Promise<PlanSettings> {\n const domain = this.#planEligibleDomains().find(\n (candidate) =>\n candidate.providerId === input.providerId &&\n candidate.billingDomainId === input.billingDomainId\n );\n if (!domain) throw new Error('Unknown subscription billing domain');\n if (input.plan === null) {\n this.#repository.deletePlanSubscription(input.providerId, input.billingDomainId);\n return this.getPlanSettings();\n }\n\n const preset = input.plan.planId\n ? planCatalogEntry(this.#planCatalog, input.plan.planId)\n : null;\n if (input.plan.planId && !preset) throw new Error('Unknown plan preset');\n if (\n preset &&\n (preset.providerId !== input.providerId || preset.billingDomainId !== input.billingDomainId)\n ) {\n throw new Error('Plan preset belongs to another billing domain');\n }\n\n const amount = input.plan.amount ?? preset?.amount;\n if (amount === undefined) throw new Error('A plan price is required');\n if (!Number.isFinite(amount) || amount <= 0) {\n throw new Error('A plan price must be a positive amount');\n }\n const currency = (input.plan.currency ?? preset?.currency ?? 'USD').toUpperCase();\n if (!/^[A-Z]{3}$/.test(currency)) throw new Error('A plan currency must be a 3-letter code');\n const billingPeriod = input.plan.billingPeriod ?? preset?.billingPeriod ?? 'monthly';\n const anchorDate = input.plan.anchorDate ?? null;\n if (anchorDate !== null && Number.isNaN(new Date(`${anchorDate}T00:00:00.000Z`).getTime())) {\n throw new Error('A renewal date must be a calendar date');\n }\n\n const overridesPreset =\n preset !== null &&\n (amount !== preset.amount ||\n currency !== preset.currency.toUpperCase() ||\n billingPeriod !== preset.billingPeriod);\n\n this.#repository.savePlanSubscription({\n providerId: input.providerId,\n billingDomainId: input.billingDomainId,\n planId: preset?.id ?? null,\n displayName: preset?.displayName ?? '',\n amount,\n currency,\n billingPeriod,\n anchorDate,\n priceSource: preset && !overridesPreset ? 'catalog-preset' : 'user-entered',\n updatedAt: this.#clock().toISOString()\n });\n return this.getPlanSettings();\n }\n\n async getCustomModelRates(): Promise<CustomModelRate[]> {\n return this.#repository.getCustomModelRates?.() ?? [];\n }\n\n async getCustomModelRate(id: string): Promise<CustomModelRate | null> {\n return this.#repository.getCustomModelRate?.(id) ?? null;\n }\n\n async setCustomModelRate(input: CustomModelRateInput): Promise<CustomModelRate> {\n const providerId = input.providerId?.trim();\n if (!providerId) throw new Error('Provider ID is required');\n const model = input.model?.trim();\n if (!model) throw new Error('Model name is required');\n if (!Number.isFinite(input.inputRate) || input.inputRate < 0) {\n throw new Error('Input rate must be a non-negative number');\n }\n if (!Number.isFinite(input.outputRate) || input.outputRate < 0) {\n throw new Error('Output rate must be a non-negative number');\n }\n const cacheReadRate = input.cacheReadRate ?? 0;\n if (!Number.isFinite(cacheReadRate) || cacheReadRate < 0) {\n throw new Error('Cache read rate must be a non-negative number');\n }\n\n const rate: CustomModelRate = {\n id: input.id || `rate-${randomUUID()}`,\n providerId,\n billingDomainId: input.billingDomainId?.trim() || null,\n model,\n ratesPerMillion: {\n input: input.inputRate,\n output: input.outputRate,\n cacheRead: cacheReadRate\n },\n updatedAt: this.#clock().toISOString()\n };\n\n await this.#queueDatabaseWrite(() => {\n this.#repository.saveCustomModelRate?.(rate);\n });\n\n this.#priceCatalog = this.#resolvePriceCatalog();\n await this.#backfillRetailCosts('hard-rebuild');\n return rate;\n }\n\n async deleteCustomModelRate(id: string): Promise<boolean> {\n let deleted = false;\n await this.#queueDatabaseWrite(() => {\n deleted = this.#repository.deleteCustomModelRate?.(id) ?? false;\n });\n if (deleted) {\n this.#priceCatalog = this.#resolvePriceCatalog();\n await this.#backfillRetailCosts('hard-rebuild');\n }\n return deleted;\n }\n\n /**\n * A billing domain can carry a plan price when its connector does not report\n * an actual metered charge. Metered domains keep their own billed amounts and\n * never receive a declared subscription price.\n */\n #planEligibleDomains(): PlanEligibleDomain[] {\n const domains = new Map<string, PlanEligibleDomain>();\n for (const definition of this.#connectorDefinitions) {\n if (definition.expectedCoverage?.includes('actual-cost')) continue;\n const key = `${definition.target.provider.id}:${definition.target.billingDomain.id}`;\n if (domains.has(key)) continue;\n domains.set(key, {\n providerId: definition.target.provider.id,\n providerDisplayName: definition.target.provider.displayName,\n billingDomainId: definition.target.billingDomain.id,\n billingDomainDisplayName: definition.target.billingDomain.displayName,\n presets: planCatalogEntriesForDomain(\n this.#planCatalog,\n definition.target.provider.id,\n definition.target.billingDomain.id\n )\n });\n }\n return [...domains.values()].sort((left, right) =>\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n }\n\n async #sendNotificationTransitions(): Promise<void> {\n if (!this.#notifier) return;\n const overview = this.#repository.getOverview(this.#clock());\n for (const provider of overview.providers) {\n for (const bucket of provider.quotaBuckets) {\n if (bucket.usedPercent === null) continue;\n const prefix = `${provider.id}:${bucket.id}`;\n const usedKey = `quota-used:${prefix}`;\n const priorUsed = Number(this.#repository.getNotificationState(usedKey));\n if (Number.isFinite(priorUsed) && priorUsed - bucket.usedPercent >= 20) {\n await this.#notify({\n id: `reset:${prefix}:${bucket.resetsAt ?? this.#clock().toISOString()}`,\n kind: 'quota-reset',\n title: `${provider.displayName} quota reset`,\n message: `${bucket.label} usage returned to ${bucket.usedPercent}%.`,\n providerId: provider.id,\n bucketId: bucket.id,\n createdAt: this.#clock().toISOString()\n });\n }\n this.#repository.saveNotificationState(usedKey, String(bucket.usedPercent));\n const remaining = 100 - bucket.usedPercent;\n const level = remaining <= 5 ? '5' : remaining <= 20 ? '20' : 'normal';\n const levelKey = `quota-level:${prefix}`;\n const priorLevel = this.#repository.getNotificationState(levelKey) ?? 'normal';\n if (notificationLevel(level) > notificationLevel(priorLevel)) {\n await this.#notify({\n id: `quota:${prefix}:${level}:${bucket.resetsAt ?? 'unknown-reset'}`,\n kind: level === '5' ? 'low-quota-5' : 'low-quota-20',\n title: `${provider.displayName} quota is low`,\n message: `${bucket.label} has ${Math.max(0, remaining)}% remaining.`,\n providerId: provider.id,\n bucketId: bucket.id,\n createdAt: this.#clock().toISOString()\n });\n }\n this.#repository.saveNotificationState(levelKey, level);\n }\n for (const forecast of provider.forecasts.filter(\n (candidate) => !candidate.willLastUntilReset\n )) {\n const key = `forecast:${provider.id}:${forecast.bucketId}`;\n if (this.#repository.getNotificationState(key) !== forecast.resetsAt) {\n await this.#notify({\n id: `forecast:${provider.id}:${forecast.bucketId}:${forecast.resetsAt}`,\n kind: 'predicted-exhaustion',\n title: `${provider.displayName} may exhaust before reset`,\n message: `${forecast.label} is predicted to exhaust at ${forecast.predictedExhaustionAt}.`,\n providerId: provider.id,\n bucketId: forecast.bucketId,\n createdAt: this.#clock().toISOString()\n });\n this.#repository.saveNotificationState(key, forecast.resetsAt);\n }\n }\n }\n for (const runtime of this.#repository\n .getConnectorRuntimeStates()\n .filter((state) => state.failureCount >= 3)) {\n const key = `failure:${runtime.id}`;\n if (this.#repository.getNotificationState(key) !== 'active') {\n await this.#notify({\n id: `failure:${runtime.id}:${runtime.failureCount}`,\n kind: 'connector-failure',\n title: `${runtime.id} refresh is failing`,\n message: `${runtime.failureCount} consecutive refresh attempts failed.`,\n providerId: runtime.id,\n createdAt: this.#clock().toISOString()\n });\n this.#repository.saveNotificationState(key, 'active');\n }\n }\n }\n\n async #notify(event: LocalNotification): Promise<void> {\n try {\n await this.#notifier?.notify(event);\n } catch {\n // Notification delivery must never fail collection.\n }\n }\n\n async getDiagnostics(): Promise<DoctorReport> {\n const now = this.#clock();\n const overview = this.#repository.getOverview(now);\n const stored = new Map(\n this.#repository\n .getConnectorDiagnostics()\n .map((diagnostic) => [diagnostic.id, withStaleDiagnostic(diagnostic, now)])\n );\n const statuses = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status])\n );\n\n for (const definition of this.#connectorDefinitions) {\n if (stored.has(definition.id)) continue;\n const status = statuses.get(definition.id) ?? emptyConnectorStatus(definition.id);\n const connected = status.state === 'connected';\n const category = connected\n ? null\n : !status.installed && definition.command !== null\n ? 'missing-binary'\n : 'not-configured';\n stored.set(definition.id, {\n id: definition.id,\n providerId: definition.target.provider.id,\n billingDomainId: definition.target.billingDomain.id,\n status: connected ? 'healthy' : 'degraded',\n category,\n message: connected\n ? null\n : category === 'missing-binary'\n ? `${definition.displayName} is not installed.`\n : `${definition.displayName} is not configured.`,\n recovery: connected\n ? null\n : category === 'missing-binary'\n ? `Install ${definition.displayName}, then retry discovery.`\n : `Connect ${definition.displayName} in onboarding.`,\n affectedCoverage: connected ? [] : definition.expectedCoverage,\n lastAttemptAt: status.lastDiscoveredAt ?? now.toISOString(),\n lastSuccessAt: null\n });\n }\n\n const connectors = [...stored.values()].sort((left, right) => left.id.localeCompare(right.id));\n return {\n generatedAt: now.toISOString(),\n daemon: { status: 'healthy' },\n database: { status: 'healthy' },\n connectors,\n providers: overview.providers.map((provider) => {\n const diagnostics = connectors.filter(\n (diagnostic) => diagnostic.providerId === provider.id\n );\n const degraded = diagnostics.some((diagnostic) => diagnostic.status === 'degraded');\n const domainIds = new Set([\n ...provider.billingDomains.map((domain) => domain.id),\n ...diagnostics.flatMap((diagnostic) =>\n diagnostic.billingDomainId ? [diagnostic.billingDomainId] : []\n )\n ]);\n return {\n id: provider.id,\n displayName: provider.displayName,\n status: degraded ? ('degraded' as const) : ('healthy' as const),\n freshness: provider.freshness,\n health: provider.health,\n billingDomains: [...domainIds].sort().map((domainId) => {\n const diagnostic = diagnostics.find(\n (candidate) => candidate.billingDomainId === domainId\n );\n const domain = provider.billingDomains.find((candidate) => candidate.id === domainId);\n return {\n id: domainId,\n displayName:\n domain?.displayName ??\n billingDomainDisplayName(domainId, this.#connectorDefinitions),\n status: diagnostic?.status ?? ('healthy' as const),\n category: diagnostic?.category ?? null,\n affectedCoverage: diagnostic?.affectedCoverage ?? [],\n recovery: diagnostic?.recovery ?? null\n };\n })\n };\n })\n };\n }\n\n async getOverview(query: UsageQuery = {}): Promise<UsageOverview> {\n return this.#repository.getOverview(this.#clock(), query);\n }\n\n async getAgentProviderIndex(): Promise<AgentProviderIndex> {\n const now = this.#clock();\n return (\n this.#repository.getAgentProviderIndex?.(now) ??\n pickAgentProviderIndex(this.#repository.getOverview(now))\n );\n }\n\n async getProviderOverview(\n providerId: string,\n query: UsageQuery = {}\n ): Promise<ProviderOverview | null> {\n const now = this.#clock();\n return (\n this.#repository.getProviderOverview?.(now, providerId, query) ??\n this.#repository\n .getOverview(now, query)\n .providers.find((provider) => provider.id === providerId) ??\n null\n );\n }\n\n async exportUsage(request: UsageExportRequest): Promise<UsageExportArtifact> {\n // An export is the audit artefact: it reports every observation and cost record\n // behind the totals, not only the aggregates the Dashboard renders.\n const overview = this.#repository.getOverview(this.#clock(), {\n ...request,\n auditEvidence: true\n });\n const accountIdentifiers = request.includeAccountIdentifiers\n ? this.#repository.getProviderAccountIdentifiers()\n : {};\n return buildUsageExport(overview, request, accountIdentifiers);\n }\n\n async getRetentionStatus(): Promise<RetentionStatus> {\n return this.#repository.getRetentionStatus();\n }\n\n async compactRetention(): Promise<RetentionStatus> {\n return this.#queueDatabaseWrite(async () => {\n if (this.#repository.maintainUsageHistory) {\n return this.#repository.maintainUsageHistory(this.#clock());\n }\n await this.#repository.ensureQueryIndexes?.();\n return this.#repository.compactUsageHistory(this.#clock());\n });\n }\n\n async clearData(input: {\n deleteProductSecrets: boolean;\n }): Promise<{ usageCleared: true; productSecretsDeleted: number }> {\n let productSecretsDeleted = 0;\n if (input.deleteProductSecrets) {\n if (!this.#secretStore) throw new Error('Product secret management is unavailable');\n const records = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status])\n );\n for (const definition of this.#connectorDefinitions.filter(\n (candidate) => candidate.credentialOwner === 'agent-usage'\n )) {\n const record = records.get(definition.id);\n if (!record?.secretReference) continue;\n await this.#secretStore.delete(record.secretReference);\n this.#repository.saveConnectorStatus({\n ...record,\n state: record.installed ? 'discovered' : 'not-installed',\n secretReference: null\n });\n productSecretsDeleted += 1;\n }\n }\n this.#repository.clearUsageData();\n return { usageCleared: true, productSecretsDeleted };\n }\n\n async ingestTelemetry(id: string, payload: unknown): Promise<void> {\n const ingestor = this.#telemetryIngestors.find((candidate) => candidate.id === id);\n if (!ingestor) throw new Error(`Unknown telemetry source: ${id}`);\n if (ingestor.consentId) {\n const status = this.#repository\n .getConnectorStatuses()\n .find((candidate) => candidate.id === ingestor.consentId);\n if (status?.state !== 'connected') throw new Error('Telemetry source is not connected');\n }\n const snapshot = ingestor.parse(payload, this.#clock());\n if (snapshot.usage.length === 0 && snapshot.costs.length === 0) {\n throw new Error('Telemetry payload contained no supported metrics');\n }\n await this.#queueDatabaseWrite(() => {\n this.#repository.saveSnapshot(this.#withRetailCosts(snapshot), { preserveFailure: true });\n });\n }\n\n #queueDatabaseWrite<T>(action: () => T | Promise<T>): Promise<T> {\n const result = this.#databaseWriteQueue.then(action, action);\n this.#databaseWriteQueue = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n }\n\n #withRetailCosts(snapshot: ConnectorSnapshot): ConnectorSnapshot {\n const retailCosts = this.#priceCatalog\n ? deriveRetailEquivalentCosts(snapshot, this.#priceCatalog, this.#clock().toISOString()).costs\n : [];\n return { ...snapshot, costs: [...snapshot.costs, ...retailCosts] };\n }\n\n async discoverConnectors(): Promise<ConnectorStatus[]> {\n if (!this.#discoveryProbe) return this.getConnectorStatuses();\n const existing = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status])\n );\n await Promise.all(\n this.#connectorDefinitions.map(async (definition) => {\n try {\n const inspection = await this.#discoveryProbe!.inspect(definition);\n const prior = existing.get(definition.id);\n const explicitState = prior?.state === 'connected' || prior?.state === 'skipped';\n this.#repository.saveConnectorStatus({\n id: definition.id,\n state: explicitState\n ? prior.state\n : inspection.installed\n ? 'discovered'\n : 'not-installed',\n installed: inspection.installed,\n binaryPath: inspection.binaryPath,\n officialCredentialPresent: inspection.officialCredentialPresent,\n errorCode: null,\n lastDiscoveredAt: this.#clock().toISOString(),\n secretReference: prior?.secretReference ?? null\n });\n } catch {\n const prior = existing.get(definition.id);\n this.#repository.saveConnectorStatus({\n id: definition.id,\n state: 'error',\n installed: prior?.installed ?? false,\n binaryPath: prior?.binaryPath ?? null,\n officialCredentialPresent: prior?.officialCredentialPresent ?? false,\n errorCode: 'discovery-failed',\n lastDiscoveredAt: this.#clock().toISOString(),\n secretReference: prior?.secretReference ?? null\n });\n }\n })\n );\n return this.getConnectorStatuses();\n }\n\n async getConnectorStatuses(): Promise<ConnectorStatus[]> {\n const records = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status])\n );\n return await Promise.all(\n this.#connectorDefinitions.map(async (definition) => {\n const record = records.get(definition.id) ?? emptyConnectorStatus(definition.id);\n return {\n ...record,\n displayName: definition.displayName,\n command: definition.command,\n permissionDescription: definition.permissionDescription,\n credentialOwner: definition.credentialOwner,\n experimental: definition.experimental,\n expectedCoverage: definition.expectedCoverage,\n target: definition.target,\n secretConfigured:\n record.secretReference !== null && this.#secretStore\n ? await this.#secretStore.has(record.secretReference)\n : false\n };\n })\n );\n }\n\n async configureConnector(id: string, input: ConfigureConnectorInput): Promise<ConnectorStatus> {\n const definition = this.#connectorDefinitions.find((candidate) => candidate.id === id);\n if (!definition) throw new Error(`Unknown connector: ${id}`);\n\n if (input.action === 'retry') {\n if (!this.#discoveryProbe) throw new Error('Connector discovery is unavailable');\n const inspection = await this.#discoveryProbe.inspect(definition);\n const prior = this.#repository.getConnectorStatuses().find((status) => status.id === id);\n this.#repository.saveConnectorStatus({\n id,\n state:\n inspection.installed && prior?.state === 'connected'\n ? 'connected'\n : inspection.installed\n ? 'discovered'\n : 'not-installed',\n installed: inspection.installed,\n binaryPath: inspection.binaryPath,\n officialCredentialPresent: inspection.officialCredentialPresent,\n errorCode: null,\n lastDiscoveredAt: this.#clock().toISOString(),\n secretReference: prior?.secretReference ?? null\n });\n } else {\n const prior = this.#repository.getConnectorStatuses().find((status) => status.id === id);\n const secretReference = `connector:${id}`;\n if (input.action === 'connect' && definition.credentialOwner === 'agent-usage') {\n if (!input.secret || !this.#secretStore) throw new Error('A managed secret is required');\n await this.#secretStore.set(secretReference, input.secret);\n }\n this.#repository.saveConnectorStatus({\n id,\n state: input.action === 'connect' ? 'connected' : 'skipped',\n installed: prior?.installed ?? false,\n binaryPath: prior?.binaryPath ?? null,\n officialCredentialPresent: prior?.officialCredentialPresent ?? false,\n errorCode: null,\n lastDiscoveredAt: this.#clock().toISOString(),\n secretReference:\n input.action === 'connect' && definition.credentialOwner === 'agent-usage'\n ? secretReference\n : (prior?.secretReference ?? null)\n });\n }\n\n this.#repository.deleteConnectorDiagnostic(id);\n await this.refresh({ userInitiated: true });\n\n const status = (await this.getConnectorStatuses()).find((candidate) => candidate.id === id);\n if (!status) throw new Error(`Connector status disappeared: ${id}`);\n return status;\n }\n}\n\nfunction safeConnectorFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'connector-refresh-failed',\n message: 'Provider refresh failed.',\n recovery: 'Run agent-usage doctor, then retry refresh.'\n };\n}\n\nfunction combineFailures(failures: ConnectorFailure[]): ConnectorFailure {\n return {\n code: failures.map((failure) => failure.code).join(','),\n message: failures.map((failure) => failure.message).join(' '),\n recovery: [...new Set(failures.map((failure) => failure.recovery))].join(' ')\n };\n}\n\nfunction createProcessingStatus(startedAt: string, hardRebuild: boolean): ProcessingStatus {\n const module = () => ({\n state: 'pending' as const,\n startedAt: null,\n completedAt: null,\n message: null\n });\n return {\n startedAt,\n hardRebuild,\n modules: {\n discovery: module(),\n usage: module(),\n pricing: module(),\n retention: module()\n }\n };\n}\n\nfunction yieldToEventLoop(): Promise<void> {\n return new Promise((resolve) => setImmediate(resolve));\n}\n\nfunction providerForConnector(id: string, definitions: ConnectorDefinition[]): string {\n return definitions.find((definition) => definition.id === id)?.target.provider.id ?? id;\n}\n\nfunction displayNameForProvider(providerId: string, connectorDisplayName?: string): string {\n return providerId === 'grok' ? 'Grok' : (connectorDisplayName ?? providerId);\n}\n\nfunction defaultBillingDomain(id: string, definitions: ConnectorDefinition[]): string {\n return (\n definitions.find((definition) => definition.id === id)?.target.billingDomain.id ??\n 'subscription'\n );\n}\n\nfunction billingDomainDisplayName(id: string, definitions: ConnectorDefinition[]): string {\n return (\n definitions.find((definition) => definition.target.billingDomain.id === id)?.target\n .billingDomain.displayName ?? id\n );\n}\n\nfunction expectedCoverageForConnector(\n id: string,\n definitions: ConnectorDefinition[]\n): ConnectorDiagnostic['affectedCoverage'] {\n const configured = definitions.find((definition) => definition.id === id)?.expectedCoverage;\n if (configured) return configured;\n if (id === 'xai-api') return ['tokens', 'actual-cost', 'history'];\n return ['quota', 'tokens', 'history'];\n}\n\nfunction redactFailure(failure: ConnectorFailure): ConnectorFailure {\n return {\n code: failure.code,\n message: redactSensitiveText(failure.message),\n recovery: redactSensitiveText(failure.recovery)\n };\n}\n\nfunction withStaleDiagnostic(diagnostic: ConnectorDiagnostic, now: Date): ConnectorDiagnostic {\n if (\n diagnostic.status === 'healthy' &&\n diagnostic.lastSuccessAt &&\n now.getTime() - new Date(diagnostic.lastSuccessAt).getTime() > 15 * 60 * 1000\n ) {\n return {\n ...diagnostic,\n status: 'degraded',\n category: 'stale',\n message: 'The latest successful observation is stale.',\n recovery: 'Refresh this connector and check its credentials if staleness persists.',\n affectedCoverage: expectedCoverageForConnector(diagnostic.id, [])\n };\n }\n return diagnostic;\n}\n\nfunction emptyConnectorStatus(id: string): ConnectorStatusRecord {\n return {\n id,\n state: 'not-checked',\n installed: false,\n binaryPath: null,\n officialCredentialPresent: false,\n errorCode: null,\n lastDiscoveredAt: null,\n secretReference: null\n };\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(message)), timeoutMs);\n })\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nfunction notificationLevel(value: string): number {\n return value === '5' ? 2 : value === '20' ? 1 : 0;\n}\n\nfunction pickAgentProviderIndex(overview: UsageOverview): AgentProviderIndex {\n return {\n generatedAt: overview.generatedAt,\n providers: overview.providers\n .filter((provider) => provider.id !== 'opencode' && provider.id !== 'dsh')\n .map(({ id, displayName }) => ({ id, displayName }))\n };\n}\n","import type { ConnectorDefinition } from '../core/onboarding-types.js';\n\nexport const defaultConnectorDefinitions: ConnectorDefinition[] = [\n {\n id: 'codex',\n displayName: 'Codex',\n command: 'codex',\n permissionDescription: 'Read quota and usage through the installed official Codex client.',\n credentialOwner: 'official-client',\n experimental: false,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'codex', displayName: 'Codex' },\n billingDomain: { id: 'subscription', displayName: 'Subscription' }\n },\n officialCredentialPaths: ['.codex/auth.json']\n },\n {\n id: 'claude-code',\n displayName: 'Claude Code',\n command: 'claude',\n permissionDescription: 'Read opt-in telemetry and usage exposed by the official Claude client.',\n credentialOwner: 'official-client',\n experimental: true,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'claude-code', displayName: 'Claude Code' },\n billingDomain: { id: 'subscription', displayName: 'Subscription' }\n },\n officialCredentialPaths: ['.claude', '.claude.json']\n },\n {\n id: 'opencode-go',\n displayName: 'OpenCode',\n command: 'opencode',\n permissionDescription:\n 'Read local usage and optional Go account quota through official OpenCode surfaces.',\n credentialOwner: 'official-client',\n experimental: false,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'opencode-go', displayName: 'OpenCode Go' },\n billingDomain: { id: 'go-subscription', displayName: 'OpenCode Go' }\n },\n officialCredentialPaths: ['.local/share/opencode/auth.json']\n },\n {\n id: 'grok',\n displayName: 'Grok',\n command: 'grok',\n permissionDescription:\n 'Read opt-in Grok Build telemetry and official client billing capability.',\n credentialOwner: 'official-client',\n experimental: true,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'grok', displayName: 'Grok' },\n billingDomain: { id: 'grok-build-subscription', displayName: 'Build / SuperGrok' }\n },\n officialCredentialPaths: ['.grok/auth.json']\n },\n {\n id: 'xai-api',\n displayName: 'xAI API (Grok)',\n command: null,\n permissionDescription:\n 'Store a dedicated xAI Management API key in macOS Keychain for official billing data.',\n credentialOwner: 'agent-usage',\n experimental: false,\n expectedCoverage: ['tokens', 'actual-cost', 'history'],\n target: {\n provider: { id: 'grok', displayName: 'Grok' },\n billingDomain: { id: 'xai-api', displayName: 'xAI API' }\n }\n },\n {\n id: 'dsh',\n displayName: 'dsh',\n command: 'dsh',\n permissionDescription:\n 'Read local dsh session logs for token history. No credential file is opened.',\n credentialOwner: 'official-client',\n experimental: true,\n expectedCoverage: ['tokens', 'history'],\n target: {\n provider: { id: 'dsh', displayName: 'dsh' },\n billingDomain: { id: 'deepseek-official', displayName: 'DeepSeek API' }\n },\n officialCredentialPaths: ['.dsh']\n },\n {\n id: 'antigravity',\n displayName: 'Antigravity',\n command: 'agy',\n permissionDescription:\n 'Read local Antigravity conversation session databases for token history. No credential file is opened.',\n credentialOwner: 'official-client',\n experimental: true,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'antigravity', displayName: 'Antigravity' },\n billingDomain: { id: 'code-assist-subscription', displayName: 'Gemini Code Assist' }\n },\n\n officialCredentialPaths: ['.gemini/antigravity-cli', '.gemini/antigravity']\n }\n];\n","import type {\n Connector,\n CollectionRequest,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket\n} from '../../core/types.js';\nimport type { ParsedClaudeQuota } from './claude-usage-screen-client.js';\nimport type { TranscriptUsageClient } from '../../server/local-transcript-usage-client.js';\n\nexport interface ClaudeQuotaClient {\n readQuota(): Promise<ParsedClaudeQuota[]>;\n}\n\nexport interface ClaudeCodeConnectorOptions {\n quotaClient: ClaudeQuotaClient;\n historyClient?: TranscriptUsageClient;\n clock?: () => Date;\n}\n\nexport class ClaudeCodeConnector implements Connector {\n readonly id = 'claude-code';\n readonly displayName = 'Claude Code';\n readonly consentId = 'claude-code';\n readonly #quotaClient: ClaudeQuotaClient;\n readonly #historyClient?: TranscriptUsageClient;\n readonly #clock: () => Date;\n\n constructor(options: ClaudeCodeConnectorOptions) {\n this.#quotaClient = options.quotaClient;\n this.#historyClient = options.historyClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n let quota: ParsedClaudeQuota[] = [];\n const warnings: ConnectorFailure[] = [];\n try {\n quota = await this.#quotaClient.readQuota();\n } catch (error) {\n warnings.push(safeFailure(error));\n }\n const history = this.#historyClient\n ? await this.#historyClient.readUsage(options)\n : { usage: [], costs: [], complete: true };\n if (!history.complete) warnings.push(incompleteTranscriptFailure('Claude Code'));\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: [{ id: 'subscription', displayName: 'Claude subscription' }],\n quotaBuckets: quota.map(mapQuota),\n usage: history.usage,\n ...(history.usage.length > 0 && history.complete\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['claude-transcript:'],\n retiredIdPrefixes: ['claude-otel:']\n }\n }\n : {}),\n costs: history.costs,\n warnings,\n observedAt\n };\n }\n}\n\nfunction incompleteTranscriptFailure(provider: string): ConnectorFailure {\n return {\n code: 'local-transcript-scan-incomplete',\n message: `Some local ${provider} history could not be read.`,\n recovery: 'Agent Usage will retry automatically without removing stored history.'\n };\n}\n\nfunction mapQuota(quota: ParsedClaudeQuota): QuotaBucket {\n return {\n id: quota.id,\n billingDomainId: 'subscription',\n label: quota.label,\n usedPercent: quota.usedPercent,\n windowDurationMinutes: quota.windowDurationMinutes,\n resetsAt: quota.resetsAt,\n authority: 'official-client',\n scope: 'account-wide'\n };\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'claude-quota-adapter-failed',\n message: 'Claude Code subscription quota is unavailable.',\n recovery: 'Open Claude Code, run /usage, and update Claude Code before retrying.'\n };\n}\n","export interface OtlpPoint {\n timeUnixNano?: unknown;\n asInt?: unknown;\n asDouble?: unknown;\n attributes?: unknown;\n}\n\nexport interface OtlpMetric {\n name?: unknown;\n sum?: { dataPoints?: unknown; aggregationTemporality?: unknown };\n}\n\ninterface OtlpAttribute {\n key?: unknown;\n value?: { stringValue?: unknown };\n}\n\nexport function extractOtlpResources(payload: unknown): Record<string, unknown>[] {\n if (!isRecord(payload) || !Array.isArray(payload.resourceMetrics)) return [];\n return payload.resourceMetrics.filter(isRecord);\n}\n\nexport function extractOtlpMetrics(resource: Record<string, unknown>): OtlpMetric[] {\n if (!Array.isArray(resource.scopeMetrics)) return [];\n return resource.scopeMetrics\n .filter(isRecord)\n .flatMap((scope) => (Array.isArray(scope.metrics) ? (scope.metrics as OtlpMetric[]) : []));\n}\n\nexport function otlpStringAttributes(value: unknown): Map<string, string> {\n const result = new Map<string, string>();\n if (!Array.isArray(value)) return result;\n for (const attribute of value as OtlpAttribute[]) {\n if (typeof attribute.key === 'string' && typeof attribute.value?.stringValue === 'string') {\n result.set(attribute.key, attribute.value.stringValue);\n }\n }\n return result;\n}\n\nexport function isDeltaTemporality(value: unknown): boolean {\n return value === 1 || value === 'AGGREGATION_TEMPORALITY_DELTA';\n}\n\nexport function numericOtlpPointValue(point: OtlpPoint): number | null {\n const value = point.asDouble ?? point.asInt;\n const number = typeof value === 'number' || typeof value === 'string' ? Number(value) : NaN;\n return Number.isFinite(number) ? number : null;\n}\n\nexport function otlpNanoToIso(value: string): string {\n try {\n return new Date(Number(BigInt(value) / 1_000_000n)).toISOString();\n } catch {\n throw new Error('Invalid OTLP nanosecond timestamp');\n }\n}\n\nexport function readRecord(\n value: Record<string, unknown>,\n key: string\n): Record<string, unknown> | null {\n return isRecord(value[key]) ? value[key] : null;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n","import type { ConnectorSnapshot, CostRecord, UsageObservation } from '../../core/types.js';\nimport {\n extractOtlpMetrics,\n extractOtlpResources,\n isDeltaTemporality,\n numericOtlpPointValue,\n otlpNanoToIso,\n otlpStringAttributes,\n type OtlpPoint\n} from '../otlp.js';\n\ninterface UsageAggregate {\n timestamp: string;\n timePrecision: 'event' | 'unknown';\n model: string | null;\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n}\n\nexport class ClaudeTelemetryError extends Error {\n readonly code = 'claude-otel-temporality-unsupported';\n readonly recovery =\n 'Update Claude Code, restart it with delta telemetry enabled, then refresh Agent Usage.';\n\n constructor() {\n super('Cumulative Claude Code metrics cannot be safely added to local history.');\n this.name = 'ClaudeTelemetryError';\n }\n}\n\nexport function parseClaudeOtlpMetrics(payload: unknown, receivedAt: Date): ConnectorSnapshot {\n const metrics = extractOtlpResources(payload).flatMap(extractOtlpMetrics);\n const usage = new Map<string, UsageAggregate>();\n const costs: CostRecord[] = [];\n\n for (const metric of metrics) {\n const points = Array.isArray(metric.sum?.dataPoints)\n ? (metric.sum.dataPoints as OtlpPoint[])\n : [];\n if (\n ['claude_code.token.usage', 'claude_code.cost.usage'].includes(String(metric.name)) &&\n !isDeltaTemporality(metric.sum?.aggregationTemporality)\n ) {\n throw new ClaudeTelemetryError();\n }\n for (const point of points) {\n const attributes = otlpStringAttributes(point.attributes);\n const model = attributes.get('model') ?? null;\n const nano = typeof point.timeUnixNano === 'string' ? point.timeUnixNano : null;\n const timestamp = nano ? otlpNanoToIso(nano) : receivedAt.toISOString();\n const value = numericOtlpPointValue(point);\n if (value === null || value < 0) continue;\n\n if (metric.name === 'claude_code.token.usage') {\n const type = attributes.get('type');\n if (!['input', 'output', 'cacheRead', 'cacheCreation'].includes(type ?? '')) continue;\n const key = `${nano ?? receivedAt.getTime()}:${model ?? 'unknown-model'}`;\n const aggregate = usage.get(key) ?? {\n timestamp,\n timePrecision: nano ? 'event' : 'unknown',\n model,\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0\n };\n if (type === 'input') aggregate.input += value;\n if (type === 'output') aggregate.output += value;\n if (type === 'cacheRead') aggregate.cacheRead += value;\n if (type === 'cacheCreation') aggregate.cacheWrite += value;\n usage.set(key, aggregate);\n }\n if (metric.name === 'claude_code.cost.usage') {\n const key = `${nano ?? receivedAt.getTime()}:${model ?? 'unknown-model'}`;\n costs.push({\n id: `claude-otel-cost:${key}`,\n sourceId: `claude-otel:${key}`,\n billingDomainId: 'subscription',\n observedAt: timestamp,\n kind: 'reported-estimate',\n amount: value,\n currency: 'USD',\n authority: 'local-observation',\n model,\n usageObservationId: `claude-otel:${key}`,\n priceSnapshot: {\n id: 'claude-code-otlp-reported-cost-v1',\n version: '2026-08-28',\n source: 'Claude Code official OTLP reported cost',\n canonicalModel: model,\n effectiveAt: '2026-08-28T00:00:00.000Z',\n effectiveUntil: null,\n currency: 'USD',\n ratesPerMillion: {\n input: null,\n output: null,\n reasoning: null,\n 'cache-read': null,\n 'cache-write': null\n }\n }\n });\n }\n }\n }\n\n const observations: UsageObservation[] = [...usage.entries()].map(([key, item]) => ({\n id: `claude-otel:${key}`,\n billingDomainId: 'subscription',\n model: item.model,\n observedAt: item.timestamp,\n inputTokens: item.input,\n outputTokens: item.output,\n cacheReadTokens: item.cacheRead,\n cacheWriteTokens: item.cacheWrite,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: item.model ? 'known' : 'unclassified',\n timePrecision: item.timePrecision,\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n }));\n\n return {\n provider: { id: 'claude-code', displayName: 'Claude Code' },\n billingDomains: [{ id: 'subscription', displayName: 'Claude subscription' }],\n quotaBuckets: [],\n usage: observations,\n costs,\n observedAt: receivedAt.toISOString()\n };\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { Readable, Writable } from 'node:stream';\n\nimport type { ClaudeQuotaClient } from './claude-code-connector.js';\n\nexport interface ParsedClaudeQuota {\n id: string;\n label: string;\n usedPercent: number;\n windowDurationMinutes: number | null;\n resetsAt: string | null;\n}\n\nexport class ClaudeUsageAdapterError extends Error {\n readonly code: string;\n readonly recovery: string;\n\n constructor(code: string, message: string, recovery: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'ClaudeUsageAdapterError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport interface ClaudeUsageProcess {\n readonly stdin: Writable;\n readonly stdout: Readable;\n readonly stderr: Readable;\n once(event: 'error', listener: (error: Error) => void): this;\n once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;\n kill(signal?: NodeJS.Signals): boolean;\n}\n\nexport interface ScreenReaderClaudeQuotaClientOptions {\n command?: string;\n expectCommand?: string;\n timeoutMs?: number;\n clock?: () => Date;\n environment?: NodeJS.ProcessEnv;\n spawnProcess?: (\n command: string,\n arguments_: string[],\n options: { env: NodeJS.ProcessEnv }\n ) => ClaudeUsageProcess;\n}\n\nexport class ScreenReaderClaudeQuotaClient implements ClaudeQuotaClient {\n readonly #command: string;\n readonly #expectCommand: string;\n readonly #timeoutMs: number;\n readonly #clock: () => Date;\n readonly #environment: NodeJS.ProcessEnv;\n readonly #spawnProcess: NonNullable<ScreenReaderClaudeQuotaClientOptions['spawnProcess']>;\n\n constructor(options: ScreenReaderClaudeQuotaClientOptions = {}) {\n this.#command = options.command ?? 'claude';\n this.#expectCommand = options.expectCommand ?? '/usr/bin/expect';\n this.#timeoutMs = options.timeoutMs ?? 24_000;\n this.#clock = options.clock ?? (() => new Date());\n this.#environment = subscriptionEnvironment(options.environment ?? process.env);\n this.#spawnProcess =\n options.spawnProcess ??\n ((command, arguments_, spawnOptions) =>\n spawn(command, arguments_, {\n ...spawnOptions,\n stdio: ['pipe', 'pipe', 'pipe']\n }) as ChildProcessWithoutNullStreams);\n }\n\n async readQuota(): Promise<ParsedClaudeQuota[]> {\n if (!/^[a-zA-Z0-9_./-]+$/.test(this.#command)) {\n throw unavailableError(new Error('Unsafe Claude command path'));\n }\n let child: ClaudeUsageProcess;\n try {\n const [firstScreenTimeoutSeconds, redrawTimeoutSeconds] = usageTimeoutSeconds(\n this.#timeoutMs\n );\n child = this.#spawnProcess(\n this.#expectCommand,\n ['-c', expectScript(this.#command, firstScreenTimeoutSeconds, redrawTimeoutSeconds)],\n { env: this.#environment }\n );\n } catch (error) {\n throw unavailableError(error);\n }\n\n return await new Promise<ParsedClaudeQuota[]>((resolve, reject) => {\n let output = '';\n let settled = false;\n const finish = (result: ParsedClaudeQuota[] | Error, terminate = true) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n if (terminate) child.kill();\n if (result instanceof Error) reject(result);\n else resolve(result);\n };\n const timeout = setTimeout(\n () =>\n finish(\n new ClaudeUsageAdapterError(\n 'claude-usage-timeout',\n 'Claude Code did not return the usage screen in time.',\n 'Open Claude Code, run /usage, then retry.'\n )\n ),\n this.#timeoutMs\n );\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => {\n output += stripTerminalControls(chunk);\n if (\n /__CLAUDE_TRUST_REQUIRED__|Quick safety check|Is this a project you created/i.test(output)\n ) {\n finish(\n new ClaudeUsageAdapterError(\n 'claude-workspace-not-trusted',\n 'Claude Code has not trusted this workspace.',\n 'Open Claude Code in this folder, review the trust prompt, then retry.'\n )\n );\n return;\n }\n if (!/__CLAUDE_USAGE_DONE__/i.test(output)) return;\n try {\n finish(parseClaudeUsageScreen(output, this.#clock()), false);\n } catch (error) {\n finish(error instanceof Error ? error : schemaError(error));\n }\n });\n child.once('error', (error) => finish(unavailableError(error)));\n child.once('exit', (code, signal) => {\n if (settled) return;\n if (output.trim()) {\n try {\n finish(parseClaudeUsageScreen(output, this.#clock()));\n return;\n } catch (error) {\n if (error instanceof ClaudeUsageAdapterError) {\n finish(error);\n return;\n }\n }\n }\n finish(\n unavailableError(new Error(`Claude Code exited with ${String(code)} (${String(signal)})`))\n );\n });\n });\n }\n}\n\nfunction subscriptionEnvironment(environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const subscriptionEnvironment = { ...environment };\n for (const key of [\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n 'ANTHROPIC_BASE_URL',\n 'ANTHROPIC_MODEL',\n 'CLAUDE_CODE_USE_BEDROCK',\n 'CLAUDE_CODE_USE_VERTEX',\n 'CLAUDE_CODE_USE_FOUNDRY'\n ]) {\n delete subscriptionEnvironment[key];\n }\n return subscriptionEnvironment;\n}\n\nfunction usageTimeoutSeconds(timeoutMs: number): [number, number] {\n const usableSeconds = Math.max(2, Math.floor((timeoutMs - 2_000) / 1_000));\n const firstScreenTimeoutSeconds = Math.max(1, Math.min(8, usableSeconds - 1));\n return [firstScreenTimeoutSeconds, Math.max(1, usableSeconds - firstScreenTimeoutSeconds)];\n}\n\nfunction expectScript(\n command: string,\n firstScreenTimeoutSeconds: number,\n redrawTimeoutSeconds: number\n): string {\n return `log_user 1\nset timeout 1\nspawn {${command}} --safe-mode --ax-screen-reader\nexpect {\n -re {Quick safety check|Is this a project you created} {\n puts \"\\\\n__CLAUDE_TRUST_REQUIRED__\"\n exit 20\n }\n timeout {}\n eof { exit 22 }\n}\nsend -- \"/usage\\\\r\"\nset timeout ${firstScreenTimeoutSeconds}\nexpect {\n -re {Quick safety check|Is this a project you created} {\n puts \"\\\\n__CLAUDE_TRUST_REQUIRED__\"\n exit 20\n }\n -re {Esc to cancel} {\n set timeout ${redrawTimeoutSeconds}\n expect {\n -re {Current week \\\\(Fable\\\\)} {\n expect {\n -re {Esc to cancel} {}\n timeout {}\n eof { exit 22 }\n }\n }\n timeout {}\n eof { exit 22 }\n }\n send -- \"\\\\033\"\n after 100\n send -- \"/exit\\\\r\"\n after 500\n puts \"\\\\n__CLAUDE_USAGE_DONE__\"\n exit 0\n }\n timeout {\n puts \"\\\\n__CLAUDE_USAGE_TIMEOUT__\"\n exit 21\n }\n eof { exit 22 }\n}`;\n}\n\nexport function parseClaudeUsageScreen(text: string, now: Date): ParsedClaudeQuota[] {\n const lines = stripTerminalControls(text)\n .replace(/Esc to cancel/gi, '\\n')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n const quotas = new Map<string, ParsedClaudeQuota>();\n for (let index = 0; index < lines.length; index += 1) {\n const match = lines[index].match(/(\\d+(?:\\.\\d+)?)%\\s+used/i);\n if (!match) continue;\n const heading = findHeading(lines, index);\n if (!heading || /^Refreshing/i.test(heading)) continue;\n const resetLine = lines.slice(index + 1, index + 4).find((line) => /^Resets\\b/i.test(line));\n const id = slugify(heading);\n quotas.set(id, {\n id,\n label: displayLabel(heading),\n usedPercent: Number(match[1]),\n windowDurationMinutes: windowDurationMinutes(heading),\n resetsAt: resetLine ? parseReset(resetLine, now) : null\n });\n }\n if (quotas.size === 0) {\n throw new ClaudeUsageAdapterError(\n 'claude-subscription-quota-unavailable',\n 'Claude Code subscription quota is unavailable.',\n 'Sign in with a Claude subscription, open Claude Code, and run /usage.'\n );\n }\n return [...quotas.values()];\n}\n\nfunction findHeading(lines: string[], percentIndex: number): string | null {\n for (let index = percentIndex - 1; index >= Math.max(0, percentIndex - 3); index -= 1) {\n const line = lines[index];\n if (/^(Plan usage|Settings|Usage|Session|Resets)/i.test(line)) continue;\n if (/^[━─█▁▂▃▄▅▆▇\\s]+$/.test(line)) continue;\n return line;\n }\n return null;\n}\n\nfunction displayLabel(heading: string): string {\n if (/^(5[- ]hour limit|current session)$/i.test(heading)) return '5 hour';\n const currentWeek = heading.match(/^Current week\\s*\\((.+)\\)$/i);\n if (currentWeek) {\n if (/^all models$/i.test(currentWeek[1])) return 'Week · All models';\n if (/^fable(?: only)?$/i.test(currentWeek[1])) return 'Week · Fable only';\n return `Week · ${currentWeek[1]}`;\n }\n const weekly = heading.match(/^Weekly\\s*[·—-]\\s*(.+)$/i);\n return weekly ? `Week · ${weekly[1]}` : heading;\n}\n\nfunction windowDurationMinutes(heading: string): number | null {\n if (/^(5[- ]hour limit|current session)$/i.test(heading)) return 300;\n if (/^(Current week\\s*\\(.+\\)|Weekly\\s*[·—-]\\s*.+)$/i.test(heading)) return 10_080;\n return null;\n}\n\nfunction parseReset(line: string, now: Date): string | null {\n const relative = line.match(/Resets\\s+in\\s+(?:(\\d+)d\\s*)?(?:(\\d+)h\\s*)?(?:(\\d+)m)?/i);\n if (relative) {\n const milliseconds =\n (Number(relative[1] ?? 0) * 24 * 60 +\n Number(relative[2] ?? 0) * 60 +\n Number(relative[3] ?? 0)) *\n 60_000;\n return new Date(now.getTime() + milliseconds).toISOString();\n }\n const timeZone = line.match(/\\(([^)]+)\\)\\s*$/)?.[1];\n const value = line\n .replace(/^Resets\\s+/i, '')\n .replace(/\\s*\\([^)]+\\)\\s*$/, '')\n .trim();\n if (timeZone) {\n const zoned = parseZonedReset(value, timeZone, now);\n if (zoned) return zoned.toISOString();\n }\n const withYear = /\\b\\d{4}\\b/.test(value) ? value : `${value}, ${now.getFullYear()}`;\n const timestamp = Date.parse(withYear);\n return Number.isFinite(timestamp) ? new Date(timestamp).toISOString() : null;\n}\n\nfunction parseZonedReset(value: string, timeZone: string, now: Date): Date | null {\n try {\n const nowParts = dateTimeParts(now, timeZone);\n const timeOnly = value.match(/^(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)$/i);\n if (timeOnly) {\n const hour = hour24(Number(timeOnly[1]), timeOnly[3]);\n const minute = Number(timeOnly[2] ?? 0);\n let reset = zonedDateTime(\n nowParts.year,\n nowParts.month,\n nowParts.day,\n hour,\n minute,\n timeZone\n );\n if (reset.getTime() <= now.getTime()) {\n const tomorrow = new Date(Date.UTC(nowParts.year, nowParts.month - 1, nowParts.day + 1));\n reset = zonedDateTime(\n tomorrow.getUTCFullYear(),\n tomorrow.getUTCMonth() + 1,\n tomorrow.getUTCDate(),\n hour,\n minute,\n timeZone\n );\n }\n return reset;\n }\n\n const dated = value.match(\n /^([A-Za-z]+)\\s+(\\d{1,2})(?:,\\s*|\\s+)(?:(\\d{4})(?:,\\s*|\\s+))?(?:at\\s+)?(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)$/i\n );\n if (!dated) return null;\n const month = monthNumber(dated[1]);\n if (month === null) return null;\n let year = Number(dated[3] ?? nowParts.year);\n const resetForYear = (candidateYear: number) =>\n zonedDateTime(\n candidateYear,\n month,\n Number(dated[2]),\n hour24(Number(dated[4]), dated[6]),\n Number(dated[5] ?? 0),\n timeZone\n );\n let reset = resetForYear(year);\n if (!dated[3] && reset.getTime() <= now.getTime()) {\n year += 1;\n reset = resetForYear(year);\n }\n return reset;\n } catch {\n return null;\n }\n}\n\nfunction zonedDateTime(\n year: number,\n month: number,\n day: number,\n hour: number,\n minute: number,\n timeZone: string\n): Date {\n const target = Date.UTC(year, month - 1, day, hour, minute);\n let timestamp = target;\n for (let iteration = 0; iteration < 3; iteration += 1) {\n const represented = dateTimeParts(new Date(timestamp), timeZone);\n const representedTimestamp = Date.UTC(\n represented.year,\n represented.month - 1,\n represented.day,\n represented.hour,\n represented.minute\n );\n timestamp += target - representedTimestamp;\n }\n return new Date(timestamp);\n}\n\nfunction dateTimeParts(\n date: Date,\n timeZone: string\n): { year: number; month: number; day: number; hour: number; minute: number } {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23'\n }).formatToParts(date);\n const part = (type: Intl.DateTimeFormatPartTypes) =>\n Number(parts.find((candidate) => candidate.type === type)?.value);\n return {\n year: part('year'),\n month: part('month'),\n day: part('day'),\n hour: part('hour'),\n minute: part('minute')\n };\n}\n\nfunction hour24(hour: number, meridiem: string): number {\n return (hour % 12) + (/pm/i.test(meridiem) ? 12 : 0);\n}\n\nfunction monthNumber(value: string): number | null {\n const index = [\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec'\n ].indexOf(value.slice(0, 3).toLowerCase());\n return index === -1 ? null : index + 1;\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\nfunction stripTerminalControls(value: string): string {\n return (\n value\n // OSC and CSI are protocol control sequences emitted by the official terminal UI.\n // eslint-disable-next-line no-control-regex\n .replace(/\\u001B\\][^\\u0007]*(?:\\u0007|\\u001B\\\\)/g, '')\n // eslint-disable-next-line no-control-regex\n .replace(/\\u001B\\[[0-?]*[ -/]*[@-~]/g, '')\n // eslint-disable-next-line no-control-regex\n .replace(/[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F]/g, '')\n );\n}\n\nfunction unavailableError(cause?: unknown): ClaudeUsageAdapterError {\n return new ClaudeUsageAdapterError(\n 'claude-usage-client-unavailable',\n 'Claude Code usage client is unavailable.',\n 'Install or update Claude Code, then retry.',\n { cause }\n );\n}\n\nfunction schemaError(cause?: unknown): ClaudeUsageAdapterError {\n return new ClaudeUsageAdapterError(\n 'claude-usage-schema-changed',\n 'Claude Code returned an unsupported usage screen.',\n 'Update Agent Usage and Claude Code, then retry.',\n { cause }\n );\n}\n","import { z } from 'zod';\n\nimport type {\n Connector,\n CollectionRequest,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket,\n UsageObservation\n} from '../../core/types.js';\nimport type { TranscriptUsageClient } from '../../server/local-transcript-usage-client.js';\nimport { normalizeTokenObservation } from '../../core/token-normalization.js';\n\nconst nullableNumeric = z.union([z.number(), z.string()]).transform(Number).nullable();\nconst numeric = z.union([z.number(), z.string()]).transform(Number);\nconst rateLimitWindowSchema = z\n .object({\n usedPercent: z.number(),\n windowDurationMins: z.number().nullable(),\n resetsAt: z.number().nullable()\n })\n .passthrough();\nconst rateLimitSnapshotSchema = z\n .object({\n limitId: z.string().nullable(),\n limitName: z.string().nullable(),\n primary: rateLimitWindowSchema.nullable(),\n secondary: rateLimitWindowSchema.nullable()\n })\n .passthrough();\nexport const codexRateLimitsSchema = z\n .object({\n rateLimits: rateLimitSnapshotSchema,\n rateLimitsByLimitId: z.record(z.string(), rateLimitSnapshotSchema).nullable()\n })\n .passthrough();\nexport const codexTokenUsageSchema = z\n .object({\n summary: z\n .object({\n lifetimeTokens: nullableNumeric,\n peakDailyTokens: nullableNumeric,\n longestRunningTurnSec: nullableNumeric,\n currentStreakDays: nullableNumeric,\n longestStreakDays: nullableNumeric\n })\n .passthrough(),\n dailyUsageBuckets: z\n .array(\n z\n .object({\n startDate: z.string(),\n tokens: numeric\n })\n .passthrough()\n )\n .nullable()\n })\n .passthrough();\n\nexport type CodexRateLimitsResponse = z.infer<typeof codexRateLimitsSchema>;\nexport type CodexTokenUsageResponse = z.infer<typeof codexTokenUsageSchema>;\n\nexport interface CodexAccountPayload {\n rateLimits: CodexRateLimitsResponse;\n tokenUsage: CodexTokenUsageResponse | null;\n}\n\nexport interface CodexAccountClient {\n readAccount(): Promise<CodexAccountPayload>;\n}\n\nexport class CodexConnector implements Connector {\n readonly id = 'codex';\n readonly displayName = 'Codex';\n readonly consentId = 'codex';\n readonly #client: CodexAccountClient;\n readonly #clock: () => Date;\n readonly #historyClient?: TranscriptUsageClient;\n\n constructor(\n client: CodexAccountClient,\n clock: () => Date = () => new Date(),\n historyClient?: TranscriptUsageClient\n ) {\n this.#client = client;\n this.#clock = clock;\n this.#historyClient = historyClient;\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const now = this.#clock();\n const observedAt = now.toISOString();\n const warnings: ConnectorFailure[] = [];\n let payload: CodexAccountPayload | null = null;\n try {\n payload = await this.#client.readAccount();\n } catch (error) {\n warnings.push(safeFailure(error));\n }\n const history = this.#historyClient\n ? await this.#historyClient.readUsage(options)\n : { usage: [], costs: [], complete: true };\n const hasLocalHistory = history.usage.length > 0;\n const settledDays = settledAccountDays(payload?.tokenUsage ?? null, now.getTime());\n const canReconcile = history.complete && settledDays.length > 0;\n const accountUsage = canReconcile ? reconcileAccountDays(settledDays, history.usage) : [];\n if (!history.complete) warnings.push(incompleteTranscriptFailure());\n return {\n provider: { id: 'codex', displayName: 'Codex' },\n billingDomains: [{ id: 'subscription', displayName: 'Codex subscription' }],\n quotaBuckets: payload ? mapQuotaBuckets(payload.rateLimits) : [],\n usage: [...accountUsage, ...history.usage],\n ...(hasLocalHistory && canReconcile\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['codex-transcript:', 'codex:daily:'],\n retiredIdPrefixes: []\n }\n }\n : {}),\n costs: history.costs,\n warnings,\n observedAt\n };\n }\n}\n\n// The account usage profile is relayed from the Codex backend, which buckets days in UTC and\n// finishes aggregating a day some hours after it ends. A bucket whose UTC day has not closed is\n// always partial, so it is never evidence for that day's total. A bucket that has closed but is\n// still catching up simply reads low, and the outgrown rule below leaves the day to the local\n// transcripts until the account total is at least as large as they are.\ninterface SettledAccountDay {\n day: string;\n startMs: number;\n tokens: number;\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction settledAccountDays(\n response: CodexTokenUsageResponse | null,\n nowMs: number\n): SettledAccountDay[] {\n return (response?.dailyUsageBuckets ?? [])\n .map((bucket) => ({\n day: bucket.startDate,\n startMs: Date.parse(`${bucket.startDate}T00:00:00.000Z`),\n tokens: bucket.tokens\n }))\n .filter((day) => Number.isFinite(day.startMs) && day.startMs + DAY_MS <= nowMs);\n}\n\nfunction reconcileAccountDays(\n days: SettledAccountDay[],\n localUsage: UsageObservation[]\n): UsageObservation[] {\n const reconciledDays = new Set(days.map((day) => day.day));\n const localTotals = new Map<string, number>();\n for (const observation of localUsage) {\n const day = observation.observedAt.slice(0, 10);\n if (!reconciledDays.has(day)) continue;\n const recorded = normalizeTokenObservation(observation).recordedTokens;\n localTotals.set(day, (localTotals.get(day) ?? 0) + recorded);\n }\n\n return days.flatMap((day) => {\n const localTotal = localTotals.get(day.day) ?? 0;\n if (localTotal > day.tokens) return [];\n const observedAt = new Date(day.startMs).toISOString();\n const accountObservation = {\n id: `codex:daily:${day.day}`,\n billingDomainId: 'subscription',\n model: null,\n observedAt,\n sourceReportedTotalTokens: day.tokens,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n modelAttribution: 'unclassified',\n timePrecision: 'day',\n usageScope: 'account-wide',\n authority: 'official-account'\n } satisfies UsageObservation;\n if (localTotal === 0) return [accountObservation];\n return [\n accountObservation,\n {\n id: `codex-transcript:account-remainder:${day.day}`,\n billingDomainId: 'subscription',\n model: null,\n observedAt,\n reconciledRemainderTokens: day.tokens - localTotal,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n modelAttribution: 'unclassified',\n timePrecision: 'day',\n usageScope: 'account-wide',\n authority: 'estimate'\n } satisfies UsageObservation\n ];\n });\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'codex-account-adapter-failed',\n message: 'Codex account quota is unavailable.',\n recovery: 'Agent Usage will retry automatically.'\n };\n}\n\nfunction incompleteTranscriptFailure(): ConnectorFailure {\n return {\n code: 'local-transcript-scan-incomplete',\n message: 'Some local Codex history could not be read.',\n recovery: 'Agent Usage will retry automatically without removing stored history.'\n };\n}\n\nfunction mapQuotaBuckets(response: CodexRateLimitsResponse): QuotaBucket[] {\n const byId = response.rateLimitsByLimitId;\n const snapshots =\n byId && Object.keys(byId).length > 0\n ? Object.entries(byId)\n : [[response.rateLimits.limitId ?? 'codex', response.rateLimits] as const];\n const multipleLimits = snapshots.length > 1;\n const buckets: QuotaBucket[] = [];\n\n for (const [key, snapshot] of snapshots) {\n if (!snapshot) continue;\n const baseLabel = snapshot.limitName ?? snapshot.limitId ?? key;\n for (const [windowName, window] of [\n ['primary', snapshot.primary],\n ['secondary', snapshot.secondary]\n ] as const) {\n if (!window) continue;\n const windowLabel = formatWindowLabel(window.windowDurationMins, windowName);\n buckets.push({\n id: `${key}:${windowName}`,\n billingDomainId: 'subscription',\n label: multipleLimits ? `${baseLabel} · ${windowLabel}` : windowLabel,\n usedPercent: window.usedPercent,\n windowDurationMinutes: window.windowDurationMins,\n resetsAt: window.resetsAt === null ? null : new Date(window.resetsAt * 1000).toISOString(),\n authority: 'official-account'\n });\n }\n }\n return buckets;\n}\n\nfunction formatWindowLabel(durationMinutes: number | null, fallback: string): string {\n if (durationMinutes === 300) return '5 hour';\n if (durationMinutes === 10_080) return 'Week';\n if (durationMinutes === null) return fallback === 'primary' ? 'Primary' : 'Secondary';\n if (durationMinutes % 1_440 === 0) return `${durationMinutes / 1_440} days`;\n if (durationMinutes % 60 === 0) return `${durationMinutes / 60} hours`;\n return `${durationMinutes} minutes`;\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { Readable, Writable } from 'node:stream';\n\nimport {\n codexRateLimitsSchema,\n codexTokenUsageSchema,\n type CodexAccountClient,\n type CodexAccountPayload\n} from './codex-connector.js';\n\ninterface CodexRpcErrorBody {\n code: number;\n message?: string;\n}\n\ninterface CodexRpcResponse {\n id: number;\n result?: unknown;\n error?: CodexRpcErrorBody;\n}\n\nexport interface CodexAppServerProcess {\n readonly stdin: Writable;\n readonly stdout: Readable;\n readonly stderr: Readable;\n once(event: 'error', listener: (error: Error) => void): this;\n once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;\n kill(signal?: NodeJS.Signals): boolean;\n}\n\nexport interface StdioCodexAccountClientOptions {\n command?: string;\n timeoutMs?: number;\n spawnProcess?: (command: string, arguments_: string[]) => CodexAppServerProcess;\n}\n\nexport class CodexAppServerError extends Error {\n readonly code:\n | 'app-server-unavailable'\n | 'app-server-timeout'\n | 'app-server-method-unsupported'\n | 'codex-account-unavailable'\n | 'app-server-protocol-error'\n | 'app-server-schema-changed';\n readonly recovery: string;\n\n constructor(\n code: CodexAppServerError['code'],\n message: string,\n recovery: string,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = 'CodexAppServerError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class StdioCodexAccountClient implements CodexAccountClient {\n readonly #command: string;\n readonly #timeoutMs: number;\n readonly #spawnProcess: NonNullable<StdioCodexAccountClientOptions['spawnProcess']>;\n\n constructor(options: StdioCodexAccountClientOptions = {}) {\n this.#command = options.command ?? 'codex';\n this.#timeoutMs = options.timeoutMs ?? 5_000;\n this.#spawnProcess =\n options.spawnProcess ??\n ((command, arguments_) =>\n spawn(command, arguments_, {\n stdio: ['pipe', 'pipe', 'pipe']\n }) as ChildProcessWithoutNullStreams);\n }\n\n async readAccount(): Promise<CodexAccountPayload> {\n let process: CodexAppServerProcess;\n try {\n process = this.#spawnProcess(this.#command, ['app-server', '--stdio']);\n } catch (error) {\n throw unavailableError(error);\n }\n\n const peer = new JsonLinePeer(process, this.#timeoutMs);\n try {\n await peer.request('initialize', {\n clientInfo: { name: 'agent-usage', version: '0.1.0' },\n capabilities: { experimentalApi: true, requestAttestation: false }\n });\n peer.notify('initialized');\n\n const rateLimitsResult = await peer.request('account/rateLimits/read');\n let rateLimits;\n try {\n rateLimits = codexRateLimitsSchema.parse(rateLimitsResult);\n } catch (error) {\n throw schemaError(error);\n }\n\n let tokenUsage = null;\n try {\n const tokenUsageResult = await peer.request('account/usage/read');\n tokenUsage = codexTokenUsageSchema.parse(tokenUsageResult);\n } catch (error) {\n if (!(error instanceof CodexRpcError && error.code === -32601)) {\n if (error instanceof CodexRpcError) throw accountError(error);\n if (error instanceof CodexAppServerError) throw error;\n throw schemaError(error);\n }\n }\n\n return { rateLimits, tokenUsage };\n } catch (error) {\n if (error instanceof CodexAppServerError) throw error;\n if (error instanceof CodexRpcError) {\n if (error.code === -32601) {\n throw new CodexAppServerError(\n 'app-server-method-unsupported',\n 'This Codex version does not expose account usage.',\n 'Update Codex, then run agent-usage discover and refresh.',\n { cause: error }\n );\n }\n throw accountError(error);\n }\n throw unavailableError(error);\n } finally {\n peer.close();\n }\n }\n}\n\nclass CodexRpcError extends Error {\n readonly code: number;\n\n constructor(error: CodexRpcErrorBody) {\n super(error.message ?? `Codex app-server RPC error ${error.code}`);\n this.name = 'CodexRpcError';\n this.code = error.code;\n }\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n}\n\nclass JsonLinePeer {\n readonly #process: CodexAppServerProcess;\n readonly #timeoutMs: number;\n readonly #pending = new Map<number, PendingRequest>();\n #nextId = 1;\n #buffer = '';\n #closed = false;\n\n constructor(process: CodexAppServerProcess, timeoutMs: number) {\n this.#process = process;\n this.#timeoutMs = timeoutMs;\n process.stdout.setEncoding('utf8');\n process.stdout.on('data', (chunk: string) => this.#consume(chunk));\n process.once('error', (error) => this.#fail(unavailableError(error)));\n process.once('exit', (code, signal) => {\n if (this.#closed) return;\n this.#fail(\n new CodexAppServerError(\n 'app-server-unavailable',\n 'Codex app-server exited before the usage request completed.',\n 'Run codex login, then agent-usage discover and refresh.',\n { cause: new Error(`exit=${String(code)} signal=${String(signal)}`) }\n )\n );\n });\n }\n\n request(method: string, params?: unknown): Promise<unknown> {\n const id = this.#nextId++;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.#pending.delete(id);\n reject(\n new CodexAppServerError(\n 'app-server-timeout',\n 'Codex app-server did not respond in time.',\n 'Retry refresh. If it persists, restart or update Codex.'\n )\n );\n }, this.#timeoutMs);\n this.#pending.set(id, { resolve, reject, timeout });\n this.#write({ id, method, ...(params === undefined ? {} : { params }) });\n });\n }\n\n notify(method: string, params?: unknown): void {\n this.#write({ method, ...(params === undefined ? {} : { params }) });\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n for (const pending of this.#pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(\n new CodexAppServerError(\n 'app-server-unavailable',\n 'Codex app-server connection closed.',\n 'Retry refresh.'\n )\n );\n }\n this.#pending.clear();\n this.#process.kill();\n }\n\n #write(message: object): void {\n this.#process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n #consume(chunk: string): void {\n this.#buffer += chunk;\n let newline = this.#buffer.indexOf('\\n');\n while (newline !== -1) {\n const line = this.#buffer.slice(0, newline).trim();\n this.#buffer = this.#buffer.slice(newline + 1);\n if (line) this.#consumeLine(line);\n newline = this.#buffer.indexOf('\\n');\n }\n }\n\n #consumeLine(line: string): void {\n let message: CodexRpcResponse;\n try {\n message = JSON.parse(line) as CodexRpcResponse;\n } catch (error) {\n this.#fail(\n new CodexAppServerError(\n 'app-server-protocol-error',\n 'Codex app-server returned an invalid protocol message.',\n 'Update Codex and Agent Usage, then retry.',\n { cause: error }\n )\n );\n return;\n }\n if (typeof message.id !== 'number') return;\n const pending = this.#pending.get(message.id);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.#pending.delete(message.id);\n if (message.error) pending.reject(new CodexRpcError(message.error));\n else pending.resolve(message.result);\n }\n\n #fail(error: Error): void {\n for (const pending of this.#pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(error);\n }\n this.#pending.clear();\n }\n}\n\nfunction unavailableError(cause: unknown): CodexAppServerError {\n return new CodexAppServerError(\n 'app-server-unavailable',\n 'Codex app-server is unavailable.',\n 'Install or update Codex, then run agent-usage discover.',\n { cause }\n );\n}\n\nfunction accountError(cause: unknown): CodexAppServerError {\n return new CodexAppServerError(\n 'codex-account-unavailable',\n 'Codex account usage is unavailable.',\n 'Run codex login, then refresh Agent Usage.',\n { cause }\n );\n}\n\nfunction schemaError(cause: unknown): CodexAppServerError {\n return new CodexAppServerError(\n 'app-server-schema-changed',\n 'Codex returned an unsupported account-usage schema.',\n 'Update Agent Usage and Codex, then retry.',\n { cause }\n );\n}\n","import type {\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n CostRecord,\n UsageObservation\n} from '../../core/types.js';\nimport type {\n OpenCodeGoLocalHistoryClient,\n OpenCodeLocalRequest\n} from '../opencode-go/opencode-go-connector.js';\n\nexport interface OpenCodeLocalConnectorOptions {\n localHistoryClient: OpenCodeGoLocalHistoryClient;\n clock?: () => Date;\n}\n\nexport class OpenCodeLocalConnector implements Connector {\n readonly id = 'opencode';\n readonly displayName = 'OpenCode';\n readonly consentId = 'opencode-go';\n readonly #localHistoryClient: OpenCodeGoLocalHistoryClient;\n readonly #clock: () => Date;\n\n constructor(options: OpenCodeLocalConnectorOptions) {\n this.#localHistoryClient = options.localHistoryClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n try {\n const requests = await this.#localHistoryClient.readHistory();\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: [{ id: 'local-history', displayName: 'Local history' }],\n quotaBuckets: [],\n usage: requests.map(mapLocalUsage),\n usageReconciliation: {\n authoritativeIdPrefixes: ['opencode-local-request:'],\n retiredIdPrefixes: []\n },\n costs: requests.flatMap((request) =>\n request.cost === null ? [] : [mapLocalCost(request, request.cost)]\n ),\n observedAt\n };\n } catch (error) {\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: [{ id: 'local-history', displayName: 'Local history' }],\n quotaBuckets: [],\n usage: [],\n costs: [],\n warnings: [safeFailure(error)],\n observedAt\n };\n }\n }\n}\n\nfunction mapLocalUsage(request: OpenCodeLocalRequest): UsageObservation {\n return {\n id: `opencode-local-request:${request.id}`,\n billingDomainId: 'local-history',\n model: request.model,\n observedAt: new Date(request.observedAtMs).toISOString(),\n inputTokens: request.inputTokens,\n outputTokens: request.outputTokens,\n reasoningTokens: request.reasoningTokens,\n cacheReadTokens: request.cacheReadTokens,\n cacheWriteTokens: request.cacheWriteTokens,\n tokenSemantics: {\n reasoning: 'separate',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n };\n}\n\nfunction mapLocalCost(request: OpenCodeLocalRequest, cost: number): CostRecord {\n const usageObservationId = `opencode-local-request:${request.id}`;\n return {\n id: `opencode-local-request-cost:${request.id}`,\n sourceId: usageObservationId,\n billingDomainId: 'local-history',\n observedAt: new Date(request.observedAtMs).toISOString(),\n kind: 'reported-estimate',\n amount: cost,\n currency: 'USD',\n authority: 'local-observation',\n model: request.model,\n usageObservationId,\n priceSnapshot: {\n id: 'opencode-local-message-reported-cost-v1',\n version: '2026-08-29',\n source: 'OpenCode local message history reported cost',\n canonicalModel: request.model,\n effectiveAt: '2026-08-29T00:00:00.000Z',\n effectiveUntil: null,\n currency: 'USD',\n ratesPerMillion: {\n input: null,\n output: null,\n reasoning: null,\n 'cache-read': null,\n 'cache-write': null\n }\n }\n };\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'opencode-local-refresh-failed',\n message: 'OpenCode local history coverage is incomplete.',\n recovery: 'Run agent-usage doctor, then retry refresh.'\n };\n}\n","import { execFile as execFileCallback } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { createRequire } from 'node:module';\nimport type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\n\nimport { z } from 'zod';\n\nimport type {\n OpenCodeGoLocalHistoryClient,\n OpenCodeLocalRequest\n} from './opencode-go-connector.js';\n\nconst localMessageRowSchema = z.object({\n sourceId: z.string().min(1),\n role: z.enum(['user', 'assistant']),\n providerId: z.string().min(1).nullable(),\n modelId: z.string().min(1).nullable(),\n completedAtMs: z.number().int().nonnegative().nullable(),\n cost: z.number().finite().nonnegative().nullable(),\n inputTokens: z.number().int().nonnegative().nullable(),\n outputTokens: z.number().int().nonnegative().nullable(),\n reasoningTokens: z.number().int().nonnegative().nullable(),\n cacheReadTokens: z.number().int().nonnegative().nullable(),\n cacheWriteTokens: z.number().int().nonnegative().nullable(),\n observedAtMs: z.number().int().nonnegative()\n});\nconst localMessageRowsSchema = z.array(localMessageRowSchema);\nconst completedAssistantRowSchema = localMessageRowSchema.extend({\n role: z.literal('assistant'),\n providerId: z.string().min(1),\n modelId: z.string().min(1),\n completedAtMs: z.number().int().nonnegative(),\n inputTokens: z.number().int().nonnegative(),\n outputTokens: z.number().int().nonnegative(),\n reasoningTokens: z.number().int().nonnegative(),\n cacheReadTokens: z.number().int().nonnegative(),\n cacheWriteTokens: z.number().int().nonnegative()\n});\n\ntype ExecFileResult = { stdout: string; stderr: string };\ntype ExecFile = (command: string, arguments_: string[]) => Promise<ExecFileResult>;\ntype ReadDatabase = (path: string, query: string) => unknown[];\nconst MAX_PATH_OUTPUT_BYTES = 1024 * 1024;\nconst { DatabaseSync } = createRequire(import.meta.url)(\n 'node:sqlite'\n) as typeof import('node:sqlite');\n\nexport interface CliOpenCodeLocalHistoryClientOptions {\n command?: string;\n execFile?: ExecFile;\n readDatabase?: ReadDatabase;\n}\n\nexport class OpenCodeLocalHistoryError extends Error {\n readonly code: string;\n readonly recovery: string;\n\n constructor(code: string, message: string, recovery: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'OpenCodeLocalHistoryError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class CliOpenCodeLocalHistoryClient implements OpenCodeGoLocalHistoryClient {\n readonly #command: string;\n readonly #execFile: ExecFile;\n readonly #readDatabase: ReadDatabase;\n #activeRead: Promise<OpenCodeLocalRequest[]> | null = null;\n\n constructor(options: CliOpenCodeLocalHistoryClientOptions = {}) {\n this.#command = options.command ?? 'opencode';\n this.#execFile = options.execFile ?? executeOpenCode;\n this.#readDatabase = options.readDatabase ?? readDatabase;\n }\n\n readHistory(): Promise<OpenCodeLocalRequest[]> {\n if (this.#activeRead) return this.#activeRead;\n const activeRead = this.#readHistory();\n this.#activeRead = activeRead;\n activeRead.then(\n () => {\n if (this.#activeRead === activeRead) this.#activeRead = null;\n },\n () => {\n if (this.#activeRead === activeRead) this.#activeRead = null;\n }\n );\n return activeRead;\n }\n\n async #readHistory(): Promise<OpenCodeLocalRequest[]> {\n let databasePath: string;\n try {\n const { stdout } = await this.#execFile(this.#command, ['db', 'path']);\n databasePath = stdout.trim();\n if (!databasePath) throw new Error('OpenCode returned an empty database path.');\n } catch (error) {\n throw unavailableHistory(error);\n }\n let rawRows: unknown[];\n try {\n rawRows = this.#readDatabase(databasePath, HISTORY_QUERY);\n } catch (error) {\n throw unavailableHistory(error);\n }\n let completedAssistantRows: Array<z.infer<typeof completedAssistantRowSchema>>;\n try {\n const messageRows = localMessageRowsSchema.parse(rawRows);\n const assistantRows = messageRows.filter((row) => row.role === 'assistant');\n if (assistantRows.length > 0 && assistantRows.every((row) => row.completedAtMs === null)) {\n throw new Error('No completed assistant message uses the expected schema.');\n }\n completedAssistantRows = assistantRows\n .filter((row) => row.completedAtMs !== null)\n .map((row) => completedAssistantRowSchema.parse(row));\n } catch (error) {\n throw new OpenCodeLocalHistoryError(\n 'opencode-cli-schema-changed',\n 'The installed OpenCode CLI has an unsupported local history schema.',\n 'Update Agent Usage or OpenCode, then retry.',\n { cause: error }\n );\n }\n return completedAssistantRows.filter(hasCategorizedTokens).map((row) => ({\n id: `v2:${createHash('sha256').update(row.sourceId).digest('hex')}`,\n providerId: row.providerId,\n model: `${row.providerId}/${row.modelId}`,\n cost: row.cost,\n inputTokens: row.inputTokens,\n outputTokens: row.outputTokens,\n reasoningTokens: row.reasoningTokens,\n cacheReadTokens: row.cacheReadTokens,\n cacheWriteTokens: row.cacheWriteTokens,\n observedAtMs: row.observedAtMs\n }));\n }\n}\n\nconst HISTORY_QUERY = `SELECT\n id AS sourceId,\n json_extract(data, '$.role') AS role,\n json_extract(data, '$.providerID') AS providerId,\n json_extract(data, '$.modelID') AS modelId,\n json_extract(data, '$.time.completed') AS completedAtMs,\n json_extract(data, '$.cost') AS cost,\n json_extract(data, '$.tokens.input') AS inputTokens,\n json_extract(data, '$.tokens.output') AS outputTokens,\n json_extract(data, '$.tokens.reasoning') AS reasoningTokens,\n json_extract(data, '$.tokens.cache.read') AS cacheReadTokens,\n json_extract(data, '$.tokens.cache.write') AS cacheWriteTokens,\n COALESCE(json_extract(data, '$.time.created'), time_created) AS observedAtMs\n FROM message\n WHERE date(COALESCE(json_extract(data, '$.time.created'), time_created) / 1000, 'unixepoch')\n >= date('now', '-90 days')\n ORDER BY observedAtMs DESC, sourceId`;\n\nfunction hasCategorizedTokens(row: z.infer<typeof completedAssistantRowSchema>): boolean {\n return (\n row.inputTokens +\n row.outputTokens +\n row.reasoningTokens +\n row.cacheReadTokens +\n row.cacheWriteTokens >\n 0\n );\n}\n\nfunction readDatabase(path: string, query: string): unknown[] {\n const database: DatabaseSyncType = new DatabaseSync(path, { readOnly: true });\n try {\n return database.prepare(query).all() as unknown[];\n } finally {\n database.close();\n }\n}\n\nfunction unavailableHistory(cause: unknown): OpenCodeLocalHistoryError {\n return new OpenCodeLocalHistoryError(\n 'opencode-local-history-unavailable',\n 'OpenCode local message history is unavailable.',\n 'Update OpenCode and run opencode stats to verify local history.',\n { cause }\n );\n}\n\nfunction executeOpenCode(command: string, arguments_: string[]): Promise<ExecFileResult> {\n return new Promise((resolve, reject) => {\n execFileCallback(\n command,\n arguments_,\n { encoding: 'utf8', maxBuffer: MAX_PATH_OUTPUT_BYTES },\n (error, stdout, stderr) => {\n if (error) {\n reject(error);\n return;\n }\n resolve({ stdout, stderr });\n }\n );\n });\n}\n","import { z } from 'zod';\n\nimport type { OpenCodeGoAccountClient } from './opencode-go-connector.js';\nimport type { OpenCodeGoAuthReader } from './opencode-auth-reader.js';\n\nconst usageWindowSchema = z.object({\n status: z.enum(['ok', 'rate-limited']),\n percent: z.number().finite().nonnegative(),\n resetsAt: z.string().datetime()\n});\n\nexport const openCodeGoUsageSchema = z.object({\n usage: z.object({\n rolling: usageWindowSchema,\n weekly: usageWindowSchema,\n monthly: usageWindowSchema\n })\n});\n\nexport type OpenCodeGoUsageResponse = z.infer<typeof openCodeGoUsageSchema>;\n\nexport interface OfficialOpenCodeGoClientOptions {\n authReader: OpenCodeGoAuthReader;\n fetch?: typeof fetch;\n endpoint?: string;\n timeoutMs?: number;\n}\n\nexport class OpenCodeGoClientError extends Error {\n readonly code: string;\n readonly recovery: string;\n\n constructor(code: string, message: string, recovery: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'OpenCodeGoClientError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class OfficialOpenCodeGoClient implements OpenCodeGoAccountClient {\n readonly #authReader: OpenCodeGoAuthReader;\n readonly #fetch: typeof fetch;\n readonly #endpoint: string;\n readonly #timeoutMs: number;\n\n constructor(options: OfficialOpenCodeGoClientOptions) {\n this.#authReader = options.authReader;\n this.#fetch = options.fetch ?? globalThis.fetch;\n this.#endpoint = options.endpoint ?? 'https://opencode.ai/zen/go/v1/usage';\n this.#timeoutMs = options.timeoutMs ?? 8_000;\n }\n\n async readUsage(): Promise<OpenCodeGoUsageResponse> {\n const apiKey = await this.#authReader.readGoApiKey();\n let response: Response;\n try {\n response = await this.#fetch(this.#endpoint, {\n method: 'GET',\n headers: { authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(this.#timeoutMs)\n });\n } catch (error) {\n throw new OpenCodeGoClientError(\n 'go-usage-endpoint-unavailable',\n 'OpenCode Go usage endpoint is unavailable.',\n 'Check the network and retry refresh.',\n { cause: error }\n );\n }\n if (!response.ok) throw httpError(response.status);\n try {\n return openCodeGoUsageSchema.parse(await response.json());\n } catch (error) {\n throw new OpenCodeGoClientError(\n 'go-usage-schema-changed',\n 'OpenCode Go returned an unsupported usage schema.',\n 'Update Agent Usage, then retry.',\n { cause: error }\n );\n }\n }\n}\n\nfunction httpError(status: number): OpenCodeGoClientError {\n if (status === 401) {\n return new OpenCodeGoClientError(\n 'go-authentication-failed',\n 'OpenCode Go authentication failed.',\n 'Reconnect OpenCode Go in the official client, then retry.'\n );\n }\n if (status === 403) {\n return new OpenCodeGoClientError(\n 'go-subscription-required',\n 'OpenCode Go subscription is unavailable.',\n 'Subscribe to OpenCode Go or reconnect its API key, then refresh.'\n );\n }\n if (status === 404 || status === 405) {\n return new OpenCodeGoClientError(\n 'go-usage-endpoint-unsupported',\n 'This OpenCode Go account endpoint is unsupported.',\n 'Update OpenCode and Agent Usage, then retry.'\n );\n }\n if (status === 429) {\n return new OpenCodeGoClientError(\n 'go-usage-endpoint-rate-limited',\n 'OpenCode Go usage refresh is rate-limited.',\n 'Wait before refreshing again.'\n );\n }\n return new OpenCodeGoClientError(\n 'go-usage-endpoint-unavailable',\n 'OpenCode Go usage endpoint is unavailable.',\n 'Retry refresh later.'\n );\n}\n","import { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { z } from 'zod';\n\nconst authFileSchema = z.record(\n z.string(),\n z\n .object({\n type: z.string(),\n key: z.string().optional()\n })\n .passthrough()\n);\n\nexport interface OpenCodeGoAuthReader {\n readGoApiKey(): Promise<string>;\n}\n\nexport class OpenCodeAuthFileReader implements OpenCodeGoAuthReader {\n readonly #path: string;\n\n constructor(path = join(homedir(), '.local', 'share', 'opencode', 'auth.json')) {\n this.#path = path;\n }\n\n async readGoApiKey(): Promise<string> {\n let parsed: z.infer<typeof authFileSchema>;\n try {\n parsed = authFileSchema.parse(JSON.parse(await readFile(this.#path, 'utf8')));\n } catch (error) {\n throw new OpenCodeAuthError(\n 'opencode-go-key-unavailable',\n 'OpenCode Go API key is unavailable.',\n 'Run opencode providers login and connect OpenCode Go, then retry.',\n { cause: error }\n );\n }\n const entry = parsed['opencode-go'];\n if (entry?.type !== 'api' || !entry.key) {\n throw new OpenCodeAuthError(\n 'opencode-go-key-unavailable',\n 'OpenCode Go API key is unavailable.',\n 'Run opencode providers login and connect OpenCode Go, then retry.'\n );\n }\n return entry.key;\n }\n}\n\nexport class OpenCodeAuthError extends Error {\n readonly code: string;\n readonly recovery: string;\n\n constructor(code: string, message: string, recovery: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'OpenCodeAuthError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n","import type {\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket\n} from '../../core/types.js';\nimport type { OpenCodeGoUsageResponse } from './official-opencode-go-client.js';\n\nexport interface OpenCodeGoAccountClient {\n readUsage(): Promise<OpenCodeGoUsageResponse>;\n}\n\nexport interface OpenCodeLocalRequest {\n id: string;\n providerId: string;\n model: string;\n cost: number | null;\n inputTokens: number;\n outputTokens: number;\n reasoningTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n observedAtMs: number;\n}\n\nexport interface OpenCodeGoLocalHistoryClient {\n readHistory(): Promise<OpenCodeLocalRequest[]>;\n}\n\nexport interface OpenCodeGoConnectorOptions {\n accountClient: OpenCodeGoAccountClient;\n localHistoryClient: OpenCodeGoLocalHistoryClient;\n clock?: () => Date;\n}\n\nconst LIMITS = {\n rolling: { label: '5 hour', amount: 12, windowDurationMinutes: 300 },\n weekly: { label: 'Week', amount: 30, windowDurationMinutes: 10_080 },\n monthly: { label: 'Month', amount: 60, windowDurationMinutes: 43_200 }\n} as const;\n\nexport class OpenCodeGoConnector implements Connector {\n readonly id = 'opencode-go';\n readonly displayName = 'OpenCode Go';\n readonly consentId = 'opencode-go';\n readonly #accountClient: OpenCodeGoAccountClient;\n readonly #localHistoryClient: OpenCodeGoLocalHistoryClient;\n readonly #clock: () => Date;\n\n constructor(options: OpenCodeGoConnectorOptions) {\n this.#accountClient = options.accountClient;\n this.#localHistoryClient = options.localHistoryClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n const [accountResult, localResult] = await Promise.allSettled([\n this.#accountClient.readUsage(),\n this.#localHistoryClient.readHistory()\n ]);\n const warnings: ConnectorFailure[] = [];\n if (accountResult.status === 'rejected') warnings.push(safeFailure(accountResult.reason));\n if (localResult.status === 'rejected') warnings.push(safeFailure(localResult.reason));\n\n const account = accountResult.status === 'fulfilled' ? accountResult.value : null;\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: [{ id: 'go-subscription', displayName: 'OpenCode Go subscription' }],\n quotaBuckets: account ? mapQuota(account) : [],\n usage: [],\n ...(localResult.status === 'fulfilled'\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['opencode-request:'],\n retiredIdPrefixes: ['opencode-session:']\n }\n }\n : {}),\n costs: [],\n warnings,\n observedAt\n };\n }\n}\n\nfunction mapQuota(response: OpenCodeGoUsageResponse): QuotaBucket[] {\n return (Object.keys(LIMITS) as Array<keyof typeof LIMITS>).map((id) => ({\n id,\n billingDomainId: 'go-subscription',\n label: LIMITS[id].label,\n usedPercent: response.usage[id].percent,\n windowDurationMinutes: LIMITS[id].windowDurationMinutes,\n resetsAt: response.usage[id].resetsAt,\n authority: 'official-account',\n scope: 'account-wide',\n status: response.usage[id].status,\n limitAmount: LIMITS[id].amount,\n limitCurrency: 'USD',\n fallbackStatus: 'unknown'\n }));\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'opencode-go-refresh-failed',\n message: 'OpenCode Go coverage is incomplete.',\n recovery: 'Run agent-usage doctor, then retry refresh.'\n };\n}\n","import { z } from 'zod';\n\nimport type {\n BillingDomain,\n Connector,\n CollectionRequest,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket,\n UsageObservation\n} from '../../core/types.js';\nimport type { TranscriptUsageClient } from '../../server/local-transcript-usage-client.js';\n\nconst centSchema = z.object({ val: z.number().default(0) }).passthrough();\nconst usagePeriodSchema = z\n .object({\n type: z.string().optional(),\n start: z.string().optional(),\n end: z.string().optional()\n })\n .passthrough();\nconst billingConfigSchema = z\n .object({\n creditUsagePercent: z.number().min(0).max(100).optional(),\n currentPeriod: usagePeriodSchema.optional(),\n monthlyLimit: centSchema.optional(),\n used: centSchema.optional(),\n billingPeriodStart: z.string().optional(),\n billingPeriodEnd: z.string().optional(),\n isUnifiedBillingUser: z.boolean().optional()\n })\n .passthrough();\n\nexport const grokBillingResponseSchema = z\n .object({\n config: billingConfigSchema.nullable(),\n onDemandEnabled: z.boolean().nullable().optional(),\n subscriptionTier: z.string().optional(),\n sourceObservedAt: z.string().datetime({ offset: true }).optional()\n })\n .passthrough();\n\nexport type GrokBuildBilling = z.infer<typeof grokBillingResponseSchema>;\n\nexport interface GrokBuildBillingClient {\n readBilling(): Promise<GrokBuildBilling>;\n}\n\nexport interface GrokBuildConnectorOptions {\n billingClient: GrokBuildBillingClient;\n historyClient?: TranscriptUsageClient;\n clock?: () => Date;\n}\n\nexport class GrokBuildConnector implements Connector {\n readonly id = 'grok';\n readonly displayName = 'Grok';\n readonly consentId = 'grok';\n readonly #billingClient: GrokBuildBillingClient;\n readonly #historyClient?: TranscriptUsageClient;\n readonly #clock: () => Date;\n\n constructor(options: GrokBuildConnectorOptions) {\n this.#billingClient = options.billingClient;\n this.#historyClient = options.historyClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const warnings: ConnectorFailure[] = [];\n let quotaBuckets: QuotaBucket[] = [];\n let observedAt = this.#clock().toISOString();\n try {\n const billing = await this.#billingClient.readBilling();\n observedAt = billing.sourceObservedAt ?? observedAt;\n quotaBuckets = mapBillingQuota(billing);\n if (quotaBuckets.length === 0) {\n warnings.push({\n code: 'grok-subscription-quota-unavailable',\n message: 'Grok Build subscription quota is unavailable.',\n recovery: 'Open Grok Build and run /usage, then retry refresh.'\n });\n }\n } catch (error) {\n warnings.push(safeFailure(error));\n }\n const history = this.#historyClient\n ? await this.#historyClient.readUsage(options)\n : { usage: [], costs: [], complete: true };\n if (!history.complete) warnings.push(incompleteTranscriptFailure());\n\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: grokBuildBillingDomains(history.usage),\n quotaBuckets,\n usage: history.usage,\n ...(history.usage.length > 0 && history.complete\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['grok-transcript:'],\n retiredIdPrefixes: ['grok-otel:', 'grok-headless:']\n }\n }\n : {}),\n costs: history.costs,\n warnings,\n observedAt\n };\n }\n}\n\nfunction incompleteTranscriptFailure(): ConnectorFailure {\n return {\n code: 'local-transcript-scan-incomplete',\n message: 'Some local Grok history could not be read.',\n recovery: 'Agent Usage will retry automatically without removing stored history.'\n };\n}\n\nexport function grokBuildBillingDomain(): { id: string; displayName: string } {\n return {\n id: 'grok-build-subscription',\n displayName: 'Grok Build / SuperGrok shared pool'\n };\n}\n\nexport function isGrokOfficialModel(model: string | null | undefined): boolean {\n if (!model) return false;\n const normalized = model.trim().toLowerCase();\n if (normalized === 'grok') return true;\n if (normalized.startsWith('grok-') || normalized.startsWith('grok/')) {\n return true;\n }\n return false;\n}\n\nexport function resolveGrokBillingDomain(\n model: string | null | undefined,\n customEndpoints?: Map<string, string>\n): string {\n if (!model) return 'grok-build-subscription';\n const normalized = model.trim().toLowerCase();\n if (customEndpoints?.has(normalized)) {\n return customEndpoints.get(normalized)!;\n }\n if (isGrokOfficialModel(model)) {\n return 'grok-build-subscription';\n }\n return 'custom';\n}\n\nexport function grokBuildBillingDomains(usage: UsageObservation[] = []): BillingDomain[] {\n const primary = grokBuildBillingDomain();\n const observed = [...new Set(usage.map((o) => o.billingDomainId))]\n .filter((id) => id !== primary.id)\n .sort();\n return [\n primary,\n ...observed.map((id) => ({\n id,\n displayName: id === 'custom' ? 'Custom endpoints' : id\n }))\n ];\n}\n\nfunction mapBillingQuota(billing: GrokBuildBilling): QuotaBucket[] {\n const config = billing.config;\n if (!config) return [];\n\n const usedPercent =\n config.creditUsagePercent ?? derivePercent(config.used?.val, config.monthlyLimit?.val);\n if (usedPercent === null) return [];\n\n const periodType = config.currentPeriod?.type;\n const period = nativePeriod(periodType, config.currentPeriod ? undefined : 'monthly');\n const resetsAt = config.currentPeriod?.end ?? config.billingPeriodEnd ?? null;\n\n return [\n {\n id: `grok-build:${period.id}`,\n billingDomainId: 'grok-build-subscription',\n label: period.label,\n usedPercent,\n windowDurationMinutes: nativeWindowDurationMinutes(\n config.currentPeriod?.start ?? config.billingPeriodStart,\n resetsAt,\n period.id\n ),\n resetsAt,\n authority: 'official-client',\n scope: 'account-wide',\n status: billing.subscriptionTier ?? null\n }\n ];\n}\n\nfunction nativeWindowDurationMinutes(\n startsAt: string | undefined,\n resetsAt: string | null,\n period: string\n): number | null {\n const start = startsAt ? Date.parse(startsAt) : Number.NaN;\n const end = resetsAt ? Date.parse(resetsAt) : Number.NaN;\n if (Number.isFinite(start) && Number.isFinite(end) && end > start) {\n return Math.round((end - start) / 60_000);\n }\n if (period === 'weekly') return 10_080;\n if (period === 'monthly') return 43_200;\n return null;\n}\n\nfunction nativePeriod(\n type: string | undefined,\n fallback?: 'monthly'\n): {\n id: string;\n label: string;\n} {\n if (type === 'USAGE_PERIOD_TYPE_WEEKLY') return { id: 'weekly', label: 'Weekly limit' };\n if (type === 'USAGE_PERIOD_TYPE_MONTHLY' || fallback === 'monthly') {\n return { id: 'monthly', label: 'Monthly limit' };\n }\n return { id: 'usage', label: 'Usage' };\n}\n\nfunction derivePercent(used: number | undefined, limit: number | undefined): number | null {\n if (used === undefined || limit === undefined || limit <= 0) return null;\n return Math.min(100, Math.max(0, (used / limit) * 100));\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'grok-billing-adapter-failed',\n message: 'Grok Build subscription quota is unavailable.',\n recovery: 'Open Grok Build and run /usage, then update Grok Build before retrying.'\n };\n}\n","import { zstdDecompressSync } from 'node:zlib';\n\n/** Byte range of one structurally complete Zstandard frame. */\ninterface ZstdFrameRange {\n start: number;\n end: number;\n}\n\n/**\n * Result of decoding one concatenated-frame Zstandard artifact.\n */\nexport interface ZstdFramedRead {\n /** Plaintext of every complete frame, in file order. */\n text: string;\n /** How many complete frames decoded. */\n frames: number;\n /** Trailing bytes that are not a complete frame: a mid-append or torn tail. */\n truncatedBytes: number;\n}\n\nconst FRAME_MAGIC = 0xfd2fb528;\nconst SKIPPABLE_MAGIC_LOW = 0x184d2a50;\nconst SKIPPABLE_MAGIC_HIGH = 0x184d2a5f;\nconst FRAME_CONTENT_SIZE_BYTES = [0, 2, 4, 8];\nconst DICTIONARY_ID_BYTES = [0, 1, 2, 4];\nconst BLOCK_HEADER_BYTES = 3;\nconst CHECKSUM_BYTES = 4;\n/**\n * Frames decoded between event-loop yields.\n *\n * Decoding is synchronous per frame, and a long log holds thousands of them, so\n * the loop steps aside often enough that a dashboard request never waits on a\n * background scan.\n */\nconst YIELD_EVERY_FRAMES = 256;\n\n/**\n * Decode a standard concatenation of independent Zstandard frames.\n *\n * dsh session logs are one checksummed frame per append batch, so a single log\n * routinely holds thousands of frames. Node's streaming Zstandard API decodes\n * only the first frame of such a container, so the frames are located\n * structurally — reading frame and block headers without decompressing them —\n * and each complete frame is then decoded on its own, which is also what\n * validates its checksum.\n *\n * A tail that is not a complete frame is reported rather than decoded. The\n * writer appends and fsyncs whole frames, so a reader arriving mid-append — or\n * after a crash — legitimately sees an unfinished final frame, and the\n * documented recovery is to keep the complete frames before it. Decoding it\n * anyway would accept records no checksum ever covered.\n */\nexport async function readZstdFramedText(source: Buffer): Promise<ZstdFramedRead> {\n const scan = scanZstdFrames(source);\n const parts: string[] = [];\n let frames = 0;\n for (const frame of scan.frames) {\n let plaintext: Buffer;\n try {\n plaintext = zstdDecompressSync(source.subarray(frame.start, frame.end));\n } catch {\n // A complete frame that fails its checksum ends the readable prefix: the\n // bytes after it can no longer be trusted to be the records they claim.\n break;\n }\n parts.push(plaintext.toString('utf8'));\n frames += 1;\n if (frames % YIELD_EVERY_FRAMES === 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n }\n const decodedEnd = frames === 0 ? 0 : scan.frames[frames - 1].end;\n return {\n text: parts.join(''),\n frames,\n truncatedBytes: source.byteLength - decodedEnd\n };\n}\n\n/**\n * Locate complete frames without decompressing their blocks.\n * @param source - bytes currently present in the artifact.\n * @returns complete frame ranges in file order; scanning stops at the first\n * byte that is not the start of a complete frame.\n */\nfunction scanZstdFrames(source: Buffer): { frames: ZstdFrameRange[] } {\n const frames: ZstdFrameRange[] = [];\n let offset = 0;\n while (offset < source.byteLength) {\n const end = frameEnd(source, offset);\n if (end === null) break;\n frames.push({ start: offset, end });\n offset = end;\n }\n return { frames };\n}\n\n/**\n * Where the frame starting at `offset` ends.\n * @returns the exclusive end offset, or `null` when the frame is incomplete or\n * not a frame at all.\n */\nfunction frameEnd(source: Buffer, offset: number): number | null {\n if (offset + 4 > source.byteLength) return null;\n const magic = source.readUInt32LE(offset);\n if (magic >= SKIPPABLE_MAGIC_LOW && magic <= SKIPPABLE_MAGIC_HIGH) {\n if (offset + 8 > source.byteLength) return null;\n const end = offset + 8 + source.readUInt32LE(offset + 4);\n return end <= source.byteLength ? end : null;\n }\n if (magic !== FRAME_MAGIC) return null;\n\n let cursor = offset + 4;\n if (cursor >= source.byteLength) return null;\n const descriptor = source[cursor];\n cursor += 1;\n const singleSegment = (descriptor & 0b0010_0000) !== 0;\n const hasChecksum = (descriptor & 0b0000_0100) !== 0;\n const contentSizeCode = descriptor >> 6;\n // A zero content-size code still carries one byte when the frame is a single\n // segment, which is the only place the two fields interact.\n const contentSizeBytes =\n contentSizeCode === 0 ? (singleSegment ? 1 : 0) : FRAME_CONTENT_SIZE_BYTES[contentSizeCode];\n cursor += singleSegment ? 0 : 1;\n cursor += DICTIONARY_ID_BYTES[descriptor & 0b0000_0011];\n cursor += contentSizeBytes;\n\n for (;;) {\n if (cursor + BLOCK_HEADER_BYTES > source.byteLength) return null;\n const header = source.readUIntLE(cursor, BLOCK_HEADER_BYTES);\n cursor += BLOCK_HEADER_BYTES;\n const lastBlock = (header & 0b1) !== 0;\n const blockType = (header >> 1) & 0b11;\n const blockSize = header >> 3;\n if (blockType === 3) return null;\n // An RLE block stores one repeated byte; raw and compressed blocks store\n // their declared size.\n cursor += blockType === 1 ? 1 : blockSize;\n if (cursor > source.byteLength) return null;\n if (lastBlock) break;\n }\n const end = cursor + (hasChecksum ? CHECKSUM_BYTES : 0);\n return end <= source.byteLength ? end : null;\n}\n","import { createHash } from 'node:crypto';\nimport { createReadStream } from 'node:fs';\nimport { mkdir, opendir, readFile, rename, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { createInterface } from 'node:readline';\n\nimport type { CollectionRequest, CostRecord, UsageObservation } from '../core/types.js';\nimport { normalizeTokenObservation } from '../core/token-normalization.js';\nimport { resolveGrokBillingDomain } from '../connectors/grok-build/grok-build-connector.js';\nimport { readZstdFramedText } from './zstd-frames.js';\n\nexport type LocalTranscriptProvider = 'claude-code' | 'codex' | 'grok' | 'dsh';\n\nexport interface LocalTranscriptUsageResult {\n usage: UsageObservation[];\n costs: CostRecord[];\n complete: boolean;\n /** A transcript declared an on-disk format version this reader does not know. */\n unsupportedFormat?: boolean;\n}\n\nexport interface TranscriptUsageClient {\n readUsage(options?: CollectionRequest): Promise<LocalTranscriptUsageResult>;\n}\n\nexport interface LocalTranscriptUsageClientOptions {\n provider: LocalTranscriptProvider;\n roots: string[];\n clock?: () => Date;\n lookbackDays?: number;\n cachePath?: string;\n}\n\ninterface ParsedTranscriptRecord {\n dedupeKey: string;\n observation: UsageObservation;\n reportedCostUsd: number | null;\n}\n\ninterface TranscriptFile {\n path: string;\n size: number;\n mtimeMs: number;\n}\n\ninterface CachedTranscriptFile extends TranscriptFile {\n records: ParsedTranscriptRecord[];\n recordsDigest: string;\n}\n\ninterface CodexScanState {\n model: string;\n sessionId: string;\n lastUsageSignature: string | null;\n sawSessionMeta: boolean;\n suppressingForkCopies: boolean;\n forkCopyAnchorMs: number;\n}\n\ninterface DshScanState {\n sessionId: string;\n route: string;\n model: string;\n unsupportedVersion: boolean;\n}\n\n/**\n * Billing domain for dsh usage whose route the log does not name.\n *\n * dsh billing domains are its own provider route keys, so the domain a request\n * belongs to is read from the log rather than assumed. This constant only names\n * the deployment default, which is also the domain the Provider summarizes.\n */\nexport const DSH_PRIMARY_BILLING_DOMAIN_ID = 'deepseek-official';\n/** On-disk session-format version this reader understands. */\nconst DSH_SESSION_FORMAT_VERSION = 0;\n/** Compressed dsh session artifact suffix; `compression: 'none'` keeps plain `.jsonl`. */\nconst DSH_COMPRESSED_SUFFIX = '.jsonl.zstd';\n/** Lines worth parsing in a dsh log: the header, a route change, or reported usage. */\nconst DSH_LINE_HINTS = ['\"usage\"', '\"request/context\"', '\"type\":\"session\"'];\n\nexport function loadGrokConfigCustomModels(configContent: string): Map<string, string> {\n const customModels = new Map<string, string>();\n const modelSections = [\n ...configContent.matchAll(/\\[model\\.(?:\"([^\"]+)\"|([a-zA-Z0-9_-]+))\\]([\\s\\S]*?)(?=\\n\\[|$)/g)\n ];\n for (const m of modelSections) {\n const key = m[1] || m[2];\n const body = m[3];\n const modelMatch = body.match(/model\\s*=\\s*\"([^\"]+)\"/);\n const baseUrlMatch = body.match(/base_url\\s*=\\s*\"([^\"]+)\"/);\n const providerMatch = body.match(/model_provider\\s*=\\s*\"([^\"]+)\"/);\n if (baseUrlMatch || providerMatch) {\n const domain = providerMatch ? providerMatch[1].trim() : 'custom';\n if (key) {\n customModels.set(key.trim().toLowerCase(), domain);\n const stripped = key\n .trim()\n .toLowerCase()\n .replace(/-(high|medium|low)$/, '');\n if (stripped) customModels.set(stripped, domain);\n }\n if (modelMatch) {\n const mName = modelMatch[1].trim().toLowerCase();\n customModels.set(mName, domain);\n const stripped = mName.replace(/-(high|medium|low)$/, '');\n if (stripped) customModels.set(stripped, domain);\n }\n }\n }\n return customModels;\n}\n\nexport class LocalTranscriptUsageClient implements TranscriptUsageClient {\n readonly #provider: LocalTranscriptProvider;\n readonly #roots: string[];\n readonly #clock: () => Date;\n readonly #lookbackDays: number;\n readonly #cachePath?: string;\n readonly #fileCache = new Map<string, CachedTranscriptFile>();\n #cacheLoaded = false;\n readonly #grokCustomModels = new Map<string, string>();\n #grokCustomModelsLoaded = false;\n\n constructor(options: LocalTranscriptUsageClientOptions) {\n this.#provider = options.provider;\n this.#roots = options.roots;\n this.#clock = options.clock ?? (() => new Date());\n this.#lookbackDays = options.lookbackDays ?? 90;\n this.#cachePath = options.cachePath;\n }\n\n async readUsage(\n options: CollectionRequest = { mode: 'incremental' }\n ): Promise<LocalTranscriptUsageResult> {\n if (this.#provider === 'grok' && !this.#grokCustomModelsLoaded) {\n this.#grokCustomModelsLoaded = true;\n for (const root of this.#roots) {\n try {\n const configPath = join(dirname(root), 'config.toml');\n const content = await readFile(configPath, 'utf8');\n for (const [k, v] of loadGrokConfigCustomModels(content)) {\n this.#grokCustomModels.set(k, v);\n }\n } catch {\n // config.toml is optional\n }\n }\n }\n await this.#loadCache();\n if (options.mode === 'hard-rebuild') this.#fileCache.clear();\n const cutoff = this.#clock().getTime() - this.#lookbackDays * 24 * 60 * 60 * 1000;\n const discovered = await listTranscriptFiles(this.#roots, cutoff);\n const files = discovered.files;\n let complete = discovered.complete;\n const usage: UsageObservation[] = [];\n const costs: CostRecord[] = [];\n let unsupportedFormat = false;\n const seen = new Set<string>();\n const livePaths = new Set(files.map((file) => stableId(file.path)));\n for (const path of this.#fileCache.keys()) {\n if (!livePaths.has(path)) this.#fileCache.delete(path);\n }\n\n for (const file of files) {\n const parsedFile = await this.#readFile(file);\n complete &&= parsedFile.complete;\n unsupportedFormat ||= parsedFile.unsupportedFormat;\n const parsedRecords = parsedFile.records;\n for (const parsed of parsedRecords) {\n if (new Date(parsed.observation.observedAt).getTime() < cutoff) continue;\n if (seen.has(parsed.dedupeKey)) continue;\n seen.add(parsed.dedupeKey);\n usage.push(parsed.observation);\n if (parsed.reportedCostUsd !== null) {\n costs.push({\n id: `${this.#provider}-transcript-cost:${stableId(parsed.dedupeKey)}`,\n sourceId: parsed.observation.id,\n billingDomainId: parsed.observation.billingDomainId,\n observedAt: parsed.observation.observedAt,\n kind: 'reported-estimate',\n amount: parsed.reportedCostUsd,\n currency: 'USD',\n authority: 'local-observation',\n model: parsed.observation.model,\n usageObservationId: parsed.observation.id\n });\n }\n }\n }\n\n await this.#persistCache();\n\n return { usage, costs, complete, unsupportedFormat };\n }\n\n async #readFile(\n file: TranscriptFile\n ): Promise<{ records: ParsedTranscriptRecord[]; complete: boolean; unsupportedFormat: boolean }> {\n const cacheKey = stableId(file.path);\n const cached = this.#fileCache.get(cacheKey);\n if (cached && cached.size === file.size && cached.mtimeMs === file.mtimeMs) {\n if (this.#provider === 'grok') {\n const remapped = cached.records.map((r) => {\n const expectedDomain = resolveGrokBillingDomain(\n r.observation.model,\n this.#grokCustomModels\n );\n if (r.observation.billingDomainId !== expectedDomain) {\n return {\n ...r,\n observation: { ...r.observation, billingDomainId: expectedDomain }\n };\n }\n return r;\n });\n return { records: remapped, complete: true, unsupportedFormat: false };\n }\n return { records: cached.records, complete: true, unsupportedFormat: false };\n }\n const records: ParsedTranscriptRecord[] = [];\n const codexState: CodexScanState = {\n model: '',\n sessionId: '',\n lastUsageSignature: null,\n sawSessionMeta: false,\n suppressingForkCopies: false,\n forkCopyAnchorMs: 0\n };\n const dshState: DshScanState = {\n sessionId: '',\n route: '',\n model: '',\n unsupportedVersion: false\n };\n try {\n for await (const line of readTranscriptLines(file.path)) {\n records.push(...this.#parseLine(line, codexState, dshState));\n // An unknown format version is never partially trusted, and the file\n // stays uncached so the reported gap does not vanish on the next scan.\n if (dshState.unsupportedVersion) {\n return { records: [], complete: false, unsupportedFormat: true };\n }\n }\n } catch {\n return { records: cached?.records ?? [], complete: false, unsupportedFormat: false };\n }\n this.#fileCache.set(cacheKey, {\n ...file,\n path: cacheKey,\n records,\n recordsDigest: stableId(JSON.stringify(records))\n });\n return { records, complete: true, unsupportedFormat: false };\n }\n\n #parseLine(\n line: string,\n codexState: CodexScanState,\n dshState: DshScanState\n ): ParsedTranscriptRecord[] {\n if (this.#provider === 'claude-code') {\n return line.includes('\"usage\"') ? compact(parseClaudeTranscriptLine(line)) : [];\n }\n if (this.#provider === 'codex') return compact(parseCodexTranscriptLine(line, codexState));\n if (this.#provider === 'dsh') {\n return DSH_LINE_HINTS.some((hint) => line.includes(hint))\n ? parseDshTranscriptLine(line, dshState)\n : [];\n }\n return line.includes('\"turn_completed\"')\n ? parseGrokTranscriptLine(line, this.#grokCustomModels)\n : [];\n }\n\n async #loadCache(): Promise<void> {\n if (this.#cacheLoaded) return;\n this.#cacheLoaded = true;\n if (!this.#cachePath) return;\n try {\n const stored = JSON.parse(await readFile(this.#cachePath, 'utf8')) as {\n version?: number;\n files?: unknown[];\n };\n if (stored.version !== 1 || !Array.isArray(stored.files)) return;\n for (const file of stored.files) {\n if (!isCachedTranscriptFile(file)) continue;\n if (file.recordsDigest !== stableId(JSON.stringify(file.records))) continue;\n this.#fileCache.set(file.path, file);\n }\n } catch {\n // A missing or corrupt optimization cache is rebuilt from source transcripts.\n }\n }\n\n async #persistCache(): Promise<void> {\n if (!this.#cachePath) return;\n try {\n await mkdir(dirname(this.#cachePath), { recursive: true, mode: 0o700 });\n const temporary = `${this.#cachePath}.${process.pid}.tmp`;\n await writeFile(\n temporary,\n JSON.stringify({ version: 1, files: [...this.#fileCache.values()] }),\n { mode: 0o600 }\n );\n await rename(temporary, this.#cachePath);\n } catch {\n // Cache persistence never makes transcript collection fail.\n }\n }\n}\n\nfunction isCachedTranscriptFile(value: unknown): value is CachedTranscriptFile {\n const record = asObject(value);\n if (!record || !Array.isArray(record.records)) return false;\n return (\n typeof record.path === 'string' &&\n /^[0-9a-f]{24}$/.test(record.path) &&\n finiteNonNegative(record.size) !== null &&\n finiteNonNegative(record.mtimeMs) !== null &&\n typeof record.recordsDigest === 'string' &&\n /^[0-9a-f]{24}$/.test(record.recordsDigest) &&\n record.records.every(isParsedTranscriptRecord)\n );\n}\n\nfunction isParsedTranscriptRecord(value: unknown): value is ParsedTranscriptRecord {\n const record = asObject(value);\n const observation = asObject(record?.observation);\n if (!record || !observation) return false;\n const authority = observation.authority;\n const requiredTokenFields = [\n 'inputTokens',\n 'outputTokens',\n 'cacheReadTokens',\n 'cacheWriteTokens'\n ];\n const optionalTokenFields = [\n 'reasoningTokens',\n 'sourceReportedTotalTokens',\n 'reconciledRemainderTokens'\n ];\n const cacheWriteTokenBreakdown = asObject(observation.cacheWriteTokenBreakdown);\n const tokenSemantics = asObject(observation.tokenSemantics);\n const structurallyValid =\n typeof record.dedupeKey === 'string' &&\n (record.reportedCostUsd === null || finiteNonNegative(record.reportedCostUsd) !== null) &&\n typeof observation.id === 'string' &&\n typeof observation.billingDomainId === 'string' &&\n (observation.model === null || typeof observation.model === 'string') &&\n (observation.sessionId === undefined ||\n observation.sessionId === null ||\n typeof observation.sessionId === 'string') &&\n typeof observation.observedAt === 'string' &&\n Number.isFinite(Date.parse(observation.observedAt)) &&\n requiredTokenFields.every((field) => nonNegativeSafeInteger(observation[field])) &&\n optionalTokenFields.every(\n (field) =>\n observation[field] === undefined ||\n observation[field] === null ||\n nonNegativeSafeInteger(observation[field])\n ) &&\n (observation.cacheWriteTokenBreakdown === undefined ||\n observation.cacheWriteTokenBreakdown === null ||\n (cacheWriteTokenBreakdown !== null &&\n nonNegativeSafeInteger(cacheWriteTokenBreakdown.fiveMinute) &&\n nonNegativeSafeInteger(cacheWriteTokenBreakdown.oneHour))) &&\n (observation.tokenSemantics === undefined ||\n (tokenSemantics !== null &&\n ['included-in-output', 'separate'].includes(String(tokenSemantics.reasoning)) &&\n ['included-in-input', 'separate'].includes(String(tokenSemantics.cacheRead)) &&\n ['included-in-input', 'separate'].includes(String(tokenSemantics.cacheWrite)))) &&\n (observation.modelAttribution === undefined ||\n ['known', 'unclassified'].includes(String(observation.modelAttribution))) &&\n (observation.timePrecision === undefined ||\n ['event', 'hour', 'day', 'billing-period', 'unknown'].includes(\n String(observation.timePrecision)\n )) &&\n (observation.usageScope === undefined ||\n ['account-wide', 'this-mac', 'unknown'].includes(String(observation.usageScope))) &&\n (observation.aggregationTemporality === undefined ||\n ['delta', 'cumulative', 'unknown'].includes(String(observation.aggregationTemporality))) &&\n ['official-account', 'official-client', 'local-observation', 'estimate'].includes(\n String(authority)\n );\n if (!structurallyValid) return false;\n try {\n normalizeTokenObservation(observation as unknown as UsageObservation);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction nonNegativeSafeInteger(value: unknown): boolean {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction parseGrokTranscriptLine(\n line: string,\n grokCustomModels?: Map<string, string>\n): ParsedTranscriptRecord[] {\n const record = parseObject(line);\n const params = asObject(record?.params);\n const update = asObject(params?.update);\n const usage = asObject(update?.usage);\n if (!record || !params || !update || !usage || update.sessionUpdate !== 'turn_completed') {\n return [];\n }\n\n const meta = asObject(params._meta);\n const agentTimestamp = finiteNonNegative(meta?.agentTimestampMs);\n const outerTimestamp = finiteNonNegative(record.timestamp);\n const timestampMs =\n agentTimestamp ??\n (outerTimestamp === null\n ? null\n : outerTimestamp > 1_000_000_000_000\n ? outerTimestamp\n : outerTimestamp * 1000);\n if (timestampMs === null || !Number.isFinite(timestampMs)) return [];\n\n const modelUsage = asObject(usage.modelUsage);\n const sessionId = string(params.sessionId) ?? '';\n const promptId = string(update.prompt_id);\n const observedAt = new Date(timestampMs).toISOString();\n const models = modelUsage\n ? Object.entries(modelUsage)\n .map(([model, value]) => ({ model, totals: readGrokTotals(value) }))\n .filter(\n (entry): entry is { model: string; totals: GrokTotals } =>\n entry.model.length > 0 && entry.totals !== null && grokRecordedTokens(entry.totals) > 0\n )\n : [];\n const topLevel = readGrokTotals(usage);\n if (models.length === 0 && topLevel && grokRecordedTokens(topLevel) > 0) {\n models.push({ model: 'grok', totals: topLevel });\n }\n if (models.length === 0) return [];\n\n const topLevelCost = grokCostUsd(topLevel?.costUsdTicks ?? null);\n const explicitCost = models.reduce(\n (total, entry) => total + (grokCostUsd(entry.totals.costUsdTicks) ?? 0),\n 0\n );\n const untickedTokens = models.reduce(\n (total, entry) =>\n total + (entry.totals.costUsdTicks === null ? grokRecordedTokens(entry.totals) : 0),\n 0\n );\n const remainingCost = topLevelCost === null ? null : Math.max(0, topLevelCost - explicitCost);\n\n return models.map(({ model, totals }) => {\n const cacheReadTokens = totals.cachedReadTokens;\n const cacheWriteTokens = totals.cacheCreationTokens;\n const inputTokens = Math.max(0, totals.inputTokens - cacheReadTokens - cacheWriteTokens);\n const outputTokens = totals.outputTokens;\n const reasoningTokens = Math.min(outputTokens, totals.reasoningTokens);\n const dedupeKey = `${sessionId}:${promptId ?? stableId(line)}:${model}`;\n const directCost = grokCostUsd(totals.costUsdTicks);\n const reportedCostUsd =\n directCost ??\n (remainingCost !== null && untickedTokens > 0\n ? remainingCost * (grokRecordedTokens(totals) / untickedTokens)\n : null);\n const billingDomainId = resolveGrokBillingDomain(model, grokCustomModels);\n return {\n dedupeKey,\n observation: {\n id: `grok-transcript:${stableId(dedupeKey)}`,\n billingDomainId,\n model,\n sessionId,\n observedAt,\n inputTokens,\n outputTokens,\n reasoningTokens,\n cacheReadTokens,\n cacheWriteTokens,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: model === 'grok' ? 'unclassified' : 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n },\n reportedCostUsd\n };\n });\n}\n\ninterface GrokTotals {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cacheCreationTokens: number;\n reasoningTokens: number;\n costUsdTicks: number | null;\n}\n\nfunction readGrokTotals(value: unknown): GrokTotals | null {\n const record = asObject(value);\n if (!record) return null;\n return {\n inputTokens: positiveInteger(record.inputTokens),\n outputTokens: positiveInteger(record.outputTokens),\n cachedReadTokens: positiveInteger(record.cachedReadTokens),\n cacheCreationTokens: positiveInteger(record.cacheCreationTokens),\n reasoningTokens: positiveInteger(record.reasoningTokens),\n costUsdTicks: finiteNonNegative(record.costUsdTicks)\n };\n}\n\nfunction grokRecordedTokens(totals: GrokTotals): number {\n return totals.inputTokens + totals.outputTokens;\n}\n\nfunction grokCostUsd(ticks: number | null): number | null {\n return ticks === null ? null : ticks / 10_000_000_000;\n}\n\nfunction parseCodexTranscriptLine(\n line: string,\n state: CodexScanState\n): ParsedTranscriptRecord | null {\n if (\n !line.includes('\"token_count\"') &&\n !line.includes('\"turn_context\"') &&\n !line.includes('\"session_meta\"')\n ) {\n return null;\n }\n const record = parseObject(line);\n const payload = asObject(record?.payload);\n if (!record || !payload) return null;\n\n if (record.type === 'session_meta') {\n if (!state.sawSessionMeta) {\n state.sawSessionMeta = true;\n state.sessionId = string(payload.id) ?? string(payload.session_id) ?? '';\n const metaTimestamp = string(record.timestamp);\n if (metaTimestamp && isForkedCodexSession(payload)) {\n state.suppressingForkCopies = true;\n state.forkCopyAnchorMs = Date.parse(metaTimestamp);\n }\n }\n return null;\n }\n if (record.type === 'turn_context') {\n state.model = string(payload.model) ?? state.model;\n return null;\n }\n if (payload.type !== 'token_count' || !state.model) return null;\n\n const info = asObject(payload.info);\n const last = asObject(info?.last_token_usage);\n const timestamp = string(record.timestamp);\n if (!last || !timestamp || !Number.isFinite(Date.parse(timestamp))) return null;\n const signature = JSON.stringify(last);\n if (signature === state.lastUsageSignature) return null;\n state.lastUsageSignature = signature;\n const timestampMs = Date.parse(timestamp);\n if (state.suppressingForkCopies) {\n if (timestampMs - state.forkCopyAnchorMs < 1000) {\n state.forkCopyAnchorMs = timestampMs;\n return null;\n }\n state.suppressingForkCopies = false;\n }\n\n const inclusiveInput = positiveInteger(last.input_tokens);\n const cacheReadTokens = positiveInteger(last.cached_input_tokens);\n const cacheWriteTokens = positiveInteger(last.cache_write_input_tokens);\n const outputTokens = positiveInteger(last.output_tokens);\n const reasoningTokens = Math.min(outputTokens, positiveInteger(last.reasoning_output_tokens));\n const inputTokens = Math.max(0, inclusiveInput - cacheReadTokens - cacheWriteTokens);\n const categorizedTokens = inputTokens + outputTokens + cacheReadTokens + cacheWriteTokens;\n if (categorizedTokens === 0) return null;\n const reportedTotal = optionalNonNegativeInteger(last.total_tokens);\n if (reportedTotal !== null && reportedTotal < categorizedTokens) {\n throw new Error('Codex source-reported total is smaller than categorized Tokens.');\n }\n const sourceReportedTotalTokens = reportedTotal;\n\n const observedAt = new Date(timestamp).toISOString();\n const dedupeKey = `${state.sessionId}:${observedAt}:${state.model}:${signature}`;\n return {\n dedupeKey,\n observation: {\n id: `codex-transcript:${stableId(dedupeKey)}`,\n billingDomainId: 'subscription',\n model: state.model,\n sessionId: state.sessionId,\n observedAt,\n inputTokens,\n outputTokens,\n reasoningTokens,\n cacheReadTokens,\n cacheWriteTokens,\n sourceReportedTotalTokens,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n },\n reportedCostUsd: null\n };\n}\n\nfunction isForkedCodexSession(payload: Record<string, unknown>): boolean {\n if (string(payload.forked_from_id)) return true;\n const source = asObject(payload.source);\n const subagent = asObject(source?.subagent);\n const spawn = asObject(subagent?.thread_spawn);\n return string(spawn?.parent_thread_id) !== null;\n}\n\nasync function listTranscriptFiles(\n roots: string[],\n cutoff: number\n): Promise<{ files: TranscriptFile[]; complete: boolean }> {\n const files: TranscriptFile[] = [];\n const visited = new Set<string>();\n let complete = true;\n const walk = async (directory: string, isRoot = false): Promise<void> => {\n let entries;\n try {\n entries = await opendir(directory);\n } catch (error) {\n if (!(isRoot && isMissingPath(error))) complete = false;\n return;\n }\n for await (const entry of entries) {\n const path = join(directory, entry.name);\n if (entry.isDirectory()) {\n await walk(path);\n } else if (\n entry.isFile() &&\n (entry.name.endsWith('.jsonl') || entry.name.endsWith(DSH_COMPRESSED_SUFFIX))\n ) {\n if (visited.has(path)) continue;\n visited.add(path);\n try {\n const metadata = await stat(path);\n if (metadata.mtimeMs >= cutoff) {\n files.push({ path, size: metadata.size, mtimeMs: metadata.mtimeMs });\n }\n } catch {\n // A rotating transcript may disappear between listing and stat.\n complete = false;\n }\n }\n }\n };\n // Overlapping roots stay harmless: a transcript is read once, whichever root reaches it.\n for (const root of roots) await walk(root, true);\n return { files, complete };\n}\n\nfunction isMissingPath(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'ENOENT';\n}\n\n/**\n * Yield the logical lines of one transcript, whichever encoding it uses.\n *\n * A dsh session log is a concatenation of independent Zstandard frames rather\n * than newline-delimited text, so it is decoded frame by frame and split here.\n * The trailing segment is dropped because it is either the empty string after a\n * final newline or a line the writer has not finished appending; either way it\n * is not yet a record. A compressed artifact that yields no frame at all is\n * treated as unreadable so the caller reports a gap instead of silently\n * reporting an empty history.\n * @param path - transcript path.\n */\nasync function* readTranscriptLines(path: string): AsyncGenerator<string> {\n if (!path.endsWith(DSH_COMPRESSED_SUFFIX)) {\n yield* createInterface({\n input: createReadStream(path, { encoding: 'utf8' }),\n crlfDelay: Infinity\n });\n return;\n }\n const source = await readFile(path);\n if (source.byteLength === 0) return;\n const decoded = await readZstdFramedText(source);\n if (decoded.frames === 0) throw new Error('No complete Zstandard frame in session log.');\n const lines = decoded.text.split('\\n');\n lines.pop();\n yield* lines;\n}\n\nfunction parseClaudeTranscriptLine(line: string): ParsedTranscriptRecord | null {\n const record = parseObject(line);\n if (!record || record.type !== 'assistant') return null;\n const message = asObject(record.message);\n const usage = asObject(message?.usage);\n const timestamp = string(record.timestamp);\n const model = string(message?.model);\n if (!message || !usage || !timestamp || !model || !Number.isFinite(Date.parse(timestamp))) {\n return null;\n }\n\n const messageId = string(message.id);\n const requestId = string(record.requestId);\n const sessionId = string(record.sessionId) ?? '';\n const dedupeKey =\n messageId || requestId\n ? `${messageId ?? ''}:${requestId ?? ''}`\n : `${sessionId}:${timestamp}:${model}:${stableId(line)}`;\n const observationId = `claude-transcript:${stableId(dedupeKey)}`;\n const cacheWriteTokens = positiveInteger(usage.cache_creation_input_tokens);\n const cacheCreation = asObject(usage.cache_creation);\n const cacheWriteFiveMinute = positiveInteger(cacheCreation?.ephemeral_5m_input_tokens);\n const cacheWriteOneHour = positiveInteger(cacheCreation?.ephemeral_1h_input_tokens);\n const hasExactCacheWriteBreakdown =\n cacheCreation !== null && cacheWriteFiveMinute + cacheWriteOneHour === cacheWriteTokens;\n\n return {\n dedupeKey,\n observation: {\n id: observationId,\n billingDomainId: 'subscription',\n model,\n sessionId,\n observedAt: new Date(timestamp).toISOString(),\n inputTokens: positiveInteger(usage.input_tokens),\n outputTokens: positiveInteger(usage.output_tokens),\n reasoningTokens: 0,\n cacheReadTokens: positiveInteger(usage.cache_read_input_tokens),\n cacheWriteTokens,\n cacheWriteTokenBreakdown: hasExactCacheWriteBreakdown\n ? { fiveMinute: cacheWriteFiveMinute, oneHour: cacheWriteOneHour }\n : null,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n },\n reportedCostUsd: finiteNonNegative(record.costUSD)\n };\n}\n\n/**\n * Read one line of a dsh session log.\n *\n * The log is an append-only event stream whose first line is the immutable\n * session header. Provider-reported accounting arrives on `assistant/message`\n * events, whose four token buckets are disjoint with reasoning already inside\n * the output count. Each message carries the route that answered it, so a\n * session that switches routes attributes every request to the billing domain\n * that actually served it; `request/context` supplies the same pair and is kept\n * as the fallback for a message that omits its source.\n * @param line - one decoded logical line.\n * @param state - header and route facts carried across the file's lines.\n */\nfunction parseDshTranscriptLine(line: string, state: DshScanState): ParsedTranscriptRecord[] {\n const record = parseObject(line);\n if (!record) return [];\n if (record.type === 'session') {\n state.sessionId = string(record.id) ?? '';\n state.unsupportedVersion = record.version !== DSH_SESSION_FORMAT_VERSION;\n return [];\n }\n const data = asObject(record.data);\n if (!data) return [];\n if (record.type === 'request/context') {\n state.route = string(data.provider) ?? state.route;\n state.model = string(data.model) ?? state.model;\n return [];\n }\n if (record.type !== 'assistant/message') return [];\n const usage = asObject(data.usage);\n const observedAtMs = finiteNonNegative(record.time);\n if (!usage || observedAtMs === null) return [];\n\n const message = asObject(data.message);\n const source = asObject(message?.source);\n const model = string(source?.model) ?? string(state.model);\n const route = string(source?.provider) ?? string(state.route) ?? DSH_PRIMARY_BILLING_DOMAIN_ID;\n const sequence = finiteNonNegative(record.seq);\n const messageIdentity =\n string(message?.id) ?? (sequence === null ? stableId(line) : `${sequence}`);\n const dedupeKey = `dsh:${state.sessionId}:${messageIdentity}`;\n\n return [\n {\n dedupeKey,\n observation: {\n id: `dsh-transcript:${stableId(dedupeKey)}`,\n billingDomainId: route,\n model,\n sessionId: state.sessionId,\n observedAt: new Date(observedAtMs).toISOString(),\n inputTokens: positiveInteger(usage.inputTokens),\n outputTokens: positiveInteger(usage.outputTokens),\n reasoningTokens: positiveInteger(usage.reasoningTokens),\n cacheReadTokens: positiveInteger(usage.cacheReadTokens),\n cacheWriteTokens: positiveInteger(usage.cacheWriteTokens),\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: model ? 'known' : 'unclassified',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n },\n // dsh records provider accounting without money; cost comes from the\n // versioned API retail equivalent instead of a client-reported estimate.\n reportedCostUsd: null\n }\n ];\n}\n\nfunction parseObject(value: string): Record<string, unknown> | null {\n try {\n return asObject(JSON.parse(value));\n } catch {\n return null;\n }\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : null;\n}\n\nfunction string(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction positiveInteger(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? Math.trunc(value) : 0;\n}\n\nfunction optionalNonNegativeInteger(value: unknown): number | null {\n if (value === undefined || value === null) return null;\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw new Error('Source-reported Token total is invalid.');\n }\n return value;\n}\n\nfunction finiteNonNegative(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : null;\n}\n\nfunction compact<T>(value: T | null): T[] {\n return value === null ? [] : [value];\n}\n\nfunction stableId(value: string): string {\n return createHash('sha256').update(value).digest('hex').slice(0, 24);\n}\n","import type {\n BillingDomain,\n CollectionRequest,\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n UsageObservation\n} from '../../core/types.js';\nimport {\n DSH_PRIMARY_BILLING_DOMAIN_ID,\n type TranscriptUsageClient\n} from '../../server/local-transcript-usage-client.js';\n\nexport interface DshConnectorOptions {\n historyClient: TranscriptUsageClient;\n clock?: () => Date;\n}\n\n/**\n * dsh (DeepSeek Harness) usage read from its local session logs.\n *\n * dsh answers through pay-as-you-go provider routes rather than a subscription,\n * so it publishes no quota window: the Provider contributes token evidence and\n * history, and money arrives only as the versioned API retail equivalent. A\n * TUI layer composed on dsh — codsh, for example — keeps its conversations in\n * the same logs and is counted here rather than as a Provider of its own.\n */\nexport class DshConnector implements Connector {\n readonly id = 'dsh';\n readonly displayName = 'dsh';\n readonly consentId = 'dsh';\n readonly #historyClient: TranscriptUsageClient;\n readonly #clock: () => Date;\n\n constructor(options: DshConnectorOptions) {\n this.#historyClient = options.historyClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n const warnings: ConnectorFailure[] = [];\n let history: Awaited<ReturnType<TranscriptUsageClient['readUsage']>> | null = null;\n try {\n history = await this.#historyClient.readUsage(options);\n } catch (error) {\n // The failure is already named; adding a second warning about the gap it\n // caused would report one problem twice.\n warnings.push(safeFailure(error));\n }\n if (history?.unsupportedFormat) warnings.push(unsupportedFormatFailure());\n else if (history && !history.complete) warnings.push(incompleteSessionLogFailure());\n const usage = history?.usage ?? [];\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: billingDomains(usage),\n quotaBuckets: [],\n usage,\n ...(usage.length > 0 && history?.complete\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['dsh-transcript:'],\n retiredIdPrefixes: []\n }\n }\n : {}),\n costs: history?.costs ?? [],\n warnings,\n observedAt\n };\n }\n}\n\n/**\n * The billing domains this snapshot describes.\n *\n * A dsh billing domain is one of its provider route keys. The deployment\n * default is always present so the Provider keeps a domain to summarize even\n * before any request is observed, and it stays first because the Provider\n * headline follows the first declared domain. Any other route that actually\n * answered is added under its own key rather than folded into DeepSeek's.\n * @param usage - observations this collection produced.\n */\nfunction billingDomains(usage: UsageObservation[]): BillingDomain[] {\n const primary = { id: DSH_PRIMARY_BILLING_DOMAIN_ID, displayName: 'DeepSeek API' };\n const observedRoutes = [...new Set(usage.map((observation) => observation.billingDomainId))]\n .filter((id) => id !== primary.id)\n .sort();\n // An unknown route names itself: inventing a product name for it would state\n // more than the log does.\n return [primary, ...observedRoutes.map((id) => ({ id, displayName: id }))];\n}\n\nfunction incompleteSessionLogFailure(): ConnectorFailure {\n return {\n code: 'dsh-session-log-scan-incomplete',\n message: 'Some local dsh session history could not be read.',\n recovery: 'Agent Usage will retry automatically without removing stored history.'\n };\n}\n\nfunction unsupportedFormatFailure(): ConnectorFailure {\n return {\n code: 'dsh-session-format-unsupported',\n message: 'A dsh session log declares an on-disk format this version does not read.',\n recovery: 'Update Agent Usage; stored dsh history from earlier scans is retained.'\n };\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'dsh-session-log-read-failed',\n message: 'Local dsh session history is unavailable.',\n recovery: 'Run agent-usage doctor, then retry refresh.'\n };\n}\n","import { readdirSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { QuotaBucket } from '../core/types.js';\nimport { ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID } from '../connectors/antigravity/antigravity-connector.js';\n\nexport interface AntigravityQuotaClientOptions {\n logRoots?: string[];\n ports?: number[];\n fetchFn?: typeof fetch;\n timeoutMs?: number;\n}\n\ninterface RawQuotaBucket {\n bucketId?: string;\n displayName?: string;\n description?: string;\n window?: string;\n remainingFraction?: number;\n remainingAmount?: number;\n resetTime?: string;\n}\n\ninterface RawQuotaGroup {\n displayName?: string;\n description?: string;\n buckets?: RawQuotaBucket[];\n}\n\ninterface RawQuotaResponse {\n response?: {\n groups?: RawQuotaGroup[];\n description?: string;\n };\n}\n\nexport class AntigravityQuotaClient {\n readonly #logRoots: string[];\n readonly #ports?: number[];\n readonly #fetchFn: typeof fetch;\n readonly #timeoutMs: number;\n\n constructor(options: AntigravityQuotaClientOptions = {}) {\n this.#logRoots = options.logRoots ?? [\n join(homedir(), 'Library/Logs/Antigravity'),\n join(homedir(), '.gemini/antigravity-cli/log'),\n join(homedir(), '.gemini/antigravity/log')\n ];\n this.#ports = options.ports;\n this.#fetchFn = options.fetchFn ?? globalThis.fetch;\n this.#timeoutMs = options.timeoutMs ?? 1500;\n }\n\n async readQuota(): Promise<QuotaBucket[] | null> {\n const { ports, csrfToken } = this.discoverCandidates();\n const candidatePorts = this.#ports ?? ports;\n if (candidatePorts.length === 0) {\n return null;\n }\n\n for (const port of candidatePorts) {\n const quota = await this.queryPort(port, csrfToken);\n if (quota) {\n return quota;\n }\n }\n\n return null;\n }\n\n discoverCandidates(): { ports: number[]; csrfToken: string | null } {\n let csrfToken = process.env.ANTIGRAVITY_CSRF_TOKEN ?? null;\n const ports: number[] = [];\n const httpPortRegex =\n /(?:Language server listening on random port at|Reloading all windows with URL: https?:\\/\\/127\\.0\\.0\\.1:|Local:\\s+https?:\\/\\/127\\.0\\.0\\.1:|Host bridge server listening on http:\\/\\/127\\.0\\.0\\.1:)\\s*(\\d+)/g;\n const csrfRegex = /--csrf_token[= ]([a-f0-9-]+)/;\n\n for (const root of this.#logRoots) {\n try {\n const files = readdirSync(root)\n .filter((file) => file.endsWith('.log'))\n .sort()\n .reverse()\n .slice(0, 10);\n\n for (const file of files) {\n const filePath = join(root, file);\n try {\n const content = readFileSync(filePath, 'utf8');\n if (!csrfToken) {\n const csrfMatch = csrfRegex.exec(content);\n if (csrfMatch) csrfToken = csrfMatch[1];\n }\n let match: RegExpExecArray | null;\n while ((match = httpPortRegex.exec(content)) !== null) {\n const basePort = Number(match[1]);\n ports.push(basePort);\n ports.push(basePort + 1);\n ports.push(basePort + 2);\n }\n } catch {\n // Ignore unreadable individual log file\n }\n }\n } catch {\n // Ignore unreadable log root directory\n }\n }\n\n // Return unique ports, newest first\n return {\n ports: [...new Set(ports.reverse())],\n csrfToken\n };\n }\n\n discoverCandidatePorts(): number[] {\n return this.discoverCandidates().ports;\n }\n\n private async queryPort(\n port: number,\n csrfToken: string | null = null\n ): Promise<QuotaBucket[] | null> {\n try {\n const url = `http://127.0.0.1:${port}/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary`;\n const response = await this.#fetchFn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Connect-Protocol-Version': '1',\n ...(csrfToken ? { 'x-codeium-csrf-token': csrfToken } : {})\n },\n body: JSON.stringify({}),\n signal: AbortSignal.timeout(this.#timeoutMs)\n });\n\n if (!response.ok) {\n return null;\n }\n\n const body = (await response.json()) as RawQuotaResponse;\n const groups = body.response?.groups;\n if (!Array.isArray(groups) || groups.length === 0) {\n return null;\n }\n\n return mapQuotaGroups(groups);\n } catch {\n return null;\n }\n }\n}\n\nexport function mapQuotaGroups(groups: RawQuotaGroup[]): QuotaBucket[] {\n const buckets: QuotaBucket[] = [];\n\n for (const group of groups) {\n const isGemini = /gemini/i.test(group.displayName ?? '');\n const isClaudeOrGpt = /claude|gpt/i.test(group.displayName ?? '');\n\n for (const rawBucket of group.buckets ?? []) {\n const windowStr = (rawBucket.window ?? '').toLowerCase();\n const displayStr = (rawBucket.displayName ?? '').toLowerCase();\n\n const is5h = windowStr === '5h' || /5[- ]?hour/i.test(displayStr);\n const isWeekly = windowStr === 'weekly' || /week/i.test(displayStr);\n\n let durationMinutes: number;\n let windowName: string;\n if (is5h) {\n durationMinutes = 300;\n windowName = '5 hour';\n } else if (isWeekly) {\n durationMinutes = 10_080;\n windowName = 'Week';\n } else {\n continue;\n }\n\n let label = windowName;\n if (!isGemini) {\n if (isClaudeOrGpt) {\n label = `Claude / GPT · ${windowName}`;\n } else if (group.displayName) {\n label = `${group.displayName} · ${windowName}`;\n }\n }\n\n const usedPercent =\n typeof rawBucket.remainingFraction === 'number'\n ? Math.max(0, Math.min(100, Math.round((1 - rawBucket.remainingFraction) * 100)))\n : null;\n\n buckets.push({\n id: rawBucket.bucketId || `${isGemini ? 'gemini' : '3p'}-${windowStr}`,\n billingDomainId: ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID,\n label,\n usedPercent,\n windowDurationMinutes: durationMinutes,\n resetsAt: rawBucket.resetTime ?? null,\n authority: 'official-client',\n scope: 'account-wide'\n });\n }\n }\n\n return buckets;\n}\n","import type {\n BillingDomain,\n CollectionRequest,\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket,\n UsageObservation\n} from '../../core/types.js';\nimport type { AntigravitySqliteUsageClient } from '../../server/antigravity-sqlite-usage-client.js';\nimport { AntigravityQuotaClient } from '../../server/antigravity-quota-client.js';\n\nexport const ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID = 'code-assist-subscription';\n\nexport interface AntigravityQuotaLimits {\n rolling5hTokens?: number;\n weeklyTokens?: number;\n}\n\nexport const DEFAULT_ANTIGRAVITY_QUOTA_LIMITS: Required<AntigravityQuotaLimits> = {\n rolling5hTokens: 15_000_000,\n weeklyTokens: 100_000_000\n};\n\nexport interface AntigravityConnectorOptions {\n historyClient: AntigravitySqliteUsageClient;\n quotaClient?: AntigravityQuotaClient;\n clock?: () => Date;\n quotaLimits?: AntigravityQuotaLimits;\n}\n\n/**\n * Antigravity usage read from local conversation SQLite databases.\n *\n * Google Antigravity uses a dual-limit capacity model: a 5-hour rolling sprint\n * window and a weekly baseline limit. When official live quota is unavailable or\n * unwindowed, rolling 5-hour and weekly usage are derived from session observations.\n */\nexport class AntigravityConnector implements Connector {\n readonly id = 'antigravity';\n readonly displayName = 'Antigravity';\n readonly consentId = 'antigravity';\n readonly #historyClient: AntigravitySqliteUsageClient;\n readonly #quotaClient: AntigravityQuotaClient;\n readonly #clock: () => Date;\n readonly #quotaLimits: Required<AntigravityQuotaLimits>;\n\n constructor(options: AntigravityConnectorOptions) {\n this.#historyClient = options.historyClient;\n this.#quotaClient = options.quotaClient ?? new AntigravityQuotaClient();\n this.#clock = options.clock ?? (() => new Date());\n this.#quotaLimits = {\n rolling5hTokens:\n options.quotaLimits?.rolling5hTokens ?? DEFAULT_ANTIGRAVITY_QUOTA_LIMITS.rolling5hTokens,\n weeklyTokens:\n options.quotaLimits?.weeklyTokens ?? DEFAULT_ANTIGRAVITY_QUOTA_LIMITS.weeklyTokens\n };\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n const nowMs = this.#clock().getTime();\n const warnings: ConnectorFailure[] = [];\n let history: Awaited<ReturnType<AntigravitySqliteUsageClient['readUsage']>> | null = null;\n\n try {\n history = await this.#historyClient.readUsage(options);\n } catch {\n warnings.push(safeFailure());\n }\n\n if (history && !history.complete) {\n warnings.push(incompleteSessionScanFailure());\n }\n\n const usage = history?.usage ?? [];\n let quotaBuckets: QuotaBucket[] = [];\n\n try {\n const liveQuota = await this.#quotaClient.readQuota();\n if (liveQuota && liveQuota.length > 0) {\n quotaBuckets = [...liveQuota];\n }\n } catch {\n // Degrade gracefully to local observation buckets\n }\n\n const localBuckets = buildAntigravityQuotaBuckets(usage, nowMs, this.#quotaLimits);\n const has5h = quotaBuckets.some((b) => b.label === '5 hour' || b.id === 'gemini-5h');\n const hasWeekly = quotaBuckets.some((b) => b.label === 'Week' || b.id === 'gemini-weekly');\n\n if (!has5h || !hasWeekly) {\n for (const localBucket of localBuckets) {\n if (!quotaBuckets.some((b) => b.id === localBucket.id || b.label === localBucket.label)) {\n quotaBuckets.push(localBucket);\n }\n }\n }\n\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: billingDomains(usage),\n quotaBuckets,\n usage,\n ...(usage.length > 0 && history?.complete\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['antigravity:'],\n retiredIdPrefixes: []\n }\n }\n : {}),\n costs: history?.costs ?? [],\n warnings,\n observedAt\n };\n }\n}\n\nexport function buildAntigravityQuotaBuckets(\n usage: UsageObservation[],\n nowMs: number,\n limits: Required<AntigravityQuotaLimits> = DEFAULT_ANTIGRAVITY_QUOTA_LIMITS\n): QuotaBucket[] {\n const fiveHoursMs = 300 * 60 * 1000;\n const sevenDaysMs = 7 * 24 * 60 * 60 * 1000;\n\n const cutoff5h = nowMs - fiveHoursMs;\n const cutoff7d = nowMs - sevenDaysMs;\n\n const obs5h: UsageObservation[] = [];\n const obs7d: UsageObservation[] = [];\n\n for (const obs of usage) {\n const t = new Date(obs.observedAt).getTime();\n if (t >= cutoff5h) obs5h.push(obs);\n if (t >= cutoff7d) obs7d.push(obs);\n }\n\n // 5-hour rolling sprint window\n const tokens5h = obs5h.reduce(\n (acc, obs) => acc + obs.inputTokens + obs.outputTokens + obs.cacheReadTokens,\n 0\n );\n const usedPercent5h = Math.min(100, Math.round((tokens5h / limits.rolling5hTokens) * 100));\n\n let resetsAt5h: string;\n if (obs5h.length > 0) {\n const oldestMs = Math.min(...obs5h.map((o) => new Date(o.observedAt).getTime()));\n resetsAt5h = new Date(oldestMs + fiveHoursMs).toISOString();\n } else {\n resetsAt5h = new Date(nowMs + fiveHoursMs).toISOString();\n }\n\n // Weekly baseline quota window\n const tokens7d = obs7d.reduce(\n (acc, obs) => acc + obs.inputTokens + obs.outputTokens + obs.cacheReadTokens,\n 0\n );\n const usedPercent7d = Math.min(100, Math.round((tokens7d / limits.weeklyTokens) * 100));\n\n let resetsAt7d: string;\n if (obs7d.length > 0) {\n const oldestMs = Math.min(...obs7d.map((o) => new Date(o.observedAt).getTime()));\n resetsAt7d = new Date(oldestMs + sevenDaysMs).toISOString();\n } else {\n resetsAt7d = new Date(nowMs + sevenDaysMs).toISOString();\n }\n\n return [\n {\n id: 'gemini-5h',\n billingDomainId: ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID,\n label: '5 hour',\n usedPercent: usedPercent5h,\n windowDurationMinutes: 300,\n resetsAt: resetsAt5h,\n authority: 'local-observation',\n scope: 'local-only'\n },\n {\n id: 'gemini-weekly',\n billingDomainId: ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID,\n label: 'Week',\n usedPercent: usedPercent7d,\n windowDurationMinutes: 10_080,\n resetsAt: resetsAt7d,\n authority: 'local-observation',\n scope: 'local-only'\n }\n ];\n}\n\nfunction billingDomains(usage: UsageObservation[]): BillingDomain[] {\n const primary: BillingDomain = {\n id: ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID,\n displayName: 'Gemini Code Assist'\n };\n const observedRoutes = [...new Set(usage.map((obs) => obs.billingDomainId))]\n .filter((id) => id !== primary.id)\n .sort();\n\n return [primary, ...observedRoutes.map((id) => ({ id, displayName: id }))];\n}\n\nfunction incompleteSessionScanFailure(): ConnectorFailure {\n return {\n code: 'antigravity-session-scan-incomplete',\n message: 'Some local Antigravity conversation databases could not be read.',\n recovery:\n 'Agent Usage will retry automatically on the next scan without removing stored history.'\n };\n}\n\nfunction safeFailure(): ConnectorFailure {\n return {\n code: 'antigravity-sqlite-read-failed',\n message: 'Failed to read local Antigravity conversation stores.',\n recovery:\n 'Check read permissions for ~/.gemini/antigravity-cli and ~/.gemini/antigravity directories.'\n };\n}\n","import { createHash } from 'node:crypto';\nimport { readdir, readFile, rename, stat, writeFile, mkdir } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\n\nimport protobuf from 'protobufjs';\nimport type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\n\nimport { normalizeTokenObservation } from '../core/token-normalization.js';\nimport {\n OFFICIAL_PRICING_CATALOG,\n deriveRetailEquivalentCosts,\n type RetailPriceCatalog\n} from '../core/retail-pricing.js';\nimport type { CollectionRequest, CostRecord, UsageObservation } from '../core/types.js';\n\nconst { DatabaseSync } = createRequire(import.meta.url)(\n 'node:sqlite'\n) as typeof import('node:sqlite');\n\nexport interface AntigravitySqliteUsageClientOptions {\n roots: string[];\n clock?: () => Date;\n lookbackDays?: number;\n cachePath?: string;\n priceCatalog?: RetailPriceCatalog;\n}\n\nexport interface AntigravitySqliteUsageResult {\n usage: UsageObservation[];\n costs: CostRecord[];\n complete: boolean;\n unsupportedFormat?: boolean;\n}\n\ninterface ParsedAntigravityRecord {\n dedupeKey: string;\n observation: UsageObservation;\n}\n\ninterface CachedDatabaseFile {\n path: string;\n size: number;\n mtimeMs: number;\n records: ParsedAntigravityRecord[];\n recordsDigest: string;\n}\n\nexport class AntigravitySqliteUsageClient {\n readonly #roots: string[];\n readonly #clock: () => Date;\n readonly #lookbackDays: number;\n readonly #cachePath?: string;\n readonly #priceCatalog: RetailPriceCatalog;\n readonly #fileCache = new Map<string, CachedDatabaseFile>();\n #cacheLoaded = false;\n\n constructor(options: AntigravitySqliteUsageClientOptions) {\n this.#roots = options.roots;\n this.#clock = options.clock ?? (() => new Date());\n this.#lookbackDays = options.lookbackDays ?? 90;\n this.#cachePath = options.cachePath;\n this.#priceCatalog = options.priceCatalog ?? OFFICIAL_PRICING_CATALOG;\n }\n\n async readUsage(\n options: CollectionRequest = { mode: 'incremental' }\n ): Promise<AntigravitySqliteUsageResult> {\n await this.#loadCache();\n if (options.mode === 'hard-rebuild') this.#fileCache.clear();\n\n const cutoff = this.#clock().getTime() - this.#lookbackDays * 24 * 60 * 60 * 1000;\n const discoveredFiles = await this.#discoverDatabases(cutoff);\n\n const livePaths = new Set(discoveredFiles.map((file) => stableId(file.path)));\n for (const path of this.#fileCache.keys()) {\n if (!livePaths.has(path)) this.#fileCache.delete(path);\n }\n\n const usage: UsageObservation[] = [];\n const seenDedupeKeys = new Set<string>();\n let allComplete = true;\n\n for (const file of discoveredFiles) {\n const parsed = await this.#parseDatabaseFile(file);\n allComplete &&= parsed.complete;\n\n for (const record of parsed.records) {\n if (new Date(record.observation.observedAt).getTime() < cutoff) continue;\n if (seenDedupeKeys.has(record.dedupeKey)) continue;\n seenDedupeKeys.add(record.dedupeKey);\n usage.push(record.observation);\n }\n }\n\n // Sort observations deterministically by timestamp and dedupeKey\n usage.sort((a, b) => a.observedAt.localeCompare(b.observedAt) || a.id.localeCompare(b.id));\n\n // Calculate retail equivalent costs for all observations\n const { costs } = deriveRetailEquivalentCosts(\n {\n provider: { id: 'antigravity', displayName: 'Antigravity' },\n billingDomains: [{ id: 'code-assist-subscription', displayName: 'Gemini Code Assist' }],\n quotaBuckets: [],\n usage,\n costs: [],\n observedAt: this.#clock().toISOString()\n },\n this.#priceCatalog\n );\n\n await this.#persistCache();\n\n return {\n usage,\n costs,\n complete: allComplete\n };\n }\n\n async #discoverDatabases(\n cutoff: number\n ): Promise<Array<{ path: string; size: number; mtimeMs: number; conversationId: string }>> {\n const results: Array<{ path: string; size: number; mtimeMs: number; conversationId: string }> =\n [];\n const seenDbPaths = new Set<string>();\n\n for (const root of this.#roots) {\n try {\n const rootStat = await stat(root);\n if (!rootStat.isDirectory()) continue;\n } catch {\n continue;\n }\n\n // First try to inspect conversation_summaries.db for fast filtering\n const summariesPath = join(root, 'conversation_summaries.db');\n const candidateIds = new Set<string>();\n let summariesLoaded = false;\n\n try {\n const summariesStat = await stat(summariesPath);\n if (summariesStat.isFile()) {\n const db: DatabaseSyncType = new DatabaseSync(summariesPath, { readOnly: true });\n try {\n const rows = db\n .prepare('SELECT conversation_id, last_modified_time FROM conversation_summaries')\n .all() as Array<{ conversation_id?: string; last_modified_time?: string }>;\n\n for (const row of rows) {\n if (!row.conversation_id) continue;\n const modifiedMs = row.last_modified_time\n ? new Date(row.last_modified_time).getTime()\n : 0;\n if (modifiedMs >= cutoff || modifiedMs === 0) {\n candidateIds.add(row.conversation_id);\n }\n }\n summariesLoaded = true;\n } finally {\n db.close();\n }\n }\n } catch {\n // Fall back to scanning conversations/ directly\n }\n\n const convDir = join(root, 'conversations');\n try {\n const entries = await readdir(convDir);\n for (const entry of entries) {\n if (!entry.endsWith('.db')) continue;\n const convId = entry.slice(0, -3);\n if (summariesLoaded && candidateIds.size > 0 && !candidateIds.has(convId)) {\n continue;\n }\n const fullPath = join(convDir, entry);\n if (seenDbPaths.has(fullPath)) continue;\n seenDbPaths.add(fullPath);\n\n try {\n const fileStat = await stat(fullPath);\n if (fileStat.mtimeMs < cutoff && summariesLoaded) continue;\n results.push({\n path: fullPath,\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n conversationId: convId\n });\n } catch {\n // Ignore missing/inaccessible files\n }\n }\n } catch {\n // Missing conversations directory is normal for uninitialized root\n }\n }\n\n return results;\n }\n\n async #parseDatabaseFile(file: {\n path: string;\n size: number;\n mtimeMs: number;\n conversationId: string;\n }): Promise<{ records: ParsedAntigravityRecord[]; complete: boolean }> {\n const cached = this.#fileCache.get(stableId(file.path));\n if (cached && cached.size === file.size && cached.mtimeMs === file.mtimeMs) {\n return { records: cached.records, complete: true };\n }\n\n try {\n const records = parseAntigravityDatabase(file.path, file.conversationId, file.mtimeMs);\n const digest = stableId(JSON.stringify(records));\n this.#fileCache.set(stableId(file.path), {\n path: file.path,\n size: file.size,\n mtimeMs: file.mtimeMs,\n records,\n recordsDigest: digest\n });\n return { records, complete: true };\n } catch {\n return { records: [], complete: false };\n }\n }\n\n async #loadCache(): Promise<void> {\n if (this.#cacheLoaded) return;\n this.#cacheLoaded = true;\n if (!this.#cachePath) return;\n\n try {\n const content = await readFile(this.#cachePath, 'utf8');\n const stored = JSON.parse(content) as {\n version?: number;\n files?: unknown[];\n };\n if (stored.version !== 1 || !Array.isArray(stored.files)) return;\n\n for (const item of stored.files) {\n if (!isCachedDatabaseFile(item)) continue;\n if (item.recordsDigest !== stableId(JSON.stringify(item.records))) continue;\n this.#fileCache.set(stableId(item.path), item);\n }\n } catch {\n // Rebuild on cache failure\n }\n }\n\n async #persistCache(): Promise<void> {\n if (!this.#cachePath) return;\n try {\n await mkdir(dirname(this.#cachePath), { recursive: true, mode: 0o700 });\n const temporary = `${this.#cachePath}.${process.pid}.tmp`;\n await writeFile(\n temporary,\n JSON.stringify({ version: 1, files: [...this.#fileCache.values()] }),\n { mode: 0o600 }\n );\n await rename(temporary, this.#cachePath);\n } catch {\n // Cache persistence failures must not block collection\n }\n }\n}\n\nexport function parseAntigravityDatabase(\n dbPath: string,\n conversationId: string,\n fallbackMtimeMs: number\n): ParsedAntigravityRecord[] {\n const db: DatabaseSyncType = new DatabaseSync(dbPath, { readOnly: true });\n try {\n const tableExists = db\n .prepare(\"SELECT 1 FROM sqlite_master WHERE type='table' AND name='gen_metadata'\")\n .get();\n if (!tableExists) return [];\n\n // Query steps timestamps\n const stepTimestamps = new Map<number, number>();\n try {\n const stepRows = db\n .prepare('SELECT idx, metadata FROM steps WHERE length(metadata) > 0')\n .all() as Array<{ idx: number; metadata: Buffer }>;\n for (const row of stepRows) {\n const ts = extractTimestampFromStepMetadata(row.metadata);\n if (ts !== null) stepTimestamps.set(row.idx, ts);\n }\n } catch {\n // Steps timestamp failure degrades to fallback mtime\n }\n\n const genRows = db\n .prepare('SELECT idx, data FROM gen_metadata ORDER BY idx ASC')\n .all() as Array<{ idx: number; data: Buffer }>;\n\n const records: ParsedAntigravityRecord[] = [];\n\n for (const row of genRows) {\n if (!row.data || row.data.length === 0) continue;\n const parsed = decodeGenMetadata(row.data);\n if (parsed.inputTokens === 0 && parsed.outputTokens === 0 && parsed.cacheReadTokens === 0) {\n continue;\n }\n\n const timestampMs = stepTimestamps.get(row.idx) ?? fallbackMtimeMs;\n const observedAt = new Date(timestampMs).toISOString();\n const dedupeKey = `antigravity:${conversationId}:${row.idx}`;\n\n const observation: UsageObservation = {\n id: dedupeKey,\n billingDomainId: 'code-assist-subscription',\n model: parsed.canonicalModel,\n observedAt,\n inputTokens: parsed.inputTokens,\n outputTokens: parsed.outputTokens,\n reasoningTokens: 0,\n cacheReadTokens: parsed.cacheReadTokens,\n cacheWriteTokens: 0,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n };\n\n // Validate observation with project normalization schema\n normalizeTokenObservation(observation);\n records.push({ dedupeKey, observation });\n }\n\n return records;\n } finally {\n db.close();\n }\n}\n\nexport function decodeGenMetadata(buf: Buffer): {\n rawModel: string;\n canonicalModel: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n} {\n let rawModel = 'unknown';\n let inputTokens = 0;\n const outputTokens = 0;\n let cacheReadTokens = 0;\n\n try {\n const r = protobuf.Reader.create(buf);\n while (r.pos < r.len) {\n const tag = r.uint32();\n const fn = tag >>> 3;\n const wt = tag & 7;\n\n if (fn === 1 && wt === 2) {\n const sub1 = r.bytes();\n const rSub = protobuf.Reader.create(sub1);\n while (rSub.pos < rSub.len) {\n const sTag = rSub.uint32();\n const sFn = sTag >>> 3;\n const sWt = sTag & 7;\n\n if (sFn === 19 && sWt === 2) {\n rawModel = Buffer.from(rSub.bytes()).toString('utf8');\n } else if (sFn === 9 && sWt === 2) {\n const sub9 = rSub.bytes();\n const r9 = protobuf.Reader.create(sub9);\n while (r9.pos < r9.len) {\n const t9 = r9.uint32();\n const fn9 = t9 >>> 3;\n const wt9 = t9 & 7;\n\n if (fn9 === 10 && wt9 === 2) {\n const sub10 = r9.bytes();\n const r10 = protobuf.Reader.create(sub10);\n while (r10.pos < r10.len) {\n const t10 = r10.uint32();\n const fn10 = t10 >>> 3;\n const wt10 = t10 & 7;\n\n if (fn10 === 1 && wt10 === 0) {\n inputTokens = toNumeric(r10.uint64());\n } else if (fn10 === 3 && wt10 === 2) {\n const sub3 = r10.bytes();\n const r3 = protobuf.Reader.create(sub3);\n while (r3.pos < r3.len) {\n const t3 = r3.uint32();\n const fn3 = t3 >>> 3;\n const wt3 = t3 & 7;\n if (fn3 === 2 && wt3 === 0) {\n cacheReadTokens = toNumeric(r3.uint64());\n } else {\n r3.skipType(wt3);\n }\n }\n } else {\n r10.skipType(wt10);\n }\n }\n } else {\n r9.skipType(wt9);\n }\n }\n } else {\n rSub.skipType(sWt);\n }\n }\n } else {\n r.skipType(wt);\n }\n }\n } catch {\n // Gracefully return partial or zero tokens on corrupt protobuf\n }\n\n return {\n rawModel,\n canonicalModel: canonicalizeAntigravityModel(rawModel),\n inputTokens,\n outputTokens,\n cacheReadTokens\n };\n}\n\nexport function canonicalizeAntigravityModel(raw: string): string {\n const normalized = raw\n .trim()\n .toLowerCase()\n .replace(/[\\s_]+/g, '-');\n if (normalized.startsWith('gemini-3p7') || normalized.startsWith('gemini-3.7')) {\n return 'gemini-3.7-flash';\n }\n if (normalized.startsWith('gemini-3p6') || normalized.startsWith('gemini-3.6')) {\n return 'gemini-3.6-flash';\n }\n if (normalized.startsWith('gemini-3p1') || normalized.startsWith('gemini-3.1')) {\n return 'gemini-3.1-pro';\n }\n if (normalized.includes('claude-sonnet')) {\n return 'claude-sonnet-4-6';\n }\n if (normalized.includes('claude-opus')) {\n return 'claude-opus-4-6-thinking';\n }\n if (normalized.includes('gpt-oss')) {\n return 'gpt-oss-120b-medium';\n }\n return raw.trim() || 'unknown';\n}\n\nexport function extractTimestampFromStepMetadata(buf: Buffer): number | null {\n try {\n const r = protobuf.Reader.create(buf);\n while (r.pos < r.len) {\n const tag = r.uint32();\n const fn = tag >>> 3;\n const wt = tag & 7;\n if (fn === 1 && wt === 2) {\n const tsBytes = r.bytes();\n const rTs = protobuf.Reader.create(tsBytes);\n let seconds = 0;\n let nanos = 0;\n while (rTs.pos < rTs.len) {\n const t = rTs.uint32();\n const tFn = t >>> 3;\n const tWt = t & 7;\n if (tFn === 1 && tWt === 0) {\n seconds = toNumeric(rTs.uint64());\n } else if (tFn === 2 && tWt === 0) {\n nanos = toNumeric(rTs.uint64());\n } else {\n rTs.skipType(tWt);\n }\n }\n if (seconds > 0) {\n return seconds * 1000 + Math.floor(nanos / 1_000_000);\n }\n } else {\n r.skipType(wt);\n }\n }\n } catch {\n // Degrade gracefully\n }\n return null;\n}\n\nfunction toNumeric(val: number | protobuf.Long | unknown): number {\n return Number(val?.toString?.() ?? 0);\n}\n\nfunction stableId(value: string): string {\n return createHash('sha256').update(value).digest('hex').slice(0, 16);\n}\n\nfunction isCachedDatabaseFile(value: unknown): value is CachedDatabaseFile {\n if (typeof value !== 'object' || value === null) return false;\n const rec = value as Record<string, unknown>;\n return (\n typeof rec.path === 'string' &&\n typeof rec.size === 'number' &&\n typeof rec.mtimeMs === 'number' &&\n Array.isArray(rec.records) &&\n typeof rec.recordsDigest === 'string'\n );\n}\n","import type {\n ConnectorFailure,\n ConnectorSnapshot,\n CostRecord,\n UsageObservation\n} from '../../core/types.js';\nimport {\n extractOtlpMetrics,\n extractOtlpResources,\n isDeltaTemporality,\n isRecord,\n numericOtlpPointValue,\n otlpNanoToIso,\n otlpStringAttributes,\n readRecord,\n type OtlpPoint\n} from '../otlp.js';\nimport { grokBuildBillingDomains, resolveGrokBillingDomain } from './grok-build-connector.js';\n\ninterface UsageAggregate {\n timestamp: string;\n timePrecision: 'event' | 'unknown';\n model: string | null;\n sessionId: string | null;\n input: number;\n output: number;\n reasoning: number;\n cacheRead: number;\n}\n\nexport class GrokTelemetryError extends Error {\n readonly code: 'grok-otel-schema-unsupported' | 'grok-otel-temporality-unsupported';\n readonly recovery: string;\n\n constructor(code: GrokTelemetryError['code'], message: string, recovery: string) {\n super(message);\n this.name = 'GrokTelemetryError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport function parseGrokOtlpMetrics(payload: unknown, receivedAt: Date): ConnectorSnapshot {\n const resources = extractOtlpResources(payload);\n const versions = new Set(\n resources\n .map((resource) =>\n otlpStringAttributes(readRecord(resource, 'resource')?.attributes).get(\n 'grok_code.schema.version'\n )\n )\n .filter((version): version is string => Boolean(version))\n );\n if (versions.size !== 1 || !versions.has('v1')) {\n throw new GrokTelemetryError(\n 'grok-otel-schema-unsupported',\n 'Grok Build returned an unsupported alpha telemetry schema.',\n 'Update Agent Usage, or set Grok Build telemetry back to grok_code.schema.version v1.'\n );\n }\n\n const usage = new Map<string, UsageAggregate>();\n for (const resource of resources) {\n for (const metric of extractOtlpMetrics(resource)) {\n if (metric.name !== 'grok_code.token.usage') continue;\n if (!isDeltaTemporality(metric.sum?.aggregationTemporality)) {\n throw new GrokTelemetryError(\n 'grok-otel-temporality-unsupported',\n 'Cumulative Grok Build metrics cannot be safely added to local history.',\n 'Update Grok Build, restart it with delta telemetry enabled, then refresh Agent Usage.'\n );\n }\n const points = Array.isArray(metric.sum?.dataPoints)\n ? (metric.sum.dataPoints as OtlpPoint[])\n : [];\n for (const point of points) {\n const attributes = otlpStringAttributes(point.attributes);\n const type = attributes.get('type');\n if (!['input', 'output', 'reasoning', 'cache_read'].includes(type ?? '')) continue;\n const value = numericOtlpPointValue(point);\n if (value === null || value < 0) continue;\n const nano = typeof point.timeUnixNano === 'string' ? point.timeUnixNano : null;\n const model = attributes.get('model') ?? null;\n const sessionId = attributes.get('session.id') ?? null;\n const key = `${nano ?? receivedAt.getTime()}:${sessionId ?? 'unknown-session'}:${model ?? 'unknown-model'}`;\n const aggregate = usage.get(key) ?? {\n timestamp: nano ? otlpNanoToIso(nano) : receivedAt.toISOString(),\n timePrecision: nano ? 'event' : 'unknown',\n model,\n sessionId,\n input: 0,\n output: 0,\n reasoning: 0,\n cacheRead: 0\n };\n if (type === 'input') aggregate.input += value;\n if (type === 'output') aggregate.output += value;\n if (type === 'reasoning') aggregate.reasoning += value;\n if (type === 'cache_read') aggregate.cacheRead += value;\n usage.set(key, aggregate);\n }\n }\n }\n\n return snapshot(\n [...usage.entries()].map(([key, item]) => ({\n id: `grok-otel:${key}`,\n billingDomainId: resolveGrokBillingDomain(item.model),\n model: item.model,\n sessionId: item.sessionId,\n observedAt: item.timestamp,\n inputTokens: item.input,\n outputTokens: item.output,\n reasoningTokens: item.reasoning,\n cacheReadTokens: item.cacheRead,\n cacheWriteTokens: 0,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: item.model ? 'known' : 'unclassified',\n timePrecision: item.timePrecision,\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n })),\n [],\n receivedAt\n );\n}\n\nexport function parseGrokHeadlessResult(payload: unknown, receivedAt: Date): ConnectorSnapshot {\n if (!isRecord(payload)) throw new Error('Invalid Grok headless result');\n const sessionId = stringValue(payload.sessionId) ?? stringValue(payload.session_id);\n const requestId = stringValue(payload.requestId) ?? stringValue(payload.request_id) ?? 'unknown';\n const aggregateUsage = isRecord(payload.usage) ? payload.usage : {};\n const aggregateTotal = optionalNonNegativeNumber(aggregateUsage.total_tokens);\n const reasoningTotal = nonNegativeNumber(aggregateUsage.reasoning_tokens);\n const modelUsage = isRecord(payload.modelUsage) ? payload.modelUsage : {};\n const modelEntries = Object.entries(modelUsage).filter(\n (entry): entry is [string, Record<string, unknown>] => isRecord(entry[1])\n );\n const entries: Array<[string, Record<string, unknown>]> =\n modelEntries.length > 0 ? modelEntries : [['unknown-model', aggregateUsage]];\n\n const usage: UsageObservation[] = entries.map(([model, raw]) => {\n const values = raw as Record<string, unknown>;\n const input = nonNegativeNumber(values.inputTokens ?? values.input_tokens);\n const output = nonNegativeNumber(values.outputTokens ?? values.output_tokens);\n const cacheRead = nonNegativeNumber(\n values.cacheReadInputTokens ?? values.cache_read_input_tokens\n );\n const cacheWrite = nonNegativeNumber(\n values.cacheCreationInputTokens ?? values.cache_creation_input_tokens\n );\n const sourceReportedTotalTokens =\n optionalNonNegativeNumber(values.totalTokens ?? values.total_tokens) ??\n (entries.length === 1 ? aggregateTotal : null);\n return {\n id: `grok-headless:${sessionId ?? 'unknown-session'}:${requestId}:${model}`,\n billingDomainId: resolveGrokBillingDomain(model),\n model: model === 'unknown-model' ? null : model,\n sessionId: sessionId ?? null,\n observedAt: receivedAt.toISOString(),\n inputTokens: input,\n outputTokens: output,\n reasoningTokens: entries.length === 1 ? reasoningTotal : 0,\n cacheReadTokens: cacheRead,\n cacheWriteTokens: cacheWrite,\n sourceReportedTotalTokens,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: model === 'unknown-model' ? 'unclassified' : 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n };\n });\n\n const warnings: ConnectorFailure[] = [];\n if (payload.usage_is_incomplete === true) {\n warnings.push({\n code: 'grok-headless-usage-incomplete',\n message: 'Grok Build reported incomplete headless usage.',\n recovery: 'Treat these token totals as a lower bound and retry the original export if needed.'\n });\n }\n return snapshot(usage, warnings, receivedAt);\n}\n\nfunction snapshot(\n usage: UsageObservation[],\n warnings: ConnectorFailure[],\n receivedAt: Date\n): ConnectorSnapshot {\n return {\n provider: { id: 'grok', displayName: 'Grok' },\n billingDomains: grokBuildBillingDomains(usage),\n quotaBuckets: [],\n usage,\n costs: [] as CostRecord[],\n warnings,\n observedAt: receivedAt.toISOString()\n };\n}\n\nfunction nonNegativeNumber(value: unknown): number {\n const parsed = typeof value === 'number' || typeof value === 'string' ? Number(value) : 0;\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;\n}\n\nfunction optionalNonNegativeNumber(value: unknown): number | null {\n const parsed = typeof value === 'number' || typeof value === 'string' ? Number(value) : NaN;\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { open } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Readable, Writable } from 'node:stream';\nimport { z } from 'zod';\n\nimport {\n grokBillingResponseSchema,\n type GrokBuildBilling,\n type GrokBuildBillingClient\n} from './grok-build-connector.js';\n\ninterface JsonRpcErrorBody {\n code: number;\n message?: string;\n}\n\ninterface JsonRpcResponse {\n id: number;\n result?: unknown;\n error?: JsonRpcErrorBody;\n}\n\nexport interface GrokBillingProcess {\n readonly stdin: Writable;\n readonly stdout: Readable;\n readonly stderr: Readable;\n once(event: 'error', listener: (error: Error) => void): this;\n once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;\n kill(signal?: NodeJS.Signals): boolean;\n}\n\nexport interface StdioGrokBillingClientOptions {\n command?: string;\n timeoutMs?: number;\n spawnProcess?: (command: string, arguments_: string[]) => GrokBillingProcess;\n readUnifiedLog?: () => Promise<string>;\n refreshBillingLog?: () => Promise<void>;\n clock?: () => Date;\n}\n\nexport class GrokBillingAdapterError extends Error {\n readonly code:\n | 'grok-client-unavailable'\n | 'grok-client-timeout'\n | 'grok-client-protocol-error'\n | 'grok-client-version-unsupported'\n | 'grok-billing-capability-unsupported'\n | 'grok-billing-unavailable'\n | 'grok-billing-schema-changed';\n readonly recovery: string;\n\n constructor(\n code: GrokBillingAdapterError['code'],\n message: string,\n recovery: string,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = 'GrokBillingAdapterError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class StdioGrokBillingClient implements GrokBuildBillingClient {\n readonly #command: string;\n readonly #timeoutMs: number;\n readonly #spawnProcess: NonNullable<StdioGrokBillingClientOptions['spawnProcess']>;\n readonly #readUnifiedLog: NonNullable<StdioGrokBillingClientOptions['readUnifiedLog']>;\n readonly #refreshBillingLog: NonNullable<StdioGrokBillingClientOptions['refreshBillingLog']>;\n readonly #clock: () => Date;\n\n constructor(options: StdioGrokBillingClientOptions = {}) {\n this.#command = options.command ?? 'grok';\n this.#timeoutMs = options.timeoutMs ?? 8_000;\n this.#spawnProcess =\n options.spawnProcess ??\n ((command, arguments_) =>\n spawn(command, arguments_, {\n stdio: ['pipe', 'pipe', 'pipe']\n }) as ChildProcessWithoutNullStreams);\n this.#readUnifiedLog =\n options.readUnifiedLog ??\n (() =>\n readLogTail(\n join(process.env.GROK_HOME ?? join(homedir(), '.grok'), 'logs', 'unified.jsonl')\n ));\n this.#refreshBillingLog =\n options.refreshBillingLog ??\n (options.readUnifiedLog\n ? async () => undefined\n : () => refreshBillingLogViaDashboard(this.#command, this.#timeoutMs));\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async readBilling(): Promise<GrokBuildBilling> {\n let process: GrokBillingProcess;\n try {\n process = this.#spawnProcess(this.#command, ['agent', '--no-leader', 'stdio']);\n } catch (error) {\n const fallback = await this.#readFreshLogFallback();\n if (fallback) return fallback;\n throw unavailableError(error);\n }\n\n process.stderr.resume();\n const peer = new JsonLinePeer(process, this.#timeoutMs);\n try {\n const initialized = await peer.request('initialize', {\n protocolVersion: 1,\n clientCapabilities: {},\n clientInfo: { name: 'agent-usage', version: '0.1.0' }\n });\n const version = z\n .object({ protocolVersion: z.number() })\n .passthrough()\n .safeParse(initialized);\n if (!version.success || version.data.protocolVersion !== 1) {\n throw new GrokBillingAdapterError(\n 'grok-client-version-unsupported',\n 'Grok Build returned an unsupported ACP version.',\n 'Update Grok Build and Agent Usage, then retry.'\n );\n }\n\n const result = await peer.request('x.ai/billing', {});\n const billing = grokBillingResponseSchema.safeParse(result);\n if (!billing.success) {\n throw new GrokBillingAdapterError(\n 'grok-billing-schema-changed',\n 'Grok Build returned an unsupported billing schema.',\n 'Open Grok Build and run /usage, then update Agent Usage.',\n { cause: billing.error }\n );\n }\n return billing.data;\n } catch (error) {\n const fallback = await this.#readFreshLogFallback();\n if (fallback) return fallback;\n if (error instanceof GrokBillingAdapterError) throw error;\n if (error instanceof JsonRpcError && error.code === -32601) {\n throw new GrokBillingAdapterError(\n 'grok-billing-capability-unsupported',\n 'This Grok Build version does not expose billing through ACP.',\n 'Open Grok Build and run /usage, then update Grok Build before retrying.',\n { cause: error }\n );\n }\n if (error instanceof JsonRpcError) {\n throw new GrokBillingAdapterError(\n 'grok-billing-unavailable',\n 'Grok Build subscription billing is unavailable.',\n 'Run grok login, open Grok Build, and run /usage before retrying.',\n { cause: error }\n );\n }\n throw unavailableError(error);\n } finally {\n peer.close();\n }\n }\n\n async #readLogFallback(): Promise<GrokBuildBilling | null> {\n try {\n return parseLatestBillingLog(await this.#readUnifiedLog());\n } catch {\n return null;\n }\n }\n\n async #readFreshLogFallback(): Promise<GrokBuildBilling | null> {\n const cached = await this.#readLogFallback();\n if (cached && billingIsFresh(cached, this.#clock())) return cached;\n try {\n await this.#refreshBillingLog();\n } catch {\n return cached;\n }\n return (await this.#readLogFallback()) ?? cached;\n }\n}\n\nconst GROK_BILLING_FRESHNESS_MS = 5 * 60 * 1_000;\n\nfunction billingIsFresh(billing: GrokBuildBilling, now: Date): boolean {\n if (!billing.sourceObservedAt) return false;\n const observedAt = Date.parse(billing.sourceObservedAt);\n if (!Number.isFinite(observedAt)) return false;\n return now.getTime() - observedAt <= GROK_BILLING_FRESHNESS_MS;\n}\n\nasync function refreshBillingLogViaDashboard(command: string, timeoutMs: number): Promise<void> {\n if (process.platform !== 'darwin') return;\n const refreshTimeoutMs = Math.min(timeoutMs, 6_000);\n const expectScript = [\n `set timeout ${Math.max(1, Math.ceil(refreshTimeoutMs / 1_000))}`,\n 'log_user 0',\n 'set command $env(AGENT_USAGE_GROK_REFRESH_COMMAND)',\n 'spawn -noecho $command dashboard',\n `after ${Math.min(2_000, Math.max(250, refreshTimeoutMs - 1_000))}`,\n 'send \"\\\\021\\\\021\"',\n 'expect eof'\n ].join('\\n');\n await new Promise<void>((resolve) => {\n const dashboard = spawn('/usr/bin/expect', ['-c', expectScript], {\n env: {\n ...process.env,\n AGENT_USAGE_GROK_REFRESH_COMMAND: command,\n TERM: process.env.TERM ?? 'xterm-256color'\n },\n stdio: ['ignore', 'pipe', 'pipe']\n });\n dashboard.stdout.resume();\n dashboard.stderr.resume();\n let settled = false;\n const stopTimer = setTimeout(() => {\n dashboard.kill('SIGTERM');\n finish();\n }, refreshTimeoutMs);\n const finish = () => {\n if (settled) return;\n settled = true;\n clearTimeout(stopTimer);\n resolve();\n };\n dashboard.once('error', finish);\n dashboard.once('exit', finish);\n });\n}\n\nfunction parseLatestBillingLog(text: string): GrokBuildBilling | null {\n const lines = text.split(/\\r?\\n/);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index].trim();\n if (!line) continue;\n let record: unknown;\n try {\n record = JSON.parse(line);\n } catch {\n continue;\n }\n const entry = z\n .object({\n ts: z.string(),\n msg: z.string(),\n ctx: z.unknown()\n })\n .safeParse(record);\n if (!entry.success || entry.data.msg !== 'billing: fetched credits config') continue;\n const billing = grokBillingResponseSchema.safeParse({\n ...(typeof entry.data.ctx === 'object' && entry.data.ctx !== null ? entry.data.ctx : {}),\n sourceObservedAt: entry.data.ts\n });\n if (billing.success) return billing.data;\n }\n return null;\n}\n\nasync function readLogTail(path: string): Promise<string> {\n const maximumBytes = 2 * 1024 * 1024;\n const handle = await open(path, 'r');\n try {\n const stats = await handle.stat();\n const length = Math.min(stats.size, maximumBytes);\n const start = Math.max(0, stats.size - length);\n const buffer = Buffer.alloc(length);\n await handle.read(buffer, 0, length, start);\n const text = buffer.toString('utf8');\n if (start === 0) return text;\n const firstNewline = text.indexOf('\\n');\n return firstNewline === -1 ? '' : text.slice(firstNewline + 1);\n } finally {\n await handle.close();\n }\n}\n\nclass JsonRpcError extends Error {\n readonly code: number;\n\n constructor(body: JsonRpcErrorBody) {\n super(body.message ?? `Grok ACP error ${body.code}`);\n this.name = 'JsonRpcError';\n this.code = body.code;\n }\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n}\n\nclass JsonLinePeer {\n readonly #process: GrokBillingProcess;\n readonly #timeoutMs: number;\n readonly #pending = new Map<number, PendingRequest>();\n #nextId = 1;\n #buffer = '';\n #closed = false;\n\n constructor(process: GrokBillingProcess, timeoutMs: number) {\n this.#process = process;\n this.#timeoutMs = timeoutMs;\n process.stdout.setEncoding('utf8');\n process.stdout.on('data', (chunk: string) => this.#consume(chunk));\n process.once('error', (error) => this.#fail(unavailableError(error)));\n process.once('exit', (code, signal) => {\n if (this.#closed) return;\n this.#fail(\n new GrokBillingAdapterError(\n 'grok-client-unavailable',\n 'Grok Build exited before billing was returned.',\n 'Run grok login, then update or restart Grok Build.',\n { cause: new Error(`exit=${String(code)} signal=${String(signal)}`) }\n )\n );\n });\n }\n\n request(method: string, params?: unknown): Promise<unknown> {\n const id = this.#nextId++;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.#pending.delete(id);\n reject(\n new GrokBillingAdapterError(\n 'grok-client-timeout',\n 'Grok Build did not return billing in time.',\n 'Open Grok Build and run /usage, then retry.'\n )\n );\n }, this.#timeoutMs);\n this.#pending.set(id, { resolve, reject, timeout });\n this.#process.stdin.write(\n `${JSON.stringify({ jsonrpc: '2.0', id, method, ...(params === undefined ? {} : { params }) })}\\n`\n );\n });\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n for (const pending of this.#pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(unavailableError(new Error('Grok ACP connection closed')));\n }\n this.#pending.clear();\n this.#process.kill();\n }\n\n #consume(chunk: string): void {\n this.#buffer += chunk;\n let newline = this.#buffer.indexOf('\\n');\n while (newline !== -1) {\n const line = this.#buffer.slice(0, newline).trim();\n this.#buffer = this.#buffer.slice(newline + 1);\n if (line) this.#consumeLine(line);\n newline = this.#buffer.indexOf('\\n');\n }\n }\n\n #consumeLine(line: string): void {\n let response: JsonRpcResponse;\n try {\n response = JSON.parse(line) as JsonRpcResponse;\n } catch (error) {\n this.#fail(\n new GrokBillingAdapterError(\n 'grok-client-protocol-error',\n 'Grok Build returned an invalid ACP message.',\n 'Update Grok Build and Agent Usage, then retry.',\n { cause: error }\n )\n );\n return;\n }\n if (typeof response.id !== 'number') return;\n const pending = this.#pending.get(response.id);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.#pending.delete(response.id);\n if (response.error) pending.reject(new JsonRpcError(response.error));\n else pending.resolve(response.result);\n }\n\n #fail(error: Error): void {\n for (const pending of this.#pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(error);\n }\n this.#pending.clear();\n }\n}\n\nfunction unavailableError(cause: unknown): GrokBillingAdapterError {\n return new GrokBillingAdapterError(\n 'grok-client-unavailable',\n 'Grok Build billing capability is unavailable.',\n 'Install or update Grok Build, run grok login, then retry.',\n { cause }\n );\n}\n","import { z } from 'zod';\n\nimport type { SecretStore } from '../../core/onboarding-types.js';\nimport type {\n BalanceRecord,\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n CostRecord,\n InvoiceRecord,\n QuotaBucket,\n UsageObservation\n} from '../../core/types.js';\n\nconst numericString = z.union([z.string(), z.number()]).transform(Number);\nconst centSchema = z.object({ val: numericString }).passthrough();\nconst validationSchema = z\n .object({\n teamId: z.string().optional(),\n scope: z.string().optional(),\n scopeId: z.string().optional()\n })\n .passthrough();\nconst usageSchema = z\n .object({\n timeSeries: z.array(\n z\n .object({\n group: z.array(z.string()).default([]),\n groupLabels: z.array(z.string()).default([]),\n dataPoints: z.array(\n z\n .object({\n timestamp: z.string(),\n values: z.array(z.number())\n })\n .passthrough()\n )\n })\n .passthrough()\n ),\n limitReached: z.boolean().default(false)\n })\n .passthrough();\nconst balanceSchema = z\n .object({\n total: centSchema.optional()\n })\n .passthrough();\nconst limitsSchema = z\n .object({\n spendingLimits: z\n .object({\n effectiveSl: centSchema.optional(),\n softSl: centSchema.optional()\n })\n .passthrough()\n .optional()\n })\n .passthrough();\nconst previewSchema = z\n .object({\n coreInvoice: z\n .object({\n amountBeforeVat: numericString.optional(),\n totalWithCorr: centSchema.optional()\n })\n .passthrough()\n .optional(),\n effectiveSpendingLimit: numericString.optional(),\n billingCycle: z.object({ year: z.number(), month: z.number() }).passthrough().optional()\n })\n .passthrough();\nconst invoiceLineSchema = z\n .object({\n description: z.string(),\n unitType: z.string(),\n numUnits: numericString\n })\n .passthrough();\nconst invoiceSchema = z\n .object({\n invoiceId: z.string(),\n invoiceNumber: z.string().optional(),\n createTime: z.string(),\n invoiceStatus: z.string().optional(),\n total: numericString.optional(),\n lines: z.array(invoiceLineSchema).default([])\n })\n .passthrough();\nconst invoicesSchema = z.object({ invoices: z.array(invoiceSchema) }).passthrough();\n\ntype UsageResponse = z.infer<typeof usageSchema>;\ntype Invoice = z.infer<typeof invoiceSchema>;\n\ninterface XaiApiAccountPayload {\n teamId: string;\n usage: UsageResponse | null;\n balanceCents: number | null;\n spendingLimitCents: number | null;\n currentInvoiceCents: number | null;\n invoices: Invoice[];\n warnings: ConnectorFailure[];\n}\n\nexport interface XaiApiAccountClient {\n readAccount(): Promise<XaiApiAccountPayload>;\n}\n\nexport interface XaiManagementApiClientOptions {\n secretStore: SecretStore;\n fetch?: typeof fetch;\n clock?: () => Date;\n baseUrl?: string;\n}\n\nexport class XaiManagementApiError extends Error {\n readonly code:\n | 'xai-management-key-missing'\n | 'xai-management-key-invalid'\n | 'xai-management-team-scope-required';\n readonly recovery: string;\n\n constructor(code: XaiManagementApiError['code'], message: string, recovery: string) {\n super(message);\n this.name = 'XaiManagementApiError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class XaiManagementApiClient implements XaiApiAccountClient {\n readonly #secretStore: SecretStore;\n readonly #fetch: typeof fetch;\n readonly #clock: () => Date;\n readonly #baseUrl: string;\n\n constructor(options: XaiManagementApiClientOptions) {\n this.#secretStore = options.secretStore;\n this.#fetch = options.fetch ?? fetch;\n this.#clock = options.clock ?? (() => new Date());\n this.#baseUrl = (options.baseUrl ?? 'https://management-api.x.ai').replace(/\\/$/, '');\n }\n\n async readAccount(): Promise<XaiApiAccountPayload> {\n const key = await this.#secretStore.get('connector:xai-api');\n if (!key) {\n throw new XaiManagementApiError(\n 'xai-management-key-missing',\n 'The xAI Management API key is not configured.',\n 'Connect xAI API and save a dedicated management key in Keychain.'\n );\n }\n\n const validationResponse = await this.#request(\n key,\n '/auth/management-keys/validation',\n validationSchema\n );\n const teamId =\n validationResponse.teamId ??\n (validationResponse.scope === 'SCOPE_TEAM' ? validationResponse.scopeId : undefined);\n if (!teamId) {\n throw new XaiManagementApiError(\n 'xai-management-team-scope-required',\n 'This management key does not identify one xAI API team.',\n 'Use a team-scoped management key; organization team selection is not configured.'\n );\n }\n\n const now = this.#clock();\n const start = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n const authorization = { authorization: `Bearer ${key}` };\n const usageBody = {\n analyticsRequest: {\n timeRange: {\n startTime: analyticsTimestamp(start),\n endTime: analyticsTimestamp(now),\n timezone: 'Etc/GMT'\n },\n timeUnit: 'TIME_UNIT_DAY',\n values: [{ name: 'usd', aggregation: 'AGGREGATION_SUM' }],\n groupBy: ['description'],\n filters: []\n }\n };\n const invoiceQuery = `since.year=${start.getUTCFullYear()}&since.month=${start.getUTCMonth() + 1}`;\n\n const [usage, balance, limits, preview, invoices] = await Promise.all([\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/usage`,\n usageSchema,\n {\n method: 'POST',\n headers: { ...authorization, 'content-type': 'application/json' },\n body: JSON.stringify(usageBody)\n },\n 'usage'\n ),\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/prepaid/balance`,\n balanceSchema,\n undefined,\n 'balance'\n ),\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/postpaid/spending-limits`,\n limitsSchema,\n undefined,\n 'spending limit'\n ),\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/postpaid/invoice/preview`,\n previewSchema,\n undefined,\n 'invoice preview'\n ),\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/invoices?${invoiceQuery}`,\n invoicesSchema,\n undefined,\n 'invoices'\n )\n ]);\n\n const warnings = [usage, balance, limits, preview, invoices].flatMap(\n (result) => result.warning ?? []\n );\n if (usage.value?.limitReached) {\n warnings.push({\n code: 'xai-api-history-partial',\n message: 'xAI API returned only part of the requested usage history.',\n recovery: 'Narrow the history range or grouping, then retry.'\n });\n }\n return {\n teamId,\n usage: usage.value ?? null,\n balanceCents: balance.value?.total?.val ?? null,\n spendingLimitCents:\n limits.value?.spendingLimits?.effectiveSl?.val ??\n preview.value?.effectiveSpendingLimit ??\n null,\n currentInvoiceCents:\n preview.value?.coreInvoice?.amountBeforeVat ??\n preview.value?.coreInvoice?.totalWithCorr?.val ??\n null,\n invoices: invoices.value?.invoices ?? [],\n warnings\n };\n }\n\n async #optionalRequest<T>(\n key: string,\n path: string,\n schema: z.ZodType<T>,\n init: RequestInit | undefined,\n label: string\n ): Promise<{ value?: T; warning?: ConnectorFailure }> {\n try {\n return { value: await this.#request(key, path, schema, init) };\n } catch (error) {\n return { warning: endpointFailure(error, label) };\n }\n }\n\n async #request<T>(\n key: string,\n path: string,\n schema: z.ZodType<T>,\n init: RequestInit = {}\n ): Promise<T> {\n const response = await this.#fetch(`${this.#baseUrl}${path}`, {\n ...init,\n headers: { authorization: `Bearer ${key}`, ...init.headers },\n signal: AbortSignal.timeout(10_000)\n });\n if (!response.ok) {\n const error = Object.assign(\n new Error(`xAI Management API returned HTTP ${response.status}`),\n {\n status: response.status,\n retryAfter: response.headers.get('retry-after')\n }\n );\n throw error;\n }\n const parsed = schema.safeParse(await response.json());\n if (!parsed.success) {\n throw Object.assign(new Error('xAI Management API schema changed'), {\n status: 422,\n cause: parsed.error\n });\n }\n return parsed.data;\n }\n}\n\nexport interface XaiApiConnectorOptions {\n accountClient: XaiApiAccountClient;\n clock?: () => Date;\n}\n\nexport class XaiApiConnector implements Connector {\n readonly id = 'xai-api';\n readonly displayName = 'Grok';\n readonly consentId = 'xai-api';\n readonly #accountClient: XaiApiAccountClient;\n readonly #clock: () => Date;\n\n constructor(options: XaiApiConnectorOptions) {\n this.#accountClient = options.accountClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n try {\n const account = await this.#accountClient.readAccount();\n return {\n provider: { id: 'grok', displayName: 'Grok', accountIdentifier: account.teamId },\n billingDomains: [{ id: 'xai-api', displayName: 'xAI API' }],\n quotaBuckets: mapSpendingLimit(account, this.#clock()),\n usage: mapInvoiceTokens(account.invoices),\n costs: mapUsageCosts(account),\n balances: mapBalances(account, observedAt),\n invoices: mapInvoices(account.invoices),\n warnings: account.warnings,\n observedAt\n };\n } catch (error) {\n return {\n provider: { id: 'grok', displayName: 'Grok' },\n billingDomains: [{ id: 'xai-api', displayName: 'xAI API' }],\n quotaBuckets: [],\n usage: [],\n costs: [],\n balances: [],\n invoices: [],\n warnings: [safeFailure(error)],\n observedAt\n };\n }\n }\n}\n\nfunction mapSpendingLimit(account: XaiApiAccountPayload, now: Date): QuotaBucket[] {\n if (account.spendingLimitCents === null) return [];\n const limit = account.spendingLimitCents / 100;\n const used = account.currentInvoiceCents === null ? null : account.currentInvoiceCents / 100;\n return [\n {\n id: 'xai-api:monthly-spending-limit',\n billingDomainId: 'xai-api',\n label: 'Monthly invoiced spending limit',\n usedPercent: used === null || limit <= 0 ? null : Math.min(100, (used / limit) * 100),\n resetsAt: nextUtcMonth(now),\n authority: 'official-account',\n scope: 'account-wide',\n limitAmount: limit,\n limitCurrency: 'USD'\n }\n ];\n}\n\nfunction mapUsageCosts(account: XaiApiAccountPayload): CostRecord[] {\n return (account.usage?.timeSeries ?? []).flatMap((series) => {\n const model = series.groupLabels[0] ?? series.group[0] ?? 'Unlabeled usage';\n return series.dataPoints.flatMap((point) => {\n const amount = point.values[0];\n if (amount === undefined || !Number.isFinite(amount)) return [];\n const sourceId = `${account.teamId}:${model}:${point.timestamp}`;\n return [\n {\n id: `xai-usage:${model}:${point.timestamp}`,\n sourceId,\n billingDomainId: 'xai-api',\n observedAt: point.timestamp,\n kind: 'actual' as const,\n amount,\n currency: 'USD',\n authority: 'official-account' as const,\n model: modelFromDescription(model)\n }\n ];\n });\n });\n}\n\nfunction mapInvoiceTokens(invoices: Invoice[]): UsageObservation[] {\n const observations: UsageObservation[] = [];\n for (const invoice of invoices) {\n const byModel = new Map<string, UsageObservation>();\n for (const line of invoice.lines) {\n const kind = tokenKind(line.unitType);\n if (!kind) continue;\n const model = modelFromDescription(line.description);\n const observation = byModel.get(model) ?? {\n id: `xai-invoice:${invoice.invoiceId}:${model}`,\n billingDomainId: 'xai-api',\n model,\n observedAt: invoice.createTime,\n inputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'billing-period',\n usageScope: 'account-wide',\n aggregationTemporality: 'delta',\n authority: 'official-account'\n };\n observation[kind] = (observation[kind] ?? 0) + line.numUnits;\n byModel.set(model, observation);\n }\n observations.push(...byModel.values());\n }\n return observations;\n}\n\nfunction mapBalances(account: XaiApiAccountPayload, observedAt: string): BalanceRecord[] {\n const records: BalanceRecord[] = [];\n if (account.balanceCents !== null) {\n records.push({\n id: 'xai-api:prepaid-balance',\n billingDomainId: 'xai-api',\n observedAt,\n kind: 'prepaid',\n amount: -account.balanceCents / 100,\n currency: 'USD',\n authority: 'official-account',\n sourceId: `${account.teamId}:prepaid-balance`\n });\n }\n if (account.spendingLimitCents !== null) {\n records.push({\n id: 'xai-api:spending-limit',\n billingDomainId: 'xai-api',\n observedAt,\n kind: 'spending-limit',\n amount: account.spendingLimitCents / 100,\n currency: 'USD',\n authority: 'official-account',\n sourceId: `${account.teamId}:spending-limit`\n });\n }\n if (account.currentInvoiceCents !== null) {\n records.push({\n id: 'xai-api:current-invoice',\n billingDomainId: 'xai-api',\n observedAt,\n kind: 'current-invoice',\n amount: account.currentInvoiceCents / 100,\n currency: 'USD',\n authority: 'official-account',\n sourceId: `${account.teamId}:current-invoice`\n });\n }\n return records;\n}\n\nfunction mapInvoices(invoices: Invoice[]): InvoiceRecord[] {\n return invoices.map((invoice) => ({\n id: invoice.invoiceId,\n billingDomainId: 'xai-api',\n createdAt: invoice.createTime,\n number: invoice.invoiceNumber ?? null,\n status: invoice.invoiceStatus ?? null,\n amount: invoice.total === undefined ? null : invoice.total / 100,\n currency: 'USD',\n authority: 'official-account'\n }));\n}\n\nfunction tokenKind(\n unitType: string\n): 'inputTokens' | 'outputTokens' | 'reasoningTokens' | 'cacheReadTokens' | null {\n const value = unitType.toLowerCase();\n if (!value.includes('token')) return null;\n if (value.includes('cache')) return 'cacheReadTokens';\n if (value.includes('reason')) return 'reasoningTokens';\n if (value.includes('prompt') || value.includes('input')) return 'inputTokens';\n if (value.includes('completion') || value.includes('output')) return 'outputTokens';\n return null;\n}\n\nfunction modelFromDescription(description: string): string {\n return description.replace(/^(Chat|Responses?)\\s+/i, '') || description;\n}\n\nfunction analyticsTimestamp(value: Date): string {\n return value\n .toISOString()\n .replace('T', ' ')\n .replace(/\\.\\d{3}Z$/, '');\n}\n\nfunction nextUtcMonth(now: Date): string {\n return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1)).toISOString();\n}\n\nfunction endpointFailure(error: unknown, label: string): ConnectorFailure {\n const status =\n error instanceof Error && 'status' in error && typeof error.status === 'number'\n ? error.status\n : null;\n if (status === 429) {\n const retryAfter =\n error instanceof Error && 'retryAfter' in error && typeof error.retryAfter === 'string'\n ? error.retryAfter\n : 'the provider retry interval';\n return {\n code: 'xai-api-rate-limited',\n message: `xAI API ${label} is rate limited.`,\n recovery: `Retry after ${retryAfter} seconds.`\n };\n }\n if (status === 401 || status === 403) {\n return {\n code: 'xai-api-permission-denied',\n message: `The management key cannot read xAI API ${label}.`,\n recovery: 'Grant the management key read access for this billing endpoint, then retry.'\n };\n }\n if (status === 422) {\n return {\n code: 'xai-api-schema-changed',\n message: `xAI API ${label} returned an unsupported schema.`,\n recovery: 'Update Agent Usage, then retry.'\n };\n }\n return {\n code: 'xai-api-endpoint-unavailable',\n message: `xAI API ${label} is unavailable.`,\n recovery: 'Check network access and xAI status, then retry.'\n };\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'xai-api-connector-failed',\n message: 'xAI API billing is unavailable.',\n recovery: 'Run agent-usage doctor and reconnect the xAI Management API key.'\n };\n}\n","import type { MonitoringSettings } from '../core/types.js';\n\nexport interface ScheduledUsageApplication {\n refresh(): Promise<void>;\n getMonitoringSettings(): Promise<MonitoringSettings>;\n}\n\nexport interface CollectionSchedulerOptions {\n application: ScheduledUsageApplication;\n intervalMs?: number;\n}\n\nexport class CollectionScheduler {\n readonly #application: ScheduledUsageApplication;\n readonly #intervalMs?: number;\n #timer: ReturnType<typeof setTimeout> | null = null;\n #stopped = true;\n\n constructor(options: CollectionSchedulerOptions) {\n this.#application = options.application;\n this.#intervalMs = options.intervalMs;\n }\n\n async tick(): Promise<void> {\n const settings = await this.#application.getMonitoringSettings();\n if (settings.backgroundCollectionEnabled) await this.#application.refresh();\n }\n\n start(): void {\n if (!this.#stopped) return;\n this.#stopped = false;\n void this.#scheduleNext();\n }\n\n stop(): void {\n this.#stopped = true;\n if (this.#timer) clearTimeout(this.#timer);\n this.#timer = null;\n }\n\n async #scheduleNext(): Promise<void> {\n if (this.#stopped) return;\n const settings = await this.#application.getMonitoringSettings();\n const interval = this.#intervalMs ?? settings.intervalMinutes * 60 * 1000;\n this.#timer = setTimeout(async () => {\n try {\n await this.tick();\n } finally {\n void this.#scheduleNext();\n }\n }, interval);\n }\n}\n","import type { ExchangeRateProvider, ExchangeRateSnapshot } from '../core/types.js';\n\nconst DEFAULT_URL = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml';\nconst SOURCE = 'European Central Bank euro foreign exchange reference rates';\n\nexport interface EcbExchangeRateProviderOptions {\n fetch?: typeof fetch;\n url?: string;\n}\n\nexport class EcbExchangeRateProvider implements ExchangeRateProvider {\n readonly #fetch: typeof fetch;\n readonly #url: string;\n\n constructor(options: EcbExchangeRateProviderOptions = {}) {\n this.#fetch = options.fetch ?? fetch;\n this.#url = options.url ?? DEFAULT_URL;\n }\n\n async readRates(): Promise<ExchangeRateSnapshot[]> {\n const response = await this.#fetch(this.#url, { signal: AbortSignal.timeout(5_000) });\n if (!response.ok) throw new Error(`ECB reference rates returned HTTP ${response.status}`);\n const xml = await response.text();\n const date = xml.match(/<Cube\\s+time=['\"](\\d{4}-\\d{2}-\\d{2})['\"]/i)?.[1];\n if (!date) throw new Error('ECB reference rate date is unavailable');\n const euroRates = new Map<string, number>([['EUR', 1]]);\n for (const match of xml.matchAll(\n /<Cube\\s+currency=['\"]([A-Z]{3})['\"]\\s+rate=['\"]([0-9.]+)['\"]\\s*\\/?\\s*>/gi\n )) {\n const rate = Number(match[2]);\n if (Number.isFinite(rate) && rate > 0) euroRates.set(match[1].toUpperCase(), rate);\n }\n const cnyPerEuro = euroRates.get('CNY');\n if (!cnyPerEuro) throw new Error('ECB CNY reference rate is unavailable');\n const observedAt = `${date}T00:00:00.000Z`;\n return [...euroRates.entries()]\n .filter(([currency]) => currency !== 'CNY')\n .map(([currency, unitsPerEuro]) => ({\n id: `ecb:${date}:${currency}:CNY`,\n baseCurrency: currency,\n quoteCurrency: 'CNY',\n rate: Number((cnyPerEuro / unitsPerEuro).toPrecision(12)),\n observedAt,\n source: `${SOURCE} (${this.#url})`\n }));\n }\n}\n","import { spawn } from 'node:child_process';\n\nimport type { SecretStore } from '../core/onboarding-types.js';\n\nconst SERVICE = 'dev.agent-usage.secrets';\nconst ITEM_NOT_FOUND = 44;\n\nexport interface SecurityCommandResult {\n exitCode: number;\n output?: string;\n}\n\nexport type SecurityCommandRunner = (\n arguments_: string[],\n input?: string\n) => Promise<SecurityCommandResult>;\n\nexport class MacOsKeychainSecretStore implements SecretStore {\n readonly #run: SecurityCommandRunner;\n readonly #service: string;\n\n constructor(run: SecurityCommandRunner = runSecurityCommand, options: { service?: string } = {}) {\n this.#run = run;\n this.#service = options.service ?? SERVICE;\n }\n\n async set(reference: string, value: string): Promise<void> {\n const result = await this.#run(\n ['add-generic-password', '-U', '-a', reference, '-s', this.#service, '-w'],\n `${value}\\n`\n );\n if (result.exitCode !== 0)\n throw new Error(`Keychain write failed with code ${result.exitCode}`);\n }\n\n async has(reference: string): Promise<boolean> {\n const result = await this.#run(['find-generic-password', '-a', reference, '-s', this.#service]);\n if (result.exitCode === 0) return true;\n if (result.exitCode === ITEM_NOT_FOUND) return false;\n throw new Error(`Keychain lookup failed with code ${result.exitCode}`);\n }\n\n async get(reference: string): Promise<string | null> {\n const result = await this.#run([\n 'find-generic-password',\n '-a',\n reference,\n '-s',\n this.#service,\n '-w'\n ]);\n if (result.exitCode === ITEM_NOT_FOUND) return null;\n if (result.exitCode !== 0) {\n throw new Error(`Keychain read failed with code ${result.exitCode}`);\n }\n return result.output?.replace(/\\r?\\n$/, '') ?? null;\n }\n\n async delete(reference: string): Promise<void> {\n const result = await this.#run([\n 'delete-generic-password',\n '-a',\n reference,\n '-s',\n this.#service\n ]);\n if (result.exitCode !== 0 && result.exitCode !== ITEM_NOT_FOUND) {\n throw new Error(`Keychain delete failed with code ${result.exitCode}`);\n }\n }\n}\n\nasync function runSecurityCommand(\n arguments_: string[],\n input?: string\n): Promise<SecurityCommandResult> {\n return await new Promise((resolveResult, reject) => {\n const child = spawn('/usr/bin/security', arguments_, {\n stdio: ['pipe', 'pipe', 'ignore']\n });\n let output = '';\n child.stdout.setEncoding('utf8').on('data', (chunk) => (output += chunk));\n child.once('error', reject);\n child.once('close', (exitCode) => resolveResult({ exitCode: exitCode ?? 1, output }));\n if (input) child.stdin.end(input);\n else child.stdin.end();\n });\n}\n","import { spawn } from 'node:child_process';\n\nimport type { LocalNotification, LocalNotifier } from '../core/types.js';\n\nexport class MacOsNotifier implements LocalNotifier {\n async notify(event: LocalNotification): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n '/usr/bin/osascript',\n [\n '-e',\n 'on run argv\\ndisplay notification (item 2 of argv) with title (item 1 of argv)\\nend run',\n '--',\n event.title,\n event.message\n ],\n { stdio: 'ignore' }\n );\n child.once('error', reject);\n child.once('close', (code) => (code === 0 ? resolve() : reject(new Error('notify failed'))));\n });\n }\n}\n","import { mkdir, rm, writeFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, join } from 'node:path';\n\nimport type { StartAtLoginManager } from '../core/types.js';\n\nconst LABEL = 'dev.agent-usage.daemon';\n\nexport interface MacOsStartAtLoginManagerOptions {\n userHome: string;\n executable: string;\n cliPath: string;\n applicationHome: string;\n label?: string;\n nodeImport?: string;\n environmentVariables?: Record<string, string>;\n}\n\nexport class MacOsStartAtLoginManager implements StartAtLoginManager {\n readonly #path: string;\n readonly #options: MacOsStartAtLoginManagerOptions;\n\n constructor(options: MacOsStartAtLoginManagerOptions) {\n const label = validateLaunchAgentLabel(options.label ?? LABEL);\n if (options.nodeImport) validateNodeImport(options.nodeImport);\n this.#options = { ...options, label };\n this.#path = join(options.userHome, 'Library', 'LaunchAgents', `${label}.plist`);\n }\n\n async setEnabled(enabled: boolean): Promise<void> {\n if (!enabled) {\n await rm(this.#path, { force: true });\n return;\n }\n await mkdir(dirname(this.#path), { recursive: true, mode: 0o700 });\n await writeFile(this.#path, launchAgentPlist(this.#options), { mode: 0o600 });\n }\n\n async isEnabled(): Promise<boolean> {\n try {\n const { access } = await import('node:fs/promises');\n await access(this.#path);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nfunction launchAgentPlist(options: MacOsStartAtLoginManagerOptions): string {\n const label = options.label ?? LABEL;\n const arguments_ = [\n options.executable,\n ...(options.nodeImport ? ['--import', options.nodeImport] : []),\n options.cliPath,\n '--home',\n options.applicationHome,\n 'serve'\n ];\n const environmentVariables = Object.entries(options.environmentVariables ?? {});\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\"><dict>\n<key>Label</key><string>${escapeXml(label)}</string>\n<key>ProgramArguments</key><array>${arguments_.map((value) => `<string>${escapeXml(value)}</string>`).join('')}</array>\n${environmentVariables.length > 0 ? `<key>EnvironmentVariables</key><dict>${environmentVariables.map(([key, value]) => `<key>${escapeXml(key)}</key><string>${escapeXml(value)}</string>`).join('')}</dict>\\n` : ''}<key>RunAtLoad</key><true/>\n<key>KeepAlive</key><false/>\n</dict></plist>\\n`;\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\nfunction validateLaunchAgentLabel(label: string): string {\n if (!/^[A-Za-z0-9.-]+$/.test(label)) {\n throw new Error('LaunchAgent label may contain only letters, numbers, dots, and hyphens');\n }\n return label;\n}\n\nfunction validateNodeImport(nodeImport: string): void {\n if (isAbsolute(nodeImport)) return;\n try {\n if (new URL(nodeImport).protocol === 'file:') return;\n } catch {\n // Fall through to the actionable validation error.\n }\n throw new Error('Node import must be an absolute path or file URL');\n}\n","import { parse } from 'protobufjs';\n\nconst schema = parse(`\n syntax = \"proto3\";\n package agentusage.otlp;\n\n message ExportMetricsServiceRequest {\n repeated ResourceMetrics resource_metrics = 1;\n }\n\n message ResourceMetrics {\n Resource resource = 1;\n repeated ScopeMetrics scope_metrics = 2;\n string schema_url = 3;\n }\n\n message Resource {\n repeated KeyValue attributes = 1;\n uint32 dropped_attributes_count = 2;\n }\n\n message ScopeMetrics {\n InstrumentationScope scope = 1;\n repeated Metric metrics = 2;\n string schema_url = 3;\n }\n\n message InstrumentationScope {\n string name = 1;\n string version = 2;\n repeated KeyValue attributes = 3;\n uint32 dropped_attributes_count = 4;\n }\n\n message Metric {\n string name = 1;\n string description = 2;\n string unit = 3;\n oneof data {\n Sum sum = 7;\n }\n }\n\n message Sum {\n repeated NumberDataPoint data_points = 1;\n AggregationTemporality aggregation_temporality = 2;\n bool is_monotonic = 3;\n }\n\n enum AggregationTemporality {\n AGGREGATION_TEMPORALITY_UNSPECIFIED = 0;\n AGGREGATION_TEMPORALITY_DELTA = 1;\n AGGREGATION_TEMPORALITY_CUMULATIVE = 2;\n }\n\n message NumberDataPoint {\n repeated KeyValue attributes = 7;\n fixed64 start_time_unix_nano = 2;\n fixed64 time_unix_nano = 3;\n oneof value {\n double as_double = 4;\n sfixed64 as_int = 6;\n }\n uint32 flags = 8;\n }\n\n message KeyValue {\n string key = 1;\n AnyValue value = 2;\n }\n\n message AnyValue {\n oneof value {\n string string_value = 1;\n bool bool_value = 2;\n int64 int_value = 3;\n double double_value = 4;\n bytes bytes_value = 7;\n }\n }\n`).root;\n\nconst exportRequest = schema.lookupType('agentusage.otlp.ExportMetricsServiceRequest');\n\nexport function decodeOtlpMetricsProtobuf(payload: Uint8Array): unknown {\n const decoded = exportRequest.decode(payload);\n return exportRequest.toObject(decoded, {\n longs: String,\n enums: String,\n bytes: String,\n defaults: false,\n oneofs: false\n });\n}\n\nexport function encodeOtlpMetricsProtobuf(payload: object): Uint8Array {\n const message = exportRequest.fromObject(payload);\n const verificationError = exportRequest.verify(message);\n if (verificationError) throw new Error(`Invalid OTLP metrics fixture: ${verificationError}`);\n return exportRequest.encode(message).finish();\n}\n","import { createReadStream, existsSync, statSync } from 'node:fs';\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { extname, join, normalize, resolve } from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport { z } from 'zod';\n\nimport type { UsageApplication } from '../core/usage-application.js';\nimport { publicErrorMessage } from '../core/redaction.js';\nimport { decodeOtlpMetricsProtobuf } from './otlp-protobuf.js';\n\nconst SESSION_COOKIE = 'agent_usage_session';\nconst connectorActionSchema = z.discriminatedUnion('action', [\n z.object({ action: z.literal('connect'), secret: z.string().min(1).max(16_384).optional() }),\n z.object({ action: z.literal('skip') }),\n z.object({ action: z.literal('retry') })\n]);\nconst usageQuerySchema = z.object({\n window: z.enum(['24h', '7d', '30d']).default('24h'),\n timeZone: z.string().min(1).max(100).optional(),\n comparisonCurrency: z\n .string()\n .regex(/^[A-Za-z]{3}$/)\n .default('CNY')\n});\nconst monitoringSettingsSchema = z\n .object({\n backgroundCollectionEnabled: z.boolean().optional(),\n intervalMinutes: z.number().int().min(1).max(1_440).optional(),\n notificationsEnabled: z.boolean().optional(),\n startAtLogin: z.boolean().optional()\n })\n .refine((value) => Object.keys(value).length > 0, 'At least one setting is required');\nconst planSubscriptionSchema = z.object({\n providerId: z.string().min(1),\n billingDomainId: z.string().min(1),\n plan: z\n .object({\n planId: z.string().min(1).nullable(),\n amount: z.number().positive().finite().optional(),\n currency: z.string().length(3).optional(),\n billingPeriod: z.enum(['monthly', 'annual']).optional(),\n anchorDate: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/)\n .nullable()\n .optional()\n })\n .nullable()\n});\nconst customModelRateSchema = z.object({\n id: z.string().optional(),\n providerId: z.string().min(1),\n billingDomainId: z.string().nullable().optional(),\n model: z.string().min(1),\n inputRate: z.number().nonnegative(),\n outputRate: z.number().nonnegative(),\n cacheReadRate: z.number().nonnegative().optional()\n});\nconst clearDataSchema = z.object({ deleteProductSecrets: z.boolean().default(false) });\nconst hardRebuildSchema = z.object({ confirmExpensiveOperation: z.literal(true) });\n\nexport interface LocalServerOptions {\n application: UsageApplication;\n host?: '127.0.0.1' | '::1';\n port?: number;\n launchToken?: string;\n apiToken?: string;\n staticDirectory?: string;\n}\n\nexport interface LocalServer {\n host: string;\n port: number;\n origin: string;\n apiToken: string;\n createLaunchUrl(): string;\n close(): Promise<void>;\n}\n\nexport async function startLocalServer(options: LocalServerOptions): Promise<LocalServer> {\n const host = options.host ?? '127.0.0.1';\n const launchTokens = new Set([options.launchToken ?? secureToken()]);\n const browserSessions = new Set<string>();\n const apiToken = options.apiToken ?? secureToken();\n let origin = '';\n\n const server = createServer(async (request, response) => {\n try {\n const requestUrl = new URL(request.url ?? '/', origin || `http://${host}`);\n\n if (request.method === 'GET' && requestUrl.pathname === '/launch') {\n const token = requestUrl.searchParams.get('token');\n if (!token || !launchTokens.delete(token)) {\n sendText(response, 403, 'Invalid or expired launch token');\n return;\n }\n const session = secureToken();\n browserSessions.add(session);\n response.writeHead(303, {\n location: '/',\n 'set-cookie': `${SESSION_COOKIE}=${session}; Path=/; HttpOnly; SameSite=Strict`\n });\n response.end();\n return;\n }\n\n const authentication = authenticate(request, apiToken, browserSessions);\n if (requestUrl.pathname.startsWith('/api/') && authentication === 'none') {\n sendJson(response, 401, { error: 'unauthorized' });\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/health') {\n response.writeHead(204, { 'cache-control': 'no-store' });\n response.end();\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/processing') {\n sendJson(response, 200, options.application.getProcessingStatus());\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/rebuild') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = hardRebuildSchema.safeParse(await readJsonBody(request));\n if (!input.success) {\n sendJson(response, 400, { error: 'explicit-confirmation-required' });\n return;\n }\n void options.application.startHardRebuild();\n sendJson(response, 202, { accepted: true });\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/v1/metrics') {\n if (authentication !== 'api-token') {\n sendJson(response, 401, { error: 'api-token-required' });\n return;\n }\n await options.application.ingestTelemetry(\n 'claude-code',\n await readJsonBody(request, 1_000_000)\n );\n sendJson(response, 200, { partialSuccess: {} });\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/grok/v1/metrics') {\n if (authentication !== 'api-token') {\n sendJson(response, 401, { error: 'api-token-required' });\n return;\n }\n const body = await readBody(request, 1_000_000);\n const contentType = request.headers['content-type'] ?? '';\n const payload = contentType.includes('application/json')\n ? JSON.parse(body.toString('utf8'))\n : decodeOtlpMetricsProtobuf(body);\n await options.application.ingestTelemetry('grok', payload);\n sendOtlpProtobuf(response, 200);\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/overview/providers') {\n sendJson(response, 200, await options.application.getAgentProviderIndex());\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname.startsWith('/api/overview/providers/')) {\n const providerId = decodeURIComponent(\n requestUrl.pathname.slice('/api/overview/providers/'.length)\n );\n const provider = await options.application.getProviderOverview(\n providerId,\n parseUsageQuery(requestUrl)\n );\n if (!provider) {\n sendJson(response, 404, { error: 'provider-not-found' });\n return;\n }\n sendJson(response, 200, provider);\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/overview') {\n const query = parseUsageQuery(requestUrl);\n sendJson(response, 200, await options.application.getOverview(query));\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/refresh') {\n if (authentication === 'browser' && request.headers.origin !== origin) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n if (requestUrl.searchParams.get('background') === 'true') {\n void options.application.startBackgroundProcessing({\n userInitiated: requestUrl.searchParams.get('mode') !== 'automatic'\n });\n sendJson(response, 202, { accepted: true });\n return;\n }\n await options.application.refresh({\n userInitiated: requestUrl.searchParams.get('mode') !== 'automatic'\n });\n response.writeHead(204);\n response.end();\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/connectors') {\n sendJson(response, 200, await options.application.getConnectorStatuses());\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/doctor') {\n sendJson(response, 200, await options.application.getDiagnostics());\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/export') {\n const query = parseUsageQuery(requestUrl);\n const format = z.enum(['json', 'csv']).parse(requestUrl.searchParams.get('format'));\n const artifact = await options.application.exportUsage({\n ...query,\n format,\n includeAccountIdentifiers:\n requestUrl.searchParams.get('includeAccountIdentifiers') === 'true'\n });\n response.writeHead(200, {\n 'content-type': artifact.contentType,\n 'content-disposition': `attachment; filename=\"${artifact.filename}\"`,\n 'cache-control': 'no-store'\n });\n response.end(artifact.body);\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/retention') {\n sendJson(response, 200, await options.application.getRetentionStatus());\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/retention/compact') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n sendJson(response, 200, await options.application.compactRetention());\n return;\n }\n\n if (request.method === 'DELETE' && requestUrl.pathname === '/api/data') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = clearDataSchema.parse(await readJsonBody(request));\n sendJson(response, 200, await options.application.clearData(input));\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/plans') {\n sendJson(response, 200, await options.application.getPlanSettings());\n return;\n }\n\n if (request.method === 'PATCH' && requestUrl.pathname === '/api/plans') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = planSubscriptionSchema.parse(await readJsonBody(request));\n sendJson(response, 200, await options.application.updatePlanSubscription(input));\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/custom-rates') {\n const rates = await options.application.getCustomModelRates();\n sendJson(response, 200, { rates });\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname.startsWith('/api/custom-rates/')) {\n const id = decodeURIComponent(requestUrl.pathname.slice('/api/custom-rates/'.length));\n const rate = await options.application.getCustomModelRate(id);\n if (!rate) {\n sendJson(response, 404, { error: 'rate-not-found' });\n return;\n }\n sendJson(response, 200, { rate });\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/custom-rates') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = customModelRateSchema.parse(await readJsonBody(request));\n const rate = await options.application.setCustomModelRate(input);\n sendJson(response, 200, { rate });\n return;\n }\n\n if (\n (request.method === 'PUT' || request.method === 'PATCH') &&\n requestUrl.pathname.startsWith('/api/custom-rates/')\n ) {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const id = decodeURIComponent(requestUrl.pathname.slice('/api/custom-rates/'.length));\n const body = (await readJsonBody(request)) as Record<string, unknown>;\n const input = customModelRateSchema.parse({ ...body, id });\n const rate = await options.application.setCustomModelRate(input);\n sendJson(response, 200, { rate });\n return;\n }\n\n if (request.method === 'DELETE' && requestUrl.pathname.startsWith('/api/custom-rates/')) {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const id = decodeURIComponent(requestUrl.pathname.slice('/api/custom-rates/'.length));\n const deleted = await options.application.deleteCustomModelRate(id);\n sendJson(response, 200, { deleted });\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/monitoring') {\n sendJson(response, 200, await options.application.getMonitoringStatus());\n return;\n }\n\n if (request.method === 'PATCH' && requestUrl.pathname === '/api/monitoring/settings') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const changes = monitoringSettingsSchema.parse(await readJsonBody(request));\n sendJson(response, 200, await options.application.updateMonitoringSettings(changes));\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/connectors/discover') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n sendJson(response, 200, await options.application.discoverConnectors());\n return;\n }\n\n const connectorActionMatch = requestUrl.pathname.match(\n /^\\/api\\/connectors\\/([^/]+)\\/action$/\n );\n if (request.method === 'POST' && connectorActionMatch) {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = connectorActionSchema.parse(await readJsonBody(request));\n sendJson(\n response,\n 200,\n await options.application.configureConnector(\n decodeURIComponent(connectorActionMatch[1]),\n input\n )\n );\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/launch-token') {\n if (authentication !== 'api-token') {\n sendJson(response, 403, { error: 'api-token-required' });\n return;\n }\n const token = secureToken();\n launchTokens.add(token);\n sendJson(response, 200, { url: `${origin}/launch?token=${encodeURIComponent(token)}` });\n return;\n }\n\n if (request.method === 'GET') {\n await serveStatic(response, requestUrl.pathname, options.staticDirectory);\n return;\n }\n\n sendJson(response, 404, { error: 'not-found' });\n } catch (error) {\n respondWithFailure(response, error);\n }\n });\n\n await new Promise<void>((resolveListening, reject) => {\n server.once('error', reject);\n server.listen(options.port ?? 0, host, () => {\n server.off('error', reject);\n resolveListening();\n });\n });\n\n const address = server.address();\n if (!address || typeof address === 'string') {\n await new Promise<void>((resolveClose) => server.close(() => resolveClose()));\n throw new Error('Local server did not expose a TCP address');\n }\n const port = address.port;\n origin = `http://${host}:${port}`;\n\n return {\n host,\n port,\n origin,\n apiToken,\n createLaunchUrl() {\n const token = secureToken();\n launchTokens.add(token);\n return `${origin}/launch?token=${encodeURIComponent(token)}`;\n },\n async close() {\n if (!server.listening) return;\n await new Promise<void>((resolveClose, reject) => {\n server.close((error) => (error ? reject(error) : resolveClose()));\n });\n }\n };\n}\n\ntype Authentication = 'none' | 'browser' | 'api-token';\n\nfunction parseUsageQuery(requestUrl: URL) {\n return usageQuerySchema.parse({\n window: requestUrl.searchParams.get('window') ?? undefined,\n timeZone: requestUrl.searchParams.get('timeZone') ?? undefined,\n comparisonCurrency: requestUrl.searchParams.get('currency') ?? undefined\n });\n}\n\nfunction authenticate(\n request: IncomingMessage,\n apiToken: string,\n browserSessions: Set<string>\n): Authentication {\n if (request.headers.authorization === `Bearer ${apiToken}`) return 'api-token';\n const cookies = parseCookies(request.headers.cookie);\n const session = cookies.get(SESSION_COOKIE);\n return session && browserSessions.has(session) ? 'browser' : 'none';\n}\n\nfunction validMutationOrigin(\n authentication: Authentication,\n request: IncomingMessage,\n origin: string\n): boolean {\n return authentication === 'api-token' || request.headers.origin === origin;\n}\n\nasync function readJsonBody(request: IncomingMessage, maximumBytes = 20_000): Promise<unknown> {\n return JSON.parse((await readBody(request, maximumBytes)).toString('utf8'));\n}\n\nasync function readBody(request: IncomingMessage, maximumBytes: number): Promise<Buffer> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n if (size > maximumBytes) throw new Error('Request body is too large');\n chunks.push(buffer);\n }\n return Buffer.concat(chunks);\n}\n\nfunction parseCookies(header: string | undefined): Map<string, string> {\n const result = new Map<string, string>();\n for (const part of header?.split(';') ?? []) {\n const separator = part.indexOf('=');\n if (separator === -1) continue;\n result.set(part.slice(0, separator).trim(), part.slice(separator + 1).trim());\n }\n return result;\n}\n\nasync function serveStatic(\n response: ServerResponse,\n pathname: string,\n staticDirectory: string | undefined\n): Promise<void> {\n if (!staticDirectory) {\n sendHtml(\n response,\n 200,\n '<!doctype html><html><head><title>Agent Usage</title></head><body><main id=\"app\">Agent Usage</main></body></html>'\n );\n return;\n }\n\n const root = resolve(staticDirectory);\n const requested = pathname === '/' ? 'index.html' : pathname.replace(/^\\/+/, '');\n const normalized = normalize(requested);\n const candidate = resolve(join(root, normalized));\n const indexFile = join(root, 'index.html');\n const file =\n candidate.startsWith(`${root}/`) && existsSync(candidate) && statSync(candidate).isFile()\n ? candidate\n : indexFile;\n\n if (!existsSync(file)) {\n sendText(response, 404, 'Dashboard assets are not built');\n return;\n }\n const extension = extname(file);\n response.writeHead(200, {\n 'content-type': contentType(extension),\n 'cache-control': extension === '.html' ? 'no-store' : 'public, max-age=31536000, immutable'\n });\n createReadStream(file).pipe(response);\n}\n\nfunction contentType(extension: string): string {\n switch (extension) {\n case '.html':\n return 'text/html; charset=utf-8';\n case '.js':\n return 'text/javascript; charset=utf-8';\n case '.css':\n return 'text/css; charset=utf-8';\n case '.svg':\n return 'image/svg+xml';\n case '.json':\n return 'application/json; charset=utf-8';\n default:\n return 'application/octet-stream';\n }\n}\n\nfunction secureToken(): string {\n return randomBytes(32).toString('base64url');\n}\n\n// The body is encoded before the first byte of the response is written. A payload that\n// cannot be encoded then fails while the failure path can still answer with a status,\n// instead of leaving a started response that only accepts an unrecoverable second write.\nfunction sendJson(response: ServerResponse, status: number, body: unknown): void {\n const payload = JSON.stringify(body);\n response.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'cache-control': 'no-store'\n });\n response.end(payload);\n}\n\n// A request must never end the daemon. Once a response has started, its status is already\n// on the wire and a second write throws, so the only remaining signal is an aborted body.\nfunction respondWithFailure(response: ServerResponse, error: unknown): void {\n const message = publicErrorMessage(error);\n if (response.headersSent || response.writableEnded) {\n process.stderr.write(`Agent Usage: a started response failed to finish: ${message}\\n`);\n response.destroy();\n return;\n }\n try {\n sendJson(response, 500, { error: 'internal-error', message });\n } catch {\n process.stderr.write(`Agent Usage: a request failed without a reportable reason.\\n`);\n response.destroy();\n }\n}\n\nfunction sendOtlpProtobuf(response: ServerResponse, status: number): void {\n response.writeHead(status, {\n 'content-type': 'application/x-protobuf',\n 'cache-control': 'no-store'\n });\n response.end(Buffer.alloc(0));\n}\n\nfunction sendText(response: ServerResponse, status: number, body: string): void {\n response.writeHead(status, { 'content-type': 'text/plain; charset=utf-8' });\n response.end(body);\n}\n\nfunction sendHtml(response: ServerResponse, status: number, body: string): void {\n response.writeHead(status, { 'content-type': 'text/html; charset=utf-8' });\n response.end(body);\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport { delimiter, isAbsolute, join, resolve } from 'node:path';\n\nimport type {\n ConnectorDefinition,\n DiscoveryInspection,\n DiscoveryProbe\n} from '../core/onboarding-types.js';\n\nexport interface PathDiscoveryProbeOptions {\n path?: string;\n home?: string;\n}\n\nexport class PathDiscoveryProbe implements DiscoveryProbe {\n readonly #path: string;\n readonly #home: string;\n\n constructor(options: PathDiscoveryProbeOptions = {}) {\n this.#path = options.path ?? process.env.PATH ?? '';\n this.#home = options.home ?? process.env.HOME ?? '';\n }\n\n async inspect(definition: ConnectorDefinition): Promise<DiscoveryInspection> {\n const binaryPath = definition.command ? await this.#findExecutable(definition.command) : null;\n const officialCredentialPresent = await anyPathExists(\n (definition.officialCredentialPaths ?? []).map((path) =>\n isAbsolute(path) ? path : resolve(this.#home, path)\n )\n );\n return {\n installed: definition.command === null || binaryPath !== null,\n binaryPath,\n officialCredentialPresent\n };\n }\n\n async #findExecutable(command: string): Promise<string | null> {\n if (command.includes('/')) return (await isExecutable(command)) ? resolve(command) : null;\n for (const directory of this.#path.split(delimiter).filter(Boolean)) {\n const candidate = join(directory, command);\n if (await isExecutable(candidate)) return candidate;\n }\n return null;\n }\n}\n\nasync function isExecutable(path: string): Promise<boolean> {\n try {\n await access(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function anyPathExists(paths: string[]): Promise<boolean> {\n for (const path of paths) {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n // Existence checks intentionally do not open or read official credential files.\n }\n }\n return false;\n}\n","import { mkdirSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname } from 'node:path';\nimport type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\nimport { Worker } from 'node:worker_threads';\n\nimport type {\n AgentProviderIndex,\n BalanceRecord,\n BillingHistory,\n BillingDomainOverview,\n ConnectorDiagnostic,\n ConnectorRuntimeState,\n ConnectorSnapshot,\n CoverageLevel,\n CostRecord,\n CustomModelRate,\n DataAuthority,\n ExchangeRateSnapshot,\n HistoryCost,\n HistoryModelObservation,\n HistoryModelPriceEvidence,\n HistoryWindow,\n MonitoringSettings,\n PlanBillingPeriod,\n PlanPriceSource,\n PlanSubscription,\n PriceSnapshotReference,\n ProviderOverview,\n QuotaBucket,\n QuotaForecast,\n RetailPriceLineItem,\n RetailPricingBackfillCursor,\n RetailPricingBackfillPage,\n RetentionStatus,\n TokenEvidence,\n TokenAggregationTemporality,\n TokenModelAttribution,\n TokenSemantics,\n TokenTimePrecision,\n TokenTotalDerivation,\n TokenTotals,\n TokenUsageScope,\n UsageOverview,\n UsageQuery,\n UsageRepository\n} from '../core/types.js';\nimport { normalizeTokenObservation } from '../core/token-normalization.js';\nimport {\n billingPeriodContaining,\n buildWorkbenchPlanValue,\n type PlanBillingPeriodSummary,\n type PlanValueDomainInput\n} from '../core/plan-pricing.js';\nimport type { ConnectorStatusRecord, ConnectorSetupState } from '../core/onboarding-types.js';\n\nconst FRESHNESS_WINDOW_MS = 15 * 60 * 1000;\nconst QUERY_INDEXES_SQL = `\n CREATE INDEX IF NOT EXISTS usage_observed_at_idx\n ON usage_observations(observed_at);\n CREATE INDEX IF NOT EXISTS usage_provider_domain_time_idx\n ON usage_observations(provider_id, billing_domain_id, observed_at);\n CREATE INDEX IF NOT EXISTS usage_provider_time_id_idx\n ON usage_observations(provider_id, observed_at, id);\n CREATE INDEX IF NOT EXISTS usage_provider_model_time_idx\n ON usage_observations(provider_id, model, observed_at);\n CREATE INDEX IF NOT EXISTS cost_observed_at_idx\n ON cost_records(observed_at);\n CREATE INDEX IF NOT EXISTS cost_provider_domain_time_idx\n ON cost_records(provider_id, billing_domain_id, observed_at);\n CREATE INDEX IF NOT EXISTS cost_usage_observation_idx\n ON cost_records(provider_id, usage_observation_id);\n CREATE INDEX IF NOT EXISTS quota_provider_bucket_time_idx\n ON quota_observations(provider_id, bucket_id, observed_at);\n`;\nconst DELETE_DERIVED_RETAIL_COSTS_SQL = `\n DELETE FROM cost_records\n WHERE kind = 'retail-equivalent'\n AND usage_observation_id IS NOT NULL\n AND EXISTS (\n SELECT 1 FROM usage_observations usage\n WHERE usage.provider_id = cost_records.provider_id\n AND usage.id = cost_records.usage_observation_id\n )\n`;\nconst DELETE_DEMO_PROVIDER_DATA_SQL = `\n DELETE FROM connector_diagnostics WHERE provider_id = 'demo';\n DELETE FROM connector_runtime WHERE id = 'demo';\n DELETE FROM connector_settings WHERE id = 'demo';\n DELETE FROM providers WHERE id = 'demo';\n`;\nconst { DatabaseSync } = createRequire(import.meta.url)(\n 'node:sqlite'\n) as typeof import('node:sqlite');\n\ninterface DatabaseWorkerRequest {\n databasePath: string;\n operation: 'indexes' | 'delete-demo-data' | 'delete-derived-costs' | 'retention';\n indexesSql?: string;\n aggregateSql?: string;\n deleteDerivedCostsSql?: string;\n deleteDemoDataSql?: string;\n cutoff?: string;\n now?: string;\n}\n\nasync function runDatabaseWorker<T>(workerData: DatabaseWorkerRequest): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const worker = new Worker(\n `\n const { parentPort, workerData } = require('node:worker_threads');\n const { DatabaseSync } = require('node:sqlite');\n let database;\n try {\n database = new DatabaseSync(workerData.databasePath);\n database.exec('PRAGMA busy_timeout = 5000; PRAGMA foreign_keys = ON;');\n if (workerData.operation === 'indexes') {\n database.exec(workerData.indexesSql);\n parentPort.postMessage({ ok: true, data: null });\n } else if (workerData.operation === 'delete-demo-data') {\n database.exec('BEGIN IMMEDIATE');\n try {\n database.exec(workerData.deleteDemoDataSql);\n database.exec('COMMIT');\n parentPort.postMessage({ ok: true, data: null });\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n } else if (workerData.operation === 'delete-derived-costs') {\n database.prepare(workerData.deleteDerivedCostsSql).run();\n parentPort.postMessage({ ok: true, data: null });\n } else if (workerData.operation === 'retention') {\n database.exec(workerData.indexesSql);\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare(workerData.aggregateSql).run(workerData.cutoff);\n database.prepare('DELETE FROM usage_observations WHERE observed_at < ?')\n .run(workerData.cutoff);\n database.prepare(\n 'INSERT INTO retention_state (id, last_compacted_at) VALUES (1, ?) ' +\n 'ON CONFLICT(id) DO UPDATE SET last_compacted_at = excluded.last_compacted_at'\n ).run(workerData.now);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n const raw = database.prepare(\n 'SELECT COUNT(*) AS count, MIN(observed_at) AS oldest FROM usage_observations'\n ).get();\n const aggregates = database.prepare(\n 'SELECT COUNT(*) AS count FROM daily_usage_aggregates'\n ).get();\n const state = database.prepare(\n 'SELECT last_compacted_at FROM retention_state WHERE id = 1'\n ).get();\n parentPort.postMessage({\n ok: true,\n data: {\n rawRetentionDays: 90,\n rawObservations: Number(raw.count),\n oldestRawObservedAt: raw.oldest,\n dailyAggregates: Number(aggregates.count),\n lastCompactedAt: state?.last_compacted_at ?? null\n }\n });\n }\n } catch (error) {\n parentPort.postMessage({\n ok: false,\n message: error instanceof Error ? error.message : String(error)\n });\n } finally {\n database?.close();\n }\n `,\n { eval: true, workerData }\n );\n worker.once('message', (message: { ok: boolean; data?: T; message?: string }) => {\n if (message.ok) resolve(message.data as T);\n else reject(new Error(message.message ?? 'SQLite background maintenance failed'));\n });\n worker.once('error', reject);\n });\n}\n\ninterface ProviderRow {\n id: string;\n display_name: string;\n last_success_at: string | null;\n last_error: string | null;\n last_error_code: string | null;\n last_recovery: string | null;\n}\n\nfunction additiveUsagePredicate(alias = ''): string {\n const prefix = alias ? `${alias}.` : '';\n // A Codex day the connector could reconcile is stored as both its official account-wide\n // total and the reconciled remainder that the local transcripts do not account for. The\n // transcripts plus that remainder already equal the official total, so the official row is\n // the one that steps aside. Days the connector could not reconcile carry no official row at\n // all, which is why matching the two ids is enough and no day arithmetic happens here.\n const codexReconciledRemainderIds = `(SELECT billing_domain_id, id\n FROM usage_observations\n WHERE provider_id = 'codex' AND id LIKE 'codex-transcript:account-remainder:%')`;\n return `NOT (\n ${prefix}aggregation_temporality = 'unknown'\n AND (\n (${prefix}provider_id = 'claude-code' AND ${prefix}id LIKE 'claude-otel:%')\n OR (\n ${prefix}provider_id = 'grok'\n AND (${prefix}id LIKE 'grok-otel:%' OR ${prefix}id LIKE 'grok-headless:%')\n )\n )\n OR (\n ${prefix}provider_id = 'codex'\n AND ${prefix}id LIKE 'codex:daily:%'\n AND (\n ${prefix}billing_domain_id,\n 'codex-transcript:account-remainder:' || substr(${prefix}id, 13)\n ) IN ${codexReconciledRemainderIds}\n )\n )`;\n}\n\nconst RETENTION_AGGREGATE_SQL = `\n INSERT INTO daily_usage_aggregates (\n provider_id, billing_domain_id, day_utc, model, authority,\n total_tokens, input_tokens, output_tokens, reasoning_tokens,\n cache_read_tokens, cache_write_tokens, source_count\n )\n SELECT provider_id, billing_domain_id, substr(observed_at, 1, 10), model, authority,\n SUM(total_tokens), SUM(input_tokens), SUM(output_tokens), SUM(reasoning_tokens),\n SUM(cache_read_tokens), SUM(cache_write_tokens), COUNT(*)\n FROM usage_observations\n WHERE observed_at < ? AND ${additiveUsagePredicate()}\n GROUP BY provider_id, billing_domain_id, substr(observed_at, 1, 10), model, authority\n ON CONFLICT(provider_id, billing_domain_id, day_utc, model, authority) DO UPDATE SET\n total_tokens = excluded.total_tokens,\n input_tokens = excluded.input_tokens,\n output_tokens = excluded.output_tokens,\n reasoning_tokens = excluded.reasoning_tokens,\n cache_read_tokens = excluded.cache_read_tokens,\n cache_write_tokens = excluded.cache_write_tokens,\n source_count = excluded.source_count\n`;\n\ninterface QuotaRow {\n id: string;\n billing_domain_id: string;\n label: string;\n used_percent: number | null;\n window_duration_minutes: number | null;\n resets_at: string | null;\n authority: DataAuthority;\n observed_at: string;\n scope: QuotaBucket['scope'] | null;\n status: string | null;\n limit_amount: number | null;\n limit_currency: string | null;\n fallback_status: QuotaBucket['fallbackStatus'] | null;\n}\n\ninterface QuotaObservationRow {\n bucket_id: string;\n billing_domain_id: string;\n label: string;\n used_percent: number;\n resets_at: string | null;\n observed_at: string;\n}\n\ninterface TokenRow {\n total_tokens: number | null;\n input_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n cache_read_tokens: number | null;\n cache_write_tokens: number | null;\n observation_count: number;\n source_reported_tokens: number | null;\n source_reported_observation_count: number;\n unclassified_tokens: number | null;\n total_derivations: string | null;\n time_precisions: string | null;\n usage_scopes: string | null;\n aggregation_temporalities: string | null;\n authorities: string | null;\n}\n\ninterface BillingDomainRow {\n id: string;\n display_name: string;\n last_success_at: string | null;\n}\n\ninterface CostRow {\n id: string;\n source_id: string | null;\n billing_domain_id: string;\n observed_at: string;\n kind: CostRecord['kind'];\n amount: number | null;\n currency: string;\n authority: DataAuthority;\n price_snapshot_id: string | null;\n price_snapshot_version: string | null;\n price_snapshot_source: string | null;\n price_snapshot_canonical_model: string | null;\n price_snapshot_effective_at: string | null;\n price_snapshot_effective_until: string | null;\n price_snapshot_currency: string | null;\n price_snapshot_rates_json: string | null;\n price_snapshot_source_url: string | null;\n price_snapshot_context_tier: string | null;\n model: string | null;\n usage_observation_id: string | null;\n priced_tokens: number | null;\n line_items_json: string | null;\n calculated_at: string | null;\n}\n\ninterface UsageHistoryRow {\n id: string;\n model: string;\n observed_at: string;\n authority: DataAuthority;\n total_tokens: number;\n input_tokens: number;\n output_tokens: number;\n reasoning_tokens: number;\n cache_read_tokens: number;\n cache_write_tokens: number;\n cache_write_5m_tokens: number | null;\n cache_write_1h_tokens: number | null;\n source_reported_total_tokens: number | null;\n unclassified_tokens: number;\n total_derivation: TokenTotalDerivation;\n model_attribution: TokenModelAttribution;\n time_precision: TokenTimePrecision;\n usage_scope: TokenUsageScope;\n aggregation_temporality: TokenAggregationTemporality;\n reasoning_semantics: TokenSemantics['reasoning'];\n cache_read_semantics: TokenSemantics['cacheRead'];\n cache_write_semantics: TokenSemantics['cacheWrite'];\n}\n\ninterface PricingBackfillRow extends UsageHistoryRow {\n provider_id: string;\n provider_display_name: string;\n id: string;\n billing_domain_id: string;\n billing_domain_display_name: string;\n session_id: string | null;\n reasoning_semantics: TokenSemantics['reasoning'];\n cache_read_semantics: TokenSemantics['cacheRead'];\n cache_write_semantics: TokenSemantics['cacheWrite'];\n}\n\nfunction pricingBackfillSnapshots(rows: PricingBackfillRow[]): ConnectorSnapshot[] {\n const snapshots = new Map<string, ConnectorSnapshot>();\n for (const row of rows) {\n const snapshot = snapshots.get(row.provider_id) ?? {\n provider: { id: row.provider_id, displayName: row.provider_display_name },\n billingDomains: [],\n quotaBuckets: [],\n usage: [],\n costs: [],\n observedAt: row.observed_at\n };\n if (!snapshot.billingDomains.some((domain) => domain.id === row.billing_domain_id)) {\n snapshot.billingDomains.push({\n id: row.billing_domain_id,\n displayName: row.billing_domain_display_name\n });\n }\n snapshot.usage.push({\n id: row.id,\n billingDomainId: row.billing_domain_id,\n model: row.model_attribution === 'known' ? row.model : null,\n sessionId: row.session_id,\n observedAt: row.observed_at,\n inputTokens: Number(row.input_tokens),\n outputTokens: Number(row.output_tokens),\n reasoningTokens: Number(row.reasoning_tokens),\n cacheReadTokens: Number(row.cache_read_tokens),\n cacheWriteTokens: Number(row.cache_write_tokens),\n cacheWriteTokenBreakdown:\n row.cache_write_5m_tokens === null || row.cache_write_1h_tokens === null\n ? null\n : {\n fiveMinute: Number(row.cache_write_5m_tokens),\n oneHour: Number(row.cache_write_1h_tokens)\n },\n sourceReportedTotalTokens:\n row.source_reported_total_tokens === null ? null : Number(row.source_reported_total_tokens),\n reconciledRemainderTokens:\n row.total_derivation === 'reconciled-remainder' ? Number(row.total_tokens) : null,\n tokenSemantics: {\n reasoning: row.reasoning_semantics,\n cacheRead: row.cache_read_semantics,\n cacheWrite: row.cache_write_semantics\n },\n modelAttribution: row.model_attribution,\n timePrecision: row.time_precision,\n usageScope: row.usage_scope,\n aggregationTemporality: row.aggregation_temporality,\n authority: row.authority\n });\n if (row.observed_at > snapshot.observedAt) snapshot.observedAt = row.observed_at;\n snapshots.set(row.provider_id, snapshot);\n }\n return [...snapshots.values()];\n}\n\ninterface MutableTokenEvidence {\n recordedTokens: number;\n sourceReportedTokens: number;\n sourceReportedObservationCount: number;\n observationCount: number;\n unclassifiedTokens: number;\n totalDerivations: Set<TokenTotalDerivation>;\n timePrecisions: Set<TokenTimePrecision>;\n usageScopes: Set<TokenUsageScope>;\n aggregationTemporalities: Set<TokenAggregationTemporality>;\n}\n\ninterface ExchangeRateRow {\n id: string;\n base_currency: string;\n quote_currency: string;\n rate: number;\n observed_at: string;\n source: string;\n}\n\ninterface BalanceRow {\n id: string;\n source_id: string | null;\n billing_domain_id: string;\n observed_at: string;\n kind: BalanceRecord['kind'];\n amount: number | null;\n currency: string;\n authority: DataAuthority;\n}\n\ninterface InvoiceRow {\n id: string;\n billing_domain_id: string;\n created_at: string;\n number: string | null;\n status: string | null;\n amount: number | null;\n currency: string;\n authority: DataAuthority;\n}\n\ninterface ConnectorStatusRow {\n id: string;\n state: ConnectorSetupState;\n installed: number;\n binary_path: string | null;\n official_credential_present: number;\n error_code: string | null;\n last_discovered_at: string | null;\n secret_reference: string | null;\n}\n\ninterface ConnectorRuntimeRow {\n id: string;\n last_attempt_at: string | null;\n next_allowed_at: string | null;\n failure_count: number;\n outcome: ConnectorRuntimeState['outcome'];\n}\n\ninterface ConnectorDiagnosticRow {\n id: string;\n provider_id: string;\n billing_domain_id: string | null;\n status: ConnectorDiagnostic['status'];\n category: ConnectorDiagnostic['category'];\n message: string | null;\n recovery: string | null;\n affected_coverage: string;\n last_attempt_at: string;\n last_success_at: string | null;\n}\n\nexport class SqliteUsageRepository implements UsageRepository {\n readonly #database: DatabaseSyncType;\n readonly #databasePath: string;\n readonly #hideDemoProvider: boolean;\n\n constructor(databasePath: string, options: { hideDemoProvider?: boolean } = {}) {\n this.#databasePath = databasePath;\n this.#hideDemoProvider = options.hideDemoProvider ?? false;\n mkdirSync(dirname(databasePath), { recursive: true });\n this.#database = new DatabaseSync(databasePath);\n this.#database.exec('PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON;');\n this.#migrate();\n }\n\n saveSnapshot(snapshot: ConnectorSnapshot, options: { preserveFailure?: boolean } = {}): void {\n this.#database.exec('BEGIN IMMEDIATE');\n try {\n const providerSql = options.preserveFailure\n ? `INSERT INTO providers (\n id, display_name, account_identifier, last_success_at, last_error, last_error_code, last_recovery\n ) VALUES (?, ?, ?, ?, NULL, NULL, NULL)\n ON CONFLICT(id) DO UPDATE SET\n display_name = excluded.display_name,\n account_identifier = COALESCE(excluded.account_identifier, providers.account_identifier),\n last_success_at = excluded.last_success_at`\n : `INSERT INTO providers (\n id, display_name, account_identifier, last_success_at, last_error, last_error_code, last_recovery\n ) VALUES (?, ?, ?, ?, NULL, NULL, NULL)\n ON CONFLICT(id) DO UPDATE SET\n display_name = excluded.display_name,\n account_identifier = COALESCE(excluded.account_identifier, providers.account_identifier),\n last_success_at = excluded.last_success_at,\n last_error = NULL,\n last_error_code = NULL,\n last_recovery = NULL`;\n this.#database\n .prepare(providerSql)\n .run(\n snapshot.provider.id,\n snapshot.provider.displayName,\n snapshot.provider.accountIdentifier ?? null,\n snapshot.observedAt\n );\n\n const billingDomainStatement = this.#database.prepare(\n `INSERT INTO billing_domains (provider_id, id, display_name, last_success_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n display_name = excluded.display_name,\n last_success_at = excluded.last_success_at`\n );\n for (const billingDomain of snapshot.billingDomains) {\n billingDomainStatement.run(\n snapshot.provider.id,\n billingDomain.id,\n billingDomain.displayName,\n snapshot.observedAt\n );\n }\n\n const quotaStatement = this.#database.prepare(\n `INSERT INTO quota_buckets (\n provider_id, id, billing_domain_id, label, used_percent, window_duration_minutes,\n resets_at, authority, observed_at,\n scope, status, limit_amount, limit_currency, fallback_status\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n label = excluded.label,\n used_percent = excluded.used_percent,\n window_duration_minutes = excluded.window_duration_minutes,\n resets_at = excluded.resets_at,\n authority = excluded.authority,\n observed_at = excluded.observed_at,\n scope = excluded.scope,\n status = excluded.status,\n limit_amount = excluded.limit_amount,\n limit_currency = excluded.limit_currency,\n fallback_status = excluded.fallback_status`\n );\n // A collection that reports quota states the complete set of windows for the\n // billing domains it reports them for. Merging by bucket id instead left a\n // window the source had stopped reporting on the card forever, beside the\n // windows that replaced it. A collection reporting no quota at all changes\n // nothing, so a source that is briefly unreadable keeps its last windows.\n const reportedQuotaDomains = [\n ...new Set(snapshot.quotaBuckets.map((bucket) => bucket.billingDomainId))\n ];\n if (reportedQuotaDomains.length > 0) {\n const retiredQuotaStatement = this.#database.prepare(\n `DELETE FROM quota_buckets\n WHERE provider_id = ? AND billing_domain_id = ? AND id NOT IN (${snapshot.quotaBuckets\n .map(() => '?')\n .join(', ')})`\n );\n for (const billingDomainId of reportedQuotaDomains) {\n retiredQuotaStatement.run(\n snapshot.provider.id,\n billingDomainId,\n ...snapshot.quotaBuckets.map((bucket) => bucket.id)\n );\n }\n }\n for (const bucket of snapshot.quotaBuckets) {\n quotaStatement.run(\n snapshot.provider.id,\n bucket.id,\n bucket.billingDomainId,\n bucket.label,\n bucket.usedPercent,\n bucket.windowDurationMinutes ?? null,\n bucket.resetsAt,\n bucket.authority,\n snapshot.observedAt,\n bucket.scope ?? null,\n bucket.status ?? null,\n bucket.limitAmount ?? null,\n bucket.limitCurrency ?? null,\n bucket.fallbackStatus ?? null\n );\n }\n const quotaObservationStatement = this.#database.prepare(\n `INSERT INTO quota_observations (\n provider_id, bucket_id, billing_domain_id, label, used_percent, resets_at,\n authority, observed_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, bucket_id, observed_at) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n label = excluded.label,\n used_percent = excluded.used_percent,\n resets_at = excluded.resets_at,\n authority = excluded.authority`\n );\n for (const bucket of snapshot.quotaBuckets) {\n if (bucket.usedPercent === null) continue;\n quotaObservationStatement.run(\n snapshot.provider.id,\n bucket.id,\n bucket.billingDomainId,\n bucket.label,\n bucket.usedPercent,\n bucket.resetsAt,\n bucket.authority,\n snapshot.observedAt\n );\n }\n\n const usageReconciliation = snapshot.usageReconciliation;\n if (usageReconciliation) {\n const prefixes = [\n ...usageReconciliation.authoritativeIdPrefixes,\n ...usageReconciliation.retiredIdPrefixes\n ];\n if (prefixes.some((prefix) => prefix.length === 0)) {\n throw new Error('Usage reconciliation prefixes must not be empty.');\n }\n if (new Set(prefixes).size !== prefixes.length) {\n throw new Error('Usage reconciliation prefixes must be distinct.');\n }\n\n const storedUsageIdsStatement = this.#database.prepare(\n `SELECT id\n FROM usage_observations\n WHERE provider_id = ? AND substr(id, 1, length(?)) = ?`\n );\n const deleteUsageCostsStatement = this.#database.prepare(\n `DELETE FROM cost_records WHERE provider_id = ? AND usage_observation_id = ?`\n );\n const deleteUsageStatement = this.#database.prepare(\n `DELETE FROM usage_observations WHERE provider_id = ? AND id = ?`\n );\n const deleteStoredUsage = (prefix: string, keepIds: ReadonlySet<string>) => {\n const stored = storedUsageIdsStatement.all(\n snapshot.provider.id,\n prefix,\n prefix\n ) as unknown as Array<{ id: string }>;\n for (const { id } of stored) {\n if (keepIds.has(id)) continue;\n deleteUsageCostsStatement.run(snapshot.provider.id, id);\n deleteUsageStatement.run(snapshot.provider.id, id);\n }\n };\n\n for (const prefix of usageReconciliation.retiredIdPrefixes) {\n deleteStoredUsage(prefix, new Set());\n }\n for (const authoritativePrefix of usageReconciliation.authoritativeIdPrefixes) {\n const incomingAuthoritativeIds = new Set(\n snapshot.usage\n .map((observation) => observation.id)\n .filter((id) => id.startsWith(authoritativePrefix))\n );\n deleteStoredUsage(authoritativePrefix, incomingAuthoritativeIds);\n }\n }\n\n const usageStatement = this.#database.prepare(\n `INSERT INTO usage_observations (\n provider_id, id, billing_domain_id, model, session_id, observed_at,\n total_tokens, input_tokens, output_tokens, reasoning_tokens,\n cache_read_tokens, cache_write_tokens, cache_write_5m_tokens,\n cache_write_1h_tokens, authority,\n source_reported_total_tokens, unclassified_tokens, total_derivation,\n reasoning_semantics, cache_read_semantics, cache_write_semantics,\n model_attribution, time_precision, usage_scope, aggregation_temporality\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n model = excluded.model,\n session_id = excluded.session_id,\n observed_at = excluded.observed_at,\n total_tokens = excluded.total_tokens,\n input_tokens = excluded.input_tokens,\n output_tokens = excluded.output_tokens,\n reasoning_tokens = excluded.reasoning_tokens,\n cache_read_tokens = excluded.cache_read_tokens,\n cache_write_tokens = excluded.cache_write_tokens,\n cache_write_5m_tokens = excluded.cache_write_5m_tokens,\n cache_write_1h_tokens = excluded.cache_write_1h_tokens,\n authority = excluded.authority,\n source_reported_total_tokens = excluded.source_reported_total_tokens,\n unclassified_tokens = excluded.unclassified_tokens,\n total_derivation = excluded.total_derivation,\n reasoning_semantics = excluded.reasoning_semantics,\n cache_read_semantics = excluded.cache_read_semantics,\n cache_write_semantics = excluded.cache_write_semantics,\n model_attribution = excluded.model_attribution,\n time_precision = excluded.time_precision,\n usage_scope = excluded.usage_scope,\n aggregation_temporality = excluded.aggregation_temporality`\n );\n const existingPricedUsageStatement = this.#database.prepare(\n `SELECT billing_domain_id, model, observed_at, total_tokens, input_tokens, output_tokens,\n reasoning_tokens, cache_read_tokens, cache_write_tokens, cache_write_5m_tokens,\n cache_write_1h_tokens, unclassified_tokens,\n reasoning_semantics, cache_read_semantics, cache_write_semantics, model_attribution,\n time_precision, aggregation_temporality\n FROM usage_observations\n WHERE provider_id = ? AND id = ?`\n );\n const deleteDerivedCostsStatement = this.#database.prepare(\n `DELETE FROM cost_records\n WHERE provider_id = ? AND usage_observation_id = ? AND kind = 'retail-equivalent'`\n );\n for (const observation of snapshot.usage) {\n const normalized = normalizeTokenObservation(observation);\n const existing = existingPricedUsageStatement.get(snapshot.provider.id, normalized.id) as\n Record<string, unknown> | undefined;\n if (existing && pricingInputsChanged(existing, normalized)) {\n deleteDerivedCostsStatement.run(snapshot.provider.id, normalized.id);\n }\n usageStatement.run(\n snapshot.provider.id,\n normalized.id,\n normalized.billingDomainId,\n normalized.model?.trim() || '__unclassified__',\n normalized.sessionId ?? null,\n normalized.observedAt,\n normalized.recordedTokens,\n normalized.inputTokens,\n normalized.outputTokens,\n normalized.reasoningTokens,\n normalized.cacheReadTokens,\n normalized.cacheWriteTokens,\n normalized.cacheWriteTokenBreakdown?.fiveMinute ?? null,\n normalized.cacheWriteTokenBreakdown?.oneHour ?? null,\n normalized.authority,\n normalized.sourceReportedTotalTokens,\n normalized.unclassifiedTokens,\n normalized.totalDerivation,\n normalized.tokenSemantics.reasoning,\n normalized.tokenSemantics.cacheRead,\n normalized.tokenSemantics.cacheWrite,\n normalized.modelAttribution,\n normalized.timePrecision,\n normalized.usageScope,\n normalized.aggregationTemporality\n );\n }\n\n const costStatement = this.#database.prepare(\n `INSERT INTO cost_records (\n provider_id, id, source_id, billing_domain_id, observed_at, kind, amount, currency,\n authority, price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency, price_snapshot_rates_json,\n price_snapshot_source_url, price_snapshot_context_tier,\n model, usage_observation_id, priced_tokens,\n line_items_json, calculated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n source_id = excluded.source_id,\n billing_domain_id = excluded.billing_domain_id,\n observed_at = excluded.observed_at,\n kind = excluded.kind,\n amount = excluded.amount,\n currency = excluded.currency,\n authority = excluded.authority,\n price_snapshot_id = excluded.price_snapshot_id,\n price_snapshot_version = excluded.price_snapshot_version,\n price_snapshot_source = excluded.price_snapshot_source,\n price_snapshot_canonical_model = excluded.price_snapshot_canonical_model,\n price_snapshot_effective_at = excluded.price_snapshot_effective_at,\n price_snapshot_effective_until = excluded.price_snapshot_effective_until,\n price_snapshot_currency = excluded.price_snapshot_currency,\n price_snapshot_rates_json = excluded.price_snapshot_rates_json,\n price_snapshot_source_url = excluded.price_snapshot_source_url,\n price_snapshot_context_tier = excluded.price_snapshot_context_tier,\n model = excluded.model,\n usage_observation_id = excluded.usage_observation_id,\n priced_tokens = excluded.priced_tokens,\n line_items_json = excluded.line_items_json,\n calculated_at = excluded.calculated_at\n WHERE cost_records.kind <> 'retail-equivalent'`\n );\n for (const cost of snapshot.costs) {\n const persistedCost = normalizeCostForPersistence(cost);\n costStatement.run(\n snapshot.provider.id,\n persistedCost.id,\n persistedCost.sourceId ?? null,\n persistedCost.billingDomainId,\n persistedCost.observedAt,\n persistedCost.kind,\n persistedCost.amount,\n persistedCost.currency,\n persistedCost.authority,\n persistedCost.priceSnapshot?.id ?? null,\n persistedCost.priceSnapshot?.version ?? null,\n persistedCost.priceSnapshot?.source ?? null,\n persistedCost.priceSnapshot?.canonicalModel ?? null,\n persistedCost.priceSnapshot?.effectiveAt ?? null,\n persistedCost.priceSnapshot?.effectiveUntil ?? null,\n persistedCost.priceSnapshot?.currency ?? null,\n serializePriceRates(persistedCost.priceSnapshot),\n persistedCost.priceSnapshot?.sourceUrl ?? null,\n persistedCost.priceSnapshot?.contextTier ?? null,\n persistedCost.model ?? null,\n persistedCost.usageObservationId ?? null,\n persistedCost.pricedTokens ?? null,\n persistedCost.lineItems ? JSON.stringify(persistedCost.lineItems) : null,\n persistedCost.calculatedAt ?? null\n );\n }\n\n const balanceStatement = this.#database.prepare(\n `INSERT INTO balance_records (\n provider_id, id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n source_id = excluded.source_id,\n billing_domain_id = excluded.billing_domain_id,\n observed_at = excluded.observed_at,\n kind = excluded.kind,\n amount = excluded.amount,\n currency = excluded.currency,\n authority = excluded.authority`\n );\n for (const balance of snapshot.balances ?? []) {\n balanceStatement.run(\n snapshot.provider.id,\n balance.id,\n balance.sourceId ?? null,\n balance.billingDomainId,\n balance.observedAt,\n balance.kind,\n balance.amount,\n balance.currency,\n balance.authority\n );\n }\n\n const invoiceStatement = this.#database.prepare(\n `INSERT INTO invoice_records (\n provider_id, id, billing_domain_id, created_at, number, status, amount, currency, authority\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n created_at = excluded.created_at,\n number = excluded.number,\n status = excluded.status,\n amount = excluded.amount,\n currency = excluded.currency,\n authority = excluded.authority`\n );\n for (const invoice of snapshot.invoices ?? []) {\n invoiceStatement.run(\n snapshot.provider.id,\n invoice.id,\n invoice.billingDomainId,\n invoice.createdAt,\n invoice.number,\n invoice.status,\n invoice.amount,\n invoice.currency,\n invoice.authority\n );\n }\n\n this.#database.exec('COMMIT');\n } catch (error) {\n this.#database.exec('ROLLBACK');\n throw error;\n }\n }\n\n getRetailPricingBackfillSnapshots(): ConnectorSnapshot[] {\n const rows = this.#database\n .prepare(\n `SELECT u.provider_id, p.display_name AS provider_display_name,\n u.id, u.billing_domain_id, b.display_name AS billing_domain_display_name,\n u.model, u.session_id, u.observed_at, u.authority,\n u.total_tokens, u.input_tokens, u.output_tokens, u.reasoning_tokens,\n u.cache_read_tokens, u.cache_write_tokens, u.cache_write_5m_tokens,\n u.cache_write_1h_tokens, u.source_reported_total_tokens,\n u.unclassified_tokens, u.total_derivation, u.model_attribution,\n u.reasoning_semantics, u.cache_read_semantics, u.cache_write_semantics,\n u.time_precision, u.usage_scope, u.aggregation_temporality\n FROM usage_observations u\n JOIN providers p ON p.id = u.provider_id\n JOIN billing_domains b\n ON b.provider_id = u.provider_id AND b.id = u.billing_domain_id\n WHERE ${additiveUsagePredicate('u')}\n ORDER BY u.provider_id, u.observed_at, u.id`\n )\n .all() as unknown as PricingBackfillRow[];\n return pricingBackfillSnapshots(rows);\n }\n\n getRetailPricingBackfillPage(\n cursor: RetailPricingBackfillCursor | null,\n limit: number\n ): RetailPricingBackfillPage {\n const pageSize = Math.max(1, Math.min(1_000, Math.trunc(limit)));\n const cursorPredicate = cursor ? 'AND (u.provider_id, u.observed_at, u.id) > (?, ?, ?)' : '';\n const rows = this.#database\n .prepare(\n `SELECT u.provider_id, p.display_name AS provider_display_name,\n u.id, u.billing_domain_id, b.display_name AS billing_domain_display_name,\n u.model, u.session_id, u.observed_at, u.authority,\n u.total_tokens, u.input_tokens, u.output_tokens, u.reasoning_tokens,\n u.cache_read_tokens, u.cache_write_tokens, u.cache_write_5m_tokens,\n u.cache_write_1h_tokens, u.source_reported_total_tokens,\n u.unclassified_tokens, u.total_derivation, u.model_attribution,\n u.reasoning_semantics, u.cache_read_semantics, u.cache_write_semantics,\n u.time_precision, u.usage_scope, u.aggregation_temporality\n FROM usage_observations u\n JOIN providers p ON p.id = u.provider_id\n JOIN billing_domains b\n ON b.provider_id = u.provider_id AND b.id = u.billing_domain_id\n WHERE ${additiveUsagePredicate('u')}\n ${cursorPredicate}\n ORDER BY u.provider_id, u.observed_at, u.id\n LIMIT ?`\n )\n .all(\n ...(cursor ? [cursor.providerId, cursor.observedAt, cursor.observationId] : []),\n pageSize\n ) as unknown as PricingBackfillRow[];\n const last = rows.at(-1);\n return {\n snapshots: pricingBackfillSnapshots(rows),\n nextCursor:\n rows.length === pageSize && last\n ? {\n providerId: last.provider_id,\n observedAt: last.observed_at,\n observationId: last.id\n }\n : null\n };\n }\n\n saveDerivedCosts(providerId: string, costs: CostRecord[]): void {\n if (costs.length === 0) return;\n if (costs.some((cost) => cost.kind !== 'retail-equivalent')) {\n throw new Error('Only retail-equivalent costs can be saved through the derivation seam.');\n }\n const statement = this.#database.prepare(\n `INSERT INTO cost_records (\n provider_id, id, source_id, billing_domain_id, observed_at, kind, amount, currency,\n authority, price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency, price_snapshot_rates_json,\n price_snapshot_source_url, price_snapshot_context_tier,\n model, usage_observation_id, priced_tokens, line_items_json, calculated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n amount = excluded.amount,\n price_snapshot_rates_json = excluded.price_snapshot_rates_json,\n line_items_json = excluded.line_items_json,\n calculated_at = excluded.calculated_at`\n );\n this.#database.exec('BEGIN IMMEDIATE');\n try {\n for (const cost of costs) {\n statement.run(\n providerId,\n cost.id,\n cost.sourceId ?? null,\n cost.billingDomainId,\n cost.observedAt,\n cost.kind,\n cost.amount,\n cost.currency,\n cost.authority,\n cost.priceSnapshot?.id ?? null,\n cost.priceSnapshot?.version ?? null,\n cost.priceSnapshot?.source ?? null,\n cost.priceSnapshot?.canonicalModel ?? null,\n cost.priceSnapshot?.effectiveAt ?? null,\n cost.priceSnapshot?.effectiveUntil ?? null,\n cost.priceSnapshot?.currency ?? null,\n serializePriceRates(cost.priceSnapshot),\n cost.priceSnapshot?.sourceUrl ?? null,\n cost.priceSnapshot?.contextTier ?? null,\n cost.model ?? null,\n cost.usageObservationId ?? null,\n cost.pricedTokens ?? null,\n cost.lineItems ? JSON.stringify(cost.lineItems) : null,\n cost.calculatedAt ?? null\n );\n }\n this.#database.exec('COMMIT');\n } catch (error) {\n this.#database.exec('ROLLBACK');\n throw error;\n }\n }\n\n recordFailure(\n provider: { id: string; displayName: string },\n failedAt: string,\n failure: { code: string; message: string; recovery: string }\n ): void {\n this.#database\n .prepare(\n `INSERT INTO providers (\n id, display_name, last_success_at, last_error, last_failure_at,\n last_error_code, last_recovery\n ) VALUES (?, ?, NULL, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n display_name = excluded.display_name,\n last_error = excluded.last_error,\n last_failure_at = excluded.last_failure_at,\n last_error_code = excluded.last_error_code,\n last_recovery = excluded.last_recovery`\n )\n .run(\n provider.id,\n provider.displayName,\n failure.message,\n failedAt,\n failure.code,\n failure.recovery\n );\n }\n\n getOverview(now: Date, query: UsageQuery = {}): UsageOverview {\n const providers = this.#database\n .prepare(\n `SELECT id, display_name, last_success_at, last_error, last_error_code, last_recovery\n FROM providers ORDER BY id`\n )\n .all() as unknown as ProviderRow[];\n\n const visibleProviders = this.#hideDemoProvider\n ? providers.filter((provider) => provider.id !== 'demo')\n : providers;\n const overviews = visibleProviders.map((provider) =>\n this.#getProviderOverview(provider, now, query)\n );\n const riskSummary = buildRiskSummary(overviews);\n const planSubscriptions = this.getPlanSubscriptions();\n const overview: UsageOverview = {\n generatedAt: now.toISOString(),\n globalSummary: buildGlobalSummary(overviews, riskSummary, now, query),\n workbench: buildTokenMoneyWorkbench(\n overviews,\n now,\n query,\n planSubscriptions,\n this.#planBillingPeriodSummaries(planSubscriptions, now, query)\n ),\n providers: overviews,\n riskSummary\n };\n if (!query.auditEvidence) dropAuditEvidence(overviews);\n return overview;\n }\n\n getAgentProviderIndex(now: Date): AgentProviderIndex {\n const providers = this.#database\n .prepare('SELECT id, display_name FROM providers ORDER BY id')\n .all() as unknown as Array<Pick<ProviderRow, 'id' | 'display_name'>>;\n return {\n generatedAt: now.toISOString(),\n providers: providers\n .filter(\n (provider) =>\n provider.id !== 'opencode' &&\n provider.id !== 'dsh' &&\n (!this.#hideDemoProvider || provider.id !== 'demo')\n )\n .map((provider) => ({ id: provider.id, displayName: provider.display_name }))\n };\n }\n\n getProviderOverview(\n now: Date,\n providerId: string,\n query: UsageQuery = {}\n ): ProviderOverview | null {\n if (this.#hideDemoProvider && providerId === 'demo') return null;\n const provider = this.#database\n .prepare(\n `SELECT id, display_name, last_success_at, last_error, last_error_code, last_recovery\n FROM providers WHERE id = ?`\n )\n .get(providerId) as unknown as ProviderRow | undefined;\n if (!provider) return null;\n const overview = this.#getProviderOverview(provider, now, query);\n if (!query.auditEvidence) dropAuditEvidence([overview]);\n return overview;\n }\n\n saveExchangeRateSnapshot(snapshot: ExchangeRateSnapshot): void {\n this.#database\n .prepare(\n `INSERT INTO exchange_rate_snapshots (\n id, base_currency, quote_currency, rate, observed_at, source\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n base_currency = excluded.base_currency,\n quote_currency = excluded.quote_currency,\n rate = excluded.rate,\n observed_at = excluded.observed_at,\n source = excluded.source`\n )\n .run(\n snapshot.id,\n snapshot.baseCurrency.toUpperCase(),\n snapshot.quoteCurrency.toUpperCase(),\n snapshot.rate,\n snapshot.observedAt,\n snapshot.source\n );\n }\n\n getConnectorRuntimeStates(): ConnectorRuntimeState[] {\n const rows = this.#database\n .prepare(\n `SELECT id, last_attempt_at, next_allowed_at, failure_count, outcome\n FROM connector_runtime ORDER BY id`\n )\n .all() as unknown as ConnectorRuntimeRow[];\n return rows.map((row) => ({\n id: row.id,\n lastAttemptAt: row.last_attempt_at,\n nextAllowedAt: row.next_allowed_at,\n failureCount: row.failure_count,\n outcome: row.outcome\n }));\n }\n\n saveConnectorRuntimeState(state: ConnectorRuntimeState): void {\n this.#database\n .prepare(\n `INSERT INTO connector_runtime (\n id, last_attempt_at, next_allowed_at, failure_count, outcome\n ) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n last_attempt_at = excluded.last_attempt_at,\n next_allowed_at = excluded.next_allowed_at,\n failure_count = excluded.failure_count,\n outcome = excluded.outcome`\n )\n .run(state.id, state.lastAttemptAt, state.nextAllowedAt, state.failureCount, state.outcome);\n }\n\n getMonitoringSettings(): MonitoringSettings {\n const row = this.#database\n .prepare(\n `SELECT background_collection_enabled, interval_minutes, notifications_enabled,\n start_at_login FROM monitoring_settings WHERE id = 1`\n )\n .get() as unknown as\n | {\n background_collection_enabled: number;\n interval_minutes: number;\n notifications_enabled: number;\n start_at_login: number;\n }\n | undefined;\n return row\n ? {\n backgroundCollectionEnabled: row.background_collection_enabled === 1,\n intervalMinutes: row.interval_minutes,\n notificationsEnabled: row.notifications_enabled === 1,\n startAtLogin: row.start_at_login === 1\n }\n : defaultMonitoringSettings();\n }\n\n saveMonitoringSettings(settings: MonitoringSettings): void {\n this.#database\n .prepare(\n `INSERT INTO monitoring_settings (\n id, background_collection_enabled, interval_minutes, notifications_enabled,\n start_at_login\n ) VALUES (1, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n background_collection_enabled = excluded.background_collection_enabled,\n interval_minutes = excluded.interval_minutes,\n notifications_enabled = excluded.notifications_enabled,\n start_at_login = excluded.start_at_login`\n )\n .run(\n settings.backgroundCollectionEnabled ? 1 : 0,\n settings.intervalMinutes,\n settings.notificationsEnabled ? 1 : 0,\n settings.startAtLogin ? 1 : 0\n );\n }\n\n getPlanSubscriptions(): PlanSubscription[] {\n const rows = this.#database\n .prepare(\n `SELECT provider_id, billing_domain_id, plan_id, display_name, amount, currency,\n billing_period, anchor_date, price_source, updated_at\n FROM plan_subscriptions\n ORDER BY provider_id, billing_domain_id`\n )\n .all() as unknown as Array<{\n provider_id: string;\n billing_domain_id: string;\n plan_id: string | null;\n display_name: string;\n amount: number;\n currency: string;\n billing_period: string;\n anchor_date: string | null;\n price_source: string;\n updated_at: string;\n }>;\n return rows.map((row) => ({\n providerId: row.provider_id,\n billingDomainId: row.billing_domain_id,\n planId: row.plan_id,\n displayName: row.display_name,\n amount: row.amount,\n currency: row.currency,\n billingPeriod: row.billing_period as PlanBillingPeriod,\n anchorDate: row.anchor_date,\n priceSource: row.price_source as PlanPriceSource,\n updatedAt: row.updated_at\n }));\n }\n\n savePlanSubscription(subscription: PlanSubscription): void {\n this.#database\n .prepare(\n `INSERT INTO plan_subscriptions (\n provider_id, billing_domain_id, plan_id, display_name, amount, currency,\n billing_period, anchor_date, price_source, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, billing_domain_id) DO UPDATE SET\n plan_id = excluded.plan_id,\n display_name = excluded.display_name,\n amount = excluded.amount,\n currency = excluded.currency,\n billing_period = excluded.billing_period,\n anchor_date = excluded.anchor_date,\n price_source = excluded.price_source,\n updated_at = excluded.updated_at`\n )\n .run(\n subscription.providerId,\n subscription.billingDomainId,\n subscription.planId,\n subscription.displayName,\n subscription.amount,\n subscription.currency,\n subscription.billingPeriod,\n subscription.anchorDate,\n subscription.priceSource,\n subscription.updatedAt\n );\n }\n\n deletePlanSubscription(providerId: string, billingDomainId: string): void {\n this.#database\n .prepare('DELETE FROM plan_subscriptions WHERE provider_id = ? AND billing_domain_id = ?')\n .run(providerId, billingDomainId);\n }\n\n getCustomModelRates(): CustomModelRate[] {\n const rows = this.#database\n .prepare(\n `SELECT id, provider_id, billing_domain_id, model,\n input_rate, output_rate, cache_read_rate, updated_at\n FROM custom_model_rates\n ORDER BY updated_at DESC`\n )\n .all() as Array<{\n id: string;\n provider_id: string;\n billing_domain_id: string | null;\n model: string;\n input_rate: number;\n output_rate: number;\n cache_read_rate: number;\n updated_at: string;\n }>;\n return rows.map((row) => ({\n id: row.id,\n providerId: row.provider_id,\n billingDomainId: row.billing_domain_id ?? null,\n model: row.model,\n ratesPerMillion: {\n input: row.input_rate,\n output: row.output_rate,\n cacheRead: row.cache_read_rate\n },\n updatedAt: row.updated_at\n }));\n }\n\n getCustomModelRate(id: string): CustomModelRate | null {\n const row = this.#database\n .prepare(\n `SELECT id, provider_id, billing_domain_id, model,\n input_rate, output_rate, cache_read_rate, updated_at\n FROM custom_model_rates\n WHERE id = ?`\n )\n .get(id) as\n | {\n id: string;\n provider_id: string;\n billing_domain_id: string | null;\n model: string;\n input_rate: number;\n output_rate: number;\n cache_read_rate: number;\n updated_at: string;\n }\n | undefined;\n if (!row) return null;\n return {\n id: row.id,\n providerId: row.provider_id,\n billingDomainId: row.billing_domain_id ?? null,\n model: row.model,\n ratesPerMillion: {\n input: row.input_rate,\n output: row.output_rate,\n cacheRead: row.cache_read_rate\n },\n updatedAt: row.updated_at\n };\n }\n\n saveCustomModelRate(rate: CustomModelRate): void {\n const byId = this.#database\n .prepare('SELECT id FROM custom_model_rates WHERE id = ?')\n .get(rate.id) as { id: string } | undefined;\n const byKey = this.#database\n .prepare(\n `SELECT id FROM custom_model_rates\n WHERE provider_id = ? AND COALESCE(billing_domain_id, '') = COALESCE(?, '') AND lower(model) = lower(?)`\n )\n .get(rate.providerId, rate.billingDomainId, rate.model) as { id: string } | undefined;\n\n if (byId && byKey && byId.id !== byKey.id) {\n this.#database.prepare('DELETE FROM custom_model_rates WHERE id = ?').run(byKey.id);\n }\n\n const existingId = byId?.id ?? byKey?.id;\n\n if (existingId) {\n this.#database\n .prepare(\n `UPDATE custom_model_rates SET\n provider_id = ?, billing_domain_id = ?, model = ?,\n input_rate = ?, output_rate = ?, cache_read_rate = ?, updated_at = ?\n WHERE id = ?`\n )\n .run(\n rate.providerId,\n rate.billingDomainId,\n rate.model,\n rate.ratesPerMillion.input,\n rate.ratesPerMillion.output,\n rate.ratesPerMillion.cacheRead,\n rate.updatedAt,\n existingId\n );\n } else {\n this.#database\n .prepare(\n `INSERT INTO custom_model_rates (\n id, provider_id, billing_domain_id, model,\n input_rate, output_rate, cache_read_rate, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n rate.id,\n rate.providerId,\n rate.billingDomainId,\n rate.model,\n rate.ratesPerMillion.input,\n rate.ratesPerMillion.output,\n rate.ratesPerMillion.cacheRead,\n rate.updatedAt\n );\n }\n }\n\n deleteCustomModelRate(id: string): boolean {\n const result = this.#database.prepare('DELETE FROM custom_model_rates WHERE id = ?').run(id);\n return result.changes > 0;\n }\n\n getNotificationState(key: string): string | null {\n const row = this.#database\n .prepare('SELECT value FROM notification_state WHERE key = ?')\n .get(key) as unknown as { value: string } | undefined;\n return row?.value ?? null;\n }\n\n saveNotificationState(key: string, value: string): void {\n this.#database\n .prepare(\n `INSERT INTO notification_state (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n )\n .run(key, value);\n }\n\n saveConnectorDiagnostic(diagnostic: ConnectorDiagnostic): void {\n this.#database\n .prepare(\n `INSERT INTO connector_diagnostics (\n id, provider_id, billing_domain_id, status, category, message, recovery,\n affected_coverage, last_attempt_at, last_success_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n provider_id = excluded.provider_id,\n billing_domain_id = excluded.billing_domain_id,\n status = excluded.status,\n category = excluded.category,\n message = excluded.message,\n recovery = excluded.recovery,\n affected_coverage = excluded.affected_coverage,\n last_attempt_at = excluded.last_attempt_at,\n last_success_at = excluded.last_success_at`\n )\n .run(\n diagnostic.id,\n diagnostic.providerId,\n diagnostic.billingDomainId,\n diagnostic.status,\n diagnostic.category,\n diagnostic.message,\n diagnostic.recovery,\n JSON.stringify(diagnostic.affectedCoverage),\n diagnostic.lastAttemptAt,\n diagnostic.lastSuccessAt\n );\n }\n\n deleteConnectorDiagnostic(id: string): void {\n this.#database.prepare('DELETE FROM connector_diagnostics WHERE id = ?').run(id);\n }\n\n getConnectorDiagnostics(): ConnectorDiagnostic[] {\n const rows = this.#database\n .prepare(\n `SELECT id, provider_id, billing_domain_id, status, category, message, recovery,\n affected_coverage, last_attempt_at, last_success_at\n FROM connector_diagnostics ORDER BY id`\n )\n .all() as unknown as ConnectorDiagnosticRow[];\n return rows.map((row) => ({\n id: row.id,\n providerId: row.provider_id,\n billingDomainId: row.billing_domain_id,\n status: row.status,\n category: row.category,\n message: row.message,\n recovery: row.recovery,\n affectedCoverage: JSON.parse(\n row.affected_coverage\n ) as ConnectorDiagnostic['affectedCoverage'],\n lastAttemptAt: row.last_attempt_at,\n lastSuccessAt: row.last_success_at\n }));\n }\n\n saveConnectorStatus(status: ConnectorStatusRecord): void {\n this.#database\n .prepare(\n `INSERT INTO connector_settings (\n id, state, installed, binary_path, official_credential_present,\n error_code, last_discovered_at, secret_reference\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n state = excluded.state,\n installed = excluded.installed,\n binary_path = excluded.binary_path,\n official_credential_present = excluded.official_credential_present,\n error_code = excluded.error_code,\n last_discovered_at = excluded.last_discovered_at,\n secret_reference = excluded.secret_reference`\n )\n .run(\n status.id,\n status.state,\n status.installed ? 1 : 0,\n status.binaryPath,\n status.officialCredentialPresent ? 1 : 0,\n status.errorCode,\n status.lastDiscoveredAt,\n status.secretReference\n );\n }\n\n getConnectorStatuses(): ConnectorStatusRecord[] {\n const rows = this.#database\n .prepare(\n `SELECT id, state, installed, binary_path, official_credential_present,\n error_code, last_discovered_at, secret_reference\n FROM connector_settings ORDER BY id`\n )\n .all() as unknown as ConnectorStatusRow[];\n return rows.map((row) => ({\n id: row.id,\n state: row.state,\n installed: row.installed === 1,\n binaryPath: row.binary_path,\n officialCredentialPresent: row.official_credential_present === 1,\n errorCode: row.error_code,\n lastDiscoveredAt: row.last_discovered_at,\n secretReference: row.secret_reference\n }));\n }\n\n getProviderAccountIdentifiers(): Record<string, string> {\n const rows = this.#database\n .prepare('SELECT id, account_identifier FROM providers WHERE account_identifier IS NOT NULL')\n .all() as unknown as Array<{ id: string; account_identifier: string }>;\n return Object.fromEntries(rows.map((row) => [row.id, row.account_identifier]));\n }\n\n compactUsageHistory(now: Date): RetentionStatus {\n const cutoff = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000).toISOString();\n this.#database.exec('BEGIN IMMEDIATE');\n try {\n this.#database.prepare(RETENTION_AGGREGATE_SQL).run(cutoff);\n this.#database.prepare('DELETE FROM usage_observations WHERE observed_at < ?').run(cutoff);\n this.#database\n .prepare(\n `INSERT INTO retention_state (id, last_compacted_at) VALUES (1, ?)\n ON CONFLICT(id) DO UPDATE SET last_compacted_at = excluded.last_compacted_at`\n )\n .run(now.toISOString());\n this.#database.exec('COMMIT');\n } catch (error) {\n this.#database.exec('ROLLBACK');\n throw error;\n }\n return this.getRetentionStatus();\n }\n\n getRetentionStatus(): RetentionStatus {\n const raw = this.#database\n .prepare('SELECT COUNT(*) AS count, MIN(observed_at) AS oldest FROM usage_observations')\n .get() as unknown as { count: number; oldest: string | null };\n const aggregates = this.#database\n .prepare('SELECT COUNT(*) AS count FROM daily_usage_aggregates')\n .get() as unknown as { count: number };\n const state = this.#database\n .prepare('SELECT last_compacted_at FROM retention_state WHERE id = 1')\n .get() as unknown as { last_compacted_at: string | null } | undefined;\n return {\n rawRetentionDays: 90,\n rawObservations: Number(raw.count),\n oldestRawObservedAt: raw.oldest,\n dailyAggregates: Number(aggregates.count),\n lastCompactedAt: state?.last_compacted_at ?? null\n };\n }\n\n clearUsageData(): void {\n this.#database.exec('BEGIN IMMEDIATE');\n try {\n this.#database.exec(`\n DELETE FROM connector_diagnostics;\n DELETE FROM connector_runtime;\n DELETE FROM notification_state;\n DELETE FROM exchange_rate_snapshots;\n DELETE FROM providers;\n DELETE FROM retention_state;\n `);\n this.#database.exec('COMMIT');\n } catch (error) {\n this.#database.exec('ROLLBACK');\n throw error;\n }\n }\n\n async deleteDemoProviderDataAsync(): Promise<void> {\n await runDatabaseWorker<void>({\n databasePath: this.#databasePath,\n operation: 'delete-demo-data',\n deleteDemoDataSql: DELETE_DEMO_PROVIDER_DATA_SQL\n });\n }\n\n deleteDerivedRetailCosts(): void {\n this.#database.prepare(DELETE_DERIVED_RETAIL_COSTS_SQL).run();\n }\n\n async deleteDerivedRetailCostsAsync(): Promise<void> {\n await runDatabaseWorker<void>({\n databasePath: this.#databasePath,\n operation: 'delete-derived-costs',\n deleteDerivedCostsSql: DELETE_DERIVED_RETAIL_COSTS_SQL\n });\n }\n\n getApplicationState(key: string): string | null {\n const row = this.#database\n .prepare('SELECT value FROM application_state WHERE key = ?')\n .get(key) as { value: string } | undefined;\n return row?.value ?? null;\n }\n\n saveApplicationState(key: string, value: string): void {\n this.#database\n .prepare(\n `INSERT INTO application_state (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n )\n .run(key, value);\n }\n\n async ensureQueryIndexes(): Promise<void> {\n await runDatabaseWorker<void>({\n databasePath: this.#databasePath,\n operation: 'indexes',\n indexesSql: QUERY_INDEXES_SQL\n });\n }\n\n async maintainUsageHistory(now: Date): Promise<RetentionStatus> {\n const cutoff = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000).toISOString();\n return runDatabaseWorker<RetentionStatus>({\n databasePath: this.#databasePath,\n operation: 'retention',\n indexesSql: QUERY_INDEXES_SQL,\n aggregateSql: RETENTION_AGGREGATE_SQL,\n cutoff,\n now: now.toISOString()\n });\n }\n\n close(): void {\n this.#database.close();\n }\n\n #getProviderOverview(provider: ProviderRow, now: Date, query: UsageQuery): ProviderOverview {\n const forecastAnalysis = this.#getQuotaForecasts(provider.id, now);\n const degradedDiagnostics = this.#database\n .prepare(\n `SELECT id, provider_id, billing_domain_id, status, category, message, recovery,\n affected_coverage, last_attempt_at, last_success_at\n FROM connector_diagnostics\n WHERE provider_id = ? AND status = 'degraded'\n ORDER BY id`\n )\n .all(provider.id) as unknown as ConnectorDiagnosticRow[];\n const domainRows = this.#database\n .prepare(\n `SELECT id, display_name, last_success_at\n FROM billing_domains WHERE provider_id = ? ORDER BY id`\n )\n .all(provider.id) as unknown as BillingDomainRow[];\n const summaryBillingDomainId = selectSummaryBillingDomainId(provider.id, domainRows);\n const billingDomains = domainRows.map((domain) =>\n this.#getBillingDomainOverview(\n provider.id,\n domain,\n now,\n query,\n forecastAnalysis.forecasts.filter((forecast) => forecast.billingDomainId === domain.id),\n forecastAnalysis.coverageByDomain.get(domain.id) ?? 'insufficient',\n degradedDiagnostics.find((diagnostic) => diagnostic.billing_domain_id === domain.id),\n domainRows.length === 1 ? provider : null\n )\n );\n const summaryDomain = billingDomains.find((domain) => domain.id === summaryBillingDomainId);\n const emptyTotals = zeroTokenTotals();\n const emptyEvidence = finishTokenEvidence(emptyTokenEvidence());\n const emptyCoverage: ProviderOverview['coverage'] = {\n quota: 'unavailable',\n tokens: 'unavailable',\n actualCost: 'unavailable',\n history: 'unavailable'\n };\n const providerFallbackHealth: ProviderOverview['health'] = provider.last_error\n ? {\n status: 'degraded',\n errorCode: provider.last_error_code,\n message: provider.last_error,\n recovery: provider.last_recovery\n }\n : { status: 'healthy', errorCode: null, message: null, recovery: null };\n\n let providerTokenTotals = summaryDomain?.tokenTotals ?? emptyTotals;\n let providerTokenEvidence = summaryDomain?.tokenEvidence ?? emptyEvidence;\n if ((provider.id === 'dsh' || provider.id === 'grok') && billingDomains.length > 1) {\n const combinedTotals = zeroTokenTotals();\n const combinedEvidence = emptyTokenEvidence();\n for (const d of billingDomains) {\n if (provider.id === 'grok' && d.id === 'xai-api') continue;\n combinedTotals.total += d.tokenTotals.total;\n combinedTotals.input += d.tokenTotals.input;\n combinedTotals.output += d.tokenTotals.output;\n combinedTotals.reasoning += d.tokenTotals.reasoning;\n combinedTotals.cacheRead += d.tokenTotals.cacheRead;\n combinedTotals.cacheWrite += d.tokenTotals.cacheWrite;\n addAggregatedTokenEvidence(combinedEvidence, d.tokenEvidence);\n }\n providerTokenTotals = combinedTotals;\n providerTokenEvidence = finishTokenEvidence(combinedEvidence);\n }\n\n return {\n id: provider.id,\n displayName: provider.display_name,\n summaryBillingDomainId,\n freshness: summaryDomain?.freshness ?? {\n status: freshnessStatus(provider.last_success_at, now),\n lastSuccessAt: provider.last_success_at\n },\n health: summaryDomain?.health ?? providerFallbackHealth,\n coverage: summaryDomain?.coverage ?? emptyCoverage,\n quotaBuckets: summaryDomain?.quotaBuckets ?? [],\n tokenTotals: providerTokenTotals,\n tokenEvidence: providerTokenEvidence,\n tokenAuthority: summaryDomain?.tokenAuthority ?? null,\n billingDomains,\n forecasts: summaryDomain?.forecasts ?? [],\n forecastCoverage: summaryDomain?.forecastCoverage ?? 'insufficient'\n };\n }\n\n #getBillingDomainOverview(\n providerId: string,\n domain: BillingDomainRow,\n now: Date,\n query: UsageQuery,\n forecasts: QuotaForecast[],\n forecastCoverage: ProviderOverview['forecastCoverage'],\n degradedDiagnostic?: ConnectorDiagnosticRow,\n legacyProviderFailure: ProviderRow | null = null\n ): BillingDomainOverview {\n const quotaRows = this.#database\n .prepare(\n `SELECT id, billing_domain_id, label, used_percent, window_duration_minutes, resets_at,\n authority, observed_at,\n scope, status, limit_amount, limit_currency, fallback_status\n FROM quota_buckets WHERE provider_id = ? AND billing_domain_id = ? ORDER BY id`\n )\n .all(providerId, domain.id) as unknown as QuotaRow[];\n const tokens = this.#database\n .prepare(\n `SELECT COALESCE(SUM(total_tokens), 0) AS total_tokens,\n COALESCE(SUM(input_tokens), 0) AS input_tokens,\n COALESCE(SUM(output_tokens), 0) AS output_tokens,\n COALESCE(SUM(reasoning_tokens), 0) AS reasoning_tokens,\n COALESCE(SUM(cache_read_tokens), 0) AS cache_read_tokens,\n COALESCE(SUM(cache_write_tokens), 0) AS cache_write_tokens,\n COUNT(*) AS observation_count,\n COALESCE(SUM(source_reported_total_tokens), 0) AS source_reported_tokens,\n SUM(CASE WHEN source_reported_total_tokens IS NOT NULL THEN 1 ELSE 0 END)\n AS source_reported_observation_count,\n COALESCE(SUM(unclassified_tokens), 0) AS unclassified_tokens,\n GROUP_CONCAT(DISTINCT total_derivation) AS total_derivations,\n GROUP_CONCAT(DISTINCT time_precision) AS time_precisions,\n GROUP_CONCAT(DISTINCT usage_scope) AS usage_scopes,\n GROUP_CONCAT(DISTINCT aggregation_temporality) AS aggregation_temporalities,\n GROUP_CONCAT(DISTINCT authority) AS authorities\n FROM usage_observations\n WHERE provider_id = ? AND billing_domain_id = ? AND ${additiveUsagePredicate()}`\n )\n .get(providerId, domain.id) as unknown as TokenRow;\n // The whole ledger is audit evidence and is read only when a caller asked for it.\n // A Dashboard response reads the windowed summary in `history.costs` instead, so\n // reading and mapping every retained cost record would be work nobody displays.\n const costs = query.auditEvidence\n ? (this.#database\n .prepare(\n `SELECT id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority,\n price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency,\n price_snapshot_rates_json, price_snapshot_source_url,\n price_snapshot_context_tier, model, usage_observation_id, priced_tokens,\n line_items_json, calculated_at\n FROM cost_records WHERE provider_id = ? AND billing_domain_id = ? ORDER BY observed_at DESC, id`\n )\n .all(providerId, domain.id) as unknown as CostRow[])\n : null;\n const lastCostObservedAt =\n (\n this.#database\n .prepare(\n `SELECT MAX(observed_at) AS observed_at FROM cost_records\n WHERE provider_id = ? AND billing_domain_id = ?`\n )\n .get(providerId, domain.id) as unknown as { observed_at: string | null }\n ).observed_at ?? null;\n const balances = this.#database\n .prepare(\n `SELECT id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority\n FROM balance_records WHERE provider_id = ? AND billing_domain_id = ? ORDER BY observed_at DESC, id`\n )\n .all(providerId, domain.id) as unknown as BalanceRow[];\n const invoices = this.#database\n .prepare(\n `SELECT id, billing_domain_id, created_at, number, status, amount, currency, authority\n FROM invoice_records WHERE provider_id = ? AND billing_domain_id = ? ORDER BY created_at DESC, id`\n )\n .all(providerId, domain.id) as unknown as InvoiceRow[];\n const actualCostCount = Number(\n (\n this.#database\n .prepare(\n `SELECT COUNT(*) AS count FROM cost_records\n WHERE provider_id = ? AND billing_domain_id = ? AND kind = 'actual'`\n )\n .get(providerId, domain.id) as unknown as { count: number }\n ).count\n );\n const nonAdditiveTokenCount = this.#database\n .prepare(\n `SELECT COUNT(*) AS count FROM usage_observations\n WHERE provider_id = ? AND billing_domain_id = ?\n AND NOT (${additiveUsagePredicate()})`\n )\n .get(providerId, domain.id) as unknown as { count: number };\n const degraded = degradedDiagnostic || legacyProviderFailure?.last_error;\n return {\n id: domain.id,\n displayName: domain.display_name,\n freshness: {\n status: freshnessStatus(domain.last_success_at, now),\n lastSuccessAt: domain.last_success_at\n },\n health: {\n status: degraded ? 'degraded' : 'healthy',\n errorCode: degradedDiagnostic?.category ?? legacyProviderFailure?.last_error_code ?? null,\n message: degradedDiagnostic?.message ?? legacyProviderFailure?.last_error ?? null,\n recovery: degradedDiagnostic?.recovery ?? legacyProviderFailure?.last_recovery ?? null\n },\n coverage: {\n quota: coverageFromCount(quotaRows.length),\n tokens: tokenCoverage(tokens, Number(nonAdditiveTokenCount.count)),\n actualCost: coverageFromCount(actualCostCount),\n history: tokenCoverage(tokens, Number(nonAdditiveTokenCount.count))\n },\n quotaBuckets: quotaRows.map(mapQuotaRow),\n tokenTotals: mapTokenTotals(tokens),\n tokenEvidence: mapTokenEvidence(tokens),\n tokenAuthority: tokenAuthority(tokens.authorities),\n ...(costs\n ? {\n costs: costs.map((row) => ({\n id: row.id,\n sourceId: row.source_id,\n billingDomainId: row.billing_domain_id,\n observedAt: row.observed_at,\n kind: row.kind,\n amount: row.amount,\n currency: row.currency,\n authority: row.authority,\n priceSnapshot: priceSnapshotFromRow(row),\n model: row.model,\n usageObservationId: row.usage_observation_id,\n pricedTokens: row.priced_tokens,\n lineItems: parseLineItems(row.line_items_json),\n calculatedAt: row.calculated_at\n }))\n }\n : {}),\n lastCostObservedAt,\n balances: balances.map((row) => ({\n id: row.id,\n sourceId: row.source_id,\n billingDomainId: row.billing_domain_id,\n observedAt: row.observed_at,\n kind: row.kind,\n amount: row.amount,\n currency: row.currency,\n authority: row.authority\n })),\n invoices: invoices.map((row) => ({\n id: row.id,\n billingDomainId: row.billing_domain_id,\n createdAt: row.created_at,\n number: row.number,\n status: row.status,\n amount: row.amount,\n currency: row.currency,\n authority: row.authority\n })),\n history: this.#getBillingHistory(providerId, domain.id, now, query),\n forecasts,\n forecastCoverage\n };\n }\n\n #getQuotaForecasts(\n providerId: string,\n now: Date\n ): {\n forecasts: QuotaForecast[];\n coverageByDomain: Map<string, ProviderOverview['forecastCoverage']>;\n } {\n const rows = this.#database\n .prepare(\n `SELECT bucket_id, billing_domain_id, label, used_percent, resets_at, observed_at\n FROM quota_observations\n WHERE provider_id = ? AND observed_at >= ? AND observed_at <= ?\n ORDER BY bucket_id, observed_at`\n )\n .all(\n providerId,\n new Date(now.getTime() - 24 * 60 * 60 * 1000).toISOString(),\n now.toISOString()\n ) as unknown as QuotaObservationRow[];\n const grouped = new Map<string, QuotaObservationRow[]>();\n for (const row of rows) {\n const group = grouped.get(row.bucket_id) ?? [];\n group.push(row);\n grouped.set(row.bucket_id, group);\n }\n const forecasts: QuotaForecast[] = [];\n const discontinuousDomains = new Set<string>();\n const staleDomains = new Set<string>();\n const observedDomains = new Set(rows.map((row) => row.billing_domain_id));\n for (const samples of grouped.values()) {\n const latest = samples.at(-1)!;\n if (now.getTime() - new Date(latest.observed_at).getTime() > FRESHNESS_WINDOW_MS) {\n staleDomains.add(latest.billing_domain_id);\n continue;\n }\n let segmentStart = 0;\n for (let index = 1; index < samples.length; index += 1) {\n if (samples[index].used_percent < samples[index - 1].used_percent) segmentStart = index;\n }\n const segment = samples.slice(segmentStart);\n if (segment.length < 3) continue;\n const gaps = segment\n .slice(1)\n .map(\n (sample, index) =>\n new Date(sample.observed_at).getTime() - new Date(segment[index].observed_at).getTime()\n );\n if (gaps.some((gap) => gap > 2 * 60 * 60 * 1000)) {\n discontinuousDomains.add(latest.billing_domain_id);\n continue;\n }\n const first = segment[0];\n const last = segment.at(-1)!;\n const hours =\n (new Date(last.observed_at).getTime() - new Date(first.observed_at).getTime()) /\n (60 * 60 * 1000);\n if (hours < 0.5 || !last.resets_at) continue;\n const burnRate = (last.used_percent - first.used_percent) / hours;\n const resetTime = new Date(last.resets_at).getTime();\n if (burnRate <= 0 || resetTime <= now.getTime()) continue;\n const remaining = Math.max(0, 100 - last.used_percent);\n const predicted = new Date(now.getTime() + (remaining / burnRate) * 60 * 60 * 1000);\n forecasts.push({\n billingDomainId: last.billing_domain_id,\n bucketId: last.bucket_id,\n label: last.label,\n remainingPercent: remaining,\n resetsAt: last.resets_at,\n burnRatePercentPerHour: round(burnRate),\n predictedExhaustionAt: predicted.toISOString(),\n willLastUntilReset: predicted.getTime() >= resetTime,\n confidence: hours >= 2 ? 'high' : 'medium',\n evidence: {\n windowStart: first.observed_at,\n windowEnd: last.observed_at,\n samples: segment.length,\n continuous: true\n }\n });\n }\n const coverageByDomain = new Map<string, ProviderOverview['forecastCoverage']>();\n for (const domainId of observedDomains) {\n coverageByDomain.set(\n domainId,\n forecasts.some((forecast) => forecast.billingDomainId === domainId)\n ? 'complete'\n : discontinuousDomains.has(domainId)\n ? 'discontinuous'\n : staleDomains.has(domainId)\n ? 'stale'\n : 'insufficient'\n );\n }\n return {\n forecasts: forecasts.sort((left, right) => left.bucketId.localeCompare(right.bucketId)),\n coverageByDomain\n };\n }\n\n /**\n * Cycle-to-date evidence for every subscription that declares a renewal date.\n * Each Provider is measured over its own billing period, which is why this\n * cannot reuse the one rolling window the rest of the workbench shares.\n */\n #planBillingPeriodSummaries(\n subscriptions: PlanSubscription[],\n now: Date,\n query: UsageQuery\n ): Map<string, PlanBillingPeriodSummary> {\n const normalized = normalizeUsageQuery(now, query);\n const summaries = new Map<string, PlanBillingPeriodSummary>();\n for (const subscription of subscriptions) {\n if (!subscription.anchorDate) continue;\n const period = billingPeriodContaining(\n subscription.anchorDate,\n subscription.billingPeriod,\n now\n );\n if (!period) continue;\n const observedThrough = new Date(Math.min(now.getTime(), period.end.getTime()));\n summaries.set(`${subscription.providerId}:${subscription.billingDomainId}`, {\n start: period.start.toISOString(),\n end: period.end.toISOString(),\n observedThrough: observedThrough.toISOString(),\n ...this.#rangeUsageSummary(\n subscription.providerId,\n subscription.billingDomainId,\n period.start,\n observedThrough,\n normalized.comparisonCurrency\n )\n });\n }\n return summaries;\n }\n\n #rangeUsageSummary(\n providerId: string,\n billingDomainId: string,\n start: Date,\n end: Date,\n comparisonCurrency: string\n ): Pick<PlanBillingPeriodSummary, 'recordedTokens' | 'observationCount' | 'retailEquivalent'> {\n const startIso = start.toISOString();\n const endIso = end.toISOString();\n const usage = this.#database\n .prepare(\n `SELECT id, model, observed_at, authority, total_tokens, input_tokens, output_tokens,\n reasoning_tokens, cache_read_tokens, cache_write_tokens, cache_write_5m_tokens,\n cache_write_1h_tokens, source_reported_total_tokens,\n unclassified_tokens, total_derivation, model_attribution, time_precision,\n usage_scope, aggregation_temporality, reasoning_semantics,\n cache_read_semantics, cache_write_semantics\n FROM usage_observations\n WHERE provider_id = ? AND billing_domain_id = ?\n AND observed_at >= ? AND observed_at < ?\n AND ${additiveUsagePredicate()}\n ORDER BY observed_at, id`\n )\n .all(providerId, billingDomainId, startIso, endIso) as unknown as UsageHistoryRow[];\n const costs = this.#database\n .prepare(\n `SELECT id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority,\n price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency,\n price_snapshot_rates_json, price_snapshot_source_url,\n price_snapshot_context_tier, model, usage_observation_id, priced_tokens,\n line_items_json, calculated_at\n FROM cost_records\n WHERE provider_id = ? AND billing_domain_id = ?\n AND observed_at >= ? AND observed_at < ?\n ORDER BY observed_at, id`\n )\n .all(providerId, billingDomainId, startIso, endIso) as unknown as CostRow[];\n const rateRows = this.#database\n .prepare(\n `SELECT id, base_currency, quote_currency, rate, observed_at, source\n FROM exchange_rate_snapshots WHERE observed_at < ? ORDER BY observed_at DESC, id`\n )\n .all(endIso) as unknown as ExchangeRateRow[];\n const rateByCurrency = new Map<string, ExchangeRateRow>();\n for (const row of rateRows) {\n if (row.quote_currency === comparisonCurrency && !rateByCurrency.has(row.base_currency)) {\n rateByCurrency.set(row.base_currency, row);\n }\n }\n\n const evidence = emptyTokenEvidence();\n for (const row of usage) addTokenEvidence(evidence, row);\n const finished = finishTokenEvidence(evidence);\n const usedRates = new Map<string, ExchangeRateSnapshot>();\n const historyCosts = summarizeHistoryCosts(\n costs,\n finished.recordedTokens,\n rateByCurrency,\n comparisonCurrency,\n end,\n usedRates\n );\n return {\n recordedTokens: finished.recordedTokens,\n observationCount: finished.observationCount,\n retailEquivalent: buildWorkbenchMetric(\n historyCosts,\n 'retail-equivalent',\n comparisonCurrency,\n finished.recordedTokens,\n [...usedRates.values()]\n )\n };\n }\n\n #getBillingHistory(\n providerId: string,\n billingDomainId: string,\n now: Date,\n query: UsageQuery\n ): BillingDomainOverview['history'] {\n const normalized = normalizeUsageQuery(now, query);\n const start = normalized.start.toISOString();\n const end = normalized.end.toISOString();\n const usage = this.#database\n .prepare(\n `SELECT id, model, observed_at, authority, total_tokens, input_tokens, output_tokens, reasoning_tokens,\n cache_read_tokens, cache_write_tokens, cache_write_5m_tokens,\n cache_write_1h_tokens, source_reported_total_tokens,\n unclassified_tokens, total_derivation, model_attribution, time_precision,\n usage_scope, aggregation_temporality, reasoning_semantics,\n cache_read_semantics, cache_write_semantics\n FROM usage_observations\n WHERE provider_id = ? AND billing_domain_id = ?\n AND observed_at >= ? AND observed_at < ?\n AND ${additiveUsagePredicate()}\n ORDER BY observed_at, id`\n )\n .all(providerId, billingDomainId, start, end) as unknown as UsageHistoryRow[];\n const costs = this.#database\n .prepare(\n `SELECT id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority,\n price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency,\n price_snapshot_rates_json, price_snapshot_source_url,\n price_snapshot_context_tier, model, usage_observation_id, priced_tokens,\n line_items_json, calculated_at\n FROM cost_records\n WHERE provider_id = ? AND billing_domain_id = ?\n AND observed_at >= ? AND observed_at < ?\n ORDER BY observed_at, id`\n )\n .all(providerId, billingDomainId, start, end) as unknown as CostRow[];\n const rateRows = this.#database\n .prepare(\n `SELECT id, base_currency, quote_currency, rate, observed_at, source\n FROM exchange_rate_snapshots WHERE observed_at < ? ORDER BY observed_at DESC, id`\n )\n .all(end) as unknown as ExchangeRateRow[];\n const rateByCurrency = new Map<string, ExchangeRateRow>();\n for (const row of rateRows) {\n if (\n row.quote_currency === normalized.comparisonCurrency &&\n !rateByCurrency.has(row.base_currency)\n ) {\n rateByCurrency.set(row.base_currency, row);\n }\n }\n\n const tokenTotals = zeroTokenTotals();\n const tokenEvidence = emptyTokenEvidence();\n const byModel = new Map<\n string,\n {\n tokens: ReturnType<typeof zeroTokenTotals>;\n evidence: MutableTokenEvidence;\n observations: UsageHistoryRow[];\n }\n >();\n const unclassified = {\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n authorities: new Set<DataAuthority>(),\n lastObservedAt: null as string | null,\n observations: [] as UsageHistoryRow[]\n };\n const authorities = new Set<DataAuthority>();\n const byDay = new Map<\n string,\n {\n tokens: ReturnType<typeof zeroTokenTotals>;\n evidence: MutableTokenEvidence;\n costs: CostRow[];\n authorities: Set<DataAuthority>;\n lastObservedAt: string | null;\n }\n >();\n const intervals = buildHistoryIntervals(normalized).map((interval) => ({\n ...interval,\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n costs: [] as CostRow[],\n authorities: new Set<DataAuthority>(),\n lastObservedAt: null as string | null\n }));\n for (const row of usage) {\n authorities.add(row.authority);\n addUsageRow(tokenTotals, row);\n addTokenEvidence(tokenEvidence, row);\n if (row.model_attribution === 'known') {\n const classified = classifiedUsageRow(row);\n if (classified.total_tokens > 0) {\n const model = byModel.get(row.model) ?? {\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n observations: []\n };\n addUsageRow(model.tokens, classified);\n addTokenEvidence(model.evidence, classified);\n model.observations.push(row);\n byModel.set(row.model, model);\n }\n const remainder = unclassifiedUsageRow(row);\n if (remainder) addUnclassifiedUsage(unclassified, remainder);\n } else {\n addUnclassifiedUsage(unclassified, row);\n }\n const day = localDay(row.observed_at, normalized.timeZone);\n const daily = byDay.get(day) ?? {\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n costs: [],\n authorities: new Set<DataAuthority>(),\n lastObservedAt: null\n };\n addUsageRow(daily.tokens, row);\n addTokenEvidence(daily.evidence, row);\n daily.authorities.add(row.authority);\n if (!daily.lastObservedAt || row.observed_at > daily.lastObservedAt) {\n daily.lastObservedAt = row.observed_at;\n }\n byDay.set(day, daily);\n const interval = intervals[historyIntervalIndex(row.observed_at, normalized)];\n if (interval) {\n addUsageRow(interval.tokens, row);\n addTokenEvidence(interval.evidence, row);\n interval.authorities.add(row.authority);\n if (!interval.lastObservedAt || row.observed_at > interval.lastObservedAt) {\n interval.lastObservedAt = row.observed_at;\n }\n }\n }\n for (const cost of costs) {\n const day = localDay(cost.observed_at, normalized.timeZone);\n const daily = byDay.get(day) ?? {\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n costs: [],\n authorities: new Set<DataAuthority>(),\n lastObservedAt: null\n };\n if (cost.kind !== 'subscription' && cost.kind !== 'legacy-unknown') {\n daily.costs.push(cost);\n const interval = intervals[historyIntervalIndex(cost.observed_at, normalized)];\n if (interval) interval.costs.push(cost);\n }\n byDay.set(day, daily);\n }\n\n const exchangeRates = new Map<string, ExchangeRateSnapshot>();\n const summarizeCosts = (rows: CostRow[], recordedTokens: number) =>\n summarizeHistoryCosts(\n rows,\n recordedTokens,\n rateByCurrency,\n normalized.comparisonCurrency,\n normalized.end,\n exchangeRates\n );\n return {\n window: normalized.window,\n start,\n end,\n timeZone: normalized.timeZone,\n tokenTotals,\n tokenEvidence: finishTokenEvidence(tokenEvidence),\n models: [...byModel.entries()]\n .map(([model, value]) => {\n const observationIds = new Set(value.observations.map((observation) => observation.id));\n const priceEvidence = costs\n .filter(\n (cost) =>\n (cost.kind === 'retail-equivalent' || cost.kind === 'reported-estimate') &&\n cost.usage_observation_id !== null &&\n observationIds.has(cost.usage_observation_id)\n )\n .map((cost) => {\n const summarized = summarizeCosts([cost], Number(cost.priced_tokens ?? 0))[0];\n return {\n ...summarized,\n id: cost.id,\n usageObservationId: cost.usage_observation_id,\n pricedTokens: Number(cost.priced_tokens ?? 0),\n lineItems: parseLineItems(cost.line_items_json),\n priceSnapshot: priceSnapshotFromRow(cost),\n authority: cost.authority,\n calculatedAt: cost.calculated_at\n };\n });\n return {\n model,\n tokenTotals: value.tokens,\n tokenEvidence: finishTokenEvidence(value.evidence),\n observations: value.observations.map(mapHistoryModelObservation),\n priceEvidence\n };\n })\n .sort(\n (left, right) =>\n right.tokenTotals.total - left.tokenTotals.total ||\n left.model.localeCompare(right.model)\n ),\n unclassified: {\n tokenTotals: unclassified.tokens,\n tokenEvidence: finishTokenEvidence(unclassified.evidence),\n authorities: [...unclassified.authorities].sort(),\n lastObservedAt: unclassified.lastObservedAt,\n observations: unclassified.observations.map(mapUnclassifiedObservation)\n },\n days: [...byDay.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([day, daily]) => ({\n day,\n tokenTotals: daily.tokens,\n tokenEvidence: finishTokenEvidence(daily.evidence),\n costs: summarizeCosts(daily.costs, daily.tokens.total),\n authorities: [...daily.authorities].sort(),\n lastObservedAt: daily.lastObservedAt\n })),\n intervals: intervals.map((interval) => ({\n start: interval.start.toISOString(),\n end: interval.end.toISOString(),\n label: interval.label,\n gap: interval.evidence.observationCount === 0,\n tokenTotals: interval.tokens,\n tokenEvidence: finishTokenEvidence(interval.evidence),\n costs: summarizeCosts(interval.costs, interval.tokens.total),\n authorities: [...interval.authorities].sort(),\n lastObservedAt: interval.lastObservedAt\n })),\n costs: summarizeCosts(costs, tokenTotals.total),\n exchangeRates: [...exchangeRates.values()],\n authorities: [...authorities].sort(),\n lastObservedAt: usage.at(-1)?.observed_at ?? null\n };\n }\n\n #migrate(): void {\n this.#database.exec(`\n CREATE TABLE IF NOT EXISTS providers (\n id TEXT PRIMARY KEY,\n display_name TEXT NOT NULL,\n account_identifier TEXT,\n last_success_at TEXT,\n last_error TEXT,\n last_failure_at TEXT,\n last_error_code TEXT,\n last_recovery TEXT\n );\n CREATE TABLE IF NOT EXISTS billing_domains (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n display_name TEXT NOT NULL,\n last_success_at TEXT,\n PRIMARY KEY (provider_id, id)\n );\n CREATE TABLE IF NOT EXISTS quota_buckets (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n label TEXT NOT NULL,\n used_percent REAL,\n window_duration_minutes INTEGER,\n resets_at TEXT,\n authority TEXT NOT NULL,\n observed_at TEXT NOT NULL,\n scope TEXT,\n status TEXT,\n limit_amount REAL,\n limit_currency TEXT,\n fallback_status TEXT,\n total_tokens INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS usage_observations (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n model TEXT NOT NULL,\n session_id TEXT,\n observed_at TEXT NOT NULL,\n total_tokens INTEGER NOT NULL DEFAULT 0,\n input_tokens INTEGER NOT NULL,\n output_tokens INTEGER NOT NULL,\n reasoning_tokens INTEGER NOT NULL DEFAULT 0,\n cache_read_tokens INTEGER NOT NULL,\n cache_write_tokens INTEGER NOT NULL,\n cache_write_5m_tokens INTEGER,\n cache_write_1h_tokens INTEGER,\n authority TEXT NOT NULL,\n source_reported_total_tokens INTEGER,\n unclassified_tokens INTEGER NOT NULL DEFAULT 0,\n total_derivation TEXT NOT NULL DEFAULT 'legacy-total',\n reasoning_semantics TEXT NOT NULL DEFAULT 'included-in-output',\n cache_read_semantics TEXT NOT NULL DEFAULT 'separate',\n cache_write_semantics TEXT NOT NULL DEFAULT 'separate',\n model_attribution TEXT NOT NULL DEFAULT 'known',\n time_precision TEXT NOT NULL DEFAULT 'unknown',\n usage_scope TEXT NOT NULL DEFAULT 'unknown',\n aggregation_temporality TEXT NOT NULL DEFAULT 'unknown',\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS quota_observations (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n bucket_id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n label TEXT NOT NULL,\n used_percent REAL NOT NULL,\n resets_at TEXT,\n authority TEXT NOT NULL,\n observed_at TEXT NOT NULL,\n PRIMARY KEY (provider_id, bucket_id, observed_at),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS cost_records (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n source_id TEXT,\n billing_domain_id TEXT NOT NULL,\n observed_at TEXT NOT NULL,\n kind TEXT NOT NULL,\n amount REAL,\n currency TEXT NOT NULL,\n authority TEXT NOT NULL,\n price_snapshot_id TEXT,\n price_snapshot_version TEXT,\n price_snapshot_source TEXT,\n price_snapshot_canonical_model TEXT,\n price_snapshot_effective_at TEXT,\n price_snapshot_effective_until TEXT,\n price_snapshot_currency TEXT,\n price_snapshot_rates_json TEXT,\n price_snapshot_source_url TEXT,\n price_snapshot_context_tier TEXT,\n model TEXT,\n usage_observation_id TEXT,\n priced_tokens INTEGER,\n line_items_json TEXT,\n calculated_at TEXT,\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS balance_records (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n source_id TEXT,\n billing_domain_id TEXT NOT NULL,\n observed_at TEXT NOT NULL,\n kind TEXT NOT NULL,\n amount REAL,\n currency TEXT NOT NULL,\n authority TEXT NOT NULL,\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS invoice_records (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n created_at TEXT NOT NULL,\n number TEXT,\n status TEXT,\n amount REAL,\n currency TEXT NOT NULL,\n authority TEXT NOT NULL,\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS exchange_rate_snapshots (\n id TEXT PRIMARY KEY,\n base_currency TEXT NOT NULL,\n quote_currency TEXT NOT NULL,\n rate REAL NOT NULL,\n observed_at TEXT NOT NULL,\n source TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS connector_settings (\n id TEXT PRIMARY KEY,\n state TEXT NOT NULL,\n installed INTEGER NOT NULL,\n binary_path TEXT,\n official_credential_present INTEGER NOT NULL,\n error_code TEXT,\n last_discovered_at TEXT,\n secret_reference TEXT\n );\n CREATE TABLE IF NOT EXISTS connector_runtime (\n id TEXT PRIMARY KEY,\n last_attempt_at TEXT,\n next_allowed_at TEXT,\n failure_count INTEGER NOT NULL DEFAULT 0,\n outcome TEXT\n );\n CREATE TABLE IF NOT EXISTS monitoring_settings (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n background_collection_enabled INTEGER NOT NULL,\n interval_minutes INTEGER NOT NULL,\n notifications_enabled INTEGER NOT NULL,\n start_at_login INTEGER NOT NULL\n );\n CREATE TABLE IF NOT EXISTS notification_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS connector_diagnostics (\n id TEXT PRIMARY KEY,\n provider_id TEXT NOT NULL,\n billing_domain_id TEXT,\n status TEXT NOT NULL,\n category TEXT,\n message TEXT,\n recovery TEXT,\n affected_coverage TEXT NOT NULL,\n last_attempt_at TEXT NOT NULL,\n last_success_at TEXT\n );\n CREATE TABLE IF NOT EXISTS daily_usage_aggregates (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n billing_domain_id TEXT NOT NULL,\n day_utc TEXT NOT NULL,\n model TEXT NOT NULL,\n authority TEXT NOT NULL,\n total_tokens INTEGER NOT NULL,\n input_tokens INTEGER NOT NULL,\n output_tokens INTEGER NOT NULL,\n reasoning_tokens INTEGER NOT NULL,\n cache_read_tokens INTEGER NOT NULL,\n cache_write_tokens INTEGER NOT NULL,\n source_count INTEGER NOT NULL,\n PRIMARY KEY (provider_id, billing_domain_id, day_utc, model, authority)\n );\n CREATE TABLE IF NOT EXISTS retention_state (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n last_compacted_at TEXT\n );\n CREATE TABLE IF NOT EXISTS application_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS plan_subscriptions (\n provider_id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n plan_id TEXT,\n display_name TEXT NOT NULL,\n amount REAL NOT NULL,\n currency TEXT NOT NULL,\n billing_period TEXT NOT NULL,\n anchor_date TEXT,\n price_source TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (provider_id, billing_domain_id)\n );\n CREATE TABLE IF NOT EXISTS custom_model_rates (\n id TEXT PRIMARY KEY,\n provider_id TEXT NOT NULL,\n billing_domain_id TEXT,\n model TEXT NOT NULL,\n input_rate REAL NOT NULL,\n output_rate REAL NOT NULL,\n cache_read_rate REAL NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE UNIQUE INDEX IF NOT EXISTS idx_custom_model_rates_key\n ON custom_model_rates(provider_id, COALESCE(billing_domain_id, ''), lower(model));\n `);\n const usageColumns = this.#database\n .prepare('PRAGMA table_info(usage_observations)')\n .all() as unknown as Array<{ name: string }>;\n if (!usageColumns.some((column) => column.name === 'total_tokens')) {\n this.#database.exec(\n 'ALTER TABLE usage_observations ADD COLUMN total_tokens INTEGER NOT NULL DEFAULT 0'\n );\n this.#database.exec(\n 'UPDATE usage_observations SET total_tokens = input_tokens + output_tokens'\n );\n }\n if (!usageColumns.some((column) => column.name === 'session_id')) {\n this.#database.exec('ALTER TABLE usage_observations ADD COLUMN session_id TEXT');\n }\n if (!usageColumns.some((column) => column.name === 'reasoning_tokens')) {\n this.#database.exec(\n 'ALTER TABLE usage_observations ADD COLUMN reasoning_tokens INTEGER NOT NULL DEFAULT 0'\n );\n }\n for (const [name, definition] of [\n ['source_reported_total_tokens', 'INTEGER'],\n ['unclassified_tokens', 'INTEGER NOT NULL DEFAULT 0'],\n ['total_derivation', \"TEXT NOT NULL DEFAULT 'legacy-total'\"],\n ['reasoning_semantics', \"TEXT NOT NULL DEFAULT 'included-in-output'\"],\n ['cache_read_semantics', \"TEXT NOT NULL DEFAULT 'separate'\"],\n ['cache_write_semantics', \"TEXT NOT NULL DEFAULT 'separate'\"],\n ['model_attribution', \"TEXT NOT NULL DEFAULT 'known'\"],\n ['time_precision', \"TEXT NOT NULL DEFAULT 'unknown'\"],\n ['usage_scope', \"TEXT NOT NULL DEFAULT 'unknown'\"],\n ['aggregation_temporality', \"TEXT NOT NULL DEFAULT 'unknown'\"],\n ['cache_write_5m_tokens', 'INTEGER'],\n ['cache_write_1h_tokens', 'INTEGER']\n ] as const) {\n if (!usageColumns.some((column) => column.name === name)) {\n this.#database.exec(`ALTER TABLE usage_observations ADD COLUMN ${name} ${definition}`);\n }\n }\n this.#database.exec(`\n UPDATE usage_observations\n SET unclassified_tokens = MAX(\n 0,\n total_tokens - input_tokens - output_tokens - cache_read_tokens - cache_write_tokens\n )\n WHERE total_derivation = 'legacy-total'\n `);\n this.#database.exec(`\n UPDATE usage_observations\n SET model_attribution = 'unclassified',\n unclassified_tokens = total_tokens\n WHERE lower(trim(model)) IN ('all-models', 'unknown', 'unknown-model', '__unclassified__')\n `);\n this.#database.exec(`\n UPDATE usage_observations\n SET usage_scope = 'this-mac',\n total_derivation = 'categorized'\n WHERE usage_scope = 'unknown'\n AND (\n (provider_id = 'claude-code' AND id LIKE 'claude-otel:%')\n OR (provider_id = 'grok' AND id LIKE 'grok-otel:%')\n OR (provider_id = 'grok' AND id LIKE 'grok-headless:%')\n )\n `);\n const providerColumns = this.#database\n .prepare('PRAGMA table_info(providers)')\n .all() as unknown as Array<{ name: string }>;\n if (!providerColumns.some((column) => column.name === 'account_identifier')) {\n this.#database.exec('ALTER TABLE providers ADD COLUMN account_identifier TEXT');\n }\n if (!providerColumns.some((column) => column.name === 'last_error_code')) {\n this.#database.exec('ALTER TABLE providers ADD COLUMN last_error_code TEXT');\n }\n if (!providerColumns.some((column) => column.name === 'last_recovery')) {\n this.#database.exec('ALTER TABLE providers ADD COLUMN last_recovery TEXT');\n }\n const billingDomainColumns = this.#database\n .prepare('PRAGMA table_info(billing_domains)')\n .all() as unknown as Array<{ name: string }>;\n if (!billingDomainColumns.some((column) => column.name === 'last_success_at')) {\n this.#database.exec('ALTER TABLE billing_domains ADD COLUMN last_success_at TEXT');\n }\n this.#database.exec(`\n UPDATE billing_domains\n SET last_success_at = (\n SELECT providers.last_success_at\n FROM providers\n WHERE providers.id = billing_domains.provider_id\n )\n WHERE last_success_at IS NULL\n AND 1 = (\n SELECT COUNT(*)\n FROM billing_domains AS sibling\n WHERE sibling.provider_id = billing_domains.provider_id\n )\n `);\n const costColumns = this.#database\n .prepare('PRAGMA table_info(cost_records)')\n .all() as unknown as Array<{ name: string }>;\n if (!costColumns.some((column) => column.name === 'source_id')) {\n this.#database.exec('ALTER TABLE cost_records ADD COLUMN source_id TEXT');\n }\n for (const [name, type] of [\n ['price_snapshot_id', 'TEXT'],\n ['price_snapshot_version', 'TEXT'],\n ['price_snapshot_source', 'TEXT'],\n ['price_snapshot_canonical_model', 'TEXT'],\n ['price_snapshot_effective_at', 'TEXT'],\n ['price_snapshot_effective_until', 'TEXT'],\n ['price_snapshot_currency', 'TEXT'],\n ['price_snapshot_rates_json', 'TEXT'],\n ['price_snapshot_source_url', 'TEXT'],\n ['price_snapshot_context_tier', 'TEXT'],\n ['model', 'TEXT'],\n ['usage_observation_id', 'TEXT'],\n ['priced_tokens', 'INTEGER'],\n ['line_items_json', 'TEXT'],\n ['calculated_at', 'TEXT']\n ] as const) {\n if (!costColumns.some((column) => column.name === name)) {\n this.#database.exec(`ALTER TABLE cost_records ADD COLUMN ${name} ${type}`);\n }\n }\n this.#database.exec(`\n DELETE FROM cost_records\n WHERE kind = 'estimate' AND id LIKE 'opencode-quota-estimate:%'\n `);\n this.#database.exec(`\n UPDATE cost_records\n SET kind = 'retail-equivalent'\n WHERE kind = 'estimate'\n AND usage_observation_id IS NOT NULL\n AND priced_tokens IS NOT NULL\n AND line_items_json IS NOT NULL\n AND price_snapshot_id IS NOT NULL\n `);\n this.#database.exec(`\n UPDATE cost_records\n SET kind = 'reported-estimate'\n WHERE kind = 'estimate'\n AND (\n authority IN ('official-account', 'official-client', 'local-observation')\n OR id LIKE 'claude-otel-cost:%'\n OR id LIKE 'opencode-session-cost:%'\n OR price_snapshot_id IN (\n 'claude-code-otlp-reported-cost-v1',\n 'opencode-export-reported-cost-v1'\n )\n )\n `);\n this.#database.exec(`\n UPDATE cost_records\n SET kind = 'legacy-unknown'\n WHERE kind = 'estimate'\n `);\n this.#database.exec(`\n UPDATE cost_records\n SET model = NULL,\n usage_observation_id = NULL,\n priced_tokens = NULL,\n line_items_json = NULL,\n calculated_at = NULL\n WHERE kind = 'subscription'\n `);\n const quotaColumns = this.#database\n .prepare('PRAGMA table_info(quota_buckets)')\n .all() as unknown as Array<{ name: string }>;\n for (const [name, type] of [\n ['window_duration_minutes', 'INTEGER'],\n ['scope', 'TEXT'],\n ['status', 'TEXT'],\n ['limit_amount', 'REAL'],\n ['limit_currency', 'TEXT'],\n ['fallback_status', 'TEXT']\n ] as const) {\n if (!quotaColumns.some((column) => column.name === name)) {\n this.#database.exec(`ALTER TABLE quota_buckets ADD COLUMN ${name} ${type}`);\n }\n }\n // A database written before billing periods were modelled keeps its plan\n // rows; the renewal date is simply unknown until it is declared.\n const planColumns = this.#database\n .prepare('PRAGMA table_info(plan_subscriptions)')\n .all() as unknown as Array<{ name: string }>;\n if (planColumns.length > 0 && !planColumns.some((column) => column.name === 'anchor_date')) {\n this.#database.exec('ALTER TABLE plan_subscriptions ADD COLUMN anchor_date TEXT');\n }\n }\n}\n\nfunction normalizeCostForPersistence(cost: CostRecord): CostRecord {\n if (cost.kind !== 'subscription') return cost;\n return {\n ...cost,\n model: null,\n usageObservationId: null,\n pricedTokens: null,\n lineItems: [],\n calculatedAt: null\n };\n}\n\nfunction serializePriceRates(priceSnapshot: CostRecord['priceSnapshot']): string | null {\n return priceSnapshot?.ratesPerMillion\n ? JSON.stringify({\n ...priceSnapshot.ratesPerMillion,\n ...(priceSnapshot.cacheWriteRatesPerMillion\n ? {\n 'cache-write-5m': priceSnapshot.cacheWriteRatesPerMillion.fiveMinute,\n 'cache-write-1h': priceSnapshot.cacheWriteRatesPerMillion.oneHour\n }\n : {})\n })\n : null;\n}\n\nfunction mapQuotaRow(row: QuotaRow): QuotaBucket {\n return {\n id: row.id,\n billingDomainId: row.billing_domain_id,\n label: row.label,\n usedPercent: row.used_percent,\n windowDurationMinutes: row.window_duration_minutes,\n resetsAt: row.resets_at,\n authority: row.authority,\n observedAt: row.observed_at,\n scope: row.scope ?? undefined,\n status: row.status,\n limitAmount: row.limit_amount,\n limitCurrency: row.limit_currency,\n fallbackStatus: row.fallback_status\n };\n}\n\nfunction defaultMonitoringSettings(): MonitoringSettings {\n return {\n backgroundCollectionEnabled: true,\n intervalMinutes: 5,\n notificationsEnabled: false,\n startAtLogin: false\n };\n}\n\nfunction mapTokenTotals(tokens: TokenRow): ProviderOverview['tokenTotals'] {\n return {\n total: Number(tokens.total_tokens ?? 0),\n input: Number(tokens.input_tokens ?? 0),\n output: Number(tokens.output_tokens ?? 0),\n reasoning: Number(tokens.reasoning_tokens ?? 0),\n cacheRead: Number(tokens.cache_read_tokens ?? 0),\n cacheWrite: Number(tokens.cache_write_tokens ?? 0)\n };\n}\n\nfunction mapTokenEvidence(tokens: TokenRow): TokenEvidence {\n const recordedTokens = Number(tokens.total_tokens ?? 0);\n const unclassifiedTokens = Number(tokens.unclassified_tokens ?? 0);\n const classifiedTokens = Math.max(0, recordedTokens - unclassifiedTokens);\n return {\n recordedTokens,\n sourceReportedTokens: Number(tokens.source_reported_tokens ?? 0),\n sourceReportedObservationCount: Number(tokens.source_reported_observation_count ?? 0),\n observationCount: Number(tokens.observation_count ?? 0),\n unclassifiedTokens,\n classifiedTokens,\n classificationCoverage: recordedTokens === 0 ? null : classifiedTokens / recordedTokens,\n totalDerivations: commaSeparatedValues<TokenTotalDerivation>(tokens.total_derivations),\n timePrecisions: commaSeparatedValues<TokenTimePrecision>(tokens.time_precisions),\n usageScopes: commaSeparatedValues<TokenUsageScope>(tokens.usage_scopes),\n aggregationTemporalities: commaSeparatedValues<TokenAggregationTemporality>(\n tokens.aggregation_temporalities\n )\n };\n}\n\nfunction emptyTokenEvidence(): MutableTokenEvidence {\n return {\n recordedTokens: 0,\n sourceReportedTokens: 0,\n sourceReportedObservationCount: 0,\n observationCount: 0,\n unclassifiedTokens: 0,\n totalDerivations: new Set(),\n timePrecisions: new Set(),\n usageScopes: new Set(),\n aggregationTemporalities: new Set()\n };\n}\n\nfunction addTokenEvidence(target: MutableTokenEvidence, row: UsageHistoryRow): void {\n target.recordedTokens += Number(row.total_tokens);\n target.observationCount += 1;\n target.unclassifiedTokens += Number(row.unclassified_tokens);\n if (row.source_reported_total_tokens !== null) {\n target.sourceReportedTokens += Number(row.source_reported_total_tokens);\n target.sourceReportedObservationCount += 1;\n }\n target.totalDerivations.add(row.total_derivation);\n target.timePrecisions.add(row.time_precision);\n target.usageScopes.add(row.usage_scope);\n target.aggregationTemporalities.add(row.aggregation_temporality);\n}\n\nfunction finishTokenEvidence(evidence: MutableTokenEvidence): TokenEvidence {\n const classifiedTokens = Math.max(0, evidence.recordedTokens - evidence.unclassifiedTokens);\n return {\n recordedTokens: evidence.recordedTokens,\n sourceReportedTokens: evidence.sourceReportedTokens,\n sourceReportedObservationCount: evidence.sourceReportedObservationCount,\n observationCount: evidence.observationCount,\n unclassifiedTokens: evidence.unclassifiedTokens,\n classifiedTokens,\n classificationCoverage:\n evidence.recordedTokens === 0 ? null : classifiedTokens / evidence.recordedTokens,\n totalDerivations: [...evidence.totalDerivations].sort(),\n timePrecisions: [...evidence.timePrecisions].sort(),\n usageScopes: [...evidence.usageScopes].sort(),\n aggregationTemporalities: [...evidence.aggregationTemporalities].sort()\n };\n}\n\nfunction commaSeparatedValues<T extends string>(value: string | null): T[] {\n return value ? ([...new Set(value.split(',').filter(Boolean))].sort() as T[]) : [];\n}\n\nfunction priceSnapshotFromRow(row: CostRow): PriceSnapshotReference | null {\n const ratesPerMillion = parsePriceRates(row.price_snapshot_rates_json);\n const cacheWriteRatesPerMillion = parseCacheWriteRates(row.price_snapshot_rates_json);\n if (\n !row.price_snapshot_id ||\n !row.price_snapshot_version ||\n !row.price_snapshot_source ||\n !row.price_snapshot_effective_at ||\n !row.price_snapshot_currency ||\n !ratesPerMillion\n ) {\n return null;\n }\n return {\n id: row.price_snapshot_id,\n version: row.price_snapshot_version,\n source: row.price_snapshot_source,\n canonicalModel: row.price_snapshot_canonical_model,\n effectiveAt: row.price_snapshot_effective_at,\n effectiveUntil: row.price_snapshot_effective_until,\n currency: row.price_snapshot_currency,\n ratesPerMillion,\n ...(cacheWriteRatesPerMillion ? { cacheWriteRatesPerMillion } : {}),\n ...(row.price_snapshot_source_url ? { sourceUrl: row.price_snapshot_source_url } : {}),\n ...(row.price_snapshot_context_tier ? { contextTier: row.price_snapshot_context_tier } : {})\n };\n}\n\nfunction parseCacheWriteRates(\n value: string | null\n): PriceSnapshotReference['cacheWriteRatesPerMillion'] | null {\n if (!value) return null;\n try {\n const parsed = JSON.parse(value) as Record<string, unknown>;\n return typeof parsed['cache-write-5m'] === 'number' &&\n typeof parsed['cache-write-1h'] === 'number'\n ? {\n fiveMinute: parsed['cache-write-5m'],\n oneHour: parsed['cache-write-1h']\n }\n : null;\n } catch {\n return null;\n }\n}\n\nfunction parsePriceRates(value: string | null): PriceSnapshotReference['ratesPerMillion'] | null {\n if (!value) return null;\n try {\n const parsed = JSON.parse(value) as Record<string, unknown>;\n const kinds = ['input', 'output', 'reasoning', 'cache-read', 'cache-write'] as const;\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n !kinds.every((kind) => parsed[kind] === null || typeof parsed[kind] === 'number')\n ) {\n return null;\n }\n return Object.fromEntries(\n kinds.map((kind) => [kind, parsed[kind]])\n ) as PriceSnapshotReference['ratesPerMillion'];\n } catch {\n return null;\n }\n}\n\nfunction parseLineItems(value: string | null): RetailPriceLineItem[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? (parsed as RetailPriceLineItem[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction buildGlobalSummary(\n providers: ProviderOverview[],\n riskSummary: UsageOverview['riskSummary'],\n now: Date,\n query: UsageQuery\n): UsageOverview['globalSummary'] {\n const evidence = emptyTokenEvidence();\n const contributions: UsageOverview['globalSummary']['contributions'] = [];\n let latestObservedAt: string | null = null;\n let retailAmount = 0;\n let retailPricedTokens = 0;\n let sawRetailEquivalent = false;\n\n for (const { provider, domain, includedInHeadline } of allDomainHistories(providers)) {\n const domainEvidence = domain.history.tokenEvidence;\n if (domainEvidence.observationCount > 0) {\n contributions.push({\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n recordedTokens: domain.history.tokenTotals.total,\n tokenEvidence: domainEvidence,\n authorities: domain.history.authorities ?? [],\n lastObservedAt: domain.history.lastObservedAt ?? null\n });\n }\n if (!includedInHeadline) continue;\n for (const cost of domain.history.costs) {\n if (\n cost.kind !== 'retail-equivalent' ||\n cost.currency.toUpperCase() !== 'USD' ||\n cost.amount === null\n ) {\n continue;\n }\n sawRetailEquivalent = true;\n retailAmount += cost.amount;\n retailPricedTokens += cost.pricingEvidence?.pricedTokens ?? 0;\n }\n for (const observedAt of [\n domain.history.lastObservedAt,\n ...domain.quotaBuckets.map((bucket) => bucket.observedAt ?? null),\n domain.lastCostObservedAt,\n ...domain.balances.map((balance) => balance.observedAt),\n ...domain.invoices.map((invoice) => invoice.createdAt)\n ]) {\n if (observedAt && (!latestObservedAt || observedAt > latestObservedAt)) {\n latestObservedAt = observedAt;\n }\n }\n if (domainEvidence.observationCount === 0) continue;\n addAggregatedTokenEvidence(evidence, domainEvidence);\n }\n\n const tokenEvidence = finishTokenEvidence(evidence);\n return {\n window: query.window ?? providers[0]?.billingDomains[0]?.history.window ?? '24h',\n recordedTokens: tokenEvidence.observationCount > 0 ? tokenEvidence.recordedTokens : null,\n tokenEvidence,\n apiRetailEquivalent: {\n status: sawRetailEquivalent ? 'available' : 'unavailable',\n amount: sawRetailEquivalent ? preciseAmount(retailAmount) : null,\n currency: 'USD',\n pricingCoverage:\n tokenEvidence.recordedTokens === 0\n ? null\n : retailPricedTokens / tokenEvidence.recordedTokens\n },\n mostConstrained: riskSummary.mostConstrained,\n latestObservedAt,\n generatedAt: now.toISOString(),\n contributions\n };\n}\n\nfunction buildTokenMoneyWorkbench(\n providers: ProviderOverview[],\n now: Date,\n query: UsageQuery,\n planSubscriptions: PlanSubscription[],\n planBillingPeriods: Map<string, PlanBillingPeriodSummary>\n): UsageOverview['workbench'] {\n const normalized = normalizeUsageQuery(now, query);\n const allHistories = allDomainHistories(providers);\n const headlineHistories = allHistories.filter(({ includedInHeadline }) => includedInHeadline);\n const costs = headlineHistories.flatMap(({ history }) => history.costs);\n const rates = uniqueExchangeRates(\n headlineHistories.flatMap(({ history }) => history.exchangeRates)\n );\n const recordedTokens = headlineHistories.reduce(\n (total, { history }) => total + history.tokenEvidence.recordedTokens,\n 0\n );\n const observationCount = headlineHistories.reduce(\n (total, { history }) => total + history.tokenEvidence.observationCount,\n 0\n );\n const comparisonCurrency = normalized.comparisonCurrency;\n const metric = (purpose: UsageOverview['workbench']['costs']['actual']['purpose']) =>\n buildWorkbenchMetric(costs, purpose, comparisonCurrency, recordedTokens, rates);\n const actual = metric('actual');\n const reportedEstimate = metric('reported-estimate');\n const retailEquivalent = metric('retail-equivalent');\n const emptyIntervals = buildHistoryIntervals(normalized);\n const providerSummary = allHistories\n .flatMap(({ provider, domain, history, includedInHeadline }) => {\n const domainRetailEquivalent = buildWorkbenchMetric(\n history.costs,\n 'retail-equivalent',\n comparisonCurrency,\n history.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n if (history.tokenEvidence.observationCount === 0 && domainRetailEquivalent.records === 0) {\n return [];\n }\n return [\n {\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n recordedTokens:\n history.tokenEvidence.observationCount > 0\n ? history.tokenEvidence.recordedTokens\n : null,\n tokenShare:\n includedInHeadline && history.tokenEvidence.observationCount > 0 && recordedTokens > 0\n ? history.tokenEvidence.recordedTokens / recordedTokens\n : null,\n retailEquivalent: domainRetailEquivalent,\n retailShare:\n includedInHeadline &&\n domainRetailEquivalent.status === 'available' &&\n domainRetailEquivalent.amount !== null &&\n retailEquivalent.status === 'available' &&\n retailEquivalent.amount !== null &&\n retailEquivalent.amount !== 0\n ? domainRetailEquivalent.amount / retailEquivalent.amount\n : null,\n authorities: history.authorities ?? [],\n lastObservedAt: history.lastObservedAt ?? null\n }\n ];\n })\n .sort(\n (left, right) =>\n (right.recordedTokens ?? -1) - (left.recordedTokens ?? -1) ||\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n const headlineTokenTotals = headlineHistories.reduce(\n (total, { history }) => addTokenTotals(total, history.tokenTotals),\n zeroTokenTotals()\n );\n const classifiedTokens = headlineHistories.reduce(\n (total, { history }) => total + history.tokenEvidence.classifiedTokens,\n 0\n );\n const unclassifiedTokens = headlineHistories.reduce(\n (total, { history }) => total + history.tokenEvidence.unclassifiedTokens,\n 0\n );\n const classificationDenominator = classifiedTokens + unclassifiedTokens;\n const tokenBreakdown: UsageOverview['workbench']['tokenBreakdown'] = {\n status:\n observationCount === 0\n ? 'unavailable'\n : unclassifiedTokens === 0\n ? 'available'\n : classifiedTokens > 0\n ? 'partial'\n : 'unavailable',\n tokenTotals: headlineTokenTotals,\n classificationCoverage:\n classificationDenominator > 0 ? classifiedTokens / classificationDenominator : null,\n authorities: [\n ...new Set(headlineHistories.flatMap(({ history }) => history.authorities ?? []))\n ].sort(),\n lastObservedAt:\n headlineHistories\n .flatMap(({ history }) => (history.lastObservedAt ? [history.lastObservedAt] : []))\n .sort((left, right) => right.localeCompare(left))[0] ?? null\n };\n const dayBreakdown = emptyIntervals.map((emptyInterval, index) => {\n const intervals = headlineHistories.flatMap(({ history }) => {\n const interval = history.intervals[index];\n return interval ? [{ interval, rates: history.exchangeRates }] : [];\n });\n const intervalTokens = intervals.reduce(\n (total, { interval }) => total + interval.tokenEvidence.recordedTokens,\n 0\n );\n const intervalObservations = intervals.reduce(\n (total, { interval }) => total + interval.tokenEvidence.observationCount,\n 0\n );\n const intervalRetailEquivalent = buildWorkbenchMetric(\n intervals.flatMap(({ interval }) => interval.costs),\n 'retail-equivalent',\n comparisonCurrency,\n intervalTokens,\n uniqueExchangeRates(intervals.flatMap(({ rates }) => rates))\n );\n const authorities = [\n ...new Set(intervals.flatMap(({ interval }) => interval.authorities ?? []))\n ].sort();\n const lastObservedAt = intervals\n .flatMap(({ interval }) => (interval.lastObservedAt ? [interval.lastObservedAt] : []))\n .sort((left, right) => right.localeCompare(left))[0];\n return {\n start: emptyInterval.start.toISOString(),\n end: emptyInterval.end.toISOString(),\n label: emptyInterval.label,\n gap: intervalObservations === 0,\n recordedTokens: intervalObservations > 0 ? intervalTokens : null,\n tokenShare:\n intervalObservations > 0 && recordedTokens !== null && recordedTokens > 0\n ? intervalTokens / recordedTokens\n : null,\n retailEquivalent: intervalRetailEquivalent,\n retailShare:\n intervalRetailEquivalent.status === 'available' &&\n intervalRetailEquivalent.amount !== null &&\n retailEquivalent.status === 'available' &&\n retailEquivalent.amount !== null &&\n retailEquivalent.amount !== 0\n ? intervalRetailEquivalent.amount / retailEquivalent.amount\n : null,\n authorities,\n lastObservedAt: lastObservedAt ?? null\n };\n });\n const buckets = emptyIntervals.map((emptyInterval, index) => {\n const segments = allHistories.flatMap(({ provider, domain, history, includedInHeadline }) => {\n const interval = history.intervals[index];\n if (!interval) return [];\n const retailEquivalent = buildWorkbenchMetric(\n interval.costs,\n 'retail-equivalent',\n comparisonCurrency,\n interval.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n const reportedEstimate = buildWorkbenchMetric(\n interval.costs,\n 'reported-estimate',\n comparisonCurrency,\n interval.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n if (\n interval.tokenEvidence.observationCount === 0 &&\n retailEquivalent.records === 0 &&\n reportedEstimate.records === 0\n )\n return [];\n return [\n {\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n recordedTokens: interval.tokenEvidence.recordedTokens,\n observationCount: interval.tokenEvidence.observationCount,\n timePrecisions: interval.tokenEvidence.timePrecisions,\n authorities: interval.authorities ?? [],\n lastObservedAt: interval.lastObservedAt ?? null,\n retailEquivalent: {\n status: retailEquivalent.status,\n amount: retailEquivalent.amount,\n currency: comparisonCurrency\n },\n reportedEstimate: {\n status: reportedEstimate.status,\n amount: reportedEstimate.amount,\n currency: comparisonCurrency\n }\n }\n ];\n });\n return {\n start: emptyInterval.start.toISOString(),\n end: emptyInterval.end.toISOString(),\n label: emptyInterval.label,\n gap: segments.every((segment) => segment.observationCount === 0),\n segments\n };\n });\n return {\n window: normalized.window,\n start: normalized.start.toISOString(),\n end: normalized.end.toISOString(),\n timeZone: normalized.timeZone,\n comparisonCurrency,\n recordedTokens: observationCount > 0 ? recordedTokens : null,\n costs: {\n actual,\n reportedEstimate,\n retailEquivalent\n },\n trend: {\n granularity: normalized.window === '24h' ? 'hour' : 'day',\n buckets\n },\n providerSummary,\n tokenBreakdown,\n dayBreakdown,\n modelRanking: buildWorkbenchModelRanking(\n allHistories,\n buckets,\n comparisonCurrency,\n observationCount > 0 ? recordedTokens : null,\n retailEquivalent,\n reportedEstimate\n ),\n planValue: buildWorkbenchPlanValue({\n domains: planValueDomains(allHistories, comparisonCurrency),\n subscriptions: planSubscriptions,\n comparisonCurrency,\n start: normalized.start.toISOString(),\n end: normalized.end.toISOString(),\n rates: uniqueExchangeRates(allHistories.flatMap(({ history }) => history.exchangeRates)),\n billingPeriods: planBillingPeriods\n })\n };\n}\n\nfunction planValueDomains(\n histories: ReturnType<typeof allDomainHistories>,\n comparisonCurrency: string\n): PlanValueDomainInput[] {\n return histories.map(({ provider, domain, history, includedInHeadline }) => {\n const domainTokens = history.tokenEvidence.recordedTokens;\n const metric = (purpose: UsageOverview['workbench']['costs']['actual']['purpose']) =>\n buildWorkbenchMetric(\n history.costs,\n purpose,\n comparisonCurrency,\n domainTokens,\n history.exchangeRates\n );\n return {\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n recordedTokens: domainTokens,\n observationCount: history.tokenEvidence.observationCount,\n retailEquivalent: metric('retail-equivalent'),\n actualCost: metric('actual'),\n authorities: history.authorities ?? [],\n lastObservedAt: history.lastObservedAt ?? null\n };\n });\n}\n\nfunction allDomainHistories(providers: ProviderOverview[]): Array<{\n provider: ProviderOverview;\n domain: BillingDomainOverview;\n history: BillingHistory;\n includedInHeadline: boolean;\n}> {\n return providers.flatMap((provider) =>\n provider.billingDomains.map((domain) => ({\n provider,\n domain,\n history: domain.history,\n includedInHeadline:\n provider.id === 'dsh' || (provider.id === 'grok' && domain.id !== 'xai-api')\n ? true\n : domain.id === provider.summaryBillingDomainId\n }))\n );\n}\n\nfunction buildWorkbenchMetric(\n costs: HistoryCost[],\n purpose: UsageOverview['workbench']['costs']['actual']['purpose'],\n comparisonCurrency: string,\n recordedTokens: number,\n rates: ExchangeRateSnapshot[]\n): UsageOverview['workbench']['costs']['actual'] {\n const relevant = costs.filter((cost) => cost.kind === purpose);\n const native = new Map<\n string,\n { amount: number; complete: boolean; records: number; knownRecords: number }\n >();\n const authorities = new Set<DataAuthority>();\n const conversionUnavailableReasons = new Set<\n 'unknown-native-amount' | 'missing-rate' | 'stale-rate'\n >();\n let observedAt: string | null = null;\n let records = 0;\n let knownRecords = 0;\n let convertedRecords = 0;\n let convertedAmount = 0;\n let pricedTokens = 0;\n for (const cost of relevant) {\n const rowRecords = cost.records ?? 1;\n const rowKnownRecords = cost.knownRecords ?? (cost.amount === null ? 0 : rowRecords);\n records += rowRecords;\n knownRecords += rowKnownRecords;\n if (cost.convertedAmount !== null) {\n convertedAmount += cost.convertedAmount;\n convertedRecords += rowKnownRecords;\n }\n if (cost.conversionUnavailableReason) {\n conversionUnavailableReasons.add(cost.conversionUnavailableReason);\n }\n for (const authority of cost.authorities ?? []) authorities.add(authority);\n if (cost.observedAt && (!observedAt || cost.observedAt > observedAt))\n observedAt = cost.observedAt;\n pricedTokens += cost.pricingEvidence?.pricedTokens ?? 0;\n const currency = cost.currency.toUpperCase();\n const amount = native.get(currency) ?? {\n amount: 0,\n complete: true,\n records: 0,\n knownRecords: 0\n };\n amount.records += rowRecords;\n amount.knownRecords += rowKnownRecords;\n if (cost.amount === null || rowKnownRecords !== rowRecords) amount.complete = false;\n else amount.amount += cost.amount;\n native.set(currency, amount);\n }\n const status =\n records === 0\n ? 'unavailable'\n : knownRecords === records && convertedRecords === records\n ? 'available'\n : convertedRecords > 0\n ? 'partial'\n : 'unavailable';\n const nativeCurrencies = new Set(native.keys());\n return {\n purpose,\n status,\n amount: status === 'available' ? preciseAmount(convertedAmount) : null,\n comparisonCurrency,\n nativeAmounts: [...native.entries()]\n .map(([currency, amount]) => ({\n currency,\n amount: amount.complete ? preciseAmount(amount.amount) : null,\n records: amount.records,\n knownRecords: amount.knownRecords\n }))\n .sort((left, right) => left.currency.localeCompare(right.currency)),\n authorities: [...authorities].sort(),\n observedAt,\n records,\n knownRecords,\n amountCoverage: records === 0 ? null : knownRecords / records,\n pricingCoverage:\n purpose === 'retail-equivalent' && recordedTokens > 0 ? pricedTokens / recordedTokens : null,\n pricedTokens,\n recordedTokens,\n conversionUnavailableReasons: [...conversionUnavailableReasons].sort(),\n exchangeRates: rates\n .filter(\n (rate) =>\n rate.quoteCurrency.toUpperCase() === comparisonCurrency &&\n nativeCurrencies.has(rate.baseCurrency.toUpperCase())\n )\n .sort((left, right) => left.id.localeCompare(right.id))\n };\n}\n\nfunction uniqueExchangeRates(rates: ExchangeRateSnapshot[]): ExchangeRateSnapshot[] {\n return [...new Map(rates.map((rate) => [rate.id, rate])).values()];\n}\n\nfunction buildWorkbenchModelRanking(\n histories: Array<{\n provider: ProviderOverview;\n domain: BillingDomainOverview;\n history: BillingHistory;\n includedInHeadline: boolean;\n }>,\n buckets: UsageOverview['workbench']['trend']['buckets'],\n comparisonCurrency: string,\n recordedTokens: number | null,\n totalRetailEquivalent: UsageOverview['workbench']['costs']['retailEquivalent'],\n totalReportedEstimate: UsageOverview['workbench']['costs']['reportedEstimate']\n): UsageOverview['workbench']['modelRanking'] {\n const entries = histories.flatMap(({ provider, domain, history, includedInHeadline }) =>\n history.models.map((model) => {\n const retailEquivalent = buildWorkbenchMetric(\n model.priceEvidence ?? [],\n 'retail-equivalent',\n comparisonCurrency,\n model.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n const reportedEstimate = buildWorkbenchMetric(\n model.priceEvidence ?? [],\n 'reported-estimate',\n comparisonCurrency,\n model.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n const observations = model.observations ?? [];\n const priceEvidence = model.priceEvidence ?? [];\n const authorities = [\n ...new Set(observations.map((observation) => observation.authority))\n ].sort();\n const lastObservedAt =\n observations.reduce<string | null>(\n (latest, observation) =>\n latest === null || observation.observedAt > latest ? observation.observedAt : latest,\n null\n ) ?? null;\n return {\n id: modelRankingId(provider.id, domain.id, model.model),\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n model: model.model,\n tokenTotals: model.tokenTotals,\n tokenEvidence: model.tokenEvidence,\n tokenShare:\n !includedInHeadline || recordedTokens === null || recordedTokens === 0\n ? null\n : model.tokenTotals.total / recordedTokens,\n retailEquivalent,\n reportedEstimate,\n retailShare:\n includedInHeadline &&\n retailEquivalent.status === 'available' &&\n retailEquivalent.amount !== null &&\n totalRetailEquivalent.status === 'available' &&\n totalRetailEquivalent.amount !== null &&\n totalRetailEquivalent.amount !== 0\n ? retailEquivalent.amount / totalRetailEquivalent.amount\n : null,\n reportedShare:\n includedInHeadline &&\n reportedEstimate.status === 'available' &&\n reportedEstimate.amount !== null &&\n totalReportedEstimate.status === 'available' &&\n totalReportedEstimate.amount !== null &&\n totalReportedEstimate.amount !== 0\n ? reportedEstimate.amount / totalReportedEstimate.amount\n : null,\n authorities,\n lastObservedAt,\n composition: nonOverlappingComposition(observations, model.tokenTotals),\n priceSnapshots: distinctPriceSnapshots(priceEvidence),\n trend: buckets.map((bucket) => {\n const bucketObservations = observations.filter(\n (observation) =>\n observation.observedAt >= bucket.start && observation.observedAt < bucket.end\n );\n const bucketPriceEvidence = priceEvidence.filter(\n (cost) =>\n (cost.observedAt ?? '') >= bucket.start && (cost.observedAt ?? '') < bucket.end\n );\n const tokenTotals = bucketObservations.reduce(\n (total, observation) => addTokenTotals(total, observation.tokenTotals),\n zeroTokenTotals()\n );\n const intervalRetail = buildWorkbenchMetric(\n bucketPriceEvidence,\n 'retail-equivalent',\n comparisonCurrency,\n tokenTotals.total,\n history.exchangeRates\n );\n const intervalReported = buildWorkbenchMetric(\n bucketPriceEvidence,\n 'reported-estimate',\n comparisonCurrency,\n tokenTotals.total,\n history.exchangeRates\n );\n return {\n start: bucket.start,\n end: bucket.end,\n label: bucket.label,\n gap: bucketObservations.length === 0,\n tokenTotals,\n recordedTokens: bucketObservations.reduce(\n (total, observation) => total + observation.recordedTokens,\n 0\n ),\n authorities: [\n ...new Set(bucketObservations.map((observation) => observation.authority))\n ].sort(),\n lastObservedAt:\n bucketObservations.reduce<string | null>(\n (latest, observation) =>\n latest === null || observation.observedAt > latest\n ? observation.observedAt\n : latest,\n null\n ) ?? null,\n retailEquivalent: {\n status: intervalRetail.status,\n amount: intervalRetail.amount,\n comparisonCurrency,\n pricingCoverage: intervalRetail.pricingCoverage,\n authorities: intervalRetail.authorities,\n observedAt: intervalRetail.observedAt\n },\n reportedEstimate: {\n status: intervalReported.status,\n amount: intervalReported.amount,\n comparisonCurrency,\n pricingCoverage: intervalReported.pricingCoverage,\n authorities: intervalReported.authorities,\n observedAt: intervalReported.observedAt\n }\n };\n })\n };\n })\n );\n const byTokens = [...entries].sort(\n (left, right) =>\n right.tokenTotals.total - left.tokenTotals.total || left.id.localeCompare(right.id)\n );\n const byRetailEquivalent = [...entries].sort((left, right) => {\n const leftAvailable = left.retailEquivalent.status === 'available';\n const rightAvailable = right.retailEquivalent.status === 'available';\n if (leftAvailable !== rightAvailable) return leftAvailable ? -1 : 1;\n if (leftAvailable && rightAvailable) {\n const amountDifference =\n (right.retailEquivalent.amount ?? 0) - (left.retailEquivalent.amount ?? 0);\n if (amountDifference !== 0) return amountDifference;\n } else {\n const tokenDifference = right.tokenTotals.total - left.tokenTotals.total;\n if (tokenDifference !== 0) return tokenDifference;\n }\n return left.id.localeCompare(right.id);\n });\n const byCost = [...entries].sort((left, right) => {\n const leftCost =\n left.retailEquivalent.status === 'available' ? left.retailEquivalent : left.reportedEstimate;\n const rightCost =\n right.retailEquivalent.status === 'available'\n ? right.retailEquivalent\n : right.reportedEstimate;\n const leftAvailable = leftCost.status === 'available';\n const rightAvailable = rightCost.status === 'available';\n if (leftAvailable !== rightAvailable) return leftAvailable ? -1 : 1;\n if (leftAvailable && rightAvailable) {\n const amountDifference = (rightCost.amount ?? 0) - (leftCost.amount ?? 0);\n if (amountDifference !== 0) return amountDifference;\n } else {\n const tokenDifference = right.tokenTotals.total - left.tokenTotals.total;\n if (tokenDifference !== 0) return tokenDifference;\n }\n return left.id.localeCompare(right.id);\n });\n const unclassified = histories\n .filter(({ history }) => history.unclassified.tokenEvidence.observationCount > 0)\n .map(({ provider, domain, history, includedInHeadline }) => ({\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n tokenTotals: history.unclassified.tokenTotals,\n tokenEvidence: history.unclassified.tokenEvidence,\n tokenShare:\n !includedInHeadline || recordedTokens === null || recordedTokens === 0\n ? null\n : history.unclassified.tokenTotals.total / recordedTokens,\n authorities: history.unclassified.authorities,\n lastObservedAt: history.unclassified.lastObservedAt\n }))\n .sort(\n (left, right) =>\n right.tokenTotals.total - left.tokenTotals.total ||\n modelRankingId(left.providerId, left.billingDomainId, '').localeCompare(\n modelRankingId(right.providerId, right.billingDomainId, '')\n )\n );\n return {\n byTokens: byTokens.map((entry) => entry.id),\n byCost: byCost.map((entry) => entry.id),\n byRetailEquivalent: byRetailEquivalent.map((entry) => entry.id),\n entries: byTokens,\n unclassified\n };\n}\n\n// Adding every Token category would double count a source that already folds reasoning\n// or cache Tokens into its own total, so only categories the source reports separately\n// contribute. Without observations the model total is the only honest answer.\n// Audit rows exist so the workbench can bucket and price each observation. Once the read\n// model is built only an export still needs them, and a response that carries them grows\n// with the whole retained history instead of with what the Dashboard displays.\nfunction dropAuditEvidence(providers: ProviderOverview[]): void {\n for (const provider of providers) {\n for (const domain of provider.billingDomains) {\n for (const model of domain.history.models) {\n delete model.observations;\n delete model.priceEvidence;\n }\n delete domain.history.unclassified.observations;\n }\n }\n}\n\nfunction nonOverlappingComposition(\n observations: HistoryModelObservation[],\n fallback: TokenTotals\n): TokenTotals {\n if (observations.length === 0) {\n return {\n ...fallback,\n total: fallback.input + fallback.output + fallback.cacheRead + fallback.cacheWrite\n };\n }\n const totals = zeroTokenTotals();\n for (const observation of observations) {\n totals.input += observation.tokenTotals.input;\n totals.output += observation.tokenTotals.output;\n if (observation.tokenSemantics.reasoning === 'separate') {\n totals.reasoning += observation.tokenTotals.reasoning;\n }\n if (observation.tokenSemantics.cacheRead === 'separate') {\n totals.cacheRead += observation.tokenTotals.cacheRead;\n }\n if (observation.tokenSemantics.cacheWrite === 'separate') {\n totals.cacheWrite += observation.tokenTotals.cacheWrite;\n }\n }\n totals.total =\n totals.input + totals.output + totals.reasoning + totals.cacheRead + totals.cacheWrite;\n return totals;\n}\n\n// Price snapshots are immutable and shared by every cost record priced against them,\n// so the drawer needs each one once rather than once per priced observation.\nfunction distinctPriceSnapshots(\n priceEvidence: HistoryModelPriceEvidence[]\n): PriceSnapshotReference[] {\n const snapshots = new Map<string, PriceSnapshotReference>();\n for (const evidence of priceEvidence) {\n const snapshot = evidence.priceSnapshot;\n if (snapshot && !snapshots.has(snapshot.id)) snapshots.set(snapshot.id, snapshot);\n }\n return [...snapshots.values()];\n}\n\nfunction modelRankingId(providerId: string, billingDomainId: string, model: string): string {\n return `${providerId}::${billingDomainId}::${model}`;\n}\n\nfunction addTokenTotals(\n target: ProviderOverview['tokenTotals'],\n value: ProviderOverview['tokenTotals']\n) {\n target.total += value.total;\n target.input += value.input;\n target.output += value.output;\n target.reasoning += value.reasoning;\n target.cacheRead += value.cacheRead;\n target.cacheWrite += value.cacheWrite;\n return target;\n}\n\nfunction addAggregatedTokenEvidence(target: MutableTokenEvidence, source: TokenEvidence): void {\n target.recordedTokens += source.recordedTokens;\n target.sourceReportedTokens += source.sourceReportedTokens;\n target.sourceReportedObservationCount += source.sourceReportedObservationCount;\n target.observationCount += source.observationCount;\n target.unclassifiedTokens += source.unclassifiedTokens;\n for (const value of source.totalDerivations) target.totalDerivations.add(value);\n for (const value of source.timePrecisions) target.timePrecisions.add(value);\n for (const value of source.usageScopes) target.usageScopes.add(value);\n for (const value of source.aggregationTemporalities) {\n target.aggregationTemporalities.add(value);\n }\n}\n\ninterface NormalizedUsageQuery {\n window: HistoryWindow;\n start: Date;\n end: Date;\n timeZone: string;\n comparisonCurrency: string;\n}\n\nfunction normalizeUsageQuery(now: Date, query: UsageQuery): NormalizedUsageQuery {\n const window = query.window ?? '24h';\n const durations: Record<HistoryWindow, number> = {\n '24h': 24 * 60 * 60 * 1000,\n '7d': 7 * 24 * 60 * 60 * 1000,\n '30d': 30 * 24 * 60 * 60 * 1000\n };\n const timeZone = validTimeZone(query.timeZone) ? query.timeZone! : 'UTC';\n return {\n window,\n start: new Date(now.getTime() - durations[window]),\n end: now,\n timeZone,\n comparisonCurrency: (query.comparisonCurrency ?? 'CNY').toUpperCase()\n };\n}\n\nfunction buildHistoryIntervals(\n query: NormalizedUsageQuery\n): Array<{ start: Date; end: Date; label: string }> {\n const count = query.window === '24h' ? 24 : query.window === '7d' ? 7 : 30;\n const duration = (query.end.getTime() - query.start.getTime()) / count;\n return Array.from({ length: count }, (_, index) => {\n const start = new Date(query.start.getTime() + index * duration);\n const end = new Date(\n index === count - 1 ? query.end.getTime() : query.start.getTime() + (index + 1) * duration\n );\n return {\n start,\n end,\n label:\n query.window === '24h'\n ? localHour(start.toISOString(), query.timeZone)\n : localDay(start.toISOString(), query.timeZone)\n };\n });\n}\n\nfunction historyIntervalIndex(observedAt: string, query: NormalizedUsageQuery): number {\n const count = query.window === '24h' ? 24 : query.window === '7d' ? 7 : 30;\n const elapsed = new Date(observedAt).getTime() - query.start.getTime();\n const duration = (query.end.getTime() - query.start.getTime()) / count;\n return Math.max(0, Math.min(count - 1, Math.floor(elapsed / duration)));\n}\n\nfunction validTimeZone(value: string | undefined): boolean {\n if (!value) return false;\n try {\n new Intl.DateTimeFormat('en', { timeZone: value }).format();\n return true;\n } catch {\n return false;\n }\n}\n\nfunction zeroTokenTotals(): ProviderOverview['tokenTotals'] {\n return { total: 0, input: 0, output: 0, reasoning: 0, cacheRead: 0, cacheWrite: 0 };\n}\n\nfunction addUsageRow(target: ProviderOverview['tokenTotals'], row: UsageHistoryRow): void {\n target.total += Number(row.total_tokens);\n target.input += Number(row.input_tokens);\n target.output += Number(row.output_tokens);\n target.reasoning += Number(row.reasoning_tokens);\n target.cacheRead += Number(row.cache_read_tokens);\n target.cacheWrite += Number(row.cache_write_tokens);\n}\n\nfunction classifiedUsageRow(row: UsageHistoryRow): UsageHistoryRow {\n const classifiedTokens = Math.max(0, Number(row.total_tokens) - Number(row.unclassified_tokens));\n return {\n ...row,\n total_tokens: classifiedTokens,\n source_reported_total_tokens:\n row.unclassified_tokens === 0 ? row.source_reported_total_tokens : null,\n unclassified_tokens: 0,\n total_derivation: row.unclassified_tokens === 0 ? row.total_derivation : 'categorized'\n };\n}\n\nfunction unclassifiedUsageRow(row: UsageHistoryRow): UsageHistoryRow | null {\n const unclassifiedTokens = Number(row.unclassified_tokens);\n if (unclassifiedTokens === 0) return null;\n return {\n ...row,\n total_tokens: unclassifiedTokens,\n input_tokens: 0,\n output_tokens: 0,\n reasoning_tokens: 0,\n cache_read_tokens: 0,\n cache_write_tokens: 0,\n source_reported_total_tokens:\n row.model_attribution === 'unclassified' ? row.source_reported_total_tokens : null,\n unclassified_tokens: unclassifiedTokens,\n model_attribution: 'unclassified'\n };\n}\n\nfunction addUnclassifiedUsage(\n target: {\n tokens: ReturnType<typeof zeroTokenTotals>;\n evidence: MutableTokenEvidence;\n authorities: Set<DataAuthority>;\n lastObservedAt: string | null;\n observations: UsageHistoryRow[];\n },\n row: UsageHistoryRow\n): void {\n addUsageRow(target.tokens, row);\n addTokenEvidence(target.evidence, row);\n target.authorities.add(row.authority);\n target.observations.push(row);\n if (!target.lastObservedAt || row.observed_at > target.lastObservedAt) {\n target.lastObservedAt = row.observed_at;\n }\n}\n\nfunction mapHistoryModelObservation(row: UsageHistoryRow): HistoryModelObservation {\n return {\n id: row.id,\n model: row.model === '__unclassified__' ? null : row.model,\n observedAt: row.observed_at,\n authority: row.authority,\n timePrecision: row.time_precision,\n sourceReportedTotalTokens: row.source_reported_total_tokens,\n cacheWriteTokenBreakdown: cacheWriteTokenBreakdownFromRow(row),\n recordedTokens: Number(row.total_tokens),\n classifiedTokens: Math.max(0, Number(row.total_tokens) - Number(row.unclassified_tokens)),\n unclassifiedTokens: Number(row.unclassified_tokens),\n totalDerivation: row.total_derivation,\n tokenSemantics: {\n reasoning: row.reasoning_semantics,\n cacheRead: row.cache_read_semantics,\n cacheWrite: row.cache_write_semantics\n },\n usageScope: row.usage_scope,\n aggregationTemporality: row.aggregation_temporality,\n tokenTotals: {\n total: Math.max(0, Number(row.total_tokens) - Number(row.unclassified_tokens)),\n input: Number(row.input_tokens),\n output: Number(row.output_tokens),\n reasoning: Number(row.reasoning_tokens),\n cacheRead: Number(row.cache_read_tokens),\n cacheWrite: Number(row.cache_write_tokens)\n }\n };\n}\n\nfunction cacheWriteTokenBreakdownFromRow(\n row: UsageHistoryRow\n): HistoryModelObservation['cacheWriteTokenBreakdown'] {\n return row.cache_write_5m_tokens === null || row.cache_write_1h_tokens === null\n ? null\n : {\n fiveMinute: Number(row.cache_write_5m_tokens),\n oneHour: Number(row.cache_write_1h_tokens)\n };\n}\n\nfunction mapUnclassifiedObservation(row: UsageHistoryRow): HistoryModelObservation {\n return {\n id: row.id,\n model: row.model === '__unclassified__' ? null : row.model,\n observedAt: row.observed_at,\n authority: row.authority,\n timePrecision: row.time_precision,\n sourceReportedTotalTokens: row.source_reported_total_tokens,\n cacheWriteTokenBreakdown: cacheWriteTokenBreakdownFromRow(row),\n recordedTokens: Number(row.total_tokens),\n classifiedTokens: 0,\n unclassifiedTokens: Number(row.unclassified_tokens),\n totalDerivation: row.total_derivation,\n tokenSemantics: {\n reasoning: row.reasoning_semantics,\n cacheRead: row.cache_read_semantics,\n cacheWrite: row.cache_write_semantics\n },\n usageScope: row.usage_scope,\n aggregationTemporality: row.aggregation_temporality,\n tokenTotals: {\n total: Number(row.total_tokens),\n input: Number(row.input_tokens),\n output: Number(row.output_tokens),\n reasoning: Number(row.reasoning_tokens),\n cacheRead: Number(row.cache_read_tokens),\n cacheWrite: Number(row.cache_write_tokens)\n }\n };\n}\n\nfunction localDay(observedAt: string, timeZone: string): string {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).formatToParts(new Date(observedAt));\n const part = (type: Intl.DateTimeFormatPartTypes) =>\n parts.find((candidate) => candidate.type === type)?.value ?? '';\n return `${part('year')}-${part('month')}-${part('day')}`;\n}\n\nfunction localHour(observedAt: string, timeZone: string): string {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n hourCycle: 'h23'\n }).formatToParts(new Date(observedAt));\n const part = (type: Intl.DateTimeFormatPartTypes) =>\n parts.find((candidate) => candidate.type === type)?.value ?? '';\n return `${part('year')}-${part('month')}-${part('day')} ${part('hour')}:00`;\n}\n\nfunction summarizeHistoryCosts(\n rows: CostRow[],\n recordedTokens: number,\n rates: Map<string, ExchangeRateRow>,\n comparisonCurrency: string,\n end: Date,\n usedRates: Map<string, ExchangeRateSnapshot>\n): HistoryCost[] {\n const groups = new Map<\n string,\n {\n kind: CostRecord['kind'];\n currency: string;\n amount: number;\n unknown: boolean;\n prices: Map<string, PriceSnapshotReference>;\n authorities: Set<DataAuthority>;\n observedAt: string | null;\n pricedTokens: number;\n records: number;\n knownRecords: number;\n }\n >();\n for (const row of rows) {\n const currency = row.currency.toUpperCase();\n const key = `${row.kind}:${currency}`;\n const group = groups.get(key) ?? {\n kind: row.kind,\n currency,\n amount: 0,\n unknown: false,\n prices: new Map<string, PriceSnapshotReference>(),\n authorities: new Set<DataAuthority>(),\n observedAt: null,\n pricedTokens: 0,\n records: 0,\n knownRecords: 0\n };\n group.records += 1;\n if (!group.observedAt || row.observed_at > group.observedAt) group.observedAt = row.observed_at;\n group.authorities.add(row.authority);\n if (row.amount === null) group.unknown = true;\n else {\n group.amount += Number(row.amount);\n group.knownRecords += 1;\n }\n if (row.kind === 'retail-equivalent') group.pricedTokens += Number(row.priced_tokens ?? 0);\n const price = priceSnapshotFromRow(row);\n if (price) group.prices.set(price.id, price);\n groups.set(key, group);\n }\n return [...groups.values()]\n .map((group): HistoryCost => {\n const amount = group.unknown ? null : group.amount;\n const pricingEvidence =\n group.kind === 'retail-equivalent'\n ? {\n pricedTokens: group.pricedTokens,\n unpricedTokens: Math.max(0, recordedTokens - group.pricedTokens),\n recordedTokens,\n pricingCoverage: recordedTokens === 0 ? null : group.pricedTokens / recordedTokens\n }\n : undefined;\n if (amount === null) {\n return {\n kind: group.kind,\n currency: group.currency,\n amount: null,\n convertedAmount: null,\n comparisonCurrency,\n conversionUnavailableReason: 'unknown-native-amount',\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n }\n if (group.currency === comparisonCurrency) {\n return {\n kind: group.kind,\n currency: group.currency,\n amount,\n convertedAmount: amount,\n comparisonCurrency,\n conversionUnavailableReason: null,\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n }\n const rate = rates.get(group.currency);\n if (!rate) {\n return {\n kind: group.kind,\n currency: group.currency,\n amount,\n convertedAmount: null,\n comparisonCurrency,\n conversionUnavailableReason: 'missing-rate',\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n }\n if (end.getTime() - new Date(rate.observed_at).getTime() > 7 * 24 * 60 * 60 * 1000) {\n return {\n kind: group.kind,\n currency: group.currency,\n amount,\n convertedAmount: null,\n comparisonCurrency,\n conversionUnavailableReason: 'stale-rate',\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n }\n usedRates.set(rate.id, {\n id: rate.id,\n baseCurrency: rate.base_currency,\n quoteCurrency: rate.quote_currency,\n rate: rate.rate,\n observedAt: rate.observed_at,\n source: rate.source\n });\n return {\n kind: group.kind,\n currency: group.currency,\n amount,\n convertedAmount: amount * rate.rate,\n comparisonCurrency,\n conversionUnavailableReason: null,\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n })\n .sort(\n (left, right) =>\n left.kind.localeCompare(right.kind) || left.currency.localeCompare(right.currency)\n );\n}\n\nfunction buildRiskSummary(providers: ProviderOverview[]): UsageOverview['riskSummary'] {\n const risks = providers.flatMap((provider) =>\n provider.billingDomains.flatMap((domain) =>\n domain.quotaBuckets.flatMap((bucket) => {\n if (bucket.usedPercent === null) return [];\n return [\n {\n providerId: provider.id,\n displayName: provider.displayName,\n billingDomainId: domain.id,\n bucketId: bucket.id,\n label: bucket.label,\n remainingPercent: Math.max(0, 100 - bucket.usedPercent),\n resetsAt: bucket.resetsAt,\n forecast: domain.forecasts.find((forecast) => forecast.bucketId === bucket.id) ?? null,\n authority: bucket.authority,\n observedAt: bucket.observedAt ?? domain.freshness.lastSuccessAt\n }\n ];\n })\n )\n );\n risks.sort(\n (left, right) =>\n left.remainingPercent - right.remainingPercent ||\n left.providerId.localeCompare(right.providerId) ||\n left.bucketId.localeCompare(right.bucketId)\n );\n const candidates = providers\n .flatMap((provider) =>\n provider.billingDomains.flatMap((domain) => {\n if (domain.freshness.status !== 'fresh' || domain.health.status !== 'healthy') return [];\n const buckets = domain.quotaBuckets.filter(\n (bucket): bucket is QuotaBucket & { usedPercent: number } => bucket.usedPercent !== null\n );\n if (buckets.length === 0) return [];\n const limitingBucket = [...buckets].sort(\n (left, right) => right.usedPercent - left.usedPercent || left.id.localeCompare(right.id)\n )[0];\n const remaining = Math.min(...buckets.map((bucket) => 100 - bucket.usedPercent));\n const predictsFailure = domain.forecasts.some((forecast) => !forecast.willLastUntilReset);\n const predictsSuccess =\n domain.forecasts.length > 0 &&\n domain.forecasts.every((forecast) => forecast.willLastUntilReset);\n const coveragePenalty = domain.forecastCoverage === 'discontinuous' ? 40 : 0;\n return [\n {\n provider,\n domain,\n limitingBucket,\n remaining,\n score:\n remaining +\n (predictsSuccess ? 20 : 0) -\n (predictsFailure ? 100 : 0) -\n coveragePenalty,\n predictsSuccess\n }\n ];\n })\n )\n .sort(\n (left, right) =>\n right.score - left.score ||\n left.provider.id.localeCompare(right.provider.id) ||\n left.domain.id.localeCompare(right.domain.id)\n );\n const selected = candidates[0];\n return {\n mostConstrained: risks[0] ?? null,\n recommendation: selected\n ? {\n providerId: selected.provider.id,\n displayName: selected.provider.displayName,\n billingDomainId: selected.domain.id,\n score: round(selected.score),\n readOnly: true,\n reasonKeys: [\n 'highest-safe-capacity',\n ...(selected.predictsSuccess ? (['forecast-lasts-until-reset'] as const) : [])\n ],\n evidence: {\n remainingPercent: round(selected.remaining),\n freshness: selected.domain.freshness.status,\n forecastCoverage: selected.domain.forecastCoverage,\n authority: selected.limitingBucket.authority,\n observedAt:\n selected.limitingBucket.observedAt ?? selected.domain.freshness.lastSuccessAt\n }\n }\n : null\n };\n}\n\nfunction round(value: number): number {\n return Number(value.toFixed(6));\n}\n\nfunction pricingInputsChanged(\n existing: Record<string, unknown>,\n observation: ReturnType<typeof normalizeTokenObservation>\n): boolean {\n return (\n existing.billing_domain_id !== observation.billingDomainId ||\n existing.model !== (observation.model?.trim() || '__unclassified__') ||\n existing.observed_at !== observation.observedAt ||\n Number(existing.total_tokens) !== observation.recordedTokens ||\n Number(existing.input_tokens) !== observation.inputTokens ||\n Number(existing.output_tokens) !== observation.outputTokens ||\n Number(existing.reasoning_tokens) !== observation.reasoningTokens ||\n Number(existing.cache_read_tokens) !== observation.cacheReadTokens ||\n Number(existing.cache_write_tokens) !== observation.cacheWriteTokens ||\n (existing.cache_write_5m_tokens === null ? null : Number(existing.cache_write_5m_tokens)) !==\n (observation.cacheWriteTokenBreakdown?.fiveMinute ?? null) ||\n (existing.cache_write_1h_tokens === null ? null : Number(existing.cache_write_1h_tokens)) !==\n (observation.cacheWriteTokenBreakdown?.oneHour ?? null) ||\n Number(existing.unclassified_tokens) !== observation.unclassifiedTokens ||\n existing.reasoning_semantics !== observation.tokenSemantics.reasoning ||\n existing.cache_read_semantics !== observation.tokenSemantics.cacheRead ||\n existing.cache_write_semantics !== observation.tokenSemantics.cacheWrite ||\n existing.model_attribution !== observation.modelAttribution ||\n existing.time_precision !== observation.timePrecision ||\n existing.aggregation_temporality !== observation.aggregationTemporality\n );\n}\n\nfunction preciseAmount(value: number): number {\n return Number(value.toFixed(12));\n}\n\nfunction tokenAuthority(authorities: string | null): ProviderOverview['tokenAuthority'] {\n if (!authorities) return null;\n const values = authorities.split(',') as DataAuthority[];\n return values.length === 1 ? values[0] : 'mixed';\n}\n\nfunction coverageFromCount(count: number): CoverageLevel {\n return count > 0 ? 'complete' : 'unavailable';\n}\n\nfunction tokenCoverage(tokens: TokenRow, excludedObservationCount = 0): CoverageLevel {\n if (tokens.observation_count === 0) {\n return excludedObservationCount > 0 ? 'partial' : 'unavailable';\n }\n const scopes = commaSeparatedValues<TokenUsageScope>(tokens.usage_scopes);\n const temporalities = commaSeparatedValues<TokenAggregationTemporality>(\n tokens.aggregation_temporalities\n );\n return scopes.includes('this-mac') || temporalities.includes('delta') ? 'partial' : 'complete';\n}\n\nfunction selectSummaryBillingDomainId(\n providerId: string,\n domains: BillingDomainRow[]\n): string | null {\n if (providerId === 'grok') {\n return (\n domains.find((domain) => domain.id === 'grok-build-subscription')?.id ??\n domains[0]?.id ??\n null\n );\n }\n return domains[0]?.id ?? null;\n}\n\nfunction freshnessStatus(\n lastSuccessAt: string | null,\n now: Date\n): ProviderOverview['freshness']['status'] {\n if (!lastSuccessAt) return 'unavailable';\n return now.getTime() - new Date(lastSuccessAt).getTime() <= FRESHNESS_WINDOW_MS\n ? 'fresh'\n : 'stale';\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, rm } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { isAbsolute, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { UsageApplication } from '../core/usage-application.js';\nimport type { Connector } from '../core/types.js';\nimport { defaultConnectorDefinitions } from '../connectors/catalog.js';\nimport { ClaudeCodeConnector } from '../connectors/claude-code/claude-code-connector.js';\nimport { parseClaudeOtlpMetrics } from '../connectors/claude-code/claude-otlp.js';\nimport { ScreenReaderClaudeQuotaClient } from '../connectors/claude-code/claude-usage-screen-client.js';\nimport { CodexConnector } from '../connectors/codex/codex-connector.js';\nimport { StdioCodexAccountClient } from '../connectors/codex/stdio-codex-account-client.js';\nimport { OpenCodeLocalConnector } from '../connectors/opencode-local/opencode-local-connector.js';\nimport { CliOpenCodeLocalHistoryClient } from '../connectors/opencode-go/local-opencode-history-client.js';\nimport { OfficialOpenCodeGoClient } from '../connectors/opencode-go/official-opencode-go-client.js';\nimport { OpenCodeAuthFileReader } from '../connectors/opencode-go/opencode-auth-reader.js';\nimport { OpenCodeGoConnector } from '../connectors/opencode-go/opencode-go-connector.js';\nimport { DshConnector } from '../connectors/dsh/dsh-connector.js';\nimport { AntigravityConnector } from '../connectors/antigravity/antigravity-connector.js';\nimport { AntigravitySqliteUsageClient } from './antigravity-sqlite-usage-client.js';\nimport { GrokBuildConnector } from '../connectors/grok-build/grok-build-connector.js';\n\nimport { parseGrokOtlpMetrics } from '../connectors/grok-build/grok-telemetry.js';\nimport { StdioGrokBillingClient } from '../connectors/grok-build/stdio-grok-billing-client.js';\nimport {\n XaiApiConnector,\n XaiManagementApiClient\n} from '../connectors/xai-api/xai-api-connector.js';\nimport { writeDaemonState } from './daemon-state.js';\nimport { CollectionScheduler } from './collection-scheduler.js';\nimport { EcbExchangeRateProvider } from './ecb-exchange-rate-provider.js';\nimport { MacOsKeychainSecretStore } from './keychain-secret-store.js';\nimport { MacOsNotifier } from './macos-notifier.js';\nimport { MacOsStartAtLoginManager } from './macos-start-at-login-manager.js';\nimport { startLocalServer } from './local-server.js';\nimport { PathDiscoveryProbe } from './path-discovery-probe.js';\nimport {\n LocalTranscriptUsageClient,\n type LocalTranscriptProvider\n} from './local-transcript-usage-client.js';\nimport { SqliteUsageRepository } from './sqlite-usage-repository.js';\n\nexport async function runDaemon(home: string): Promise<void> {\n await mkdir(home, { recursive: true, mode: 0o700 });\n const demoEnabled = process.env.AGENT_USAGE_DEMO === '1';\n const repository = new SqliteUsageRepository(join(home, 'usage.sqlite'), {\n hideDemoProvider: !demoEnabled\n });\n const keychainService = process.env.AGENT_USAGE_KEYCHAIN_SERVICE;\n const launchAgentLabel = process.env.AGENT_USAGE_LAUNCH_AGENT_LABEL;\n const nodeImport = process.env.AGENT_USAGE_NODE_IMPORT;\n const secretStore = new MacOsKeychainSecretStore(undefined, {\n service: keychainService\n });\n const openCodeLocalHistoryClient = new CliOpenCodeLocalHistoryClient();\n const application = new UsageApplication({\n repository,\n connectors: [\n ...(demoEnabled ? [createDemoConnector()] : []),\n new CodexConnector(\n new StdioCodexAccountClient(),\n undefined,\n localTranscriptClient('codex', home)\n ),\n new ClaudeCodeConnector({\n quotaClient: new ScreenReaderClaudeQuotaClient(),\n historyClient: localTranscriptClient('claude-code', home)\n }),\n new OpenCodeGoConnector({\n accountClient: new OfficialOpenCodeGoClient({\n authReader: new OpenCodeAuthFileReader()\n }),\n localHistoryClient: openCodeLocalHistoryClient\n }),\n new OpenCodeLocalConnector({ localHistoryClient: openCodeLocalHistoryClient }),\n new GrokBuildConnector({\n billingClient: new StdioGrokBillingClient(),\n historyClient: localTranscriptClient('grok', home)\n }),\n new XaiApiConnector({ accountClient: new XaiManagementApiClient({ secretStore }) }),\n new DshConnector({ historyClient: localTranscriptClient('dsh', home) }),\n new AntigravityConnector({\n historyClient: new AntigravitySqliteUsageClient({\n roots: [\n join(homedir(), '.gemini/antigravity-cli'),\n join(homedir(), '.gemini/antigravity')\n ],\n cachePath: join(home, 'antigravity-usage-cache.json')\n })\n })\n ],\n connectorDefinitions: defaultConnectorDefinitions,\n discoveryProbe: new PathDiscoveryProbe(),\n secretStore,\n exchangeRateProvider: new EcbExchangeRateProvider(),\n notifier: new MacOsNotifier(),\n startAtLoginManager: new MacOsStartAtLoginManager({\n userHome: homedir(),\n executable: process.execPath,\n cliPath: process.argv[1],\n applicationHome: home,\n label: launchAgentLabel,\n nodeImport,\n environmentVariables: {\n AGENT_USAGE_DAEMON: '1',\n ...(keychainService ? { AGENT_USAGE_KEYCHAIN_SERVICE: keychainService } : {}),\n ...(launchAgentLabel ? { AGENT_USAGE_LAUNCH_AGENT_LABEL: launchAgentLabel } : {}),\n ...(nodeImport ? { AGENT_USAGE_NODE_IMPORT: nodeImport } : {}),\n ...(demoEnabled ? { AGENT_USAGE_DEMO: '1' } : {})\n }\n }),\n connectorPolicies: Object.fromEntries(\n [\n 'codex',\n 'claude-code',\n 'opencode-go',\n 'opencode',\n 'grok',\n 'xai-api',\n 'dsh',\n 'antigravity'\n ].map((id) => [\n id,\n { minimumIntervalMs: 5 * 60 * 1000, timeoutMs: id === 'claude-code' ? 25_000 : 20_000 }\n ])\n ),\n\n telemetryIngestors: [\n {\n id: 'claude-code',\n consentId: 'claude-code',\n parse: parseClaudeOtlpMetrics\n },\n {\n id: 'grok',\n consentId: 'grok',\n parse: parseGrokOtlpMetrics\n }\n ]\n });\n process.stderr.write('Agent Usage: starting local web service…\\n');\n const server = await startLocalServer({\n application,\n staticDirectory: locateStaticDirectory()\n });\n await writeDaemonState(home, {\n pid: process.pid,\n origin: server.origin,\n apiToken: server.apiToken\n });\n if (!demoEnabled) {\n void repository.deleteDemoProviderDataAsync().catch(() => {\n process.stderr.write(\n 'Agent Usage: stale demo data remains hidden and will be cleaned on a later startup.\\n'\n );\n });\n }\n process.stderr.write(`Agent Usage: web service ready at ${server.origin}\\n`);\n process.stderr.write('Agent Usage: updating cached usage in the background…\\n');\n void application.startBackgroundProcessing().then(() => {\n process.stderr.write('Agent Usage: background data update finished.\\n');\n });\n const scheduler = new CollectionScheduler({ application });\n scheduler.start();\n\n await new Promise<void>((resolveStop) => {\n let stopping = false;\n const stop = async () => {\n if (stopping) return;\n stopping = true;\n scheduler.stop();\n await server.close();\n repository.close();\n await rm(join(home, 'daemon.json'), { force: true });\n resolveStop();\n };\n process.once('SIGTERM', () => void stop());\n process.once('SIGINT', () => void stop());\n });\n}\n\nfunction localTranscriptClient(\n provider: LocalTranscriptProvider,\n applicationHome: string\n): LocalTranscriptUsageClient {\n return new LocalTranscriptUsageClient({\n provider,\n roots: localTranscriptRoots(provider),\n cachePath: join(applicationHome, 'cache', `${provider}-transcripts.json`)\n });\n}\n\nfunction localTranscriptRoots(provider: LocalTranscriptProvider): string[] {\n if (provider === 'codex') {\n // Codex moves finished rollouts from `sessions` into `archived_sessions`. Both hold the\n // same evidence, so reading only the live directory loses local history as it ages out.\n const home = resolveHomeOverride(process.env.CODEX_HOME, '.codex');\n return [join(home, 'sessions'), join(home, 'archived_sessions')];\n }\n if (provider === 'claude-code') {\n return [join(resolveHomeOverride(process.env.CLAUDE_CONFIG_DIR, '.claude'), 'projects')];\n }\n if (provider === 'dsh') {\n // One dsh home holds every profile's sessions, so a TUI layer composed on\n // dsh needs no root of its own.\n return [join(resolveHomeOverride(process.env.DSH_HOME, '.dsh'), 'sessions')];\n }\n return [join(resolveHomeOverride(process.env.GROK_HOME, '.grok'), 'sessions')];\n}\n\nfunction resolveHomeOverride(value: string | undefined, fallback: string): string {\n const configured = value?.trim();\n if (!configured) return join(homedir(), fallback);\n if (configured === '~') return homedir();\n if (configured.startsWith('~/')) return join(homedir(), configured.slice(2));\n return isAbsolute(configured) ? configured : resolve(configured);\n}\n\nfunction createDemoConnector(): Connector {\n return {\n id: 'demo',\n async collect() {\n const now = new Date();\n const reset = new Date(now.getTime() + 3 * 60 * 60 * 1000);\n return {\n provider: { id: 'demo', displayName: 'Demo Agent' },\n billingDomains: [{ id: 'subscription', displayName: 'Demo subscription' }],\n quotaBuckets: [\n {\n id: 'five-hour',\n billingDomainId: 'subscription',\n label: '5 hour',\n usedPercent: 42,\n resetsAt: reset.toISOString(),\n authority: 'official-account'\n }\n ],\n usage: [\n {\n id: 'demo-usage-v1',\n billingDomainId: 'subscription',\n model: 'demo-model',\n observedAt: now.toISOString(),\n inputTokens: 12_400,\n outputTokens: 3_100,\n cacheReadTokens: 8_000,\n cacheWriteTokens: 700,\n authority: 'official-account'\n }\n ],\n costs: [],\n observedAt: now.toISOString()\n };\n }\n };\n}\n\nfunction locateStaticDirectory(): string | undefined {\n const candidates = [\n fileURLToPath(new URL('./web', import.meta.url)),\n fileURLToPath(new URL('../../dist/web', import.meta.url))\n ];\n return candidates.find((candidate) => existsSync(join(candidate, 'index.html')));\n}\n","#!/usr/bin/env node\n\nimport { spawn } from 'node:child_process';\nimport { connect as tcpConnect } from 'node:net';\nimport { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\n\nimport { Command } from 'commander';\nimport open from 'open';\n\nimport type { CustomModelRate, DoctorReport, UsageOverview } from './core/types.js';\nimport { publicErrorMessage } from './core/redaction.js';\nimport { readDaemonState, type DaemonState } from './server/daemon-state.js';\n\nconst program = new Command();\nprogram\n .name('agent-usage')\n .description('View local coding-agent quota, token, and cost usage')\n .option('--home <directory>', 'application data directory', defaultHome())\n .option('--no-open', 'start the dashboard without opening a browser');\n\nprogram\n .command('status')\n .description('print the current provider overview')\n .option('--json', 'emit machine-readable JSON')\n .option('--window <window>', 'history window: 24h, 7d, or 30d', '24h')\n .action(async (options: { json?: boolean; window: string }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n if (!['24h', '7d', '30d'].includes(options.window)) {\n throw new Error('Unsupported history window. Use 24h, 7d, or 30d.');\n }\n const response = await fetch(`${state.origin}/api/overview?window=${options.window}`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) {\n throw new Error(`Daemon returned HTTP ${response.status}`);\n }\n const overview = (await response.json()) as UsageOverview;\n process.stdout.write(options.json ? `${JSON.stringify(overview)}\\n` : formatOverview(overview));\n });\n\nprogram\n .command('telemetry-env')\n .description('print opt-in provider OTLP environment variables')\n .option('--provider <provider>', 'claude-code or grok', 'claude-code')\n .action(async (options: { provider: string }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n if (options.provider === 'grok') {\n process.stdout.write(\n [\n 'export GROK_EXTERNAL_OTEL=1',\n 'export OTEL_METRICS_EXPORTER=otlp',\n 'export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf',\n `export OTEL_EXPORTER_OTLP_ENDPOINT=${state.origin}/grok`,\n `export OTEL_EXPORTER_OTLP_HEADERS='Authorization=Bearer ${state.apiToken}'`,\n 'export OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta'\n ].join('\\n') + '\\n'\n );\n return;\n }\n if (options.provider !== 'claude-code') {\n throw new Error('Unsupported telemetry provider. Use claude-code or grok.');\n }\n process.stdout.write(\n [\n 'export CLAUDE_CODE_ENABLE_TELEMETRY=1',\n 'export OTEL_METRICS_EXPORTER=otlp',\n 'export OTEL_EXPORTER_OTLP_PROTOCOL=http/json',\n `export OTEL_EXPORTER_OTLP_ENDPOINT=${state.origin}`,\n `export OTEL_EXPORTER_OTLP_HEADERS='Authorization=Bearer ${state.apiToken}'`,\n 'export OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta'\n ].join('\\n') + '\\n'\n );\n });\n\nprogram\n .command('doctor')\n .description('print connector discovery and provider health diagnostics')\n .option('--json', 'emit machine-readable JSON')\n .action(async (options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/doctor`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error('Daemon diagnostics are unavailable');\n const report = (await response.json()) as DoctorReport;\n process.stdout.write(\n options.json ? `${JSON.stringify(report)}\\n` : `${formatDoctor(report)}\\n`\n );\n });\n\nprogram\n .command('export')\n .description('export redacted usage and cost rows')\n .option('--format <format>', 'json or csv', 'json')\n .option('--window <window>', 'history window: 24h, 7d, or 30d', '24h')\n .option('--include-account-identifiers', 'include available provider account identifiers')\n .action(\n async (options: { format: string; window: string; includeAccountIdentifiers?: boolean }) => {\n if (!['json', 'csv'].includes(options.format)) throw new Error('Use json or csv.');\n if (!['24h', '7d', '30d'].includes(options.window)) {\n throw new Error('Unsupported history window. Use 24h, 7d, or 30d.');\n }\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const parameters = new URLSearchParams({\n format: options.format,\n window: options.window,\n includeAccountIdentifiers: String(Boolean(options.includeAccountIdentifiers))\n });\n const response = await fetch(`${state.origin}/api/export?${parameters}`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n process.stdout.write(`${await response.text()}\\n`);\n }\n );\n\nprogram\n .command('retention')\n .description('show raw-observation retention and daily aggregation status')\n .option('--json', 'emit machine-readable JSON')\n .option('--compact', 'run compaction before showing status')\n .action(async (options: { json?: boolean; compact?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(\n `${state.origin}/api/retention${options.compact ? '/compact' : ''}`,\n {\n method: options.compact ? 'POST' : 'GET',\n headers: { authorization: `Bearer ${state.apiToken}` }\n }\n );\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const status = (await response.json()) as Record<string, unknown>;\n process.stdout.write(\n options.json\n ? `${JSON.stringify(status)}\\n`\n : `${Object.entries(status)\n .map(([key, value]) => `${key}: ${String(value)}`)\n .join('\\n')}\\n`\n );\n });\n\nprogram\n .command('clear')\n .description('clear local usage data and optionally product-owned Keychain entries')\n .option('--yes', 'confirm the destructive operation')\n .option('--include-product-secrets', 'also delete Agent Usage Keychain entries')\n .action(async (options: { yes?: boolean; includeProductSecrets?: boolean }) => {\n if (!options.yes) throw new Error('Refusing to clear data without --yes.');\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/data`, {\n method: 'DELETE',\n headers: {\n authorization: `Bearer ${state.apiToken}`,\n 'content-type': 'application/json'\n },\n body: JSON.stringify({ deleteProductSecrets: Boolean(options.includeProductSecrets) })\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const result = (await response.json()) as { productSecretsDeleted: number };\n process.stdout.write(\n `Cleared local usage data; deleted ${result.productSecretsDeleted} product secret(s).\\n`\n );\n });\n\nprogram\n .command('discover')\n .description('discover supported local agent clients')\n .option('--json', 'emit machine-readable JSON')\n .action(async (options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/connectors/discover`, {\n method: 'POST',\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const connectors = (await response.json()) as Array<{\n displayName: string;\n state: string;\n installed: boolean;\n }>;\n if (options.json) process.stdout.write(`${JSON.stringify(connectors)}\\n`);\n else {\n process.stdout.write(\n `${connectors\n .map(\n (connector) =>\n `${connector.displayName} — ${connector.state}${connector.installed ? '' : ' (not installed)'}`\n )\n .join('\\n')}\\n`\n );\n }\n });\n\nprogram\n .command('monitoring')\n .description('show background collection, notification, and start-at-login settings')\n .option('--json', 'emit machine-readable JSON')\n .action(async (options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/monitoring`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const status = (await response.json()) as {\n settings: Record<string, unknown>;\n connectors: unknown[];\n };\n process.stdout.write(\n options.json\n ? `${JSON.stringify(status)}\\n`\n : `${Object.entries(status.settings)\n .map(([key, value]) => `${key}: ${String(value)}`)\n .join('\\n')}\\n`\n );\n });\n\nprogram\n .command('start-at-login <action>')\n .description('enable, disable, or show start-at-login state')\n .action(async (action: string) => {\n if (!['enable', 'disable', 'status'].includes(action)) {\n throw new Error('Use enable, disable, or status.');\n }\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n if (action !== 'status') {\n const response = await fetch(`${state.origin}/api/monitoring/settings`, {\n method: 'PATCH',\n headers: {\n authorization: `Bearer ${state.apiToken}`,\n 'content-type': 'application/json'\n },\n body: JSON.stringify({ startAtLogin: action === 'enable' })\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n }\n const response = await fetch(`${state.origin}/api/monitoring`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const status = (await response.json()) as { settings: { startAtLogin: boolean } };\n process.stdout.write(`${status.settings.startAtLogin ? 'enabled' : 'disabled'}\\n`);\n });\n\nconst ratesCommand = program\n .command('rates')\n .description('view and manage custom model rates for custom endpoints');\n\nratesCommand\n .command('list')\n .description('list configured custom model rates')\n .option('--json', 'emit machine-readable JSON')\n .action(async (options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/custom-rates`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const data = (await response.json()) as { rates: CustomModelRate[] };\n if (options.json) {\n process.stdout.write(`${JSON.stringify(data.rates, null, 2)}\\n`);\n return;\n }\n if (data.rates.length === 0) {\n process.stdout.write('No custom model rates configured.\\n');\n return;\n }\n for (const rate of data.rates) {\n const domain = rate.billingDomainId ?? '*';\n process.stdout.write(\n `${rate.id} | ${rate.providerId} | domain: ${domain} | model: ${rate.model} | in: $${rate.ratesPerMillion.input}/M | out: $${rate.ratesPerMillion.output}/M | cache: $${rate.ratesPerMillion.cacheRead}/M\\n`\n );\n }\n });\n\nratesCommand\n .command('set <model>')\n .description('set custom model rate')\n .requiredOption('--provider <provider>', 'provider id (e.g. dsh)')\n .option('--domain <domain>', 'billing domain id (omit for wildcard across all routes)')\n .requiredOption('--input <rate>', 'input rate in USD per million tokens', parseFloat)\n .requiredOption('--output <rate>', 'output rate in USD per million tokens', parseFloat)\n .option('--cache-read <rate>', 'cache read rate in USD per million tokens', parseFloat, 0)\n .option('--id <id>', 'custom model rate ID to update')\n .action(\n async (\n model: string,\n options: {\n provider: string;\n domain?: string;\n input: number;\n output: number;\n cacheRead: number;\n id?: string;\n }\n ) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/custom-rates`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${state.apiToken}`,\n 'content-type': 'application/json',\n origin: state.origin\n },\n body: JSON.stringify({\n ...(options.id ? { id: options.id } : {}),\n providerId: options.provider,\n billingDomainId: options.domain || null,\n model,\n inputRate: options.input,\n outputRate: options.output,\n cacheReadRate: options.cacheRead\n })\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const data = (await response.json()) as { rate: CustomModelRate };\n process.stdout.write(\n `Custom model rate configured for ${data.rate.model} (ID: ${data.rate.id})\\n`\n );\n }\n );\n\nratesCommand\n .command('get <id>')\n .description('get details of a custom model rate by ID')\n .option('--json', 'emit machine-readable JSON')\n .action(async (id: string, options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/custom-rates/${encodeURIComponent(id)}`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) {\n if (response.status === 404) throw new Error(`Custom model rate not found: ${id}`);\n throw new Error(`Daemon returned HTTP ${response.status}`);\n }\n const data = (await response.json()) as { rate: CustomModelRate };\n if (options.json) {\n process.stdout.write(`${JSON.stringify(data.rate, null, 2)}\\n`);\n return;\n }\n const domain = data.rate.billingDomainId ?? '*';\n process.stdout.write(\n `${data.rate.id} | ${data.rate.providerId} | domain: ${domain} | model: ${data.rate.model} | in: $${data.rate.ratesPerMillion.input}/M | out: $${data.rate.ratesPerMillion.output}/M | cache: $${data.rate.ratesPerMillion.cacheRead}/M | updated: ${data.rate.updatedAt}\\n`\n );\n });\n\nratesCommand\n .command('delete <id>')\n .description('delete custom model rate by ID')\n .action(async (id: string) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/custom-rates/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n headers: {\n authorization: `Bearer ${state.apiToken}`,\n origin: state.origin\n }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n process.stdout.write(`Deleted custom model rate ${id}\\n`);\n });\n\nprogram\n .command('serve')\n .description('run the internal local daemon')\n .action(async () => {\n const home = resolve(program.opts<{ home: string }>().home);\n const { runDaemon } = await import('./server/runtime.js');\n await runDaemon(home);\n });\n\nprogram.action(async () => {\n const options = program.opts<{ home: string; open: boolean }>();\n const home = resolve(options.home);\n const state = await ensureDaemon(home);\n const response = await fetch(`${state.origin}/api/launch-token`, {\n method: 'POST',\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok)\n throw new Error(`Unable to create dashboard launch URL (HTTP ${response.status})`);\n const body = (await response.json()) as { url: string };\n if (options.open) {\n await open(body.url);\n }\n process.stdout.write(`${body.url}\\n`);\n});\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n const message = publicErrorMessage(error);\n process.stderr.write(`agent-usage: ${message}\\n`);\n process.exitCode = 1;\n});\n\nasync function requireDaemonState(home: string): Promise<DaemonState> {\n try {\n const state = await readDaemonState(home);\n if (await isHealthy(state)) return state;\n } catch {\n // Normalize missing, malformed, and stale state into one actionable message.\n }\n throw new Error('Local daemon is not running');\n}\n\nasync function ensureDaemon(home: string): Promise<DaemonState> {\n try {\n return await requireDaemonState(home);\n } catch {\n process.stderr.write('Agent Usage: starting local web service…\\n');\n const child = spawn(\n process.execPath,\n [...process.execArgv, process.argv[1], '--home', home, 'serve'],\n {\n detached: true,\n env: { ...process.env, AGENT_USAGE_DAEMON: '1' },\n stdio: 'ignore'\n }\n );\n child.unref();\n }\n\n const deadline = Date.now() + 8_000;\n while (Date.now() < deadline) {\n try {\n const state = await readDaemonState(home);\n if (await isHealthy(state)) {\n process.stderr.write(\n 'Agent Usage: web service ready; usage data is updating in the background.\\n'\n );\n return state;\n }\n } catch {\n // The child has not written a valid state file yet.\n }\n await new Promise((resolveWait) => setTimeout(resolveWait, 50));\n }\n throw new Error('Local daemon did not become ready');\n}\n\nasync function isHealthy(state: DaemonState): Promise<boolean> {\n if (!(await originIsListening(state.origin))) return false;\n try {\n const response = await fetch(`${state.origin}/api/health`, {\n headers: { authorization: `Bearer ${state.apiToken}` },\n signal: AbortSignal.timeout(5_000)\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n// A daemon that is still starting is looked for over a plain socket rather than with a request\n// abandoned half a second later. Waiting for a cold start asks well over a hundred times, and a\n// request torn down mid-connect can throw from inside Node's own socket callbacks, past the\n// `try` around it, ending the command instead of starting the dashboard.\nasync function originIsListening(origin: string): Promise<boolean> {\n const { hostname, port } = new URL(origin);\n return await new Promise((resolveListening) => {\n const socket = tcpConnect({ host: hostname, port: Number(port) });\n const settle = (listening: boolean) => {\n socket.destroy();\n resolveListening(listening);\n };\n socket.setTimeout(500, () => settle(false));\n socket.once('connect', () => settle(true));\n socket.once('error', () => settle(false));\n });\n}\n\nfunction formatOverview(overview: UsageOverview): string {\n const summary = formatGlobalSummary(overview);\n if (overview.providers.length === 0) {\n return `${summary}No providers have reported usage yet.\\n`;\n }\n const recommendation = overview.riskSummary.recommendation\n ? `Recommendation: ${overview.riskSummary.recommendation.displayName} · ${overview.riskSummary.recommendation.billingDomainId} — ${overview.riskSummary.recommendation.reasonKeys\n .map((reason) =>\n reason === 'forecast-lasts-until-reset'\n ? 'forecast lasts through reset'\n : 'highest safe capacity among fresh providers'\n )\n .join('; ')} (${formatEvidence(\n overview.riskSummary.recommendation.evidence.authority ?? 'unavailable',\n overview.riskSummary.recommendation.evidence.observedAt\n )}; advice only)\\n`\n : '';\n return `${summary}${recommendation}${overview.providers\n .map((provider) => {\n const quota = provider.quotaBuckets\n .map(\n (bucket) =>\n `${bucket.label}: ${bucket.usedPercent ?? '?'}% used (${formatEvidence(\n bucket.authority,\n bucket.observedAt ?? provider.freshness.lastSuccessAt\n )})`\n )\n .join(', ');\n const diagnostic =\n provider.health.status === 'degraded'\n ? ` — degraded: ${provider.health.message} ${provider.health.recovery}`\n : '';\n const domains = provider.billingDomains\n .map((domain) => {\n const costs = domain.history.costs\n .map(\n (cost) =>\n `${cost.kind} ${\n cost.amount === null ? 'unknown' : `${cost.amount} ${cost.currency}`\n } (${formatEvidence(\n cost.authorities?.join('+') ?? 'unavailable',\n cost.observedAt\n )})`\n )\n .join(', ');\n return `${domain.displayName}: ${domain.history.window} ${domain.history.tokenTotals.total} tokens (${formatEvidence(\n domain.history.authorities?.join('+') ?? domain.tokenAuthority ?? 'unavailable',\n domain.history.lastObservedAt ??\n domain.freshness?.lastSuccessAt ??\n provider.freshness.lastSuccessAt\n )}; ${formatTokenEvidence(domain.history.tokenEvidence)})${costs ? `; ${costs}` : ''}`;\n })\n .join(' | ');\n return `${provider.displayName} — ${quota || 'quota unavailable'}${domains ? ` — ${domains}` : ''}${diagnostic}`;\n })\n .join('\\n')}\\n`;\n}\n\nfunction formatGlobalSummary(overview: UsageOverview): string {\n const summary = overview.globalSummary;\n const tokenAuthorities = [\n ...new Set(\n overview.providers.flatMap((provider) =>\n provider.billingDomains\n .filter((domain) => domain.id === provider.summaryBillingDomainId)\n .flatMap((domain) => domain.history.authorities ?? [])\n )\n )\n ].sort();\n const tokenObservedAt = overview.providers\n .flatMap((provider) =>\n provider.billingDomains\n .filter((domain) => domain.id === provider.summaryBillingDomainId)\n .flatMap((domain) => (domain.history.lastObservedAt ? [domain.history.lastObservedAt] : []))\n )\n .sort((left, right) => right.localeCompare(left))[0];\n const tokenEvidence = formatEvidence(\n tokenAuthorities.join('+') || 'unavailable',\n tokenObservedAt\n );\n const tokens =\n summary.recordedTokens === null\n ? 'recorded tokens unavailable'\n : `${summary.recordedTokens} recorded tokens (${tokenEvidence})`;\n const retailMetric = overview.workbench.costs.retailEquivalent;\n const retail =\n summary.apiRetailEquivalent.status === 'available' &&\n summary.apiRetailEquivalent.amount !== null\n ? `${summary.apiRetailEquivalent.amount} ${summary.apiRetailEquivalent.currency} (${formatEvidence(\n retailMetric.authorities.join('+') || 'unavailable',\n retailMetric.observedAt\n )})`\n : 'unavailable';\n const constrained = summary.mostConstrained\n ? `${summary.mostConstrained.displayName} · ${summary.mostConstrained.label} (${summary.mostConstrained.remainingPercent}% remaining; ${formatEvidence(\n summary.mostConstrained.authority ?? 'unavailable',\n summary.mostConstrained.observedAt\n )})`\n : 'unavailable';\n return `Summary (${summary.window}): ${tokens}; API retail equivalent ${retail}; ${summary.tokenEvidence.classifiedTokens}/${summary.tokenEvidence.recordedTokens} classified; precision ${summary.tokenEvidence.timePrecisions.join('+') || 'unavailable'}; most constrained ${constrained}; latest observed ${summary.latestObservedAt ?? 'unavailable'}; generated ${summary.generatedAt}\\n`;\n}\n\nfunction formatTokenEvidence(\n evidence: UsageOverview['providers'][number]['tokenEvidence']\n): string {\n const precisions =\n evidence.timePrecisions.length > 0 ? evidence.timePrecisions.join('+') : 'unknown';\n const scopes = evidence.usageScopes.length > 0 ? evidence.usageScopes.join('+') : 'unknown';\n const temporalities =\n evidence.aggregationTemporalities.length > 0\n ? evidence.aggregationTemporalities.join('+')\n : 'unknown';\n return `${evidence.classifiedTokens}/${evidence.recordedTokens} classified; ${evidence.unclassifiedTokens} unclassified; precision ${precisions}; scope ${scopes}; temporality ${temporalities}`;\n}\n\nfunction formatEvidence(authority: string, observedAt: string | null | undefined): string {\n return `source ${authority} at ${observedAt ?? 'unknown time'}`;\n}\n\nfunction formatDoctor(report: DoctorReport): string {\n const providerLines = report.providers.map((provider) =>\n provider.status === 'degraded'\n ? `${provider.displayName} — degraded${provider.health.errorCode ? ` (${provider.health.errorCode})` : ''}: ${provider.health.recovery ?? 'Run refresh and inspect connector diagnostics.'}`\n : `${provider.displayName} — healthy`\n );\n const connectorLines = report.connectors.map((connector) =>\n connector.status === 'degraded'\n ? `${connector.id} connection — ${connector.category}: ${connector.recovery}`\n : `${connector.id} connection — healthy`\n );\n return [\n `Daemon — ${report.daemon.status}`,\n `Database — ${report.database.status}`,\n ...providerLines,\n ...connectorLines\n ].join('\\n');\n}\n\nfunction defaultHome(): string {\n return join(homedir(), 'Library', 'Application Support', 'Agent Usage');\n}\n"],"mappings":"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","names":["tokenAuthority","snapshot","snapshot","entry","resolve","snapshot","status","subscriptionEnvironment","reset","resolve","z","safeFailure","incompleteTranscriptFailure","snapshot","spawn","unavailableError","schemaError","process","resolve","safeFailure","z","resolve","z","readFile","join","z","mapQuota","safeFailure","z","incompleteTranscriptFailure","safeFailure","resolve","end","createHash","mkdir","readFile","rename","writeFile","join","spawn","safeFailure","homedir","join","billingDomains","safeFailure","createHash","readFile","rename","stat","writeFile","mkdir","createRequire","dirname","join","DatabaseSync","stableId","spawn","homedir","join","z","expectScript","resolve","unavailableError","JsonLinePeer","process","z","safeFailure","centSchema","schema","spawn","spawn","resolve","mkdir","writeFile","dirname","join","access","createReadStream","join","z","contentType","isAbsolute","join","resolve","createRequire","dirname","resolve","snapshot","preciseAmount","rates","retailEquivalent","reportedEstimate","DatabaseSync","billingDomains","existsSync","mkdir","rm","homedir","isAbsolute","join","resolve","spawn","homedir","join","resolve","open","response","runDaemon"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/redaction.ts","../src/server/daemon-state.ts","../src/core/diagnostic-category.ts","../src/core/usage-export.ts","../src/core/token-normalization.ts","../src/core/retail-pricing.ts","../src/core/plan-pricing.ts","../src/core/usage-application.ts","../src/connectors/catalog.ts","../src/core/quota-normalization.ts","../src/connectors/claude-code/claude-code-connector.ts","../src/connectors/otlp.ts","../src/connectors/claude-code/claude-otlp.ts","../src/connectors/claude-code/claude-usage-screen-client.ts","../src/connectors/codex/codex-connector.ts","../src/connectors/codex/stdio-codex-account-client.ts","../src/connectors/opencode-local/opencode-local-connector.ts","../src/connectors/opencode-go/local-opencode-history-client.ts","../src/connectors/opencode-go/official-opencode-go-client.ts","../src/connectors/opencode-go/opencode-auth-reader.ts","../src/connectors/opencode-go/opencode-go-connector.ts","../src/connectors/grok-build/grok-build-connector.ts","../src/server/zstd-frames.ts","../src/server/local-transcript-usage-client.ts","../src/connectors/dsh/dsh-connector.ts","../src/server/antigravity-quota-client.ts","../src/connectors/antigravity/antigravity-connector.ts","../src/server/antigravity-sqlite-usage-client.ts","../src/connectors/grok-build/grok-telemetry.ts","../src/connectors/grok-build/stdio-grok-billing-client.ts","../src/connectors/xai-api/xai-api-connector.ts","../src/server/collection-scheduler.ts","../src/server/ecb-exchange-rate-provider.ts","../src/server/keychain-secret-store.ts","../src/server/macos-notifier.ts","../src/server/macos-start-at-login-manager.ts","../src/server/otlp-protobuf.ts","../src/server/local-server.ts","../src/server/path-discovery-probe.ts","../src/server/sqlite-usage-repository.ts","../src/server/runtime.ts","../src/cli.ts"],"sourcesContent":["export function redactSensitiveText(value: string): string {\n return value\n .replace(/Bearer\\s+\\S+/gi, 'Bearer [REDACTED]')\n .replace(/\\b(sk-[A-Za-z0-9_-]{8,}|xai-[A-Za-z0-9_-]{8,})\\b/g, '[REDACTED]')\n .replace(\n /((?:api[-_ ]?key|token|secret|key)\\s*(?::|=|is|was)?\\s*)[A-Za-z0-9._-]{8,}/gi,\n '$1[REDACTED]'\n );\n}\n\nexport function publicErrorMessage(error: unknown): string {\n return redactSensitiveText(error instanceof Error ? error.message : 'Unexpected error');\n}\n","import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { z } from 'zod';\n\nexport const daemonStateSchema = z.object({\n pid: z.number().int().positive(),\n origin: z.string().url(),\n apiToken: z.string().min(1)\n});\n\nexport type DaemonState = z.infer<typeof daemonStateSchema>;\n\nexport async function readDaemonState(home: string): Promise<DaemonState> {\n const content = await readFile(join(home, 'daemon.json'), 'utf8');\n return daemonStateSchema.parse(JSON.parse(content));\n}\n\nexport async function writeDaemonState(home: string, state: DaemonState): Promise<void> {\n await mkdir(home, { recursive: true, mode: 0o700 });\n const temporaryPath = join(home, `daemon.${process.pid}.tmp`);\n const statePath = join(home, 'daemon.json');\n await writeFile(temporaryPath, JSON.stringify(state), { mode: 0o600 });\n await rename(temporaryPath, statePath);\n}\n","import type { DiagnosticCategory } from './types.js';\n\nexport function classifyDiagnosticCategory(code: string, message: string): DiagnosticCategory {\n const value = `${code} ${message}`.toLowerCase();\n if (/missing|binary|not[ -]?installed/.test(value)) return 'missing-binary';\n if (/not[ -]?configured|credential.*missing|key.*missing/.test(value)) {\n return 'not-configured';\n }\n if (/unauthori[sz]ed|permission|forbidden|\\b401\\b|\\b403\\b/.test(value)) {\n return 'unauthorized';\n }\n if (/unsupported|capability/.test(value)) return 'unsupported';\n if (/schema|shape|parse/.test(value)) return 'schema-mismatch';\n if (/rate[ -]?limit|\\b429\\b/.test(value)) return 'rate-limited';\n if (/timeout|timed out/.test(value)) return 'timeout';\n if (/stale/.test(value)) return 'stale';\n return 'unavailable';\n}\n","import { redactSensitiveText } from './redaction.js';\nimport type { UsageExportArtifact, UsageExportRequest, UsageOverview } from './types.js';\n\nexport function buildUsageExport(\n overview: UsageOverview,\n request: UsageExportRequest,\n accountIdentifiers: Record<string, string> = {}\n): UsageExportArtifact {\n const usageObservationAliases = new Map<string, string>();\n const costObservationAliases = new Map<string, string>();\n const usageObservationAlias = (\n providerId: string,\n billingDomainId: string,\n observationId: string | null | undefined\n ): string | null => {\n if (!observationId) return null;\n const key = `${providerId}\\u0000${billingDomainId}\\u0000${observationId}`;\n const existing = usageObservationAliases.get(key);\n if (existing) return existing;\n const alias = `usage-observation-${usageObservationAliases.size + 1}`;\n usageObservationAliases.set(key, alias);\n return alias;\n };\n const costObservationAlias = (\n providerId: string,\n billingDomainId: string,\n costId: string\n ): string => {\n const key = `${providerId}\\u0000${billingDomainId}\\u0000${costId}`;\n const existing = costObservationAliases.get(key);\n if (existing) return existing;\n const alias = `cost-observation-${costObservationAliases.size + 1}`;\n costObservationAliases.set(key, alias);\n return alias;\n };\n const rows = overview.providers.flatMap((provider) =>\n provider.billingDomains.flatMap((domain) => {\n const history = domain.history;\n const tokenAuthority = exportAuthority(\n history.authorities ??\n (domain.tokenAuthority && domain.tokenAuthority !== 'mixed'\n ? [domain.tokenAuthority]\n : [])\n );\n const tokenRow = {\n window: history.window,\n windowStart: history.start,\n windowEnd: history.end,\n timeZone: history.timeZone,\n provider: redactSensitiveText(provider.displayName),\n billingDomain: redactSensitiveText(domain.displayName),\n ...(request.includeAccountIdentifiers\n ? { accountIdentifier: accountIdentifiers[provider.id] ?? null }\n : {}),\n freshness: domain.freshness.status,\n lastSuccessAt: domain.freshness.lastSuccessAt,\n recordType: 'tokens',\n recordId: null,\n model: null,\n usageObservationId: null,\n observedAt: history.lastObservedAt ?? null,\n timePrecision: null,\n authority: tokenAuthority,\n totalTokens: history.tokenTotals.total,\n recordedTokens: history.tokenEvidence.recordedTokens,\n sourceReportedTokens: history.tokenEvidence.sourceReportedTokens,\n sourceReportedObservationCount: history.tokenEvidence.sourceReportedObservationCount,\n observationCount: history.tokenEvidence.observationCount,\n unclassifiedTokens: history.tokenEvidence.unclassifiedTokens,\n classifiedTokens: history.tokenEvidence.classifiedTokens,\n classificationCoverage: history.tokenEvidence.classificationCoverage,\n totalDerivations: history.tokenEvidence.totalDerivations,\n timePrecisions: history.tokenEvidence.timePrecisions,\n usageScopes: history.tokenEvidence.usageScopes,\n aggregationTemporalities: history.tokenEvidence.aggregationTemporalities,\n reasoningSemantics: null,\n cacheReadSemantics: null,\n cacheWriteSemantics: null,\n inputTokens: history.tokenTotals.input,\n outputTokens: history.tokenTotals.output,\n reasoningTokens: history.tokenTotals.reasoning,\n cacheReadTokens: history.tokenTotals.cacheRead,\n cacheWriteTokens: history.tokenTotals.cacheWrite,\n costKind: null,\n costPurpose: null,\n legacyPurposeUnknown: false,\n amount: null,\n currency: null,\n pricedTokens: null,\n unpricedTokens: null,\n pricingCoverage: null,\n priceVersions: null,\n priceCanonicalModels: null,\n priceEffectiveAts: null,\n priceEffectiveUntils: null,\n priceCurrencies: null,\n priceRatesPerMillion: null,\n priceSourceUrls: null,\n priceContextTiers: null,\n priceLineItems: null,\n calculatedAt: null\n };\n const modelObservations = history.models.flatMap((model) =>\n (model.observations ?? []).map((observation) => ({\n model: model.model,\n observation\n }))\n );\n const modelObservationIds = new Set(\n modelObservations.map(({ observation }) => observation.id)\n );\n const tokenObservationRows = [\n ...modelObservations,\n ...(history.unclassified.observations ?? [])\n .filter((observation) => !modelObservationIds.has(observation.id))\n .map((observation) => ({\n model: observation.model,\n observation\n }))\n ].map(({ model, observation }) => {\n const recordedTokens = observation.recordedTokens;\n const classifiedTokens = observation.classifiedTokens;\n const exportId = usageObservationAlias(provider.id, domain.id, observation.id);\n return {\n ...tokenRow,\n recordType: 'token-observation',\n recordId: exportId,\n model,\n usageObservationId: exportId,\n observedAt: observation.observedAt,\n timePrecision: observation.timePrecision,\n authority: observation.authority,\n totalTokens: recordedTokens,\n recordedTokens,\n sourceReportedTokens: observation.sourceReportedTotalTokens,\n sourceReportedObservationCount: observation.sourceReportedTotalTokens === null ? 0 : 1,\n observationCount: 1,\n unclassifiedTokens: observation.unclassifiedTokens,\n classifiedTokens,\n classificationCoverage: recordedTokens === 0 ? null : classifiedTokens / recordedTokens,\n totalDerivations: [observation.totalDerivation],\n timePrecisions: [observation.timePrecision],\n usageScopes: [observation.usageScope],\n aggregationTemporalities: [observation.aggregationTemporality],\n reasoningSemantics: observation.tokenSemantics.reasoning,\n cacheReadSemantics: observation.tokenSemantics.cacheRead,\n cacheWriteSemantics: observation.tokenSemantics.cacheWrite,\n inputTokens: observation.tokenTotals.input,\n outputTokens: observation.tokenTotals.output,\n reasoningTokens: observation.tokenTotals.reasoning,\n cacheReadTokens: observation.tokenTotals.cacheRead,\n cacheWriteTokens: observation.tokenTotals.cacheWrite\n };\n });\n const observationsById = new Map([\n ...history.models.flatMap((model) =>\n (model.observations ?? []).map((observation) => [observation.id, observation] as const)\n ),\n ...(history.unclassified.observations ?? []).map(\n (observation) => [observation.id, observation] as const\n )\n ]);\n const costRows = history.costs.map((cost) => {\n const authorities = (domain.costs ?? [])\n .filter(\n (candidate) =>\n candidate.kind === cost.kind &&\n candidate.currency.toUpperCase() === cost.currency.toUpperCase() &&\n candidate.observedAt >= history.start &&\n candidate.observedAt < history.end\n )\n .map((candidate) => candidate.authority);\n return {\n ...tokenRow,\n recordType: 'cost',\n observedAt: cost.observedAt ?? null,\n authority: exportAuthority(authorities),\n totalTokens: null,\n recordedTokens: cost.pricingEvidence?.recordedTokens ?? null,\n sourceReportedTokens: null,\n sourceReportedObservationCount: null,\n observationCount: null,\n unclassifiedTokens: null,\n classifiedTokens: null,\n classificationCoverage: null,\n totalDerivations: null,\n timePrecisions: null,\n usageScopes: null,\n aggregationTemporalities: null,\n inputTokens: null,\n outputTokens: null,\n reasoningTokens: null,\n cacheReadTokens: null,\n cacheWriteTokens: null,\n costKind: cost.kind,\n costPurpose: cost.kind === 'legacy-unknown' ? null : cost.kind,\n legacyPurposeUnknown: cost.kind === 'legacy-unknown',\n amount: cost.amount,\n currency: cost.currency,\n pricedTokens: cost.pricingEvidence?.pricedTokens ?? null,\n unpricedTokens: cost.pricingEvidence?.unpricedTokens ?? null,\n pricingCoverage: cost.pricingEvidence?.pricingCoverage ?? null,\n priceVersions: cost.priceSnapshots.map((snapshot) => snapshot.version),\n priceCanonicalModels: cost.priceSnapshots.map((snapshot) => snapshot.canonicalModel),\n priceEffectiveAts: cost.priceSnapshots.map((snapshot) => snapshot.effectiveAt),\n priceEffectiveUntils: cost.priceSnapshots.map((snapshot) => snapshot.effectiveUntil),\n priceCurrencies: cost.priceSnapshots.map((snapshot) => snapshot.currency),\n priceRatesPerMillion: cost.priceSnapshots.map((snapshot) =>\n JSON.stringify(snapshot.ratesPerMillion)\n ),\n priceSourceUrls: cost.priceSnapshots.flatMap((snapshot) =>\n snapshot.sourceUrl ? [snapshot.sourceUrl] : []\n ),\n priceContextTiers: cost.priceSnapshots.flatMap((snapshot) =>\n snapshot.contextTier ? [snapshot.contextTier] : []\n ),\n priceLineItems: null,\n calculatedAt: null\n };\n });\n const costObservationRows = (domain.costs ?? [])\n .filter((cost) => cost.observedAt >= history.start && cost.observedAt < history.end)\n .map((cost) => {\n const snapshot = cost.priceSnapshot ?? null;\n const observation = cost.usageObservationId\n ? observationsById.get(cost.usageObservationId)\n : null;\n return {\n ...tokenRow,\n recordType: 'cost-observation',\n recordId: costObservationAlias(provider.id, domain.id, cost.id),\n model: cost.model ?? null,\n usageObservationId: usageObservationAlias(\n provider.id,\n domain.id,\n cost.usageObservationId\n ),\n observedAt: cost.observedAt ?? null,\n timePrecision: observation?.timePrecision ?? null,\n authority: cost.authority,\n totalTokens: null,\n recordedTokens: null,\n sourceReportedTokens: null,\n sourceReportedObservationCount: null,\n observationCount: null,\n unclassifiedTokens: null,\n classifiedTokens: null,\n classificationCoverage: null,\n totalDerivations: null,\n timePrecisions: null,\n usageScopes: null,\n aggregationTemporalities: null,\n inputTokens: null,\n outputTokens: null,\n reasoningTokens: null,\n cacheReadTokens: null,\n cacheWriteTokens: null,\n costKind: cost.kind,\n costPurpose: cost.kind === 'legacy-unknown' ? null : cost.kind,\n legacyPurposeUnknown: cost.kind === 'legacy-unknown',\n amount: cost.amount,\n currency: cost.currency,\n pricedTokens: cost.pricedTokens,\n unpricedTokens: null,\n pricingCoverage: null,\n priceVersions: snapshot ? [snapshot.version] : [],\n priceCanonicalModels: snapshot ? [snapshot.canonicalModel] : [],\n priceEffectiveAts: snapshot ? [snapshot.effectiveAt] : [],\n priceEffectiveUntils: snapshot ? [snapshot.effectiveUntil] : [],\n priceCurrencies: snapshot ? [snapshot.currency] : [],\n priceRatesPerMillion: snapshot ? [JSON.stringify(snapshot.ratesPerMillion)] : [],\n priceSourceUrls: snapshot?.sourceUrl ? [snapshot.sourceUrl] : [],\n priceContextTiers: snapshot?.contextTier ? [snapshot.contextTier] : [],\n priceLineItems: cost.lineItems ? JSON.stringify(cost.lineItems) : null,\n calculatedAt: cost.calculatedAt ?? null\n };\n });\n return [tokenRow, ...tokenObservationRows, ...costRows, ...costObservationRows];\n })\n );\n const generatedDay = overview.generatedAt.slice(0, 10);\n const filename = `agent-usage-${request.window ?? '24h'}-${generatedDay}.${request.format}`;\n if (request.format === 'csv') {\n return {\n format: 'csv',\n filename,\n contentType: 'text/csv; charset=utf-8',\n body: rowsToCsv(rows)\n };\n }\n const firstHistory = overview.providers[0]?.billingDomains[0]?.history;\n return {\n format: 'json',\n filename,\n contentType: 'application/json; charset=utf-8',\n body: JSON.stringify({\n version: 2,\n generatedAt: overview.generatedAt,\n query: {\n window: request.window ?? '24h',\n timeZone: firstHistory?.timeZone ?? request.timeZone ?? 'UTC',\n start: firstHistory?.start ?? null,\n end: firstHistory?.end ?? overview.generatedAt\n },\n privacy: {\n accountIdentifiersIncluded: Boolean(request.includeAccountIdentifiers),\n secretsIncluded: false\n },\n rows\n })\n };\n}\n\nfunction exportAuthority(values: string[]): string {\n const unique = [...new Set(values.filter(Boolean))].sort();\n return unique.length === 0 ? 'unavailable' : unique.length === 1 ? unique[0] : 'mixed';\n}\n\nconst CSV_COLUMNS = [\n 'window',\n 'windowStart',\n 'windowEnd',\n 'timeZone',\n 'provider',\n 'billingDomain',\n 'accountIdentifier',\n 'freshness',\n 'lastSuccessAt',\n 'recordType',\n 'recordId',\n 'model',\n 'usageObservationId',\n 'observedAt',\n 'timePrecision',\n 'authority',\n 'totalTokens',\n 'recordedTokens',\n 'sourceReportedTokens',\n 'sourceReportedObservationCount',\n 'observationCount',\n 'unclassifiedTokens',\n 'classifiedTokens',\n 'classificationCoverage',\n 'totalDerivations',\n 'timePrecisions',\n 'usageScopes',\n 'aggregationTemporalities',\n 'reasoningSemantics',\n 'cacheReadSemantics',\n 'cacheWriteSemantics',\n 'inputTokens',\n 'outputTokens',\n 'reasoningTokens',\n 'cacheReadTokens',\n 'cacheWriteTokens',\n 'costKind',\n 'costPurpose',\n 'legacyPurposeUnknown',\n 'amount',\n 'currency',\n 'pricedTokens',\n 'unpricedTokens',\n 'pricingCoverage',\n 'priceVersions',\n 'priceCanonicalModels',\n 'priceEffectiveAts',\n 'priceEffectiveUntils',\n 'priceCurrencies',\n 'priceRatesPerMillion',\n 'priceSourceUrls',\n 'priceContextTiers',\n 'priceLineItems',\n 'calculatedAt'\n] as const;\n\nfunction rowsToCsv(rows: Array<Record<string, unknown>>): string {\n return [\n CSV_COLUMNS.join(','),\n ...rows.map((row) => CSV_COLUMNS.map((column) => csvCell(row[column])).join(','))\n ].join('\\n');\n}\n\nfunction csvCell(value: unknown): string {\n if (value === null || value === undefined) return '';\n const text = String(value);\n return /[\",\\r\\n]/.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\n}\n","import type {\n NormalizedUsageObservation,\n TokenModelAttribution,\n TokenSemantics,\n UsageObservation\n} from './types.js';\n\nconst LEGACY_TOKEN_SEMANTICS: TokenSemantics = {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n};\n\nexport function normalizeTokenObservation(\n observation: UsageObservation\n): NormalizedUsageObservation {\n const inputTokens = tokenCount(observation.inputTokens, 'inputTokens');\n const outputTokens = tokenCount(observation.outputTokens, 'outputTokens');\n const reasoningTokens = tokenCount(observation.reasoningTokens ?? 0, 'reasoningTokens');\n const cacheReadTokens = tokenCount(observation.cacheReadTokens, 'cacheReadTokens');\n const cacheWriteTokens = tokenCount(observation.cacheWriteTokens, 'cacheWriteTokens');\n const cacheWriteTokenBreakdown = observation.cacheWriteTokenBreakdown\n ? {\n fiveMinute: tokenCount(\n observation.cacheWriteTokenBreakdown.fiveMinute,\n 'cacheWriteTokenBreakdown.fiveMinute'\n ),\n oneHour: tokenCount(\n observation.cacheWriteTokenBreakdown.oneHour,\n 'cacheWriteTokenBreakdown.oneHour'\n )\n }\n : null;\n if (\n cacheWriteTokenBreakdown &&\n cacheWriteTokenBreakdown.fiveMinute + cacheWriteTokenBreakdown.oneHour !== cacheWriteTokens\n ) {\n throw new Error('cacheWriteTokenBreakdown must equal cacheWriteTokens');\n }\n const tokenSemantics = observation.tokenSemantics ?? LEGACY_TOKEN_SEMANTICS;\n const categorizedTokens =\n inputTokens +\n outputTokens +\n (tokenSemantics.reasoning === 'separate' ? reasoningTokens : 0) +\n (tokenSemantics.cacheRead === 'separate' ? cacheReadTokens : 0) +\n (tokenSemantics.cacheWrite === 'separate' ? cacheWriteTokens : 0);\n const sourceReportedTotalTokens = nullableTokenCount(\n observation.sourceReportedTotalTokens,\n 'sourceReportedTotalTokens'\n );\n const reconciledRemainderTokens = nullableTokenCount(\n observation.reconciledRemainderTokens,\n 'reconciledRemainderTokens'\n );\n if (sourceReportedTotalTokens !== null && reconciledRemainderTokens !== null) {\n throw new Error(\n 'sourceReportedTotalTokens and reconciledRemainderTokens are mutually exclusive'\n );\n }\n if (sourceReportedTotalTokens !== null && sourceReportedTotalTokens < categorizedTokens) {\n throw new Error(\n 'sourceReportedTotalTokens must be greater than or equal to categorized tokens'\n );\n }\n if (reconciledRemainderTokens !== null && categorizedTokens !== 0) {\n throw new Error('reconciledRemainderTokens must not contain categorized tokens');\n }\n const totalDerivation =\n sourceReportedTotalTokens !== null\n ? ('source-reported' as const)\n : reconciledRemainderTokens !== null\n ? ('reconciled-remainder' as const)\n : ('categorized' as const);\n const recordedTokens =\n sourceReportedTotalTokens ?? reconciledRemainderTokens ?? categorizedTokens;\n const inferredModelAttribution = inferModelAttribution(observation.model);\n const modelAttribution =\n inferredModelAttribution === 'unclassified'\n ? 'unclassified'\n : (observation.modelAttribution ?? inferredModelAttribution);\n const unclassifiedTokens =\n modelAttribution === 'unclassified'\n ? recordedTokens\n : Math.max(0, recordedTokens - categorizedTokens);\n\n return {\n ...observation,\n inputTokens,\n outputTokens,\n reasoningTokens,\n cacheReadTokens,\n cacheWriteTokens,\n cacheWriteTokenBreakdown,\n sourceReportedTotalTokens,\n reconciledRemainderTokens,\n tokenSemantics,\n modelAttribution,\n timePrecision: observation.timePrecision ?? 'unknown',\n usageScope: observation.usageScope ?? 'unknown',\n aggregationTemporality: observation.aggregationTemporality ?? 'unknown',\n recordedTokens,\n unclassifiedTokens,\n totalDerivation\n };\n}\n\nfunction inferModelAttribution(model: string | null): TokenModelAttribution {\n const normalized = model?.trim().toLowerCase();\n return !normalized ||\n normalized === 'all-models' ||\n normalized === 'unknown' ||\n normalized === 'unknown-model'\n ? 'unclassified'\n : 'known';\n}\n\nfunction nullableTokenCount(value: number | null | undefined, field: string): number | null {\n return value === null || value === undefined ? null : tokenCount(value, field);\n}\n\nfunction tokenCount(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${field} must be a non-negative safe integer`);\n }\n return value;\n}\n","import { normalizeTokenObservation } from './token-normalization.js';\nimport type {\n ConnectorSnapshot,\n CostRecord,\n CustomModelRate,\n RetailPriceLineItem,\n RetailTokenKind,\n UsageObservation\n} from './types.js';\n\nexport interface RetailPriceCatalogEntry {\n id: string;\n priceVersion: string;\n providerId: string;\n billingDomainId: string;\n canonicalModel: string;\n aliases: string[];\n currency: 'USD';\n effectiveFrom: string;\n effectiveUntil: string | null;\n contextTier: string;\n contextRule?: RetailPriceContextRule;\n ratesPerMillion: Record<RetailTokenKind, number | null>;\n cacheWriteRatesPerMillion?: {\n fiveMinute: number;\n oneHour: number;\n };\n source: {\n title: string;\n url: string;\n retrievedAt: string;\n };\n}\n\nexport type RetailPriceContextRule =\n | { kind: 'fixed' }\n | {\n kind: 'prompt-tokens';\n minimumExclusive?: number;\n maximumInclusive?: number;\n }\n | {\n kind: 'utc-schedule';\n weekdays: number[];\n ranges: Array<{ startHour: number; endHour: number }>;\n match: 'inside' | 'outside';\n };\n\nexport interface RetailPriceCatalog {\n version: string;\n entries: RetailPriceCatalogEntry[];\n}\n\nexport type RetailPricingUnavailableReason =\n | 'model-unclassified'\n | 'model-unrecognized'\n | 'price-not-effective'\n | 'token-kinds-incomplete'\n | 'pricing-tier-ambiguous';\n\nexport interface RetailPricingDecision {\n observationId: string;\n status: 'priced' | 'unavailable';\n reason: RetailPricingUnavailableReason | null;\n pricedTokens: number;\n}\n\nexport interface RetailPricingResult {\n costs: CostRecord[];\n decisions: RetailPricingDecision[];\n}\n\nexport const ANTHROPIC_PRICING_CATALOG: RetailPriceCatalog = {\n version: '2026-08-28',\n entries: [\n anthropicEntry({\n id: 'anthropic-fable-5-1-2026-09-01',\n priceVersion: 'anthropic-2026-09-01',\n model: 'claude-fable-5-1',\n aliases: [\n 'Claude Fable 5.1',\n 'claude-fable-5.1',\n 'claude-fable-5-1-20260901',\n 'claude-fable-5.1-20260901',\n 'fable-5.1',\n 'fable-5-1'\n ],\n effectiveFrom: '2026-09-01T00:00:00.000Z',\n input: 10,\n output: 50,\n cacheRead: 0.25,\n sourceUrl: 'https://platform.claude.com/docs/en/about-claude/pricing',\n retrievedAt: '2026-09-03'\n }),\n {\n id: 'anthropic-fable-5-2026-06-09',\n priceVersion: 'anthropic-2026-06-09',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n canonicalModel: 'claude-fable-5',\n aliases: ['Claude Fable 5'],\n currency: 'USD',\n effectiveFrom: '2026-06-09T00:00:00.000Z',\n effectiveUntil: null,\n contextTier: 'standard-api',\n contextRule: { kind: 'fixed' },\n ratesPerMillion: {\n input: 10,\n output: 50,\n reasoning: null,\n 'cache-read': 1,\n // Anthropic publishes different 5-minute and 1-hour write rates.\n 'cache-write': null\n },\n cacheWriteRatesPerMillion: { fiveMinute: 12.5, oneHour: 20 },\n source: {\n title: 'Anthropic Claude API pricing',\n url: 'https://platform.claude.com/docs/en/about-claude/pricing',\n retrievedAt: '2026-08-28'\n }\n },\n anthropicEntry({\n id: 'anthropic-sonnet-5-2026-06-30',\n priceVersion: 'anthropic-2026-06-30',\n model: 'claude-sonnet-5',\n aliases: ['Claude Sonnet 5', 'claude-sonnet-5[1m]'],\n effectiveFrom: '2026-06-30T00:00:00.000Z',\n input: 2,\n output: 10,\n cacheRead: 0.2,\n sourceUrl: 'https://www.anthropic.com/news/claude-sonnet-5'\n }),\n anthropicEntry({\n id: 'anthropic-opus-5-2026-07-24',\n priceVersion: 'anthropic-2026-07-24',\n model: 'claude-opus-5',\n aliases: ['Claude Opus 5', 'claude-opus-5[1m]'],\n effectiveFrom: '2026-07-24T00:00:00.000Z',\n input: 5,\n output: 25,\n cacheRead: 0.5,\n sourceUrl: 'https://www.anthropic.com/news/claude-opus-5'\n }),\n anthropicEntry({\n id: 'anthropic-opus-4.8-2026-05-28',\n priceVersion: 'anthropic-2026-05-28',\n model: 'claude-opus-4-8',\n aliases: ['Claude Opus 4.8'],\n effectiveFrom: '2026-05-28T00:00:00.000Z',\n input: 5,\n output: 25,\n cacheRead: 0.5,\n sourceUrl: 'https://www.anthropic.com/news/claude-opus-4-8'\n }),\n anthropicEntry({\n id: 'anthropic-haiku-4.5-2025-10-01',\n priceVersion: 'anthropic-2025-10-01',\n model: 'claude-haiku-4-5-20251001',\n aliases: ['Claude Haiku 4.5', 'claude-haiku-4-5'],\n effectiveFrom: '2025-10-01T00:00:00.000Z',\n input: 1,\n output: 5,\n cacheRead: 0.1,\n sourceUrl: 'https://platform.claude.com/docs/en/about-claude/pricing'\n })\n ]\n};\n\nfunction anthropicEntry(options: {\n id: string;\n priceVersion: string;\n model: string;\n aliases: string[];\n effectiveFrom: string;\n input: number;\n output: number;\n cacheRead: number;\n sourceUrl: string;\n retrievedAt?: string;\n}): RetailPriceCatalogEntry {\n return {\n id: options.id,\n priceVersion: options.priceVersion,\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n canonicalModel: options.model,\n aliases: options.aliases,\n currency: 'USD',\n effectiveFrom: options.effectiveFrom,\n effectiveUntil: null,\n contextTier: 'standard-api',\n contextRule: { kind: 'fixed' },\n ratesPerMillion: {\n input: options.input,\n output: options.output,\n reasoning: null,\n 'cache-read': options.cacheRead,\n // Claude transcripts preserve total cache writes but pricing differs by cache lifetime.\n 'cache-write': null\n },\n cacheWriteRatesPerMillion: {\n fiveMinute: options.input * 1.25,\n oneHour: options.input * 2\n },\n source: {\n title: 'Anthropic Claude API pricing',\n url: options.sourceUrl,\n retrievedAt: options.retrievedAt ?? '2026-08-28'\n }\n };\n}\n\nconst OPENCODE_GO_SOURCE = {\n title: 'OpenCode Go model pricing',\n url: 'https://dev.opencode.ai/docs/go/',\n retrievedAt: '2026-08-28'\n};\nconst XAI_PRICING_SOURCE = {\n title: 'xAI API model pricing',\n url: 'https://docs.x.ai/developers/pricing',\n retrievedAt: '2026-08-28'\n};\nconst OPENAI_GPT_56_SOURCE = {\n title: 'OpenAI GPT-5.6 pricing',\n url: 'https://openai.com/index/gpt-5-6/',\n retrievedAt: '2026-08-28'\n};\nconst OPENAI_GPT_6_ASTRA_SOURCE = {\n title: 'OpenAI GPT-6 Astra pricing',\n url: 'https://developers.openai.com/api/docs/models/gpt-6-astra',\n retrievedAt: '2026-09-05'\n};\nconst OPEN_CODE_GO_SOURCE_PATH = 'packages/web/src/content/docs/go.mdx';\nconst openCodeHistory = (commit: string, effectiveFrom: string) => ({\n effectiveFrom,\n sourceUrl: `https://github.com/anomalyco/opencode/blob/${commit}/${OPEN_CODE_GO_SOURCE_PATH}`\n});\nconst OPEN_CODE_BASE_HISTORY = openCodeHistory(\n '51213520f5f69ce2c6c741adcb2785e017488ade',\n '2026-07-16T23:20:17.000Z'\n);\nconst OPEN_CODE_PRICE_HISTORY: Record<string, { effectiveFrom: string; sourceUrl: string }> = {\n 'glm-5.3-flash': openCodeHistory(\n '830aaf2059e87eab3105dda4c19556206d60c443',\n '2026-08-26T13:49:06.000Z'\n ),\n 'glm-5.3': openCodeHistory(\n 'e23586af2623f1bc2e8e6965d2d7acf7bd03d5c3',\n '2026-08-14T05:48:32.000Z'\n ),\n 'glm-5.2': OPEN_CODE_BASE_HISTORY,\n 'glm-5.1': OPEN_CODE_BASE_HISTORY,\n 'kimi-k3': OPEN_CODE_BASE_HISTORY,\n 'kimi-k2.7-code': OPEN_CODE_BASE_HISTORY,\n 'kimi-k2.6': OPEN_CODE_BASE_HISTORY,\n 'longcat-2.0': openCodeHistory(\n '6bb772215b08b4b7d9243c27286950d85b9f678d',\n '2026-08-24T10:02:51.000Z'\n ),\n 'mimo-v2.5': OPEN_CODE_BASE_HISTORY,\n 'mimo-v2.5-pro': openCodeHistory(\n 'be08207a88f3ae208b782832dc071863375cf734',\n '2026-07-17T15:15:48.000Z'\n ),\n 'minimax-m3': OPEN_CODE_BASE_HISTORY,\n 'minimax-m2.7': OPEN_CODE_BASE_HISTORY,\n 'minimax-m2.5': OPEN_CODE_BASE_HISTORY,\n 'muse-spark-1.2-contributor': openCodeHistory(\n 'e2505d434a6d78904ecfe546c4a1980d26bd8cd1',\n '2026-08-19T19:03:41.000Z'\n ),\n 'qwen3.8-max': openCodeHistory(\n 'e9e747245681127c9f3e300aa8c46f2554fdb294',\n '2026-08-03T06:48:57.000Z'\n ),\n 'qwen3.7-max': OPEN_CODE_BASE_HISTORY,\n 'qwen3.7-plus': OPEN_CODE_BASE_HISTORY,\n 'qwen3.6-plus': OPEN_CODE_BASE_HISTORY,\n hy3: openCodeHistory('411eff73f026d4950c07947c4d983788cb615baa', '2026-07-22T16:41:48.000Z'),\n 'grok-4.6': openCodeHistory(\n 'ac1c048e6420eb4c728fd3e343a1ba7b076cba92',\n '2026-08-25T17:27:48.000Z'\n ),\n 'gpt-5.6-luna': openCodeHistory(\n 'da59457ca4ff55aca0147d4ddb33c495dc72be31',\n '2026-07-31T05:23:25.000Z'\n ),\n 'deepseek-v4-pro': openCodeHistory(\n 'a0f8dccbfe139ffc7137d1eaf6fee6e4195af599',\n '2026-08-16T16:01:15.000Z'\n ),\n 'deepseek-v4-flash': openCodeHistory(\n 'a0f8dccbfe139ffc7137d1eaf6fee6e4195af599',\n '2026-08-16T16:01:15.000Z'\n ),\n 'deepseek-v4-flash-vision-exp': openCodeHistory(\n '813e6f3cec1bfb2cec4f50ca6cb19e225e747e95',\n '2026-08-21T12:57:25.000Z'\n )\n};\nconst OPEN_CODE_FLAT_MODELS: Array<\n [model: string, input: number, output: number, cacheRead: number, cacheWrite?: number]\n> = [\n ['glm-5.3-flash', 0.15, 0.5, 0.03],\n ['glm-5.3', 1.4, 4.4, 0.26],\n ['glm-5.2', 1.4, 4.4, 0.26],\n ['glm-5.1', 1.4, 4.4, 0.26],\n ['kimi-k3', 3, 15, 0.3],\n ['kimi-k2.7-code', 0.95, 4, 0.19],\n ['kimi-k2.6', 0.95, 4, 0.16],\n ['longcat-2.0', 0.3, 1.2, 0.006],\n ['mimo-v2.5', 0.14, 0.28, 0.0028],\n ['mimo-v2.5-pro', 0.435, 0.87, 0.003625],\n ['minimax-m3', 0.3, 1.2, 0.06],\n ['minimax-m2.7', 0.3, 1.2, 0.06, 0.375],\n ['minimax-m2.5', 0.3, 1.2, 0.06, 0.375],\n ['muse-spark-1.2-contributor', 0.1, 0.2, 0.002],\n ['qwen3.8-max', 2, 6, 0.25, 2.5],\n ['qwen3.7-max', 2.5, 7.5, 0.5, 3.125],\n ['hy3', 0.14, 0.58, 0.035]\n];\nconst OPEN_CODE_CONTEXT_MODELS: Array<\n [\n model: string,\n threshold: number,\n short: [input: number, output: number, cacheRead: number, cacheWrite: number | null],\n long: [input: number, output: number, cacheRead: number, cacheWrite: number | null]\n ]\n> = [\n ['grok-4.6', 200_000, [2, 6, 0.5, null], [4, 12, 1, null]],\n ['gpt-5.6-luna', 272_000, [0.2, 1.2, 0.02, 0.25], [0.4, 1.8, 0.04, 0.5]],\n ['qwen3.7-plus', 256_000, [0.4, 1.6, 0.04, 0.5], [1.2, 4.8, 0.12, 1.5]],\n ['qwen3.6-plus', 256_000, [0.5, 3, 0.05, 0.625], [2, 6, 0.2, 2.5]]\n];\nconst DEEPSEEK_GO_MODELS: Array<[model: string, input: number, output: number, cacheRead: number]> =\n [\n ['deepseek-v4-pro', 0.66, 1.98, 0.022],\n ['deepseek-v4-flash', 0.22, 0.66, 0.007],\n ['deepseek-v4-flash-vision-exp', 0.22, 0.66, 0.007]\n ];\nconst WEEKDAY_PEAK_RANGES = [\n { startHour: 1, endHour: 4 },\n { startHour: 6, endHour: 10 }\n];\nconst DEEPSEEK_OFFICIAL_SOURCE = {\n title: 'DeepSeek API pricing',\n url: 'https://api-docs.deepseek.com/quick_start/pricing',\n retrievedAt: '2026-09-01'\n};\n/**\n * DeepSeek's own off-peak rates per million Tokens, read from its published API\n * pricing table. These are deliberately not shared with the OpenCode Go entries\n * above: the two happen to agree today, but each price answers to its own\n * source, so a future reseller markup must not silently move DeepSeek's rates.\n */\nconst DEEPSEEK_OFFICIAL_MODELS: Array<\n [model: string, input: number, output: number, cacheRead: number]\n> = [\n ['deepseek-v4-pro', 0.66, 1.98, 0.022],\n ['deepseek-v4-flash', 0.22, 0.66, 0.007],\n ['deepseek-v4-flash-vision-exp', 0.22, 0.66, 0.007]\n];\n/**\n * DeepSeek published the peak/off-peak schedule for 2026-08-16 but documents no\n * switch instant inside that day, so the interval opens at the first complete\n * day. An earlier request stays unpriced instead of being priced at rates that\n * may not have applied to it yet.\n */\nconst DEEPSEEK_OFFICIAL_EFFECTIVE_FROM = '2026-08-17T00:00:00.000Z';\n\nconst GOOGLE_ANTIGRAVITY_SOURCE = {\n title: 'Google Gemini API pricing',\n url: 'https://ai.google.dev/pricing',\n retrievedAt: '2026-09-02'\n};\n\nconst GOOGLE_ANTIGRAVITY_EFFECTIVE_FROM = '2026-01-01T00:00:00.000Z';\n\nfunction antigravityEntry(options: {\n id: string;\n model: string;\n aliases: string[];\n input: number;\n output: number;\n cacheRead?: number | null;\n source?: { title: string; url: string; retrievedAt: string };\n}): RetailPriceCatalogEntry {\n const versionDate = '2026-09-02';\n return {\n id: options.id,\n priceVersion: `antigravity-${versionDate}`,\n providerId: 'antigravity',\n billingDomainId: 'code-assist-subscription',\n canonicalModel: options.model,\n aliases: options.aliases,\n currency: 'USD',\n effectiveFrom: GOOGLE_ANTIGRAVITY_EFFECTIVE_FROM,\n effectiveUntil: null,\n contextTier: 'standard-api',\n contextRule: { kind: 'fixed' },\n ratesPerMillion: {\n input: options.input,\n output: options.output,\n reasoning: options.output,\n 'cache-read': options.cacheRead ?? null,\n 'cache-write': null\n },\n source: options.source ?? GOOGLE_ANTIGRAVITY_SOURCE\n };\n}\n\nconst DIRECT_OFFICIAL_PRICING_CATALOG: RetailPriceCatalog = {\n version: '2026-08-28-grok-4.6-build',\n entries: [\n ...ANTHROPIC_PRICING_CATALOG.entries,\n ...openAiGpt56Entries('gpt-5.6-sol', [\n ['2026-07-09T00:00:00.000Z', '2026-08-21T00:00:00.000Z', 5, 30],\n ['2026-08-21T00:00:00.000Z', null, 4, 20]\n ]),\n ...openAiGpt56Entries('gpt-5.6-terra', [\n ['2026-07-09T00:00:00.000Z', '2026-07-30T00:00:00.000Z', 2.5, 15],\n ['2026-07-30T00:00:00.000Z', null, 2, 12]\n ]),\n ...openAiGpt56Entries('gpt-5.6-luna', [\n ['2026-07-09T00:00:00.000Z', '2026-07-30T00:00:00.000Z', 1, 6],\n ['2026-07-30T00:00:00.000Z', null, 0.2, 1.2]\n ]),\n ...openAiGpt6AstraEntries(\n 'gpt-6-astra',\n [['2026-09-03T00:00:00.000Z', null, 10, 50]],\n ['GPT-6 Astra', 'gpt-6-astra-2026-09-03', 'gpt-6-astra-20260903', 'astra']\n ),\n ...OPEN_CODE_FLAT_MODELS.map(([model, input, output, cacheRead, cacheWrite]) =>\n openCodeGoEntry(model, 'standard', input, output, cacheRead, cacheWrite ?? null, {\n kind: 'fixed'\n })\n ),\n ...OPEN_CODE_CONTEXT_MODELS.flatMap(([model, threshold, short, long]) => [\n openCodeGoEntry(\n model,\n `prompt-at-or-below-${threshold / 1000}k`,\n short[0],\n short[1],\n short[2],\n short[3],\n { kind: 'prompt-tokens', maximumInclusive: threshold }\n ),\n openCodeGoEntry(\n model,\n `prompt-above-${threshold / 1000}k`,\n long[0],\n long[1],\n long[2],\n long[3],\n { kind: 'prompt-tokens', minimumExclusive: threshold }\n )\n ]),\n ...DEEPSEEK_GO_MODELS.flatMap(([model, input, output, cacheRead]) => [\n openCodeGoEntry(model, 'off-peak', input, output, cacheRead, null, {\n kind: 'utc-schedule',\n weekdays: [1, 2, 3, 4, 5],\n ranges: WEEKDAY_PEAK_RANGES,\n match: 'outside'\n }),\n openCodeGoEntry(model, 'peak', input * 2, output * 2, cacheRead * 2, null, {\n kind: 'utc-schedule',\n weekdays: [1, 2, 3, 4, 5],\n ranges: WEEKDAY_PEAK_RANGES,\n match: 'inside'\n })\n ]),\n ...DEEPSEEK_OFFICIAL_MODELS.flatMap(([model, input, output, cacheRead]) => [\n dshDeepSeekEntry(model, 'off-peak', input, output, cacheRead),\n dshDeepSeekEntry(model, 'peak', input * 2, output * 2, cacheRead * 2)\n ]),\n xaiEntry({\n id: 'xai-grok-build-0.1-short-2026-05-19',\n priceVersion: 'xai-2026-05-19',\n billingDomainId: 'grok-build-subscription',\n model: 'grok-build-0.1',\n aliases: ['grok-build', 'grok-code-fast-1', 'grok-code-fast', 'grok-code-fast-1-0825'],\n effectiveFrom: '2026-05-19T00:00:00.000Z',\n contextTier: 'prompt-at-or-below-200k',\n input: 1,\n output: 2,\n cacheRead: 0.2,\n contextRule: { kind: 'prompt-tokens', maximumInclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-build-0.1-long-2026-05-19',\n priceVersion: 'xai-2026-05-19',\n billingDomainId: 'grok-build-subscription',\n model: 'grok-build-0.1',\n aliases: ['grok-build', 'grok-code-fast-1', 'grok-code-fast', 'grok-code-fast-1-0825'],\n effectiveFrom: '2026-05-19T00:00:00.000Z',\n contextTier: 'prompt-above-200k',\n input: 2,\n output: 4,\n cacheRead: 0.4,\n contextRule: { kind: 'prompt-tokens', minimumExclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-4.6-build-short-2026-08-12',\n priceVersion: 'xai-2026-08-12',\n billingDomainId: 'grok-build-subscription',\n model: 'grok-4.6',\n aliases: ['grok-4.6-build', 'grok-4.6-latest'],\n effectiveFrom: '2026-08-12T00:00:00.000Z',\n contextTier: 'prompt-at-or-below-200k',\n input: 2,\n output: 6,\n cacheRead: 0.5,\n contextRule: { kind: 'prompt-tokens', maximumInclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-4.6-build-long-2026-08-12',\n priceVersion: 'xai-2026-08-12',\n billingDomainId: 'grok-build-subscription',\n model: 'grok-4.6',\n aliases: ['grok-4.6-build', 'grok-4.6-latest'],\n effectiveFrom: '2026-08-12T00:00:00.000Z',\n contextTier: 'prompt-above-200k',\n input: 4,\n output: 12,\n cacheRead: 1,\n contextRule: { kind: 'prompt-tokens', minimumExclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-4.6-short-2026-08-12',\n priceVersion: 'xai-2026-08-12',\n billingDomainId: 'xai-api',\n model: 'grok-4.6',\n aliases: ['grok-4.6-latest'],\n effectiveFrom: '2026-08-12T00:00:00.000Z',\n contextTier: 'prompt-at-or-below-200k',\n input: 2,\n output: 6,\n cacheRead: 0.5,\n contextRule: { kind: 'prompt-tokens', maximumInclusive: 200_000 }\n }),\n xaiEntry({\n id: 'xai-grok-4.6-long-2026-08-12',\n priceVersion: 'xai-2026-08-12',\n billingDomainId: 'xai-api',\n model: 'grok-4.6',\n aliases: ['grok-4.6-latest'],\n effectiveFrom: '2026-08-12T00:00:00.000Z',\n contextTier: 'prompt-above-200k',\n input: 4,\n output: 12,\n cacheRead: 1,\n contextRule: { kind: 'prompt-tokens', minimumExclusive: 200_000 }\n }),\n antigravityEntry({\n id: 'antigravity-gemini-3.7-flash-2026-09-02',\n model: 'gemini-3.7-flash',\n aliases: [\n 'gemini-3.7-flash-high',\n 'gemini-3.7-flash-medium',\n 'gemini-3.7-flash-low',\n 'gemini-3p7-flash-exp-d',\n 'gemini-3.7-flash-exp',\n 'Gemini 3.7 Flash (High)',\n 'Gemini 3.7 Flash (Medium)',\n 'Gemini 3.7 Flash (Low)'\n ],\n input: 0.1,\n output: 0.4,\n cacheRead: 0.025\n }),\n antigravityEntry({\n id: 'antigravity-gemini-3.6-flash-2026-09-02',\n model: 'gemini-3.6-flash',\n aliases: [\n 'gemini-3.6-flash-high',\n 'gemini-3.6-flash-medium',\n 'gemini-3.6-flash-low',\n 'Gemini 3.6 Flash (High)',\n 'Gemini 3.6 Flash (Medium)',\n 'Gemini 3.6 Flash (Low)'\n ],\n input: 0.1,\n output: 0.4,\n cacheRead: 0.025\n }),\n antigravityEntry({\n id: 'antigravity-gemini-3.1-pro-2026-09-02',\n model: 'gemini-3.1-pro',\n aliases: [\n 'gemini-3.1-pro-high',\n 'gemini-3.1-pro-low',\n 'gemini-3p1-pro-exp',\n 'Gemini 3.1 Pro (High)',\n 'Gemini 3.1 Pro (Low)'\n ],\n input: 1.25,\n output: 5.0,\n cacheRead: 0.3125\n }),\n antigravityEntry({\n id: 'antigravity-claude-sonnet-4-6-2026-09-02',\n model: 'claude-sonnet-4-6',\n aliases: ['claude-sonnet-4-6-thinking', 'Claude Sonnet 4.6 (Thinking)'],\n input: 3.0,\n output: 15.0,\n cacheRead: 0.3,\n source: {\n title: 'Anthropic Claude API pricing',\n url: 'https://platform.claude.com/docs/en/about-claude/pricing',\n retrievedAt: '2026-09-02'\n }\n }),\n antigravityEntry({\n id: 'antigravity-claude-opus-4-6-2026-09-02',\n model: 'claude-opus-4-6-thinking',\n aliases: ['claude-opus-4-6', 'Claude Opus 4.6 (Thinking)'],\n input: 15.0,\n output: 75.0,\n cacheRead: 1.5,\n source: {\n title: 'Anthropic Claude API pricing',\n url: 'https://platform.claude.com/docs/en/about-claude/pricing',\n retrievedAt: '2026-09-02'\n }\n }),\n antigravityEntry({\n id: 'antigravity-gpt-oss-120b-2026-09-02',\n model: 'gpt-oss-120b-medium',\n aliases: ['gpt-oss-120b', 'GPT-OSS 120B (Medium)'],\n input: 0.15,\n output: 0.6,\n cacheRead: 0.05\n })\n ]\n};\n\nexport const OFFICIAL_PRICING_CATALOG: RetailPriceCatalog = {\n version: '2026-09-05-gpt-6-astra',\n\n entries: [\n ...DIRECT_OFFICIAL_PRICING_CATALOG.entries,\n ...openCodeLocalHistoryEntries(DIRECT_OFFICIAL_PRICING_CATALOG.entries)\n ]\n};\n\ntype OpenAiPricePeriod = [\n effectiveFrom: string,\n effectiveUntil: string | null,\n input: number,\n output: number\n];\n\nfunction openAiCodexEntries(options: {\n model: string;\n aliases?: string[];\n periods: OpenAiPricePeriod[];\n priceVersionPrefix: string;\n source: { title: string; url: string; retrievedAt: string };\n}): RetailPriceCatalogEntry[] {\n const aliases = options.aliases ?? [];\n return options.periods.flatMap(([effectiveFrom, effectiveUntil, input, output]) => {\n const versionDate = effectiveFrom.slice(0, 10);\n const entry = (tier: 'standard' | 'prompt-above-272k'): RetailPriceCatalogEntry => {\n const long = tier === 'prompt-above-272k';\n const tierInput = long ? input * 2 : input;\n const tierOutput = long ? output * 1.5 : output;\n return {\n id: `openai-${options.model}-${tier}-${versionDate}`,\n priceVersion: `${options.priceVersionPrefix}-${versionDate}`,\n providerId: 'codex',\n billingDomainId: 'subscription',\n canonicalModel: options.model,\n aliases,\n currency: 'USD',\n effectiveFrom,\n effectiveUntil,\n contextTier: tier,\n contextRule: long\n ? { kind: 'prompt-tokens', minimumExclusive: 272_000 }\n : { kind: 'prompt-tokens', maximumInclusive: 272_000 },\n ratesPerMillion: {\n input: tierInput,\n output: tierOutput,\n reasoning: tierOutput,\n 'cache-read': tierInput * 0.1,\n 'cache-write': tierInput * 1.25\n },\n source: options.source\n };\n };\n return [entry('standard'), entry('prompt-above-272k')];\n });\n}\n\nfunction openAiGpt56Entries(\n model: string,\n periods: OpenAiPricePeriod[]\n): RetailPriceCatalogEntry[] {\n return openAiCodexEntries({\n model,\n periods,\n priceVersionPrefix: 'openai-gpt-5.6',\n source: OPENAI_GPT_56_SOURCE\n });\n}\n\nfunction openAiGpt6AstraEntries(\n model: string,\n periods: OpenAiPricePeriod[],\n aliases: string[] = []\n): RetailPriceCatalogEntry[] {\n return openAiCodexEntries({\n model,\n aliases,\n periods,\n priceVersionPrefix: 'openai-gpt-6-astra',\n source: OPENAI_GPT_6_ASTRA_SOURCE\n });\n}\n\nfunction openCodeGoEntry(\n model: string,\n tier: string,\n input: number,\n output: number,\n cacheRead: number,\n cacheWrite: number | null,\n contextRule: RetailPriceContextRule\n): RetailPriceCatalogEntry {\n const history = OPEN_CODE_PRICE_HISTORY[model];\n if (!history) throw new Error(`Missing pinned OpenCode Go price history for ${model}.`);\n const effectiveFrom = history.effectiveFrom;\n const versionDate = effectiveFrom.slice(0, 10);\n return {\n id: `opencode-go-${model}-${tier}-${versionDate}`,\n priceVersion: `opencode-go-${versionDate}`,\n providerId: 'opencode-go',\n billingDomainId: 'go-subscription',\n canonicalModel: model,\n aliases: [`opencode-go/${model}`],\n currency: 'USD',\n effectiveFrom,\n effectiveUntil: null,\n contextTier: tier === 'peak' ? 'weekday-peak-utc' : tier === 'off-peak' ? 'off-peak-utc' : tier,\n contextRule,\n ratesPerMillion: {\n input,\n output,\n reasoning: output,\n 'cache-read': cacheRead,\n 'cache-write': cacheWrite\n },\n source: { ...OPENCODE_GO_SOURCE, url: history.sourceUrl }\n };\n}\n\n/**\n * One DeepSeek API price interval for the dsh Provider.\n *\n * dsh answers through provider routes, so its billing domain is the route key\n * the session log records; `deepseek-official` is the domain DeepSeek's own\n * published rates apply to. Cache writes carry no rate because DeepSeek's table\n * bills only cache-hit and cache-miss input.\n * @param model - DeepSeek model id as the log reports it.\n * @param tier - which side of the published UTC schedule this interval prices.\n * @param input - cache-miss input rate per million Tokens.\n * @param output - output rate per million Tokens.\n * @param cacheRead - cache-hit input rate per million Tokens.\n */\nfunction dshDeepSeekEntry(\n model: string,\n tier: 'off-peak' | 'peak',\n input: number,\n output: number,\n cacheRead: number\n): RetailPriceCatalogEntry {\n const versionDate = DEEPSEEK_OFFICIAL_EFFECTIVE_FROM.slice(0, 10);\n return {\n id: `dsh-deepseek-${model}-${tier}-${versionDate}`,\n priceVersion: `deepseek-official-${versionDate}`,\n providerId: 'dsh',\n billingDomainId: 'deepseek-official',\n canonicalModel: model,\n aliases: [],\n currency: 'USD',\n effectiveFrom: DEEPSEEK_OFFICIAL_EFFECTIVE_FROM,\n effectiveUntil: null,\n contextTier: tier === 'peak' ? 'weekday-peak-utc' : 'off-peak-utc',\n contextRule: {\n kind: 'utc-schedule',\n weekdays: [1, 2, 3, 4, 5],\n ranges: WEEKDAY_PEAK_RANGES,\n match: tier === 'peak' ? 'inside' : 'outside'\n },\n ratesPerMillion: {\n input,\n output,\n reasoning: output,\n 'cache-read': cacheRead,\n 'cache-write': null\n },\n source: DEEPSEEK_OFFICIAL_SOURCE\n };\n}\n\nfunction xaiEntry(options: {\n id: string;\n priceVersion: string;\n billingDomainId: string;\n model: string;\n aliases: string[];\n effectiveFrom: string;\n contextTier: string;\n input: number;\n output: number;\n cacheRead: number;\n contextRule: RetailPriceContextRule;\n}): RetailPriceCatalogEntry {\n return {\n id: options.id,\n priceVersion: options.priceVersion,\n providerId: 'grok',\n billingDomainId: options.billingDomainId,\n canonicalModel: options.model,\n aliases: options.aliases,\n currency: 'USD',\n effectiveFrom: options.effectiveFrom,\n effectiveUntil: null,\n contextTier: options.contextTier,\n contextRule: options.contextRule,\n ratesPerMillion: {\n input: options.input,\n output: options.output,\n reasoning: options.output,\n 'cache-read': options.cacheRead,\n 'cache-write': null\n },\n source: XAI_PRICING_SOURCE\n };\n}\n\nfunction openCodeLocalHistoryEntries(\n entries: RetailPriceCatalogEntry[]\n): RetailPriceCatalogEntry[] {\n return entries.flatMap((entry) => {\n const modelPrefix = openCodeLocalModelPrefix(entry);\n if (!modelPrefix) return [];\n const localModel = (model: string) => (model.includes('/') ? model : `${modelPrefix}/${model}`);\n const canonicalModel = localModel(entry.canonicalModel);\n return [\n {\n ...entry,\n id: `opencode-local-${entry.id}`,\n providerId: 'opencode',\n billingDomainId: 'local-history',\n canonicalModel,\n aliases: [\n ...new Set(\n [entry.canonicalModel, ...entry.aliases]\n .map(localModel)\n .filter((model) => model !== canonicalModel)\n )\n ]\n }\n ];\n });\n}\n\nfunction openCodeLocalModelPrefix(entry: RetailPriceCatalogEntry): string | null {\n if (entry.providerId === 'claude-code' && entry.billingDomainId === 'subscription') {\n return 'anthropic';\n }\n if (entry.providerId === 'codex' && entry.billingDomainId === 'subscription') {\n return 'openai';\n }\n if (entry.providerId === 'grok' && entry.billingDomainId === 'xai-api') return 'xai';\n if (entry.providerId === 'opencode-go' && entry.billingDomainId === 'go-subscription') {\n return 'opencode-go';\n }\n if (entry.providerId === 'antigravity' && entry.billingDomainId === 'code-assist-subscription') {\n return 'google';\n }\n return null;\n}\n\nexport function customModelRateToCatalogEntry(rate: CustomModelRate): RetailPriceCatalogEntry {\n const versionDate = rate.updatedAt.slice(0, 10);\n return {\n id: `custom-rate-${rate.id}`,\n priceVersion: `custom-${rate.id}-${rate.updatedAt}`,\n providerId: rate.providerId,\n billingDomainId: rate.billingDomainId ?? '*',\n canonicalModel: rate.model,\n aliases: [],\n currency: 'USD',\n effectiveFrom: '2020-01-01T00:00:00.000Z',\n effectiveUntil: null,\n contextTier: 'custom-rate',\n contextRule: { kind: 'fixed' },\n ratesPerMillion: {\n input: rate.ratesPerMillion.input,\n output: rate.ratesPerMillion.output,\n reasoning: rate.ratesPerMillion.output,\n 'cache-read': rate.ratesPerMillion.cacheRead,\n 'cache-write': null\n },\n source: {\n title: 'User-configured custom model rate',\n url: 'local://settings/rates',\n retrievedAt: versionDate\n }\n };\n}\n\nexport function mergeCatalogWithCustomRates(\n catalog: RetailPriceCatalog,\n customRates: CustomModelRate[]\n): RetailPriceCatalog {\n if (!customRates || customRates.length === 0) return catalog;\n const customEntries = customRates.map(customModelRateToCatalogEntry);\n const rateFingerprints = customRates\n .map((r) => `${r.id}:${r.updatedAt}`)\n .sort()\n .join(';');\n return {\n version: `${catalog.version}+custom:${rateFingerprints}`,\n entries: [...customEntries, ...catalog.entries]\n };\n}\n\nexport function deriveRetailEquivalentCosts(\n snapshot: ConnectorSnapshot,\n catalog: RetailPriceCatalog = ANTHROPIC_PRICING_CATALOG,\n calculatedAt = snapshot.observedAt\n): RetailPricingResult {\n const costs: CostRecord[] = [];\n const decisions: RetailPricingDecision[] = [];\n for (const observation of snapshot.usage) {\n const result = priceObservation(snapshot.provider.id, observation, catalog, calculatedAt);\n decisions.push(result.decision);\n if (result.cost) costs.push(result.cost);\n }\n return { costs, decisions };\n}\n\nfunction priceObservation(\n providerId: string,\n observation: UsageObservation,\n catalog: RetailPriceCatalog,\n calculatedAt: string\n): { cost: CostRecord | null; decision: RetailPricingDecision } {\n const unavailable = (reason: RetailPricingUnavailableReason) => ({\n cost: null,\n decision: {\n observationId: observation.id,\n status: 'unavailable' as const,\n reason,\n pricedTokens: 0\n }\n });\n const normalized = normalizeTokenObservation(observation);\n if (normalized.modelAttribution !== 'known' || !normalized.model) {\n return unavailable('model-unclassified');\n }\n const normalizedModel = normalized.model.trim().toLowerCase();\n const matchingCandidates = catalog.entries.filter(\n (entry) =>\n entry.providerId === providerId &&\n (entry.billingDomainId === observation.billingDomainId || entry.billingDomainId === '*') &&\n [entry.canonicalModel, ...entry.aliases].some(\n (model) => model.trim().toLowerCase() === normalizedModel\n )\n );\n\n let selectedEntries: RetailPriceCatalogEntry[];\n const customExact = matchingCandidates.filter(\n (e) => e.contextTier === 'custom-rate' && e.billingDomainId === observation.billingDomainId\n );\n if (customExact.length > 0) {\n selectedEntries = customExact;\n } else {\n const customWildcard = matchingCandidates.filter(\n (e) => e.contextTier === 'custom-rate' && e.billingDomainId === '*'\n );\n if (customWildcard.length > 0) {\n selectedEntries = customWildcard;\n } else {\n selectedEntries = matchingCandidates.filter(\n (e) => e.contextTier !== 'custom-rate' && e.billingDomainId === observation.billingDomainId\n );\n }\n }\n\n if (selectedEntries.length === 0) return unavailable('model-unrecognized');\n const timeActiveEntries = selectedEntries.filter(\n (entry) =>\n observation.observedAt >= entry.effectiveFrom &&\n (!entry.effectiveUntil || observation.observedAt < entry.effectiveUntil)\n );\n if (timeActiveEntries.length === 0) return unavailable('price-not-effective');\n const contextMatches = timeActiveEntries.map((entry) => ({\n entry,\n match: matchContext(entry.contextRule ?? { kind: 'fixed' }, normalized)\n }));\n if (contextMatches.some((candidate) => candidate.match === 'unknown')) {\n return unavailable('pricing-tier-ambiguous');\n }\n const activeEntries = contextMatches\n .filter((candidate) => candidate.match === 'match')\n .map((candidate) => candidate.entry);\n if (activeEntries.length !== 1) return unavailable('pricing-tier-ambiguous');\n if (normalized.unclassifiedTokens > 0) return unavailable('token-kinds-incomplete');\n\n const entry = activeEntries[0];\n const billableTokens: Array<{ tokenKind: RetailTokenKind; tokens: number }> = [\n { tokenKind: 'input', tokens: normalized.inputTokens },\n { tokenKind: 'output', tokens: normalized.outputTokens },\n {\n tokenKind: 'reasoning',\n tokens: normalized.tokenSemantics.reasoning === 'separate' ? normalized.reasoningTokens : 0\n },\n {\n tokenKind: 'cache-read',\n tokens: normalized.tokenSemantics.cacheRead === 'separate' ? normalized.cacheReadTokens : 0\n }\n ];\n const cacheWriteTokens =\n normalized.tokenSemantics.cacheWrite === 'separate' ? normalized.cacheWriteTokens : 0;\n const exactCacheWriteItems =\n cacheWriteTokens > 0 && normalized.cacheWriteTokenBreakdown && entry.cacheWriteRatesPerMillion\n ? [\n {\n tokenKind: 'cache-write' as const,\n tokens: normalized.cacheWriteTokenBreakdown.fiveMinute,\n ratePerMillion: entry.cacheWriteRatesPerMillion.fiveMinute\n },\n {\n tokenKind: 'cache-write' as const,\n tokens: normalized.cacheWriteTokenBreakdown.oneHour,\n ratePerMillion: entry.cacheWriteRatesPerMillion.oneHour\n }\n ].filter((item) => item.tokens > 0)\n : null;\n // A null cache-write rate with no explicit write tiers means the provider does\n // not bill cache writes at all (for example OpenCode Go DeepSeek V4, which\n // documents Cached Write as not charged). Treat those tokens as free instead\n // of refusing the whole observation. Models with tiered cache-write rates stay\n // ambiguous until the transcript provides the 5-minute / 1-hour split.\n const cacheWriteFree =\n cacheWriteTokens > 0 &&\n !exactCacheWriteItems &&\n entry.ratesPerMillion['cache-write'] === null &&\n !entry.cacheWriteRatesPerMillion;\n const cacheWriteBillable = cacheWriteTokens > 0 && !exactCacheWriteItems && !cacheWriteFree;\n if (cacheWriteBillable) {\n billableTokens.push({ tokenKind: 'cache-write', tokens: cacheWriteTokens });\n }\n const nonZero = billableTokens.filter((item) => item.tokens > 0);\n if (nonZero.some((item) => entry.ratesPerMillion[item.tokenKind] === null)) {\n return unavailable(\n normalized.cacheWriteTokens > 0 && !cacheWriteFree\n ? 'pricing-tier-ambiguous'\n : 'token-kinds-incomplete'\n );\n }\n const lineItems: RetailPriceLineItem[] = nonZero.map((item) => {\n const ratePerMillion = entry.ratesPerMillion[item.tokenKind]!;\n return {\n ...item,\n ratePerMillion,\n amount: preciseMoney((item.tokens * ratePerMillion) / 1_000_000)\n };\n });\n if (exactCacheWriteItems) {\n lineItems.push(\n ...exactCacheWriteItems.map((item) => ({\n ...item,\n amount: preciseMoney((item.tokens * item.ratePerMillion) / 1_000_000)\n }))\n );\n }\n if (cacheWriteFree) {\n lineItems.push({\n tokenKind: 'cache-write',\n tokens: cacheWriteTokens,\n ratePerMillion: 0,\n amount: 0\n });\n }\n const pricedTokens = lineItems.reduce((total, item) => total + item.tokens, 0);\n if (pricedTokens !== normalized.recordedTokens) return unavailable('token-kinds-incomplete');\n const amount = preciseMoney(lineItems.reduce((total, item) => total + item.amount, 0));\n return {\n cost: {\n id: `retail-equivalent:${observation.id}:${entry.id}`,\n sourceId: observation.id,\n billingDomainId: observation.billingDomainId,\n observedAt: observation.observedAt,\n kind: 'retail-equivalent',\n amount,\n currency: entry.currency,\n authority: 'estimate',\n model: observation.model?.trim() || entry.canonicalModel,\n usageObservationId: observation.id,\n pricedTokens,\n lineItems,\n calculatedAt,\n priceSnapshot: {\n id: entry.id,\n version: entry.priceVersion,\n source: entry.source.title,\n canonicalModel: entry.canonicalModel,\n effectiveAt: entry.effectiveFrom,\n effectiveUntil: entry.effectiveUntil,\n currency: entry.currency,\n ratesPerMillion: { ...entry.ratesPerMillion },\n ...(entry.cacheWriteRatesPerMillion\n ? { cacheWriteRatesPerMillion: { ...entry.cacheWriteRatesPerMillion } }\n : {}),\n sourceUrl: entry.source.url,\n contextTier: entry.contextTier\n }\n },\n decision: {\n observationId: observation.id,\n status: 'priced',\n reason: null,\n pricedTokens\n }\n };\n}\n\nfunction matchContext(\n rule: RetailPriceContextRule,\n observation: ReturnType<typeof normalizeTokenObservation>\n): 'match' | 'no-match' | 'unknown' {\n if (rule.kind === 'fixed') return 'match';\n if (observation.timePrecision !== 'event') return 'unknown';\n if (rule.kind === 'prompt-tokens') {\n if (observation.aggregationTemporality !== 'delta') return 'unknown';\n const promptTokens = observation.inputTokens + observation.cacheReadTokens;\n if (rule.minimumExclusive !== undefined && promptTokens <= rule.minimumExclusive) {\n return 'no-match';\n }\n if (rule.maximumInclusive !== undefined && promptTokens > rule.maximumInclusive) {\n return 'no-match';\n }\n return 'match';\n }\n const observedAt = new Date(observation.observedAt);\n if (Number.isNaN(observedAt.getTime())) return 'unknown';\n const inWeekday = rule.weekdays.includes(observedAt.getUTCDay());\n const hour = observedAt.getUTCHours();\n const inRange = inWeekday\n ? rule.ranges.some((range) => hour >= range.startHour && hour < range.endHour)\n : false;\n return (rule.match === 'inside' ? inRange : !inRange) ? 'match' : 'no-match';\n}\n\nfunction preciseMoney(value: number): number {\n return Number(value.toFixed(12));\n}\n","import type {\n DataAuthority,\n ExchangeRateSnapshot,\n PlanBillingPeriod,\n PlanCatalog,\n PlanCatalogEntry,\n PlanSubscription,\n WorkbenchMoneyMetric,\n WorkbenchPlanBillingPeriod,\n WorkbenchPlanMoneyAmount,\n WorkbenchPlanValue,\n WorkbenchPlanValueEntry,\n WorkbenchPlanValueMeteredDomain,\n WorkbenchPlanValueUnconfiguredDomain\n} from './types.js';\n\nexport type { PlanCatalog, PlanCatalogEntry };\n\n/**\n * Average calendar lengths. A plan price is prorated over the average length of\n * its own billing period so a 30-day window is not silently charged a full\n * month.\n */\nexport const PLAN_PERIOD_DAYS: Record<PlanBillingPeriod, number> = {\n monthly: 365.25 / 12,\n annual: 365.25\n};\n\nconst MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;\nconst STALE_RATE_MILLISECONDS = 7 * MILLISECONDS_PER_DAY;\n\n/**\n * Preset subscription prices. Every entry cites the official page it was read\n * from; a plan whose official price could not be read is absent rather than\n * guessed, and the user enters it manually. Presets stay editable because\n * regional pricing, annual billing, and team seats are not represented here.\n */\nexport const SUBSCRIPTION_PLAN_CATALOG: PlanCatalog = {\n version: '2026-08-30',\n entries: [\n {\n id: 'claude-pro-monthly',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n displayName: 'Claude Pro',\n amount: 20,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'Claude plans and pricing',\n url: 'https://claude.com/pricing',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'claude-pro-annual',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n displayName: 'Claude Pro (annual billing)',\n amount: 17 * 12,\n currency: 'USD',\n billingPeriod: 'annual',\n source: {\n title: 'Claude plans and pricing',\n url: 'https://claude.com/pricing',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'claude-max-5x',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n displayName: 'Claude Max 5x',\n amount: 100,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'What is the Max plan?',\n url: 'https://support.claude.com/en/articles/11049741-what-is-the-max-plan',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'claude-max-20x',\n providerId: 'claude-code',\n billingDomainId: 'subscription',\n displayName: 'Claude Max 20x',\n amount: 200,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'What is the Max plan?',\n url: 'https://support.claude.com/en/articles/11049741-what-is-the-max-plan',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'chatgpt-plus',\n providerId: 'codex',\n billingDomainId: 'subscription',\n displayName: 'ChatGPT Plus',\n amount: 20,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'ChatGPT pricing',\n url: 'https://chatgpt.com/pricing/',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'chatgpt-pro-100',\n providerId: 'codex',\n billingDomainId: 'subscription',\n displayName: 'ChatGPT Pro (5x)',\n amount: 100,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'About ChatGPT Pro tiers',\n url: 'https://help.openai.com/en/articles/9793128-about-chatgpt-pro-tiers',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'chatgpt-pro-200',\n providerId: 'codex',\n billingDomainId: 'subscription',\n displayName: 'ChatGPT Pro (20x)',\n amount: 200,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'About ChatGPT Pro tiers',\n url: 'https://help.openai.com/en/articles/9793128-about-chatgpt-pro-tiers',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'chatgpt-business-seat',\n providerId: 'codex',\n billingDomainId: 'subscription',\n displayName: 'ChatGPT Business (one seat)',\n amount: 25,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'ChatGPT Business pricing',\n url: 'https://openai.com/business/chatgpt-pricing/',\n retrievedAt: '2026-08-30'\n }\n },\n {\n id: 'opencode-go-monthly',\n providerId: 'opencode-go',\n billingDomainId: 'go-subscription',\n displayName: 'OpenCode Go',\n amount: 10,\n currency: 'USD',\n billingPeriod: 'monthly',\n source: {\n title: 'OpenCode Go',\n url: 'https://opencode.ai/go',\n retrievedAt: '2026-08-30'\n }\n }\n ]\n};\n\n/**\n * Measures the subscription's own period to date against the whole period\n * price. Elapsed and total days travel with it so a cycle that has barely\n * started is never read as a poor result.\n */\nfunction buildBillingPeriod(\n subscription: PlanSubscription,\n summary: PlanBillingPeriodSummary | undefined,\n comparisonCurrency: string,\n rates: ExchangeRateSnapshot[]\n): WorkbenchPlanBillingPeriod | null {\n if (!summary) return null;\n const start = new Date(summary.start).getTime();\n const end = new Date(summary.end).getTime();\n const observedThrough = new Date(summary.observedThrough).getTime();\n const totalDays = (end - start) / MILLISECONDS_PER_DAY;\n const elapsedDays = Math.max(0, Math.min(observedThrough, end) - start) / MILLISECONDS_PER_DAY;\n const periodCost = planMoneyAmount(\n preciseAmount(subscription.amount),\n subscription.currency,\n comparisonCurrency,\n // The period's own rate evidence first, so a short rolling window cannot\n // leave a cycle amount unconverted.\n [...summary.retailEquivalent.exchangeRates, ...rates],\n summary.observedThrough\n );\n const retailAmount =\n summary.retailEquivalent.status === 'available' ? summary.retailEquivalent.amount : null;\n const breakEvenRatio =\n periodCost.amount !== null && periodCost.amount > 0 && retailAmount !== null\n ? preciseAmount(retailAmount / periodCost.amount)\n : null;\n return {\n start: summary.start,\n end: summary.end,\n elapsedDays: preciseAmount(elapsedDays),\n totalDays: preciseAmount(totalDays),\n progress: totalDays > 0 ? preciseAmount(Math.min(1, elapsedDays / totalDays)) : 0,\n periodCost,\n recordedTokens: summary.observationCount > 0 ? summary.recordedTokens : null,\n retailEquivalent: summary.retailEquivalent,\n breakEvenRatio,\n ratioBound: ratioBoundFor(breakEvenRatio, summary.retailEquivalent.pricingCoverage)\n };\n}\n\nexport function planCatalogEntry(catalog: PlanCatalog, id: string): PlanCatalogEntry | null {\n return catalog.entries.find((entry) => entry.id === id) ?? null;\n}\n\nexport function planCatalogEntriesForDomain(\n catalog: PlanCatalog,\n providerId: string,\n billingDomainId: string\n): PlanCatalogEntry[] {\n return catalog.entries.filter(\n (entry) => entry.providerId === providerId && entry.billingDomainId === billingDomainId\n );\n}\n\nexport function planCatalogDomains(\n catalog: PlanCatalog\n): Array<{ providerId: string; billingDomainId: string }> {\n const seen = new Map<string, { providerId: string; billingDomainId: string }>();\n for (const entry of catalog.entries) {\n seen.set(`${entry.providerId}:${entry.billingDomainId}`, {\n providerId: entry.providerId,\n billingDomainId: entry.billingDomainId\n });\n }\n return [...seen.values()];\n}\n\nfunction addMonths(date: Date, months: number): Date {\n const day = date.getUTCDate();\n const shifted = new Date(\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth() + months,\n 1,\n date.getUTCHours(),\n date.getUTCMinutes(),\n date.getUTCSeconds(),\n date.getUTCMilliseconds()\n )\n );\n // A 31st anchor lands on the last day of a shorter month, the way billing\n // providers clamp it.\n const lastDayOfMonth = new Date(\n Date.UTC(shifted.getUTCFullYear(), shifted.getUTCMonth() + 1, 0)\n ).getUTCDate();\n shifted.setUTCDate(Math.min(day, lastDayOfMonth));\n return shifted;\n}\n\n/**\n * The billing period that contains `at`, derived by stepping a declared renewal\n * date forward or backward by whole periods. Any past or future renewal date\n * therefore resolves the same current period.\n */\nexport function billingPeriodContaining(\n anchorDate: string,\n billingPeriod: PlanBillingPeriod,\n at: Date\n): { start: Date; end: Date } | null {\n const anchor = new Date(anchorDate.length === 10 ? `${anchorDate}T00:00:00.000Z` : anchorDate);\n if (Number.isNaN(anchor.getTime())) return null;\n const step = billingPeriod === 'monthly' ? 1 : 12;\n const monthsApart =\n (at.getUTCFullYear() - anchor.getUTCFullYear()) * 12 +\n (at.getUTCMonth() - anchor.getUTCMonth());\n let index = Math.floor(monthsApart / step);\n let start = addMonths(anchor, index * step);\n while (start.getTime() > at.getTime()) {\n index -= 1;\n start = addMonths(anchor, index * step);\n }\n let end = addMonths(anchor, (index + 1) * step);\n while (end.getTime() <= at.getTime()) {\n index += 1;\n start = end;\n end = addMonths(anchor, (index + 1) * step);\n }\n return { start, end };\n}\n\nexport function windowDays(start: string, end: string): number {\n const span = new Date(end).getTime() - new Date(start).getTime();\n return span > 0 ? span / MILLISECONDS_PER_DAY : 0;\n}\n\n/**\n * The share of one plan price that the selected window covers. It is a\n * comparison denominator computed at read time and never a stored cost record.\n */\nexport function proratePlanPrice(\n amount: number,\n billingPeriod: PlanBillingPeriod,\n days: number\n): number {\n return (amount * days) / PLAN_PERIOD_DAYS[billingPeriod];\n}\n\ninterface ConvertedPlanAmount {\n amount: number | null;\n reason: WorkbenchPlanMoneyAmount['conversionUnavailableReason'];\n rate: ExchangeRateSnapshot | null;\n}\n\nfunction convertPlanAmount(\n amount: number,\n currency: string,\n comparisonCurrency: string,\n rates: ExchangeRateSnapshot[],\n end: string\n): ConvertedPlanAmount {\n if (currency.toUpperCase() === comparisonCurrency.toUpperCase()) {\n return { amount, reason: null, rate: null };\n }\n const rate = rates.find(\n (candidate) =>\n candidate.baseCurrency.toUpperCase() === currency.toUpperCase() &&\n candidate.quoteCurrency.toUpperCase() === comparisonCurrency.toUpperCase()\n );\n if (!rate) return { amount: null, reason: 'missing-rate', rate: null };\n if (new Date(end).getTime() - new Date(rate.observedAt).getTime() > STALE_RATE_MILLISECONDS) {\n return { amount: null, reason: 'stale-rate', rate };\n }\n return { amount: amount * rate.rate, reason: null, rate };\n}\n\nfunction preciseAmount(value: number): number {\n return Number(value.toPrecision(12));\n}\n\nfunction planMoneyAmount(\n nativeAmount: number,\n nativeCurrency: string,\n comparisonCurrency: string,\n rates: ExchangeRateSnapshot[],\n end: string\n): WorkbenchPlanMoneyAmount {\n const converted = convertPlanAmount(nativeAmount, nativeCurrency, comparisonCurrency, rates, end);\n return {\n status: converted.amount === null ? 'unavailable' : 'available',\n amount: converted.amount === null ? null : preciseAmount(converted.amount),\n nativeAmount,\n nativeCurrency,\n comparisonCurrency,\n conversionUnavailableReason: converted.reason,\n exchangeRates: converted.rate ? [converted.rate] : []\n };\n}\n\n/**\n * Partly priced Tokens can only prove a floor: the ratio is reported as a lower\n * bound rather than an exact multiple.\n */\nfunction ratioBoundFor(\n ratio: number | null,\n pricingCoverage: number | null\n): WorkbenchPlanValueEntry['ratioBound'] {\n if (ratio === null) return 'unavailable';\n return pricingCoverage !== null && pricingCoverage < 0.999 ? 'lower' : 'exact';\n}\n\nfunction unitPricePerMillion(amount: number | null, tokens: number): number | null {\n if (amount === null || tokens <= 0) return null;\n return preciseAmount(amount / (tokens / 1_000_000));\n}\n\nexport interface PlanBillingPeriodSummary {\n start: string;\n end: string;\n observedThrough: string;\n recordedTokens: number;\n observationCount: number;\n retailEquivalent: WorkbenchMoneyMetric;\n}\n\nexport interface PlanValueDomainInput {\n providerId: string;\n providerDisplayName: string;\n billingDomainId: string;\n billingDomainDisplayName: string;\n includedInHeadline: boolean;\n recordedTokens: number;\n observationCount: number;\n retailEquivalent: WorkbenchMoneyMetric;\n actualCost: WorkbenchMoneyMetric;\n authorities: DataAuthority[];\n lastObservedAt: string | null;\n}\n\nexport interface BuildPlanValueOptions {\n domains: PlanValueDomainInput[];\n subscriptions: PlanSubscription[];\n comparisonCurrency: string;\n start: string;\n end: string;\n rates: ExchangeRateSnapshot[];\n /** Cycle-to-date evidence keyed by `providerId:billingDomainId`. */\n billingPeriods?: Map<string, PlanBillingPeriodSummary>;\n}\n\n/**\n * Compares what one subscription costs for the selected window against the API\n * retail equivalent of the Tokens it produced. The two amounts keep their\n * separate purposes: the result is a ratio, never a combined total.\n */\nexport function buildWorkbenchPlanValue(options: BuildPlanValueOptions): WorkbenchPlanValue {\n const { comparisonCurrency, start, end, rates } = options;\n const days = windowDays(start, end);\n const subscriptionByDomain = new Map(\n options.subscriptions.map((subscription) => [\n `${subscription.providerId}:${subscription.billingDomainId}`,\n subscription\n ])\n );\n\n const entries: WorkbenchPlanValueEntry[] = [];\n const metered: WorkbenchPlanValueMeteredDomain[] = [];\n const unconfigured: WorkbenchPlanValueUnconfiguredDomain[] = [];\n\n for (const domain of options.domains) {\n const subscription = subscriptionByDomain.get(`${domain.providerId}:${domain.billingDomainId}`);\n if (!subscription) {\n if (domain.actualCost.records > 0) {\n metered.push({\n providerId: domain.providerId,\n providerDisplayName: domain.providerDisplayName,\n billingDomainId: domain.billingDomainId,\n billingDomainDisplayName: domain.billingDomainDisplayName,\n recordedTokens: domain.observationCount > 0 ? domain.recordedTokens : null,\n actualCost: domain.actualCost,\n retailEquivalent: domain.retailEquivalent\n });\n continue;\n }\n if (domain.observationCount > 0) {\n unconfigured.push({\n providerId: domain.providerId,\n providerDisplayName: domain.providerDisplayName,\n billingDomainId: domain.billingDomainId,\n billingDomainDisplayName: domain.billingDomainDisplayName,\n recordedTokens: domain.recordedTokens\n });\n }\n continue;\n }\n\n const windowPlanCost = planMoneyAmount(\n preciseAmount(proratePlanPrice(subscription.amount, subscription.billingPeriod, days)),\n subscription.currency,\n comparisonCurrency,\n rates,\n end\n );\n\n const retail = domain.retailEquivalent;\n const retailAmount = retail.status === 'available' ? retail.amount : null;\n const valueRatio =\n windowPlanCost.amount !== null && windowPlanCost.amount > 0 && retailAmount !== null\n ? preciseAmount(retailAmount / windowPlanCost.amount)\n : null;\n const ratioBound = ratioBoundFor(valueRatio, retail.pricingCoverage);\n const billingPeriod = buildBillingPeriod(\n subscription,\n options.billingPeriods?.get(`${domain.providerId}:${domain.billingDomainId}`),\n comparisonCurrency,\n rates\n );\n\n entries.push({\n providerId: domain.providerId,\n providerDisplayName: domain.providerDisplayName,\n billingDomainId: domain.billingDomainId,\n billingDomainDisplayName: domain.billingDomainDisplayName,\n includedInHeadline: domain.includedInHeadline,\n plan: {\n planId: subscription.planId,\n displayName: subscription.displayName,\n amount: subscription.amount,\n currency: subscription.currency,\n billingPeriod: subscription.billingPeriod,\n anchorDate: subscription.anchorDate,\n priceSource: subscription.priceSource,\n updatedAt: subscription.updatedAt\n },\n windowDays: preciseAmount(days),\n windowPlanCost,\n billingPeriod,\n recordedTokens: domain.observationCount > 0 ? domain.recordedTokens : null,\n retailEquivalent: retail,\n valueRatio,\n ratioBound,\n status:\n valueRatio === null ? 'unavailable' : ratioBound === 'lower' ? 'partial' : 'available',\n effectiveUnitPrice: unitPricePerMillion(windowPlanCost.amount, domain.recordedTokens),\n retailUnitPrice: unitPricePerMillion(retailAmount, retail.pricedTokens),\n pricingCoverage: retail.pricingCoverage,\n authorities: domain.authorities,\n lastObservedAt: domain.lastObservedAt\n });\n }\n\n const rank = (entry: WorkbenchPlanValueEntry): number => entry.valueRatio ?? -1;\n entries.sort(\n (left, right) =>\n rank(right) - rank(left) ||\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n metered.sort((left, right) =>\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n unconfigured.sort(\n (left, right) =>\n right.recordedTokens - left.recordedTokens ||\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n\n return {\n windowDays: preciseAmount(days),\n comparisonCurrency,\n catalogVersion: SUBSCRIPTION_PLAN_CATALOG.version,\n entries,\n meteredDomains: metered,\n unconfiguredDomains: unconfigured\n };\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type {\n AgentProviderIndex,\n Connector,\n ConnectorSnapshot,\n ConnectorDiagnostic,\n ConnectorFailure,\n ConnectorPolicy,\n CollectionMode,\n CustomModelRate,\n CustomModelRateInput,\n DoctorReport,\n ExchangeRateProvider,\n LocalNotification,\n LocalNotifier,\n MonitoringSettings,\n PlanBillingPeriod,\n PlanCatalog,\n PlanEligibleDomain,\n PlanSettings,\n StartAtLoginManager,\n TelemetryIngestor,\n UsageOverview,\n UsageExportArtifact,\n UsageExportRequest,\n UsageQuery,\n UsageRepository,\n RetentionStatus,\n ProcessingModuleId,\n ProcessingStatus,\n ProviderOverview\n} from './types.js';\nimport type {\n ConfigureConnectorInput,\n ConnectorDefinition,\n ConnectorStatus,\n ConnectorStatusRecord,\n DiscoveryProbe,\n SecretStore\n} from './onboarding-types.js';\nimport { classifyDiagnosticCategory } from './diagnostic-category.js';\nimport { redactSensitiveText } from './redaction.js';\nimport { buildUsageExport } from './usage-export.js';\nimport {\n OFFICIAL_PRICING_CATALOG,\n deriveRetailEquivalentCosts,\n mergeCatalogWithCustomRates,\n type RetailPriceCatalog\n} from './retail-pricing.js';\nimport {\n SUBSCRIPTION_PLAN_CATALOG,\n planCatalogEntriesForDomain,\n planCatalogEntry\n} from './plan-pricing.js';\n\nexport interface PlanSubscriptionInput {\n providerId: string;\n billingDomainId: string;\n plan: {\n planId: string | null;\n amount?: number;\n currency?: string;\n billingPeriod?: PlanBillingPeriod;\n anchorDate?: string | null;\n } | null;\n}\n\nexport interface UsageApplicationOptions {\n repository: UsageRepository;\n connectors: Connector[];\n clock?: () => Date;\n connectorDefinitions?: ConnectorDefinition[];\n discoveryProbe?: DiscoveryProbe;\n secretStore?: SecretStore;\n telemetryIngestors?: TelemetryIngestor[];\n exchangeRateProvider?: ExchangeRateProvider;\n connectorPolicies?: Record<string, ConnectorPolicy>;\n notifier?: LocalNotifier;\n startAtLoginManager?: StartAtLoginManager;\n priceCatalog?: RetailPriceCatalog | null;\n planCatalog?: PlanCatalog;\n}\n\nexport interface RefreshOptions {\n userInitiated?: boolean;\n mode?: CollectionMode;\n}\n\nexport interface BackgroundProcessingOptions {\n userInitiated?: boolean;\n}\n\nexport class UsageApplication {\n readonly #repository: UsageRepository;\n readonly #connectors: Connector[];\n readonly #clock: () => Date;\n readonly #connectorDefinitions: ConnectorDefinition[];\n readonly #discoveryProbe?: DiscoveryProbe;\n readonly #secretStore?: SecretStore;\n readonly #telemetryIngestors: TelemetryIngestor[];\n readonly #exchangeRateProvider?: ExchangeRateProvider;\n readonly #connectorPolicies: Record<string, ConnectorPolicy>;\n readonly #notifier?: LocalNotifier;\n readonly #startAtLoginManager?: StartAtLoginManager;\n readonly #basePriceCatalog: RetailPriceCatalog | null;\n #priceCatalog: RetailPriceCatalog | null;\n readonly #planCatalog: PlanCatalog;\n #refreshPromise: Promise<void> | null = null;\n #refreshMode: CollectionMode | null = null;\n #backgroundPromise: Promise<void> | null = null;\n #queuedHardRebuildPromise: Promise<void> | null = null;\n #queuedUserProcessingPromise: Promise<void> | null = null;\n #userInitiatedProcessing = false;\n #databaseWriteQueue: Promise<void> = Promise.resolve();\n #processingStatus: ProcessingStatus;\n\n constructor(options: UsageApplicationOptions) {\n this.#repository = options.repository;\n this.#connectors = options.connectors;\n this.#clock = options.clock ?? (() => new Date());\n this.#connectorDefinitions = options.connectorDefinitions ?? [];\n this.#discoveryProbe = options.discoveryProbe;\n this.#secretStore = options.secretStore;\n this.#telemetryIngestors = options.telemetryIngestors ?? [];\n this.#exchangeRateProvider = options.exchangeRateProvider;\n this.#connectorPolicies = options.connectorPolicies ?? {};\n this.#notifier = options.notifier;\n this.#startAtLoginManager = options.startAtLoginManager;\n this.#basePriceCatalog =\n options.priceCatalog === undefined ? OFFICIAL_PRICING_CATALOG : options.priceCatalog;\n this.#priceCatalog = this.#resolvePriceCatalog();\n this.#planCatalog = options.planCatalog ?? SUBSCRIPTION_PLAN_CATALOG;\n this.#processingStatus = createProcessingStatus(this.#clock().toISOString(), false);\n }\n\n #resolvePriceCatalog(): RetailPriceCatalog | null {\n if (!this.#basePriceCatalog) return null;\n const customRates = this.#repository.getCustomModelRates?.() ?? [];\n return mergeCatalogWithCustomRates(this.#basePriceCatalog, customRates);\n }\n\n async #backfillRetailCosts(mode: CollectionMode): Promise<void> {\n if (\n !this.#priceCatalog ||\n (!this.#repository.getRetailPricingBackfillPage &&\n !this.#repository.getRetailPricingBackfillSnapshots) ||\n !this.#repository.saveDerivedCosts\n ) {\n return;\n }\n const catalogVersionKey = 'retail-pricing-catalog-version';\n if (\n mode === 'incremental' &&\n this.#repository.getApplicationState?.(catalogVersionKey) === this.#priceCatalog.version\n ) {\n return;\n }\n const calculatedAt = this.#clock().toISOString();\n if (mode === 'hard-rebuild') {\n this.#repository.saveApplicationState?.(catalogVersionKey, `rebuilding:${calculatedAt}`);\n if (this.#repository.deleteDerivedRetailCostsAsync) {\n await this.#repository.deleteDerivedRetailCostsAsync();\n } else {\n this.#repository.deleteDerivedRetailCosts?.();\n }\n }\n if (this.#repository.getRetailPricingBackfillPage) {\n let cursor = null;\n do {\n const page = this.#repository.getRetailPricingBackfillPage(cursor, 250);\n for (const snapshot of page.snapshots) {\n const costs = deriveRetailEquivalentCosts(\n snapshot,\n this.#priceCatalog,\n calculatedAt\n ).costs;\n if (costs.length > 0) this.#repository.saveDerivedCosts(snapshot.provider.id, costs);\n }\n cursor = page.nextCursor;\n if (cursor) await yieldToEventLoop();\n } while (cursor);\n } else {\n for (const snapshot of this.#repository.getRetailPricingBackfillSnapshots?.() ?? []) {\n const costs = deriveRetailEquivalentCosts(snapshot, this.#priceCatalog, calculatedAt).costs;\n if (costs.length > 0) this.#repository.saveDerivedCosts(snapshot.provider.id, costs);\n await yieldToEventLoop();\n }\n }\n this.#repository.saveApplicationState?.(catalogVersionKey, this.#priceCatalog.version);\n }\n\n getProcessingStatus(): ProcessingStatus {\n return structuredClone(this.#processingStatus);\n }\n\n startBackgroundProcessing(options: BackgroundProcessingOptions = {}): Promise<void> {\n return this.#startProcessing('incremental', options.userInitiated === true);\n }\n\n startHardRebuild(): Promise<void> {\n return this.#startProcessing('hard-rebuild', true);\n }\n\n #startProcessing(mode: CollectionMode, userInitiated: boolean): Promise<void> {\n if (this.#backgroundPromise) {\n if (mode === 'hard-rebuild' && !this.#processingStatus.hardRebuild) {\n this.#queuedHardRebuildPromise ??= this.#backgroundPromise\n .then(\n () => this.#startProcessing('hard-rebuild', true),\n () => this.#startProcessing('hard-rebuild', true)\n )\n .finally(() => {\n this.#queuedHardRebuildPromise = null;\n });\n return this.#queuedHardRebuildPromise;\n }\n // A person asking for fresh data must not inherit a scheduled run that\n // skips every connector still inside its collection interval.\n if (userInitiated && !this.#userInitiatedProcessing) {\n this.#queuedUserProcessingPromise ??= this.#backgroundPromise\n .then(\n () => this.#startProcessing(mode, true),\n () => this.#startProcessing(mode, true)\n )\n .finally(() => {\n this.#queuedUserProcessingPromise = null;\n });\n return this.#queuedUserProcessingPromise;\n }\n return this.#backgroundPromise;\n }\n this.#userInitiatedProcessing = userInitiated || mode === 'hard-rebuild';\n this.#processingStatus = createProcessingStatus(\n this.#clock().toISOString(),\n mode === 'hard-rebuild'\n );\n this.#backgroundPromise = this.#runProcessing(mode, this.#userInitiatedProcessing).finally(\n () => {\n this.#backgroundPromise = null;\n this.#userInitiatedProcessing = false;\n }\n );\n return this.#backgroundPromise;\n }\n\n async #runProcessing(mode: CollectionMode, userInitiated: boolean): Promise<void> {\n await this.#runModule('discovery', () => this.discoverConnectors().then(() => undefined));\n await this.#runModule('usage', () => this.refresh({ userInitiated, mode }));\n await this.#runModule('pricing', () =>\n this.#queueDatabaseWrite(async () => {\n await this.#repository.ensureQueryIndexes?.();\n await this.#backfillRetailCosts(mode);\n })\n );\n await this.#runModule('retention', async () => {\n await this.compactRetention();\n });\n }\n\n async #runModule(id: ProcessingModuleId, action: () => Promise<void>): Promise<void> {\n const module = this.#processingStatus.modules[id];\n module.state = 'running';\n module.startedAt = this.#clock().toISOString();\n module.message = null;\n try {\n await action();\n module.state = 'ready';\n } catch (error) {\n module.state = 'failed';\n module.message = redactSensitiveText(error instanceof Error ? error.message : String(error));\n } finally {\n module.completedAt = this.#clock().toISOString();\n }\n }\n\n refresh(options: RefreshOptions = {}): Promise<void> {\n const requestedMode = options.mode ?? 'incremental';\n if (this.#refreshPromise) {\n if (requestedMode === 'hard-rebuild' && this.#refreshMode !== 'hard-rebuild') {\n return this.#refreshPromise.then(\n () => this.refresh(options),\n () => this.refresh(options)\n );\n }\n return this.#refreshPromise;\n }\n this.#refreshMode = requestedMode;\n this.#refreshPromise = this.#queueDatabaseWrite(() => this.#performRefresh(options)).finally(\n () => {\n this.#refreshPromise = null;\n this.#refreshMode = null;\n }\n );\n return this.#refreshPromise;\n }\n\n async #performRefresh(options: RefreshOptions): Promise<void> {\n if (this.#exchangeRateProvider) {\n try {\n for (const rate of await this.#exchangeRateProvider.readRates()) {\n this.#repository.saveExchangeRateSnapshot(rate);\n }\n } catch {\n // Native amounts remain available when the optional comparison rate is unavailable.\n }\n }\n const connectorStates = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status.state])\n );\n const runtimeStates = new Map(\n this.#repository.getConnectorRuntimeStates().map((state) => [state.id, state])\n );\n await Promise.all(\n this.#connectors.map(async (connector) => {\n if (connector.consentId && connectorStates.get(connector.consentId) !== 'connected') {\n return;\n }\n const now = this.#clock();\n const runtime = runtimeStates.get(connector.id);\n if (\n !options.userInitiated &&\n runtime?.nextAllowedAt &&\n new Date(runtime.nextAllowedAt).getTime() > now.getTime()\n ) {\n return;\n }\n const policy = this.#connectorPolicies[connector.id] ?? {\n minimumIntervalMs: 0,\n timeoutMs: 30_000\n };\n try {\n const snapshot = await withTimeout(\n connector.collect({ mode: options.mode ?? 'incremental' }),\n policy.timeoutMs,\n `${connector.id} timed out`\n );\n this.#repository.saveSnapshot(this.#withRetailCosts(snapshot));\n if (snapshot.warnings && snapshot.warnings.length > 0) {\n const failure = redactFailure(combineFailures(snapshot.warnings));\n this.#repository.recordFailure(snapshot.provider, this.#clock().toISOString(), failure);\n this.#saveConnectorDiagnostic(\n connector,\n snapshot.provider.id,\n snapshot.billingDomains[0]?.id ??\n defaultBillingDomain(connector.id, this.#connectorDefinitions),\n failure\n );\n this.#recordConnectorOutcome(\n connector.id,\n now,\n policy,\n false,\n runtime?.failureCount ?? 0\n );\n } else {\n this.#saveHealthyConnectorDiagnostic(\n connector,\n snapshot.provider.id,\n snapshot.billingDomains[0]?.id ??\n defaultBillingDomain(connector.id, this.#connectorDefinitions),\n snapshot.observedAt\n );\n this.#recordConnectorOutcome(\n connector.id,\n now,\n policy,\n true,\n runtime?.failureCount ?? 0\n );\n }\n } catch (error) {\n const providerId = providerForConnector(connector.id, this.#connectorDefinitions);\n const failure = redactFailure(safeConnectorFailure(error));\n this.#repository.recordFailure(\n {\n id: providerId,\n displayName: displayNameForProvider(providerId, connector.displayName)\n },\n this.#clock().toISOString(),\n failure\n );\n this.#saveConnectorDiagnostic(\n connector,\n providerId,\n defaultBillingDomain(connector.id, this.#connectorDefinitions),\n failure\n );\n this.#recordConnectorOutcome(\n connector.id,\n now,\n policy,\n false,\n runtime?.failureCount ?? 0\n );\n }\n })\n );\n if (this.#repository.getMonitoringSettings().notificationsEnabled) {\n await this.#sendNotificationTransitions();\n }\n }\n\n #saveHealthyConnectorDiagnostic(\n connector: Connector,\n providerId: string,\n billingDomainId: string,\n lastSuccessAt: string\n ): void {\n this.#repository.saveConnectorDiagnostic({\n id: connector.id,\n providerId,\n billingDomainId,\n status: 'healthy',\n category: null,\n message: null,\n recovery: null,\n affectedCoverage: [],\n lastAttemptAt: this.#clock().toISOString(),\n lastSuccessAt\n });\n }\n\n #saveConnectorDiagnostic(\n connector: Connector,\n providerId: string,\n billingDomainId: string,\n failure: ConnectorFailure\n ): void {\n const prior = this.#repository\n .getConnectorDiagnostics()\n .find((diagnostic) => diagnostic.id === connector.id);\n this.#repository.saveConnectorDiagnostic({\n id: connector.id,\n providerId,\n billingDomainId,\n status: 'degraded',\n category: classifyDiagnosticCategory(failure.code, failure.message),\n message: failure.message,\n recovery: failure.recovery,\n affectedCoverage: expectedCoverageForConnector(connector.id, this.#connectorDefinitions),\n lastAttemptAt: this.#clock().toISOString(),\n lastSuccessAt: prior?.lastSuccessAt ?? null\n });\n }\n\n #recordConnectorOutcome(\n id: string,\n now: Date,\n policy: ConnectorPolicy,\n success: boolean,\n priorFailures: number\n ): void {\n const failureCount = success ? 0 : priorFailures + 1;\n const backoff = success\n ? policy.minimumIntervalMs\n : Math.max(\n policy.minimumIntervalMs,\n Math.min(60 * 60 * 1000, 60 * 1000 * 2 ** Math.max(0, failureCount - 1))\n );\n this.#repository.saveConnectorRuntimeState({\n id,\n lastAttemptAt: now.toISOString(),\n nextAllowedAt: new Date(now.getTime() + backoff).toISOString(),\n failureCount,\n outcome: success ? 'success' : 'failure'\n });\n if (success) this.#repository.saveNotificationState(`failure:${id}`, 'clear');\n }\n\n async getMonitoringSettings(): Promise<MonitoringSettings> {\n return this.#repository.getMonitoringSettings();\n }\n\n async updateMonitoringSettings(\n changes: Partial<MonitoringSettings>\n ): Promise<MonitoringSettings> {\n const current = this.#repository.getMonitoringSettings();\n const updated = { ...current, ...changes };\n if (updated.intervalMinutes < 1 || updated.intervalMinutes > 1_440) {\n throw new Error('Collection interval must be between 1 and 1440 minutes');\n }\n if (changes.startAtLogin !== undefined) {\n if (!this.#startAtLoginManager) throw new Error('Start-at-login management is unavailable');\n await this.#startAtLoginManager.setEnabled(changes.startAtLogin);\n }\n this.#repository.saveMonitoringSettings(updated);\n return updated;\n }\n\n async getMonitoringStatus(): Promise<{\n settings: MonitoringSettings;\n connectors: ReturnType<UsageRepository['getConnectorRuntimeStates']>;\n }> {\n return {\n settings: this.#repository.getMonitoringSettings(),\n connectors: this.#repository.getConnectorRuntimeStates()\n };\n }\n\n async getPlanSettings(): Promise<PlanSettings> {\n return {\n catalogVersion: this.#planCatalog.version,\n domains: this.#planEligibleDomains(),\n subscriptions: this.#repository.getPlanSubscriptions()\n };\n }\n\n async updatePlanSubscription(input: PlanSubscriptionInput): Promise<PlanSettings> {\n const domain = this.#planEligibleDomains().find(\n (candidate) =>\n candidate.providerId === input.providerId &&\n candidate.billingDomainId === input.billingDomainId\n );\n if (!domain) throw new Error('Unknown subscription billing domain');\n if (input.plan === null) {\n this.#repository.deletePlanSubscription(input.providerId, input.billingDomainId);\n return this.getPlanSettings();\n }\n\n const preset = input.plan.planId\n ? planCatalogEntry(this.#planCatalog, input.plan.planId)\n : null;\n if (input.plan.planId && !preset) throw new Error('Unknown plan preset');\n if (\n preset &&\n (preset.providerId !== input.providerId || preset.billingDomainId !== input.billingDomainId)\n ) {\n throw new Error('Plan preset belongs to another billing domain');\n }\n\n const amount = input.plan.amount ?? preset?.amount;\n if (amount === undefined) throw new Error('A plan price is required');\n if (!Number.isFinite(amount) || amount <= 0) {\n throw new Error('A plan price must be a positive amount');\n }\n const currency = (input.plan.currency ?? preset?.currency ?? 'USD').toUpperCase();\n if (!/^[A-Z]{3}$/.test(currency)) throw new Error('A plan currency must be a 3-letter code');\n const billingPeriod = input.plan.billingPeriod ?? preset?.billingPeriod ?? 'monthly';\n const anchorDate = input.plan.anchorDate ?? null;\n if (anchorDate !== null && Number.isNaN(new Date(`${anchorDate}T00:00:00.000Z`).getTime())) {\n throw new Error('A renewal date must be a calendar date');\n }\n\n const overridesPreset =\n preset !== null &&\n (amount !== preset.amount ||\n currency !== preset.currency.toUpperCase() ||\n billingPeriod !== preset.billingPeriod);\n\n this.#repository.savePlanSubscription({\n providerId: input.providerId,\n billingDomainId: input.billingDomainId,\n planId: preset?.id ?? null,\n displayName: preset?.displayName ?? '',\n amount,\n currency,\n billingPeriod,\n anchorDate,\n priceSource: preset && !overridesPreset ? 'catalog-preset' : 'user-entered',\n updatedAt: this.#clock().toISOString()\n });\n return this.getPlanSettings();\n }\n\n async getCustomModelRates(): Promise<CustomModelRate[]> {\n return this.#repository.getCustomModelRates?.() ?? [];\n }\n\n async getCustomModelRate(id: string): Promise<CustomModelRate | null> {\n return this.#repository.getCustomModelRate?.(id) ?? null;\n }\n\n async setCustomModelRate(input: CustomModelRateInput): Promise<CustomModelRate> {\n const providerId = input.providerId?.trim();\n if (!providerId) throw new Error('Provider ID is required');\n const model = input.model?.trim();\n if (!model) throw new Error('Model name is required');\n if (!Number.isFinite(input.inputRate) || input.inputRate < 0) {\n throw new Error('Input rate must be a non-negative number');\n }\n if (!Number.isFinite(input.outputRate) || input.outputRate < 0) {\n throw new Error('Output rate must be a non-negative number');\n }\n const cacheReadRate = input.cacheReadRate ?? 0;\n if (!Number.isFinite(cacheReadRate) || cacheReadRate < 0) {\n throw new Error('Cache read rate must be a non-negative number');\n }\n\n const rate: CustomModelRate = {\n id: input.id || `rate-${randomUUID()}`,\n providerId,\n billingDomainId: input.billingDomainId?.trim() || null,\n model,\n ratesPerMillion: {\n input: input.inputRate,\n output: input.outputRate,\n cacheRead: cacheReadRate\n },\n updatedAt: this.#clock().toISOString()\n };\n\n await this.#queueDatabaseWrite(() => {\n this.#repository.saveCustomModelRate?.(rate);\n });\n\n this.#priceCatalog = this.#resolvePriceCatalog();\n await this.#backfillRetailCosts('hard-rebuild');\n return rate;\n }\n\n async deleteCustomModelRate(id: string): Promise<boolean> {\n let deleted = false;\n await this.#queueDatabaseWrite(() => {\n deleted = this.#repository.deleteCustomModelRate?.(id) ?? false;\n });\n if (deleted) {\n this.#priceCatalog = this.#resolvePriceCatalog();\n await this.#backfillRetailCosts('hard-rebuild');\n }\n return deleted;\n }\n\n /**\n * A billing domain can carry a plan price when its connector does not report\n * an actual metered charge. Metered domains keep their own billed amounts and\n * never receive a declared subscription price.\n */\n #planEligibleDomains(): PlanEligibleDomain[] {\n const domains = new Map<string, PlanEligibleDomain>();\n for (const definition of this.#connectorDefinitions) {\n if (definition.expectedCoverage?.includes('actual-cost')) continue;\n const key = `${definition.target.provider.id}:${definition.target.billingDomain.id}`;\n if (domains.has(key)) continue;\n domains.set(key, {\n providerId: definition.target.provider.id,\n providerDisplayName: definition.target.provider.displayName,\n billingDomainId: definition.target.billingDomain.id,\n billingDomainDisplayName: definition.target.billingDomain.displayName,\n presets: planCatalogEntriesForDomain(\n this.#planCatalog,\n definition.target.provider.id,\n definition.target.billingDomain.id\n )\n });\n }\n return [...domains.values()].sort((left, right) =>\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n }\n\n async #sendNotificationTransitions(): Promise<void> {\n if (!this.#notifier) return;\n const overview = this.#repository.getOverview(this.#clock());\n for (const provider of overview.providers) {\n for (const bucket of provider.quotaBuckets) {\n if (bucket.usedPercent === null) continue;\n const prefix = `${provider.id}:${bucket.id}`;\n const usedKey = `quota-used:${prefix}`;\n const priorUsed = Number(this.#repository.getNotificationState(usedKey));\n if (Number.isFinite(priorUsed) && priorUsed - bucket.usedPercent >= 20) {\n await this.#notify({\n id: `reset:${prefix}:${bucket.resetsAt ?? this.#clock().toISOString()}`,\n kind: 'quota-reset',\n title: `${provider.displayName} quota reset`,\n message: `${bucket.label} usage returned to ${bucket.usedPercent}%.`,\n providerId: provider.id,\n bucketId: bucket.id,\n createdAt: this.#clock().toISOString()\n });\n }\n this.#repository.saveNotificationState(usedKey, String(bucket.usedPercent));\n const remaining = Math.max(0, 100 - bucket.usedPercent);\n const level = remaining <= 5 ? '5' : remaining <= 20 ? '20' : 'normal';\n const levelKey = `quota-level:${prefix}`;\n const priorLevel = this.#repository.getNotificationState(levelKey) ?? 'normal';\n if (notificationLevel(level) > notificationLevel(priorLevel)) {\n await this.#notify({\n id: `quota:${prefix}:${level}:${bucket.resetsAt ?? 'unknown-reset'}`,\n kind: level === '5' ? 'low-quota-5' : 'low-quota-20',\n title: `${provider.displayName} quota is low`,\n message: `${bucket.label} has ${Math.max(0, remaining)}% remaining.`,\n providerId: provider.id,\n bucketId: bucket.id,\n createdAt: this.#clock().toISOString()\n });\n }\n this.#repository.saveNotificationState(levelKey, level);\n }\n for (const forecast of provider.forecasts.filter(\n (candidate) => !candidate.willLastUntilReset\n )) {\n const key = `forecast:${provider.id}:${forecast.bucketId}`;\n if (this.#repository.getNotificationState(key) !== forecast.resetsAt) {\n await this.#notify({\n id: `forecast:${provider.id}:${forecast.bucketId}:${forecast.resetsAt}`,\n kind: 'predicted-exhaustion',\n title: `${provider.displayName} may exhaust before reset`,\n message: `${forecast.label} is predicted to exhaust at ${forecast.predictedExhaustionAt}.`,\n providerId: provider.id,\n bucketId: forecast.bucketId,\n createdAt: this.#clock().toISOString()\n });\n this.#repository.saveNotificationState(key, forecast.resetsAt);\n }\n }\n }\n for (const runtime of this.#repository\n .getConnectorRuntimeStates()\n .filter((state) => state.failureCount >= 3)) {\n const key = `failure:${runtime.id}`;\n if (this.#repository.getNotificationState(key) !== 'active') {\n await this.#notify({\n id: `failure:${runtime.id}:${runtime.failureCount}`,\n kind: 'connector-failure',\n title: `${runtime.id} refresh is failing`,\n message: `${runtime.failureCount} consecutive refresh attempts failed.`,\n providerId: runtime.id,\n createdAt: this.#clock().toISOString()\n });\n this.#repository.saveNotificationState(key, 'active');\n }\n }\n }\n\n async #notify(event: LocalNotification): Promise<void> {\n try {\n await this.#notifier?.notify(event);\n } catch {\n // Notification delivery must never fail collection.\n }\n }\n\n async getDiagnostics(): Promise<DoctorReport> {\n const now = this.#clock();\n const overview = this.#repository.getOverview(now);\n const stored = new Map(\n this.#repository\n .getConnectorDiagnostics()\n .map((diagnostic) => [diagnostic.id, withStaleDiagnostic(diagnostic, now)])\n );\n const statuses = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status])\n );\n\n for (const definition of this.#connectorDefinitions) {\n if (stored.has(definition.id)) continue;\n const status = statuses.get(definition.id) ?? emptyConnectorStatus(definition.id);\n const connected = status.state === 'connected';\n const category = connected\n ? null\n : !status.installed && definition.command !== null\n ? 'missing-binary'\n : 'not-configured';\n stored.set(definition.id, {\n id: definition.id,\n providerId: definition.target.provider.id,\n billingDomainId: definition.target.billingDomain.id,\n status: connected ? 'healthy' : 'degraded',\n category,\n message: connected\n ? null\n : category === 'missing-binary'\n ? `${definition.displayName} is not installed.`\n : `${definition.displayName} is not configured.`,\n recovery: connected\n ? null\n : category === 'missing-binary'\n ? `Install ${definition.displayName}, then retry discovery.`\n : `Connect ${definition.displayName} in onboarding.`,\n affectedCoverage: connected ? [] : definition.expectedCoverage,\n lastAttemptAt: status.lastDiscoveredAt ?? now.toISOString(),\n lastSuccessAt: null\n });\n }\n\n const connectors = [...stored.values()].sort((left, right) => left.id.localeCompare(right.id));\n return {\n generatedAt: now.toISOString(),\n daemon: { status: 'healthy' },\n database: { status: 'healthy' },\n connectors,\n providers: overview.providers.map((provider) => {\n const diagnostics = connectors.filter(\n (diagnostic) => diagnostic.providerId === provider.id\n );\n const degraded = diagnostics.some((diagnostic) => diagnostic.status === 'degraded');\n const domainIds = new Set([\n ...provider.billingDomains.map((domain) => domain.id),\n ...diagnostics.flatMap((diagnostic) =>\n diagnostic.billingDomainId ? [diagnostic.billingDomainId] : []\n )\n ]);\n return {\n id: provider.id,\n displayName: provider.displayName,\n status: degraded ? ('degraded' as const) : ('healthy' as const),\n freshness: provider.freshness,\n health: provider.health,\n billingDomains: [...domainIds].sort().map((domainId) => {\n const diagnostic = diagnostics.find(\n (candidate) => candidate.billingDomainId === domainId\n );\n const domain = provider.billingDomains.find((candidate) => candidate.id === domainId);\n return {\n id: domainId,\n displayName:\n domain?.displayName ??\n billingDomainDisplayName(domainId, this.#connectorDefinitions),\n status: diagnostic?.status ?? ('healthy' as const),\n category: diagnostic?.category ?? null,\n affectedCoverage: diagnostic?.affectedCoverage ?? [],\n recovery: diagnostic?.recovery ?? null\n };\n })\n };\n })\n };\n }\n\n async getOverview(query: UsageQuery = {}): Promise<UsageOverview> {\n return this.#repository.getOverview(this.#clock(), query);\n }\n\n async getAgentProviderIndex(): Promise<AgentProviderIndex> {\n const now = this.#clock();\n return (\n this.#repository.getAgentProviderIndex?.(now) ??\n pickAgentProviderIndex(this.#repository.getOverview(now))\n );\n }\n\n async getProviderOverview(\n providerId: string,\n query: UsageQuery = {}\n ): Promise<ProviderOverview | null> {\n const now = this.#clock();\n return (\n this.#repository.getProviderOverview?.(now, providerId, query) ??\n this.#repository\n .getOverview(now, query)\n .providers.find((provider) => provider.id === providerId) ??\n null\n );\n }\n\n async exportUsage(request: UsageExportRequest): Promise<UsageExportArtifact> {\n // An export is the audit artefact: it reports every observation and cost record\n // behind the totals, not only the aggregates the Dashboard renders.\n const overview = this.#repository.getOverview(this.#clock(), {\n ...request,\n auditEvidence: true\n });\n const accountIdentifiers = request.includeAccountIdentifiers\n ? this.#repository.getProviderAccountIdentifiers()\n : {};\n return buildUsageExport(overview, request, accountIdentifiers);\n }\n\n async getRetentionStatus(): Promise<RetentionStatus> {\n return this.#repository.getRetentionStatus();\n }\n\n async compactRetention(): Promise<RetentionStatus> {\n return this.#queueDatabaseWrite(async () => {\n if (this.#repository.maintainUsageHistory) {\n return this.#repository.maintainUsageHistory(this.#clock());\n }\n await this.#repository.ensureQueryIndexes?.();\n return this.#repository.compactUsageHistory(this.#clock());\n });\n }\n\n async clearData(input: {\n deleteProductSecrets: boolean;\n }): Promise<{ usageCleared: true; productSecretsDeleted: number }> {\n let productSecretsDeleted = 0;\n if (input.deleteProductSecrets) {\n if (!this.#secretStore) throw new Error('Product secret management is unavailable');\n const records = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status])\n );\n for (const definition of this.#connectorDefinitions.filter(\n (candidate) => candidate.credentialOwner === 'agent-usage'\n )) {\n const record = records.get(definition.id);\n if (!record?.secretReference) continue;\n await this.#secretStore.delete(record.secretReference);\n this.#repository.saveConnectorStatus({\n ...record,\n state: record.installed ? 'discovered' : 'not-installed',\n secretReference: null\n });\n productSecretsDeleted += 1;\n }\n }\n this.#repository.clearUsageData();\n return { usageCleared: true, productSecretsDeleted };\n }\n\n async ingestTelemetry(id: string, payload: unknown): Promise<void> {\n const ingestor = this.#telemetryIngestors.find((candidate) => candidate.id === id);\n if (!ingestor) throw new Error(`Unknown telemetry source: ${id}`);\n if (ingestor.consentId) {\n const status = this.#repository\n .getConnectorStatuses()\n .find((candidate) => candidate.id === ingestor.consentId);\n if (status?.state !== 'connected') throw new Error('Telemetry source is not connected');\n }\n const snapshot = ingestor.parse(payload, this.#clock());\n if (snapshot.usage.length === 0 && snapshot.costs.length === 0) {\n throw new Error('Telemetry payload contained no supported metrics');\n }\n await this.#queueDatabaseWrite(() => {\n this.#repository.saveSnapshot(this.#withRetailCosts(snapshot), { preserveFailure: true });\n });\n }\n\n #queueDatabaseWrite<T>(action: () => T | Promise<T>): Promise<T> {\n const result = this.#databaseWriteQueue.then(action, action);\n this.#databaseWriteQueue = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n }\n\n #withRetailCosts(snapshot: ConnectorSnapshot): ConnectorSnapshot {\n const retailCosts = this.#priceCatalog\n ? deriveRetailEquivalentCosts(snapshot, this.#priceCatalog, this.#clock().toISOString()).costs\n : [];\n return { ...snapshot, costs: [...snapshot.costs, ...retailCosts] };\n }\n\n async discoverConnectors(): Promise<ConnectorStatus[]> {\n if (!this.#discoveryProbe) return this.getConnectorStatuses();\n const existing = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status])\n );\n await Promise.all(\n this.#connectorDefinitions.map(async (definition) => {\n try {\n const inspection = await this.#discoveryProbe!.inspect(definition);\n const prior = existing.get(definition.id);\n const explicitState = prior?.state === 'connected' || prior?.state === 'skipped';\n this.#repository.saveConnectorStatus({\n id: definition.id,\n state: explicitState\n ? prior.state\n : inspection.installed\n ? 'discovered'\n : 'not-installed',\n installed: inspection.installed,\n binaryPath: inspection.binaryPath,\n officialCredentialPresent: inspection.officialCredentialPresent,\n errorCode: null,\n lastDiscoveredAt: this.#clock().toISOString(),\n secretReference: prior?.secretReference ?? null\n });\n } catch {\n const prior = existing.get(definition.id);\n this.#repository.saveConnectorStatus({\n id: definition.id,\n state: 'error',\n installed: prior?.installed ?? false,\n binaryPath: prior?.binaryPath ?? null,\n officialCredentialPresent: prior?.officialCredentialPresent ?? false,\n errorCode: 'discovery-failed',\n lastDiscoveredAt: this.#clock().toISOString(),\n secretReference: prior?.secretReference ?? null\n });\n }\n })\n );\n return this.getConnectorStatuses();\n }\n\n async getConnectorStatuses(): Promise<ConnectorStatus[]> {\n const records = new Map(\n this.#repository.getConnectorStatuses().map((status) => [status.id, status])\n );\n return await Promise.all(\n this.#connectorDefinitions.map(async (definition) => {\n const record = records.get(definition.id) ?? emptyConnectorStatus(definition.id);\n return {\n ...record,\n displayName: definition.displayName,\n command: definition.command,\n permissionDescription: definition.permissionDescription,\n credentialOwner: definition.credentialOwner,\n experimental: definition.experimental,\n expectedCoverage: definition.expectedCoverage,\n target: definition.target,\n secretConfigured:\n record.secretReference !== null && this.#secretStore\n ? await this.#secretStore.has(record.secretReference)\n : false\n };\n })\n );\n }\n\n async configureConnector(id: string, input: ConfigureConnectorInput): Promise<ConnectorStatus> {\n const definition = this.#connectorDefinitions.find((candidate) => candidate.id === id);\n if (!definition) throw new Error(`Unknown connector: ${id}`);\n\n if (input.action === 'retry') {\n if (!this.#discoveryProbe) throw new Error('Connector discovery is unavailable');\n const inspection = await this.#discoveryProbe.inspect(definition);\n const prior = this.#repository.getConnectorStatuses().find((status) => status.id === id);\n this.#repository.saveConnectorStatus({\n id,\n state:\n inspection.installed && prior?.state === 'connected'\n ? 'connected'\n : inspection.installed\n ? 'discovered'\n : 'not-installed',\n installed: inspection.installed,\n binaryPath: inspection.binaryPath,\n officialCredentialPresent: inspection.officialCredentialPresent,\n errorCode: null,\n lastDiscoveredAt: this.#clock().toISOString(),\n secretReference: prior?.secretReference ?? null\n });\n } else {\n const prior = this.#repository.getConnectorStatuses().find((status) => status.id === id);\n const secretReference = `connector:${id}`;\n if (input.action === 'connect' && definition.credentialOwner === 'agent-usage') {\n if (!input.secret || !this.#secretStore) throw new Error('A managed secret is required');\n await this.#secretStore.set(secretReference, input.secret);\n }\n this.#repository.saveConnectorStatus({\n id,\n state: input.action === 'connect' ? 'connected' : 'skipped',\n installed: prior?.installed ?? false,\n binaryPath: prior?.binaryPath ?? null,\n officialCredentialPresent: prior?.officialCredentialPresent ?? false,\n errorCode: null,\n lastDiscoveredAt: this.#clock().toISOString(),\n secretReference:\n input.action === 'connect' && definition.credentialOwner === 'agent-usage'\n ? secretReference\n : (prior?.secretReference ?? null)\n });\n }\n\n this.#repository.deleteConnectorDiagnostic(id);\n await this.refresh({ userInitiated: true });\n\n const status = (await this.getConnectorStatuses()).find((candidate) => candidate.id === id);\n if (!status) throw new Error(`Connector status disappeared: ${id}`);\n return status;\n }\n}\n\nfunction safeConnectorFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'connector-refresh-failed',\n message: 'Provider refresh failed.',\n recovery: 'Run agent-usage doctor, then retry refresh.'\n };\n}\n\nfunction combineFailures(failures: ConnectorFailure[]): ConnectorFailure {\n return {\n code: failures.map((failure) => failure.code).join(','),\n message: failures.map((failure) => failure.message).join(' '),\n recovery: [...new Set(failures.map((failure) => failure.recovery))].join(' ')\n };\n}\n\nfunction createProcessingStatus(startedAt: string, hardRebuild: boolean): ProcessingStatus {\n const module = () => ({\n state: 'pending' as const,\n startedAt: null,\n completedAt: null,\n message: null\n });\n return {\n startedAt,\n hardRebuild,\n modules: {\n discovery: module(),\n usage: module(),\n pricing: module(),\n retention: module()\n }\n };\n}\n\nfunction yieldToEventLoop(): Promise<void> {\n return new Promise((resolve) => setImmediate(resolve));\n}\n\nfunction providerForConnector(id: string, definitions: ConnectorDefinition[]): string {\n return definitions.find((definition) => definition.id === id)?.target.provider.id ?? id;\n}\n\nfunction displayNameForProvider(providerId: string, connectorDisplayName?: string): string {\n return providerId === 'grok' ? 'Grok' : (connectorDisplayName ?? providerId);\n}\n\nfunction defaultBillingDomain(id: string, definitions: ConnectorDefinition[]): string {\n return (\n definitions.find((definition) => definition.id === id)?.target.billingDomain.id ??\n 'subscription'\n );\n}\n\nfunction billingDomainDisplayName(id: string, definitions: ConnectorDefinition[]): string {\n return (\n definitions.find((definition) => definition.target.billingDomain.id === id)?.target\n .billingDomain.displayName ?? id\n );\n}\n\nfunction expectedCoverageForConnector(\n id: string,\n definitions: ConnectorDefinition[]\n): ConnectorDiagnostic['affectedCoverage'] {\n const configured = definitions.find((definition) => definition.id === id)?.expectedCoverage;\n if (configured) return configured;\n if (id === 'xai-api') return ['tokens', 'actual-cost', 'history'];\n return ['quota', 'tokens', 'history'];\n}\n\nfunction redactFailure(failure: ConnectorFailure): ConnectorFailure {\n return {\n code: failure.code,\n message: redactSensitiveText(failure.message),\n recovery: redactSensitiveText(failure.recovery)\n };\n}\n\nfunction withStaleDiagnostic(diagnostic: ConnectorDiagnostic, now: Date): ConnectorDiagnostic {\n if (\n diagnostic.status === 'healthy' &&\n diagnostic.lastSuccessAt &&\n now.getTime() - new Date(diagnostic.lastSuccessAt).getTime() > 15 * 60 * 1000\n ) {\n return {\n ...diagnostic,\n status: 'degraded',\n category: 'stale',\n message: 'The latest successful observation is stale.',\n recovery: 'Refresh this connector and check its credentials if staleness persists.',\n affectedCoverage: expectedCoverageForConnector(diagnostic.id, [])\n };\n }\n return diagnostic;\n}\n\nfunction emptyConnectorStatus(id: string): ConnectorStatusRecord {\n return {\n id,\n state: 'not-checked',\n installed: false,\n binaryPath: null,\n officialCredentialPresent: false,\n errorCode: null,\n lastDiscoveredAt: null,\n secretReference: null\n };\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(message)), timeoutMs);\n })\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nfunction notificationLevel(value: string): number {\n return value === '5' ? 2 : value === '20' ? 1 : 0;\n}\n\nfunction pickAgentProviderIndex(overview: UsageOverview): AgentProviderIndex {\n return {\n generatedAt: overview.generatedAt,\n providers: overview.providers\n .filter((provider) => provider.id !== 'opencode' && provider.id !== 'dsh')\n .map(({ id, displayName }) => ({ id, displayName }))\n };\n}\n","import type { ConnectorDefinition } from '../core/onboarding-types.js';\n\nexport const defaultConnectorDefinitions: ConnectorDefinition[] = [\n {\n id: 'codex',\n displayName: 'Codex',\n command: 'codex',\n permissionDescription: 'Read quota and usage through the installed official Codex client.',\n credentialOwner: 'official-client',\n experimental: false,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'codex', displayName: 'Codex' },\n billingDomain: { id: 'subscription', displayName: 'Subscription' }\n },\n officialCredentialPaths: ['.codex/auth.json']\n },\n {\n id: 'claude-code',\n displayName: 'Claude Code',\n command: 'claude',\n permissionDescription: 'Read opt-in telemetry and usage exposed by the official Claude client.',\n credentialOwner: 'official-client',\n experimental: true,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'claude-code', displayName: 'Claude Code' },\n billingDomain: { id: 'subscription', displayName: 'Subscription' }\n },\n officialCredentialPaths: ['.claude', '.claude.json']\n },\n {\n id: 'opencode-go',\n displayName: 'OpenCode',\n command: 'opencode',\n permissionDescription:\n 'Read local usage and optional Go account quota through official OpenCode surfaces.',\n credentialOwner: 'official-client',\n experimental: false,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'opencode-go', displayName: 'OpenCode Go' },\n billingDomain: { id: 'go-subscription', displayName: 'OpenCode Go' }\n },\n officialCredentialPaths: ['.local/share/opencode/auth.json']\n },\n {\n id: 'grok',\n displayName: 'Grok',\n command: 'grok',\n permissionDescription:\n 'Read opt-in Grok Build telemetry and official client billing capability.',\n credentialOwner: 'official-client',\n experimental: true,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'grok', displayName: 'Grok' },\n billingDomain: { id: 'grok-build-subscription', displayName: 'Build / SuperGrok' }\n },\n officialCredentialPaths: ['.grok/auth.json']\n },\n {\n id: 'xai-api',\n displayName: 'xAI API (Grok)',\n command: null,\n permissionDescription:\n 'Store a dedicated xAI Management API key in macOS Keychain for official billing data.',\n credentialOwner: 'agent-usage',\n experimental: false,\n expectedCoverage: ['tokens', 'actual-cost', 'history'],\n target: {\n provider: { id: 'grok', displayName: 'Grok' },\n billingDomain: { id: 'xai-api', displayName: 'xAI API' }\n }\n },\n {\n id: 'dsh',\n displayName: 'dsh',\n command: 'dsh',\n permissionDescription:\n 'Read local dsh session logs for token history. No credential file is opened.',\n credentialOwner: 'official-client',\n experimental: true,\n expectedCoverage: ['tokens', 'history'],\n target: {\n provider: { id: 'dsh', displayName: 'dsh' },\n billingDomain: { id: 'deepseek-official', displayName: 'DeepSeek API' }\n },\n officialCredentialPaths: ['.dsh']\n },\n {\n id: 'antigravity',\n displayName: 'Antigravity',\n command: 'agy',\n permissionDescription:\n 'Read local Antigravity conversation session databases for token history. No credential file is opened.',\n credentialOwner: 'official-client',\n experimental: true,\n expectedCoverage: ['quota', 'tokens', 'history'],\n target: {\n provider: { id: 'antigravity', displayName: 'Antigravity' },\n billingDomain: { id: 'code-assist-subscription', displayName: 'Gemini Code Assist' }\n },\n\n officialCredentialPaths: ['.gemini/antigravity-cli', '.gemini/antigravity']\n }\n];\n","/**\n * Normalizes and clamps a quota usage percentage to the valid range [0, 100].\n * Returns null if the value is null, undefined, or not a finite number.\n */\nexport function clampPercent(value: number): number;\nexport function clampPercent(value: number | null): number | null;\nexport function clampPercent(value: number | null | undefined): number | null;\nexport function clampPercent(value: number | null | undefined): number | null {\n if (value === null || value === undefined || !Number.isFinite(value)) {\n return null;\n }\n return Math.min(100, Math.max(0, value));\n}\n","import type {\n Connector,\n CollectionRequest,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket\n} from '../../core/types.js';\nimport { clampPercent } from '../../core/quota-normalization.js';\nimport type { ParsedClaudeQuota } from './claude-usage-screen-client.js';\nimport type { TranscriptUsageClient } from '../../server/local-transcript-usage-client.js';\n\nexport interface ClaudeQuotaClient {\n readQuota(): Promise<ParsedClaudeQuota[]>;\n}\n\nexport interface ClaudeCodeConnectorOptions {\n quotaClient: ClaudeQuotaClient;\n historyClient?: TranscriptUsageClient;\n clock?: () => Date;\n}\n\nexport class ClaudeCodeConnector implements Connector {\n readonly id = 'claude-code';\n readonly displayName = 'Claude Code';\n readonly consentId = 'claude-code';\n readonly #quotaClient: ClaudeQuotaClient;\n readonly #historyClient?: TranscriptUsageClient;\n readonly #clock: () => Date;\n\n constructor(options: ClaudeCodeConnectorOptions) {\n this.#quotaClient = options.quotaClient;\n this.#historyClient = options.historyClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n let quota: ParsedClaudeQuota[] = [];\n const warnings: ConnectorFailure[] = [];\n try {\n quota = await this.#quotaClient.readQuota();\n } catch (error) {\n warnings.push(safeFailure(error));\n }\n const history = this.#historyClient\n ? await this.#historyClient.readUsage(options)\n : { usage: [], costs: [], complete: true };\n if (!history.complete) warnings.push(incompleteTranscriptFailure('Claude Code'));\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: [{ id: 'subscription', displayName: 'Claude subscription' }],\n quotaBuckets: quota.map(mapQuota),\n usage: history.usage,\n ...(history.usage.length > 0 && history.complete\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['claude-transcript:'],\n retiredIdPrefixes: ['claude-otel:']\n }\n }\n : {}),\n costs: history.costs,\n warnings,\n observedAt\n };\n }\n}\n\nfunction incompleteTranscriptFailure(provider: string): ConnectorFailure {\n return {\n code: 'local-transcript-scan-incomplete',\n message: `Some local ${provider} history could not be read.`,\n recovery: 'Agent Usage will retry automatically without removing stored history.'\n };\n}\n\nfunction mapQuota(quota: ParsedClaudeQuota): QuotaBucket {\n return {\n id: quota.id,\n billingDomainId: 'subscription',\n label: quota.label,\n usedPercent: clampPercent(quota.usedPercent),\n windowDurationMinutes: quota.windowDurationMinutes,\n resetsAt: quota.resetsAt,\n authority: 'official-client',\n scope: 'account-wide'\n };\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'claude-quota-adapter-failed',\n message: 'Claude Code subscription quota is unavailable.',\n recovery: 'Open Claude Code, run /usage, and update Claude Code before retrying.'\n };\n}\n","export interface OtlpPoint {\n timeUnixNano?: unknown;\n asInt?: unknown;\n asDouble?: unknown;\n attributes?: unknown;\n}\n\nexport interface OtlpMetric {\n name?: unknown;\n sum?: { dataPoints?: unknown; aggregationTemporality?: unknown };\n}\n\ninterface OtlpAttribute {\n key?: unknown;\n value?: { stringValue?: unknown };\n}\n\nexport function extractOtlpResources(payload: unknown): Record<string, unknown>[] {\n if (!isRecord(payload) || !Array.isArray(payload.resourceMetrics)) return [];\n return payload.resourceMetrics.filter(isRecord);\n}\n\nexport function extractOtlpMetrics(resource: Record<string, unknown>): OtlpMetric[] {\n if (!Array.isArray(resource.scopeMetrics)) return [];\n return resource.scopeMetrics\n .filter(isRecord)\n .flatMap((scope) => (Array.isArray(scope.metrics) ? (scope.metrics as OtlpMetric[]) : []));\n}\n\nexport function otlpStringAttributes(value: unknown): Map<string, string> {\n const result = new Map<string, string>();\n if (!Array.isArray(value)) return result;\n for (const attribute of value as OtlpAttribute[]) {\n if (typeof attribute.key === 'string' && typeof attribute.value?.stringValue === 'string') {\n result.set(attribute.key, attribute.value.stringValue);\n }\n }\n return result;\n}\n\nexport function isDeltaTemporality(value: unknown): boolean {\n return value === 1 || value === 'AGGREGATION_TEMPORALITY_DELTA';\n}\n\nexport function numericOtlpPointValue(point: OtlpPoint): number | null {\n const value = point.asDouble ?? point.asInt;\n const number = typeof value === 'number' || typeof value === 'string' ? Number(value) : NaN;\n return Number.isFinite(number) ? number : null;\n}\n\nexport function otlpNanoToIso(value: string): string {\n try {\n return new Date(Number(BigInt(value) / 1_000_000n)).toISOString();\n } catch {\n throw new Error('Invalid OTLP nanosecond timestamp');\n }\n}\n\nexport function readRecord(\n value: Record<string, unknown>,\n key: string\n): Record<string, unknown> | null {\n return isRecord(value[key]) ? value[key] : null;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n","import type { ConnectorSnapshot, CostRecord, UsageObservation } from '../../core/types.js';\nimport {\n extractOtlpMetrics,\n extractOtlpResources,\n isDeltaTemporality,\n numericOtlpPointValue,\n otlpNanoToIso,\n otlpStringAttributes,\n type OtlpPoint\n} from '../otlp.js';\n\ninterface UsageAggregate {\n timestamp: string;\n timePrecision: 'event' | 'unknown';\n model: string | null;\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n}\n\nexport class ClaudeTelemetryError extends Error {\n readonly code = 'claude-otel-temporality-unsupported';\n readonly recovery =\n 'Update Claude Code, restart it with delta telemetry enabled, then refresh Agent Usage.';\n\n constructor() {\n super('Cumulative Claude Code metrics cannot be safely added to local history.');\n this.name = 'ClaudeTelemetryError';\n }\n}\n\nexport function parseClaudeOtlpMetrics(payload: unknown, receivedAt: Date): ConnectorSnapshot {\n const metrics = extractOtlpResources(payload).flatMap(extractOtlpMetrics);\n const usage = new Map<string, UsageAggregate>();\n const costs: CostRecord[] = [];\n\n for (const metric of metrics) {\n const points = Array.isArray(metric.sum?.dataPoints)\n ? (metric.sum.dataPoints as OtlpPoint[])\n : [];\n if (\n ['claude_code.token.usage', 'claude_code.cost.usage'].includes(String(metric.name)) &&\n !isDeltaTemporality(metric.sum?.aggregationTemporality)\n ) {\n throw new ClaudeTelemetryError();\n }\n for (const point of points) {\n const attributes = otlpStringAttributes(point.attributes);\n const model = attributes.get('model') ?? null;\n const nano = typeof point.timeUnixNano === 'string' ? point.timeUnixNano : null;\n const timestamp = nano ? otlpNanoToIso(nano) : receivedAt.toISOString();\n const value = numericOtlpPointValue(point);\n if (value === null || value < 0) continue;\n\n if (metric.name === 'claude_code.token.usage') {\n const type = attributes.get('type');\n if (!['input', 'output', 'cacheRead', 'cacheCreation'].includes(type ?? '')) continue;\n const key = `${nano ?? receivedAt.getTime()}:${model ?? 'unknown-model'}`;\n const aggregate = usage.get(key) ?? {\n timestamp,\n timePrecision: nano ? 'event' : 'unknown',\n model,\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0\n };\n if (type === 'input') aggregate.input += value;\n if (type === 'output') aggregate.output += value;\n if (type === 'cacheRead') aggregate.cacheRead += value;\n if (type === 'cacheCreation') aggregate.cacheWrite += value;\n usage.set(key, aggregate);\n }\n if (metric.name === 'claude_code.cost.usage') {\n const key = `${nano ?? receivedAt.getTime()}:${model ?? 'unknown-model'}`;\n costs.push({\n id: `claude-otel-cost:${key}`,\n sourceId: `claude-otel:${key}`,\n billingDomainId: 'subscription',\n observedAt: timestamp,\n kind: 'reported-estimate',\n amount: value,\n currency: 'USD',\n authority: 'local-observation',\n model,\n usageObservationId: `claude-otel:${key}`,\n priceSnapshot: {\n id: 'claude-code-otlp-reported-cost-v1',\n version: '2026-08-28',\n source: 'Claude Code official OTLP reported cost',\n canonicalModel: model,\n effectiveAt: '2026-08-28T00:00:00.000Z',\n effectiveUntil: null,\n currency: 'USD',\n ratesPerMillion: {\n input: null,\n output: null,\n reasoning: null,\n 'cache-read': null,\n 'cache-write': null\n }\n }\n });\n }\n }\n }\n\n const observations: UsageObservation[] = [...usage.entries()].map(([key, item]) => ({\n id: `claude-otel:${key}`,\n billingDomainId: 'subscription',\n model: item.model,\n observedAt: item.timestamp,\n inputTokens: item.input,\n outputTokens: item.output,\n cacheReadTokens: item.cacheRead,\n cacheWriteTokens: item.cacheWrite,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: item.model ? 'known' : 'unclassified',\n timePrecision: item.timePrecision,\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n }));\n\n return {\n provider: { id: 'claude-code', displayName: 'Claude Code' },\n billingDomains: [{ id: 'subscription', displayName: 'Claude subscription' }],\n quotaBuckets: [],\n usage: observations,\n costs,\n observedAt: receivedAt.toISOString()\n };\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { Readable, Writable } from 'node:stream';\n\nimport { clampPercent } from '../../core/quota-normalization.js';\nimport type { ClaudeQuotaClient } from './claude-code-connector.js';\n\nexport interface ParsedClaudeQuota {\n id: string;\n label: string;\n usedPercent: number;\n windowDurationMinutes: number | null;\n resetsAt: string | null;\n}\n\nexport class ClaudeUsageAdapterError extends Error {\n readonly code: string;\n readonly recovery: string;\n\n constructor(code: string, message: string, recovery: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'ClaudeUsageAdapterError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport interface ClaudeUsageProcess {\n readonly stdin: Writable;\n readonly stdout: Readable;\n readonly stderr: Readable;\n once(event: 'error', listener: (error: Error) => void): this;\n once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;\n kill(signal?: NodeJS.Signals): boolean;\n}\n\nexport interface ScreenReaderClaudeQuotaClientOptions {\n command?: string;\n expectCommand?: string;\n timeoutMs?: number;\n clock?: () => Date;\n environment?: NodeJS.ProcessEnv;\n spawnProcess?: (\n command: string,\n arguments_: string[],\n options: { env: NodeJS.ProcessEnv }\n ) => ClaudeUsageProcess;\n}\n\nexport class ScreenReaderClaudeQuotaClient implements ClaudeQuotaClient {\n readonly #command: string;\n readonly #expectCommand: string;\n readonly #timeoutMs: number;\n readonly #clock: () => Date;\n readonly #environment: NodeJS.ProcessEnv;\n readonly #spawnProcess: NonNullable<ScreenReaderClaudeQuotaClientOptions['spawnProcess']>;\n\n constructor(options: ScreenReaderClaudeQuotaClientOptions = {}) {\n this.#command = options.command ?? 'claude';\n this.#expectCommand = options.expectCommand ?? '/usr/bin/expect';\n this.#timeoutMs = options.timeoutMs ?? 24_000;\n this.#clock = options.clock ?? (() => new Date());\n this.#environment = subscriptionEnvironment(options.environment ?? process.env);\n this.#spawnProcess =\n options.spawnProcess ??\n ((command, arguments_, spawnOptions) =>\n spawn(command, arguments_, {\n ...spawnOptions,\n stdio: ['pipe', 'pipe', 'pipe']\n }) as ChildProcessWithoutNullStreams);\n }\n\n async readQuota(): Promise<ParsedClaudeQuota[]> {\n if (!/^[a-zA-Z0-9_./-]+$/.test(this.#command)) {\n throw unavailableError(new Error('Unsafe Claude command path'));\n }\n let child: ClaudeUsageProcess;\n try {\n const [firstScreenTimeoutSeconds, redrawTimeoutSeconds] = usageTimeoutSeconds(\n this.#timeoutMs\n );\n child = this.#spawnProcess(\n this.#expectCommand,\n ['-c', expectScript(this.#command, firstScreenTimeoutSeconds, redrawTimeoutSeconds)],\n { env: this.#environment }\n );\n } catch (error) {\n throw unavailableError(error);\n }\n\n return await new Promise<ParsedClaudeQuota[]>((resolve, reject) => {\n let output = '';\n let settled = false;\n const finish = (result: ParsedClaudeQuota[] | Error, terminate = true) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n if (terminate) child.kill();\n if (result instanceof Error) reject(result);\n else resolve(result);\n };\n const timeout = setTimeout(\n () =>\n finish(\n new ClaudeUsageAdapterError(\n 'claude-usage-timeout',\n 'Claude Code did not return the usage screen in time.',\n 'Open Claude Code, run /usage, then retry.'\n )\n ),\n this.#timeoutMs\n );\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => {\n output += stripTerminalControls(chunk);\n if (\n /__CLAUDE_TRUST_REQUIRED__|Quick safety check|Is this a project you created/i.test(output)\n ) {\n finish(\n new ClaudeUsageAdapterError(\n 'claude-workspace-not-trusted',\n 'Claude Code has not trusted this workspace.',\n 'Open Claude Code in this folder, review the trust prompt, then retry.'\n )\n );\n return;\n }\n if (!/__CLAUDE_USAGE_DONE__/i.test(output)) return;\n try {\n finish(parseClaudeUsageScreen(output, this.#clock()), false);\n } catch (error) {\n finish(error instanceof Error ? error : schemaError(error));\n }\n });\n child.once('error', (error) => finish(unavailableError(error)));\n child.once('exit', (code, signal) => {\n if (settled) return;\n if (output.trim()) {\n try {\n finish(parseClaudeUsageScreen(output, this.#clock()));\n return;\n } catch (error) {\n if (error instanceof ClaudeUsageAdapterError) {\n finish(error);\n return;\n }\n }\n }\n finish(\n unavailableError(new Error(`Claude Code exited with ${String(code)} (${String(signal)})`))\n );\n });\n });\n }\n}\n\nfunction subscriptionEnvironment(environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const subscriptionEnvironment = { ...environment };\n for (const key of [\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n 'ANTHROPIC_BASE_URL',\n 'ANTHROPIC_MODEL',\n 'CLAUDE_CODE_USE_BEDROCK',\n 'CLAUDE_CODE_USE_VERTEX',\n 'CLAUDE_CODE_USE_FOUNDRY'\n ]) {\n delete subscriptionEnvironment[key];\n }\n return subscriptionEnvironment;\n}\n\nfunction usageTimeoutSeconds(timeoutMs: number): [number, number] {\n const usableSeconds = Math.max(2, Math.floor((timeoutMs - 2_000) / 1_000));\n const firstScreenTimeoutSeconds = Math.max(1, Math.min(8, usableSeconds - 1));\n return [firstScreenTimeoutSeconds, Math.max(1, usableSeconds - firstScreenTimeoutSeconds)];\n}\n\nfunction expectScript(\n command: string,\n firstScreenTimeoutSeconds: number,\n redrawTimeoutSeconds: number\n): string {\n return `log_user 1\nset timeout 1\nspawn {${command}} --safe-mode --ax-screen-reader\nexpect {\n -re {Quick safety check|Is this a project you created} {\n puts \"\\\\n__CLAUDE_TRUST_REQUIRED__\"\n exit 20\n }\n timeout {}\n eof { exit 22 }\n}\nsend -- \"/usage\\\\r\"\nset timeout ${firstScreenTimeoutSeconds}\nexpect {\n -re {Quick safety check|Is this a project you created} {\n puts \"\\\\n__CLAUDE_TRUST_REQUIRED__\"\n exit 20\n }\n -re {Esc to cancel} {\n set timeout ${redrawTimeoutSeconds}\n expect {\n -re {Current week \\\\(Fable\\\\)} {\n expect {\n -re {Esc to cancel} {}\n timeout {}\n eof { exit 22 }\n }\n }\n timeout {}\n eof { exit 22 }\n }\n send -- \"\\\\033\"\n after 100\n send -- \"/exit\\\\r\"\n after 500\n puts \"\\\\n__CLAUDE_USAGE_DONE__\"\n exit 0\n }\n timeout {\n puts \"\\\\n__CLAUDE_USAGE_TIMEOUT__\"\n exit 21\n }\n eof { exit 22 }\n}`;\n}\n\nexport function parseClaudeUsageScreen(text: string, now: Date): ParsedClaudeQuota[] {\n const lines = stripTerminalControls(text)\n .replace(/Esc to cancel/gi, '\\n')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n const quotas = new Map<string, ParsedClaudeQuota>();\n for (let index = 0; index < lines.length; index += 1) {\n const match = lines[index].match(/(\\d+(?:\\.\\d+)?)%\\s+used/i);\n if (!match) continue;\n const heading = findHeading(lines, index);\n if (!heading || /^Refreshing/i.test(heading)) continue;\n const resetLine = lines.slice(index + 1, index + 4).find((line) => /^Resets\\b/i.test(line));\n const id = slugify(heading);\n quotas.set(id, {\n id,\n label: displayLabel(heading),\n usedPercent: clampPercent(Number(match[1])),\n windowDurationMinutes: windowDurationMinutes(heading),\n resetsAt: resetLine ? parseReset(resetLine, now) : null\n });\n }\n if (quotas.size === 0) {\n throw new ClaudeUsageAdapterError(\n 'claude-subscription-quota-unavailable',\n 'Claude Code subscription quota is unavailable.',\n 'Sign in with a Claude subscription, open Claude Code, and run /usage.'\n );\n }\n return [...quotas.values()];\n}\n\nfunction findHeading(lines: string[], percentIndex: number): string | null {\n for (let index = percentIndex - 1; index >= Math.max(0, percentIndex - 3); index -= 1) {\n const line = lines[index];\n if (/^(Plan usage|Settings|Usage|Session|Resets)/i.test(line)) continue;\n if (/^[━─█▁▂▃▄▅▆▇\\s]+$/.test(line)) continue;\n return line;\n }\n return null;\n}\n\nfunction displayLabel(heading: string): string {\n if (/^(5[- ]hour limit|current session)$/i.test(heading)) return '5 hour';\n const currentWeek = heading.match(/^Current week\\s*\\((.+)\\)$/i);\n if (currentWeek) {\n if (/^all models$/i.test(currentWeek[1])) return 'Week · All models';\n if (/^fable(?: only)?$/i.test(currentWeek[1])) return 'Week · Fable only';\n return `Week · ${currentWeek[1]}`;\n }\n const weekly = heading.match(/^Weekly\\s*[·—-]\\s*(.+)$/i);\n return weekly ? `Week · ${weekly[1]}` : heading;\n}\n\nfunction windowDurationMinutes(heading: string): number | null {\n if (/^(5[- ]hour limit|current session)$/i.test(heading)) return 300;\n if (/^(Current week\\s*\\(.+\\)|Weekly\\s*[·—-]\\s*.+)$/i.test(heading)) return 10_080;\n return null;\n}\n\nfunction parseReset(line: string, now: Date): string | null {\n const relative = line.match(/Resets\\s+in\\s+(?:(\\d+)d\\s*)?(?:(\\d+)h\\s*)?(?:(\\d+)m)?/i);\n if (relative) {\n const milliseconds =\n (Number(relative[1] ?? 0) * 24 * 60 +\n Number(relative[2] ?? 0) * 60 +\n Number(relative[3] ?? 0)) *\n 60_000;\n return new Date(now.getTime() + milliseconds).toISOString();\n }\n const timeZone = line.match(/\\(([^)]+)\\)\\s*$/)?.[1];\n const value = line\n .replace(/^Resets\\s+/i, '')\n .replace(/\\s*\\([^)]+\\)\\s*$/, '')\n .trim();\n if (timeZone) {\n const zoned = parseZonedReset(value, timeZone, now);\n if (zoned) return zoned.toISOString();\n }\n const withYear = /\\b\\d{4}\\b/.test(value) ? value : `${value}, ${now.getFullYear()}`;\n const timestamp = Date.parse(withYear);\n return Number.isFinite(timestamp) ? new Date(timestamp).toISOString() : null;\n}\n\nfunction parseZonedReset(value: string, timeZone: string, now: Date): Date | null {\n try {\n const nowParts = dateTimeParts(now, timeZone);\n const timeOnly = value.match(/^(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)$/i);\n if (timeOnly) {\n const hour = hour24(Number(timeOnly[1]), timeOnly[3]);\n const minute = Number(timeOnly[2] ?? 0);\n let reset = zonedDateTime(\n nowParts.year,\n nowParts.month,\n nowParts.day,\n hour,\n minute,\n timeZone\n );\n if (reset.getTime() <= now.getTime()) {\n const tomorrow = new Date(Date.UTC(nowParts.year, nowParts.month - 1, nowParts.day + 1));\n reset = zonedDateTime(\n tomorrow.getUTCFullYear(),\n tomorrow.getUTCMonth() + 1,\n tomorrow.getUTCDate(),\n hour,\n minute,\n timeZone\n );\n }\n return reset;\n }\n\n const dated = value.match(\n /^([A-Za-z]+)\\s+(\\d{1,2})(?:,\\s*|\\s+)(?:(\\d{4})(?:,\\s*|\\s+))?(?:at\\s+)?(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)$/i\n );\n if (!dated) return null;\n const month = monthNumber(dated[1]);\n if (month === null) return null;\n let year = Number(dated[3] ?? nowParts.year);\n const resetForYear = (candidateYear: number) =>\n zonedDateTime(\n candidateYear,\n month,\n Number(dated[2]),\n hour24(Number(dated[4]), dated[6]),\n Number(dated[5] ?? 0),\n timeZone\n );\n let reset = resetForYear(year);\n if (!dated[3] && reset.getTime() <= now.getTime()) {\n year += 1;\n reset = resetForYear(year);\n }\n return reset;\n } catch {\n return null;\n }\n}\n\nfunction zonedDateTime(\n year: number,\n month: number,\n day: number,\n hour: number,\n minute: number,\n timeZone: string\n): Date {\n const target = Date.UTC(year, month - 1, day, hour, minute);\n let timestamp = target;\n for (let iteration = 0; iteration < 3; iteration += 1) {\n const represented = dateTimeParts(new Date(timestamp), timeZone);\n const representedTimestamp = Date.UTC(\n represented.year,\n represented.month - 1,\n represented.day,\n represented.hour,\n represented.minute\n );\n timestamp += target - representedTimestamp;\n }\n return new Date(timestamp);\n}\n\nfunction dateTimeParts(\n date: Date,\n timeZone: string\n): { year: number; month: number; day: number; hour: number; minute: number } {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23'\n }).formatToParts(date);\n const part = (type: Intl.DateTimeFormatPartTypes) =>\n Number(parts.find((candidate) => candidate.type === type)?.value);\n return {\n year: part('year'),\n month: part('month'),\n day: part('day'),\n hour: part('hour'),\n minute: part('minute')\n };\n}\n\nfunction hour24(hour: number, meridiem: string): number {\n return (hour % 12) + (/pm/i.test(meridiem) ? 12 : 0);\n}\n\nfunction monthNumber(value: string): number | null {\n const index = [\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec'\n ].indexOf(value.slice(0, 3).toLowerCase());\n return index === -1 ? null : index + 1;\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\nfunction stripTerminalControls(value: string): string {\n return (\n value\n // OSC and CSI are protocol control sequences emitted by the official terminal UI.\n // eslint-disable-next-line no-control-regex\n .replace(/\\u001B\\][^\\u0007]*(?:\\u0007|\\u001B\\\\)/g, '')\n // eslint-disable-next-line no-control-regex\n .replace(/\\u001B\\[[0-?]*[ -/]*[@-~]/g, '')\n // eslint-disable-next-line no-control-regex\n .replace(/[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F]/g, '')\n );\n}\n\nfunction unavailableError(cause?: unknown): ClaudeUsageAdapterError {\n return new ClaudeUsageAdapterError(\n 'claude-usage-client-unavailable',\n 'Claude Code usage client is unavailable.',\n 'Install or update Claude Code, then retry.',\n { cause }\n );\n}\n\nfunction schemaError(cause?: unknown): ClaudeUsageAdapterError {\n return new ClaudeUsageAdapterError(\n 'claude-usage-schema-changed',\n 'Claude Code returned an unsupported usage screen.',\n 'Update Agent Usage and Claude Code, then retry.',\n { cause }\n );\n}\n","import { z } from 'zod';\n\nimport type {\n Connector,\n CollectionRequest,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket,\n UsageObservation\n} from '../../core/types.js';\nimport type { TranscriptUsageClient } from '../../server/local-transcript-usage-client.js';\nimport { clampPercent } from '../../core/quota-normalization.js';\nimport { normalizeTokenObservation } from '../../core/token-normalization.js';\n\nconst nullableNumeric = z.union([z.number(), z.string()]).transform(Number).nullable();\nconst numeric = z.union([z.number(), z.string()]).transform(Number);\nconst rateLimitWindowSchema = z\n .object({\n usedPercent: z.number(),\n windowDurationMins: z.number().nullable(),\n resetsAt: z.number().nullable()\n })\n .passthrough();\nconst rateLimitSnapshotSchema = z\n .object({\n limitId: z.string().nullable(),\n limitName: z.string().nullable(),\n primary: rateLimitWindowSchema.nullable(),\n secondary: rateLimitWindowSchema.nullable()\n })\n .passthrough();\nexport const codexRateLimitsSchema = z\n .object({\n rateLimits: rateLimitSnapshotSchema,\n rateLimitsByLimitId: z.record(z.string(), rateLimitSnapshotSchema).nullable()\n })\n .passthrough();\nexport const codexTokenUsageSchema = z\n .object({\n summary: z\n .object({\n lifetimeTokens: nullableNumeric,\n peakDailyTokens: nullableNumeric,\n longestRunningTurnSec: nullableNumeric,\n currentStreakDays: nullableNumeric,\n longestStreakDays: nullableNumeric\n })\n .passthrough(),\n dailyUsageBuckets: z\n .array(\n z\n .object({\n startDate: z.string(),\n tokens: numeric\n })\n .passthrough()\n )\n .nullable()\n })\n .passthrough();\n\nexport type CodexRateLimitsResponse = z.infer<typeof codexRateLimitsSchema>;\nexport type CodexTokenUsageResponse = z.infer<typeof codexTokenUsageSchema>;\n\nexport interface CodexAccountPayload {\n rateLimits: CodexRateLimitsResponse;\n tokenUsage: CodexTokenUsageResponse | null;\n}\n\nexport interface CodexAccountClient {\n readAccount(): Promise<CodexAccountPayload>;\n}\n\nexport class CodexConnector implements Connector {\n readonly id = 'codex';\n readonly displayName = 'Codex';\n readonly consentId = 'codex';\n readonly #client: CodexAccountClient;\n readonly #clock: () => Date;\n readonly #historyClient?: TranscriptUsageClient;\n\n constructor(\n client: CodexAccountClient,\n clock: () => Date = () => new Date(),\n historyClient?: TranscriptUsageClient\n ) {\n this.#client = client;\n this.#clock = clock;\n this.#historyClient = historyClient;\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const now = this.#clock();\n const observedAt = now.toISOString();\n const warnings: ConnectorFailure[] = [];\n let payload: CodexAccountPayload | null = null;\n try {\n payload = await this.#client.readAccount();\n } catch (error) {\n warnings.push(safeFailure(error));\n }\n const history = this.#historyClient\n ? await this.#historyClient.readUsage(options)\n : { usage: [], costs: [], complete: true };\n const hasLocalHistory = history.usage.length > 0;\n const settledDays = settledAccountDays(payload?.tokenUsage ?? null, now.getTime());\n const canReconcile = history.complete && settledDays.length > 0;\n const accountUsage = canReconcile ? reconcileAccountDays(settledDays, history.usage) : [];\n if (!history.complete) warnings.push(incompleteTranscriptFailure());\n return {\n provider: { id: 'codex', displayName: 'Codex' },\n billingDomains: [{ id: 'subscription', displayName: 'Codex subscription' }],\n quotaBuckets: payload ? mapQuotaBuckets(payload.rateLimits) : [],\n usage: [...accountUsage, ...history.usage],\n ...(hasLocalHistory && canReconcile\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['codex-transcript:', 'codex:daily:'],\n retiredIdPrefixes: []\n }\n }\n : {}),\n costs: history.costs,\n warnings,\n observedAt\n };\n }\n}\n\n// The account usage profile is relayed from the Codex backend, which buckets days in UTC and\n// finishes aggregating a day some hours after it ends. A bucket whose UTC day has not closed is\n// always partial, so it is never evidence for that day's total. A bucket that has closed but is\n// still catching up simply reads low, and the outgrown rule below leaves the day to the local\n// transcripts until the account total is at least as large as they are.\ninterface SettledAccountDay {\n day: string;\n startMs: number;\n tokens: number;\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction settledAccountDays(\n response: CodexTokenUsageResponse | null,\n nowMs: number\n): SettledAccountDay[] {\n return (response?.dailyUsageBuckets ?? [])\n .map((bucket) => ({\n day: bucket.startDate,\n startMs: Date.parse(`${bucket.startDate}T00:00:00.000Z`),\n tokens: bucket.tokens\n }))\n .filter((day) => Number.isFinite(day.startMs) && day.startMs + DAY_MS <= nowMs);\n}\n\nfunction reconcileAccountDays(\n days: SettledAccountDay[],\n localUsage: UsageObservation[]\n): UsageObservation[] {\n const reconciledDays = new Set(days.map((day) => day.day));\n const localTotals = new Map<string, number>();\n for (const observation of localUsage) {\n const day = observation.observedAt.slice(0, 10);\n if (!reconciledDays.has(day)) continue;\n const recorded = normalizeTokenObservation(observation).recordedTokens;\n localTotals.set(day, (localTotals.get(day) ?? 0) + recorded);\n }\n\n return days.flatMap((day) => {\n const localTotal = localTotals.get(day.day) ?? 0;\n if (localTotal > day.tokens) return [];\n const observedAt = new Date(day.startMs).toISOString();\n const accountObservation = {\n id: `codex:daily:${day.day}`,\n billingDomainId: 'subscription',\n model: null,\n observedAt,\n sourceReportedTotalTokens: day.tokens,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n modelAttribution: 'unclassified',\n timePrecision: 'day',\n usageScope: 'account-wide',\n authority: 'official-account'\n } satisfies UsageObservation;\n if (localTotal === 0) return [accountObservation];\n return [\n accountObservation,\n {\n id: `codex-transcript:account-remainder:${day.day}`,\n billingDomainId: 'subscription',\n model: null,\n observedAt,\n reconciledRemainderTokens: day.tokens - localTotal,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n modelAttribution: 'unclassified',\n timePrecision: 'day',\n usageScope: 'account-wide',\n authority: 'estimate'\n } satisfies UsageObservation\n ];\n });\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'codex-account-adapter-failed',\n message: 'Codex account quota is unavailable.',\n recovery: 'Agent Usage will retry automatically.'\n };\n}\n\nfunction incompleteTranscriptFailure(): ConnectorFailure {\n return {\n code: 'local-transcript-scan-incomplete',\n message: 'Some local Codex history could not be read.',\n recovery: 'Agent Usage will retry automatically without removing stored history.'\n };\n}\n\nfunction mapQuotaBuckets(response: CodexRateLimitsResponse): QuotaBucket[] {\n const byId = response.rateLimitsByLimitId;\n const snapshots =\n byId && Object.keys(byId).length > 0\n ? Object.entries(byId)\n : [[response.rateLimits.limitId ?? 'codex', response.rateLimits] as const];\n const multipleLimits = snapshots.length > 1;\n const buckets: QuotaBucket[] = [];\n\n for (const [key, snapshot] of snapshots) {\n if (!snapshot) continue;\n const baseLabel = snapshot.limitName ?? snapshot.limitId ?? key;\n for (const [windowName, window] of [\n ['primary', snapshot.primary],\n ['secondary', snapshot.secondary]\n ] as const) {\n if (!window) continue;\n const windowLabel = formatWindowLabel(window.windowDurationMins, windowName);\n buckets.push({\n id: `${key}:${windowName}`,\n billingDomainId: 'subscription',\n label: multipleLimits ? `${baseLabel} · ${windowLabel}` : windowLabel,\n usedPercent: clampPercent(window.usedPercent),\n windowDurationMinutes: window.windowDurationMins,\n resetsAt: window.resetsAt === null ? null : new Date(window.resetsAt * 1000).toISOString(),\n authority: 'official-account'\n });\n }\n }\n return buckets;\n}\n\nfunction formatWindowLabel(durationMinutes: number | null, fallback: string): string {\n if (durationMinutes === 300) return '5 hour';\n if (durationMinutes === 10_080) return 'Week';\n if (durationMinutes === null) return fallback === 'primary' ? 'Primary' : 'Secondary';\n if (durationMinutes % 1_440 === 0) return `${durationMinutes / 1_440} days`;\n if (durationMinutes % 60 === 0) return `${durationMinutes / 60} hours`;\n return `${durationMinutes} minutes`;\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { Readable, Writable } from 'node:stream';\n\nimport {\n codexRateLimitsSchema,\n codexTokenUsageSchema,\n type CodexAccountClient,\n type CodexAccountPayload\n} from './codex-connector.js';\n\ninterface CodexRpcErrorBody {\n code: number;\n message?: string;\n}\n\ninterface CodexRpcResponse {\n id: number;\n result?: unknown;\n error?: CodexRpcErrorBody;\n}\n\nexport interface CodexAppServerProcess {\n readonly stdin: Writable;\n readonly stdout: Readable;\n readonly stderr: Readable;\n once(event: 'error', listener: (error: Error) => void): this;\n once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;\n kill(signal?: NodeJS.Signals): boolean;\n}\n\nexport interface StdioCodexAccountClientOptions {\n command?: string;\n timeoutMs?: number;\n spawnProcess?: (command: string, arguments_: string[]) => CodexAppServerProcess;\n}\n\nexport class CodexAppServerError extends Error {\n readonly code:\n | 'app-server-unavailable'\n | 'app-server-timeout'\n | 'app-server-method-unsupported'\n | 'codex-account-unavailable'\n | 'app-server-protocol-error'\n | 'app-server-schema-changed';\n readonly recovery: string;\n\n constructor(\n code: CodexAppServerError['code'],\n message: string,\n recovery: string,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = 'CodexAppServerError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class StdioCodexAccountClient implements CodexAccountClient {\n readonly #command: string;\n readonly #timeoutMs: number;\n readonly #spawnProcess: NonNullable<StdioCodexAccountClientOptions['spawnProcess']>;\n\n constructor(options: StdioCodexAccountClientOptions = {}) {\n this.#command = options.command ?? 'codex';\n this.#timeoutMs = options.timeoutMs ?? 5_000;\n this.#spawnProcess =\n options.spawnProcess ??\n ((command, arguments_) =>\n spawn(command, arguments_, {\n stdio: ['pipe', 'pipe', 'pipe']\n }) as ChildProcessWithoutNullStreams);\n }\n\n async readAccount(): Promise<CodexAccountPayload> {\n let process: CodexAppServerProcess;\n try {\n process = this.#spawnProcess(this.#command, ['app-server', '--stdio']);\n } catch (error) {\n throw unavailableError(error);\n }\n\n const peer = new JsonLinePeer(process, this.#timeoutMs);\n try {\n await peer.request('initialize', {\n clientInfo: { name: 'agent-usage', version: '0.1.0' },\n capabilities: { experimentalApi: true, requestAttestation: false }\n });\n peer.notify('initialized');\n\n const rateLimitsResult = await peer.request('account/rateLimits/read');\n let rateLimits;\n try {\n rateLimits = codexRateLimitsSchema.parse(rateLimitsResult);\n } catch (error) {\n throw schemaError(error);\n }\n\n let tokenUsage = null;\n try {\n const tokenUsageResult = await peer.request('account/usage/read');\n tokenUsage = codexTokenUsageSchema.parse(tokenUsageResult);\n } catch (error) {\n if (!(error instanceof CodexRpcError && error.code === -32601)) {\n if (error instanceof CodexRpcError) throw accountError(error);\n if (error instanceof CodexAppServerError) throw error;\n throw schemaError(error);\n }\n }\n\n return { rateLimits, tokenUsage };\n } catch (error) {\n if (error instanceof CodexAppServerError) throw error;\n if (error instanceof CodexRpcError) {\n if (error.code === -32601) {\n throw new CodexAppServerError(\n 'app-server-method-unsupported',\n 'This Codex version does not expose account usage.',\n 'Update Codex, then run agent-usage discover and refresh.',\n { cause: error }\n );\n }\n throw accountError(error);\n }\n throw unavailableError(error);\n } finally {\n peer.close();\n }\n }\n}\n\nclass CodexRpcError extends Error {\n readonly code: number;\n\n constructor(error: CodexRpcErrorBody) {\n super(error.message ?? `Codex app-server RPC error ${error.code}`);\n this.name = 'CodexRpcError';\n this.code = error.code;\n }\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n}\n\nclass JsonLinePeer {\n readonly #process: CodexAppServerProcess;\n readonly #timeoutMs: number;\n readonly #pending = new Map<number, PendingRequest>();\n #nextId = 1;\n #buffer = '';\n #closed = false;\n\n constructor(process: CodexAppServerProcess, timeoutMs: number) {\n this.#process = process;\n this.#timeoutMs = timeoutMs;\n process.stdout.setEncoding('utf8');\n process.stdout.on('data', (chunk: string) => this.#consume(chunk));\n process.once('error', (error) => this.#fail(unavailableError(error)));\n process.once('exit', (code, signal) => {\n if (this.#closed) return;\n this.#fail(\n new CodexAppServerError(\n 'app-server-unavailable',\n 'Codex app-server exited before the usage request completed.',\n 'Run codex login, then agent-usage discover and refresh.',\n { cause: new Error(`exit=${String(code)} signal=${String(signal)}`) }\n )\n );\n });\n }\n\n request(method: string, params?: unknown): Promise<unknown> {\n const id = this.#nextId++;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.#pending.delete(id);\n reject(\n new CodexAppServerError(\n 'app-server-timeout',\n 'Codex app-server did not respond in time.',\n 'Retry refresh. If it persists, restart or update Codex.'\n )\n );\n }, this.#timeoutMs);\n this.#pending.set(id, { resolve, reject, timeout });\n this.#write({ id, method, ...(params === undefined ? {} : { params }) });\n });\n }\n\n notify(method: string, params?: unknown): void {\n this.#write({ method, ...(params === undefined ? {} : { params }) });\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n for (const pending of this.#pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(\n new CodexAppServerError(\n 'app-server-unavailable',\n 'Codex app-server connection closed.',\n 'Retry refresh.'\n )\n );\n }\n this.#pending.clear();\n this.#process.kill();\n }\n\n #write(message: object): void {\n this.#process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n #consume(chunk: string): void {\n this.#buffer += chunk;\n let newline = this.#buffer.indexOf('\\n');\n while (newline !== -1) {\n const line = this.#buffer.slice(0, newline).trim();\n this.#buffer = this.#buffer.slice(newline + 1);\n if (line) this.#consumeLine(line);\n newline = this.#buffer.indexOf('\\n');\n }\n }\n\n #consumeLine(line: string): void {\n let message: CodexRpcResponse;\n try {\n message = JSON.parse(line) as CodexRpcResponse;\n } catch (error) {\n this.#fail(\n new CodexAppServerError(\n 'app-server-protocol-error',\n 'Codex app-server returned an invalid protocol message.',\n 'Update Codex and Agent Usage, then retry.',\n { cause: error }\n )\n );\n return;\n }\n if (typeof message.id !== 'number') return;\n const pending = this.#pending.get(message.id);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.#pending.delete(message.id);\n if (message.error) pending.reject(new CodexRpcError(message.error));\n else pending.resolve(message.result);\n }\n\n #fail(error: Error): void {\n for (const pending of this.#pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(error);\n }\n this.#pending.clear();\n }\n}\n\nfunction unavailableError(cause: unknown): CodexAppServerError {\n return new CodexAppServerError(\n 'app-server-unavailable',\n 'Codex app-server is unavailable.',\n 'Install or update Codex, then run agent-usage discover.',\n { cause }\n );\n}\n\nfunction accountError(cause: unknown): CodexAppServerError {\n return new CodexAppServerError(\n 'codex-account-unavailable',\n 'Codex account usage is unavailable.',\n 'Run codex login, then refresh Agent Usage.',\n { cause }\n );\n}\n\nfunction schemaError(cause: unknown): CodexAppServerError {\n return new CodexAppServerError(\n 'app-server-schema-changed',\n 'Codex returned an unsupported account-usage schema.',\n 'Update Agent Usage and Codex, then retry.',\n { cause }\n );\n}\n","import type {\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n CostRecord,\n UsageObservation\n} from '../../core/types.js';\nimport type {\n OpenCodeGoLocalHistoryClient,\n OpenCodeLocalRequest\n} from '../opencode-go/opencode-go-connector.js';\n\nexport interface OpenCodeLocalConnectorOptions {\n localHistoryClient: OpenCodeGoLocalHistoryClient;\n clock?: () => Date;\n}\n\nexport class OpenCodeLocalConnector implements Connector {\n readonly id = 'opencode';\n readonly displayName = 'OpenCode';\n readonly consentId = 'opencode-go';\n readonly #localHistoryClient: OpenCodeGoLocalHistoryClient;\n readonly #clock: () => Date;\n\n constructor(options: OpenCodeLocalConnectorOptions) {\n this.#localHistoryClient = options.localHistoryClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n try {\n const requests = await this.#localHistoryClient.readHistory();\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: [{ id: 'local-history', displayName: 'Local history' }],\n quotaBuckets: [],\n usage: requests.map(mapLocalUsage),\n usageReconciliation: {\n authoritativeIdPrefixes: ['opencode-local-request:'],\n retiredIdPrefixes: []\n },\n costs: requests.flatMap((request) =>\n request.cost === null ? [] : [mapLocalCost(request, request.cost)]\n ),\n observedAt\n };\n } catch (error) {\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: [{ id: 'local-history', displayName: 'Local history' }],\n quotaBuckets: [],\n usage: [],\n costs: [],\n warnings: [safeFailure(error)],\n observedAt\n };\n }\n }\n}\n\nfunction mapLocalUsage(request: OpenCodeLocalRequest): UsageObservation {\n return {\n id: `opencode-local-request:${request.id}`,\n billingDomainId: 'local-history',\n model: request.model,\n observedAt: new Date(request.observedAtMs).toISOString(),\n inputTokens: request.inputTokens,\n outputTokens: request.outputTokens,\n reasoningTokens: request.reasoningTokens,\n cacheReadTokens: request.cacheReadTokens,\n cacheWriteTokens: request.cacheWriteTokens,\n tokenSemantics: {\n reasoning: 'separate',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n };\n}\n\nfunction mapLocalCost(request: OpenCodeLocalRequest, cost: number): CostRecord {\n const usageObservationId = `opencode-local-request:${request.id}`;\n return {\n id: `opencode-local-request-cost:${request.id}`,\n sourceId: usageObservationId,\n billingDomainId: 'local-history',\n observedAt: new Date(request.observedAtMs).toISOString(),\n kind: 'reported-estimate',\n amount: cost,\n currency: 'USD',\n authority: 'local-observation',\n model: request.model,\n usageObservationId,\n priceSnapshot: {\n id: 'opencode-local-message-reported-cost-v1',\n version: '2026-08-29',\n source: 'OpenCode local message history reported cost',\n canonicalModel: request.model,\n effectiveAt: '2026-08-29T00:00:00.000Z',\n effectiveUntil: null,\n currency: 'USD',\n ratesPerMillion: {\n input: null,\n output: null,\n reasoning: null,\n 'cache-read': null,\n 'cache-write': null\n }\n }\n };\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'opencode-local-refresh-failed',\n message: 'OpenCode local history coverage is incomplete.',\n recovery: 'Run agent-usage doctor, then retry refresh.'\n };\n}\n","import { execFile as execFileCallback } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { createRequire } from 'node:module';\nimport type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\n\nimport { z } from 'zod';\n\nimport type {\n OpenCodeGoLocalHistoryClient,\n OpenCodeLocalRequest\n} from './opencode-go-connector.js';\n\nconst localMessageRowSchema = z.object({\n sourceId: z.string().min(1),\n role: z.enum(['user', 'assistant']),\n providerId: z.string().min(1).nullable(),\n modelId: z.string().min(1).nullable(),\n completedAtMs: z.number().int().nonnegative().nullable(),\n cost: z.number().finite().nonnegative().nullable(),\n inputTokens: z.number().int().nonnegative().nullable(),\n outputTokens: z.number().int().nonnegative().nullable(),\n reasoningTokens: z.number().int().nonnegative().nullable(),\n cacheReadTokens: z.number().int().nonnegative().nullable(),\n cacheWriteTokens: z.number().int().nonnegative().nullable(),\n observedAtMs: z.number().int().nonnegative()\n});\nconst localMessageRowsSchema = z.array(localMessageRowSchema);\nconst completedAssistantRowSchema = localMessageRowSchema.extend({\n role: z.literal('assistant'),\n providerId: z.string().min(1),\n modelId: z.string().min(1),\n completedAtMs: z.number().int().nonnegative(),\n inputTokens: z.number().int().nonnegative(),\n outputTokens: z.number().int().nonnegative(),\n reasoningTokens: z.number().int().nonnegative(),\n cacheReadTokens: z.number().int().nonnegative(),\n cacheWriteTokens: z.number().int().nonnegative()\n});\n\ntype ExecFileResult = { stdout: string; stderr: string };\ntype ExecFile = (command: string, arguments_: string[]) => Promise<ExecFileResult>;\ntype ReadDatabase = (path: string, query: string) => unknown[];\nconst MAX_PATH_OUTPUT_BYTES = 1024 * 1024;\nconst { DatabaseSync } = createRequire(import.meta.url)(\n 'node:sqlite'\n) as typeof import('node:sqlite');\n\nexport interface CliOpenCodeLocalHistoryClientOptions {\n command?: string;\n execFile?: ExecFile;\n readDatabase?: ReadDatabase;\n}\n\nexport class OpenCodeLocalHistoryError extends Error {\n readonly code: string;\n readonly recovery: string;\n\n constructor(code: string, message: string, recovery: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'OpenCodeLocalHistoryError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class CliOpenCodeLocalHistoryClient implements OpenCodeGoLocalHistoryClient {\n readonly #command: string;\n readonly #execFile: ExecFile;\n readonly #readDatabase: ReadDatabase;\n #activeRead: Promise<OpenCodeLocalRequest[]> | null = null;\n\n constructor(options: CliOpenCodeLocalHistoryClientOptions = {}) {\n this.#command = options.command ?? 'opencode';\n this.#execFile = options.execFile ?? executeOpenCode;\n this.#readDatabase = options.readDatabase ?? readDatabase;\n }\n\n readHistory(): Promise<OpenCodeLocalRequest[]> {\n if (this.#activeRead) return this.#activeRead;\n const activeRead = this.#readHistory();\n this.#activeRead = activeRead;\n activeRead.then(\n () => {\n if (this.#activeRead === activeRead) this.#activeRead = null;\n },\n () => {\n if (this.#activeRead === activeRead) this.#activeRead = null;\n }\n );\n return activeRead;\n }\n\n async #readHistory(): Promise<OpenCodeLocalRequest[]> {\n let databasePath: string;\n try {\n const { stdout } = await this.#execFile(this.#command, ['db', 'path']);\n databasePath = stdout.trim();\n if (!databasePath) throw new Error('OpenCode returned an empty database path.');\n } catch (error) {\n throw unavailableHistory(error);\n }\n let rawRows: unknown[];\n try {\n rawRows = this.#readDatabase(databasePath, HISTORY_QUERY);\n } catch (error) {\n throw unavailableHistory(error);\n }\n let completedAssistantRows: Array<z.infer<typeof completedAssistantRowSchema>>;\n try {\n const messageRows = localMessageRowsSchema.parse(rawRows);\n const assistantRows = messageRows.filter((row) => row.role === 'assistant');\n if (assistantRows.length > 0 && assistantRows.every((row) => row.completedAtMs === null)) {\n throw new Error('No completed assistant message uses the expected schema.');\n }\n completedAssistantRows = assistantRows\n .filter((row) => row.completedAtMs !== null)\n .map((row) => completedAssistantRowSchema.parse(row));\n } catch (error) {\n throw new OpenCodeLocalHistoryError(\n 'opencode-cli-schema-changed',\n 'The installed OpenCode CLI has an unsupported local history schema.',\n 'Update Agent Usage or OpenCode, then retry.',\n { cause: error }\n );\n }\n return completedAssistantRows.filter(hasCategorizedTokens).map((row) => ({\n id: `v2:${createHash('sha256').update(row.sourceId).digest('hex')}`,\n providerId: row.providerId,\n model: `${row.providerId}/${row.modelId}`,\n cost: row.cost,\n inputTokens: row.inputTokens,\n outputTokens: row.outputTokens,\n reasoningTokens: row.reasoningTokens,\n cacheReadTokens: row.cacheReadTokens,\n cacheWriteTokens: row.cacheWriteTokens,\n observedAtMs: row.observedAtMs\n }));\n }\n}\n\nconst HISTORY_QUERY = `SELECT\n id AS sourceId,\n json_extract(data, '$.role') AS role,\n json_extract(data, '$.providerID') AS providerId,\n json_extract(data, '$.modelID') AS modelId,\n json_extract(data, '$.time.completed') AS completedAtMs,\n json_extract(data, '$.cost') AS cost,\n json_extract(data, '$.tokens.input') AS inputTokens,\n json_extract(data, '$.tokens.output') AS outputTokens,\n json_extract(data, '$.tokens.reasoning') AS reasoningTokens,\n json_extract(data, '$.tokens.cache.read') AS cacheReadTokens,\n json_extract(data, '$.tokens.cache.write') AS cacheWriteTokens,\n COALESCE(json_extract(data, '$.time.created'), time_created) AS observedAtMs\n FROM message\n WHERE date(COALESCE(json_extract(data, '$.time.created'), time_created) / 1000, 'unixepoch')\n >= date('now', '-90 days')\n ORDER BY observedAtMs DESC, sourceId`;\n\nfunction hasCategorizedTokens(row: z.infer<typeof completedAssistantRowSchema>): boolean {\n return (\n row.inputTokens +\n row.outputTokens +\n row.reasoningTokens +\n row.cacheReadTokens +\n row.cacheWriteTokens >\n 0\n );\n}\n\nfunction readDatabase(path: string, query: string): unknown[] {\n const database: DatabaseSyncType = new DatabaseSync(path, { readOnly: true });\n try {\n return database.prepare(query).all() as unknown[];\n } finally {\n database.close();\n }\n}\n\nfunction unavailableHistory(cause: unknown): OpenCodeLocalHistoryError {\n return new OpenCodeLocalHistoryError(\n 'opencode-local-history-unavailable',\n 'OpenCode local message history is unavailable.',\n 'Update OpenCode and run opencode stats to verify local history.',\n { cause }\n );\n}\n\nfunction executeOpenCode(command: string, arguments_: string[]): Promise<ExecFileResult> {\n return new Promise((resolve, reject) => {\n execFileCallback(\n command,\n arguments_,\n { encoding: 'utf8', maxBuffer: MAX_PATH_OUTPUT_BYTES },\n (error, stdout, stderr) => {\n if (error) {\n reject(error);\n return;\n }\n resolve({ stdout, stderr });\n }\n );\n });\n}\n","import { z } from 'zod';\n\nimport type { OpenCodeGoAccountClient } from './opencode-go-connector.js';\nimport type { OpenCodeGoAuthReader } from './opencode-auth-reader.js';\n\nconst usageWindowSchema = z.object({\n status: z.enum(['ok', 'rate-limited']),\n percent: z.number().finite().nonnegative(),\n resetsAt: z.string().datetime()\n});\n\nexport const openCodeGoUsageSchema = z.object({\n usage: z.object({\n rolling: usageWindowSchema,\n weekly: usageWindowSchema,\n monthly: usageWindowSchema\n })\n});\n\nexport type OpenCodeGoUsageResponse = z.infer<typeof openCodeGoUsageSchema>;\n\nexport interface OfficialOpenCodeGoClientOptions {\n authReader: OpenCodeGoAuthReader;\n fetch?: typeof fetch;\n endpoint?: string;\n timeoutMs?: number;\n}\n\nexport class OpenCodeGoClientError extends Error {\n readonly code: string;\n readonly recovery: string;\n\n constructor(code: string, message: string, recovery: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'OpenCodeGoClientError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class OfficialOpenCodeGoClient implements OpenCodeGoAccountClient {\n readonly #authReader: OpenCodeGoAuthReader;\n readonly #fetch: typeof fetch;\n readonly #endpoint: string;\n readonly #timeoutMs: number;\n\n constructor(options: OfficialOpenCodeGoClientOptions) {\n this.#authReader = options.authReader;\n this.#fetch = options.fetch ?? globalThis.fetch;\n this.#endpoint = options.endpoint ?? 'https://opencode.ai/zen/go/v1/usage';\n this.#timeoutMs = options.timeoutMs ?? 8_000;\n }\n\n async readUsage(): Promise<OpenCodeGoUsageResponse> {\n const apiKey = await this.#authReader.readGoApiKey();\n let response: Response;\n try {\n response = await this.#fetch(this.#endpoint, {\n method: 'GET',\n headers: { authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(this.#timeoutMs)\n });\n } catch (error) {\n throw new OpenCodeGoClientError(\n 'go-usage-endpoint-unavailable',\n 'OpenCode Go usage endpoint is unavailable.',\n 'Check the network and retry refresh.',\n { cause: error }\n );\n }\n if (!response.ok) throw httpError(response.status);\n try {\n return openCodeGoUsageSchema.parse(await response.json());\n } catch (error) {\n throw new OpenCodeGoClientError(\n 'go-usage-schema-changed',\n 'OpenCode Go returned an unsupported usage schema.',\n 'Update Agent Usage, then retry.',\n { cause: error }\n );\n }\n }\n}\n\nfunction httpError(status: number): OpenCodeGoClientError {\n if (status === 401) {\n return new OpenCodeGoClientError(\n 'go-authentication-failed',\n 'OpenCode Go authentication failed.',\n 'Reconnect OpenCode Go in the official client, then retry.'\n );\n }\n if (status === 403) {\n return new OpenCodeGoClientError(\n 'go-subscription-required',\n 'OpenCode Go subscription is unavailable.',\n 'Subscribe to OpenCode Go or reconnect its API key, then refresh.'\n );\n }\n if (status === 404 || status === 405) {\n return new OpenCodeGoClientError(\n 'go-usage-endpoint-unsupported',\n 'This OpenCode Go account endpoint is unsupported.',\n 'Update OpenCode and Agent Usage, then retry.'\n );\n }\n if (status === 429) {\n return new OpenCodeGoClientError(\n 'go-usage-endpoint-rate-limited',\n 'OpenCode Go usage refresh is rate-limited.',\n 'Wait before refreshing again.'\n );\n }\n return new OpenCodeGoClientError(\n 'go-usage-endpoint-unavailable',\n 'OpenCode Go usage endpoint is unavailable.',\n 'Retry refresh later.'\n );\n}\n","import { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { z } from 'zod';\n\nconst authFileSchema = z.record(\n z.string(),\n z\n .object({\n type: z.string(),\n key: z.string().optional()\n })\n .passthrough()\n);\n\nexport interface OpenCodeGoAuthReader {\n readGoApiKey(): Promise<string>;\n}\n\nexport class OpenCodeAuthFileReader implements OpenCodeGoAuthReader {\n readonly #path: string;\n\n constructor(path = join(homedir(), '.local', 'share', 'opencode', 'auth.json')) {\n this.#path = path;\n }\n\n async readGoApiKey(): Promise<string> {\n let parsed: z.infer<typeof authFileSchema>;\n try {\n parsed = authFileSchema.parse(JSON.parse(await readFile(this.#path, 'utf8')));\n } catch (error) {\n throw new OpenCodeAuthError(\n 'opencode-go-key-unavailable',\n 'OpenCode Go API key is unavailable.',\n 'Run opencode providers login and connect OpenCode Go, then retry.',\n { cause: error }\n );\n }\n const entry = parsed['opencode-go'];\n if (entry?.type !== 'api' || !entry.key) {\n throw new OpenCodeAuthError(\n 'opencode-go-key-unavailable',\n 'OpenCode Go API key is unavailable.',\n 'Run opencode providers login and connect OpenCode Go, then retry.'\n );\n }\n return entry.key;\n }\n}\n\nexport class OpenCodeAuthError extends Error {\n readonly code: string;\n readonly recovery: string;\n\n constructor(code: string, message: string, recovery: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'OpenCodeAuthError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n","import type {\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket\n} from '../../core/types.js';\nimport { clampPercent } from '../../core/quota-normalization.js';\nimport type { OpenCodeGoUsageResponse } from './official-opencode-go-client.js';\n\nexport interface OpenCodeGoAccountClient {\n readUsage(): Promise<OpenCodeGoUsageResponse>;\n}\n\nexport interface OpenCodeLocalRequest {\n id: string;\n providerId: string;\n model: string;\n cost: number | null;\n inputTokens: number;\n outputTokens: number;\n reasoningTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n observedAtMs: number;\n}\n\nexport interface OpenCodeGoLocalHistoryClient {\n readHistory(): Promise<OpenCodeLocalRequest[]>;\n}\n\nexport interface OpenCodeGoConnectorOptions {\n accountClient: OpenCodeGoAccountClient;\n localHistoryClient: OpenCodeGoLocalHistoryClient;\n clock?: () => Date;\n}\n\nconst LIMITS = {\n rolling: { label: '5 hour', amount: 12, windowDurationMinutes: 300 },\n weekly: { label: 'Week', amount: 30, windowDurationMinutes: 10_080 },\n monthly: { label: 'Month', amount: 60, windowDurationMinutes: 43_200 }\n} as const;\n\nexport class OpenCodeGoConnector implements Connector {\n readonly id = 'opencode-go';\n readonly displayName = 'OpenCode Go';\n readonly consentId = 'opencode-go';\n readonly #accountClient: OpenCodeGoAccountClient;\n readonly #localHistoryClient: OpenCodeGoLocalHistoryClient;\n readonly #clock: () => Date;\n\n constructor(options: OpenCodeGoConnectorOptions) {\n this.#accountClient = options.accountClient;\n this.#localHistoryClient = options.localHistoryClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n const [accountResult, localResult] = await Promise.allSettled([\n this.#accountClient.readUsage(),\n this.#localHistoryClient.readHistory()\n ]);\n const warnings: ConnectorFailure[] = [];\n if (accountResult.status === 'rejected') warnings.push(safeFailure(accountResult.reason));\n if (localResult.status === 'rejected') warnings.push(safeFailure(localResult.reason));\n\n const account = accountResult.status === 'fulfilled' ? accountResult.value : null;\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: [{ id: 'go-subscription', displayName: 'OpenCode Go subscription' }],\n quotaBuckets: account ? mapQuota(account) : [],\n usage: [],\n ...(localResult.status === 'fulfilled'\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['opencode-request:'],\n retiredIdPrefixes: ['opencode-session:']\n }\n }\n : {}),\n costs: [],\n warnings,\n observedAt\n };\n }\n}\n\nfunction mapQuota(response: OpenCodeGoUsageResponse): QuotaBucket[] {\n return (Object.keys(LIMITS) as Array<keyof typeof LIMITS>).map((id) => ({\n id,\n billingDomainId: 'go-subscription',\n label: LIMITS[id].label,\n usedPercent: clampPercent(response.usage[id].percent),\n windowDurationMinutes: LIMITS[id].windowDurationMinutes,\n resetsAt: response.usage[id].resetsAt,\n authority: 'official-account',\n scope: 'account-wide',\n status: response.usage[id].status,\n limitAmount: LIMITS[id].amount,\n limitCurrency: 'USD',\n fallbackStatus: 'unknown'\n }));\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'opencode-go-refresh-failed',\n message: 'OpenCode Go coverage is incomplete.',\n recovery: 'Run agent-usage doctor, then retry refresh.'\n };\n}\n","import { z } from 'zod';\n\nimport type {\n BillingDomain,\n Connector,\n CollectionRequest,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket,\n UsageObservation\n} from '../../core/types.js';\nimport type { TranscriptUsageClient } from '../../server/local-transcript-usage-client.js';\nimport { clampPercent } from '../../core/quota-normalization.js';\n\nconst centSchema = z.object({ val: z.number().default(0) }).passthrough();\nconst usagePeriodSchema = z\n .object({\n type: z.string().optional(),\n start: z.string().optional(),\n end: z.string().optional()\n })\n .passthrough();\nconst billingConfigSchema = z\n .object({\n creditUsagePercent: z.number().min(0).max(100).optional(),\n currentPeriod: usagePeriodSchema.optional(),\n monthlyLimit: centSchema.optional(),\n used: centSchema.optional(),\n billingPeriodStart: z.string().optional(),\n billingPeriodEnd: z.string().optional(),\n isUnifiedBillingUser: z.boolean().optional()\n })\n .passthrough();\n\nexport const grokBillingResponseSchema = z\n .object({\n config: billingConfigSchema.nullable(),\n onDemandEnabled: z.boolean().nullable().optional(),\n subscriptionTier: z.string().optional(),\n sourceObservedAt: z.string().datetime({ offset: true }).optional()\n })\n .passthrough();\n\nexport type GrokBuildBilling = z.infer<typeof grokBillingResponseSchema>;\n\nexport interface GrokBuildBillingClient {\n readBilling(): Promise<GrokBuildBilling>;\n}\n\nexport interface GrokBuildConnectorOptions {\n billingClient: GrokBuildBillingClient;\n historyClient?: TranscriptUsageClient;\n clock?: () => Date;\n}\n\nexport class GrokBuildConnector implements Connector {\n readonly id = 'grok';\n readonly displayName = 'Grok';\n readonly consentId = 'grok';\n readonly #billingClient: GrokBuildBillingClient;\n readonly #historyClient?: TranscriptUsageClient;\n readonly #clock: () => Date;\n\n constructor(options: GrokBuildConnectorOptions) {\n this.#billingClient = options.billingClient;\n this.#historyClient = options.historyClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const warnings: ConnectorFailure[] = [];\n let quotaBuckets: QuotaBucket[] = [];\n let observedAt = this.#clock().toISOString();\n try {\n const billing = await this.#billingClient.readBilling();\n observedAt = billing.sourceObservedAt ?? observedAt;\n quotaBuckets = mapBillingQuota(billing);\n if (quotaBuckets.length === 0) {\n warnings.push({\n code: 'grok-subscription-quota-unavailable',\n message: 'Grok Build subscription quota is unavailable.',\n recovery: 'Open Grok Build and run /usage, then retry refresh.'\n });\n }\n } catch (error) {\n warnings.push(safeFailure(error));\n }\n const history = this.#historyClient\n ? await this.#historyClient.readUsage(options)\n : { usage: [], costs: [], complete: true };\n if (!history.complete) warnings.push(incompleteTranscriptFailure());\n\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: grokBuildBillingDomains(history.usage),\n quotaBuckets,\n usage: history.usage,\n ...(history.usage.length > 0 && history.complete\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['grok-transcript:'],\n retiredIdPrefixes: ['grok-otel:', 'grok-headless:']\n }\n }\n : {}),\n costs: history.costs,\n warnings,\n observedAt\n };\n }\n}\n\nfunction incompleteTranscriptFailure(): ConnectorFailure {\n return {\n code: 'local-transcript-scan-incomplete',\n message: 'Some local Grok history could not be read.',\n recovery: 'Agent Usage will retry automatically without removing stored history.'\n };\n}\n\nexport function grokBuildBillingDomain(): { id: string; displayName: string } {\n return {\n id: 'grok-build-subscription',\n displayName: 'Grok Build / SuperGrok shared pool'\n };\n}\n\nexport function isGrokOfficialModel(model: string | null | undefined): boolean {\n if (!model) return false;\n const normalized = model.trim().toLowerCase();\n if (normalized === 'grok') return true;\n if (normalized.startsWith('grok-') || normalized.startsWith('grok/')) {\n return true;\n }\n return false;\n}\n\nexport function resolveGrokBillingDomain(\n model: string | null | undefined,\n customEndpoints?: Map<string, string>\n): string {\n if (!model) return 'grok-build-subscription';\n const normalized = model.trim().toLowerCase();\n if (customEndpoints?.has(normalized)) {\n return customEndpoints.get(normalized)!;\n }\n if (isGrokOfficialModel(model)) {\n return 'grok-build-subscription';\n }\n return 'custom';\n}\n\nexport function grokBuildBillingDomains(usage: UsageObservation[] = []): BillingDomain[] {\n const primary = grokBuildBillingDomain();\n const observed = [...new Set(usage.map((o) => o.billingDomainId))]\n .filter((id) => id !== primary.id)\n .sort();\n return [\n primary,\n ...observed.map((id) => ({\n id,\n displayName: id === 'custom' ? 'Custom endpoints' : id\n }))\n ];\n}\n\nfunction mapBillingQuota(billing: GrokBuildBilling): QuotaBucket[] {\n const config = billing.config;\n if (!config) return [];\n\n const usedPercent = clampPercent(\n config.creditUsagePercent ?? derivePercent(config.used?.val, config.monthlyLimit?.val)\n );\n if (usedPercent === null) return [];\n\n const periodType = config.currentPeriod?.type;\n const period = nativePeriod(periodType, config.currentPeriod ? undefined : 'monthly');\n const resetsAt = config.currentPeriod?.end ?? config.billingPeriodEnd ?? null;\n\n return [\n {\n id: `grok-build:${period.id}`,\n billingDomainId: 'grok-build-subscription',\n label: period.label,\n usedPercent,\n windowDurationMinutes: nativeWindowDurationMinutes(\n config.currentPeriod?.start ?? config.billingPeriodStart,\n resetsAt,\n period.id\n ),\n resetsAt,\n authority: 'official-client',\n scope: 'account-wide',\n status: billing.subscriptionTier ?? null\n }\n ];\n}\n\nfunction nativeWindowDurationMinutes(\n startsAt: string | undefined,\n resetsAt: string | null,\n period: string\n): number | null {\n const start = startsAt ? Date.parse(startsAt) : Number.NaN;\n const end = resetsAt ? Date.parse(resetsAt) : Number.NaN;\n if (Number.isFinite(start) && Number.isFinite(end) && end > start) {\n return Math.round((end - start) / 60_000);\n }\n if (period === 'weekly') return 10_080;\n if (period === 'monthly') return 43_200;\n return null;\n}\n\nfunction nativePeriod(\n type: string | undefined,\n fallback?: 'monthly'\n): {\n id: string;\n label: string;\n} {\n if (type === 'USAGE_PERIOD_TYPE_WEEKLY') return { id: 'weekly', label: 'Weekly limit' };\n if (type === 'USAGE_PERIOD_TYPE_MONTHLY' || fallback === 'monthly') {\n return { id: 'monthly', label: 'Monthly limit' };\n }\n return { id: 'usage', label: 'Usage' };\n}\n\nfunction derivePercent(used: number | undefined, limit: number | undefined): number | null {\n if (used === undefined || limit === undefined || limit <= 0) return null;\n return Math.min(100, Math.max(0, (used / limit) * 100));\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'grok-billing-adapter-failed',\n message: 'Grok Build subscription quota is unavailable.',\n recovery: 'Open Grok Build and run /usage, then update Grok Build before retrying.'\n };\n}\n","import { zstdDecompressSync } from 'node:zlib';\n\n/** Byte range of one structurally complete Zstandard frame. */\ninterface ZstdFrameRange {\n start: number;\n end: number;\n}\n\n/**\n * Result of decoding one concatenated-frame Zstandard artifact.\n */\nexport interface ZstdFramedRead {\n /** Plaintext of every complete frame, in file order. */\n text: string;\n /** How many complete frames decoded. */\n frames: number;\n /** Trailing bytes that are not a complete frame: a mid-append or torn tail. */\n truncatedBytes: number;\n}\n\nconst FRAME_MAGIC = 0xfd2fb528;\nconst SKIPPABLE_MAGIC_LOW = 0x184d2a50;\nconst SKIPPABLE_MAGIC_HIGH = 0x184d2a5f;\nconst FRAME_CONTENT_SIZE_BYTES = [0, 2, 4, 8];\nconst DICTIONARY_ID_BYTES = [0, 1, 2, 4];\nconst BLOCK_HEADER_BYTES = 3;\nconst CHECKSUM_BYTES = 4;\n/**\n * Frames decoded between event-loop yields.\n *\n * Decoding is synchronous per frame, and a long log holds thousands of them, so\n * the loop steps aside often enough that a dashboard request never waits on a\n * background scan.\n */\nconst YIELD_EVERY_FRAMES = 256;\n\n/**\n * Decode a standard concatenation of independent Zstandard frames.\n *\n * dsh session logs are one checksummed frame per append batch, so a single log\n * routinely holds thousands of frames. Node's streaming Zstandard API decodes\n * only the first frame of such a container, so the frames are located\n * structurally — reading frame and block headers without decompressing them —\n * and each complete frame is then decoded on its own, which is also what\n * validates its checksum.\n *\n * A tail that is not a complete frame is reported rather than decoded. The\n * writer appends and fsyncs whole frames, so a reader arriving mid-append — or\n * after a crash — legitimately sees an unfinished final frame, and the\n * documented recovery is to keep the complete frames before it. Decoding it\n * anyway would accept records no checksum ever covered.\n */\nexport async function readZstdFramedText(source: Buffer): Promise<ZstdFramedRead> {\n const scan = scanZstdFrames(source);\n const parts: string[] = [];\n let frames = 0;\n for (const frame of scan.frames) {\n let plaintext: Buffer;\n try {\n plaintext = zstdDecompressSync(source.subarray(frame.start, frame.end));\n } catch {\n // A complete frame that fails its checksum ends the readable prefix: the\n // bytes after it can no longer be trusted to be the records they claim.\n break;\n }\n parts.push(plaintext.toString('utf8'));\n frames += 1;\n if (frames % YIELD_EVERY_FRAMES === 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n }\n const decodedEnd = frames === 0 ? 0 : scan.frames[frames - 1].end;\n return {\n text: parts.join(''),\n frames,\n truncatedBytes: source.byteLength - decodedEnd\n };\n}\n\n/**\n * Locate complete frames without decompressing their blocks.\n * @param source - bytes currently present in the artifact.\n * @returns complete frame ranges in file order; scanning stops at the first\n * byte that is not the start of a complete frame.\n */\nfunction scanZstdFrames(source: Buffer): { frames: ZstdFrameRange[] } {\n const frames: ZstdFrameRange[] = [];\n let offset = 0;\n while (offset < source.byteLength) {\n const end = frameEnd(source, offset);\n if (end === null) break;\n frames.push({ start: offset, end });\n offset = end;\n }\n return { frames };\n}\n\n/**\n * Where the frame starting at `offset` ends.\n * @returns the exclusive end offset, or `null` when the frame is incomplete or\n * not a frame at all.\n */\nfunction frameEnd(source: Buffer, offset: number): number | null {\n if (offset + 4 > source.byteLength) return null;\n const magic = source.readUInt32LE(offset);\n if (magic >= SKIPPABLE_MAGIC_LOW && magic <= SKIPPABLE_MAGIC_HIGH) {\n if (offset + 8 > source.byteLength) return null;\n const end = offset + 8 + source.readUInt32LE(offset + 4);\n return end <= source.byteLength ? end : null;\n }\n if (magic !== FRAME_MAGIC) return null;\n\n let cursor = offset + 4;\n if (cursor >= source.byteLength) return null;\n const descriptor = source[cursor];\n cursor += 1;\n const singleSegment = (descriptor & 0b0010_0000) !== 0;\n const hasChecksum = (descriptor & 0b0000_0100) !== 0;\n const contentSizeCode = descriptor >> 6;\n // A zero content-size code still carries one byte when the frame is a single\n // segment, which is the only place the two fields interact.\n const contentSizeBytes =\n contentSizeCode === 0 ? (singleSegment ? 1 : 0) : FRAME_CONTENT_SIZE_BYTES[contentSizeCode];\n cursor += singleSegment ? 0 : 1;\n cursor += DICTIONARY_ID_BYTES[descriptor & 0b0000_0011];\n cursor += contentSizeBytes;\n\n for (;;) {\n if (cursor + BLOCK_HEADER_BYTES > source.byteLength) return null;\n const header = source.readUIntLE(cursor, BLOCK_HEADER_BYTES);\n cursor += BLOCK_HEADER_BYTES;\n const lastBlock = (header & 0b1) !== 0;\n const blockType = (header >> 1) & 0b11;\n const blockSize = header >> 3;\n if (blockType === 3) return null;\n // An RLE block stores one repeated byte; raw and compressed blocks store\n // their declared size.\n cursor += blockType === 1 ? 1 : blockSize;\n if (cursor > source.byteLength) return null;\n if (lastBlock) break;\n }\n const end = cursor + (hasChecksum ? CHECKSUM_BYTES : 0);\n return end <= source.byteLength ? end : null;\n}\n","import { createHash } from 'node:crypto';\nimport { createReadStream } from 'node:fs';\nimport { mkdir, opendir, readFile, rename, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { createInterface } from 'node:readline';\n\nimport type { CollectionRequest, CostRecord, UsageObservation } from '../core/types.js';\nimport { normalizeTokenObservation } from '../core/token-normalization.js';\nimport { resolveGrokBillingDomain } from '../connectors/grok-build/grok-build-connector.js';\nimport { readZstdFramedText } from './zstd-frames.js';\n\nexport type LocalTranscriptProvider = 'claude-code' | 'codex' | 'grok' | 'dsh';\n\nexport interface LocalTranscriptUsageResult {\n usage: UsageObservation[];\n costs: CostRecord[];\n complete: boolean;\n /** A transcript declared an on-disk format version this reader does not know. */\n unsupportedFormat?: boolean;\n}\n\nexport interface TranscriptUsageClient {\n readUsage(options?: CollectionRequest): Promise<LocalTranscriptUsageResult>;\n}\n\nexport interface LocalTranscriptUsageClientOptions {\n provider: LocalTranscriptProvider;\n roots: string[];\n clock?: () => Date;\n lookbackDays?: number;\n cachePath?: string;\n}\n\ninterface ParsedTranscriptRecord {\n dedupeKey: string;\n observation: UsageObservation;\n reportedCostUsd: number | null;\n}\n\ninterface TranscriptFile {\n path: string;\n size: number;\n mtimeMs: number;\n}\n\ninterface CachedTranscriptFile extends TranscriptFile {\n records: ParsedTranscriptRecord[];\n recordsDigest: string;\n}\n\ninterface CodexScanState {\n model: string;\n sessionId: string;\n lastUsageSignature: string | null;\n sawSessionMeta: boolean;\n suppressingForkCopies: boolean;\n forkCopyAnchorMs: number;\n}\n\ninterface DshScanState {\n sessionId: string;\n route: string;\n model: string;\n unsupportedVersion: boolean;\n}\n\n/**\n * Billing domain for dsh usage whose route the log does not name.\n *\n * dsh billing domains are its own provider route keys, so the domain a request\n * belongs to is read from the log rather than assumed. This constant only names\n * the deployment default, which is also the domain the Provider summarizes.\n */\nexport const DSH_PRIMARY_BILLING_DOMAIN_ID = 'deepseek-official';\n/** On-disk session-format version this reader understands. */\nconst DSH_SESSION_FORMAT_VERSION = 0;\n/** Compressed dsh session artifact suffix; `compression: 'none'` keeps plain `.jsonl`. */\nconst DSH_COMPRESSED_SUFFIX = '.jsonl.zstd';\n/** Lines worth parsing in a dsh log: the header, a route change, or reported usage. */\nconst DSH_LINE_HINTS = ['\"usage\"', '\"request/context\"', '\"type\":\"session\"'];\n\nexport function loadGrokConfigCustomModels(configContent: string): Map<string, string> {\n const customModels = new Map<string, string>();\n const modelSections = [\n ...configContent.matchAll(/\\[model\\.(?:\"([^\"]+)\"|([a-zA-Z0-9_-]+))\\]([\\s\\S]*?)(?=\\n\\[|$)/g)\n ];\n for (const m of modelSections) {\n const key = m[1] || m[2];\n const body = m[3];\n const modelMatch = body.match(/model\\s*=\\s*\"([^\"]+)\"/);\n const baseUrlMatch = body.match(/base_url\\s*=\\s*\"([^\"]+)\"/);\n const providerMatch = body.match(/model_provider\\s*=\\s*\"([^\"]+)\"/);\n if (baseUrlMatch || providerMatch) {\n const domain = providerMatch ? providerMatch[1].trim() : 'custom';\n if (key) {\n customModels.set(key.trim().toLowerCase(), domain);\n const stripped = key\n .trim()\n .toLowerCase()\n .replace(/-(high|medium|low)$/, '');\n if (stripped) customModels.set(stripped, domain);\n }\n if (modelMatch) {\n const mName = modelMatch[1].trim().toLowerCase();\n customModels.set(mName, domain);\n const stripped = mName.replace(/-(high|medium|low)$/, '');\n if (stripped) customModels.set(stripped, domain);\n }\n }\n }\n return customModels;\n}\n\nexport class LocalTranscriptUsageClient implements TranscriptUsageClient {\n readonly #provider: LocalTranscriptProvider;\n readonly #roots: string[];\n readonly #clock: () => Date;\n readonly #lookbackDays: number;\n readonly #cachePath?: string;\n readonly #fileCache = new Map<string, CachedTranscriptFile>();\n #cacheLoaded = false;\n readonly #grokCustomModels = new Map<string, string>();\n #grokCustomModelsLoaded = false;\n\n constructor(options: LocalTranscriptUsageClientOptions) {\n this.#provider = options.provider;\n this.#roots = options.roots;\n this.#clock = options.clock ?? (() => new Date());\n this.#lookbackDays = options.lookbackDays ?? 90;\n this.#cachePath = options.cachePath;\n }\n\n async readUsage(\n options: CollectionRequest = { mode: 'incremental' }\n ): Promise<LocalTranscriptUsageResult> {\n if (this.#provider === 'grok' && !this.#grokCustomModelsLoaded) {\n this.#grokCustomModelsLoaded = true;\n for (const root of this.#roots) {\n try {\n const configPath = join(dirname(root), 'config.toml');\n const content = await readFile(configPath, 'utf8');\n for (const [k, v] of loadGrokConfigCustomModels(content)) {\n this.#grokCustomModels.set(k, v);\n }\n } catch {\n // config.toml is optional\n }\n }\n }\n await this.#loadCache();\n if (options.mode === 'hard-rebuild') this.#fileCache.clear();\n const cutoff = this.#clock().getTime() - this.#lookbackDays * 24 * 60 * 60 * 1000;\n const discovered = await listTranscriptFiles(this.#roots, cutoff);\n const files = discovered.files;\n let complete = discovered.complete;\n const usage: UsageObservation[] = [];\n const costs: CostRecord[] = [];\n let unsupportedFormat = false;\n const seen = new Set<string>();\n const livePaths = new Set(files.map((file) => stableId(file.path)));\n for (const path of this.#fileCache.keys()) {\n if (!livePaths.has(path)) this.#fileCache.delete(path);\n }\n\n for (const file of files) {\n const parsedFile = await this.#readFile(file);\n complete &&= parsedFile.complete;\n unsupportedFormat ||= parsedFile.unsupportedFormat;\n const parsedRecords = parsedFile.records;\n for (const parsed of parsedRecords) {\n if (new Date(parsed.observation.observedAt).getTime() < cutoff) continue;\n if (seen.has(parsed.dedupeKey)) continue;\n seen.add(parsed.dedupeKey);\n usage.push(parsed.observation);\n if (parsed.reportedCostUsd !== null) {\n costs.push({\n id: `${this.#provider}-transcript-cost:${stableId(parsed.dedupeKey)}`,\n sourceId: parsed.observation.id,\n billingDomainId: parsed.observation.billingDomainId,\n observedAt: parsed.observation.observedAt,\n kind: 'reported-estimate',\n amount: parsed.reportedCostUsd,\n currency: 'USD',\n authority: 'local-observation',\n model: parsed.observation.model,\n usageObservationId: parsed.observation.id\n });\n }\n }\n }\n\n await this.#persistCache();\n\n return { usage, costs, complete, unsupportedFormat };\n }\n\n async #readFile(\n file: TranscriptFile\n ): Promise<{ records: ParsedTranscriptRecord[]; complete: boolean; unsupportedFormat: boolean }> {\n const cacheKey = stableId(file.path);\n const cached = this.#fileCache.get(cacheKey);\n if (cached && cached.size === file.size && cached.mtimeMs === file.mtimeMs) {\n if (this.#provider === 'grok') {\n const remapped = cached.records.map((r) => {\n const expectedDomain = resolveGrokBillingDomain(\n r.observation.model,\n this.#grokCustomModels\n );\n if (r.observation.billingDomainId !== expectedDomain) {\n return {\n ...r,\n observation: { ...r.observation, billingDomainId: expectedDomain }\n };\n }\n return r;\n });\n return { records: remapped, complete: true, unsupportedFormat: false };\n }\n return { records: cached.records, complete: true, unsupportedFormat: false };\n }\n const records: ParsedTranscriptRecord[] = [];\n const codexState: CodexScanState = {\n model: '',\n sessionId: '',\n lastUsageSignature: null,\n sawSessionMeta: false,\n suppressingForkCopies: false,\n forkCopyAnchorMs: 0\n };\n const dshState: DshScanState = {\n sessionId: '',\n route: '',\n model: '',\n unsupportedVersion: false\n };\n try {\n for await (const line of readTranscriptLines(file.path)) {\n records.push(...this.#parseLine(line, codexState, dshState));\n // An unknown format version is never partially trusted, and the file\n // stays uncached so the reported gap does not vanish on the next scan.\n if (dshState.unsupportedVersion) {\n return { records: [], complete: false, unsupportedFormat: true };\n }\n }\n } catch {\n return { records: cached?.records ?? [], complete: false, unsupportedFormat: false };\n }\n this.#fileCache.set(cacheKey, {\n ...file,\n path: cacheKey,\n records,\n recordsDigest: stableId(JSON.stringify(records))\n });\n return { records, complete: true, unsupportedFormat: false };\n }\n\n #parseLine(\n line: string,\n codexState: CodexScanState,\n dshState: DshScanState\n ): ParsedTranscriptRecord[] {\n if (this.#provider === 'claude-code') {\n return line.includes('\"usage\"') ? compact(parseClaudeTranscriptLine(line)) : [];\n }\n if (this.#provider === 'codex') return compact(parseCodexTranscriptLine(line, codexState));\n if (this.#provider === 'dsh') {\n return DSH_LINE_HINTS.some((hint) => line.includes(hint))\n ? parseDshTranscriptLine(line, dshState)\n : [];\n }\n return line.includes('\"turn_completed\"')\n ? parseGrokTranscriptLine(line, this.#grokCustomModels)\n : [];\n }\n\n async #loadCache(): Promise<void> {\n if (this.#cacheLoaded) return;\n this.#cacheLoaded = true;\n if (!this.#cachePath) return;\n try {\n const stored = JSON.parse(await readFile(this.#cachePath, 'utf8')) as {\n version?: number;\n files?: unknown[];\n };\n if (stored.version !== 1 || !Array.isArray(stored.files)) return;\n for (const file of stored.files) {\n if (!isCachedTranscriptFile(file)) continue;\n if (file.recordsDigest !== stableId(JSON.stringify(file.records))) continue;\n this.#fileCache.set(file.path, file);\n }\n } catch {\n // A missing or corrupt optimization cache is rebuilt from source transcripts.\n }\n }\n\n async #persistCache(): Promise<void> {\n if (!this.#cachePath) return;\n try {\n await mkdir(dirname(this.#cachePath), { recursive: true, mode: 0o700 });\n const temporary = `${this.#cachePath}.${process.pid}.tmp`;\n await writeFile(\n temporary,\n JSON.stringify({ version: 1, files: [...this.#fileCache.values()] }),\n { mode: 0o600 }\n );\n await rename(temporary, this.#cachePath);\n } catch {\n // Cache persistence never makes transcript collection fail.\n }\n }\n}\n\nfunction isCachedTranscriptFile(value: unknown): value is CachedTranscriptFile {\n const record = asObject(value);\n if (!record || !Array.isArray(record.records)) return false;\n return (\n typeof record.path === 'string' &&\n /^[0-9a-f]{24}$/.test(record.path) &&\n finiteNonNegative(record.size) !== null &&\n finiteNonNegative(record.mtimeMs) !== null &&\n typeof record.recordsDigest === 'string' &&\n /^[0-9a-f]{24}$/.test(record.recordsDigest) &&\n record.records.every(isParsedTranscriptRecord)\n );\n}\n\nfunction isParsedTranscriptRecord(value: unknown): value is ParsedTranscriptRecord {\n const record = asObject(value);\n const observation = asObject(record?.observation);\n if (!record || !observation) return false;\n const authority = observation.authority;\n const requiredTokenFields = [\n 'inputTokens',\n 'outputTokens',\n 'cacheReadTokens',\n 'cacheWriteTokens'\n ];\n const optionalTokenFields = [\n 'reasoningTokens',\n 'sourceReportedTotalTokens',\n 'reconciledRemainderTokens'\n ];\n const cacheWriteTokenBreakdown = asObject(observation.cacheWriteTokenBreakdown);\n const tokenSemantics = asObject(observation.tokenSemantics);\n const structurallyValid =\n typeof record.dedupeKey === 'string' &&\n (record.reportedCostUsd === null || finiteNonNegative(record.reportedCostUsd) !== null) &&\n typeof observation.id === 'string' &&\n typeof observation.billingDomainId === 'string' &&\n (observation.model === null || typeof observation.model === 'string') &&\n (observation.sessionId === undefined ||\n observation.sessionId === null ||\n typeof observation.sessionId === 'string') &&\n typeof observation.observedAt === 'string' &&\n Number.isFinite(Date.parse(observation.observedAt)) &&\n requiredTokenFields.every((field) => nonNegativeSafeInteger(observation[field])) &&\n optionalTokenFields.every(\n (field) =>\n observation[field] === undefined ||\n observation[field] === null ||\n nonNegativeSafeInteger(observation[field])\n ) &&\n (observation.cacheWriteTokenBreakdown === undefined ||\n observation.cacheWriteTokenBreakdown === null ||\n (cacheWriteTokenBreakdown !== null &&\n nonNegativeSafeInteger(cacheWriteTokenBreakdown.fiveMinute) &&\n nonNegativeSafeInteger(cacheWriteTokenBreakdown.oneHour))) &&\n (observation.tokenSemantics === undefined ||\n (tokenSemantics !== null &&\n ['included-in-output', 'separate'].includes(String(tokenSemantics.reasoning)) &&\n ['included-in-input', 'separate'].includes(String(tokenSemantics.cacheRead)) &&\n ['included-in-input', 'separate'].includes(String(tokenSemantics.cacheWrite)))) &&\n (observation.modelAttribution === undefined ||\n ['known', 'unclassified'].includes(String(observation.modelAttribution))) &&\n (observation.timePrecision === undefined ||\n ['event', 'hour', 'day', 'billing-period', 'unknown'].includes(\n String(observation.timePrecision)\n )) &&\n (observation.usageScope === undefined ||\n ['account-wide', 'this-mac', 'unknown'].includes(String(observation.usageScope))) &&\n (observation.aggregationTemporality === undefined ||\n ['delta', 'cumulative', 'unknown'].includes(String(observation.aggregationTemporality))) &&\n ['official-account', 'official-client', 'local-observation', 'estimate'].includes(\n String(authority)\n );\n if (!structurallyValid) return false;\n try {\n normalizeTokenObservation(observation as unknown as UsageObservation);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction nonNegativeSafeInteger(value: unknown): boolean {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction parseGrokTranscriptLine(\n line: string,\n grokCustomModels?: Map<string, string>\n): ParsedTranscriptRecord[] {\n const record = parseObject(line);\n const params = asObject(record?.params);\n const update = asObject(params?.update);\n const usage = asObject(update?.usage);\n if (!record || !params || !update || !usage || update.sessionUpdate !== 'turn_completed') {\n return [];\n }\n\n const meta = asObject(params._meta);\n const agentTimestamp = finiteNonNegative(meta?.agentTimestampMs);\n const outerTimestamp = finiteNonNegative(record.timestamp);\n const timestampMs =\n agentTimestamp ??\n (outerTimestamp === null\n ? null\n : outerTimestamp > 1_000_000_000_000\n ? outerTimestamp\n : outerTimestamp * 1000);\n if (timestampMs === null || !Number.isFinite(timestampMs)) return [];\n\n const modelUsage = asObject(usage.modelUsage);\n const sessionId = string(params.sessionId) ?? '';\n const promptId = string(update.prompt_id);\n const observedAt = new Date(timestampMs).toISOString();\n const models = modelUsage\n ? Object.entries(modelUsage)\n .map(([model, value]) => ({ model, totals: readGrokTotals(value) }))\n .filter(\n (entry): entry is { model: string; totals: GrokTotals } =>\n entry.model.length > 0 && entry.totals !== null && grokRecordedTokens(entry.totals) > 0\n )\n : [];\n const topLevel = readGrokTotals(usage);\n if (models.length === 0 && topLevel && grokRecordedTokens(topLevel) > 0) {\n models.push({ model: 'grok', totals: topLevel });\n }\n if (models.length === 0) return [];\n\n const topLevelCost = grokCostUsd(topLevel?.costUsdTicks ?? null);\n const explicitCost = models.reduce(\n (total, entry) => total + (grokCostUsd(entry.totals.costUsdTicks) ?? 0),\n 0\n );\n const untickedTokens = models.reduce(\n (total, entry) =>\n total + (entry.totals.costUsdTicks === null ? grokRecordedTokens(entry.totals) : 0),\n 0\n );\n const remainingCost = topLevelCost === null ? null : Math.max(0, topLevelCost - explicitCost);\n\n return models.map(({ model, totals }) => {\n const cacheReadTokens = totals.cachedReadTokens;\n const cacheWriteTokens = totals.cacheCreationTokens;\n const inputTokens = Math.max(0, totals.inputTokens - cacheReadTokens - cacheWriteTokens);\n const outputTokens = totals.outputTokens;\n const reasoningTokens = Math.min(outputTokens, totals.reasoningTokens);\n const dedupeKey = `${sessionId}:${promptId ?? stableId(line)}:${model}`;\n const directCost = grokCostUsd(totals.costUsdTicks);\n const reportedCostUsd =\n directCost ??\n (remainingCost !== null && untickedTokens > 0\n ? remainingCost * (grokRecordedTokens(totals) / untickedTokens)\n : null);\n const billingDomainId = resolveGrokBillingDomain(model, grokCustomModels);\n return {\n dedupeKey,\n observation: {\n id: `grok-transcript:${stableId(dedupeKey)}`,\n billingDomainId,\n model,\n sessionId,\n observedAt,\n inputTokens,\n outputTokens,\n reasoningTokens,\n cacheReadTokens,\n cacheWriteTokens,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: model === 'grok' ? 'unclassified' : 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n },\n reportedCostUsd\n };\n });\n}\n\ninterface GrokTotals {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cacheCreationTokens: number;\n reasoningTokens: number;\n costUsdTicks: number | null;\n}\n\nfunction readGrokTotals(value: unknown): GrokTotals | null {\n const record = asObject(value);\n if (!record) return null;\n return {\n inputTokens: positiveInteger(record.inputTokens),\n outputTokens: positiveInteger(record.outputTokens),\n cachedReadTokens: positiveInteger(record.cachedReadTokens),\n cacheCreationTokens: positiveInteger(record.cacheCreationTokens),\n reasoningTokens: positiveInteger(record.reasoningTokens),\n costUsdTicks: finiteNonNegative(record.costUsdTicks)\n };\n}\n\nfunction grokRecordedTokens(totals: GrokTotals): number {\n return totals.inputTokens + totals.outputTokens;\n}\n\nfunction grokCostUsd(ticks: number | null): number | null {\n return ticks === null ? null : ticks / 10_000_000_000;\n}\n\nfunction parseCodexTranscriptLine(\n line: string,\n state: CodexScanState\n): ParsedTranscriptRecord | null {\n if (\n !line.includes('\"token_count\"') &&\n !line.includes('\"turn_context\"') &&\n !line.includes('\"session_meta\"')\n ) {\n return null;\n }\n const record = parseObject(line);\n const payload = asObject(record?.payload);\n if (!record || !payload) return null;\n\n if (record.type === 'session_meta') {\n if (!state.sawSessionMeta) {\n state.sawSessionMeta = true;\n state.sessionId = string(payload.id) ?? string(payload.session_id) ?? '';\n const metaTimestamp = string(record.timestamp);\n if (metaTimestamp && isForkedCodexSession(payload)) {\n state.suppressingForkCopies = true;\n state.forkCopyAnchorMs = Date.parse(metaTimestamp);\n }\n }\n return null;\n }\n if (record.type === 'turn_context') {\n state.model = string(payload.model) ?? state.model;\n return null;\n }\n if (payload.type !== 'token_count' || !state.model) return null;\n\n const info = asObject(payload.info);\n const last = asObject(info?.last_token_usage);\n const timestamp = string(record.timestamp);\n if (!last || !timestamp || !Number.isFinite(Date.parse(timestamp))) return null;\n const signature = JSON.stringify(last);\n if (signature === state.lastUsageSignature) return null;\n state.lastUsageSignature = signature;\n const timestampMs = Date.parse(timestamp);\n if (state.suppressingForkCopies) {\n if (timestampMs - state.forkCopyAnchorMs < 1000) {\n state.forkCopyAnchorMs = timestampMs;\n return null;\n }\n state.suppressingForkCopies = false;\n }\n\n const inclusiveInput = positiveInteger(last.input_tokens);\n const cacheReadTokens = positiveInteger(last.cached_input_tokens);\n const cacheWriteTokens = positiveInteger(last.cache_write_input_tokens);\n const outputTokens = positiveInteger(last.output_tokens);\n const reasoningTokens = Math.min(outputTokens, positiveInteger(last.reasoning_output_tokens));\n const inputTokens = Math.max(0, inclusiveInput - cacheReadTokens - cacheWriteTokens);\n const categorizedTokens = inputTokens + outputTokens + cacheReadTokens + cacheWriteTokens;\n if (categorizedTokens === 0) return null;\n const reportedTotal = optionalNonNegativeInteger(last.total_tokens);\n if (reportedTotal !== null && reportedTotal < categorizedTokens) {\n throw new Error('Codex source-reported total is smaller than categorized Tokens.');\n }\n const sourceReportedTotalTokens = reportedTotal;\n\n const observedAt = new Date(timestamp).toISOString();\n const dedupeKey = `${state.sessionId}:${observedAt}:${state.model}:${signature}`;\n return {\n dedupeKey,\n observation: {\n id: `codex-transcript:${stableId(dedupeKey)}`,\n billingDomainId: 'subscription',\n model: state.model,\n sessionId: state.sessionId,\n observedAt,\n inputTokens,\n outputTokens,\n reasoningTokens,\n cacheReadTokens,\n cacheWriteTokens,\n sourceReportedTotalTokens,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n },\n reportedCostUsd: null\n };\n}\n\nfunction isForkedCodexSession(payload: Record<string, unknown>): boolean {\n if (string(payload.forked_from_id)) return true;\n const source = asObject(payload.source);\n const subagent = asObject(source?.subagent);\n const spawn = asObject(subagent?.thread_spawn);\n return string(spawn?.parent_thread_id) !== null;\n}\n\nasync function listTranscriptFiles(\n roots: string[],\n cutoff: number\n): Promise<{ files: TranscriptFile[]; complete: boolean }> {\n const files: TranscriptFile[] = [];\n const visited = new Set<string>();\n let complete = true;\n const walk = async (directory: string, isRoot = false): Promise<void> => {\n let entries;\n try {\n entries = await opendir(directory);\n } catch (error) {\n if (!(isRoot && isMissingPath(error))) complete = false;\n return;\n }\n for await (const entry of entries) {\n const path = join(directory, entry.name);\n if (entry.isDirectory()) {\n await walk(path);\n } else if (\n entry.isFile() &&\n (entry.name.endsWith('.jsonl') || entry.name.endsWith(DSH_COMPRESSED_SUFFIX))\n ) {\n if (visited.has(path)) continue;\n visited.add(path);\n try {\n const metadata = await stat(path);\n if (metadata.mtimeMs >= cutoff) {\n files.push({ path, size: metadata.size, mtimeMs: metadata.mtimeMs });\n }\n } catch {\n // A rotating transcript may disappear between listing and stat.\n complete = false;\n }\n }\n }\n };\n // Overlapping roots stay harmless: a transcript is read once, whichever root reaches it.\n for (const root of roots) await walk(root, true);\n return { files, complete };\n}\n\nfunction isMissingPath(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'ENOENT';\n}\n\n/**\n * Yield the logical lines of one transcript, whichever encoding it uses.\n *\n * A dsh session log is a concatenation of independent Zstandard frames rather\n * than newline-delimited text, so it is decoded frame by frame and split here.\n * The trailing segment is dropped because it is either the empty string after a\n * final newline or a line the writer has not finished appending; either way it\n * is not yet a record. A compressed artifact that yields no frame at all is\n * treated as unreadable so the caller reports a gap instead of silently\n * reporting an empty history.\n * @param path - transcript path.\n */\nasync function* readTranscriptLines(path: string): AsyncGenerator<string> {\n if (!path.endsWith(DSH_COMPRESSED_SUFFIX)) {\n yield* createInterface({\n input: createReadStream(path, { encoding: 'utf8' }),\n crlfDelay: Infinity\n });\n return;\n }\n const source = await readFile(path);\n if (source.byteLength === 0) return;\n const decoded = await readZstdFramedText(source);\n if (decoded.frames === 0) throw new Error('No complete Zstandard frame in session log.');\n const lines = decoded.text.split('\\n');\n lines.pop();\n yield* lines;\n}\n\nfunction parseClaudeTranscriptLine(line: string): ParsedTranscriptRecord | null {\n const record = parseObject(line);\n if (!record || record.type !== 'assistant') return null;\n const message = asObject(record.message);\n const usage = asObject(message?.usage);\n const timestamp = string(record.timestamp);\n const model = string(message?.model);\n if (!message || !usage || !timestamp || !model || !Number.isFinite(Date.parse(timestamp))) {\n return null;\n }\n\n const messageId = string(message.id);\n const requestId = string(record.requestId);\n const sessionId = string(record.sessionId) ?? '';\n const dedupeKey =\n messageId || requestId\n ? `${messageId ?? ''}:${requestId ?? ''}`\n : `${sessionId}:${timestamp}:${model}:${stableId(line)}`;\n const observationId = `claude-transcript:${stableId(dedupeKey)}`;\n const cacheWriteTokens = positiveInteger(usage.cache_creation_input_tokens);\n const cacheCreation = asObject(usage.cache_creation);\n const cacheWriteFiveMinute = positiveInteger(cacheCreation?.ephemeral_5m_input_tokens);\n const cacheWriteOneHour = positiveInteger(cacheCreation?.ephemeral_1h_input_tokens);\n const hasExactCacheWriteBreakdown =\n cacheCreation !== null && cacheWriteFiveMinute + cacheWriteOneHour === cacheWriteTokens;\n\n return {\n dedupeKey,\n observation: {\n id: observationId,\n billingDomainId: 'subscription',\n model,\n sessionId,\n observedAt: new Date(timestamp).toISOString(),\n inputTokens: positiveInteger(usage.input_tokens),\n outputTokens: positiveInteger(usage.output_tokens),\n reasoningTokens: 0,\n cacheReadTokens: positiveInteger(usage.cache_read_input_tokens),\n cacheWriteTokens,\n cacheWriteTokenBreakdown: hasExactCacheWriteBreakdown\n ? { fiveMinute: cacheWriteFiveMinute, oneHour: cacheWriteOneHour }\n : null,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n },\n reportedCostUsd: finiteNonNegative(record.costUSD)\n };\n}\n\n/**\n * Read one line of a dsh session log.\n *\n * The log is an append-only event stream whose first line is the immutable\n * session header. Provider-reported accounting arrives on `assistant/message`\n * events, whose four token buckets are disjoint with reasoning already inside\n * the output count. Each message carries the route that answered it, so a\n * session that switches routes attributes every request to the billing domain\n * that actually served it; `request/context` supplies the same pair and is kept\n * as the fallback for a message that omits its source.\n * @param line - one decoded logical line.\n * @param state - header and route facts carried across the file's lines.\n */\nfunction parseDshTranscriptLine(line: string, state: DshScanState): ParsedTranscriptRecord[] {\n const record = parseObject(line);\n if (!record) return [];\n if (record.type === 'session') {\n state.sessionId = string(record.id) ?? '';\n state.unsupportedVersion = record.version !== DSH_SESSION_FORMAT_VERSION;\n return [];\n }\n const data = asObject(record.data);\n if (!data) return [];\n if (record.type === 'request/context') {\n state.route = string(data.provider) ?? state.route;\n state.model = string(data.model) ?? state.model;\n return [];\n }\n if (record.type !== 'assistant/message') return [];\n const usage = asObject(data.usage);\n const observedAtMs = finiteNonNegative(record.time);\n if (!usage || observedAtMs === null) return [];\n\n const message = asObject(data.message);\n const source = asObject(message?.source);\n const model = string(source?.model) ?? string(state.model);\n const route = string(source?.provider) ?? string(state.route) ?? DSH_PRIMARY_BILLING_DOMAIN_ID;\n const sequence = finiteNonNegative(record.seq);\n const messageIdentity =\n string(message?.id) ?? (sequence === null ? stableId(line) : `${sequence}`);\n const dedupeKey = `dsh:${state.sessionId}:${messageIdentity}`;\n\n return [\n {\n dedupeKey,\n observation: {\n id: `dsh-transcript:${stableId(dedupeKey)}`,\n billingDomainId: route,\n model,\n sessionId: state.sessionId,\n observedAt: new Date(observedAtMs).toISOString(),\n inputTokens: positiveInteger(usage.inputTokens),\n outputTokens: positiveInteger(usage.outputTokens),\n reasoningTokens: positiveInteger(usage.reasoningTokens),\n cacheReadTokens: positiveInteger(usage.cacheReadTokens),\n cacheWriteTokens: positiveInteger(usage.cacheWriteTokens),\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: model ? 'known' : 'unclassified',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n },\n // dsh records provider accounting without money; cost comes from the\n // versioned API retail equivalent instead of a client-reported estimate.\n reportedCostUsd: null\n }\n ];\n}\n\nfunction parseObject(value: string): Record<string, unknown> | null {\n try {\n return asObject(JSON.parse(value));\n } catch {\n return null;\n }\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : null;\n}\n\nfunction string(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction positiveInteger(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? Math.trunc(value) : 0;\n}\n\nfunction optionalNonNegativeInteger(value: unknown): number | null {\n if (value === undefined || value === null) return null;\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw new Error('Source-reported Token total is invalid.');\n }\n return value;\n}\n\nfunction finiteNonNegative(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : null;\n}\n\nfunction compact<T>(value: T | null): T[] {\n return value === null ? [] : [value];\n}\n\nfunction stableId(value: string): string {\n return createHash('sha256').update(value).digest('hex').slice(0, 24);\n}\n","import type {\n BillingDomain,\n CollectionRequest,\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n UsageObservation\n} from '../../core/types.js';\nimport {\n DSH_PRIMARY_BILLING_DOMAIN_ID,\n type TranscriptUsageClient\n} from '../../server/local-transcript-usage-client.js';\n\nexport interface DshConnectorOptions {\n historyClient: TranscriptUsageClient;\n clock?: () => Date;\n}\n\n/**\n * dsh (DeepSeek Harness) usage read from its local session logs.\n *\n * dsh answers through pay-as-you-go provider routes rather than a subscription,\n * so it publishes no quota window: the Provider contributes token evidence and\n * history, and money arrives only as the versioned API retail equivalent. A\n * TUI layer composed on dsh — codsh, for example — keeps its conversations in\n * the same logs and is counted here rather than as a Provider of its own.\n */\nexport class DshConnector implements Connector {\n readonly id = 'dsh';\n readonly displayName = 'dsh';\n readonly consentId = 'dsh';\n readonly #historyClient: TranscriptUsageClient;\n readonly #clock: () => Date;\n\n constructor(options: DshConnectorOptions) {\n this.#historyClient = options.historyClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n const warnings: ConnectorFailure[] = [];\n let history: Awaited<ReturnType<TranscriptUsageClient['readUsage']>> | null = null;\n try {\n history = await this.#historyClient.readUsage(options);\n } catch (error) {\n // The failure is already named; adding a second warning about the gap it\n // caused would report one problem twice.\n warnings.push(safeFailure(error));\n }\n if (history?.unsupportedFormat) warnings.push(unsupportedFormatFailure());\n else if (history && !history.complete) warnings.push(incompleteSessionLogFailure());\n const usage = history?.usage ?? [];\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: billingDomains(usage),\n quotaBuckets: [],\n usage,\n ...(usage.length > 0 && history?.complete\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['dsh-transcript:'],\n retiredIdPrefixes: []\n }\n }\n : {}),\n costs: history?.costs ?? [],\n warnings,\n observedAt\n };\n }\n}\n\n/**\n * The billing domains this snapshot describes.\n *\n * A dsh billing domain is one of its provider route keys. The deployment\n * default is always present so the Provider keeps a domain to summarize even\n * before any request is observed, and it stays first because the Provider\n * headline follows the first declared domain. Any other route that actually\n * answered is added under its own key rather than folded into DeepSeek's.\n * @param usage - observations this collection produced.\n */\nfunction billingDomains(usage: UsageObservation[]): BillingDomain[] {\n const primary = { id: DSH_PRIMARY_BILLING_DOMAIN_ID, displayName: 'DeepSeek API' };\n const observedRoutes = [...new Set(usage.map((observation) => observation.billingDomainId))]\n .filter((id) => id !== primary.id)\n .sort();\n // An unknown route names itself: inventing a product name for it would state\n // more than the log does.\n return [primary, ...observedRoutes.map((id) => ({ id, displayName: id }))];\n}\n\nfunction incompleteSessionLogFailure(): ConnectorFailure {\n return {\n code: 'dsh-session-log-scan-incomplete',\n message: 'Some local dsh session history could not be read.',\n recovery: 'Agent Usage will retry automatically without removing stored history.'\n };\n}\n\nfunction unsupportedFormatFailure(): ConnectorFailure {\n return {\n code: 'dsh-session-format-unsupported',\n message: 'A dsh session log declares an on-disk format this version does not read.',\n recovery: 'Update Agent Usage; stored dsh history from earlier scans is retained.'\n };\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'dsh-session-log-read-failed',\n message: 'Local dsh session history is unavailable.',\n recovery: 'Run agent-usage doctor, then retry refresh.'\n };\n}\n","import { readdirSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { QuotaBucket } from '../core/types.js';\nimport { ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID } from '../connectors/antigravity/antigravity-connector.js';\n\nexport interface AntigravityQuotaClientOptions {\n logRoots?: string[];\n ports?: number[];\n fetchFn?: typeof fetch;\n timeoutMs?: number;\n}\n\ninterface RawQuotaBucket {\n bucketId?: string;\n displayName?: string;\n description?: string;\n window?: string;\n remainingFraction?: number;\n remainingAmount?: number;\n resetTime?: string;\n}\n\ninterface RawQuotaGroup {\n displayName?: string;\n description?: string;\n buckets?: RawQuotaBucket[];\n}\n\ninterface RawQuotaResponse {\n response?: {\n groups?: RawQuotaGroup[];\n description?: string;\n };\n}\n\nexport class AntigravityQuotaClient {\n readonly #logRoots: string[];\n readonly #ports?: number[];\n readonly #fetchFn: typeof fetch;\n readonly #timeoutMs: number;\n\n constructor(options: AntigravityQuotaClientOptions = {}) {\n this.#logRoots = options.logRoots ?? [\n join(homedir(), 'Library/Logs/Antigravity'),\n join(homedir(), '.gemini/antigravity-cli/log'),\n join(homedir(), '.gemini/antigravity/log')\n ];\n this.#ports = options.ports;\n this.#fetchFn = options.fetchFn ?? globalThis.fetch;\n this.#timeoutMs = options.timeoutMs ?? 1500;\n }\n\n async readQuota(): Promise<QuotaBucket[] | null> {\n const { ports, csrfToken } = this.discoverCandidates();\n const candidatePorts = this.#ports ?? ports;\n if (candidatePorts.length === 0) {\n return null;\n }\n\n for (const port of candidatePorts) {\n const quota = await this.queryPort(port, csrfToken);\n if (quota) {\n return quota;\n }\n }\n\n return null;\n }\n\n discoverCandidates(): { ports: number[]; csrfToken: string | null } {\n let csrfToken = process.env.ANTIGRAVITY_CSRF_TOKEN ?? null;\n const ports: number[] = [];\n const httpPortRegex =\n /(?:Language server listening on random port at|Reloading all windows with URL: https?:\\/\\/127\\.0\\.0\\.1:|Local:\\s+https?:\\/\\/127\\.0\\.0\\.1:|Host bridge server listening on http:\\/\\/127\\.0\\.0\\.1:)\\s*(\\d+)/g;\n const csrfRegex = /--csrf_token[= ]([a-f0-9-]+)/;\n\n for (const root of this.#logRoots) {\n try {\n const files = readdirSync(root)\n .filter((file) => file.endsWith('.log'))\n .sort()\n .reverse()\n .slice(0, 10);\n\n for (const file of files) {\n const filePath = join(root, file);\n try {\n const content = readFileSync(filePath, 'utf8');\n if (!csrfToken) {\n const csrfMatch = csrfRegex.exec(content);\n if (csrfMatch) csrfToken = csrfMatch[1];\n }\n let match: RegExpExecArray | null;\n while ((match = httpPortRegex.exec(content)) !== null) {\n const basePort = Number(match[1]);\n ports.push(basePort);\n ports.push(basePort + 1);\n ports.push(basePort + 2);\n }\n } catch {\n // Ignore unreadable individual log file\n }\n }\n } catch {\n // Ignore unreadable log root directory\n }\n }\n\n // Return unique ports, newest first\n return {\n ports: [...new Set(ports.reverse())],\n csrfToken\n };\n }\n\n discoverCandidatePorts(): number[] {\n return this.discoverCandidates().ports;\n }\n\n private async queryPort(\n port: number,\n csrfToken: string | null = null\n ): Promise<QuotaBucket[] | null> {\n try {\n const url = `http://127.0.0.1:${port}/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary`;\n const response = await this.#fetchFn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Connect-Protocol-Version': '1',\n ...(csrfToken ? { 'x-codeium-csrf-token': csrfToken } : {})\n },\n body: JSON.stringify({}),\n signal: AbortSignal.timeout(this.#timeoutMs)\n });\n\n if (!response.ok) {\n return null;\n }\n\n const body = (await response.json()) as RawQuotaResponse;\n const groups = body.response?.groups;\n if (!Array.isArray(groups) || groups.length === 0) {\n return null;\n }\n\n return mapQuotaGroups(groups);\n } catch {\n return null;\n }\n }\n}\n\nexport function mapQuotaGroups(groups: RawQuotaGroup[]): QuotaBucket[] {\n const buckets: QuotaBucket[] = [];\n\n for (const group of groups) {\n const isGemini = /gemini/i.test(group.displayName ?? '');\n const isClaudeOrGpt = /claude|gpt/i.test(group.displayName ?? '');\n\n for (const rawBucket of group.buckets ?? []) {\n const windowStr = (rawBucket.window ?? '').toLowerCase();\n const displayStr = (rawBucket.displayName ?? '').toLowerCase();\n\n const is5h = windowStr === '5h' || /5[- ]?hour/i.test(displayStr);\n const isWeekly = windowStr === 'weekly' || /week/i.test(displayStr);\n\n let durationMinutes: number;\n let windowName: string;\n if (is5h) {\n durationMinutes = 300;\n windowName = '5 hour';\n } else if (isWeekly) {\n durationMinutes = 10_080;\n windowName = 'Week';\n } else {\n continue;\n }\n\n let label = windowName;\n if (!isGemini) {\n if (isClaudeOrGpt) {\n label = `Claude / GPT · ${windowName}`;\n } else if (group.displayName) {\n label = `${group.displayName} · ${windowName}`;\n }\n }\n\n const usedPercent =\n typeof rawBucket.remainingFraction === 'number'\n ? Math.max(0, Math.min(100, Math.round((1 - rawBucket.remainingFraction) * 100)))\n : null;\n\n buckets.push({\n id: rawBucket.bucketId || `${isGemini ? 'gemini' : '3p'}-${windowStr}`,\n billingDomainId: ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID,\n label,\n usedPercent,\n windowDurationMinutes: durationMinutes,\n resetsAt: rawBucket.resetTime ?? null,\n authority: 'official-client',\n scope: 'account-wide'\n });\n }\n }\n\n return buckets;\n}\n","import type {\n BillingDomain,\n CollectionRequest,\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket,\n UsageObservation\n} from '../../core/types.js';\nimport type { AntigravitySqliteUsageClient } from '../../server/antigravity-sqlite-usage-client.js';\nimport { AntigravityQuotaClient } from '../../server/antigravity-quota-client.js';\n\nexport const ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID = 'code-assist-subscription';\n\nexport interface AntigravityQuotaLimits {\n rolling5hTokens?: number;\n weeklyTokens?: number;\n}\n\nexport const DEFAULT_ANTIGRAVITY_QUOTA_LIMITS: Required<AntigravityQuotaLimits> = {\n rolling5hTokens: 15_000_000,\n weeklyTokens: 100_000_000\n};\n\nexport interface AntigravityConnectorOptions {\n historyClient: AntigravitySqliteUsageClient;\n quotaClient?: AntigravityQuotaClient;\n clock?: () => Date;\n quotaLimits?: AntigravityQuotaLimits;\n}\n\n/**\n * Antigravity usage read from local conversation SQLite databases.\n *\n * Google Antigravity uses a dual-limit capacity model: a 5-hour rolling sprint\n * window and a weekly baseline limit. When official live quota is unavailable or\n * unwindowed, rolling 5-hour and weekly usage are derived from session observations.\n */\nexport class AntigravityConnector implements Connector {\n readonly id = 'antigravity';\n readonly displayName = 'Antigravity';\n readonly consentId = 'antigravity';\n readonly #historyClient: AntigravitySqliteUsageClient;\n readonly #quotaClient: AntigravityQuotaClient;\n readonly #clock: () => Date;\n readonly #quotaLimits: Required<AntigravityQuotaLimits>;\n\n constructor(options: AntigravityConnectorOptions) {\n this.#historyClient = options.historyClient;\n this.#quotaClient = options.quotaClient ?? new AntigravityQuotaClient();\n this.#clock = options.clock ?? (() => new Date());\n this.#quotaLimits = {\n rolling5hTokens:\n options.quotaLimits?.rolling5hTokens ?? DEFAULT_ANTIGRAVITY_QUOTA_LIMITS.rolling5hTokens,\n weeklyTokens:\n options.quotaLimits?.weeklyTokens ?? DEFAULT_ANTIGRAVITY_QUOTA_LIMITS.weeklyTokens\n };\n }\n\n async collect(options: CollectionRequest = { mode: 'incremental' }): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n const nowMs = this.#clock().getTime();\n const warnings: ConnectorFailure[] = [];\n let history: Awaited<ReturnType<AntigravitySqliteUsageClient['readUsage']>> | null = null;\n\n try {\n history = await this.#historyClient.readUsage(options);\n } catch {\n warnings.push(safeFailure());\n }\n\n if (history && !history.complete) {\n warnings.push(incompleteSessionScanFailure());\n }\n\n const usage = history?.usage ?? [];\n let quotaBuckets: QuotaBucket[] = [];\n\n try {\n const liveQuota = await this.#quotaClient.readQuota();\n if (liveQuota && liveQuota.length > 0) {\n quotaBuckets = [...liveQuota];\n }\n } catch {\n // Degrade gracefully to local observation buckets\n }\n\n const localBuckets = buildAntigravityQuotaBuckets(usage, nowMs, this.#quotaLimits);\n const has5h = quotaBuckets.some((b) => b.label === '5 hour' || b.id === 'gemini-5h');\n const hasWeekly = quotaBuckets.some((b) => b.label === 'Week' || b.id === 'gemini-weekly');\n\n if (!has5h || !hasWeekly) {\n for (const localBucket of localBuckets) {\n if (!quotaBuckets.some((b) => b.id === localBucket.id || b.label === localBucket.label)) {\n quotaBuckets.push(localBucket);\n }\n }\n }\n\n return {\n provider: { id: this.id, displayName: this.displayName },\n billingDomains: billingDomains(usage),\n quotaBuckets,\n usage,\n ...(usage.length > 0 && history?.complete\n ? {\n usageReconciliation: {\n authoritativeIdPrefixes: ['antigravity:'],\n retiredIdPrefixes: []\n }\n }\n : {}),\n costs: history?.costs ?? [],\n warnings,\n observedAt\n };\n }\n}\n\nexport function buildAntigravityQuotaBuckets(\n usage: UsageObservation[],\n nowMs: number,\n limits: Required<AntigravityQuotaLimits> = DEFAULT_ANTIGRAVITY_QUOTA_LIMITS\n): QuotaBucket[] {\n const fiveHoursMs = 300 * 60 * 1000;\n const sevenDaysMs = 7 * 24 * 60 * 60 * 1000;\n\n const cutoff5h = nowMs - fiveHoursMs;\n const cutoff7d = nowMs - sevenDaysMs;\n\n const obs5h: UsageObservation[] = [];\n const obs7d: UsageObservation[] = [];\n\n for (const obs of usage) {\n const t = new Date(obs.observedAt).getTime();\n if (t >= cutoff5h) obs5h.push(obs);\n if (t >= cutoff7d) obs7d.push(obs);\n }\n\n // 5-hour rolling sprint window\n const tokens5h = obs5h.reduce(\n (acc, obs) => acc + obs.inputTokens + obs.outputTokens + obs.cacheReadTokens,\n 0\n );\n const usedPercent5h = Math.min(100, Math.round((tokens5h / limits.rolling5hTokens) * 100));\n\n let resetsAt5h: string;\n if (obs5h.length > 0) {\n const oldestMs = Math.min(...obs5h.map((o) => new Date(o.observedAt).getTime()));\n resetsAt5h = new Date(oldestMs + fiveHoursMs).toISOString();\n } else {\n resetsAt5h = new Date(nowMs + fiveHoursMs).toISOString();\n }\n\n // Weekly baseline quota window\n const tokens7d = obs7d.reduce(\n (acc, obs) => acc + obs.inputTokens + obs.outputTokens + obs.cacheReadTokens,\n 0\n );\n const usedPercent7d = Math.min(100, Math.round((tokens7d / limits.weeklyTokens) * 100));\n\n let resetsAt7d: string;\n if (obs7d.length > 0) {\n const oldestMs = Math.min(...obs7d.map((o) => new Date(o.observedAt).getTime()));\n resetsAt7d = new Date(oldestMs + sevenDaysMs).toISOString();\n } else {\n resetsAt7d = new Date(nowMs + sevenDaysMs).toISOString();\n }\n\n return [\n {\n id: 'gemini-5h',\n billingDomainId: ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID,\n label: '5 hour',\n usedPercent: usedPercent5h,\n windowDurationMinutes: 300,\n resetsAt: resetsAt5h,\n authority: 'local-observation',\n scope: 'local-only'\n },\n {\n id: 'gemini-weekly',\n billingDomainId: ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID,\n label: 'Week',\n usedPercent: usedPercent7d,\n windowDurationMinutes: 10_080,\n resetsAt: resetsAt7d,\n authority: 'local-observation',\n scope: 'local-only'\n }\n ];\n}\n\nfunction billingDomains(usage: UsageObservation[]): BillingDomain[] {\n const primary: BillingDomain = {\n id: ANTIGRAVITY_PRIMARY_BILLING_DOMAIN_ID,\n displayName: 'Gemini Code Assist'\n };\n const observedRoutes = [...new Set(usage.map((obs) => obs.billingDomainId))]\n .filter((id) => id !== primary.id)\n .sort();\n\n return [primary, ...observedRoutes.map((id) => ({ id, displayName: id }))];\n}\n\nfunction incompleteSessionScanFailure(): ConnectorFailure {\n return {\n code: 'antigravity-session-scan-incomplete',\n message: 'Some local Antigravity conversation databases could not be read.',\n recovery:\n 'Agent Usage will retry automatically on the next scan without removing stored history.'\n };\n}\n\nfunction safeFailure(): ConnectorFailure {\n return {\n code: 'antigravity-sqlite-read-failed',\n message: 'Failed to read local Antigravity conversation stores.',\n recovery:\n 'Check read permissions for ~/.gemini/antigravity-cli and ~/.gemini/antigravity directories.'\n };\n}\n","import { createHash } from 'node:crypto';\nimport { readdir, readFile, rename, stat, writeFile, mkdir } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\n\nimport protobuf from 'protobufjs';\nimport type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\n\nimport { normalizeTokenObservation } from '../core/token-normalization.js';\nimport {\n OFFICIAL_PRICING_CATALOG,\n deriveRetailEquivalentCosts,\n type RetailPriceCatalog\n} from '../core/retail-pricing.js';\nimport type { CollectionRequest, CostRecord, UsageObservation } from '../core/types.js';\n\nconst { DatabaseSync } = createRequire(import.meta.url)(\n 'node:sqlite'\n) as typeof import('node:sqlite');\n\nexport interface AntigravitySqliteUsageClientOptions {\n roots: string[];\n clock?: () => Date;\n lookbackDays?: number;\n cachePath?: string;\n priceCatalog?: RetailPriceCatalog;\n}\n\nexport interface AntigravitySqliteUsageResult {\n usage: UsageObservation[];\n costs: CostRecord[];\n complete: boolean;\n unsupportedFormat?: boolean;\n}\n\ninterface ParsedAntigravityRecord {\n dedupeKey: string;\n observation: UsageObservation;\n}\n\ninterface CachedDatabaseFile {\n path: string;\n size: number;\n mtimeMs: number;\n records: ParsedAntigravityRecord[];\n recordsDigest: string;\n}\n\nexport class AntigravitySqliteUsageClient {\n readonly #roots: string[];\n readonly #clock: () => Date;\n readonly #lookbackDays: number;\n readonly #cachePath?: string;\n readonly #priceCatalog: RetailPriceCatalog;\n readonly #fileCache = new Map<string, CachedDatabaseFile>();\n #cacheLoaded = false;\n\n constructor(options: AntigravitySqliteUsageClientOptions) {\n this.#roots = options.roots;\n this.#clock = options.clock ?? (() => new Date());\n this.#lookbackDays = options.lookbackDays ?? 90;\n this.#cachePath = options.cachePath;\n this.#priceCatalog = options.priceCatalog ?? OFFICIAL_PRICING_CATALOG;\n }\n\n async readUsage(\n options: CollectionRequest = { mode: 'incremental' }\n ): Promise<AntigravitySqliteUsageResult> {\n await this.#loadCache();\n if (options.mode === 'hard-rebuild') this.#fileCache.clear();\n\n const cutoff = this.#clock().getTime() - this.#lookbackDays * 24 * 60 * 60 * 1000;\n const discoveredFiles = await this.#discoverDatabases(cutoff);\n\n const livePaths = new Set(discoveredFiles.map((file) => stableId(file.path)));\n for (const path of this.#fileCache.keys()) {\n if (!livePaths.has(path)) this.#fileCache.delete(path);\n }\n\n const usage: UsageObservation[] = [];\n const seenDedupeKeys = new Set<string>();\n let allComplete = true;\n\n for (const file of discoveredFiles) {\n const parsed = await this.#parseDatabaseFile(file);\n allComplete &&= parsed.complete;\n\n for (const record of parsed.records) {\n if (new Date(record.observation.observedAt).getTime() < cutoff) continue;\n if (seenDedupeKeys.has(record.dedupeKey)) continue;\n seenDedupeKeys.add(record.dedupeKey);\n usage.push(record.observation);\n }\n }\n\n // Sort observations deterministically by timestamp and dedupeKey\n usage.sort((a, b) => a.observedAt.localeCompare(b.observedAt) || a.id.localeCompare(b.id));\n\n // Calculate retail equivalent costs for all observations\n const { costs } = deriveRetailEquivalentCosts(\n {\n provider: { id: 'antigravity', displayName: 'Antigravity' },\n billingDomains: [{ id: 'code-assist-subscription', displayName: 'Gemini Code Assist' }],\n quotaBuckets: [],\n usage,\n costs: [],\n observedAt: this.#clock().toISOString()\n },\n this.#priceCatalog\n );\n\n await this.#persistCache();\n\n return {\n usage,\n costs,\n complete: allComplete\n };\n }\n\n async #discoverDatabases(\n cutoff: number\n ): Promise<Array<{ path: string; size: number; mtimeMs: number; conversationId: string }>> {\n const results: Array<{ path: string; size: number; mtimeMs: number; conversationId: string }> =\n [];\n const seenDbPaths = new Set<string>();\n\n for (const root of this.#roots) {\n try {\n const rootStat = await stat(root);\n if (!rootStat.isDirectory()) continue;\n } catch {\n continue;\n }\n\n // First try to inspect conversation_summaries.db for fast filtering\n const summariesPath = join(root, 'conversation_summaries.db');\n const candidateIds = new Set<string>();\n let summariesLoaded = false;\n\n try {\n const summariesStat = await stat(summariesPath);\n if (summariesStat.isFile()) {\n const db: DatabaseSyncType = new DatabaseSync(summariesPath, { readOnly: true });\n try {\n const rows = db\n .prepare('SELECT conversation_id, last_modified_time FROM conversation_summaries')\n .all() as Array<{ conversation_id?: string; last_modified_time?: string }>;\n\n for (const row of rows) {\n if (!row.conversation_id) continue;\n const modifiedMs = row.last_modified_time\n ? new Date(row.last_modified_time).getTime()\n : 0;\n if (modifiedMs >= cutoff || modifiedMs === 0) {\n candidateIds.add(row.conversation_id);\n }\n }\n summariesLoaded = true;\n } finally {\n db.close();\n }\n }\n } catch {\n // Fall back to scanning conversations/ directly\n }\n\n const convDir = join(root, 'conversations');\n try {\n const entries = await readdir(convDir);\n for (const entry of entries) {\n if (!entry.endsWith('.db')) continue;\n const convId = entry.slice(0, -3);\n if (summariesLoaded && candidateIds.size > 0 && !candidateIds.has(convId)) {\n continue;\n }\n const fullPath = join(convDir, entry);\n if (seenDbPaths.has(fullPath)) continue;\n seenDbPaths.add(fullPath);\n\n try {\n const fileStat = await stat(fullPath);\n if (fileStat.mtimeMs < cutoff && summariesLoaded) continue;\n results.push({\n path: fullPath,\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n conversationId: convId\n });\n } catch {\n // Ignore missing/inaccessible files\n }\n }\n } catch {\n // Missing conversations directory is normal for uninitialized root\n }\n }\n\n return results;\n }\n\n async #parseDatabaseFile(file: {\n path: string;\n size: number;\n mtimeMs: number;\n conversationId: string;\n }): Promise<{ records: ParsedAntigravityRecord[]; complete: boolean }> {\n const cached = this.#fileCache.get(stableId(file.path));\n if (cached && cached.size === file.size && cached.mtimeMs === file.mtimeMs) {\n return { records: cached.records, complete: true };\n }\n\n try {\n const records = parseAntigravityDatabase(file.path, file.conversationId, file.mtimeMs);\n const digest = stableId(JSON.stringify(records));\n this.#fileCache.set(stableId(file.path), {\n path: file.path,\n size: file.size,\n mtimeMs: file.mtimeMs,\n records,\n recordsDigest: digest\n });\n return { records, complete: true };\n } catch {\n return { records: [], complete: false };\n }\n }\n\n async #loadCache(): Promise<void> {\n if (this.#cacheLoaded) return;\n this.#cacheLoaded = true;\n if (!this.#cachePath) return;\n\n try {\n const content = await readFile(this.#cachePath, 'utf8');\n const stored = JSON.parse(content) as {\n version?: number;\n files?: unknown[];\n };\n if (stored.version !== 1 || !Array.isArray(stored.files)) return;\n\n for (const item of stored.files) {\n if (!isCachedDatabaseFile(item)) continue;\n if (item.recordsDigest !== stableId(JSON.stringify(item.records))) continue;\n this.#fileCache.set(stableId(item.path), item);\n }\n } catch {\n // Rebuild on cache failure\n }\n }\n\n async #persistCache(): Promise<void> {\n if (!this.#cachePath) return;\n try {\n await mkdir(dirname(this.#cachePath), { recursive: true, mode: 0o700 });\n const temporary = `${this.#cachePath}.${process.pid}.tmp`;\n await writeFile(\n temporary,\n JSON.stringify({ version: 1, files: [...this.#fileCache.values()] }),\n { mode: 0o600 }\n );\n await rename(temporary, this.#cachePath);\n } catch {\n // Cache persistence failures must not block collection\n }\n }\n}\n\nexport function parseAntigravityDatabase(\n dbPath: string,\n conversationId: string,\n fallbackMtimeMs: number\n): ParsedAntigravityRecord[] {\n const db: DatabaseSyncType = new DatabaseSync(dbPath, { readOnly: true });\n try {\n const tableExists = db\n .prepare(\"SELECT 1 FROM sqlite_master WHERE type='table' AND name='gen_metadata'\")\n .get();\n if (!tableExists) return [];\n\n // Query steps timestamps\n const stepTimestamps = new Map<number, number>();\n try {\n const stepRows = db\n .prepare('SELECT idx, metadata FROM steps WHERE length(metadata) > 0')\n .all() as Array<{ idx: number; metadata: Buffer }>;\n for (const row of stepRows) {\n const ts = extractTimestampFromStepMetadata(row.metadata);\n if (ts !== null) stepTimestamps.set(row.idx, ts);\n }\n } catch {\n // Steps timestamp failure degrades to fallback mtime\n }\n\n const genRows = db\n .prepare('SELECT idx, data FROM gen_metadata ORDER BY idx ASC')\n .all() as Array<{ idx: number; data: Buffer }>;\n\n const records: ParsedAntigravityRecord[] = [];\n\n for (const row of genRows) {\n if (!row.data || row.data.length === 0) continue;\n const parsed = decodeGenMetadata(row.data);\n if (parsed.inputTokens === 0 && parsed.outputTokens === 0 && parsed.cacheReadTokens === 0) {\n continue;\n }\n\n const timestampMs = stepTimestamps.get(row.idx) ?? fallbackMtimeMs;\n const observedAt = new Date(timestampMs).toISOString();\n const dedupeKey = `antigravity:${conversationId}:${row.idx}`;\n\n const observation: UsageObservation = {\n id: dedupeKey,\n billingDomainId: 'code-assist-subscription',\n model: parsed.canonicalModel,\n observedAt,\n inputTokens: parsed.inputTokens,\n outputTokens: parsed.outputTokens,\n reasoningTokens: 0,\n cacheReadTokens: parsed.cacheReadTokens,\n cacheWriteTokens: 0,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n };\n\n // Validate observation with project normalization schema\n normalizeTokenObservation(observation);\n records.push({ dedupeKey, observation });\n }\n\n return records;\n } finally {\n db.close();\n }\n}\n\nexport function decodeGenMetadata(buf: Buffer): {\n rawModel: string;\n canonicalModel: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n} {\n let rawModel = 'unknown';\n let inputTokens = 0;\n const outputTokens = 0;\n let cacheReadTokens = 0;\n\n try {\n const r = protobuf.Reader.create(buf);\n while (r.pos < r.len) {\n const tag = r.uint32();\n const fn = tag >>> 3;\n const wt = tag & 7;\n\n if (fn === 1 && wt === 2) {\n const sub1 = r.bytes();\n const rSub = protobuf.Reader.create(sub1);\n while (rSub.pos < rSub.len) {\n const sTag = rSub.uint32();\n const sFn = sTag >>> 3;\n const sWt = sTag & 7;\n\n if (sFn === 19 && sWt === 2) {\n rawModel = Buffer.from(rSub.bytes()).toString('utf8');\n } else if (sFn === 9 && sWt === 2) {\n const sub9 = rSub.bytes();\n const r9 = protobuf.Reader.create(sub9);\n while (r9.pos < r9.len) {\n const t9 = r9.uint32();\n const fn9 = t9 >>> 3;\n const wt9 = t9 & 7;\n\n if (fn9 === 10 && wt9 === 2) {\n const sub10 = r9.bytes();\n const r10 = protobuf.Reader.create(sub10);\n while (r10.pos < r10.len) {\n const t10 = r10.uint32();\n const fn10 = t10 >>> 3;\n const wt10 = t10 & 7;\n\n if (fn10 === 1 && wt10 === 0) {\n inputTokens = toNumeric(r10.uint64());\n } else if (fn10 === 3 && wt10 === 2) {\n const sub3 = r10.bytes();\n const r3 = protobuf.Reader.create(sub3);\n while (r3.pos < r3.len) {\n const t3 = r3.uint32();\n const fn3 = t3 >>> 3;\n const wt3 = t3 & 7;\n if (fn3 === 2 && wt3 === 0) {\n cacheReadTokens = toNumeric(r3.uint64());\n } else {\n r3.skipType(wt3);\n }\n }\n } else {\n r10.skipType(wt10);\n }\n }\n } else {\n r9.skipType(wt9);\n }\n }\n } else {\n rSub.skipType(sWt);\n }\n }\n } else {\n r.skipType(wt);\n }\n }\n } catch {\n // Gracefully return partial or zero tokens on corrupt protobuf\n }\n\n return {\n rawModel,\n canonicalModel: canonicalizeAntigravityModel(rawModel),\n inputTokens,\n outputTokens,\n cacheReadTokens\n };\n}\n\nexport function canonicalizeAntigravityModel(raw: string): string {\n const normalized = raw\n .trim()\n .toLowerCase()\n .replace(/[\\s_]+/g, '-');\n if (normalized.startsWith('gemini-3p7') || normalized.startsWith('gemini-3.7')) {\n return 'gemini-3.7-flash';\n }\n if (normalized.startsWith('gemini-3p6') || normalized.startsWith('gemini-3.6')) {\n return 'gemini-3.6-flash';\n }\n if (normalized.startsWith('gemini-3p1') || normalized.startsWith('gemini-3.1')) {\n return 'gemini-3.1-pro';\n }\n if (normalized.includes('claude-sonnet')) {\n return 'claude-sonnet-4-6';\n }\n if (normalized.includes('claude-opus')) {\n return 'claude-opus-4-6-thinking';\n }\n if (normalized.includes('gpt-oss')) {\n return 'gpt-oss-120b-medium';\n }\n return raw.trim() || 'unknown';\n}\n\nexport function extractTimestampFromStepMetadata(buf: Buffer): number | null {\n try {\n const r = protobuf.Reader.create(buf);\n while (r.pos < r.len) {\n const tag = r.uint32();\n const fn = tag >>> 3;\n const wt = tag & 7;\n if (fn === 1 && wt === 2) {\n const tsBytes = r.bytes();\n const rTs = protobuf.Reader.create(tsBytes);\n let seconds = 0;\n let nanos = 0;\n while (rTs.pos < rTs.len) {\n const t = rTs.uint32();\n const tFn = t >>> 3;\n const tWt = t & 7;\n if (tFn === 1 && tWt === 0) {\n seconds = toNumeric(rTs.uint64());\n } else if (tFn === 2 && tWt === 0) {\n nanos = toNumeric(rTs.uint64());\n } else {\n rTs.skipType(tWt);\n }\n }\n if (seconds > 0) {\n return seconds * 1000 + Math.floor(nanos / 1_000_000);\n }\n } else {\n r.skipType(wt);\n }\n }\n } catch {\n // Degrade gracefully\n }\n return null;\n}\n\nfunction toNumeric(val: number | protobuf.Long | unknown): number {\n return Number(val?.toString?.() ?? 0);\n}\n\nfunction stableId(value: string): string {\n return createHash('sha256').update(value).digest('hex').slice(0, 16);\n}\n\nfunction isCachedDatabaseFile(value: unknown): value is CachedDatabaseFile {\n if (typeof value !== 'object' || value === null) return false;\n const rec = value as Record<string, unknown>;\n return (\n typeof rec.path === 'string' &&\n typeof rec.size === 'number' &&\n typeof rec.mtimeMs === 'number' &&\n Array.isArray(rec.records) &&\n typeof rec.recordsDigest === 'string'\n );\n}\n","import type {\n ConnectorFailure,\n ConnectorSnapshot,\n CostRecord,\n UsageObservation\n} from '../../core/types.js';\nimport {\n extractOtlpMetrics,\n extractOtlpResources,\n isDeltaTemporality,\n isRecord,\n numericOtlpPointValue,\n otlpNanoToIso,\n otlpStringAttributes,\n readRecord,\n type OtlpPoint\n} from '../otlp.js';\nimport { grokBuildBillingDomains, resolveGrokBillingDomain } from './grok-build-connector.js';\n\ninterface UsageAggregate {\n timestamp: string;\n timePrecision: 'event' | 'unknown';\n model: string | null;\n sessionId: string | null;\n input: number;\n output: number;\n reasoning: number;\n cacheRead: number;\n}\n\nexport class GrokTelemetryError extends Error {\n readonly code: 'grok-otel-schema-unsupported' | 'grok-otel-temporality-unsupported';\n readonly recovery: string;\n\n constructor(code: GrokTelemetryError['code'], message: string, recovery: string) {\n super(message);\n this.name = 'GrokTelemetryError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport function parseGrokOtlpMetrics(payload: unknown, receivedAt: Date): ConnectorSnapshot {\n const resources = extractOtlpResources(payload);\n const versions = new Set(\n resources\n .map((resource) =>\n otlpStringAttributes(readRecord(resource, 'resource')?.attributes).get(\n 'grok_code.schema.version'\n )\n )\n .filter((version): version is string => Boolean(version))\n );\n if (versions.size !== 1 || !versions.has('v1')) {\n throw new GrokTelemetryError(\n 'grok-otel-schema-unsupported',\n 'Grok Build returned an unsupported alpha telemetry schema.',\n 'Update Agent Usage, or set Grok Build telemetry back to grok_code.schema.version v1.'\n );\n }\n\n const usage = new Map<string, UsageAggregate>();\n for (const resource of resources) {\n for (const metric of extractOtlpMetrics(resource)) {\n if (metric.name !== 'grok_code.token.usage') continue;\n if (!isDeltaTemporality(metric.sum?.aggregationTemporality)) {\n throw new GrokTelemetryError(\n 'grok-otel-temporality-unsupported',\n 'Cumulative Grok Build metrics cannot be safely added to local history.',\n 'Update Grok Build, restart it with delta telemetry enabled, then refresh Agent Usage.'\n );\n }\n const points = Array.isArray(metric.sum?.dataPoints)\n ? (metric.sum.dataPoints as OtlpPoint[])\n : [];\n for (const point of points) {\n const attributes = otlpStringAttributes(point.attributes);\n const type = attributes.get('type');\n if (!['input', 'output', 'reasoning', 'cache_read'].includes(type ?? '')) continue;\n const value = numericOtlpPointValue(point);\n if (value === null || value < 0) continue;\n const nano = typeof point.timeUnixNano === 'string' ? point.timeUnixNano : null;\n const model = attributes.get('model') ?? null;\n const sessionId = attributes.get('session.id') ?? null;\n const key = `${nano ?? receivedAt.getTime()}:${sessionId ?? 'unknown-session'}:${model ?? 'unknown-model'}`;\n const aggregate = usage.get(key) ?? {\n timestamp: nano ? otlpNanoToIso(nano) : receivedAt.toISOString(),\n timePrecision: nano ? 'event' : 'unknown',\n model,\n sessionId,\n input: 0,\n output: 0,\n reasoning: 0,\n cacheRead: 0\n };\n if (type === 'input') aggregate.input += value;\n if (type === 'output') aggregate.output += value;\n if (type === 'reasoning') aggregate.reasoning += value;\n if (type === 'cache_read') aggregate.cacheRead += value;\n usage.set(key, aggregate);\n }\n }\n }\n\n return snapshot(\n [...usage.entries()].map(([key, item]) => ({\n id: `grok-otel:${key}`,\n billingDomainId: resolveGrokBillingDomain(item.model),\n model: item.model,\n sessionId: item.sessionId,\n observedAt: item.timestamp,\n inputTokens: item.input,\n outputTokens: item.output,\n reasoningTokens: item.reasoning,\n cacheReadTokens: item.cacheRead,\n cacheWriteTokens: 0,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: item.model ? 'known' : 'unclassified',\n timePrecision: item.timePrecision,\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n })),\n [],\n receivedAt\n );\n}\n\nexport function parseGrokHeadlessResult(payload: unknown, receivedAt: Date): ConnectorSnapshot {\n if (!isRecord(payload)) throw new Error('Invalid Grok headless result');\n const sessionId = stringValue(payload.sessionId) ?? stringValue(payload.session_id);\n const requestId = stringValue(payload.requestId) ?? stringValue(payload.request_id) ?? 'unknown';\n const aggregateUsage = isRecord(payload.usage) ? payload.usage : {};\n const aggregateTotal = optionalNonNegativeNumber(aggregateUsage.total_tokens);\n const reasoningTotal = nonNegativeNumber(aggregateUsage.reasoning_tokens);\n const modelUsage = isRecord(payload.modelUsage) ? payload.modelUsage : {};\n const modelEntries = Object.entries(modelUsage).filter(\n (entry): entry is [string, Record<string, unknown>] => isRecord(entry[1])\n );\n const entries: Array<[string, Record<string, unknown>]> =\n modelEntries.length > 0 ? modelEntries : [['unknown-model', aggregateUsage]];\n\n const usage: UsageObservation[] = entries.map(([model, raw]) => {\n const values = raw as Record<string, unknown>;\n const input = nonNegativeNumber(values.inputTokens ?? values.input_tokens);\n const output = nonNegativeNumber(values.outputTokens ?? values.output_tokens);\n const cacheRead = nonNegativeNumber(\n values.cacheReadInputTokens ?? values.cache_read_input_tokens\n );\n const cacheWrite = nonNegativeNumber(\n values.cacheCreationInputTokens ?? values.cache_creation_input_tokens\n );\n const sourceReportedTotalTokens =\n optionalNonNegativeNumber(values.totalTokens ?? values.total_tokens) ??\n (entries.length === 1 ? aggregateTotal : null);\n return {\n id: `grok-headless:${sessionId ?? 'unknown-session'}:${requestId}:${model}`,\n billingDomainId: resolveGrokBillingDomain(model),\n model: model === 'unknown-model' ? null : model,\n sessionId: sessionId ?? null,\n observedAt: receivedAt.toISOString(),\n inputTokens: input,\n outputTokens: output,\n reasoningTokens: entries.length === 1 ? reasoningTotal : 0,\n cacheReadTokens: cacheRead,\n cacheWriteTokens: cacheWrite,\n sourceReportedTotalTokens,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: model === 'unknown-model' ? 'unclassified' : 'known',\n timePrecision: 'event',\n usageScope: 'this-mac',\n aggregationTemporality: 'delta',\n authority: 'local-observation'\n };\n });\n\n const warnings: ConnectorFailure[] = [];\n if (payload.usage_is_incomplete === true) {\n warnings.push({\n code: 'grok-headless-usage-incomplete',\n message: 'Grok Build reported incomplete headless usage.',\n recovery: 'Treat these token totals as a lower bound and retry the original export if needed.'\n });\n }\n return snapshot(usage, warnings, receivedAt);\n}\n\nfunction snapshot(\n usage: UsageObservation[],\n warnings: ConnectorFailure[],\n receivedAt: Date\n): ConnectorSnapshot {\n return {\n provider: { id: 'grok', displayName: 'Grok' },\n billingDomains: grokBuildBillingDomains(usage),\n quotaBuckets: [],\n usage,\n costs: [] as CostRecord[],\n warnings,\n observedAt: receivedAt.toISOString()\n };\n}\n\nfunction nonNegativeNumber(value: unknown): number {\n const parsed = typeof value === 'number' || typeof value === 'string' ? Number(value) : 0;\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;\n}\n\nfunction optionalNonNegativeNumber(value: unknown): number | null {\n const parsed = typeof value === 'number' || typeof value === 'string' ? Number(value) : NaN;\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { open } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Readable, Writable } from 'node:stream';\nimport { z } from 'zod';\n\nimport {\n grokBillingResponseSchema,\n type GrokBuildBilling,\n type GrokBuildBillingClient\n} from './grok-build-connector.js';\n\ninterface JsonRpcErrorBody {\n code: number;\n message?: string;\n}\n\ninterface JsonRpcResponse {\n id: number;\n result?: unknown;\n error?: JsonRpcErrorBody;\n}\n\nexport interface GrokBillingProcess {\n readonly stdin: Writable;\n readonly stdout: Readable;\n readonly stderr: Readable;\n once(event: 'error', listener: (error: Error) => void): this;\n once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;\n kill(signal?: NodeJS.Signals): boolean;\n}\n\nexport interface StdioGrokBillingClientOptions {\n command?: string;\n timeoutMs?: number;\n spawnProcess?: (command: string, arguments_: string[]) => GrokBillingProcess;\n readUnifiedLog?: () => Promise<string>;\n refreshBillingLog?: () => Promise<void>;\n clock?: () => Date;\n}\n\nexport class GrokBillingAdapterError extends Error {\n readonly code:\n | 'grok-client-unavailable'\n | 'grok-client-timeout'\n | 'grok-client-protocol-error'\n | 'grok-client-version-unsupported'\n | 'grok-billing-capability-unsupported'\n | 'grok-billing-unavailable'\n | 'grok-billing-schema-changed';\n readonly recovery: string;\n\n constructor(\n code: GrokBillingAdapterError['code'],\n message: string,\n recovery: string,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = 'GrokBillingAdapterError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class StdioGrokBillingClient implements GrokBuildBillingClient {\n readonly #command: string;\n readonly #timeoutMs: number;\n readonly #spawnProcess: NonNullable<StdioGrokBillingClientOptions['spawnProcess']>;\n readonly #readUnifiedLog: NonNullable<StdioGrokBillingClientOptions['readUnifiedLog']>;\n readonly #refreshBillingLog: NonNullable<StdioGrokBillingClientOptions['refreshBillingLog']>;\n readonly #clock: () => Date;\n\n constructor(options: StdioGrokBillingClientOptions = {}) {\n this.#command = options.command ?? 'grok';\n this.#timeoutMs = options.timeoutMs ?? 8_000;\n this.#spawnProcess =\n options.spawnProcess ??\n ((command, arguments_) =>\n spawn(command, arguments_, {\n stdio: ['pipe', 'pipe', 'pipe']\n }) as ChildProcessWithoutNullStreams);\n this.#readUnifiedLog =\n options.readUnifiedLog ??\n (() =>\n readLogTail(\n join(process.env.GROK_HOME ?? join(homedir(), '.grok'), 'logs', 'unified.jsonl')\n ));\n this.#refreshBillingLog =\n options.refreshBillingLog ??\n (options.readUnifiedLog\n ? async () => undefined\n : () => refreshBillingLogViaDashboard(this.#command, this.#timeoutMs));\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async readBilling(): Promise<GrokBuildBilling> {\n let process: GrokBillingProcess;\n try {\n process = this.#spawnProcess(this.#command, ['agent', '--no-leader', 'stdio']);\n } catch (error) {\n const fallback = await this.#readFreshLogFallback();\n if (fallback) return fallback;\n throw unavailableError(error);\n }\n\n process.stderr.resume();\n const peer = new JsonLinePeer(process, this.#timeoutMs);\n try {\n const initialized = await peer.request('initialize', {\n protocolVersion: 1,\n clientCapabilities: {},\n clientInfo: { name: 'agent-usage', version: '0.1.0' }\n });\n const version = z\n .object({ protocolVersion: z.number() })\n .passthrough()\n .safeParse(initialized);\n if (!version.success || version.data.protocolVersion !== 1) {\n throw new GrokBillingAdapterError(\n 'grok-client-version-unsupported',\n 'Grok Build returned an unsupported ACP version.',\n 'Update Grok Build and Agent Usage, then retry.'\n );\n }\n\n const result = await peer.request('x.ai/billing', {});\n const billing = grokBillingResponseSchema.safeParse(result);\n if (!billing.success) {\n throw new GrokBillingAdapterError(\n 'grok-billing-schema-changed',\n 'Grok Build returned an unsupported billing schema.',\n 'Open Grok Build and run /usage, then update Agent Usage.',\n { cause: billing.error }\n );\n }\n return billing.data;\n } catch (error) {\n const fallback = await this.#readFreshLogFallback();\n if (fallback) return fallback;\n if (error instanceof GrokBillingAdapterError) throw error;\n if (error instanceof JsonRpcError && error.code === -32601) {\n throw new GrokBillingAdapterError(\n 'grok-billing-capability-unsupported',\n 'This Grok Build version does not expose billing through ACP.',\n 'Open Grok Build and run /usage, then update Grok Build before retrying.',\n { cause: error }\n );\n }\n if (error instanceof JsonRpcError) {\n throw new GrokBillingAdapterError(\n 'grok-billing-unavailable',\n 'Grok Build subscription billing is unavailable.',\n 'Run grok login, open Grok Build, and run /usage before retrying.',\n { cause: error }\n );\n }\n throw unavailableError(error);\n } finally {\n peer.close();\n }\n }\n\n async #readLogFallback(): Promise<GrokBuildBilling | null> {\n try {\n return parseLatestBillingLog(await this.#readUnifiedLog());\n } catch {\n return null;\n }\n }\n\n async #readFreshLogFallback(): Promise<GrokBuildBilling | null> {\n const cached = await this.#readLogFallback();\n if (cached && billingIsFresh(cached, this.#clock())) return cached;\n try {\n await this.#refreshBillingLog();\n } catch {\n return cached;\n }\n return (await this.#readLogFallback()) ?? cached;\n }\n}\n\nconst GROK_BILLING_FRESHNESS_MS = 5 * 60 * 1_000;\n\nfunction billingIsFresh(billing: GrokBuildBilling, now: Date): boolean {\n if (!billing.sourceObservedAt) return false;\n const observedAt = Date.parse(billing.sourceObservedAt);\n if (!Number.isFinite(observedAt)) return false;\n return now.getTime() - observedAt <= GROK_BILLING_FRESHNESS_MS;\n}\n\nasync function refreshBillingLogViaDashboard(command: string, timeoutMs: number): Promise<void> {\n if (process.platform !== 'darwin') return;\n const refreshTimeoutMs = Math.min(timeoutMs, 6_000);\n const expectScript = [\n `set timeout ${Math.max(1, Math.ceil(refreshTimeoutMs / 1_000))}`,\n 'log_user 0',\n 'set command $env(AGENT_USAGE_GROK_REFRESH_COMMAND)',\n 'spawn -noecho $command dashboard',\n `after ${Math.min(2_000, Math.max(250, refreshTimeoutMs - 1_000))}`,\n 'send \"\\\\021\\\\021\"',\n 'expect eof'\n ].join('\\n');\n await new Promise<void>((resolve) => {\n const dashboard = spawn('/usr/bin/expect', ['-c', expectScript], {\n env: {\n ...process.env,\n AGENT_USAGE_GROK_REFRESH_COMMAND: command,\n TERM: process.env.TERM ?? 'xterm-256color'\n },\n stdio: ['ignore', 'pipe', 'pipe']\n });\n dashboard.stdout.resume();\n dashboard.stderr.resume();\n let settled = false;\n const stopTimer = setTimeout(() => {\n dashboard.kill('SIGTERM');\n finish();\n }, refreshTimeoutMs);\n const finish = () => {\n if (settled) return;\n settled = true;\n clearTimeout(stopTimer);\n resolve();\n };\n dashboard.once('error', finish);\n dashboard.once('exit', finish);\n });\n}\n\nfunction parseLatestBillingLog(text: string): GrokBuildBilling | null {\n const lines = text.split(/\\r?\\n/);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index].trim();\n if (!line) continue;\n let record: unknown;\n try {\n record = JSON.parse(line);\n } catch {\n continue;\n }\n const entry = z\n .object({\n ts: z.string(),\n msg: z.string(),\n ctx: z.unknown()\n })\n .safeParse(record);\n if (!entry.success || entry.data.msg !== 'billing: fetched credits config') continue;\n const billing = grokBillingResponseSchema.safeParse({\n ...(typeof entry.data.ctx === 'object' && entry.data.ctx !== null ? entry.data.ctx : {}),\n sourceObservedAt: entry.data.ts\n });\n if (billing.success) return billing.data;\n }\n return null;\n}\n\nasync function readLogTail(path: string): Promise<string> {\n const maximumBytes = 2 * 1024 * 1024;\n const handle = await open(path, 'r');\n try {\n const stats = await handle.stat();\n const length = Math.min(stats.size, maximumBytes);\n const start = Math.max(0, stats.size - length);\n const buffer = Buffer.alloc(length);\n await handle.read(buffer, 0, length, start);\n const text = buffer.toString('utf8');\n if (start === 0) return text;\n const firstNewline = text.indexOf('\\n');\n return firstNewline === -1 ? '' : text.slice(firstNewline + 1);\n } finally {\n await handle.close();\n }\n}\n\nclass JsonRpcError extends Error {\n readonly code: number;\n\n constructor(body: JsonRpcErrorBody) {\n super(body.message ?? `Grok ACP error ${body.code}`);\n this.name = 'JsonRpcError';\n this.code = body.code;\n }\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n}\n\nclass JsonLinePeer {\n readonly #process: GrokBillingProcess;\n readonly #timeoutMs: number;\n readonly #pending = new Map<number, PendingRequest>();\n #nextId = 1;\n #buffer = '';\n #closed = false;\n\n constructor(process: GrokBillingProcess, timeoutMs: number) {\n this.#process = process;\n this.#timeoutMs = timeoutMs;\n process.stdout.setEncoding('utf8');\n process.stdout.on('data', (chunk: string) => this.#consume(chunk));\n process.once('error', (error) => this.#fail(unavailableError(error)));\n process.once('exit', (code, signal) => {\n if (this.#closed) return;\n this.#fail(\n new GrokBillingAdapterError(\n 'grok-client-unavailable',\n 'Grok Build exited before billing was returned.',\n 'Run grok login, then update or restart Grok Build.',\n { cause: new Error(`exit=${String(code)} signal=${String(signal)}`) }\n )\n );\n });\n }\n\n request(method: string, params?: unknown): Promise<unknown> {\n const id = this.#nextId++;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.#pending.delete(id);\n reject(\n new GrokBillingAdapterError(\n 'grok-client-timeout',\n 'Grok Build did not return billing in time.',\n 'Open Grok Build and run /usage, then retry.'\n )\n );\n }, this.#timeoutMs);\n this.#pending.set(id, { resolve, reject, timeout });\n this.#process.stdin.write(\n `${JSON.stringify({ jsonrpc: '2.0', id, method, ...(params === undefined ? {} : { params }) })}\\n`\n );\n });\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n for (const pending of this.#pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(unavailableError(new Error('Grok ACP connection closed')));\n }\n this.#pending.clear();\n this.#process.kill();\n }\n\n #consume(chunk: string): void {\n this.#buffer += chunk;\n let newline = this.#buffer.indexOf('\\n');\n while (newline !== -1) {\n const line = this.#buffer.slice(0, newline).trim();\n this.#buffer = this.#buffer.slice(newline + 1);\n if (line) this.#consumeLine(line);\n newline = this.#buffer.indexOf('\\n');\n }\n }\n\n #consumeLine(line: string): void {\n let response: JsonRpcResponse;\n try {\n response = JSON.parse(line) as JsonRpcResponse;\n } catch (error) {\n this.#fail(\n new GrokBillingAdapterError(\n 'grok-client-protocol-error',\n 'Grok Build returned an invalid ACP message.',\n 'Update Grok Build and Agent Usage, then retry.',\n { cause: error }\n )\n );\n return;\n }\n if (typeof response.id !== 'number') return;\n const pending = this.#pending.get(response.id);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.#pending.delete(response.id);\n if (response.error) pending.reject(new JsonRpcError(response.error));\n else pending.resolve(response.result);\n }\n\n #fail(error: Error): void {\n for (const pending of this.#pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(error);\n }\n this.#pending.clear();\n }\n}\n\nfunction unavailableError(cause: unknown): GrokBillingAdapterError {\n return new GrokBillingAdapterError(\n 'grok-client-unavailable',\n 'Grok Build billing capability is unavailable.',\n 'Install or update Grok Build, run grok login, then retry.',\n { cause }\n );\n}\n","import { z } from 'zod';\n\nimport type { SecretStore } from '../../core/onboarding-types.js';\nimport type {\n BalanceRecord,\n Connector,\n ConnectorFailure,\n ConnectorSnapshot,\n CostRecord,\n InvoiceRecord,\n QuotaBucket,\n UsageObservation\n} from '../../core/types.js';\n\nconst numericString = z.union([z.string(), z.number()]).transform(Number);\nconst centSchema = z.object({ val: numericString }).passthrough();\nconst validationSchema = z\n .object({\n teamId: z.string().optional(),\n scope: z.string().optional(),\n scopeId: z.string().optional()\n })\n .passthrough();\nconst usageSchema = z\n .object({\n timeSeries: z.array(\n z\n .object({\n group: z.array(z.string()).default([]),\n groupLabels: z.array(z.string()).default([]),\n dataPoints: z.array(\n z\n .object({\n timestamp: z.string(),\n values: z.array(z.number())\n })\n .passthrough()\n )\n })\n .passthrough()\n ),\n limitReached: z.boolean().default(false)\n })\n .passthrough();\nconst balanceSchema = z\n .object({\n total: centSchema.optional()\n })\n .passthrough();\nconst limitsSchema = z\n .object({\n spendingLimits: z\n .object({\n effectiveSl: centSchema.optional(),\n softSl: centSchema.optional()\n })\n .passthrough()\n .optional()\n })\n .passthrough();\nconst previewSchema = z\n .object({\n coreInvoice: z\n .object({\n amountBeforeVat: numericString.optional(),\n totalWithCorr: centSchema.optional()\n })\n .passthrough()\n .optional(),\n effectiveSpendingLimit: numericString.optional(),\n billingCycle: z.object({ year: z.number(), month: z.number() }).passthrough().optional()\n })\n .passthrough();\nconst invoiceLineSchema = z\n .object({\n description: z.string(),\n unitType: z.string(),\n numUnits: numericString\n })\n .passthrough();\nconst invoiceSchema = z\n .object({\n invoiceId: z.string(),\n invoiceNumber: z.string().optional(),\n createTime: z.string(),\n invoiceStatus: z.string().optional(),\n total: numericString.optional(),\n lines: z.array(invoiceLineSchema).default([])\n })\n .passthrough();\nconst invoicesSchema = z.object({ invoices: z.array(invoiceSchema) }).passthrough();\n\ntype UsageResponse = z.infer<typeof usageSchema>;\ntype Invoice = z.infer<typeof invoiceSchema>;\n\ninterface XaiApiAccountPayload {\n teamId: string;\n usage: UsageResponse | null;\n balanceCents: number | null;\n spendingLimitCents: number | null;\n currentInvoiceCents: number | null;\n invoices: Invoice[];\n warnings: ConnectorFailure[];\n}\n\nexport interface XaiApiAccountClient {\n readAccount(): Promise<XaiApiAccountPayload>;\n}\n\nexport interface XaiManagementApiClientOptions {\n secretStore: SecretStore;\n fetch?: typeof fetch;\n clock?: () => Date;\n baseUrl?: string;\n}\n\nexport class XaiManagementApiError extends Error {\n readonly code:\n | 'xai-management-key-missing'\n | 'xai-management-key-invalid'\n | 'xai-management-team-scope-required';\n readonly recovery: string;\n\n constructor(code: XaiManagementApiError['code'], message: string, recovery: string) {\n super(message);\n this.name = 'XaiManagementApiError';\n this.code = code;\n this.recovery = recovery;\n }\n}\n\nexport class XaiManagementApiClient implements XaiApiAccountClient {\n readonly #secretStore: SecretStore;\n readonly #fetch: typeof fetch;\n readonly #clock: () => Date;\n readonly #baseUrl: string;\n\n constructor(options: XaiManagementApiClientOptions) {\n this.#secretStore = options.secretStore;\n this.#fetch = options.fetch ?? fetch;\n this.#clock = options.clock ?? (() => new Date());\n this.#baseUrl = (options.baseUrl ?? 'https://management-api.x.ai').replace(/\\/$/, '');\n }\n\n async readAccount(): Promise<XaiApiAccountPayload> {\n const key = await this.#secretStore.get('connector:xai-api');\n if (!key) {\n throw new XaiManagementApiError(\n 'xai-management-key-missing',\n 'The xAI Management API key is not configured.',\n 'Connect xAI API and save a dedicated management key in Keychain.'\n );\n }\n\n const validationResponse = await this.#request(\n key,\n '/auth/management-keys/validation',\n validationSchema\n );\n const teamId =\n validationResponse.teamId ??\n (validationResponse.scope === 'SCOPE_TEAM' ? validationResponse.scopeId : undefined);\n if (!teamId) {\n throw new XaiManagementApiError(\n 'xai-management-team-scope-required',\n 'This management key does not identify one xAI API team.',\n 'Use a team-scoped management key; organization team selection is not configured.'\n );\n }\n\n const now = this.#clock();\n const start = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n const authorization = { authorization: `Bearer ${key}` };\n const usageBody = {\n analyticsRequest: {\n timeRange: {\n startTime: analyticsTimestamp(start),\n endTime: analyticsTimestamp(now),\n timezone: 'Etc/GMT'\n },\n timeUnit: 'TIME_UNIT_DAY',\n values: [{ name: 'usd', aggregation: 'AGGREGATION_SUM' }],\n groupBy: ['description'],\n filters: []\n }\n };\n const invoiceQuery = `since.year=${start.getUTCFullYear()}&since.month=${start.getUTCMonth() + 1}`;\n\n const [usage, balance, limits, preview, invoices] = await Promise.all([\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/usage`,\n usageSchema,\n {\n method: 'POST',\n headers: { ...authorization, 'content-type': 'application/json' },\n body: JSON.stringify(usageBody)\n },\n 'usage'\n ),\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/prepaid/balance`,\n balanceSchema,\n undefined,\n 'balance'\n ),\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/postpaid/spending-limits`,\n limitsSchema,\n undefined,\n 'spending limit'\n ),\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/postpaid/invoice/preview`,\n previewSchema,\n undefined,\n 'invoice preview'\n ),\n this.#optionalRequest(\n key,\n `/v1/billing/teams/${encodeURIComponent(teamId)}/invoices?${invoiceQuery}`,\n invoicesSchema,\n undefined,\n 'invoices'\n )\n ]);\n\n const warnings = [usage, balance, limits, preview, invoices].flatMap(\n (result) => result.warning ?? []\n );\n if (usage.value?.limitReached) {\n warnings.push({\n code: 'xai-api-history-partial',\n message: 'xAI API returned only part of the requested usage history.',\n recovery: 'Narrow the history range or grouping, then retry.'\n });\n }\n return {\n teamId,\n usage: usage.value ?? null,\n balanceCents: balance.value?.total?.val ?? null,\n spendingLimitCents:\n limits.value?.spendingLimits?.effectiveSl?.val ??\n preview.value?.effectiveSpendingLimit ??\n null,\n currentInvoiceCents:\n preview.value?.coreInvoice?.amountBeforeVat ??\n preview.value?.coreInvoice?.totalWithCorr?.val ??\n null,\n invoices: invoices.value?.invoices ?? [],\n warnings\n };\n }\n\n async #optionalRequest<T>(\n key: string,\n path: string,\n schema: z.ZodType<T>,\n init: RequestInit | undefined,\n label: string\n ): Promise<{ value?: T; warning?: ConnectorFailure }> {\n try {\n return { value: await this.#request(key, path, schema, init) };\n } catch (error) {\n return { warning: endpointFailure(error, label) };\n }\n }\n\n async #request<T>(\n key: string,\n path: string,\n schema: z.ZodType<T>,\n init: RequestInit = {}\n ): Promise<T> {\n const response = await this.#fetch(`${this.#baseUrl}${path}`, {\n ...init,\n headers: { authorization: `Bearer ${key}`, ...init.headers },\n signal: AbortSignal.timeout(10_000)\n });\n if (!response.ok) {\n const error = Object.assign(\n new Error(`xAI Management API returned HTTP ${response.status}`),\n {\n status: response.status,\n retryAfter: response.headers.get('retry-after')\n }\n );\n throw error;\n }\n const parsed = schema.safeParse(await response.json());\n if (!parsed.success) {\n throw Object.assign(new Error('xAI Management API schema changed'), {\n status: 422,\n cause: parsed.error\n });\n }\n return parsed.data;\n }\n}\n\nexport interface XaiApiConnectorOptions {\n accountClient: XaiApiAccountClient;\n clock?: () => Date;\n}\n\nexport class XaiApiConnector implements Connector {\n readonly id = 'xai-api';\n readonly displayName = 'Grok';\n readonly consentId = 'xai-api';\n readonly #accountClient: XaiApiAccountClient;\n readonly #clock: () => Date;\n\n constructor(options: XaiApiConnectorOptions) {\n this.#accountClient = options.accountClient;\n this.#clock = options.clock ?? (() => new Date());\n }\n\n async collect(): Promise<ConnectorSnapshot> {\n const observedAt = this.#clock().toISOString();\n try {\n const account = await this.#accountClient.readAccount();\n return {\n provider: { id: 'grok', displayName: 'Grok', accountIdentifier: account.teamId },\n billingDomains: [{ id: 'xai-api', displayName: 'xAI API' }],\n quotaBuckets: mapSpendingLimit(account, this.#clock()),\n usage: mapInvoiceTokens(account.invoices),\n costs: mapUsageCosts(account),\n balances: mapBalances(account, observedAt),\n invoices: mapInvoices(account.invoices),\n warnings: account.warnings,\n observedAt\n };\n } catch (error) {\n return {\n provider: { id: 'grok', displayName: 'Grok' },\n billingDomains: [{ id: 'xai-api', displayName: 'xAI API' }],\n quotaBuckets: [],\n usage: [],\n costs: [],\n balances: [],\n invoices: [],\n warnings: [safeFailure(error)],\n observedAt\n };\n }\n }\n}\n\nfunction mapSpendingLimit(account: XaiApiAccountPayload, now: Date): QuotaBucket[] {\n if (account.spendingLimitCents === null) return [];\n const limit = account.spendingLimitCents / 100;\n const used = account.currentInvoiceCents === null ? null : account.currentInvoiceCents / 100;\n return [\n {\n id: 'xai-api:monthly-spending-limit',\n billingDomainId: 'xai-api',\n label: 'Monthly invoiced spending limit',\n usedPercent: used === null || limit <= 0 ? null : Math.min(100, (used / limit) * 100),\n resetsAt: nextUtcMonth(now),\n authority: 'official-account',\n scope: 'account-wide',\n limitAmount: limit,\n limitCurrency: 'USD'\n }\n ];\n}\n\nfunction mapUsageCosts(account: XaiApiAccountPayload): CostRecord[] {\n return (account.usage?.timeSeries ?? []).flatMap((series) => {\n const model = series.groupLabels[0] ?? series.group[0] ?? 'Unlabeled usage';\n return series.dataPoints.flatMap((point) => {\n const amount = point.values[0];\n if (amount === undefined || !Number.isFinite(amount)) return [];\n const sourceId = `${account.teamId}:${model}:${point.timestamp}`;\n return [\n {\n id: `xai-usage:${model}:${point.timestamp}`,\n sourceId,\n billingDomainId: 'xai-api',\n observedAt: point.timestamp,\n kind: 'actual' as const,\n amount,\n currency: 'USD',\n authority: 'official-account' as const,\n model: modelFromDescription(model)\n }\n ];\n });\n });\n}\n\nfunction mapInvoiceTokens(invoices: Invoice[]): UsageObservation[] {\n const observations: UsageObservation[] = [];\n for (const invoice of invoices) {\n const byModel = new Map<string, UsageObservation>();\n for (const line of invoice.lines) {\n const kind = tokenKind(line.unitType);\n if (!kind) continue;\n const model = modelFromDescription(line.description);\n const observation = byModel.get(model) ?? {\n id: `xai-invoice:${invoice.invoiceId}:${model}`,\n billingDomainId: 'xai-api',\n model,\n observedAt: invoice.createTime,\n inputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n tokenSemantics: {\n reasoning: 'included-in-output',\n cacheRead: 'separate',\n cacheWrite: 'separate'\n },\n modelAttribution: 'known',\n timePrecision: 'billing-period',\n usageScope: 'account-wide',\n aggregationTemporality: 'delta',\n authority: 'official-account'\n };\n observation[kind] = (observation[kind] ?? 0) + line.numUnits;\n byModel.set(model, observation);\n }\n observations.push(...byModel.values());\n }\n return observations;\n}\n\nfunction mapBalances(account: XaiApiAccountPayload, observedAt: string): BalanceRecord[] {\n const records: BalanceRecord[] = [];\n if (account.balanceCents !== null) {\n records.push({\n id: 'xai-api:prepaid-balance',\n billingDomainId: 'xai-api',\n observedAt,\n kind: 'prepaid',\n amount: -account.balanceCents / 100,\n currency: 'USD',\n authority: 'official-account',\n sourceId: `${account.teamId}:prepaid-balance`\n });\n }\n if (account.spendingLimitCents !== null) {\n records.push({\n id: 'xai-api:spending-limit',\n billingDomainId: 'xai-api',\n observedAt,\n kind: 'spending-limit',\n amount: account.spendingLimitCents / 100,\n currency: 'USD',\n authority: 'official-account',\n sourceId: `${account.teamId}:spending-limit`\n });\n }\n if (account.currentInvoiceCents !== null) {\n records.push({\n id: 'xai-api:current-invoice',\n billingDomainId: 'xai-api',\n observedAt,\n kind: 'current-invoice',\n amount: account.currentInvoiceCents / 100,\n currency: 'USD',\n authority: 'official-account',\n sourceId: `${account.teamId}:current-invoice`\n });\n }\n return records;\n}\n\nfunction mapInvoices(invoices: Invoice[]): InvoiceRecord[] {\n return invoices.map((invoice) => ({\n id: invoice.invoiceId,\n billingDomainId: 'xai-api',\n createdAt: invoice.createTime,\n number: invoice.invoiceNumber ?? null,\n status: invoice.invoiceStatus ?? null,\n amount: invoice.total === undefined ? null : invoice.total / 100,\n currency: 'USD',\n authority: 'official-account'\n }));\n}\n\nfunction tokenKind(\n unitType: string\n): 'inputTokens' | 'outputTokens' | 'reasoningTokens' | 'cacheReadTokens' | null {\n const value = unitType.toLowerCase();\n if (!value.includes('token')) return null;\n if (value.includes('cache')) return 'cacheReadTokens';\n if (value.includes('reason')) return 'reasoningTokens';\n if (value.includes('prompt') || value.includes('input')) return 'inputTokens';\n if (value.includes('completion') || value.includes('output')) return 'outputTokens';\n return null;\n}\n\nfunction modelFromDescription(description: string): string {\n return description.replace(/^(Chat|Responses?)\\s+/i, '') || description;\n}\n\nfunction analyticsTimestamp(value: Date): string {\n return value\n .toISOString()\n .replace('T', ' ')\n .replace(/\\.\\d{3}Z$/, '');\n}\n\nfunction nextUtcMonth(now: Date): string {\n return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1)).toISOString();\n}\n\nfunction endpointFailure(error: unknown, label: string): ConnectorFailure {\n const status =\n error instanceof Error && 'status' in error && typeof error.status === 'number'\n ? error.status\n : null;\n if (status === 429) {\n const retryAfter =\n error instanceof Error && 'retryAfter' in error && typeof error.retryAfter === 'string'\n ? error.retryAfter\n : 'the provider retry interval';\n return {\n code: 'xai-api-rate-limited',\n message: `xAI API ${label} is rate limited.`,\n recovery: `Retry after ${retryAfter} seconds.`\n };\n }\n if (status === 401 || status === 403) {\n return {\n code: 'xai-api-permission-denied',\n message: `The management key cannot read xAI API ${label}.`,\n recovery: 'Grant the management key read access for this billing endpoint, then retry.'\n };\n }\n if (status === 422) {\n return {\n code: 'xai-api-schema-changed',\n message: `xAI API ${label} returned an unsupported schema.`,\n recovery: 'Update Agent Usage, then retry.'\n };\n }\n return {\n code: 'xai-api-endpoint-unavailable',\n message: `xAI API ${label} is unavailable.`,\n recovery: 'Check network access and xAI status, then retry.'\n };\n}\n\nfunction safeFailure(error: unknown): ConnectorFailure {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'recovery' in error &&\n typeof error.recovery === 'string'\n ) {\n return { code: error.code, message: error.message, recovery: error.recovery };\n }\n return {\n code: 'xai-api-connector-failed',\n message: 'xAI API billing is unavailable.',\n recovery: 'Run agent-usage doctor and reconnect the xAI Management API key.'\n };\n}\n","import type { MonitoringSettings } from '../core/types.js';\n\nexport interface ScheduledUsageApplication {\n refresh(): Promise<void>;\n getMonitoringSettings(): Promise<MonitoringSettings>;\n}\n\nexport interface CollectionSchedulerOptions {\n application: ScheduledUsageApplication;\n intervalMs?: number;\n}\n\nexport class CollectionScheduler {\n readonly #application: ScheduledUsageApplication;\n readonly #intervalMs?: number;\n #timer: ReturnType<typeof setTimeout> | null = null;\n #stopped = true;\n\n constructor(options: CollectionSchedulerOptions) {\n this.#application = options.application;\n this.#intervalMs = options.intervalMs;\n }\n\n async tick(): Promise<void> {\n const settings = await this.#application.getMonitoringSettings();\n if (settings.backgroundCollectionEnabled) await this.#application.refresh();\n }\n\n start(): void {\n if (!this.#stopped) return;\n this.#stopped = false;\n void this.#scheduleNext();\n }\n\n stop(): void {\n this.#stopped = true;\n if (this.#timer) clearTimeout(this.#timer);\n this.#timer = null;\n }\n\n async #scheduleNext(): Promise<void> {\n if (this.#stopped) return;\n const settings = await this.#application.getMonitoringSettings();\n const interval = this.#intervalMs ?? settings.intervalMinutes * 60 * 1000;\n this.#timer = setTimeout(async () => {\n try {\n await this.tick();\n } finally {\n void this.#scheduleNext();\n }\n }, interval);\n }\n}\n","import type { ExchangeRateProvider, ExchangeRateSnapshot } from '../core/types.js';\n\nconst DEFAULT_URL = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml';\nconst SOURCE = 'European Central Bank euro foreign exchange reference rates';\n\nexport interface EcbExchangeRateProviderOptions {\n fetch?: typeof fetch;\n url?: string;\n}\n\nexport class EcbExchangeRateProvider implements ExchangeRateProvider {\n readonly #fetch: typeof fetch;\n readonly #url: string;\n\n constructor(options: EcbExchangeRateProviderOptions = {}) {\n this.#fetch = options.fetch ?? fetch;\n this.#url = options.url ?? DEFAULT_URL;\n }\n\n async readRates(): Promise<ExchangeRateSnapshot[]> {\n const response = await this.#fetch(this.#url, { signal: AbortSignal.timeout(5_000) });\n if (!response.ok) throw new Error(`ECB reference rates returned HTTP ${response.status}`);\n const xml = await response.text();\n const date = xml.match(/<Cube\\s+time=['\"](\\d{4}-\\d{2}-\\d{2})['\"]/i)?.[1];\n if (!date) throw new Error('ECB reference rate date is unavailable');\n const euroRates = new Map<string, number>([['EUR', 1]]);\n for (const match of xml.matchAll(\n /<Cube\\s+currency=['\"]([A-Z]{3})['\"]\\s+rate=['\"]([0-9.]+)['\"]\\s*\\/?\\s*>/gi\n )) {\n const rate = Number(match[2]);\n if (Number.isFinite(rate) && rate > 0) euroRates.set(match[1].toUpperCase(), rate);\n }\n const cnyPerEuro = euroRates.get('CNY');\n if (!cnyPerEuro) throw new Error('ECB CNY reference rate is unavailable');\n const observedAt = `${date}T00:00:00.000Z`;\n return [...euroRates.entries()]\n .filter(([currency]) => currency !== 'CNY')\n .map(([currency, unitsPerEuro]) => ({\n id: `ecb:${date}:${currency}:CNY`,\n baseCurrency: currency,\n quoteCurrency: 'CNY',\n rate: Number((cnyPerEuro / unitsPerEuro).toPrecision(12)),\n observedAt,\n source: `${SOURCE} (${this.#url})`\n }));\n }\n}\n","import { spawn } from 'node:child_process';\n\nimport type { SecretStore } from '../core/onboarding-types.js';\n\nconst SERVICE = 'dev.agent-usage.secrets';\nconst ITEM_NOT_FOUND = 44;\n\nexport interface SecurityCommandResult {\n exitCode: number;\n output?: string;\n}\n\nexport type SecurityCommandRunner = (\n arguments_: string[],\n input?: string\n) => Promise<SecurityCommandResult>;\n\nexport class MacOsKeychainSecretStore implements SecretStore {\n readonly #run: SecurityCommandRunner;\n readonly #service: string;\n\n constructor(run: SecurityCommandRunner = runSecurityCommand, options: { service?: string } = {}) {\n this.#run = run;\n this.#service = options.service ?? SERVICE;\n }\n\n async set(reference: string, value: string): Promise<void> {\n const result = await this.#run(\n ['add-generic-password', '-U', '-a', reference, '-s', this.#service, '-w'],\n `${value}\\n`\n );\n if (result.exitCode !== 0)\n throw new Error(`Keychain write failed with code ${result.exitCode}`);\n }\n\n async has(reference: string): Promise<boolean> {\n const result = await this.#run(['find-generic-password', '-a', reference, '-s', this.#service]);\n if (result.exitCode === 0) return true;\n if (result.exitCode === ITEM_NOT_FOUND) return false;\n throw new Error(`Keychain lookup failed with code ${result.exitCode}`);\n }\n\n async get(reference: string): Promise<string | null> {\n const result = await this.#run([\n 'find-generic-password',\n '-a',\n reference,\n '-s',\n this.#service,\n '-w'\n ]);\n if (result.exitCode === ITEM_NOT_FOUND) return null;\n if (result.exitCode !== 0) {\n throw new Error(`Keychain read failed with code ${result.exitCode}`);\n }\n return result.output?.replace(/\\r?\\n$/, '') ?? null;\n }\n\n async delete(reference: string): Promise<void> {\n const result = await this.#run([\n 'delete-generic-password',\n '-a',\n reference,\n '-s',\n this.#service\n ]);\n if (result.exitCode !== 0 && result.exitCode !== ITEM_NOT_FOUND) {\n throw new Error(`Keychain delete failed with code ${result.exitCode}`);\n }\n }\n}\n\nasync function runSecurityCommand(\n arguments_: string[],\n input?: string\n): Promise<SecurityCommandResult> {\n return await new Promise((resolveResult, reject) => {\n const child = spawn('/usr/bin/security', arguments_, {\n stdio: ['pipe', 'pipe', 'ignore']\n });\n let output = '';\n child.stdout.setEncoding('utf8').on('data', (chunk) => (output += chunk));\n child.once('error', reject);\n child.once('close', (exitCode) => resolveResult({ exitCode: exitCode ?? 1, output }));\n if (input) child.stdin.end(input);\n else child.stdin.end();\n });\n}\n","import { spawn } from 'node:child_process';\n\nimport type { LocalNotification, LocalNotifier } from '../core/types.js';\n\nexport class MacOsNotifier implements LocalNotifier {\n async notify(event: LocalNotification): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n '/usr/bin/osascript',\n [\n '-e',\n 'on run argv\\ndisplay notification (item 2 of argv) with title (item 1 of argv)\\nend run',\n '--',\n event.title,\n event.message\n ],\n { stdio: 'ignore' }\n );\n child.once('error', reject);\n child.once('close', (code) => (code === 0 ? resolve() : reject(new Error('notify failed'))));\n });\n }\n}\n","import { mkdir, rm, writeFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, join } from 'node:path';\n\nimport type { StartAtLoginManager } from '../core/types.js';\n\nconst LABEL = 'dev.agent-usage.daemon';\n\nexport interface MacOsStartAtLoginManagerOptions {\n userHome: string;\n executable: string;\n cliPath: string;\n applicationHome: string;\n label?: string;\n nodeImport?: string;\n environmentVariables?: Record<string, string>;\n}\n\nexport class MacOsStartAtLoginManager implements StartAtLoginManager {\n readonly #path: string;\n readonly #options: MacOsStartAtLoginManagerOptions;\n\n constructor(options: MacOsStartAtLoginManagerOptions) {\n const label = validateLaunchAgentLabel(options.label ?? LABEL);\n if (options.nodeImport) validateNodeImport(options.nodeImport);\n this.#options = { ...options, label };\n this.#path = join(options.userHome, 'Library', 'LaunchAgents', `${label}.plist`);\n }\n\n async setEnabled(enabled: boolean): Promise<void> {\n if (!enabled) {\n await rm(this.#path, { force: true });\n return;\n }\n await mkdir(dirname(this.#path), { recursive: true, mode: 0o700 });\n await writeFile(this.#path, launchAgentPlist(this.#options), { mode: 0o600 });\n }\n\n async isEnabled(): Promise<boolean> {\n try {\n const { access } = await import('node:fs/promises');\n await access(this.#path);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nfunction launchAgentPlist(options: MacOsStartAtLoginManagerOptions): string {\n const label = options.label ?? LABEL;\n const arguments_ = [\n options.executable,\n ...(options.nodeImport ? ['--import', options.nodeImport] : []),\n options.cliPath,\n '--home',\n options.applicationHome,\n 'serve'\n ];\n const environmentVariables = Object.entries(options.environmentVariables ?? {});\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\"><dict>\n<key>Label</key><string>${escapeXml(label)}</string>\n<key>ProgramArguments</key><array>${arguments_.map((value) => `<string>${escapeXml(value)}</string>`).join('')}</array>\n${environmentVariables.length > 0 ? `<key>EnvironmentVariables</key><dict>${environmentVariables.map(([key, value]) => `<key>${escapeXml(key)}</key><string>${escapeXml(value)}</string>`).join('')}</dict>\\n` : ''}<key>RunAtLoad</key><true/>\n<key>KeepAlive</key><false/>\n</dict></plist>\\n`;\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\nfunction validateLaunchAgentLabel(label: string): string {\n if (!/^[A-Za-z0-9.-]+$/.test(label)) {\n throw new Error('LaunchAgent label may contain only letters, numbers, dots, and hyphens');\n }\n return label;\n}\n\nfunction validateNodeImport(nodeImport: string): void {\n if (isAbsolute(nodeImport)) return;\n try {\n if (new URL(nodeImport).protocol === 'file:') return;\n } catch {\n // Fall through to the actionable validation error.\n }\n throw new Error('Node import must be an absolute path or file URL');\n}\n","import { parse } from 'protobufjs';\n\nconst schema = parse(`\n syntax = \"proto3\";\n package agentusage.otlp;\n\n message ExportMetricsServiceRequest {\n repeated ResourceMetrics resource_metrics = 1;\n }\n\n message ResourceMetrics {\n Resource resource = 1;\n repeated ScopeMetrics scope_metrics = 2;\n string schema_url = 3;\n }\n\n message Resource {\n repeated KeyValue attributes = 1;\n uint32 dropped_attributes_count = 2;\n }\n\n message ScopeMetrics {\n InstrumentationScope scope = 1;\n repeated Metric metrics = 2;\n string schema_url = 3;\n }\n\n message InstrumentationScope {\n string name = 1;\n string version = 2;\n repeated KeyValue attributes = 3;\n uint32 dropped_attributes_count = 4;\n }\n\n message Metric {\n string name = 1;\n string description = 2;\n string unit = 3;\n oneof data {\n Sum sum = 7;\n }\n }\n\n message Sum {\n repeated NumberDataPoint data_points = 1;\n AggregationTemporality aggregation_temporality = 2;\n bool is_monotonic = 3;\n }\n\n enum AggregationTemporality {\n AGGREGATION_TEMPORALITY_UNSPECIFIED = 0;\n AGGREGATION_TEMPORALITY_DELTA = 1;\n AGGREGATION_TEMPORALITY_CUMULATIVE = 2;\n }\n\n message NumberDataPoint {\n repeated KeyValue attributes = 7;\n fixed64 start_time_unix_nano = 2;\n fixed64 time_unix_nano = 3;\n oneof value {\n double as_double = 4;\n sfixed64 as_int = 6;\n }\n uint32 flags = 8;\n }\n\n message KeyValue {\n string key = 1;\n AnyValue value = 2;\n }\n\n message AnyValue {\n oneof value {\n string string_value = 1;\n bool bool_value = 2;\n int64 int_value = 3;\n double double_value = 4;\n bytes bytes_value = 7;\n }\n }\n`).root;\n\nconst exportRequest = schema.lookupType('agentusage.otlp.ExportMetricsServiceRequest');\n\nexport function decodeOtlpMetricsProtobuf(payload: Uint8Array): unknown {\n const decoded = exportRequest.decode(payload);\n return exportRequest.toObject(decoded, {\n longs: String,\n enums: String,\n bytes: String,\n defaults: false,\n oneofs: false\n });\n}\n\nexport function encodeOtlpMetricsProtobuf(payload: object): Uint8Array {\n const message = exportRequest.fromObject(payload);\n const verificationError = exportRequest.verify(message);\n if (verificationError) throw new Error(`Invalid OTLP metrics fixture: ${verificationError}`);\n return exportRequest.encode(message).finish();\n}\n","import { createReadStream, existsSync, statSync } from 'node:fs';\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { extname, join, normalize, resolve } from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport { z } from 'zod';\n\nimport type { UsageApplication } from '../core/usage-application.js';\nimport { publicErrorMessage } from '../core/redaction.js';\nimport { decodeOtlpMetricsProtobuf } from './otlp-protobuf.js';\n\nconst SESSION_COOKIE = 'agent_usage_session';\nconst connectorActionSchema = z.discriminatedUnion('action', [\n z.object({ action: z.literal('connect'), secret: z.string().min(1).max(16_384).optional() }),\n z.object({ action: z.literal('skip') }),\n z.object({ action: z.literal('retry') })\n]);\nconst usageQuerySchema = z.object({\n window: z.enum(['24h', '7d', '30d']).default('24h'),\n timeZone: z.string().min(1).max(100).optional(),\n comparisonCurrency: z\n .string()\n .regex(/^[A-Za-z]{3}$/)\n .default('CNY')\n});\nconst monitoringSettingsSchema = z\n .object({\n backgroundCollectionEnabled: z.boolean().optional(),\n intervalMinutes: z.number().int().min(1).max(1_440).optional(),\n notificationsEnabled: z.boolean().optional(),\n startAtLogin: z.boolean().optional()\n })\n .refine((value) => Object.keys(value).length > 0, 'At least one setting is required');\nconst planSubscriptionSchema = z.object({\n providerId: z.string().min(1),\n billingDomainId: z.string().min(1),\n plan: z\n .object({\n planId: z.string().min(1).nullable(),\n amount: z.number().positive().finite().optional(),\n currency: z.string().length(3).optional(),\n billingPeriod: z.enum(['monthly', 'annual']).optional(),\n anchorDate: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/)\n .nullable()\n .optional()\n })\n .nullable()\n});\nconst customModelRateSchema = z.object({\n id: z.string().optional(),\n providerId: z.string().min(1),\n billingDomainId: z.string().nullable().optional(),\n model: z.string().min(1),\n inputRate: z.number().nonnegative(),\n outputRate: z.number().nonnegative(),\n cacheReadRate: z.number().nonnegative().optional()\n});\nconst clearDataSchema = z.object({ deleteProductSecrets: z.boolean().default(false) });\nconst hardRebuildSchema = z.object({ confirmExpensiveOperation: z.literal(true) });\n\nexport interface LocalServerOptions {\n application: UsageApplication;\n host?: '127.0.0.1' | '::1';\n port?: number;\n launchToken?: string;\n apiToken?: string;\n staticDirectory?: string;\n}\n\nexport interface LocalServer {\n host: string;\n port: number;\n origin: string;\n apiToken: string;\n createLaunchUrl(): string;\n close(): Promise<void>;\n}\n\nexport async function startLocalServer(options: LocalServerOptions): Promise<LocalServer> {\n const host = options.host ?? '127.0.0.1';\n const launchTokens = new Set([options.launchToken ?? secureToken()]);\n const browserSessions = new Set<string>();\n const apiToken = options.apiToken ?? secureToken();\n let origin = '';\n\n const server = createServer(async (request, response) => {\n try {\n const requestUrl = new URL(request.url ?? '/', origin || `http://${host}`);\n\n if (request.method === 'GET' && requestUrl.pathname === '/launch') {\n const token = requestUrl.searchParams.get('token');\n if (!token || !launchTokens.delete(token)) {\n sendText(response, 403, 'Invalid or expired launch token');\n return;\n }\n const session = secureToken();\n browserSessions.add(session);\n response.writeHead(303, {\n location: '/',\n 'set-cookie': `${SESSION_COOKIE}=${session}; Path=/; HttpOnly; SameSite=Strict`\n });\n response.end();\n return;\n }\n\n const authentication = authenticate(request, apiToken, browserSessions);\n if (requestUrl.pathname.startsWith('/api/') && authentication === 'none') {\n sendJson(response, 401, { error: 'unauthorized' });\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/health') {\n response.writeHead(204, { 'cache-control': 'no-store' });\n response.end();\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/processing') {\n sendJson(response, 200, options.application.getProcessingStatus());\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/rebuild') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = hardRebuildSchema.safeParse(await readJsonBody(request));\n if (!input.success) {\n sendJson(response, 400, { error: 'explicit-confirmation-required' });\n return;\n }\n void options.application.startHardRebuild();\n sendJson(response, 202, { accepted: true });\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/v1/metrics') {\n if (authentication !== 'api-token') {\n sendJson(response, 401, { error: 'api-token-required' });\n return;\n }\n await options.application.ingestTelemetry(\n 'claude-code',\n await readJsonBody(request, 1_000_000)\n );\n sendJson(response, 200, { partialSuccess: {} });\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/grok/v1/metrics') {\n if (authentication !== 'api-token') {\n sendJson(response, 401, { error: 'api-token-required' });\n return;\n }\n const body = await readBody(request, 1_000_000);\n const contentType = request.headers['content-type'] ?? '';\n const payload = contentType.includes('application/json')\n ? JSON.parse(body.toString('utf8'))\n : decodeOtlpMetricsProtobuf(body);\n await options.application.ingestTelemetry('grok', payload);\n sendOtlpProtobuf(response, 200);\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/overview/providers') {\n sendJson(response, 200, await options.application.getAgentProviderIndex());\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname.startsWith('/api/overview/providers/')) {\n const providerId = decodeURIComponent(\n requestUrl.pathname.slice('/api/overview/providers/'.length)\n );\n const provider = await options.application.getProviderOverview(\n providerId,\n parseUsageQuery(requestUrl)\n );\n if (!provider) {\n sendJson(response, 404, { error: 'provider-not-found' });\n return;\n }\n sendJson(response, 200, provider);\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/overview') {\n const query = parseUsageQuery(requestUrl);\n sendJson(response, 200, await options.application.getOverview(query));\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/refresh') {\n if (authentication === 'browser' && request.headers.origin !== origin) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n if (requestUrl.searchParams.get('background') === 'true') {\n void options.application.startBackgroundProcessing({\n userInitiated: requestUrl.searchParams.get('mode') !== 'automatic'\n });\n sendJson(response, 202, { accepted: true });\n return;\n }\n await options.application.refresh({\n userInitiated: requestUrl.searchParams.get('mode') !== 'automatic'\n });\n response.writeHead(204);\n response.end();\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/connectors') {\n sendJson(response, 200, await options.application.getConnectorStatuses());\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/doctor') {\n sendJson(response, 200, await options.application.getDiagnostics());\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/export') {\n const query = parseUsageQuery(requestUrl);\n const format = z.enum(['json', 'csv']).parse(requestUrl.searchParams.get('format'));\n const artifact = await options.application.exportUsage({\n ...query,\n format,\n includeAccountIdentifiers:\n requestUrl.searchParams.get('includeAccountIdentifiers') === 'true'\n });\n response.writeHead(200, {\n 'content-type': artifact.contentType,\n 'content-disposition': `attachment; filename=\"${artifact.filename}\"`,\n 'cache-control': 'no-store'\n });\n response.end(artifact.body);\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/retention') {\n sendJson(response, 200, await options.application.getRetentionStatus());\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/retention/compact') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n sendJson(response, 200, await options.application.compactRetention());\n return;\n }\n\n if (request.method === 'DELETE' && requestUrl.pathname === '/api/data') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = clearDataSchema.parse(await readJsonBody(request));\n sendJson(response, 200, await options.application.clearData(input));\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/plans') {\n sendJson(response, 200, await options.application.getPlanSettings());\n return;\n }\n\n if (request.method === 'PATCH' && requestUrl.pathname === '/api/plans') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = planSubscriptionSchema.parse(await readJsonBody(request));\n sendJson(response, 200, await options.application.updatePlanSubscription(input));\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/custom-rates') {\n const rates = await options.application.getCustomModelRates();\n sendJson(response, 200, { rates });\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname.startsWith('/api/custom-rates/')) {\n const id = decodeURIComponent(requestUrl.pathname.slice('/api/custom-rates/'.length));\n const rate = await options.application.getCustomModelRate(id);\n if (!rate) {\n sendJson(response, 404, { error: 'rate-not-found' });\n return;\n }\n sendJson(response, 200, { rate });\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/custom-rates') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = customModelRateSchema.parse(await readJsonBody(request));\n const rate = await options.application.setCustomModelRate(input);\n sendJson(response, 200, { rate });\n return;\n }\n\n if (\n (request.method === 'PUT' || request.method === 'PATCH') &&\n requestUrl.pathname.startsWith('/api/custom-rates/')\n ) {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const id = decodeURIComponent(requestUrl.pathname.slice('/api/custom-rates/'.length));\n const body = (await readJsonBody(request)) as Record<string, unknown>;\n const input = customModelRateSchema.parse({ ...body, id });\n const rate = await options.application.setCustomModelRate(input);\n sendJson(response, 200, { rate });\n return;\n }\n\n if (request.method === 'DELETE' && requestUrl.pathname.startsWith('/api/custom-rates/')) {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const id = decodeURIComponent(requestUrl.pathname.slice('/api/custom-rates/'.length));\n const deleted = await options.application.deleteCustomModelRate(id);\n sendJson(response, 200, { deleted });\n return;\n }\n\n if (request.method === 'GET' && requestUrl.pathname === '/api/monitoring') {\n sendJson(response, 200, await options.application.getMonitoringStatus());\n return;\n }\n\n if (request.method === 'PATCH' && requestUrl.pathname === '/api/monitoring/settings') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const changes = monitoringSettingsSchema.parse(await readJsonBody(request));\n sendJson(response, 200, await options.application.updateMonitoringSettings(changes));\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/connectors/discover') {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n sendJson(response, 200, await options.application.discoverConnectors());\n return;\n }\n\n const connectorActionMatch = requestUrl.pathname.match(\n /^\\/api\\/connectors\\/([^/]+)\\/action$/\n );\n if (request.method === 'POST' && connectorActionMatch) {\n if (!validMutationOrigin(authentication, request, origin)) {\n sendJson(response, 403, { error: 'invalid-origin' });\n return;\n }\n const input = connectorActionSchema.parse(await readJsonBody(request));\n sendJson(\n response,\n 200,\n await options.application.configureConnector(\n decodeURIComponent(connectorActionMatch[1]),\n input\n )\n );\n return;\n }\n\n if (request.method === 'POST' && requestUrl.pathname === '/api/launch-token') {\n if (authentication !== 'api-token') {\n sendJson(response, 403, { error: 'api-token-required' });\n return;\n }\n const token = secureToken();\n launchTokens.add(token);\n sendJson(response, 200, { url: `${origin}/launch?token=${encodeURIComponent(token)}` });\n return;\n }\n\n if (request.method === 'GET') {\n await serveStatic(response, requestUrl.pathname, options.staticDirectory);\n return;\n }\n\n sendJson(response, 404, { error: 'not-found' });\n } catch (error) {\n respondWithFailure(response, error);\n }\n });\n\n await new Promise<void>((resolveListening, reject) => {\n server.once('error', reject);\n server.listen(options.port ?? 0, host, () => {\n server.off('error', reject);\n resolveListening();\n });\n });\n\n const address = server.address();\n if (!address || typeof address === 'string') {\n await new Promise<void>((resolveClose) => server.close(() => resolveClose()));\n throw new Error('Local server did not expose a TCP address');\n }\n const port = address.port;\n origin = `http://${host}:${port}`;\n\n return {\n host,\n port,\n origin,\n apiToken,\n createLaunchUrl() {\n const token = secureToken();\n launchTokens.add(token);\n return `${origin}/launch?token=${encodeURIComponent(token)}`;\n },\n async close() {\n if (!server.listening) return;\n await new Promise<void>((resolveClose, reject) => {\n server.close((error) => (error ? reject(error) : resolveClose()));\n });\n }\n };\n}\n\ntype Authentication = 'none' | 'browser' | 'api-token';\n\nfunction parseUsageQuery(requestUrl: URL) {\n return usageQuerySchema.parse({\n window: requestUrl.searchParams.get('window') ?? undefined,\n timeZone: requestUrl.searchParams.get('timeZone') ?? undefined,\n comparisonCurrency: requestUrl.searchParams.get('currency') ?? undefined\n });\n}\n\nfunction authenticate(\n request: IncomingMessage,\n apiToken: string,\n browserSessions: Set<string>\n): Authentication {\n if (request.headers.authorization === `Bearer ${apiToken}`) return 'api-token';\n const cookies = parseCookies(request.headers.cookie);\n const session = cookies.get(SESSION_COOKIE);\n return session && browserSessions.has(session) ? 'browser' : 'none';\n}\n\nfunction validMutationOrigin(\n authentication: Authentication,\n request: IncomingMessage,\n origin: string\n): boolean {\n return authentication === 'api-token' || request.headers.origin === origin;\n}\n\nasync function readJsonBody(request: IncomingMessage, maximumBytes = 20_000): Promise<unknown> {\n return JSON.parse((await readBody(request, maximumBytes)).toString('utf8'));\n}\n\nasync function readBody(request: IncomingMessage, maximumBytes: number): Promise<Buffer> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n if (size > maximumBytes) throw new Error('Request body is too large');\n chunks.push(buffer);\n }\n return Buffer.concat(chunks);\n}\n\nfunction parseCookies(header: string | undefined): Map<string, string> {\n const result = new Map<string, string>();\n for (const part of header?.split(';') ?? []) {\n const separator = part.indexOf('=');\n if (separator === -1) continue;\n result.set(part.slice(0, separator).trim(), part.slice(separator + 1).trim());\n }\n return result;\n}\n\nasync function serveStatic(\n response: ServerResponse,\n pathname: string,\n staticDirectory: string | undefined\n): Promise<void> {\n if (!staticDirectory) {\n sendHtml(\n response,\n 200,\n '<!doctype html><html><head><title>Agent Usage</title></head><body><main id=\"app\">Agent Usage</main></body></html>'\n );\n return;\n }\n\n const root = resolve(staticDirectory);\n const requested = pathname === '/' ? 'index.html' : pathname.replace(/^\\/+/, '');\n const normalized = normalize(requested);\n const candidate = resolve(join(root, normalized));\n const indexFile = join(root, 'index.html');\n const file =\n candidate.startsWith(`${root}/`) && existsSync(candidate) && statSync(candidate).isFile()\n ? candidate\n : indexFile;\n\n if (!existsSync(file)) {\n sendText(response, 404, 'Dashboard assets are not built');\n return;\n }\n const extension = extname(file);\n response.writeHead(200, {\n 'content-type': contentType(extension),\n 'cache-control': extension === '.html' ? 'no-store' : 'public, max-age=31536000, immutable'\n });\n createReadStream(file).pipe(response);\n}\n\nfunction contentType(extension: string): string {\n switch (extension) {\n case '.html':\n return 'text/html; charset=utf-8';\n case '.js':\n return 'text/javascript; charset=utf-8';\n case '.css':\n return 'text/css; charset=utf-8';\n case '.svg':\n return 'image/svg+xml';\n case '.json':\n return 'application/json; charset=utf-8';\n default:\n return 'application/octet-stream';\n }\n}\n\nfunction secureToken(): string {\n return randomBytes(32).toString('base64url');\n}\n\n// The body is encoded before the first byte of the response is written. A payload that\n// cannot be encoded then fails while the failure path can still answer with a status,\n// instead of leaving a started response that only accepts an unrecoverable second write.\nfunction sendJson(response: ServerResponse, status: number, body: unknown): void {\n const payload = JSON.stringify(body);\n response.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'cache-control': 'no-store'\n });\n response.end(payload);\n}\n\n// A request must never end the daemon. Once a response has started, its status is already\n// on the wire and a second write throws, so the only remaining signal is an aborted body.\nfunction respondWithFailure(response: ServerResponse, error: unknown): void {\n const message = publicErrorMessage(error);\n if (response.headersSent || response.writableEnded) {\n process.stderr.write(`Agent Usage: a started response failed to finish: ${message}\\n`);\n response.destroy();\n return;\n }\n try {\n sendJson(response, 500, { error: 'internal-error', message });\n } catch {\n process.stderr.write(`Agent Usage: a request failed without a reportable reason.\\n`);\n response.destroy();\n }\n}\n\nfunction sendOtlpProtobuf(response: ServerResponse, status: number): void {\n response.writeHead(status, {\n 'content-type': 'application/x-protobuf',\n 'cache-control': 'no-store'\n });\n response.end(Buffer.alloc(0));\n}\n\nfunction sendText(response: ServerResponse, status: number, body: string): void {\n response.writeHead(status, { 'content-type': 'text/plain; charset=utf-8' });\n response.end(body);\n}\n\nfunction sendHtml(response: ServerResponse, status: number, body: string): void {\n response.writeHead(status, { 'content-type': 'text/html; charset=utf-8' });\n response.end(body);\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport { delimiter, isAbsolute, join, resolve } from 'node:path';\n\nimport type {\n ConnectorDefinition,\n DiscoveryInspection,\n DiscoveryProbe\n} from '../core/onboarding-types.js';\n\nexport interface PathDiscoveryProbeOptions {\n path?: string;\n home?: string;\n}\n\nexport class PathDiscoveryProbe implements DiscoveryProbe {\n readonly #path: string;\n readonly #home: string;\n\n constructor(options: PathDiscoveryProbeOptions = {}) {\n this.#path = options.path ?? process.env.PATH ?? '';\n this.#home = options.home ?? process.env.HOME ?? '';\n }\n\n async inspect(definition: ConnectorDefinition): Promise<DiscoveryInspection> {\n const binaryPath = definition.command ? await this.#findExecutable(definition.command) : null;\n const officialCredentialPresent = await anyPathExists(\n (definition.officialCredentialPaths ?? []).map((path) =>\n isAbsolute(path) ? path : resolve(this.#home, path)\n )\n );\n return {\n installed: definition.command === null || binaryPath !== null,\n binaryPath,\n officialCredentialPresent\n };\n }\n\n async #findExecutable(command: string): Promise<string | null> {\n if (command.includes('/')) return (await isExecutable(command)) ? resolve(command) : null;\n for (const directory of this.#path.split(delimiter).filter(Boolean)) {\n const candidate = join(directory, command);\n if (await isExecutable(candidate)) return candidate;\n }\n return null;\n }\n}\n\nasync function isExecutable(path: string): Promise<boolean> {\n try {\n await access(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function anyPathExists(paths: string[]): Promise<boolean> {\n for (const path of paths) {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n // Existence checks intentionally do not open or read official credential files.\n }\n }\n return false;\n}\n","import { mkdirSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname } from 'node:path';\nimport type { DatabaseSync as DatabaseSyncType } from 'node:sqlite';\nimport { Worker } from 'node:worker_threads';\n\nimport type {\n AgentProviderIndex,\n BalanceRecord,\n BillingHistory,\n BillingDomainOverview,\n ConnectorDiagnostic,\n ConnectorRuntimeState,\n ConnectorSnapshot,\n CoverageLevel,\n CostRecord,\n CustomModelRate,\n DataAuthority,\n ExchangeRateSnapshot,\n HistoryCost,\n HistoryModelObservation,\n HistoryModelPriceEvidence,\n HistoryWindow,\n MonitoringSettings,\n PlanBillingPeriod,\n PlanPriceSource,\n PlanSubscription,\n PriceSnapshotReference,\n ProviderOverview,\n QuotaBucket,\n QuotaForecast,\n RetailPriceLineItem,\n RetailPricingBackfillCursor,\n RetailPricingBackfillPage,\n RetentionStatus,\n TokenEvidence,\n TokenAggregationTemporality,\n TokenModelAttribution,\n TokenSemantics,\n TokenTimePrecision,\n TokenTotalDerivation,\n TokenTotals,\n TokenUsageScope,\n UsageOverview,\n UsageQuery,\n UsageRepository\n} from '../core/types.js';\nimport { normalizeTokenObservation } from '../core/token-normalization.js';\nimport { clampPercent } from '../core/quota-normalization.js';\nimport {\n billingPeriodContaining,\n buildWorkbenchPlanValue,\n type PlanBillingPeriodSummary,\n type PlanValueDomainInput\n} from '../core/plan-pricing.js';\nimport type { ConnectorStatusRecord, ConnectorSetupState } from '../core/onboarding-types.js';\n\nconst FRESHNESS_WINDOW_MS = 15 * 60 * 1000;\nconst QUERY_INDEXES_SQL = `\n CREATE INDEX IF NOT EXISTS usage_observed_at_idx\n ON usage_observations(observed_at);\n CREATE INDEX IF NOT EXISTS usage_provider_domain_time_idx\n ON usage_observations(provider_id, billing_domain_id, observed_at);\n CREATE INDEX IF NOT EXISTS usage_provider_time_id_idx\n ON usage_observations(provider_id, observed_at, id);\n CREATE INDEX IF NOT EXISTS usage_provider_model_time_idx\n ON usage_observations(provider_id, model, observed_at);\n CREATE INDEX IF NOT EXISTS cost_observed_at_idx\n ON cost_records(observed_at);\n CREATE INDEX IF NOT EXISTS cost_provider_domain_time_idx\n ON cost_records(provider_id, billing_domain_id, observed_at);\n CREATE INDEX IF NOT EXISTS cost_usage_observation_idx\n ON cost_records(provider_id, usage_observation_id);\n CREATE INDEX IF NOT EXISTS quota_provider_bucket_time_idx\n ON quota_observations(provider_id, bucket_id, observed_at);\n`;\nconst DELETE_DERIVED_RETAIL_COSTS_SQL = `\n DELETE FROM cost_records\n WHERE kind = 'retail-equivalent'\n AND usage_observation_id IS NOT NULL\n AND EXISTS (\n SELECT 1 FROM usage_observations usage\n WHERE usage.provider_id = cost_records.provider_id\n AND usage.id = cost_records.usage_observation_id\n )\n`;\nconst DELETE_DEMO_PROVIDER_DATA_SQL = `\n DELETE FROM connector_diagnostics WHERE provider_id = 'demo';\n DELETE FROM connector_runtime WHERE id = 'demo';\n DELETE FROM connector_settings WHERE id = 'demo';\n DELETE FROM providers WHERE id = 'demo';\n`;\nconst { DatabaseSync } = createRequire(import.meta.url)(\n 'node:sqlite'\n) as typeof import('node:sqlite');\n\ninterface DatabaseWorkerRequest {\n databasePath: string;\n operation: 'indexes' | 'delete-demo-data' | 'delete-derived-costs' | 'retention';\n indexesSql?: string;\n aggregateSql?: string;\n deleteDerivedCostsSql?: string;\n deleteDemoDataSql?: string;\n cutoff?: string;\n now?: string;\n}\n\nasync function runDatabaseWorker<T>(workerData: DatabaseWorkerRequest): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const worker = new Worker(\n `\n const { parentPort, workerData } = require('node:worker_threads');\n const { DatabaseSync } = require('node:sqlite');\n let database;\n try {\n database = new DatabaseSync(workerData.databasePath);\n database.exec('PRAGMA busy_timeout = 5000; PRAGMA foreign_keys = ON;');\n if (workerData.operation === 'indexes') {\n database.exec(workerData.indexesSql);\n parentPort.postMessage({ ok: true, data: null });\n } else if (workerData.operation === 'delete-demo-data') {\n database.exec('BEGIN IMMEDIATE');\n try {\n database.exec(workerData.deleteDemoDataSql);\n database.exec('COMMIT');\n parentPort.postMessage({ ok: true, data: null });\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n } else if (workerData.operation === 'delete-derived-costs') {\n database.prepare(workerData.deleteDerivedCostsSql).run();\n parentPort.postMessage({ ok: true, data: null });\n } else if (workerData.operation === 'retention') {\n database.exec(workerData.indexesSql);\n database.exec('BEGIN IMMEDIATE');\n try {\n database.prepare(workerData.aggregateSql).run(workerData.cutoff);\n database.prepare('DELETE FROM usage_observations WHERE observed_at < ?')\n .run(workerData.cutoff);\n database.prepare(\n 'INSERT INTO retention_state (id, last_compacted_at) VALUES (1, ?) ' +\n 'ON CONFLICT(id) DO UPDATE SET last_compacted_at = excluded.last_compacted_at'\n ).run(workerData.now);\n database.exec('COMMIT');\n } catch (error) {\n database.exec('ROLLBACK');\n throw error;\n }\n const raw = database.prepare(\n 'SELECT COUNT(*) AS count, MIN(observed_at) AS oldest FROM usage_observations'\n ).get();\n const aggregates = database.prepare(\n 'SELECT COUNT(*) AS count FROM daily_usage_aggregates'\n ).get();\n const state = database.prepare(\n 'SELECT last_compacted_at FROM retention_state WHERE id = 1'\n ).get();\n parentPort.postMessage({\n ok: true,\n data: {\n rawRetentionDays: 90,\n rawObservations: Number(raw.count),\n oldestRawObservedAt: raw.oldest,\n dailyAggregates: Number(aggregates.count),\n lastCompactedAt: state?.last_compacted_at ?? null\n }\n });\n }\n } catch (error) {\n parentPort.postMessage({\n ok: false,\n message: error instanceof Error ? error.message : String(error)\n });\n } finally {\n database?.close();\n }\n `,\n { eval: true, workerData }\n );\n worker.once('message', (message: { ok: boolean; data?: T; message?: string }) => {\n if (message.ok) resolve(message.data as T);\n else reject(new Error(message.message ?? 'SQLite background maintenance failed'));\n });\n worker.once('error', reject);\n });\n}\n\ninterface ProviderRow {\n id: string;\n display_name: string;\n last_success_at: string | null;\n last_error: string | null;\n last_error_code: string | null;\n last_recovery: string | null;\n}\n\nfunction additiveUsagePredicate(alias = ''): string {\n const prefix = alias ? `${alias}.` : '';\n // A Codex day the connector could reconcile is stored as both its official account-wide\n // total and the reconciled remainder that the local transcripts do not account for. The\n // transcripts plus that remainder already equal the official total, so the official row is\n // the one that steps aside. Days the connector could not reconcile carry no official row at\n // all, which is why matching the two ids is enough and no day arithmetic happens here.\n const codexReconciledRemainderIds = `(SELECT billing_domain_id, id\n FROM usage_observations\n WHERE provider_id = 'codex' AND id LIKE 'codex-transcript:account-remainder:%')`;\n return `NOT (\n ${prefix}aggregation_temporality = 'unknown'\n AND (\n (${prefix}provider_id = 'claude-code' AND ${prefix}id LIKE 'claude-otel:%')\n OR (\n ${prefix}provider_id = 'grok'\n AND (${prefix}id LIKE 'grok-otel:%' OR ${prefix}id LIKE 'grok-headless:%')\n )\n )\n OR (\n ${prefix}provider_id = 'codex'\n AND ${prefix}id LIKE 'codex:daily:%'\n AND (\n ${prefix}billing_domain_id,\n 'codex-transcript:account-remainder:' || substr(${prefix}id, 13)\n ) IN ${codexReconciledRemainderIds}\n )\n )`;\n}\n\nconst RETENTION_AGGREGATE_SQL = `\n INSERT INTO daily_usage_aggregates (\n provider_id, billing_domain_id, day_utc, model, authority,\n total_tokens, input_tokens, output_tokens, reasoning_tokens,\n cache_read_tokens, cache_write_tokens, source_count\n )\n SELECT provider_id, billing_domain_id, substr(observed_at, 1, 10), model, authority,\n SUM(total_tokens), SUM(input_tokens), SUM(output_tokens), SUM(reasoning_tokens),\n SUM(cache_read_tokens), SUM(cache_write_tokens), COUNT(*)\n FROM usage_observations\n WHERE observed_at < ? AND ${additiveUsagePredicate()}\n GROUP BY provider_id, billing_domain_id, substr(observed_at, 1, 10), model, authority\n ON CONFLICT(provider_id, billing_domain_id, day_utc, model, authority) DO UPDATE SET\n total_tokens = excluded.total_tokens,\n input_tokens = excluded.input_tokens,\n output_tokens = excluded.output_tokens,\n reasoning_tokens = excluded.reasoning_tokens,\n cache_read_tokens = excluded.cache_read_tokens,\n cache_write_tokens = excluded.cache_write_tokens,\n source_count = excluded.source_count\n`;\n\ninterface QuotaRow {\n id: string;\n billing_domain_id: string;\n label: string;\n used_percent: number | null;\n window_duration_minutes: number | null;\n resets_at: string | null;\n authority: DataAuthority;\n observed_at: string;\n scope: QuotaBucket['scope'] | null;\n status: string | null;\n limit_amount: number | null;\n limit_currency: string | null;\n fallback_status: QuotaBucket['fallbackStatus'] | null;\n}\n\ninterface QuotaObservationRow {\n bucket_id: string;\n billing_domain_id: string;\n label: string;\n used_percent: number;\n resets_at: string | null;\n observed_at: string;\n}\n\ninterface TokenRow {\n total_tokens: number | null;\n input_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n cache_read_tokens: number | null;\n cache_write_tokens: number | null;\n observation_count: number;\n source_reported_tokens: number | null;\n source_reported_observation_count: number;\n unclassified_tokens: number | null;\n total_derivations: string | null;\n time_precisions: string | null;\n usage_scopes: string | null;\n aggregation_temporalities: string | null;\n authorities: string | null;\n}\n\ninterface BillingDomainRow {\n id: string;\n display_name: string;\n last_success_at: string | null;\n}\n\ninterface CostRow {\n id: string;\n source_id: string | null;\n billing_domain_id: string;\n observed_at: string;\n kind: CostRecord['kind'];\n amount: number | null;\n currency: string;\n authority: DataAuthority;\n price_snapshot_id: string | null;\n price_snapshot_version: string | null;\n price_snapshot_source: string | null;\n price_snapshot_canonical_model: string | null;\n price_snapshot_effective_at: string | null;\n price_snapshot_effective_until: string | null;\n price_snapshot_currency: string | null;\n price_snapshot_rates_json: string | null;\n price_snapshot_source_url: string | null;\n price_snapshot_context_tier: string | null;\n model: string | null;\n usage_observation_id: string | null;\n priced_tokens: number | null;\n line_items_json: string | null;\n calculated_at: string | null;\n}\n\ninterface UsageHistoryRow {\n id: string;\n model: string;\n observed_at: string;\n authority: DataAuthority;\n total_tokens: number;\n input_tokens: number;\n output_tokens: number;\n reasoning_tokens: number;\n cache_read_tokens: number;\n cache_write_tokens: number;\n cache_write_5m_tokens: number | null;\n cache_write_1h_tokens: number | null;\n source_reported_total_tokens: number | null;\n unclassified_tokens: number;\n total_derivation: TokenTotalDerivation;\n model_attribution: TokenModelAttribution;\n time_precision: TokenTimePrecision;\n usage_scope: TokenUsageScope;\n aggregation_temporality: TokenAggregationTemporality;\n reasoning_semantics: TokenSemantics['reasoning'];\n cache_read_semantics: TokenSemantics['cacheRead'];\n cache_write_semantics: TokenSemantics['cacheWrite'];\n}\n\ninterface PricingBackfillRow extends UsageHistoryRow {\n provider_id: string;\n provider_display_name: string;\n id: string;\n billing_domain_id: string;\n billing_domain_display_name: string;\n session_id: string | null;\n reasoning_semantics: TokenSemantics['reasoning'];\n cache_read_semantics: TokenSemantics['cacheRead'];\n cache_write_semantics: TokenSemantics['cacheWrite'];\n}\n\nfunction pricingBackfillSnapshots(rows: PricingBackfillRow[]): ConnectorSnapshot[] {\n const snapshots = new Map<string, ConnectorSnapshot>();\n for (const row of rows) {\n const snapshot = snapshots.get(row.provider_id) ?? {\n provider: { id: row.provider_id, displayName: row.provider_display_name },\n billingDomains: [],\n quotaBuckets: [],\n usage: [],\n costs: [],\n observedAt: row.observed_at\n };\n if (!snapshot.billingDomains.some((domain) => domain.id === row.billing_domain_id)) {\n snapshot.billingDomains.push({\n id: row.billing_domain_id,\n displayName: row.billing_domain_display_name\n });\n }\n snapshot.usage.push({\n id: row.id,\n billingDomainId: row.billing_domain_id,\n model: row.model_attribution === 'known' ? row.model : null,\n sessionId: row.session_id,\n observedAt: row.observed_at,\n inputTokens: Number(row.input_tokens),\n outputTokens: Number(row.output_tokens),\n reasoningTokens: Number(row.reasoning_tokens),\n cacheReadTokens: Number(row.cache_read_tokens),\n cacheWriteTokens: Number(row.cache_write_tokens),\n cacheWriteTokenBreakdown:\n row.cache_write_5m_tokens === null || row.cache_write_1h_tokens === null\n ? null\n : {\n fiveMinute: Number(row.cache_write_5m_tokens),\n oneHour: Number(row.cache_write_1h_tokens)\n },\n sourceReportedTotalTokens:\n row.source_reported_total_tokens === null ? null : Number(row.source_reported_total_tokens),\n reconciledRemainderTokens:\n row.total_derivation === 'reconciled-remainder' ? Number(row.total_tokens) : null,\n tokenSemantics: {\n reasoning: row.reasoning_semantics,\n cacheRead: row.cache_read_semantics,\n cacheWrite: row.cache_write_semantics\n },\n modelAttribution: row.model_attribution,\n timePrecision: row.time_precision,\n usageScope: row.usage_scope,\n aggregationTemporality: row.aggregation_temporality,\n authority: row.authority\n });\n if (row.observed_at > snapshot.observedAt) snapshot.observedAt = row.observed_at;\n snapshots.set(row.provider_id, snapshot);\n }\n return [...snapshots.values()];\n}\n\ninterface MutableTokenEvidence {\n recordedTokens: number;\n sourceReportedTokens: number;\n sourceReportedObservationCount: number;\n observationCount: number;\n unclassifiedTokens: number;\n totalDerivations: Set<TokenTotalDerivation>;\n timePrecisions: Set<TokenTimePrecision>;\n usageScopes: Set<TokenUsageScope>;\n aggregationTemporalities: Set<TokenAggregationTemporality>;\n}\n\ninterface ExchangeRateRow {\n id: string;\n base_currency: string;\n quote_currency: string;\n rate: number;\n observed_at: string;\n source: string;\n}\n\ninterface BalanceRow {\n id: string;\n source_id: string | null;\n billing_domain_id: string;\n observed_at: string;\n kind: BalanceRecord['kind'];\n amount: number | null;\n currency: string;\n authority: DataAuthority;\n}\n\ninterface InvoiceRow {\n id: string;\n billing_domain_id: string;\n created_at: string;\n number: string | null;\n status: string | null;\n amount: number | null;\n currency: string;\n authority: DataAuthority;\n}\n\ninterface ConnectorStatusRow {\n id: string;\n state: ConnectorSetupState;\n installed: number;\n binary_path: string | null;\n official_credential_present: number;\n error_code: string | null;\n last_discovered_at: string | null;\n secret_reference: string | null;\n}\n\ninterface ConnectorRuntimeRow {\n id: string;\n last_attempt_at: string | null;\n next_allowed_at: string | null;\n failure_count: number;\n outcome: ConnectorRuntimeState['outcome'];\n}\n\ninterface ConnectorDiagnosticRow {\n id: string;\n provider_id: string;\n billing_domain_id: string | null;\n status: ConnectorDiagnostic['status'];\n category: ConnectorDiagnostic['category'];\n message: string | null;\n recovery: string | null;\n affected_coverage: string;\n last_attempt_at: string;\n last_success_at: string | null;\n}\n\nexport class SqliteUsageRepository implements UsageRepository {\n readonly #database: DatabaseSyncType;\n readonly #databasePath: string;\n readonly #hideDemoProvider: boolean;\n\n constructor(databasePath: string, options: { hideDemoProvider?: boolean } = {}) {\n this.#databasePath = databasePath;\n this.#hideDemoProvider = options.hideDemoProvider ?? false;\n mkdirSync(dirname(databasePath), { recursive: true });\n this.#database = new DatabaseSync(databasePath);\n this.#database.exec('PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON;');\n this.#migrate();\n }\n\n saveSnapshot(snapshot: ConnectorSnapshot, options: { preserveFailure?: boolean } = {}): void {\n this.#database.exec('BEGIN IMMEDIATE');\n try {\n const providerSql = options.preserveFailure\n ? `INSERT INTO providers (\n id, display_name, account_identifier, last_success_at, last_error, last_error_code, last_recovery\n ) VALUES (?, ?, ?, ?, NULL, NULL, NULL)\n ON CONFLICT(id) DO UPDATE SET\n display_name = excluded.display_name,\n account_identifier = COALESCE(excluded.account_identifier, providers.account_identifier),\n last_success_at = excluded.last_success_at`\n : `INSERT INTO providers (\n id, display_name, account_identifier, last_success_at, last_error, last_error_code, last_recovery\n ) VALUES (?, ?, ?, ?, NULL, NULL, NULL)\n ON CONFLICT(id) DO UPDATE SET\n display_name = excluded.display_name,\n account_identifier = COALESCE(excluded.account_identifier, providers.account_identifier),\n last_success_at = excluded.last_success_at,\n last_error = NULL,\n last_error_code = NULL,\n last_recovery = NULL`;\n this.#database\n .prepare(providerSql)\n .run(\n snapshot.provider.id,\n snapshot.provider.displayName,\n snapshot.provider.accountIdentifier ?? null,\n snapshot.observedAt\n );\n\n const billingDomainStatement = this.#database.prepare(\n `INSERT INTO billing_domains (provider_id, id, display_name, last_success_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n display_name = excluded.display_name,\n last_success_at = excluded.last_success_at`\n );\n for (const billingDomain of snapshot.billingDomains) {\n billingDomainStatement.run(\n snapshot.provider.id,\n billingDomain.id,\n billingDomain.displayName,\n snapshot.observedAt\n );\n }\n\n const quotaStatement = this.#database.prepare(\n `INSERT INTO quota_buckets (\n provider_id, id, billing_domain_id, label, used_percent, window_duration_minutes,\n resets_at, authority, observed_at,\n scope, status, limit_amount, limit_currency, fallback_status\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n label = excluded.label,\n used_percent = excluded.used_percent,\n window_duration_minutes = excluded.window_duration_minutes,\n resets_at = excluded.resets_at,\n authority = excluded.authority,\n observed_at = excluded.observed_at,\n scope = excluded.scope,\n status = excluded.status,\n limit_amount = excluded.limit_amount,\n limit_currency = excluded.limit_currency,\n fallback_status = excluded.fallback_status`\n );\n // A collection that reports quota states the complete set of windows for the\n // billing domains it reports them for. Merging by bucket id instead left a\n // window the source had stopped reporting on the card forever, beside the\n // windows that replaced it. A collection reporting no quota at all changes\n // nothing, so a source that is briefly unreadable keeps its last windows.\n const reportedQuotaDomains = [\n ...new Set(snapshot.quotaBuckets.map((bucket) => bucket.billingDomainId))\n ];\n if (reportedQuotaDomains.length > 0) {\n const retiredQuotaStatement = this.#database.prepare(\n `DELETE FROM quota_buckets\n WHERE provider_id = ? AND billing_domain_id = ? AND id NOT IN (${snapshot.quotaBuckets\n .map(() => '?')\n .join(', ')})`\n );\n for (const billingDomainId of reportedQuotaDomains) {\n retiredQuotaStatement.run(\n snapshot.provider.id,\n billingDomainId,\n ...snapshot.quotaBuckets.map((bucket) => bucket.id)\n );\n }\n }\n for (const bucket of snapshot.quotaBuckets) {\n const clampedUsedPercent = clampPercent(bucket.usedPercent);\n quotaStatement.run(\n snapshot.provider.id,\n bucket.id,\n bucket.billingDomainId,\n bucket.label,\n clampedUsedPercent,\n bucket.windowDurationMinutes ?? null,\n bucket.resetsAt,\n bucket.authority,\n snapshot.observedAt,\n bucket.scope ?? null,\n bucket.status ?? null,\n bucket.limitAmount ?? null,\n bucket.limitCurrency ?? null,\n bucket.fallbackStatus ?? null\n );\n }\n const quotaObservationStatement = this.#database.prepare(\n `INSERT INTO quota_observations (\n provider_id, bucket_id, billing_domain_id, label, used_percent, resets_at,\n authority, observed_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, bucket_id, observed_at) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n label = excluded.label,\n used_percent = excluded.used_percent,\n resets_at = excluded.resets_at,\n authority = excluded.authority`\n );\n for (const bucket of snapshot.quotaBuckets) {\n const clampedUsedPercent = clampPercent(bucket.usedPercent);\n if (clampedUsedPercent === null) continue;\n quotaObservationStatement.run(\n snapshot.provider.id,\n bucket.id,\n bucket.billingDomainId,\n bucket.label,\n clampedUsedPercent,\n bucket.resetsAt,\n bucket.authority,\n snapshot.observedAt\n );\n }\n\n const usageReconciliation = snapshot.usageReconciliation;\n if (usageReconciliation) {\n const prefixes = [\n ...usageReconciliation.authoritativeIdPrefixes,\n ...usageReconciliation.retiredIdPrefixes\n ];\n if (prefixes.some((prefix) => prefix.length === 0)) {\n throw new Error('Usage reconciliation prefixes must not be empty.');\n }\n if (new Set(prefixes).size !== prefixes.length) {\n throw new Error('Usage reconciliation prefixes must be distinct.');\n }\n\n const storedUsageIdsStatement = this.#database.prepare(\n `SELECT id\n FROM usage_observations\n WHERE provider_id = ? AND substr(id, 1, length(?)) = ?`\n );\n const deleteUsageCostsStatement = this.#database.prepare(\n `DELETE FROM cost_records WHERE provider_id = ? AND usage_observation_id = ?`\n );\n const deleteUsageStatement = this.#database.prepare(\n `DELETE FROM usage_observations WHERE provider_id = ? AND id = ?`\n );\n const deleteStoredUsage = (prefix: string, keepIds: ReadonlySet<string>) => {\n const stored = storedUsageIdsStatement.all(\n snapshot.provider.id,\n prefix,\n prefix\n ) as unknown as Array<{ id: string }>;\n for (const { id } of stored) {\n if (keepIds.has(id)) continue;\n deleteUsageCostsStatement.run(snapshot.provider.id, id);\n deleteUsageStatement.run(snapshot.provider.id, id);\n }\n };\n\n for (const prefix of usageReconciliation.retiredIdPrefixes) {\n deleteStoredUsage(prefix, new Set());\n }\n for (const authoritativePrefix of usageReconciliation.authoritativeIdPrefixes) {\n const incomingAuthoritativeIds = new Set(\n snapshot.usage\n .map((observation) => observation.id)\n .filter((id) => id.startsWith(authoritativePrefix))\n );\n deleteStoredUsage(authoritativePrefix, incomingAuthoritativeIds);\n }\n }\n\n const usageStatement = this.#database.prepare(\n `INSERT INTO usage_observations (\n provider_id, id, billing_domain_id, model, session_id, observed_at,\n total_tokens, input_tokens, output_tokens, reasoning_tokens,\n cache_read_tokens, cache_write_tokens, cache_write_5m_tokens,\n cache_write_1h_tokens, authority,\n source_reported_total_tokens, unclassified_tokens, total_derivation,\n reasoning_semantics, cache_read_semantics, cache_write_semantics,\n model_attribution, time_precision, usage_scope, aggregation_temporality\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n model = excluded.model,\n session_id = excluded.session_id,\n observed_at = excluded.observed_at,\n total_tokens = excluded.total_tokens,\n input_tokens = excluded.input_tokens,\n output_tokens = excluded.output_tokens,\n reasoning_tokens = excluded.reasoning_tokens,\n cache_read_tokens = excluded.cache_read_tokens,\n cache_write_tokens = excluded.cache_write_tokens,\n cache_write_5m_tokens = excluded.cache_write_5m_tokens,\n cache_write_1h_tokens = excluded.cache_write_1h_tokens,\n authority = excluded.authority,\n source_reported_total_tokens = excluded.source_reported_total_tokens,\n unclassified_tokens = excluded.unclassified_tokens,\n total_derivation = excluded.total_derivation,\n reasoning_semantics = excluded.reasoning_semantics,\n cache_read_semantics = excluded.cache_read_semantics,\n cache_write_semantics = excluded.cache_write_semantics,\n model_attribution = excluded.model_attribution,\n time_precision = excluded.time_precision,\n usage_scope = excluded.usage_scope,\n aggregation_temporality = excluded.aggregation_temporality`\n );\n const existingPricedUsageStatement = this.#database.prepare(\n `SELECT billing_domain_id, model, observed_at, total_tokens, input_tokens, output_tokens,\n reasoning_tokens, cache_read_tokens, cache_write_tokens, cache_write_5m_tokens,\n cache_write_1h_tokens, unclassified_tokens,\n reasoning_semantics, cache_read_semantics, cache_write_semantics, model_attribution,\n time_precision, aggregation_temporality\n FROM usage_observations\n WHERE provider_id = ? AND id = ?`\n );\n const deleteDerivedCostsStatement = this.#database.prepare(\n `DELETE FROM cost_records\n WHERE provider_id = ? AND usage_observation_id = ? AND kind = 'retail-equivalent'`\n );\n for (const observation of snapshot.usage) {\n const normalized = normalizeTokenObservation(observation);\n const existing = existingPricedUsageStatement.get(snapshot.provider.id, normalized.id) as\n Record<string, unknown> | undefined;\n if (existing && pricingInputsChanged(existing, normalized)) {\n deleteDerivedCostsStatement.run(snapshot.provider.id, normalized.id);\n }\n usageStatement.run(\n snapshot.provider.id,\n normalized.id,\n normalized.billingDomainId,\n normalized.model?.trim() || '__unclassified__',\n normalized.sessionId ?? null,\n normalized.observedAt,\n normalized.recordedTokens,\n normalized.inputTokens,\n normalized.outputTokens,\n normalized.reasoningTokens,\n normalized.cacheReadTokens,\n normalized.cacheWriteTokens,\n normalized.cacheWriteTokenBreakdown?.fiveMinute ?? null,\n normalized.cacheWriteTokenBreakdown?.oneHour ?? null,\n normalized.authority,\n normalized.sourceReportedTotalTokens,\n normalized.unclassifiedTokens,\n normalized.totalDerivation,\n normalized.tokenSemantics.reasoning,\n normalized.tokenSemantics.cacheRead,\n normalized.tokenSemantics.cacheWrite,\n normalized.modelAttribution,\n normalized.timePrecision,\n normalized.usageScope,\n normalized.aggregationTemporality\n );\n }\n\n const costStatement = this.#database.prepare(\n `INSERT INTO cost_records (\n provider_id, id, source_id, billing_domain_id, observed_at, kind, amount, currency,\n authority, price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency, price_snapshot_rates_json,\n price_snapshot_source_url, price_snapshot_context_tier,\n model, usage_observation_id, priced_tokens,\n line_items_json, calculated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n source_id = excluded.source_id,\n billing_domain_id = excluded.billing_domain_id,\n observed_at = excluded.observed_at,\n kind = excluded.kind,\n amount = excluded.amount,\n currency = excluded.currency,\n authority = excluded.authority,\n price_snapshot_id = excluded.price_snapshot_id,\n price_snapshot_version = excluded.price_snapshot_version,\n price_snapshot_source = excluded.price_snapshot_source,\n price_snapshot_canonical_model = excluded.price_snapshot_canonical_model,\n price_snapshot_effective_at = excluded.price_snapshot_effective_at,\n price_snapshot_effective_until = excluded.price_snapshot_effective_until,\n price_snapshot_currency = excluded.price_snapshot_currency,\n price_snapshot_rates_json = excluded.price_snapshot_rates_json,\n price_snapshot_source_url = excluded.price_snapshot_source_url,\n price_snapshot_context_tier = excluded.price_snapshot_context_tier,\n model = excluded.model,\n usage_observation_id = excluded.usage_observation_id,\n priced_tokens = excluded.priced_tokens,\n line_items_json = excluded.line_items_json,\n calculated_at = excluded.calculated_at\n WHERE cost_records.kind <> 'retail-equivalent'`\n );\n for (const cost of snapshot.costs) {\n const persistedCost = normalizeCostForPersistence(cost);\n costStatement.run(\n snapshot.provider.id,\n persistedCost.id,\n persistedCost.sourceId ?? null,\n persistedCost.billingDomainId,\n persistedCost.observedAt,\n persistedCost.kind,\n persistedCost.amount,\n persistedCost.currency,\n persistedCost.authority,\n persistedCost.priceSnapshot?.id ?? null,\n persistedCost.priceSnapshot?.version ?? null,\n persistedCost.priceSnapshot?.source ?? null,\n persistedCost.priceSnapshot?.canonicalModel ?? null,\n persistedCost.priceSnapshot?.effectiveAt ?? null,\n persistedCost.priceSnapshot?.effectiveUntil ?? null,\n persistedCost.priceSnapshot?.currency ?? null,\n serializePriceRates(persistedCost.priceSnapshot),\n persistedCost.priceSnapshot?.sourceUrl ?? null,\n persistedCost.priceSnapshot?.contextTier ?? null,\n persistedCost.model ?? null,\n persistedCost.usageObservationId ?? null,\n persistedCost.pricedTokens ?? null,\n persistedCost.lineItems ? JSON.stringify(persistedCost.lineItems) : null,\n persistedCost.calculatedAt ?? null\n );\n }\n\n const balanceStatement = this.#database.prepare(\n `INSERT INTO balance_records (\n provider_id, id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n source_id = excluded.source_id,\n billing_domain_id = excluded.billing_domain_id,\n observed_at = excluded.observed_at,\n kind = excluded.kind,\n amount = excluded.amount,\n currency = excluded.currency,\n authority = excluded.authority`\n );\n for (const balance of snapshot.balances ?? []) {\n balanceStatement.run(\n snapshot.provider.id,\n balance.id,\n balance.sourceId ?? null,\n balance.billingDomainId,\n balance.observedAt,\n balance.kind,\n balance.amount,\n balance.currency,\n balance.authority\n );\n }\n\n const invoiceStatement = this.#database.prepare(\n `INSERT INTO invoice_records (\n provider_id, id, billing_domain_id, created_at, number, status, amount, currency, authority\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n created_at = excluded.created_at,\n number = excluded.number,\n status = excluded.status,\n amount = excluded.amount,\n currency = excluded.currency,\n authority = excluded.authority`\n );\n for (const invoice of snapshot.invoices ?? []) {\n invoiceStatement.run(\n snapshot.provider.id,\n invoice.id,\n invoice.billingDomainId,\n invoice.createdAt,\n invoice.number,\n invoice.status,\n invoice.amount,\n invoice.currency,\n invoice.authority\n );\n }\n\n this.#database.exec('COMMIT');\n } catch (error) {\n this.#database.exec('ROLLBACK');\n throw error;\n }\n }\n\n getRetailPricingBackfillSnapshots(): ConnectorSnapshot[] {\n const rows = this.#database\n .prepare(\n `SELECT u.provider_id, p.display_name AS provider_display_name,\n u.id, u.billing_domain_id, b.display_name AS billing_domain_display_name,\n u.model, u.session_id, u.observed_at, u.authority,\n u.total_tokens, u.input_tokens, u.output_tokens, u.reasoning_tokens,\n u.cache_read_tokens, u.cache_write_tokens, u.cache_write_5m_tokens,\n u.cache_write_1h_tokens, u.source_reported_total_tokens,\n u.unclassified_tokens, u.total_derivation, u.model_attribution,\n u.reasoning_semantics, u.cache_read_semantics, u.cache_write_semantics,\n u.time_precision, u.usage_scope, u.aggregation_temporality\n FROM usage_observations u\n JOIN providers p ON p.id = u.provider_id\n JOIN billing_domains b\n ON b.provider_id = u.provider_id AND b.id = u.billing_domain_id\n WHERE ${additiveUsagePredicate('u')}\n ORDER BY u.provider_id, u.observed_at, u.id`\n )\n .all() as unknown as PricingBackfillRow[];\n return pricingBackfillSnapshots(rows);\n }\n\n getRetailPricingBackfillPage(\n cursor: RetailPricingBackfillCursor | null,\n limit: number\n ): RetailPricingBackfillPage {\n const pageSize = Math.max(1, Math.min(1_000, Math.trunc(limit)));\n const cursorPredicate = cursor ? 'AND (u.provider_id, u.observed_at, u.id) > (?, ?, ?)' : '';\n const rows = this.#database\n .prepare(\n `SELECT u.provider_id, p.display_name AS provider_display_name,\n u.id, u.billing_domain_id, b.display_name AS billing_domain_display_name,\n u.model, u.session_id, u.observed_at, u.authority,\n u.total_tokens, u.input_tokens, u.output_tokens, u.reasoning_tokens,\n u.cache_read_tokens, u.cache_write_tokens, u.cache_write_5m_tokens,\n u.cache_write_1h_tokens, u.source_reported_total_tokens,\n u.unclassified_tokens, u.total_derivation, u.model_attribution,\n u.reasoning_semantics, u.cache_read_semantics, u.cache_write_semantics,\n u.time_precision, u.usage_scope, u.aggregation_temporality\n FROM usage_observations u\n JOIN providers p ON p.id = u.provider_id\n JOIN billing_domains b\n ON b.provider_id = u.provider_id AND b.id = u.billing_domain_id\n WHERE ${additiveUsagePredicate('u')}\n ${cursorPredicate}\n ORDER BY u.provider_id, u.observed_at, u.id\n LIMIT ?`\n )\n .all(\n ...(cursor ? [cursor.providerId, cursor.observedAt, cursor.observationId] : []),\n pageSize\n ) as unknown as PricingBackfillRow[];\n const last = rows.at(-1);\n return {\n snapshots: pricingBackfillSnapshots(rows),\n nextCursor:\n rows.length === pageSize && last\n ? {\n providerId: last.provider_id,\n observedAt: last.observed_at,\n observationId: last.id\n }\n : null\n };\n }\n\n saveDerivedCosts(providerId: string, costs: CostRecord[]): void {\n if (costs.length === 0) return;\n if (costs.some((cost) => cost.kind !== 'retail-equivalent')) {\n throw new Error('Only retail-equivalent costs can be saved through the derivation seam.');\n }\n const statement = this.#database.prepare(\n `INSERT INTO cost_records (\n provider_id, id, source_id, billing_domain_id, observed_at, kind, amount, currency,\n authority, price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency, price_snapshot_rates_json,\n price_snapshot_source_url, price_snapshot_context_tier,\n model, usage_observation_id, priced_tokens, line_items_json, calculated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, id) DO UPDATE SET\n billing_domain_id = excluded.billing_domain_id,\n amount = excluded.amount,\n price_snapshot_rates_json = excluded.price_snapshot_rates_json,\n line_items_json = excluded.line_items_json,\n calculated_at = excluded.calculated_at`\n );\n this.#database.exec('BEGIN IMMEDIATE');\n try {\n for (const cost of costs) {\n statement.run(\n providerId,\n cost.id,\n cost.sourceId ?? null,\n cost.billingDomainId,\n cost.observedAt,\n cost.kind,\n cost.amount,\n cost.currency,\n cost.authority,\n cost.priceSnapshot?.id ?? null,\n cost.priceSnapshot?.version ?? null,\n cost.priceSnapshot?.source ?? null,\n cost.priceSnapshot?.canonicalModel ?? null,\n cost.priceSnapshot?.effectiveAt ?? null,\n cost.priceSnapshot?.effectiveUntil ?? null,\n cost.priceSnapshot?.currency ?? null,\n serializePriceRates(cost.priceSnapshot),\n cost.priceSnapshot?.sourceUrl ?? null,\n cost.priceSnapshot?.contextTier ?? null,\n cost.model ?? null,\n cost.usageObservationId ?? null,\n cost.pricedTokens ?? null,\n cost.lineItems ? JSON.stringify(cost.lineItems) : null,\n cost.calculatedAt ?? null\n );\n }\n this.#database.exec('COMMIT');\n } catch (error) {\n this.#database.exec('ROLLBACK');\n throw error;\n }\n }\n\n recordFailure(\n provider: { id: string; displayName: string },\n failedAt: string,\n failure: { code: string; message: string; recovery: string }\n ): void {\n this.#database\n .prepare(\n `INSERT INTO providers (\n id, display_name, last_success_at, last_error, last_failure_at,\n last_error_code, last_recovery\n ) VALUES (?, ?, NULL, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n display_name = excluded.display_name,\n last_error = excluded.last_error,\n last_failure_at = excluded.last_failure_at,\n last_error_code = excluded.last_error_code,\n last_recovery = excluded.last_recovery`\n )\n .run(\n provider.id,\n provider.displayName,\n failure.message,\n failedAt,\n failure.code,\n failure.recovery\n );\n }\n\n getOverview(now: Date, query: UsageQuery = {}): UsageOverview {\n const providers = this.#database\n .prepare(\n `SELECT id, display_name, last_success_at, last_error, last_error_code, last_recovery\n FROM providers ORDER BY id`\n )\n .all() as unknown as ProviderRow[];\n\n const visibleProviders = this.#hideDemoProvider\n ? providers.filter((provider) => provider.id !== 'demo')\n : providers;\n const overviews = visibleProviders.map((provider) =>\n this.#getProviderOverview(provider, now, query)\n );\n const riskSummary = buildRiskSummary(overviews);\n const planSubscriptions = this.getPlanSubscriptions();\n const overview: UsageOverview = {\n generatedAt: now.toISOString(),\n globalSummary: buildGlobalSummary(overviews, riskSummary, now, query),\n workbench: buildTokenMoneyWorkbench(\n overviews,\n now,\n query,\n planSubscriptions,\n this.#planBillingPeriodSummaries(planSubscriptions, now, query)\n ),\n providers: overviews,\n riskSummary\n };\n if (!query.auditEvidence) dropAuditEvidence(overviews);\n return overview;\n }\n\n getAgentProviderIndex(now: Date): AgentProviderIndex {\n const providers = this.#database\n .prepare('SELECT id, display_name FROM providers ORDER BY id')\n .all() as unknown as Array<Pick<ProviderRow, 'id' | 'display_name'>>;\n return {\n generatedAt: now.toISOString(),\n providers: providers\n .filter(\n (provider) =>\n provider.id !== 'opencode' &&\n provider.id !== 'dsh' &&\n (!this.#hideDemoProvider || provider.id !== 'demo')\n )\n .map((provider) => ({ id: provider.id, displayName: provider.display_name }))\n };\n }\n\n getProviderOverview(\n now: Date,\n providerId: string,\n query: UsageQuery = {}\n ): ProviderOverview | null {\n if (this.#hideDemoProvider && providerId === 'demo') return null;\n const provider = this.#database\n .prepare(\n `SELECT id, display_name, last_success_at, last_error, last_error_code, last_recovery\n FROM providers WHERE id = ?`\n )\n .get(providerId) as unknown as ProviderRow | undefined;\n if (!provider) return null;\n const overview = this.#getProviderOverview(provider, now, query);\n if (!query.auditEvidence) dropAuditEvidence([overview]);\n return overview;\n }\n\n saveExchangeRateSnapshot(snapshot: ExchangeRateSnapshot): void {\n this.#database\n .prepare(\n `INSERT INTO exchange_rate_snapshots (\n id, base_currency, quote_currency, rate, observed_at, source\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n base_currency = excluded.base_currency,\n quote_currency = excluded.quote_currency,\n rate = excluded.rate,\n observed_at = excluded.observed_at,\n source = excluded.source`\n )\n .run(\n snapshot.id,\n snapshot.baseCurrency.toUpperCase(),\n snapshot.quoteCurrency.toUpperCase(),\n snapshot.rate,\n snapshot.observedAt,\n snapshot.source\n );\n }\n\n getConnectorRuntimeStates(): ConnectorRuntimeState[] {\n const rows = this.#database\n .prepare(\n `SELECT id, last_attempt_at, next_allowed_at, failure_count, outcome\n FROM connector_runtime ORDER BY id`\n )\n .all() as unknown as ConnectorRuntimeRow[];\n return rows.map((row) => ({\n id: row.id,\n lastAttemptAt: row.last_attempt_at,\n nextAllowedAt: row.next_allowed_at,\n failureCount: row.failure_count,\n outcome: row.outcome\n }));\n }\n\n saveConnectorRuntimeState(state: ConnectorRuntimeState): void {\n this.#database\n .prepare(\n `INSERT INTO connector_runtime (\n id, last_attempt_at, next_allowed_at, failure_count, outcome\n ) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n last_attempt_at = excluded.last_attempt_at,\n next_allowed_at = excluded.next_allowed_at,\n failure_count = excluded.failure_count,\n outcome = excluded.outcome`\n )\n .run(state.id, state.lastAttemptAt, state.nextAllowedAt, state.failureCount, state.outcome);\n }\n\n getMonitoringSettings(): MonitoringSettings {\n const row = this.#database\n .prepare(\n `SELECT background_collection_enabled, interval_minutes, notifications_enabled,\n start_at_login FROM monitoring_settings WHERE id = 1`\n )\n .get() as unknown as\n | {\n background_collection_enabled: number;\n interval_minutes: number;\n notifications_enabled: number;\n start_at_login: number;\n }\n | undefined;\n return row\n ? {\n backgroundCollectionEnabled: row.background_collection_enabled === 1,\n intervalMinutes: row.interval_minutes,\n notificationsEnabled: row.notifications_enabled === 1,\n startAtLogin: row.start_at_login === 1\n }\n : defaultMonitoringSettings();\n }\n\n saveMonitoringSettings(settings: MonitoringSettings): void {\n this.#database\n .prepare(\n `INSERT INTO monitoring_settings (\n id, background_collection_enabled, interval_minutes, notifications_enabled,\n start_at_login\n ) VALUES (1, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n background_collection_enabled = excluded.background_collection_enabled,\n interval_minutes = excluded.interval_minutes,\n notifications_enabled = excluded.notifications_enabled,\n start_at_login = excluded.start_at_login`\n )\n .run(\n settings.backgroundCollectionEnabled ? 1 : 0,\n settings.intervalMinutes,\n settings.notificationsEnabled ? 1 : 0,\n settings.startAtLogin ? 1 : 0\n );\n }\n\n getPlanSubscriptions(): PlanSubscription[] {\n const rows = this.#database\n .prepare(\n `SELECT provider_id, billing_domain_id, plan_id, display_name, amount, currency,\n billing_period, anchor_date, price_source, updated_at\n FROM plan_subscriptions\n ORDER BY provider_id, billing_domain_id`\n )\n .all() as unknown as Array<{\n provider_id: string;\n billing_domain_id: string;\n plan_id: string | null;\n display_name: string;\n amount: number;\n currency: string;\n billing_period: string;\n anchor_date: string | null;\n price_source: string;\n updated_at: string;\n }>;\n return rows.map((row) => ({\n providerId: row.provider_id,\n billingDomainId: row.billing_domain_id,\n planId: row.plan_id,\n displayName: row.display_name,\n amount: row.amount,\n currency: row.currency,\n billingPeriod: row.billing_period as PlanBillingPeriod,\n anchorDate: row.anchor_date,\n priceSource: row.price_source as PlanPriceSource,\n updatedAt: row.updated_at\n }));\n }\n\n savePlanSubscription(subscription: PlanSubscription): void {\n this.#database\n .prepare(\n `INSERT INTO plan_subscriptions (\n provider_id, billing_domain_id, plan_id, display_name, amount, currency,\n billing_period, anchor_date, price_source, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider_id, billing_domain_id) DO UPDATE SET\n plan_id = excluded.plan_id,\n display_name = excluded.display_name,\n amount = excluded.amount,\n currency = excluded.currency,\n billing_period = excluded.billing_period,\n anchor_date = excluded.anchor_date,\n price_source = excluded.price_source,\n updated_at = excluded.updated_at`\n )\n .run(\n subscription.providerId,\n subscription.billingDomainId,\n subscription.planId,\n subscription.displayName,\n subscription.amount,\n subscription.currency,\n subscription.billingPeriod,\n subscription.anchorDate,\n subscription.priceSource,\n subscription.updatedAt\n );\n }\n\n deletePlanSubscription(providerId: string, billingDomainId: string): void {\n this.#database\n .prepare('DELETE FROM plan_subscriptions WHERE provider_id = ? AND billing_domain_id = ?')\n .run(providerId, billingDomainId);\n }\n\n getCustomModelRates(): CustomModelRate[] {\n const rows = this.#database\n .prepare(\n `SELECT id, provider_id, billing_domain_id, model,\n input_rate, output_rate, cache_read_rate, updated_at\n FROM custom_model_rates\n ORDER BY updated_at DESC`\n )\n .all() as Array<{\n id: string;\n provider_id: string;\n billing_domain_id: string | null;\n model: string;\n input_rate: number;\n output_rate: number;\n cache_read_rate: number;\n updated_at: string;\n }>;\n return rows.map((row) => ({\n id: row.id,\n providerId: row.provider_id,\n billingDomainId: row.billing_domain_id ?? null,\n model: row.model,\n ratesPerMillion: {\n input: row.input_rate,\n output: row.output_rate,\n cacheRead: row.cache_read_rate\n },\n updatedAt: row.updated_at\n }));\n }\n\n getCustomModelRate(id: string): CustomModelRate | null {\n const row = this.#database\n .prepare(\n `SELECT id, provider_id, billing_domain_id, model,\n input_rate, output_rate, cache_read_rate, updated_at\n FROM custom_model_rates\n WHERE id = ?`\n )\n .get(id) as\n | {\n id: string;\n provider_id: string;\n billing_domain_id: string | null;\n model: string;\n input_rate: number;\n output_rate: number;\n cache_read_rate: number;\n updated_at: string;\n }\n | undefined;\n if (!row) return null;\n return {\n id: row.id,\n providerId: row.provider_id,\n billingDomainId: row.billing_domain_id ?? null,\n model: row.model,\n ratesPerMillion: {\n input: row.input_rate,\n output: row.output_rate,\n cacheRead: row.cache_read_rate\n },\n updatedAt: row.updated_at\n };\n }\n\n saveCustomModelRate(rate: CustomModelRate): void {\n const byId = this.#database\n .prepare('SELECT id FROM custom_model_rates WHERE id = ?')\n .get(rate.id) as { id: string } | undefined;\n const byKey = this.#database\n .prepare(\n `SELECT id FROM custom_model_rates\n WHERE provider_id = ? AND COALESCE(billing_domain_id, '') = COALESCE(?, '') AND lower(model) = lower(?)`\n )\n .get(rate.providerId, rate.billingDomainId, rate.model) as { id: string } | undefined;\n\n if (byId && byKey && byId.id !== byKey.id) {\n this.#database.prepare('DELETE FROM custom_model_rates WHERE id = ?').run(byKey.id);\n }\n\n const existingId = byId?.id ?? byKey?.id;\n\n if (existingId) {\n this.#database\n .prepare(\n `UPDATE custom_model_rates SET\n provider_id = ?, billing_domain_id = ?, model = ?,\n input_rate = ?, output_rate = ?, cache_read_rate = ?, updated_at = ?\n WHERE id = ?`\n )\n .run(\n rate.providerId,\n rate.billingDomainId,\n rate.model,\n rate.ratesPerMillion.input,\n rate.ratesPerMillion.output,\n rate.ratesPerMillion.cacheRead,\n rate.updatedAt,\n existingId\n );\n } else {\n this.#database\n .prepare(\n `INSERT INTO custom_model_rates (\n id, provider_id, billing_domain_id, model,\n input_rate, output_rate, cache_read_rate, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n rate.id,\n rate.providerId,\n rate.billingDomainId,\n rate.model,\n rate.ratesPerMillion.input,\n rate.ratesPerMillion.output,\n rate.ratesPerMillion.cacheRead,\n rate.updatedAt\n );\n }\n }\n\n deleteCustomModelRate(id: string): boolean {\n const result = this.#database.prepare('DELETE FROM custom_model_rates WHERE id = ?').run(id);\n return result.changes > 0;\n }\n\n getNotificationState(key: string): string | null {\n const row = this.#database\n .prepare('SELECT value FROM notification_state WHERE key = ?')\n .get(key) as unknown as { value: string } | undefined;\n return row?.value ?? null;\n }\n\n saveNotificationState(key: string, value: string): void {\n this.#database\n .prepare(\n `INSERT INTO notification_state (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n )\n .run(key, value);\n }\n\n saveConnectorDiagnostic(diagnostic: ConnectorDiagnostic): void {\n this.#database\n .prepare(\n `INSERT INTO connector_diagnostics (\n id, provider_id, billing_domain_id, status, category, message, recovery,\n affected_coverage, last_attempt_at, last_success_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n provider_id = excluded.provider_id,\n billing_domain_id = excluded.billing_domain_id,\n status = excluded.status,\n category = excluded.category,\n message = excluded.message,\n recovery = excluded.recovery,\n affected_coverage = excluded.affected_coverage,\n last_attempt_at = excluded.last_attempt_at,\n last_success_at = excluded.last_success_at`\n )\n .run(\n diagnostic.id,\n diagnostic.providerId,\n diagnostic.billingDomainId,\n diagnostic.status,\n diagnostic.category,\n diagnostic.message,\n diagnostic.recovery,\n JSON.stringify(diagnostic.affectedCoverage),\n diagnostic.lastAttemptAt,\n diagnostic.lastSuccessAt\n );\n }\n\n deleteConnectorDiagnostic(id: string): void {\n this.#database.prepare('DELETE FROM connector_diagnostics WHERE id = ?').run(id);\n }\n\n getConnectorDiagnostics(): ConnectorDiagnostic[] {\n const rows = this.#database\n .prepare(\n `SELECT id, provider_id, billing_domain_id, status, category, message, recovery,\n affected_coverage, last_attempt_at, last_success_at\n FROM connector_diagnostics ORDER BY id`\n )\n .all() as unknown as ConnectorDiagnosticRow[];\n return rows.map((row) => ({\n id: row.id,\n providerId: row.provider_id,\n billingDomainId: row.billing_domain_id,\n status: row.status,\n category: row.category,\n message: row.message,\n recovery: row.recovery,\n affectedCoverage: JSON.parse(\n row.affected_coverage\n ) as ConnectorDiagnostic['affectedCoverage'],\n lastAttemptAt: row.last_attempt_at,\n lastSuccessAt: row.last_success_at\n }));\n }\n\n saveConnectorStatus(status: ConnectorStatusRecord): void {\n this.#database\n .prepare(\n `INSERT INTO connector_settings (\n id, state, installed, binary_path, official_credential_present,\n error_code, last_discovered_at, secret_reference\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n state = excluded.state,\n installed = excluded.installed,\n binary_path = excluded.binary_path,\n official_credential_present = excluded.official_credential_present,\n error_code = excluded.error_code,\n last_discovered_at = excluded.last_discovered_at,\n secret_reference = excluded.secret_reference`\n )\n .run(\n status.id,\n status.state,\n status.installed ? 1 : 0,\n status.binaryPath,\n status.officialCredentialPresent ? 1 : 0,\n status.errorCode,\n status.lastDiscoveredAt,\n status.secretReference\n );\n }\n\n getConnectorStatuses(): ConnectorStatusRecord[] {\n const rows = this.#database\n .prepare(\n `SELECT id, state, installed, binary_path, official_credential_present,\n error_code, last_discovered_at, secret_reference\n FROM connector_settings ORDER BY id`\n )\n .all() as unknown as ConnectorStatusRow[];\n return rows.map((row) => ({\n id: row.id,\n state: row.state,\n installed: row.installed === 1,\n binaryPath: row.binary_path,\n officialCredentialPresent: row.official_credential_present === 1,\n errorCode: row.error_code,\n lastDiscoveredAt: row.last_discovered_at,\n secretReference: row.secret_reference\n }));\n }\n\n getProviderAccountIdentifiers(): Record<string, string> {\n const rows = this.#database\n .prepare('SELECT id, account_identifier FROM providers WHERE account_identifier IS NOT NULL')\n .all() as unknown as Array<{ id: string; account_identifier: string }>;\n return Object.fromEntries(rows.map((row) => [row.id, row.account_identifier]));\n }\n\n compactUsageHistory(now: Date): RetentionStatus {\n const cutoff = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000).toISOString();\n this.#database.exec('BEGIN IMMEDIATE');\n try {\n this.#database.prepare(RETENTION_AGGREGATE_SQL).run(cutoff);\n this.#database.prepare('DELETE FROM usage_observations WHERE observed_at < ?').run(cutoff);\n this.#database\n .prepare(\n `INSERT INTO retention_state (id, last_compacted_at) VALUES (1, ?)\n ON CONFLICT(id) DO UPDATE SET last_compacted_at = excluded.last_compacted_at`\n )\n .run(now.toISOString());\n this.#database.exec('COMMIT');\n } catch (error) {\n this.#database.exec('ROLLBACK');\n throw error;\n }\n return this.getRetentionStatus();\n }\n\n getRetentionStatus(): RetentionStatus {\n const raw = this.#database\n .prepare('SELECT COUNT(*) AS count, MIN(observed_at) AS oldest FROM usage_observations')\n .get() as unknown as { count: number; oldest: string | null };\n const aggregates = this.#database\n .prepare('SELECT COUNT(*) AS count FROM daily_usage_aggregates')\n .get() as unknown as { count: number };\n const state = this.#database\n .prepare('SELECT last_compacted_at FROM retention_state WHERE id = 1')\n .get() as unknown as { last_compacted_at: string | null } | undefined;\n return {\n rawRetentionDays: 90,\n rawObservations: Number(raw.count),\n oldestRawObservedAt: raw.oldest,\n dailyAggregates: Number(aggregates.count),\n lastCompactedAt: state?.last_compacted_at ?? null\n };\n }\n\n clearUsageData(): void {\n this.#database.exec('BEGIN IMMEDIATE');\n try {\n this.#database.exec(`\n DELETE FROM connector_diagnostics;\n DELETE FROM connector_runtime;\n DELETE FROM notification_state;\n DELETE FROM exchange_rate_snapshots;\n DELETE FROM providers;\n DELETE FROM retention_state;\n `);\n this.#database.exec('COMMIT');\n } catch (error) {\n this.#database.exec('ROLLBACK');\n throw error;\n }\n }\n\n async deleteDemoProviderDataAsync(): Promise<void> {\n await runDatabaseWorker<void>({\n databasePath: this.#databasePath,\n operation: 'delete-demo-data',\n deleteDemoDataSql: DELETE_DEMO_PROVIDER_DATA_SQL\n });\n }\n\n deleteDerivedRetailCosts(): void {\n this.#database.prepare(DELETE_DERIVED_RETAIL_COSTS_SQL).run();\n }\n\n async deleteDerivedRetailCostsAsync(): Promise<void> {\n await runDatabaseWorker<void>({\n databasePath: this.#databasePath,\n operation: 'delete-derived-costs',\n deleteDerivedCostsSql: DELETE_DERIVED_RETAIL_COSTS_SQL\n });\n }\n\n getApplicationState(key: string): string | null {\n const row = this.#database\n .prepare('SELECT value FROM application_state WHERE key = ?')\n .get(key) as { value: string } | undefined;\n return row?.value ?? null;\n }\n\n saveApplicationState(key: string, value: string): void {\n this.#database\n .prepare(\n `INSERT INTO application_state (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n )\n .run(key, value);\n }\n\n async ensureQueryIndexes(): Promise<void> {\n await runDatabaseWorker<void>({\n databasePath: this.#databasePath,\n operation: 'indexes',\n indexesSql: QUERY_INDEXES_SQL\n });\n }\n\n async maintainUsageHistory(now: Date): Promise<RetentionStatus> {\n const cutoff = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000).toISOString();\n return runDatabaseWorker<RetentionStatus>({\n databasePath: this.#databasePath,\n operation: 'retention',\n indexesSql: QUERY_INDEXES_SQL,\n aggregateSql: RETENTION_AGGREGATE_SQL,\n cutoff,\n now: now.toISOString()\n });\n }\n\n close(): void {\n this.#database.close();\n }\n\n #getProviderOverview(provider: ProviderRow, now: Date, query: UsageQuery): ProviderOverview {\n const forecastAnalysis = this.#getQuotaForecasts(provider.id, now);\n const degradedDiagnostics = this.#database\n .prepare(\n `SELECT id, provider_id, billing_domain_id, status, category, message, recovery,\n affected_coverage, last_attempt_at, last_success_at\n FROM connector_diagnostics\n WHERE provider_id = ? AND status = 'degraded'\n ORDER BY id`\n )\n .all(provider.id) as unknown as ConnectorDiagnosticRow[];\n const domainRows = this.#database\n .prepare(\n `SELECT id, display_name, last_success_at\n FROM billing_domains WHERE provider_id = ? ORDER BY id`\n )\n .all(provider.id) as unknown as BillingDomainRow[];\n const summaryBillingDomainId = selectSummaryBillingDomainId(provider.id, domainRows);\n const billingDomains = domainRows.map((domain) =>\n this.#getBillingDomainOverview(\n provider.id,\n domain,\n now,\n query,\n forecastAnalysis.forecasts.filter((forecast) => forecast.billingDomainId === domain.id),\n forecastAnalysis.coverageByDomain.get(domain.id) ?? 'insufficient',\n degradedDiagnostics.find((diagnostic) => diagnostic.billing_domain_id === domain.id),\n domainRows.length === 1 ? provider : null\n )\n );\n const summaryDomain = billingDomains.find((domain) => domain.id === summaryBillingDomainId);\n const emptyTotals = zeroTokenTotals();\n const emptyEvidence = finishTokenEvidence(emptyTokenEvidence());\n const emptyCoverage: ProviderOverview['coverage'] = {\n quota: 'unavailable',\n tokens: 'unavailable',\n actualCost: 'unavailable',\n history: 'unavailable'\n };\n const providerFallbackHealth: ProviderOverview['health'] = provider.last_error\n ? {\n status: 'degraded',\n errorCode: provider.last_error_code,\n message: provider.last_error,\n recovery: provider.last_recovery\n }\n : { status: 'healthy', errorCode: null, message: null, recovery: null };\n\n let providerTokenTotals = summaryDomain?.tokenTotals ?? emptyTotals;\n let providerTokenEvidence = summaryDomain?.tokenEvidence ?? emptyEvidence;\n if ((provider.id === 'dsh' || provider.id === 'grok') && billingDomains.length > 1) {\n const combinedTotals = zeroTokenTotals();\n const combinedEvidence = emptyTokenEvidence();\n for (const d of billingDomains) {\n if (provider.id === 'grok' && d.id === 'xai-api') continue;\n combinedTotals.total += d.tokenTotals.total;\n combinedTotals.input += d.tokenTotals.input;\n combinedTotals.output += d.tokenTotals.output;\n combinedTotals.reasoning += d.tokenTotals.reasoning;\n combinedTotals.cacheRead += d.tokenTotals.cacheRead;\n combinedTotals.cacheWrite += d.tokenTotals.cacheWrite;\n addAggregatedTokenEvidence(combinedEvidence, d.tokenEvidence);\n }\n providerTokenTotals = combinedTotals;\n providerTokenEvidence = finishTokenEvidence(combinedEvidence);\n }\n\n return {\n id: provider.id,\n displayName: provider.display_name,\n summaryBillingDomainId,\n freshness: summaryDomain?.freshness ?? {\n status: freshnessStatus(provider.last_success_at, now),\n lastSuccessAt: provider.last_success_at\n },\n health: summaryDomain?.health ?? providerFallbackHealth,\n coverage: summaryDomain?.coverage ?? emptyCoverage,\n quotaBuckets: summaryDomain?.quotaBuckets ?? [],\n tokenTotals: providerTokenTotals,\n tokenEvidence: providerTokenEvidence,\n tokenAuthority: summaryDomain?.tokenAuthority ?? null,\n billingDomains,\n forecasts: summaryDomain?.forecasts ?? [],\n forecastCoverage: summaryDomain?.forecastCoverage ?? 'insufficient'\n };\n }\n\n #getBillingDomainOverview(\n providerId: string,\n domain: BillingDomainRow,\n now: Date,\n query: UsageQuery,\n forecasts: QuotaForecast[],\n forecastCoverage: ProviderOverview['forecastCoverage'],\n degradedDiagnostic?: ConnectorDiagnosticRow,\n legacyProviderFailure: ProviderRow | null = null\n ): BillingDomainOverview {\n const quotaRows = this.#database\n .prepare(\n `SELECT id, billing_domain_id, label, used_percent, window_duration_minutes, resets_at,\n authority, observed_at,\n scope, status, limit_amount, limit_currency, fallback_status\n FROM quota_buckets WHERE provider_id = ? AND billing_domain_id = ? ORDER BY id`\n )\n .all(providerId, domain.id) as unknown as QuotaRow[];\n const tokens = this.#database\n .prepare(\n `SELECT COALESCE(SUM(total_tokens), 0) AS total_tokens,\n COALESCE(SUM(input_tokens), 0) AS input_tokens,\n COALESCE(SUM(output_tokens), 0) AS output_tokens,\n COALESCE(SUM(reasoning_tokens), 0) AS reasoning_tokens,\n COALESCE(SUM(cache_read_tokens), 0) AS cache_read_tokens,\n COALESCE(SUM(cache_write_tokens), 0) AS cache_write_tokens,\n COUNT(*) AS observation_count,\n COALESCE(SUM(source_reported_total_tokens), 0) AS source_reported_tokens,\n SUM(CASE WHEN source_reported_total_tokens IS NOT NULL THEN 1 ELSE 0 END)\n AS source_reported_observation_count,\n COALESCE(SUM(unclassified_tokens), 0) AS unclassified_tokens,\n GROUP_CONCAT(DISTINCT total_derivation) AS total_derivations,\n GROUP_CONCAT(DISTINCT time_precision) AS time_precisions,\n GROUP_CONCAT(DISTINCT usage_scope) AS usage_scopes,\n GROUP_CONCAT(DISTINCT aggregation_temporality) AS aggregation_temporalities,\n GROUP_CONCAT(DISTINCT authority) AS authorities\n FROM usage_observations\n WHERE provider_id = ? AND billing_domain_id = ? AND ${additiveUsagePredicate()}`\n )\n .get(providerId, domain.id) as unknown as TokenRow;\n // The whole ledger is audit evidence and is read only when a caller asked for it.\n // A Dashboard response reads the windowed summary in `history.costs` instead, so\n // reading and mapping every retained cost record would be work nobody displays.\n const costs = query.auditEvidence\n ? (this.#database\n .prepare(\n `SELECT id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority,\n price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency,\n price_snapshot_rates_json, price_snapshot_source_url,\n price_snapshot_context_tier, model, usage_observation_id, priced_tokens,\n line_items_json, calculated_at\n FROM cost_records WHERE provider_id = ? AND billing_domain_id = ? ORDER BY observed_at DESC, id`\n )\n .all(providerId, domain.id) as unknown as CostRow[])\n : null;\n const lastCostObservedAt =\n (\n this.#database\n .prepare(\n `SELECT MAX(observed_at) AS observed_at FROM cost_records\n WHERE provider_id = ? AND billing_domain_id = ?`\n )\n .get(providerId, domain.id) as unknown as { observed_at: string | null }\n ).observed_at ?? null;\n const balances = this.#database\n .prepare(\n `SELECT id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority\n FROM balance_records WHERE provider_id = ? AND billing_domain_id = ? ORDER BY observed_at DESC, id`\n )\n .all(providerId, domain.id) as unknown as BalanceRow[];\n const invoices = this.#database\n .prepare(\n `SELECT id, billing_domain_id, created_at, number, status, amount, currency, authority\n FROM invoice_records WHERE provider_id = ? AND billing_domain_id = ? ORDER BY created_at DESC, id`\n )\n .all(providerId, domain.id) as unknown as InvoiceRow[];\n const actualCostCount = Number(\n (\n this.#database\n .prepare(\n `SELECT COUNT(*) AS count FROM cost_records\n WHERE provider_id = ? AND billing_domain_id = ? AND kind = 'actual'`\n )\n .get(providerId, domain.id) as unknown as { count: number }\n ).count\n );\n const nonAdditiveTokenCount = this.#database\n .prepare(\n `SELECT COUNT(*) AS count FROM usage_observations\n WHERE provider_id = ? AND billing_domain_id = ?\n AND NOT (${additiveUsagePredicate()})`\n )\n .get(providerId, domain.id) as unknown as { count: number };\n const degraded = degradedDiagnostic || legacyProviderFailure?.last_error;\n return {\n id: domain.id,\n displayName: domain.display_name,\n freshness: {\n status: freshnessStatus(domain.last_success_at, now),\n lastSuccessAt: domain.last_success_at\n },\n health: {\n status: degraded ? 'degraded' : 'healthy',\n errorCode: degradedDiagnostic?.category ?? legacyProviderFailure?.last_error_code ?? null,\n message: degradedDiagnostic?.message ?? legacyProviderFailure?.last_error ?? null,\n recovery: degradedDiagnostic?.recovery ?? legacyProviderFailure?.last_recovery ?? null\n },\n coverage: {\n quota: coverageFromCount(quotaRows.length),\n tokens: tokenCoverage(tokens, Number(nonAdditiveTokenCount.count)),\n actualCost: coverageFromCount(actualCostCount),\n history: tokenCoverage(tokens, Number(nonAdditiveTokenCount.count))\n },\n quotaBuckets: quotaRows.map(mapQuotaRow),\n tokenTotals: mapTokenTotals(tokens),\n tokenEvidence: mapTokenEvidence(tokens),\n tokenAuthority: tokenAuthority(tokens.authorities),\n ...(costs\n ? {\n costs: costs.map((row) => ({\n id: row.id,\n sourceId: row.source_id,\n billingDomainId: row.billing_domain_id,\n observedAt: row.observed_at,\n kind: row.kind,\n amount: row.amount,\n currency: row.currency,\n authority: row.authority,\n priceSnapshot: priceSnapshotFromRow(row),\n model: row.model,\n usageObservationId: row.usage_observation_id,\n pricedTokens: row.priced_tokens,\n lineItems: parseLineItems(row.line_items_json),\n calculatedAt: row.calculated_at\n }))\n }\n : {}),\n lastCostObservedAt,\n balances: balances.map((row) => ({\n id: row.id,\n sourceId: row.source_id,\n billingDomainId: row.billing_domain_id,\n observedAt: row.observed_at,\n kind: row.kind,\n amount: row.amount,\n currency: row.currency,\n authority: row.authority\n })),\n invoices: invoices.map((row) => ({\n id: row.id,\n billingDomainId: row.billing_domain_id,\n createdAt: row.created_at,\n number: row.number,\n status: row.status,\n amount: row.amount,\n currency: row.currency,\n authority: row.authority\n })),\n history: this.#getBillingHistory(providerId, domain.id, now, query),\n forecasts,\n forecastCoverage\n };\n }\n\n #getQuotaForecasts(\n providerId: string,\n now: Date\n ): {\n forecasts: QuotaForecast[];\n coverageByDomain: Map<string, ProviderOverview['forecastCoverage']>;\n } {\n const rows = this.#database\n .prepare(\n `SELECT bucket_id, billing_domain_id, label, used_percent, resets_at, observed_at\n FROM quota_observations\n WHERE provider_id = ? AND observed_at >= ? AND observed_at <= ?\n ORDER BY bucket_id, observed_at`\n )\n .all(\n providerId,\n new Date(now.getTime() - 24 * 60 * 60 * 1000).toISOString(),\n now.toISOString()\n ) as unknown as QuotaObservationRow[];\n const grouped = new Map<string, QuotaObservationRow[]>();\n for (const row of rows) {\n const group = grouped.get(row.bucket_id) ?? [];\n group.push(row);\n grouped.set(row.bucket_id, group);\n }\n const forecasts: QuotaForecast[] = [];\n const discontinuousDomains = new Set<string>();\n const staleDomains = new Set<string>();\n const observedDomains = new Set(rows.map((row) => row.billing_domain_id));\n for (const samples of grouped.values()) {\n const latest = samples.at(-1)!;\n if (now.getTime() - new Date(latest.observed_at).getTime() > FRESHNESS_WINDOW_MS) {\n staleDomains.add(latest.billing_domain_id);\n continue;\n }\n let segmentStart = 0;\n for (let index = 1; index < samples.length; index += 1) {\n if (samples[index].used_percent < samples[index - 1].used_percent) segmentStart = index;\n }\n const segment = samples.slice(segmentStart);\n if (segment.length < 3) continue;\n const gaps = segment\n .slice(1)\n .map(\n (sample, index) =>\n new Date(sample.observed_at).getTime() - new Date(segment[index].observed_at).getTime()\n );\n if (gaps.some((gap) => gap > 2 * 60 * 60 * 1000)) {\n discontinuousDomains.add(latest.billing_domain_id);\n continue;\n }\n const first = segment[0];\n const last = segment.at(-1)!;\n const hours =\n (new Date(last.observed_at).getTime() - new Date(first.observed_at).getTime()) /\n (60 * 60 * 1000);\n if (hours < 0.5 || !last.resets_at) continue;\n const burnRate = (last.used_percent - first.used_percent) / hours;\n const resetTime = new Date(last.resets_at).getTime();\n if (burnRate <= 0 || resetTime <= now.getTime()) continue;\n const remaining = Math.max(0, 100 - last.used_percent);\n const predicted = new Date(now.getTime() + (remaining / burnRate) * 60 * 60 * 1000);\n forecasts.push({\n billingDomainId: last.billing_domain_id,\n bucketId: last.bucket_id,\n label: last.label,\n remainingPercent: remaining,\n resetsAt: last.resets_at,\n burnRatePercentPerHour: round(burnRate),\n predictedExhaustionAt: predicted.toISOString(),\n willLastUntilReset: predicted.getTime() >= resetTime,\n confidence: hours >= 2 ? 'high' : 'medium',\n evidence: {\n windowStart: first.observed_at,\n windowEnd: last.observed_at,\n samples: segment.length,\n continuous: true\n }\n });\n }\n const coverageByDomain = new Map<string, ProviderOverview['forecastCoverage']>();\n for (const domainId of observedDomains) {\n coverageByDomain.set(\n domainId,\n forecasts.some((forecast) => forecast.billingDomainId === domainId)\n ? 'complete'\n : discontinuousDomains.has(domainId)\n ? 'discontinuous'\n : staleDomains.has(domainId)\n ? 'stale'\n : 'insufficient'\n );\n }\n return {\n forecasts: forecasts.sort((left, right) => left.bucketId.localeCompare(right.bucketId)),\n coverageByDomain\n };\n }\n\n /**\n * Cycle-to-date evidence for every subscription that declares a renewal date.\n * Each Provider is measured over its own billing period, which is why this\n * cannot reuse the one rolling window the rest of the workbench shares.\n */\n #planBillingPeriodSummaries(\n subscriptions: PlanSubscription[],\n now: Date,\n query: UsageQuery\n ): Map<string, PlanBillingPeriodSummary> {\n const normalized = normalizeUsageQuery(now, query);\n const summaries = new Map<string, PlanBillingPeriodSummary>();\n for (const subscription of subscriptions) {\n if (!subscription.anchorDate) continue;\n const period = billingPeriodContaining(\n subscription.anchorDate,\n subscription.billingPeriod,\n now\n );\n if (!period) continue;\n const observedThrough = new Date(Math.min(now.getTime(), period.end.getTime()));\n summaries.set(`${subscription.providerId}:${subscription.billingDomainId}`, {\n start: period.start.toISOString(),\n end: period.end.toISOString(),\n observedThrough: observedThrough.toISOString(),\n ...this.#rangeUsageSummary(\n subscription.providerId,\n subscription.billingDomainId,\n period.start,\n observedThrough,\n normalized.comparisonCurrency\n )\n });\n }\n return summaries;\n }\n\n #rangeUsageSummary(\n providerId: string,\n billingDomainId: string,\n start: Date,\n end: Date,\n comparisonCurrency: string\n ): Pick<PlanBillingPeriodSummary, 'recordedTokens' | 'observationCount' | 'retailEquivalent'> {\n const startIso = start.toISOString();\n const endIso = end.toISOString();\n const usage = this.#database\n .prepare(\n `SELECT id, model, observed_at, authority, total_tokens, input_tokens, output_tokens,\n reasoning_tokens, cache_read_tokens, cache_write_tokens, cache_write_5m_tokens,\n cache_write_1h_tokens, source_reported_total_tokens,\n unclassified_tokens, total_derivation, model_attribution, time_precision,\n usage_scope, aggregation_temporality, reasoning_semantics,\n cache_read_semantics, cache_write_semantics\n FROM usage_observations\n WHERE provider_id = ? AND billing_domain_id = ?\n AND observed_at >= ? AND observed_at < ?\n AND ${additiveUsagePredicate()}\n ORDER BY observed_at, id`\n )\n .all(providerId, billingDomainId, startIso, endIso) as unknown as UsageHistoryRow[];\n const costs = this.#database\n .prepare(\n `SELECT id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority,\n price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency,\n price_snapshot_rates_json, price_snapshot_source_url,\n price_snapshot_context_tier, model, usage_observation_id, priced_tokens,\n line_items_json, calculated_at\n FROM cost_records\n WHERE provider_id = ? AND billing_domain_id = ?\n AND observed_at >= ? AND observed_at < ?\n ORDER BY observed_at, id`\n )\n .all(providerId, billingDomainId, startIso, endIso) as unknown as CostRow[];\n const rateRows = this.#database\n .prepare(\n `SELECT id, base_currency, quote_currency, rate, observed_at, source\n FROM exchange_rate_snapshots WHERE observed_at < ? ORDER BY observed_at DESC, id`\n )\n .all(endIso) as unknown as ExchangeRateRow[];\n const rateByCurrency = new Map<string, ExchangeRateRow>();\n for (const row of rateRows) {\n if (row.quote_currency === comparisonCurrency && !rateByCurrency.has(row.base_currency)) {\n rateByCurrency.set(row.base_currency, row);\n }\n }\n\n const evidence = emptyTokenEvidence();\n for (const row of usage) addTokenEvidence(evidence, row);\n const finished = finishTokenEvidence(evidence);\n const usedRates = new Map<string, ExchangeRateSnapshot>();\n const historyCosts = summarizeHistoryCosts(\n costs,\n finished.recordedTokens,\n rateByCurrency,\n comparisonCurrency,\n end,\n usedRates\n );\n return {\n recordedTokens: finished.recordedTokens,\n observationCount: finished.observationCount,\n retailEquivalent: buildWorkbenchMetric(\n historyCosts,\n 'retail-equivalent',\n comparisonCurrency,\n finished.recordedTokens,\n [...usedRates.values()]\n )\n };\n }\n\n #getBillingHistory(\n providerId: string,\n billingDomainId: string,\n now: Date,\n query: UsageQuery\n ): BillingDomainOverview['history'] {\n const normalized = normalizeUsageQuery(now, query);\n const start = normalized.start.toISOString();\n const end = normalized.end.toISOString();\n const usage = this.#database\n .prepare(\n `SELECT id, model, observed_at, authority, total_tokens, input_tokens, output_tokens, reasoning_tokens,\n cache_read_tokens, cache_write_tokens, cache_write_5m_tokens,\n cache_write_1h_tokens, source_reported_total_tokens,\n unclassified_tokens, total_derivation, model_attribution, time_precision,\n usage_scope, aggregation_temporality, reasoning_semantics,\n cache_read_semantics, cache_write_semantics\n FROM usage_observations\n WHERE provider_id = ? AND billing_domain_id = ?\n AND observed_at >= ? AND observed_at < ?\n AND ${additiveUsagePredicate()}\n ORDER BY observed_at, id`\n )\n .all(providerId, billingDomainId, start, end) as unknown as UsageHistoryRow[];\n const costs = this.#database\n .prepare(\n `SELECT id, source_id, billing_domain_id, observed_at, kind, amount, currency, authority,\n price_snapshot_id, price_snapshot_version, price_snapshot_source,\n price_snapshot_canonical_model, price_snapshot_effective_at,\n price_snapshot_effective_until, price_snapshot_currency,\n price_snapshot_rates_json, price_snapshot_source_url,\n price_snapshot_context_tier, model, usage_observation_id, priced_tokens,\n line_items_json, calculated_at\n FROM cost_records\n WHERE provider_id = ? AND billing_domain_id = ?\n AND observed_at >= ? AND observed_at < ?\n ORDER BY observed_at, id`\n )\n .all(providerId, billingDomainId, start, end) as unknown as CostRow[];\n const rateRows = this.#database\n .prepare(\n `SELECT id, base_currency, quote_currency, rate, observed_at, source\n FROM exchange_rate_snapshots WHERE observed_at < ? ORDER BY observed_at DESC, id`\n )\n .all(end) as unknown as ExchangeRateRow[];\n const rateByCurrency = new Map<string, ExchangeRateRow>();\n for (const row of rateRows) {\n if (\n row.quote_currency === normalized.comparisonCurrency &&\n !rateByCurrency.has(row.base_currency)\n ) {\n rateByCurrency.set(row.base_currency, row);\n }\n }\n\n const tokenTotals = zeroTokenTotals();\n const tokenEvidence = emptyTokenEvidence();\n const byModel = new Map<\n string,\n {\n tokens: ReturnType<typeof zeroTokenTotals>;\n evidence: MutableTokenEvidence;\n observations: UsageHistoryRow[];\n }\n >();\n const unclassified = {\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n authorities: new Set<DataAuthority>(),\n lastObservedAt: null as string | null,\n observations: [] as UsageHistoryRow[]\n };\n const authorities = new Set<DataAuthority>();\n const byDay = new Map<\n string,\n {\n tokens: ReturnType<typeof zeroTokenTotals>;\n evidence: MutableTokenEvidence;\n costs: CostRow[];\n authorities: Set<DataAuthority>;\n lastObservedAt: string | null;\n }\n >();\n const intervals = buildHistoryIntervals(normalized).map((interval) => ({\n ...interval,\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n costs: [] as CostRow[],\n authorities: new Set<DataAuthority>(),\n lastObservedAt: null as string | null\n }));\n for (const row of usage) {\n authorities.add(row.authority);\n addUsageRow(tokenTotals, row);\n addTokenEvidence(tokenEvidence, row);\n if (row.model_attribution === 'known') {\n const classified = classifiedUsageRow(row);\n if (classified.total_tokens > 0) {\n const model = byModel.get(row.model) ?? {\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n observations: []\n };\n addUsageRow(model.tokens, classified);\n addTokenEvidence(model.evidence, classified);\n model.observations.push(row);\n byModel.set(row.model, model);\n }\n const remainder = unclassifiedUsageRow(row);\n if (remainder) addUnclassifiedUsage(unclassified, remainder);\n } else {\n addUnclassifiedUsage(unclassified, row);\n }\n const day = localDay(row.observed_at, normalized.timeZone);\n const daily = byDay.get(day) ?? {\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n costs: [],\n authorities: new Set<DataAuthority>(),\n lastObservedAt: null\n };\n addUsageRow(daily.tokens, row);\n addTokenEvidence(daily.evidence, row);\n daily.authorities.add(row.authority);\n if (!daily.lastObservedAt || row.observed_at > daily.lastObservedAt) {\n daily.lastObservedAt = row.observed_at;\n }\n byDay.set(day, daily);\n const interval = intervals[historyIntervalIndex(row.observed_at, normalized)];\n if (interval) {\n addUsageRow(interval.tokens, row);\n addTokenEvidence(interval.evidence, row);\n interval.authorities.add(row.authority);\n if (!interval.lastObservedAt || row.observed_at > interval.lastObservedAt) {\n interval.lastObservedAt = row.observed_at;\n }\n }\n }\n for (const cost of costs) {\n const day = localDay(cost.observed_at, normalized.timeZone);\n const daily = byDay.get(day) ?? {\n tokens: zeroTokenTotals(),\n evidence: emptyTokenEvidence(),\n costs: [],\n authorities: new Set<DataAuthority>(),\n lastObservedAt: null\n };\n if (cost.kind !== 'subscription' && cost.kind !== 'legacy-unknown') {\n daily.costs.push(cost);\n const interval = intervals[historyIntervalIndex(cost.observed_at, normalized)];\n if (interval) interval.costs.push(cost);\n }\n byDay.set(day, daily);\n }\n\n const exchangeRates = new Map<string, ExchangeRateSnapshot>();\n const summarizeCosts = (rows: CostRow[], recordedTokens: number) =>\n summarizeHistoryCosts(\n rows,\n recordedTokens,\n rateByCurrency,\n normalized.comparisonCurrency,\n normalized.end,\n exchangeRates\n );\n return {\n window: normalized.window,\n start,\n end,\n timeZone: normalized.timeZone,\n tokenTotals,\n tokenEvidence: finishTokenEvidence(tokenEvidence),\n models: [...byModel.entries()]\n .map(([model, value]) => {\n const observationIds = new Set(value.observations.map((observation) => observation.id));\n const priceEvidence = costs\n .filter(\n (cost) =>\n (cost.kind === 'retail-equivalent' || cost.kind === 'reported-estimate') &&\n cost.usage_observation_id !== null &&\n observationIds.has(cost.usage_observation_id)\n )\n .map((cost) => {\n const summarized = summarizeCosts([cost], Number(cost.priced_tokens ?? 0))[0];\n return {\n ...summarized,\n id: cost.id,\n usageObservationId: cost.usage_observation_id,\n pricedTokens: Number(cost.priced_tokens ?? 0),\n lineItems: parseLineItems(cost.line_items_json),\n priceSnapshot: priceSnapshotFromRow(cost),\n authority: cost.authority,\n calculatedAt: cost.calculated_at\n };\n });\n return {\n model,\n tokenTotals: value.tokens,\n tokenEvidence: finishTokenEvidence(value.evidence),\n observations: value.observations.map(mapHistoryModelObservation),\n priceEvidence\n };\n })\n .sort(\n (left, right) =>\n right.tokenTotals.total - left.tokenTotals.total ||\n left.model.localeCompare(right.model)\n ),\n unclassified: {\n tokenTotals: unclassified.tokens,\n tokenEvidence: finishTokenEvidence(unclassified.evidence),\n authorities: [...unclassified.authorities].sort(),\n lastObservedAt: unclassified.lastObservedAt,\n observations: unclassified.observations.map(mapUnclassifiedObservation)\n },\n days: [...byDay.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([day, daily]) => ({\n day,\n tokenTotals: daily.tokens,\n tokenEvidence: finishTokenEvidence(daily.evidence),\n costs: summarizeCosts(daily.costs, daily.tokens.total),\n authorities: [...daily.authorities].sort(),\n lastObservedAt: daily.lastObservedAt\n })),\n intervals: intervals.map((interval) => ({\n start: interval.start.toISOString(),\n end: interval.end.toISOString(),\n label: interval.label,\n gap: interval.evidence.observationCount === 0,\n tokenTotals: interval.tokens,\n tokenEvidence: finishTokenEvidence(interval.evidence),\n costs: summarizeCosts(interval.costs, interval.tokens.total),\n authorities: [...interval.authorities].sort(),\n lastObservedAt: interval.lastObservedAt\n })),\n costs: summarizeCosts(costs, tokenTotals.total),\n exchangeRates: [...exchangeRates.values()],\n authorities: [...authorities].sort(),\n lastObservedAt: usage.at(-1)?.observed_at ?? null\n };\n }\n\n #migrate(): void {\n this.#database.exec(`\n CREATE TABLE IF NOT EXISTS providers (\n id TEXT PRIMARY KEY,\n display_name TEXT NOT NULL,\n account_identifier TEXT,\n last_success_at TEXT,\n last_error TEXT,\n last_failure_at TEXT,\n last_error_code TEXT,\n last_recovery TEXT\n );\n CREATE TABLE IF NOT EXISTS billing_domains (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n display_name TEXT NOT NULL,\n last_success_at TEXT,\n PRIMARY KEY (provider_id, id)\n );\n CREATE TABLE IF NOT EXISTS quota_buckets (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n label TEXT NOT NULL,\n used_percent REAL,\n window_duration_minutes INTEGER,\n resets_at TEXT,\n authority TEXT NOT NULL,\n observed_at TEXT NOT NULL,\n scope TEXT,\n status TEXT,\n limit_amount REAL,\n limit_currency TEXT,\n fallback_status TEXT,\n total_tokens INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS usage_observations (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n model TEXT NOT NULL,\n session_id TEXT,\n observed_at TEXT NOT NULL,\n total_tokens INTEGER NOT NULL DEFAULT 0,\n input_tokens INTEGER NOT NULL,\n output_tokens INTEGER NOT NULL,\n reasoning_tokens INTEGER NOT NULL DEFAULT 0,\n cache_read_tokens INTEGER NOT NULL,\n cache_write_tokens INTEGER NOT NULL,\n cache_write_5m_tokens INTEGER,\n cache_write_1h_tokens INTEGER,\n authority TEXT NOT NULL,\n source_reported_total_tokens INTEGER,\n unclassified_tokens INTEGER NOT NULL DEFAULT 0,\n total_derivation TEXT NOT NULL DEFAULT 'legacy-total',\n reasoning_semantics TEXT NOT NULL DEFAULT 'included-in-output',\n cache_read_semantics TEXT NOT NULL DEFAULT 'separate',\n cache_write_semantics TEXT NOT NULL DEFAULT 'separate',\n model_attribution TEXT NOT NULL DEFAULT 'known',\n time_precision TEXT NOT NULL DEFAULT 'unknown',\n usage_scope TEXT NOT NULL DEFAULT 'unknown',\n aggregation_temporality TEXT NOT NULL DEFAULT 'unknown',\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS quota_observations (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n bucket_id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n label TEXT NOT NULL,\n used_percent REAL NOT NULL,\n resets_at TEXT,\n authority TEXT NOT NULL,\n observed_at TEXT NOT NULL,\n PRIMARY KEY (provider_id, bucket_id, observed_at),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS cost_records (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n source_id TEXT,\n billing_domain_id TEXT NOT NULL,\n observed_at TEXT NOT NULL,\n kind TEXT NOT NULL,\n amount REAL,\n currency TEXT NOT NULL,\n authority TEXT NOT NULL,\n price_snapshot_id TEXT,\n price_snapshot_version TEXT,\n price_snapshot_source TEXT,\n price_snapshot_canonical_model TEXT,\n price_snapshot_effective_at TEXT,\n price_snapshot_effective_until TEXT,\n price_snapshot_currency TEXT,\n price_snapshot_rates_json TEXT,\n price_snapshot_source_url TEXT,\n price_snapshot_context_tier TEXT,\n model TEXT,\n usage_observation_id TEXT,\n priced_tokens INTEGER,\n line_items_json TEXT,\n calculated_at TEXT,\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS balance_records (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n source_id TEXT,\n billing_domain_id TEXT NOT NULL,\n observed_at TEXT NOT NULL,\n kind TEXT NOT NULL,\n amount REAL,\n currency TEXT NOT NULL,\n authority TEXT NOT NULL,\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS invoice_records (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n created_at TEXT NOT NULL,\n number TEXT,\n status TEXT,\n amount REAL,\n currency TEXT NOT NULL,\n authority TEXT NOT NULL,\n PRIMARY KEY (provider_id, id),\n FOREIGN KEY (provider_id, billing_domain_id)\n REFERENCES billing_domains(provider_id, id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS exchange_rate_snapshots (\n id TEXT PRIMARY KEY,\n base_currency TEXT NOT NULL,\n quote_currency TEXT NOT NULL,\n rate REAL NOT NULL,\n observed_at TEXT NOT NULL,\n source TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS connector_settings (\n id TEXT PRIMARY KEY,\n state TEXT NOT NULL,\n installed INTEGER NOT NULL,\n binary_path TEXT,\n official_credential_present INTEGER NOT NULL,\n error_code TEXT,\n last_discovered_at TEXT,\n secret_reference TEXT\n );\n CREATE TABLE IF NOT EXISTS connector_runtime (\n id TEXT PRIMARY KEY,\n last_attempt_at TEXT,\n next_allowed_at TEXT,\n failure_count INTEGER NOT NULL DEFAULT 0,\n outcome TEXT\n );\n CREATE TABLE IF NOT EXISTS monitoring_settings (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n background_collection_enabled INTEGER NOT NULL,\n interval_minutes INTEGER NOT NULL,\n notifications_enabled INTEGER NOT NULL,\n start_at_login INTEGER NOT NULL\n );\n CREATE TABLE IF NOT EXISTS notification_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS connector_diagnostics (\n id TEXT PRIMARY KEY,\n provider_id TEXT NOT NULL,\n billing_domain_id TEXT,\n status TEXT NOT NULL,\n category TEXT,\n message TEXT,\n recovery TEXT,\n affected_coverage TEXT NOT NULL,\n last_attempt_at TEXT NOT NULL,\n last_success_at TEXT\n );\n CREATE TABLE IF NOT EXISTS daily_usage_aggregates (\n provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,\n billing_domain_id TEXT NOT NULL,\n day_utc TEXT NOT NULL,\n model TEXT NOT NULL,\n authority TEXT NOT NULL,\n total_tokens INTEGER NOT NULL,\n input_tokens INTEGER NOT NULL,\n output_tokens INTEGER NOT NULL,\n reasoning_tokens INTEGER NOT NULL,\n cache_read_tokens INTEGER NOT NULL,\n cache_write_tokens INTEGER NOT NULL,\n source_count INTEGER NOT NULL,\n PRIMARY KEY (provider_id, billing_domain_id, day_utc, model, authority)\n );\n CREATE TABLE IF NOT EXISTS retention_state (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n last_compacted_at TEXT\n );\n CREATE TABLE IF NOT EXISTS application_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS plan_subscriptions (\n provider_id TEXT NOT NULL,\n billing_domain_id TEXT NOT NULL,\n plan_id TEXT,\n display_name TEXT NOT NULL,\n amount REAL NOT NULL,\n currency TEXT NOT NULL,\n billing_period TEXT NOT NULL,\n anchor_date TEXT,\n price_source TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (provider_id, billing_domain_id)\n );\n CREATE TABLE IF NOT EXISTS custom_model_rates (\n id TEXT PRIMARY KEY,\n provider_id TEXT NOT NULL,\n billing_domain_id TEXT,\n model TEXT NOT NULL,\n input_rate REAL NOT NULL,\n output_rate REAL NOT NULL,\n cache_read_rate REAL NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE UNIQUE INDEX IF NOT EXISTS idx_custom_model_rates_key\n ON custom_model_rates(provider_id, COALESCE(billing_domain_id, ''), lower(model));\n `);\n const usageColumns = this.#database\n .prepare('PRAGMA table_info(usage_observations)')\n .all() as unknown as Array<{ name: string }>;\n if (!usageColumns.some((column) => column.name === 'total_tokens')) {\n this.#database.exec(\n 'ALTER TABLE usage_observations ADD COLUMN total_tokens INTEGER NOT NULL DEFAULT 0'\n );\n this.#database.exec(\n 'UPDATE usage_observations SET total_tokens = input_tokens + output_tokens'\n );\n }\n if (!usageColumns.some((column) => column.name === 'session_id')) {\n this.#database.exec('ALTER TABLE usage_observations ADD COLUMN session_id TEXT');\n }\n if (!usageColumns.some((column) => column.name === 'reasoning_tokens')) {\n this.#database.exec(\n 'ALTER TABLE usage_observations ADD COLUMN reasoning_tokens INTEGER NOT NULL DEFAULT 0'\n );\n }\n for (const [name, definition] of [\n ['source_reported_total_tokens', 'INTEGER'],\n ['unclassified_tokens', 'INTEGER NOT NULL DEFAULT 0'],\n ['total_derivation', \"TEXT NOT NULL DEFAULT 'legacy-total'\"],\n ['reasoning_semantics', \"TEXT NOT NULL DEFAULT 'included-in-output'\"],\n ['cache_read_semantics', \"TEXT NOT NULL DEFAULT 'separate'\"],\n ['cache_write_semantics', \"TEXT NOT NULL DEFAULT 'separate'\"],\n ['model_attribution', \"TEXT NOT NULL DEFAULT 'known'\"],\n ['time_precision', \"TEXT NOT NULL DEFAULT 'unknown'\"],\n ['usage_scope', \"TEXT NOT NULL DEFAULT 'unknown'\"],\n ['aggregation_temporality', \"TEXT NOT NULL DEFAULT 'unknown'\"],\n ['cache_write_5m_tokens', 'INTEGER'],\n ['cache_write_1h_tokens', 'INTEGER']\n ] as const) {\n if (!usageColumns.some((column) => column.name === name)) {\n this.#database.exec(`ALTER TABLE usage_observations ADD COLUMN ${name} ${definition}`);\n }\n }\n this.#database.exec(`\n UPDATE usage_observations\n SET unclassified_tokens = MAX(\n 0,\n total_tokens - input_tokens - output_tokens - cache_read_tokens - cache_write_tokens\n )\n WHERE total_derivation = 'legacy-total'\n `);\n this.#database.exec(`\n UPDATE usage_observations\n SET model_attribution = 'unclassified',\n unclassified_tokens = total_tokens\n WHERE lower(trim(model)) IN ('all-models', 'unknown', 'unknown-model', '__unclassified__')\n `);\n this.#database.exec(`\n UPDATE usage_observations\n SET usage_scope = 'this-mac',\n total_derivation = 'categorized'\n WHERE usage_scope = 'unknown'\n AND (\n (provider_id = 'claude-code' AND id LIKE 'claude-otel:%')\n OR (provider_id = 'grok' AND id LIKE 'grok-otel:%')\n OR (provider_id = 'grok' AND id LIKE 'grok-headless:%')\n )\n `);\n const providerColumns = this.#database\n .prepare('PRAGMA table_info(providers)')\n .all() as unknown as Array<{ name: string }>;\n if (!providerColumns.some((column) => column.name === 'account_identifier')) {\n this.#database.exec('ALTER TABLE providers ADD COLUMN account_identifier TEXT');\n }\n if (!providerColumns.some((column) => column.name === 'last_error_code')) {\n this.#database.exec('ALTER TABLE providers ADD COLUMN last_error_code TEXT');\n }\n if (!providerColumns.some((column) => column.name === 'last_recovery')) {\n this.#database.exec('ALTER TABLE providers ADD COLUMN last_recovery TEXT');\n }\n const billingDomainColumns = this.#database\n .prepare('PRAGMA table_info(billing_domains)')\n .all() as unknown as Array<{ name: string }>;\n if (!billingDomainColumns.some((column) => column.name === 'last_success_at')) {\n this.#database.exec('ALTER TABLE billing_domains ADD COLUMN last_success_at TEXT');\n }\n this.#database.exec(`\n UPDATE billing_domains\n SET last_success_at = (\n SELECT providers.last_success_at\n FROM providers\n WHERE providers.id = billing_domains.provider_id\n )\n WHERE last_success_at IS NULL\n AND 1 = (\n SELECT COUNT(*)\n FROM billing_domains AS sibling\n WHERE sibling.provider_id = billing_domains.provider_id\n )\n `);\n const costColumns = this.#database\n .prepare('PRAGMA table_info(cost_records)')\n .all() as unknown as Array<{ name: string }>;\n if (!costColumns.some((column) => column.name === 'source_id')) {\n this.#database.exec('ALTER TABLE cost_records ADD COLUMN source_id TEXT');\n }\n for (const [name, type] of [\n ['price_snapshot_id', 'TEXT'],\n ['price_snapshot_version', 'TEXT'],\n ['price_snapshot_source', 'TEXT'],\n ['price_snapshot_canonical_model', 'TEXT'],\n ['price_snapshot_effective_at', 'TEXT'],\n ['price_snapshot_effective_until', 'TEXT'],\n ['price_snapshot_currency', 'TEXT'],\n ['price_snapshot_rates_json', 'TEXT'],\n ['price_snapshot_source_url', 'TEXT'],\n ['price_snapshot_context_tier', 'TEXT'],\n ['model', 'TEXT'],\n ['usage_observation_id', 'TEXT'],\n ['priced_tokens', 'INTEGER'],\n ['line_items_json', 'TEXT'],\n ['calculated_at', 'TEXT']\n ] as const) {\n if (!costColumns.some((column) => column.name === name)) {\n this.#database.exec(`ALTER TABLE cost_records ADD COLUMN ${name} ${type}`);\n }\n }\n this.#database.exec(`\n DELETE FROM cost_records\n WHERE kind = 'estimate' AND id LIKE 'opencode-quota-estimate:%'\n `);\n this.#database.exec(`\n UPDATE cost_records\n SET kind = 'retail-equivalent'\n WHERE kind = 'estimate'\n AND usage_observation_id IS NOT NULL\n AND priced_tokens IS NOT NULL\n AND line_items_json IS NOT NULL\n AND price_snapshot_id IS NOT NULL\n `);\n this.#database.exec(`\n UPDATE cost_records\n SET kind = 'reported-estimate'\n WHERE kind = 'estimate'\n AND (\n authority IN ('official-account', 'official-client', 'local-observation')\n OR id LIKE 'claude-otel-cost:%'\n OR id LIKE 'opencode-session-cost:%'\n OR price_snapshot_id IN (\n 'claude-code-otlp-reported-cost-v1',\n 'opencode-export-reported-cost-v1'\n )\n )\n `);\n this.#database.exec(`\n UPDATE cost_records\n SET kind = 'legacy-unknown'\n WHERE kind = 'estimate'\n `);\n this.#database.exec(`\n UPDATE cost_records\n SET model = NULL,\n usage_observation_id = NULL,\n priced_tokens = NULL,\n line_items_json = NULL,\n calculated_at = NULL\n WHERE kind = 'subscription'\n `);\n const quotaColumns = this.#database\n .prepare('PRAGMA table_info(quota_buckets)')\n .all() as unknown as Array<{ name: string }>;\n for (const [name, type] of [\n ['window_duration_minutes', 'INTEGER'],\n ['scope', 'TEXT'],\n ['status', 'TEXT'],\n ['limit_amount', 'REAL'],\n ['limit_currency', 'TEXT'],\n ['fallback_status', 'TEXT']\n ] as const) {\n if (!quotaColumns.some((column) => column.name === name)) {\n this.#database.exec(`ALTER TABLE quota_buckets ADD COLUMN ${name} ${type}`);\n }\n }\n // A database written before billing periods were modelled keeps its plan\n // rows; the renewal date is simply unknown until it is declared.\n const planColumns = this.#database\n .prepare('PRAGMA table_info(plan_subscriptions)')\n .all() as unknown as Array<{ name: string }>;\n if (planColumns.length > 0 && !planColumns.some((column) => column.name === 'anchor_date')) {\n this.#database.exec('ALTER TABLE plan_subscriptions ADD COLUMN anchor_date TEXT');\n }\n }\n}\n\nfunction normalizeCostForPersistence(cost: CostRecord): CostRecord {\n if (cost.kind !== 'subscription') return cost;\n return {\n ...cost,\n model: null,\n usageObservationId: null,\n pricedTokens: null,\n lineItems: [],\n calculatedAt: null\n };\n}\n\nfunction serializePriceRates(priceSnapshot: CostRecord['priceSnapshot']): string | null {\n return priceSnapshot?.ratesPerMillion\n ? JSON.stringify({\n ...priceSnapshot.ratesPerMillion,\n ...(priceSnapshot.cacheWriteRatesPerMillion\n ? {\n 'cache-write-5m': priceSnapshot.cacheWriteRatesPerMillion.fiveMinute,\n 'cache-write-1h': priceSnapshot.cacheWriteRatesPerMillion.oneHour\n }\n : {})\n })\n : null;\n}\n\nfunction mapQuotaRow(row: QuotaRow): QuotaBucket {\n return {\n id: row.id,\n billingDomainId: row.billing_domain_id,\n label: row.label,\n usedPercent: clampPercent(row.used_percent),\n windowDurationMinutes: row.window_duration_minutes,\n resetsAt: row.resets_at,\n authority: row.authority,\n observedAt: row.observed_at,\n scope: row.scope ?? undefined,\n status: row.status,\n limitAmount: row.limit_amount,\n limitCurrency: row.limit_currency,\n fallbackStatus: row.fallback_status\n };\n}\n\nfunction defaultMonitoringSettings(): MonitoringSettings {\n return {\n backgroundCollectionEnabled: true,\n intervalMinutes: 5,\n notificationsEnabled: false,\n startAtLogin: false\n };\n}\n\nfunction mapTokenTotals(tokens: TokenRow): ProviderOverview['tokenTotals'] {\n return {\n total: Number(tokens.total_tokens ?? 0),\n input: Number(tokens.input_tokens ?? 0),\n output: Number(tokens.output_tokens ?? 0),\n reasoning: Number(tokens.reasoning_tokens ?? 0),\n cacheRead: Number(tokens.cache_read_tokens ?? 0),\n cacheWrite: Number(tokens.cache_write_tokens ?? 0)\n };\n}\n\nfunction mapTokenEvidence(tokens: TokenRow): TokenEvidence {\n const recordedTokens = Number(tokens.total_tokens ?? 0);\n const unclassifiedTokens = Number(tokens.unclassified_tokens ?? 0);\n const classifiedTokens = Math.max(0, recordedTokens - unclassifiedTokens);\n return {\n recordedTokens,\n sourceReportedTokens: Number(tokens.source_reported_tokens ?? 0),\n sourceReportedObservationCount: Number(tokens.source_reported_observation_count ?? 0),\n observationCount: Number(tokens.observation_count ?? 0),\n unclassifiedTokens,\n classifiedTokens,\n classificationCoverage: recordedTokens === 0 ? null : classifiedTokens / recordedTokens,\n totalDerivations: commaSeparatedValues<TokenTotalDerivation>(tokens.total_derivations),\n timePrecisions: commaSeparatedValues<TokenTimePrecision>(tokens.time_precisions),\n usageScopes: commaSeparatedValues<TokenUsageScope>(tokens.usage_scopes),\n aggregationTemporalities: commaSeparatedValues<TokenAggregationTemporality>(\n tokens.aggregation_temporalities\n )\n };\n}\n\nfunction emptyTokenEvidence(): MutableTokenEvidence {\n return {\n recordedTokens: 0,\n sourceReportedTokens: 0,\n sourceReportedObservationCount: 0,\n observationCount: 0,\n unclassifiedTokens: 0,\n totalDerivations: new Set(),\n timePrecisions: new Set(),\n usageScopes: new Set(),\n aggregationTemporalities: new Set()\n };\n}\n\nfunction addTokenEvidence(target: MutableTokenEvidence, row: UsageHistoryRow): void {\n target.recordedTokens += Number(row.total_tokens);\n target.observationCount += 1;\n target.unclassifiedTokens += Number(row.unclassified_tokens);\n if (row.source_reported_total_tokens !== null) {\n target.sourceReportedTokens += Number(row.source_reported_total_tokens);\n target.sourceReportedObservationCount += 1;\n }\n target.totalDerivations.add(row.total_derivation);\n target.timePrecisions.add(row.time_precision);\n target.usageScopes.add(row.usage_scope);\n target.aggregationTemporalities.add(row.aggregation_temporality);\n}\n\nfunction finishTokenEvidence(evidence: MutableTokenEvidence): TokenEvidence {\n const classifiedTokens = Math.max(0, evidence.recordedTokens - evidence.unclassifiedTokens);\n return {\n recordedTokens: evidence.recordedTokens,\n sourceReportedTokens: evidence.sourceReportedTokens,\n sourceReportedObservationCount: evidence.sourceReportedObservationCount,\n observationCount: evidence.observationCount,\n unclassifiedTokens: evidence.unclassifiedTokens,\n classifiedTokens,\n classificationCoverage:\n evidence.recordedTokens === 0 ? null : classifiedTokens / evidence.recordedTokens,\n totalDerivations: [...evidence.totalDerivations].sort(),\n timePrecisions: [...evidence.timePrecisions].sort(),\n usageScopes: [...evidence.usageScopes].sort(),\n aggregationTemporalities: [...evidence.aggregationTemporalities].sort()\n };\n}\n\nfunction commaSeparatedValues<T extends string>(value: string | null): T[] {\n return value ? ([...new Set(value.split(',').filter(Boolean))].sort() as T[]) : [];\n}\n\nfunction priceSnapshotFromRow(row: CostRow): PriceSnapshotReference | null {\n const ratesPerMillion = parsePriceRates(row.price_snapshot_rates_json);\n const cacheWriteRatesPerMillion = parseCacheWriteRates(row.price_snapshot_rates_json);\n if (\n !row.price_snapshot_id ||\n !row.price_snapshot_version ||\n !row.price_snapshot_source ||\n !row.price_snapshot_effective_at ||\n !row.price_snapshot_currency ||\n !ratesPerMillion\n ) {\n return null;\n }\n return {\n id: row.price_snapshot_id,\n version: row.price_snapshot_version,\n source: row.price_snapshot_source,\n canonicalModel: row.price_snapshot_canonical_model,\n effectiveAt: row.price_snapshot_effective_at,\n effectiveUntil: row.price_snapshot_effective_until,\n currency: row.price_snapshot_currency,\n ratesPerMillion,\n ...(cacheWriteRatesPerMillion ? { cacheWriteRatesPerMillion } : {}),\n ...(row.price_snapshot_source_url ? { sourceUrl: row.price_snapshot_source_url } : {}),\n ...(row.price_snapshot_context_tier ? { contextTier: row.price_snapshot_context_tier } : {})\n };\n}\n\nfunction parseCacheWriteRates(\n value: string | null\n): PriceSnapshotReference['cacheWriteRatesPerMillion'] | null {\n if (!value) return null;\n try {\n const parsed = JSON.parse(value) as Record<string, unknown>;\n return typeof parsed['cache-write-5m'] === 'number' &&\n typeof parsed['cache-write-1h'] === 'number'\n ? {\n fiveMinute: parsed['cache-write-5m'],\n oneHour: parsed['cache-write-1h']\n }\n : null;\n } catch {\n return null;\n }\n}\n\nfunction parsePriceRates(value: string | null): PriceSnapshotReference['ratesPerMillion'] | null {\n if (!value) return null;\n try {\n const parsed = JSON.parse(value) as Record<string, unknown>;\n const kinds = ['input', 'output', 'reasoning', 'cache-read', 'cache-write'] as const;\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n !kinds.every((kind) => parsed[kind] === null || typeof parsed[kind] === 'number')\n ) {\n return null;\n }\n return Object.fromEntries(\n kinds.map((kind) => [kind, parsed[kind]])\n ) as PriceSnapshotReference['ratesPerMillion'];\n } catch {\n return null;\n }\n}\n\nfunction parseLineItems(value: string | null): RetailPriceLineItem[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? (parsed as RetailPriceLineItem[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction buildGlobalSummary(\n providers: ProviderOverview[],\n riskSummary: UsageOverview['riskSummary'],\n now: Date,\n query: UsageQuery\n): UsageOverview['globalSummary'] {\n const evidence = emptyTokenEvidence();\n const contributions: UsageOverview['globalSummary']['contributions'] = [];\n let latestObservedAt: string | null = null;\n let retailAmount = 0;\n let retailPricedTokens = 0;\n let sawRetailEquivalent = false;\n\n for (const { provider, domain, includedInHeadline } of allDomainHistories(providers)) {\n const domainEvidence = domain.history.tokenEvidence;\n if (domainEvidence.observationCount > 0) {\n contributions.push({\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n recordedTokens: domain.history.tokenTotals.total,\n tokenEvidence: domainEvidence,\n authorities: domain.history.authorities ?? [],\n lastObservedAt: domain.history.lastObservedAt ?? null\n });\n }\n if (!includedInHeadline) continue;\n for (const cost of domain.history.costs) {\n if (\n cost.kind !== 'retail-equivalent' ||\n cost.currency.toUpperCase() !== 'USD' ||\n cost.amount === null\n ) {\n continue;\n }\n sawRetailEquivalent = true;\n retailAmount += cost.amount;\n retailPricedTokens += cost.pricingEvidence?.pricedTokens ?? 0;\n }\n for (const observedAt of [\n domain.history.lastObservedAt,\n ...domain.quotaBuckets.map((bucket) => bucket.observedAt ?? null),\n domain.lastCostObservedAt,\n ...domain.balances.map((balance) => balance.observedAt),\n ...domain.invoices.map((invoice) => invoice.createdAt)\n ]) {\n if (observedAt && (!latestObservedAt || observedAt > latestObservedAt)) {\n latestObservedAt = observedAt;\n }\n }\n if (domainEvidence.observationCount === 0) continue;\n addAggregatedTokenEvidence(evidence, domainEvidence);\n }\n\n const tokenEvidence = finishTokenEvidence(evidence);\n return {\n window: query.window ?? providers[0]?.billingDomains[0]?.history.window ?? '24h',\n recordedTokens: tokenEvidence.observationCount > 0 ? tokenEvidence.recordedTokens : null,\n tokenEvidence,\n apiRetailEquivalent: {\n status: sawRetailEquivalent ? 'available' : 'unavailable',\n amount: sawRetailEquivalent ? preciseAmount(retailAmount) : null,\n currency: 'USD',\n pricingCoverage:\n tokenEvidence.recordedTokens === 0\n ? null\n : retailPricedTokens / tokenEvidence.recordedTokens\n },\n mostConstrained: riskSummary.mostConstrained,\n latestObservedAt,\n generatedAt: now.toISOString(),\n contributions\n };\n}\n\nfunction buildTokenMoneyWorkbench(\n providers: ProviderOverview[],\n now: Date,\n query: UsageQuery,\n planSubscriptions: PlanSubscription[],\n planBillingPeriods: Map<string, PlanBillingPeriodSummary>\n): UsageOverview['workbench'] {\n const normalized = normalizeUsageQuery(now, query);\n const allHistories = allDomainHistories(providers);\n const headlineHistories = allHistories.filter(({ includedInHeadline }) => includedInHeadline);\n const costs = headlineHistories.flatMap(({ history }) => history.costs);\n const rates = uniqueExchangeRates(\n headlineHistories.flatMap(({ history }) => history.exchangeRates)\n );\n const recordedTokens = headlineHistories.reduce(\n (total, { history }) => total + history.tokenEvidence.recordedTokens,\n 0\n );\n const observationCount = headlineHistories.reduce(\n (total, { history }) => total + history.tokenEvidence.observationCount,\n 0\n );\n const comparisonCurrency = normalized.comparisonCurrency;\n const metric = (purpose: UsageOverview['workbench']['costs']['actual']['purpose']) =>\n buildWorkbenchMetric(costs, purpose, comparisonCurrency, recordedTokens, rates);\n const actual = metric('actual');\n const reportedEstimate = metric('reported-estimate');\n const retailEquivalent = metric('retail-equivalent');\n const emptyIntervals = buildHistoryIntervals(normalized);\n const providerSummary = allHistories\n .flatMap(({ provider, domain, history, includedInHeadline }) => {\n const domainRetailEquivalent = buildWorkbenchMetric(\n history.costs,\n 'retail-equivalent',\n comparisonCurrency,\n history.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n if (history.tokenEvidence.observationCount === 0 && domainRetailEquivalent.records === 0) {\n return [];\n }\n return [\n {\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n recordedTokens:\n history.tokenEvidence.observationCount > 0\n ? history.tokenEvidence.recordedTokens\n : null,\n tokenShare:\n includedInHeadline && history.tokenEvidence.observationCount > 0 && recordedTokens > 0\n ? history.tokenEvidence.recordedTokens / recordedTokens\n : null,\n retailEquivalent: domainRetailEquivalent,\n retailShare:\n includedInHeadline &&\n domainRetailEquivalent.status === 'available' &&\n domainRetailEquivalent.amount !== null &&\n retailEquivalent.status === 'available' &&\n retailEquivalent.amount !== null &&\n retailEquivalent.amount !== 0\n ? domainRetailEquivalent.amount / retailEquivalent.amount\n : null,\n authorities: history.authorities ?? [],\n lastObservedAt: history.lastObservedAt ?? null\n }\n ];\n })\n .sort(\n (left, right) =>\n (right.recordedTokens ?? -1) - (left.recordedTokens ?? -1) ||\n `${left.providerId}:${left.billingDomainId}`.localeCompare(\n `${right.providerId}:${right.billingDomainId}`\n )\n );\n const headlineTokenTotals = headlineHistories.reduce(\n (total, { history }) => addTokenTotals(total, history.tokenTotals),\n zeroTokenTotals()\n );\n const classifiedTokens = headlineHistories.reduce(\n (total, { history }) => total + history.tokenEvidence.classifiedTokens,\n 0\n );\n const unclassifiedTokens = headlineHistories.reduce(\n (total, { history }) => total + history.tokenEvidence.unclassifiedTokens,\n 0\n );\n const classificationDenominator = classifiedTokens + unclassifiedTokens;\n const tokenBreakdown: UsageOverview['workbench']['tokenBreakdown'] = {\n status:\n observationCount === 0\n ? 'unavailable'\n : unclassifiedTokens === 0\n ? 'available'\n : classifiedTokens > 0\n ? 'partial'\n : 'unavailable',\n tokenTotals: headlineTokenTotals,\n classificationCoverage:\n classificationDenominator > 0 ? classifiedTokens / classificationDenominator : null,\n authorities: [\n ...new Set(headlineHistories.flatMap(({ history }) => history.authorities ?? []))\n ].sort(),\n lastObservedAt:\n headlineHistories\n .flatMap(({ history }) => (history.lastObservedAt ? [history.lastObservedAt] : []))\n .sort((left, right) => right.localeCompare(left))[0] ?? null\n };\n const dayBreakdown = emptyIntervals.map((emptyInterval, index) => {\n const intervals = headlineHistories.flatMap(({ history }) => {\n const interval = history.intervals[index];\n return interval ? [{ interval, rates: history.exchangeRates }] : [];\n });\n const intervalTokens = intervals.reduce(\n (total, { interval }) => total + interval.tokenEvidence.recordedTokens,\n 0\n );\n const intervalObservations = intervals.reduce(\n (total, { interval }) => total + interval.tokenEvidence.observationCount,\n 0\n );\n const intervalRetailEquivalent = buildWorkbenchMetric(\n intervals.flatMap(({ interval }) => interval.costs),\n 'retail-equivalent',\n comparisonCurrency,\n intervalTokens,\n uniqueExchangeRates(intervals.flatMap(({ rates }) => rates))\n );\n const authorities = [\n ...new Set(intervals.flatMap(({ interval }) => interval.authorities ?? []))\n ].sort();\n const lastObservedAt = intervals\n .flatMap(({ interval }) => (interval.lastObservedAt ? [interval.lastObservedAt] : []))\n .sort((left, right) => right.localeCompare(left))[0];\n return {\n start: emptyInterval.start.toISOString(),\n end: emptyInterval.end.toISOString(),\n label: emptyInterval.label,\n gap: intervalObservations === 0,\n recordedTokens: intervalObservations > 0 ? intervalTokens : null,\n tokenShare:\n intervalObservations > 0 && recordedTokens !== null && recordedTokens > 0\n ? intervalTokens / recordedTokens\n : null,\n retailEquivalent: intervalRetailEquivalent,\n retailShare:\n intervalRetailEquivalent.status === 'available' &&\n intervalRetailEquivalent.amount !== null &&\n retailEquivalent.status === 'available' &&\n retailEquivalent.amount !== null &&\n retailEquivalent.amount !== 0\n ? intervalRetailEquivalent.amount / retailEquivalent.amount\n : null,\n authorities,\n lastObservedAt: lastObservedAt ?? null\n };\n });\n const buckets = emptyIntervals.map((emptyInterval, index) => {\n const segments = allHistories.flatMap(({ provider, domain, history, includedInHeadline }) => {\n const interval = history.intervals[index];\n if (!interval) return [];\n const retailEquivalent = buildWorkbenchMetric(\n interval.costs,\n 'retail-equivalent',\n comparisonCurrency,\n interval.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n const reportedEstimate = buildWorkbenchMetric(\n interval.costs,\n 'reported-estimate',\n comparisonCurrency,\n interval.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n if (\n interval.tokenEvidence.observationCount === 0 &&\n retailEquivalent.records === 0 &&\n reportedEstimate.records === 0\n )\n return [];\n return [\n {\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n recordedTokens: interval.tokenEvidence.recordedTokens,\n observationCount: interval.tokenEvidence.observationCount,\n timePrecisions: interval.tokenEvidence.timePrecisions,\n authorities: interval.authorities ?? [],\n lastObservedAt: interval.lastObservedAt ?? null,\n retailEquivalent: {\n status: retailEquivalent.status,\n amount: retailEquivalent.amount,\n currency: comparisonCurrency\n },\n reportedEstimate: {\n status: reportedEstimate.status,\n amount: reportedEstimate.amount,\n currency: comparisonCurrency\n }\n }\n ];\n });\n return {\n start: emptyInterval.start.toISOString(),\n end: emptyInterval.end.toISOString(),\n label: emptyInterval.label,\n gap: segments.every((segment) => segment.observationCount === 0),\n segments\n };\n });\n return {\n window: normalized.window,\n start: normalized.start.toISOString(),\n end: normalized.end.toISOString(),\n timeZone: normalized.timeZone,\n comparisonCurrency,\n recordedTokens: observationCount > 0 ? recordedTokens : null,\n costs: {\n actual,\n reportedEstimate,\n retailEquivalent\n },\n trend: {\n granularity: normalized.window === '24h' ? 'hour' : 'day',\n buckets\n },\n providerSummary,\n tokenBreakdown,\n dayBreakdown,\n modelRanking: buildWorkbenchModelRanking(\n allHistories,\n buckets,\n comparisonCurrency,\n observationCount > 0 ? recordedTokens : null,\n retailEquivalent,\n reportedEstimate\n ),\n planValue: buildWorkbenchPlanValue({\n domains: planValueDomains(allHistories, comparisonCurrency),\n subscriptions: planSubscriptions,\n comparisonCurrency,\n start: normalized.start.toISOString(),\n end: normalized.end.toISOString(),\n rates: uniqueExchangeRates(allHistories.flatMap(({ history }) => history.exchangeRates)),\n billingPeriods: planBillingPeriods\n })\n };\n}\n\nfunction planValueDomains(\n histories: ReturnType<typeof allDomainHistories>,\n comparisonCurrency: string\n): PlanValueDomainInput[] {\n return histories.map(({ provider, domain, history, includedInHeadline }) => {\n const domainTokens = history.tokenEvidence.recordedTokens;\n const metric = (purpose: UsageOverview['workbench']['costs']['actual']['purpose']) =>\n buildWorkbenchMetric(\n history.costs,\n purpose,\n comparisonCurrency,\n domainTokens,\n history.exchangeRates\n );\n return {\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n recordedTokens: domainTokens,\n observationCount: history.tokenEvidence.observationCount,\n retailEquivalent: metric('retail-equivalent'),\n actualCost: metric('actual'),\n authorities: history.authorities ?? [],\n lastObservedAt: history.lastObservedAt ?? null\n };\n });\n}\n\nfunction allDomainHistories(providers: ProviderOverview[]): Array<{\n provider: ProviderOverview;\n domain: BillingDomainOverview;\n history: BillingHistory;\n includedInHeadline: boolean;\n}> {\n return providers.flatMap((provider) =>\n provider.billingDomains.map((domain) => ({\n provider,\n domain,\n history: domain.history,\n includedInHeadline:\n provider.id === 'dsh' || (provider.id === 'grok' && domain.id !== 'xai-api')\n ? true\n : domain.id === provider.summaryBillingDomainId\n }))\n );\n}\n\nfunction buildWorkbenchMetric(\n costs: HistoryCost[],\n purpose: UsageOverview['workbench']['costs']['actual']['purpose'],\n comparisonCurrency: string,\n recordedTokens: number,\n rates: ExchangeRateSnapshot[]\n): UsageOverview['workbench']['costs']['actual'] {\n const relevant = costs.filter((cost) => cost.kind === purpose);\n const native = new Map<\n string,\n { amount: number; complete: boolean; records: number; knownRecords: number }\n >();\n const authorities = new Set<DataAuthority>();\n const conversionUnavailableReasons = new Set<\n 'unknown-native-amount' | 'missing-rate' | 'stale-rate'\n >();\n let observedAt: string | null = null;\n let records = 0;\n let knownRecords = 0;\n let convertedRecords = 0;\n let convertedAmount = 0;\n let pricedTokens = 0;\n for (const cost of relevant) {\n const rowRecords = cost.records ?? 1;\n const rowKnownRecords = cost.knownRecords ?? (cost.amount === null ? 0 : rowRecords);\n records += rowRecords;\n knownRecords += rowKnownRecords;\n if (cost.convertedAmount !== null) {\n convertedAmount += cost.convertedAmount;\n convertedRecords += rowKnownRecords;\n }\n if (cost.conversionUnavailableReason) {\n conversionUnavailableReasons.add(cost.conversionUnavailableReason);\n }\n for (const authority of cost.authorities ?? []) authorities.add(authority);\n if (cost.observedAt && (!observedAt || cost.observedAt > observedAt))\n observedAt = cost.observedAt;\n pricedTokens += cost.pricingEvidence?.pricedTokens ?? 0;\n const currency = cost.currency.toUpperCase();\n const amount = native.get(currency) ?? {\n amount: 0,\n complete: true,\n records: 0,\n knownRecords: 0\n };\n amount.records += rowRecords;\n amount.knownRecords += rowKnownRecords;\n if (cost.amount === null || rowKnownRecords !== rowRecords) amount.complete = false;\n else amount.amount += cost.amount;\n native.set(currency, amount);\n }\n const status =\n records === 0\n ? 'unavailable'\n : knownRecords === records && convertedRecords === records\n ? 'available'\n : convertedRecords > 0\n ? 'partial'\n : 'unavailable';\n const nativeCurrencies = new Set(native.keys());\n return {\n purpose,\n status,\n amount: status === 'available' ? preciseAmount(convertedAmount) : null,\n comparisonCurrency,\n nativeAmounts: [...native.entries()]\n .map(([currency, amount]) => ({\n currency,\n amount: amount.complete ? preciseAmount(amount.amount) : null,\n records: amount.records,\n knownRecords: amount.knownRecords\n }))\n .sort((left, right) => left.currency.localeCompare(right.currency)),\n authorities: [...authorities].sort(),\n observedAt,\n records,\n knownRecords,\n amountCoverage: records === 0 ? null : knownRecords / records,\n pricingCoverage:\n purpose === 'retail-equivalent' && recordedTokens > 0 ? pricedTokens / recordedTokens : null,\n pricedTokens,\n recordedTokens,\n conversionUnavailableReasons: [...conversionUnavailableReasons].sort(),\n exchangeRates: rates\n .filter(\n (rate) =>\n rate.quoteCurrency.toUpperCase() === comparisonCurrency &&\n nativeCurrencies.has(rate.baseCurrency.toUpperCase())\n )\n .sort((left, right) => left.id.localeCompare(right.id))\n };\n}\n\nfunction uniqueExchangeRates(rates: ExchangeRateSnapshot[]): ExchangeRateSnapshot[] {\n return [...new Map(rates.map((rate) => [rate.id, rate])).values()];\n}\n\nfunction buildWorkbenchModelRanking(\n histories: Array<{\n provider: ProviderOverview;\n domain: BillingDomainOverview;\n history: BillingHistory;\n includedInHeadline: boolean;\n }>,\n buckets: UsageOverview['workbench']['trend']['buckets'],\n comparisonCurrency: string,\n recordedTokens: number | null,\n totalRetailEquivalent: UsageOverview['workbench']['costs']['retailEquivalent'],\n totalReportedEstimate: UsageOverview['workbench']['costs']['reportedEstimate']\n): UsageOverview['workbench']['modelRanking'] {\n const entries = histories.flatMap(({ provider, domain, history, includedInHeadline }) =>\n history.models.map((model) => {\n const retailEquivalent = buildWorkbenchMetric(\n model.priceEvidence ?? [],\n 'retail-equivalent',\n comparisonCurrency,\n model.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n const reportedEstimate = buildWorkbenchMetric(\n model.priceEvidence ?? [],\n 'reported-estimate',\n comparisonCurrency,\n model.tokenEvidence.recordedTokens,\n history.exchangeRates\n );\n const observations = model.observations ?? [];\n const priceEvidence = model.priceEvidence ?? [];\n const authorities = [\n ...new Set(observations.map((observation) => observation.authority))\n ].sort();\n const lastObservedAt =\n observations.reduce<string | null>(\n (latest, observation) =>\n latest === null || observation.observedAt > latest ? observation.observedAt : latest,\n null\n ) ?? null;\n return {\n id: modelRankingId(provider.id, domain.id, model.model),\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n model: model.model,\n tokenTotals: model.tokenTotals,\n tokenEvidence: model.tokenEvidence,\n tokenShare:\n !includedInHeadline || recordedTokens === null || recordedTokens === 0\n ? null\n : model.tokenTotals.total / recordedTokens,\n retailEquivalent,\n reportedEstimate,\n retailShare:\n includedInHeadline &&\n retailEquivalent.status === 'available' &&\n retailEquivalent.amount !== null &&\n totalRetailEquivalent.status === 'available' &&\n totalRetailEquivalent.amount !== null &&\n totalRetailEquivalent.amount !== 0\n ? retailEquivalent.amount / totalRetailEquivalent.amount\n : null,\n reportedShare:\n includedInHeadline &&\n reportedEstimate.status === 'available' &&\n reportedEstimate.amount !== null &&\n totalReportedEstimate.status === 'available' &&\n totalReportedEstimate.amount !== null &&\n totalReportedEstimate.amount !== 0\n ? reportedEstimate.amount / totalReportedEstimate.amount\n : null,\n authorities,\n lastObservedAt,\n composition: nonOverlappingComposition(observations, model.tokenTotals),\n priceSnapshots: distinctPriceSnapshots(priceEvidence),\n trend: buckets.map((bucket) => {\n const bucketObservations = observations.filter(\n (observation) =>\n observation.observedAt >= bucket.start && observation.observedAt < bucket.end\n );\n const bucketPriceEvidence = priceEvidence.filter(\n (cost) =>\n (cost.observedAt ?? '') >= bucket.start && (cost.observedAt ?? '') < bucket.end\n );\n const tokenTotals = bucketObservations.reduce(\n (total, observation) => addTokenTotals(total, observation.tokenTotals),\n zeroTokenTotals()\n );\n const intervalRetail = buildWorkbenchMetric(\n bucketPriceEvidence,\n 'retail-equivalent',\n comparisonCurrency,\n tokenTotals.total,\n history.exchangeRates\n );\n const intervalReported = buildWorkbenchMetric(\n bucketPriceEvidence,\n 'reported-estimate',\n comparisonCurrency,\n tokenTotals.total,\n history.exchangeRates\n );\n return {\n start: bucket.start,\n end: bucket.end,\n label: bucket.label,\n gap: bucketObservations.length === 0,\n tokenTotals,\n recordedTokens: bucketObservations.reduce(\n (total, observation) => total + observation.recordedTokens,\n 0\n ),\n authorities: [\n ...new Set(bucketObservations.map((observation) => observation.authority))\n ].sort(),\n lastObservedAt:\n bucketObservations.reduce<string | null>(\n (latest, observation) =>\n latest === null || observation.observedAt > latest\n ? observation.observedAt\n : latest,\n null\n ) ?? null,\n retailEquivalent: {\n status: intervalRetail.status,\n amount: intervalRetail.amount,\n comparisonCurrency,\n pricingCoverage: intervalRetail.pricingCoverage,\n authorities: intervalRetail.authorities,\n observedAt: intervalRetail.observedAt\n },\n reportedEstimate: {\n status: intervalReported.status,\n amount: intervalReported.amount,\n comparisonCurrency,\n pricingCoverage: intervalReported.pricingCoverage,\n authorities: intervalReported.authorities,\n observedAt: intervalReported.observedAt\n }\n };\n })\n };\n })\n );\n const byTokens = [...entries].sort(\n (left, right) =>\n right.tokenTotals.total - left.tokenTotals.total || left.id.localeCompare(right.id)\n );\n const byRetailEquivalent = [...entries].sort((left, right) => {\n const leftAvailable = left.retailEquivalent.status === 'available';\n const rightAvailable = right.retailEquivalent.status === 'available';\n if (leftAvailable !== rightAvailable) return leftAvailable ? -1 : 1;\n if (leftAvailable && rightAvailable) {\n const amountDifference =\n (right.retailEquivalent.amount ?? 0) - (left.retailEquivalent.amount ?? 0);\n if (amountDifference !== 0) return amountDifference;\n } else {\n const tokenDifference = right.tokenTotals.total - left.tokenTotals.total;\n if (tokenDifference !== 0) return tokenDifference;\n }\n return left.id.localeCompare(right.id);\n });\n const byCost = [...entries].sort((left, right) => {\n const leftCost =\n left.retailEquivalent.status === 'available' ? left.retailEquivalent : left.reportedEstimate;\n const rightCost =\n right.retailEquivalent.status === 'available'\n ? right.retailEquivalent\n : right.reportedEstimate;\n const leftAvailable = leftCost.status === 'available';\n const rightAvailable = rightCost.status === 'available';\n if (leftAvailable !== rightAvailable) return leftAvailable ? -1 : 1;\n if (leftAvailable && rightAvailable) {\n const amountDifference = (rightCost.amount ?? 0) - (leftCost.amount ?? 0);\n if (amountDifference !== 0) return amountDifference;\n } else {\n const tokenDifference = right.tokenTotals.total - left.tokenTotals.total;\n if (tokenDifference !== 0) return tokenDifference;\n }\n return left.id.localeCompare(right.id);\n });\n const unclassified = histories\n .filter(({ history }) => history.unclassified.tokenEvidence.observationCount > 0)\n .map(({ provider, domain, history, includedInHeadline }) => ({\n providerId: provider.id,\n providerDisplayName: provider.displayName,\n billingDomainId: domain.id,\n billingDomainDisplayName: domain.displayName,\n includedInHeadline,\n tokenTotals: history.unclassified.tokenTotals,\n tokenEvidence: history.unclassified.tokenEvidence,\n tokenShare:\n !includedInHeadline || recordedTokens === null || recordedTokens === 0\n ? null\n : history.unclassified.tokenTotals.total / recordedTokens,\n authorities: history.unclassified.authorities,\n lastObservedAt: history.unclassified.lastObservedAt\n }))\n .sort(\n (left, right) =>\n right.tokenTotals.total - left.tokenTotals.total ||\n modelRankingId(left.providerId, left.billingDomainId, '').localeCompare(\n modelRankingId(right.providerId, right.billingDomainId, '')\n )\n );\n return {\n byTokens: byTokens.map((entry) => entry.id),\n byCost: byCost.map((entry) => entry.id),\n byRetailEquivalent: byRetailEquivalent.map((entry) => entry.id),\n entries: byTokens,\n unclassified\n };\n}\n\n// Adding every Token category would double count a source that already folds reasoning\n// or cache Tokens into its own total, so only categories the source reports separately\n// contribute. Without observations the model total is the only honest answer.\n// Audit rows exist so the workbench can bucket and price each observation. Once the read\n// model is built only an export still needs them, and a response that carries them grows\n// with the whole retained history instead of with what the Dashboard displays.\nfunction dropAuditEvidence(providers: ProviderOverview[]): void {\n for (const provider of providers) {\n for (const domain of provider.billingDomains) {\n for (const model of domain.history.models) {\n delete model.observations;\n delete model.priceEvidence;\n }\n delete domain.history.unclassified.observations;\n }\n }\n}\n\nfunction nonOverlappingComposition(\n observations: HistoryModelObservation[],\n fallback: TokenTotals\n): TokenTotals {\n if (observations.length === 0) {\n return {\n ...fallback,\n total: fallback.input + fallback.output + fallback.cacheRead + fallback.cacheWrite\n };\n }\n const totals = zeroTokenTotals();\n for (const observation of observations) {\n totals.input += observation.tokenTotals.input;\n totals.output += observation.tokenTotals.output;\n if (observation.tokenSemantics.reasoning === 'separate') {\n totals.reasoning += observation.tokenTotals.reasoning;\n }\n if (observation.tokenSemantics.cacheRead === 'separate') {\n totals.cacheRead += observation.tokenTotals.cacheRead;\n }\n if (observation.tokenSemantics.cacheWrite === 'separate') {\n totals.cacheWrite += observation.tokenTotals.cacheWrite;\n }\n }\n totals.total =\n totals.input + totals.output + totals.reasoning + totals.cacheRead + totals.cacheWrite;\n return totals;\n}\n\n// Price snapshots are immutable and shared by every cost record priced against them,\n// so the drawer needs each one once rather than once per priced observation.\nfunction distinctPriceSnapshots(\n priceEvidence: HistoryModelPriceEvidence[]\n): PriceSnapshotReference[] {\n const snapshots = new Map<string, PriceSnapshotReference>();\n for (const evidence of priceEvidence) {\n const snapshot = evidence.priceSnapshot;\n if (snapshot && !snapshots.has(snapshot.id)) snapshots.set(snapshot.id, snapshot);\n }\n return [...snapshots.values()];\n}\n\nfunction modelRankingId(providerId: string, billingDomainId: string, model: string): string {\n return `${providerId}::${billingDomainId}::${model}`;\n}\n\nfunction addTokenTotals(\n target: ProviderOverview['tokenTotals'],\n value: ProviderOverview['tokenTotals']\n) {\n target.total += value.total;\n target.input += value.input;\n target.output += value.output;\n target.reasoning += value.reasoning;\n target.cacheRead += value.cacheRead;\n target.cacheWrite += value.cacheWrite;\n return target;\n}\n\nfunction addAggregatedTokenEvidence(target: MutableTokenEvidence, source: TokenEvidence): void {\n target.recordedTokens += source.recordedTokens;\n target.sourceReportedTokens += source.sourceReportedTokens;\n target.sourceReportedObservationCount += source.sourceReportedObservationCount;\n target.observationCount += source.observationCount;\n target.unclassifiedTokens += source.unclassifiedTokens;\n for (const value of source.totalDerivations) target.totalDerivations.add(value);\n for (const value of source.timePrecisions) target.timePrecisions.add(value);\n for (const value of source.usageScopes) target.usageScopes.add(value);\n for (const value of source.aggregationTemporalities) {\n target.aggregationTemporalities.add(value);\n }\n}\n\ninterface NormalizedUsageQuery {\n window: HistoryWindow;\n start: Date;\n end: Date;\n timeZone: string;\n comparisonCurrency: string;\n}\n\nfunction normalizeUsageQuery(now: Date, query: UsageQuery): NormalizedUsageQuery {\n const window = query.window ?? '24h';\n const durations: Record<HistoryWindow, number> = {\n '24h': 24 * 60 * 60 * 1000,\n '7d': 7 * 24 * 60 * 60 * 1000,\n '30d': 30 * 24 * 60 * 60 * 1000\n };\n const timeZone = validTimeZone(query.timeZone) ? query.timeZone! : 'UTC';\n return {\n window,\n start: new Date(now.getTime() - durations[window]),\n end: now,\n timeZone,\n comparisonCurrency: (query.comparisonCurrency ?? 'CNY').toUpperCase()\n };\n}\n\nfunction buildHistoryIntervals(\n query: NormalizedUsageQuery\n): Array<{ start: Date; end: Date; label: string }> {\n const count = query.window === '24h' ? 24 : query.window === '7d' ? 7 : 30;\n const duration = (query.end.getTime() - query.start.getTime()) / count;\n return Array.from({ length: count }, (_, index) => {\n const start = new Date(query.start.getTime() + index * duration);\n const end = new Date(\n index === count - 1 ? query.end.getTime() : query.start.getTime() + (index + 1) * duration\n );\n return {\n start,\n end,\n label:\n query.window === '24h'\n ? localHour(start.toISOString(), query.timeZone)\n : localDay(start.toISOString(), query.timeZone)\n };\n });\n}\n\nfunction historyIntervalIndex(observedAt: string, query: NormalizedUsageQuery): number {\n const count = query.window === '24h' ? 24 : query.window === '7d' ? 7 : 30;\n const elapsed = new Date(observedAt).getTime() - query.start.getTime();\n const duration = (query.end.getTime() - query.start.getTime()) / count;\n return Math.max(0, Math.min(count - 1, Math.floor(elapsed / duration)));\n}\n\nfunction validTimeZone(value: string | undefined): boolean {\n if (!value) return false;\n try {\n new Intl.DateTimeFormat('en', { timeZone: value }).format();\n return true;\n } catch {\n return false;\n }\n}\n\nfunction zeroTokenTotals(): ProviderOverview['tokenTotals'] {\n return { total: 0, input: 0, output: 0, reasoning: 0, cacheRead: 0, cacheWrite: 0 };\n}\n\nfunction addUsageRow(target: ProviderOverview['tokenTotals'], row: UsageHistoryRow): void {\n target.total += Number(row.total_tokens);\n target.input += Number(row.input_tokens);\n target.output += Number(row.output_tokens);\n target.reasoning += Number(row.reasoning_tokens);\n target.cacheRead += Number(row.cache_read_tokens);\n target.cacheWrite += Number(row.cache_write_tokens);\n}\n\nfunction classifiedUsageRow(row: UsageHistoryRow): UsageHistoryRow {\n const classifiedTokens = Math.max(0, Number(row.total_tokens) - Number(row.unclassified_tokens));\n return {\n ...row,\n total_tokens: classifiedTokens,\n source_reported_total_tokens:\n row.unclassified_tokens === 0 ? row.source_reported_total_tokens : null,\n unclassified_tokens: 0,\n total_derivation: row.unclassified_tokens === 0 ? row.total_derivation : 'categorized'\n };\n}\n\nfunction unclassifiedUsageRow(row: UsageHistoryRow): UsageHistoryRow | null {\n const unclassifiedTokens = Number(row.unclassified_tokens);\n if (unclassifiedTokens === 0) return null;\n return {\n ...row,\n total_tokens: unclassifiedTokens,\n input_tokens: 0,\n output_tokens: 0,\n reasoning_tokens: 0,\n cache_read_tokens: 0,\n cache_write_tokens: 0,\n source_reported_total_tokens:\n row.model_attribution === 'unclassified' ? row.source_reported_total_tokens : null,\n unclassified_tokens: unclassifiedTokens,\n model_attribution: 'unclassified'\n };\n}\n\nfunction addUnclassifiedUsage(\n target: {\n tokens: ReturnType<typeof zeroTokenTotals>;\n evidence: MutableTokenEvidence;\n authorities: Set<DataAuthority>;\n lastObservedAt: string | null;\n observations: UsageHistoryRow[];\n },\n row: UsageHistoryRow\n): void {\n addUsageRow(target.tokens, row);\n addTokenEvidence(target.evidence, row);\n target.authorities.add(row.authority);\n target.observations.push(row);\n if (!target.lastObservedAt || row.observed_at > target.lastObservedAt) {\n target.lastObservedAt = row.observed_at;\n }\n}\n\nfunction mapHistoryModelObservation(row: UsageHistoryRow): HistoryModelObservation {\n return {\n id: row.id,\n model: row.model === '__unclassified__' ? null : row.model,\n observedAt: row.observed_at,\n authority: row.authority,\n timePrecision: row.time_precision,\n sourceReportedTotalTokens: row.source_reported_total_tokens,\n cacheWriteTokenBreakdown: cacheWriteTokenBreakdownFromRow(row),\n recordedTokens: Number(row.total_tokens),\n classifiedTokens: Math.max(0, Number(row.total_tokens) - Number(row.unclassified_tokens)),\n unclassifiedTokens: Number(row.unclassified_tokens),\n totalDerivation: row.total_derivation,\n tokenSemantics: {\n reasoning: row.reasoning_semantics,\n cacheRead: row.cache_read_semantics,\n cacheWrite: row.cache_write_semantics\n },\n usageScope: row.usage_scope,\n aggregationTemporality: row.aggregation_temporality,\n tokenTotals: {\n total: Math.max(0, Number(row.total_tokens) - Number(row.unclassified_tokens)),\n input: Number(row.input_tokens),\n output: Number(row.output_tokens),\n reasoning: Number(row.reasoning_tokens),\n cacheRead: Number(row.cache_read_tokens),\n cacheWrite: Number(row.cache_write_tokens)\n }\n };\n}\n\nfunction cacheWriteTokenBreakdownFromRow(\n row: UsageHistoryRow\n): HistoryModelObservation['cacheWriteTokenBreakdown'] {\n return row.cache_write_5m_tokens === null || row.cache_write_1h_tokens === null\n ? null\n : {\n fiveMinute: Number(row.cache_write_5m_tokens),\n oneHour: Number(row.cache_write_1h_tokens)\n };\n}\n\nfunction mapUnclassifiedObservation(row: UsageHistoryRow): HistoryModelObservation {\n return {\n id: row.id,\n model: row.model === '__unclassified__' ? null : row.model,\n observedAt: row.observed_at,\n authority: row.authority,\n timePrecision: row.time_precision,\n sourceReportedTotalTokens: row.source_reported_total_tokens,\n cacheWriteTokenBreakdown: cacheWriteTokenBreakdownFromRow(row),\n recordedTokens: Number(row.total_tokens),\n classifiedTokens: 0,\n unclassifiedTokens: Number(row.unclassified_tokens),\n totalDerivation: row.total_derivation,\n tokenSemantics: {\n reasoning: row.reasoning_semantics,\n cacheRead: row.cache_read_semantics,\n cacheWrite: row.cache_write_semantics\n },\n usageScope: row.usage_scope,\n aggregationTemporality: row.aggregation_temporality,\n tokenTotals: {\n total: Number(row.total_tokens),\n input: Number(row.input_tokens),\n output: Number(row.output_tokens),\n reasoning: Number(row.reasoning_tokens),\n cacheRead: Number(row.cache_read_tokens),\n cacheWrite: Number(row.cache_write_tokens)\n }\n };\n}\n\nfunction localDay(observedAt: string, timeZone: string): string {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).formatToParts(new Date(observedAt));\n const part = (type: Intl.DateTimeFormatPartTypes) =>\n parts.find((candidate) => candidate.type === type)?.value ?? '';\n return `${part('year')}-${part('month')}-${part('day')}`;\n}\n\nfunction localHour(observedAt: string, timeZone: string): string {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n hourCycle: 'h23'\n }).formatToParts(new Date(observedAt));\n const part = (type: Intl.DateTimeFormatPartTypes) =>\n parts.find((candidate) => candidate.type === type)?.value ?? '';\n return `${part('year')}-${part('month')}-${part('day')} ${part('hour')}:00`;\n}\n\nfunction summarizeHistoryCosts(\n rows: CostRow[],\n recordedTokens: number,\n rates: Map<string, ExchangeRateRow>,\n comparisonCurrency: string,\n end: Date,\n usedRates: Map<string, ExchangeRateSnapshot>\n): HistoryCost[] {\n const groups = new Map<\n string,\n {\n kind: CostRecord['kind'];\n currency: string;\n amount: number;\n unknown: boolean;\n prices: Map<string, PriceSnapshotReference>;\n authorities: Set<DataAuthority>;\n observedAt: string | null;\n pricedTokens: number;\n records: number;\n knownRecords: number;\n }\n >();\n for (const row of rows) {\n const currency = row.currency.toUpperCase();\n const key = `${row.kind}:${currency}`;\n const group = groups.get(key) ?? {\n kind: row.kind,\n currency,\n amount: 0,\n unknown: false,\n prices: new Map<string, PriceSnapshotReference>(),\n authorities: new Set<DataAuthority>(),\n observedAt: null,\n pricedTokens: 0,\n records: 0,\n knownRecords: 0\n };\n group.records += 1;\n if (!group.observedAt || row.observed_at > group.observedAt) group.observedAt = row.observed_at;\n group.authorities.add(row.authority);\n if (row.amount === null) group.unknown = true;\n else {\n group.amount += Number(row.amount);\n group.knownRecords += 1;\n }\n if (row.kind === 'retail-equivalent') group.pricedTokens += Number(row.priced_tokens ?? 0);\n const price = priceSnapshotFromRow(row);\n if (price) group.prices.set(price.id, price);\n groups.set(key, group);\n }\n return [...groups.values()]\n .map((group): HistoryCost => {\n const amount = group.unknown ? null : group.amount;\n const pricingEvidence =\n group.kind === 'retail-equivalent'\n ? {\n pricedTokens: group.pricedTokens,\n unpricedTokens: Math.max(0, recordedTokens - group.pricedTokens),\n recordedTokens,\n pricingCoverage: recordedTokens === 0 ? null : group.pricedTokens / recordedTokens\n }\n : undefined;\n if (amount === null) {\n return {\n kind: group.kind,\n currency: group.currency,\n amount: null,\n convertedAmount: null,\n comparisonCurrency,\n conversionUnavailableReason: 'unknown-native-amount',\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n }\n if (group.currency === comparisonCurrency) {\n return {\n kind: group.kind,\n currency: group.currency,\n amount,\n convertedAmount: amount,\n comparisonCurrency,\n conversionUnavailableReason: null,\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n }\n const rate = rates.get(group.currency);\n if (!rate) {\n return {\n kind: group.kind,\n currency: group.currency,\n amount,\n convertedAmount: null,\n comparisonCurrency,\n conversionUnavailableReason: 'missing-rate',\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n }\n if (end.getTime() - new Date(rate.observed_at).getTime() > 7 * 24 * 60 * 60 * 1000) {\n return {\n kind: group.kind,\n currency: group.currency,\n amount,\n convertedAmount: null,\n comparisonCurrency,\n conversionUnavailableReason: 'stale-rate',\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n }\n usedRates.set(rate.id, {\n id: rate.id,\n baseCurrency: rate.base_currency,\n quoteCurrency: rate.quote_currency,\n rate: rate.rate,\n observedAt: rate.observed_at,\n source: rate.source\n });\n return {\n kind: group.kind,\n currency: group.currency,\n amount,\n convertedAmount: amount * rate.rate,\n comparisonCurrency,\n conversionUnavailableReason: null,\n priceSnapshots: [...group.prices.values()],\n authorities: [...group.authorities].sort(),\n observedAt: group.observedAt,\n records: group.records,\n knownRecords: group.knownRecords,\n pricingEvidence\n };\n })\n .sort(\n (left, right) =>\n left.kind.localeCompare(right.kind) || left.currency.localeCompare(right.currency)\n );\n}\n\nfunction buildRiskSummary(providers: ProviderOverview[]): UsageOverview['riskSummary'] {\n const risks = providers.flatMap((provider) =>\n provider.billingDomains.flatMap((domain) =>\n domain.quotaBuckets.flatMap((bucket) => {\n if (bucket.usedPercent === null) return [];\n return [\n {\n providerId: provider.id,\n displayName: provider.displayName,\n billingDomainId: domain.id,\n bucketId: bucket.id,\n label: bucket.label,\n remainingPercent: Math.max(0, 100 - bucket.usedPercent),\n resetsAt: bucket.resetsAt,\n forecast: domain.forecasts.find((forecast) => forecast.bucketId === bucket.id) ?? null,\n authority: bucket.authority,\n observedAt: bucket.observedAt ?? domain.freshness.lastSuccessAt\n }\n ];\n })\n )\n );\n risks.sort(\n (left, right) =>\n left.remainingPercent - right.remainingPercent ||\n left.providerId.localeCompare(right.providerId) ||\n left.bucketId.localeCompare(right.bucketId)\n );\n const candidates = providers\n .flatMap((provider) =>\n provider.billingDomains.flatMap((domain) => {\n if (domain.freshness.status !== 'fresh' || domain.health.status !== 'healthy') return [];\n const buckets = domain.quotaBuckets.filter(\n (bucket): bucket is QuotaBucket & { usedPercent: number } => bucket.usedPercent !== null\n );\n if (buckets.length === 0) return [];\n const limitingBucket = [...buckets].sort(\n (left, right) => right.usedPercent - left.usedPercent || left.id.localeCompare(right.id)\n )[0];\n const remaining = Math.max(\n 0,\n Math.min(...buckets.map((bucket) => 100 - bucket.usedPercent))\n );\n const predictsFailure = domain.forecasts.some((forecast) => !forecast.willLastUntilReset);\n const predictsSuccess =\n domain.forecasts.length > 0 &&\n domain.forecasts.every((forecast) => forecast.willLastUntilReset);\n const coveragePenalty = domain.forecastCoverage === 'discontinuous' ? 40 : 0;\n return [\n {\n provider,\n domain,\n limitingBucket,\n remaining,\n score:\n remaining +\n (predictsSuccess ? 20 : 0) -\n (predictsFailure ? 100 : 0) -\n coveragePenalty,\n predictsSuccess\n }\n ];\n })\n )\n .sort(\n (left, right) =>\n right.score - left.score ||\n left.provider.id.localeCompare(right.provider.id) ||\n left.domain.id.localeCompare(right.domain.id)\n );\n const selected = candidates[0];\n return {\n mostConstrained: risks[0] ?? null,\n recommendation: selected\n ? {\n providerId: selected.provider.id,\n displayName: selected.provider.displayName,\n billingDomainId: selected.domain.id,\n score: round(selected.score),\n readOnly: true,\n reasonKeys: [\n 'highest-safe-capacity',\n ...(selected.predictsSuccess ? (['forecast-lasts-until-reset'] as const) : [])\n ],\n evidence: {\n remainingPercent: round(selected.remaining),\n freshness: selected.domain.freshness.status,\n forecastCoverage: selected.domain.forecastCoverage,\n authority: selected.limitingBucket.authority,\n observedAt:\n selected.limitingBucket.observedAt ?? selected.domain.freshness.lastSuccessAt\n }\n }\n : null\n };\n}\n\nfunction round(value: number): number {\n return Number(value.toFixed(6));\n}\n\nfunction pricingInputsChanged(\n existing: Record<string, unknown>,\n observation: ReturnType<typeof normalizeTokenObservation>\n): boolean {\n return (\n existing.billing_domain_id !== observation.billingDomainId ||\n existing.model !== (observation.model?.trim() || '__unclassified__') ||\n existing.observed_at !== observation.observedAt ||\n Number(existing.total_tokens) !== observation.recordedTokens ||\n Number(existing.input_tokens) !== observation.inputTokens ||\n Number(existing.output_tokens) !== observation.outputTokens ||\n Number(existing.reasoning_tokens) !== observation.reasoningTokens ||\n Number(existing.cache_read_tokens) !== observation.cacheReadTokens ||\n Number(existing.cache_write_tokens) !== observation.cacheWriteTokens ||\n (existing.cache_write_5m_tokens === null ? null : Number(existing.cache_write_5m_tokens)) !==\n (observation.cacheWriteTokenBreakdown?.fiveMinute ?? null) ||\n (existing.cache_write_1h_tokens === null ? null : Number(existing.cache_write_1h_tokens)) !==\n (observation.cacheWriteTokenBreakdown?.oneHour ?? null) ||\n Number(existing.unclassified_tokens) !== observation.unclassifiedTokens ||\n existing.reasoning_semantics !== observation.tokenSemantics.reasoning ||\n existing.cache_read_semantics !== observation.tokenSemantics.cacheRead ||\n existing.cache_write_semantics !== observation.tokenSemantics.cacheWrite ||\n existing.model_attribution !== observation.modelAttribution ||\n existing.time_precision !== observation.timePrecision ||\n existing.aggregation_temporality !== observation.aggregationTemporality\n );\n}\n\nfunction preciseAmount(value: number): number {\n return Number(value.toFixed(12));\n}\n\nfunction tokenAuthority(authorities: string | null): ProviderOverview['tokenAuthority'] {\n if (!authorities) return null;\n const values = authorities.split(',') as DataAuthority[];\n return values.length === 1 ? values[0] : 'mixed';\n}\n\nfunction coverageFromCount(count: number): CoverageLevel {\n return count > 0 ? 'complete' : 'unavailable';\n}\n\nfunction tokenCoverage(tokens: TokenRow, excludedObservationCount = 0): CoverageLevel {\n if (tokens.observation_count === 0) {\n return excludedObservationCount > 0 ? 'partial' : 'unavailable';\n }\n const scopes = commaSeparatedValues<TokenUsageScope>(tokens.usage_scopes);\n const temporalities = commaSeparatedValues<TokenAggregationTemporality>(\n tokens.aggregation_temporalities\n );\n return scopes.includes('this-mac') || temporalities.includes('delta') ? 'partial' : 'complete';\n}\n\nfunction selectSummaryBillingDomainId(\n providerId: string,\n domains: BillingDomainRow[]\n): string | null {\n if (providerId === 'grok') {\n return (\n domains.find((domain) => domain.id === 'grok-build-subscription')?.id ??\n domains[0]?.id ??\n null\n );\n }\n return domains[0]?.id ?? null;\n}\n\nfunction freshnessStatus(\n lastSuccessAt: string | null,\n now: Date\n): ProviderOverview['freshness']['status'] {\n if (!lastSuccessAt) return 'unavailable';\n return now.getTime() - new Date(lastSuccessAt).getTime() <= FRESHNESS_WINDOW_MS\n ? 'fresh'\n : 'stale';\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, rm } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { isAbsolute, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { UsageApplication } from '../core/usage-application.js';\nimport type { Connector } from '../core/types.js';\nimport { defaultConnectorDefinitions } from '../connectors/catalog.js';\nimport { ClaudeCodeConnector } from '../connectors/claude-code/claude-code-connector.js';\nimport { parseClaudeOtlpMetrics } from '../connectors/claude-code/claude-otlp.js';\nimport { ScreenReaderClaudeQuotaClient } from '../connectors/claude-code/claude-usage-screen-client.js';\nimport { CodexConnector } from '../connectors/codex/codex-connector.js';\nimport { StdioCodexAccountClient } from '../connectors/codex/stdio-codex-account-client.js';\nimport { OpenCodeLocalConnector } from '../connectors/opencode-local/opencode-local-connector.js';\nimport { CliOpenCodeLocalHistoryClient } from '../connectors/opencode-go/local-opencode-history-client.js';\nimport { OfficialOpenCodeGoClient } from '../connectors/opencode-go/official-opencode-go-client.js';\nimport { OpenCodeAuthFileReader } from '../connectors/opencode-go/opencode-auth-reader.js';\nimport { OpenCodeGoConnector } from '../connectors/opencode-go/opencode-go-connector.js';\nimport { DshConnector } from '../connectors/dsh/dsh-connector.js';\nimport { AntigravityConnector } from '../connectors/antigravity/antigravity-connector.js';\nimport { AntigravitySqliteUsageClient } from './antigravity-sqlite-usage-client.js';\nimport { GrokBuildConnector } from '../connectors/grok-build/grok-build-connector.js';\n\nimport { parseGrokOtlpMetrics } from '../connectors/grok-build/grok-telemetry.js';\nimport { StdioGrokBillingClient } from '../connectors/grok-build/stdio-grok-billing-client.js';\nimport {\n XaiApiConnector,\n XaiManagementApiClient\n} from '../connectors/xai-api/xai-api-connector.js';\nimport { writeDaemonState } from './daemon-state.js';\nimport { CollectionScheduler } from './collection-scheduler.js';\nimport { EcbExchangeRateProvider } from './ecb-exchange-rate-provider.js';\nimport { MacOsKeychainSecretStore } from './keychain-secret-store.js';\nimport { MacOsNotifier } from './macos-notifier.js';\nimport { MacOsStartAtLoginManager } from './macos-start-at-login-manager.js';\nimport { startLocalServer } from './local-server.js';\nimport { PathDiscoveryProbe } from './path-discovery-probe.js';\nimport {\n LocalTranscriptUsageClient,\n type LocalTranscriptProvider\n} from './local-transcript-usage-client.js';\nimport { SqliteUsageRepository } from './sqlite-usage-repository.js';\n\nexport async function runDaemon(home: string): Promise<void> {\n await mkdir(home, { recursive: true, mode: 0o700 });\n const demoEnabled = process.env.AGENT_USAGE_DEMO === '1';\n const repository = new SqliteUsageRepository(join(home, 'usage.sqlite'), {\n hideDemoProvider: !demoEnabled\n });\n const keychainService = process.env.AGENT_USAGE_KEYCHAIN_SERVICE;\n const launchAgentLabel = process.env.AGENT_USAGE_LAUNCH_AGENT_LABEL;\n const nodeImport = process.env.AGENT_USAGE_NODE_IMPORT;\n const secretStore = new MacOsKeychainSecretStore(undefined, {\n service: keychainService\n });\n const openCodeLocalHistoryClient = new CliOpenCodeLocalHistoryClient();\n const application = new UsageApplication({\n repository,\n connectors: [\n ...(demoEnabled ? [createDemoConnector()] : []),\n new CodexConnector(\n new StdioCodexAccountClient(),\n undefined,\n localTranscriptClient('codex', home)\n ),\n new ClaudeCodeConnector({\n quotaClient: new ScreenReaderClaudeQuotaClient(),\n historyClient: localTranscriptClient('claude-code', home)\n }),\n new OpenCodeGoConnector({\n accountClient: new OfficialOpenCodeGoClient({\n authReader: new OpenCodeAuthFileReader()\n }),\n localHistoryClient: openCodeLocalHistoryClient\n }),\n new OpenCodeLocalConnector({ localHistoryClient: openCodeLocalHistoryClient }),\n new GrokBuildConnector({\n billingClient: new StdioGrokBillingClient(),\n historyClient: localTranscriptClient('grok', home)\n }),\n new XaiApiConnector({ accountClient: new XaiManagementApiClient({ secretStore }) }),\n new DshConnector({ historyClient: localTranscriptClient('dsh', home) }),\n new AntigravityConnector({\n historyClient: new AntigravitySqliteUsageClient({\n roots: [\n join(homedir(), '.gemini/antigravity-cli'),\n join(homedir(), '.gemini/antigravity')\n ],\n cachePath: join(home, 'antigravity-usage-cache.json')\n })\n })\n ],\n connectorDefinitions: defaultConnectorDefinitions,\n discoveryProbe: new PathDiscoveryProbe(),\n secretStore,\n exchangeRateProvider: new EcbExchangeRateProvider(),\n notifier: new MacOsNotifier(),\n startAtLoginManager: new MacOsStartAtLoginManager({\n userHome: homedir(),\n executable: process.execPath,\n cliPath: process.argv[1],\n applicationHome: home,\n label: launchAgentLabel,\n nodeImport,\n environmentVariables: {\n AGENT_USAGE_DAEMON: '1',\n ...(keychainService ? { AGENT_USAGE_KEYCHAIN_SERVICE: keychainService } : {}),\n ...(launchAgentLabel ? { AGENT_USAGE_LAUNCH_AGENT_LABEL: launchAgentLabel } : {}),\n ...(nodeImport ? { AGENT_USAGE_NODE_IMPORT: nodeImport } : {}),\n ...(demoEnabled ? { AGENT_USAGE_DEMO: '1' } : {})\n }\n }),\n connectorPolicies: Object.fromEntries(\n [\n 'codex',\n 'claude-code',\n 'opencode-go',\n 'opencode',\n 'grok',\n 'xai-api',\n 'dsh',\n 'antigravity'\n ].map((id) => [\n id,\n { minimumIntervalMs: 5 * 60 * 1000, timeoutMs: id === 'claude-code' ? 25_000 : 20_000 }\n ])\n ),\n\n telemetryIngestors: [\n {\n id: 'claude-code',\n consentId: 'claude-code',\n parse: parseClaudeOtlpMetrics\n },\n {\n id: 'grok',\n consentId: 'grok',\n parse: parseGrokOtlpMetrics\n }\n ]\n });\n process.stderr.write('Agent Usage: starting local web service…\\n');\n const server = await startLocalServer({\n application,\n staticDirectory: locateStaticDirectory()\n });\n await writeDaemonState(home, {\n pid: process.pid,\n origin: server.origin,\n apiToken: server.apiToken\n });\n if (!demoEnabled) {\n void repository.deleteDemoProviderDataAsync().catch(() => {\n process.stderr.write(\n 'Agent Usage: stale demo data remains hidden and will be cleaned on a later startup.\\n'\n );\n });\n }\n process.stderr.write(`Agent Usage: web service ready at ${server.origin}\\n`);\n process.stderr.write('Agent Usage: updating cached usage in the background…\\n');\n void application.startBackgroundProcessing().then(() => {\n process.stderr.write('Agent Usage: background data update finished.\\n');\n });\n const scheduler = new CollectionScheduler({ application });\n scheduler.start();\n\n await new Promise<void>((resolveStop) => {\n let stopping = false;\n const stop = async () => {\n if (stopping) return;\n stopping = true;\n scheduler.stop();\n await server.close();\n repository.close();\n await rm(join(home, 'daemon.json'), { force: true });\n resolveStop();\n };\n process.once('SIGTERM', () => void stop());\n process.once('SIGINT', () => void stop());\n });\n}\n\nfunction localTranscriptClient(\n provider: LocalTranscriptProvider,\n applicationHome: string\n): LocalTranscriptUsageClient {\n return new LocalTranscriptUsageClient({\n provider,\n roots: localTranscriptRoots(provider),\n cachePath: join(applicationHome, 'cache', `${provider}-transcripts.json`)\n });\n}\n\nfunction localTranscriptRoots(provider: LocalTranscriptProvider): string[] {\n if (provider === 'codex') {\n // Codex moves finished rollouts from `sessions` into `archived_sessions`. Both hold the\n // same evidence, so reading only the live directory loses local history as it ages out.\n const home = resolveHomeOverride(process.env.CODEX_HOME, '.codex');\n return [join(home, 'sessions'), join(home, 'archived_sessions')];\n }\n if (provider === 'claude-code') {\n return [join(resolveHomeOverride(process.env.CLAUDE_CONFIG_DIR, '.claude'), 'projects')];\n }\n if (provider === 'dsh') {\n // One dsh home holds every profile's sessions, so a TUI layer composed on\n // dsh needs no root of its own.\n return [join(resolveHomeOverride(process.env.DSH_HOME, '.dsh'), 'sessions')];\n }\n return [join(resolveHomeOverride(process.env.GROK_HOME, '.grok'), 'sessions')];\n}\n\nfunction resolveHomeOverride(value: string | undefined, fallback: string): string {\n const configured = value?.trim();\n if (!configured) return join(homedir(), fallback);\n if (configured === '~') return homedir();\n if (configured.startsWith('~/')) return join(homedir(), configured.slice(2));\n return isAbsolute(configured) ? configured : resolve(configured);\n}\n\nfunction createDemoConnector(): Connector {\n return {\n id: 'demo',\n async collect() {\n const now = new Date();\n const reset = new Date(now.getTime() + 3 * 60 * 60 * 1000);\n return {\n provider: { id: 'demo', displayName: 'Demo Agent' },\n billingDomains: [{ id: 'subscription', displayName: 'Demo subscription' }],\n quotaBuckets: [\n {\n id: 'five-hour',\n billingDomainId: 'subscription',\n label: '5 hour',\n usedPercent: 42,\n resetsAt: reset.toISOString(),\n authority: 'official-account'\n }\n ],\n usage: [\n {\n id: 'demo-usage-v1',\n billingDomainId: 'subscription',\n model: 'demo-model',\n observedAt: now.toISOString(),\n inputTokens: 12_400,\n outputTokens: 3_100,\n cacheReadTokens: 8_000,\n cacheWriteTokens: 700,\n authority: 'official-account'\n }\n ],\n costs: [],\n observedAt: now.toISOString()\n };\n }\n };\n}\n\nfunction locateStaticDirectory(): string | undefined {\n const candidates = [\n fileURLToPath(new URL('./web', import.meta.url)),\n fileURLToPath(new URL('../../dist/web', import.meta.url))\n ];\n return candidates.find((candidate) => existsSync(join(candidate, 'index.html')));\n}\n","#!/usr/bin/env node\n\nimport { spawn } from 'node:child_process';\nimport { connect as tcpConnect } from 'node:net';\nimport { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\n\nimport { Command } from 'commander';\nimport open from 'open';\n\nimport type { CustomModelRate, DoctorReport, UsageOverview } from './core/types.js';\nimport { publicErrorMessage } from './core/redaction.js';\nimport { readDaemonState, type DaemonState } from './server/daemon-state.js';\n\nconst program = new Command();\nprogram\n .name('agent-usage')\n .description('View local coding-agent quota, token, and cost usage')\n .option('--home <directory>', 'application data directory', defaultHome())\n .option('--no-open', 'start the dashboard without opening a browser');\n\nprogram\n .command('status')\n .description('print the current provider overview')\n .option('--json', 'emit machine-readable JSON')\n .option('--window <window>', 'history window: 24h, 7d, or 30d', '24h')\n .action(async (options: { json?: boolean; window: string }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n if (!['24h', '7d', '30d'].includes(options.window)) {\n throw new Error('Unsupported history window. Use 24h, 7d, or 30d.');\n }\n const response = await fetch(`${state.origin}/api/overview?window=${options.window}`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) {\n throw new Error(`Daemon returned HTTP ${response.status}`);\n }\n const overview = (await response.json()) as UsageOverview;\n process.stdout.write(options.json ? `${JSON.stringify(overview)}\\n` : formatOverview(overview));\n });\n\nprogram\n .command('telemetry-env')\n .description('print opt-in provider OTLP environment variables')\n .option('--provider <provider>', 'claude-code or grok', 'claude-code')\n .action(async (options: { provider: string }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n if (options.provider === 'grok') {\n process.stdout.write(\n [\n 'export GROK_EXTERNAL_OTEL=1',\n 'export OTEL_METRICS_EXPORTER=otlp',\n 'export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf',\n `export OTEL_EXPORTER_OTLP_ENDPOINT=${state.origin}/grok`,\n `export OTEL_EXPORTER_OTLP_HEADERS='Authorization=Bearer ${state.apiToken}'`,\n 'export OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta'\n ].join('\\n') + '\\n'\n );\n return;\n }\n if (options.provider !== 'claude-code') {\n throw new Error('Unsupported telemetry provider. Use claude-code or grok.');\n }\n process.stdout.write(\n [\n 'export CLAUDE_CODE_ENABLE_TELEMETRY=1',\n 'export OTEL_METRICS_EXPORTER=otlp',\n 'export OTEL_EXPORTER_OTLP_PROTOCOL=http/json',\n `export OTEL_EXPORTER_OTLP_ENDPOINT=${state.origin}`,\n `export OTEL_EXPORTER_OTLP_HEADERS='Authorization=Bearer ${state.apiToken}'`,\n 'export OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta'\n ].join('\\n') + '\\n'\n );\n });\n\nprogram\n .command('doctor')\n .description('print connector discovery and provider health diagnostics')\n .option('--json', 'emit machine-readable JSON')\n .action(async (options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/doctor`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error('Daemon diagnostics are unavailable');\n const report = (await response.json()) as DoctorReport;\n process.stdout.write(\n options.json ? `${JSON.stringify(report)}\\n` : `${formatDoctor(report)}\\n`\n );\n });\n\nprogram\n .command('export')\n .description('export redacted usage and cost rows')\n .option('--format <format>', 'json or csv', 'json')\n .option('--window <window>', 'history window: 24h, 7d, or 30d', '24h')\n .option('--include-account-identifiers', 'include available provider account identifiers')\n .action(\n async (options: { format: string; window: string; includeAccountIdentifiers?: boolean }) => {\n if (!['json', 'csv'].includes(options.format)) throw new Error('Use json or csv.');\n if (!['24h', '7d', '30d'].includes(options.window)) {\n throw new Error('Unsupported history window. Use 24h, 7d, or 30d.');\n }\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const parameters = new URLSearchParams({\n format: options.format,\n window: options.window,\n includeAccountIdentifiers: String(Boolean(options.includeAccountIdentifiers))\n });\n const response = await fetch(`${state.origin}/api/export?${parameters}`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n process.stdout.write(`${await response.text()}\\n`);\n }\n );\n\nprogram\n .command('retention')\n .description('show raw-observation retention and daily aggregation status')\n .option('--json', 'emit machine-readable JSON')\n .option('--compact', 'run compaction before showing status')\n .action(async (options: { json?: boolean; compact?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(\n `${state.origin}/api/retention${options.compact ? '/compact' : ''}`,\n {\n method: options.compact ? 'POST' : 'GET',\n headers: { authorization: `Bearer ${state.apiToken}` }\n }\n );\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const status = (await response.json()) as Record<string, unknown>;\n process.stdout.write(\n options.json\n ? `${JSON.stringify(status)}\\n`\n : `${Object.entries(status)\n .map(([key, value]) => `${key}: ${String(value)}`)\n .join('\\n')}\\n`\n );\n });\n\nprogram\n .command('clear')\n .description('clear local usage data and optionally product-owned Keychain entries')\n .option('--yes', 'confirm the destructive operation')\n .option('--include-product-secrets', 'also delete Agent Usage Keychain entries')\n .action(async (options: { yes?: boolean; includeProductSecrets?: boolean }) => {\n if (!options.yes) throw new Error('Refusing to clear data without --yes.');\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/data`, {\n method: 'DELETE',\n headers: {\n authorization: `Bearer ${state.apiToken}`,\n 'content-type': 'application/json'\n },\n body: JSON.stringify({ deleteProductSecrets: Boolean(options.includeProductSecrets) })\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const result = (await response.json()) as { productSecretsDeleted: number };\n process.stdout.write(\n `Cleared local usage data; deleted ${result.productSecretsDeleted} product secret(s).\\n`\n );\n });\n\nprogram\n .command('discover')\n .description('discover supported local agent clients')\n .option('--json', 'emit machine-readable JSON')\n .action(async (options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/connectors/discover`, {\n method: 'POST',\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const connectors = (await response.json()) as Array<{\n displayName: string;\n state: string;\n installed: boolean;\n }>;\n if (options.json) process.stdout.write(`${JSON.stringify(connectors)}\\n`);\n else {\n process.stdout.write(\n `${connectors\n .map(\n (connector) =>\n `${connector.displayName} — ${connector.state}${connector.installed ? '' : ' (not installed)'}`\n )\n .join('\\n')}\\n`\n );\n }\n });\n\nprogram\n .command('monitoring')\n .description('show background collection, notification, and start-at-login settings')\n .option('--json', 'emit machine-readable JSON')\n .action(async (options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/monitoring`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const status = (await response.json()) as {\n settings: Record<string, unknown>;\n connectors: unknown[];\n };\n process.stdout.write(\n options.json\n ? `${JSON.stringify(status)}\\n`\n : `${Object.entries(status.settings)\n .map(([key, value]) => `${key}: ${String(value)}`)\n .join('\\n')}\\n`\n );\n });\n\nprogram\n .command('start-at-login <action>')\n .description('enable, disable, or show start-at-login state')\n .action(async (action: string) => {\n if (!['enable', 'disable', 'status'].includes(action)) {\n throw new Error('Use enable, disable, or status.');\n }\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n if (action !== 'status') {\n const response = await fetch(`${state.origin}/api/monitoring/settings`, {\n method: 'PATCH',\n headers: {\n authorization: `Bearer ${state.apiToken}`,\n 'content-type': 'application/json'\n },\n body: JSON.stringify({ startAtLogin: action === 'enable' })\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n }\n const response = await fetch(`${state.origin}/api/monitoring`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const status = (await response.json()) as { settings: { startAtLogin: boolean } };\n process.stdout.write(`${status.settings.startAtLogin ? 'enabled' : 'disabled'}\\n`);\n });\n\nconst ratesCommand = program\n .command('rates')\n .description('view and manage custom model rates for custom endpoints');\n\nratesCommand\n .command('list')\n .description('list configured custom model rates')\n .option('--json', 'emit machine-readable JSON')\n .action(async (options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/custom-rates`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const data = (await response.json()) as { rates: CustomModelRate[] };\n if (options.json) {\n process.stdout.write(`${JSON.stringify(data.rates, null, 2)}\\n`);\n return;\n }\n if (data.rates.length === 0) {\n process.stdout.write('No custom model rates configured.\\n');\n return;\n }\n for (const rate of data.rates) {\n const domain = rate.billingDomainId ?? '*';\n process.stdout.write(\n `${rate.id} | ${rate.providerId} | domain: ${domain} | model: ${rate.model} | in: $${rate.ratesPerMillion.input}/M | out: $${rate.ratesPerMillion.output}/M | cache: $${rate.ratesPerMillion.cacheRead}/M\\n`\n );\n }\n });\n\nratesCommand\n .command('set <model>')\n .description('set custom model rate')\n .requiredOption('--provider <provider>', 'provider id (e.g. dsh)')\n .option('--domain <domain>', 'billing domain id (omit for wildcard across all routes)')\n .requiredOption('--input <rate>', 'input rate in USD per million tokens', parseFloat)\n .requiredOption('--output <rate>', 'output rate in USD per million tokens', parseFloat)\n .option('--cache-read <rate>', 'cache read rate in USD per million tokens', parseFloat, 0)\n .option('--id <id>', 'custom model rate ID to update')\n .action(\n async (\n model: string,\n options: {\n provider: string;\n domain?: string;\n input: number;\n output: number;\n cacheRead: number;\n id?: string;\n }\n ) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/custom-rates`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${state.apiToken}`,\n 'content-type': 'application/json',\n origin: state.origin\n },\n body: JSON.stringify({\n ...(options.id ? { id: options.id } : {}),\n providerId: options.provider,\n billingDomainId: options.domain || null,\n model,\n inputRate: options.input,\n outputRate: options.output,\n cacheReadRate: options.cacheRead\n })\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n const data = (await response.json()) as { rate: CustomModelRate };\n process.stdout.write(\n `Custom model rate configured for ${data.rate.model} (ID: ${data.rate.id})\\n`\n );\n }\n );\n\nratesCommand\n .command('get <id>')\n .description('get details of a custom model rate by ID')\n .option('--json', 'emit machine-readable JSON')\n .action(async (id: string, options: { json?: boolean }) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/custom-rates/${encodeURIComponent(id)}`, {\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok) {\n if (response.status === 404) throw new Error(`Custom model rate not found: ${id}`);\n throw new Error(`Daemon returned HTTP ${response.status}`);\n }\n const data = (await response.json()) as { rate: CustomModelRate };\n if (options.json) {\n process.stdout.write(`${JSON.stringify(data.rate, null, 2)}\\n`);\n return;\n }\n const domain = data.rate.billingDomainId ?? '*';\n process.stdout.write(\n `${data.rate.id} | ${data.rate.providerId} | domain: ${domain} | model: ${data.rate.model} | in: $${data.rate.ratesPerMillion.input}/M | out: $${data.rate.ratesPerMillion.output}/M | cache: $${data.rate.ratesPerMillion.cacheRead}/M | updated: ${data.rate.updatedAt}\\n`\n );\n });\n\nratesCommand\n .command('delete <id>')\n .description('delete custom model rate by ID')\n .action(async (id: string) => {\n const home = resolve(program.opts<{ home: string }>().home);\n const state = await requireDaemonState(home);\n const response = await fetch(`${state.origin}/api/custom-rates/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n headers: {\n authorization: `Bearer ${state.apiToken}`,\n origin: state.origin\n }\n });\n if (!response.ok) throw new Error(`Daemon returned HTTP ${response.status}`);\n process.stdout.write(`Deleted custom model rate ${id}\\n`);\n });\n\nprogram\n .command('serve')\n .description('run the internal local daemon')\n .action(async () => {\n const home = resolve(program.opts<{ home: string }>().home);\n const { runDaemon } = await import('./server/runtime.js');\n await runDaemon(home);\n });\n\nprogram.action(async () => {\n const options = program.opts<{ home: string; open: boolean }>();\n const home = resolve(options.home);\n const state = await ensureDaemon(home);\n const response = await fetch(`${state.origin}/api/launch-token`, {\n method: 'POST',\n headers: { authorization: `Bearer ${state.apiToken}` }\n });\n if (!response.ok)\n throw new Error(`Unable to create dashboard launch URL (HTTP ${response.status})`);\n const body = (await response.json()) as { url: string };\n if (options.open) {\n await open(body.url);\n }\n process.stdout.write(`${body.url}\\n`);\n});\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n const message = publicErrorMessage(error);\n process.stderr.write(`agent-usage: ${message}\\n`);\n process.exitCode = 1;\n});\n\nasync function requireDaemonState(home: string): Promise<DaemonState> {\n try {\n const state = await readDaemonState(home);\n if (await isHealthy(state)) return state;\n } catch {\n // Normalize missing, malformed, and stale state into one actionable message.\n }\n throw new Error('Local daemon is not running');\n}\n\nasync function ensureDaemon(home: string): Promise<DaemonState> {\n try {\n return await requireDaemonState(home);\n } catch {\n process.stderr.write('Agent Usage: starting local web service…\\n');\n const child = spawn(\n process.execPath,\n [...process.execArgv, process.argv[1], '--home', home, 'serve'],\n {\n detached: true,\n env: { ...process.env, AGENT_USAGE_DAEMON: '1' },\n stdio: 'ignore'\n }\n );\n child.unref();\n }\n\n const deadline = Date.now() + 8_000;\n while (Date.now() < deadline) {\n try {\n const state = await readDaemonState(home);\n if (await isHealthy(state)) {\n process.stderr.write(\n 'Agent Usage: web service ready; usage data is updating in the background.\\n'\n );\n return state;\n }\n } catch {\n // The child has not written a valid state file yet.\n }\n await new Promise((resolveWait) => setTimeout(resolveWait, 50));\n }\n throw new Error('Local daemon did not become ready');\n}\n\nasync function isHealthy(state: DaemonState): Promise<boolean> {\n if (!(await originIsListening(state.origin))) return false;\n try {\n const response = await fetch(`${state.origin}/api/health`, {\n headers: { authorization: `Bearer ${state.apiToken}` },\n signal: AbortSignal.timeout(5_000)\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n// A daemon that is still starting is looked for over a plain socket rather than with a request\n// abandoned half a second later. Waiting for a cold start asks well over a hundred times, and a\n// request torn down mid-connect can throw from inside Node's own socket callbacks, past the\n// `try` around it, ending the command instead of starting the dashboard.\nasync function originIsListening(origin: string): Promise<boolean> {\n const { hostname, port } = new URL(origin);\n return await new Promise((resolveListening) => {\n const socket = tcpConnect({ host: hostname, port: Number(port) });\n const settle = (listening: boolean) => {\n socket.destroy();\n resolveListening(listening);\n };\n socket.setTimeout(500, () => settle(false));\n socket.once('connect', () => settle(true));\n socket.once('error', () => settle(false));\n });\n}\n\nfunction formatOverview(overview: UsageOverview): string {\n const summary = formatGlobalSummary(overview);\n if (overview.providers.length === 0) {\n return `${summary}No providers have reported usage yet.\\n`;\n }\n const recommendation = overview.riskSummary.recommendation\n ? `Recommendation: ${overview.riskSummary.recommendation.displayName} · ${overview.riskSummary.recommendation.billingDomainId} — ${overview.riskSummary.recommendation.reasonKeys\n .map((reason) =>\n reason === 'forecast-lasts-until-reset'\n ? 'forecast lasts through reset'\n : 'highest safe capacity among fresh providers'\n )\n .join('; ')} (${formatEvidence(\n overview.riskSummary.recommendation.evidence.authority ?? 'unavailable',\n overview.riskSummary.recommendation.evidence.observedAt\n )}; advice only)\\n`\n : '';\n return `${summary}${recommendation}${overview.providers\n .map((provider) => {\n const quota = provider.quotaBuckets\n .map(\n (bucket) =>\n `${bucket.label}: ${bucket.usedPercent ?? '?'}% used (${formatEvidence(\n bucket.authority,\n bucket.observedAt ?? provider.freshness.lastSuccessAt\n )})`\n )\n .join(', ');\n const diagnostic =\n provider.health.status === 'degraded'\n ? ` — degraded: ${provider.health.message} ${provider.health.recovery}`\n : '';\n const domains = provider.billingDomains\n .map((domain) => {\n const costs = domain.history.costs\n .map(\n (cost) =>\n `${cost.kind} ${\n cost.amount === null ? 'unknown' : `${cost.amount} ${cost.currency}`\n } (${formatEvidence(\n cost.authorities?.join('+') ?? 'unavailable',\n cost.observedAt\n )})`\n )\n .join(', ');\n return `${domain.displayName}: ${domain.history.window} ${domain.history.tokenTotals.total} tokens (${formatEvidence(\n domain.history.authorities?.join('+') ?? domain.tokenAuthority ?? 'unavailable',\n domain.history.lastObservedAt ??\n domain.freshness?.lastSuccessAt ??\n provider.freshness.lastSuccessAt\n )}; ${formatTokenEvidence(domain.history.tokenEvidence)})${costs ? `; ${costs}` : ''}`;\n })\n .join(' | ');\n return `${provider.displayName} — ${quota || 'quota unavailable'}${domains ? ` — ${domains}` : ''}${diagnostic}`;\n })\n .join('\\n')}\\n`;\n}\n\nfunction formatGlobalSummary(overview: UsageOverview): string {\n const summary = overview.globalSummary;\n const tokenAuthorities = [\n ...new Set(\n overview.providers.flatMap((provider) =>\n provider.billingDomains\n .filter((domain) => domain.id === provider.summaryBillingDomainId)\n .flatMap((domain) => domain.history.authorities ?? [])\n )\n )\n ].sort();\n const tokenObservedAt = overview.providers\n .flatMap((provider) =>\n provider.billingDomains\n .filter((domain) => domain.id === provider.summaryBillingDomainId)\n .flatMap((domain) => (domain.history.lastObservedAt ? [domain.history.lastObservedAt] : []))\n )\n .sort((left, right) => right.localeCompare(left))[0];\n const tokenEvidence = formatEvidence(\n tokenAuthorities.join('+') || 'unavailable',\n tokenObservedAt\n );\n const tokens =\n summary.recordedTokens === null\n ? 'recorded tokens unavailable'\n : `${summary.recordedTokens} recorded tokens (${tokenEvidence})`;\n const retailMetric = overview.workbench.costs.retailEquivalent;\n const retail =\n summary.apiRetailEquivalent.status === 'available' &&\n summary.apiRetailEquivalent.amount !== null\n ? `${summary.apiRetailEquivalent.amount} ${summary.apiRetailEquivalent.currency} (${formatEvidence(\n retailMetric.authorities.join('+') || 'unavailable',\n retailMetric.observedAt\n )})`\n : 'unavailable';\n const constrained = summary.mostConstrained\n ? `${summary.mostConstrained.displayName} · ${summary.mostConstrained.label} (${summary.mostConstrained.remainingPercent}% remaining; ${formatEvidence(\n summary.mostConstrained.authority ?? 'unavailable',\n summary.mostConstrained.observedAt\n )})`\n : 'unavailable';\n return `Summary (${summary.window}): ${tokens}; API retail equivalent ${retail}; ${summary.tokenEvidence.classifiedTokens}/${summary.tokenEvidence.recordedTokens} classified; precision ${summary.tokenEvidence.timePrecisions.join('+') || 'unavailable'}; most constrained ${constrained}; latest observed ${summary.latestObservedAt ?? 'unavailable'}; generated ${summary.generatedAt}\\n`;\n}\n\nfunction formatTokenEvidence(\n evidence: UsageOverview['providers'][number]['tokenEvidence']\n): string {\n const precisions =\n evidence.timePrecisions.length > 0 ? evidence.timePrecisions.join('+') : 'unknown';\n const scopes = evidence.usageScopes.length > 0 ? evidence.usageScopes.join('+') : 'unknown';\n const temporalities =\n evidence.aggregationTemporalities.length > 0\n ? evidence.aggregationTemporalities.join('+')\n : 'unknown';\n return `${evidence.classifiedTokens}/${evidence.recordedTokens} classified; ${evidence.unclassifiedTokens} unclassified; precision ${precisions}; scope ${scopes}; temporality ${temporalities}`;\n}\n\nfunction formatEvidence(authority: string, observedAt: string | null | undefined): string {\n return `source ${authority} at ${observedAt ?? 'unknown time'}`;\n}\n\nfunction formatDoctor(report: DoctorReport): string {\n const providerLines = report.providers.map((provider) =>\n provider.status === 'degraded'\n ? `${provider.displayName} — degraded${provider.health.errorCode ? ` (${provider.health.errorCode})` : ''}: ${provider.health.recovery ?? 'Run refresh and inspect connector diagnostics.'}`\n : `${provider.displayName} — healthy`\n );\n const connectorLines = report.connectors.map((connector) =>\n connector.status === 'degraded'\n ? `${connector.id} connection — ${connector.category}: ${connector.recovery}`\n : `${connector.id} connection — healthy`\n );\n return [\n `Daemon — ${report.daemon.status}`,\n `Database — ${report.database.status}`,\n ...providerLines,\n ...connectorLines\n ].join('\\n');\n}\n\nfunction defaultHome(): string {\n return join(homedir(), 'Library', 'Application Support', 'Agent Usage');\n}\n"],"mappings":"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","names":["tokenAuthority","snapshot","snapshot","entry","resolve","snapshot","status","subscriptionEnvironment","reset","resolve","z","safeFailure","incompleteTranscriptFailure","snapshot","spawn","unavailableError","schemaError","process","resolve","safeFailure","z","resolve","z","readFile","join","z","mapQuota","safeFailure","z","incompleteTranscriptFailure","safeFailure","resolve","end","createHash","mkdir","readFile","rename","writeFile","join","spawn","safeFailure","homedir","join","billingDomains","safeFailure","createHash","readFile","rename","stat","writeFile","mkdir","createRequire","dirname","join","DatabaseSync","stableId","spawn","homedir","join","z","expectScript","resolve","unavailableError","JsonLinePeer","process","z","safeFailure","centSchema","schema","spawn","spawn","resolve","mkdir","writeFile","dirname","join","access","createReadStream","join","z","contentType","isAbsolute","join","resolve","createRequire","dirname","resolve","snapshot","preciseAmount","rates","retailEquivalent","reportedEstimate","DatabaseSync","billingDomains","existsSync","mkdir","rm","homedir","isAbsolute","join","resolve","spawn","homedir","join","resolve","open","response","runDaemon"]}
|