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.
- package/README.de.md +6 -4
- package/README.ja.md +6 -4
- package/README.ko.md +6 -4
- package/README.md +7 -4
- package/README.zh-CN.md +6 -4
- package/dashboard/dist/assets/{AchievementBadge-CX7g238N.js → AchievementBadge-BGA-HT_B.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-BbkEymra.js → AchievementsPage-CtRh5AjH.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-CmhoerE7.js → AchievementsSection-BarRcKaN.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-996i13Vf.js → BadgeDetailModal-Bg0BDAN2.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-B22CfAlF.js → BotAnimated-By9J3-dn.js} +1 -1
- package/dashboard/dist/assets/{Card-DFd9hCFB.js → Card-CIoJYi2j.js} +1 -1
- package/dashboard/dist/assets/{ClawdAnimated-DXKN28M2.js → ClawdAnimated-Dkvc2xe8.js} +2 -2
- package/dashboard/dist/assets/{CommandPalette-DVRs34TV.js → CommandPalette-BssDtHRl.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-BExjH9E8.js → CommunityStatsModal-CQrgLlDb.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-KJhOrJ98.js → ConfirmModal-C3hBPgYc.js} +1 -1
- package/dashboard/dist/assets/{Controls-xnIEnOqd.js → Controls-BSW6a1HS.js} +1 -1
- package/dashboard/dist/assets/DashboardPage-Dhv7fejy.js +1 -0
- package/dashboard/dist/assets/{DevicePage-Bo8e-KVq.js → DevicePage-D5eZn0wo.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-gBd-BmR7.js → DialogClose-BltQpaJo.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-Cof52Icj.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-B0UbsqD7.js → DialogTitle-CVddcRPZ.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-Dv2DtOPn.js → FadeIn-goPv73MT.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-1kEsgGdK.js → HeaderGithubStar-BDBrrkzt.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-DQlpkw2L.js → HoverTooltip-qyMezXOs.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-CFlkmSlA.js → IpCheckPage-Ces8JIPb.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-DNs6mSij.js → LandingPage-B2TmLGno.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-DSltCiRr.js → LeaderboardAvatar-CVVRoNua.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-CkjUMA-k.js → LeaderboardPage-xtt-bOY8.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-DJjaD7Kz.js → LeaderboardProfileModal-BM4d_I_r.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-Bue7tJoi.js → LeaderboardProfilePage-BWqhFLQX.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-Ctbvl8Q8.js → LimitsPage-BZL4Pcl8.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-LjNI8j4I.js → LocalOnlyNotice-D4gnOEJj.js} +1 -1
- package/dashboard/dist/assets/LoginCard-CB17FQ5w.js +1 -0
- package/dashboard/dist/assets/{LoginModal-CUmfCsHY.js → LoginModal-BI-O1rH4.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-CjJb9qFM.js → LoginPage-DnGzsvJ4.js} +1 -1
- package/dashboard/dist/assets/{PetPage-BWKEnBEW.js → PetPage-NRnIKMaJ.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-DeXj3kM3.js → PopoverPopup-DHoK6UJZ.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-DL-oa-UM.js → ProviderIcon-BTkdx9o2.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-CeeKMN8H.js → ResetPasswordPage-C6K0w318.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-Bx5Z9tYf.js → SegmentedControl-gEoWioBE.js} +1 -1
- package/dashboard/dist/assets/{Select-DRbgbSPd.js → Select-CI-qtEYu.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-D792o2Et.js → SelectItemText-q-yhzzjw.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-NjQ1oGqx.js → ServiceStatusPage-C4xD1CEe.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-Cr2uHP91.js → SessionsPage-CS0Yun2z.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-Av8pVbqT.js → SettingsPage-GVY_ktz4.js} +2 -2
- package/dashboard/dist/assets/{SkillsPage-feW4j329.js → SkillsPage-COPRL95O.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-DX36F36Q.js → TokenGalaxy-Czi0Ic48.js} +1 -1
- package/dashboard/dist/assets/{ToolbarRootContext-CzMlVMfI.js → ToolbarRootContext-BZkTiBJB.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-BosWE34g.js → TrendMonitor-CnIsuxV-.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-DhoypTuq.js → WidgetsPage-OdX_Fsul.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-DR6BoipR.js → WrappedPage-h9N63-F8.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-BFNWaGsk.js +45 -0
- package/dashboard/dist/assets/{agent-logos-QSScjsfz.js → agent-logos-BDiPxrST.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-BJQYadF-.js → arrow-up-right-DtFQUeJG.js} +1 -1
- package/dashboard/dist/assets/{check-CINIOTsF.js → check-C35onaNL.js} +1 -1
- package/dashboard/dist/assets/{composite-YV7-iFo_.js → composite-qxBzts0W.js} +1 -1
- package/dashboard/dist/assets/{copy-Bp_U7bAZ.js → copy-D_D71TLc.js} +1 -1
- package/dashboard/dist/assets/{download-CVOIkdjl.js → download-DMQI2hQe.js} +1 -1
- package/dashboard/dist/assets/{external-link-P6LDhEET.js → external-link-CemM4dWf.js} +1 -1
- package/dashboard/dist/assets/{flame-AbZCJ878.js → flame-CIvk0SP5.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-M5bvANSq.js → format-tokens-D3JSvcFl.js} +1 -1
- package/dashboard/dist/assets/{icons-DpRn5Rxt.js → icons-Ccf5W0AL.js} +1 -1
- package/dashboard/dist/assets/{index-KQ5H65Ds.js → index-Brd2evyz.js} +1 -1
- package/dashboard/dist/assets/{index-CW2bybhs.js → index-C8Wri_HI.js} +1 -1
- package/dashboard/dist/assets/{index-L3O7cNuj.js → index-CFXmD_KX.js} +1 -1
- package/dashboard/dist/assets/{info-GEiJwgYk.js → info-CafrKEG8.js} +1 -1
- package/dashboard/dist/assets/{link-2-D8KpexwS.js → link-2-Ds-9Nzlp.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-r0nEab80.js → loader-circle-DA4I55-V.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-azGbxGbz.js → maximize-2-CjMPt5kU.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-Cke4_92g.js → modifiers.esm-DIxTS09h.js} +1 -1
- package/dashboard/dist/assets/module-WSx8viXK.js +3 -0
- package/dashboard/dist/assets/{monitor-smartphone-BnHiLGNs.js → monitor-smartphone-IZpIOxn3.js} +1 -1
- package/dashboard/dist/assets/{plus-CJbY6Uuk.js → plus-vbLFNs70.js} +1 -1
- package/dashboard/dist/assets/{provider-display-B05KW8SE.js → provider-display-BAu_UIfV.js} +2 -2
- package/dashboard/dist/assets/{react-CingcaIm.js → react-Djb4VGKb.js} +1 -1
- package/dashboard/dist/assets/{search-CyffdJFU.js → search-Ct6LY9Ke.js} +1 -1
- package/dashboard/dist/assets/{skills-api-CdDPrjMM.js → skills-api-BnGI2gEp.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-B48YEoXA.js → sortable.esm-CjCGd6g5.js} +1 -1
- package/dashboard/dist/assets/{store-B0W0vLvA.js → store-CBxkOqRe.js} +1 -1
- package/dashboard/dist/assets/{terminal-CJ0D4hSx.js → terminal-Dlpdp5Az.js} +1 -1
- package/dashboard/dist/assets/{trash-DH-_Q3A5.js → trash-pxUSKv66.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-y6OaeOVs.js → use-community-stats-tHaixRIw.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-DP7kE0Xa.js → use-latest-request-guard-Cs44WPfL.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-Bgcto2k1.js → use-limits-display-prefs-Dw56PXWy.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-1L7o2taR.js → use-ordered-list-DpLx8oLV.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-DrlJ9X6p.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-36sqzSZl.js → use-session-efficiency-pref-BN3FtBvr.js} +1 -1
- package/dashboard/dist/assets/{use-transform-DZgeA77H.js → use-transform-C4nTGgzb.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-C5P1O9oT.js → use-usage-limits-Dmwdc1yo.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-Dwv89bBn.js → useCurrency-DSc3A_Ih.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-BGeVB81B.js → useTokenFormat-BHjcMgm8.js} +1 -1
- package/dashboard/dist/assets/{zap-D18Nt3M5.js → zap-BE8i_wu2.js} +1 -1
- package/dashboard/dist/brand-logos/trae.svg +1 -0
- package/dashboard/dist/index.html +15 -11
- package/dashboard/dist/ip-check.html +1 -1
- package/dashboard/dist/leaderboard.html +1 -1
- package/dashboard/dist/llms.txt +4 -2
- package/dashboard/dist/share.html +1 -1
- package/package.json +6 -4
- package/src/commands/init.js +20 -7
- package/src/commands/status.js +39 -9
- package/src/commands/sync.js +62 -1
- package/src/lib/pricing/curated-overrides.json +7 -0
- package/src/lib/pricing/matcher.js +5 -0
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +845 -20
- package/src/lib/trae-db.js +127 -0
- package/src/lib/trae-snapshot.js +230 -0
- package/src/lib/trae-sqlite.js +143 -0
- package/src/lib/trae-usage.js +121 -0
- package/src/lib/wsl-probe.js +55 -12
- package/dashboard/dist/assets/DashboardPage-BzsiCwjX.js +0 -1
- package/dashboard/dist/assets/DialogDescription-CTEI9PvU.js +0 -1
- package/dashboard/dist/assets/LoginCard-U_3SnvtN.js +0 -1
- package/dashboard/dist/assets/__vite-browser-external-DYTQCEz4.js +0 -45
- package/dashboard/dist/assets/module-DtWfRKM4.js +0 -3
- package/dashboard/dist/assets/use-reduced-motion-BQxHT0gI.js +0 -1
package/src/lib/wsl-probe.js
CHANGED
|
@@ -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
|
|
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
|
|
51
|
-
|
|
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 (
|
|
57
|
-
|
|
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)
|
|
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
|
-
|
|
136
|
-
|
|
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
|
|
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$\\"]
|