@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/cli.js +282 -1
- package/dist/cli.js.map +1 -1
- package/dist/native.d.ts +1 -0
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js +1 -1
- package/dist/native.js.map +1 -1
- package/dist/submit.d.ts.map +1 -1
- package/dist/submit.js +2 -26
- package/dist/submit.js.map +1 -1
- package/package.json +2 -2
- package/src/cli.ts +356 -1
- package/src/native.ts +2 -1
- package/src/submit.ts +2 -29
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
|
|
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
|
package/dist/submit.js.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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:
|
|
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
|
|
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
|
}
|