tokentracker-cli 0.96.2 → 0.96.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 (141) hide show
  1. package/README.de.md +34 -25
  2. package/README.ja.md +38 -27
  3. package/README.ko.md +39 -28
  4. package/README.md +36 -28
  5. package/README.zh-CN.md +36 -25
  6. package/dashboard/dist/assets/{AchievementBadge-CgEitoX1.js → AchievementBadge-CCcvmz6R.js} +1 -1
  7. package/dashboard/dist/assets/{AchievementsPage-dnnea0JH.js → AchievementsPage-C5jdktOK.js} +2 -2
  8. package/dashboard/dist/assets/{AchievementsSection-CJqG0UP7.js → AchievementsSection-BFMtUzn1.js} +1 -1
  9. package/dashboard/dist/assets/{BadgeDetailModal-BLV6SJoI.js → BadgeDetailModal-Be8gM7tM.js} +1 -1
  10. package/dashboard/dist/assets/{BotAnimated-Cm78yEbz.js → BotAnimated-CXTGR71z.js} +1 -1
  11. package/dashboard/dist/assets/{Card-IPGSYT6O.js → Card-CsUsp3CV.js} +1 -1
  12. package/dashboard/dist/assets/{ClawdAnimated-04w1U1sm.js → ClawdAnimated-BEjpZjEE.js} +2 -2
  13. package/dashboard/dist/assets/{CommandPalette-gSSa1V_s.js → CommandPalette-CHc_Z1r8.js} +1 -1
  14. package/dashboard/dist/assets/{CommunityStatsModal-CICwUz14.js → CommunityStatsModal-Gs6kZ_Mp.js} +1 -1
  15. package/dashboard/dist/assets/{ConfirmModal-DaWC0cY7.js → ConfirmModal-niHkpv2O.js} +1 -1
  16. package/dashboard/dist/assets/{Controls-BDihA03F.js → Controls-X2Z1UNUx.js} +1 -1
  17. package/dashboard/dist/assets/DashboardPage-B66s3Exi.js +1 -0
  18. package/dashboard/dist/assets/{DevicePage-BPpo_eiY.js → DevicePage-DQdLdEI8.js} +1 -1
  19. package/dashboard/dist/assets/DialogClose-CCUjTxl8.js +1 -0
  20. package/dashboard/dist/assets/DialogDescription-CjMjYG3N.js +1 -0
  21. package/dashboard/dist/assets/DialogTitle-CgkUGAag.js +1 -0
  22. package/dashboard/dist/assets/{FadeIn-DmI9PRLa.js → FadeIn-D4QD1bPo.js} +1 -1
  23. package/dashboard/dist/assets/{HeaderGithubStar-CBO4cY7i.js → HeaderGithubStar-D0my-Z3a.js} +1 -1
  24. package/dashboard/dist/assets/{HoverTooltip-CPFGhi9K.js → HoverTooltip-nSWgrKlK.js} +1 -1
  25. package/dashboard/dist/assets/{IpCheckPage-Do7w_6z6.js → IpCheckPage-4hfqHAgi.js} +1 -1
  26. package/dashboard/dist/assets/{LandingPage-at_Ti1ZE.js → LandingPage-wIc4tVRI.js} +2 -2
  27. package/dashboard/dist/assets/{LeaderboardAvatar-BH1cnKPp.js → LeaderboardAvatar-DGlN8Vy8.js} +1 -1
  28. package/dashboard/dist/assets/{LeaderboardPage-Cd30aXwL.js → LeaderboardPage-CybuzE87.js} +2 -2
  29. package/dashboard/dist/assets/{LeaderboardProfileModal-CVsti_HN.js → LeaderboardProfileModal-D9la3tNd.js} +4 -4
  30. package/dashboard/dist/assets/{LeaderboardProfilePage-BfSpDM9e.js → LeaderboardProfilePage-gxXSeJYb.js} +1 -1
  31. package/dashboard/dist/assets/LimitsPage-CZH3G54Y.js +8 -0
  32. package/dashboard/dist/assets/{LocalOnlyNotice-9-vRgsdn.js → LocalOnlyNotice-Ckc7zohC.js} +1 -1
  33. package/dashboard/dist/assets/{LoginCard-DM_ZdFNl.js → LoginCard-BqeRHqWK.js} +1 -1
  34. package/dashboard/dist/assets/{LoginModal-BaNMznwh.js → LoginModal-BjH6aIBG.js} +1 -1
  35. package/dashboard/dist/assets/{LoginPage-BMMthUf4.js → LoginPage-BOyPLNU3.js} +1 -1
  36. package/dashboard/dist/assets/PetPage-BXRXG40D.js +1 -0
  37. package/dashboard/dist/assets/PopoverPopup-Dad1ZYVd.js +1 -0
  38. package/dashboard/dist/assets/ProviderIcon-BDmrNJSl.js +1 -0
  39. package/dashboard/dist/assets/{ResetPasswordPage-Ca4SULSV.js → ResetPasswordPage-CZpE6qfa.js} +1 -1
  40. package/dashboard/dist/assets/{SegmentedControl-Bbsn-qvZ.js → SegmentedControl-CE1hrQFi.js} +1 -1
  41. package/dashboard/dist/assets/Select-YVj7u6Nv.js +1 -0
  42. package/dashboard/dist/assets/SelectItemText-BMYGgQ3o.js +1 -0
  43. package/dashboard/dist/assets/{ServiceStatusPage-BPS8KJ3a.js → ServiceStatusPage-HehjDbZg.js} +1 -1
  44. package/dashboard/dist/assets/{SessionsPage-C1yt3TMZ.js → SessionsPage-Chvu4YqZ.js} +2 -2
  45. package/dashboard/dist/assets/SettingsPage-BXjS7u9_.js +2 -0
  46. package/dashboard/dist/assets/SkillsPage-q3Rjlj9h.js +1 -0
  47. package/dashboard/dist/assets/{TokenGalaxy-DKvbJbnv.js → TokenGalaxy-BqZyj82r.js} +1 -1
  48. package/dashboard/dist/assets/ToolbarRootContext-Ch8ueI_C.js +1 -0
  49. package/dashboard/dist/assets/{TrendMonitor-YF5C_-L1.js → TrendMonitor-C2aTL9p1.js} +1 -1
  50. package/dashboard/dist/assets/{WidgetsPage-BKV3DgXg.js → WidgetsPage-DYaIai8j.js} +1 -1
  51. package/dashboard/dist/assets/{WrappedPage-s4IRoLf7.js → WrappedPage-51B0v-Sr.js} +1 -1
  52. package/dashboard/dist/assets/{__vite-browser-external-CvMMIjhi.css → __vite-browser-external-5P7me0Qq.css} +1 -1
  53. package/dashboard/dist/assets/__vite-browser-external-Cp7dNuCm.js +45 -0
  54. package/dashboard/dist/assets/{agent-logos-Hbt-wyl2.js → agent-logos-DXrPSAdX.js} +1 -1
  55. package/dashboard/dist/assets/{arrow-up-right-KeIpKlw3.js → arrow-up-right-BFkf7l0U.js} +1 -1
  56. package/dashboard/dist/assets/{check-_QKyY1v_.js → check--N8wmgIJ.js} +1 -1
  57. package/dashboard/dist/assets/composite-zF5Pj94e.js +1 -0
  58. package/dashboard/dist/assets/{copy-DpLM3QMD.js → copy-BG0JMr6A.js} +1 -1
  59. package/dashboard/dist/assets/{download-C4NX-JnW.js → download-CPFJf-Sf.js} +1 -1
  60. package/dashboard/dist/assets/{external-link-CG-7FcOF.js → external-link-D2yF0kgP.js} +1 -1
  61. package/dashboard/dist/assets/{flame-CkWid7Ji.js → flame-l460AFx9.js} +1 -1
  62. package/dashboard/dist/assets/{format-tokens-CbwWhioZ.js → format-tokens-DKO4ljuH.js} +1 -1
  63. package/dashboard/dist/assets/{icons-BZq17rU3.js → icons-RoxRGkz4.js} +1 -1
  64. package/dashboard/dist/assets/{index-CR9tDiiC.js → index--ouT5L4N.js} +1 -1
  65. package/dashboard/dist/assets/{index-DDGLE0dz.js → index-DhyLCvvv.js} +1 -1
  66. package/dashboard/dist/assets/{index-CSwEiUn4.js → index-PTJ4368-.js} +1 -1
  67. package/dashboard/dist/assets/{info-mkeRjzqc.js → info-DNWMO4Ca.js} +1 -1
  68. package/dashboard/dist/assets/{link-2-BjMw8csC.js → link-2-DzWXAz1h.js} +1 -1
  69. package/dashboard/dist/assets/{loader-circle-cGWOJnWn.js → loader-circle-BzGMqXNu.js} +1 -1
  70. package/dashboard/dist/assets/{maximize-2-Cg_S73tD.js → maximize-2-Dkpyk4x3.js} +1 -1
  71. package/dashboard/dist/assets/{modifiers.esm-DNxTWxId.js → modifiers.esm-lggHUQpW.js} +1 -1
  72. package/dashboard/dist/assets/module-DUSXqJtA.js +3 -0
  73. package/dashboard/dist/assets/{monitor-smartphone-BvE9Tt2U.js → monitor-smartphone-Ck0-gz9l.js} +1 -1
  74. package/dashboard/dist/assets/{plus-BC2wdPRr.js → plus-qTJpnn43.js} +1 -1
  75. package/dashboard/dist/assets/provider-display-psY26qmp.js +42 -0
  76. package/dashboard/dist/assets/{react-D0kcslTz.js → react-CYS24KmX.js} +1 -1
  77. package/dashboard/dist/assets/{search-BuBNF3E3.js → search-CUzE6zxr.js} +1 -1
  78. package/dashboard/dist/assets/{skills-api-DxAN5pNx.js → skills-api-D9SzxPFG.js} +1 -1
  79. package/dashboard/dist/assets/{sortable.esm-DoqMcEX-.js → sortable.esm-Bl2hAUyR.js} +1 -1
  80. package/dashboard/dist/assets/store-mHSJAJtE.js +1 -0
  81. package/dashboard/dist/assets/{terminal-COWFUJdU.js → terminal-BlQNEvn1.js} +1 -1
  82. package/dashboard/dist/assets/{trash-2-Cqjki3RI.js → trash-CHdgmOyk.js} +1 -1
  83. package/dashboard/dist/assets/{use-community-stats-DsrlOPDM.js → use-community-stats-DUiCs91N.js} +1 -1
  84. package/dashboard/dist/assets/{use-latest-request-guard-ryRFL2gx.js → use-latest-request-guard-ehXfkvuU.js} +1 -1
  85. package/dashboard/dist/assets/use-limits-display-prefs-CcwwQ0Fq.js +1 -0
  86. package/dashboard/dist/assets/{use-ordered-list-D-Q86R1b.js → use-ordered-list-CCOtI3Wa.js} +1 -1
  87. package/dashboard/dist/assets/use-reduced-motion-CDlahPqe.js +1 -0
  88. package/dashboard/dist/assets/{use-session-efficiency-pref-CrNz45y7.js → use-session-efficiency-pref-CYRDpcc_.js} +1 -1
  89. package/dashboard/dist/assets/{use-transform-CoGM21px.js → use-transform-btLlTJpj.js} +1 -1
  90. package/dashboard/dist/assets/use-usage-limits-BGr5sR-c.js +1 -0
  91. package/dashboard/dist/assets/{useCurrency-CgCfDktb.js → useCurrency-CNutuEKd.js} +1 -1
  92. package/dashboard/dist/assets/{useTokenFormat-QKtzCKTL.js → useTokenFormat-C0bAJFMC.js} +1 -1
  93. package/dashboard/dist/assets/{zap-CTIobzgU.js → zap-B2fbyjbc.js} +1 -1
  94. package/dashboard/dist/brand-logos/acode-dark.png +0 -0
  95. package/dashboard/dist/brand-logos/acode.png +0 -0
  96. package/dashboard/dist/brand-logos/devin.svg +6 -0
  97. package/dashboard/dist/index.html +20 -16
  98. package/dashboard/dist/ip-check.html +2 -2
  99. package/dashboard/dist/leaderboard.html +2 -2
  100. package/dashboard/dist/llms.txt +4 -2
  101. package/dashboard/dist/share.html +2 -2
  102. package/package.json +2 -2
  103. package/src/commands/init.js +114 -4
  104. package/src/commands/status.js +37 -0
  105. package/src/commands/sync.js +92 -10
  106. package/src/commands/uninstall.js +23 -0
  107. package/src/lib/codex-config.js +42 -0
  108. package/src/lib/devin-limits.js +249 -0
  109. package/src/lib/devin-usage.js +212 -0
  110. package/src/lib/local-api.js +19 -0
  111. package/src/lib/passive-mode.js +13 -1
  112. package/src/lib/pricing/curated-overrides.json +67 -1
  113. package/src/lib/pricing/index.js +5 -2
  114. package/src/lib/pricing/matcher.js +28 -0
  115. package/src/lib/pricing/seed-snapshot.json +1 -1
  116. package/src/lib/rollout.js +1310 -144
  117. package/src/lib/skills-manager.js +231 -30
  118. package/src/lib/subscriptions.js +70 -16
  119. package/src/lib/usage-limits.js +199 -49
  120. package/dashboard/dist/assets/DashboardPage-hV7wncKF.js +0 -1
  121. package/dashboard/dist/assets/DialogClose-C_dF-r3s.js +0 -1
  122. package/dashboard/dist/assets/DialogDescription-GClOSCaE.js +0 -1
  123. package/dashboard/dist/assets/DialogTitle-Buh_5688.js +0 -1
  124. package/dashboard/dist/assets/LimitsPage-_-BadDAj.js +0 -8
  125. package/dashboard/dist/assets/PetPage-Iq8Hswai.js +0 -1
  126. package/dashboard/dist/assets/PopoverPopup-DXr3JxVV.js +0 -1
  127. package/dashboard/dist/assets/ProviderIcon-sb2keSY2.js +0 -1
  128. package/dashboard/dist/assets/Select-vD-yj-qa.js +0 -1
  129. package/dashboard/dist/assets/SelectItemText-CRtFEuvg.js +0 -1
  130. package/dashboard/dist/assets/SettingsPage-CWVHrMer.js +0 -2
  131. package/dashboard/dist/assets/SkillsPage-DGWEH1xm.js +0 -1
  132. package/dashboard/dist/assets/ToolbarRootContext-D8yov1dW.js +0 -1
  133. package/dashboard/dist/assets/__vite-browser-external-_LUatzwU.js +0 -45
  134. package/dashboard/dist/assets/composite-BidfcMeb.js +0 -1
  135. package/dashboard/dist/assets/limits-providers-DRkcWQup.js +0 -1
  136. package/dashboard/dist/assets/module-xpSFyNBK.js +0 -3
  137. package/dashboard/dist/assets/provider-display-B7GggHQy.js +0 -42
  138. package/dashboard/dist/assets/store-Cg1HeUFM.js +0 -1
  139. package/dashboard/dist/assets/use-limits-display-prefs-DkSuu12m.js +0 -1
  140. package/dashboard/dist/assets/use-reduced-motion-D7NNqavo.js +0 -1
  141. package/dashboard/dist/assets/use-usage-limits-C_6L1sO5.js +0 -1
@@ -2,7 +2,8 @@
2
2
  "_meta": {
3
3
  "note": "Curated price overrides. Always wins over LiteLLM. Two reasons to live here: (1) self-defined alias names that LiteLLM will never carry (kiro-*, hy3-*, composer-*, kimi-for-coding, free-tier OpenRouter routes); (2) prices we want to pin even if LiteLLM has the model (e.g. cache_write fields LiteLLM often omits). Units: USD per million tokens. Edit this file to override pricing without redeploying.",
4
4
  "units": "usd_per_million_tokens",
5
- "deepseek_v4_pricing_note": "Official DeepSeek V4 pricing verified on 2026-08-21. Peak hours are 01:00-04:00 and 06:00-10:00 UTC; all other hours are off-peak at half price. Exact entries store peak rates. computeRowCost applies the time-of-use discount from each row's UTC hour_start."
5
+ "deepseek_v4_pricing_note": "Official DeepSeek V4 pricing verified on 2026-08-21. Peak hours are 01:00-04:00 and 06:00-10:00 UTC; all other hours are off-peak at half price. Exact entries store peak rates. computeRowCost applies the time-of-use discount from each row's UTC hour_start.",
6
+ "iflytek_maas_pricing_note": "iFlytek MaaS inference prices supplied for AStudio on 2026-08-31. AStudio homepage: https://agent.xfyun.cn/. Official pricing source: https://maas.xfyun.cn/modelSquare. Source values are RMB per million tokens, converted at 7.2 RMB/USD, then rounded to two decimal places for billing. Models without a dedicated cache-hit price use the normal input rate; cache writes also use the normal input rate. iFlytek MaaS prices are source-scoped and do not inherit DeepSeek time-of-use discounts."
6
7
  },
7
8
  "exact": {
8
9
  "claude-fable-5": {
@@ -420,6 +421,71 @@
420
421
  "alias": {
421
422
  "auto": "composer-1"
422
423
  },
424
+ "source_exact": {
425
+ "acode": {
426
+ "xopglm53": { "input": 1.11, "output": 3.89, "cache_read": 0.28, "cache_write": 1.11 },
427
+ "xopdeepseekv4pro0813": { "input": 1.25, "output": 3.75, "cache_read": 0.04, "cache_write": 1.25 },
428
+ "xopdeepseekv4flash0731": { "input": 0.14, "output": 0.28, "cache_read": 0.03, "cache_write": 0.14 },
429
+ "xopkimik27code": { "input": 0.90, "output": 3.75, "cache_read": 0.90, "cache_write": 0.90 },
430
+ "xopglm52": { "input": 1.11, "output": 3.89, "cache_read": 0.28, "cache_write": 1.11 },
431
+ "xopdeepseekv4flash": { "input": 0.14, "output": 0.28, "cache_read": 0.03, "cache_write": 0.14 },
432
+ "xopkimik26": { "input": 0.90, "output": 3.75, "cache_read": 0.18, "cache_write": 0.90 },
433
+ "xopdeepseekv4pro": { "input": 1.67, "output": 3.33, "cache_read": 0.14, "cache_write": 1.67 },
434
+ "xopqwen36v35b": { "input": 0.15, "output": 0.90, "cache_read": 0.15, "cache_write": 0.15 },
435
+ "xophunyuan7bmt": { "input": 0.07, "output": 0.28, "cache_read": 0.07, "cache_write": 0.07 },
436
+ "xoppaddleocrv16": { "input": 0.00, "output": 0.00, "cache_read": 0.00, "cache_write": 0.00 },
437
+ "xsparkx2flash": { "input": 0.14, "output": 0.28, "cache_read": 0.14, "cache_write": 0.14 },
438
+ "xopglm51": { "input": 1.11, "output": 3.89, "cache_read": 0.22, "cache_write": 1.11 },
439
+ "xsparkx2": { "input": 0.42, "output": 0.42, "cache_read": 0.42, "cache_write": 0.42 },
440
+ "xop35qwen2b": { "input": 0.03, "output": 0.06, "cache_read": 0.03, "cache_write": 0.03 },
441
+ "xopqwen35397b": { "input": 0.17, "output": 1.00, "cache_read": 0.17, "cache_write": 0.17 },
442
+ "xminimaxm25": { "input": 0.29, "output": 1.17, "cache_read": 0.29, "cache_write": 0.29 },
443
+ "xopglm5": { "input": 0.83, "output": 3.06, "cache_read": 0.17, "cache_write": 0.83 },
444
+ "xopkimik25": { "input": 0.56, "output": 2.92, "cache_read": 0.56, "cache_write": 0.56 },
445
+ "xopdeepseekv32": { "input": 0.14, "output": 0.21, "cache_read": 0.14, "cache_write": 0.14 },
446
+ "xop3qwencodernext": { "input": 0.35, "output": 1.39, "cache_read": 0.35, "cache_write": 0.35 },
447
+ "xopglmv47flash": { "input": 0.14, "output": 0.21, "cache_read": 0.14, "cache_write": 0.14 },
448
+ "xopglm47blth2": { "input": 0.56, "output": 2.22, "cache_read": 0.56, "cache_write": 0.56 },
449
+ "xop3qwen32bvl": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
450
+ "xopdeepseekocr": { "input": 0.00, "output": 0.00, "cache_read": 0.00, "cache_write": 0.00 },
451
+ "xophunyuanocr": { "input": 0.00, "output": 0.00, "cache_read": 0.00, "cache_write": 0.00 },
452
+ "xop3qwen80bnext": { "input": 0.08, "output": 0.33, "cache_read": 0.08, "cache_write": 0.08 },
453
+ "xop3qwen235b2507": { "input": 0.17, "output": 1.67, "cache_read": 0.17, "cache_write": 0.17 },
454
+ "xop3qwen30b2507": { "input": 0.06, "output": 0.63, "cache_read": 0.06, "cache_write": 0.06 },
455
+ "xop3qwen235b": { "input": 0.17, "output": 1.67, "cache_read": 0.17, "cache_write": 0.17 },
456
+ "xop3qwen30b": { "input": 0.06, "output": 0.63, "cache_read": 0.06, "cache_write": 0.06 },
457
+ "xop3qwen32b": { "input": 0.17, "output": 1.67, "cache_read": 0.17, "cache_write": 0.17 },
458
+ "xdeepseekv3": { "input": 0.22, "output": 0.89, "cache_read": 0.22, "cache_write": 0.22 },
459
+ "xdeepseekr1": { "input": 0.44, "output": 1.78, "cache_read": 0.44, "cache_write": 0.44 },
460
+ "xdeepseekr1qwen32b": { "input": 0.22, "output": 0.67, "cache_read": 0.22, "cache_write": 0.22 },
461
+ "xopkimik2blth": { "input": 0.56, "output": 2.22, "cache_read": 0.56, "cache_write": 0.56 },
462
+ "xopkimik2blins": { "input": 0.56, "output": 2.22, "cache_read": 0.56, "cache_write": 0.56 },
463
+ "xop3qwen8breranker": { "input": 0.00, "output": 0.00, "cache_read": 0.00, "cache_write": 0.00 },
464
+ "xop3qwen8bembedding": { "input": 0.00, "output": 0.00, "cache_read": 0.00, "cache_write": 0.00 },
465
+ "xop3qwen0b6": { "input": 0.04, "output": 0.42, "cache_read": 0.04, "cache_write": 0.04 },
466
+ "xop3qwen4b": { "input": 0.04, "output": 0.42, "cache_read": 0.04, "cache_write": 0.04 },
467
+ "xqwen257bchat": { "input": 0.07, "output": 0.14, "cache_read": 0.07, "cache_write": 0.07 },
468
+ "xop3qwen14b": { "input": 0.14, "output": 1.39, "cache_read": 0.14, "cache_write": 0.14 },
469
+ "xop3qwen8b": { "input": 0.07, "output": 0.69, "cache_read": 0.07, "cache_write": 0.07 },
470
+ "xsparkprox": { "input": 1.11, "output": 5.56, "cache_read": 1.11, "cache_write": 1.11 },
471
+ "xspark13b6k": { "input": 0.28, "output": 0.83, "cache_read": 0.28, "cache_write": 0.28 },
472
+ "spark mini": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
473
+ "spark mini instruct": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
474
+ "spark tiny": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
475
+ "internlm2.5_7b_chat": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
476
+ "internlm2.5_1.8b_chat": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
477
+ "qwen_v2.5_7b_base": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
478
+ "xsqwen2d53b": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
479
+ "qwen_v2.5_3b_base": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
480
+ "qwen_v2.5_1.5b_instruct": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
481
+ "qwen_v2.5_1.5b_base": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
482
+ "qwen_v2.5_0.5b_instruct": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
483
+ "qwen_v2.5_0.5b_base": { "input": 0.28, "output": 1.11, "cache_read": 0.28, "cache_write": 0.28 },
484
+ "xsqwenv2s1b5c": { "input": 0.14, "output": 0.28, "cache_read": 0.14, "cache_write": 0.14 },
485
+ "xsqwenv2s0b5c": { "input": 0.28, "output": 0.56, "cache_read": 0.28, "cache_write": 0.28 },
486
+ "xqwen14bchat": { "input": 0.28, "output": 0.83, "cache_read": 0.28, "cache_write": 0.28 }
487
+ }
488
+ },
423
489
  "fuzzy": [
424
490
  {
425
491
  "match": "gpt-6-astra",
@@ -35,7 +35,6 @@ const DEEPSEEK_TIME_PRICED_MODELS = [
35
35
  "deepseek-v4-flash",
36
36
  "deepseek-v4-pro",
37
37
  ];
38
-
39
38
  // Sync seed load. Done at require-time so callers that haven't awaited
40
39
  // ensurePricingLoaded() (e.g. tests, vite mock startup, edge functions) still
41
40
  // get LiteLLM-backed pricing instead of all-zero. ensurePricingLoaded() will
@@ -163,6 +162,9 @@ function isDeepSeekOffPeak(row) {
163
162
 
164
163
  function getRowPricing(row) {
165
164
  const pricing = getModelPricing(row?.model, { source: row?.source });
165
+ // AStudio uses iFlytek MaaS fixed prices and does not inherit DeepSeek public API
166
+ // time-based discounts.
167
+ if (String(row?.source || "").toLowerCase() === "acode") return pricing;
166
168
  if (!isDeepSeekTimePricedModel(row?.model) || !isDeepSeekOffPeak(row)) return pricing;
167
169
  return {
168
170
  ...pricing,
@@ -192,7 +194,8 @@ function computeRowCost(row) {
192
194
  reportedCost > 0
193
195
  ) return reportedCost;
194
196
  const pricing = getRowPricing(row);
195
- const reasoningIncludedInOutput = row.source === "codex" || row.source === "every-code";
197
+ const reasoningIncludedInOutput =
198
+ row.source === "codex" || row.source === "acode" || row.source === "every-code";
196
199
  const reasoningCost = reasoningIncludedInOutput
197
200
  ? 0
198
201
  : (row.reasoning_output_tokens || 0) * (pricing.output || 0);
@@ -1,6 +1,7 @@
1
1
  // Pure pricing-lookup logic. No I/O, no async. Tested in isolation.
2
2
  //
3
3
  // Resolve order:
4
+ // 0. CURATED source exact match (source-specific pricing)
4
5
  // 1. CURATED exact match (self-defined aliases like kiro-*, hy3-*)
5
6
  // 2. LiteLLM exact match (mainstream claude/gpt-5/gemini)
6
7
  // 3. CURATED alias (e.g. "auto" -> "composer-1")
@@ -164,6 +165,15 @@ function normalizeWorkbuddyModel(model) {
164
165
  return model;
165
166
  }
166
167
 
168
+ function normalizeIFlytekMaasModel(model) {
169
+ if (!model || typeof model !== "string") return model;
170
+ const trimmed = model.trim();
171
+ const lower = trimmed.toLowerCase();
172
+ // The default Agent slug maps to the Spark X2 service in the supplied price list.
173
+ if (lower === "xsparkx2agent") return "xsparkx2";
174
+ return trimmed;
175
+ }
176
+
167
177
  // Unsloth Studio can mix local engines and paid API providers in one database.
168
178
  // The parser qualifies metered models with their provider and marks local,
169
179
  // subscription-backed, or ambiguous custom routes as unpriced. Returning a
@@ -182,6 +192,7 @@ function normalizeUnslothModel(model) {
182
192
  // raw model name is preserved for storage/display). Add a source here when its
183
193
  // model strings don't match the LiteLLM/curated keys verbatim.
184
194
  const SOURCE_MODEL_NORMALIZERS = {
195
+ acode: normalizeIFlytekMaasModel,
185
196
  antigravity: normalizeAntigravityModel,
186
197
  claude: normalizeClaudeModel,
187
198
  cursor: normalizeCursorModel,
@@ -242,6 +253,22 @@ function lookupPricing(model, { curated, litellm, source } = {}) {
242
253
  const lower = lookupModel.toLowerCase();
243
254
  const dotForm = buildDotRestoredModel(lookupModel);
244
255
 
256
+ // 0. CURATED source exact. Source-specific prices apply only to their source,
257
+ // preventing collisions with public prices for same-named models from other CLIs.
258
+ const sourceKey = typeof source === "string" ? source.toLowerCase() : "";
259
+ // AStudio does not disclose its routed model. Stop before generic aliases
260
+ // and fuzzy matching can turn an unresolved router into a priced model.
261
+ if (sourceKey === "acode" && (lower === "auto" || lower.endsWith("-auto"))) {
262
+ return { hit: false, source: "miss", value: null };
263
+ }
264
+ const sourceExact = curated.source_exact?.[sourceKey];
265
+ if (sourceExact) {
266
+ const sourceValue = lookupExactCaseInsensitive(sourceExact, lookupModel);
267
+ if (sourceValue) {
268
+ return { hit: true, source: "curated:source-exact", value: sourceValue };
269
+ }
270
+ }
271
+
245
272
  // 1. CURATED exact
246
273
  if (curated.exact && curated.exact[lookupModel]) {
247
274
  return { hit: true, source: "curated:exact", value: curated.exact[lookupModel] };
@@ -382,6 +409,7 @@ module.exports = {
382
409
  lookupPricing,
383
410
  stripReasoningSuffix,
384
411
  normalizeAntigravityModel,
412
+ normalizeIFlytekMaasModel,
385
413
  normalizeClaudeModel,
386
414
  normalizeCursorModel,
387
415
  normalizeZedModel,