🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

桌面背景图 diancangdu/dsh-desktop-background

DeepSeek Harness
diancangdu36 天前有提交已提供中文文档扫描:含敏感能力

给桌面窗口换背景图,右下角实时调参

29.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add diancangdu/dsh-desktop-background
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · vision
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 36 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)
查看扫描证据(共 5 处,展示前 5 条)
  • 写入剪贴板
    client-script.js:286
    navigator.clipboard.writeText(text).then(done, done);
  • 写入本地文件
    index.js:32
    appendFileSync(LOG, JSON.stringify({ ts: new Date().toISOString(), ...entry }) + '\n', 'utf8');
  • 读取本地文件
    index.js:62
    if (!existsSync(path)) return { uri: null, reason: 'not-found' };
  • 读取本地文件
    index.js:63
    const bytes = readFileSync(path);
  • 读取本地文件
    index.js:265
    const source = readFileSync(file, 'utf8');
扫描于 2026/10/31(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 桌面窗口换背景图
  • 右下角实时调参
  • 零网络请求

DeepSeek Harness 原生插件:给桌面窗口加背景图,带实时调节面板;零网络请求

README

由 DeepSeek 最新模型翻译生成
dsh-desktop-background 给 DeepSeek Harness(DSH)桌面窗口加背景图的原生插件,附带右下角实时调参按钮。 零外部依赖、零网络请求。 当前版本:v1.0.0 —— 已在实际的 DSH 桌面端验证有效。变更历史见 CHANGELOG.md。 为什么需要它(而不是随便找个主题插件) DSH 桌面窗口的 index.html 不经过宿主 web server: - Electron 主进程把 dsh-app://app/ 的 /、/index.html、/assets/ 交给一个直接从磁盘读 dsh-web-frontend/dist/index.html 的函数,只替换一句 __DSH_BOOT_READY__ - ⇒ webServer.tapIndex() 的变换在桌面窗口永不执行 - ⇒ 凡是把样式全部交给 tapIndex 注入的主题插件,在桌面窗口都会静默失效:设置卡片照常出现(那是纯客户端 slot 注册),但界面毫无变化 能到达桌面窗口的只有两条路: 1. 结构化 index 注入行 —— 桌面窗口的 boot payload 就是 injections: ctx.webServer.collectIndexInjections(),而页面侧解释器里有 case "style" 与 case "script"
展开完整文档(README 剩余 1 节)
dsh-desktop-background

给 DeepSeek Harness(DSH)桌面窗口加背景图的原生插件,附带右下角实时调参按钮。

零外部依赖、零网络请求。

当前版本:v1.0.0 —— 已在实际的 DSH 桌面端验证有效。变更历史见 CHANGELOG.md。

为什么需要它(而不是随便找个主题插件)

DSH 桌面窗口的 index.html 不经过宿主 web server:

- Electron 主进程把 dsh-app://app/ 的 /、/index.html、/assets/ 交给一个直接从磁盘读 dsh-web-frontend/dist/index.html 的函数,只替换一句 __DSH_BOOT_READY__
- ⇒ webServer.tapIndex() 的变换在桌面窗口永不执行
- ⇒ 凡是把样式全部交给 tapIndex 注入的主题插件,在桌面窗口都会静默失效:设置卡片照常出现(那是纯客户端 slot 注册),但界面毫无变化

能到达桌面窗口的只有两条路:

1. 结构化 index 注入行 —— 桌面窗口的 boot payload 就是 injections: ctx.webServer.collectIndexInjections(),而页面侧解释器里有 case "style" 与 case "script"
2. 客户端插件自己注入

本插件走第 1 条,并且把背景图内联成 data URI,于是完全不依赖路由 / 鉴权 cookie / CSP / 任何可能在桌面窗口里失败的请求。

安装

把插件目录放到 profile 下,然后在 profile 的 cordis.patch.yml 里加一个 insert:

- insert:
- id: desktop-background
name: './desktop-background/index.js'
config:
lightImage: 'D:/pictures/light.jpg'
darkImage: 'D:/pictures/dark.jpg'
maskOpacity: 0.30
surfaceOpacity: 0.08

⚠️ name 必须指向具体文件(./desktop-background/index.js)。写成目录会触发 Node ESM 的 ERR_UNSUPPORTED_DIR_IMPORT,插件静默不加载、没有任何报错。

改完重启 DSH。profile 配置只在进程启动时读一次,没有热重载。

配置

| 键 | 默认 | 说明 |
| lightImage | — | 浅色模式的背景图(绝对路径,建议 jpg ≤ 1920×1080) |
| darkImage | — | 深色模式的背景图 |
| image | — | 只给一张时的回退值 |
| maskOpacity | 0.35 | 压在图上的一层暗纱,0 = 原图,1 = 全遮。用来压亮度保可读性 |
| surfaceOpacity | 0.10 | 其余面板的不透明度。想背景更明显就调小这个 |
| inputOpacity | 跟随 surfaceOpacity | A 输入框(composer 输入框) |
| todoOpacity | 跟随 surfaceOpacity | B 待办框条(输入框上方那条任务进度面板) |
| optionOpacity | 跟随 surfaceOpacity | C 答案选项(提问卡里的选项行) |
| todoScope | precise | B 的作用范围:precise 只影响待办框条 / broad 连同菜单、对话框一起变 |
| optionScope | precise | C 的作用范围:precise 只影响选项行 / broad 连同预设卡、选择器一起变 |

三个分区旋钮不写就跟随 surfaceOpacity,所以不配它们时行为与只有两个旋钮时完全相同。

三处分区是怎么定位的(不是猜的)

| 区域 | 锚点 | 依据 |
| A 输入框 | token --dsw-specific-input-major | composer 用它;提问卡、审批卡、它们的文本行共用同一个 token |
| B 待办框条 | [data-testid="todo-panel"] | 待办面板挂在插槽 conversation.input.dock(输入框上方),自带的稳定属性 |
| C 答案选项 | [data-question-key] | 提问卡根节点带这个属性;选项是 role="radio|checkbox" 的按钮 |

precise 与 broad 的实际差别

precise(默认)把 token 声明在目标元素本身上 —— 只有该元素及其子树看得到新值,所以菜单、对话框、预设卡都不受影响,这才是真正「分开设置」。

broad 把同一份声明提升到 html body,于是所有共用该 token 的表面一起变:

- B 会同时改写 --dsw-specific-menu 和 --dsw-menu-surface-fill 两个名字。⚠️ 这里踩过坑:主题里 --dsw-specific-menu 只是 --dsw-menu-surface-fill 的别名(--dsw-specific-menu: var(--dsw-menu-surface-fill)),而前端外壳里共享的菜单材质直接消费别名背后的真身:

.material { background: var(--dsw-menu-surface-fill) }

只改别名时,真正吃真身的菜单与对话框一动不动 —— 表现为「勾了『同类一起变』却什么都没发生」。
两个都写,菜单与对话框才会跟着变。
- C 改写 --dsw-alias-bg-module-platform,它同时被 agent 预设卡、模型选择器、轨迹视图、快捷键面板、设置页*等约 15 个包消费。

⚠️ 所以 broad 的效果不在你正盯着的那一处(那一处由 precise 规则管,两种模式下长得一样),而在别处的同类表面上。勾上之后,请打开一个菜单或对话框来看效果。

两种模式都已生成为 CSS 规则,broad 那组由 上的属性门控,因此切换范围是实时的。

为什么面板不透明度要单独一个旋钮

DSH 的界面是多层半透明表面叠加(外壳 → 布局 → 会话 → 正文),背景图只能按各层透过率的乘积活下来。实测把所有层都设成 0.45 时,聊天区的像素统计是 (26,26,30) —— 跟没有背景几乎没有区别。所以「暗纱」和「面板」必须是两个独立的值。

侧栏固定为 surfaceOpacity + 0.15。输入框已有独立旋钮,不再叠加旧的 + 0.35。

实时调参

插件同时注入一个 script 行,在右下角放一个圆形按钮。点开是一张调参卡片:

- 五个滑块(暗纱 / 面板 / 输入框 / 待办框条 / 答案选项),拖动立即生效,不用重启
- B、C 各带一个「同类一起变」开关,对应 precise / broad,切换同样实时
- 值存在 localStorage,跨重启保留
- 「复制配置」把当前值输出成可粘贴的 cordis.patch.yml 片段;想固化成默认值就用它
- Ctrl+Alt+B 开合面板

面板只写三个 CSS 变量(--dbg-mask-light / --dbg-mask-dark / --dbg-surface),所有颜色与推导公式都留在宿主样式里 —— 这样不存在两份真值。

不含背景图

仓库里没有任何图片。DSH 是通用宿主,背景图请自备(注意版权)。
maskOpacity 与 surfaceOpacity 的调参不依赖具体图片,换图只要改配置里的路径。

目录

index.js 宿主半侧:读图 → 内联 data URI → 生成样式;推 style + script 两行注入 client-script.js 浏览器半侧:右下角按钮 + 调参卡片(被 index.js 读入后作为 script 行注入)

已知边界

- 只在 DSH 桌面窗口验证过;同样的结构化行在浏览器载体(dsh web 打印的 URL)下也应当生效,因为那条路径两者都会执行
- surfaceOpacity 是对「多层叠加」的近似补偿:DSH 改版增删层级时,可能需要重新调这个值
- 面板的打开/收起状态与调参值存于浏览器 localStorage;换 profile 或清缓存会回到配置文件的默认值
预览分享卡片长什么样 ↓diancangdu/dsh-desktop-background
分享 · DeepSeek Harness Hub
diancangdu/dsh-desktop-background

给桌面窗口换背景图,右下角实时调参

回到顶部