dsh-folia 3.1.1 → 3.3.0
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/lib/client.js +28 -4
- package/lib/index.js +74 -1
- package/lib/routes/skins.js +34 -0
- package/package.json +225 -224
package/lib/client.js
CHANGED
|
@@ -16170,7 +16170,12 @@ window.__ModuleLoader__.load({
|
|
|
16170
16170
|
|
|
16171
16171
|
// ── 内联模块:src/panel-tabs-skins.js —— 「皮肤包」页签:从自建站列皮肤包 → 下载 → 装到 harness/skins → 激活(宿主端 /skins 族)(构建期注入;勿手改本段)──
|
|
16172
16172
|
/**
|
|
16173
|
-
* panel-tabs-skins.js — 「皮肤包」页签:从**自建站**列皮肤包 → 下载 → 装到本地 →
|
|
16173
|
+
* panel-tabs-skins.js — 「皮肤包」页签:从**自建站**列皮肤包 → 下载 → 装到本地 → 选择。
|
|
16174
|
+
*
|
|
16175
|
+
* ⚠️ **分工**(3.2.0 起):皮肤"渲染"这件事归皮肤中心(@linxin666/dsh-client-ui-skin-center)。
|
|
16176
|
+
* 本页签负责**管理**:列表 / 下载 / 删除 / 选中。选中后应用由皮肤中心的设置页完成 ——
|
|
16177
|
+
* 那是唯一 100% 完整的路径(它的控制器不外露,外部没法调)。
|
|
16178
|
+
* 皮肤中心不在台时才退回内置渲染(等价但不完整),并在界面上**明说**。
|
|
16174
16179
|
*
|
|
16175
16180
|
* 为什么是一个**真正的 React 组件**(而不是像别的页签那样是纯渲染函数):
|
|
16176
16181
|
* 这个页签有自己的异步状态(列表 / 加载中 / 下载中 / 错误),而页签渲染器是在
|
|
@@ -16622,6 +16627,8 @@ window.__ModuleLoader__.load({
|
|
|
16622
16627
|
const [loading, setLoading] = React.useState(true);
|
|
16623
16628
|
const [error, setError] = React.useState(null);
|
|
16624
16629
|
const [harnessFound, setHarnessFound] = React.useState(true);
|
|
16630
|
+
// 皮肤中心是否在台:决定"应用"这一步交给谁(见文件头那段分工说明)
|
|
16631
|
+
const [skinCenter, setSkinCenter] = React.useState(false);
|
|
16625
16632
|
const [busy, setBusy] = React.useState(""); // 正在安装 / 激活的那个 id
|
|
16626
16633
|
const [note, setNote] = React.useState(null); // 一次性提示(成功 / 失败原因)
|
|
16627
16634
|
const [q, setQ] = React.useState("");
|
|
@@ -16640,6 +16647,7 @@ window.__ModuleLoader__.load({
|
|
|
16640
16647
|
setActive((r && r.active) || null);
|
|
16641
16648
|
setError((r && r.error) || (resp && resp.error) || null);
|
|
16642
16649
|
setHarnessFound(!r || r.harnessFound !== false);
|
|
16650
|
+
setSkinCenter(Boolean(r && r.skinCenter));
|
|
16643
16651
|
} catch (e) {
|
|
16644
16652
|
setError("network");
|
|
16645
16653
|
setList([]);
|
|
@@ -16705,8 +16713,10 @@ window.__ModuleLoader__.load({
|
|
|
16705
16713
|
setNote({
|
|
16706
16714
|
kind: applyErr ? "err" : "ok",
|
|
16707
16715
|
text: applyErr
|
|
16708
|
-
? weT("
|
|
16709
|
-
:
|
|
16716
|
+
? weT("已选中「") + label + weT("」,但预览注入失败:") + applyErr
|
|
16717
|
+
: (skinCenter
|
|
16718
|
+
? weT("已选中「") + label + weT("」—— 请到 设置 → 皮肤 点「应用」完成(完整效果由皮肤中心渲染)· 预览:")
|
|
16719
|
+
: weT("已切换到「") + label + weT("」—— 未检测到皮肤中心,使用内置渲染,可能显示不全 · 样式:"))
|
|
16710
16720
|
+ Math.round(info.bytes / 1024) + " KB / " + info.rules + weT(" 条规则")
|
|
16711
16721
|
+ ((info.source === "skin-center" || info.source === "local-scoped") ? weT("(已作用域化)") : weT("(未作用域化,可能显示不全)"))
|
|
16712
16722
|
+ (bgKind === "none" ? weT(",无背景媒体") : weT(",背景:") + bgKind)
|
|
@@ -16774,6 +16784,18 @@ window.__ModuleLoader__.load({
|
|
|
16774
16784
|
}, loading ? weT("加载中…") : weT("刷新")),
|
|
16775
16785
|
);
|
|
16776
16786
|
|
|
16787
|
+
// 分工提示:皮肤中心在台 ⇒ 我们只做"选",应用由它的设置页完成(原生路径,完整)。
|
|
16788
|
+
// 不在台 ⇒ 明说我们在兜底,避免用户以为"点了却坏了"。
|
|
16789
|
+
if (list.length > 0) {
|
|
16790
|
+
children.push(React.createElement("div", {
|
|
16791
|
+
key: "division",
|
|
16792
|
+
className: "we-picker__hint",
|
|
16793
|
+
style: { margin: "2px 0 8px", opacity: 0.8 },
|
|
16794
|
+
}, skinCenter
|
|
16795
|
+
? weT("应用皮肤由皮肤中心负责:在这里选中后,到 设置 → 皮肤 点「应用」")
|
|
16796
|
+
: weT("未检测到皮肤中心:将使用内置渲染,效果可能不完整(建议安装 @linxin666/dsh-client-ui-skin-center)")));
|
|
16797
|
+
}
|
|
16798
|
+
|
|
16777
16799
|
if (!harnessFound) {
|
|
16778
16800
|
return React.createElement(React.Fragment, null,
|
|
16779
16801
|
React.createElement("div", { className: "we-picker__section" }, header,
|
|
@@ -16933,7 +16955,9 @@ window.__ModuleLoader__.load({
|
|
|
16933
16955
|
actions.push(btn(isBusy ? weT("安装中…") : weT("下载安装"), () => act("install", s.id, s.name), false, true));
|
|
16934
16956
|
} else {
|
|
16935
16957
|
if (!s.active) {
|
|
16936
|
-
actions.push(btn(
|
|
16958
|
+
actions.push(btn(
|
|
16959
|
+
isBusy ? weT("切换中…") : (skinCenter ? weT("选择") : weT("使用")),
|
|
16960
|
+
() => act("activate", s.id, s.name), false, true));
|
|
16937
16961
|
actions.push(btn(weT("删除"), () => act("remove", s.id, s.name), isBusy, false));
|
|
16938
16962
|
} else {
|
|
16939
16963
|
actions.push(btn(weT("使用中"), () => {}, true, false));
|
package/lib/index.js
CHANGED
|
@@ -94,7 +94,7 @@ import { registerPropsRoutes } from './routes/props.js';
|
|
|
94
94
|
import { registerLiveFrameRoutes } from './routes/live-frame.js';
|
|
95
95
|
import { registerSettingsRoutes } from './routes/settings.js';
|
|
96
96
|
import { registerCacheDirRoutes } from './routes/cache-dir.js';
|
|
97
|
-
import { registerSkinRoutes } from './routes/skins.js';
|
|
97
|
+
import { registerSkinRoutes, harnessRoot as foliaHarnessRoot } from './routes/skins.js';
|
|
98
98
|
// C8′/C6 出户的组件行(P2-1 / P2-2):组件入口**静态** import(不是动态)—— `test/verify-reachability.mjs`
|
|
99
99
|
// 只从 ENTRY 沿 import 边走,动态加载的组件入口会被判定为不可达,棘轮当场变红。
|
|
100
100
|
// 组件名 → 实现表的登记在 `applyComponent` **函数体内**(P2-1b 起;模块级常量会让门面求值期
|
|
@@ -504,6 +504,13 @@ export function apply(ctx) {
|
|
|
504
504
|
disposers, base: BASE, log,
|
|
505
505
|
});
|
|
506
506
|
|
|
507
|
+
// 皮肤中心自动挂载(可选,默认关闭)。它是标准 cordis 插件(name / inject / apply),
|
|
508
|
+
// 所以能被动态挂上 —— 用户不必再装 @linxin666/dsh-web-all 才有皮肤渲染能力。
|
|
509
|
+
// 默认关闭的原因:DSH 对"同一插件挂两次"没有保护,我们踩过(重复行 → 安全模式)。
|
|
510
|
+
try { maybeMountSkinCenter(ctx, log); } catch (err) {
|
|
511
|
+
try { log('[folia] 皮肤中心自动挂载失败(忽略):' + (err && err.message ? err.message : err)); } catch { /* ignore */ }
|
|
512
|
+
}
|
|
513
|
+
|
|
507
514
|
// fiber disposer 的语义(先逐个 disposer、再 releaseKernelLease(hostKernel)——内核引用计数
|
|
508
515
|
// 归零才 `transcodeKit.dispose()`——再 destroy 在途流、清 activeStreams / mediaMap)
|
|
509
516
|
// 逐字搬进 lib/kernel/host-session.js 的 `dispose()`。
|
|
@@ -587,6 +594,72 @@ function componentProbe() {
|
|
|
587
594
|
* —— 那条纪律写在组件入口文件头,并由 `test/verify-bundle-rows.mjs` 的判据钉住;彻底解耦(拆环)
|
|
588
595
|
* 留给 P2-2b。
|
|
589
596
|
*/
|
|
597
|
+
/**
|
|
598
|
+
* 是否已经有别的 bundle 把皮肤中心挂上了(默认假设"有",避免重复挂载)。
|
|
599
|
+
*
|
|
600
|
+
* 判据落在磁盘上的 patch 行:从 harness 根出发,扫每个 profile 的 package.json
|
|
601
|
+
* dsh.profile.bundles,把每个 bundle 包的 cordis.patch.yml 读出来,看有没有行指向
|
|
602
|
+
* @linxin666/dsh-client-ui-skin-center。有 ⇒ 别人挂了,我们不插手。
|
|
603
|
+
* 读不到 / 结构不认识 ⇒ 同样按"已挂载"处理(宁可少挂一次,也不能挂两次)。
|
|
604
|
+
*/
|
|
605
|
+
function skinCenterPatchedElsewhere(harnessRoot) {
|
|
606
|
+
try {
|
|
607
|
+
const { readdirSync, readFileSync, existsSync } = require('node:fs');
|
|
608
|
+
const { join } = require('node:path');
|
|
609
|
+
const profilesDir = join(harnessRoot, 'profiles');
|
|
610
|
+
if (!existsSync(profilesDir)) return true;
|
|
611
|
+
const SKIN_CENTER = '@linxin666/dsh-client-ui-skin-center';
|
|
612
|
+
for (const name of readdirSync(profilesDir)) {
|
|
613
|
+
if (name.startsWith('.')) continue;
|
|
614
|
+
const pkgPath = join(profilesDir, name, 'package.json');
|
|
615
|
+
if (!existsSync(pkgPath)) continue;
|
|
616
|
+
let prof;
|
|
617
|
+
try { prof = JSON.parse(readFileSync(pkgPath, 'utf8')); } catch { continue; }
|
|
618
|
+
const bundles = (prof && prof.dsh && prof.dsh.profile && prof.dsh.profile.bundles) || [];
|
|
619
|
+
for (const b of bundles) {
|
|
620
|
+
const patchPath = join(profilesDir, name, 'node_modules', b, 'cordis.patch.yml');
|
|
621
|
+
if (!existsSync(patchPath)) continue;
|
|
622
|
+
let text = '';
|
|
623
|
+
try { text = readFileSync(patchPath, 'utf8'); } catch { continue; }
|
|
624
|
+
if (text.includes(SKIN_CENTER)) return true;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
return false;
|
|
628
|
+
} catch {
|
|
629
|
+
return true;
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* 按需动态挂载皮肤中心。默认关闭,用 DSH_FOLIA_MOUNT_SKIN_CENTER=1 开启。
|
|
635
|
+
* 开启后仍先查"别人挂了吗",已挂则跳过 —— 重复挂载是能让 DSH 起不来的事故。
|
|
636
|
+
*/
|
|
637
|
+
function maybeMountSkinCenter(ctx, log) {
|
|
638
|
+
const flag = String(process.env.DSH_FOLIA_MOUNT_SKIN_CENTER || '').trim().toLowerCase();
|
|
639
|
+
if (flag !== '1' && flag !== 'on' && flag !== 'true') return;
|
|
640
|
+
|
|
641
|
+
const harness = (() => { try { return foliaHarnessRoot(); } catch { return null; } })();
|
|
642
|
+
if (!harness) {
|
|
643
|
+
try { log('[folia] 皮肤中心自动挂载跳过:找不到 harness 根目录'); } catch { /* ignore */ }
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
if (skinCenterPatchedElsewhere(harness)) {
|
|
647
|
+
try { log('[folia] 皮肤中心已由其它 bundle 挂载,跳过自动挂载'); } catch { /* ignore */ }
|
|
648
|
+
return;
|
|
649
|
+
}
|
|
650
|
+
import('@linxin666/dsh-client-ui-skin-center').then((mod) => {
|
|
651
|
+
try {
|
|
652
|
+
if (!mod || typeof mod.apply !== 'function') { log('[folia] 皮肤中心模块形态不对,跳过'); return; }
|
|
653
|
+
ctx.plugin(mod);
|
|
654
|
+
log('[folia] 已自动挂载皮肤中心(DSH_FOLIA_MOUNT_SKIN_CENTER=1)');
|
|
655
|
+
} catch (err) {
|
|
656
|
+
try { log('[folia] 自动挂载皮肤中心失败:' + (err && err.message ? err.message : err)); } catch { /* ignore */ }
|
|
657
|
+
}
|
|
658
|
+
}).catch((err) => {
|
|
659
|
+
try { log('[folia] 找不到皮肤中心(可选依赖),跳过:' + (err && err.message ? err.message : err)); } catch { /* ignore */ }
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
|
|
590
663
|
export function applyComponent(root, rawConfig, component) {
|
|
591
664
|
const impls = componentImpls();
|
|
592
665
|
const impl = impls.get(component);
|
package/lib/routes/skins.js
CHANGED
|
@@ -58,6 +58,30 @@ function skinsSiteBase() {
|
|
|
58
58
|
return base.replace(/\/+$/, '');
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/**
|
|
62
|
+
* 皮肤中心是否已挂载(60s 缓存)。
|
|
63
|
+
*
|
|
64
|
+
* 判据只有它的路由:`/api/skin-center/v2/active` 存在 ⇒ 挂载(200 / 401 / 403 都算,
|
|
65
|
+
* 网关会先挡一层,401 恰恰证明路由注册过);404 ⇒ 没装 / 没挂。
|
|
66
|
+
*
|
|
67
|
+
* 为什么要探测:我们不再假装能"完整应用皮肤"。皮肤中心在台时,应用动作应当交回它的
|
|
68
|
+
* 设置页(原生路径,100% 完整);它不在时我们才用自建兜底,并把"可能不全"说出来。
|
|
69
|
+
*/
|
|
70
|
+
let skinCenterCache = { at: 0, mounted: false };
|
|
71
|
+
async function skinCenterMounted(origin, fwdHeaders) {
|
|
72
|
+
if (Date.now() - skinCenterCache.at < SKINS_TTL_MS) return skinCenterCache.mounted;
|
|
73
|
+
let mounted = false;
|
|
74
|
+
try {
|
|
75
|
+
const r = await fetch(origin + '/api/skin-center/v2/active', {
|
|
76
|
+
headers: fwdHeaders,
|
|
77
|
+
signal: AbortSignal.timeout(3000),
|
|
78
|
+
});
|
|
79
|
+
mounted = r.status !== 404;
|
|
80
|
+
} catch { mounted = false; }
|
|
81
|
+
skinCenterCache = { at: Date.now(), mounted };
|
|
82
|
+
return mounted;
|
|
83
|
+
}
|
|
84
|
+
|
|
61
85
|
/** @type {{ at: number, payload: any[] | null, error: string | null }} */
|
|
62
86
|
let indexCache = { at: 0, payload: null, error: null };
|
|
63
87
|
|
|
@@ -347,6 +371,16 @@ export function registerSkinRoutes(webServer, c) {
|
|
|
347
371
|
site: skinsSiteBase(),
|
|
348
372
|
harness,
|
|
349
373
|
harnessFound: Boolean(harness),
|
|
374
|
+
skinCenter: await skinCenterMounted(
|
|
375
|
+
'http://' + ((req && req.headers && req.headers.host) || '127.0.0.1'),
|
|
376
|
+
(() => {
|
|
377
|
+
const h = { accept: 'application/json', 'sec-fetch-site': 'same-origin' };
|
|
378
|
+
const host = (req && req.headers && req.headers.host) || '';
|
|
379
|
+
if (host) { h.origin = 'http://' + host; h.referer = 'http://' + host + '/'; }
|
|
380
|
+
if (req && req.headers && req.headers.cookie) h.cookie = req.headers.cookie;
|
|
381
|
+
return h;
|
|
382
|
+
})(),
|
|
383
|
+
),
|
|
350
384
|
active,
|
|
351
385
|
count: merged.length,
|
|
352
386
|
installedCount: [...installed].length,
|
package/package.json
CHANGED
|
@@ -1,224 +1,225 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-folia",
|
|
3
|
+
"version": "3.3.0",
|
|
4
|
+
"description": "Folia 壁纸引擎:把本机 Wallpaper Engine 壁纸搬进 DSH 界面(场景实时渲染 / 视频 / 网页),内置液态玻璃与 Folia 吉祥物,并可从自建站点拉取壁纸。单包形态(组件已合并)。",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22.12.0",
|
|
8
|
+
"dsh": "^0.2.0-rc.1"
|
|
9
|
+
},
|
|
10
|
+
"main": "lib/index.js",
|
|
11
|
+
"types": "lib/types/index.d.ts",
|
|
12
|
+
"icon": "./icon.png",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/lehua-art/dsh-folia.git"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"dsh",
|
|
19
|
+
"dsh-plugin",
|
|
20
|
+
"deepseek-harness",
|
|
21
|
+
"wallpaper",
|
|
22
|
+
"folia",
|
|
23
|
+
"theme",
|
|
24
|
+
"background"
|
|
25
|
+
],
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./lib/types/index.d.ts",
|
|
32
|
+
"default": "./lib/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./client": {
|
|
35
|
+
"types": "./lib/types/client.d.ts",
|
|
36
|
+
"default": "./lib/client.js"
|
|
37
|
+
},
|
|
38
|
+
"./subpackage-boot.js": "./lib/subpackage-boot.js",
|
|
39
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
40
|
+
"./package.json": "./package.json"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"icon.png",
|
|
44
|
+
"lib/index.js",
|
|
45
|
+
"lib/host-boot.js",
|
|
46
|
+
"lib/log.js",
|
|
47
|
+
"lib/notice.js",
|
|
48
|
+
"lib/kernel/",
|
|
49
|
+
"lib/kernel/data-dir.js",
|
|
50
|
+
"lib/kernel/config.js",
|
|
51
|
+
"lib/kernel/host-kernel.js",
|
|
52
|
+
"lib/kernel/host-session.js",
|
|
53
|
+
"lib/routes/",
|
|
54
|
+
"lib/occlusion/",
|
|
55
|
+
"lib/fontsets/",
|
|
56
|
+
"lib/glass-presets/",
|
|
57
|
+
"lib/about/",
|
|
58
|
+
"lib/component-visibility.js",
|
|
59
|
+
"lib/client.js",
|
|
60
|
+
"lib/http-body.js",
|
|
61
|
+
"lib/json-response.js",
|
|
62
|
+
"lib/pkg-read.js",
|
|
63
|
+
"lib/scene-manifest.js",
|
|
64
|
+
"lib/settings-schema.js",
|
|
65
|
+
"lib/subpackage-boot.js",
|
|
66
|
+
"lib/media/",
|
|
67
|
+
"lib/media/transcode.js",
|
|
68
|
+
"lib/media/mp4-probe.js",
|
|
69
|
+
"lib/media/scene-probe.js",
|
|
70
|
+
"lib/media/video-preview.js",
|
|
71
|
+
"lib/media/frame-store.js",
|
|
72
|
+
"lib/media/media-dirs.js",
|
|
73
|
+
"lib/media-origin.js",
|
|
74
|
+
"lib/inventory.js",
|
|
75
|
+
"lib/serve.js",
|
|
76
|
+
"lib/faststart.js",
|
|
77
|
+
"lib/cache-dir.js",
|
|
78
|
+
"lib/upload-store.js",
|
|
79
|
+
"lib/diag-trace.js",
|
|
80
|
+
"lib/http-lifecycle.js",
|
|
81
|
+
"lib/mp4-vfs.js",
|
|
82
|
+
"lib/startup-sweep.js",
|
|
83
|
+
"lib/fs-paths.js",
|
|
84
|
+
"lib/upload-dir.js",
|
|
85
|
+
"lib/wallpaper-scan.js",
|
|
86
|
+
"lib/steam-discovery.js",
|
|
87
|
+
"lib/webwallgl/",
|
|
88
|
+
"lib/we-assets.js",
|
|
89
|
+
"lib/shim-seed.js",
|
|
90
|
+
"lib/we-props.js",
|
|
91
|
+
"lib/we-focus-guard.js",
|
|
92
|
+
"lib/types/index.d.ts",
|
|
93
|
+
"lib/types/client.d.ts",
|
|
94
|
+
"cordis.patch.yml",
|
|
95
|
+
"assets/readme/hero-light.png",
|
|
96
|
+
"assets/readme/hero-dark.png",
|
|
97
|
+
"assets/readme/key-lang-zh-light.png",
|
|
98
|
+
"assets/readme/key-lang-zh-dark.png",
|
|
99
|
+
"assets/readme/key-lang-en-light.png",
|
|
100
|
+
"assets/readme/key-lang-en-dark.png",
|
|
101
|
+
"assets/readme/key-lang-start-light.png",
|
|
102
|
+
"assets/readme/key-lang-start-dark.png",
|
|
103
|
+
"assets/readme/key-get-light.png",
|
|
104
|
+
"assets/readme/key-get-dark.png",
|
|
105
|
+
"assets/readme/key-setup-light.png",
|
|
106
|
+
"assets/readme/key-setup-dark.png",
|
|
107
|
+
"assets/readme/key-docs-light.png",
|
|
108
|
+
"assets/readme/key-docs-dark.png",
|
|
109
|
+
"assets/readme/key-release-light.png",
|
|
110
|
+
"assets/readme/key-release-dark.png",
|
|
111
|
+
"assets/readme/stat-version-light.png",
|
|
112
|
+
"assets/readme/stat-version-dark.png",
|
|
113
|
+
"assets/readme/stat-formats-light.png",
|
|
114
|
+
"assets/readme/stat-formats-dark.png",
|
|
115
|
+
"assets/readme/stat-mascots-light.png",
|
|
116
|
+
"assets/readme/stat-mascots-dark.png",
|
|
117
|
+
"assets/readme/stat-modules-light.png",
|
|
118
|
+
"assets/readme/stat-modules-dark.png",
|
|
119
|
+
"assets/readme/section-intro-light.png",
|
|
120
|
+
"assets/readme/section-intro-dark.png",
|
|
121
|
+
"assets/readme/section-preview-light.png",
|
|
122
|
+
"assets/readme/section-preview-dark.png",
|
|
123
|
+
"assets/readme/section-start-light.png",
|
|
124
|
+
"assets/readme/section-start-dark.png",
|
|
125
|
+
"assets/readme/section-index-light.png",
|
|
126
|
+
"assets/readme/section-index-dark.png",
|
|
127
|
+
"assets/readme/section-features-light.png",
|
|
128
|
+
"assets/readme/section-features-dark.png",
|
|
129
|
+
"assets/readme/section-formats-light.png",
|
|
130
|
+
"assets/readme/section-formats-dark.png",
|
|
131
|
+
"assets/readme/section-install-light.png",
|
|
132
|
+
"assets/readme/section-install-dark.png",
|
|
133
|
+
"assets/readme/section-usage-light.png",
|
|
134
|
+
"assets/readme/section-usage-dark.png",
|
|
135
|
+
"assets/readme/section-pet-light.png",
|
|
136
|
+
"assets/readme/section-pet-dark.png",
|
|
137
|
+
"assets/readme/section-config-light.png",
|
|
138
|
+
"assets/readme/section-config-dark.png",
|
|
139
|
+
"assets/readme/section-compat-light.png",
|
|
140
|
+
"assets/readme/section-compat-dark.png",
|
|
141
|
+
"assets/readme/section-develop-light.png",
|
|
142
|
+
"assets/readme/section-develop-dark.png",
|
|
143
|
+
"assets/readme/section-community-light.png",
|
|
144
|
+
"assets/readme/section-community-dark.png",
|
|
145
|
+
"assets/readme/section-credits-light.png",
|
|
146
|
+
"assets/readme/section-credits-dark.png",
|
|
147
|
+
"assets/readme/section-support-light.png",
|
|
148
|
+
"assets/readme/section-support-dark.png",
|
|
149
|
+
"assets/readme/section-stars-light.png",
|
|
150
|
+
"assets/readme/section-stars-dark.png",
|
|
151
|
+
"assets/readme/SOURCES.md",
|
|
152
|
+
"assets/readme/OFL-Jersey20.txt",
|
|
153
|
+
"assets/readme/mascot-eating-rice-1280x1784.jpg",
|
|
154
|
+
"README.md",
|
|
155
|
+
"README.en.md",
|
|
156
|
+
"README.beginner.md",
|
|
157
|
+
"lib/components/"
|
|
158
|
+
],
|
|
159
|
+
"dsh": {
|
|
160
|
+
"bundle": {
|
|
161
|
+
"patch": "./cordis.patch.yml"
|
|
162
|
+
},
|
|
163
|
+
"client": {
|
|
164
|
+
"inject": [
|
|
165
|
+
"@deepseek-ai/dsh-client-runtime"
|
|
166
|
+
],
|
|
167
|
+
"platform": "web",
|
|
168
|
+
"immediately": true
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
"license": "MIT",
|
|
172
|
+
"scripts": {
|
|
173
|
+
"build": "node scripts/build-client.mjs",
|
|
174
|
+
"install:source": "node scripts/install-source.mjs",
|
|
175
|
+
"install:release": "node scripts/install-release.mjs",
|
|
176
|
+
"pack:release": "node scripts/pack-release.mjs",
|
|
177
|
+
"verify:deployment": "node test/verify-deployment.mjs",
|
|
178
|
+
"verify:pet-link": "node test/verify-pet-link.mjs",
|
|
179
|
+
"verify:pet-link:integration": "node test/verify-pet-hotplug-integration.mjs",
|
|
180
|
+
"verify:pet-link:browser": "node test/verify-pet-tuner-browser.mjs",
|
|
181
|
+
"verify": "node test/run-guards.mjs verify",
|
|
182
|
+
"verify:docs": "node test/run-guards.mjs docs",
|
|
183
|
+
"verify:bridge": "node test/verify-bridge-ci.mjs --provision",
|
|
184
|
+
"verify:bridge:strict": "node test/verify-media-bridge.mjs --provision",
|
|
185
|
+
"verify:e2e": "node test/e2e-web-media-origin.mjs",
|
|
186
|
+
"lint": "eslint .",
|
|
187
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
188
|
+
"verify:static": "node test/verify-static.mjs",
|
|
189
|
+
"smoke": "node test/run-guards.mjs smoke",
|
|
190
|
+
"verify:all": "node test/run-guards.mjs all",
|
|
191
|
+
"prepack": "node scripts/prepare.mjs"
|
|
192
|
+
},
|
|
193
|
+
"peerDependencies": {
|
|
194
|
+
"@deepseek-ai/cordis": "^4.0.4",
|
|
195
|
+
"@deepseek-ai/dsh-client-runtime": ">=0.1.5-rc.1",
|
|
196
|
+
"@deepseek-ai/dsh-client-ui-slots": ">=0.1.5-rc.1",
|
|
197
|
+
"@deepseek-ai/dsh-host-webserver": ">=0.1.5-rc.1",
|
|
198
|
+
"react": "^18.2.0"
|
|
199
|
+
},
|
|
200
|
+
"peerDependenciesMeta": {
|
|
201
|
+
"@deepseek-ai/dsh-client-runtime": {
|
|
202
|
+
"optional": true
|
|
203
|
+
},
|
|
204
|
+
"@deepseek-ai/dsh-client-ui-slots": {
|
|
205
|
+
"optional": true
|
|
206
|
+
},
|
|
207
|
+
"@deepseek-ai/dsh-host-webserver": {
|
|
208
|
+
"optional": true
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
"dependencies": {
|
|
212
|
+
"@linxin666/dsh-client-ui-skin-center": "^0.4.8",
|
|
213
|
+
"webwallgl": "^3.0.0",
|
|
214
|
+
"x11": "^4.3.1"
|
|
215
|
+
},
|
|
216
|
+
"overrides": {
|
|
217
|
+
"js-yaml": "4.3.2"
|
|
218
|
+
},
|
|
219
|
+
"devDependencies": {
|
|
220
|
+
"@eslint/js": "^10.0.1",
|
|
221
|
+
"@types/node": "^26.6.5",
|
|
222
|
+
"eslint": "^10.12.0",
|
|
223
|
+
"typescript": "^7.0.2"
|
|
224
|
+
}
|
|
225
|
+
}
|