slopmeter 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,7 +24,7 @@ slopmeter
24
24
  ## Usage
25
25
 
26
26
  ```bash
27
- slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]
27
+ slopmeter [--all] [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]
28
28
  ```
29
29
 
30
30
  By default, the CLI:
@@ -38,6 +38,7 @@ By default, the CLI:
38
38
  - `--claude`: include only Claude Code data
39
39
  - `--codex`: include only Codex data
40
40
  - `--opencode`: include only Open Code data
41
+ - `--all`: merge all providers into one combined graph
41
42
  - `--dark`: render the image with the dark theme
42
43
  - `-f, --format <png|svg|json>`: choose the output format
43
44
  - `-o, --output <path>`: write output to a custom path
@@ -69,6 +70,12 @@ Render only Codex usage:
69
70
  npx slopmeter --codex
70
71
  ```
71
72
 
73
+ Render one merged graph across all providers:
74
+
75
+ ```bash
76
+ npx slopmeter --all
77
+ ```
78
+
72
79
  When provider flags are present, `slopmeter` only loads those providers and only prints availability for those providers.
73
80
 
74
81
  Render a dark-theme SVG:
@@ -97,6 +104,7 @@ When Claude Code falls back to `history.jsonl`, those days are rendered as activ
97
104
  ## Exit behavior
98
105
 
99
106
  - If no provider flags are passed, `slopmeter` renders every provider with available data.
107
+ - If `--all` is passed, `slopmeter` loads all providers and renders one combined graph with merged totals, streaks, and model rankings.
100
108
  - If provider flags are passed and a requested provider has no data, the command exits with an error.
101
109
  - If no provider has data, the command exits with an error.
102
110
 
package/dist/cli.js CHANGED
@@ -5601,6 +5601,57 @@ function hasUsage(summary) {
5601
5601
  (row) => row.total > 0 || (row.displayValue ?? 0) > 0
5602
5602
  );
5603
5603
  }
5604
+ function mergeUsageSummaries(provider, summaries, end) {
5605
+ const totals = /* @__PURE__ */ new Map();
5606
+ const modelTotals = /* @__PURE__ */ new Map();
5607
+ const recentModelTotals = /* @__PURE__ */ new Map();
5608
+ const displayValuesByDate = /* @__PURE__ */ new Map();
5609
+ const recentStart = getRecentWindowStart(end, 30);
5610
+ for (const summary of summaries) {
5611
+ for (const row of summary.daily) {
5612
+ addDailyTokenTotals(totals, row.date, {
5613
+ input: row.input,
5614
+ output: row.output,
5615
+ cache: { input: row.cache.input, output: row.cache.output },
5616
+ total: row.total
5617
+ });
5618
+ const dateKey = formatLocalDate(row.date);
5619
+ const displayValue = row.displayValue ?? row.total;
5620
+ if (displayValue > 0) {
5621
+ displayValuesByDate.set(
5622
+ dateKey,
5623
+ (displayValuesByDate.get(dateKey) ?? 0) + displayValue
5624
+ );
5625
+ }
5626
+ const totalsForDate = totals.get(dateKey);
5627
+ if (totalsForDate) {
5628
+ for (const breakdown of row.breakdown) {
5629
+ addModelTokenTotals(
5630
+ totalsForDate.models,
5631
+ breakdown.name,
5632
+ breakdown.tokens
5633
+ );
5634
+ addModelTokenTotals(modelTotals, breakdown.name, breakdown.tokens);
5635
+ if (row.date >= recentStart) {
5636
+ addModelTokenTotals(
5637
+ recentModelTotals,
5638
+ breakdown.name,
5639
+ breakdown.tokens
5640
+ );
5641
+ }
5642
+ }
5643
+ }
5644
+ }
5645
+ }
5646
+ return createUsageSummary(
5647
+ provider,
5648
+ totals,
5649
+ modelTotals,
5650
+ recentModelTotals,
5651
+ end,
5652
+ displayValuesByDate
5653
+ );
5654
+ }
5604
5655
 
5605
5656
  // src/graph.ts
5606
5657
  var heatmapThemes = {
@@ -5690,6 +5741,36 @@ var heatmapThemes = {
5690
5741
  // neutral-50
5691
5742
  ]
5692
5743
  }
5744
+ },
5745
+ all: {
5746
+ title: "Codex / Claude Code / Open Code",
5747
+ titleCaption: "Total usage from",
5748
+ colors: {
5749
+ light: [
5750
+ "#f0fdf4",
5751
+ // green-50
5752
+ "#bbf7d0",
5753
+ // green-200
5754
+ "#4ade80",
5755
+ // green-400
5756
+ "#16a34a",
5757
+ // green-600
5758
+ "#14532d"
5759
+ // green-900
5760
+ ],
5761
+ dark: [
5762
+ "#052e16",
5763
+ // green-950
5764
+ "#15803d",
5765
+ // green-700
5766
+ "#16a34a",
5767
+ // green-600
5768
+ "#4ade80",
5769
+ // green-400
5770
+ "#bbf7d0"
5771
+ // green-200
5772
+ ]
5773
+ }
5693
5774
  }
5694
5775
  };
5695
5776
  var daysOfWeekMonday = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
@@ -5699,6 +5780,7 @@ var providerTitleFontSize = 20;
5699
5780
  var metricCaptionFontSize = 9;
5700
5781
  var metricValueFontSize = 14;
5701
5782
  var captionValueGap = 4;
5783
+ var heatmapGamma = 0.7;
5702
5784
  var surfacePalettes = {
5703
5785
  light: {
5704
5786
  background: "#ffffff",
@@ -5711,6 +5793,12 @@ var surfacePalettes = {
5711
5793
  muted: "#a3a3a3"
5712
5794
  }
5713
5795
  };
5796
+ var emptyCellFill = {
5797
+ light: "#f5f5f5",
5798
+ // neutral-100
5799
+ dark: "#262626"
5800
+ // neutral-800
5801
+ };
5714
5802
  function formatTokenTotal(value) {
5715
5803
  const units = [
5716
5804
  { size: 1e12, suffix: "T" },
@@ -5778,7 +5866,7 @@ function defaultColourMap(value, max, colorCount) {
5778
5866
  if (max <= 0 || value <= 0) {
5779
5867
  return 0;
5780
5868
  }
5781
- const scaled = Math.log1p(value) / Math.log1p(max);
5869
+ const scaled = Math.pow(value / max, heatmapGamma);
5782
5870
  const index = Math.ceil(scaled * (colorCount - 1));
5783
5871
  return Math.min(Math.max(index, 0), colorCount - 1);
5784
5872
  }
@@ -5848,11 +5936,13 @@ function drawHeatmapSection(svg, {
5848
5936
  daily,
5849
5937
  insights,
5850
5938
  title,
5939
+ titleCaption,
5851
5940
  colors,
5852
5941
  colorMode,
5853
5942
  palette
5854
5943
  }) {
5855
5944
  const colorsForMode = colors[colorMode];
5945
+ const legendColors = [emptyCellFill[colorMode], ...colorsForMode.slice(1)];
5856
5946
  const valueByDate = /* @__PURE__ */ new Map();
5857
5947
  const rightEdge = x + layout.width - 8;
5858
5948
  const leftColumnX = x + 8;
@@ -5887,18 +5977,45 @@ function drawHeatmapSection(svg, {
5887
5977
  const totalOutputLabel = formatTokenTotal(totalOutputTokens);
5888
5978
  const longestStreak = insights?.streaks.longest ?? 0;
5889
5979
  const currentStreak = insights?.streaks.current ?? 0;
5890
- svg = svg.text(
5891
- {
5892
- x: leftColumnX,
5893
- y: y + layout.titleY,
5894
- fill: palette.text,
5895
- "font-size": providerTitleFontSize,
5896
- "font-weight": 600,
5897
- "dominant-baseline": "hanging",
5898
- "font-family": fontFamily
5899
- },
5900
- title
5901
- );
5980
+ if (titleCaption) {
5981
+ svg = svg.text(
5982
+ {
5983
+ x: leftColumnX,
5984
+ y: y + layout.headerCaptionY,
5985
+ fill: palette.muted,
5986
+ "font-size": metricCaptionFontSize,
5987
+ "font-weight": 600,
5988
+ "dominant-baseline": "hanging",
5989
+ "font-family": fontFamily
5990
+ },
5991
+ caption(titleCaption)
5992
+ );
5993
+ svg = svg.text(
5994
+ {
5995
+ x: leftColumnX,
5996
+ y: y + layout.headerValueY,
5997
+ fill: palette.text,
5998
+ "font-size": metricValueFontSize,
5999
+ "font-weight": 600,
6000
+ "dominant-baseline": "hanging",
6001
+ "font-family": fontFamily
6002
+ },
6003
+ title
6004
+ );
6005
+ } else {
6006
+ svg = svg.text(
6007
+ {
6008
+ x: leftColumnX,
6009
+ y: y + layout.titleY,
6010
+ fill: palette.text,
6011
+ "font-size": providerTitleFontSize,
6012
+ "font-weight": 600,
6013
+ "dominant-baseline": "hanging",
6014
+ "font-family": fontFamily
6015
+ },
6016
+ title
6017
+ );
6018
+ }
5902
6019
  svg = svg.text(
5903
6020
  {
5904
6021
  x: headerInputX,
@@ -6020,7 +6137,7 @@ function drawHeatmapSection(svg, {
6020
6137
  maxValue,
6021
6138
  colorsForMode.length
6022
6139
  );
6023
- const fill = colorsForMode[colorIndex];
6140
+ const fill = value <= 0 ? emptyCellFill[colorMode] : colorsForMode[colorIndex];
6024
6141
  const dayX = x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);
6025
6142
  const dayY = y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);
6026
6143
  const rectAttributes = {
@@ -6064,7 +6181,7 @@ function drawHeatmapSection(svg, {
6064
6181
  },
6065
6182
  caption("Less")
6066
6183
  );
6067
- for (let i = 0; i < colorsForMode.length; i += 1) {
6184
+ for (let i = 0; i < legendColors.length; i += 1) {
6068
6185
  const legendX = legendStartX + 28 + i * (layout.cellSize + 3);
6069
6186
  svg = svg.rect({
6070
6187
  x: legendX,
@@ -6073,12 +6190,12 @@ function drawHeatmapSection(svg, {
6073
6190
  height: layout.cellSize,
6074
6191
  rx: 3,
6075
6192
  ry: 3,
6076
- fill: colorsForMode[i]
6193
+ fill: legendColors[i]
6077
6194
  });
6078
6195
  }
6079
6196
  svg = svg.text(
6080
6197
  {
6081
- x: legendStartX + 28 + colorsForMode.length * (layout.cellSize + 3) + 6,
6198
+ x: legendStartX + 28 + legendColors.length * (layout.cellSize + 3) + 6,
6082
6199
  y: legendY + 10,
6083
6200
  fill: palette.muted,
6084
6201
  "font-size": 10,
@@ -6230,6 +6347,7 @@ function renderUsageHeatmapsSvg({
6230
6347
  daily: section.daily,
6231
6348
  insights: section.insights,
6232
6349
  title: section.title,
6350
+ titleCaption: section.titleCaption,
6233
6351
  colors: section.colors,
6234
6352
  colorMode,
6235
6353
  palette
@@ -7099,6 +7217,13 @@ async function loadOpenCodeRows(start, end) {
7099
7217
  }
7100
7218
 
7101
7219
  // src/providers.ts
7220
+ function mergeProviderUsage(rowsByProvider, end) {
7221
+ const summaries = providerIds.map((provider) => rowsByProvider[provider]).filter((summary) => summary !== null);
7222
+ if (summaries.length === 0) {
7223
+ return null;
7224
+ }
7225
+ return mergeUsageSummaries("all", summaries, end);
7226
+ }
7102
7227
  async function aggregateUsage({
7103
7228
  start,
7104
7229
  end,
@@ -7128,9 +7253,10 @@ var HELP_TEXT = `slopmeter
7128
7253
  Generate rolling 1-year usage heatmap image(s) (today is the latest day).
7129
7254
 
7130
7255
  Usage:
7131
- slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]
7256
+ slopmeter [--all] [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]
7132
7257
 
7133
7258
  Options:
7259
+ --all Render one merged graph for all providers
7134
7260
  --claude Render Claude Code graph
7135
7261
  --codex Render Codex graph
7136
7262
  --opencode Render Open Code graph
@@ -7150,6 +7276,7 @@ function validateArgs(values) {
7150
7276
  format: ow.optional.string.nonEmpty,
7151
7277
  help: ow.boolean,
7152
7278
  dark: ow.boolean,
7279
+ all: ow.boolean,
7153
7280
  claude: ow.boolean,
7154
7281
  codex: ow.boolean,
7155
7282
  opencode: ow.boolean
@@ -7217,6 +7344,18 @@ function printProviderAvailability(rowsByProvider, providers) {
7217
7344
  function getRequestedProviders(values) {
7218
7345
  return providerIds.filter((id) => values[id]);
7219
7346
  }
7347
+ function getOutputProviders(values, rowsByProvider, end) {
7348
+ if (!values.all) {
7349
+ return selectProvidersToRender(rowsByProvider, getRequestedProviders(values));
7350
+ }
7351
+ const merged = mergeProviderUsage(rowsByProvider, end);
7352
+ if (!merged) {
7353
+ throw new Error(
7354
+ "No usage data found for Claude code, Codex, or Open code."
7355
+ );
7356
+ }
7357
+ return [merged];
7358
+ }
7220
7359
  function selectProvidersToRender(rowsByProvider, requested) {
7221
7360
  const providersToRender = requested.length > 0 ? requested.filter((provider) => rowsByProvider[provider]) : providerIds.filter((provider) => rowsByProvider[provider]);
7222
7361
  if (requested.length > 0 && providersToRender.length < requested.length) {
@@ -7257,6 +7396,7 @@ async function main() {
7257
7396
  format: { type: "string", short: "f" },
7258
7397
  help: { type: "boolean", short: "h", default: false },
7259
7398
  dark: { type: "boolean", default: false },
7399
+ all: { type: "boolean", default: false },
7260
7400
  claude: { type: "boolean", default: false },
7261
7401
  codex: { type: "boolean", default: false },
7262
7402
  opencode: { type: "boolean", default: false }
@@ -7277,7 +7417,7 @@ async function main() {
7277
7417
  const { start, end } = getDateWindow();
7278
7418
  const colorMode = values.dark ? "dark" : "light";
7279
7419
  const format = inferFormat(values.format, values.output);
7280
- const requestedProviders = getRequestedProviders(values);
7420
+ const requestedProviders = values.all ? providerIds : getRequestedProviders(values);
7281
7421
  const inspectedProviders = requestedProviders.length > 0 ? requestedProviders : providerIds;
7282
7422
  const { rowsByProvider, warnings } = await aggregateUsage({
7283
7423
  start,
@@ -7290,9 +7430,10 @@ async function main() {
7290
7430
  `);
7291
7431
  }
7292
7432
  printProviderAvailability(rowsByProvider, inspectedProviders);
7293
- const exportProviders = selectProvidersToRender(
7433
+ const exportProviders = getOutputProviders(
7434
+ values,
7294
7435
  rowsByProvider,
7295
- requestedProviders
7436
+ end
7296
7437
  );
7297
7438
  const outputPath = resolve4(
7298
7439
  values.output ?? `./heatmap-last-year.${format}`
@@ -7320,6 +7461,7 @@ async function main() {
7320
7461
  daily,
7321
7462
  insights,
7322
7463
  title: heatmapThemes[provider].title,
7464
+ titleCaption: heatmapThemes[provider].titleCaption,
7323
7465
  colors: heatmapThemes[provider].colors
7324
7466
  }))
7325
7467
  });
package/dist/cli.js.map CHANGED
@@ -1 +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/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.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} from \"./interfaces\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport { aggregateUsage, providerIds, providerStatusLabel } from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n claude: boolean;\n codex: boolean;\n opencode: 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-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code 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 claude: ow.boolean,\n codex: ow.boolean,\n opencode: 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 rowsByProvider: Record<ProviderId, UsageSummary | null>,\n providers: ProviderId[],\n) {\n for (const provider of providers) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.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(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\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: ProviderId[],\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 claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { 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 = getRequestedProviders(values);\n const inspectedProviders =\n requestedProviders.length > 0 ? requestedProviders : providerIds;\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(rowsByProvider, inspectedProviders);\n\n const exportProviders = selectProvidersToRender(\n rowsByProvider,\n requestedProviders,\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${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: heatmapThemes[provider].title,\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 { DailyUsage, Insights, ModelUsage, UsageSummary } 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 = 4;\nexport const FILE_PROCESS_CONCURRENCY_ENV =\n \"SLOPMETER_FILE_PROCESS_CONCURRENCY\";\nexport const MAX_JSONL_RECORD_BYTES_ENV = \"SLOPMETER_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<TClassification>(): 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(Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\"));\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((row) => row.total > 0);\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","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\ninterface HeatmapTheme {\n title: 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 colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: 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<ProviderId, HeatmapTheme> = {\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 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};\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;\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\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.log1p(value) / Math.log1p(max);\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 =\n 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 =\n 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 colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\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 (row.total > 0 && (!firstMeasuredDate || dateKey < firstMeasuredDate)) {\n firstMeasuredDate = dateKey;\n }\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\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 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 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 = 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 transitionWeekIndex =\n firstActivityOnlyDate && firstMeasuredDate\n ? grid.weeks.findIndex((week) => week.includes(firstMeasuredDate))\n : -1;\n\n if (transitionWeekIndex > 0) {\n const lineX =\n x +\n layout.leftLabelWidth +\n transitionWeekIndex * (layout.cellSize + layout.gap) -\n Math.max(layout.gap, 2);\n const lineTop = y + layout.monthLabelY - 2;\n const lineBottom =\n y + layout.gridTop + 7 * layout.cellSize + 6 * layout.gap + 2;\n\n svg = svg.line({\n x1: lineX,\n y1: lineTop,\n x2: lineX,\n y2: lineBottom,\n stroke: palette.muted,\n \"stroke-width\": 1,\n \"stroke-dasharray\": \"4 4\",\n \"stroke-opacity\": 0.65,\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 < colorsForMode.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: colorsForMode[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + colorsForMode.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 =\n 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 colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\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 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 getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\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\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 { 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 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 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\nasync function getCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n return listFilesRecursive(join(codexHome, \"sessions\"), \".jsonl\");\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 = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\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 += 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(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","import type { UsageSummary } from \"../interfaces\";\n\nexport type ProviderId = UsageSummary[\"provider\"];\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\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 { kind: \"legacy\", files: await listFilesRecursive(messagesDir, \".json\") };\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 =\n typeof warning === \"string\" ? warning : warning.message;\n const warningType =\n warning instanceof Error ? warning.name : String(args[0] ?? \"\");\n\n if (\n warningType === \"ExperimentalWarning\" &&\n /sqlite/i.test(warningText)\n ) {\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(), \"slopmeter-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 type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage } from \"./lib/utils\";\n\nexport { 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 async function aggregateUsage({\n start,\n end,\n requestedProviders,\n}: AggregateUsageOptions): Promise<AggregateUsageResult> {\n const providersToLoad =\n requestedProviders?.length ? requestedProviders : providerIds;\n const rowsByProvider: Record<ProviderId, UsageSummary | null> = {\n claude: null,\n codex: null,\n opencode: null,\n };\n const warnings: string[] = [];\n\n for (const provider of providersToLoad) {\n const summary =\n provider === \"claude\"\n ? await loadClaudeRows(start, end)\n : provider === \"codex\"\n ? await loadCodexRows(start, end, warnings)\n : await loadOpenCodeRows(start, end);\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","homedir","join","resolve","resolve","join","homedir","filePath","maxRecordBytes","existsSync","homedir","join","resolve","resolve","join","homedir","existsSync","resolve"]}
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/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.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 type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport {\n aggregateUsage,\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 claude: boolean;\n codex: boolean;\n opencode: 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-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--all] [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --all Render one merged graph for all providers\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code 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 claude: ow.boolean,\n codex: ow.boolean,\n opencode: 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 rowsByProvider: Record<ProviderId, UsageSummary | null>,\n providers: ProviderId[],\n) {\n for (const provider of providers) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction getOutputProviders(\n values: CliArgValues,\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n end: Date,\n) {\n if (!values.all) {\n return selectProvidersToRender(rowsByProvider, getRequestedProviders(values));\n }\n\n const merged = mergeProviderUsage(rowsByProvider, end);\n\n if (!merged) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return [merged];\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.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(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\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 claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { 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 ? providerIds : getRequestedProviders(values);\n const inspectedProviders =\n requestedProviders.length > 0 ? requestedProviders : providerIds;\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(rowsByProvider, inspectedProviders);\n\n const exportProviders = getOutputProviders(\n values,\n rowsByProvider,\n end,\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${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: 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 { DailyUsage, Insights, ModelUsage, UsageSummary } 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 = 4;\nexport const FILE_PROCESS_CONCURRENCY_ENV =\n \"SLOPMETER_FILE_PROCESS_CONCURRENCY\";\nexport const MAX_JSONL_RECORD_BYTES_ENV = \"SLOPMETER_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<TClassification>(): 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(Buffer.concat(prefixChunks, prefixBytes).toString(\"utf8\"));\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((row) => row.total > 0);\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 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 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 all: {\n title: \"Codex / Claude Code / Open Code\",\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 =\n 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 =\n 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 (row.total > 0 && (!firstMeasuredDate || dateKey < firstMeasuredDate)) {\n firstMeasuredDate = dateKey;\n }\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\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 = 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 transitionWeekIndex =\n firstActivityOnlyDate && firstMeasuredDate\n ? grid.weeks.findIndex((week) => week.includes(firstMeasuredDate))\n : -1;\n\n if (transitionWeekIndex > 0) {\n const lineX =\n x +\n layout.leftLabelWidth +\n transitionWeekIndex * (layout.cellSize + layout.gap) -\n Math.max(layout.gap, 2);\n const lineTop = y + layout.monthLabelY - 2;\n const lineBottom =\n y + layout.gridTop + 7 * layout.cellSize + 6 * layout.gap + 2;\n\n svg = svg.line({\n x1: lineX,\n y1: lineTop,\n x2: lineX,\n y2: lineBottom,\n stroke: palette.muted,\n \"stroke-width\": 1,\n \"stroke-dasharray\": \"4 4\",\n \"stroke-opacity\": 0.65,\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 =\n 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 { 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 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 getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\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\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 { 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 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 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\nasync function getCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n return listFilesRecursive(join(codexHome, \"sessions\"), \".jsonl\");\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 = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\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 += 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(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","export type ProviderId = \"claude\" | \"codex\" | \"opencode\";\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\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 { kind: \"legacy\", files: await listFilesRecursive(messagesDir, \".json\") };\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 =\n typeof warning === \"string\" ? warning : warning.message;\n const warningType =\n warning instanceof Error ? warning.name : String(args[0] ?? \"\");\n\n if (\n warningType === \"ExperimentalWarning\" &&\n /sqlite/i.test(warningText)\n ) {\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(), \"slopmeter-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 type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage, mergeUsageSummaries } from \"./lib/utils\";\n\nexport { 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 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 =\n requestedProviders?.length ? requestedProviders : providerIds;\n const rowsByProvider: Record<ProviderId, UsageSummary | null> = {\n claude: null,\n codex: null,\n opencode: null,\n };\n const warnings: string[] = [];\n\n for (const provider of providersToLoad) {\n const summary =\n provider === \"claude\"\n ? await loadClaudeRows(start, end)\n : provider === \"codex\"\n ? await loadCodexRows(start, end, warnings)\n : await loadOpenCodeRows(start, end);\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","homedir","join","resolve","resolve","join","homedir","filePath","maxRecordBytes","existsSync","homedir","join","resolve","resolve","join","homedir","existsSync","resolve"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slopmeter",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "CLI for generating yearly usage heatmaps for Claude Code, Codex, and Open Code.",
5
5
  "type": "module",
6
6
  "engines": {