tokentracker-cli 0.98.0 → 1.0.0
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 -5
- package/README.ja.md +6 -5
- package/README.ko.md +6 -5
- package/README.md +7 -5
- package/README.zh-CN.md +6 -5
- package/dashboard/dist/assets/{AchievementBadge-DlZklawB.js → AchievementBadge-Dpf3VBcS.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-CprbOKnt.js → AchievementsPage-BSGbLI5V.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-BKLJBRKw.js → AchievementsSection-C10HXoq1.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-CfVXLh_t.js → BadgeDetailModal-DajrEc3e.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-wzqeGbEY.js → BotAnimated-BpbTCJML.js} +1 -1
- package/dashboard/dist/assets/{Card-B-gcOAn7.js → Card-CDCj927L.js} +1 -1
- package/dashboard/dist/assets/{ClawdAnimated-1c5ezBBN.js → ClawdAnimated-CiTkm04x.js} +2 -2
- package/dashboard/dist/assets/{CommandPalette-CD8ggEF6.js → CommandPalette-CYHUUX7M.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-b2fPhi1E.js → CommunityStatsModal-BHZehk5P.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-ARBkT8AC.js → ConfirmModal-DZlT_xe_.js} +1 -1
- package/dashboard/dist/assets/{Controls-WFXDjIYG.js → Controls-Bcijikco.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-XtiZa2JN.js → DashboardPage-yREqx-tx.js} +1 -1
- package/dashboard/dist/assets/DevicePage-DzisRlts.js +1 -0
- package/dashboard/dist/assets/{DialogClose-D2PE0TAc.js → DialogClose-CQ9hFUNv.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-CLXWH3lG.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-Bby0zSCw.js → DialogTitle--bItxq3K.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-Cx1hl4so.js → FadeIn-v5sAHZBu.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-my4zR6Pp.js → HeaderGithubStar-Bg8R51fN.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-DOiGAPLE.js → HoverTooltip-DToNFKkJ.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-4SdHlFuA.js → IpCheckPage-BmFXYXZm.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-bSWc9xiS.js → LandingPage-COpRacX0.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-EN4117E5.js → LeaderboardAvatar-D0l8_L_d.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-Bwjf-xZl.js → LeaderboardPage-BJHS44Fq.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-B1mgVtfP.js → LeaderboardProfileModal-C1K9rSGn.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-DVt5S3lY.js → LeaderboardProfilePage-CvR48D_y.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-BCXjJE1B.js → LimitsPage-BN79yMkb.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-CzeH4OoJ.js → LocalOnlyNotice-BwTJpkDW.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-aiqSQInP.js → LoginCard-BMXAg1rZ.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-DdGKIi8h.js → LoginModal-Bf0F_UPK.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-D7xGSoMn.js → LoginPage-BylH2waa.js} +1 -1
- package/dashboard/dist/assets/{PetPage-Dlb6rNpF.js → PetPage-X4v_J-Uj.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-Xbruj7Zi.js → PopoverPopup-yEQVU5C_.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-BPxacBzj.js → ProviderIcon-KRXIghW0.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-9wgPnLRj.js → ResetPasswordPage-DQQF2rsl.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-CYFcZFNE.js → SegmentedControl-VkVwcoXk.js} +1 -1
- package/dashboard/dist/assets/{Select-zpFEMqpk.js → Select-CxW2C8OG.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-Bldm5Y0C.js → SelectItemText-D6vhaI0Q.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-dgtwFazV.js → ServiceStatusPage-CCKqUZhI.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-DHfpv53M.js → SessionsPage-Huqt77Qt.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-DcGToOT7.js → SettingsPage-CpX8GYce.js} +2 -2
- package/dashboard/dist/assets/{SkillsPage-DiQDLw2l.js → SkillsPage-S1dtu_Cd.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-GDx7ftMU.js → TokenGalaxy-BayM0FOG.js} +161 -161
- package/dashboard/dist/assets/{ToolbarRootContext-PoCcP2AV.js → ToolbarRootContext-B1KG8B5q.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-CIfq_yk8.js → TrendMonitor-DYqz9nLw.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-Dwy-E3Lf.js → WidgetsPage-WuzVeCBG.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-Ce7NV6Ij.js → WrappedPage-Bpn9GYHz.js} +1 -1
- package/dashboard/dist/assets/{__vite-browser-external-D-WLjvZW.js → __vite-browser-external-B1XxVtUQ.js} +3 -3
- package/dashboard/dist/assets/{agent-logos-BY8n7b9g.js → agent-logos-DVE956SY.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-BDiV6Wlk.js → arrow-up-right-B7aZy0wJ.js} +1 -1
- package/dashboard/dist/assets/{check-Chyo6ujc.js → check-55YI8PGo.js} +1 -1
- package/dashboard/dist/assets/{composite-DgBqMs_Z.js → composite--O2XKSlW.js} +1 -1
- package/dashboard/dist/assets/{copy-ENRv4pAy.js → copy-DDVFmqF5.js} +1 -1
- package/dashboard/dist/assets/{download-D3y3gd-z.js → download-DmIFrL1S.js} +1 -1
- package/dashboard/dist/assets/{external-link-VxSAxWnH.js → external-link-DwG_AAOo.js} +1 -1
- package/dashboard/dist/assets/{flame-CPdTWeRo.js → flame-ANwvantJ.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-BF2G89Q7.js → format-tokens-BzZ_DfX2.js} +1 -1
- package/dashboard/dist/assets/{icons-D6rfdVyV.js → icons-CdyVgzlu.js} +1 -1
- package/dashboard/dist/assets/{index-mzMCUT_4.js → index-B-1uJU_R.js} +1 -1
- package/dashboard/dist/assets/{index-CgmpxGym.js → index-D0VhCSlC.js} +1 -1
- package/dashboard/dist/assets/{index-4bHcp2Ep.js → index-D8g1p_Ee.js} +1 -1
- package/dashboard/dist/assets/{info-BMso9PcY.js → info-n2XpcOlm.js} +1 -1
- package/dashboard/dist/assets/{link-2-Bg34XOcd.js → link-2-Bq9GUX22.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-C4Vul1Yx.js → loader-circle-fkYFxXuJ.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-BBqcwFFo.js → maximize-2-C5v08iPD.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-B2F4Iiey.js → modifiers.esm-AG_bzlWZ.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-k1Ja3ngF.js → monitor-smartphone-BEjlJhuw.js} +1 -1
- package/dashboard/dist/assets/{plus-BaCIejxc.js → plus-BfdtMxnD.js} +1 -1
- package/dashboard/dist/assets/{provider-display-BYxmO9Bu.js → provider-display-BvjuoQty.js} +2 -2
- package/dashboard/dist/assets/{react-xGx5RIqz.js → react-f77D-LSn.js} +1 -1
- package/dashboard/dist/assets/{search-LZQC7j6a.js → search-Dmczow8i.js} +1 -1
- package/dashboard/dist/assets/{skills-api-yLfQkApo.js → skills-api-BuqPQei_.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-B8XRHrmA.js → sortable.esm-CDAVQaFQ.js} +1 -1
- package/dashboard/dist/assets/{store-DfUIKvz3.js → store-C2inKcM-.js} +1 -1
- package/dashboard/dist/assets/{terminal-CsFh6eZS.js → terminal-C1O422UZ.js} +1 -1
- package/dashboard/dist/assets/{trash-CVk10mDa.js → trash-CXOKPZfQ.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-DP7lJyDV.js → use-community-stats-CKfyxLvl.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-B7uLArxV.js → use-latest-request-guard-C3rQR4BN.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-DG97cWcv.js → use-limits-display-prefs-Ic4GUPRY.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-ChQc2v-Q.js → use-ordered-list-Cvbz_wcj.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-DewlF5tk.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-CtF9JAlF.js → use-session-efficiency-pref-u_qW99gD.js} +1 -1
- package/dashboard/dist/assets/{use-transform-DVIBk7FO.js → use-transform-CVGiBxJK.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-BYQuJ9Ud.js → use-usage-limits-MPu696v0.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-CNkzJCP9.js → useCurrency-BOBz18If.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-CU3MtXtS.js → useTokenFormat-BooCzJJZ.js} +1 -1
- package/dashboard/dist/assets/{zap-D5k595AR.js → zap-M_x9dAwo.js} +1 -1
- package/dashboard/dist/index.html +13 -11
- package/dashboard/dist/ip-check.html +1 -1
- package/dashboard/dist/leaderboard.html +1 -1
- package/dashboard/dist/llms.txt +3 -2
- package/dashboard/dist/share.html +1 -1
- package/package.json +2 -2
- package/src/commands/init.js +10 -0
- package/src/commands/status.js +13 -0
- package/src/commands/sync.js +33 -0
- package/src/lib/cloud-account.js +12 -1
- package/src/lib/heatmap-compact.js +114 -0
- package/src/lib/local-api.js +11 -10
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +148 -20
- package/src/lib/skills-manager.js +2 -2
- package/dashboard/dist/assets/DevicePage-BCwSpNXa.js +0 -1
- package/dashboard/dist/assets/DialogDescription-5LunWukT.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-BoFF1l9U.js +0 -1
package/src/lib/rollout.js
CHANGED
|
@@ -3465,7 +3465,7 @@ function deriveOpencodeMessageFingerprint({ msg, totals, source }) {
|
|
|
3465
3465
|
totals.reasoning_output_tokens,
|
|
3466
3466
|
model,
|
|
3467
3467
|
provider,
|
|
3468
|
-
].join("
|
|
3468
|
+
].join("\u0000");
|
|
3469
3469
|
// Hashed rather than stored raw: the fingerprint is persisted per message in
|
|
3470
3470
|
// cursors.json, and heavy OpenCode users carry tens of thousands of entries.
|
|
3471
3471
|
return crypto.createHash("sha256").update(raw).digest("base64url").slice(0, 22);
|
|
@@ -15313,6 +15313,17 @@ function primeAgentSourceForProvider(provider) {
|
|
|
15313
15313
|
return slug ? `prime-agent-${slug}` : "prime-agent";
|
|
15314
15314
|
}
|
|
15315
15315
|
|
|
15316
|
+
// Maps one parsed JSONL line to { id, message, timestamp } or null. pi-family
|
|
15317
|
+
// files wrap each record as { type: "message", id, timestamp, message }.
|
|
15318
|
+
function readPiMessageEntry(entry) {
|
|
15319
|
+
if (!entry || entry.type !== "message") return null;
|
|
15320
|
+
return {
|
|
15321
|
+
id: typeof entry.id === "string" && entry.id ? entry.id : null,
|
|
15322
|
+
message: entry.message,
|
|
15323
|
+
timestamp: entry.timestamp,
|
|
15324
|
+
};
|
|
15325
|
+
}
|
|
15326
|
+
|
|
15316
15327
|
async function parsePiLikeIncremental({
|
|
15317
15328
|
sessionFiles,
|
|
15318
15329
|
cursors,
|
|
@@ -15326,6 +15337,7 @@ async function parsePiLikeIncremental({
|
|
|
15326
15337
|
resolveSessionFiles,
|
|
15327
15338
|
resolveDefaultModel,
|
|
15328
15339
|
sourceForProvider,
|
|
15340
|
+
readEntry = readPiMessageEntry,
|
|
15329
15341
|
} = {}) {
|
|
15330
15342
|
await ensureDir(path.dirname(queuePath));
|
|
15331
15343
|
const projectEnabled = typeof projectQueuePath === "string" && projectQueuePath.length > 0;
|
|
@@ -15427,15 +15439,16 @@ async function parsePiLikeIncremental({
|
|
|
15427
15439
|
let entry;
|
|
15428
15440
|
try { entry = JSON.parse(line); } catch { continue; }
|
|
15429
15441
|
|
|
15430
|
-
|
|
15442
|
+
const record = readEntry(entry);
|
|
15443
|
+
if (!record) continue;
|
|
15431
15444
|
|
|
15432
|
-
const msg =
|
|
15445
|
+
const msg = record.message;
|
|
15433
15446
|
if (!msg || msg.role !== "assistant") continue;
|
|
15434
15447
|
|
|
15435
15448
|
const usage = msg.usage;
|
|
15436
15449
|
if (!usage || typeof usage !== "object") continue;
|
|
15437
15450
|
|
|
15438
|
-
const entryId =
|
|
15451
|
+
const entryId = record.id;
|
|
15439
15452
|
if (!entryId) continue;
|
|
15440
15453
|
if (seenIds.has(entryId)) continue;
|
|
15441
15454
|
|
|
@@ -15461,8 +15474,8 @@ async function parsePiLikeIncremental({
|
|
|
15461
15474
|
let tsMs = null;
|
|
15462
15475
|
if (Number.isFinite(Number(msg.timestamp)) && Number(msg.timestamp) > 0) {
|
|
15463
15476
|
tsMs = Number(msg.timestamp);
|
|
15464
|
-
} else if (typeof
|
|
15465
|
-
const parsed = Date.parse(
|
|
15477
|
+
} else if (typeof record.timestamp === "string" && record.timestamp) {
|
|
15478
|
+
const parsed = Date.parse(record.timestamp);
|
|
15466
15479
|
if (Number.isFinite(parsed) && parsed > 0) tsMs = parsed;
|
|
15467
15480
|
}
|
|
15468
15481
|
if (tsMs == null) {
|
|
@@ -15573,11 +15586,12 @@ async function parsePiLikeIncremental({
|
|
|
15573
15586
|
if (!line || !line.trim()) continue;
|
|
15574
15587
|
let entry;
|
|
15575
15588
|
try { entry = JSON.parse(line); } catch { continue; }
|
|
15576
|
-
const
|
|
15589
|
+
const record = readEntry(entry);
|
|
15590
|
+
const msg = record ? record.message : null;
|
|
15577
15591
|
const usage = msg?.role === "assistant" ? msg.usage : null;
|
|
15578
15592
|
if (!usage || typeof usage !== "object") continue;
|
|
15579
15593
|
|
|
15580
|
-
const entryId =
|
|
15594
|
+
const entryId = record.id;
|
|
15581
15595
|
if (!entryId || projectSeenIds.has(entryId)) continue;
|
|
15582
15596
|
|
|
15583
15597
|
const input = toNonNegativeInt(usage.input);
|
|
@@ -15599,8 +15613,8 @@ async function parsePiLikeIncremental({
|
|
|
15599
15613
|
let tsMs = null;
|
|
15600
15614
|
if (Number.isFinite(Number(msg.timestamp)) && Number(msg.timestamp) > 0) {
|
|
15601
15615
|
tsMs = Number(msg.timestamp);
|
|
15602
|
-
} else if (typeof
|
|
15603
|
-
const parsed = Date.parse(
|
|
15616
|
+
} else if (typeof record.timestamp === "string" && record.timestamp) {
|
|
15617
|
+
const parsed = Date.parse(record.timestamp);
|
|
15604
15618
|
if (Number.isFinite(parsed) && parsed > 0) tsMs = parsed;
|
|
15605
15619
|
}
|
|
15606
15620
|
const bucketStart = tsMs == null
|
|
@@ -15700,6 +15714,85 @@ async function parsePrimeAgentIncremental(options = {}) {
|
|
|
15700
15714
|
});
|
|
15701
15715
|
}
|
|
15702
15716
|
|
|
15717
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
15718
|
+
// MiniMax Code (MiniMax's desktop coding agent) — passive JSONL reader
|
|
15719
|
+
// (~/.minimax/v2/sessions/YYYY/MM/DD/<HH-MM-SS-mmm>-session_<id>/messages.jsonl)
|
|
15720
|
+
//
|
|
15721
|
+
// Records carry pi-shaped usage (input excludes cacheRead) and a ms-epoch
|
|
15722
|
+
// message.timestamp, but have no type:"message" wrapper and dedupe on the
|
|
15723
|
+
// top-level message_id. MiniMax Code routes to many upstream models and records
|
|
15724
|
+
// the model per message. Its usage.cost block is always 0, so it is ignored in
|
|
15725
|
+
// favor of normal pricing. Migrated legacy sessions replay as model
|
|
15726
|
+
// "historical-transcript" with all-zero usage and are dropped by the engine's
|
|
15727
|
+
// zero-token guard. There is no cwd header, so no project attribution.
|
|
15728
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
15729
|
+
|
|
15730
|
+
const MINIMAX_CODE_SOURCE = "minimax-code";
|
|
15731
|
+
const MINIMAX_CODE_SESSION_FILE = "messages.jsonl";
|
|
15732
|
+
// sessions / YYYY / MM / DD / <session dir> / messages.jsonl
|
|
15733
|
+
const MINIMAX_CODE_MAX_SESSION_DEPTH = 5;
|
|
15734
|
+
|
|
15735
|
+
function resolveMinimaxCodeHome(env = process.env) {
|
|
15736
|
+
if (env.TOKENTRACKER_MINIMAX_HOME) return expandHomePath(env.TOKENTRACKER_MINIMAX_HOME, env);
|
|
15737
|
+
const home = env.HOME || require("node:os").homedir();
|
|
15738
|
+
if (process.platform === "win32") {
|
|
15739
|
+
return pickWin32ProviderPath({
|
|
15740
|
+
env,
|
|
15741
|
+
nativeValue: path.join(home, ".minimax"),
|
|
15742
|
+
wslProviderDir: ".minimax",
|
|
15743
|
+
});
|
|
15744
|
+
}
|
|
15745
|
+
return path.join(home, ".minimax");
|
|
15746
|
+
}
|
|
15747
|
+
|
|
15748
|
+
function resolveMinimaxCodeSessionsDir(env = process.env) {
|
|
15749
|
+
const minimaxHome = resolveMinimaxCodeHome(env);
|
|
15750
|
+
return minimaxHome ? path.join(minimaxHome, "v2", "sessions") : null;
|
|
15751
|
+
}
|
|
15752
|
+
|
|
15753
|
+
function resolveMinimaxCodeSessionFiles(env = process.env) {
|
|
15754
|
+
const sessionsDir = resolveMinimaxCodeSessionsDir(env);
|
|
15755
|
+
if (!sessionsDir) return [];
|
|
15756
|
+
const files = [];
|
|
15757
|
+
const walk = (dir, depth) => {
|
|
15758
|
+
let entries;
|
|
15759
|
+
try { entries = fssync.readdirSync(dir, { withFileTypes: true }); } catch { return; }
|
|
15760
|
+
for (const entry of entries) {
|
|
15761
|
+
const fullPath = path.join(dir, entry.name);
|
|
15762
|
+
if (entry.isDirectory()) {
|
|
15763
|
+
if (depth < MINIMAX_CODE_MAX_SESSION_DEPTH) walk(fullPath, depth + 1);
|
|
15764
|
+
} else if (entry.isFile() && entry.name === MINIMAX_CODE_SESSION_FILE && depth > 1) {
|
|
15765
|
+
files.push(fullPath);
|
|
15766
|
+
}
|
|
15767
|
+
}
|
|
15768
|
+
};
|
|
15769
|
+
walk(sessionsDir, 1);
|
|
15770
|
+
files.sort((a, b) => a.localeCompare(b));
|
|
15771
|
+
return files;
|
|
15772
|
+
}
|
|
15773
|
+
|
|
15774
|
+
function readMinimaxCodeEntry(entry) {
|
|
15775
|
+
if (!entry || typeof entry !== "object" || !entry.message) return null;
|
|
15776
|
+
return {
|
|
15777
|
+
id: typeof entry.message_id === "string" && entry.message_id ? entry.message_id : null,
|
|
15778
|
+
message: entry.message,
|
|
15779
|
+
timestamp: null,
|
|
15780
|
+
};
|
|
15781
|
+
}
|
|
15782
|
+
|
|
15783
|
+
async function parseMinimaxCodeIncremental(options = {}) {
|
|
15784
|
+
return parsePiLikeIncremental({
|
|
15785
|
+
...options,
|
|
15786
|
+
// Session files have no cwd header, so project attribution is unsupported.
|
|
15787
|
+
projectQueuePath: undefined,
|
|
15788
|
+
stateKey: "minimaxCode",
|
|
15789
|
+
resolveSessionFiles: resolveMinimaxCodeSessionFiles,
|
|
15790
|
+
resolveDefaultModel: () => `${MINIMAX_CODE_SOURCE}-unknown`,
|
|
15791
|
+
sourceForProvider: () => MINIMAX_CODE_SOURCE,
|
|
15792
|
+
readEntry: readMinimaxCodeEntry,
|
|
15793
|
+
});
|
|
15794
|
+
}
|
|
15795
|
+
|
|
15703
15796
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
15704
15797
|
// Craft Agents (lukilabs/craft-agents-oss) — passive JSONL reader
|
|
15705
15798
|
//
|
|
@@ -15821,12 +15914,12 @@ function resolveCraftDefaultModel() {
|
|
|
15821
15914
|
|
|
15822
15915
|
// Reasonix persists content-free cumulative usage beside each session JSONL.
|
|
15823
15916
|
// Reading only these telemetry sidecars keeps prompts and tool output private.
|
|
15824
|
-
function
|
|
15917
|
+
function reasonixHomeCandidates(env = process.env) {
|
|
15825
15918
|
if (env.TOKENTRACKER_REASONIX_HOME) {
|
|
15826
|
-
return expandHomePath(env.TOKENTRACKER_REASONIX_HOME, env);
|
|
15919
|
+
return [expandHomePath(env.TOKENTRACKER_REASONIX_HOME, env)];
|
|
15827
15920
|
}
|
|
15828
15921
|
if (env.REASONIX_STATE_HOME) {
|
|
15829
|
-
return expandHomePath(env.REASONIX_STATE_HOME, env);
|
|
15922
|
+
return [expandHomePath(env.REASONIX_STATE_HOME, env)];
|
|
15830
15923
|
}
|
|
15831
15924
|
// Windows installs of Git Bash / MSYS / conda export a HOME of their own
|
|
15832
15925
|
// (often a POSIX-shaped path), so preferring it silently sends the scan to a
|
|
@@ -15837,26 +15930,57 @@ function resolveReasonixHome(env = process.env) {
|
|
|
15837
15930
|
process.platform === "win32"
|
|
15838
15931
|
? env.USERPROFILE || env.HOME || require("node:os").homedir()
|
|
15839
15932
|
: env.HOME || require("node:os").homedir();
|
|
15840
|
-
|
|
15933
|
+
const candidates = [path.join(home, ".reasonix")];
|
|
15934
|
+
// On Windows the dot-directory is not where the data lives: Reasonix keeps
|
|
15935
|
+
// sessions and memory under %APPDATA%\reasonix (no leading dot) and only the
|
|
15936
|
+
// cache under %LOCALAPPDATA%. Taking USERPROFILE over a shell HOME was not
|
|
15937
|
+
// enough for #641 because ~/.reasonix does not exist on Windows at all, so
|
|
15938
|
+
// the provider read as "not installed" and vanished from status without a
|
|
15939
|
+
// skipped line. The cache root is deliberately left out.
|
|
15940
|
+
if (process.platform === "win32" && env.APPDATA) {
|
|
15941
|
+
candidates.push(path.join(env.APPDATA, "reasonix"));
|
|
15942
|
+
}
|
|
15943
|
+
return candidates;
|
|
15944
|
+
}
|
|
15945
|
+
|
|
15946
|
+
// The home used for "is Reasonix installed" (src/commands/status.js,
|
|
15947
|
+
// src/commands/init.js): the first candidate that exists, else the first, so
|
|
15948
|
+
// the caller still has a path to report.
|
|
15949
|
+
function resolveReasonixHome(env = process.env) {
|
|
15950
|
+
const candidates = reasonixHomeCandidates(env);
|
|
15951
|
+
return candidates.find((dir) => fssync.existsSync(dir)) || candidates[0];
|
|
15841
15952
|
}
|
|
15842
15953
|
|
|
15843
|
-
|
|
15954
|
+
// Depth bound because the scan starts at the Reasonix root rather than at two
|
|
15955
|
+
// known subdirectories; it is a guard against a pathological tree, not a layout
|
|
15956
|
+
// assumption. The known layout (projects/<p>/sessions) sits at depth 3.
|
|
15957
|
+
const REASONIX_SCAN_MAX_DEPTH = 8;
|
|
15958
|
+
|
|
15959
|
+
function collectReasonixTelemetryFiles(dir, files, depth = 0) {
|
|
15960
|
+
if (depth > REASONIX_SCAN_MAX_DEPTH) return;
|
|
15844
15961
|
if (!fssync.existsSync(dir)) return;
|
|
15845
15962
|
let entries;
|
|
15846
15963
|
try { entries = fssync.readdirSync(dir, { withFileTypes: true }); } catch { return; }
|
|
15847
15964
|
for (const entry of entries) {
|
|
15848
15965
|
const full = path.join(dir, entry.name);
|
|
15849
|
-
if (entry.isDirectory()) collectReasonixTelemetryFiles(full, files);
|
|
15966
|
+
if (entry.isDirectory()) collectReasonixTelemetryFiles(full, files, depth + 1);
|
|
15850
15967
|
else if (entry.isFile() && entry.name.endsWith(".jsonl.telemetry.json")) files.push(full);
|
|
15851
15968
|
}
|
|
15852
15969
|
}
|
|
15853
15970
|
|
|
15854
15971
|
function resolveReasonixTelemetryFiles(env = process.env) {
|
|
15855
|
-
|
|
15972
|
+
// Recurse from each root instead of from a hardcoded projects/ and sessions/.
|
|
15973
|
+
// The #641 reporter supplied a screenshot of the data location, not a
|
|
15974
|
+
// directory listing, so the layout under %APPDATA%\reasonix is unconfirmed —
|
|
15975
|
+
// and a renamed subdirectory would otherwise cost another release to notice.
|
|
15856
15976
|
const files = [];
|
|
15857
|
-
|
|
15858
|
-
|
|
15859
|
-
|
|
15977
|
+
const seenHomes = new Set();
|
|
15978
|
+
for (const home of reasonixHomeCandidates(env)) {
|
|
15979
|
+
if (seenHomes.has(home)) continue;
|
|
15980
|
+
seenHomes.add(home);
|
|
15981
|
+
collectReasonixTelemetryFiles(home, files);
|
|
15982
|
+
}
|
|
15983
|
+
return Array.from(new Set(files)).sort((a, b) => a.localeCompare(b));
|
|
15860
15984
|
}
|
|
15861
15985
|
|
|
15862
15986
|
function readReasonixSnapshot(filePath) {
|
|
@@ -22904,6 +23028,10 @@ module.exports = {
|
|
|
22904
23028
|
resolvePrimeAgentSessionFiles,
|
|
22905
23029
|
resolvePrimeAgentDefaultModel,
|
|
22906
23030
|
parsePrimeAgentIncremental,
|
|
23031
|
+
resolveMinimaxCodeHome,
|
|
23032
|
+
resolveMinimaxCodeSessionsDir,
|
|
23033
|
+
resolveMinimaxCodeSessionFiles,
|
|
23034
|
+
parseMinimaxCodeIncremental,
|
|
22907
23035
|
resolveCraftConfigDir,
|
|
22908
23036
|
resolveCraftWorkspaceRoots,
|
|
22909
23037
|
resolveCraftSessionFiles,
|
|
@@ -490,13 +490,13 @@ function hashDirectory(dir) {
|
|
|
490
490
|
continue;
|
|
491
491
|
}
|
|
492
492
|
const execBit = process.platform === "win32" ? 0 : stat.mode & 0o111 ? 1 : 0;
|
|
493
|
-
hash.update(`${rel}
|
|
493
|
+
hash.update(`${rel}\u0000${execBit}\u0000`);
|
|
494
494
|
try {
|
|
495
495
|
hash.update(fs.readFileSync(abs));
|
|
496
496
|
} catch (_e) {
|
|
497
497
|
// unreadable file — fold its absence in deterministically
|
|
498
498
|
}
|
|
499
|
-
hash.update("
|
|
499
|
+
hash.update("\u0000");
|
|
500
500
|
}
|
|
501
501
|
}
|
|
502
502
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as b,r as l,j as r,c as e,i as v}from"./__vite-browser-external-D-WLjvZW.js";const x={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1,VITE_APP_VERSION:"0.98.0",VITE_INSFORGE_ANON_KEY:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3OC0xMjM0LTU2NzgtOTBhYi1jZGVmMTIzNDU2NzgiLCJlbWFpbCI6ImFub25AaW5zZm9yZ2UuY29tIiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODExNDU5NDd9.T0auta_IrVIh0uXW1bob5QSnzvsnJmN28r5XkSGEuQY",VITE_INSFORGE_BASE_URL:"https://srctyff5.us-east.insforge.app"};function f(){return v(),`${(x&&"https://srctyff5.us-east.insforge.app"||"https://srctyff5.us-east.insforge.app").replace(/\/$/,"")}/functions/tokentracker-device-flow-grant`}function p(s){return(s||"").toUpperCase().replace(/\s+/g,"").replace(/[^A-Z0-9-]/g,"")}function h(){const s=b(),[m,g]=l.useState(""),[i,a]=l.useState({kind:"idle",message:""});l.useEffect(()=>{try{const d=new URLSearchParams(window.location.search).get("user_code");d&&g(p(d))}catch{}},[]);async function u(c){if(c?.preventDefault?.(),!s?.signedIn){a({kind:"error",message:e("device.approval.error.sign_in")});return}const d=p(m);if(!/^[A-HJKMNP-Z2-9]{4}-[A-HJKMNP-Z2-9]{4}$/.test(d)){a({kind:"error",message:e("device.approval.error.invalid_code")});return}a({kind:"working",message:e("device.approval.action.approving")});try{const n=await s.getAccessToken?.();if(!n){a({kind:"error",message:e("device.approval.error.no_token")});return}const o=await fetch(f(),{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({user_code:d})}),t=await o.json().catch(()=>({}));o.ok?a({kind:"success",message:t.status==="already_approved"?t.client_info?e("device.approval.success.already_client",{client:t.client_info}):e("device.approval.success.already"):t.client_info?e("device.approval.success.approved_client",{client:t.client_info}):e("device.approval.success.approved")}):o.status===404?a({kind:"error",message:e("device.approval.error.not_found")}):o.status===410?a({kind:"error",message:e("device.approval.error.expired")}):o.status===401?a({kind:"error",message:e("device.approval.error.session_expired")}):a({kind:"error",message:t?.error?e("device.approval.error.server_detail",{message:t.error}):e("device.approval.error.server",{status:o.status})})}catch(n){a({kind:"error",message:e("device.approval.error.network",{message:n?.message||n})})}}return r.jsx("div",{className:"min-h-screen flex items-center justify-center bg-white dark:bg-oai-gray-950 px-6 py-12",children:r.jsxs("div",{className:"w-full max-w-md rounded-xl border border-oai-gray-200 dark:border-oai-gray-800 bg-white dark:bg-oai-gray-900 p-8",children:[r.jsx("h1",{className:"text-2xl font-semibold text-oai-gray-900 dark:text-white mb-2",children:e("device.approval.title")}),r.jsx("p",{className:"text-sm text-oai-gray-500 dark:text-oai-gray-400 mb-6",children:e("device.approval.description")}),s?.signedIn?null:r.jsx("div",{className:"rounded-md border border-amber-200 bg-amber-50 dark:bg-amber-900/20 dark:border-amber-800 p-4 mb-4",children:r.jsx("p",{className:"text-sm text-amber-700 dark:text-amber-300",children:e("device.approval.sign_in_banner")})}),r.jsxs("form",{onSubmit:u,className:"space-y-4",children:[r.jsxs("label",{className:"block",children:[r.jsx("span",{className:"block text-xs font-medium uppercase tracking-wide text-oai-gray-500 dark:text-oai-gray-400 mb-1",children:e("device.approval.code_label")}),r.jsx("input",{type:"text",value:m,onChange:c=>g(p(c.target.value)),placeholder:"XXXX-XXXX",spellCheck:!1,autoCapitalize:"characters",maxLength:9,className:"w-full font-mono text-xl tracking-widest text-center rounded-md border border-oai-gray-300 dark:border-oai-gray-700 bg-white dark:bg-oai-gray-900 text-oai-gray-900 dark:text-white px-4 py-3 focus:outline-none focus:ring-inset focus:ring-2 focus:ring-emerald-600"})]}),r.jsx("button",{type:"submit",disabled:i.kind==="working"||!s?.signedIn,className:"w-full rounded-md bg-emerald-600 hover:bg-emerald-500 disabled:bg-oai-gray-300 disabled:cursor-not-allowed text-white font-medium py-3 transition-colors",children:i.kind==="working"?e("device.approval.action.approving"):e("device.approval.action.approve")})]}),i.kind==="success"&&r.jsx("div",{className:"mt-4 rounded-md border border-emerald-200 bg-emerald-50 dark:bg-emerald-900/20 dark:border-emerald-800 p-4",children:r.jsx("p",{className:"text-sm text-emerald-700 dark:text-emerald-300",children:i.message})}),i.kind==="error"&&r.jsx("div",{className:"mt-4 rounded-md border border-red-200 bg-red-50 dark:bg-red-900/20 dark:border-red-800 p-4",children:r.jsx("p",{className:"text-sm text-red-700 dark:text-red-300",children:i.message})})]})})}export{h as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as n,v as a}from"./__vite-browser-external-D-WLjvZW.js";import{u as p}from"./DialogTitle-Bby0zSCw.js";import{u as c}from"./composite-DgBqMs_Z.js";const x=n.forwardRef(function(e,r){const{render:l,className:u,style:m,id:s,...t}=e,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-D-WLjvZW.js";import{h as r,i as t,p as s}from"./react-xGx5RIqz.js";function i(){!r.current&&t();const[e]=o.useState(s.current);return e}export{i as u};
|