@tokscale/cli 1.1.0 → 1.1.2

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/dist/submit.js CHANGED
@@ -35,7 +35,7 @@ async function checkGitHubStarStatus() {
35
35
  }
36
36
  async function attemptToStarRepo() {
37
37
  try {
38
- await execAsync("gh repo star junhoyeo/tokscale");
38
+ await execAsync("gh api --silent --method PUT /user/starred/junhoyeo/tokscale >/dev/null 2>&1 || true");
39
39
  return true;
40
40
  }
41
41
  catch {
@@ -126,17 +126,13 @@ async function handleStarPrompt(username) {
126
126
  }
127
127
  }
128
128
  export async function submit(options = {}) {
129
- const submitStart = performance.now();
130
- const timing = {};
131
129
  const credentials = loadCredentials();
132
130
  if (!credentials) {
133
131
  console.log(pc.yellow("\n Not logged in."));
134
132
  console.log(pc.gray(" Run 'tokscale login' first.\n"));
135
133
  process.exit(1);
136
134
  }
137
- let t0 = performance.now();
138
135
  await handleStarPrompt(credentials.username);
139
- timing["star-prompt"] = performance.now() - t0;
140
136
  console.log(pc.cyan("\n Tokscale - Submit Usage Data\n"));
141
137
  console.log(pc.gray(" Scanning local session data..."));
142
138
  const hasFilter = options.opencode || options.claude || options.codex || options.gemini || options.cursor || options.amp || options.droid;
@@ -166,7 +162,6 @@ export async function submit(options = {}) {
166
162
  try {
167
163
  // Two-phase processing (same as TUI) for consistency:
168
164
  // Phase 1: Parse local sources + sync cursor in parallel
169
- t0 = performance.now();
170
165
  const [localMessages, cursorSync] = await Promise.all([
171
166
  parseLocalSourcesAsync({
172
167
  sources: localSources,
@@ -178,14 +173,12 @@ export async function submit(options = {}) {
178
173
  ? syncCursorCache()
179
174
  : Promise.resolve({ synced: false, rows: 0, error: undefined }),
180
175
  ]);
181
- timing["parse-local+cursor-sync"] = performance.now() - t0;
182
176
  if (includeCursor && cursorSync.error && (cursorSync.synced || hasCursorUsageCache())) {
183
177
  const prefix = cursorSync.synced ? "Cursor sync warning" : "Cursor sync failed; using cached data";
184
178
  console.log(pc.yellow(` ${prefix}: ${cursorSync.error}`));
185
179
  }
186
180
  // Phase 2: Finalize with pricing (combines local + cursor)
187
181
  // Single subprocess call ensures consistent pricing for both report and graph
188
- t0 = performance.now();
189
182
  const { report, graph } = await finalizeReportAndGraphAsync({
190
183
  localMessages,
191
184
  includeCursor: includeCursor && (cursorSync.synced || hasCursorUsageCache()),
@@ -193,7 +186,6 @@ export async function submit(options = {}) {
193
186
  until: options.until,
194
187
  year: options.year,
195
188
  });
196
- timing["finalize-report+graph"] = performance.now() - t0;
197
189
  // Use graph structure for submission, report's cost for display
198
190
  data = graph;
199
191
  data.summary.totalCost = report.totalCost;
@@ -210,8 +202,6 @@ export async function submit(options = {}) {
210
202
  console.log(pc.gray(` Total cost: ${formatCurrency(data.summary.totalCost)}`));
211
203
  console.log(pc.gray(` Sources: ${data.summary.sources.join(", ")}`));
212
204
  console.log(pc.gray(` Models: ${data.summary.models.length} models`));
213
- console.log(pc.gray(` Contributions: ${data.contributions.length} days`));
214
- console.log(pc.gray(` Payload size: ${(JSON.stringify(data).length / 1024).toFixed(1)} KB`));
215
205
  console.log();
216
206
  if (data.summary.totalTokens === 0) {
217
207
  console.log(pc.yellow(" No usage data found to submit.\n"));
@@ -226,20 +216,15 @@ export async function submit(options = {}) {
226
216
  console.log(pc.gray(" Submitting to server..."));
227
217
  const baseUrl = getApiBaseUrl();
228
218
  try {
229
- t0 = performance.now();
230
- const body = JSON.stringify(data);
231
- timing["json-serialize"] = performance.now() - t0;
232
- t0 = performance.now();
233
219
  const response = await fetch(`${baseUrl}/api/submit`, {
234
220
  method: "POST",
235
221
  headers: {
236
222
  "Content-Type": "application/json",
237
223
  Authorization: `Bearer ${credentials.token}`,
238
224
  },
239
- body,
225
+ body: JSON.stringify(data),
240
226
  });
241
227
  const result = await response.json();
242
- timing["server-roundtrip"] = performance.now() - t0;
243
228
  if (!response.ok) {
244
229
  console.error(pc.red(`\n Error: ${result.error || "Submission failed"}`));
245
230
  if (result.details) {
@@ -274,14 +259,5 @@ export async function submit(options = {}) {
274
259
  console.error(pc.gray(` ${error.message}\n`));
275
260
  process.exit(1);
276
261
  }
277
- // Timing summary
278
- timing["total"] = performance.now() - submitStart;
279
- console.log(pc.gray(" ⏱ Timing breakdown:"));
280
- for (const [label, ms] of Object.entries(timing)) {
281
- const formatted = ms < 1000 ? `${ms.toFixed(0)}ms` : `${(ms / 1000).toFixed(2)}s`;
282
- const bar = "█".repeat(Math.max(1, Math.round(ms / timing["total"] * 20)));
283
- console.log(pc.gray(` ${label.padEnd(24)} ${formatted.padStart(8)} ${bar}`));
284
- }
285
- console.log();
286
262
  }
287
263
  //# sourceMappingURL=submit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"submit.js","sourceRoot":"","sources":["../src/submit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../src/submit.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.1.0",
3
+ "version": "1.1.2",
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",
@@ -31,7 +31,7 @@
31
31
  "@opentui/core": "0.1.60",
32
32
  "@opentui/solid": "^0.1.60",
33
33
  "@resvg/resvg-js": "^2.6.2",
34
- "@tokscale/core": "1.1.0",
34
+ "@tokscale/core": "1.1.2",
35
35
  "cli-table3": "^0.6.5",
36
36
  "clipboardy": "^5.0.2",
37
37
  "commander": "^14.0.2",
package/src/cli.ts CHANGED
@@ -51,7 +51,11 @@ import {
51
51
  type ParsedMessages,
52
52
  } from "./native.js";
53
53
  import { createSpinner } from "./spinner.js";
54
+ import { spawn } from "node:child_process";
55
+ import { randomUUID } from "node:crypto";
54
56
  import * as fs from "node:fs";
57
+ import * as os from "node:os";
58
+ import * as path from "node:path";
55
59
  import { performance } from "node:perf_hooks";
56
60
  import type { SourceType } from "./graph-types.js";
57
61
  import type { TUIOptions, TabType } from "./tui/types/index.js";
@@ -193,6 +197,217 @@ function getDateRangeLabel(options: DateFilterOptions): string | null {
193
197
  return null;
194
198
  }
195
199
 
200
+ function getHeadlessRoots(homeDir: string): string[] {
201
+ const override = process.env.TOKSCALE_HEADLESS_DIR;
202
+ if (override && override.trim()) {
203
+ return [override];
204
+ }
205
+
206
+ const roots = [
207
+ path.join(homeDir, ".config", "tokscale", "headless"),
208
+ path.join(homeDir, "Library", "Application Support", "tokscale", "headless"),
209
+ ];
210
+
211
+ return Array.from(new Set(roots));
212
+ }
213
+
214
+ function describePath(targetPath: string): string {
215
+ return fs.existsSync(targetPath) ? targetPath : `${targetPath} (missing)`;
216
+ }
217
+
218
+ type HeadlessFormat = "json" | "jsonl";
219
+ type HeadlessSource = "codex";
220
+
221
+ const HEADLESS_SOURCES: HeadlessSource[] = ["codex"];
222
+
223
+ function normalizeHeadlessSource(source: string): HeadlessSource | null {
224
+ const normalized = source.toLowerCase();
225
+ return HEADLESS_SOURCES.includes(normalized as HeadlessSource)
226
+ ? (normalized as HeadlessSource)
227
+ : null;
228
+ }
229
+
230
+ function resolveHeadlessFormat(
231
+ source: HeadlessSource,
232
+ args: string[],
233
+ override?: string
234
+ ): HeadlessFormat {
235
+ if (override === "json" || override === "jsonl") {
236
+ return override;
237
+ }
238
+
239
+ return "jsonl";
240
+ }
241
+
242
+ function applyHeadlessDefaults(
243
+ source: HeadlessSource,
244
+ args: string[],
245
+ format: HeadlessFormat,
246
+ autoFlags: boolean
247
+ ): string[] {
248
+ if (!autoFlags) return args;
249
+
250
+ const updated = [...args];
251
+
252
+ if (source === "codex" && !updated.includes("--json")) {
253
+ updated.push("--json");
254
+ }
255
+
256
+ return updated;
257
+ }
258
+
259
+ function buildHeadlessOutputPath(
260
+ headlessRoots: string[],
261
+ source: HeadlessSource,
262
+ format: HeadlessFormat,
263
+ outputPath?: string
264
+ ): string {
265
+ if (outputPath) {
266
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
267
+ return outputPath;
268
+ }
269
+
270
+ const root = headlessRoots[0] || path.join(os.homedir(), ".config", "tokscale", "headless");
271
+ const dir = path.join(root, source);
272
+ fs.mkdirSync(dir, { recursive: true });
273
+
274
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
275
+ const id = randomUUID().replace(/-/g, "").slice(0, 8);
276
+ const filename = `${source}-${stamp}-${id}.${format}`;
277
+ return path.join(dir, filename);
278
+ }
279
+
280
+ function printHeadlessHelp(): void {
281
+ console.log("\n Usage: tokscale headless codex [args...]");
282
+ console.log(" Options:");
283
+ console.log(" --format <json|jsonl> Override output format");
284
+ console.log(" --output <file> Write captured output to file");
285
+ console.log(" --no-auto-flags Do not auto-add JSON output flags");
286
+ console.log("\n Examples:");
287
+ console.log(" tokscale headless codex exec -m gpt-5");
288
+ console.log();
289
+ }
290
+
291
+ async function runHeadlessCapture(argv: string[]): Promise<void> {
292
+ const sourceArg = argv[1];
293
+ if (!sourceArg || sourceArg === "--help" || sourceArg === "-h") {
294
+ printHeadlessHelp();
295
+ return;
296
+ }
297
+
298
+ const source = normalizeHeadlessSource(sourceArg);
299
+ if (!source) {
300
+ console.error(`\n Error: Unknown headless source '${sourceArg}'.`);
301
+ printHeadlessHelp();
302
+ process.exit(1);
303
+ }
304
+
305
+ const rawArgs = argv.slice(2);
306
+ let outputPath: string | undefined;
307
+ let formatOverride: HeadlessFormat | undefined;
308
+ let autoFlags = true;
309
+ const cmdArgs: string[] = [];
310
+
311
+ for (let i = 0; i < rawArgs.length; i += 1) {
312
+ const arg = rawArgs[i];
313
+ if (arg === "--") continue;
314
+ if ((arg === "--help" || arg === "-h") && cmdArgs.length === 0) {
315
+ printHeadlessHelp();
316
+ return;
317
+ }
318
+ if (arg === "--output") {
319
+ const value = rawArgs[i + 1];
320
+ if (!value) {
321
+ console.error("\n Error: --output requires a file path.");
322
+ process.exit(1);
323
+ }
324
+ outputPath = value;
325
+ i += 1;
326
+ continue;
327
+ }
328
+ if (arg === "--format") {
329
+ const format = rawArgs[i + 1];
330
+ if (!format) {
331
+ console.error("\n Error: --format requires a value (json or jsonl).");
332
+ process.exit(1);
333
+ }
334
+ if (format !== "json" && format !== "jsonl") {
335
+ console.error(`\n Error: Invalid format '${format}'. Use json or jsonl.`);
336
+ process.exit(1);
337
+ }
338
+ formatOverride = format as HeadlessFormat;
339
+ i += 1;
340
+ continue;
341
+ }
342
+ if (arg === "--no-auto-flags") {
343
+ autoFlags = false;
344
+ continue;
345
+ }
346
+ cmdArgs.push(arg);
347
+ }
348
+
349
+ if (cmdArgs.length === 0) {
350
+ console.error("\n Error: Missing CLI arguments to execute.");
351
+ printHeadlessHelp();
352
+ process.exit(1);
353
+ }
354
+
355
+ const format = resolveHeadlessFormat(source, cmdArgs, formatOverride);
356
+ const finalArgs = applyHeadlessDefaults(source, cmdArgs, format, autoFlags);
357
+ const headlessRoots = getHeadlessRoots(os.homedir());
358
+ const output = buildHeadlessOutputPath(headlessRoots, source, format, outputPath);
359
+
360
+ console.log(pc.cyan("\n Headless capture"));
361
+ console.log(pc.gray(` source: ${source}`));
362
+ console.log(pc.gray(` output: ${output}`));
363
+ console.log();
364
+
365
+ const proc = spawn(source, finalArgs, {
366
+ stdio: ["inherit", "pipe", "inherit"],
367
+ });
368
+
369
+ if (!proc.stdout) {
370
+ console.error("\n Error: Failed to capture stdout from command.");
371
+ process.exit(1);
372
+ }
373
+
374
+ const outputStream = fs.createWriteStream(output, { encoding: "utf-8" });
375
+ const outputFinished = new Promise<void>((resolve, reject) => {
376
+ outputStream.on("finish", () => resolve());
377
+ outputStream.on("error", reject);
378
+ });
379
+ proc.stdout.pipe(outputStream);
380
+ let exitCode: number;
381
+ try {
382
+ exitCode = await new Promise<number>((resolve, reject) => {
383
+ proc.on("error", reject);
384
+ proc.on("close", (code) => resolve(code ?? 1));
385
+ });
386
+ } catch (err) {
387
+ outputStream.destroy();
388
+ const message = err instanceof Error ? err.message : String(err);
389
+ console.error(`\n Error: Failed to run '${source}': ${message}`);
390
+ process.exit(1);
391
+ }
392
+
393
+ outputStream.end();
394
+
395
+ try {
396
+ await outputFinished;
397
+ } catch (err) {
398
+ const message = err instanceof Error ? err.message : String(err);
399
+ console.error(`\n Error: Failed to write headless output: ${message}`);
400
+ process.exit(1);
401
+ }
402
+
403
+ if (exitCode !== 0) {
404
+ process.exit(exitCode);
405
+ }
406
+
407
+ console.log(pc.green(` Saved headless output to ${output}`));
408
+ console.log();
409
+ }
410
+
196
411
  function buildTUIOptions(
197
412
  options: FilterOptions & DateFilterOptions,
198
413
  initialTab?: TabType
@@ -289,6 +504,142 @@ async function main() {
289
504
  }
290
505
  });
291
506
 
507
+ program
508
+ .command("sources")
509
+ .description("Show local scan locations and Codex headless paths")
510
+ .option("--json", "Output as JSON (for scripting)")
511
+ .action(async (options) => {
512
+ const homeDir = os.homedir();
513
+ const headlessRoots = getHeadlessRoots(homeDir);
514
+
515
+ const claudeSessions = path.join(homeDir, ".claude", "projects");
516
+ const codexHome = process.env.CODEX_HOME || path.join(homeDir, ".codex");
517
+ const codexSessions = path.join(codexHome, "sessions");
518
+ const geminiSessions = path.join(homeDir, ".gemini", "tmp");
519
+
520
+ let localMessages: ParsedMessages | null = null;
521
+ try {
522
+ localMessages = await parseLocalSourcesAsync({
523
+ homeDir,
524
+ sources: ["claude", "codex", "gemini"],
525
+ });
526
+ } catch (e) {
527
+ console.error(`Error: ${(e as Error).message}`);
528
+ process.exit(1);
529
+ }
530
+
531
+ const headlessCounts = {
532
+ codex: 0,
533
+ };
534
+
535
+ for (const message of localMessages.messages) {
536
+ if (message.agent === "headless" && message.source === "codex") {
537
+ headlessCounts.codex += 1;
538
+ }
539
+ }
540
+
541
+ const sourceRows: Array<{
542
+ source: "claude" | "codex" | "gemini";
543
+ label: string;
544
+ sessionsPath: string;
545
+ messageCount: number;
546
+ headlessSupported: boolean;
547
+ headlessPaths: string[];
548
+ headlessMessageCount: number;
549
+ }> = [
550
+ {
551
+ source: "claude",
552
+ label: "Claude Code",
553
+ sessionsPath: claudeSessions,
554
+ messageCount: localMessages.claudeCount,
555
+ headlessSupported: false,
556
+ headlessPaths: [],
557
+ headlessMessageCount: 0,
558
+ },
559
+ {
560
+ source: "codex",
561
+ label: "Codex CLI",
562
+ sessionsPath: codexSessions,
563
+ headlessPaths: headlessRoots.map((root) => path.join(root, "codex")),
564
+ messageCount: localMessages.codexCount,
565
+ headlessMessageCount: headlessCounts.codex,
566
+ headlessSupported: true,
567
+ },
568
+ {
569
+ source: "gemini",
570
+ label: "Gemini CLI",
571
+ sessionsPath: geminiSessions,
572
+ messageCount: localMessages.geminiCount,
573
+ headlessSupported: false,
574
+ headlessPaths: [],
575
+ headlessMessageCount: 0,
576
+ },
577
+ ];
578
+
579
+ if (options.json) {
580
+ const payload = {
581
+ headlessRoots,
582
+ sources: sourceRows.map((row) => ({
583
+ source: row.source,
584
+ label: row.label,
585
+ sessionsPath: row.sessionsPath,
586
+ sessionsPathExists: fs.existsSync(row.sessionsPath),
587
+ messageCount: row.messageCount,
588
+ headlessSupported: row.headlessSupported,
589
+ headlessPaths: row.headlessSupported
590
+ ? row.headlessPaths.map((headlessPath) => ({
591
+ path: headlessPath,
592
+ exists: fs.existsSync(headlessPath),
593
+ }))
594
+ : [],
595
+ headlessMessageCount: row.headlessSupported ? row.headlessMessageCount : 0,
596
+ })),
597
+ note: "Headless capture is supported for Codex CLI only.",
598
+ };
599
+ console.log(JSON.stringify(payload, null, 2));
600
+ return;
601
+ }
602
+
603
+ console.log(pc.cyan("\n Local sources & Codex headless capture"));
604
+ console.log(pc.gray(` Headless roots: ${headlessRoots.join(", ")}`));
605
+ console.log();
606
+
607
+ for (const row of sourceRows) {
608
+ console.log(pc.white(` ${row.label}`));
609
+ console.log(pc.gray(` sessions: ${describePath(row.sessionsPath)}`));
610
+ if (row.headlessSupported) {
611
+ console.log(
612
+ pc.gray(
613
+ ` headless: ${row.headlessPaths.map(describePath).join(", ")}`
614
+ )
615
+ );
616
+ console.log(
617
+ pc.gray(
618
+ ` messages: ${formatNumber(row.messageCount)} (headless: ${formatNumber(
619
+ row.headlessMessageCount
620
+ )})`
621
+ )
622
+ );
623
+ } else {
624
+ console.log(pc.gray(` messages: ${formatNumber(row.messageCount)}`));
625
+ }
626
+ console.log();
627
+ }
628
+
629
+ console.log(
630
+ pc.gray(
631
+ " Note: Headless capture is supported for Codex CLI only."
632
+ )
633
+ );
634
+ console.log();
635
+ });
636
+
637
+ program
638
+ .command("headless")
639
+ .description("Run a CLI in headless mode and capture stdout")
640
+ .argument("<source>", "Source CLI to capture (currently only 'codex' is supported)")
641
+ .argument("[args...]", "Arguments passed to the CLI");
642
+
292
643
  program
293
644
  .command("graph")
294
645
  .description("Export contribution graph data as JSON")
@@ -502,11 +853,15 @@ async function main() {
502
853
 
503
854
  // Check if a subcommand was provided
504
855
  const args = process.argv.slice(2);
856
+ if (args[0] === "headless") {
857
+ await runHeadlessCapture(args);
858
+ return;
859
+ }
505
860
  const firstArg = args[0] || '';
506
861
  // Global flags should go to main program
507
862
  const isGlobalFlag = ['--help', '-h', '--version', '-V'].includes(firstArg);
508
863
  const hasSubcommand = args.length > 0 && !firstArg.startsWith('-');
509
- const knownCommands = ['monthly', 'models', 'graph', 'wrapped', 'login', 'logout', 'whoami', 'submit', 'cursor', 'tui', 'pricing', 'help'];
864
+ const knownCommands = ['monthly', 'models', 'sources', 'headless', 'graph', 'wrapped', 'login', 'logout', 'whoami', 'submit', 'cursor', 'tui', 'pricing', 'help'];
510
865
  const isKnownCommand = hasSubcommand && knownCommands.includes(firstArg);
511
866
 
512
867
  if (isKnownCommand || isGlobalFlag) {
package/src/native.ts CHANGED
@@ -356,6 +356,7 @@ export interface ParsedMessages {
356
356
  }
357
357
 
358
358
  export interface LocalParseOptions {
359
+ homeDir?: string;
359
360
  sources?: SourceType[];
360
361
  since?: string;
361
362
  until?: string;
@@ -558,7 +559,7 @@ export async function parseLocalSourcesAsync(options: LocalParseOptions): Promis
558
559
  }
559
560
 
560
561
  const nativeOptions: NativeLocalParseOptions = {
561
- homeDir: undefined,
562
+ homeDir: options.homeDir,
562
563
  sources: options.sources,
563
564
  since: options.since,
564
565
  until: options.until,
package/src/submit.ts CHANGED
@@ -74,7 +74,7 @@ async function checkGitHubStarStatus(): Promise<boolean> {
74
74
 
75
75
  async function attemptToStarRepo(): Promise<boolean> {
76
76
  try {
77
- await execAsync("gh repo star junhoyeo/tokscale");
77
+ await execAsync("gh api --silent --method PUT /user/starred/junhoyeo/tokscale >/dev/null 2>&1 || true");
78
78
  return true;
79
79
  } catch {
80
80
  return false;
@@ -179,9 +179,6 @@ async function handleStarPrompt(username: string): Promise<void> {
179
179
  }
180
180
 
181
181
  export async function submit(options: SubmitOptions = {}): Promise<void> {
182
- const submitStart = performance.now();
183
- const timing: Record<string, number> = {};
184
-
185
182
  const credentials = loadCredentials();
186
183
  if (!credentials) {
187
184
  console.log(pc.yellow("\n Not logged in."));
@@ -189,9 +186,7 @@ export async function submit(options: SubmitOptions = {}): Promise<void> {
189
186
  process.exit(1);
190
187
  }
191
188
 
192
- let t0 = performance.now();
193
189
  await handleStarPrompt(credentials.username);
194
- timing["star-prompt"] = performance.now() - t0;
195
190
 
196
191
  console.log(pc.cyan("\n Tokscale - Submit Usage Data\n"));
197
192
 
@@ -219,7 +214,6 @@ export async function submit(options: SubmitOptions = {}): Promise<void> {
219
214
  try {
220
215
  // Two-phase processing (same as TUI) for consistency:
221
216
  // Phase 1: Parse local sources + sync cursor in parallel
222
- t0 = performance.now();
223
217
  const [localMessages, cursorSync] = await Promise.all([
224
218
  parseLocalSourcesAsync({
225
219
  sources: localSources,
@@ -231,7 +225,6 @@ export async function submit(options: SubmitOptions = {}): Promise<void> {
231
225
  ? syncCursorCache()
232
226
  : Promise.resolve({ synced: false, rows: 0, error: undefined }),
233
227
  ]);
234
- timing["parse-local+cursor-sync"] = performance.now() - t0;
235
228
 
236
229
  if (includeCursor && cursorSync.error && (cursorSync.synced || hasCursorUsageCache())) {
237
230
  const prefix = cursorSync.synced ? "Cursor sync warning" : "Cursor sync failed; using cached data";
@@ -240,7 +233,6 @@ export async function submit(options: SubmitOptions = {}): Promise<void> {
240
233
 
241
234
  // Phase 2: Finalize with pricing (combines local + cursor)
242
235
  // Single subprocess call ensures consistent pricing for both report and graph
243
- t0 = performance.now();
244
236
  const { report, graph } = await finalizeReportAndGraphAsync({
245
237
  localMessages,
246
238
  includeCursor: includeCursor && (cursorSync.synced || hasCursorUsageCache()),
@@ -248,7 +240,6 @@ export async function submit(options: SubmitOptions = {}): Promise<void> {
248
240
  until: options.until,
249
241
  year: options.year,
250
242
  });
251
- timing["finalize-report+graph"] = performance.now() - t0;
252
243
 
253
244
  // Use graph structure for submission, report's cost for display
254
245
  data = graph;
@@ -266,8 +257,6 @@ export async function submit(options: SubmitOptions = {}): Promise<void> {
266
257
  console.log(pc.gray(` Total cost: ${formatCurrency(data.summary.totalCost)}`));
267
258
  console.log(pc.gray(` Sources: ${data.summary.sources.join(", ")}`));
268
259
  console.log(pc.gray(` Models: ${data.summary.models.length} models`));
269
- console.log(pc.gray(` Contributions: ${data.contributions.length} days`));
270
- console.log(pc.gray(` Payload size: ${(JSON.stringify(data).length / 1024).toFixed(1)} KB`));
271
260
  console.log();
272
261
 
273
262
  if (data.summary.totalTokens === 0) {
@@ -287,22 +276,16 @@ export async function submit(options: SubmitOptions = {}): Promise<void> {
287
276
  const baseUrl = getApiBaseUrl();
288
277
 
289
278
  try {
290
- t0 = performance.now();
291
- const body = JSON.stringify(data);
292
- timing["json-serialize"] = performance.now() - t0;
293
-
294
- t0 = performance.now();
295
279
  const response = await fetch(`${baseUrl}/api/submit`, {
296
280
  method: "POST",
297
281
  headers: {
298
282
  "Content-Type": "application/json",
299
283
  Authorization: `Bearer ${credentials.token}`,
300
284
  },
301
- body,
285
+ body: JSON.stringify(data),
302
286
  });
303
287
 
304
288
  const result: SubmitResponse = await response.json();
305
- timing["server-roundtrip"] = performance.now() - t0;
306
289
 
307
290
  if (!response.ok) {
308
291
  console.error(pc.red(`\n Error: ${result.error || "Submission failed"}`));
@@ -339,14 +322,4 @@ export async function submit(options: SubmitOptions = {}): Promise<void> {
339
322
  console.error(pc.gray(` ${(error as Error).message}\n`));
340
323
  process.exit(1);
341
324
  }
342
-
343
- // Timing summary
344
- timing["total"] = performance.now() - submitStart;
345
- console.log(pc.gray(" ⏱ Timing breakdown:"));
346
- for (const [label, ms] of Object.entries(timing)) {
347
- const formatted = ms < 1000 ? `${ms.toFixed(0)}ms` : `${(ms / 1000).toFixed(2)}s`;
348
- const bar = "█".repeat(Math.max(1, Math.round(ms / timing["total"] * 20)));
349
- console.log(pc.gray(` ${label.padEnd(24)} ${formatted.padStart(8)} ${bar}`));
350
- }
351
- console.log();
352
325
  }