tokentracker-cli 0.79.2 → 0.79.3
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.md +2 -1
- package/dashboard/dist/assets/{AchievementBadge-DcDkcyk4.js → AchievementBadge-D4y9TmOk.js} +1 -1
- package/dashboard/dist/assets/AchievementsPage-DS3hcXW3.js +2 -0
- package/dashboard/dist/assets/{AchievementsSection-Cj13lk07.js → AchievementsSection-sOuVI3-z.js} +1 -1
- package/dashboard/dist/assets/{ActivityHeatmap-BCBaXKEP.js → ActivityHeatmap-jJt8aA5M.js} +1 -1
- package/dashboard/dist/assets/BadgeDetailModal-CHgpOAWK.js +1 -0
- package/dashboard/dist/assets/{Card-DT8qXml-.js → Card-DcemIHEP.js} +1 -1
- package/dashboard/dist/assets/{ClawdAnimated-BzsZjNGN.js → ClawdAnimated-Dk-ntu0G.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-Byx0RRzc.js → CommunityStatsModal-C2cgLBDs.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-oyMOnK7G.js → ConfirmModal-DBZfpvtk.js} +1 -1
- package/dashboard/dist/assets/{Controls-PMRhKPF-.js → Controls-UFvEesRA.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-1aUdHjJF.js → DashboardPage-BToa8M-J.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-CGLIyRA8.js → DevicePage-B8Nck7JW.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-zLe-zrd-.js → DialogClose-Dfihq8q8.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-DfquPrZi.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-hGgP0eky.js → DialogTitle-D0HiKy0w.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-DeoGuCrV.js → FadeIn-c3bTGh3l.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-CSZ0XQLV.js → HeaderGithubStar-CzKcC9Jg.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-CJlsBtiO.js → IpCheckPage-C7x35n7P.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-CK-aWD2Y.js → LandingPage-DLH_jB5q.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardAvatar-hrfyPkYI.js → LeaderboardAvatar-CMgChQH5.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-CsMfaxrd.js → LeaderboardPage-B8WDYUxC.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-C7mhM6ih.js → LeaderboardProfileModal-BD3-6u3a.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-CXyrCZiT.js → LeaderboardProfilePage-DL4j2bTp.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-Ck_M1OHJ.js → LimitsPage-Be_Qk6tl.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-BzI7RWAf.js → LocalOnlyNotice-DGDu9yQl.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-BUm6w7Np.js → LoginPage-Dw8ooZOV.js} +1 -1
- package/dashboard/dist/assets/{PetPage-DtAyFM55.js → PetPage-Dt3M7OF2.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-BlkcABOL.js → PopoverPopup-LCpLUMc-.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-CBSVeUPI.js → ResetPasswordPage-CCRj3uSX.js} +1 -1
- package/dashboard/dist/assets/{Select-BJhSVz1k.js → Select-D0w7WXDx.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-B9zmI-iv.js → SelectItemText-D7HsWk7Z.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-DviHKn3P.js → SettingsPage-VGq_2a13.js} +1 -1
- package/dashboard/dist/assets/{SkillsPage-B79FutnV.js → SkillsPage-QB6olgRR.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-AwJIXxE9.js → WidgetsPage-DzcS58aO.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-CTJB07D4.js → WrappedPage-DKaebmhN.js} +1 -1
- package/dashboard/dist/assets/{agent-logos-BPUbc3yd.js → agent-logos-Cxy2NvsG.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-CZZ-UM4M.js → arrow-up-right-Dsr7553I.js} +1 -1
- package/dashboard/dist/assets/check-fkeVu4q7.js +1 -0
- package/dashboard/dist/assets/{copy-BGaQZ7P5.js → copy-BLpiipXT.js} +1 -1
- package/dashboard/dist/assets/{download-BKHLHuIT.js → download-CegOkASz.js} +1 -1
- package/dashboard/dist/assets/{flame-sZg_y2Ct.js → flame-Bx7W9Emo.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-Ck8WH-5G.js → format-tokens-CoDA_tgu.js} +1 -1
- package/dashboard/dist/assets/{info-wPFCesi6.js → info-BC6336sc.js} +1 -1
- package/dashboard/dist/assets/{link-2-u9AJ19mI.js → link-2-8W7lg5jw.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-B_RhUksQ.js → loader-circle-BVk3_uJH.js} +1 -1
- package/dashboard/dist/assets/{main-rco_Tu2D.js → main-2rU09Xvg.js} +5 -4
- package/dashboard/dist/assets/{trash-2-BWfZEWVm.js → trash-2-BSL_tgQx.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-C_l8jtn9.js → use-community-stats-8SvgeAOl.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-CDMXqVgA.js → use-limits-display-prefs-B5Pr_mvG.js} +1 -1
- package/dashboard/dist/assets/{use-native-settings-Bgi3a5uc.js → use-native-settings-CXYkTApS.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-DbLNv_Fs.js → use-ordered-list-DMLlb4Cb.js} +1 -1
- package/dashboard/dist/assets/{use-quality-per-dollar-pref-ByfXALmd.js → use-quality-per-dollar-pref-XD--EY2E.js} +1 -1
- package/dashboard/dist/assets/{use-transform-h2Jds0kA.js → use-transform-BeUI90Ih.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-Dg7aMrVT.js → use-usage-limits-DFqkX-js.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-x0Nv5rZP.js → useCurrency-UlYLOMmQ.js} +1 -1
- package/dashboard/dist/assets/{useScrollLock-DGfYuwgo.js → useScrollLock-YVJvj688.js} +1 -1
- package/dashboard/dist/assets/{zap-BQ6Eilqi.js → zap-Bd6cuD_S.js} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/dashboard/dist/share.html +1 -1
- package/package.json +2 -2
- package/src/commands/init.js +14 -0
- package/src/commands/status.js +13 -0
- package/src/commands/sync.js +24 -0
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +288 -0
- package/dashboard/dist/assets/AchievementsPage-CV3Bwdzf.js +0 -2
- package/dashboard/dist/assets/BadgeDetailModal-DCOLG1fl.js +0 -1
- package/dashboard/dist/assets/DialogDescription-DT5tiXAh.js +0 -1
- package/dashboard/dist/assets/check-DZawOdAk.js +0 -1
package/src/lib/rollout.js
CHANGED
|
@@ -7778,6 +7778,290 @@ async function parseZedIncremental({
|
|
|
7778
7778
|
return { recordsProcessed, eventsAggregated, bucketsQueued };
|
|
7779
7779
|
}
|
|
7780
7780
|
|
|
7781
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
7782
|
+
// AnythingLLM Desktop (Mintplex Labs)
|
|
7783
|
+
//
|
|
7784
|
+
// Data: SQLite at
|
|
7785
|
+
// macOS: ~/Library/Application Support/anythingllm-desktop/storage/anythingllm.db
|
|
7786
|
+
// Linux: $XDG_CONFIG_HOME/anythingllm-desktop/storage/anythingllm.db
|
|
7787
|
+
// Windows: %APPDATA%\anythingllm-desktop\storage\anythingllm.db
|
|
7788
|
+
// Override: $TOKENTRACKER_ANYTHINGLLM_DB
|
|
7789
|
+
//
|
|
7790
|
+
// AnythingLLM >= 1.7.1 stores per-message prompt/completion/total counts in
|
|
7791
|
+
// workspace_chats.response.metrics. The SQL projection below extracts only
|
|
7792
|
+
// those numeric metrics and the model identifier — prompts, response
|
|
7793
|
+
// text, sources, and attachments never leave SQLite.
|
|
7794
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
7795
|
+
|
|
7796
|
+
const ANYTHINGLLM_PENDING_MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
7797
|
+
|
|
7798
|
+
function resolveAnythingllmDbPath(env = process.env, platform = process.platform) {
|
|
7799
|
+
const override = typeof env.TOKENTRACKER_ANYTHINGLLM_DB === "string"
|
|
7800
|
+
? env.TOKENTRACKER_ANYTHINGLLM_DB.trim()
|
|
7801
|
+
: "";
|
|
7802
|
+
if (override) return override;
|
|
7803
|
+
|
|
7804
|
+
const os = require("node:os");
|
|
7805
|
+
if (platform === "win32") {
|
|
7806
|
+
const home = env.USERPROFILE || os.homedir();
|
|
7807
|
+
const appData = env.APPDATA || path.join(home, "AppData", "Roaming");
|
|
7808
|
+
return path.join(appData, "anythingllm-desktop", "storage", "anythingllm.db");
|
|
7809
|
+
}
|
|
7810
|
+
|
|
7811
|
+
const home = env.HOME || os.homedir();
|
|
7812
|
+
if (platform === "darwin") {
|
|
7813
|
+
return path.join(
|
|
7814
|
+
home,
|
|
7815
|
+
"Library",
|
|
7816
|
+
"Application Support",
|
|
7817
|
+
"anythingllm-desktop",
|
|
7818
|
+
"storage",
|
|
7819
|
+
"anythingllm.db",
|
|
7820
|
+
);
|
|
7821
|
+
}
|
|
7822
|
+
|
|
7823
|
+
const configHome = env.XDG_CONFIG_HOME || path.join(home, ".config");
|
|
7824
|
+
return path.join(configHome, "anythingllm-desktop", "storage", "anythingllm.db");
|
|
7825
|
+
}
|
|
7826
|
+
|
|
7827
|
+
function parseAnythingllmTimestamp(value) {
|
|
7828
|
+
const epochIso = (epochValue) => {
|
|
7829
|
+
if (!Number.isFinite(epochValue)) return null;
|
|
7830
|
+
// Prisma stores SQLite DateTime values as epoch milliseconds. Accept
|
|
7831
|
+
// seconds as well for compatibility with databases created by other
|
|
7832
|
+
// SQLite clients.
|
|
7833
|
+
const epochMs = Math.abs(epochValue) < 100_000_000_000
|
|
7834
|
+
? epochValue * 1000
|
|
7835
|
+
: epochValue;
|
|
7836
|
+
const parsed = new Date(epochMs);
|
|
7837
|
+
return Number.isNaN(parsed.getTime()) ? null : parsed.toISOString();
|
|
7838
|
+
};
|
|
7839
|
+
if (typeof value === "number") return epochIso(value);
|
|
7840
|
+
if (typeof value !== "string" || !value.trim()) return null;
|
|
7841
|
+
const trimmed = value.trim();
|
|
7842
|
+
if (/^-?\d+(?:\.\d+)?$/.test(trimmed)) return epochIso(Number(trimmed));
|
|
7843
|
+
const naive = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/.exec(trimmed);
|
|
7844
|
+
if (naive) {
|
|
7845
|
+
const millis = String(naive[7] || "0").padEnd(3, "0");
|
|
7846
|
+
return new Date(Date.UTC(
|
|
7847
|
+
+naive[1],
|
|
7848
|
+
+naive[2] - 1,
|
|
7849
|
+
+naive[3],
|
|
7850
|
+
+naive[4],
|
|
7851
|
+
+naive[5],
|
|
7852
|
+
+naive[6],
|
|
7853
|
+
+millis,
|
|
7854
|
+
)).toISOString();
|
|
7855
|
+
}
|
|
7856
|
+
const parsed = new Date(trimmed);
|
|
7857
|
+
return Number.isNaN(parsed.getTime()) ? null : parsed.toISOString();
|
|
7858
|
+
}
|
|
7859
|
+
|
|
7860
|
+
function readAnythingllmUsageRowsWhere(dbPath, whereClause, sqliteOptions = {}) {
|
|
7861
|
+
if (!dbPath || !fssync.existsSync(dbPath)) return [];
|
|
7862
|
+
const metric = (jsonPath, alias) =>
|
|
7863
|
+
`CASE WHEN json_valid(response) THEN json_extract(response, '${jsonPath}') ELSE NULL END AS ${alias}`;
|
|
7864
|
+
const sql = `
|
|
7865
|
+
SELECT
|
|
7866
|
+
id,
|
|
7867
|
+
include,
|
|
7868
|
+
createdAt,
|
|
7869
|
+
lastUpdatedAt,
|
|
7870
|
+
${metric("$.metrics.prompt_tokens", "prompt_tokens")},
|
|
7871
|
+
${metric("$.metrics.completion_tokens", "completion_tokens")},
|
|
7872
|
+
${metric("$.metrics.total_tokens", "total_tokens")},
|
|
7873
|
+
${metric("$.metrics.model", "model")}
|
|
7874
|
+
FROM workspace_chats
|
|
7875
|
+
WHERE ${whereClause}
|
|
7876
|
+
ORDER BY id ASC
|
|
7877
|
+
`.trim();
|
|
7878
|
+
|
|
7879
|
+
let snapshot = null;
|
|
7880
|
+
let effectiveDbPath = dbPath;
|
|
7881
|
+
if (isUncPath(dbPath)) {
|
|
7882
|
+
try {
|
|
7883
|
+
snapshot = snapshotSqliteDb(dbPath);
|
|
7884
|
+
effectiveDbPath = snapshot.path;
|
|
7885
|
+
} catch (_e) { }
|
|
7886
|
+
}
|
|
7887
|
+
|
|
7888
|
+
try {
|
|
7889
|
+
return readSqliteJsonRows(effectiveDbPath, sql, {
|
|
7890
|
+
label: "AnythingLLM",
|
|
7891
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
7892
|
+
timeout: 30_000,
|
|
7893
|
+
readOnly: true,
|
|
7894
|
+
...sqliteOptions,
|
|
7895
|
+
});
|
|
7896
|
+
} finally {
|
|
7897
|
+
if (snapshot) snapshot.cleanup();
|
|
7898
|
+
}
|
|
7899
|
+
}
|
|
7900
|
+
|
|
7901
|
+
function readAnythingllmUsageRows(dbPath, sinceId = 0, sqliteOptions = {}) {
|
|
7902
|
+
const safeSinceId = Math.max(0, Math.trunc(Number(sinceId) || 0));
|
|
7903
|
+
return readAnythingllmUsageRowsWhere(dbPath, `id > ${safeSinceId}`, sqliteOptions);
|
|
7904
|
+
}
|
|
7905
|
+
|
|
7906
|
+
function readAnythingllmUsageRowsByIds(dbPath, ids, sqliteOptions = {}) {
|
|
7907
|
+
const normalizedIds = [
|
|
7908
|
+
...new Set(
|
|
7909
|
+
(Array.isArray(ids) ? ids : [])
|
|
7910
|
+
.map(toNonNegativeInt)
|
|
7911
|
+
.filter((id) => id > 0),
|
|
7912
|
+
),
|
|
7913
|
+
];
|
|
7914
|
+
const rows = [];
|
|
7915
|
+
for (let start = 0; start < normalizedIds.length; start += 500) {
|
|
7916
|
+
const chunk = normalizedIds.slice(start, start + 500);
|
|
7917
|
+
rows.push(
|
|
7918
|
+
...readAnythingllmUsageRowsWhere(
|
|
7919
|
+
dbPath,
|
|
7920
|
+
`id IN (${chunk.join(",")})`,
|
|
7921
|
+
sqliteOptions,
|
|
7922
|
+
),
|
|
7923
|
+
);
|
|
7924
|
+
}
|
|
7925
|
+
return rows.sort((a, b) => toNonNegativeInt(a?.id) - toNonNegativeInt(b?.id));
|
|
7926
|
+
}
|
|
7927
|
+
|
|
7928
|
+
async function parseAnythingllmIncremental({
|
|
7929
|
+
dbPath,
|
|
7930
|
+
cursors,
|
|
7931
|
+
queuePath,
|
|
7932
|
+
onProgress,
|
|
7933
|
+
env,
|
|
7934
|
+
sqliteOptions,
|
|
7935
|
+
nowMs = Date.now(),
|
|
7936
|
+
} = {}) {
|
|
7937
|
+
await ensureDir(path.dirname(queuePath));
|
|
7938
|
+
const resolvedDb = dbPath || resolveAnythingllmDbPath(env || process.env);
|
|
7939
|
+
const priorState = cursors.anythingllm && typeof cursors.anythingllm === "object"
|
|
7940
|
+
? cursors.anythingllm
|
|
7941
|
+
: {};
|
|
7942
|
+
const lastChatId = Math.max(0, Math.trunc(Number(priorState.lastChatId) || 0));
|
|
7943
|
+
const pendingChatIds = new Set(
|
|
7944
|
+
(Array.isArray(priorState.pendingChatIds) ? priorState.pendingChatIds : [])
|
|
7945
|
+
.map(toNonNegativeInt)
|
|
7946
|
+
.filter((id) => id > 0),
|
|
7947
|
+
);
|
|
7948
|
+
const pendingCutoffMs = (Number.isFinite(nowMs) ? nowMs : Date.now())
|
|
7949
|
+
- ANYTHINGLLM_PENDING_MAX_AGE_MS;
|
|
7950
|
+
|
|
7951
|
+
if (!resolvedDb || !fssync.existsSync(resolvedDb)) {
|
|
7952
|
+
cursors.anythingllm = {
|
|
7953
|
+
...priorState,
|
|
7954
|
+
lastChatId,
|
|
7955
|
+
pendingChatIds: [...pendingChatIds].sort((a, b) => a - b),
|
|
7956
|
+
updatedAt: new Date().toISOString(),
|
|
7957
|
+
};
|
|
7958
|
+
return { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
|
|
7959
|
+
}
|
|
7960
|
+
|
|
7961
|
+
const incrementalRows = readAnythingllmUsageRows(resolvedDb, lastChatId, sqliteOptions);
|
|
7962
|
+
const pendingRetryRows = readAnythingllmUsageRowsByIds(
|
|
7963
|
+
resolvedDb,
|
|
7964
|
+
[...pendingChatIds],
|
|
7965
|
+
sqliteOptions,
|
|
7966
|
+
);
|
|
7967
|
+
const pendingRetryIds = new Set(
|
|
7968
|
+
pendingRetryRows.map((row) => toNonNegativeInt(row?.id)),
|
|
7969
|
+
);
|
|
7970
|
+
for (const pendingId of pendingChatIds) {
|
|
7971
|
+
if (!pendingRetryIds.has(pendingId)) pendingChatIds.delete(pendingId);
|
|
7972
|
+
}
|
|
7973
|
+
const rowsById = new Map();
|
|
7974
|
+
for (const row of [...pendingRetryRows, ...incrementalRows]) {
|
|
7975
|
+
rowsById.set(toNonNegativeInt(row?.id), row);
|
|
7976
|
+
}
|
|
7977
|
+
const rows = Array.from(rowsById.values()).sort(
|
|
7978
|
+
(a, b) => toNonNegativeInt(a?.id) - toNonNegativeInt(b?.id),
|
|
7979
|
+
);
|
|
7980
|
+
const hourlyState = normalizeHourlyState(cursors?.hourly);
|
|
7981
|
+
const touchedBuckets = new Set();
|
|
7982
|
+
const cb = typeof onProgress === "function" ? onProgress : null;
|
|
7983
|
+
let maxSeenId = lastChatId;
|
|
7984
|
+
let recordsProcessed = 0;
|
|
7985
|
+
let eventsAggregated = 0;
|
|
7986
|
+
const reportProgress = (index) => {
|
|
7987
|
+
if (!cb) return;
|
|
7988
|
+
cb({
|
|
7989
|
+
index,
|
|
7990
|
+
total: rows.length,
|
|
7991
|
+
recordsProcessed,
|
|
7992
|
+
eventsAggregated,
|
|
7993
|
+
bucketsQueued: touchedBuckets.size,
|
|
7994
|
+
});
|
|
7995
|
+
};
|
|
7996
|
+
|
|
7997
|
+
for (let i = 0; i < rows.length; i++) {
|
|
7998
|
+
const row = rows[i];
|
|
7999
|
+
recordsProcessed += 1;
|
|
8000
|
+
const rowId = Math.max(0, Math.trunc(Number(row?.id) || 0));
|
|
8001
|
+
if (rowId > maxSeenId) maxSeenId = rowId;
|
|
8002
|
+
|
|
8003
|
+
const inputTokens = toNonNegativeInt(row?.prompt_tokens);
|
|
8004
|
+
const outputTokens = toNonNegativeInt(row?.completion_tokens);
|
|
8005
|
+
const reportedTotal = toNonNegativeInt(row?.total_tokens);
|
|
8006
|
+
if (inputTokens === 0 && outputTokens === 0) {
|
|
8007
|
+
const pendingTimestamp = parseAnythingllmTimestamp(row?.lastUpdatedAt)
|
|
8008
|
+
|| parseAnythingllmTimestamp(row?.createdAt);
|
|
8009
|
+
const pendingTimestampMs = pendingTimestamp ? Date.parse(pendingTimestamp) : NaN;
|
|
8010
|
+
const shouldRetry =
|
|
8011
|
+
toNonNegativeInt(row?.include) === 0
|
|
8012
|
+
&& Number.isFinite(pendingTimestampMs)
|
|
8013
|
+
&& pendingTimestampMs >= pendingCutoffMs;
|
|
8014
|
+
if (rowId > 0 && shouldRetry) pendingChatIds.add(rowId);
|
|
8015
|
+
else if (rowId > 0) pendingChatIds.delete(rowId);
|
|
8016
|
+
reportProgress(i + 1);
|
|
8017
|
+
continue;
|
|
8018
|
+
}
|
|
8019
|
+
|
|
8020
|
+
const timestamp = parseAnythingllmTimestamp(row?.createdAt)
|
|
8021
|
+
|| parseAnythingllmTimestamp(row?.lastUpdatedAt);
|
|
8022
|
+
const bucketStart = timestamp ? toUtcHalfHourStart(timestamp) : null;
|
|
8023
|
+
if (!bucketStart) {
|
|
8024
|
+
if (rowId > 0) pendingChatIds.delete(rowId);
|
|
8025
|
+
reportProgress(i + 1);
|
|
8026
|
+
continue;
|
|
8027
|
+
}
|
|
8028
|
+
if (rowId > 0) pendingChatIds.delete(rowId);
|
|
8029
|
+
|
|
8030
|
+
const model = normalizeModelInput(row?.model) || "anythingllm-unknown";
|
|
8031
|
+
const accounted = inputTokens + outputTokens;
|
|
8032
|
+
const reasoningTokens = Math.max(0, reportedTotal - accounted);
|
|
8033
|
+
const delta = {
|
|
8034
|
+
input_tokens: inputTokens,
|
|
8035
|
+
cached_input_tokens: 0,
|
|
8036
|
+
cache_creation_input_tokens: 0,
|
|
8037
|
+
output_tokens: outputTokens,
|
|
8038
|
+
reasoning_output_tokens: reasoningTokens,
|
|
8039
|
+
total_tokens: accounted + reasoningTokens,
|
|
8040
|
+
conversation_count: 1,
|
|
8041
|
+
};
|
|
8042
|
+
|
|
8043
|
+
const bucket = getHourlyBucket(hourlyState, "anythingllm", model, bucketStart);
|
|
8044
|
+
addTotals(bucket.totals, delta);
|
|
8045
|
+
touchedBuckets.add(bucketKey("anythingllm", model, bucketStart));
|
|
8046
|
+
eventsAggregated += 1;
|
|
8047
|
+
|
|
8048
|
+
reportProgress(i + 1);
|
|
8049
|
+
}
|
|
8050
|
+
|
|
8051
|
+
const bucketsQueued = await enqueueTouchedBuckets({ queuePath, hourlyState, touchedBuckets });
|
|
8052
|
+
const updatedAt = new Date().toISOString();
|
|
8053
|
+
hourlyState.updatedAt = updatedAt;
|
|
8054
|
+
cursors.hourly = hourlyState;
|
|
8055
|
+
cursors.anythingllm = {
|
|
8056
|
+
...priorState,
|
|
8057
|
+
lastChatId: maxSeenId,
|
|
8058
|
+
pendingChatIds: [...pendingChatIds].sort((a, b) => a - b),
|
|
8059
|
+
updatedAt,
|
|
8060
|
+
};
|
|
8061
|
+
|
|
8062
|
+
return { recordsProcessed, eventsAggregated, bucketsQueued };
|
|
8063
|
+
}
|
|
8064
|
+
|
|
7781
8065
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
7782
8066
|
// Goose (Block AI agent — github.com/block/goose)
|
|
7783
8067
|
//
|
|
@@ -12553,6 +12837,10 @@ module.exports = {
|
|
|
12553
12837
|
sumZedRequestUsage,
|
|
12554
12838
|
readZedUsage,
|
|
12555
12839
|
parseZedIncremental,
|
|
12840
|
+
resolveAnythingllmDbPath,
|
|
12841
|
+
parseAnythingllmTimestamp,
|
|
12842
|
+
readAnythingllmUsageRows,
|
|
12843
|
+
parseAnythingllmIncremental,
|
|
12556
12844
|
resolveGooseDbPath,
|
|
12557
12845
|
parseGooseModelName,
|
|
12558
12846
|
parseGooseCreatedAt,
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/BadgeDetailModal-DCOLG1fl.js","assets/main-rco_Tu2D.js","assets/main-KK0yAXww.css","assets/AchievementBadge-DcDkcyk4.js","assets/zap-BQ6Eilqi.js","assets/flame-sZg_y2Ct.js","assets/use-transform-h2Jds0kA.js","assets/AchievementsSection-Cj13lk07.js","assets/format-tokens-Ck8WH-5G.js","assets/DialogTitle-hGgP0eky.js","assets/useScrollLock-DGfYuwgo.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{r as o,V as x,ak as h,U as f,j as e,E as d,L as v,R as u,_ as p,al as y,a4 as b}from"./main-rco_Tu2D.js";import{A as j}from"./AchievementsSection-Cj13lk07.js";import{B as g}from"./AchievementBadge-DcDkcyk4.js";import"./format-tokens-Ck8WH-5G.js";import"./zap-BQ6Eilqi.js";import"./flame-sZg_y2Ct.js";function k({enabled:a=!0}={}){const[n,s]=o.useState({status:"loading",achievements:[],error:null}),r=o.useMemo(()=>x(),[]);return o.useEffect(()=>{if(!a){s({status:"disabled",achievements:[],error:null});return}let i=!1;return s(t=>({...t,status:"loading"})),h({timeZone:r,tzOffsetMinutes:f()}).then(t=>{i||s({status:"ready",achievements:Array.isArray(t?.achievements)?t.achievements:[],error:null})}).catch(t=>{i||s({status:"error",achievements:[],error:t})}),()=>{i=!0}},[a,r]),n}const w=u.lazy(()=>b(()=>import("./BadgeDetailModal-DCOLG1fl.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])));function N(){const a=p(),[n,s]=o.useState({status:"loading",achievements:[],userId:null}),r=!!a?.loading,i=!!(a?.enabled&&a?.user?.id),t=i?a.user.id:null;return o.useEffect(()=>{if(r){s({status:"loading",achievements:[],userId:null});return}if(!i){s({status:"signed-out",achievements:[],userId:null});return}let l=!1;return s({status:"loading",achievements:[],userId:t}),(async()=>{try{const c=await a.getAccessToken?.(),m=await y({accessToken:c,userId:t});if(l)return;s({status:"ready",achievements:Array.isArray(m?.badges)?m.badges:[],userId:t})}catch{l||s({status:"error",achievements:[],userId:t})}})(),()=>{l=!0}},[r,i,t]),{...n,signedIn:i,settled:A({authLoading:r,signedIn:i,userId:t,state:n})}}function A({authLoading:a,signedIn:n,userId:s,state:r}){return a?!1:n?r.userId===s&&(r.status==="ready"||r.status==="error"):r.status==="signed-out"}function _(){return e.jsx("div",{className:"mx-0 grid animate-pulse grid-cols-[repeat(3,max-content)] justify-between gap-y-7 sm:-mx-2 sm:grid-cols-[repeat(4,max-content)] lg:grid-cols-[repeat(5,max-content)]","aria-hidden":!0,children:Array.from({length:g.length}).map((a,n)=>e.jsxs("div",{className:"flex w-[6.75rem] flex-col items-center px-0 pb-3 pt-4 sm:w-[7.75rem]",children:[e.jsx("div",{className:"h-[108px] w-[108px] rounded-full bg-oai-gray-200 dark:bg-oai-gray-800"}),e.jsx("div",{className:"mt-3 h-3 w-16 rounded bg-oai-gray-200 dark:bg-oai-gray-800"}),e.jsx("div",{className:"mt-2 h-2 w-10 rounded bg-oai-gray-100 dark:bg-oai-gray-800/60"})]},n))})}function L(){const a=k(),n=N(),[s,r]=o.useState(null),i=a.status==="loading"||!n.settled,t=o.useMemo(()=>[...n.achievements||[],...a.achievements||[]],[n.achievements,a.achievements]),l=o.useMemo(()=>t.filter(m=>(m?.tier||0)>=1).length,[t]),c=g.length;return e.jsxs("div",{className:"flex flex-1 flex-col font-oai text-oai-black antialiased dark:text-oai-white",children:[e.jsx("main",{className:"flex-1 pb-12 pt-8 sm:pb-16 sm:pt-10",children:e.jsxs("div",{className:"mx-auto max-w-4xl px-4 sm:px-6",children:[e.jsxs("div",{className:"mb-7 flex items-baseline justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-3xl font-semibold tracking-tight text-oai-black dark:text-white sm:text-4xl",children:d("achievements.page.title")}),e.jsx("p",{className:"mt-1.5 text-sm text-oai-gray-500 dark:text-oai-gray-400",children:d("achievements.page.local_note")})]}),!i&&e.jsxs("div",{className:"shrink-0 text-right",children:[e.jsxs("div",{className:"font-mono text-2xl font-semibold leading-none tabular-nums text-oai-black dark:text-white",children:[l,e.jsxs("span",{className:"text-oai-gray-400 dark:text-oai-gray-600",children:["/",c]})]}),e.jsx("div",{className:"mt-2 h-1 w-24 overflow-hidden rounded-full bg-oai-gray-200 dark:bg-oai-gray-800",children:e.jsx("div",{className:"h-full rounded-full bg-oai-brand-600 transition-[width] duration-500",style:{width:`${Math.round(l/c*100)}%`}})})]})]}),!n.signedIn&&!i&&e.jsxs("div",{className:"mb-6 flex flex-wrap items-center justify-between gap-x-4 gap-y-2 rounded-xl border border-oai-gray-200 bg-oai-gray-50 px-4 py-3 dark:border-oai-gray-800 dark:bg-oai-gray-900/60",children:[e.jsx("p",{className:"text-sm text-oai-gray-600 dark:text-oai-gray-300",children:d("achievements.signin.prompt")}),e.jsx(v,{to:"/login",className:"shrink-0 rounded-lg bg-oai-brand-600 px-3 py-1.5 text-sm font-medium text-white transition-colors duration-200 hover:bg-oai-brand-700 active:scale-[0.98]",children:d("achievements.signin.action")})]}),i?e.jsx(_,{}):e.jsxs(e.Fragment,{children:[e.jsx(j,{achievements:t,isOwn:!0,columns:"wide",size:"lg",animateIn:!0,onSelect:r}),e.jsxs("p",{className:"mt-10 text-center text-xs text-oai-gray-400 dark:text-oai-gray-500",children:[d("achievements.page.suggest")," ",e.jsx("a",{href:"https://github.com/mm7894215/TokenTracker/issues",target:"_blank",rel:"noopener noreferrer",className:"underline decoration-oai-gray-300 underline-offset-2 transition-colors hover:text-oai-gray-700 hover:decoration-oai-gray-500 dark:decoration-oai-gray-600 dark:hover:text-oai-gray-300",children:d("achievements.page.suggest_link")})]})]})]})}),s&&e.jsx(u.Suspense,{fallback:null,children:e.jsx(w,{badge:s,onClose:()=>r(null)})})]})}export{A as cloudBadgesSettled,L as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{cW as De,cX as Me,cY as Te,cZ as _e,c_ as $e,c$ as ye,i as be,d0 as Ve,d1 as Ie,d2 as Oe,d3 as Re,d4 as Pe,d5 as Be,d6 as Ke,d7 as Xe,d8 as Le,d9 as Ce,da as Fe,db as G,dc as Ge,dd as We,de as ze,df as Ye,u as Ue,r as C,j as a,m as X,$ as Ze,E as g,P as ve,X as He}from"./main-rco_Tu2D.js";import{a as je,A as qe,p as Je,b as Y,t as le,T as V,c as Qe}from"./AchievementBadge-DcDkcyk4.js";import{a as et,u as z}from"./use-transform-h2Jds0kA.js";import{l as ce,f as ue,b as tt}from"./AchievementsSection-Cj13lk07.js";import{D as nt,a as rt,b as at,c as st,d as it,e as ot}from"./DialogTitle-hGgP0eky.js";import"./zap-BQ6Eilqi.js";import"./flame-sZg_y2Ct.js";import"./format-tokens-Ck8WH-5G.js";import"./useScrollLock-DGfYuwgo.js";const lt=(e,t,n)=>{const r=t-e;return((n-e)%r+r)%r+e};function ke(e,t){return De(e)?e[lt(0,e.length,t)]:e}class ct{constructor(t){this.stop=()=>this.runAll("stop"),this.animations=t.filter(Boolean)}get finished(){return Promise.all(this.animations.map(t=>t.finished))}getAll(t){return this.animations[0][t]}setAll(t,n){for(let r=0;r<this.animations.length;r++)this.animations[r][t]=n}attachTimeline(t){const n=this.animations.map(r=>r.attachTimeline(t));return()=>{n.forEach((r,s)=>{r&&r(),this.animations[s].stop()})}}get time(){return this.getAll("time")}set time(t){this.setAll("time",t)}get speed(){return this.getAll("speed")}set speed(t){this.setAll("speed",t)}get state(){return this.getAll("state")}get startTime(){return this.getAll("startTime")}get duration(){return de(this.animations,"duration")}get iterationDuration(){return de(this.animations,"iterationDuration")}runAll(t){this.animations.forEach(n=>n[t]())}play(){this.runAll("play")}pause(){this.runAll("pause")}cancel(){this.runAll("cancel")}complete(){this.runAll("complete")}}function de(e,t){let n=0;for(let r=0;r<e.length;r++){const s=e[r][t];s!==null&&s>n&&(n=s)}return n}class ut extends ct{then(t,n){return this.finished.finally(t).then(()=>{})}}function dt(e,t){return e in t}class ft extends Me{constructor(){super(...arguments),this.type="object"}readValueFromInstance(t,n){if(dt(n,t)){const r=t[n];if(typeof r=="string"||typeof r=="number")return r}}getBaseTargetFromProps(){}removeValueFromRenderState(t,n){delete n.output[t]}measureInstanceViewportBox(){return Te()}build(t,n){Object.assign(t.output,n)}renderInstance(t,{output:n}){Object.assign(t,n)}sortInstanceNodePosition(){return 0}}function U(e){return typeof e=="object"&&!Array.isArray(e)}function we(e,t,n,r){return e==null?[]:typeof e=="string"&&U(t)?_e(e,n,r):e instanceof NodeList?Array.from(e):Array.isArray(e)?e.filter(s=>s!=null):[e]}function mt(e,t,n){return e*(t+1)+n*t}function fe(e,t,n,r){return typeof t=="number"?t:t.startsWith("-")||t.startsWith("+")?Math.max(0,e+parseFloat(t)):t==="<"?n:t.startsWith("<")?Math.max(0,n+parseFloat(t.slice(1))):r.get(t)??e}function pt(e,t,n){for(let r=0;r<e.length;r++){const s=e[r];s.at>t&&s.at<n&&(ye(e,s),r--)}}function ht(e,t,n,r,s,c){pt(e,s,c);for(let i=0;i<t.length;i++)e.push({value:t[i],at:$e(s,c,r[i]),easing:ke(n,i)})}function gt(e,t,n=0){const r=t+1+t*n;for(let s=0;s<e.length;s++)e[s]=e[s]/r}function xt(e,t){return e.at===t.at?e.value===null?1:t.value===null?-1:0:e.at-t.at}const yt="easeInOut",bt=20;function vt(e,{defaultTransition:t={},...n}={},r,s){const c=t.duration||.3,i=new Map,m=new Map,f={},p=new Map;let h=0,u=0,v=0;for(let k=0;k<e.length;k++){const w=e[k];if(typeof w=="string"){p.set(w,u);continue}else if(!Array.isArray(w)){p.set(w.name,fe(u,w.at,h,p));continue}let[E,y,b={}]=w;b.at!==void 0&&(u=fe(u,b.at,h,p));let j=0;const T=(N,_,A,o=0,l=0)=>{const d=jt(N),{delay:D=0,times:x=Ve(d),type:R=t.type||"keyframes",repeat:P,repeatType:W,repeatDelay:Z=0,...Se}=_;let{ease:M=t.ease||"easeOut",duration:S}=_;const H=typeof D=="function"?D(o,l):D,q=d.length,J=Pe(R)?R:s?.[R||"keyframes"];if(q<=2&&J){let I=100;if(q===2&&Nt(d)){const B=d[1]-d[0];I=Math.abs(B)}const O={...t,...Se};S!==void 0&&(O.duration=Be(S));const F=Ie(O,I,J);M=F.ease,S=F.duration}S??(S=c);const Q=u+H;x.length===1&&x[0]===0&&(x[1]=1);const ee=x.length-d.length;if(ee>0&&Oe(x,ee),d.length===1&&d.unshift(null),P&&P<bt){const I=S>0?Z/S:0;S=mt(S,P,Z);const O=[...d],F=[...x];M=Array.isArray(M)?[...M]:[M];const B=[...M],ne=W==="reverse"||W==="mirror";let re=O,ae=B;ne&&(re=[...O].reverse(),W==="reverse"&&(ae=[...B].reverse().map($=>typeof $=="function"?Re($):$)));for(let $=0;$<P;$++){const se=ne&&$%2===0,ie=se?re:O,Ee=se?ae:B,oe=($+1)*(1+I);I>0&&(d.push(d[d.length-1]),x.push(oe),M.push("linear")),d.push(...ie);for(let K=0;K<ie.length;K++)x.push(F[K]+oe),M.push(K===0?"linear":ke(Ee,K-1))}gt(x,P,I)}const te=Q+S;ht(A,d,M,x,Q,te),j=Math.max(H+S,j),v=Math.max(te,v)};if(be(E)){const N=me(E,m);T(y,b,pe("default",N))}else{const N=we(E,y,r,f),_=N.length;for(let A=0;A<_;A++){y=y,b=b;const o=N[A],l=me(o,m);for(const d in y)T(y[d],kt(b,d),pe(d,l),A,_)}}h=u,u+=j}return m.forEach((k,w)=>{for(const E in k){const y=k[E];y.sort(xt);const b=[],j=[],T=[];for(let o=0;o<y.length;o++){const{at:l,value:d,easing:D}=y[o];b.push(d),j.push(Ke(0,v,l)),T.push(D||"easeOut")}j[0]!==0&&(j.unshift(0),b.unshift(b[0]),T.unshift(yt)),j[j.length-1]!==1&&(j.push(1),b.push(null)),i.has(w)||i.set(w,{keyframes:{},transition:{}});const N=i.get(w);N.keyframes[E]=b;const{type:_,...A}=t;N.transition[E]={...A,duration:v,ease:T,times:j,...n}}}),i}function me(e,t){return!t.has(e)&&t.set(e,{}),t.get(e)}function pe(e,t){return t[e]||(t[e]=[]),t[e]}function jt(e){return Array.isArray(e)?e:[e]}function kt(e,t){return e&&e[t]?{...e,...e[t]}:{...e}}const wt=e=>typeof e=="number",Nt=e=>e.every(wt);function At(e){const t={presenceContext:null,props:{},visualState:{renderState:{transform:{},transformOrigin:{},style:{},vars:{},attrs:{}},latestValues:{}}},n=Xe(e)&&!Le(e)?new Ce(t):new Fe(t);n.mount(e),G.set(e,n)}function St(e){const t={presenceContext:null,props:{},visualState:{renderState:{output:{}},latestValues:{}}},n=new ft(t);n.mount(e),G.set(e,n)}function Et(e,t){return be(e)||typeof e=="number"||typeof e=="string"&&!U(t)}function Ne(e,t,n,r){const s=[];if(Et(e,t))s.push(Ge(e,U(t)&&t.default||t,n&&(n.default||n)));else{if(e==null)return s;const c=we(e,t,r),i=c.length;for(let m=0;m<i;m++){const f=c[m],p=f instanceof Element?At:St;G.has(f)||p(f);const h=G.get(f),u={...n};"delay"in u&&typeof u.delay=="function"&&(u.delay=u.delay(m,i)),s.push(...We(h,{...t,transition:u},{}))}}return s}function Dt(e,t,n){const r=[],s=e.map(i=>{if(Array.isArray(i)&&typeof i[0]=="function"){const m=i[0],f=ze(0);return f.on("change",m),i.length===1?[f,[0,1]]:i.length===2?[f,[0,1],i[1]]:[f,i[1],i[2]]}return i});return vt(s,t,n,{spring:Ye}).forEach(({keyframes:i,transition:m},f)=>{r.push(...Ne(f,i,m))}),r}function Mt(e){return Array.isArray(e)&&e.some(Array.isArray)}function Tt(e={}){const{scope:t,reduceMotion:n,skipAnimations:r}=e;function s(c,i,m){let f=[],p;const h={};if(n!==void 0&&(h.reduceMotion=n),r!==void 0&&(h.skipAnimations=r),Mt(c)){const{onComplete:v,...k}=i||{};typeof v=="function"&&(p=v),f=Dt(c,{...h,...k},t)}else{const{onComplete:v,...k}=m||{};typeof v=="function"&&(p=v),f=Ne(c,i,{...h,...k},t)}const u=new ut(f);return p&&u.finished.then(p),t&&(t.animations.push(u),u.finished.then(()=>{ye(t.animations,u)})),u}return s}const L=Tt(),he=8;function _t({badgeId:e,tier:t,locked:n=!1,size:r=176,backLines:s=[],label:c}){const i=et(0),m=Ue(),f=C.useRef(null),p=C.useRef(null),h=C.useRef(!1),u=Je(t,n),v=je.get(e)?.icon||null,k=z(i,o=>`${(o%360+360)%360/360*160-80}%`),w=z(i,o=>`${80-(o%360+360)%360/360*160}%`),E=z(i,o=>{const l=Math.abs(Math.sin(o*Math.PI/180));return Math.max(0,(l-.35)/.65)*.3}),y=()=>{p.current?.stop?.(),p.current=null};C.useEffect(()=>{if(m||h.current)return;let o=!1;i.set(-360);const l=L(i,0,{duration:.9,ease:[.16,1,.3,1]});return p.current=l,l.then(()=>{o||h.current||(p.current=L(i,[0,-14,14,0],{duration:4.5,repeat:1/0,ease:"easeInOut"}))}),()=>{o=!0,y()}},[m,i]);const b=o=>{const l=i.get();if(m){const x=Math.round(l/180)*180;p.current=L(i,x,{duration:.2,ease:"easeOut"});return}const d=l+o*.35,D=Math.round(d/180)*180;p.current=L(i,D,{type:"spring",velocity:o,stiffness:58,damping:13.5,mass:1})},j=o=>{h.current=!0,y(),o.currentTarget.setPointerCapture?.(o.pointerId),f.current={pointerId:o.pointerId,startX:o.clientX,startRot:i.get(),samples:[{t:o.timeStamp,x:o.clientX}]}},T=o=>{const l=f.current;!l||l.pointerId!==o.pointerId||(i.set(l.startRot+(o.clientX-l.startX)*.55),l.samples.push({t:o.timeStamp,x:o.clientX}),l.samples.length>5&&l.samples.shift())},N=o=>{const l=f.current;if(!l||l.pointerId!==o.pointerId)return;f.current=null;const d=l.samples[0],D=l.samples[l.samples.length-1],x=D.t-d.t,R=x>0?(D.x-d.x)*.55*1e3/x:0;b(R)},_=o=>{if(o.key!=="ArrowLeft"&&o.key!=="ArrowRight")return;o.preventDefault(),h.current=!0,y();const l=o.key==="ArrowRight"?30:-30;p.current=L(i,i.get()+l,{duration:.15,ease:"easeOut"})},A={backfaceVisibility:"hidden",WebkitBackfaceVisibility:"hidden"};return a.jsx("div",{role:"img","aria-label":c,tabIndex:0,onPointerDown:j,onPointerMove:T,onPointerUp:N,onPointerCancel:N,onKeyDown:_,className:"inline-flex cursor-grab select-none items-center justify-center outline-none focus-visible:ring-2 focus-visible:ring-oai-brand/60 rounded-full active:cursor-grabbing",style:{perspective:900,touchAction:"pan-y"},children:a.jsxs("div",{className:"relative",style:{transform:"rotateX(-8deg)",transformStyle:"preserve-3d"},children:[a.jsxs(X.div,{className:"relative",style:{rotateY:i,transformStyle:"preserve-3d",width:r,height:r},children:[[-3,-1.5,0,1.5,3].map(o=>a.jsx("div",{"aria-hidden":!0,className:"absolute inset-0 rounded-full",style:{transform:`translateZ(${o}px)`,background:u.rim[1]}},o)),a.jsxs("div",{className:"absolute inset-0 overflow-hidden rounded-full",style:{...A,transform:`translateZ(${he/2}px)`},children:[a.jsx(qe,{badgeId:e,tier:t,locked:n,size:"fill",className:"brightness-105 saturate-[1.08]"}),a.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{background:"radial-gradient(circle at 30% 20%, rgba(255,255,255,0.45), rgba(255,255,255,0) 42%), linear-gradient(172deg, rgba(255,255,255,0.14) 0%, rgba(255,255,255,0) 38%, rgba(0,0,0,0.08) 100%)",boxShadow:"inset 0 3px 7px rgba(255,255,255,0.5), inset 0 -3px 8px rgba(0,0,0,0.15)"}}),a.jsx(X.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0",style:{x:k,background:"linear-gradient(105deg, transparent 34%, rgba(255,255,255,0.5) 50%, transparent 66%)"}}),a.jsx(X.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{opacity:E,background:"rgba(8, 12, 10, 0.9)"}})]}),a.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-1 overflow-hidden rounded-full px-6 text-center",style:{...A,transform:`rotateY(180deg) translateZ(${he/2}px)`,background:`linear-gradient(145deg, ${u.face[0]}, ${u.face[1]})`,boxShadow:`inset 0 0 0 6px ${u.rim[1]}, inset 0 0 0 7.5px rgba(255,255,255,0.22), inset 0 3px 7px rgba(255,255,255,0.4), inset 0 -4px 12px rgba(0,0,0,0.22)`},children:[a.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{background:"repeating-radial-gradient(circle at 50% 50%, rgba(255,255,255,0.06) 0px, rgba(255,255,255,0.06) 1px, transparent 1px, transparent 4px)"}}),v?a.jsx(v,{"aria-hidden":!0,size:Math.round(r*.62),strokeWidth:1.1,color:u.glyph,className:"pointer-events-none absolute opacity-[0.13]",style:{filter:"drop-shadow(0 1px 0 rgba(255,255,255,0.3)) drop-shadow(0 -1px 0 rgba(0,0,0,0.35))"}}):null,a.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{background:"radial-gradient(circle at 70% 20%, rgba(255,255,255,0.4), rgba(255,255,255,0) 44%), linear-gradient(188deg, rgba(255,255,255,0.12) 0%, rgba(255,255,255,0) 38%, rgba(0,0,0,0.10) 100%)"}}),s.map((o,l)=>a.jsx("div",{className:`font-mono tabular-nums ${l===0?"text-[10px] uppercase tracking-[0.18em]":l===1?"text-lg font-bold":"text-[11px]"}`,style:{color:u.glyph,textShadow:"0 1px 0 rgba(255,255,255,0.28), 0 -1px 0 rgba(0,0,0,0.3)"},children:o},`${l}-${o}`)),a.jsx(X.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0",style:{x:w,background:"linear-gradient(105deg, transparent 34%, rgba(255,255,255,0.45) 50%, transparent 66%)"}}),a.jsx(X.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{opacity:E,background:"rgba(8, 12, 10, 0.9)"}})]})]}),a.jsx("div",{"aria-hidden":!0,className:"absolute left-1/2 h-3 w-3/5 rounded-[100%] bg-black/20 blur-md dark:bg-black/45",style:{bottom:-20,transform:"translateX(-50%)"}})]})})}function Ae(e){if(!e)return null;const t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleDateString():null}function $t({badge:e}){return a.jsx("div",{className:"flex items-center gap-1",children:Qe.map((t,n)=>{const r=(e.tier||0)>=n+1,s=Ae(e.achieved?.[t]),c=V[t];return a.jsx("span",{title:s?`${g(`achievements.tier.${t}`)} · ${s}`:g(`achievements.tier.${t}`),className:"inline-flex h-2 w-8 rounded-full",style:r?{background:`linear-gradient(120deg, ${c.rim[0]} 0%, ${c.ring} 55%, ${c.rim[1]} 100%)`,boxShadow:"inset 0 1px 1px rgba(255,255,255,0.4), 0 0 0 1px rgba(10,15,12,0.05)"}:void 0,children:!r&&a.jsx("span",{className:"h-full w-full rounded-full bg-oai-gray-200 dark:bg-oai-gray-800"})},t)})})}function ge({badge:e,onClose:t}){const n=je.get(e.id),r=g(Y(e.id,"name")),s=(e.tier||0)>=1,c=s?le(e.tier):null,i=Ae(s?e.achieved?.[c]||(ce(e)?new Date(ce(e)).toISOString():null):null),m=ue(n?.format,e.metric_value),f=tt(e),p=e.tier<4?le((e.tier||0)+1):null,h=[s?g("achievements.modal.achieved_label"):g("achievements.modal.locked"),s?m:"···",s&&i?i:r];return a.jsxs("div",{className:"flex flex-col items-center px-6 pb-6 pt-5 text-center",children:[a.jsxs("div",{className:"flex w-full items-start justify-between gap-3",children:[a.jsxs("div",{className:"min-w-0 flex-1 text-left",children:[a.jsx("h2",{className:"truncate text-lg font-semibold tracking-tight text-oai-black dark:text-white",children:r}),a.jsx("p",{className:"mt-0.5 text-xs text-oai-gray-500 dark:text-oai-gray-400",children:g(Y(e.id,"desc"))})]}),a.jsx("button",{type:"button",onClick:t,"aria-label":g("achievements.modal.close"),className:"shrink-0 rounded-md p-1.5 text-oai-gray-400 transition-colors hover:bg-oai-gray-100 hover:text-oai-gray-700 dark:hover:bg-oai-gray-900 dark:hover:text-oai-gray-200",children:a.jsx(He,{size:16})})]}),a.jsx("div",{className:"mt-5 mb-7",children:a.jsx(_t,{badgeId:e.id,tier:e.tier,locked:!s,backLines:h,label:g("achievements.modal.coin_aria",{name:r})})}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"rounded-full px-2.5 py-0.5 text-[11px] font-semibold uppercase tracking-wide",style:s?{background:`linear-gradient(120deg, ${V[c].rim[0]} 0%, ${V[c].ring} 55%, ${V[c].rim[1]} 100%)`,color:V[c].glyph,textShadow:"0 1px 0 rgba(255,255,255,0.35)",boxShadow:"inset 0 1px 1px rgba(255,255,255,0.4), 0 0 0 1px rgba(10,15,12,0.06)"}:{background:"rgba(128,134,130,0.75)",color:"rgba(250,250,250,0.95)"},children:s?g(`achievements.tier.${c}`):g("achievements.modal.locked")}),s&&i?a.jsx("span",{className:"text-xs tabular-nums text-oai-gray-500 dark:text-oai-gray-400",children:i}):null]}),a.jsxs("dl",{className:"mt-5 w-full space-y-3 border-t border-oai-gray-200/70 pt-4 text-left dark:border-oai-gray-800/60",children:[a.jsxs("div",{className:"flex items-baseline justify-between gap-3 text-sm",children:[a.jsx("dt",{className:"text-oai-gray-500 dark:text-oai-gray-400",children:g("achievements.modal.value_label")}),a.jsx("dd",{className:"font-mono font-semibold tabular-nums text-oai-black dark:text-white",children:m})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-baseline justify-between gap-3 text-xs text-oai-gray-500 dark:text-oai-gray-400",children:[a.jsx("span",{children:e.tier>=4?g("achievements.modal.max_tier"):g("achievements.modal.progress_to_next",{tier:g(`achievements.tier.${p}`)})}),e.tier<4&&e.next_threshold!=null?a.jsxs("span",{className:"font-mono tabular-nums",children:[m," ",e.lower_is_better?"→":"/"," ",ue(n?.format,e.next_threshold)]}):null]}),a.jsx("div",{className:"mt-1.5 h-1.5 w-full overflow-hidden rounded-full bg-oai-gray-200 dark:bg-oai-gray-800",children:a.jsx("div",{className:"h-full rounded-full transition-[width] duration-500",style:{width:`${Math.round((e.tier>=4?1:f)*100)}%`,background:s?`linear-gradient(90deg, ${V[c].rim[0]} 0%, ${V[c].ring} 55%, ${V[c].rim[1]} 100%)`:"rgba(128,134,130,0.75)",boxShadow:s?"inset 0 1px 1px rgba(255,255,255,0.35)":void 0}})})]}),a.jsxs("div",{className:"flex items-center justify-between gap-3 text-xs text-oai-gray-500 dark:text-oai-gray-400",children:[a.jsx("span",{children:g("achievements.modal.tier_history")}),a.jsx($t,{badge:e})]})]})]})}const xe=ve("relative w-full max-w-[380px] flex flex-col","rounded-2xl bg-white dark:bg-oai-gray-950","shadow-[0_20px_60px_-20px_rgba(0,0,0,0.25)] dark:shadow-[0_20px_60px_-10px_rgba(0,0,0,0.65)]","ring-1 ring-oai-gray-200 dark:ring-oai-gray-800 overflow-hidden","dark:border-t dark:border-white/[0.08]");function Ct({badge:e,onClose:t}){const n=Ze(),r=!!e;return C.useEffect(()=>{if(!n||!r)return;const s=c=>{c.key==="Escape"&&(c.stopPropagation(),t?.())};return window.addEventListener("keydown",s,!0),()=>window.removeEventListener("keydown",s,!0)},[n,r,t]),r?n?a.jsxs("div",{className:"fixed inset-0 z-[120] flex items-center justify-center p-4",children:[a.jsx("div",{className:"absolute inset-0 bg-black/40 backdrop-blur-[2px]",onClick:t,"aria-hidden":!0}),a.jsx("div",{className:xe,children:a.jsx(ge,{badge:e,onClose:t})})]}):a.jsx(nt,{open:!0,onOpenChange:s=>{s||t?.()},children:a.jsxs(rt,{children:[a.jsx(at,{className:"cost-modal-backdrop z-[110]"}),a.jsx(st,{className:"fixed inset-0 z-[120] flex items-center justify-center p-4",children:a.jsxs(it,{className:ve("cost-modal-popup",xe),children:[a.jsx(ot,{render:a.jsx("h2",{className:"sr-only"}),children:g(Y(e.id,"name"))}),a.jsx(ge,{badge:e,onClose:t})]})})]})}):null}export{Ct as BadgeDetailModal,Ct as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as n,b7 as a}from"./main-rco_Tu2D.js";import{u as p}from"./DialogTitle-hGgP0eky.js";import{u as c}from"./useScrollLock-DGfYuwgo.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{c}from"./main-rco_Tu2D.js";const e=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],t=c("check",e);export{t as C};
|