agent-usage-all-in-one 0.2.1
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/BUNDLED_DEPENDENCIES.json +9 -0
- package/BUNDLED_LICENSES.md +76 -0
- package/CODE_OF_CONDUCT.md +11 -0
- package/CONTRIBUTING.md +41 -0
- package/LICENSE +21 -0
- package/README.md +144 -0
- package/README.zh-CN.md +128 -0
- package/SECURITY.md +26 -0
- package/THIRD_PARTY_LICENSES.md +271 -0
- package/THIRD_PARTY_NOTICES.md +28 -0
- package/dist/cli.js +9170 -0
- package/dist/cli.js.map +1 -0
- package/dist/web/_app/immutable/assets/2.DZPQZVH3.css +1 -0
- package/dist/web/_app/immutable/chunks/6sns41Ww.js +3 -0
- package/dist/web/_app/immutable/chunks/Bjy-W4x2.js +81 -0
- package/dist/web/_app/immutable/chunks/DM8a3me-.js +1 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/entry/app.B_JvzxA9.js +2 -0
- package/dist/web/_app/immutable/entry/start.R2dkufKZ.js +1 -0
- package/dist/web/_app/immutable/nodes/0.CXfTLDxk.js +1 -0
- package/dist/web/_app/immutable/nodes/1.BwsUxisa.js +1 -0
- package/dist/web/_app/immutable/nodes/2.BNUhkRJ5.js +31 -0
- package/dist/web/_app/version.json +1 -0
- package/dist/web/brand/agent-usage-banner.svg +27 -0
- package/dist/web/brand/agent-usage-logo.svg +23 -0
- package/dist/web/brands/README.md +32 -0
- package/dist/web/brands/claude.svg +4 -0
- package/dist/web/brands/grok-dark.svg +4 -0
- package/dist/web/brands/grok-light.svg +4 -0
- package/dist/web/brands/openai.svg +6 -0
- package/dist/web/brands/opencode-dark.svg +1 -0
- package/dist/web/brands/opencode-light.svg +1 -0
- package/dist/web/brands/opencode.svg +4 -0
- package/dist/web/index.html +34 -0
- package/docs/open-source.md +38 -0
- package/package.json +97 -0
- package/static/brand/agent-usage-banner.svg +27 -0
- package/static/brand/agent-usage-logo.svg +23 -0
- package/static/brands/README.md +32 -0
- package/static/brands/claude.svg +4 -0
- package/static/brands/grok-dark.svg +4 -0
- package/static/brands/grok-light.svg +4 -0
- package/static/brands/openai.svg +6 -0
- package/static/brands/opencode-dark.svg +1 -0
- package/static/brands/opencode-light.svg +1 -0
- package/static/brands/opencode.svg +4 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +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/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-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/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/local-transcript-usage-client.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 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 {\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}): 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: '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 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];\n\nexport const 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 ...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 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 ]\n};\n\ntype OpenAiPricePeriod = [\n effectiveFrom: string,\n effectiveUntil: string | null,\n input: number,\n output: number\n];\n\nfunction openAiGpt56Entries(\n model: string,\n periods: OpenAiPricePeriod[]\n): RetailPriceCatalogEntry[] {\n return 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-${model}-${tier}-${versionDate}`,\n priceVersion: `openai-gpt-5.6-${versionDate}`,\n providerId: 'codex',\n billingDomainId: 'subscription',\n canonicalModel: 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: OPENAI_GPT_56_SOURCE\n };\n };\n return [entry('standard'), entry('prompt-above-272k')];\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\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\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 modelEntries = catalog.entries.filter(\n (entry) =>\n entry.providerId === providerId &&\n entry.billingDomainId === observation.billingDomainId &&\n [entry.canonicalModel, ...entry.aliases].some(\n (model) => model.trim().toLowerCase() === normalizedModel\n )\n );\n if (modelEntries.length === 0) return unavailable('model-unrecognized');\n const timeActiveEntries = modelEntries.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 if (\n cacheWriteTokens > 0 &&\n entry.ratesPerMillion['cache-write'] === null &&\n !exactCacheWriteItems\n ) {\n return unavailable('pricing-tier-ambiguous');\n }\n if (cacheWriteTokens > 0 && !exactCacheWriteItems) {\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 ? 'pricing-tier-ambiguous' : '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 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 Connector,\n ConnectorSnapshot,\n ConnectorDiagnostic,\n ConnectorFailure,\n ConnectorPolicy,\n CollectionMode,\n DoctorReport,\n ExchangeRateProvider,\n LocalNotification,\n LocalNotifier,\n MonitoringSettings,\n StartAtLoginManager,\n TelemetryIngestor,\n UsageOverview,\n UsageExportArtifact,\n UsageExportRequest,\n UsageQuery,\n UsageRepository,\n RetentionStatus,\n ProcessingModuleId,\n ProcessingStatus\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 type RetailPriceCatalog\n} from './retail-pricing.js';\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}\n\nexport interface RefreshOptions {\n userInitiated?: boolean;\n mode?: CollectionMode;\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 #priceCatalog: RetailPriceCatalog | null;\n #refreshPromise: Promise<void> | null = null;\n #refreshMode: CollectionMode | null = null;\n #backgroundPromise: Promise<void> | null = null;\n #queuedHardRebuildPromise: Promise<void> | null = null;\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.#priceCatalog =\n options.priceCatalog === undefined ? OFFICIAL_PRICING_CATALOG : options.priceCatalog;\n this.#processingStatus = createProcessingStatus(this.#clock().toISOString(), false);\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(): Promise<void> {\n return this.#startProcessing('incremental');\n }\n\n startHardRebuild(): Promise<void> {\n return this.#startProcessing('hard-rebuild');\n }\n\n #startProcessing(mode: CollectionMode): 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'),\n () => this.#startProcessing('hard-rebuild')\n )\n .finally(() => {\n this.#queuedHardRebuildPromise = null;\n });\n return this.#queuedHardRebuildPromise;\n }\n return this.#backgroundPromise;\n }\n this.#processingStatus = createProcessingStatus(\n this.#clock().toISOString(),\n mode === 'hard-rebuild'\n );\n this.#backgroundPromise = this.#runProcessing(mode).finally(() => {\n this.#backgroundPromise = null;\n });\n return this.#backgroundPromise;\n }\n\n async #runProcessing(mode: CollectionMode): Promise<void> {\n await this.#runModule('discovery', () => this.discoverConnectors().then(() => undefined));\n await this.#runModule('usage', () =>\n this.refresh({ userInitiated: mode === 'hard-rebuild', mode })\n );\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 #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 exportUsage(request: UsageExportRequest): Promise<UsageExportArtifact> {\n const overview = this.#repository.getOverview(this.#clock(), request);\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","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 Go',\n command: 'opencode',\n permissionDescription:\n 'Read account quota and local exports 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","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 authoritativeIdPrefix: '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 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 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 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 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 observedAt = this.#clock().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 accountUsage = mapTokenUsage(payload?.tokenUsage ?? null);\n const canReconcile = history.complete && accountUsage.length > 0;\n const reconciledRemainders = canReconcile\n ? reconcileAccountRemainders(accountUsage, history.usage)\n : [];\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, ...reconciledRemainders],\n ...(hasLocalHistory && canReconcile\n ? {\n usageReconciliation: {\n authoritativeIdPrefix: 'codex-transcript:',\n retiredIdPrefixes: []\n }\n }\n : {}),\n costs: history.costs,\n warnings,\n observedAt\n };\n }\n}\n\nfunction reconcileAccountRemainders(\n accountUsage: UsageObservation[],\n localUsage: UsageObservation[]\n): UsageObservation[] {\n return accountUsage.flatMap((accountObservation) => {\n const day = accountObservation.observedAt.slice(0, 10);\n const accountTotal = normalizeTokenObservation(accountObservation).recordedTokens;\n const localTotal = localUsage\n .filter((observation) => observation.observedAt.slice(0, 10) === day)\n .reduce(\n (total, observation) => total + normalizeTokenObservation(observation).recordedTokens,\n 0\n );\n if (localTotal === 0 || localTotal > accountTotal) return [];\n return [\n {\n id: `codex-transcript:account-remainder:${day}`,\n billingDomainId: 'subscription',\n model: null,\n observedAt: accountObservation.observedAt,\n reconciledRemainderTokens: accountTotal - 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 resetsAt: window.resetsAt === null ? null : new Date(window.resetsAt * 1000).toISOString(),\n authority: 'official-account'\n });\n }\n }\n return buckets;\n}\n\nfunction mapTokenUsage(response: CodexTokenUsageResponse | null): UsageObservation[] {\n return (response?.dailyUsageBuckets ?? []).map((bucket) => ({\n id: `codex:daily:${bucket.startDate}`,\n billingDomainId: 'subscription',\n model: null,\n observedAt: `${bucket.startDate}T00:00:00.000Z`,\n sourceReportedTotalTokens: bucket.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 }));\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 { 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\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 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\n .filter((row) => row.providerId === 'opencode-go')\n .filter(hasCategorizedTokens)\n .map((row) => ({\n id: `v2:${createHash('sha256').update(row.sourceId).digest('hex')}`,\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 CostRecord,\n QuotaBucket,\n UsageObservation\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 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 },\n weekly: { label: 'Week', amount: 30 },\n monthly: { label: 'Month', amount: 60 }\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 const local = localResult.status === 'fulfilled' ? localResult.value : [];\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: local.map(mapLocalUsage),\n ...(localResult.status === 'fulfilled'\n ? {\n usageReconciliation: {\n authoritativeIdPrefix: 'opencode-request:',\n retiredIdPrefixes: ['opencode-session:']\n }\n }\n : {}),\n costs: local.flatMap((request) =>\n request.cost === null ? [] : [mapLocalCost(request, request.cost)]\n ),\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 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 mapLocalUsage(request: OpenCodeLocalRequest): UsageObservation {\n return {\n id: `opencode-request:${request.id}`,\n billingDomainId: 'go-subscription',\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-request:${request.id}`;\n return {\n id: `opencode-request-cost:${request.id}`,\n sourceId: usageObservationId,\n billingDomainId: 'go-subscription',\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-message-reported-cost-v2',\n version: '2026-08-28',\n source: 'OpenCode local message history reported cost',\n canonicalModel: request.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\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 Connector,\n CollectionRequest,\n ConnectorFailure,\n ConnectorSnapshot,\n QuotaBucket\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: [grokBuildBillingDomain()],\n quotaBuckets,\n usage: history.usage,\n ...(history.usage.length > 0 && history.complete\n ? {\n usageReconciliation: {\n authoritativeIdPrefix: '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\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 resetsAt,\n authority: 'official-client',\n scope: 'account-wide',\n status: billing.subscriptionTier ?? null\n }\n ];\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 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 { grokBuildBillingDomain } 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: 'grok-build-subscription',\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: 'grok-build-subscription',\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: [grokBuildBillingDomain()],\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}\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\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 }\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.#readLogFallback();\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.#readLogFallback();\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\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 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') {\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 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/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 const message = publicErrorMessage(error);\n sendJson(response, 500, { error: 'internal-error', message });\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\nfunction sendJson(response: ServerResponse, status: number, body: unknown): void {\n response.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'cache-control': 'no-store'\n });\n response.end(JSON.stringify(body));\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 { 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';\n\nexport type LocalTranscriptProvider = 'claude-code' | 'codex' | 'grok';\n\nexport interface LocalTranscriptUsageResult {\n usage: UsageObservation[];\n costs: CostRecord[];\n complete: boolean;\n}\n\nexport interface TranscriptUsageClient {\n readUsage(options?: CollectionRequest): Promise<LocalTranscriptUsageResult>;\n}\n\nexport interface LocalTranscriptUsageClientOptions {\n provider: LocalTranscriptProvider;\n root: 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\nexport class LocalTranscriptUsageClient implements TranscriptUsageClient {\n readonly #provider: LocalTranscriptProvider;\n readonly #root: string;\n readonly #clock: () => Date;\n readonly #lookbackDays: number;\n readonly #cachePath?: string;\n readonly #fileCache = new Map<string, CachedTranscriptFile>();\n #cacheLoaded = false;\n\n constructor(options: LocalTranscriptUsageClientOptions) {\n this.#provider = options.provider;\n this.#root = options.root;\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 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.#root, cutoff);\n const files = discovered.files;\n let complete = discovered.complete;\n const usage: UsageObservation[] = [];\n const costs: CostRecord[] = [];\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 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 };\n }\n\n async #readFile(\n file: TranscriptFile\n ): Promise<{ records: ParsedTranscriptRecord[]; complete: 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 return { records: cached.records, complete: true };\n }\n const records: ParsedTranscriptRecord[] = [];\n try {\n const codexState: CodexScanState = {\n model: '',\n sessionId: '',\n lastUsageSignature: null,\n sawSessionMeta: false,\n suppressingForkCopies: false,\n forkCopyAnchorMs: 0\n };\n const lines = createInterface({\n input: createReadStream(file.path, { encoding: 'utf8' }),\n crlfDelay: Infinity\n });\n for await (const line of lines) {\n const parsedRecords =\n this.#provider === 'claude-code'\n ? line.includes('\"usage\"')\n ? compact(parseClaudeTranscriptLine(line))\n : []\n : this.#provider === 'codex'\n ? compact(parseCodexTranscriptLine(line, codexState))\n : line.includes('\"turn_completed\"')\n ? parseGrokTranscriptLine(line)\n : [];\n records.push(...parsedRecords);\n }\n } catch {\n return { records: cached?.records ?? [], complete: 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 };\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(line: string): 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 return {\n dedupeKey,\n observation: {\n id: `grok-transcript:${stableId(dedupeKey)}`,\n billingDomainId: 'grok-build-subscription',\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 root: string,\n cutoff: number\n): Promise<{ files: TranscriptFile[]; complete: boolean }> {\n const files: TranscriptFile[] = [];\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 (entry.isFile() && entry.name.endsWith('.jsonl')) {\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 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\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\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 { 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 BalanceRecord,\n BillingHistory,\n BillingDomainOverview,\n ConnectorDiagnostic,\n ConnectorRuntimeState,\n ConnectorSnapshot,\n CoverageLevel,\n CostRecord,\n DataAuthority,\n ExchangeRateSnapshot,\n HistoryCost,\n HistoryModelObservation,\n HistoryWindow,\n MonitoringSettings,\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 TokenUsageScope,\n UsageOverview,\n UsageQuery,\n UsageRepository\n} from '../core/types.js';\nimport { normalizeTokenObservation } from '../core/token-normalization.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 { DatabaseSync } = createRequire(import.meta.url)(\n 'node:sqlite'\n) as typeof import('node:sqlite');\n\ninterface DatabaseWorkerRequest {\n databasePath: string;\n operation: 'indexes' | 'delete-derived-costs' | 'retention';\n indexesSql?: string;\n aggregateSql?: string;\n deleteDerivedCostsSql?: 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-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 const codexOfficialDays = `(SELECT billing_domain_id, date(observed_at)\n FROM usage_observations\n WHERE provider_id = 'codex' AND id LIKE 'codex:daily:%')`;\n const codexRemainderDays = `(SELECT billing_domain_id, date(observed_at)\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 (\n (\n ${prefix}id LIKE 'codex:daily:%'\n AND (${prefix}billing_domain_id, date(${prefix}observed_at)) IN ${codexRemainderDays}\n )\n OR (\n ${prefix}id LIKE 'codex-transcript:%'\n AND ${prefix}id NOT LIKE 'codex-transcript:account-remainder:%'\n AND (${prefix}billing_domain_id, date(${prefix}observed_at)) IN ${codexOfficialDays}\n AND (${prefix}billing_domain_id, date(${prefix}observed_at)) NOT IN ${codexRemainderDays}\n )\n )\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 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\n constructor(databasePath: string) {\n this.#databasePath = databasePath;\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, 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 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 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.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.authoritativeIdPrefix,\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 const authoritativePrefix = usageReconciliation.authoritativeIdPrefix;\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 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 NOTHING`\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 overviews = providers.map((provider) => this.#getProviderOverview(provider, now, query));\n const riskSummary = buildRiskSummary(overviews);\n return {\n generatedAt: now.toISOString(),\n globalSummary: buildGlobalSummary(overviews, riskSummary, now, query),\n workbench: buildTokenMoneyWorkbench(overviews, now, query),\n providers: overviews,\n riskSummary\n };\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 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 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 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: summaryDomain?.tokenTotals ?? emptyTotals,\n tokenEvidence: summaryDomain?.tokenEvidence ?? emptyEvidence,\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, resets_at, 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 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 WHERE provider_id = ? AND billing_domain_id = ? ORDER BY observed_at DESC, id`\n )\n .all(providerId, domain.id) as unknown as CostRow[];\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 = costs.filter((cost) => cost.kind === 'actual').length;\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: 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 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 #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 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 `);\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 ['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 }\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 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.costs.map((cost) => cost.observedAt),\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): 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 };\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: 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 authorities = [\n ...new Set(model.observations.map((observation) => observation.authority))\n ].sort();\n const lastObservedAt =\n [...model.observations].sort((left, right) =>\n right.observedAt.localeCompare(left.observedAt)\n )[0]?.observedAt ?? 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 observations: model.observations,\n priceEvidence: model.priceEvidence,\n trend: buckets.map((bucket) => {\n const observations = model.observations.filter(\n (observation) =>\n observation.observedAt >= bucket.start && observation.observedAt < bucket.end\n );\n const priceEvidence = model.priceEvidence.filter(\n (cost) =>\n (cost.observedAt ?? '') >= bucket.start && (cost.observedAt ?? '') < bucket.end\n );\n const tokenTotals = observations.reduce(\n (total, observation) => addTokenTotals(total, observation.tokenTotals),\n zeroTokenTotals()\n );\n const intervalRetail = buildWorkbenchMetric(\n priceEvidence,\n 'retail-equivalent',\n comparisonCurrency,\n tokenTotals.total,\n history.exchangeRates\n );\n const intervalReported = buildWorkbenchMetric(\n priceEvidence,\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: observations.length === 0,\n tokenTotals,\n authorities: [\n ...new Set(observations.map((observation) => observation.authority))\n ].sort(),\n lastObservedAt:\n [...observations].sort((left, right) =>\n right.observedAt.localeCompare(left.observedAt)\n )[0]?.observedAt ?? 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.slice(0, 5).map((entry) => entry.id),\n byCost: byCost.slice(0, 5).map((entry) => entry.id),\n byRetailEquivalent: byRetailEquivalent.slice(0, 5).map((entry) => entry.id),\n entries: byTokens,\n unclassified\n };\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(\n row: UsageHistoryRow\n): BillingDomainOverview['history']['models'][number]['observations'][number] {\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(\n row: UsageHistoryRow\n): BillingDomainOverview['history']['models'][number]['observations'][number] {\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 { 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 { GrokBuildConnector } from '../connectors/grok-build/grok-build-connector.js';\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 repository = new SqliteUsageRepository(join(home, 'usage.sqlite'));\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 application = new UsageApplication({\n repository,\n connectors: [\n ...(process.env.AGENT_USAGE_DEMO === '1' ? [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: new CliOpenCodeLocalHistoryClient()\n }),\n new GrokBuildConnector({\n billingClient: new StdioGrokBillingClient(),\n historyClient: localTranscriptClient('grok', home)\n }),\n new XaiApiConnector({ accountClient: new XaiManagementApiClient({ secretStore }) })\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 ...(process.env.AGENT_USAGE_DEMO === '1' ? { AGENT_USAGE_DEMO: '1' } : {})\n }\n }),\n connectorPolicies: Object.fromEntries(\n ['codex', 'claude-code', 'opencode-go', 'grok', 'xai-api'].map((id) => [\n id,\n { minimumIntervalMs: 5 * 60 * 1000, timeoutMs: id === 'claude-code' ? 25_000 : 20_000 }\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 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 root: localTranscriptRoot(provider),\n cachePath: join(applicationHome, 'cache', `${provider}-transcripts.json`)\n });\n}\n\nfunction localTranscriptRoot(provider: LocalTranscriptProvider): string {\n if (provider === 'codex') {\n return join(resolveHomeOverride(process.env.CODEX_HOME, '.codex'), 'sessions');\n }\n if (provider === 'claude-code') {\n return join(resolveHomeOverride(process.env.CLAUDE_CONFIG_DIR, '.claude'), 'projects');\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 { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\n\nimport { Command } from 'commander';\nimport open from 'open';\n\nimport type { 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\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 try {\n const response = await fetch(`${state.origin}/api/health`, {\n headers: { authorization: `Bearer ${state.apiToken}` },\n signal: AbortSignal.timeout(500)\n });\n return response.ok;\n } catch {\n return 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","z","resolve","z","readFile","join","z","mapQuota","safeFailure","z","incompleteTranscriptFailure","safeFailure","spawn","homedir","join","z","unavailableError","JsonLinePeer","process","resolve","z","safeFailure","centSchema","schema","spawn","spawn","resolve","mkdir","writeFile","join","access","join","z","contentType","isAbsolute","join","resolve","createHash","createReadStream","mkdir","readFile","rename","writeFile","dirname","join","spawn","createRequire","dirname","resolve","snapshot","rates","retailEquivalent","reportedEstimate","DatabaseSync","existsSync","mkdir","rm","homedir","isAbsolute","join","resolve","spawn","homedir","join","resolve","open","response","runDaemon"]}
|