tokentracker-cli 1.5.14 → 1.5.15
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-DqJWve1h.js → AchievementBadge-CwjI28oT.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-CnuBayj3.js → AchievementsPage-Dq544fjX.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-WRU5TxAB.js → AchievementsSection-DufV6nod.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-B5ikEQik.js → BadgeDetailModal-vw8xydKu.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-CaMG6j-6.js → BotAnimated-De0anwsh.js} +1 -1
- package/dashboard/dist/assets/{Card-BL3vxENk.js → Card-CuSeWBDM.js} +1 -1
- package/dashboard/dist/assets/{CloudCheckoutPage-CsUb8CJ7.js → CloudCheckoutPage-CxFcOwAj.js} +1 -1
- package/dashboard/dist/assets/{CloudPage-5ZiPFzeC.js → CloudPage-Beb7_JLW.js} +2 -2
- package/dashboard/dist/assets/{CommandPalette-CYd9nXW-.js → CommandPalette-PsUq2iRS.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-BItox7Sz.js → CommunityStatsModal-b54WaPbK.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-BE1ABR4z.js → ConfirmModal-_NdunIh5.js} +1 -1
- package/dashboard/dist/assets/{Controls-BRqIsaHT.js → Controls-5Is6MWln.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-Cm0YuBlx.js → DashboardPage-C0n0qC7h.js} +1 -1
- package/dashboard/dist/assets/{DateRangePopover-CRwEu66e.js → DateRangePopover-C3WfGy-0.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-DFUPsGb_.js → DevicePage-Vn6k-mGd.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-DALl4GmP.js → DialogClose-CXttnna-.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-C3KGos_G.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-BSR8ozyn.js → DialogTitle-B0cNIo0E.js} +1 -1
- package/dashboard/dist/assets/{ElectricLogo-BtrycBUW.js → ElectricLogo-DC3XSfIu.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-CfhgvLVd.js → FadeIn-H7S3TMHi.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-N8wqAdOf.js → HeaderGithubStar-xgbIo5OP.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-CwdMYIzZ.js → HoverTooltip-CpzM5Dju.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-DCRor9cb.js → IpCheckPage-BdV7S4dY.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-s9xvTHSp.js → LandingPage-D9f28ryO.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardPage-CUj3WLMo.js → LeaderboardPage--WUFpkBI.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProBadge-N4NOKZWj.js → LeaderboardProBadge-CEvrQ75Y.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardProfileModal-09HiUyxm.js → LeaderboardProfileModal-Bn0HFr5h.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-Cw9_rodG.js → LeaderboardProfilePage-DJ7fQI68.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-F8b6kZa0.js → LimitsPage-7tPDheuX.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-D1eEzDEv.js → LocalOnlyNotice-DlGbVQS8.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-0sIovG_J.js → LoginCard-BZZmzUGh.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-BT3oMVak.js → LoginModal-BT5_bIxU.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-CDsXdaE5.js → LoginPage-DMjDUPPi.js} +1 -1
- package/dashboard/dist/assets/{PetPage-BEnC1azp.js → PetPage-Dk3j6ITn.js} +2 -2
- package/dashboard/dist/assets/{PopoverPopup-Dwzp-hyf.js → PopoverPopup-pugRu3RC.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-Cu_lcuuu.js → ProviderIcon-CtmL1CmY.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-DrpEscm1.js → ResetPasswordPage-BB6U7t8P.js} +1 -1
- package/dashboard/dist/assets/{Select-wIR4qvEI.js → Select-7w1su8lw.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-CNuJgYps.js → SelectItemText-CaEUmWkj.js} +1 -1
- package/dashboard/dist/assets/{SelfHostPage-CWNLygpL.js → SelfHostPage-DctWoF-A.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-BId9t16Q.js → ServiceStatusPage-Dg3ljEXC.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-C_klx7d8.js → SessionsPage-B1dvW-be.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-nC73JaZ4.js → SettingsPage-DuXSX1R2.js} +3 -3
- package/dashboard/dist/assets/{SkillsPage-B2agou8Y.js → SkillsPage-CvXQFgc9.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-BNXUWRwa.js → TokenGalaxy-DKC8Rk_Y.js} +1 -1
- package/dashboard/dist/assets/{TooltipPopup--X2kExQ0.js → TooltipPopup-Dp9EpHLG.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-BELHsTnz.js → TrendMonitor-DWnlBn3H.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-DWp0SMXA.js → WidgetsPage-GECNmb1Q.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-DgwczKHe.js → WrappedPage-Dq_1lOnb.js} +1 -1
- package/dashboard/dist/assets/{__vite-browser-external-BHphZRSC.js → __vite-browser-external-CkF0pdTJ.js} +2 -2
- package/dashboard/dist/assets/{agent-logos-Cfx5WzU5.js → agent-logos-Dqe3Vrah.js} +1 -1
- package/dashboard/dist/assets/{arrow-left-D83SdANw.js → arrow-left-Cr_2QnDu.js} +1 -1
- package/dashboard/dist/assets/{arrow-right-D7ye9bmJ.js → arrow-right-BsK2sJgt.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-CLmwEwwC.js → arrow-up-right-DkWMGqXo.js} +1 -1
- package/dashboard/dist/assets/{calendar-days-D1qLlvh4.js → calendar-days-BB9VV438.js} +1 -1
- package/dashboard/dist/assets/{check-BHJvi4ey.js → check-bpSCJZWh.js} +1 -1
- package/dashboard/dist/assets/{chevron-down-6RBPKNpt.js → chevron-down-CtECtDmx.js} +1 -1
- package/dashboard/dist/assets/{cloud-checkout-DgWcF-at.js → cloud-checkout-C4PrzKhN.js} +1 -1
- package/dashboard/dist/assets/{composite-D-0pfyMY.js → composite-BHisG82k.js} +1 -1
- package/dashboard/dist/assets/{copy-B6mJSQsD.js → copy-Dmxzd-Sw.js} +1 -1
- package/dashboard/dist/assets/{download-D31Nn-bI.js → download-CkdQzw2w.js} +1 -1
- package/dashboard/dist/assets/{external-link-C_lK9S3p.js → external-link-C971FjvC.js} +1 -1
- package/dashboard/dist/assets/{flame-1ZxhHshT.js → flame-mKbp7kxw.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-DJk25SkD.js → format-tokens-C35FrJnH.js} +1 -1
- package/dashboard/dist/assets/{gift-BUZzFh-1.js → gift-BX2lSOmc.js} +1 -1
- package/dashboard/dist/assets/{icons-BVPThCa4.js → icons-ov92u52T.js} +1 -1
- package/dashboard/dist/assets/{index-CjPsyTl7.js → index-9OCL-BL8.js} +1 -1
- package/dashboard/dist/assets/{index-C0zFsOWh.js → index-Bgm38oHe.js} +1 -1
- package/dashboard/dist/assets/{index-CzstoU6d.js → index-Ca5xkNrK.js} +1 -1
- package/dashboard/dist/assets/{index-B-mxrdIz.js → index-DF03nIHb.js} +1 -1
- package/dashboard/dist/assets/{info-DmU-vlJ6.js → info-B-f9hWcw.js} +1 -1
- package/dashboard/dist/assets/{link-2-BlBM7uw7.js → link-2-l1wuezTo.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-Dhrb_Ocy.js → loader-circle-Lmjrs8XX.js} +1 -1
- package/dashboard/dist/assets/{local-usage-transfer-BudmMtkd.js → local-usage-transfer-Ds6cF41d.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-kmw1VM8W.js → modifiers.esm-tVlltJXO.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-DtjXNC_x.js → monitor-smartphone-XRiYiY8u.js} +1 -1
- package/dashboard/dist/assets/{play-9w46lbjy.js → play-DaD9EMjk.js} +1 -1
- package/dashboard/dist/assets/{plus-DAf_WGKT.js → plus-D30fbsKQ.js} +1 -1
- package/dashboard/dist/assets/{provider-display-BZ0XlB2q.js → provider-display-CKdhBOwz.js} +1 -1
- package/dashboard/dist/assets/{react-B01ZJuZY.js → react-BY0y0K4x.js} +1 -1
- package/dashboard/dist/assets/{safePolygon-B6_x12Gb.js → safePolygon-CSG_P7rG.js} +1 -1
- package/dashboard/dist/assets/{search-D3dW9GbV.js → search-Kiq8wVHA.js} +1 -1
- package/dashboard/dist/assets/{server-C2XZBar7.js → server-CjovGBGz.js} +1 -1
- package/dashboard/dist/assets/{shield-check-4FX5vbS7.js → shield-check-DF9MmMCq.js} +1 -1
- package/dashboard/dist/assets/{skills-api-BvW_MUyg.js → skills-api-CEzr6p92.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-CAa_BJgh.js → sortable.esm-D7jd9mE_.js} +1 -1
- package/dashboard/dist/assets/{store-2AX2MNkz.js → store-D9_jo_do.js} +1 -1
- package/dashboard/dist/assets/{terminal-CON7n_ir.js → terminal-CLOlvzR-.js} +1 -1
- package/dashboard/dist/assets/{trash-C2f88jSi.js → trash-DIe0fsDD.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-CgQu43xV.js → use-community-stats-gDkdiRBz.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-lShM46-3.js → use-latest-request-guard-tXGuKvua.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-8o7pbEg0.js → use-limits-display-prefs-CCuLFy00.js} +1 -1
- package/dashboard/dist/assets/{use-native-settings-dN8shG3M.js → use-native-settings-hgYqaiR7.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-beJy2IqQ.js → use-ordered-list-D6-YzYJI.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-DfbDxs5a.js +1 -0
- package/dashboard/dist/assets/{use-transform-cJpAQr2d.js → use-transform-BEiXvAuE.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-CuusZA6b.js → use-usage-limits-BlwtyPtT.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-Cx9UsKJK.js → useCurrency-CwCGJLHb.js} +1 -1
- package/dashboard/dist/assets/{usePositioner-TEClK6mF.js → usePositioner-BqHtRIrE.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-BNwTLiac.js → useTokenFormat-BUNBUX-x.js} +1 -1
- package/dashboard/dist/assets/{zap-CFgbVEhC.js → zap-C0RFs2qQ.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/limits-cache.js +475 -0
- package/src/lib/pricing/curated-overrides.json +24 -0
- package/src/lib/pricing/matcher.js +4 -1
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +43 -47
- package/src/lib/usage-limits.js +370 -1063
- package/dashboard/dist/assets/DialogDescription-CO0hykis.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-S0bR_G1B.js +0 -1
package/src/lib/rollout.js
CHANGED
|
@@ -11641,26 +11641,14 @@ async function parseWorkbuddyIncremental({
|
|
|
11641
11641
|
const startOffset = stat.size < prevSize || inodeChanged ? 0 : prevSize;
|
|
11642
11642
|
if (stat.size <= startOffset) continue;
|
|
11643
11643
|
|
|
11644
|
-
|
|
11645
|
-
|
|
11646
|
-
stream = fssync.createReadStream(filePath, {
|
|
11647
|
-
encoding: "utf8",
|
|
11648
|
-
start: startOffset,
|
|
11649
|
-
});
|
|
11650
|
-
} catch { continue; }
|
|
11651
|
-
const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
|
|
11652
|
-
|
|
11653
|
-
for await (const line of rl) {
|
|
11654
|
-
if (!line || !line.trim()) continue;
|
|
11655
|
-
let entry;
|
|
11656
|
-
try { entry = JSON.parse(line); } catch { continue; }
|
|
11657
|
-
if (!entry || typeof entry !== "object") continue;
|
|
11644
|
+
const committedEndOffset = await scanOmpLikeTranscript(filePath, startOffset, OMP_LIKE_MAX_RECORD_BYTES, (entry) => {
|
|
11645
|
+
if (!entry || typeof entry !== "object") return;
|
|
11658
11646
|
|
|
11659
11647
|
// Usage is carried on ANY record with providerData.rawUsage — assistant
|
|
11660
11648
|
// messages AND function_call records. Aggregate them all; dedup per id.
|
|
11661
11649
|
const provider = entry.providerData;
|
|
11662
11650
|
const rawUsage = provider && typeof provider === "object" ? provider.rawUsage : null;
|
|
11663
|
-
if (!rawUsage || typeof rawUsage !== "object")
|
|
11651
|
+
if (!rawUsage || typeof rawUsage !== "object") return;
|
|
11664
11652
|
|
|
11665
11653
|
const sessionId =
|
|
11666
11654
|
typeof entry.sessionId === "string" && entry.sessionId
|
|
@@ -11668,10 +11656,10 @@ async function parseWorkbuddyIncremental({
|
|
|
11668
11656
|
: path.basename(filePath, ".jsonl");
|
|
11669
11657
|
const sqliteSession = sqliteSessions[sessionId];
|
|
11670
11658
|
if (sqliteSession?.detailed || tracedSessionIds.has(sessionId)) {
|
|
11671
|
-
|
|
11659
|
+
return;
|
|
11672
11660
|
}
|
|
11673
11661
|
const tsMs =
|
|
11674
|
-
Number.isFinite(Number(entry.timestamp)) && Number(entry.timestamp) > 0
|
|
11662
|
+
Number.isFinite(new Date(Number(entry.timestamp)).getTime()) && Number(entry.timestamp) > 0
|
|
11675
11663
|
? Number(entry.timestamp)
|
|
11676
11664
|
: null;
|
|
11677
11665
|
// One usage record per LLM round-trip; providerData.messageId is the
|
|
@@ -11688,24 +11676,24 @@ async function parseWorkbuddyIncremental({
|
|
|
11688
11676
|
: tsMs != null
|
|
11689
11677
|
? `${sessionId}:${tsMs}`
|
|
11690
11678
|
: null;
|
|
11691
|
-
if (!messageId)
|
|
11692
|
-
if (seenIds.has(messageId))
|
|
11679
|
+
if (!messageId) return;
|
|
11680
|
+
if (seenIds.has(messageId)) return;
|
|
11693
11681
|
|
|
11694
11682
|
recordsProcessed++;
|
|
11695
11683
|
|
|
11696
11684
|
const delta = workbuddyUsageDelta(rawUsage);
|
|
11697
11685
|
if (delta.total_tokens === 0) {
|
|
11698
11686
|
seenIds.add(messageId);
|
|
11699
|
-
|
|
11687
|
+
return;
|
|
11700
11688
|
}
|
|
11701
11689
|
|
|
11702
11690
|
if (tsMs == null) {
|
|
11703
11691
|
seenIds.add(messageId);
|
|
11704
|
-
|
|
11692
|
+
return;
|
|
11705
11693
|
}
|
|
11706
11694
|
const tsIso = new Date(tsMs).toISOString();
|
|
11707
11695
|
const bucketStart = toUtcHalfHourStart(tsIso);
|
|
11708
|
-
if (!bucketStart)
|
|
11696
|
+
if (!bucketStart) return;
|
|
11709
11697
|
|
|
11710
11698
|
const model =
|
|
11711
11699
|
normalizeModelInput(provider.model) ||
|
|
@@ -11735,14 +11723,14 @@ async function parseWorkbuddyIncremental({
|
|
|
11735
11723
|
bucketsQueued: touchedBuckets.size,
|
|
11736
11724
|
});
|
|
11737
11725
|
}
|
|
11738
|
-
}
|
|
11726
|
+
}, { recoverReadErrors: true });
|
|
11739
11727
|
|
|
11740
|
-
|
|
11741
|
-
|
|
11728
|
+
// As in the project pass, acknowledge only records consumed in full. An
|
|
11729
|
+
// unfinished tail or an append after EOF must remain visible next sync.
|
|
11742
11730
|
fileOffsets[filePath] = {
|
|
11743
|
-
size:
|
|
11744
|
-
mtimeMs:
|
|
11745
|
-
ino:
|
|
11731
|
+
size: committedEndOffset,
|
|
11732
|
+
mtimeMs: stat.mtimeMs,
|
|
11733
|
+
ino: stat.ino,
|
|
11746
11734
|
};
|
|
11747
11735
|
}
|
|
11748
11736
|
|
|
@@ -11850,7 +11838,7 @@ async function parseWorkbuddyIncremental({
|
|
|
11850
11838
|
if (sqliteSession?.detailed || tracedSessionIds.has(sessionId)) return;
|
|
11851
11839
|
|
|
11852
11840
|
const tsMs =
|
|
11853
|
-
Number.isFinite(Number(entry.timestamp)) && Number(entry.timestamp) > 0
|
|
11841
|
+
Number.isFinite(new Date(Number(entry.timestamp)).getTime()) && Number(entry.timestamp) > 0
|
|
11854
11842
|
? Number(entry.timestamp)
|
|
11855
11843
|
: null;
|
|
11856
11844
|
if (tsMs == null) return;
|
|
@@ -11890,6 +11878,7 @@ async function parseWorkbuddyIncremental({
|
|
|
11890
11878
|
addTotals(projectBucket.totals, delta);
|
|
11891
11879
|
projectTouchedBuckets.add(projectBucketKey(projectKey, source, bucketStart));
|
|
11892
11880
|
},
|
|
11881
|
+
{ recoverReadErrors: true },
|
|
11893
11882
|
);
|
|
11894
11883
|
|
|
11895
11884
|
// Commit only past records that were read in full: a record appended
|
|
@@ -16891,7 +16880,7 @@ function ompEntryTimestampMs(msg, entry) {
|
|
|
16891
16880
|
// records are orders of magnitude smaller.
|
|
16892
16881
|
const OMP_LIKE_MAX_RECORD_BYTES = 64 * 1024 * 1024;
|
|
16893
16882
|
|
|
16894
|
-
async function scanOmpLikeTranscript(filePath, startOffset, maxRecordBytes, onEntry) {
|
|
16883
|
+
async function scanOmpLikeTranscript(filePath, startOffset, maxRecordBytes, onEntry, { recoverReadErrors = false } = {}) {
|
|
16895
16884
|
let stream;
|
|
16896
16885
|
try {
|
|
16897
16886
|
stream = fssync.createReadStream(filePath, { start: startOffset });
|
|
@@ -16900,26 +16889,33 @@ async function scanOmpLikeTranscript(filePath, startOffset, maxRecordBytes, onEn
|
|
|
16900
16889
|
}
|
|
16901
16890
|
let scannedEndOffset = startOffset;
|
|
16902
16891
|
let committedEndOffset = startOffset;
|
|
16903
|
-
|
|
16904
|
-
|
|
16905
|
-
|
|
16906
|
-
|
|
16907
|
-
|
|
16908
|
-
|
|
16909
|
-
|
|
16910
|
-
|
|
16892
|
+
try {
|
|
16893
|
+
for await (const record of physicalJsonlRecords(stream, {
|
|
16894
|
+
invalidUtf8: "record",
|
|
16895
|
+
maxRecordBytes,
|
|
16896
|
+
})) {
|
|
16897
|
+
scannedEndOffset += record.physicalBytes;
|
|
16898
|
+
if (record.terminated) {
|
|
16899
|
+
committedEndOffset = scannedEndOffset;
|
|
16900
|
+
if (record.oversized || !record.utf8Valid || !record.line || !record.line.trim()) continue;
|
|
16901
|
+
let entry;
|
|
16902
|
+
try { entry = JSON.parse(record.line); } catch { continue; }
|
|
16903
|
+
onEntry(entry);
|
|
16904
|
+
continue;
|
|
16905
|
+
}
|
|
16906
|
+
// A final incomplete record may still be in the process of being written.
|
|
16907
|
+
if (record.oversized || !record.utf8Valid || !record.line || !record.line.trim()) break;
|
|
16911
16908
|
let entry;
|
|
16912
|
-
try { entry = JSON.parse(record.line); } catch {
|
|
16909
|
+
try { entry = JSON.parse(record.line); } catch { break; }
|
|
16913
16910
|
onEntry(entry);
|
|
16914
|
-
|
|
16911
|
+
committedEndOffset = scannedEndOffset;
|
|
16912
|
+
break;
|
|
16915
16913
|
}
|
|
16916
|
-
|
|
16917
|
-
|
|
16918
|
-
|
|
16919
|
-
|
|
16920
|
-
|
|
16921
|
-
committedEndOffset = scannedEndOffset;
|
|
16922
|
-
break;
|
|
16914
|
+
} catch (error) {
|
|
16915
|
+
// WorkBuddy can publish complete records and continue with other files or
|
|
16916
|
+
// fallbacks after a read failure. Unfinished bytes are never acknowledged.
|
|
16917
|
+
// Do not swallow callback/parser errors, or change other readers' policy.
|
|
16918
|
+
if (!recoverReadErrors || stream.errored !== error) throw error;
|
|
16923
16919
|
}
|
|
16924
16920
|
return committedEndOffset;
|
|
16925
16921
|
}
|