dsh-all-usage 1.1.18 → 1.2.1

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 (69) hide show
  1. package/CHANGELOG.md +469 -394
  2. package/LICENSE +21 -21
  3. package/README.en.md +273 -0
  4. package/README.md +145 -279
  5. package/assets/model-icons/ai2-color.svg +1 -0
  6. package/assets/model-icons/ai21-brand-color.svg +1 -0
  7. package/assets/model-icons/aionlabs.svg +1 -0
  8. package/assets/model-icons/alephalpha.svg +1 -0
  9. package/assets/model-icons/baai.svg +1 -0
  10. package/assets/model-icons/baichuan-color.svg +1 -0
  11. package/assets/model-icons/baidu-color.svg +1 -0
  12. package/assets/model-icons/bytedance-color.svg +1 -0
  13. package/assets/model-icons/cohere-color.svg +1 -0
  14. package/assets/model-icons/hunyuan-color.svg +1 -0
  15. package/assets/model-icons/ibm.svg +1 -0
  16. package/assets/model-icons/iflytekcloud-color.svg +1 -0
  17. package/assets/model-icons/internlm-color.svg +1 -0
  18. package/assets/model-icons/kling-color.svg +1 -0
  19. package/assets/model-icons/liquid.svg +1 -0
  20. package/assets/model-icons/longcat-color.svg +1 -0
  21. package/assets/model-icons/manifest.json +739 -213
  22. package/assets/model-icons/microsoft-color.svg +1 -0
  23. package/assets/model-icons/mistral-color.svg +1 -0
  24. package/assets/model-icons/nousresearch.svg +1 -0
  25. package/assets/model-icons/nova-color.svg +1 -0
  26. package/assets/model-icons/nvidia-color.svg +1 -0
  27. package/assets/model-icons/perplexity-color.svg +1 -0
  28. package/assets/model-icons/sensenova-color.svg +1 -0
  29. package/assets/model-icons/skywork-color.svg +1 -0
  30. package/assets/model-icons/snowflake-color.svg +1 -0
  31. package/assets/model-icons/stepfun-color.svg +1 -0
  32. package/assets/model-icons/tencent-color.svg +1 -0
  33. package/assets/model-icons/tii-color.svg +1 -0
  34. package/assets/model-icons/upstage-color.svg +1 -0
  35. package/assets/model-icons/voyage-color.svg +1 -0
  36. package/assets/model-icons/xiaomimimo.svg +1 -0
  37. package/assets/model-icons/yandex.svg +1 -0
  38. package/assets/readme-architecture-en.svg +95 -0
  39. package/assets/readme-architecture-zh.svg +95 -0
  40. package/assets/readme-sync-en.svg +81 -0
  41. package/assets/readme-sync-zh.svg +81 -0
  42. package/assets/screenshots/en/01-overview.png +0 -0
  43. package/assets/screenshots/en/02-heatmap.png +0 -0
  44. package/assets/screenshots/en/03-model-usage.png +0 -0
  45. package/assets/screenshots/en/04-request-logs.png +0 -0
  46. package/assets/screenshots/en/05-cost-settings.png +0 -0
  47. package/assets/screenshots/zh/01-overview.png +0 -0
  48. package/assets/screenshots/zh/02-heatmap.png +0 -0
  49. package/assets/screenshots/zh/03-model-usage.png +0 -0
  50. package/assets/screenshots/zh/04-request-logs.png +0 -0
  51. package/assets/screenshots/zh/05-cost-settings.png +0 -0
  52. package/cordis.patch.yml +5 -5
  53. package/lib/aggregation.js +1850 -1112
  54. package/lib/client.js +1 -1
  55. package/lib/http.js +417 -385
  56. package/lib/icons.js +40 -0
  57. package/lib/ledger.js +1000 -531
  58. package/lib/plugin.js +348 -327
  59. package/lib/pricing-runtime.js +645 -551
  60. package/lib/pricing.js +1488 -1412
  61. package/lib/records-cache.js +113 -0
  62. package/lib/session-sync.js +976 -841
  63. package/lib/usage-core.js +33 -10
  64. package/lib/version-check.js +133 -133
  65. package/package.json +7 -3
  66. package/screenshots.json +10 -3
  67. package/assets/screenshot-1.png +0 -0
  68. package/assets/screenshot-2.png +0 -0
  69. package/assets/screenshot-3.png +0 -0
package/lib/icons.js ADDED
@@ -0,0 +1,40 @@
1
+ import { createHash } from 'node:crypto'
2
+ import { readFile } from 'node:fs/promises'
3
+
4
+ // Brand marks are served on demand instead of being embedded in the client
5
+ // bundle: the page asks only for the icons it actually renders (and the browser
6
+ // caches them), so adding a brand costs nothing in the bundle. The manifest stays
7
+ // the single source of truth - it is what the build validates and what this reads.
8
+ const ICONS_URL = new URL('../assets/model-icons/', import.meta.url)
9
+ let cache = null
10
+
11
+ async function loadIcons() {
12
+ if (cache !== null) return cache
13
+ const manifest = JSON.parse(await readFile(new URL('manifest.json', ICONS_URL), 'utf8'))
14
+ const entries = []
15
+ for (const icon of manifest.icons) {
16
+ if (icon === null || typeof icon !== 'object' || typeof icon.key !== 'string' || icon.key === '') continue
17
+ if (typeof icon.file !== 'string' || icon.file === '') continue
18
+ const svg = await readFile(new URL(icon.file, ICONS_URL), 'utf8')
19
+ const compact = svg.replace(/>\s+</g, '><').trim()
20
+ const body = Buffer.from(compact, 'utf8')
21
+ entries.push({
22
+ key: icon.key,
23
+ label: typeof icon.label === 'string' && icon.label !== '' ? icon.label : icon.key,
24
+ body,
25
+ etag: '"' + createHash('sha256').update(body).digest('base64url').slice(0, 16) + '"',
26
+ })
27
+ }
28
+ cache = { entries, byKey: new Map(entries.map((entry) => [entry.key, entry])) }
29
+ return cache
30
+ }
31
+
32
+ /** One icon by key, or null. Unknown keys never touch the filesystem. */
33
+ export async function findModelIcon(key) {
34
+ if (typeof key !== 'string' || key === '') return null
35
+ const { byKey } = await loadIcons()
36
+ return byKey.get(key) || null
37
+ }
38
+
39
+ // listModelIcons() was removed: it had no caller. Tests and diagnostics read the
40
+ // manifest instead, and the icon route only needs findModelIcon().