tokentracker-cli 0.87.16 → 0.87.17
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/dashboard/dist/assets/{AchievementBadge-DaKHLTL2.js → AchievementBadge-BsEQ2tmj.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-DJdtjodG.js → AchievementsPage-DaIE18Oj.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-DVtxGDIP.js → AchievementsSection-D5Chjra6.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-CF2dlQkT.js → BadgeDetailModal-DiF5CC4Q.js} +1 -1
- package/dashboard/dist/assets/{Card-DuQWS5aB.js → Card-Bh1l9XVa.js} +1 -1
- package/dashboard/dist/assets/{ClawdAnimated-l8AN6_pc.js → ClawdAnimated-B2tb_uy9.js} +1 -1
- package/dashboard/dist/assets/{CommandPalette-DWKyGhWG.js → CommandPalette-BDYmI6KM.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-CoJ9i3QH.js → CommunityStatsModal-DZDixdxG.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-DM6A6p4g.js → ConfirmModal-B3HhWPG1.js} +1 -1
- package/dashboard/dist/assets/{Controls-DBUMibne.js → Controls-eSVS0G3S.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-BgVXjT0v.js → DashboardPage-DMyBPJ9W.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-Beby6BhC.js → DevicePage-BhpTKx-c.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-nwx-N3WL.js → DialogClose-Dt2M164c.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-D0EQV4SO.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-Cw53obf0.js → DialogTitle-CBQEeY1z.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-CTTwoVh-.js → FadeIn-9wsSzh_a.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-BvaEHM9B.js → HeaderGithubStar-BOg2yeJ0.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-CbJqz6cF.js → HoverTooltip-OaMkhUbs.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-I0REWeew.js → IpCheckPage-BFaVui2O.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-CuMWPQBC.js → LandingPage-CGybB6xR.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-MHfIP4_U.js → LeaderboardAvatar-DFR_SDle.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-DfDM-dH9.js → LeaderboardPage-Dx3nyCZc.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-hmpU-JV7.js → LeaderboardProfileModal-B9nLJTGv.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-DtUb4dDZ.js → LeaderboardProfilePage-B4vNvdiq.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-CtA0c2G5.js → LimitsPage-D-J5R4qu.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-WI3Oke4U.js → LocalOnlyNotice-CeJ1Dv_8.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-DMprjRI7.js → LoginCard-CHQRkWQs.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-DffmK0ro.js → LoginModal-B5559j1K.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-B2ZgB6K7.js → LoginPage-C1P2Quq6.js} +1 -1
- package/dashboard/dist/assets/{PetPage-D_U7yXgF.js → PetPage-Wt-HcAHU.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-Ph-9l9jU.js → PopoverPopup-CVI4w0E6.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-D2s_KSYC.js → ProviderIcon-BswKVGR0.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-Cpg2C8BI.js → ResetPasswordPage-sRWSceeH.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-C89jlPzS.js → SegmentedControl-bXs9Ly1S.js} +1 -1
- package/dashboard/dist/assets/{Select-BLPgobGl.js → Select-BxZQJSA8.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-CLTEQqQZ.js → SelectItemText-BhC7_m4l.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-Bd1ec7bz.js → ServiceStatusPage-DnoQGIzM.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-HPbQDLZ5.js → SessionsPage-D_rk7urK.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-CwfcRYYu.js → SettingsPage-d1uhJJUI.js} +1 -1
- package/dashboard/dist/assets/{SkillsPage-DflhF8pa.js → SkillsPage-Dmv3vfV2.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-CylVSV2J.js → TokenGalaxy-BRozBDv9.js} +1 -1
- package/dashboard/dist/assets/{ToolbarRootContext-BzBAJ8C5.js → ToolbarRootContext-BxAIwde2.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-B0IzqLaN.js → TrendMonitor-bTygbWe4.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-Bvt5JCoS.js → WidgetsPage-Bdgv5NIE.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-BXjDpjD_.js → WrappedPage-tLVxl_4c.js} +1 -1
- package/dashboard/dist/assets/{__vite-browser-external-CDv96ZcG.js → __vite-browser-external-DFfWg5Zv.js} +2 -2
- package/dashboard/dist/assets/{agent-logos-bPIt1QVl.js → agent-logos-DVtP3hhF.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-C_6NrnRB.js → arrow-up-right-a--zz4P2.js} +1 -1
- package/dashboard/dist/assets/{check-ovHAYNwt.js → check-Cb87RDI8.js} +1 -1
- package/dashboard/dist/assets/{chevron-right-BeHvjzPf.js → chevron-right-BaXnYJmR.js} +1 -1
- package/dashboard/dist/assets/{copy-DRQHwFKm.js → copy-BP5bVEyA.js} +1 -1
- package/dashboard/dist/assets/{download-qPfSWDyf.js → download-DqquZt0D.js} +1 -1
- package/dashboard/dist/assets/{external-link-t7Qbyp7r.js → external-link-iXDmG0bb.js} +1 -1
- package/dashboard/dist/assets/{flame-DlRdMOxO.js → flame-DHqiSC5J.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-DP1DrOxZ.js → format-tokens-DsygRhxH.js} +1 -1
- package/dashboard/dist/assets/{icons-DBgKdjpV.js → icons-D6xBLJA4.js} +1 -1
- package/dashboard/dist/assets/{index-BFaAjCwg.js → index-DSrgwJkM.js} +1 -1
- package/dashboard/dist/assets/{index-C1wNjCL_.js → index-HfUVkowX.js} +1 -1
- package/dashboard/dist/assets/{index-Dtzl1NhK.js → index-cM3RnbJG.js} +1 -1
- package/dashboard/dist/assets/{info-D9fn_ZQQ.js → info-Cui6vFPM.js} +1 -1
- package/dashboard/dist/assets/{limits-providers-JyTKN-3e.js → limits-providers-CdzvnLpk.js} +1 -1
- package/dashboard/dist/assets/{link-2-CmnuQiZs.js → link-2-DX3nm7aU.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-Bm3FqDLX.js → loader-circle-C8Sw1OT7.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-CutKDynW.js → maximize-2-Czi9wWkF.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-C94MH21S.js → modifiers.esm-BmnoKiX1.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-wSLhNWq5.js → monitor-smartphone-B0J0HWPL.js} +1 -1
- package/dashboard/dist/assets/{provider-display-CR8o_M3v.js → provider-display-C6qI5Ghp.js} +1 -1
- package/dashboard/dist/assets/{react-Cc1Ca2uE.js → react-BVu5drox.js} +1 -1
- package/dashboard/dist/assets/{search-BXeDDAWS.js → search-C1-spbaq.js} +1 -1
- package/dashboard/dist/assets/{skills-api-DBP8kM7W.js → skills-api-C3VUeo0l.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-Cd_ODlnX.js → sortable.esm-vred0beO.js} +1 -1
- package/dashboard/dist/assets/{store-lmptvFHG.js → store-B4CtFHMN.js} +1 -1
- package/dashboard/dist/assets/{terminal-965BMhR0.js → terminal-CCly6A7O.js} +1 -1
- package/dashboard/dist/assets/{trash-2-wq5YeaAT.js → trash-2-Doikp-3o.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-BCIgHdTZ.js → use-community-stats-4JEUXgQD.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-D0MB2ewv.js → use-limits-display-prefs-CvmEm5O5.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-DrQsh022.js → use-ordered-list-Cwd6mjTH.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-DqkEunos.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-BeBSADa-.js → use-session-efficiency-pref-DSE0hMDn.js} +1 -1
- package/dashboard/dist/assets/{use-transform-fRpwp-G3.js → use-transform-CHAOJvjo.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-C0Tk-ghm.js → use-usage-limits-DqjvXdmC.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-BAZNRyKh.js → useCurrency-C6VcRFbY.js} +1 -1
- package/dashboard/dist/assets/{useScrollLock-CU659jBG.js → useScrollLock-BtQ9MIFV.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-l0Xd62a5.js → useTokenFormat-DVtSl1vw.js} +1 -1
- package/dashboard/dist/assets/{zap-CWFkq16a.js → zap-Bqvqpei6.js} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/dashboard/dist/ip-check.html +1 -1
- package/dashboard/dist/leaderboard.html +1 -1
- package/dashboard/dist/share.html +1 -1
- package/package.json +1 -1
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/session-analytics.js +55 -1
- package/dashboard/dist/assets/DialogDescription-BFVB627n.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-DhNppA5X.js +0 -1
|
@@ -795,6 +795,59 @@ function providerRoots(home, providerDir, env, deps = {}) {
|
|
|
795
795
|
return [...new Set(roots)];
|
|
796
796
|
}
|
|
797
797
|
|
|
798
|
+
// Collapse the same Claude session discovered under more than one root.
|
|
799
|
+
//
|
|
800
|
+
// Codex gets this from its session-id pass below; Claude only ever had per-file
|
|
801
|
+
// message dedup (`claudeMessageDedupKey` inside `scanClaudeSession`), which
|
|
802
|
+
// cannot see a second copy of the same file under a different path spelling.
|
|
803
|
+
// Every discovered path becomes its own row keyed by the resolved file path, so
|
|
804
|
+
// a WSL `$HOME` pointing at the Windows profile — the same files reachable as
|
|
805
|
+
// both `C:\Users\dev\.claude\...` and `\\wsl$\Ubuntu\home\dev\.claude\...` —
|
|
806
|
+
// duplicated sessions in the browser, the project list and the CSV export.
|
|
807
|
+
//
|
|
808
|
+
// Cross-root only, on purpose: a single root is passed through verbatim, so
|
|
809
|
+
// single-install machines are unaffected, and two same-named files inside one
|
|
810
|
+
// tree stay distinct (unproven identity must not delete a session). A basename
|
|
811
|
+
// without a session UUID never participates either.
|
|
812
|
+
function dedupeClaudeFilesAcrossRoots(groups) {
|
|
813
|
+
const rootGroups = (groups || []).filter((group) => Array.isArray(group) && group.length > 0);
|
|
814
|
+
if (rootGroups.length <= 1) return [...new Set(rootGroups[0] || [])];
|
|
815
|
+
|
|
816
|
+
const mtimeOf = (filePath) => {
|
|
817
|
+
try { return fs.statSync(filePath).mtimeMs; } catch { return -Infinity; }
|
|
818
|
+
};
|
|
819
|
+
// Preserve root order for everything kept, so native precedence is stable.
|
|
820
|
+
// Claims are compared only against EARLIER roots: two same-UUID files inside
|
|
821
|
+
// one tree are siblings, not copies, and must both survive.
|
|
822
|
+
const ordered = [];
|
|
823
|
+
const winnerBySession = new Map();
|
|
824
|
+
for (const group of rootGroups) {
|
|
825
|
+
const claimedHere = new Map();
|
|
826
|
+
for (const filePath of group) {
|
|
827
|
+
const id = path.basename(filePath).match(/^([0-9a-f-]{36})\.jsonl$/i)?.[1] || null;
|
|
828
|
+
if (!id || claimedHere.has(id)) {
|
|
829
|
+
// No session identity, or a sibling within this same root.
|
|
830
|
+
if (!ordered.includes(filePath)) ordered.push(filePath);
|
|
831
|
+
continue;
|
|
832
|
+
}
|
|
833
|
+
claimedHere.set(id, filePath);
|
|
834
|
+
const previous = winnerBySession.get(id);
|
|
835
|
+
if (previous === undefined) {
|
|
836
|
+
winnerBySession.set(id, filePath);
|
|
837
|
+
ordered.push(filePath);
|
|
838
|
+
continue;
|
|
839
|
+
}
|
|
840
|
+
if (previous === filePath) continue;
|
|
841
|
+
// Same session in an earlier root: keep the newer file, mirroring Codex.
|
|
842
|
+
if (mtimeOf(filePath) > mtimeOf(previous)) {
|
|
843
|
+
winnerBySession.set(id, filePath);
|
|
844
|
+
ordered[ordered.indexOf(previous)] = filePath;
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
return [...new Set(ordered)];
|
|
849
|
+
}
|
|
850
|
+
|
|
798
851
|
async function discoverSessionFiles(home, env = process.env, deps = {}) {
|
|
799
852
|
const grokHome = resolveGrokHome(home);
|
|
800
853
|
const claudeRoots = providerRoots(home, ".claude", env, deps);
|
|
@@ -805,7 +858,7 @@ async function discoverSessionFiles(home, env = process.env, deps = {}) {
|
|
|
805
858
|
Promise.all(codexRoots.map((r) => listRolloutFilesDeep(path.join(r, "archived_sessions")))),
|
|
806
859
|
listGrokSessionFiles(path.join(grokHome, "sessions")),
|
|
807
860
|
]);
|
|
808
|
-
const allClaude =
|
|
861
|
+
const allClaude = dedupeClaudeFilesAcrossRoots(claudeGroups);
|
|
809
862
|
const codex = [...new Set(codexGroups.flat())];
|
|
810
863
|
const archived = [...new Set(archivedGroups.flat())];
|
|
811
864
|
// Claude Memory stores thousands of background observer transcripts beside
|
|
@@ -1302,4 +1355,5 @@ module.exports = {
|
|
|
1302
1355
|
resumeCommandFor,
|
|
1303
1356
|
sessionsToCsv,
|
|
1304
1357
|
providerRoots,
|
|
1358
|
+
dedupeClaudeFilesAcrossRoots,
|
|
1305
1359
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as n,z as a}from"./__vite-browser-external-CDv96ZcG.js";import{u as p}from"./DialogTitle-Cw53obf0.js";import{u as c}from"./useScrollLock-CU659jBG.js";const x=n.forwardRef(function(e,r){const{render:l,className:u,style:m,id:s,...t}=e,{store:i}=p(),o=c(s);return i.useSyncedValueWithCleanup("descriptionElementId",o),a("p",e,{ref:r,props:[{id:o},t]})});export{x as D};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as o}from"./__vite-browser-external-CDv96ZcG.js";import{h as r,i as t,p as s}from"./react-Cc1Ca2uE.js";function i(){!r.current&&t();const[e]=o.useState(s.current);return e}export{i as u};
|