tokely 0.5.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/content/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/attributes/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/element.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/definitions.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/index.ts","../src/lib/utils.ts","../src/graph.ts","../src/output-path.ts","../src/lib/amp.ts","../src/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/cursor.ts","../src/lib/gemini.ts","../src/lib/interfaces.ts","../src/lib/open-code.ts","../src/lib/pi.ts","../src/providers.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport ora, { type Ora } from \"ora\";\nimport ow from \"ow\";\nimport sharp from \"sharp\";\nimport { heatmapThemes, renderUsageHeatmapsSvg, type ColorMode } from \"./graph\";\nimport type {\n JsonExportPayload,\n JsonUsageSummary,\n UsageSummary,\n UsageProviderId,\n} from \"./interfaces\";\nimport { getDefaultOutputPath } from \"./output-path\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport {\n aggregateUsage,\n defaultProviderIds,\n getProviderAvailability,\n mergeProviderUsage,\n providerIds,\n providerStatusLabel,\n} from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n all: boolean;\n amp: boolean;\n claude: boolean;\n codex: boolean;\n cursor: boolean;\n gemini: boolean;\n opencode: boolean;\n pi: boolean;\n}\n\nconst PNG_BASE_WIDTH = 1000;\nconst PNG_SCALE = 4;\nconst PNG_RENDER_WIDTH = PNG_BASE_WIDTH * PNG_SCALE;\nconst JSON_EXPORT_VERSION = \"2026-03-13\";\n\nconst HELP_TEXT = `tokely\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n tokely [--all] [--amp] [--claude] [--codex] [--cursor] [--gemini] [--opencode] [--pi] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --all Render one merged graph for all providers\n --amp Render Amp graph\n --claude Render Claude Code graph\n --codex Render Codex graph\n --cursor Render Cursor graph\n --gemini Render Gemini CLI graph\n --opencode Render Open Code graph\n --pi Render Pi Coding Agent graph\n --dark Render with the dark theme\n -f, --format Output format: png, svg, or json (default: png)\n -o, --output Output file path (default: ./heatmap-last-year.png)\n -h, --help Show this help\n`;\n\nfunction printHelp() {\n process.stdout.write(HELP_TEXT);\n}\n\nfunction validateArgs(values: unknown): asserts values is CliArgValues {\n ow(\n values,\n ow.object.exactShape({\n output: ow.optional.string.nonEmpty,\n format: ow.optional.string.nonEmpty,\n help: ow.boolean,\n dark: ow.boolean,\n all: ow.boolean,\n amp: ow.boolean,\n claude: ow.boolean,\n codex: ow.boolean,\n cursor: ow.boolean,\n gemini: ow.boolean,\n opencode: ow.boolean,\n pi: ow.boolean,\n }),\n );\n}\n\nfunction inferFormat(\n formatArg: string | undefined,\n outputArg: string | undefined,\n) {\n if (formatArg) {\n ow(formatArg, ow.string.oneOf([\"png\", \"svg\", \"json\"] as const));\n\n return formatArg;\n }\n\n if (outputArg) {\n const outputExtension = extname(outputArg).toLowerCase();\n\n if (outputExtension === \".svg\") {\n return \"svg\" as const;\n }\n\n if (outputExtension === \".json\") {\n return \"json\" as const;\n }\n }\n\n return \"png\" as const;\n}\n\nasync function writeOutputImage(\n outputPath: string,\n format: Exclude<OutputFormat, \"json\">,\n svg: string,\n background: string,\n) {\n if (format === \"svg\") {\n writeFileSync(outputPath, svg, \"utf8\");\n\n return;\n }\n\n const pngBuffer = await sharp(Buffer.from(svg), { density: 192 })\n .resize({ width: PNG_RENDER_WIDTH })\n .flatten({ background })\n .png()\n .toBuffer();\n\n writeFileSync(outputPath, pngBuffer);\n}\n\nfunction writeOutputJson(outputPath: string, payload: JsonExportPayload) {\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction toJsonUsageSummary(summary: UsageSummary): JsonUsageSummary {\n return {\n provider: summary.provider,\n insights: summary.insights,\n daily: summary.daily.map((row) => ({\n date: formatLocalDate(row.date),\n input: row.input,\n output: row.output,\n cache: row.cache,\n total: row.total,\n displayValue: row.displayValue,\n breakdown: row.breakdown,\n })),\n };\n}\n\nfunction getDateWindow() {\n const start = new Date();\n\n start.setHours(0, 0, 0, 0);\n start.setFullYear(start.getFullYear() - 1);\n\n const end = new Date();\n\n end.setHours(23, 59, 59, 999);\n\n return { start, end };\n}\n\nfunction printProviderAvailability(\n availabilityByProvider: Record<ProviderId, boolean>,\n providers: ProviderId[],\n) {\n for (const provider of providers) {\n const status = availabilityByProvider[provider]\n ? \"available\"\n : \"not available\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${status}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction getMergedNoDataMessage() {\n return \"No usage data found for Amp, Claude Code, Codex, Cursor, Gemini CLI, Open Code, or Pi Coding Agent.\";\n}\n\nfunction getRequestedMissingProvidersMessage(missing: ProviderId[]) {\n return `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`;\n}\n\nfunction getNoDataMessage() {\n return getMergedNoDataMessage();\n}\n\nfunction getOutputProviders(\n values: CliArgValues,\n availabilityByProvider: Record<ProviderId, boolean>,\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n end: Date,\n) {\n if (!values.all) {\n return selectProvidersToRender(\n availabilityByProvider,\n rowsByProvider,\n getRequestedProviders(values),\n );\n }\n\n const merged = mergeProviderUsage(rowsByProvider, end);\n\n if (!merged) {\n throw new Error(getMergedNoDataMessage());\n }\n\n return [merged];\n}\n\nfunction getDefaultOutputProviderIds(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n) {\n const selected: ProviderId[] = [];\n const fallbackProviders = providerIds.filter(\n (provider) => !defaultProviderIds.includes(provider),\n );\n\n for (const provider of [...defaultProviderIds, ...fallbackProviders]) {\n if (!rowsByProvider[provider] || selected.includes(provider)) {\n continue;\n }\n\n selected.push(provider);\n\n if (selected.length === 4) {\n return selected;\n }\n }\n\n return selected;\n}\n\nfunction getMergedProviderTitle(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n) {\n return providerIds\n .filter((provider) => rowsByProvider[provider] !== null)\n .map((provider) => heatmapThemes[provider].title)\n .join(\" / \");\n}\n\nfunction selectProvidersToRender(\n availabilityByProvider: Record<ProviderId, boolean>,\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const defaultProviders = getDefaultOutputProviderIds(rowsByProvider);\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : defaultProviders.filter((provider) => rowsByProvider[provider]);\n\n if (requested.length > 0 && providersToRender.length < requested.length) {\n const missing = requested.filter((provider) => !rowsByProvider[provider]);\n\n throw new Error(getRequestedMissingProvidersMessage(missing));\n }\n\n if (providersToRender.length === 0) {\n const availableProviders = providerIds.filter(\n (provider) => availabilityByProvider[provider],\n );\n\n if (availableProviders.length > 0) {\n const availableLabels = availableProviders\n .map((provider) => providerStatusLabel[provider])\n .join(\", \");\n const defaultLabels = defaultProviderIds\n .map((provider) => providerStatusLabel[provider])\n .join(\", \");\n\n throw new Error(\n `No usage data found for available providers (${availableLabels}). Preferred order is ${defaultLabels}. Use --all or specify providers explicitly.`,\n );\n }\n\n throw new Error(getNoDataMessage());\n }\n\n return providersToRender.map((provider) => rowsByProvider[provider]!);\n}\n\nfunction printRunSummary(\n outputPath: string,\n format: OutputFormat,\n colorMode: ColorMode,\n startDate: Date,\n endDate: Date,\n rendered: UsageProviderId[],\n) {\n process.stdout.write(\n `${JSON.stringify(\n {\n output: outputPath,\n format,\n colorMode,\n startDate: formatLocalDate(startDate),\n endDate: formatLocalDate(endDate),\n rendered,\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function main() {\n let spinner: Ora | undefined;\n\n const parsed = parseArgs({\n options: {\n output: { type: \"string\", short: \"o\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n dark: { type: \"boolean\", default: false },\n all: { type: \"boolean\", default: false },\n amp: { type: \"boolean\", default: false },\n claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n cursor: { type: \"boolean\", default: false },\n gemini: { type: \"boolean\", default: false },\n opencode: { type: \"boolean\", default: false },\n pi: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n validateArgs(parsed.values);\n\n const { values } = parsed;\n\n if (values.help) {\n printHelp();\n\n return;\n }\n\n try {\n spinner = ora({\n text: \"Analyzing usage data...\",\n spinner: \"dots\",\n }).start();\n\n const { start, end } = getDateWindow();\n const colorMode: ColorMode = values.dark ? \"dark\" : \"light\";\n const format = inferFormat(values.format, values.output);\n const requestedProviders = values.all\n ? providerIds\n : getRequestedProviders(values);\n const inspectedProviders =\n requestedProviders.length > 0 ? requestedProviders : providerIds;\n const availabilityByProvider =\n await getProviderAvailability(inspectedProviders);\n const { rowsByProvider, warnings } = await aggregateUsage({\n start,\n end,\n requestedProviders,\n });\n\n spinner.stop();\n\n for (const warning of warnings) {\n process.stderr.write(`${warning}\\n`);\n }\n\n printProviderAvailability(availabilityByProvider, inspectedProviders);\n\n const exportProviders = getOutputProviders(\n values,\n availabilityByProvider,\n rowsByProvider,\n end,\n );\n\n const outputPath = resolve(\n values.output ?? getDefaultOutputPath(values, format),\n );\n\n mkdirSync(dirname(outputPath), { recursive: true });\n\n if (format === \"json\") {\n spinner.start(\"Preparing JSON export...\");\n\n const payload: JsonExportPayload = {\n version: JSON_EXPORT_VERSION,\n start: formatLocalDate(start),\n end: formatLocalDate(end),\n providers: exportProviders.map((provider) =>\n toJsonUsageSummary(provider),\n ),\n };\n\n spinner.text = \"Writing output file...\";\n writeOutputJson(outputPath, payload);\n } else {\n spinner.start(\"Rendering heatmaps...\");\n\n const svg = renderUsageHeatmapsSvg({\n startDate: start,\n endDate: end,\n colorMode,\n sections: exportProviders.map(({ provider, daily, insights }) => ({\n daily,\n insights,\n title:\n provider === \"all\"\n ? getMergedProviderTitle(rowsByProvider)\n : heatmapThemes[provider].title,\n titleCaption: heatmapThemes[provider].titleCaption,\n colors: heatmapThemes[provider].colors,\n })),\n });\n const background = colorMode === \"dark\" ? \"#171717\" : \"#ffffff\";\n\n spinner.text = \"Writing output file...\";\n await writeOutputImage(outputPath, format, svg, background);\n }\n\n spinner.succeed(\"Analysis complete\");\n\n printRunSummary(\n outputPath,\n format,\n colorMode,\n start,\n end,\n exportProviders.map(({ provider }) => provider),\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (spinner) {\n spinner.fail(`Failed: ${message}`);\n } else {\n process.stderr.write(`${message}\\n`);\n }\n\n process.exitCode = 1;\n }\n}\n\nvoid main();\n",null,null,null,null,null,null,"import { createReadStream } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n DailyUsage,\n Insights,\n ModelUsage,\n UsageSummary,\n} from \"../interfaces\";\n\nexport function formatLocalDate(date: Date) {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n\n return `${y}-${m}-${d}`;\n}\n\nexport interface DailyTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\nexport interface ModelTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\ninterface TokenTotals {\n tokens: DailyTokenTotals;\n models: Map<string, ModelTokenTotals>;\n}\n\nexport type DailyTotalsByDate = Map<string, TokenTotals>;\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nexport const DEFAULT_FILE_PROCESS_CONCURRENCY = 16;\nexport const FILE_PROCESS_CONCURRENCY_ENV = \"TOKELY_FILE_PROCESS_CONCURRENCY\";\nexport const MAX_JSONL_RECORD_BYTES_ENV = \"TOKELY_MAX_JSONL_RECORD_BYTES\";\nexport const DEFAULT_MAX_JSONL_RECORD_BYTES = 64 * 1024 * 1024;\n\nexport interface JsonlRecord<TClassification = void> {\n lineNumber: number;\n rawLine: string;\n byteLength: number;\n classification: TClassification;\n}\n\nexport type JsonlRecordDecision<TClassification> =\n | { kind: \"keep\"; classification: TClassification }\n | { kind: \"skip\" }\n | { kind: \"unknown\" };\n\ninterface ReadJsonlRecordsOptions<TClassification> {\n classificationPrefixBytes?: number;\n classify?: (prefix: string) => JsonlRecordDecision<TClassification>;\n maxRecordBytes?: number;\n onSkippedOversizedRecord?: (record: {\n lineNumber: number;\n byteLength: number;\n }) => void;\n oversizedErrorMessage?: (record: {\n filePath: string;\n lineNumber: number;\n maxRecordBytes: number;\n envVarName: string;\n }) => string;\n}\n\ninterface ReadJsonDocumentOptions {\n maxBytes?: number;\n oversizedErrorMessage?: (record: {\n filePath: string;\n maxBytes: number;\n envVarName: string;\n }) => string;\n}\n\ninterface ParseJsonTextOptions {\n maxBytes?: number;\n oversizedErrorMessage?: (record: {\n sourceLabel: string;\n maxBytes: number;\n envVarName: string;\n }) => string;\n}\n\nfunction cloneTokenTotals(\n totals: DailyTokenTotals | ModelTokenTotals,\n): ModelTokenTotals {\n return {\n input: totals.input,\n output: totals.output,\n cache: { input: totals.cache.input, output: totals.cache.output },\n total: totals.total,\n };\n}\n\nfunction mergeTokenTotals(\n target: DailyTokenTotals | ModelTokenTotals,\n source: DailyTokenTotals | ModelTokenTotals,\n) {\n target.input += source.input;\n target.output += source.output;\n target.cache.input += source.cache.input;\n target.cache.output += source.cache.output;\n target.total += source.total;\n}\n\nexport function addModelTokenTotals(\n modelTotals: Map<string, ModelTokenTotals>,\n modelName: string,\n tokenTotals: DailyTokenTotals | ModelTokenTotals,\n) {\n const existing = modelTotals.get(modelName);\n\n if (!existing) {\n modelTotals.set(modelName, cloneTokenTotals(tokenTotals));\n\n return;\n }\n\n mergeTokenTotals(existing, tokenTotals);\n}\n\nexport function addDailyTokenTotals(\n totals: DailyTotalsByDate,\n date: Date,\n tokenTotals: DailyTokenTotals,\n modelName?: string,\n) {\n const key = formatLocalDate(date);\n const existing = totals.get(key);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n if (modelName) {\n models.set(modelName, cloneTokenTotals(tokenTotals));\n }\n totals.set(key, { tokens: cloneTokenTotals(tokenTotals), models });\n\n return;\n }\n\n mergeTokenTotals(existing.tokens, tokenTotals);\n\n if (modelName) {\n addModelTokenTotals(existing.models, modelName, tokenTotals);\n }\n}\n\nexport function mergeDailyTotalsByDate(\n target: DailyTotalsByDate,\n source: DailyTotalsByDate,\n) {\n for (const [dateKey, sourceTotals] of source.entries()) {\n const existing = target.get(dateKey);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n for (const [modelName, totals] of sourceTotals.models.entries()) {\n models.set(modelName, cloneTokenTotals(totals));\n }\n\n target.set(dateKey, {\n tokens: cloneTokenTotals(sourceTotals.tokens),\n models,\n });\n continue;\n }\n\n mergeTokenTotals(existing.tokens, sourceTotals.tokens);\n\n for (const [modelName, totals] of sourceTotals.models.entries()) {\n addModelTokenTotals(existing.models, modelName, totals);\n }\n }\n}\n\nexport function mergeModelTotals(\n target: Map<string, ModelTokenTotals>,\n source: Map<string, ModelTokenTotals>,\n) {\n for (const [modelName, totals] of source.entries()) {\n addModelTokenTotals(target, modelName, totals);\n }\n}\n\nexport function totalsToRows(\n totals: DailyTotalsByDate,\n displayValuesByDate = new Map<string, number>(),\n): DailyUsage[] {\n const allDates = new Set<string>([\n ...totals.keys(),\n ...displayValuesByDate.keys(),\n ]);\n\n return [...allDates]\n .sort((a, b) => a.localeCompare(b))\n .map((date) => {\n const entry = totals.get(date);\n const tokens = entry?.tokens ?? {\n input: 0,\n output: 0,\n cache: { input: 0, output: 0 },\n total: 0,\n };\n const models = entry?.models ?? new Map<string, ModelTokenTotals>();\n const displayValue =\n tokens.total > 0 ? tokens.total : (displayValuesByDate.get(date) ?? 0);\n\n return {\n date: new Date(`${date}T00:00:00`),\n input: tokens.input,\n output: tokens.output,\n cache: { input: tokens.cache.input, output: tokens.cache.output },\n total: tokens.total,\n displayValue: displayValue > 0 ? displayValue : undefined,\n breakdown: [...models.entries()]\n .sort(([, a], [, b]) => b.total - a.total)\n .map(([name, t]) => ({\n name,\n tokens: {\n input: t.input,\n output: t.output,\n cache: { input: t.cache.input, output: t.cache.output },\n total: t.total,\n },\n })),\n };\n });\n}\n\nexport async function listFilesRecursive(rootDir: string, extension: string) {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop()!;\n\n let entries;\n\n try {\n entries = await readdir(currentDir, {\n withFileTypes: true,\n encoding: \"utf8\",\n });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && fullPath.endsWith(extension)) {\n files.push(fullPath);\n }\n }\n }\n\n return files.sort((left, right) => left.localeCompare(right));\n}\n\nfunction defaultOversizedJsonlRecordMessage({\n filePath,\n lineNumber,\n maxRecordBytes,\n envVarName,\n}: {\n filePath: string;\n lineNumber: number;\n maxRecordBytes: number;\n envVarName: string;\n}) {\n return `JSONL record exceeds ${maxRecordBytes} bytes in ${filePath}:${lineNumber}. Increase ${envVarName} to process this file.`;\n}\n\nfunction defaultOversizedJsonDocumentMessage({\n filePath,\n maxBytes,\n envVarName,\n}: {\n filePath: string;\n maxBytes: number;\n envVarName: string;\n}) {\n return `JSON document exceeds ${maxBytes} bytes in ${filePath}. Increase ${envVarName} to process this file.`;\n}\n\nfunction defaultOversizedJsonTextMessage({\n sourceLabel,\n maxBytes,\n envVarName,\n}: {\n sourceLabel: string;\n maxBytes: number;\n envVarName: string;\n}) {\n return `JSON payload exceeds ${maxBytes} bytes in ${sourceLabel}. Increase ${envVarName} to process this payload.`;\n}\n\nfunction keepAllJsonlRecords<\n TClassification,\n>(): JsonlRecordDecision<TClassification> {\n return { kind: \"keep\", classification: undefined as TClassification };\n}\n\nexport async function* readJsonlRecords<TClassification = void>(\n filePath: string,\n options: ReadJsonlRecordsOptions<TClassification> = {},\n): AsyncGenerator<JsonlRecord<TClassification>> {\n const maxRecordBytes =\n options.maxRecordBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const classificationPrefixBytes =\n options.classificationPrefixBytes ?? maxRecordBytes;\n const classify = options.classify ?? keepAllJsonlRecords<TClassification>;\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonlRecordMessage;\n const stream = createReadStream(filePath);\n let lineNumber = 0;\n let lineBytesSeen = 0;\n let retainedBytes = 0;\n let prefixBytes = 0;\n let exceededLimit = false;\n let decision: JsonlRecordDecision<TClassification> = { kind: \"unknown\" };\n let prefixChunks: Buffer[] = [];\n let retainedChunks: Buffer[] = [];\n\n const resetRecord = () => {\n lineBytesSeen = 0;\n retainedBytes = 0;\n prefixBytes = 0;\n exceededLimit = false;\n decision = { kind: \"unknown\" };\n prefixChunks = [];\n retainedChunks = [];\n };\n\n const maybeClassify = () => {\n if (decision.kind !== \"unknown\" || prefixBytes === 0) {\n return;\n }\n\n decision = classify(\n Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\"),\n );\n\n if (decision.kind === \"skip\") {\n retainedChunks = [];\n retainedBytes = 0;\n }\n };\n\n const appendSegment = (segment: Buffer) => {\n if (segment.length === 0) {\n return;\n }\n\n lineBytesSeen += segment.length;\n\n if (prefixBytes < classificationPrefixBytes) {\n const prefixSegment = segment.subarray(\n 0,\n Math.min(segment.length, classificationPrefixBytes - prefixBytes),\n );\n\n prefixChunks.push(prefixSegment);\n prefixBytes += prefixSegment.length;\n maybeClassify();\n }\n\n if (decision.kind === \"skip\") {\n return;\n }\n\n const remainingBytes = maxRecordBytes - retainedBytes;\n\n if (remainingBytes > 0) {\n const retainedSegment = segment.subarray(\n 0,\n Math.min(segment.length, remainingBytes),\n );\n\n if (retainedSegment.length > 0) {\n retainedChunks.push(retainedSegment);\n retainedBytes += retainedSegment.length;\n }\n }\n\n if (segment.length > remainingBytes) {\n exceededLimit = true;\n }\n };\n\n const resolveDecision = () => {\n if (decision.kind !== \"unknown\") {\n return decision;\n }\n\n const candidate =\n exceededLimit || retainedBytes === 0\n ? Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\")\n : Buffer.concat(retainedChunks, retainedBytes).toString(\"utf8\");\n\n return classify(candidate);\n };\n\n const finalizeRecord = () => {\n lineNumber += 1;\n\n if (lineBytesSeen === 0 && !exceededLimit) {\n resetRecord();\n\n return null;\n }\n\n const resolvedDecision = resolveDecision();\n\n if (resolvedDecision.kind === \"skip\") {\n if (lineBytesSeen > maxRecordBytes) {\n options.onSkippedOversizedRecord?.({\n lineNumber,\n byteLength: lineBytesSeen,\n });\n }\n\n resetRecord();\n\n return null;\n }\n\n if (resolvedDecision.kind === \"unknown\") {\n resetRecord();\n\n return null;\n }\n\n if (lineBytesSeen > maxRecordBytes || exceededLimit) {\n throw new Error(\n oversizedErrorMessage({\n filePath,\n lineNumber,\n maxRecordBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n const rawLine = Buffer.concat(retainedChunks, retainedBytes)\n .toString(\"utf8\")\n .trim();\n\n if (rawLine === \"\") {\n resetRecord();\n\n return null;\n }\n\n const record: JsonlRecord<TClassification> = {\n lineNumber,\n rawLine,\n byteLength: lineBytesSeen,\n classification: resolvedDecision.classification,\n };\n\n resetRecord();\n\n return record;\n };\n\n for await (const chunk of stream) {\n let start = 0;\n\n for (let index = 0; index < chunk.length; index += 1) {\n if (chunk[index] !== 0x0a) {\n continue;\n }\n\n appendSegment(chunk.subarray(start, index));\n const record = finalizeRecord();\n\n if (record) {\n yield record;\n }\n\n start = index + 1;\n }\n\n appendSegment(chunk.subarray(start));\n }\n\n if (lineBytesSeen > 0) {\n const record = finalizeRecord();\n\n if (record) {\n yield record;\n }\n }\n}\n\nexport async function* readJsonLines<T>(filePath: string): AsyncGenerator<T> {\n for await (const record of readJsonlRecords(filePath)) {\n try {\n yield JSON.parse(record.rawLine) as T;\n } catch {\n // Preserve existing behavior for malformed JSONL records.\n }\n }\n}\n\nexport async function readJsonDocument<T>(\n filePath: string,\n options: ReadJsonDocumentOptions = {},\n) {\n const maxBytes =\n options.maxBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonDocumentMessage;\n const stream = createReadStream(filePath);\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n\n for await (const chunk of stream) {\n totalBytes += chunk.length;\n\n if (totalBytes > maxBytes) {\n stream.destroy();\n\n throw new Error(\n oversizedErrorMessage({\n filePath,\n maxBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n chunks.push(chunk);\n }\n\n return parseJsonTextWithLimit<T>(\n Buffer.concat(chunks, totalBytes).toString(\"utf8\"),\n filePath,\n {\n maxBytes,\n oversizedErrorMessage: ({ sourceLabel, maxBytes, envVarName }) =>\n oversizedErrorMessage({\n filePath: sourceLabel,\n maxBytes,\n envVarName,\n }),\n },\n );\n}\n\nexport function parseJsonTextWithLimit<T>(\n content: string,\n sourceLabel: string,\n options: ParseJsonTextOptions = {},\n) {\n const maxBytes =\n options.maxBytes ??\n getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const oversizedErrorMessage =\n options.oversizedErrorMessage ?? defaultOversizedJsonTextMessage;\n\n if (Buffer.byteLength(content, \"utf8\") > maxBytes) {\n throw new Error(\n oversizedErrorMessage({\n sourceLabel,\n maxBytes,\n envVarName: MAX_JSONL_RECORD_BYTES_ENV,\n }),\n );\n }\n\n return JSON.parse(content) as T;\n}\n\nexport function getPositiveIntegerEnv(name: string, fallback: number) {\n const raw = process.env[name]?.trim();\n\n if (!raw) {\n return fallback;\n }\n\n const parsed = Number.parseInt(raw, 10);\n\n if (!Number.isFinite(parsed) || parsed < 1) {\n return fallback;\n }\n\n return parsed;\n}\n\nexport async function runWithConcurrency<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n) {\n if (items.length === 0) {\n return;\n }\n\n const limit = Math.max(1, Math.min(concurrency, items.length));\n let nextIndex = 0;\n\n await Promise.all(\n Array.from({ length: limit }, async () => {\n for (;;) {\n const currentIndex = nextIndex;\n\n nextIndex += 1;\n\n if (currentIndex >= items.length) {\n return;\n }\n\n await worker(items[currentIndex], currentIndex);\n }\n }),\n );\n}\n\nexport function getRecentWindowStart(endDate: Date, days = 30) {\n const start = new Date(endDate);\n\n start.setDate(start.getDate() - (days - 1));\n start.setHours(0, 0, 0, 0);\n\n return start;\n}\n\nexport function normalizeModelName(modelName: string) {\n return modelName.replace(/-\\d{8}$/, \"\");\n}\n\nexport function getTopModel(\n modelTotals: Map<string, ModelTokenTotals>,\n): ModelUsage | undefined {\n let bestModel: string | undefined;\n let bestTotals: ModelTokenTotals | undefined;\n\n for (const [modelName, totals] of modelTotals) {\n if (!bestTotals || totals.total > bestTotals.total) {\n bestModel = modelName;\n bestTotals = totals;\n }\n }\n\n if (!bestTotals || bestTotals.total <= 0) {\n return undefined;\n }\n\n return {\n name: bestModel!,\n tokens: {\n input: bestTotals.input,\n output: bestTotals.output,\n cache: { input: bestTotals.cache.input, output: bestTotals.cache.output },\n total: bestTotals.total,\n },\n };\n}\n\nfunction startOfDay(date: Date) {\n const day = new Date(date);\n\n day.setHours(0, 0, 0, 0);\n\n return day;\n}\n\nfunction isConsecutiveDay(prevDate: Date, currDate: Date): boolean {\n const prev = startOfDay(prevDate);\n const curr = startOfDay(currDate);\n const diff = curr.getTime() - prev.getTime();\n\n return diff === ONE_DAY_MS;\n}\n\nexport function computeLongestStreak(daily: DailyUsage[]): number {\n if (daily.length === 0) {\n return 0;\n }\n\n let longest = 1;\n let running = 1;\n\n for (let i = 1; i < daily.length; i += 1) {\n if (isConsecutiveDay(daily[i - 1].date, daily[i].date)) {\n running += 1;\n if (running > longest) {\n longest = running;\n }\n } else {\n running = 1;\n }\n }\n\n return longest;\n}\n\nexport function computeCurrentStreak(daily: DailyUsage[], end: Date): number {\n if (daily.length === 0) {\n return 0;\n }\n\n const endDay = startOfDay(end);\n const lastEntry = daily[daily.length - 1];\n const lastEntryDay = startOfDay(lastEntry.date);\n\n // If the last active day isn't the end date, check if it's consecutive\n if (\n lastEntryDay.getTime() !== endDay.getTime() &&\n !isConsecutiveDay(lastEntryDay, endDay)\n ) {\n return 0;\n }\n\n let current = 1;\n\n for (let i = daily.length - 2; i >= 0; i -= 1) {\n if (!isConsecutiveDay(daily[i].date, daily[i + 1].date)) {\n break;\n }\n current += 1;\n }\n\n return current;\n}\n\nexport function getProviderInsights(\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n daily: DailyUsage[],\n end: Date,\n): Insights {\n const mostUsedModel = getTopModel(modelTotals);\n const recentMostUsedModel = getTopModel(recentModelTotals);\n const measuredDaily = daily.filter(\n (row) => (row.displayValue ?? row.total) > 0,\n );\n\n return {\n mostUsedModel,\n recentMostUsedModel,\n streaks: {\n longest: computeLongestStreak(measuredDaily),\n current: computeCurrentStreak(measuredDaily, end),\n },\n };\n}\n\nexport function createUsageSummary(\n provider: UsageSummary[\"provider\"],\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n end: Date,\n displayValuesByDate?: Map<string, number>,\n): UsageSummary {\n const daily = totalsToRows(totals, displayValuesByDate);\n\n return {\n provider,\n daily,\n insights: getProviderInsights(modelTotals, recentModelTotals, daily, end),\n };\n}\n\nexport function hasUsage(summary: UsageSummary) {\n return summary.daily.some(\n (row) => row.total > 0 || (row.displayValue ?? 0) > 0,\n );\n}\n\nexport function mergeUsageSummaries(\n provider: UsageSummary[\"provider\"],\n summaries: UsageSummary[],\n end: Date,\n): UsageSummary {\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const displayValuesByDate = new Map<string, number>();\n const recentStart = getRecentWindowStart(end, 30);\n\n for (const summary of summaries) {\n for (const row of summary.daily) {\n addDailyTokenTotals(totals, row.date, {\n input: row.input,\n output: row.output,\n cache: { input: row.cache.input, output: row.cache.output },\n total: row.total,\n });\n\n const dateKey = formatLocalDate(row.date);\n const displayValue = row.displayValue ?? row.total;\n\n if (displayValue > 0) {\n displayValuesByDate.set(\n dateKey,\n (displayValuesByDate.get(dateKey) ?? 0) + displayValue,\n );\n }\n\n const totalsForDate = totals.get(dateKey);\n\n if (totalsForDate) {\n for (const breakdown of row.breakdown) {\n addModelTokenTotals(\n totalsForDate.models,\n breakdown.name,\n breakdown.tokens,\n );\n addModelTokenTotals(modelTotals, breakdown.name, breakdown.tokens);\n\n if (row.date >= recentStart) {\n addModelTokenTotals(\n recentModelTotals,\n breakdown.name,\n breakdown.tokens,\n );\n }\n }\n }\n }\n }\n\n return createUsageSummary(\n provider,\n totals,\n modelTotals,\n recentModelTotals,\n end,\n displayValuesByDate,\n );\n}\n","import svgBuilder, { type SVGBuilderInstance } from \"svg-builder\";\nimport type { DailyUsage, Insights, ModelUsage } from \"./interfaces\";\nimport type { ProviderId } from \"./lib/interfaces\";\nimport { formatLocalDate } from \"./lib/utils\";\n\ntype HeatmapThemeId = ProviderId | \"all\";\n\ninterface HeatmapTheme {\n title: string;\n titleCaption?: string;\n colors: {\n light: string[];\n dark: string[];\n };\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\ninterface CalendarGrid {\n weeks: (string | null)[][];\n monthLabels: (string | null)[];\n}\n\ninterface SectionLayout {\n width: number;\n height: number;\n gridTop: number;\n leftLabelWidth: number;\n cellSize: number;\n gap: number;\n headerCaptionY: number;\n headerValueY: number;\n titleY: number;\n monthLabelY: number;\n legendY: number;\n noteY: number;\n footerCaptionY: number;\n footerValueY: number;\n}\n\ninterface DrawHeatmapSectionOptions {\n x: number;\n y: number;\n grid: CalendarGrid;\n layout: SectionLayout;\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n titleCaption?: string;\n colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n titleCaption?: string;\n colors: HeatmapTheme[\"colors\"];\n}\n\ninterface ModelUsageRow {\n caption: string;\n data: ModelUsage;\n}\n\ninterface RenderUsageHeatmapsSvgOptions {\n startDate: Date;\n endDate: Date;\n sections: RenderUsageHeatmapsSvgSection[];\n colorMode: ColorMode;\n}\n\ninterface SurfacePalette {\n background: string;\n text: string;\n muted: string;\n}\n\nexport const heatmapThemes: Record<HeatmapThemeId, HeatmapTheme> = {\n amp: {\n title: \"Amp\",\n colors: {\n light: [\n \"#ecfeff\", // cyan-50\n \"#a5f3fc\", // cyan-200\n \"#67e8f9\", // cyan-300\n \"#06b6d4\", // cyan-500\n \"#0e7490\", // cyan-700\n ],\n dark: [\n \"#083344\", // cyan-950\n \"#155e75\", // cyan-800\n \"#0891b2\", // cyan-600\n \"#22d3ee\", // cyan-400\n \"#a5f3fc\", // cyan-200\n ],\n },\n },\n claude: {\n title: \"Claude Code\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#c2410c\", // orange-700\n ],\n dark: [\n \"#292524\", // stone-800\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n codex: {\n title: \"Codex\",\n colors: {\n light: [\n \"#e0e7ff\", // indigo-100\n \"#a5b4fc\", // indigo-300\n \"#818cf8\", // indigo-400\n \"#4f46e5\", // indigo-600\n \"#312e81\", // indigo-900\n ],\n dark: [\n \"#1e1b4b\", // indigo-950\n \"#312e81\", // indigo-900\n \"#4338ca\", // indigo-700\n \"#818cf8\", // indigo-400\n \"#c7d2fe\", // indigo-200\n ],\n },\n },\n cursor: {\n title: \"Cursor\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#9a3412\", // orange-800\n ],\n dark: [\n \"#431407\", // orange-950\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n gemini: {\n title: \"Gemini CLI\",\n colors: {\n light: [\n \"#eff6ff\", // blue-50\n \"#bfdbfe\", // blue-200\n \"#93c5fd\", // blue-300\n \"#3b82f6\", // blue-500\n \"#1d4ed8\", // blue-700\n ],\n dark: [\n \"#172554\", // blue-950\n \"#1d4ed8\", // blue-700\n \"#2563eb\", // blue-600\n \"#60a5fa\", // blue-400\n \"#bfdbfe\", // blue-200\n ],\n },\n },\n opencode: {\n title: \"Open Code\",\n colors: {\n light: [\n \"#f5f5f5\", // neutral-100\n \"#d4d4d4\", // neutral-300\n \"#a3a3a3\", // neutral-400\n \"#525252\", // neutral-600\n \"#171717\", // neutral-900\n ],\n dark: [\n \"#262626\", // neutral-800\n \"#525252\", // neutral-600\n \"#737373\", // neutral-500\n \"#a3a3a3\", // neutral-400\n \"#fafafa\", // neutral-50\n ],\n },\n },\n pi: {\n title: \"Pi Coding Agent\",\n colors: {\n light: [\n \"#ecfdf5\", // emerald-50\n \"#a7f3d0\", // emerald-200\n \"#6ee7b7\", // emerald-300\n \"#10b981\", // emerald-500\n \"#047857\", // emerald-700\n ],\n dark: [\n \"#022c22\", // emerald-950\n \"#065f46\", // emerald-800\n \"#059669\", // emerald-600\n \"#34d399\", // emerald-400\n \"#a7f3d0\", // emerald-200\n ],\n },\n },\n all: {\n title:\n \"Amp / Claude Code / Codex / Cursor / Gemini CLI / Open Code / Pi Coding Agent\",\n titleCaption: \"Total usage from\",\n colors: {\n light: [\n \"#f0fdf4\", // green-50\n \"#bbf7d0\", // green-200\n \"#4ade80\", // green-400\n \"#16a34a\", // green-600\n \"#14532d\", // green-900\n ],\n dark: [\n \"#052e16\", // green-950\n \"#15803d\", // green-700\n \"#16a34a\", // green-600\n \"#4ade80\", // green-400\n \"#bbf7d0\", // green-200\n ],\n },\n },\n};\n\nconst daysOfWeekMonday = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst numberFormatter = new Intl.NumberFormat(\"en-US\");\nconst fontFamily =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\nconst providerTitleFontSize = 20;\nconst metricCaptionFontSize = 9;\nconst metricValueFontSize = 14;\nconst captionValueGap = 4;\nconst heatmapGamma = 0.7;\n\nconst surfacePalettes: Record<ColorMode, SurfacePalette> = {\n light: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#737373\",\n },\n dark: {\n background: \"#171717\",\n text: \"#fafafa\",\n muted: \"#a3a3a3\",\n },\n};\n\nconst emptyCellFill: Record<ColorMode, string> = {\n light: \"#f5f5f5\", // neutral-100\n dark: \"#262626\", // neutral-800\n};\n\nfunction formatTokenTotal(value: number) {\n const units = [\n { size: 1_000_000_000_000, suffix: \"T\" },\n { size: 1_000_000_000, suffix: \"B\" },\n { size: 1_000_000, suffix: \"M\" },\n { size: 1_000, suffix: \"K\" },\n ];\n\n for (const unit of units) {\n if (value >= unit.size) {\n const scaled = value / unit.size;\n const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2;\n const compact = scaled\n .toFixed(precision)\n .replace(/\\.0+$/, \"\")\n .replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n\n return `${compact}${unit.suffix}`;\n }\n }\n\n return numberFormatter.format(value);\n}\n\nfunction truncateText(value: string, maxLength: number) {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(maxLength - 3, 1))}...`;\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction caption(value: string) {\n return value.toUpperCase();\n}\n\nfunction getAllDays(start: Date, end: Date) {\n const days: string[] = [];\n const curr = new Date(start);\n\n while (curr <= end) {\n days.push(formatLocalDate(curr));\n curr.setDate(curr.getDate() + 1);\n }\n\n return days;\n}\n\nfunction getMondayBasedWeekday(dateIso: string) {\n const sundayBased = new Date(`${dateIso}T00:00:00`).getDay();\n\n return (sundayBased + 6) % 7;\n}\n\nfunction padToWeekStartMonday(days: string[]) {\n const firstDay = getMondayBasedWeekday(days[0]);\n const padding = new Array(firstDay).fill(null);\n\n return [...padding, ...days];\n}\n\nfunction chunkByWeek(days: (string | null)[]): (string | null)[][] {\n const weeks: (string | null)[][] = [];\n\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks;\n}\n\nfunction getMonthLabel(week: (string | null)[]) {\n const lastDay = [...week].reverse().find(Boolean);\n\n if (!lastDay) {\n return null;\n }\n\n return new Date(`${lastDay}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n });\n}\n\nfunction defaultColourMap(value: number, max: number, colorCount: number) {\n if (max <= 0 || value <= 0) {\n return 0;\n }\n\n const scaled = Math.pow(value / max, heatmapGamma);\n const index = Math.ceil(scaled * (colorCount - 1));\n\n return Math.min(Math.max(index, 0), colorCount - 1);\n}\n\nfunction formatShortDate(dateIso: string) {\n return new Date(`${dateIso}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction getCalendarGrid(startDate: Date, endDate: Date) {\n const allDays = getAllDays(startDate, endDate);\n const paddedDays = padToWeekStartMonday(allDays);\n const weeks = chunkByWeek(paddedDays);\n\n const monthLabels = weeks.map((week, i) => {\n const label = getMonthLabel(week);\n const prevLabel = i > 0 ? getMonthLabel(weeks[i - 1]) : null;\n\n return label !== prevLabel ? label : null;\n });\n\n return { weeks, monthLabels };\n}\n\nfunction getSectionLayout(weekCount: number) {\n const cellSize = 11;\n const gap = 2;\n const leftLabelWidth = 34;\n const rightPadding = 20;\n const headerCaptionY = 0;\n const headerValueY = headerCaptionY + metricCaptionFontSize + captionValueGap;\n const topMetricHeight = headerValueY + metricValueFontSize;\n const topPadding = Math.max(providerTitleFontSize, topMetricHeight) + 20;\n const monthHeaderHeight = 20;\n const titleY = 0;\n const monthLabelY = topPadding + 4;\n const gridTop = topPadding + monthHeaderHeight;\n const gridHeight = 7 * cellSize + 6 * gap;\n const gridWidth = weekCount * cellSize + Math.max(weekCount - 1, 0) * gap;\n const legendY = gridTop + gridHeight + 28;\n const legendBottomY = legendY + cellSize;\n const noteY = legendBottomY + 14;\n const footerTopPadding = 48;\n const footerCaptionY = legendBottomY + footerTopPadding;\n const footerValueY = footerCaptionY + metricCaptionFontSize + captionValueGap;\n const statsBottomPadding = 12;\n const width = leftLabelWidth + gridWidth + rightPadding;\n const height = footerValueY + metricValueFontSize + statsBottomPadding;\n\n return {\n width,\n height,\n gridTop,\n leftLabelWidth,\n cellSize,\n gap,\n headerCaptionY,\n headerValueY,\n titleY,\n monthLabelY,\n legendY,\n noteY,\n footerCaptionY,\n footerValueY,\n };\n}\n\nfunction drawHeatmapSection(\n svg: SVGBuilderInstance,\n {\n x,\n y,\n grid,\n layout,\n daily,\n insights,\n title,\n titleCaption,\n colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\n const legendColors = [emptyCellFill[colorMode], ...colorsForMode.slice(1)];\n const valueByDate = new Map<string, number>();\n const rightEdge = x + layout.width - 8;\n const leftColumnX = x + 8;\n let maxValue = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalTokens = 0;\n let firstActivityOnlyDate: string | null = null;\n let firstMeasuredDate: string | null = null;\n\n for (const row of daily) {\n const dateKey = formatLocalDate(row.date);\n const displayValue = row.displayValue ?? row.total;\n\n valueByDate.set(dateKey, displayValue);\n maxValue = Math.max(maxValue, displayValue);\n if (row.total <= 0 && displayValue > 0) {\n if (!firstActivityOnlyDate || dateKey < firstActivityOnlyDate) {\n firstActivityOnlyDate = dateKey;\n }\n } else if (\n row.total > 0 &&\n (!firstMeasuredDate || dateKey < firstMeasuredDate)\n ) {\n firstMeasuredDate = dateKey;\n }\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerInputX = rightEdge - topMetricGap * 2;\n const headerOutputX = rightEdge - topMetricGap;\n const totalTokensLabel = formatTokenTotal(totalTokens);\n const totalInputLabel = formatTokenTotal(totalInputTokens);\n const totalOutputLabel = formatTokenTotal(totalOutputTokens);\n const longestStreak = insights?.streaks.longest ?? 0;\n const currentStreak = insights?.streaks.current ?? 0;\n\n if (titleCaption) {\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(titleCaption),\n );\n\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n } else {\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.titleY,\n fill: palette.text,\n \"font-size\": providerTitleFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n }\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Input tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalInputLabel,\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Output tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalOutputLabel,\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Total tokens\"),\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalTokensLabel,\n );\n\n for (let i = 0; i < 7; i += 1) {\n const dayY =\n y +\n layout.gridTop +\n i * (layout.cellSize + layout.gap) +\n layout.cellSize / 2;\n\n const dayLabel = i === 0 || i === 6 ? daysOfWeekMonday[i] : \"\";\n\n svg = svg.text(\n {\n x: x + layout.leftLabelWidth - 6,\n y: dayY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": fontFamily,\n },\n dayLabel,\n );\n }\n\n for (let weekIndex = 0; weekIndex < grid.weeks.length; weekIndex += 1) {\n const monthLabel = grid.monthLabels[weekIndex];\n\n if (monthLabel) {\n const monthX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n\n svg = svg.text(\n {\n x: monthX,\n y: y + layout.monthLabelY,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-family\": fontFamily,\n },\n monthLabel,\n );\n }\n\n const week = grid.weeks[weekIndex];\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const day = week[dayIndex];\n\n if (!day) {\n continue;\n }\n\n const value = valueByDate.get(day) ?? 0;\n const colorIndex = defaultColourMap(\n value,\n maxValue,\n colorsForMode.length,\n );\n const fill =\n value <= 0 ? emptyCellFill[colorMode] : colorsForMode[colorIndex];\n const dayX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n const dayY =\n y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);\n const rectAttributes: Record<string, string | number> = {\n x: dayX,\n y: dayY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill,\n };\n\n svg = svg.rect(rectAttributes);\n }\n }\n\n const legendStartX = x + layout.leftLabelWidth;\n const legendY = y + layout.legendY;\n\n svg = svg.text(\n {\n x: legendStartX,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"Less\"),\n );\n\n for (let i = 0; i < legendColors.length; i += 1) {\n const legendX = legendStartX + 28 + i * (layout.cellSize + 3);\n\n svg = svg.rect({\n x: legendX,\n y: legendY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill: legendColors[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + legendColors.length * (layout.cellSize + 3) + 6,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"More\"),\n );\n\n if (firstActivityOnlyDate && firstMeasuredDate) {\n const noteX = x + layout.width / 2;\n const noteY = y + layout.gridTop + 7 * layout.cellSize + 6 * layout.gap + 8;\n\n svg = svg.text(\n {\n x: noteX,\n y: noteY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `Claude started logging full token telemetry on ${formatShortDate(firstMeasuredDate)}; earlier activity may be undercounted.`,\n );\n }\n\n const rightColumnX = rightEdge;\n const leftSecondaryX = leftColumnX + 250;\n const rightPrimaryX = rightColumnX - 160;\n\n const leftRows: ModelUsageRow[] = [];\n\n if (insights?.mostUsedModel) {\n leftRows.push({ caption: \"Most used model\", data: insights.mostUsedModel });\n }\n\n if (insights?.recentMostUsedModel) {\n leftRows.push({\n caption: \"Recent use (last 30 days)\",\n data: insights.recentMostUsedModel,\n });\n }\n\n for (const [index, row] of leftRows.entries()) {\n const captionY = layout.footerCaptionY;\n const valueY = layout.footerValueY;\n const modelName = truncateText(row.data.name, 20);\n const modelX = index === 0 ? leftColumnX : leftSecondaryX;\n const tokenLabel = `(${formatTokenTotal(row.data.tokens.total)})`;\n\n svg = svg.text(\n {\n x: modelX,\n y: y + captionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(row.caption),\n );\n\n svg = svg.text(\n {\n x: modelX,\n y: y + valueY,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `<tspan fill=\"${palette.text}\" font-size=\"${metricValueFontSize}\" font-weight=\"600\">${escapeXml(modelName)}</tspan><tspan dx=\"6\" fill=\"${palette.muted}\" font-size=\"${metricValueFontSize}\" font-weight=\"400\">${tokenLabel}</tspan>`,\n );\n }\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Longest streak\"),\n );\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(longestStreak)} days`,\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Current streak\"),\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(currentStreak)} days`,\n );\n\n return svg;\n}\n\nexport function renderUsageHeatmapsSvg({\n startDate,\n endDate,\n sections,\n colorMode,\n}: RenderUsageHeatmapsSvgOptions) {\n const grid = getCalendarGrid(startDate, endDate);\n const layout = getSectionLayout(grid.weeks.length);\n const palette = surfacePalettes[colorMode];\n const horizontalPadding = 18;\n const topPadding = 30;\n const bottomPadding = 18;\n const sectionGap = 40;\n\n const width = horizontalPadding * 2 + layout.width;\n const height =\n topPadding +\n bottomPadding +\n sections.length * layout.height +\n Math.max(sections.length - 1, 0) * sectionGap;\n\n let svg = svgBuilder\n .create()\n .width(width)\n .height(height)\n .viewBox(`0 0 ${width} ${height}`)\n .rect({\n x: -2,\n y: -2,\n width: width + 4,\n height: height + 4,\n fill: palette.background,\n });\n\n sections.forEach((section, index) => {\n const sectionY = topPadding + index * (layout.height + sectionGap);\n\n svg = drawHeatmapSection(svg, {\n x: horizontalPadding,\n y: sectionY,\n grid,\n layout,\n daily: section.daily,\n insights: section.insights,\n title: section.title,\n titleCaption: section.titleCaption,\n colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\n}\n","import type { ProviderId } from \"./lib/interfaces\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\n\ninterface ProviderSelectionValues {\n all: boolean;\n amp: boolean;\n claude: boolean;\n codex: boolean;\n cursor: boolean;\n gemini: boolean;\n opencode: boolean;\n pi: boolean;\n}\n\nconst outputProviderIds: ProviderId[] = [\n \"amp\",\n \"claude\",\n \"codex\",\n \"cursor\",\n \"gemini\",\n \"opencode\",\n \"pi\",\n];\n\nexport function getRequestedProvidersForOutput(\n values: ProviderSelectionValues,\n) {\n return outputProviderIds.filter((provider) => values[provider]);\n}\n\nexport function getDefaultOutputSuffix(values: ProviderSelectionValues) {\n if (values.all) {\n return \"_all\";\n }\n\n const requestedProviders = getRequestedProvidersForOutput(values);\n\n if (requestedProviders.length === 0) {\n return \"\";\n }\n\n return `_${requestedProviders.join(\"_\")}`;\n}\n\nexport function getDefaultOutputPath(\n values: ProviderSelectionValues,\n format: OutputFormat,\n) {\n return `./heatmap-last-year${getDefaultOutputSuffix(values)}.${format}`;\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n FILE_PROCESS_CONCURRENCY_ENV,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n mergeDailyTotalsByDate,\n mergeModelTotals,\n normalizeModelName,\n readJsonDocument,\n runWithConcurrency,\n} from \"./utils\";\n\nconst AMP_HOME_ENV = \"AMP_DATA_DIR\";\n\ninterface AmpMessageUsage {\n model?: string;\n inputTokens?: number;\n outputTokens?: number;\n cacheCreationInputTokens?: number;\n cacheReadInputTokens?: number;\n totalInputTokens?: number;\n}\n\ninterface AmpMessage {\n role?: string;\n usage?: AmpMessageUsage;\n meta?: { sentAt?: number };\n}\n\ninterface AmpThread {\n id?: string;\n created?: number;\n messages?: AmpMessage[];\n}\n\nfunction getAmpDataDir() {\n const envDir = process.env[AMP_HOME_ENV]?.trim();\n\n if (envDir) {\n return resolve(envDir);\n }\n\n const xdgDataHome =\n process.env.XDG_DATA_HOME?.trim() || join(homedir(), \".local\", \"share\");\n\n return join(xdgDataHome, \"amp\");\n}\n\nasync function getAmpFiles() {\n const dataDir = getAmpDataDir();\n\n return listFilesRecursive(join(dataDir, \"threads\"), \".json\");\n}\n\nexport function isAmpAvailable() {\n return existsSync(join(getAmpDataDir(), \"threads\"));\n}\n\nfunction createAmpTokenTotals(usage: AmpMessageUsage): DailyTokenTotals {\n const cacheReadInput = usage.cacheReadInputTokens ?? 0;\n const cacheCreationInput = usage.cacheCreationInputTokens ?? 0;\n const input = (usage.inputTokens ?? 0) + cacheReadInput;\n const output = (usage.outputTokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nasync function processAmpFile(\n filePath: string,\n start: Date,\n end: Date,\n): Promise<{\n totals: DailyTotalsByDate;\n modelTotals: Map<string, ModelTokenTotals>;\n recentModelTotals: Map<string, ModelTokenTotals>;\n}> {\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n let thread: AmpThread;\n\n try {\n thread = await readJsonDocument<AmpThread>(filePath);\n } catch {\n return { totals, modelTotals, recentModelTotals };\n }\n\n if (!thread.messages) {\n return { totals, modelTotals, recentModelTotals };\n }\n\n const threadDate = thread.created ? new Date(thread.created) : null;\n let lastUserTimestamp: Date | null = null;\n\n for (const message of thread.messages) {\n if (message.role === \"user\" && message.meta?.sentAt) {\n lastUserTimestamp = new Date(message.meta.sentAt);\n continue;\n }\n\n if (message.role !== \"assistant\" || !message.usage) {\n continue;\n }\n\n const date = lastUserTimestamp ?? threadDate;\n\n if (!date || date < start || date > end) {\n continue;\n }\n\n const tokenTotals = createAmpTokenTotals(message.usage);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const modelName = message.usage.model\n ? normalizeModelName(message.usage.model)\n : undefined;\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n\n if (!modelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n\n return { totals, modelTotals, recentModelTotals };\n}\n\nexport async function loadAmpRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const files = await getAmpFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const fileConcurrency = getPositiveIntegerEnv(\n FILE_PROCESS_CONCURRENCY_ENV,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n );\n\n const results = new Array<Awaited<ReturnType<typeof processAmpFile>>>(\n files.length,\n );\n\n await runWithConcurrency(files, fileConcurrency, async (file, index) => {\n results[index] = await processAmpFile(file, start, end);\n });\n\n for (const result of results) {\n mergeDailyTotalsByDate(totals, result.totals);\n mergeModelTotals(modelTotals, result.modelTotals);\n mergeModelTotals(recentModelTotals, result.recentModelTotals);\n }\n\n return createUsageSummary(\"amp\", totals, modelTotals, recentModelTotals, end);\n}\n","import { existsSync, readdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n FILE_PROCESS_CONCURRENCY_ENV,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n formatLocalDate,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonDocument,\n readJsonLines,\n runWithConcurrency,\n} from \"./utils\";\n\nconst CLAUDE_CONFIG_DIR_ENV = \"CLAUDE_CONFIG_DIR\";\nconst CLAUDE_PROJECTS_DIR_NAME = \"projects\";\nconst CLAUDE_STATS_CACHE_FILE_NAME = \"stats-cache.json\";\n\ninterface ClaudeUsagePayload {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface ClaudeRawLogEntry {\n timestamp?: string;\n requestId?: string;\n message?: {\n usage?: ClaudeUsagePayload;\n model?: string;\n id?: string;\n };\n}\n\ninterface ClaudeLogEntry {\n timestamp: string;\n usage: ClaudeUsagePayload;\n model?: string;\n messageId?: string;\n requestId?: string;\n}\n\ninterface ClaudeStatsCacheModelUsage {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n}\n\ninterface ClaudeStatsCacheEntry {\n date?: string;\n tokensByModel?: Record<string, number>;\n}\n\ninterface ClaudeStatsCache {\n dailyModelTokens?: ClaudeStatsCacheEntry[];\n modelUsage?: Record<string, ClaudeStatsCacheModelUsage>;\n}\n\ninterface ClaudeHistoryEntry {\n timestamp?: number | string;\n}\n\nfunction discoverClaudeWorkDirs() {\n const home = homedir();\n\n try {\n return readdirSync(home, { withFileTypes: true })\n .filter((entry) => {\n if (!entry.isDirectory() || !entry.name.startsWith(\".claude-\")) {\n return false;\n }\n\n const dir = join(home, entry.name);\n\n return (\n existsSync(join(dir, CLAUDE_PROJECTS_DIR_NAME)) ||\n existsSync(join(dir, CLAUDE_STATS_CACHE_FILE_NAME))\n );\n })\n .map((entry) => join(home, entry.name));\n } catch {\n return [];\n }\n}\n\nfunction getClaudeConfigPaths() {\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n const defaults = [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\n\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n const envResolved =\n envPaths === \"\"\n ? []\n : envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n\n const seen = new Set(envResolved);\n const paths = [...envResolved];\n\n for (const path of [...defaults, ...discoverClaudeWorkDirs()]) {\n if (!seen.has(path)) {\n seen.add(path);\n paths.push(path);\n }\n }\n\n return paths;\n}\n\nfunction getClaudeProjectDirs() {\n const unique = new Set<string>();\n const dirs: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const projectsDir = join(basePath, CLAUDE_PROJECTS_DIR_NAME);\n\n if (existsSync(projectsDir) && !unique.has(projectsDir)) {\n unique.add(projectsDir);\n dirs.push(projectsDir);\n }\n }\n\n return dirs;\n}\n\nfunction getClaudeStatsCacheFiles() {\n const unique = new Set<string>();\n const files: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const statsCacheFile = join(basePath, CLAUDE_STATS_CACHE_FILE_NAME);\n\n if (existsSync(statsCacheFile) && !unique.has(statsCacheFile)) {\n unique.add(statsCacheFile);\n files.push(statsCacheFile);\n }\n }\n\n return files;\n}\n\nfunction parseClaudeLogEntry(entry: ClaudeRawLogEntry): ClaudeLogEntry | null {\n if (!entry.timestamp || !entry.message?.usage) {\n return null;\n }\n\n return {\n timestamp: entry.timestamp,\n usage: entry.message.usage,\n model: entry.message.model,\n messageId: entry.message.id,\n requestId: entry.requestId,\n };\n}\n\nfunction createClaudeTokenTotals(usage: ClaudeUsagePayload): DailyTokenTotals {\n const cacheReadInput = usage.cache_read_input_tokens ?? 0;\n const cacheCreationInput = usage.cache_creation_input_tokens ?? 0;\n const input = (usage.input_tokens ?? 0) + cacheReadInput;\n const output = (usage.output_tokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nfunction distributeTokenComponents(total: number, weights: number[]) {\n const weightSum = weights.reduce((sum, value) => sum + value, 0);\n\n if (total <= 0 || weightSum <= 0) {\n return weights.map(() => 0);\n }\n\n const exact = weights.map((weight) => (weight / weightSum) * total);\n const allocated = exact.map((value) => Math.floor(value));\n let remainder = total - allocated.reduce((sum, value) => sum + value, 0);\n const order = exact\n .map((value, index) => ({\n index,\n fraction: value - allocated[index],\n weight: weights[index],\n }))\n .sort((left, right) => {\n if (right.fraction !== left.fraction) {\n return right.fraction - left.fraction;\n }\n\n return right.weight - left.weight;\n });\n\n for (const { index } of order) {\n if (remainder <= 0) {\n break;\n }\n\n allocated[index] += 1;\n remainder -= 1;\n }\n\n return allocated;\n}\n\nfunction createStatsCacheTokenTotals(\n totalTokens: number,\n usage?: ClaudeStatsCacheModelUsage,\n): DailyTokenTotals {\n if (totalTokens <= 0) {\n return {\n input: 0,\n output: 0,\n cache: { input: 0, output: 0 },\n total: 0,\n };\n }\n\n const inputTokens = usage?.inputTokens ?? 0;\n const outputTokens = usage?.outputTokens ?? 0;\n const cacheReadInputTokens = usage?.cacheReadInputTokens ?? 0;\n const cacheCreationInputTokens = usage?.cacheCreationInputTokens ?? 0;\n const [scaledInput, scaledOutput, scaledCacheRead, scaledCacheCreation] =\n distributeTokenComponents(totalTokens, [\n inputTokens,\n outputTokens,\n cacheReadInputTokens,\n cacheCreationInputTokens,\n ]);\n\n // Older Claude installs only keep daily totals in stats-cache.json, so\n // reconstruct the input/output/cache split from the cached model totals.\n if (\n scaledInput === 0 &&\n scaledOutput === 0 &&\n scaledCacheRead === 0 &&\n scaledCacheCreation === 0\n ) {\n return {\n input: totalTokens,\n output: 0,\n cache: { input: 0, output: 0 },\n total: totalTokens,\n };\n }\n\n return {\n input: scaledInput + scaledCacheRead,\n output: scaledOutput + scaledCacheCreation,\n cache: { input: scaledCacheRead, output: scaledCacheCreation },\n total: totalTokens,\n };\n}\n\nasync function getClaudeFiles() {\n const projectDirs = getClaudeProjectDirs();\n const files = (\n await Promise.all(\n projectDirs.map((projectDir) => listFilesRecursive(projectDir, \".jsonl\")),\n )\n ).flat();\n\n return files;\n}\n\nfunction getClaudeHistoryFiles() {\n const unique = new Set<string>();\n const files: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const historyFile = join(basePath, \"history.jsonl\");\n\n if (existsSync(historyFile) && !unique.has(historyFile)) {\n unique.add(historyFile);\n files.push(historyFile);\n }\n }\n\n return files;\n}\n\nexport function isClaudeAvailable() {\n return (\n getClaudeProjectDirs().length > 0 ||\n getClaudeStatsCacheFiles().length > 0 ||\n getClaudeHistoryFiles().length > 0\n );\n}\n\nasync function loadClaudeStatsCacheRows(\n startDate: Date,\n endDate: Date,\n coveredDates: Set<string>,\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n recentStart: Date,\n) {\n const statsCacheFiles = getClaudeStatsCacheFiles();\n\n for (const file of statsCacheFiles) {\n let statsCache: ClaudeStatsCache;\n\n try {\n statsCache = await readJsonDocument<ClaudeStatsCache>(file);\n } catch {\n continue;\n }\n\n for (const row of statsCache.dailyModelTokens ?? []) {\n if (!row.date || coveredDates.has(row.date)) {\n continue;\n }\n\n const timestamp = new Date(`${row.date}T00:00:00`);\n\n if (\n Number.isNaN(timestamp.getTime()) ||\n timestamp < startDate ||\n timestamp > endDate\n ) {\n continue;\n }\n\n for (const [rawModelName, totalTokens] of Object.entries(\n row.tokensByModel ?? {},\n )) {\n if (!Number.isFinite(totalTokens) || totalTokens <= 0) {\n continue;\n }\n\n const modelName = normalizeModelName(rawModelName);\n const tokenTotals = createStatsCacheTokenTotals(\n totalTokens,\n statsCache.modelUsage?.[rawModelName],\n );\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n }\n }\n}\n\nasync function loadClaudeHistoryDisplayValues(\n startDate: Date,\n endDate: Date,\n coveredDates: Set<string>,\n displayValuesByDate: Map<string, number>,\n) {\n const historyFiles = getClaudeHistoryFiles();\n\n for (const file of historyFiles) {\n for await (const line of readJsonLines<ClaudeHistoryEntry>(file)) {\n const rawTimestamp = line.timestamp;\n const timestamp =\n typeof rawTimestamp === \"number\"\n ? new Date(rawTimestamp)\n : typeof rawTimestamp === \"string\"\n ? new Date(rawTimestamp)\n : null;\n\n if (!timestamp || Number.isNaN(timestamp.getTime())) {\n continue;\n }\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const dateKey = formatLocalDate(timestamp);\n\n if (coveredDates.has(dateKey)) {\n continue;\n }\n\n displayValuesByDate.set(dateKey, (displayValuesByDate.get(dateKey) ?? 0) + 1);\n }\n }\n}\n\nfunction createUniqueHash(messageId?: string, requestId?: string) {\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function loadClaudeRows(\n startDate: Date,\n endDate: Date,\n): Promise<UsageSummary> {\n const files = await getClaudeFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const displayValuesByDate = new Map<string, number>();\n const recentStart = getRecentWindowStart(endDate, 30);\n const processedHashes = new Set<string>();\n const fileConcurrency = getPositiveIntegerEnv(\n FILE_PROCESS_CONCURRENCY_ENV,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n );\n\n await runWithConcurrency(files, fileConcurrency, async (file) => {\n for await (const line of readJsonLines<ClaudeRawLogEntry>(file)) {\n const entry = parseClaudeLogEntry(line);\n\n if (!entry) {\n continue;\n }\n\n const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);\n\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n continue;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n const timestamp = new Date(entry.timestamp);\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const tokenTotals = createClaudeTokenTotals(entry.usage);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const modelName =\n entry.model && entry.model !== \"<synthetic>\"\n ? normalizeModelName(entry.model)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n\n if (!modelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n });\n\n await loadClaudeStatsCacheRows(\n startDate,\n endDate,\n new Set(totals.keys()),\n totals,\n modelTotals,\n recentModelTotals,\n recentStart,\n );\n\n await loadClaudeHistoryDisplayValues(\n startDate,\n endDate,\n new Set(totals.keys()),\n displayValuesByDate,\n );\n\n return createUsageSummary(\n \"claude\",\n totals,\n modelTotals,\n recentModelTotals,\n endDate,\n displayValuesByDate,\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n FILE_PROCESS_CONCURRENCY_ENV,\n MAX_JSONL_RECORD_BYTES_ENV,\n type JsonlRecordDecision,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n mergeDailyTotalsByDate,\n mergeModelTotals,\n normalizeModelName,\n readJsonlRecords,\n runWithConcurrency,\n} from \"./utils\";\nconst CLASSIFICATION_PREFIX_BYTES = 32 * 1024;\n\ninterface CodexRawUsage {\n input_tokens?: number;\n cached_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n reasoning_output_tokens?: number;\n total_tokens?: number;\n}\n\ninterface CodexEventInfo {\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n last_token_usage?: CodexRawUsage;\n total_token_usage?: CodexRawUsage;\n}\n\ninterface CodexEventPayload {\n type?: string;\n info?: CodexEventInfo;\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n}\n\ninterface CodexEventEntry {\n type?: string;\n timestamp: string;\n payload?: CodexEventPayload;\n}\n\ninterface CodexNormalizedUsage {\n input_tokens: number;\n cached_input_tokens: number;\n output_tokens: number;\n reasoning_output_tokens: number;\n total_tokens: number;\n}\n\ninterface CodexFileProcessingResult {\n totals: DailyTotalsByDate;\n modelTotals: Map<string, ModelTokenTotals>;\n recentModelTotals: Map<string, ModelTokenTotals>;\n skippedOversizedIrrelevantRecords: number;\n}\n\ntype JsonContext =\n | {\n kind: \"array\";\n expecting: \"valueOrEnd\" | \"commaOrEnd\";\n }\n | {\n kind: \"object\";\n expecting: \"keyOrEnd\" | \"colon\" | \"value\" | \"commaOrEnd\";\n key?: string;\n isPayloadObject: boolean;\n };\n\nfunction normalizeCodexUsage(value?: CodexRawUsage) {\n if (!value) {\n return null;\n }\n\n const input = value.input_tokens ?? 0;\n const cached =\n value.cached_input_tokens ?? value.cache_read_input_tokens ?? 0;\n const output = value.output_tokens ?? 0;\n const reasoning = value.reasoning_output_tokens ?? 0;\n const total = value.total_tokens ?? 0;\n\n return {\n input_tokens: input,\n cached_input_tokens: cached,\n output_tokens: output,\n reasoning_output_tokens: reasoning,\n total_tokens: total > 0 ? total : input + output,\n };\n}\n\nfunction addCodexUsage(\n base: CodexNormalizedUsage | null,\n delta: CodexNormalizedUsage,\n): CodexNormalizedUsage {\n return {\n input_tokens: (base?.input_tokens ?? 0) + delta.input_tokens,\n cached_input_tokens:\n (base?.cached_input_tokens ?? 0) + delta.cached_input_tokens,\n output_tokens: (base?.output_tokens ?? 0) + delta.output_tokens,\n reasoning_output_tokens:\n (base?.reasoning_output_tokens ?? 0) + delta.reasoning_output_tokens,\n total_tokens: (base?.total_tokens ?? 0) + delta.total_tokens,\n };\n}\n\nfunction subtractCodexUsage(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n return {\n input_tokens: Math.max(\n current.input_tokens - (previous?.input_tokens ?? 0),\n 0,\n ),\n cached_input_tokens: Math.max(\n current.cached_input_tokens - (previous?.cached_input_tokens ?? 0),\n 0,\n ),\n output_tokens: Math.max(\n current.output_tokens - (previous?.output_tokens ?? 0),\n 0,\n ),\n reasoning_output_tokens: Math.max(\n current.reasoning_output_tokens -\n (previous?.reasoning_output_tokens ?? 0),\n 0,\n ),\n total_tokens: Math.max(\n current.total_tokens - (previous?.total_tokens ?? 0),\n 0,\n ),\n };\n}\n\nfunction didCodexTotalsRollback(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n if (!previous) {\n return false;\n }\n\n return (\n current.input_tokens < previous.input_tokens ||\n current.cached_input_tokens < previous.cached_input_tokens ||\n current.output_tokens < previous.output_tokens ||\n current.reasoning_output_tokens < previous.reasoning_output_tokens ||\n current.total_tokens < previous.total_tokens\n );\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction extractCodexModel(payload?: CodexEventPayload) {\n const directModel =\n asNonEmptyString(payload?.model) ?? asNonEmptyString(payload?.model_name);\n\n if (directModel) {\n return directModel;\n }\n\n if (payload?.info) {\n const infoModel =\n asNonEmptyString(payload.info.model) ??\n asNonEmptyString(payload.info.model_name);\n\n if (infoModel) {\n return infoModel;\n }\n\n if (payload.info.metadata) {\n const model = asNonEmptyString(payload.info.metadata.model);\n\n if (model) {\n return model;\n }\n }\n }\n\n if (payload?.metadata) {\n return asNonEmptyString(payload.metadata.model);\n }\n\n return undefined;\n}\n\nfunction getCodexHome() {\n return process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n}\n\nasync function getCodexFiles() {\n const codexHome = getCodexHome();\n\n return listFilesRecursive(join(codexHome, \"sessions\"), \".jsonl\");\n}\n\nexport function isCodexAvailable() {\n return existsSync(join(getCodexHome(), \"sessions\"));\n}\n\nfunction readJsonString(source: string, start: number) {\n if (source[start] !== '\"') {\n return null;\n }\n\n let value = \"\";\n let escaped = false;\n\n for (let index = start + 1; index < source.length; index += 1) {\n const char = source[index];\n\n if (escaped) {\n value += char;\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n return { value, nextIndex: index + 1 };\n }\n\n value += char;\n }\n\n return null;\n}\n\nfunction skipWhitespace(source: string, start: number) {\n let index = start;\n\n while (index < source.length && /\\s/.test(source[index])) {\n index += 1;\n }\n\n return index;\n}\n\nfunction skipPrimitive(source: string, start: number) {\n let index = start;\n\n while (index < source.length) {\n const char = source[index];\n\n if (char === \",\" || char === \"}\" || char === \"]\" || /\\s/.test(char)) {\n return index;\n }\n\n index += 1;\n }\n\n return source.length;\n}\n\nfunction classifyCodexRecord(\n source: string,\n): JsonlRecordDecision<\"turn_context\" | \"token_count\"> {\n const stack: JsonContext[] = [];\n let topLevelType: string | undefined;\n\n for (let index = 0; index < source.length; ) {\n index = skipWhitespace(source, index);\n\n if (index >= source.length) {\n break;\n }\n\n const char = source[index];\n\n if (stack.length === 0) {\n if (char !== \"{\") {\n return { kind: \"unknown\" };\n }\n\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: false,\n });\n index += 1;\n continue;\n }\n\n const context = stack[stack.length - 1]!;\n\n if (context.kind === \"object\") {\n if (context.expecting === \"keyOrEnd\") {\n if (char === \"}\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n const key = readJsonString(source, index);\n\n if (!key) {\n return { kind: \"unknown\" };\n }\n\n context.key = key.value;\n context.expecting = \"colon\";\n index = key.nextIndex;\n continue;\n }\n\n if (context.expecting === \"colon\") {\n if (char !== \":\") {\n return { kind: \"unknown\" };\n }\n\n context.expecting = \"value\";\n index += 1;\n continue;\n }\n\n if (context.expecting === \"value\") {\n if (char === \"{\") {\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: stack.length === 1 && context.key === \"payload\",\n });\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index += 1;\n continue;\n }\n\n if (char === \"[\") {\n stack.push({ kind: \"array\", expecting: \"valueOrEnd\" });\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n const value = readJsonString(source, index);\n\n if (!value) {\n return { kind: \"unknown\" };\n }\n\n if (stack.length === 1 && context.key === \"type\") {\n topLevelType = value.value;\n\n if (value.value === \"turn_context\") {\n return { kind: \"keep\", classification: \"turn_context\" };\n }\n\n if (value.value !== \"event_msg\") {\n return { kind: \"skip\" };\n }\n }\n\n if (context.isPayloadObject && context.key === \"type\") {\n if (value.value === \"token_count\") {\n return topLevelType === \"event_msg\"\n ? { kind: \"keep\", classification: \"token_count\" }\n : { kind: \"unknown\" };\n }\n\n return topLevelType === \"event_msg\"\n ? { kind: \"skip\" }\n : { kind: \"unknown\" };\n }\n\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index = value.nextIndex;\n continue;\n }\n\n context.expecting = \"commaOrEnd\";\n context.key = undefined;\n index = skipPrimitive(source, index);\n continue;\n }\n\n {\n if (char === \",\") {\n context.expecting = \"keyOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n return { kind: \"unknown\" };\n }\n\n continue;\n }\n\n if (context.expecting === \"valueOrEnd\") {\n if (char === \"]\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n if (char === \"{\") {\n stack.push({\n kind: \"object\",\n expecting: \"keyOrEnd\",\n isPayloadObject: false,\n });\n context.expecting = \"commaOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"[\") {\n stack.push({ kind: \"array\", expecting: \"valueOrEnd\" });\n context.expecting = \"commaOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === '\"') {\n const value = readJsonString(source, index);\n\n if (!value) {\n return { kind: \"unknown\" };\n }\n\n context.expecting = \"commaOrEnd\";\n index = value.nextIndex;\n continue;\n }\n\n context.expecting = \"commaOrEnd\";\n index = skipPrimitive(source, index);\n continue;\n }\n\n if (char === \",\") {\n context.expecting = \"valueOrEnd\";\n index += 1;\n continue;\n }\n\n if (char === \"]\") {\n stack.pop();\n index += 1;\n continue;\n }\n\n return { kind: \"unknown\" };\n }\n\n if (topLevelType && topLevelType !== \"event_msg\") {\n return { kind: \"skip\" };\n }\n\n return { kind: \"unknown\" };\n}\n\nasync function processCodexFile(\n filePath: string,\n start: Date,\n end: Date,\n maxRecordBytes: number,\n): Promise<CodexFileProcessingResult> {\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n let previousTotals: CodexNormalizedUsage | null = null;\n let currentModel: string | undefined;\n\n let skippedOversizedIrrelevantRecords = 0;\n\n for await (const record of readJsonlRecords<\"turn_context\" | \"token_count\">(\n filePath,\n {\n classificationPrefixBytes: CLASSIFICATION_PREFIX_BYTES,\n classify: classifyCodexRecord,\n maxRecordBytes,\n onSkippedOversizedRecord: () => {\n skippedOversizedIrrelevantRecords += 1;\n },\n oversizedErrorMessage: ({ filePath, lineNumber, maxRecordBytes }) =>\n `Relevant Codex record exceeds ${maxRecordBytes} bytes in ${filePath}:${lineNumber}. Increase ${MAX_JSONL_RECORD_BYTES_ENV} to process this file.`,\n },\n )) {\n let entry: CodexEventEntry;\n\n try {\n entry = JSON.parse(record.rawLine) as CodexEventEntry;\n } catch {\n continue;\n }\n\n const extractedModel = extractCodexModel(entry.payload);\n\n if (record.classification === \"turn_context\") {\n currentModel = extractedModel ?? currentModel;\n continue;\n }\n\n const info = entry.payload?.info;\n const lastUsage = normalizeCodexUsage(info?.last_token_usage);\n const totalUsage = normalizeCodexUsage(info?.total_token_usage);\n let rawUsage: CodexNormalizedUsage | null = null;\n\n if (totalUsage) {\n rawUsage = didCodexTotalsRollback(totalUsage, previousTotals)\n ? (lastUsage ?? totalUsage)\n : subtractCodexUsage(totalUsage, previousTotals);\n previousTotals = totalUsage;\n } else {\n rawUsage = lastUsage;\n\n if (rawUsage) {\n previousTotals = addCodexUsage(previousTotals, rawUsage);\n }\n }\n\n if (!rawUsage) {\n continue;\n }\n\n const usage: DailyTokenTotals = {\n input: rawUsage.input_tokens,\n output: rawUsage.output_tokens,\n cache: { input: rawUsage.cached_input_tokens, output: 0 },\n total: rawUsage.total_tokens,\n };\n\n if (usage.total <= 0) {\n continue;\n }\n\n const date = new Date(entry.timestamp);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = extractedModel ?? currentModel;\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, date, usage, normalizedModelName);\n\n if (!normalizedModelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, normalizedModelName, usage);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, normalizedModelName, usage);\n }\n }\n\n return {\n totals,\n modelTotals,\n recentModelTotals,\n skippedOversizedIrrelevantRecords,\n };\n}\n\nexport async function loadCodexRows(\n start: Date,\n end: Date,\n warnings: string[] = [],\n): Promise<UsageSummary> {\n const files = await getCodexFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const maxRecordBytes = getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n const fileConcurrency = getPositiveIntegerEnv(\n FILE_PROCESS_CONCURRENCY_ENV,\n DEFAULT_FILE_PROCESS_CONCURRENCY,\n );\n const results = new Array<CodexFileProcessingResult>(files.length);\n\n await runWithConcurrency(files, fileConcurrency, async (file, index) => {\n results[index] = await processCodexFile(file, start, end, maxRecordBytes);\n });\n\n let skippedOversizedIrrelevantRecords = 0;\n let skippedFiles = 0;\n\n for (const result of results) {\n mergeDailyTotalsByDate(totals, result.totals);\n mergeModelTotals(modelTotals, result.modelTotals);\n mergeModelTotals(recentModelTotals, result.recentModelTotals);\n\n if (result.skippedOversizedIrrelevantRecords > 0) {\n skippedOversizedIrrelevantRecords +=\n result.skippedOversizedIrrelevantRecords;\n skippedFiles += 1;\n }\n }\n\n if (skippedOversizedIrrelevantRecords > 0) {\n warnings.push(\n `Skipped ${skippedOversizedIrrelevantRecords} oversized irrelevant Codex record(s) across ${skippedFiles} file(s); usage totals exclude those records. Relevant oversized records fail the file. Override ${MAX_JSONL_RECORD_BYTES_ENV} to raise the cap.`,\n );\n }\n\n return createUsageSummary(\n \"codex\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { copyFile, mkdtemp, rm } from \"node:fs/promises\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport Database from \"better-sqlite3\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n normalizeModelName,\n} from \"./utils\";\n\nconst CURSOR_CONFIG_DIR_ENV = \"CURSOR_CONFIG_DIR\";\nconst CURSOR_STATE_DB_PATH_ENV = \"CURSOR_STATE_DB_PATH\";\nconst CURSOR_WEB_BASE_URL_ENV = \"CURSOR_WEB_BASE_URL\";\nconst CURSOR_STATE_DB_RELATIVE_PATH = join(\n \"User\",\n \"globalStorage\",\n \"state.vscdb\",\n);\nconst CURSOR_SESSION_COOKIE_NAME = \"WorkosCursorSessionToken\";\n\ninterface CursorAuthState {\n accessToken?: string;\n refreshToken?: string;\n}\n\ninterface CursorCsvRow {\n Date?: string;\n Model?: string;\n Tokens?: string;\n \"Input (w/ Cache Write)\"?: string;\n \"Input (w/o Cache Write)\"?: string;\n \"Cache Read\"?: string;\n \"Output Tokens\"?: string;\n \"Total Tokens\"?: string;\n}\n\ninterface CursorFetchAttempt {\n label: string;\n headers: Record<string, string>;\n}\n\ninterface CursorFetchFailure {\n label: string;\n status: number;\n statusText: string;\n body: string;\n}\n\nfunction getCursorDefaultStateDbPath() {\n if (process.platform === \"darwin\") {\n return join(\n homedir(),\n \"Library\",\n \"Application Support\",\n \"Cursor\",\n CURSOR_STATE_DB_RELATIVE_PATH,\n );\n }\n\n if (process.platform === \"win32\") {\n const appData =\n process.env.APPDATA?.trim() || join(homedir(), \"AppData\", \"Roaming\");\n\n return join(appData, \"Cursor\", CURSOR_STATE_DB_RELATIVE_PATH);\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return join(xdgConfigHome, \"Cursor\", CURSOR_STATE_DB_RELATIVE_PATH);\n}\n\nfunction getCursorStateDbCandidates() {\n const explicitDbPath = process.env[CURSOR_STATE_DB_PATH_ENV]?.trim();\n\n if (explicitDbPath) {\n return [resolve(explicitDbPath)];\n }\n\n const configuredDirs = process.env[CURSOR_CONFIG_DIR_ENV]?.trim();\n\n if (!configuredDirs) {\n return [getCursorDefaultStateDbPath()];\n }\n\n return configuredDirs\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value !== \"\")\n .map((value) => {\n const resolved = resolve(value);\n\n return resolved.endsWith(\".vscdb\")\n ? resolved\n : join(resolved, CURSOR_STATE_DB_RELATIVE_PATH);\n });\n}\n\nfunction getCursorStateDbPath() {\n const seen = new Set<string>();\n\n for (const candidate of getCursorStateDbCandidates()) {\n if (!seen.has(candidate) && existsSync(candidate)) {\n return candidate;\n }\n\n seen.add(candidate);\n }\n\n return null;\n}\n\nfunction normalizeCursorDbValue(value: unknown) {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n }\n\n if (Buffer.isBuffer(value)) {\n const trimmed = value.toString(\"utf8\").trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n }\n\n return undefined;\n}\n\nfunction readCursorAuthStateFromDatabase(databasePath: string) {\n const database = new Database(databasePath, {\n readonly: true,\n fileMustExist: true,\n });\n\n try {\n const query = database.prepare(\n \"SELECT value FROM ItemTable WHERE key = ? LIMIT 1\",\n );\n const accessRow = query.get(\"cursorAuth/accessToken\") as\n | { value?: unknown }\n | undefined;\n const refreshRow = query.get(\"cursorAuth/refreshToken\") as\n | { value?: unknown }\n | undefined;\n\n return {\n accessToken: normalizeCursorDbValue(accessRow?.value),\n refreshToken: normalizeCursorDbValue(refreshRow?.value),\n } satisfies CursorAuthState;\n } finally {\n database.close();\n }\n}\n\nfunction isSqliteLockedError(error: unknown) {\n return error instanceof Error && /database is locked/i.test(error.message);\n}\n\nasync function withCursorStateSnapshot<T>(\n databasePath: string,\n callback: (snapshotPath: string) => Promise<T>,\n) {\n const snapshotDir = await mkdtemp(join(tmpdir(), \"tokely-cursor-\"));\n const snapshotPath = join(snapshotDir, \"state.vscdb\");\n\n await copyFile(databasePath, snapshotPath);\n\n for (const suffix of [\"-shm\", \"-wal\"]) {\n const companionPath = `${databasePath}${suffix}`;\n\n if (!existsSync(companionPath)) {\n continue;\n }\n\n await copyFile(companionPath, `${snapshotPath}${suffix}`);\n }\n\n try {\n return await callback(snapshotPath);\n } finally {\n await rm(snapshotDir, { recursive: true, force: true });\n }\n}\n\nasync function readCursorAuthState(databasePath: string) {\n try {\n return readCursorAuthStateFromDatabase(databasePath);\n } catch (error) {\n if (!isSqliteLockedError(error)) {\n throw error;\n }\n\n return withCursorStateSnapshot(databasePath, async (snapshotPath) =>\n readCursorAuthStateFromDatabase(snapshotPath),\n );\n }\n}\n\nexport async function isCursorAvailable() {\n const databasePath = getCursorStateDbPath();\n\n if (!databasePath) {\n return false;\n }\n\n const authState = await readCursorAuthState(databasePath);\n\n return Boolean(authState.accessToken);\n}\n\nfunction decodeJwtPayload(token: string) {\n const encodedPayload = token.split(\".\")[1];\n\n if (!encodedPayload) {\n return null;\n }\n\n const base64 = encodedPayload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\");\n\n try {\n return JSON.parse(Buffer.from(padded, \"base64\").toString(\"utf8\")) as {\n sub?: string;\n };\n } catch {\n return null;\n }\n}\n\nfunction getCursorWebBaseUrl() {\n return (\n process.env[CURSOR_WEB_BASE_URL_ENV]?.trim() || \"https://cursor.com\"\n ).replace(/\\/+$/, \"\");\n}\n\nfunction buildCookieHeaderValue(cookieValue: string) {\n return `${CURSOR_SESSION_COOKIE_NAME}=${cookieValue}`;\n}\n\nfunction getCursorFetchAttempts(accessToken: string) {\n const attempts: CursorFetchAttempt[] = [];\n const seen = new Set<string>();\n const subject = decodeJwtPayload(accessToken)?.sub?.trim();\n const cookieValues = [accessToken];\n\n if (subject) {\n cookieValues.push(`${subject}::${accessToken}`);\n }\n\n const pushAttempt = (label: string, headers: Record<string, string>) => {\n const signature = JSON.stringify({\n label,\n headers: Object.entries(headers).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n });\n\n if (seen.has(signature)) {\n return;\n }\n\n seen.add(signature);\n attempts.push({ label, headers });\n };\n\n pushAttempt(\"bearer\", {\n Authorization: `Bearer ${accessToken}`,\n });\n\n for (const cookieValue of cookieValues) {\n pushAttempt(\"cookie\", {\n Cookie: buildCookieHeaderValue(cookieValue),\n });\n pushAttempt(\"cookie-encoded\", {\n Cookie: buildCookieHeaderValue(encodeURIComponent(cookieValue)),\n });\n pushAttempt(\"bearer+cookie\", {\n Authorization: `Bearer ${accessToken}`,\n Cookie: buildCookieHeaderValue(cookieValue),\n });\n pushAttempt(\"bearer+cookie-encoded\", {\n Authorization: `Bearer ${accessToken}`,\n Cookie: buildCookieHeaderValue(encodeURIComponent(cookieValue)),\n });\n }\n\n return attempts;\n}\n\nasync function fetchCursorUsageCsv(accessToken: string) {\n const url = new URL(\n \"/api/dashboard/export-usage-events-csv?strategy=tokens\",\n getCursorWebBaseUrl(),\n );\n const failures: CursorFetchFailure[] = [];\n\n for (const attempt of getCursorFetchAttempts(accessToken)) {\n const response = await fetch(url, {\n headers: {\n Accept: \"text/csv,text/plain;q=0.9,*/*;q=0.8\",\n ...attempt.headers,\n },\n });\n\n if (response.ok) {\n return response;\n }\n\n failures.push({\n label: attempt.label,\n status: response.status,\n statusText: response.statusText,\n body: (await response.text()).trim().slice(0, 200),\n });\n }\n\n const summary = failures\n .map((failure) => {\n const statusLine =\n `${failure.label}: ${failure.status} ${failure.statusText}`.trim();\n\n return failure.body ? `${statusLine} (${failure.body})` : statusLine;\n })\n .join(\"; \");\n\n throw new Error(\n `Failed to authenticate Cursor usage export with local auth state from ${url.origin}. ${summary}`,\n );\n}\n\nfunction parseCsvLine(line: string) {\n const values: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let index = 0; index < line.length; index += 1) {\n const char = line[index];\n\n if (char === '\"') {\n if (inQuotes && line[index + 1] === '\"') {\n current += '\"';\n index += 1;\n continue;\n }\n\n inQuotes = !inQuotes;\n continue;\n }\n\n if (char === \",\" && !inQuotes) {\n values.push(current);\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n values.push(current);\n\n return values;\n}\n\nfunction createCursorCsvRow(headers: string[], values: string[]) {\n const row: CursorCsvRow = {};\n\n headers.forEach((header, index) => {\n row[header as keyof CursorCsvRow] = values[index];\n });\n\n return row;\n}\n\nfunction processCursorCsvLines(\n lines: Iterable<string>,\n onRow: (row: CursorCsvRow) => void,\n) {\n let headers: string[] | null = null;\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n\n if (line === \"\") {\n continue;\n }\n\n const values = parseCsvLine(line);\n\n if (!headers) {\n headers = values;\n continue;\n }\n\n onRow(createCursorCsvRow(headers, values));\n }\n}\n\nfunction processCursorUsageCsvText(\n content: string,\n onRow: (row: CursorCsvRow) => void,\n) {\n processCursorCsvLines(content.split(/\\r?\\n/), onRow);\n}\n\nasync function processCursorUsageCsvStream(\n response: Response,\n onRow: (row: CursorCsvRow) => void,\n) {\n if (!response.body) {\n processCursorUsageCsvText(await response.text(), onRow);\n\n return;\n }\n\n let headers: string[] | null = null;\n const state = {\n currentField: \"\",\n currentRow: [] as string[],\n inQuotes: false,\n pendingQuote: false,\n sawCarriageReturn: false,\n };\n const decoder = new TextDecoder();\n\n const emitField = () => {\n state.currentRow.push(state.currentField);\n state.currentField = \"\";\n };\n\n const emitRow = () => {\n emitField();\n\n if (state.currentRow.every((value) => value.trim() === \"\")) {\n state.currentRow = [];\n\n return;\n }\n\n if (!headers) {\n headers = state.currentRow;\n state.currentRow = [];\n\n return;\n }\n\n onRow(createCursorCsvRow(headers, state.currentRow));\n state.currentRow = [];\n };\n\n const processChunk = (chunk: string) => {\n for (const char of chunk) {\n for (;;) {\n if (state.sawCarriageReturn) {\n state.sawCarriageReturn = false;\n\n if (char === \"\\n\") {\n break;\n }\n }\n\n if (state.pendingQuote) {\n state.pendingQuote = false;\n\n if (char === '\"') {\n state.currentField += '\"';\n break;\n }\n\n state.inQuotes = false;\n continue;\n }\n\n if (state.inQuotes) {\n if (char === '\"') {\n state.pendingQuote = true;\n } else {\n state.currentField += char;\n }\n\n break;\n }\n\n if (char === '\"') {\n state.inQuotes = true;\n break;\n }\n\n if (char === \",\") {\n emitField();\n break;\n }\n\n if (char === \"\\n\") {\n emitRow();\n break;\n }\n\n if (char === \"\\r\") {\n emitRow();\n state.sawCarriageReturn = true;\n break;\n }\n\n state.currentField += char;\n break;\n }\n }\n };\n\n const reader = response.body.getReader();\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n processChunk(decoder.decode(value, { stream: true }));\n }\n } finally {\n reader.releaseLock();\n }\n\n processChunk(decoder.decode());\n\n if (state.pendingQuote) {\n state.inQuotes = false;\n }\n\n if (state.currentField !== \"\" || state.currentRow.length > 0) {\n emitRow();\n }\n}\n\nfunction addCursorUsageRow(\n row: CursorCsvRow,\n start: Date,\n end: Date,\n recentStart: Date,\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n) {\n const date = parseCursorDate(row.Date);\n const rawModel = row.Model?.trim();\n const tokenTotals = createCursorTokenTotals(row);\n\n if (!date || !rawModel || !tokenTotals) {\n return;\n }\n\n if (date < start || date > end) {\n return;\n }\n\n const modelName = normalizeModelName(rawModel);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n}\n\nfunction parseCursorDate(value?: string) {\n const trimmed = value?.trim();\n\n if (!trimmed) {\n return null;\n }\n\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) {\n return new Date(`${trimmed}T00:00:00`);\n }\n\n const parsed = new Date(trimmed);\n\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction parseCursorNumber(value?: string) {\n const numeric = Number(value?.replaceAll(\",\", \"\").trim() ?? \"\");\n\n if (!Number.isFinite(numeric) || numeric <= 0) {\n return null;\n }\n\n return Math.round(numeric);\n}\n\nfunction createCursorTokenTotals(row: CursorCsvRow): DailyTokenTotals | null {\n const total =\n parseCursorNumber(row[\"Total Tokens\"]) ?? parseCursorNumber(row.Tokens);\n\n if (!total) {\n return null;\n }\n\n const inputWithCacheWrite =\n parseCursorNumber(row[\"Input (w/ Cache Write)\"]) ?? 0;\n const inputWithoutCacheWrite =\n parseCursorNumber(row[\"Input (w/o Cache Write)\"]) ?? 0;\n const cacheInput = parseCursorNumber(row[\"Cache Read\"]) ?? 0;\n const outputTokens = parseCursorNumber(row[\"Output Tokens\"]) ?? 0;\n\n return {\n input: inputWithCacheWrite + inputWithoutCacheWrite + cacheInput,\n output: outputTokens,\n cache: { input: cacheInput, output: inputWithCacheWrite },\n total,\n };\n}\n\nexport async function loadCursorRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const databasePath = getCursorStateDbPath();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n if (!databasePath) {\n return createUsageSummary(\n \"cursor\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n }\n\n const authState = await readCursorAuthState(databasePath);\n\n if (!authState.accessToken) {\n return createUsageSummary(\n \"cursor\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n }\n\n const recentStart = getRecentWindowStart(end, 30);\n const response = await fetchCursorUsageCsv(authState.accessToken);\n\n return summarizeCursorUsageCsv(response, start, end, recentStart);\n}\n\nexport async function summarizeCursorUsageCsv(\n response: Response,\n start: Date,\n end: Date,\n recentStart = getRecentWindowStart(end, 30),\n): Promise<UsageSummary> {\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n await processCursorUsageCsvStream(response, (row) => {\n addCursorUsageRow(\n row,\n start,\n end,\n recentStart,\n totals,\n modelTotals,\n recentModelTotals,\n );\n });\n\n return createUsageSummary(\n \"cursor\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonDocument,\n} from \"./utils\";\n\nconst GEMINI_CONFIG_DIR_ENV = \"GEMINI_CONFIG_DIR\";\nconst GEMINI_SESSION_PATH_RE = /[\\\\/]chats[\\\\/]session-[^\\\\/]+\\.json$/;\n\ninterface GeminiTokens {\n input?: number;\n output?: number;\n cached?: number;\n thoughts?: number;\n tool?: number;\n}\n\ninterface GeminiMessage {\n id?: string;\n timestamp?: string;\n type?: string;\n model?: string;\n tokens?: GeminiTokens;\n}\n\ninterface GeminiSession {\n sessionId?: string;\n messages?: GeminiMessage[];\n}\n\nfunction getGeminiBaseDir() {\n const configuredDir = process.env[GEMINI_CONFIG_DIR_ENV]?.trim();\n\n return configuredDir ? resolve(configuredDir) : join(homedir(), \".gemini\");\n}\n\nasync function getGeminiSessionFiles() {\n const files = await listFilesRecursive(\n join(getGeminiBaseDir(), \"tmp\"),\n \".json\",\n );\n\n return files.filter((file) => GEMINI_SESSION_PATH_RE.test(file));\n}\n\nexport function isGeminiAvailable() {\n return existsSync(join(getGeminiBaseDir(), \"tmp\"));\n}\n\nfunction createGeminiTokenTotals(tokens: GeminiTokens): DailyTokenTotals {\n const cacheInput = tokens.cached ?? 0;\n const input = (tokens.input ?? 0) + cacheInput;\n const output =\n (tokens.output ?? 0) + (tokens.thoughts ?? 0) + (tokens.tool ?? 0);\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: 0 },\n total: input + output,\n };\n}\n\nfunction getGeminiMessageKey(\n sessionId: string | undefined,\n message: GeminiMessage,\n) {\n return JSON.stringify({\n sessionId,\n messageId: message.id,\n timestamp: message.timestamp,\n model: message.model,\n tokens: message.tokens,\n });\n}\n\nasync function parseGeminiSession(filePath: string) {\n return readJsonDocument<GeminiSession>(filePath, {\n oversizedErrorMessage: ({ filePath, maxBytes, envVarName }) =>\n `Gemini session JSON document exceeds ${maxBytes} bytes in ${filePath}. Increase ${envVarName} to process this file.`,\n });\n}\n\nexport async function loadGeminiRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const files = await getGeminiSessionFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const recentStart = getRecentWindowStart(end, 30);\n const dedupe = new Set<string>();\n\n for (const file of files) {\n const session = await parseGeminiSession(file);\n\n for (const message of session.messages ?? []) {\n if (message.type !== \"gemini\" || !message.tokens) {\n continue;\n }\n\n const date = message.timestamp ? new Date(message.timestamp) : null;\n\n if (!date || Number.isNaN(date.getTime()) || date < start || date > end) {\n continue;\n }\n\n const tokenTotals = createGeminiTokenTotals(message.tokens);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const messageKey = getGeminiMessageKey(session.sessionId, message);\n\n if (dedupe.has(messageKey)) {\n continue;\n }\n\n dedupe.add(messageKey);\n\n const modelName = message.model?.trim()\n ? normalizeModelName(message.model)\n : undefined;\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n\n if (!modelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n }\n\n return createUsageSummary(\n \"gemini\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","export type ProviderId =\n | \"amp\"\n | \"claude\"\n | \"codex\"\n | \"cursor\"\n | \"gemini\"\n | \"opencode\"\n | \"pi\";\n\nexport const providerIds: ProviderId[] = [\n \"claude\",\n \"codex\",\n \"cursor\",\n \"opencode\",\n \"amp\",\n \"gemini\",\n \"pi\",\n];\n\nexport const defaultProviderIds: ProviderId[] = [\n \"claude\",\n \"codex\",\n \"cursor\",\n \"opencode\",\n];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n amp: \"Amp\",\n claude: \"Claude code\",\n codex: \"Codex\",\n cursor: \"Cursor\",\n gemini: \"Gemini CLI\",\n opencode: \"Open Code\",\n pi: \"Pi Coding Agent\",\n};\n","import { existsSync } from \"node:fs\";\nimport { copyFile, mkdtemp, rm } from \"node:fs/promises\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n parseJsonTextWithLimit,\n readJsonDocument,\n} from \"./utils\";\n\ninterface OpenCodeTokenCache {\n read?: number;\n write?: number;\n}\n\ninterface OpenCodeTokens {\n input?: number;\n output?: number;\n cache?: OpenCodeTokenCache;\n}\n\ninterface OpenCodeMessage {\n id: string;\n role?: string;\n providerID: string;\n modelID: string;\n time: { created: number };\n tokens?: OpenCodeTokens;\n}\n\ninterface OpenCodeMessageRow {\n id: string;\n data: string;\n}\n\ninterface OpenCodeDatabaseSource {\n kind: \"database\";\n path: string;\n}\n\ninterface OpenCodeLegacySource {\n kind: \"legacy\";\n files: string[];\n}\n\ntype OpenCodeSource = OpenCodeDatabaseSource | OpenCodeLegacySource;\n\nfunction sumOpenCodeTokens(tokens?: OpenCodeTokens): DailyTokenTotals {\n const cacheInput = tokens?.cache?.read ?? 0;\n const cacheOutput = tokens?.cache?.write ?? 0;\n const input = (tokens?.input ?? 0) + cacheInput;\n const output = (tokens?.output ?? 0) + cacheOutput;\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: cacheOutput },\n total: input + output,\n };\n}\n\nasync function parseOpenCodeFile(filePath: string) {\n return readJsonDocument<OpenCodeMessage>(filePath);\n}\n\nfunction getOpenCodeBaseDir() {\n const baseDir = process.env.OPENCODE_DATA_DIR?.trim()\n ? resolve(process.env.OPENCODE_DATA_DIR)\n : join(homedir(), \".local\", \"share\", \"opencode\");\n\n return baseDir;\n}\n\nasync function getOpenCodeSource(): Promise<OpenCodeSource> {\n const baseDir = getOpenCodeBaseDir();\n const databasePath = join(baseDir, \"opencode.db\");\n\n if (existsSync(databasePath)) {\n return { kind: \"database\", path: databasePath };\n }\n\n const messagesDir = join(baseDir, \"storage\", \"message\");\n\n return {\n kind: \"legacy\",\n files: await listFilesRecursive(messagesDir, \".json\"),\n };\n}\n\nexport function isOpenCodeAvailable() {\n const baseDir = getOpenCodeBaseDir();\n\n return (\n existsSync(join(baseDir, \"opencode.db\")) ||\n existsSync(join(baseDir, \"storage\", \"message\"))\n );\n}\n\nasync function loadSqliteModule() {\n try {\n const moduleName = \"node:sqlite\";\n\n return await import(moduleName);\n } catch {\n throw new Error(\n \"OpenCode SQLite support requires a Node.js runtime that provides node:sqlite.\",\n );\n }\n}\n\nasync function withoutSqliteExperimentalWarning<T>(callback: () => Promise<T>) {\n const originalEmitWarning = process.emitWarning.bind(process);\n\n process.emitWarning = ((warning: string | Error, ...args: unknown[]) => {\n const warningText = typeof warning === \"string\" ? warning : warning.message;\n const warningType =\n warning instanceof Error ? warning.name : String(args[0] ?? \"\");\n\n if (warningType === \"ExperimentalWarning\" && /sqlite/i.test(warningText)) {\n return;\n }\n\n return Reflect.apply(originalEmitWarning, process, [\n warning,\n ...args,\n ] as Parameters<typeof process.emitWarning>);\n }) as typeof process.emitWarning;\n\n try {\n return await callback();\n } finally {\n process.emitWarning = originalEmitWarning;\n }\n}\n\nfunction parseOpenCodeMessageData(\n rowId: string,\n sourceLabel: string,\n content: string,\n) {\n const message = parseJsonTextWithLimit<OpenCodeMessage>(content, sourceLabel);\n\n return {\n ...message,\n id: message.id || rowId,\n };\n}\n\nfunction isSqliteLockedError(error: unknown) {\n return error instanceof Error && /database is locked/i.test(error.message);\n}\n\nasync function withDatabaseSnapshot<T>(\n databasePath: string,\n callback: (snapshotPath: string) => Promise<T>,\n) {\n const snapshotDir = await mkdtemp(join(tmpdir(), \"tokely-opencode-\"));\n const snapshotPath = join(snapshotDir, \"opencode.db\");\n\n await copyFile(databasePath, snapshotPath);\n\n for (const suffix of [\"-shm\", \"-wal\"]) {\n const companionPath = `${databasePath}${suffix}`;\n\n if (!existsSync(companionPath)) {\n continue;\n }\n\n await copyFile(companionPath, `${snapshotPath}${suffix}`);\n }\n\n try {\n return await callback(snapshotPath);\n } finally {\n await rm(snapshotDir, { recursive: true, force: true });\n }\n}\n\nasync function iterateOpenCodeDatabaseMessages(\n databasePath: string,\n onMessage: (message: OpenCodeMessage) => void,\n) {\n await withoutSqliteExperimentalWarning(async () => {\n const { DatabaseSync } = await loadSqliteModule();\n const database = new DatabaseSync(databasePath, { readOnly: true });\n\n try {\n const statement = database.prepare(\n \"SELECT id, data FROM message ORDER BY time_created ASC\",\n );\n\n for (const row of statement.iterate() as Iterable<OpenCodeMessageRow>) {\n onMessage(\n parseOpenCodeMessageData(\n row.id,\n `${databasePath}:message:${row.id}`,\n row.data,\n ),\n );\n }\n } finally {\n database.close();\n }\n });\n}\n\nasync function loadOpenCodeDatabaseMessages(\n databasePath: string,\n onMessage: (message: OpenCodeMessage) => void,\n) {\n try {\n await iterateOpenCodeDatabaseMessages(databasePath, onMessage);\n } catch (error) {\n if (!isSqliteLockedError(error)) {\n throw error;\n }\n\n await withDatabaseSnapshot(databasePath, async (snapshotPath) => {\n await iterateOpenCodeDatabaseMessages(snapshotPath, onMessage);\n });\n }\n}\n\nfunction addOpenCodeMessage(\n message: OpenCodeMessage,\n start: Date,\n end: Date,\n recentStart: Date,\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n dedupe: Set<string>,\n) {\n if (dedupe.has(message.id)) {\n return;\n }\n\n dedupe.add(message.id);\n\n const tokenTotals = sumOpenCodeTokens(message.tokens);\n\n if (tokenTotals.total <= 0) {\n return;\n }\n\n const date = new Date(message.time.created);\n\n if (date < start || date > end) {\n return;\n }\n\n const modelName = normalizeModelName(message.modelID);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n}\n\nexport async function loadOpenCodeRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const source = await getOpenCodeSource();\n const totals: DailyTotalsByDate = new Map();\n const dedupe = new Set<string>();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n if (source.kind === \"database\") {\n await loadOpenCodeDatabaseMessages(source.path, (message) => {\n addOpenCodeMessage(\n message,\n start,\n end,\n recentStart,\n totals,\n modelTotals,\n recentModelTotals,\n dedupe,\n );\n });\n } else {\n for (const file of source.files) {\n const message = await parseOpenCodeFile(file);\n\n addOpenCodeMessage(\n message,\n start,\n end,\n recentStart,\n totals,\n modelTotals,\n recentModelTotals,\n dedupe,\n );\n }\n }\n\n return createUsageSummary(\n \"opencode\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n MAX_JSONL_RECORD_BYTES_ENV,\n type JsonlRecordDecision,\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getPositiveIntegerEnv,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonlRecords,\n} from \"./utils\";\n\nconst PI_AGENT_DIR_ENV = \"PI_CODING_AGENT_DIR\";\nconst CLASSIFICATION_PREFIX_BYTES = 16 * 1024;\n\ninterface PiUsagePayload {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n totalTokens?: number;\n}\n\ninterface PiMessagePayload {\n role?: string;\n model?: string;\n usage?: PiUsagePayload;\n timestamp?: number | string;\n}\n\ninterface PiSessionEntry {\n type?: string;\n timestamp?: string;\n message?: PiMessagePayload;\n}\n\nfunction getPiAgentDir() {\n const configuredAgentDir = process.env[PI_AGENT_DIR_ENV]?.trim();\n\n return configuredAgentDir\n ? resolve(configuredAgentDir)\n : join(homedir(), \".pi\", \"agent\");\n}\n\nasync function getPiSessionFiles() {\n return listFilesRecursive(join(getPiAgentDir(), \"sessions\"), \".jsonl\");\n}\n\nexport function isPiAvailable() {\n return existsSync(join(getPiAgentDir(), \"sessions\"));\n}\n\nfunction classifyPiRecord(prefix: string): JsonlRecordDecision<void> {\n if (\n prefix.includes('\"type\":\"message\"') &&\n prefix.includes('\"role\":\"assistant\"')\n ) {\n return { kind: \"keep\", classification: undefined };\n }\n\n return { kind: \"skip\" };\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction createPiTokenTotals(usage: PiUsagePayload): DailyTokenTotals {\n const cacheRead = usage.cacheRead ?? 0;\n const cacheWrite = usage.cacheWrite ?? 0;\n const input = (usage.input ?? 0) + cacheRead;\n const output = (usage.output ?? 0) + cacheWrite;\n const total = usage.totalTokens ?? input + output;\n\n return {\n input,\n output,\n cache: { input: cacheRead, output: cacheWrite },\n total,\n };\n}\n\nfunction getPiTimestamp(entry: PiSessionEntry) {\n const rawTimestamp = entry.timestamp ?? entry.message?.timestamp;\n\n if (typeof rawTimestamp === \"string\" || typeof rawTimestamp === \"number\") {\n return new Date(rawTimestamp);\n }\n\n return null;\n}\n\nexport async function loadPiRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const files = await getPiSessionFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const recentStart = getRecentWindowStart(end, 30);\n const maxRecordBytes = getPositiveIntegerEnv(\n MAX_JSONL_RECORD_BYTES_ENV,\n DEFAULT_MAX_JSONL_RECORD_BYTES,\n );\n\n for (const file of files) {\n for await (const record of readJsonlRecords(file, {\n classificationPrefixBytes: CLASSIFICATION_PREFIX_BYTES,\n classify: classifyPiRecord,\n maxRecordBytes,\n oversizedErrorMessage: ({\n filePath,\n lineNumber,\n maxRecordBytes,\n envVarName,\n }) =>\n `Relevant Pi Coding Agent record exceeds ${maxRecordBytes} bytes in ${filePath}:${lineNumber}. Increase ${envVarName} to process this file.`,\n })) {\n let entry: PiSessionEntry;\n\n try {\n entry = JSON.parse(record.rawLine) as PiSessionEntry;\n } catch {\n continue;\n }\n\n if (entry.type !== \"message\" || entry.message?.role !== \"assistant\") {\n continue;\n }\n\n const usage = entry.message.usage;\n\n if (!usage) {\n continue;\n }\n\n const timestamp = getPiTimestamp(entry);\n\n if (!timestamp || Number.isNaN(timestamp.getTime())) {\n continue;\n }\n\n if (timestamp < start || timestamp > end) {\n continue;\n }\n\n const tokenTotals = createPiTokenTotals(usage);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const modelName = asNonEmptyString(entry.message.model);\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, normalizedModelName);\n\n if (!normalizedModelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, normalizedModelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(\n recentModelTotals,\n normalizedModelName,\n tokenTotals,\n );\n }\n }\n }\n\n return createUsageSummary(\"pi\", totals, modelTotals, recentModelTotals, end);\n}\n","import type { UsageSummary } from \"./interfaces\";\nimport { isAmpAvailable, loadAmpRows } from \"./lib/amp\";\nimport { isClaudeAvailable, loadClaudeRows } from \"./lib/claude-code\";\nimport { isCodexAvailable, loadCodexRows } from \"./lib/codex\";\nimport { isCursorAvailable, loadCursorRows } from \"./lib/cursor\";\nimport { isGeminiAvailable, loadGeminiRows } from \"./lib/gemini\";\nimport {\n defaultProviderIds,\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { isOpenCodeAvailable, loadOpenCodeRows } from \"./lib/open-code\";\nimport { isPiAvailable, loadPiRows } from \"./lib/pi\";\nimport { hasUsage, mergeUsageSummaries } from \"./lib/utils\";\n\nexport { defaultProviderIds, providerIds, providerStatusLabel, type ProviderId };\n\ninterface AggregateUsageOptions {\n start: Date;\n end: Date;\n requestedProviders?: ProviderId[];\n}\n\nexport interface AggregateUsageResult {\n rowsByProvider: Record<ProviderId, UsageSummary | null>;\n warnings: string[];\n}\n\nexport type ProviderAvailability = Record<ProviderId, boolean>;\n\nfunction createEmptyProviderAvailability(): ProviderAvailability {\n return {\n amp: false,\n claude: false,\n codex: false,\n cursor: false,\n gemini: false,\n opencode: false,\n pi: false,\n };\n}\n\nexport async function isProviderAvailable(provider: ProviderId): Promise<boolean> {\n switch (provider) {\n case \"amp\":\n return isAmpAvailable();\n case \"claude\":\n return isClaudeAvailable();\n case \"codex\":\n return isCodexAvailable();\n case \"cursor\":\n return isCursorAvailable();\n case \"gemini\":\n return isGeminiAvailable();\n case \"opencode\":\n return isOpenCodeAvailable();\n case \"pi\":\n return isPiAvailable();\n default: {\n const exhaustiveCheck: never = provider;\n\n throw new Error(`Unhandled provider: ${String(exhaustiveCheck)}`);\n }\n }\n}\n\nexport async function getProviderAvailability(\n providers: ProviderId[] = providerIds,\n): Promise<ProviderAvailability> {\n const availability = createEmptyProviderAvailability();\n\n for (const provider of providers) {\n availability[provider] = await isProviderAvailable(provider);\n }\n\n return availability;\n}\n\nexport function mergeProviderUsage(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n end: Date,\n): UsageSummary | null {\n const summaries = providerIds\n .map((provider) => rowsByProvider[provider])\n .filter((summary): summary is UsageSummary => summary !== null);\n\n if (summaries.length === 0) {\n return null;\n }\n\n return mergeUsageSummaries(\"all\", summaries, end);\n}\n\nexport async function aggregateUsage({\n start,\n end,\n requestedProviders,\n}: AggregateUsageOptions): Promise<AggregateUsageResult> {\n const providersToLoad = requestedProviders?.length\n ? requestedProviders\n : providerIds;\n const rowsByProvider: Record<ProviderId, UsageSummary | null> = {\n amp: null,\n claude: null,\n codex: null,\n cursor: null,\n gemini: null,\n opencode: null,\n pi: null,\n };\n const warnings: string[] = [];\n\n for (const provider of providersToLoad) {\n let summary: UsageSummary;\n\n switch (provider) {\n case \"amp\":\n summary = await loadAmpRows(start, end);\n break;\n case \"claude\":\n summary = await loadClaudeRows(start, end);\n break;\n case \"codex\":\n summary = await loadCodexRows(start, end, warnings);\n break;\n case \"cursor\":\n summary = await loadCursorRows(start, end);\n break;\n case \"gemini\":\n summary = await loadGeminiRows(start, end);\n break;\n case \"opencode\":\n summary = await loadOpenCodeRows(start, end);\n break;\n case \"pi\":\n summary = await loadPiRows(start, end);\n break;\n default: {\n const exhaustiveCheck: never = provider;\n\n throw new Error(`Unhandled provider: ${String(exhaustiveCheck)}`);\n }\n }\n\n rowsByProvider[provider] = hasUsage(summary) ? summary : null;\n }\n\n return { rowsByProvider, warnings };\n}\n"],"mappings":"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AC,MAAM,QAAQ,eAAe,GAAG;AACnC;IACF;AACA,oBAAgB,QAAQ,SAAU,SAAe;AAC/C,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,UAAI,KAAK,iBAAiB,QAAQ,IAAI,MAAM,IAAI;AAC9C,cAAM,IAAI,MAAM,KAAK,OAAO,qBAAqB,OAAO,YAAY;MACtE;IACF,EAAE,KAAK,IAAI,CAAC;EACd;EAEA,KAAM,OAAoC;AACxC,QAAI,UAAU,MAAM,KAAK,MACvB;AAEF,QAAK,OAAO;AACV,WAAK,QAAQ,OAAO;AAClB,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,UAAU,QAAW;AACvB;QACF;AACA,mBAAW,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;MACjD;IACF;AACA,eAAW;AACX,SAAK,OAAO;EACd;;;;AC7KK,IAAM,gBAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,kBAAkB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,4BAAoE;EAC/E,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,uBAAuB;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,sBAAsB;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;I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","names":["resolve","registry","maxBytes","join","join","existsSync","homedir","join","resolve","homedir","join","existsSync","resolve","existsSync","homedir","join","resolve","resolve","join","homedir","existsSync","filePath","maxRecordBytes","existsSync","homedir","join","resolve","join","homedir","resolve","existsSync","existsSync","homedir","join","resolve","resolve","join","homedir","existsSync","filePath","existsSync","copyFile","mkdtemp","rm","homedir","tmpdir","join","resolve","resolve","join","homedir","existsSync","isSqliteLockedError","mkdtemp","tmpdir","copyFile","rm","existsSync","homedir","join","resolve","CLASSIFICATION_PREFIX_BYTES","resolve","join","homedir","existsSync","asNonEmptyString","maxRecordBytes","resolve"]}