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 +9 -1
- package/dist/cli.js +163 -21
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
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.
|
|
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
|
-
|
|
5891
|
-
|
|
5892
|
-
|
|
5893
|
-
|
|
5894
|
-
|
|
5895
|
-
|
|
5896
|
-
|
|
5897
|
-
|
|
5898
|
-
|
|
5899
|
-
|
|
5900
|
-
|
|
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 <
|
|
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:
|
|
6193
|
+
fill: legendColors[i]
|
|
6077
6194
|
});
|
|
6078
6195
|
}
|
|
6079
6196
|
svg = svg.text(
|
|
6080
6197
|
{
|
|
6081
|
-
x: legendStartX + 28 +
|
|
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 =
|
|
7433
|
+
const exportProviders = getOutputProviders(
|
|
7434
|
+
values,
|
|
7294
7435
|
rowsByProvider,
|
|
7295
|
-
|
|
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(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\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(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\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"]}
|