tokentracker-cli 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.de.md +6 -4
  2. package/README.ja.md +6 -4
  3. package/README.ko.md +6 -4
  4. package/README.md +7 -4
  5. package/README.zh-CN.md +6 -4
  6. package/dashboard/dist/assets/{AchievementBadge-CX7g238N.js → AchievementBadge-BGA-HT_B.js} +1 -1
  7. package/dashboard/dist/assets/{AchievementsPage-BbkEymra.js → AchievementsPage-CtRh5AjH.js} +2 -2
  8. package/dashboard/dist/assets/{AchievementsSection-CmhoerE7.js → AchievementsSection-BarRcKaN.js} +1 -1
  9. package/dashboard/dist/assets/{BadgeDetailModal-996i13Vf.js → BadgeDetailModal-Bg0BDAN2.js} +1 -1
  10. package/dashboard/dist/assets/{BotAnimated-B22CfAlF.js → BotAnimated-By9J3-dn.js} +1 -1
  11. package/dashboard/dist/assets/{Card-DFd9hCFB.js → Card-CIoJYi2j.js} +1 -1
  12. package/dashboard/dist/assets/{ClawdAnimated-DXKN28M2.js → ClawdAnimated-Dkvc2xe8.js} +2 -2
  13. package/dashboard/dist/assets/{CommandPalette-DVRs34TV.js → CommandPalette-BssDtHRl.js} +1 -1
  14. package/dashboard/dist/assets/{CommunityStatsModal-BExjH9E8.js → CommunityStatsModal-CQrgLlDb.js} +1 -1
  15. package/dashboard/dist/assets/{ConfirmModal-KJhOrJ98.js → ConfirmModal-C3hBPgYc.js} +1 -1
  16. package/dashboard/dist/assets/{Controls-xnIEnOqd.js → Controls-BSW6a1HS.js} +1 -1
  17. package/dashboard/dist/assets/DashboardPage-Dhv7fejy.js +1 -0
  18. package/dashboard/dist/assets/{DevicePage-Bo8e-KVq.js → DevicePage-D5eZn0wo.js} +1 -1
  19. package/dashboard/dist/assets/{DialogClose-gBd-BmR7.js → DialogClose-BltQpaJo.js} +1 -1
  20. package/dashboard/dist/assets/DialogDescription-Cof52Icj.js +1 -0
  21. package/dashboard/dist/assets/{DialogTitle-B0UbsqD7.js → DialogTitle-CVddcRPZ.js} +1 -1
  22. package/dashboard/dist/assets/{FadeIn-Dv2DtOPn.js → FadeIn-goPv73MT.js} +1 -1
  23. package/dashboard/dist/assets/{HeaderGithubStar-1kEsgGdK.js → HeaderGithubStar-BDBrrkzt.js} +1 -1
  24. package/dashboard/dist/assets/{HoverTooltip-DQlpkw2L.js → HoverTooltip-qyMezXOs.js} +1 -1
  25. package/dashboard/dist/assets/{IpCheckPage-CFlkmSlA.js → IpCheckPage-Ces8JIPb.js} +1 -1
  26. package/dashboard/dist/assets/{LandingPage-DNs6mSij.js → LandingPage-B2TmLGno.js} +2 -2
  27. package/dashboard/dist/assets/{LeaderboardAvatar-DSltCiRr.js → LeaderboardAvatar-CVVRoNua.js} +1 -1
  28. package/dashboard/dist/assets/{LeaderboardPage-CkjUMA-k.js → LeaderboardPage-xtt-bOY8.js} +2 -2
  29. package/dashboard/dist/assets/{LeaderboardProfileModal-DJjaD7Kz.js → LeaderboardProfileModal-BM4d_I_r.js} +3 -3
  30. package/dashboard/dist/assets/{LeaderboardProfilePage-Bue7tJoi.js → LeaderboardProfilePage-BWqhFLQX.js} +1 -1
  31. package/dashboard/dist/assets/{LimitsPage-Ctbvl8Q8.js → LimitsPage-BZL4Pcl8.js} +1 -1
  32. package/dashboard/dist/assets/{LocalOnlyNotice-LjNI8j4I.js → LocalOnlyNotice-D4gnOEJj.js} +1 -1
  33. package/dashboard/dist/assets/LoginCard-CB17FQ5w.js +1 -0
  34. package/dashboard/dist/assets/{LoginModal-CUmfCsHY.js → LoginModal-BI-O1rH4.js} +1 -1
  35. package/dashboard/dist/assets/{LoginPage-CjJb9qFM.js → LoginPage-DnGzsvJ4.js} +1 -1
  36. package/dashboard/dist/assets/{PetPage-BWKEnBEW.js → PetPage-NRnIKMaJ.js} +1 -1
  37. package/dashboard/dist/assets/{PopoverPopup-DeXj3kM3.js → PopoverPopup-DHoK6UJZ.js} +1 -1
  38. package/dashboard/dist/assets/{ProviderIcon-DL-oa-UM.js → ProviderIcon-BTkdx9o2.js} +1 -1
  39. package/dashboard/dist/assets/{ResetPasswordPage-CeeKMN8H.js → ResetPasswordPage-C6K0w318.js} +1 -1
  40. package/dashboard/dist/assets/{SegmentedControl-Bx5Z9tYf.js → SegmentedControl-gEoWioBE.js} +1 -1
  41. package/dashboard/dist/assets/{Select-DRbgbSPd.js → Select-CI-qtEYu.js} +1 -1
  42. package/dashboard/dist/assets/{SelectItemText-D792o2Et.js → SelectItemText-q-yhzzjw.js} +1 -1
  43. package/dashboard/dist/assets/{ServiceStatusPage-NjQ1oGqx.js → ServiceStatusPage-C4xD1CEe.js} +1 -1
  44. package/dashboard/dist/assets/{SessionsPage-Cr2uHP91.js → SessionsPage-CS0Yun2z.js} +1 -1
  45. package/dashboard/dist/assets/{SettingsPage-Av8pVbqT.js → SettingsPage-GVY_ktz4.js} +2 -2
  46. package/dashboard/dist/assets/{SkillsPage-feW4j329.js → SkillsPage-COPRL95O.js} +1 -1
  47. package/dashboard/dist/assets/{TokenGalaxy-DX36F36Q.js → TokenGalaxy-Czi0Ic48.js} +1 -1
  48. package/dashboard/dist/assets/{ToolbarRootContext-CzMlVMfI.js → ToolbarRootContext-BZkTiBJB.js} +1 -1
  49. package/dashboard/dist/assets/{TrendMonitor-BosWE34g.js → TrendMonitor-CnIsuxV-.js} +1 -1
  50. package/dashboard/dist/assets/{WidgetsPage-DhoypTuq.js → WidgetsPage-OdX_Fsul.js} +1 -1
  51. package/dashboard/dist/assets/{WrappedPage-DR6BoipR.js → WrappedPage-h9N63-F8.js} +1 -1
  52. package/dashboard/dist/assets/__vite-browser-external-BFNWaGsk.js +45 -0
  53. package/dashboard/dist/assets/{agent-logos-QSScjsfz.js → agent-logos-BDiPxrST.js} +1 -1
  54. package/dashboard/dist/assets/{arrow-up-right-BJQYadF-.js → arrow-up-right-DtFQUeJG.js} +1 -1
  55. package/dashboard/dist/assets/{check-CINIOTsF.js → check-C35onaNL.js} +1 -1
  56. package/dashboard/dist/assets/{composite-YV7-iFo_.js → composite-qxBzts0W.js} +1 -1
  57. package/dashboard/dist/assets/{copy-Bp_U7bAZ.js → copy-D_D71TLc.js} +1 -1
  58. package/dashboard/dist/assets/{download-CVOIkdjl.js → download-DMQI2hQe.js} +1 -1
  59. package/dashboard/dist/assets/{external-link-P6LDhEET.js → external-link-CemM4dWf.js} +1 -1
  60. package/dashboard/dist/assets/{flame-AbZCJ878.js → flame-CIvk0SP5.js} +1 -1
  61. package/dashboard/dist/assets/{format-tokens-M5bvANSq.js → format-tokens-D3JSvcFl.js} +1 -1
  62. package/dashboard/dist/assets/{icons-DpRn5Rxt.js → icons-Ccf5W0AL.js} +1 -1
  63. package/dashboard/dist/assets/{index-KQ5H65Ds.js → index-Brd2evyz.js} +1 -1
  64. package/dashboard/dist/assets/{index-CW2bybhs.js → index-C8Wri_HI.js} +1 -1
  65. package/dashboard/dist/assets/{index-L3O7cNuj.js → index-CFXmD_KX.js} +1 -1
  66. package/dashboard/dist/assets/{info-GEiJwgYk.js → info-CafrKEG8.js} +1 -1
  67. package/dashboard/dist/assets/{link-2-D8KpexwS.js → link-2-Ds-9Nzlp.js} +1 -1
  68. package/dashboard/dist/assets/{loader-circle-r0nEab80.js → loader-circle-DA4I55-V.js} +1 -1
  69. package/dashboard/dist/assets/{maximize-2-azGbxGbz.js → maximize-2-CjMPt5kU.js} +1 -1
  70. package/dashboard/dist/assets/{modifiers.esm-Cke4_92g.js → modifiers.esm-DIxTS09h.js} +1 -1
  71. package/dashboard/dist/assets/module-WSx8viXK.js +3 -0
  72. package/dashboard/dist/assets/{monitor-smartphone-BnHiLGNs.js → monitor-smartphone-IZpIOxn3.js} +1 -1
  73. package/dashboard/dist/assets/{plus-CJbY6Uuk.js → plus-vbLFNs70.js} +1 -1
  74. package/dashboard/dist/assets/{provider-display-B05KW8SE.js → provider-display-BAu_UIfV.js} +2 -2
  75. package/dashboard/dist/assets/{react-CingcaIm.js → react-Djb4VGKb.js} +1 -1
  76. package/dashboard/dist/assets/{search-CyffdJFU.js → search-Ct6LY9Ke.js} +1 -1
  77. package/dashboard/dist/assets/{skills-api-CdDPrjMM.js → skills-api-BnGI2gEp.js} +1 -1
  78. package/dashboard/dist/assets/{sortable.esm-B48YEoXA.js → sortable.esm-CjCGd6g5.js} +1 -1
  79. package/dashboard/dist/assets/{store-B0W0vLvA.js → store-CBxkOqRe.js} +1 -1
  80. package/dashboard/dist/assets/{terminal-CJ0D4hSx.js → terminal-Dlpdp5Az.js} +1 -1
  81. package/dashboard/dist/assets/{trash-DH-_Q3A5.js → trash-pxUSKv66.js} +1 -1
  82. package/dashboard/dist/assets/{use-community-stats-y6OaeOVs.js → use-community-stats-tHaixRIw.js} +1 -1
  83. package/dashboard/dist/assets/{use-latest-request-guard-DP7kE0Xa.js → use-latest-request-guard-Cs44WPfL.js} +1 -1
  84. package/dashboard/dist/assets/{use-limits-display-prefs-Bgcto2k1.js → use-limits-display-prefs-Dw56PXWy.js} +1 -1
  85. package/dashboard/dist/assets/{use-ordered-list-1L7o2taR.js → use-ordered-list-DpLx8oLV.js} +1 -1
  86. package/dashboard/dist/assets/use-reduced-motion-DrlJ9X6p.js +1 -0
  87. package/dashboard/dist/assets/{use-session-efficiency-pref-36sqzSZl.js → use-session-efficiency-pref-BN3FtBvr.js} +1 -1
  88. package/dashboard/dist/assets/{use-transform-DZgeA77H.js → use-transform-C4nTGgzb.js} +1 -1
  89. package/dashboard/dist/assets/{use-usage-limits-C5P1O9oT.js → use-usage-limits-Dmwdc1yo.js} +1 -1
  90. package/dashboard/dist/assets/{useCurrency-Dwv89bBn.js → useCurrency-DSc3A_Ih.js} +1 -1
  91. package/dashboard/dist/assets/{useTokenFormat-BGeVB81B.js → useTokenFormat-BHjcMgm8.js} +1 -1
  92. package/dashboard/dist/assets/{zap-D18Nt3M5.js → zap-BE8i_wu2.js} +1 -1
  93. package/dashboard/dist/brand-logos/trae.svg +1 -0
  94. package/dashboard/dist/index.html +15 -11
  95. package/dashboard/dist/ip-check.html +1 -1
  96. package/dashboard/dist/leaderboard.html +1 -1
  97. package/dashboard/dist/llms.txt +4 -2
  98. package/dashboard/dist/share.html +1 -1
  99. package/package.json +6 -4
  100. package/src/commands/init.js +20 -7
  101. package/src/commands/status.js +39 -9
  102. package/src/commands/sync.js +62 -1
  103. package/src/lib/pricing/curated-overrides.json +7 -0
  104. package/src/lib/pricing/matcher.js +5 -0
  105. package/src/lib/pricing/seed-snapshot.json +1 -1
  106. package/src/lib/rollout.js +845 -20
  107. package/src/lib/trae-db.js +127 -0
  108. package/src/lib/trae-snapshot.js +230 -0
  109. package/src/lib/trae-sqlite.js +143 -0
  110. package/src/lib/trae-usage.js +121 -0
  111. package/src/lib/wsl-probe.js +55 -12
  112. package/dashboard/dist/assets/DashboardPage-BzsiCwjX.js +0 -1
  113. package/dashboard/dist/assets/DialogDescription-CTEI9PvU.js +0 -1
  114. package/dashboard/dist/assets/LoginCard-U_3SnvtN.js +0 -1
  115. package/dashboard/dist/assets/__vite-browser-external-DYTQCEz4.js +0 -45
  116. package/dashboard/dist/assets/module-DtWfRKM4.js +0 -3
  117. package/dashboard/dist/assets/use-reduced-motion-BQxHT0gI.js +0 -1
@@ -93,6 +93,8 @@ const {
93
93
  resolveDroidSessionsDir,
94
94
  resolveDshHomes,
95
95
  resolveDshSessionFiles,
96
+ resolveCommandCodeHomes,
97
+ resolveCommandCodeSessionFiles,
96
98
  resolveTraeStoragePath,
97
99
  readTraeEntitlementFromStorage,
98
100
  resolveGrokBuildSessions,
@@ -729,6 +731,20 @@ async function cmdStatus(argv = []) {
729
731
  const dshSessionsDir = dshHomes.map((homeDir) => path.join(homeDir, "sessions")).join(", ");
730
732
  const dshSessionFiles = await resolveDshSessionFiles(process.env);
731
733
  const dshInstalled = dshSessionFiles.length > 0;
734
+ let commandCodeProjectsDir = "";
735
+ let commandCodeSessionFiles = [];
736
+ let commandCodeDiscoveryError = null;
737
+ try {
738
+ commandCodeProjectsDir = resolveCommandCodeHomes(process.env)
739
+ .map((homeDir) => path.join(homeDir, "projects"))
740
+ .join(", ");
741
+ commandCodeSessionFiles = await resolveCommandCodeSessionFiles(process.env);
742
+ } catch (error) {
743
+ // Discovery stays strict for sync, but a provider read error must not
744
+ // suppress the rest of the status diagnostics.
745
+ commandCodeDiscoveryError = `${error?.code ? `${error.code}: ` : ""}${error?.message || String(error)}`;
746
+ }
747
+ const commandCodeInstalled = commandCodeSessionFiles.length > 0;
732
748
  const lmstudioHome = resolveLmstudioHome(process.env);
733
749
  const lmstudioLogFiles = await resolveLmstudioLogFiles(process.env);
734
750
  const lmstudioInstalled = lmstudioLogFiles.length > 0;
@@ -739,9 +755,10 @@ async function cmdStatus(argv = []) {
739
755
  const devinDbPath = resolveDevinDbPath(process.env);
740
756
  const devinInstalled = Boolean(devinDbPath && fssync.existsSync(devinDbPath));
741
757
 
742
- // Trae SOLO (ByteDance AI IDE) — passive entitlement snapshot reader.
758
+ const { resolveTraeDbPaths } = require("../lib/trae-db");
759
+ const traeDbPaths = resolveTraeDbPaths(process.env);
743
760
  const traeStoragePath = resolveTraeStoragePath(process.env);
744
- const traeInstalled = Boolean(traeStoragePath);
761
+ const traeInstalled = Boolean(traeStoragePath || traeDbPaths.length);
745
762
  // Render path for the entitlement snapshot: read it straight from the
746
763
  // Trae Local State storage.json via the shared parser. The queue stays
747
764
  // token-count-only, so the status read path never depends on queue rows
@@ -1083,6 +1100,15 @@ async function cmdStatus(argv = []) {
1083
1100
  dsh: dshInstalled
1084
1101
  ? { installed: true, files: dshSessionFiles.length, detail: dshSessionsDir }
1085
1102
  : { installed: false },
1103
+ "command-code": commandCodeInstalled
1104
+ ? {
1105
+ installed: true,
1106
+ files: commandCodeSessionFiles.length,
1107
+ detail: commandCodeProjectsDir,
1108
+ }
1109
+ : commandCodeDiscoveryError
1110
+ ? { installed: false, error: commandCodeDiscoveryError }
1111
+ : { installed: false },
1086
1112
  lmstudio: lmstudioInstalled
1087
1113
  ? {
1088
1114
  installed: true,
@@ -1099,7 +1125,9 @@ async function cmdStatus(argv = []) {
1099
1125
  trae: traeInstalled
1100
1126
  ? {
1101
1127
  installed: true,
1102
- detail: traeStoragePath,
1128
+ detail: traeDbPaths[0] || traeStoragePath,
1129
+ usage_databases: traeDbPaths.length,
1130
+ usage_key_source: process.env.TOKENTRACKER_TRAE_SQLCIPHER_KEY?.trim() ? "environment" : "application",
1103
1131
  ...(traeEntitlement ? { entitlement: traeEntitlement } : {}),
1104
1132
  }
1105
1133
  : { installed: false },
@@ -1288,6 +1316,11 @@ async function cmdStatus(argv = []) {
1288
1316
  dshInstalled
1289
1317
  ? `- DeepSeek Harness: passive reader (${dshSessionFiles.length} session${dshSessionFiles.length !== 1 ? "s" : ""} in ${dshSessionsDir})`
1290
1318
  : null,
1319
+ commandCodeInstalled
1320
+ ? `- Command Code: passive reader (${commandCodeSessionFiles.length} session${commandCodeSessionFiles.length !== 1 ? "s" : ""} in ${commandCodeProjectsDir})`
1321
+ : commandCodeDiscoveryError
1322
+ ? `- Command Code: discovery failed (${commandCodeDiscoveryError})`
1323
+ : null,
1291
1324
  lmstudioInstalled
1292
1325
  ? `- LM Studio: passive reader (${lmstudioLogFiles.length} log${lmstudioLogFiles.length !== 1 ? "s" : ""} in ${path.join(lmstudioHome, "server-logs")})`
1293
1326
  : null,
@@ -1298,12 +1331,9 @@ async function cmdStatus(argv = []) {
1298
1331
  ? `- Devin CLI: passive reader (${devinDbPath})`
1299
1332
  : null,
1300
1333
  traeInstalled
1301
- // Deliberately NOT "passive reader": every other line with that wording
1302
- // means tokens are being counted. Trae encrypts its session transcripts
1303
- // (SQLCipher) and its plaintext summaries carry no token counts, so this
1304
- // provider contributes plan info and nothing else — say so, or users go
1305
- // looking for Trae usage in the dashboard that will never appear.
1306
- ? `- Trae SOLO: plan info only, no token usage (${traeStoragePath})`
1334
+ ? traeDbPaths.length
1335
+ ? `- TRAE: local usage reader, ${traeDbPaths.length} database(s) (shared application key; optional key override)`
1336
+ : `- TRAE: plan info only, no local usage database found (${traeStoragePath})`
1307
1337
  : null,
1308
1338
  traeEntitlement
1309
1339
  ? `- Trae SOLO plan: ${formatTraeEntitlementLine(traeEntitlement)}`
@@ -135,7 +135,10 @@ const {
135
135
  resolveDroidModel,
136
136
  resolveDshSessionFiles,
137
137
  parseDshIncremental,
138
+ resolveCommandCodeSessionFiles,
139
+ parseCommandCodeIncremental,
138
140
  parseTraeCnApiIncremental,
141
+ parseTraeIncremental,
139
142
  bucketKey,
140
143
  toUtcHalfHourStart,
141
144
  totalsKey,
@@ -284,6 +287,7 @@ const ZCODE_NATIVE_USAGE_REPAIR_KEY = "zcodeNativeUsageRepair_2026_08";
284
287
  const ZCODE_INCLUSIVE_TOKEN_REPAIR_KEY = "zcodeInclusiveTokenRepair_2026_09";
285
288
  const AUTO_SYNC_SOURCE_ALIASES = new Map([
286
289
  ["code", "every-code"],
290
+ ["commandcode", "command-code"],
287
291
  ["deepseek", "dsh"],
288
292
  ["everycode", "every-code"],
289
293
  ["kilo", "kilo-cli"],
@@ -300,6 +304,7 @@ const AUTO_SYNC_SOURCES = new Set([
300
304
  "cline",
301
305
  "codebuddy",
302
306
  "codex",
307
+ "command-code",
303
308
  "copilot",
304
309
  "craft",
305
310
  "cursor",
@@ -329,6 +334,7 @@ const AUTO_SYNC_SOURCES = new Set([
329
334
  "reasonix",
330
335
  "roocode",
331
336
  "trae-cn",
337
+ "trae",
332
338
  "unsloth",
333
339
  "workbuddy",
334
340
  "zcode",
@@ -1650,6 +1656,34 @@ async function cmdSync(argv, context = {}) {
1650
1656
  }
1651
1657
  }
1652
1658
 
1659
+ // ── Command Code (`cmd`) — passive read of ~/.commandcode session logs ──
1660
+ let commandCodeResult = { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
1661
+ if (sourceAllowed("command-code")) {
1662
+ try {
1663
+ const commandCodeSessionFiles = await resolveCommandCodeSessionFiles(process.env);
1664
+ // Empty discovery preserves durable usage history. Native I/O failures
1665
+ // remain visible; optional WSL failures do not suppress native usage.
1666
+ if (commandCodeSessionFiles.length > 0 || cursors.commandCode) {
1667
+ if (progress?.enabled) {
1668
+ progress.start(
1669
+ `Parsing Command Code ${renderBar(0)} 0/${formatNumber(
1670
+ commandCodeSessionFiles.length,
1671
+ )} sessions | buckets 0`,
1672
+ );
1673
+ }
1674
+ commandCodeResult = await parseCommandCodeIncremental({
1675
+ sessionFiles: commandCodeSessionFiles,
1676
+ cursors,
1677
+ queuePath,
1678
+ projectQueuePath,
1679
+ onProgress: makeProviderProgress("Command Code"),
1680
+ });
1681
+ }
1682
+ } catch (err) {
1683
+ warnProviderParseFailure("Command Code", err, opts);
1684
+ }
1685
+ }
1686
+
1653
1687
  // ── LM Studio and Unsloth Studio — passive inference usage ──
1654
1688
  let lmstudioResult = { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
1655
1689
  if (sourceAllowed("lmstudio")) {
@@ -1979,6 +2013,27 @@ async function cmdSync(argv, context = {}) {
1979
2013
  }
1980
2014
  }
1981
2015
 
2016
+ let traeResult = { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
2017
+ if (sourceAllowed("trae")) {
2018
+ try {
2019
+ traeResult = await parseTraeIncremental({
2020
+ cursors, queuePath, onProgress: makeProviderProgress("TRAE"),
2021
+ });
2022
+ for (const { database, message } of traeResult.errors) {
2023
+ process.stderr.write(`TRAE sync: could not read ${database}: ${message}. Will retry on the next sync.\n`);
2024
+ }
2025
+ if (traeResult.recordsSkipped > 0 && !opts.auto) {
2026
+ process.stderr.write(`TRAE sync: skipped ${traeResult.recordsSkipped} records with unsupported usage metadata.\n`);
2027
+ }
2028
+ if (traeResult.estimatedRecords > 0 && !opts.auto) {
2029
+ process.stderr.write(`TRAE sync: ${traeResult.estimatedRecords} Gemini records have repaired thought or cache counters, marked as estimated.\n`);
2030
+ }
2031
+ if (traeResult.unpricedRecords > 0 && !opts.auto) {
2032
+ process.stderr.write(`TRAE sync: ${traeResult.unpricedRecords} multi-request turns include earlier input without a cache split; it is counted in token totals but left out of cost.\n`);
2033
+ }
2034
+ } catch (err) { warnProviderParseFailure("TRAE", err); }
2035
+ }
2036
+
1982
2037
  // ── Trae Work CN (国内版) — account-level usage API ──
1983
2038
  // A simple explicit rolling 30-day window captured once per sync (no
1984
2039
  // cursor checkpoints / full-history import / page retries / background
@@ -3069,6 +3124,7 @@ async function cmdSync(argv, context = {}) {
3069
3124
  claudeScienceResult.recordsProcessed +
3070
3125
  cursorResult.recordsProcessed +
3071
3126
  traeCnResult.recordsProcessed +
3127
+ traeResult.recordsProcessed +
3072
3128
  kiroResult.recordsProcessed +
3073
3129
  kiroCliResult.recordsProcessed +
3074
3130
  hermesResult.recordsProcessed +
@@ -3098,6 +3154,7 @@ async function cmdSync(argv, context = {}) {
3098
3154
  zedResult.recordsProcessed +
3099
3155
  gooseResult.recordsProcessed +
3100
3156
  dshResult.recordsProcessed +
3157
+ commandCodeResult.recordsProcessed +
3101
3158
  droidResult.recordsProcessed;
3102
3159
  const totalBuckets =
3103
3160
  parseResult.bucketsQueued +
@@ -3111,6 +3168,7 @@ async function cmdSync(argv, context = {}) {
3111
3168
  claudeScienceResult.bucketsQueued +
3112
3169
  cursorResult.bucketsQueued +
3113
3170
  traeCnResult.bucketsQueued +
3171
+ traeResult.bucketsQueued +
3114
3172
  kiroResult.bucketsQueued +
3115
3173
  kiroCliResult.bucketsQueued +
3116
3174
  hermesResult.bucketsQueued +
@@ -3140,15 +3198,18 @@ async function cmdSync(argv, context = {}) {
3140
3198
  zedResult.bucketsQueued +
3141
3199
  gooseResult.bucketsQueued +
3142
3200
  dshResult.bucketsQueued +
3201
+ commandCodeResult.bucketsQueued +
3143
3202
  droidResult.bucketsQueued;
3144
3203
  const skipNoOpCursorCommit =
3145
3204
  opts.auto &&
3146
3205
  !isFullSourceScan &&
3147
3206
  cursorStore.mode === "v2" &&
3148
3207
  cursorStore.requiresCommit !== true &&
3149
- totalParsed === 0 &&
3208
+ totalParsed === (commandCodeResult.cursorUnchanged ? commandCodeResult.recordsProcessed : 0) &&
3150
3209
  totalBuckets === 0 &&
3151
3210
  !(grokResult.projectBucketsQueued > 0) &&
3211
+ !(commandCodeResult.projectBucketsQueued > 0) &&
3212
+ !commandCodeResult.schemaMigrated &&
3152
3213
  !codexColdAuditDue &&
3153
3214
  !codexFallbackRetryRan &&
3154
3215
  !grokHookSignalConsumed &&
@@ -118,6 +118,13 @@
118
118
  "cache_write": 0.167,
119
119
  "note": "See hy3-preview-agent."
120
120
  },
121
+ "qwen3.8-flash": {
122
+ "input": 0.15,
123
+ "output": 0.47,
124
+ "cache_read": 0.016,
125
+ "cache_write": 0.2,
126
+ "note": "Alibaba Model Studio Singapore (International), USD per MTok, verified 2026-09-29: https://www.alibabacloud.com/help/en/model-studio/qwen3-8-flash . Reference API estimate; other regions/providers can have different rates. Issue #715."
127
+ },
121
128
  "hy4-preview": {
122
129
  "input": 0.833,
123
130
  "output": 2.5,
@@ -277,6 +277,11 @@ function lookupPricing(model, { curated, litellm, source } = {}) {
277
277
  }
278
278
 
279
279
  // 1. CURATED exact
280
+ // Qwen Flash's provider-qualified and dated IDs share the reference SKU.
281
+ // Keep the boundary strict: Flash-Next and Max have independent prices.
282
+ if (/(?:^|\/)qwen3[.-]8-flash(?:-\d{4}-\d{2}-\d{2})?$/.test(lower.trim()) && curated.exact?.["qwen3.8-flash"]) {
283
+ return { hit: true, source: "curated:exact", value: curated.exact["qwen3.8-flash"] };
284
+ }
280
285
  if (curated.exact && curated.exact[lookupModel]) {
281
286
  return { hit: true, source: "curated:exact", value: curated.exact[lookupModel] };
282
287
  }