tokentracker-cli 1.1.2 → 1.1.4

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 (117) hide show
  1. package/README.de.md +6 -4
  2. package/README.ja.md +6 -4
  3. package/README.ko.md +6 -4
  4. package/README.md +7 -4
  5. package/README.zh-CN.md +6 -4
  6. package/dashboard/dist/assets/{AchievementBadge-CX7g238N.js → AchievementBadge-BGA-HT_B.js} +1 -1
  7. package/dashboard/dist/assets/{AchievementsPage-BbkEymra.js → AchievementsPage-CtRh5AjH.js} +2 -2
  8. package/dashboard/dist/assets/{AchievementsSection-CmhoerE7.js → AchievementsSection-BarRcKaN.js} +1 -1
  9. package/dashboard/dist/assets/{BadgeDetailModal-996i13Vf.js → BadgeDetailModal-Bg0BDAN2.js} +1 -1
  10. package/dashboard/dist/assets/{BotAnimated-B22CfAlF.js → BotAnimated-By9J3-dn.js} +1 -1
  11. package/dashboard/dist/assets/{Card-DFd9hCFB.js → Card-CIoJYi2j.js} +1 -1
  12. package/dashboard/dist/assets/{ClawdAnimated-DXKN28M2.js → ClawdAnimated-Dkvc2xe8.js} +2 -2
  13. package/dashboard/dist/assets/{CommandPalette-DVRs34TV.js → CommandPalette-BssDtHRl.js} +1 -1
  14. package/dashboard/dist/assets/{CommunityStatsModal-BExjH9E8.js → CommunityStatsModal-CQrgLlDb.js} +1 -1
  15. package/dashboard/dist/assets/{ConfirmModal-KJhOrJ98.js → ConfirmModal-C3hBPgYc.js} +1 -1
  16. package/dashboard/dist/assets/{Controls-xnIEnOqd.js → Controls-BSW6a1HS.js} +1 -1
  17. package/dashboard/dist/assets/DashboardPage-Dhv7fejy.js +1 -0
  18. package/dashboard/dist/assets/{DevicePage-Bo8e-KVq.js → DevicePage-D5eZn0wo.js} +1 -1
  19. package/dashboard/dist/assets/{DialogClose-gBd-BmR7.js → DialogClose-BltQpaJo.js} +1 -1
  20. package/dashboard/dist/assets/DialogDescription-Cof52Icj.js +1 -0
  21. package/dashboard/dist/assets/{DialogTitle-B0UbsqD7.js → DialogTitle-CVddcRPZ.js} +1 -1
  22. package/dashboard/dist/assets/{FadeIn-Dv2DtOPn.js → FadeIn-goPv73MT.js} +1 -1
  23. package/dashboard/dist/assets/{HeaderGithubStar-1kEsgGdK.js → HeaderGithubStar-BDBrrkzt.js} +1 -1
  24. package/dashboard/dist/assets/{HoverTooltip-DQlpkw2L.js → HoverTooltip-qyMezXOs.js} +1 -1
  25. package/dashboard/dist/assets/{IpCheckPage-CFlkmSlA.js → IpCheckPage-Ces8JIPb.js} +1 -1
  26. package/dashboard/dist/assets/{LandingPage-DNs6mSij.js → LandingPage-B2TmLGno.js} +2 -2
  27. package/dashboard/dist/assets/{LeaderboardAvatar-DSltCiRr.js → LeaderboardAvatar-CVVRoNua.js} +1 -1
  28. package/dashboard/dist/assets/{LeaderboardPage-CkjUMA-k.js → LeaderboardPage-xtt-bOY8.js} +2 -2
  29. package/dashboard/dist/assets/{LeaderboardProfileModal-DJjaD7Kz.js → LeaderboardProfileModal-BM4d_I_r.js} +3 -3
  30. package/dashboard/dist/assets/{LeaderboardProfilePage-Bue7tJoi.js → LeaderboardProfilePage-BWqhFLQX.js} +1 -1
  31. package/dashboard/dist/assets/{LimitsPage-Ctbvl8Q8.js → LimitsPage-BZL4Pcl8.js} +1 -1
  32. package/dashboard/dist/assets/{LocalOnlyNotice-LjNI8j4I.js → LocalOnlyNotice-D4gnOEJj.js} +1 -1
  33. package/dashboard/dist/assets/LoginCard-CB17FQ5w.js +1 -0
  34. package/dashboard/dist/assets/{LoginModal-CUmfCsHY.js → LoginModal-BI-O1rH4.js} +1 -1
  35. package/dashboard/dist/assets/{LoginPage-CjJb9qFM.js → LoginPage-DnGzsvJ4.js} +1 -1
  36. package/dashboard/dist/assets/{PetPage-BWKEnBEW.js → PetPage-NRnIKMaJ.js} +1 -1
  37. package/dashboard/dist/assets/{PopoverPopup-DeXj3kM3.js → PopoverPopup-DHoK6UJZ.js} +1 -1
  38. package/dashboard/dist/assets/{ProviderIcon-DL-oa-UM.js → ProviderIcon-BTkdx9o2.js} +1 -1
  39. package/dashboard/dist/assets/{ResetPasswordPage-CeeKMN8H.js → ResetPasswordPage-C6K0w318.js} +1 -1
  40. package/dashboard/dist/assets/{SegmentedControl-Bx5Z9tYf.js → SegmentedControl-gEoWioBE.js} +1 -1
  41. package/dashboard/dist/assets/{Select-DRbgbSPd.js → Select-CI-qtEYu.js} +1 -1
  42. package/dashboard/dist/assets/{SelectItemText-D792o2Et.js → SelectItemText-q-yhzzjw.js} +1 -1
  43. package/dashboard/dist/assets/{ServiceStatusPage-NjQ1oGqx.js → ServiceStatusPage-C4xD1CEe.js} +1 -1
  44. package/dashboard/dist/assets/{SessionsPage-Cr2uHP91.js → SessionsPage-CS0Yun2z.js} +1 -1
  45. package/dashboard/dist/assets/{SettingsPage-Av8pVbqT.js → SettingsPage-GVY_ktz4.js} +2 -2
  46. package/dashboard/dist/assets/{SkillsPage-feW4j329.js → SkillsPage-COPRL95O.js} +1 -1
  47. package/dashboard/dist/assets/{TokenGalaxy-DX36F36Q.js → TokenGalaxy-Czi0Ic48.js} +1 -1
  48. package/dashboard/dist/assets/{ToolbarRootContext-CzMlVMfI.js → ToolbarRootContext-BZkTiBJB.js} +1 -1
  49. package/dashboard/dist/assets/{TrendMonitor-BosWE34g.js → TrendMonitor-CnIsuxV-.js} +1 -1
  50. package/dashboard/dist/assets/{WidgetsPage-DhoypTuq.js → WidgetsPage-OdX_Fsul.js} +1 -1
  51. package/dashboard/dist/assets/{WrappedPage-DR6BoipR.js → WrappedPage-h9N63-F8.js} +1 -1
  52. package/dashboard/dist/assets/__vite-browser-external-BFNWaGsk.js +45 -0
  53. package/dashboard/dist/assets/{agent-logos-QSScjsfz.js → agent-logos-BDiPxrST.js} +1 -1
  54. package/dashboard/dist/assets/{arrow-up-right-BJQYadF-.js → arrow-up-right-DtFQUeJG.js} +1 -1
  55. package/dashboard/dist/assets/{check-CINIOTsF.js → check-C35onaNL.js} +1 -1
  56. package/dashboard/dist/assets/{composite-YV7-iFo_.js → composite-qxBzts0W.js} +1 -1
  57. package/dashboard/dist/assets/{copy-Bp_U7bAZ.js → copy-D_D71TLc.js} +1 -1
  58. package/dashboard/dist/assets/{download-CVOIkdjl.js → download-DMQI2hQe.js} +1 -1
  59. package/dashboard/dist/assets/{external-link-P6LDhEET.js → external-link-CemM4dWf.js} +1 -1
  60. package/dashboard/dist/assets/{flame-AbZCJ878.js → flame-CIvk0SP5.js} +1 -1
  61. package/dashboard/dist/assets/{format-tokens-M5bvANSq.js → format-tokens-D3JSvcFl.js} +1 -1
  62. package/dashboard/dist/assets/{icons-DpRn5Rxt.js → icons-Ccf5W0AL.js} +1 -1
  63. package/dashboard/dist/assets/{index-KQ5H65Ds.js → index-Brd2evyz.js} +1 -1
  64. package/dashboard/dist/assets/{index-CW2bybhs.js → index-C8Wri_HI.js} +1 -1
  65. package/dashboard/dist/assets/{index-L3O7cNuj.js → index-CFXmD_KX.js} +1 -1
  66. package/dashboard/dist/assets/{info-GEiJwgYk.js → info-CafrKEG8.js} +1 -1
  67. package/dashboard/dist/assets/{link-2-D8KpexwS.js → link-2-Ds-9Nzlp.js} +1 -1
  68. package/dashboard/dist/assets/{loader-circle-r0nEab80.js → loader-circle-DA4I55-V.js} +1 -1
  69. package/dashboard/dist/assets/{maximize-2-azGbxGbz.js → maximize-2-CjMPt5kU.js} +1 -1
  70. package/dashboard/dist/assets/{modifiers.esm-Cke4_92g.js → modifiers.esm-DIxTS09h.js} +1 -1
  71. package/dashboard/dist/assets/module-WSx8viXK.js +3 -0
  72. package/dashboard/dist/assets/{monitor-smartphone-BnHiLGNs.js → monitor-smartphone-IZpIOxn3.js} +1 -1
  73. package/dashboard/dist/assets/{plus-CJbY6Uuk.js → plus-vbLFNs70.js} +1 -1
  74. package/dashboard/dist/assets/{provider-display-B05KW8SE.js → provider-display-BAu_UIfV.js} +2 -2
  75. package/dashboard/dist/assets/{react-CingcaIm.js → react-Djb4VGKb.js} +1 -1
  76. package/dashboard/dist/assets/{search-CyffdJFU.js → search-Ct6LY9Ke.js} +1 -1
  77. package/dashboard/dist/assets/{skills-api-CdDPrjMM.js → skills-api-BnGI2gEp.js} +1 -1
  78. package/dashboard/dist/assets/{sortable.esm-B48YEoXA.js → sortable.esm-CjCGd6g5.js} +1 -1
  79. package/dashboard/dist/assets/{store-B0W0vLvA.js → store-CBxkOqRe.js} +1 -1
  80. package/dashboard/dist/assets/{terminal-CJ0D4hSx.js → terminal-Dlpdp5Az.js} +1 -1
  81. package/dashboard/dist/assets/{trash-DH-_Q3A5.js → trash-pxUSKv66.js} +1 -1
  82. package/dashboard/dist/assets/{use-community-stats-y6OaeOVs.js → use-community-stats-tHaixRIw.js} +1 -1
  83. package/dashboard/dist/assets/{use-latest-request-guard-DP7kE0Xa.js → use-latest-request-guard-Cs44WPfL.js} +1 -1
  84. package/dashboard/dist/assets/{use-limits-display-prefs-Bgcto2k1.js → use-limits-display-prefs-Dw56PXWy.js} +1 -1
  85. package/dashboard/dist/assets/{use-ordered-list-1L7o2taR.js → use-ordered-list-DpLx8oLV.js} +1 -1
  86. package/dashboard/dist/assets/use-reduced-motion-DrlJ9X6p.js +1 -0
  87. package/dashboard/dist/assets/{use-session-efficiency-pref-36sqzSZl.js → use-session-efficiency-pref-BN3FtBvr.js} +1 -1
  88. package/dashboard/dist/assets/{use-transform-DZgeA77H.js → use-transform-C4nTGgzb.js} +1 -1
  89. package/dashboard/dist/assets/{use-usage-limits-C5P1O9oT.js → use-usage-limits-Dmwdc1yo.js} +1 -1
  90. package/dashboard/dist/assets/{useCurrency-Dwv89bBn.js → useCurrency-DSc3A_Ih.js} +1 -1
  91. package/dashboard/dist/assets/{useTokenFormat-BGeVB81B.js → useTokenFormat-BHjcMgm8.js} +1 -1
  92. package/dashboard/dist/assets/{zap-D18Nt3M5.js → zap-BE8i_wu2.js} +1 -1
  93. package/dashboard/dist/brand-logos/trae.svg +1 -0
  94. package/dashboard/dist/index.html +15 -11
  95. package/dashboard/dist/ip-check.html +1 -1
  96. package/dashboard/dist/leaderboard.html +1 -1
  97. package/dashboard/dist/llms.txt +4 -2
  98. package/dashboard/dist/share.html +1 -1
  99. package/package.json +6 -4
  100. package/src/commands/init.js +20 -7
  101. package/src/commands/status.js +39 -9
  102. package/src/commands/sync.js +62 -1
  103. package/src/lib/pricing/curated-overrides.json +7 -0
  104. package/src/lib/pricing/matcher.js +5 -0
  105. package/src/lib/pricing/seed-snapshot.json +1 -1
  106. package/src/lib/rollout.js +845 -20
  107. package/src/lib/trae-db.js +127 -0
  108. package/src/lib/trae-snapshot.js +230 -0
  109. package/src/lib/trae-sqlite.js +143 -0
  110. package/src/lib/trae-usage.js +121 -0
  111. package/src/lib/wsl-probe.js +55 -12
  112. package/dashboard/dist/assets/DashboardPage-BzsiCwjX.js +0 -1
  113. package/dashboard/dist/assets/DialogDescription-CTEI9PvU.js +0 -1
  114. package/dashboard/dist/assets/LoginCard-U_3SnvtN.js +0 -1
  115. package/dashboard/dist/assets/__vite-browser-external-DYTQCEz4.js +0 -45
  116. package/dashboard/dist/assets/module-DtWfRKM4.js +0 -3
  117. package/dashboard/dist/assets/use-reduced-motion-BQxHT0gI.js +0 -1
@@ -4,11 +4,15 @@ const path = require("node:path");
4
4
  const DEFAULT_EXEC_OPTS = { timeout: 15000, windowsHide: true, maxBuffer: 1024 * 1024, stdio: ["ignore", "pipe", "ignore"] };
5
5
 
6
6
  let _cachedDistros = null;
7
+ let _cachedDistrosError = null;
7
8
  const _cachedWslUsers = new Map();
9
+ const _cachedWslUserErrors = new Map();
8
10
 
9
11
  function resetWslProbeCache() {
10
12
  _cachedDistros = null;
13
+ _cachedDistrosError = null;
11
14
  _cachedWslUsers.clear();
15
+ _cachedWslUserErrors.clear();
12
16
  }
13
17
 
14
18
  const WSL_MODES = new Set([
@@ -25,11 +29,15 @@ function defaultRunWsl(args, { utf16 = false } = {}) {
25
29
  return utf16 ? buf.toString("utf16le") : buf.toString("utf8");
26
30
  }
27
31
 
32
+ function cleanWslOutput(raw) {
33
+ return raw.replace(/\0/g, "").replace(/\uFEFF/g, "").trim();
34
+ }
35
+
28
36
  function parseWslListVerbose(raw) {
29
37
  if (typeof raw !== "string") return [];
30
38
  const distros = [];
31
39
  for (const line of raw.split(/\r?\n/)) {
32
- const clean = line.replace(/\0/g, "").replace(/\uFEFF/g, "").trim();
40
+ const clean = cleanWslOutput(line);
33
41
  if (!clean) continue;
34
42
  const cells = clean.split(/\s+/);
35
43
  let isDefault = false;
@@ -47,19 +55,44 @@ function parseWslListVerbose(raw) {
47
55
  }
48
56
 
49
57
  function probeWslDistros(deps = {}) {
50
- const hasDeps = Object.keys(deps).length > 0;
51
- if (!hasDeps && _cachedDistros) return _cachedDistros;
58
+ const strict = deps.strict === true;
59
+ const hasDeps = Object.keys(deps).some((key) => key !== "strict");
60
+ // Legacy callers retain their fail-safe cache. Strict observers may reuse
61
+ // successful empty results, but must retry a failure cached by any caller.
62
+ if (!hasDeps && _cachedDistros && (!strict || !_cachedDistrosError)) return _cachedDistros;
52
63
  const runWsl = deps.runWsl || defaultRunWsl;
53
64
  let raw;
54
65
  try {
55
66
  raw = runWsl(["-l", "-v"], { utf16: true });
56
- } catch (_e) {
57
- if (!hasDeps) _cachedDistros = [];
67
+ } catch (error) {
68
+ let confirmedEmpty = false;
69
+ if (
70
+ strict && Number.isInteger(error?.status) && error.status !== 0 &&
71
+ error.signal == null && (error.code == null || error.code === error.status)
72
+ ) {
73
+ // Some WSL builds exit nonzero for an empty verbose list. Confirm that
74
+ // case with a successful empty quiet list, not localized diagnostic text.
75
+ // Transport/permission/signal failures must never reach this fallback.
76
+ try {
77
+ const quiet = runWsl(["-l", "-q"], { utf16: true });
78
+ confirmedEmpty = typeof quiet === "string" && cleanWslOutput(quiet) === "";
79
+ } catch (_quietError) { }
80
+ }
81
+ if (!hasDeps) {
82
+ _cachedDistros = [];
83
+ _cachedDistrosError = confirmedEmpty ? null : error;
84
+ }
85
+ // ENOENT confirms wsl.exe is not installed. A failed invocation of an
86
+ // existing executable is not evidence of an empty distro list.
87
+ if (strict && error?.code !== "ENOENT" && !confirmedEmpty) throw error;
58
88
  return [];
59
89
  }
60
90
  const distros = parseWslListVerbose(raw);
61
91
  const sorted = distros.sort((a, b) => (b.isDefault ? 1 : 0) - (a.isDefault ? 1 : 0));
62
- if (!hasDeps) _cachedDistros = sorted;
92
+ if (!hasDeps) {
93
+ _cachedDistros = sorted;
94
+ _cachedDistrosError = null;
95
+ }
63
96
  return sorted;
64
97
  }
65
98
 
@@ -125,15 +158,22 @@ function resolveAllWin32Paths({
125
158
  return { native: single, wsl: null };
126
159
  }
127
160
 
128
- function lookupWslUser(distroName, runWsl, useCache) {
129
- if (useCache && _cachedWslUsers.has(distroName)) {
161
+ function lookupWslUser(distroName, runWsl, useCache, strict = false) {
162
+ if (useCache && _cachedWslUsers.has(distroName) && (!strict || !_cachedWslUserErrors.has(distroName))) {
130
163
  return _cachedWslUsers.get(distroName);
131
164
  }
132
165
  let user = "";
166
+ let error = null;
133
167
  try {
134
168
  user = String(runWsl(["-d", distroName, "-e", "whoami"], { utf16: false }) || "").trim();
135
- } catch (_e) { }
136
- if (useCache) _cachedWslUsers.set(distroName, user);
169
+ if (!user) error = Object.assign(new Error("WSL identity probe returned no user"), { code: "EWSLIDENTITY" });
170
+ } catch (cause) { error = cause; }
171
+ if (useCache) {
172
+ _cachedWslUsers.set(distroName, user);
173
+ if (error) _cachedWslUserErrors.set(distroName, error);
174
+ else _cachedWslUserErrors.delete(distroName);
175
+ }
176
+ if (strict && error) throw error;
137
177
  return user;
138
178
  }
139
179
 
@@ -142,10 +182,13 @@ function discoverWslHome(providerDir, deps = {}) {
142
182
 
143
183
  const runWsl = deps.runWsl || defaultRunWsl;
144
184
  const existsSync = deps.existsSync || fssync.existsSync;
145
- const distros = deps.runWsl ? probeWslDistros({ runWsl: deps.runWsl }) : probeWslDistros();
185
+ const strict = deps.strict === true;
186
+ const distros = deps.runWsl
187
+ ? probeWslDistros({ runWsl: deps.runWsl, strict })
188
+ : probeWslDistros(strict ? { strict } : undefined);
146
189
  const useCache = !deps.runWsl;
147
190
  for (const distro of distros) {
148
- const user = lookupWslUser(distro.name, runWsl, useCache);
191
+ const user = lookupWslUser(distro.name, runWsl, useCache, strict);
149
192
  if (!user) continue;
150
193
  const roots = distro.version === 1
151
194
  ? ["\\\\wsl.localhost\\", "\\\\wsl$\\"]