tokentracker-cli 0.22.3 → 0.23.1

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.
Files changed (48) hide show
  1. package/README.md +4 -3
  2. package/README.zh-CN.md +4 -3
  3. package/dashboard/dist/assets/{Card-Ce7Bq6YO.js → Card-CQ4ezOtn.js} +1 -1
  4. package/dashboard/dist/assets/DashboardPage-DCixFQNF.js +42 -0
  5. package/dashboard/dist/assets/{DevicePage-B0t441Pp.js → DevicePage-C-d4jlSG.js} +1 -1
  6. package/dashboard/dist/assets/{FadeIn-rL5OMeU2.js → FadeIn-DEPo9u33.js} +1 -1
  7. package/dashboard/dist/assets/{HeaderGithubStar-CGS4pFqm.js → HeaderGithubStar-CRKWJSGQ.js} +1 -1
  8. package/dashboard/dist/assets/{IpCheckPage-Dg8ZSzBs.js → IpCheckPage-BscvPch9.js} +1 -1
  9. package/dashboard/dist/assets/{LandingPage-BRTdgQhg.js → LandingPage-Bv5OIhRJ.js} +1 -1
  10. package/dashboard/dist/assets/LeaderboardPage-ea_pS5m7.js +5 -0
  11. package/dashboard/dist/assets/{LeaderboardProfilePage-BYY0tPSp.js → LeaderboardProfilePage-DMzZmwP4.js} +1 -1
  12. package/dashboard/dist/assets/{LimitsPage-IguYTVRL.js → LimitsPage-CWaDaTZ9.js} +1 -1
  13. package/dashboard/dist/assets/{LoginPage-Ct_y3yvb.js → LoginPage-BhmcrPVS.js} +1 -1
  14. package/dashboard/dist/assets/PopoverPopup-bhZXkxTE.js +12 -0
  15. package/dashboard/dist/assets/{ProviderIcon-BW8DsxOn.js → ProviderIcon-BFsXZu44.js} +1 -1
  16. package/dashboard/dist/assets/SettingsPage-Dw5iy_IJ.js +1 -0
  17. package/dashboard/dist/assets/SkillsPage-Dz1X6g_o.js +1 -0
  18. package/dashboard/dist/assets/{WidgetsPage-DYLXbN7i.js → WidgetsPage-D8RbtXHy.js} +1 -1
  19. package/dashboard/dist/assets/{WrappedPage-C-NcEsy1.js → WrappedPage-Chw83YEb.js} +1 -1
  20. package/dashboard/dist/assets/check-Bs81cB4C.js +1 -0
  21. package/dashboard/dist/assets/{chevron-down-sxrI4ACd.js → chevron-down-DK-3H5UY.js} +1 -1
  22. package/dashboard/dist/assets/{download-tZXJTa2X.js → download-lOWPegbv.js} +1 -1
  23. package/dashboard/dist/assets/info-DOAPbTJ3.js +1 -0
  24. package/dashboard/dist/assets/{leaderboard-columns-DjTC-eio.js → leaderboard-columns-qXgnSz3Y.js} +1 -1
  25. package/dashboard/dist/assets/main-0bSXJNLn.css +1 -0
  26. package/dashboard/dist/assets/main-uV9_FTHb.js +688 -0
  27. package/dashboard/dist/assets/{use-limits-display-prefs-CzOLYgu5.js → use-limits-display-prefs-DtRFIKBE.js} +1 -1
  28. package/dashboard/dist/assets/{use-native-settings-D6YjGLZJ.js → use-native-settings-BRDZatug.js} +1 -1
  29. package/dashboard/dist/assets/{use-reduced-motion-0uADS5dP.js → use-reduced-motion-CYXeA5H_.js} +1 -1
  30. package/dashboard/dist/assets/{use-usage-limits-xh-A-nDC.js → use-usage-limits-RfcCMHky.js} +1 -1
  31. package/dashboard/dist/assets/useCurrency-B0LcQvSj.js +1 -0
  32. package/dashboard/dist/index.html +2 -2
  33. package/dashboard/dist/share.html +2 -2
  34. package/package.json +1 -1
  35. package/src/lib/antigravity-paths.js +48 -0
  36. package/src/lib/cursor-config.js +20 -47
  37. package/src/lib/pricing/seed-snapshot.json +1 -1
  38. package/src/lib/rollout.js +81 -157
  39. package/src/lib/skills-manager.js +76 -48
  40. package/src/lib/sqlite-reader.js +136 -0
  41. package/dashboard/dist/assets/DashboardPage-K_pYvsl8.js +0 -64
  42. package/dashboard/dist/assets/LeaderboardPage-DMQ92NBo.js +0 -5
  43. package/dashboard/dist/assets/PopoverPopup-BKxuCZoU.js +0 -12
  44. package/dashboard/dist/assets/SettingsPage-BxDpsq6h.js +0 -1
  45. package/dashboard/dist/assets/SkillsPage-DGrfA2Ts.js +0 -1
  46. package/dashboard/dist/assets/check-fi-rlObU.js +0 -1
  47. package/dashboard/dist/assets/main-D55hG1yw.css +0 -1
  48. package/dashboard/dist/assets/main-DsrMFwQm.js +0 -676
@@ -0,0 +1,136 @@
1
+ const cp = require("node:child_process");
2
+ const fssync = require("node:fs");
3
+
4
+ const warnedSqliteReadFailures = new Set();
5
+
6
+ function isDebugEnabled(env = process.env) {
7
+ const value = String((env && env.TOKENTRACKER_DEBUG) || "").toLowerCase();
8
+ return value === "1" || value === "true";
9
+ }
10
+
11
+ function formatError(err) {
12
+ if (!err) return "unknown error";
13
+ return err && err.message ? err.message : String(err);
14
+ }
15
+
16
+ function warnSqliteUnavailable({ dbPath, label, cliError, nodeSqliteError, env, stderr }) {
17
+ const key = `${label || "SQLite"}:${dbPath || ""}`;
18
+ if (warnedSqliteReadFailures.has(key)) return;
19
+ warnedSqliteReadFailures.add(key);
20
+
21
+ const out = stderr && typeof stderr.write === "function" ? stderr : process.stderr;
22
+ const displayLabel = label || "local";
23
+ out.write(
24
+ `[tokentracker] Cannot read ${displayLabel} SQLite database. Install sqlite3 CLI and add it to PATH, or use Node.js 22+ with node:sqlite support. Path: ${dbPath}\n`,
25
+ );
26
+ if (isDebugEnabled(env)) {
27
+ out.write(`[tokentracker] sqlite3 CLI failed: ${formatError(cliError)}\n`);
28
+ out.write(`[tokentracker] node:sqlite failed: ${formatError(nodeSqliteError)}\n`);
29
+ }
30
+ }
31
+
32
+ function readSqliteRowsWithCli(dbPath, sql, { execFileSync, timeout, maxBuffer }) {
33
+ const raw = execFileSync("sqlite3", ["-json", dbPath, sql], {
34
+ encoding: "utf8",
35
+ maxBuffer,
36
+ timeout,
37
+ stdio: ["pipe", "pipe", "pipe"],
38
+ });
39
+ if (!raw || !raw.trim()) return [];
40
+ const rows = JSON.parse(raw);
41
+ return Array.isArray(rows) ? rows : [];
42
+ }
43
+
44
+ function isSqliteCliUnavailable(err) {
45
+ const message = formatError(err).toLowerCase();
46
+ return (
47
+ err?.code === "ENOENT" ||
48
+ message.includes("spawn sqlite3 enoent") ||
49
+ message.includes("sqlite3 enoent") ||
50
+ message.includes("not recognized as an internal or external command")
51
+ );
52
+ }
53
+
54
+ function isNodeSqliteUnavailable(err) {
55
+ const message = formatError(err).toLowerCase();
56
+ return (
57
+ message.includes("no such built-in module") ||
58
+ message.includes("cannot find module 'node:sqlite'") ||
59
+ message.includes('cannot find module "node:sqlite"') ||
60
+ message.includes("node:sqlite databasesync is unavailable")
61
+ );
62
+ }
63
+
64
+ function readSqliteRowsWithNode(dbPath, sql, { requireFn }) {
65
+ const { DatabaseSync } = requireFn("node:sqlite");
66
+ if (typeof DatabaseSync !== "function") {
67
+ throw new Error("node:sqlite DatabaseSync is unavailable");
68
+ }
69
+ const db = new DatabaseSync(dbPath, { readOnly: true });
70
+ try {
71
+ const rows = db.prepare(sql).all();
72
+ return Array.isArray(rows) ? rows : [];
73
+ } finally {
74
+ db.close();
75
+ }
76
+ }
77
+
78
+ function readSqliteJsonRows(dbPath, sql, options = {}) {
79
+ if (!dbPath || !sql) return [];
80
+ try {
81
+ if (!fssync.existsSync(dbPath)) return [];
82
+ } catch (_e) {
83
+ return [];
84
+ }
85
+ const execFileSync = options.execFileSync || cp.execFileSync;
86
+ const requireFn = options.requireFn || require;
87
+ const env = options.env || process.env;
88
+ const timeout = Number.isFinite(options.timeout) ? options.timeout : 30_000;
89
+ const maxBuffer = Number.isFinite(options.maxBuffer) ? options.maxBuffer : 50 * 1024 * 1024;
90
+ const label = options.label || "local";
91
+
92
+ let cliError = null;
93
+ try {
94
+ return readSqliteRowsWithCli(dbPath, sql, { execFileSync, timeout, maxBuffer });
95
+ } catch (err) {
96
+ cliError = err;
97
+ }
98
+
99
+ let nodeSqliteError = null;
100
+ try {
101
+ return readSqliteRowsWithNode(dbPath, sql, { requireFn });
102
+ } catch (err) {
103
+ nodeSqliteError = err;
104
+ }
105
+
106
+ if (isSqliteCliUnavailable(cliError) && isNodeSqliteUnavailable(nodeSqliteError)) {
107
+ warnSqliteUnavailable({
108
+ dbPath,
109
+ label,
110
+ cliError,
111
+ nodeSqliteError,
112
+ env,
113
+ stderr: options.stderr,
114
+ });
115
+ }
116
+ return [];
117
+ }
118
+
119
+ function readSqliteFirstValue(dbPath, sql, column, options = {}) {
120
+ const rows = readSqliteJsonRows(dbPath, sql, options);
121
+ const row = rows[0];
122
+ if (!row || typeof row !== "object") return null;
123
+ const key = typeof column === "string" && column.length > 0 ? column : Object.keys(row)[0];
124
+ const value = row[key];
125
+ return typeof value === "string" ? value.trim() : value == null ? null : String(value).trim();
126
+ }
127
+
128
+ function resetSqliteReaderWarningsForTests() {
129
+ warnedSqliteReadFailures.clear();
130
+ }
131
+
132
+ module.exports = {
133
+ readSqliteJsonRows,
134
+ readSqliteFirstValue,
135
+ resetSqliteReaderWarningsForTests,
136
+ };