@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.
- package/CHANGELOG.md +135 -1
- package/NOTICE +39 -0
- package/README.en.md +187 -0
- package/README.md +93 -224
- package/lib/bridge.js +33 -0
- package/lib/client.js +2587 -1159
- package/lib/index.js +420 -150
- package/lib/lm-fingerprint-engine.js +166 -0
- package/lib/lm-fingerprint-source.js +134 -0
- package/lib/lm-fingerprint-worker.js +31 -0
- package/lib/model-detection-history.js +86 -0
- package/lib/model-detection.js +255 -0
- package/lib/provider-quotas.js +26 -5
- package/lib/quota-controls.js +112 -30
- package/lib/supplemental-usage.js +77 -0
- package/lib/usage-preferences.js +51 -0
- package/locale/en.json +6 -0
- package/locale/ja.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +28 -18
- package/screenshots/controls.png +0 -0
- package/screenshots/detection.png +0 -0
- package/screenshots/quotas.png +0 -0
- package/screenshots/usage.png +0 -0
- package/third_party/brand-icons/CHANNEL-ICONS-LICENSE +21 -0
- package/third_party/brand-icons/LICENSE +59 -0
- package/third_party/brand-icons/NOTICE.txt +5 -0
- package/third_party/brand-icons/REACT-ICONS-LICENSE +104 -0
- package/third_party/brand-icons/channel-icons/LICENSE +21 -0
- package/third_party/brand-icons/channel-icons/UPSTREAM.json +6 -0
- package/third_party/brand-icons/lobe-icons/LICENSE +21 -0
- package/third_party/brand-icons/lobe-icons/UPSTREAM.json +16 -0
- package/third_party/brand-icons/react-icons/LICENSE +13 -0
- package/third_party/brand-icons/react-icons/UPSTREAM.json +6 -0
- package/third_party/lm-fingerprint/LICENSE +21 -0
- package/third_party/lm-fingerprint/UPSTREAM.json +32 -0
- package/third_party/lm-fingerprint/core/challenge-browser.mjs +210 -0
- package/third_party/lm-fingerprint/core/detector-codec.mjs +20 -0
- package/third_party/lm-fingerprint/core/fingerprint-core.mjs +121 -0
- package/third_party/lm-fingerprint/core/positional.mjs +64 -0
- package/third_party/lm-fingerprint/core/shared-detector.mjs +132 -0
- package/third_party/lm-fingerprint/data/shared_detector.bin +0 -0
- package/third_party/lm-fingerprint/data/unified_bank.json +826820 -0
- 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
package/locale/ja.json
ADDED
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sligqoer/dsh-usage-stats",
|
|
3
|
-
"description": "DSH Desktop
|
|
4
|
-
"version": "0.1
|
|
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/
|
|
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.
|
|
25
|
+
"README.en.md",
|
|
28
26
|
"CHANGELOG.md",
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"screenshots/
|
|
33
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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
|
}
|
package/screenshots/controls.png
CHANGED
|
Binary file
|
|
Binary file
|
package/screenshots/quotas.png
CHANGED
|
Binary file
|
package/screenshots/usage.png
CHANGED
|
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,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
|
+
}
|