@sligqoer/dsh-usage-stats 0.1.2 → 0.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 (44) hide show
  1. package/CHANGELOG.md +135 -1
  2. package/NOTICE +39 -0
  3. package/README.en.md +187 -0
  4. package/README.md +93 -224
  5. package/lib/bridge.js +33 -0
  6. package/lib/client.js +2587 -1159
  7. package/lib/index.js +420 -150
  8. package/lib/lm-fingerprint-engine.js +166 -0
  9. package/lib/lm-fingerprint-source.js +134 -0
  10. package/lib/lm-fingerprint-worker.js +31 -0
  11. package/lib/model-detection-history.js +86 -0
  12. package/lib/model-detection.js +255 -0
  13. package/lib/provider-quotas.js +26 -5
  14. package/lib/quota-controls.js +112 -30
  15. package/lib/supplemental-usage.js +77 -0
  16. package/lib/usage-preferences.js +51 -0
  17. package/locale/en.json +6 -0
  18. package/locale/ja.json +6 -0
  19. package/locale/zh.json +6 -0
  20. package/package.json +28 -18
  21. package/screenshots/controls.png +0 -0
  22. package/screenshots/detection.png +0 -0
  23. package/screenshots/quotas.png +0 -0
  24. package/screenshots/usage.png +0 -0
  25. package/third_party/brand-icons/CHANNEL-ICONS-LICENSE +21 -0
  26. package/third_party/brand-icons/LICENSE +59 -0
  27. package/third_party/brand-icons/NOTICE.txt +5 -0
  28. package/third_party/brand-icons/REACT-ICONS-LICENSE +104 -0
  29. package/third_party/brand-icons/channel-icons/LICENSE +21 -0
  30. package/third_party/brand-icons/channel-icons/UPSTREAM.json +6 -0
  31. package/third_party/brand-icons/lobe-icons/LICENSE +21 -0
  32. package/third_party/brand-icons/lobe-icons/UPSTREAM.json +16 -0
  33. package/third_party/brand-icons/react-icons/LICENSE +13 -0
  34. package/third_party/brand-icons/react-icons/UPSTREAM.json +6 -0
  35. package/third_party/lm-fingerprint/LICENSE +21 -0
  36. package/third_party/lm-fingerprint/UPSTREAM.json +32 -0
  37. package/third_party/lm-fingerprint/core/challenge-browser.mjs +210 -0
  38. package/third_party/lm-fingerprint/core/detector-codec.mjs +20 -0
  39. package/third_party/lm-fingerprint/core/fingerprint-core.mjs +121 -0
  40. package/third_party/lm-fingerprint/core/positional.mjs +64 -0
  41. package/third_party/lm-fingerprint/core/shared-detector.mjs +132 -0
  42. package/third_party/lm-fingerprint/data/shared_detector.bin +0 -0
  43. package/third_party/lm-fingerprint/data/unified_bank.json +826820 -0
  44. package/README.zh-CN.md +0 -318
@@ -0,0 +1,77 @@
1
+ /** Persist and deduplicate reported detection usage across plugin restarts. */
2
+ import { readFile, mkdir, writeFile, rename } from 'node:fs/promises'
3
+ import { dirname } from 'node:path'
4
+ import { getBridge, HUB_SERVICE } from './bridge.js'
5
+
6
+ const keys = ['inputTokens', 'outputTokens', 'cacheReadTokens', 'cacheWriteTokens', 'reasoningTokens']
7
+ function sanitize(raw) {
8
+ if (!raw || typeof raw.id !== 'string' || !raw.id || !Number.isFinite(raw.time) || raw.time <= 0
9
+ || typeof raw.selection?.provider !== 'string' || typeof raw.selection?.model !== 'string') throw new Error('Invalid supplemental usage')
10
+ return { id: raw.id.slice(0, 320), time: raw.time,
11
+ selection: { provider: raw.selection.provider.slice(0, 256), model: raw.selection.model.slice(0, 256) },
12
+ usageReported: raw.usageReported === true,
13
+ usage: Object.fromEntries(keys.map(key => [key, Number.isFinite(raw.usage?.[key]) && raw.usage[key] >= 0 ? raw.usage[key] : 0])),
14
+ stop: ['stop', 'max-tokens'].includes(raw.stop) ? raw.stop : 'unknown',
15
+ ttftMs: Number.isFinite(raw.ttftMs) && raw.ttftMs >= 0 ? raw.ttftMs : null,
16
+ decodeMs: Number.isFinite(raw.decodeMs) && raw.decodeMs > 0 ? raw.decodeMs : null }
17
+ }
18
+
19
+ export function createSupplementalUsage(ctx, path, legacyPath, history) {
20
+ let records = new Map(), warning = '', loaded, flight, queue = Promise.resolve(), connected = false
21
+ const merge = rows => { const next = new Map(records); for (const row of rows) { const cleaned = sanitize(row); next.set(cleaned.id, cleaned) }; records = next }
22
+ const persist = () => {
23
+ const text = JSON.stringify({ version: 1, records: [...records.values()] })
24
+ return queue = queue.catch(() => {}).then(async () => {
25
+ await mkdir(dirname(path), { recursive: true })
26
+ await writeFile(path + '.tmp', text, { mode: 0o600 }); await rename(path + '.tmp', path)
27
+ })
28
+ }
29
+ const load = () => loaded ||= (async () => {
30
+ try {
31
+ let document
32
+ try { document = JSON.parse(await readFile(path, 'utf8')); if (document.version !== 1 || !Array.isArray(document.records)) throw new Error('Invalid cache'); merge(document.records) }
33
+ catch (error) {
34
+ if (error.code !== 'ENOENT') throw error
35
+ try { document = JSON.parse(await readFile(legacyPath, 'utf8')) } catch (legacyError) { if (legacyError.code !== 'ENOENT') throw legacyError; return }
36
+ if (document.version !== 1 || !Array.isArray(document.usage)) throw new Error('Invalid legacy history')
37
+ merge(document.usage.flatMap(job => (job.results || []).map((row, index) => ({ ...row, selection: row.selection || job.selection,
38
+ time: row.time || job.finishedAt || job.startedAt, id: `${job.id}:${index}` }))))
39
+ await persist()
40
+ }
41
+ } catch { warning = '检测用量记录无法读取,统计可能不完整。' }
42
+ })()
43
+ return {
44
+ refresh() {
45
+ if (flight) return flight
46
+ return flight = (async () => {
47
+ await load()
48
+ if (history) {
49
+ const before = JSON.stringify([...records.values()])
50
+ merge(history.usageRecords())
51
+ if (before !== JSON.stringify([...records.values()])) await persist()
52
+ warning = history.warning()
53
+ }
54
+ const hub = getBridge(ctx, HUB_SERVICE)
55
+ connected = !!hub
56
+ if (!hub || typeof hub.readSupplementalUsage !== 'function') return
57
+ let timer
58
+ try {
59
+ const snapshot = await Promise.race([
60
+ Promise.resolve().then(() => hub.readSupplementalUsage()),
61
+ new Promise((_, reject) => { timer = setTimeout(() => reject(new Error('Supplemental usage timeout')), 1500); timer.unref?.() }),
62
+ ])
63
+ if (snapshot.protocolVersion !== 1 || !Array.isArray(snapshot.records)) throw new Error('Invalid interface')
64
+ const before = JSON.stringify([...records.values()])
65
+ merge(snapshot.records)
66
+ if (before !== JSON.stringify([...records.values()])) await persist()
67
+ warning = snapshot.warning || ''
68
+ } catch { warning = '补充用量暂时不可用,保留上次成功记录。' }
69
+ finally { clearTimeout(timer) }
70
+ })().finally(() => { flight = null })
71
+ },
72
+ usage: () => [...records.values()],
73
+ warning: () => warning,
74
+ connected: () => connected,
75
+ flush: () => queue.catch(() => {}),
76
+ }
77
+ }
@@ -0,0 +1,51 @@
1
+ /** Persistent usage display preferences. */
2
+ import { readFile, mkdir, writeFile, rename } from 'node:fs/promises'
3
+ import { dirname } from 'node:path'
4
+
5
+ const defaults = () => ({ showModelDetails: false, showTokenSpeed: true })
6
+ export class PreferenceError extends Error {}
7
+ export function validateDisplayPatch(patch) {
8
+ if (!patch || typeof patch !== 'object' || Array.isArray(patch)) throw new PreferenceError('设置应为 JSON 对象。')
9
+ for (const [key, value] of Object.entries(patch)) {
10
+ if (!['showModelDetails', 'showTokenSpeed'].includes(key) || typeof value !== 'boolean') throw new PreferenceError('用量展示设置无效。')
11
+ }
12
+ }
13
+
14
+ export function createUsagePreferences(path, legacyPath) {
15
+ let settings = defaults(), loaded, queue = Promise.resolve()
16
+ const load = () => loaded ||= (async () => {
17
+ let text
18
+ try { text = await readFile(path, 'utf8') }
19
+ catch (error) {
20
+ if (error.code !== 'ENOENT') throw error
21
+ try { text = await readFile(legacyPath, 'utf8') } catch (legacyError) { if (legacyError.code !== 'ENOENT') throw legacyError }
22
+ }
23
+ if (text) {
24
+ const saved = JSON.parse(text).settings
25
+ if (!saved || typeof saved !== 'object') throw new Error('Invalid usage display preferences')
26
+ for (const key of Object.keys(settings)) if (typeof saved[key] === 'boolean') settings[key] = saved[key]
27
+ }
28
+ })()
29
+ return {
30
+ async get() { await load(); return { ok: true, settings: { ...settings } } },
31
+ update(patch) {
32
+ const operation = queue.catch(() => {}).then(async () => {
33
+ await load()
34
+ validateDisplayPatch(patch)
35
+ const next = { ...settings }
36
+ for (const [key, value] of Object.entries(patch)) {
37
+ if (!Object.hasOwn(next, key) || typeof value !== 'boolean') throw new PreferenceError('用量展示设置无效。')
38
+ next[key] = value
39
+ }
40
+ await mkdir(dirname(path), { recursive: true })
41
+ await writeFile(path + '.tmp', JSON.stringify({ version: 1, settings: next }), { mode: 0o600 })
42
+ await rename(path + '.tmp', path)
43
+ settings = next
44
+ return { ok: true, settings: { ...settings } }
45
+ })
46
+ queue = operation
47
+ return operation
48
+ },
49
+ flush: () => queue.catch(() => {}),
50
+ }
51
+ }
package/locale/en.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Usage statistics",
4
+ "description": "Usage statistics, provider quotas, model detection and controls for DSH Desktop 0.2.1-alpha.2 and 0.2.1-rc.2."
5
+ }
6
+ }
package/locale/ja.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "利用状況",
4
+ "description": "利用統計、提供元の利用枠、モデル検査、操作設定。DSH Desktop 0.2.1-alpha.2 と 0.2.1-rc.2 に対応。"
5
+ }
6
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "用量统计",
4
+ "description": "会话用量统计、供应商配额、模型检测与控制设置。适用于 DSH Desktop 0.2.1-alpha.2 和 0.2.1-rc.2。"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sligqoer/dsh-usage-stats",
3
- "description": "DSH Desktop token statistics with range filters, an incremental session corpus, and connected quota panels. Desktop profile only.",
4
- "version": "0.1.2",
3
+ "description": "DSH Desktop 的用量统计、供应商配额、模型检测与控制插件。",
4
+ "version": "0.2.1",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
@@ -15,22 +15,20 @@
15
15
  "exports": {
16
16
  ".": "./lib/index.js",
17
17
  "./client": "./lib/client.js",
18
- "./package.json": "./package.json"
18
+ "./package.json": "./package.json",
19
+ "./locale/*": "./locale/*"
19
20
  },
20
21
  "files": [
21
- "lib/index.js",
22
- "lib/client.js",
23
- "lib/provider-quotas.js",
24
- "lib/quota-controls.js",
22
+ "lib/",
25
23
  "cordis.patch.yml",
26
24
  "README.md",
27
- "README.zh-CN.md",
25
+ "README.en.md",
28
26
  "CHANGELOG.md",
29
- "screenshots/usage.png",
30
- "screenshots/quotas.png",
31
- "screenshots/controls.png",
32
- "screenshots/icon.svg",
33
- "LICENSE"
27
+ "LICENSE",
28
+ "NOTICE",
29
+ "locale/",
30
+ "screenshots/",
31
+ "third_party/"
34
32
  ],
35
33
  "dsh": {
36
34
  "bundle": {
@@ -41,18 +39,30 @@
41
39
  "platform": "web"
42
40
  }
43
41
  },
44
- "dependencies": {},
45
42
  "publishConfig": {
46
43
  "access": "public",
47
44
  "registry": "https://registry.npmjs.org/"
48
45
  },
49
46
  "scripts": {
50
47
  "build": "node scripts/build.mjs",
51
- "prepack": "npm run build",
48
+ "check:release": "node scripts/check-release.mjs",
49
+ "prepack": "npm run build && npm run check:release",
52
50
  "release": "node scripts/build-release.mjs",
53
51
  "publish:release": "node scripts/publish-npm.mjs",
54
- "test": "node test/consistency.test.mjs && node --test test/desktop.test.mjs test/usage.test.mjs test/client.test.mjs test/client-locale-quota.test.mjs test/provider-quotas.test.mjs test/quota-controls.test.mjs test/privacy.test.mjs",
55
- "preview:heatmap": "node scripts/build-heatmap-preview.mjs"
52
+ "test": "node --test test/*.test.mjs"
56
53
  },
57
- "license": "Apache-2.0"
54
+ "license": "Apache-2.0",
55
+ "icon": "screenshots/icon.svg",
56
+ "peerDependencies": {
57
+ "@deepseek-ai/dsh": "0.2.1-alpha.2 || 0.2.1-rc.2"
58
+ },
59
+ "peerDependenciesMeta": {
60
+ "@deepseek-ai/dsh": {
61
+ "optional": true
62
+ }
63
+ },
64
+ "dependencies": {
65
+ "undici": "^6.21.3",
66
+ "typescript": "5.9.3"
67
+ }
58
68
  }
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ebony-Vinyl
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,59 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ebony-Vinyl
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ --- LobeHub ---
24
+ MIT License
25
+
26
+ Copyright (c) 2023 LobeHub
27
+
28
+ Permission is hereby granted, free of charge, to any person obtaining a copy
29
+ of this software and associated documentation files (the "Software"), to deal
30
+ in the Software without restriction, including without limitation the rights
31
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
32
+ copies of the Software, and to permit persons to whom the Software is
33
+ furnished to do so, subject to the following conditions:
34
+
35
+ The above copyright notice and this permission notice shall be included in all
36
+ copies or substantial portions of the Software.
37
+
38
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
39
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
40
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
41
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
42
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
43
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
44
+ SOFTWARE.
45
+
46
+ --- react-icons, MIT; Simple Icons glyphs are CC0 ---
47
+ MIT License
48
+
49
+ Copyright 2018 kamijin_fanta <kamijin@live.jp>
50
+
51
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
52
+
53
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
54
+
55
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
56
+
57
+ ---
58
+ Icons are taken from the other projects
59
+ so please check each project licences accordingly.
@@ -0,0 +1,5 @@
1
+ Brand icons identify their respective owners; no affiliation is implied.
2
+ PNG channel artwork: Ebony-Vinyl/dsh-our-free-model, MIT; redistributed artwork only.
3
+ SVG model artwork: lobehub/lobe-icons, MIT, https://github.com/lobehub/lobe-icons.
4
+ Kilo, LobsterAI, Loomy and the fallback glyph are locally drawn identifiers.
5
+ Anthropic and Gemini artwork: Simple Icons (CC0), distributed by react-icons (MIT).
@@ -0,0 +1,104 @@
1
+ Copyright 2018 kamijin_fanta <kamijin@live.jp>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8
+
9
+ ---
10
+ Icons are taken from the other projects
11
+ so please check each project licences accordingly.
12
+
13
+ Circum Icons - https://circumicons.com/
14
+ License: MPL-2.0 license https://github.com/Klarr-Agency/Circum-Icons/blob/main/LICENSE
15
+
16
+ Font Awesome 5 - https://fontawesome.com/
17
+ License: CC BY 4.0 License https://creativecommons.org/licenses/by/4.0/
18
+
19
+ Font Awesome 6 - https://fontawesome.com/
20
+ License: CC BY 4.0 License https://creativecommons.org/licenses/by/4.0/
21
+
22
+ Ionicons 4 - https://ionicons.com/
23
+ License: MIT https://github.com/ionic-team/ionicons/blob/master/LICENSE
24
+
25
+ Ionicons 5 - https://ionicons.com/
26
+ License: MIT https://github.com/ionic-team/ionicons/blob/master/LICENSE
27
+
28
+ Material Design icons - http://google.github.io/material-design-icons/
29
+ License: Apache License Version 2.0 https://github.com/google/material-design-icons/blob/master/LICENSE
30
+
31
+ Typicons - http://s-ings.com/typicons/
32
+ License: CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0/
33
+
34
+ Github Octicons icons - https://octicons.github.com/
35
+ License: MIT https://github.com/primer/octicons/blob/master/LICENSE
36
+
37
+ Feather - https://feathericons.com/
38
+ License: MIT https://github.com/feathericons/feather/blob/master/LICENSE
39
+
40
+ Lucide - https://lucide.dev/
41
+ License: ISC https://github.com/lucide-icons/lucide/blob/main/LICENSE
42
+
43
+ Game Icons - https://game-icons.net/
44
+ License: CC BY 3.0 https://creativecommons.org/licenses/by/3.0/
45
+
46
+ Weather Icons - https://erikflowers.github.io/weather-icons/
47
+ License: SIL OFL 1.1 http://scripts.sil.org/OFL
48
+
49
+ Devicons - https://vorillaz.github.io/devicons/
50
+ License: MIT https://opensource.org/licenses/MIT
51
+
52
+ Ant Design Icons - https://github.com/ant-design/ant-design-icons
53
+ License: MIT https://opensource.org/licenses/MIT
54
+
55
+ Bootstrap Icons - https://github.com/twbs/icons
56
+ License: MIT https://opensource.org/licenses/MIT
57
+
58
+ Remix Icon - https://github.com/Remix-Design/RemixIcon
59
+ License: Apache License Version 2.0 http://www.apache.org/licenses/
60
+
61
+ Flat Color Icons - https://github.com/icons8/flat-color-icons
62
+ License: MIT https://opensource.org/licenses/MIT
63
+
64
+ Grommet-Icons - https://github.com/grommet/grommet-icons
65
+ License: Apache License Version 2.0 http://www.apache.org/licenses/
66
+
67
+ Heroicons - https://github.com/tailwindlabs/heroicons
68
+ License: MIT https://opensource.org/licenses/MIT
69
+
70
+ Heroicons 2 - https://github.com/tailwindlabs/heroicons
71
+ License: MIT https://opensource.org/licenses/MIT
72
+
73
+ Simple Icons - https://simpleicons.org/
74
+ License: CC0 1.0 Universal https://creativecommons.org/publicdomain/zero/1.0/
75
+
76
+ Simple Line Icons - https://thesabbir.github.io/simple-line-icons/
77
+ License: MIT https://opensource.org/licenses/MIT
78
+
79
+ IcoMoon Free - https://github.com/Keyamoon/IcoMoon-Free
80
+ License: CC BY 4.0 License https://github.com/Keyamoon/IcoMoon-Free/blob/master/License.txt
81
+
82
+ BoxIcons - https://github.com/atisawd/boxicons
83
+ License: MIT https://github.com/atisawd/boxicons/blob/master/LICENSE
84
+
85
+ css.gg - https://github.com/astrit/css.gg
86
+ License: MIT https://opensource.org/licenses/MIT
87
+
88
+ VS Code Icons - https://github.com/microsoft/vscode-codicons
89
+ License: CC BY 4.0 https://creativecommons.org/licenses/by/4.0/
90
+
91
+ Tabler Icons - https://github.com/tabler/tabler-icons
92
+ License: MIT https://opensource.org/licenses/MIT
93
+
94
+ Themify Icons - https://github.com/lykmapipo/themify-icons
95
+ License: MIT https://github.com/thecreation/standard-icons/blob/master/modules/themify-icons/LICENSE
96
+
97
+ Radix Icons - https://icons.radix-ui.com
98
+ License: MIT https://github.com/radix-ui/icons/blob/master/LICENSE
99
+
100
+ Phosphor Icons - https://github.com/phosphor-icons/core
101
+ License: MIT https://github.com/phosphor-icons/core/blob/main/LICENSE
102
+
103
+ Icons8 Line Awesome - https://icons8.com/line-awesome
104
+ License: MIT https://github.com/icons8/line-awesome/blob/master/LICENSE.md
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ebony-Vinyl
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,6 @@
1
+ {
2
+ "url": "https://github.com/Ebony-Vinyl/dsh-our-free-model",
3
+ "commit": "4ed5955f942e805b815c86d4d70914e72df7c1c1",
4
+ "license": "MIT",
5
+ "usage": "PNG channel logos extracted from installed 2.0.0 client bundle; no UI source copied."
6
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 LobeHub
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,16 @@
1
+ {
2
+ "url": "https://github.com/lobehub/lobe-icons",
3
+ "commit": "c385b2b8d1f9e19aa86e628d4e23c91ee1111a47",
4
+ "license": "MIT",
5
+ "usage": "SVG brand artwork from packages/static-svg/icons; fill colors adapted for a light brand canvas.",
6
+ "assets": [
7
+ {
8
+ "path": "packages/static-svg/icons/openai.svg",
9
+ "sha": "78caf4fa20ffb0ae8ebefd74408871c11c1c7fd2"
10
+ },
11
+ {
12
+ "path": "packages/static-svg/icons/kimi.svg",
13
+ "sha": "1915850ee50ea636cc34b37aa11ba7f1ae0a26a2"
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,13 @@
1
+ MIT License
2
+
3
+ Copyright 2018 kamijin_fanta <kamijin@live.jp>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
10
+
11
+ ---
12
+ Icons are taken from the other projects
13
+ so please check each project licences accordingly.
@@ -0,0 +1,6 @@
1
+ {
2
+ "url": "https://github.com/react-icons/react-icons",
3
+ "commit": "87470d588c5624bf3e291f17527c3ecd1419c8ae",
4
+ "license": "MIT and Simple Icons CC0",
5
+ "usage": "Anthropic and Gemini glyphs from the installed react-icons 5.7.0 Simple Icons collection; glyph artwork is CC0."
6
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 xqy2006
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,32 @@
1
+ {
2
+ "schema": 1,
3
+ "name": "lmfpd",
4
+ "version": "0.0.1791719537634",
5
+ "revision": "2d71e10cec030ca786dcbcd14eba84edb4ecf10c",
6
+ "integrity": "sha512-3rOPJHGF1y/eqvWezBKQNAXU6w6f8ZONczg022yLIEcfPRfjsYQ2CkWo1g85hlEt2V3s21bubm9+MQIOJuB2vg==",
7
+ "builtAt": "2026-10-08T13:07:32.556925+00:00",
8
+ "modelCount": 57,
9
+ "source": "https://github.com/Ikaleio/lm-detector/tree/2d71e10cec030ca786dcbcd14eba84edb4ecf10c",
10
+ "upstream": {
11
+ "url": "https://github.com/Ikaleio/lm-detector",
12
+ "commit": "2d71e10cec030ca786dcbcd14eba84edb4ecf10c"
13
+ },
14
+ "compiler": "TypeScript 5.9.3; type erasure and relative module extensions only",
15
+ "sourceHashes": {
16
+ "challenge-browser.js": "65884da44d29b7d5337993609414596272010cb07cffe98b0c5546b1fe9728e4",
17
+ "detector-codec.ts": "4ebc548f4c03f3a150e1d395c547ca84722af60a2a115bf05a17d448dd840acb",
18
+ "fingerprint-core.js": "f7a88e9b0141b0088608a2c86ba9f26cf6b916860e94c3c7f14028c94c165be7",
19
+ "positional.ts": "a44799a179e8eb0b19b83449f0bdb6fa914a64a27c7dc2e5cd71fad31e93719a",
20
+ "shared-detector.ts": "06698e67671f9539caa8e294774e82bb0b68e4a3ab6d1fca455073782b84bd43"
21
+ },
22
+ "files": {
23
+ "core/challenge-browser.mjs": "f51e437d5a6c043da0a06d60ba91b5d5dc2527fc2792b7f52ea9d294919edf03",
24
+ "core/detector-codec.mjs": "31f992f52ecad4f07e97d5f333e855ffde8c568aa6e587257071662d6c659502",
25
+ "core/fingerprint-core.mjs": "442703dc04af39b8f33fbab2cc5afb98f3ee683fa9de114f3cdd8cfacc7578d7",
26
+ "core/positional.mjs": "37d380f3b876a192864522d397261c00d09b8a16590b17fead151af53ba519e0",
27
+ "core/shared-detector.mjs": "73d9b2c11fee43fc0c45d16ab767fe517137246529d2bb9896ed97bee798c214",
28
+ "data/shared_detector.bin": "498663b658e080457f81476ee1ca1665417cb11038d6a3b1d2b6e74260539bbc",
29
+ "data/unified_bank.json": "ec2ccdac4401e28346958b39416d1e3569d0084788720418007e88f96856aa88",
30
+ "LICENSE": "238afb57e498990742f84b9ce6167b4e256ac06104a9938ce953bc41c14bea51"
31
+ }
32
+ }