tokenlens-cli 1.0.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.
@@ -0,0 +1,430 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync } from "fs";
3
+ import { createServer, Socket } from "net";
4
+ import { resolve } from "path";
5
+ import { createInterface } from "readline/promises";
6
+ import { stdin as input, stdout as output } from "process";
7
+ import { Command } from "commander";
8
+ import chalk from "chalk";
9
+ import Table from "cli-table3";
10
+ import { analyzeUsage } from "../analyzer/index.js";
11
+ import { loadConfig, saveUserConfig } from "../config.js";
12
+ import { TokenStore } from "../db/store.js";
13
+ import { importLogs } from "../importers/logs.js";
14
+ import { ProxyServer } from "../proxy/server.js";
15
+ const program = new Command();
16
+ program
17
+ .name("tokenlens")
18
+ .alias("tl")
19
+ .alias("tg")
20
+ .description("Capture, analyze, and reduce AI token usage")
21
+ .version("1.0.0");
22
+ function printBanner(title) {
23
+ console.log(chalk.cyan(`\n ${title}\n`));
24
+ }
25
+ function boolPrompt(answer, fallback = true) {
26
+ const normalized = answer.trim().toLowerCase();
27
+ if (!normalized)
28
+ return fallback;
29
+ return ["y", "yes", "true", "1"].includes(normalized);
30
+ }
31
+ function closeStore(store) {
32
+ store.close();
33
+ }
34
+ function renderAnalysis(hours) {
35
+ const config = loadConfig();
36
+ const store = new TokenStore(config.dbPath);
37
+ const report = analyzeUsage(store, hours);
38
+ printBanner("TokenLens - Waste Analysis");
39
+ console.log(` Calls analyzed: ${report.calls.toLocaleString()}`);
40
+ console.log(` Total tokens: ${report.totalTokens.toLocaleString()}`);
41
+ console.log(` Estimated avoidable: ${report.estimatedWasteTokens.toLocaleString()} (${report.wastePercent.toFixed(1)}%)\n`);
42
+ if (!report.findings.length)
43
+ console.log(" No waste patterns detected in this period.\n");
44
+ for (const item of report.findings) {
45
+ console.log(chalk.bold(` [${item.severity.toUpperCase()} / ${item.confidence.toUpperCase()}] ${item.title}`));
46
+ console.log(` ${item.calls} calls / ${item.tokens.toLocaleString()} tokens`);
47
+ console.log(` Estimated savings: ${item.estimatedWasteTokens.toLocaleString()} tokens`);
48
+ console.log(` Why: ${item.reason}`);
49
+ console.log(` Improve: ${item.recommendation}\n`);
50
+ item.examples.forEach((example, index) => {
51
+ console.log(` Example ${index + 1}: ${example.sessionId}`);
52
+ console.log(` ${example.toolName} / ${example.provider} / ${example.model}`);
53
+ console.log(` ${example.calls} calls / ${example.tokens.toLocaleString()} tokens / ${example.estimatedWasteTokens.toLocaleString()} avoidable`);
54
+ if (example.promptPreview)
55
+ console.log(` Prompt: ${example.promptPreview}`);
56
+ console.log("");
57
+ });
58
+ }
59
+ if (report.topSessions.length) {
60
+ console.log(chalk.bold(" Top sessions by total tokens:"));
61
+ report.topSessions.forEach((session) => {
62
+ console.log(` - ${session.sessionId}: ${session.totalTokens.toLocaleString()} tokens across ${session.calls} calls (${session.toolName} / ${session.provider} / ${session.model})`);
63
+ });
64
+ console.log("");
65
+ }
66
+ console.log(chalk.bold(" Coverage limits:"));
67
+ report.coverage.forEach((line) => console.log(` - ${line}`));
68
+ console.log("");
69
+ closeStore(store);
70
+ }
71
+ function renderStats(hours) {
72
+ const config = loadConfig();
73
+ const store = new TokenStore(config.dbPath);
74
+ const stats = store.getStats(hours);
75
+ printBanner("TokenLens - Usage Stats");
76
+ console.log(` Period: last ${hours} hours\n`);
77
+ const totals = new Table();
78
+ totals.push({ [chalk.bold("Total Tokens")]: chalk.yellow(stats.totalTokens.toLocaleString()) }, { [chalk.bold("Total Cost")]: chalk.green(`$${stats.totalCost.toFixed(5)}`) }, { [chalk.bold("Total Calls")]: chalk.white(stats.totalCalls.toString()) });
79
+ console.log(totals.toString());
80
+ if (stats.byTool.length) {
81
+ console.log(chalk.bold("\nBy Tool:"));
82
+ const t = new Table({ head: ["Tool", "Tokens", "Cost", "Calls"] });
83
+ stats.byTool.forEach((r) => t.push([r.tool, r.tokens.toLocaleString(), `$${r.cost.toFixed(5)}`, r.calls]));
84
+ console.log(t.toString());
85
+ }
86
+ if (stats.byModel.length) {
87
+ console.log(chalk.bold("\nBy Model:"));
88
+ const m = new Table({ head: ["Model", "Tokens", "Cost", "Calls"] });
89
+ stats.byModel.forEach((r) => m.push([r.model, r.tokens.toLocaleString(), `$${r.cost.toFixed(5)}`, r.calls]));
90
+ console.log(m.toString());
91
+ }
92
+ if (stats.topCalls.length) {
93
+ console.log(chalk.bold("\nLargest Calls:"));
94
+ const tc = new Table({ head: ["ID", "Model", "Tokens", "Cost", "Preview"], colWidths: [6, 28, 10, 10, 50] });
95
+ stats.topCalls.forEach((r) => tc.push([r.id, r.model, r.total_tokens.toLocaleString(), `$${r.cost.toFixed(5)}`, r.prompt_preview.slice(0, 60)]));
96
+ console.log(tc.toString());
97
+ }
98
+ console.log("");
99
+ closeStore(store);
100
+ }
101
+ async function importWithOutput(paths, force) {
102
+ const config = loadConfig();
103
+ const store = new TokenStore(config.dbPath);
104
+ const result = await importLogs(store, paths, force, config.importPaths);
105
+ printBanner("TokenLens - Log Import");
106
+ console.log(` Files found: ${result.filesFound}`);
107
+ console.log(` Files read: ${result.filesRead}`);
108
+ console.log(` Calls imported: ${result.callsImported}`);
109
+ console.log(` Calls skipped: ${result.callsSkipped}`);
110
+ for (const [source, count] of Object.entries(result.sources)) {
111
+ console.log(` ${source}: ${count}`);
112
+ }
113
+ if (result.errors.length) {
114
+ console.log(chalk.yellow(`\n Errors (${result.errors.length}):`));
115
+ result.errors.slice(0, 10).forEach((error) => console.log(` ${error}`));
116
+ }
117
+ console.log("");
118
+ closeStore(store);
119
+ }
120
+ function installSignalHandlers(onStop) {
121
+ process.on("SIGINT", () => { onStop(); process.exit(0); });
122
+ process.on("SIGTERM", () => { onStop(); process.exit(0); });
123
+ }
124
+ function probePort(port) {
125
+ return new Promise((resolveProbe) => {
126
+ const socket = new Socket();
127
+ socket.setTimeout(1000);
128
+ socket.once("connect", () => {
129
+ socket.destroy();
130
+ resolveProbe("open");
131
+ });
132
+ socket.once("error", () => resolveProbe("free"));
133
+ socket.once("timeout", () => {
134
+ socket.destroy();
135
+ resolveProbe("free");
136
+ });
137
+ socket.connect(port, "127.0.0.1");
138
+ });
139
+ }
140
+ function validatePort(port) {
141
+ return new Promise((resolvePort) => {
142
+ const server = createServer();
143
+ server.once("error", () => resolvePort(false));
144
+ server.once("listening", () => {
145
+ server.close(() => resolvePort(true));
146
+ });
147
+ server.listen(port, "127.0.0.1");
148
+ });
149
+ }
150
+ async function runDoctor() {
151
+ const config = loadConfig();
152
+ const store = new TokenStore(config.dbPath);
153
+ const summary = store.getSummary();
154
+ const recent = store.getRecentCalls(1);
155
+ const proxyState = await probePort(config.proxyPort);
156
+ const logPaths = config.importPaths.map((path) => ({
157
+ path,
158
+ exists: existsSync(path),
159
+ }));
160
+ const dbExists = existsSync(config.dbPath);
161
+ printBanner("TokenLens - Doctor");
162
+ console.log(` Config file: ${config.configPath}`);
163
+ console.log(` Data dir: ${config.dataDir}`);
164
+ console.log(` DB path: ${config.dbPath} ${dbExists ? chalk.green("(found)") : chalk.yellow("(missing)")}`);
165
+ console.log(` Proxy port: ${config.proxyPort} ${proxyState === "open" ? chalk.green("(listening)") : chalk.yellow("(not running)")}`);
166
+ console.log(` Tool name: ${config.defaultToolName}`);
167
+ console.log(` Watch every: ${config.watchIntervalSeconds}s\n`);
168
+ console.log(chalk.bold(" Import paths:"));
169
+ logPaths.forEach((entry) => {
170
+ console.log(` - ${entry.path} ${entry.exists ? chalk.green("(found)") : chalk.yellow("(missing)")}`);
171
+ });
172
+ console.log(chalk.bold("\n Data status:"));
173
+ console.log(` - Total calls: ${summary.totalCalls}`);
174
+ console.log(` - Total tokens: ${summary.totalTokens.toLocaleString()}`);
175
+ console.log(` - Estimated cost: $${summary.totalCost.toFixed(5)}`);
176
+ if (recent[0])
177
+ console.log(` - Latest call: ${recent[0].created_at} (${recent[0].tool_name} / ${recent[0].model})`);
178
+ console.log(chalk.bold("\n Next steps:"));
179
+ if (!logPaths.some((entry) => entry.exists)) {
180
+ console.log(" - No known log directories found. Run `tl init` and add import paths or start live capture with `tl start`.");
181
+ }
182
+ else if (!summary.totalCalls) {
183
+ console.log(" - Logs exist but no data is recorded yet. Run `tl quickstart` or `tl scan`.");
184
+ }
185
+ else {
186
+ console.log(" - Historical data is present. Run `tl analyze` for waste findings.");
187
+ }
188
+ if (proxyState !== "open") {
189
+ console.log(" - Live capture is not running. Start it with `tl start`.");
190
+ }
191
+ console.log(" - Use `tl watch` to keep importing changed log files.");
192
+ console.log("");
193
+ closeStore(store);
194
+ }
195
+ async function runInit(acceptDefaults) {
196
+ const config = loadConfig();
197
+ let nextToolName = config.defaultToolName;
198
+ let nextProxyPort = config.proxyPort;
199
+ let nextDbPath = config.dbPath;
200
+ let nextImportPaths = [...config.importPaths];
201
+ let nextWatchInterval = config.watchIntervalSeconds;
202
+ let importNow = true;
203
+ if (!acceptDefaults) {
204
+ const rl = createInterface({ input, output });
205
+ const toolName = await rl.question(`Default tool name [${config.defaultToolName}]: `);
206
+ const proxyPort = await rl.question(`Proxy port [${config.proxyPort}]: `);
207
+ const dbPath = await rl.question(`Database path [${config.dbPath}]: `);
208
+ const importPaths = await rl.question(`Import paths (comma-separated) [${config.importPaths.join(", ")}]: `);
209
+ const watchInterval = await rl.question(`Watch interval in seconds [${config.watchIntervalSeconds}]: `);
210
+ const shouldImport = await rl.question("Import local logs now? [Y/n]: ");
211
+ rl.close();
212
+ if (toolName.trim())
213
+ nextToolName = toolName.trim();
214
+ if (proxyPort.trim())
215
+ nextProxyPort = parseInt(proxyPort.trim(), 10) || config.proxyPort;
216
+ if (dbPath.trim())
217
+ nextDbPath = resolve(dbPath.trim());
218
+ if (importPaths.trim()) {
219
+ nextImportPaths = importPaths.split(",").map((value) => resolve(value.trim())).filter(Boolean);
220
+ }
221
+ if (watchInterval.trim())
222
+ nextWatchInterval = parseInt(watchInterval.trim(), 10) || config.watchIntervalSeconds;
223
+ importNow = boolPrompt(shouldImport, true);
224
+ }
225
+ saveUserConfig({
226
+ defaultToolName: nextToolName,
227
+ proxyPort: nextProxyPort,
228
+ dbPath: nextDbPath,
229
+ importPaths: nextImportPaths,
230
+ watchIntervalSeconds: nextWatchInterval,
231
+ });
232
+ printBanner("TokenLens - Init");
233
+ console.log(" Saved configuration:");
234
+ console.log(` - Config file: ${loadConfig().configPath}`);
235
+ console.log(` - Tool name: ${nextToolName}`);
236
+ console.log(` - Proxy port: ${nextProxyPort}`);
237
+ console.log(` - DB path: ${nextDbPath}`);
238
+ console.log(` - Import paths: ${nextImportPaths.join(", ")}`);
239
+ console.log(` - Watch interval: ${nextWatchInterval}s`);
240
+ console.log("");
241
+ if (importNow) {
242
+ await importWithOutput([], false);
243
+ }
244
+ else {
245
+ console.log(" Skipped initial import. Run `tl quickstart` or `tl scan` when ready.\n");
246
+ }
247
+ }
248
+ async function runQuickstart(force) {
249
+ const config = loadConfig();
250
+ const store = new TokenStore(config.dbPath);
251
+ const importResult = await importLogs(store, [], force, config.importPaths);
252
+ const summary = store.getSummary();
253
+ const analysis = analyzeUsage(store, 168);
254
+ printBanner("TokenLens - Quickstart");
255
+ console.log(` Imported ${importResult.callsImported} calls from ${importResult.filesRead}/${importResult.filesFound} files`);
256
+ console.log(` Lifetime totals: ${summary.totalCalls} calls / ${summary.totalTokens.toLocaleString()} tokens / $${summary.totalCost.toFixed(5)}`);
257
+ if (analysis.findings[0]) {
258
+ console.log(` Top finding: ${analysis.findings[0].title}`);
259
+ console.log(` Estimated savings: ${analysis.findings[0].estimatedWasteTokens.toLocaleString()} tokens`);
260
+ console.log(` Action: ${analysis.findings[0].recommendation}`);
261
+ }
262
+ else {
263
+ console.log(" No major waste patterns detected yet.");
264
+ }
265
+ console.log("\n Next commands:");
266
+ console.log(" - tl analyze");
267
+ console.log(" - tl stats");
268
+ console.log(" - tl start");
269
+ console.log(" - tl watch\n");
270
+ closeStore(store);
271
+ }
272
+ async function runWatch(intervalSeconds, force) {
273
+ const config = loadConfig();
274
+ const intervalMs = Math.max(5, intervalSeconds) * 1000;
275
+ printBanner("TokenLens - Watch");
276
+ console.log(` Watching import paths every ${Math.round(intervalMs / 1000)} seconds`);
277
+ config.importPaths.forEach((path) => console.log(` - ${path}`));
278
+ console.log("");
279
+ const tick = async () => {
280
+ const store = new TokenStore(config.dbPath);
281
+ try {
282
+ const result = await importLogs(store, [], force, config.importPaths);
283
+ const imported = result.callsImported;
284
+ const read = result.filesRead;
285
+ console.log(`[watch] ${new Date().toISOString()} imported=${imported} filesRead=${read} errors=${result.errors.length}`);
286
+ }
287
+ finally {
288
+ closeStore(store);
289
+ }
290
+ };
291
+ await tick();
292
+ const handle = setInterval(() => {
293
+ void tick();
294
+ }, intervalMs);
295
+ installSignalHandlers(() => clearInterval(handle));
296
+ }
297
+ program
298
+ .command("init")
299
+ .description("Create or update saved CLI configuration")
300
+ .option("-y, --yes", "Accept current defaults without prompts", false)
301
+ .action(async (opts) => {
302
+ await runInit(Boolean(opts.yes));
303
+ });
304
+ program
305
+ .command("doctor")
306
+ .description("Check setup and print the next useful command")
307
+ .action(async () => {
308
+ await runDoctor();
309
+ });
310
+ program
311
+ .command("quickstart")
312
+ .alias("up")
313
+ .description("Import logs, summarize usage, and print the top optimization")
314
+ .option("--force", "Re-read unchanged files", false)
315
+ .action(async (opts) => {
316
+ await runQuickstart(Boolean(opts.force));
317
+ });
318
+ program
319
+ .command("scan")
320
+ .description("Import token usage from configured log paths or explicit files")
321
+ .argument("[paths...]", "Files or directories; defaults to configured paths")
322
+ .option("--force", "Re-read unchanged files", false)
323
+ .action(async (paths, opts) => {
324
+ await importWithOutput(paths, Boolean(opts.force));
325
+ });
326
+ program
327
+ .command("watch")
328
+ .description("Re-scan configured log paths on an interval")
329
+ .option("--interval <seconds>", "Polling interval in seconds", "")
330
+ .option("--force", "Re-read unchanged files every cycle", false)
331
+ .action(async (opts) => {
332
+ const config = loadConfig();
333
+ const seconds = parseInt(opts.interval, 10) || config.watchIntervalSeconds;
334
+ await runWatch(seconds, Boolean(opts.force));
335
+ });
336
+ program
337
+ .command("analyze")
338
+ .alias("a")
339
+ .description("Find likely token waste and print exact recommendations")
340
+ .option("--hours <number>", "Time range in hours", "168")
341
+ .option("--json", "Print machine-readable JSON", false)
342
+ .action((opts) => {
343
+ if (opts.json) {
344
+ const config = loadConfig();
345
+ const store = new TokenStore(config.dbPath);
346
+ const report = analyzeUsage(store, parseInt(opts.hours, 10));
347
+ console.log(JSON.stringify(report, null, 2));
348
+ closeStore(store);
349
+ return;
350
+ }
351
+ renderAnalysis(parseInt(opts.hours, 10));
352
+ });
353
+ program
354
+ .command("stats")
355
+ .alias("s")
356
+ .description("Show usage statistics in terminal")
357
+ .option("--hours <number>", "Time range in hours", "24")
358
+ .action((opts) => {
359
+ renderStats(parseInt(opts.hours, 10));
360
+ });
361
+ program
362
+ .command("start")
363
+ .description("Start live proxy capture")
364
+ .option("-p, --proxy-port <port>", "Proxy port", "")
365
+ .option("--tool-name <name>", "Name for this machine/tool", "")
366
+ .action(async (opts) => {
367
+ const config = loadConfig();
368
+ const port = parseInt(opts.proxyPort, 10) || config.proxyPort;
369
+ const toolName = opts.toolName || config.defaultToolName;
370
+ const portFree = await validatePort(port);
371
+ if (!portFree) {
372
+ console.error(chalk.red(`\n Port ${port} is already in use. Run \`tl doctor\` to inspect the setup.\n`));
373
+ process.exit(1);
374
+ }
375
+ const store = new TokenStore(config.dbPath);
376
+ const proxy = new ProxyServer(store, toolName);
377
+ printBanner("TokenLens - Live Capture");
378
+ console.log(` Proxy: http://127.0.0.1:${port}`);
379
+ console.log(` Tool: ${toolName}`);
380
+ console.log(` DB: ${config.dbPath}`);
381
+ console.log("");
382
+ proxy.start(port);
383
+ installSignalHandlers(() => { proxy.stop(); closeStore(store); });
384
+ });
385
+ program
386
+ .command("list")
387
+ .alias("ls")
388
+ .description("Show recent recorded calls")
389
+ .option("-l, --limit <number>", "Number of calls", "20")
390
+ .action((opts) => {
391
+ const config = loadConfig();
392
+ const store = new TokenStore(config.dbPath);
393
+ const calls = store.getRecentCalls(parseInt(opts.limit, 10));
394
+ printBanner("TokenLens - Recent Calls");
395
+ if (!calls.length) {
396
+ console.log(" No calls recorded yet.\n");
397
+ closeStore(store);
398
+ return;
399
+ }
400
+ const t = new Table({
401
+ head: ["ID", "Tool", "Provider", "Model", "Tokens", "Cost", "Time"],
402
+ colWidths: [6, 14, 16, 24, 10, 10, 20],
403
+ });
404
+ calls.forEach((c) => t.push([
405
+ c.id,
406
+ c.tool_name,
407
+ c.provider,
408
+ c.model,
409
+ c.total_tokens.toLocaleString(),
410
+ `$${c.cost.toFixed(5)}`,
411
+ c.created_at,
412
+ ]));
413
+ console.log(t.toString() + "\n");
414
+ closeStore(store);
415
+ });
416
+ program
417
+ .command("summary")
418
+ .description("Show lifetime summary")
419
+ .action(() => {
420
+ const config = loadConfig();
421
+ const store = new TokenStore(config.dbPath);
422
+ const s = store.getSummary();
423
+ printBanner("TokenLens - Lifetime Summary");
424
+ const t = new Table();
425
+ t.push({ [chalk.bold("Total Tokens")]: chalk.yellow(s.totalTokens.toLocaleString()) }, { [chalk.bold("Total Cost")]: chalk.green(`$${s.totalCost.toFixed(5)}`) }, { [chalk.bold("Total Calls")]: chalk.white(s.totalCalls.toString()) });
426
+ console.log(t.toString() + "\n");
427
+ closeStore(store);
428
+ });
429
+ await program.parseAsync(process.argv);
430
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface UserConfig {
2
+ proxyPort?: number;
3
+ dashboardPort?: number;
4
+ dbPath?: string;
5
+ upstreamProxy?: string | null;
6
+ defaultToolName?: string;
7
+ importPaths?: string[];
8
+ watchIntervalSeconds?: number;
9
+ }
10
+ export interface Config {
11
+ proxyPort: number;
12
+ dashboardPort: number;
13
+ dbPath: string;
14
+ certDir: string;
15
+ dataDir: string;
16
+ configPath: string;
17
+ upstreamProxy: string | null;
18
+ defaultToolName: string;
19
+ importPaths: string[];
20
+ watchIntervalSeconds: number;
21
+ }
22
+ export declare function defaultImportPaths(): string[];
23
+ export declare function saveUserConfig(next: UserConfig): void;
24
+ export declare function loadConfig(): Config;
25
+ export declare const AI_ENDPOINTS: {
26
+ host: string;
27
+ name: string;
28
+ }[];
29
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAyCD,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAK7C;AAaD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAOrD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAoBnC;AAED,eAAO,MAAM,YAAY;;;GAgBxB,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,106 @@
1
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { join } from "path";
4
+ const DATA_DIR = join(homedir(), ".tokenlens");
5
+ const LEGACY_DATA_DIR = join(homedir(), ".token-guard");
6
+ const CERT_DIR = join(DATA_DIR, "certs");
7
+ const CONFIG_PATH = join(DATA_DIR, "config.json");
8
+ const LEGACY_CONFIG_PATH = join(LEGACY_DATA_DIR, "config.json");
9
+ const DEFAULT_DB_PATH = join(DATA_DIR, "tokenlens.db");
10
+ const LEGACY_DB_PATH = join(LEGACY_DATA_DIR, "token-guard.db");
11
+ for (const path of [DATA_DIR, CERT_DIR]) {
12
+ if (!existsSync(path)) {
13
+ mkdirSync(path, { recursive: true });
14
+ }
15
+ }
16
+ function migrateLegacyFile(legacyPath, nextPath) {
17
+ if (existsSync(nextPath) || !existsSync(legacyPath))
18
+ return false;
19
+ try {
20
+ copyFileSync(legacyPath, nextPath);
21
+ return true;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ if (!existsSync(CONFIG_PATH) && existsSync(LEGACY_CONFIG_PATH)) {
28
+ try {
29
+ const legacy = JSON.parse(readFileSync(LEGACY_CONFIG_PATH, "utf8"));
30
+ const migrated = { ...legacy };
31
+ if (legacy.dbPath === LEGACY_DB_PATH) {
32
+ migrated.dbPath = migrateLegacyFile(LEGACY_DB_PATH, DEFAULT_DB_PATH) ? DEFAULT_DB_PATH : LEGACY_DB_PATH;
33
+ }
34
+ writeFileSync(CONFIG_PATH, JSON.stringify(migrated, null, 2) + "\n", "utf8");
35
+ }
36
+ catch {
37
+ migrateLegacyFile(LEGACY_CONFIG_PATH, CONFIG_PATH);
38
+ }
39
+ }
40
+ else {
41
+ migrateLegacyFile(LEGACY_DB_PATH, DEFAULT_DB_PATH);
42
+ }
43
+ export function defaultImportPaths() {
44
+ return [
45
+ join(homedir(), ".codex", "sessions"),
46
+ join(homedir(), ".claude", "projects"),
47
+ ];
48
+ }
49
+ function readUserConfig() {
50
+ if (!existsSync(CONFIG_PATH))
51
+ return {};
52
+ try {
53
+ const raw = readFileSync(CONFIG_PATH, "utf8");
54
+ const parsed = JSON.parse(raw);
55
+ return parsed && typeof parsed === "object" ? parsed : {};
56
+ }
57
+ catch {
58
+ return {};
59
+ }
60
+ }
61
+ export function saveUserConfig(next) {
62
+ const current = readUserConfig();
63
+ const merged = {
64
+ ...current,
65
+ ...next,
66
+ };
67
+ writeFileSync(CONFIG_PATH, JSON.stringify(merged, null, 2) + "\n", "utf8");
68
+ }
69
+ export function loadConfig() {
70
+ const user = readUserConfig();
71
+ const configuredDbPath = user.dbPath;
72
+ const dbPath = process.env.TL_DB_PATH ??
73
+ process.env.TG_DB_PATH ??
74
+ configuredDbPath ??
75
+ (existsSync(DEFAULT_DB_PATH) ? DEFAULT_DB_PATH : existsSync(LEGACY_DB_PATH) ? LEGACY_DB_PATH : DEFAULT_DB_PATH);
76
+ return {
77
+ proxyPort: parseInt(process.env.TL_PROXY_PORT ?? process.env.TG_PROXY_PORT ?? `${user.proxyPort ?? 8080}`, 10),
78
+ dashboardPort: parseInt(process.env.TL_DASHBOARD_PORT ?? process.env.TG_DASHBOARD_PORT ?? `${user.dashboardPort ?? 3456}`, 10),
79
+ dbPath,
80
+ certDir: CERT_DIR,
81
+ dataDir: DATA_DIR,
82
+ configPath: CONFIG_PATH,
83
+ upstreamProxy: process.env.TL_UPSTREAM_PROXY ?? process.env.TG_UPSTREAM_PROXY ?? user.upstreamProxy ?? null,
84
+ defaultToolName: user.defaultToolName ?? "system",
85
+ importPaths: (user.importPaths?.length ? user.importPaths : defaultImportPaths()).filter(Boolean),
86
+ watchIntervalSeconds: user.watchIntervalSeconds ?? 30,
87
+ };
88
+ }
89
+ export const AI_ENDPOINTS = [
90
+ { host: "api.anthropic.com", name: "Claude (API)" },
91
+ { host: "api.claude.ai", name: "Claude Web" },
92
+ { host: "api.openai.com", name: "OpenAI" },
93
+ { host: "generativelanguage.googleapis.com", name: "Gemini" },
94
+ { host: "api.groq.com", name: "Groq" },
95
+ { host: "api.deepseek.com", name: "DeepSeek" },
96
+ { host: "api.together.xyz", name: "Together AI" },
97
+ { host: "api.perplexity.ai", name: "Perplexity" },
98
+ { host: "api.x.ai", name: "xAI Grok" },
99
+ { host: "api.mistral.ai", name: "Mistral" },
100
+ { host: "api.cohere.com", name: "Cohere" },
101
+ { host: "localhost:11434", name: "Ollama" },
102
+ { host: "127.0.0.1:11434", name: "Ollama" },
103
+ { host: "localhost:1234", name: "LM Studio" },
104
+ { host: "127.0.0.1:1234", name: "LM Studio" },
105
+ ];
106
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { TokenStore } from "../db/store.js";
2
+ export declare class DashboardServer {
3
+ private app;
4
+ private store;
5
+ private server?;
6
+ constructor(store: TokenStore);
7
+ private setupRoutes;
8
+ start(port: number): void;
9
+ stop(): void;
10
+ private renderHtml;
11
+ }
12
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAqC;gBAExC,KAAK,EAAE,UAAU;IAM7B,OAAO,CAAC,WAAW;IAyBnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMzB,IAAI,IAAI,IAAI;IAIZ,OAAO,CAAC,UAAU;CA0JnB"}