dsh-deepseek-style-theme 2.0.88 → 2.1.90
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/README.md +71 -78
- package/lib/client.js +791 -857
- package/lib/index.js +143 -390
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
- **DeepSeek 品牌链接**:点击侧边栏 DeepSeek 标识跳转 `https://www.deepseek.com/`
|
|
27
27
|
- **轨迹视图**:「对话 / 轨迹」标签在标题栏悬停(`.dshome-swap`)或轨迹视图存在时显示,**不是常驻**——会话视图下实测 `[class*="wSkVaW_tabs"]` 默认 `display:none`(2.0.84 按实机报告 B4 勘误)
|
|
28
28
|
- **运行中子代理面板**:有子代理启动时,右下角浮出玻璃面板,实时列出正在运行的子代理——名称、已运行时长、token 用量与流动进度条;点击条目直接跳转到该子代理会话,可折叠收起
|
|
29
|
-
-
|
|
30
|
-
-
|
|
29
|
+
- **跨平台**:交付文件菜单里的「打开所在文件夹 / 在文件管理器中显示」由**官方通路**执行(`session.openWorkspacePath`),各平台调用系统文件管理器;本插件不再自己开文件管理器
|
|
30
|
+
- **模型目录同步**:**已交还官方**(2.1.90 起)。官方自带模型目录(`ui-model-selection` + `modelCatalog`),"选择器里有哪些模型"以官方为准;本插件不再介入,也不再写 `llm-deepseek.models`。
|
|
31
31
|
- **交付文件菜单(1.41.0+,1.41.2 起覆盖两处)**:回复末尾的**「本轮文件改动」条目左键点击**即弹出玻璃拟态操作菜单,**交付文件卡片右键**弹出同一菜单——**用默认应用打开 / 打开所在文件夹 / 复制路径 / 打开预览**(卡片上显示为「在侧边栏预览」);产品自己的下拉菜单里也补上它唯一缺的「复制路径」。产品原本的左键动作被保留成菜单项,不会被丢掉
|
|
32
32
|
- **时段提示(DSTT)**:主题模式四选一——**峰谷红蓝**(高峰鲜红、谷时段蓝)/ **峰谷红绿**(高峰鲜红、谷时段绿)/ **常态绿** / **常态蓝**;高峰窗口北京时间 9:00–12:00、14:00–18:00(周六周日全天非高峰),高峰色为鲜红 `#F5222D`
|
|
33
33
|
|
|
@@ -39,17 +39,48 @@
|
|
|
39
39
|
- **常态绿**:始终绿色,无高峰区分;
|
|
40
40
|
- **常态蓝**:始终蓝色,无高峰区分。
|
|
41
41
|
|
|
42
|
+
## 语义锚点版(2.1.0+,面向 dsh 0.2.x 官方桌面版)
|
|
43
|
+
|
|
44
|
+
产品每次构建都会重排 CSS Module 哈希(0.1.7 的 `.wSkVaW_*` → 0.2.0 的 `.Dc7zOa_*`),
|
|
45
|
+
任何写死类名的补丁都会在更新后**静默失效**。2.1.0 起主线只依赖**产品语义钩子**,不再写死哈希:
|
|
46
|
+
|
|
47
|
+
| 保留(语义) | 依据 |
|
|
48
|
+
|---|---|
|
|
49
|
+
| 输入卡玻璃化 | `[data-composer-stats]` / `[data-composer-card]` |
|
|
50
|
+
| 浮层菜单液态玻璃 | `[data-menu-material]` |
|
|
51
|
+
| 交付文件卡片 / 文件改动行 | `[data-presented-file]` / `[data-presented-files-row]` |
|
|
52
|
+
| 文件弹窗(打开文件/复制路径/打开文件夹) | `button[data-ref-chip]` / `[data-presented-*]` |
|
|
53
|
+
| 用户气泡 | `[data-chat-flow-kind="user"]` |
|
|
54
|
+
| 首屏标题 / 预览角标 | `[class*="_headline"]` / `[class*="_previewBadge"]` |
|
|
55
|
+
|
|
56
|
+
同时把 `installGuarded` 从「挂载时查一次」升级为 **MutationObserver**:懒挂载的面板与
|
|
57
|
+
晚出现的行也能等到样式,不再有「刷新一下才生效」这一类问题。
|
|
58
|
+
|
|
59
|
+
### 这一版的取舍(明确不做)
|
|
60
|
+
|
|
61
|
+
下列面在 0.2.0 里**没有语义钩子**,只有每次构建都会变的类哈希,因此不再覆盖:
|
|
62
|
+
|
|
63
|
+
- 侧栏外壳的玻璃与折射、应用外框、标题栏悬停胶囊与中/EN 切换定位、光标高光跟随、
|
|
64
|
+
会话行/项目行样式、settings 与子代理面板的内部样式。
|
|
65
|
+
|
|
66
|
+
代价是视觉上少两块(侧栏、外框),换来的是一条规则:**产品更新不需要改主题**。
|
|
67
|
+
|
|
68
|
+
2.0.90 那套写死哈希的实现留在 git 历史里,需要时用
|
|
69
|
+
`git show 193d691:lib/client.js > lib/client.js` 取回——**不要把哈希版当回退方案**:
|
|
70
|
+
它的锚点(`.wSkVaW_*`、`.hHd-Xa_*`、`.YDXeBa_*`…)在当前 0.2.0 产品里**全部 0 命中**,
|
|
71
|
+
拿回来同样是没有样式的(实测)。
|
|
42
72
|
另有几行开关与选项:
|
|
43
73
|
|
|
44
74
|
- **背景方式**(`backgroundMode`,默认 `classic`;2.0.73+):一行四选,**切换即时生效、不用刷新页面**。
|
|
45
|
-
- **① 主色+纯白+近白**(`classic
|
|
75
|
+
- **① 主色+纯白+近白**(`classic`,**默认**;2.0.90 起):1.43.11 那套(软主色 + 纯白 + 近白),按钮与背景同一色系、没有第二种色相。2.0.83 曾把默认改成 `bold`,2.0.90 按用户要求改回——默认就是这套「主色 + 纯白 + 近白」;
|
|
46
76
|
- **② 主色+纯白**(`white`):同一软主色 + 纯白。着色器三个 uniform 里第三个复用白色(深色复用该族的近黑),所以**只有两个颜色参与**;
|
|
47
77
|
- **③ 自选背景**(`custom`;2.0.76 起的分工见「[插件商城适配](#插件商城适配与壁纸--侧栏插件共存)」):**我们这层完全不画**——流体/粒子画布整体卸载,主题自己的 per-colour 底色也按**选择器**让位(带 `:not([data-dshome-bg=custom])`,不是拿 `!important` 对打),深色蒙版只用在你自己填的图片上。**背景到底是谁的**:装了 `dsh-plugin-wallpaper-engine` 且它正在渲染时**连纯白都不画**,背景交给它;没有它时是**纯白(浅色)/ 纯黑(深色)**。**颜色(蓝/绿/红)只驱动按钮与品牌 token**,不参与背景。想放自己的图就填**图片 URL / 任意 CSS 背景值**,或点「桌面壁纸」(写入 `desktop`,由宿主端读本机壁纸,见隐私一节);不合法的值不会白屏;
|
|
48
78
|
- **浓三色**(`bold`):1.43.12 的三浓色,保留可选(用户要求先留着)。
|
|
49
79
|
- **动态背景(流体)**(`ambientBackground`,默认开;2.0.75+):关掉后**不挂载 WebGL2 流体,也不回落到粒子**——不是把它藏起来(藏起来的画布照样在算),而是根本不创建,GPU 占用归零,背景只剩静态配色。集成显卡把流体画成方块、或风扇被它拉满时,关这个。
|
|
50
80
|
- **流体跟随笔刷**(`fluidBrush`,默认关):开启后光标才把速度写进流场、拖出尾迹;**改完刷新页面生效**。
|
|
51
81
|
- **玻璃风格**(`glassStyle`,默认 `液态`):
|
|
52
|
-
- **液态**(1.43.0+):Apple Liquid Glass 方向——填充降到 `rgb(255 255 255 / .14)`、顶部光泽降到 `.07`,背板链改为靠 `saturate(1.75)` 让身后颜色发亮,共用的 `feDisplacementMap` 走更大的 scale(104,白磨砂仍是 60),边框上再跑一圈自走的 `conic-gradient` 高光(`@property` 注册的 `<angle
|
|
82
|
+
- **液态**(1.43.0+):Apple Liquid Glass 方向——填充降到 `rgb(255 255 255 / .14)`、顶部光泽降到 `.07`,背板链改为靠 `saturate(1.75)` 让身后颜色发亮,共用的 `feDisplacementMap` 走更大的 scale(104,白磨砂仍是 60),边框上再跑一圈自走的 `conic-gradient` 高光(`@property` 注册的 `<angle>`,与鼠标无关)。上玻璃的有四处**面板**:**侧边栏外壳 / 对话框 / 标题栏(悬停)/ 用户消息气泡**;另有第五处**浮层**见下一条;
|
|
83
|
+
- **浮层菜单也上玻璃(2.0.90+)**:产品把下拉菜单 portal 到所有玻璃面板之外,菜单自带的材质又铺了一层不透明的 `rgba(248,249,250,.58)`,所以液态会话里**菜单是唯一一片不透光的白**(代理预设 / 模型 / 权限 / 会话行菜单都算)。这些菜单由 `MENU_GLASS_CSS` 单独接管,锚在产品自己的材质钩子 `[data-menu-material]` 上——**只加玻璃身份,不重画材质**:外圈是主题的 `--dshome-liquid-shadow` + `--dshome-liquid-ring` 内描边,圆角用 `--dsw-radius-lg`,菜单里的填充与可读性、以及产品自带的 `blur(40px) saturate(1.5)` 背板全部原样保留。白磨砂档位下只加一圈 `--dshome-glass-ring`,两套配方的其余样式照旧互不干扰;
|
|
53
84
|
- **白磨砂**:1.42.x 那套白磨砂 + 蓝变光边框,**样式逐像素不变**(新配方整块挂在 `html[data-dshome-glass="liquid"]` 下,已用 1991 个元素的计算样式签名验证过:切到白磨砂时新样式表贡献为零)。**唯一的例外是悬停倾斜**:它自 2.0.82 起两套配方都生效(原先只在液态下挂),运动与配方无关——见「已知产品侧缺陷」一节;
|
|
54
85
|
|
|
55
86
|
### 高峰判定(1.37.0+)
|
|
@@ -179,7 +210,33 @@ card=700/757 … under=div.wSkVaW_widthHandle hovCard=0 ← 倾斜解除、
|
|
|
179
210
|
|
|
180
211
|
**Windows 上不要用 `inject:`**:`inject:D:\...` 会因为盘符里的 `:` 被 pnpm 当成 registry 协议分隔符,去 registry 找一个名叫 `inject:D:\...` 的包并拿到 404。Windows 一律用 `file:`。
|
|
181
212
|
|
|
182
|
-
|
|
213
|
+
## 安装方式
|
|
214
|
+
|
|
215
|
+
### 从 npm(推荐)
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
dsh plugin --profile web add dsh-deepseek-style-theme
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
> **这是唯一计入 npm 下载量的安装方式。** 下面几条(`file:` / `github:` / 本地 tgz / 任意 git 源)
|
|
222
|
+
> 都绕开 registry,装多少次都不会让 npm 的统计动一下——邀请别人试用时请发上面这一条。
|
|
223
|
+
> 它同时是最省事的:不走 `git clone`(绕开代理 / 证书问题),也不依赖 GitHub Release 资产
|
|
224
|
+
> (绕开 `releases/latest` 那类 URL 腐烂)。
|
|
225
|
+
|
|
226
|
+
> **关于包名**
|
|
227
|
+
> 包名是**无 scope** 的 `dsh-deepseek-style-theme`。这是刻意的:`@dsh-external` 这个 scope 在 npm 上属于别人(`wulei1107`,下面挂着 `@dsh-external/dsh-vision-toolkit`),不是本项目的命名空间,也发不进去。
|
|
228
|
+
>
|
|
229
|
+
> **改名的三个引用点必须同时对齐**,缺一个都会静默失效,且失效方式各不相同:
|
|
230
|
+
>
|
|
231
|
+
> | 位置 | 不对齐的后果 |
|
|
232
|
+
> |---|---|
|
|
233
|
+
> | `package.json` 的 `name` | 包装不进去 / 目录名不符 |
|
|
234
|
+
> | `cordis.patch.yml` 的 `name:` | Loader 解析不到模块,**插件装配失败** |
|
|
235
|
+
> | `lib/client.js` 里 `__ModuleLoader__.load` 的 `id` | bundle 加载成功却什么都没注册,**客户端半边失效**(1.43.1 的缺陷) |
|
|
236
|
+
>
|
|
237
|
+
> 自查:`grep '@dsh-external' lib/` 应当**一处都不命中**;命中即漏改(有意保留的兼容位置除外)。
|
|
238
|
+
|
|
239
|
+
### 从本地源码(开发模式,不计入下载量)
|
|
183
240
|
|
|
184
241
|
```bash
|
|
185
242
|
# 源码放哪个稳定目录都行(file: 会把它拷进 profile)
|
|
@@ -188,7 +245,7 @@ dsh plugin --profile web add file:D:\plugins\dsh-deepseek-style-theme
|
|
|
188
245
|
|
|
189
246
|
> 不要 `cd` 进插件源码再执行 `add .`——`.` 会展开成调用目录的绝对路径,落成 `link:`,于是踩中上面的坑。
|
|
190
247
|
|
|
191
|
-
### 从 GitHub
|
|
248
|
+
### 从 GitHub(本仓库,不计入下载量)
|
|
192
249
|
|
|
193
250
|
```bash
|
|
194
251
|
dsh plugin --profile web add github:Lichtspur/deepseek-style-theme
|
|
@@ -198,7 +255,7 @@ dsh plugin --profile web add github:Lichtspur/deepseek-style-theme
|
|
|
198
255
|
|
|
199
256
|
> **代理 / 企业网络**:`github:` 安装要靠 pnpm 调 `git clone`,在带 TLS 中间人证书审计的网络里会以证书错误失败——Windows 上是 `schannel: AcquireCredentialsHandle failed: SEC_E_NO_CREDENTIALS (0x8009030e)`,改用 OpenSSL 后端后变成 `unable to get local issuer certificate (20)`。报错信息只看得到 TLS,很容易误判成插件的问题。这类环境请直接用下面的 **tgz** 或本地目录安装。
|
|
200
257
|
|
|
201
|
-
### 从本地 tgz(推荐用于代理 /
|
|
258
|
+
### 从本地 tgz(推荐用于代理 / 离线环境,不计入下载量)
|
|
202
259
|
|
|
203
260
|
```bash
|
|
204
261
|
dsh plugin --profile web add ./releases/dsh-deepseek-style-theme-1.43.1.tgz
|
|
@@ -208,37 +265,13 @@ dsh plugin --profile web add ./releases/dsh-deepseek-style-theme-1.43.1.tgz
|
|
|
208
265
|
归档文件名由 `package.json` 的 `name` 与 `version` 决定(`pnpm pack` / `npm pack` 均如此),
|
|
209
266
|
因此 1.44.0 起是 `dsh-deepseek-style-theme-<版本>.tgz`。
|
|
210
267
|
|
|
211
|
-
###
|
|
212
|
-
|
|
213
|
-
> ⚠️ **暂时不要用这一条。** npm 上的 `latest` 仍是 **1.43.1**,而那一版带着一个致命缺陷:客户端 bundle 的注册 id 还是旧 scope 的 `@dsh-external/dsh-deepseek-style-theme`,而宿主按包名 `dsh-deepseek-style-theme` 要求它自我注册,于是 **bundle 加载成功却什么都没注册**,主题的整个客户端半边失效。1.43.3 已修复。
|
|
214
|
-
>
|
|
215
|
-
> 在 1.43.3 发到 npm 之前,请用上面的 **tgz 别名地址** 或 `github:` 安装。
|
|
268
|
+
### 从任意 Git 仓库(不计入下载量)
|
|
216
269
|
|
|
217
270
|
```bash
|
|
218
|
-
# 修复版发到 npm 之后可用;在那之前用 tgz 别名地址
|
|
219
|
-
dsh plugin --profile web add dsh-deepseek-style-theme
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
> 包名是**无 scope** 的 `dsh-deepseek-style-theme`。这是刻意的:`@dsh-external` 这个 scope 在 npm 上属于别人(`wulei1107`,下面挂着 `@dsh-external/dsh-vision-toolkit`),不是本项目的命名空间,也发不进去。
|
|
223
|
-
>
|
|
224
|
-
> **改名的三个引用点必须同时对齐**,缺一个都会静默失效,且失效方式各不相同:
|
|
225
|
-
>
|
|
226
|
-
> | 位置 | 不对齐的后果 |
|
|
227
|
-
> |---|---|
|
|
228
|
-
> | `package.json` 的 `name` | 包装不进去 / 目录名不符 |
|
|
229
|
-
> | `cordis.patch.yml` 的 `name:` | Loader 解析不到模块,**插件装配失败** |
|
|
230
|
-
> | `lib/client.js` 里 `__ModuleLoader__.load` 的 `id` | bundle 加载成功却什么都没注册,**客户端半边失效**(1.43.1 的缺陷) |
|
|
231
|
-
>
|
|
232
|
-
> 自查:`grep '@dsh-external' lib/` 应当**一处都不命中**;命中即漏改(有意保留的兼容位置除外)。
|
|
233
|
-
>
|
|
234
|
-
> npm 是最省事的安装源:不走 `git clone`(绕开代理/证书问题),也不依赖 GitHub Release 资产(绕开 `releases/latest` 那类 URL 腐烂)。
|
|
235
|
-
|
|
236
|
-
```bash
|
|
237
|
-
# 或任意 git 仓库地址(若该仓库未提交构建产物,
|
|
238
|
-
# 则需其提供 prepare 脚本并按 pnpm 提示在
|
|
239
|
-
# ~/.dsh/profiles/<name>/pnpm-workspace.yaml 的 allowBuilds 中授权后重跑)
|
|
240
271
|
dsh plugin --profile web add <git-url>
|
|
241
272
|
```
|
|
273
|
+
> 若该仓库未提交构建产物,则需其提供 `prepare` 脚本;按 pnpm 提示在
|
|
274
|
+
> `~/.dsh/profiles/<name>/pnpm-workspace.yaml` 的 `allowBuilds` 中授权后重跑。
|
|
242
275
|
|
|
243
276
|
### 依赖是怎么解析的(排错用)
|
|
244
277
|
|
|
@@ -246,48 +279,12 @@ dsh plugin --profile web add <git-url>
|
|
|
246
279
|
- 它失败时**不会**再拖垮整棵插件树:`lib/index.js` 用受保护的动态 `import()` 加载 schemastery,拿不到就只丢一行警告、DSTT 模式不再持久化,主题其余部分照常工作(1.41.0 起)。
|
|
247
280
|
- 不要指望 `.dsh-module-fallback/node_modules` 帮忙补依赖:在**从未装过依赖**的 profile 里它一直是空的,bundle 实际是从 CLI 安装目录(如全局 npm 的 `node_modules`)解析的。所以插件依赖必须真的装在 profile 里。
|
|
248
281
|
|
|
249
|
-
## 模型目录同步
|
|
250
|
-
|
|
251
|
-
DSH 的官方 DeepSeek 路由是**声明式**的:`listModels()` 只返回配置里的条目,**从不探测网关**(官方 README:「默认目录预注册…不探测网关可用性」)。所以接口上新出了模型、或下线了某个 id,选择器都不会自己变。本插件在**每次插件启动**(`dsh web` 启动 / 插件重载)时补这一次探测:
|
|
252
|
-
|
|
253
|
-
1. 读 `llm-deepseek` 设置段的 `baseURL` / `apiKeyEnv`(自定义网关同样正确);
|
|
254
|
-
2. `baseURL` 未配置时,按官方适配器的顺序回落:`launchEnvironment` 的 `$DEEPSEEK_BASE_URL` → 公开端点 `https://api.deepseek.com`;
|
|
255
|
-
3. 按官方适配器的方式经 `credentials` 解析该密钥(缺失则该步跳过);
|
|
256
|
-
4. `GET {baseURL}/models`(5 秒超时),取接口声明的 id 列表(保持接口顺序);
|
|
257
|
-
5. 与当前目录比对并决定是否写入。
|
|
258
|
-
|
|
259
|
-
### 写入语义(1.41.0 起收紧)
|
|
260
|
-
|
|
261
|
-
- **只增补已知能力位的 id**:接口只给 id,给不了 `inputModalities`、`systemPromptUpdate`、上下文窗口。已存在的条目**原样保留**(用户的改动不会被覆盖);新 id 只有在内置映射表里有(`deepseek-flash`、`deepseek-v4-pro`)才会被采纳,**映射表外的 id 只报告、不采纳**——凭空造一个 `inputModalities: ["text"]` 的条目会把一个视觉模型悄悄降级成纯文本,这是 1.40.0 的缺陷。
|
|
262
|
-
- **只有「接口声明的每个 id 都能描述」时才整表对齐**(`auto`):此时接口没列出的存量 id 会被移除,且**在日志里逐个点名**。官方路由只声明几个 DeepSeek id;若 `baseURL` 指向聚合网关,它会声明整个模型库,此时整表对齐会把你的目录替换成几百条无关条目——所以这种「看起来不是官方目录」的回答会退化成**只追加、不删除**并打一行警告。
|
|
263
|
-
- **并发安全**:写入带 `expectedRevision`。你在设置页同时改了模型配置的话,你的改动赢,这次启动的同步直接放弃(下次启动再试)。
|
|
264
|
-
- **完全 best-effort**:没有 settings / 没有凭据 / 网关不可达 / 服务改名 / 版本冲突等任何异常都不会抛出,绝不影响主题本身,也绝不会写坏模型目录。
|
|
265
|
-
- **只在需要时写入**:目录一致时不产生任何设置写入事件。
|
|
266
|
-
|
|
267
|
-
### 开关
|
|
268
|
-
|
|
269
|
-
本插件自己的设置段提供 `catalogSync`(默认 `auto`):
|
|
270
|
-
|
|
271
|
-
```yaml
|
|
272
|
-
deepseek-style-theme:
|
|
273
|
-
mode: peakvalley-redblue
|
|
274
|
-
catalogSync: auto # auto | add | off
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
| 值 | 行为 |
|
|
278
|
-
|---|---|
|
|
279
|
-
| `auto`(默认) | 可描述时整表对齐(含移除接口不再列出的 id,并记日志);否则只追加 |
|
|
280
|
-
| `add` | **永不删除**,只追加新增的已知 id |
|
|
281
|
-
| `off` | 只探测并在日志里报告漂移,**不写任何设置** |
|
|
282
|
-
|
|
283
|
-
想彻底关掉:设 `catalogSync: off`(仍会探测一次并打日志),或停用本插件。已写入的 `llm-deepseek.models` 段可自行删掉,DSH 会回落到内置默认目录。
|
|
284
|
-
|
|
285
282
|
## 必要权限
|
|
286
283
|
|
|
287
284
|
- **安装期**:需要修改 web profile(`~/.dsh/profiles/web/` 的 `package.json`、`dsh.profile.bundles` 装配列表与 `node_modules`);Git 安装还需按上文授权 pnpm 执行构建脚本。
|
|
288
285
|
- **运行时(DSH 审批/沙箱)**:**不需要任何额外权限**——不注册工具、不执行模型调用、不请求审批或沙箱提升。它只是纯前端皮肤 + 一个受限 RPC 通道。
|
|
289
|
-
-
|
|
290
|
-
-
|
|
286
|
+
- **出网动作:没有**。2.1.90 起本插件不发起任何外部请求——原先"插件启动时向端点同步一次模型目录"的那一条,已随该功能一并移除。
|
|
287
|
+
- **系统级副作用**:交付文件卡片的操作菜单有四个动作。「打开文件」与「打开所在文件夹」**优先走官方通路** `session.openWorkspacePath({ path })` / `({ path, action: 'reveal' })` —— 宿主侧自己校验路径、解析工作区映射,拿不到已验证映射时抛错而不是猜。「复制路径」纯前端写剪贴板,不经过宿主端。只有在官方这条远程不存在时(旧内核),前两者才回落到本插件自己的私有通道 `dshome/file.open`(Windows `Start-Process`、macOS `open`、Linux `xdg-open`)与 `dshome/file.reveal`(Windows `explorer /select`、macOS `open -R`、Linux 打开所在目录),那条通道同样只接受本机绝对路径、走同一套围栏。**「打开工作区目录」已在 2.1.90 移除**:那个手势改用官方的 open-in-app,本插件不再自己开文件管理器。
|
|
291
288
|
- **私有 RPC 通道的围栏**(1.41.0 起与 dsh 核心 `/api` 同一套判定):只接受
|
|
292
289
|
1. **回环对端**(`127.0.0.1` / `::1`)——该通道一直如此;
|
|
293
290
|
2. `Host` 为回环权威(`127.x` / `[::1]` / `localhost`),挡掉 DNS rebinding;
|
|
@@ -296,7 +293,7 @@ deepseek-style-theme:
|
|
|
296
293
|
5. `payload.path` 必须是**本机绝对路径**:相对路径、含 NUL、UNC(`\\host\share`、`//host/share`)一律拒绝。UNC 会让 Windows 向该主机做认证,可被用来外带 NTLM 哈希。
|
|
297
294
|
- **数据可见性**:客户端读取会话列表元数据(标题、运行状态、token 用量)仅用于页内展示「运行中子代理」面板,不上传任何外部服务器;唯一的网络跳转是点击品牌标识时打开 `deepseek.com`(显式用户操作)。宿主端的唯一请求是上一条所述的 `GET {baseURL}/models`,只发往你配置的 DeepSeek 端点,不携带会话内容。
|
|
298
295
|
- **桌面壁纸(2.0.75+,只在显式选择时触发)**:只有当你在 **③ 自选背景**里把输入框填成 `desktop`(或点「桌面壁纸」按钮)时,宿主端才读一次本机壁纸——优先 Windows 的 `TranscodedWallpaper`(当前实际显示的那张),退回注册表 `HKCU\Control Panel\Desktop\WallPaper`,再退回注册表的纯色值——并把图片经**同源围栏下的 GET 子路径**发给本页当 CSS 背景。该端点**不接受任何输入**(没有路径参数、没有查询串),所以它能供出的永远只有宿主自己解析到的那张图;响应带 `Cache-Control: no-store`,壁纸换了刷新即见。**图片只在本机回环上传输,不上传、不缓存、不落盘**,会话记录里也不会出现它的内容。网页本身没有任何 API 能访问系统壁纸,所以这一步只能由宿主端做。留空**不会**触发它(留空 = 纯白/纯黑,或让位给壁纸引擎)。
|
|
299
|
-
- **配置落盘**:DSTT
|
|
296
|
+
- **配置落盘**:DSTT 主题模式写入 profile 的 `settings.yaml`(`deepseek-style-theme` 段)。
|
|
300
297
|
|
|
301
298
|
## 卸载
|
|
302
299
|
|
|
@@ -321,8 +318,6 @@ dsh plugin --profile web remove dsh-deepseek-style-theme
|
|
|
321
318
|
| `bg-recipes-smoke.mjs` | 客户端源码层的数据与契约断言(2.0.73+,随每版增补):① 必须含纯白 + 近白、② 只有两个颜色参与、`bold` 浅色无 `#FFFFFF`、③ 的基底/让位规则与选择器守卫、壁纸引擎标记与「提示而非自动切换」、桌面壁纸端点与 `WallpaperStyle` 映射、`darkSync` 作用域、两条反引号守卫(整表扫描)、发送按钮 hover 不再位移、流场 16F 探测与回退、悬停倾斜的抬升 1.01 与 `TILT_CONTROLS` 不含文字录入、进入控件时冻结而非释放、释放只在离开卡片矩形、两套玻璃配方都生效(2.0.82)、横向裁切覆盖消息列/对话框/转写区、**8 个 CSS 契约名必须已声明 + 模板插值不得早于 const 声明(2.0.84:`ATTR` 被误删、`USER_BUBBLE` 提前插值都属于这一类,`node --check` 看不见)**(73 项) | `node tools/bg-recipes-smoke.mjs [lib/client.js]` |
|
|
322
319
|
| `parse-smoke.mjs` | **每个文件都必须能解析**(2.0.84+):`lib/` 与 `tools/` 下每个 `.js/.mjs` 过一遍 `node --check`。看着多余,其实不是——已经有三次"注释里的反引号把模板字符串提前结束"的事故(`lib/client.js` 两次、`tools/gui-probe.mjs` 一次,后者 Node 的报错还不带文件名)。纯解析门,不做 lint | `node tools/parse-smoke.mjs` |
|
|
323
320
|
| `fluid-precision-test.mjs` | **流场存储精度对照实验**(2.0.81+):把 `lib/client.js` 里的真实 `VERTEX_SHADER` / `FLOW_SHADER` 抠出来,在无头 Chrome 里对同一场景各跑 240 步,分别存 RGBA8 与 RGBA16F,读回统计"取值分布 / 落在 1/255 网格上的层级 / max / mean",并判定 16F 是否真的摆脱了量化(5 项)。**需要 Chromium 系浏览器**,且 Chrome 在受限进程里起不来,请从普通终端跑 | `node tools/fluid-precision-test.mjs [--chrome <路径>] [--keep]` |
|
|
324
|
-
| `catalog-sync-smoke.mjs` | 模型目录同步的全部分支:一致 / 可描述漂移 / 聚合网关目录 / 只追加 / `off` / baseURL 解析顺序 / 无密钥 / 端点故障 / 命名空间未就绪 / 版本冲突(27 项检查,全用替身,无需凭据与网络) | `node tools/catalog-sync-smoke.mjs [已安装的 lib/index.js]` |
|
|
325
|
-
| `catalog-sync-live.mjs` | 用**真实端点 + 真实密钥**跑一遍同步:A 场景(目录已一致)应 0 写入,B 场景(人为制造漂移)应恰好 1 次写入并复原条目;写入被拦下,不落盘 | `DEEPSEEK_API_KEY=... node tools/catalog-sync-live.mjs [--profile web] [--drift-id deepseek-v4-pro]` |
|
|
326
321
|
| `gui-probe.mjs` | 无头浏览器直连 CDP 量实时页面:主题注入了哪些样式与补丁块、标题栏几何与子元素 flex order、标题栏下方带边框元素与**逐行亮度扫描**(1px 横线会表现为数值尖峰)、各胶囊的 `corner-shape`、中/E 悬停前后、对话/轨迹标签、`--models` 时的模型选择器选项、`--file-card` 时合成两张交付表面并验证左键/右键菜单(条目、定位、复制提示、预览转发、选中后关闭)、`--deliverables` 时报告真实页面上两处交付表面的存在情况与点击后果、`--ambient` 时报告背景到底是流体还是粒子回落、折射是否挂上、玻璃配方是否生效,并悬停一次验证 `--dshome-spec-x/y` 真的在写、`--glass` 时逐个报告玻璃面的计算样式与 `::before`/`::after` 是否已被产品占用、`--messages` 时报告气泡的类名分组、祖先对齐链与 `data-chat-flow-kind` 取值表(气泡的 role 判定就靠它)、`--shot <目录>` 时落一张全页截图,`--pre <文件>` 可在截图前先跑一段页面侧表达式(`--pre-arg` 作为 `window.__preArg` 传入),用于拍出「指定玻璃配方 × 指定明暗」的矩阵 | 见下 |
|
|
327
322
|
|
|
328
323
|
```bash
|
|
@@ -345,13 +340,11 @@ node tools/gui-probe.mjs --models --file-card
|
|
|
345
340
|
├── releases/ # 发布产物(tgz 归档)
|
|
346
341
|
├── tools/ # 自测工具(不随包发布)
|
|
347
342
|
│ ├── bridge-smoke.mjs # 宿主端私有 RPC 通道冒烟测试
|
|
348
|
-
│ ├── catalog-sync-smoke.mjs # 模型目录同步冒烟测试(六种分支)
|
|
349
|
-
│ ├── catalog-sync-live.mjs # 同步的真端点/真密钥校验(写入不落盘)
|
|
350
343
|
│ ├── symptom-probe.js # 贴进控制台的现场探针(环境报告 + 采样 + 逐帧 diff + 开关)
|
|
351
344
|
│ ├── symptom-probe-selftest.mjs # 上面那份探针的自测(合成页面 + CDP 真实鼠标)
|
|
352
345
|
│ └── gui-probe.mjs # 实时页面的无头浏览器探测与像素扫描
|
|
353
346
|
└── lib/
|
|
354
|
-
|
|
347
|
+
├── index.js # host 端:交付文件 RPC、DSTT 设置、桌面壁纸
|
|
355
348
|
└── client.js # 主题 client 端(含流体背景、液态玻璃、交付文件卡片菜单)
|
|
356
349
|
```
|
|
357
350
|
|