dsh-folia 3.3.0 → 3.4.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/lib/client.js CHANGED
@@ -16629,6 +16629,8 @@ window.__ModuleLoader__.load({
16629
16629
  const [harnessFound, setHarnessFound] = React.useState(true);
16630
16630
  // 皮肤中心是否在台:决定"应用"这一步交给谁(见文件头那段分工说明)
16631
16631
  const [skinCenter, setSkinCenter] = React.useState(false);
16632
+ // 谁提供了皮肤中心行(用于检测重复挂载,见下方警示块)
16633
+ const [providers, setProviders] = React.useState([]);
16632
16634
  const [busy, setBusy] = React.useState(""); // 正在安装 / 激活的那个 id
16633
16635
  const [note, setNote] = React.useState(null); // 一次性提示(成功 / 失败原因)
16634
16636
  const [q, setQ] = React.useState("");
@@ -16648,6 +16650,7 @@ window.__ModuleLoader__.load({
16648
16650
  setError((r && r.error) || (resp && resp.error) || null);
16649
16651
  setHarnessFound(!r || r.harnessFound !== false);
16650
16652
  setSkinCenter(Boolean(r && r.skinCenter));
16653
+ setProviders(Array.isArray(r && r.skinCenterProviders) ? r.skinCenterProviders : []);
16651
16654
  } catch (e) {
16652
16655
  setError("network");
16653
16656
  setList([]);
@@ -16784,6 +16787,23 @@ window.__ModuleLoader__.load({
16784
16787
  }, loading ? weT("加载中…") : weT("刷新")),
16785
16788
  );
16786
16789
 
16790
+ // ── 重复挂载警示(内嵌皮肤中心的副作用)────────────────────────────────────
16791
+ // 我们的 patch 加了一行 folia-skin-center;如果用户还装着 dsh-web-all,它那行
16792
+ // web-ui-skin-center 指向同一个包 ⇒ 同一个插件挂两次。DSH 不拦这种事,所以必须
16793
+ // 在界面上说清楚"去关掉一处",而不是让用户去猜为什么皮肤行为怪。
16794
+ if (providers.length > 1) {
16795
+ children.push(React.createElement("div", {
16796
+ key: "dup",
16797
+ className: "we-picker__hint",
16798
+ style: {
16799
+ margin: "4px 0 10px", padding: "7px 10px", borderRadius: "8px",
16800
+ background: "rgba(255,120,120,0.14)", color: "#ff9a9a", lineHeight: 1.5,
16801
+ },
16802
+ }, weT("⚠️ 检测到 ") + providers.length + weT(" 处挂载了皮肤中心(")
16803
+ + providers.map((p) => p.bundle).join(" / ")
16804
+ + weT(")。请只保留一处:把 dsh-web-all 里的皮肤中心行关掉,或在插件管理里停用其一,否则会重复挂载。")));
16805
+ }
16806
+
16787
16807
  // 分工提示:皮肤中心在台 ⇒ 我们只做"选",应用由它的设置页完成(原生路径,完整)。
16788
16808
  // 不在台 ⇒ 明说我们在兜底,避免用户以为"点了却坏了"。
16789
16809
  if (list.length > 0) {
@@ -114,6 +114,47 @@ export function harnessRoot() {
114
114
 
115
115
  /* ── 索引 ────────────────────────────────────────────────────────────────── */
116
116
 
117
+ /**
118
+ * 列出**所有**提供了皮肤中心行的 bundle(跨 profile 扫 patch 文件)。
119
+ *
120
+ * 为什么必须报出来:我们在自己的 patch 里加了一行内嵌皮肤中心(folia-skin-center)。
121
+ * 如果用户同时还装着 @linxin666/dsh-web-all,它的 patch 里也有一行(web-ui-skin-center)
122
+ * 指向同一个包 ⇒ 同一个插件被挂两次。这种事要显式告诉用户去关掉一处,不能静默。
123
+ */
124
+ function skinCenterProviders() {
125
+ const out = [];
126
+ try {
127
+ const harness = harnessRoot();
128
+ if (!harness) return out;
129
+ const profilesDir = join(harness, 'profiles');
130
+ if (!existsSync(profilesDir)) return out;
131
+ const SKIN_CENTER = '@linxin666/dsh-client-ui-skin-center';
132
+ for (const prof of readdirSync(profilesDir)) {
133
+ if (prof.startsWith('.')) continue;
134
+ const pkgPath = join(profilesDir, prof, 'package.json');
135
+ if (!existsSync(pkgPath)) continue;
136
+ let doc;
137
+ try { doc = JSON.parse(readFileSync(pkgPath, 'utf8')); } catch { continue; }
138
+ const bundles = (doc && doc.dsh && doc.dsh.profile && doc.dsh.profile.bundles) || [];
139
+ for (const b of bundles) {
140
+ const patchPath = join(profilesDir, prof, 'node_modules', b, 'cordis.patch.yml');
141
+ if (!existsSync(patchPath)) continue;
142
+ let text;
143
+ try { text = readFileSync(patchPath, 'utf8'); } catch { continue; }
144
+ if (!text.includes(SKIN_CENTER)) continue;
145
+ const ids = [];
146
+ const re = /-\s*id:\s*([A-Za-z0-9_-]+)\s*\n\s*name:\s*'([^']+)'/g;
147
+ let m;
148
+ while ((m = re.exec(text)) !== null) {
149
+ if (m[2].includes('dsh-client-ui-skin-center')) ids.push(m[1]);
150
+ }
151
+ if (ids.length) out.push({ profile: prof, bundle: b, rows: ids });
152
+ }
153
+ }
154
+ } catch { /* 扫描失败只是少一条提示,不影响功能 */ }
155
+ return out;
156
+ }
157
+
117
158
  /**
118
159
  * 拉站点索引并**精简**成客户端要的形状。永不抛;失败返回 `{ items: [], error }`。
119
160
  *
@@ -371,6 +412,7 @@ export function registerSkinRoutes(webServer, c) {
371
412
  site: skinsSiteBase(),
372
413
  harness,
373
414
  harnessFound: Boolean(harness),
415
+ skinCenterProviders: skinCenterProviders(),
374
416
  skinCenter: await skinCenterMounted(
375
417
  'http://' + ((req && req.headers && req.headers.host) || '127.0.0.1'),
376
418
  (() => {
package/package.json CHANGED
@@ -1,225 +1,225 @@
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
- }
1
+ {
2
+ "name": "dsh-folia",
3
+ "version": "3.4.1",
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
+ "@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
+ }