deepseek-harness-background
已验证deepseek-harness-background · v0.4.2 · MIT · Web 界面
Custom background image plugin for the DeepSeek Harness web GUI: upload a local picture or paste an image URL, and render it behind the whole app surface with adjustable opacity, scrim, panel transparency and frosted-glass blur.
安装
dsh plugin add deepseek-harness-background 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
标签
作者
说明文档
DeepSeek Harness Background
English | 中文
一个 DeepSeek Harness Web GUI(dsh web)的自定义背景图片插件:上传一张本地图片,或粘贴一个图片链接,把它绘制在整个应用界面背后,并可调节不透明度、可读性遮罩、面板透明与毛玻璃模糊 —— 全部在设置面板内实时预览、松手自动保存。
外观(固定壁纸层 + 主题自适应遮罩 + 由 --dsw-* 设计 token 驱动的半透明玻璃面板)借鉴了社区 dsh-wallpaper-engine 的实现。
截图
| 首页 | ![]() |
| 会话界面 | ![]() |
| 设置界面 | ![]() |
功能
- 本地上传 —— 从电脑选择 JPG / PNG / WebP / GIF 图片;插件存入 harness home 目录,经同源路由提供(仅当声明的 MIME、探测到的文件签名与扩展名三者一致才被接受)。
- 粘贴 URL —— 输入
http(s)图片链接后回车即可。 - 面板内实时预览 —— 设置行顶部有预览卡:图片 + 遮罩 + 毛玻璃气泡;拖动任意滑块即时重绘,所见即所存。
- 阻尼滑块 —— 比例类滑块按 5% 步进、模糊类按 1/2px 步进吸附;拖动过程只改画面,松手才保存(每次手势一次写入,不再抖动)。
- 五个调节项 —— 壁纸不透明度、可读性遮罩、面板不透明度、毛玻璃模糊、壁纸模糊。
- 填充方式 ——
cover(铺满、裁剪)或contain(完整、留白)。 - 主题自适应遮罩 —— 浅色主题用白色纱帘(把图片提亮保持深色文字对比度),深色主题自动换成黑色纱帘(压暗图片保持浅色文字对比度)。
- 毛玻璃(白名单制) —— 启用背景后,只有以小卡片/小按钮形态悬浮在壁纸上的表面才会变成半透明玻璃(顶部白色高光渐变 +
backdrop-filter):输入框卡片与消息气泡、代码块 / 终端 / diff / 工具 IO 卡 / 技能与 MCP 调用卡与行内代码、agent 任务条及其接管面板(审批 / 提问 / 计划评审)、三个铬件按钮(新会话、输入框加号、回到底部)、「加载更早」历史按钮、标题栏展开的子代理列表面板、侧栏构建徽标,以及首页右上角的「预览版」徽标——每块玻璃面都带完整配方(填充 + 高光 + 模糊),绝无"只透明不磨砂"的残缺面。阅读型表面——对话框、设置界面、菜单、Tooltip、Toast、悬停填充与所有强调色(发送键保持品牌蓝)——一律保留官方不透明样式,保证可读性。模糊半径由「毛玻璃模糊」滑块驱动;「面板不透明度」调至 100% 时白名单表面也恢复官方原样。 - 第三方毛玻璃接口 —— 内置毛玻璃注册表(
window.__DSH_BACKGROUND_GLASS__全局 +dsh-background-glass:ready事件):任何插件都可把自家面板的选择器注册进来,套上与内置表面完全一致的配方——token模式为已使用被覆盖--dsw-*填充的面板补齐高光+模糊链,fill模式连填充一并接管;规则统一挂在data-dsh-bg-glass门控下随玻璃自动开关。消费方零依赖、未安装本插件时优雅降级,本插件卸载时整桥拆除。详见 docs/GLASS_API.zh.md。 - 会话时间线 —— 长会话右缘的 DeepSeek 官网风格滚动导航轨:毛玻璃胶囊上每条用户消息一枚指示刻度;悬停展开为列出全部提问的毛玻璃面板(当前阅读位置品牌蓝高亮);点击跳转到对应消息(平滑滑动:ease-in-out 按距离调速;跳转前先把底部跟随状态移出官方 25px 跟随区,流式增长 / 回合结束不会把动画拽回底部;动画期间滚轮、触控或键盘滚动即时接管,
prefers-reduced-motion下直接定位)。重点书签——展开面板内点击 ★ 标记重点提问(按会话持久化):已标记项在折叠胶囊上显示金色加宽刻度,「★ 只看标记」一键筛选;跳转期间冻结高亮跟踪(消除中途乱跳),被回退撤回的消息自动从轨道剔除(目标解析兼容seq 42/#42/ 中英文动词文案与结构化字段,并识别他人的data-dsh-rewind-hidden节点标记)。折叠态与展开态共用同一高度(零跳变);折叠刻度贴底锚定——最新提问的横杠始终贴住胶囊底缘(与官网一致),且由全量会话历史驱动、不受对话区分页加载进度影响;展开面板的裁切边缘带官方同款 32px 淡化渐变。开启背景毛玻璃后,导航轨与输入框、消息气泡共用同一套玻璃配方(透明度随「面板不透明度」、模糊随「毛玻璃模糊」滑块调节,不比其他表面更重);未开启背景时保持 DeepSeek 官网同款毛玻璃配色。可在设置行内用「会话时间线」开关关闭;若同时安装了第三方 dsh-chat-timeline 插件,本轨道会自动让位避免重叠。 - 持久化到官方设置文档 —— 存于
$DSH_HOME/settings.yaml,跨重启保留。 - 干净卸载 —— 关闭、清除或卸载后完整恢复原背景;插件只移除自己写过的内容。
安装
这是一个标准的 out-of-tree dsh bundle,已发布到 npm:
dsh plugin --profile web add deepseek-harness-background
从本地 checkout 安装(开发用):
dsh plugin --profile web add /path/to/deepseek-harness-background
从源代码检出安装:
pnpm dsh plugin --profile web add /path/to/deepseek-harness-background
或从 git 安装:
dsh plugin --profile web add github:<you>/deepseek-harness-background#<commit>
安装后重启:
dsh --profile web
使用
- 启动 Web UI(
dsh --profile web)并在浏览器打开。 - 打开 设置(左下角)→ 通用 → 找到 自定义背景 一行(与「外观」行同一区域)。
- 上传图片或粘贴 URL —— 背景立即生效,面板顶部的预览卡同步显示。
- 调整控件,滑块均为阻尼步进、松手才保存:
| 控件 | 说明 |
|---|---|
| 不透明度 | 0..100% 图片不透明度(5% 步进);调低让壁纸向表面色淡出。 |
| 遮罩 | 0..95% 图片上方的可读性纱帘(5% 步进),浅色主题白色、深色主题黑色。 |
| 面板不透明度 | 0..100% 表面透明程度(5% 步进);为 100% 时官方面板保持不透明(无玻璃)。 |
| 毛玻璃模糊 | 0..40px 半透明表面上的 backdrop-filter 模糊(1px 步进)。 |
| 壁纸模糊 | 0..60px 壁纸图片本身的模糊(2px 步进)。 |
| 填充方式 | cover(铺满)或 contain(完整)。 |
| 会话时间线 | 会话右侧时间线导航轨的开关(默认开启)。 |
- 点 清除背景 移除背景,恢复默认外观。
原理
- 设置行位于官方「通用」设置分区的
settings.general.item槽中,紧挨「外观」行。控件样式全部使用--dsw-alias-*设计 token(按钮 / 胶囊 / 分段控件 / 滑块轨道与官方 chrome 一致),滑块为原生input[type=range]的 5% / 1–2px 步进 + 松手提交。 - 会话时间线注册进
conversation.input.dock槽位(绑定每会话生命周期),portal 渲染到body。数据按速度优先:host 侧会话投影bgTimeline(见src/projection.ts,完整枚举整个会话的全部用户消息——包括对话区尚未分页加载的早期内容),已加载聊天节点窗口作为兜底;轨道从不驱动对话区的懒加载策略(点击旧消息跳转时才按需补页,与点「加载更早」一致)。折叠态刻度列贴底锚定——最新一条提问的横杠始终贴住胶囊底缘、更早的向顶部裁掉,与官网 ScrollNav 一致;悬停展开则改为跟随阅读位置。书签存于 localStorage(按会话隔离)。官网同款毛玻璃配色仅作为未开背景时的兜底:开启玻璃后(data-dsh-bg-glass)轨道并入插件统一配方——与输入框一致的 token 填充 + 由「毛玻璃模糊」滑块驱动的同一滤镜链。 - 插件自有的 host 路由(
/api/bg-wallpaper/*:settings、upload、image/<id>)负责读写设置与提供上传图片,带同源校验、大小上限、MIME/签名校验与路径穿越防护。使用自定义路由族,是因为 api-proxy 的 settings 白名单不向第三方命名空间开放 settings RPC。 - 背景以
body上一张固定的z-index:-2壁纸层 +z-index:-1遮罩绘制,由data-dsh-bg属性开关;遮罩在注入样式表里按data-ds-dark-theme切换白/黑纱帘。毛玻璃为白名单制:仅对输入/气泡/代码/任务条等白名单表面覆盖--dsw-*surface token,其余表面通过data-dsh-bg-glass门控的显式规则补齐整套配方(填充 + 高光 + 模糊滤镜链):三个 chrome 按钮、「加载更早」历史按钮、composer 坞列家族——agent 任务条(TodoPanel / GoalBar / QueueDock)与接管面板(审批 / 提问 / 计划评审,token 变半透明后由这里补上模糊)、子代理列表弹出层、首页「预览版」徽标、侧栏构建徽章——全部官方 token 与阅读型界面(菜单/对话框/tooltip/toast)保持原样。 - 第三方玻璃注册表(
src/client/glass-registry.ts):客户端 apply 时即在window.__DSH_BACKGROUND_GLASS__发布注册 api 并派发dsh-background-glass:ready;register({ plugin, selectors, mode })按(plugin, mode, selector)三元组幂等登记,把body[data-dsh-bg-glass]门控的显式配方规则合成进独立的<style data-plugin-css>标签;选择器先做结构性校验(禁{} ; @ < > ,与反斜杠、500 字符上限),违规条目逐条警告并丢弃、不影响兄弟条目;fiber dispose 时整桥拆除(样式表、条目、window 键全清)。契约文档见docs/GLASS_API.md/GLASS_API.zh.md,行为由tests/glass-registry.spec.ts锁定。 - 上传文件存放在
$DSH_HOME/deepseek-harness-background/(内容寻址 id)。切换新图片或清除背景时,被替换的旧上传文件会被自动回收,正常使用下目录不会堆积死图片。(例外:上传后从未保存进设置——例如上传后立刻关闭标签页——会留下一个孤儿文件。)关闭 / 卸载后不留残留。
开发
pnpm install # 首次;会运行 prepare(构建)
pnpm run typecheck # tsc
pnpm test # vitest 契约测试
pnpm run build # tsdown:lib/index.js(host)+ lib/client.js(浏览器 bundle)
deepseek-harness-background/ # 插件仓库(包名保留 npm 风格 id)
├── package.json # dsh.bundle.patch + dsh.client.inject 声明
├── cordis.patch.yml # 向 web 插件名册插入 deepseek-harness-background 一行
├── tsdown.config.ts # 官方 clientBundle 预设
├── src/
│ ├── index.ts # host 半部:ui-background 命名空间 + API 路由
│ ├── routes.ts # /api/bg-wallpaper/{settings,upload,image/<id>}
│ ├── schema.ts # host 侧 schemastery schema
│ ├── settings.ts # 两端共享的常量/类型
│ ├── projection.ts # bgTimeline 会话投影(时间线的全量用户消息索引)
│ ├── harness-home.ts # $DSH_HOME / ~/.dsh 解析
│ └── client/
│ ├── index.ts # painter 生命周期 + 设置行注册
│ ├── backdrop.ts # 固定壁纸层 + 遮罩 + 玻璃表面 + 预览变量
│ ├── background-css.ts # 注入的样式表(层、玻璃、明暗遮罩、变量)
│ ├── glass-registry.ts # 第三方毛玻璃注册表(window 桥 + 门控规则合成)
│ ├── timeline.tsx # 会话时间线导航轨(官方 ScrollNav 结构 × 本插件玻璃体系)
│ ├── timeline-css.ts # 时间线样式(dsbt- 前缀,官方度量)
│ ├── SettingsRow.tsx # 通用设置中的设置行(预览卡 + 阻尼滑块)
│ ├── SettingsRow.module.css # 设置行样式(官方 token)
│ ├── settings-client.ts# fetch 传输层(读/写/上传)
│ └── locales.ts # 中/英文案
└── tests/ # 契约测试(schema、routes、apply/painter、设置行)
License
MIT


