@tokscale/cli 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,569 @@
1
+ import { createCanvas, loadImage, GlobalFonts } from "@napi-rs/canvas";
2
+ import { Resvg } from "@resvg/resvg-js";
3
+ import * as fs from "node:fs";
4
+ import * as path from "node:path";
5
+ import * as os from "node:os";
6
+ import { parseLocalSourcesAsync, finalizeReportAsync, finalizeGraphAsync, } from "./native.js";
7
+ import { PricingFetcher } from "./pricing.js";
8
+ import { syncCursorCache, loadCursorCredentials } from "./cursor.js";
9
+ const SCALE = 2;
10
+ const IMAGE_WIDTH = 1200 * SCALE;
11
+ const IMAGE_HEIGHT = 1200 * SCALE;
12
+ const PADDING = 56 * SCALE;
13
+ const COLORS = {
14
+ background: "#10121C",
15
+ textPrimary: "#ffffff",
16
+ textSecondary: "#888888",
17
+ textMuted: "#555555",
18
+ accent: "#00B2FF",
19
+ grade0: "#141A25",
20
+ grade1: "#00B2FF44",
21
+ grade2: "#00B2FF88",
22
+ grade3: "#00B2FFCC",
23
+ grade4: "#00B2FF",
24
+ };
25
+ const SOURCE_DISPLAY_NAMES = {
26
+ opencode: "OpenCode",
27
+ claude: "Claude Code",
28
+ codex: "Codex CLI",
29
+ gemini: "Gemini CLI",
30
+ cursor: "Cursor IDE",
31
+ };
32
+ const ASSETS_BASE_URL = "https://tokscale.ai/assets";
33
+ const CLIENT_LOGO_URLS = {
34
+ "OpenCode": `${ASSETS_BASE_URL}/client-opencode.png`,
35
+ "Claude Code": `${ASSETS_BASE_URL}/client-claude.jpg`,
36
+ "Codex CLI": `${ASSETS_BASE_URL}/client-openai.jpg`,
37
+ "Gemini CLI": `${ASSETS_BASE_URL}/client-gemini.png`,
38
+ "Cursor IDE": `${ASSETS_BASE_URL}/client-cursor.jpg`,
39
+ };
40
+ const TOKSCALE_LOGO_SVG_URL = "https://tokscale.ai/tokscale-logo.svg";
41
+ const TOKSCALE_LOGO_PNG_SIZE = 400;
42
+ function getImageCacheDir() {
43
+ return path.join(os.homedir(), ".cache", "tokscale", "images");
44
+ }
45
+ function getFontCacheDir() {
46
+ return path.join(os.homedir(), ".cache", "tokscale", "fonts");
47
+ }
48
+ async function fetchAndCacheImage(url, filename) {
49
+ const cacheDir = getImageCacheDir();
50
+ if (!fs.existsSync(cacheDir)) {
51
+ fs.mkdirSync(cacheDir, { recursive: true });
52
+ }
53
+ const cachedPath = path.join(cacheDir, filename);
54
+ if (!fs.existsSync(cachedPath)) {
55
+ const response = await fetch(url);
56
+ if (!response.ok)
57
+ throw new Error(`Failed to fetch ${url}`);
58
+ const buffer = await response.arrayBuffer();
59
+ fs.writeFileSync(cachedPath, Buffer.from(buffer));
60
+ }
61
+ return cachedPath;
62
+ }
63
+ async function fetchSvgAndConvertToPng(svgUrl, filename, size) {
64
+ const cacheDir = getImageCacheDir();
65
+ if (!fs.existsSync(cacheDir)) {
66
+ fs.mkdirSync(cacheDir, { recursive: true });
67
+ }
68
+ const cachedPath = path.join(cacheDir, filename);
69
+ if (!fs.existsSync(cachedPath)) {
70
+ const response = await fetch(svgUrl);
71
+ if (!response.ok)
72
+ throw new Error(`Failed to fetch ${svgUrl}`);
73
+ const svgText = await response.text();
74
+ const resvg = new Resvg(svgText, {
75
+ fitTo: { mode: "width", value: size },
76
+ });
77
+ const pngData = resvg.render();
78
+ fs.writeFileSync(cachedPath, pngData.asPng());
79
+ }
80
+ return cachedPath;
81
+ }
82
+ const FIGTREE_FONTS = [
83
+ { weight: "400", file: "Figtree-Regular.ttf", url: "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_d_QF5e.ttf" },
84
+ { weight: "700", file: "Figtree-Bold.ttf", url: "https://fonts.gstatic.com/s/figtree/v9/_Xmz-HUzqDCFdgfMsYiV_F7wfS-Bs_eYR15e.ttf" },
85
+ ];
86
+ let fontsRegistered = false;
87
+ async function ensureFontsLoaded() {
88
+ if (fontsRegistered)
89
+ return;
90
+ const cacheDir = getFontCacheDir();
91
+ if (!fs.existsSync(cacheDir)) {
92
+ fs.mkdirSync(cacheDir, { recursive: true });
93
+ }
94
+ for (const font of FIGTREE_FONTS) {
95
+ const fontPath = path.join(cacheDir, font.file);
96
+ if (!fs.existsSync(fontPath)) {
97
+ const response = await fetch(font.url);
98
+ if (!response.ok)
99
+ continue;
100
+ const buffer = await response.arrayBuffer();
101
+ fs.writeFileSync(fontPath, Buffer.from(buffer));
102
+ }
103
+ if (fs.existsSync(fontPath)) {
104
+ GlobalFonts.registerFromPath(fontPath, "Figtree");
105
+ }
106
+ }
107
+ fontsRegistered = true;
108
+ }
109
+ async function loadWrappedData(options) {
110
+ const year = options.year || new Date().getFullYear().toString();
111
+ const sources = options.sources || ["opencode", "claude", "codex", "gemini", "cursor"];
112
+ const localSources = sources.filter(s => s !== "cursor");
113
+ const includeCursor = sources.includes("cursor");
114
+ const since = `${year}-01-01`;
115
+ const until = `${year}-12-31`;
116
+ const pricingFetcher = new PricingFetcher();
117
+ const phase1Results = await Promise.allSettled([
118
+ pricingFetcher.fetchPricing(),
119
+ includeCursor && loadCursorCredentials() ? syncCursorCache() : Promise.resolve({ synced: false, rows: 0 }),
120
+ localSources.length > 0
121
+ ? parseLocalSourcesAsync({ sources: localSources, since, until, year })
122
+ : Promise.resolve({ messages: [], opencodeCount: 0, claudeCount: 0, codexCount: 0, geminiCount: 0, processingTimeMs: 0 }),
123
+ ]);
124
+ const cursorSync = phase1Results[1].status === "fulfilled"
125
+ ? phase1Results[1].value
126
+ : { synced: false, rows: 0 };
127
+ const localMessages = phase1Results[2].status === "fulfilled"
128
+ ? phase1Results[2].value
129
+ : null;
130
+ const emptyMessages = {
131
+ messages: [],
132
+ opencodeCount: 0,
133
+ claudeCount: 0,
134
+ codexCount: 0,
135
+ geminiCount: 0,
136
+ processingTimeMs: 0,
137
+ };
138
+ const [reportResult, graphResult] = await Promise.allSettled([
139
+ finalizeReportAsync({
140
+ localMessages: localMessages || emptyMessages,
141
+ pricing: pricingFetcher.toPricingEntries(),
142
+ includeCursor: includeCursor && cursorSync.synced,
143
+ since,
144
+ until,
145
+ year,
146
+ }),
147
+ finalizeGraphAsync({
148
+ localMessages: localMessages || emptyMessages,
149
+ pricing: pricingFetcher.toPricingEntries(),
150
+ includeCursor: includeCursor && cursorSync.synced,
151
+ since,
152
+ until,
153
+ year,
154
+ }),
155
+ ]);
156
+ if (reportResult.status === "rejected") {
157
+ throw new Error(`Failed to generate report: ${reportResult.reason}`);
158
+ }
159
+ if (graphResult.status === "rejected") {
160
+ throw new Error(`Failed to generate graph: ${graphResult.reason}`);
161
+ }
162
+ const report = reportResult.value;
163
+ const graph = graphResult.value;
164
+ const modelMap = new Map();
165
+ for (const entry of report.entries) {
166
+ const existing = modelMap.get(entry.model) || { cost: 0, tokens: 0 };
167
+ modelMap.set(entry.model, {
168
+ cost: existing.cost + entry.cost,
169
+ tokens: existing.tokens + entry.input + entry.output + entry.cacheRead + entry.cacheWrite,
170
+ });
171
+ }
172
+ const topModels = Array.from(modelMap.entries())
173
+ .map(([name, data]) => ({ name, ...data }))
174
+ .sort((a, b) => b.cost - a.cost)
175
+ .slice(0, 3);
176
+ const clientMap = new Map();
177
+ for (const entry of report.entries) {
178
+ const displayName = SOURCE_DISPLAY_NAMES[entry.source] || entry.source;
179
+ const existing = clientMap.get(displayName) || { cost: 0, tokens: 0 };
180
+ clientMap.set(displayName, {
181
+ cost: existing.cost + entry.cost,
182
+ tokens: existing.tokens + entry.input + entry.output + entry.cacheRead + entry.cacheWrite,
183
+ });
184
+ }
185
+ const topClients = Array.from(clientMap.entries())
186
+ .map(([name, data]) => ({ name, ...data }))
187
+ .sort((a, b) => b.cost - a.cost)
188
+ .slice(0, 3);
189
+ const maxCost = Math.max(...graph.contributions.map(c => c.totals.cost), 1);
190
+ const contributions = graph.contributions.map(c => ({
191
+ date: c.date,
192
+ level: calculateIntensity(c.totals.cost, maxCost),
193
+ }));
194
+ const sortedDates = contributions.map(c => c.date).filter(d => d.startsWith(year)).sort();
195
+ const { currentStreak, longestStreak } = calculateStreaks(sortedDates);
196
+ const firstDay = sortedDates.length > 0 ? sortedDates[0] : `${year}-01-01`;
197
+ return {
198
+ year,
199
+ firstDay,
200
+ totalDays: graph.summary.totalDays,
201
+ activeDays: graph.summary.activeDays,
202
+ totalTokens: graph.summary.totalTokens,
203
+ totalCost: graph.summary.totalCost,
204
+ currentStreak,
205
+ longestStreak,
206
+ topModels,
207
+ topClients,
208
+ contributions,
209
+ totalMessages: report.totalMessages,
210
+ };
211
+ }
212
+ function calculateIntensity(cost, maxCost) {
213
+ if (cost === 0 || maxCost === 0)
214
+ return 0;
215
+ const ratio = cost / maxCost;
216
+ if (ratio >= 0.75)
217
+ return 4;
218
+ if (ratio >= 0.5)
219
+ return 3;
220
+ if (ratio >= 0.25)
221
+ return 2;
222
+ return 1;
223
+ }
224
+ function calculateStreaks(sortedDates) {
225
+ if (sortedDates.length === 0)
226
+ return { currentStreak: 0, longestStreak: 0 };
227
+ const todayStr = new Date().toISOString().split("T")[0];
228
+ let currentStreak = 0;
229
+ let longestStreak = 0;
230
+ let streak = 1;
231
+ for (let i = sortedDates.length - 1; i >= 0; i--) {
232
+ if (i === sortedDates.length - 1) {
233
+ const daysDiff = dateDiffDays(sortedDates[i], todayStr);
234
+ if (daysDiff <= 1) {
235
+ currentStreak = 1;
236
+ }
237
+ else {
238
+ break;
239
+ }
240
+ }
241
+ else {
242
+ const daysDiff = dateDiffDays(sortedDates[i], sortedDates[i + 1]);
243
+ if (daysDiff === 1) {
244
+ currentStreak++;
245
+ }
246
+ else {
247
+ break;
248
+ }
249
+ }
250
+ }
251
+ for (let i = 1; i < sortedDates.length; i++) {
252
+ const daysDiff = dateDiffDays(sortedDates[i - 1], sortedDates[i]);
253
+ if (daysDiff === 1) {
254
+ streak++;
255
+ }
256
+ else {
257
+ longestStreak = Math.max(longestStreak, streak);
258
+ streak = 1;
259
+ }
260
+ }
261
+ longestStreak = Math.max(longestStreak, streak);
262
+ return { currentStreak, longestStreak };
263
+ }
264
+ function dateDiffDays(date1, date2) {
265
+ const d1 = new Date(date1 + "T00:00:00Z");
266
+ const d2 = new Date(date2 + "T00:00:00Z");
267
+ return Math.abs(Math.round((d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24)));
268
+ }
269
+ function formatTokens(tokens) {
270
+ if (tokens >= 1_000_000_000)
271
+ return `${(tokens / 1_000_000_000).toFixed(2)}B`;
272
+ if (tokens >= 1_000_000)
273
+ return `${(tokens / 1_000_000).toFixed(2)}M`;
274
+ if (tokens >= 1_000)
275
+ return `${(tokens / 1_000).toFixed(1)}K`;
276
+ return tokens.toString();
277
+ }
278
+ function formatCost(cost) {
279
+ if (cost >= 1000)
280
+ return `$${(cost / 1000).toFixed(2)}K`;
281
+ return `$${cost.toFixed(2)}`;
282
+ }
283
+ const MODEL_DISPLAY_NAMES = {
284
+ "claude-sonnet-4-20250514": "Claude Sonnet 4",
285
+ "claude-3-5-sonnet-20241022": "Claude 3.5 Sonnet",
286
+ "claude-3-5-sonnet-20240620": "Claude 3.5 Sonnet",
287
+ "claude-3-opus-20240229": "Claude 3 Opus",
288
+ "claude-3-haiku-20240307": "Claude 3 Haiku",
289
+ "gpt-4o": "GPT-4o",
290
+ "gpt-4o-mini": "GPT-4o Mini",
291
+ "gpt-4-turbo": "GPT-4 Turbo",
292
+ "o1": "o1",
293
+ "o1-mini": "o1 Mini",
294
+ "o1-preview": "o1 Preview",
295
+ "o3-mini": "o3 Mini",
296
+ "gemini-2.5-pro": "Gemini 2.5 Pro",
297
+ "gemini-2.5-flash": "Gemini 2.5 Flash",
298
+ "gemini-2.0-flash": "Gemini 2.0 Flash",
299
+ "gemini-1.5-pro": "Gemini 1.5 Pro",
300
+ "gemini-1.5-flash": "Gemini 1.5 Flash",
301
+ "grok-3": "Grok 3",
302
+ "grok-3-mini": "Grok 3 Mini",
303
+ };
304
+ function formatModelName(model) {
305
+ if (MODEL_DISPLAY_NAMES[model])
306
+ return MODEL_DISPLAY_NAMES[model];
307
+ const suffixMatch = model.match(/[-_](high|medium|low)$/i);
308
+ const suffix = suffixMatch ? ` ${suffixMatch[1].charAt(0).toUpperCase()}${suffixMatch[1].slice(1).toLowerCase()}` : "";
309
+ const cleaned = model
310
+ .replace(/-20\d{6,8}(-\d+)?$/, "")
311
+ .replace(/-\d{8}$/, "")
312
+ .replace(/:[-\w]+$/, "")
313
+ .replace(/[-_](high|medium|low)$/i, "")
314
+ .replace(/[-_]thinking$/i, "");
315
+ if (/claude[-_]?opus[-_]?4[-_.]?5/i.test(cleaned))
316
+ return `Claude Opus 4.5${suffix}`;
317
+ if (/claude[-_]?4[-_]?opus/i.test(cleaned))
318
+ return `Claude 4 Opus${suffix}`;
319
+ if (/claude[-_]?opus[-_]?4/i.test(cleaned))
320
+ return `Claude Opus 4${suffix}`;
321
+ if (/claude[-_]?sonnet[-_]?4[-_.]?5/i.test(cleaned))
322
+ return `Claude Sonnet 4.5${suffix}`;
323
+ if (/claude[-_]?4[-_]?sonnet/i.test(cleaned))
324
+ return `Claude 4 Sonnet${suffix}`;
325
+ if (/claude[-_]?sonnet[-_]?4/i.test(cleaned))
326
+ return `Claude Sonnet 4${suffix}`;
327
+ if (/claude[-_]?haiku[-_]?4[-_.]?5/i.test(cleaned))
328
+ return `Claude Haiku 4.5${suffix}`;
329
+ if (/claude[-_]?4[-_]?haiku/i.test(cleaned))
330
+ return `Claude 4 Haiku${suffix}`;
331
+ if (/claude[-_]?haiku[-_]?4/i.test(cleaned))
332
+ return `Claude Haiku 4${suffix}`;
333
+ if (/claude[-_]?3[-_.]?7[-_]?sonnet/i.test(cleaned))
334
+ return `Claude 3.7 Sonnet${suffix}`;
335
+ if (/claude[-_]?3[-_.]?5[-_]?sonnet/i.test(cleaned))
336
+ return `Claude 3.5 Sonnet${suffix}`;
337
+ if (/claude[-_]?3[-_.]?5[-_]?haiku/i.test(cleaned))
338
+ return `Claude 3.5 Haiku${suffix}`;
339
+ if (/claude[-_]?3[-_]?opus/i.test(cleaned))
340
+ return `Claude 3 Opus${suffix}`;
341
+ if (/claude[-_]?3[-_]?sonnet/i.test(cleaned))
342
+ return `Claude 3 Sonnet${suffix}`;
343
+ if (/claude[-_]?3[-_]?haiku/i.test(cleaned))
344
+ return `Claude 3 Haiku${suffix}`;
345
+ if (/gpt[-_]?5[-_.]?1/i.test(cleaned))
346
+ return `GPT-5.1${suffix}`;
347
+ if (/gpt[-_]?5/i.test(cleaned))
348
+ return `GPT-5${suffix}`;
349
+ if (/gpt[-_]?4[-_]?o[-_]?mini/i.test(cleaned))
350
+ return `GPT-4o Mini${suffix}`;
351
+ if (/gpt[-_]?4[-_]?o/i.test(cleaned))
352
+ return `GPT-4o${suffix}`;
353
+ if (/gpt[-_]?4[-_]?turbo/i.test(cleaned))
354
+ return `GPT-4 Turbo${suffix}`;
355
+ if (/gpt[-_]?4/i.test(cleaned))
356
+ return `GPT-4${suffix}`;
357
+ if (/^o1[-_]?mini/i.test(cleaned))
358
+ return `o1 Mini${suffix}`;
359
+ if (/^o1[-_]?preview/i.test(cleaned))
360
+ return `o1 Preview${suffix}`;
361
+ if (/^o3[-_]?mini/i.test(cleaned))
362
+ return `o3 Mini${suffix}`;
363
+ if (/^o1$/i.test(cleaned))
364
+ return `o1${suffix}`;
365
+ if (/^o3$/i.test(cleaned))
366
+ return `o3${suffix}`;
367
+ if (/gemini[-_]?3[-_]?pro/i.test(cleaned))
368
+ return `Gemini 3 Pro${suffix}`;
369
+ if (/gemini[-_]?3[-_]?flash/i.test(cleaned))
370
+ return `Gemini 3 Flash${suffix}`;
371
+ if (/gemini[-_]?2[-_.]?5[-_]?pro/i.test(cleaned))
372
+ return `Gemini 2.5 Pro${suffix}`;
373
+ if (/gemini[-_]?2[-_.]?5[-_]?flash/i.test(cleaned))
374
+ return `Gemini 2.5 Flash${suffix}`;
375
+ if (/gemini[-_]?2[-_.]?0[-_]?flash/i.test(cleaned))
376
+ return `Gemini 2.0 Flash${suffix}`;
377
+ if (/gemini[-_]?1[-_.]?5[-_]?pro/i.test(cleaned))
378
+ return `Gemini 1.5 Pro${suffix}`;
379
+ if (/gemini[-_]?1[-_.]?5[-_]?flash/i.test(cleaned))
380
+ return `Gemini 1.5 Flash${suffix}`;
381
+ if (/grok[-_]?3[-_]?mini/i.test(cleaned))
382
+ return `Grok Code 3 Mini${suffix}`;
383
+ if (/grok[-_]?3/i.test(cleaned))
384
+ return `Grok Code 3${suffix}`;
385
+ if (/grok/i.test(cleaned))
386
+ return `Grok Code${suffix}`;
387
+ if (/deepseek[-_]?v3/i.test(cleaned))
388
+ return `DeepSeek V3${suffix}`;
389
+ if (/deepseek[-_]?r1/i.test(cleaned))
390
+ return `DeepSeek R1${suffix}`;
391
+ if (/deepseek/i.test(cleaned))
392
+ return `DeepSeek${suffix}`;
393
+ const baseName = cleaned
394
+ .replace(/^claude[-_]/i, "Claude ")
395
+ .replace(/^gpt[-_]/i, "GPT-")
396
+ .replace(/^gemini[-_]/i, "Gemini ")
397
+ .replace(/^grok[-_]/i, "Grok Code ")
398
+ .split(/[-_]/)
399
+ .filter(Boolean)
400
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
401
+ .join(" ")
402
+ .trim();
403
+ return `${baseName}${suffix}`;
404
+ }
405
+ function drawRoundedRect(ctx, x, y, width, height, radius) {
406
+ ctx.beginPath();
407
+ ctx.moveTo(x + radius, y);
408
+ ctx.lineTo(x + width - radius, y);
409
+ ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
410
+ ctx.lineTo(x + width, y + height - radius);
411
+ ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
412
+ ctx.lineTo(x + radius, y + height);
413
+ ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
414
+ ctx.lineTo(x, y + radius);
415
+ ctx.quadraticCurveTo(x, y, x + radius, y);
416
+ ctx.closePath();
417
+ }
418
+ function drawContributionGraph(ctx, data, x, y, width, height) {
419
+ const year = parseInt(data.year);
420
+ const startDate = new Date(year, 0, 1);
421
+ const endDate = new Date(year, 11, 31);
422
+ const contribMap = new Map(data.contributions.map(c => [c.date, c.level]));
423
+ const DAYS_PER_ROW = 14;
424
+ const totalDays = Math.ceil((endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24)) + 1;
425
+ const totalRows = Math.ceil(totalDays / DAYS_PER_ROW);
426
+ const cellSize = Math.min(Math.floor(height / totalRows), Math.floor(width / DAYS_PER_ROW));
427
+ const dotRadius = (cellSize - 2 * SCALE) / 2;
428
+ const graphWidth = DAYS_PER_ROW * cellSize;
429
+ const graphHeight = totalRows * cellSize;
430
+ const offsetX = x + (width - graphWidth) / 2;
431
+ const offsetY = y;
432
+ const gradeColors = [COLORS.grade0, COLORS.grade1, COLORS.grade2, COLORS.grade3, COLORS.grade4];
433
+ const currentDate = new Date(startDate);
434
+ let dayIndex = 0;
435
+ while (currentDate <= endDate) {
436
+ const dateStr = currentDate.toISOString().split("T")[0];
437
+ const level = contribMap.get(dateStr) || 0;
438
+ const col = dayIndex % DAYS_PER_ROW;
439
+ const row = Math.floor(dayIndex / DAYS_PER_ROW);
440
+ const centerX = offsetX + col * cellSize + cellSize / 2;
441
+ const centerY = offsetY + row * cellSize + cellSize / 2;
442
+ ctx.beginPath();
443
+ ctx.arc(centerX, centerY, dotRadius, 0, Math.PI * 2);
444
+ ctx.fillStyle = gradeColors[level];
445
+ ctx.fill();
446
+ currentDate.setDate(currentDate.getDate() + 1);
447
+ dayIndex++;
448
+ }
449
+ }
450
+ function drawStat(ctx, x, y, label, value) {
451
+ ctx.fillStyle = COLORS.textSecondary;
452
+ ctx.font = `${18 * SCALE}px Figtree, sans-serif`;
453
+ ctx.fillText(label, x, y);
454
+ ctx.fillStyle = COLORS.textPrimary;
455
+ ctx.font = `bold ${36 * SCALE}px Figtree, sans-serif`;
456
+ ctx.fillText(value, x, y + 48 * SCALE);
457
+ }
458
+ function formatDate(dateStr) {
459
+ const date = new Date(dateStr + "T00:00:00");
460
+ return date.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" });
461
+ }
462
+ async function generateWrappedImage(data, options = {}) {
463
+ await ensureFontsLoaded();
464
+ const canvas = createCanvas(IMAGE_WIDTH, IMAGE_HEIGHT);
465
+ const ctx = canvas.getContext("2d");
466
+ ctx.fillStyle = COLORS.background;
467
+ ctx.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
468
+ const leftWidth = IMAGE_WIDTH * 0.45;
469
+ const rightWidth = IMAGE_WIDTH * 0.55;
470
+ const rightX = leftWidth;
471
+ let yPos = PADDING + 24 * SCALE;
472
+ ctx.fillStyle = COLORS.textSecondary;
473
+ ctx.font = `${24 * SCALE}px Figtree, sans-serif`;
474
+ ctx.fillText(`Tracking since ${formatDate(data.firstDay)}`, PADDING, yPos);
475
+ yPos += 60 * SCALE;
476
+ ctx.fillStyle = COLORS.textSecondary;
477
+ ctx.font = `${20 * SCALE}px Figtree, sans-serif`;
478
+ ctx.fillText("Total Tokens", PADDING, yPos);
479
+ yPos += 64 * SCALE;
480
+ ctx.fillStyle = COLORS.grade4;
481
+ ctx.font = `bold ${56 * SCALE}px Figtree, sans-serif`;
482
+ const totalTokensDisplay = options.short
483
+ ? formatTokens(data.totalTokens)
484
+ : data.totalTokens.toLocaleString();
485
+ ctx.fillText(totalTokensDisplay, PADDING, yPos);
486
+ yPos += 50 * SCALE + 40 * SCALE;
487
+ ctx.fillStyle = COLORS.textSecondary;
488
+ ctx.font = `${20 * SCALE}px Figtree, sans-serif`;
489
+ ctx.fillText("Top Models", PADDING, yPos);
490
+ yPos += 48 * SCALE;
491
+ for (let i = 0; i < data.topModels.length; i++) {
492
+ const model = data.topModels[i];
493
+ ctx.fillStyle = COLORS.textPrimary;
494
+ ctx.font = `bold ${32 * SCALE}px Figtree, sans-serif`;
495
+ ctx.fillText(`${i + 1}`, PADDING, yPos);
496
+ ctx.font = `${32 * SCALE}px Figtree, sans-serif`;
497
+ ctx.fillText(formatModelName(model.name), PADDING + 40 * SCALE, yPos);
498
+ yPos += 50 * SCALE;
499
+ }
500
+ yPos += 40 * SCALE;
501
+ ctx.fillStyle = COLORS.textSecondary;
502
+ ctx.font = `${20 * SCALE}px Figtree, sans-serif`;
503
+ ctx.fillText("Top Clients", PADDING, yPos);
504
+ yPos += 48 * SCALE;
505
+ const logoSize = 32 * SCALE;
506
+ for (let i = 0; i < data.topClients.length; i++) {
507
+ const client = data.topClients[i];
508
+ ctx.fillStyle = COLORS.textPrimary;
509
+ ctx.font = `bold ${32 * SCALE}px Figtree, sans-serif`;
510
+ ctx.fillText(`${i + 1}`, PADDING, yPos);
511
+ const logoUrl = CLIENT_LOGO_URLS[client.name];
512
+ if (logoUrl) {
513
+ try {
514
+ const filename = `client-${client.name.toLowerCase().replace(/\s+/g, "-")}@2x.png`;
515
+ const logoPath = await fetchAndCacheImage(logoUrl, filename);
516
+ const logo = await loadImage(logoPath);
517
+ const logoY = yPos - logoSize + 6 * SCALE;
518
+ const logoX = PADDING + 40 * SCALE;
519
+ const logoRadius = 6 * SCALE;
520
+ ctx.save();
521
+ drawRoundedRect(ctx, logoX, logoY, logoSize, logoSize, logoRadius);
522
+ ctx.clip();
523
+ ctx.drawImage(logo, logoX, logoY, logoSize, logoSize);
524
+ ctx.restore();
525
+ drawRoundedRect(ctx, logoX, logoY, logoSize, logoSize, logoRadius);
526
+ ctx.strokeStyle = "#141A25";
527
+ ctx.lineWidth = 1 * SCALE;
528
+ ctx.stroke();
529
+ }
530
+ catch {
531
+ }
532
+ }
533
+ ctx.font = `${32 * SCALE}px Figtree, sans-serif`;
534
+ ctx.fillText(client.name, PADDING + 40 * SCALE + logoSize + 12 * SCALE, yPos);
535
+ yPos += 50 * SCALE;
536
+ }
537
+ yPos += 40 * SCALE;
538
+ const statsStartY = yPos;
539
+ const statWidth = (leftWidth - PADDING * 2) / 2;
540
+ drawStat(ctx, PADDING, statsStartY, "Messages", data.totalMessages.toLocaleString());
541
+ drawStat(ctx, PADDING + statWidth, statsStartY, "Active Days", `${data.activeDays}`);
542
+ drawStat(ctx, PADDING, statsStartY + 100 * SCALE, "Cost", formatCost(data.totalCost));
543
+ drawStat(ctx, PADDING + statWidth, statsStartY + 100 * SCALE, "Streak", `${data.longestStreak}d`);
544
+ const footerBottomY = IMAGE_HEIGHT - PADDING;
545
+ const tokscaleLogoHeight = 72 * SCALE;
546
+ drawContributionGraph(ctx, data, rightX, PADDING, rightWidth - PADDING, IMAGE_HEIGHT - PADDING * 2);
547
+ try {
548
+ const logoPath = await fetchSvgAndConvertToPng(TOKSCALE_LOGO_SVG_URL, "tokscale-logo@2x.png", TOKSCALE_LOGO_PNG_SIZE * SCALE);
549
+ const tokscaleLogo = await loadImage(logoPath);
550
+ const logoWidth = (tokscaleLogo.width / tokscaleLogo.height) * tokscaleLogoHeight;
551
+ ctx.fillStyle = COLORS.textSecondary;
552
+ ctx.font = `${18 * SCALE}px Figtree, sans-serif`;
553
+ ctx.fillText("github.com/junhoyeo/tokscale", PADDING, footerBottomY);
554
+ const logoY = footerBottomY - 18 * SCALE - 16 * SCALE - tokscaleLogoHeight;
555
+ ctx.drawImage(tokscaleLogo, PADDING, logoY, logoWidth, tokscaleLogoHeight);
556
+ }
557
+ catch {
558
+ }
559
+ return canvas.toBuffer("image/png");
560
+ }
561
+ export async function generateWrapped(options) {
562
+ const data = await loadWrappedData(options);
563
+ const imageBuffer = await generateWrappedImage(data, { short: options.short });
564
+ const outputPath = options.output || `tokscale-${data.year}-wrapped.png`;
565
+ const absolutePath = path.resolve(outputPath);
566
+ fs.writeFileSync(absolutePath, imageBuffer);
567
+ return absolutePath;
568
+ }
569
+ //# sourceMappingURL=wrapped.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapped.js","sourceRoot":"","sources":["../src/wrapped.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tokscale/cli",
3
- "version": "1.0.11",
3
+ "version": "1.0.13",
4
4
  "description": "A high-performance CLI tool and visualization dashboard for tracking AI coding assistant token usage and costs across multiple platforms.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,10 +27,12 @@
27
27
  "prepublishOnly": "bun run build"
28
28
  },
29
29
  "dependencies": {
30
- "@tokscale/core": "1.0.11",
30
+ "@napi-rs/canvas": "^0.1.68",
31
31
  "@opentui/core": "0.1.60",
32
32
  "@opentui/react": "^0.1.60",
33
33
  "@opentui/solid": "^0.1.60",
34
+ "@resvg/resvg-js": "^2.6.2",
35
+ "@tokscale/core": "1.0.12",
34
36
  "cli-table3": "^0.6.5",
35
37
  "clipboardy": "^5.0.2",
36
38
  "commander": "^14.0.2",