dsh-folia 3.1.0 → 3.2.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 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("已切换为「") + label + weT("」,但样式注入失败:") + applyErr
16709
- : weT("已切换到「") + label + weT("」—— 样式 ")
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,
@@ -16794,9 +16816,26 @@ window.__ModuleLoader__.load({
16794
16816
  style: { margin: "4px 0 8px", display: "flex", gap: "8px", alignItems: "center", flexWrap: "wrap" },
16795
16817
  },
16796
16818
  React.createElement("span", null, weT("当前皮肤:") + activeName),
16797
- React.createElement("span", {
16798
- style: { fontSize: "11px", padding: "1px 6px", borderRadius: "999px", background: "rgba(142,230,168,0.16)", color: "#8ee6a8" },
16799
- }, weT("已应用")),
16819
+ // 谁在应用这套皮肤?判据只有一个:皮肤中心自己会给 <html> 盖 `data-dsh-skin`。
16820
+ // 属性 == 当前皮肤 ⇒ 它接管的(原生应用,完整)
16821
+ // 属性 缺失/不等 ⇒ 我们复刻兜底的(可能不全)
16822
+ // 把这层区别直接显示出来,省得"看起来不全"时无从判断该怪谁。
16823
+ (() => {
16824
+ let native = false;
16825
+ try { native = document.documentElement.getAttribute("data-dsh-skin") === active; } catch { native = false; }
16826
+ return React.createElement("span", {
16827
+ style: {
16828
+ fontSize: "11px",
16829
+ padding: "1px 6px",
16830
+ borderRadius: "999px",
16831
+ background: native ? "rgba(142,230,168,0.16)" : "rgba(255,196,120,0.16)",
16832
+ color: native ? "#8ee6a8" : "#ffd08a",
16833
+ },
16834
+ title: native
16835
+ ? weT("皮肤中心在页面加载时应用的(原生路径,完整)")
16836
+ : weT("皮肤中心没接手,用的是本插件的兜底注入(可能显示不全)"),
16837
+ }, native ? weT("皮肤中心接管") : weT("本地兜底"));
16838
+ })(),
16800
16839
  ));
16801
16840
  }
16802
16841
 
@@ -16916,7 +16955,9 @@ window.__ModuleLoader__.load({
16916
16955
  actions.push(btn(isBusy ? weT("安装中…") : weT("下载安装"), () => act("install", s.id, s.name), false, true));
16917
16956
  } else {
16918
16957
  if (!s.active) {
16919
- actions.push(btn(isBusy ? weT("切换中…") : weT("使用"), () => act("activate", s.id, s.name), false, true));
16958
+ actions.push(btn(
16959
+ isBusy ? weT("切换中…") : (skinCenter ? weT("选择") : weT("使用")),
16960
+ () => act("activate", s.id, s.name), false, true));
16920
16961
  actions.push(btn(weT("删除"), () => act("remove", s.id, s.name), isBusy, false));
16921
16962
  } else {
16922
16963
  actions.push(btn(weT("使用中"), () => {}, true, false));
@@ -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
- "name": "dsh-folia",
3
- "version": "3.1.0",
4
- "description": "Folia 壁纸引擎:把本机 Wallpaper Engine 壁纸搬进 DSH 界面(场景实时渲染 / 视频 / 网页),内置液态玻璃与 Folia 吉祥物,并可从自建站点拉取壁纸。单包形态(组件已合并)。",
5
- "type": "module",
6
- "engines": {
7
- "node": "\u003e=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": "\u003e=0.1.5-rc.1",
196
- "@deepseek-ai/dsh-client-ui-slots": "\u003e=0.1.5-rc.1",
197
- "@deepseek-ai/dsh-host-webserver": "\u003e=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
- "webwallgl": "^3.0.0",
213
- "x11": "^4.3.1"
214
- },
215
- "overrides": {
216
- "js-yaml": "4.3.2"
217
- },
218
- "devDependencies": {
219
- "@eslint/js": "^10.0.1",
220
- "@types/node": "^26.6.5",
221
- "eslint": "^10.12.0",
222
- "typescript": "^7.0.2"
223
- }
224
- }
1
+ {
2
+ "name": "dsh-folia",
3
+ "version": "3.2.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
+ }