dsh-any-background
Đã xác minhdsh-any-background · v0.3.6 · MIT · Giao diện web
Appearance plugin for DeepSeek Harness: custom theme color (PS-style color wheel), background wallpaper with opacity/blur controls, and separate main/settings interface opacity.
Cài đặt
dsh plugin add dsh-any-background Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Thẻ
Tác giả
Readme
dsh-any-background
English | 中文
一个 DeepSeek Harness 外观插件:自定义主题色、背景壁纸(图片 / 视频 / 算法动态生成),以及逐表面的透明度与模糊度控制。兼容 DSH 0.1.5-rc.2 直至 0.2.1-alpha.1,其上所有版本一并放行(官方右侧栏「主题」卡片等界面按宿主是否提供右侧栏注册表扩展点自动启用,缺失时静默跳过)。
截图
自定义主页 · 壁纸与主题色同时生效
主题色选择器 · PS 风格色轮 + 精确 HSL/RGB 输入
分部位透明度与模糊度 · 主背景、侧边栏、卡片、设置面板
背景编辑器 · 图片/视频壁纸支持拖动平移与滚轮缩放
动态生成背景 · 网格渐变 / Shader / 几何图案预设
动态生成背景 · 几何 低多边形模式预览
配置的导出和导入进行分享
功能特性
- PS 风格色轮 — 在色相环上选取色相,在内嵌方形中调整饱和度与明度,实时生成 30+ 个 CSS 设计令牌。
- 精确 HSL / RGB 输入 — 通过数值精确输入颜色,与色轮实时双向同步。
- 智能取色 — 一键从壁纸提取主题色:采样可见区域、量化像素、剔除灰色/近黑/近白,选出现量最大的鲜亮色。视频壁纸自动截帧参与取色。纯客户端完成。
- 吸管取色 — 在壁纸上悬停预览颜色,点击即可选为主题色。
- 背景壁纸 — 上传任意图片作为壁纸,在视口比例的编辑器中拖动平移、滚轮缩放(触屏上单指拖动、双指捏合缩放)。
- 视频壁纸 — 上传视频作为动态壁纸:静音循环播放、刷新不丢失(落盘持久化 + HTTP 流式播放,支持 Range seek);自动截取一帧用于预览、主题色提取与位置编辑参考。
- 位置编辑器 — 图片与视频共用同一套编辑器:拖动平移、滚轮或双指缩放、一键重置;图片与视频的位置状态各自独立保存,互不覆盖。
- 布局模式 — 适应 / 填充 / 拉伸 / 平铺 / 居中五种排布,图片与视频通用;「适应」模式下编辑器提交的构图在窗口缩放、跨屏移动后保持一致。
- 动态生成背景 — 支持网格渐变、Shader、几何图案,可调节扩散范围、色彩强度并锁定种子。
- 分部位界面透明度 — 主背景、侧边栏、卡片面板(含对话框周围的选项框/菜单)、输入框与控件(发送框、Cordis 插件面板)、设置面板、对话文本框、轨迹页、右方侧边栏(或 bettersidebar)、产出物/高亮内容、顶栏选项(Agent Team 面板、后台任务列表与会话头部下拉菜单),以及标题栏(会话顶部那条标题行 + 视图页签)各自独立滑块。
- 分部位界面模糊度 — 每个界面部位可独立调整毛玻璃
backdrop-filter模糊(0–60 px),并通过宿主的稳定选择器为发送框、Cordis 面板与弹出层提供真实背景模糊。 - 产出物 / 高亮内容 — 对话正文里的代码块(含语言顶栏)、行内
code高亮芯片与产出物 chip 共用一支滑块:透明度只调制这些表面原本的背景色(不会在旧背景上再叠一层新色),模糊度给同一层表面加磨砂,壁纸从内容后方透出来。 - 右方侧边栏 / bettersidebar 表面 — 同一对滑块(
panelOpacity/blurs.panel)按宿主环境自动切换目标:未安装 dsh-better-sidebar 时叫「右方侧边栏」,驱动官方右侧栏的表面令牌与毛玻璃模糊(0.1.5-rc.2 至 0.1.7 均适用);安装了 dsh-better-sidebar 时改叫「bettersidebar」,接管其底部工作台面板(官方右侧栏同样生效)。该行现在始终显示。 - 顶栏选项 — 会话头部的下拉浮层获得了独立的透明度 + 模糊滑块:Agent Team 面板、后台任务列表、「用其它应用打开」与「会话日志」菜单、子代理血缘树。由于这些浮层被 portal 到
<body>(与头部 DOM 断开),且 0.1.7 把「用其它应用打开」改成 portal、把会话行菜单改成动态槽位,插件改为在运行时监听稳定的conversation.session.header*槽位锚点来标记当前展开的浮层,不再依赖类名形状。 - 标题栏(会话标题行) — 会话顶部那条标题 / 操作 / 视图页签行终于有了自己的一对滑块。宿主自身不给它任何底色(中心列的底色直接透上来),所以壁纸一起来,标题与页签就直接压在图上、和周围被蒙住的表面割裂。现在它按「区块淡色」作画,配方与对话文本框那张卡一致:材质取插件主背景面的颜色、按本部件自己的透明度上色,读起来是压在列上的一条带,而不是叠上去的第二层颜色;模糊落在该行自己的
backdrop-filter上——它内部没有就地弹出的浮层(头部下拉全是 portal 到body),所以这个 backdrop root 没有代价,也不需要往宿主元素里插衬底层。这一行是运行时认领的:插件从conversation.session.header*槽位锚点向上找到最近的那个<header>再打上自己的类(与卡片、帧同款做法),不猜哈希类名、也不依赖宿主把槽位摆在哪个层级;0.1.7-alpha.1之前宿主把槽位裸挂在会话根上、没有这一行元素,那种宿主上插件什么都不会认领,部件自然无效果。桌面壳(Windows)上这一对滑块同时驱动窗口标题条带:条带的底色与模糊都取本卡片这两个变量,窗口标题区与会话标题行永远一致;原生最小化/最大化/关闭那块改由取色探针报transparent,让 Windows 不画自己的背景,露出的正是条带本身。空会话时宿主把该行标为headerBlank(一条只留 padding 的占位),插件跳过认领。 - 侧边栏「主题」页面(双模式) — 同一套五页(色彩 / 界面 / 字体 / 背景 / 配置)注册到两处:未安装 dsh-better-sidebar 时,通过官方右侧栏的公开扩展点(
sidebarRightTabs+sidebar.right.pane.tab)在官方侧边栏的引导页挂一张「主题」卡片,点开即五页;安装了 dsh-better-sidebar 时,改为在它的侧边栏注册同名页面,官方引导页上的卡片自动撤下,避免重复。两处(加设置面板共三处)共用同一套页面代码与同一份状态,改一处处处同步;外壳按面板宽度自适应,窄面板收紧内边距并回到单列。宿主没有右侧栏扩展点时静默不注册,不影响任何其它功能。 - 对话视图卡片 — 消息列表自动包裹为半透明卡片,轨迹页可整页调节透明度与模糊,让壁纸从内容后方透出来。
- 主题导出 / 导入 — 一键导出为自包含的
dsh-any-theme.json(配置 + 壁纸,视频以 data URL 内嵌),可随时导入还原。 - 外观预设与配置档案 — 六套一键预设(默认 / 毛玻璃 / 极简白 / 暗夜紫 / 赛博 / 暖阳),外加自定义命名档案:随时保存当前观感、随时套回,删除有二次确认保护。
- 壁纸轮换 — 把多张图片加入轮换池(缩略图选择器),按随机或顺序、每次刷新 / 每天 / 每周的频率自动更换;切换时服务端把所选图片复制进当前壁纸槽,导出/导入与取色管线完全不用改。
- 昼夜自动切换 — 指定日间与夜间两套配置,按固定时段或跟随系统深色模式自动切换。
- 自定义字体 — 上传一个 ttf / otf / woff / woff2 字体文件(上限 100 MB),通过
@font-face应用到整个界面的文字;可随时停用或移除。字体按原始字节流式上传并持久化到插件数据目录,代码块仍保持等宽字体。 - 分组文字描边 — 沿用界面页的分组(现为十一组,含顶栏选项与标题栏),为每个分组单独加
-webkit-text-stroke描边:粗细 0–4 px(0 = 关闭),颜色支持自动反色 / 灰 / 黑 / 白 / 主题色 / 自定义。代码块、inline code、图标,以及宿主那类background-clip: text的流光文字(「深度求索中」状态行与轮次过程行)自动豁免——多色语法不会糊成一团,渐变文字也不会被描边压成一坨纯色。 - 强制界面明暗 — 无论主题色明暗如何,都能强制生成亮色/暗色整套令牌;「自动」下配色与字体方向由主题色明度驱动(深色 → 浅字,浅色 → 深字),未选主题色时按壁纸画面亮度判断。
- 文件持久化 — 所有设置保存到文件系统
~/.dsh/.dsh-any-background-data/,不再依赖localStorage。 - 中英双语 — 完整的中英文界面,自动跟随语言设置。
- 主题守护 — 宿主重置主题后自动重新激活自定义主题。
更新日志(只保留最近两个版本)
v0.3.6(「标题栏」卡片接管 Windows 标题条带与原生按钮区,修 issue #23)
- 「标题栏」卡片现在也驱动桌面壳的标题条带:那条条带是
AppFrame.module.css的.frame::before,全宽、高度正好等于--dsh-windows-titlebar-height,此前它按宿主的侧栏令牌上色、完全不归插件管——于是「侧栏」滑杆一动,窗口标题区就跟着变透明,标题与「应用 / 编辑」菜单栏直接压在裸壁纸上(issue #23 现象一)。现在条带的底色就是本卡片的材质在该卡片透明度下的取值,模糊取同一份模糊变量:一对滑块同时驱动会话标题行与窗口标题条带,两处不可能再对不上。 - 原生最小化 / 最大化 / 关闭那块不再是自己一块:那块由 Windows 绘制,颜色来自桌面 preload 从一个隐藏探针量到的
--dsw-specific-sidebar-fill(经dsh-desktop:windows-appearance交给主进程setTitleBarOverlay)。v0.3.5 把探针钉回材质实色,于是它和已经会跟随滑杆变淡的条带对不上——浅色模式下是一块偏白的方块。这里换了更彻底的做法:探针直接报transparent,让 Windows 不画这块背景。条带本来就严丝合缝地覆盖这 40 px,于是按钮区露出来的就是条带本身,一整块连续,任何透明度下都自动一致。(中途试过把卡片材质连同 alpha 喂给探针:Windows 会改成给每个按钮各画一块自己的背景,三块半透明叠在条带上,反而变成三块更亮的小方块。)字形颜色仍单独取--dsw-alias-label-primary,保持不透明可读。 - 内容列左上角改成直角:
AppFrame给.centerCol左上角 16 px 圆角并裁掉溢出,帧一旦被清成透明让壁纸透出来,那个缺口就在会话标题行的头几个像素下露出壁纸。插件现在把该角归零(dab-center-flat)。 - 空白会话不再被误认领:无会话 / 空会话时宿主把这一行标成
headerBlank(min-height:0、去掉下边框),只留 padding 与右侧那个角落控件——本意就是一条什么都不画的占位行。插件此前照样认领并给它上底色,于是「本该没有标题栏」的时候凭空冒出一个框。现在认领前先排除该标记,并且认领改为「只有一个持有者」:切到空白态或宿主换掉这一行时,旧类会被摘掉。
v0.3.5(接管卡磨砂不再与宿主抢卡片的定位,修 issue #24)
- 插件不再替宿主的卡片决定
position:审批、计划回顾、问题卡这三张接管卡,宿主在所有受支持版本里都没有给它们定位(逐 tag 核对:三份样式表里position:零命中),所以 v0.3.4 那条.dab-input-frost [data-approval-key]>div{position:relative;isolation:isolate}实际上是拿选择器权重替宿主决定卡片的定位。宿主自己的样式一旦也定位这张卡(issue #24 的桌面壳用position:absolute+ 百分比max-height把它封在视口内),这份决定权就变成一场按优先级分胜负的竞争:同为.dab-takeover量级时插件靠书写顺序取胜,把宿主那张绝对定位的卡变成在流内的卡——座位高度、卡片盒子连同报告里的塌陷症状全跟着变,而这本来就不是插件该决定的东西(两种结果都在本地按同样权重实测过)。磨砂现在改由运行时逐张挂类(dab-takeover-frost):只在模糊值非零时挂,且只对计算样式为static的卡片内联写position:relative(setBlur同款守卫,data-dab-pos-patched标记谁写谁清);宿主自己定位过的卡片一律不动——它自己的定位就是那层衬底的包含块,磨砂照样成立。宿主盒子的定位从此不是本插件参与的比赛。 - 样式表里不再出现接管卡的选择器:配方只剩
.dab-takeover-frost{isolation:isolate}与它的::before,挂类/卸类由applyTakeoverFrost负责,并搭watchParts已有的节流 pass 认领宿主后挂上来的卡片(值签名之外补一个卡片身份,否则审批出现的那一趟会被跳过、卡片一直裸着)。role="dialog"阀沿用PART_BLUR_RULE的老规矩:卡片里真开了对话框就先让出isolation。 - 三张卡上的改动仍全部停留在绘制层:
--dsw-specific-input-major的全局改写保留——宿主里这个令牌只被用作background(逐 tag 核对过,牵动不了任何尺寸)——输入透明度滑块依旧负责淡出,模糊滑块经新路径依旧负责磨砂。 - 新增「标题栏」卡片:会话顶部那条标题 / 操作 / 视图页签行此前没有任何滑块——宿主不给它底色,中心列的底色直接透上来,壁纸一起来这条行就直接压在图上。现在它有自己的透明度 + 模糊:按插件主背景面在该部件透明度下的「区块淡色」作画(与对话文本框那张卡同配方),模糊落在该行自己的
backdrop-filter上;锚点用 CSS 表达(该行是conversation.session.header槽位的直接父节点),宿主在0.1.7-alpha.1之前把该槽位裸挂在根上、规则匹配不到、部件无效果。它是第十一个部件,字体页的描边分组同步新增。 - 桌面端右上角原生窗口按钮区不再被插件的透明度带偏:那块按钮由 Windows 绘制、颜色来自桌面 preload 从
--dsw-specific-sidebar-fill量到的单色,而插件会把该令牌改写成「侧栏」滑杆的 alpha,于是按钮区看起来半透明、发灰(issue #23 现象二)。现在插件只把宿主那个取色探针钉回材质的实色:页面照旧跟随滑杆,按钮区保持宿主自己的不透明颜色。
安装
方式一:npm 安装(推荐)
# 已发布到 npm registry
dsh plugin --profile web add dsh-any-background
# 或直接安装 GitHub 仓库
dsh plugin --profile web add github:Tkingxiao/dsh-any-background
然后启动:
dsh web
插件会出现在设置面板的 “主题” 分类中。
方式二:npx(无需全局安装)
npx @deepseek-ai/dsh plugin --profile web add dsh-any-background
npx @deepseek-ai/dsh web
方式三:本地构建(开发)
lib/ 目录已提交,安装后无需构建。修改 src/ 后重新构建:
git clone https://github.com/Tkingxiao/dsh-any-background.git
cd dsh-any-background
pnpm install
pnpm run bundle
pnpm dsh plugin --profile web add "dsh-any-background"
pnpm dsh web
兼容性
dsh web0.1.5-rc.2 ~0.2.1-alpha.1,其上所有版本一并放行 —engines.dsh、六个受门禁的@deepseek-ai/dsh-*的peerDependencies与dsh.compatibility.dsh先逐一列出本插件核对过的0.1.5-rc与0.1.6-alpha各构建——总括从它们之上开始,所以这些必须写全——继续点名此后逐个 diff 过的版本(0.1.7-rc.1、0.1.7-rc.2、0.2.0-rc.1、0.2.0-rc.2、0.2.1-alpha.1)作为记录,最后以不设上界的>=0.1.7-alpha.1收尾,让 0.1.7、0.2 及其后的每一个 release 都能加载。不设上界是有意选的:从0.1.7-rc.1起宿主强制的正是这份 peer 列表——范围没写到的版本会在导入任何模块之前被整行禁用——一条写到头的范围等于在一款还能正常工作的插件前面砌墙。没见过的 release 会取最近的一份事实,并在日志里写清它离exact有多远;一份过期事实最坏的代价是某个滑块不再淡出宿主已经搬走的那个表面,而一道失败关闭的版本检查代价是整个插件。dsh.compatibility.dshReleases记录哪些构建核对过、怎么核对的:0.1.7-rc.1/0.1.7-rc.2、0.2.0-rc.1/0.2.0-rc.2与0.2.1-alpha.1以逐包比对 tag 核对,它们之前的构建是实测过的。这道门禁也意味着安装或更新插件后仍需重启dsh web——检查发生在 profile 组装时,而不是插件更新时——但不设上界的总括,正让已经升到更新宿主的机器不再需要先等插件发版(或手工授予精确版本豁免dsh plugin allow-version)。宿主版本在运行时由 Node 半侧解析,依赖特定宿主版本渠道的功能(右侧栏面板模糊、官方侧栏「主题」卡片)只在对应宿主结构存在时启用,其余功能在整个范围内表现一致。- 版本适配隔离:release 由 Node 半侧从进程自身那份
@deepseek-ai/dsh/package.json读出(客户端上下文不暴露版本;ctx.profileContext.installAnchor指不到时退回启动器的磁盘布局),经readRPC 下发后只由前置适配层路由——src/host-compat/负责探测与渠道归类,src/client/host-compat/versions/下每个事实集合一个目录(v0-1-5-rc-2-3/v0-1-6-alpha-1-2/v0-1-7-alpha-1-2-rc-1/v0-1-7-rc-2/v0-2-0-rc-1/v0-2-0-rc-2/v0-2-1-alpha-1/unknown),各自描述该版本的面板力学、头部槽位键、插件页形状,以及菜单的底色与磨砂落在哪一层。目录按它覆盖的事实命名,不按版本号的形状:0.2.0-rc.1与0.2.0-rc.2同属一个预发布渠道,但 rc.2 改了吸顶菜单分组标题取色的令牌,于是这条补丁行上并着两个目录,较新的那个按开启它的那个构建命名。底码只向适配层提问(引导页表面归谁、模糊挂在哪一层、菜单该重写哪些令牌),不比较版本字符串。同一补丁行内的其它构建(0.1.6-alpha.4之于核对基准0.1.6-alpha.2)用该行的档位;整条补丁行都不在已核对范围内才收边取最近的一档并写日志——0.2.1-alpha.1之上的每一个 release 如今就是靠这一档加载的。只有解析不到 release 时归入unknown,回退到按 DOM 形状探测(:has()双臂)而不是猜一个版本;适配新宿主 = 新增一个版本目录并在注册表登记。 - DSHA — DeepSeek Harness 安卓启动器(免 ROOT、免 Termux)。其包内 dsh 为
0.1.5-rc.2,落在兼容范围内;移动端界面由dsh-web-mobile提供。 - deepseek-harness-desktop — 支持
权限、副作用与边界
- 接入形态:官方 Profile Bundle——
package.json声明dsh.bundle.patch: ./cordis.patch.yml(loader 插入层),仓库提交可直接使用的预构建运行时制品(lib/index.js、lib/client.js),无安装脚本、无 postinstall、无 native 二进制、安装时不执行任何构建。 - 文件系统:服务端仅在
<dsh 主目录>/.dsh-any-background-data/内读写(配置 JSON、壁纸、轮换池、视频、字体),不触碰该目录之外的任何路径;配置写入为原子写(临时文件 + rename)。这些文件落在真实磁盘上,不受 generation 恢复影响,也不会被其回滚——清除它们即彻底重置插件。 - 网络:仅在用户主动粘贴 http/https 图片或视频网址并点击「应用」时发起一次出站请求下载该资源;除此之外无遥测、无外部服务调用。
- Shell / native:无。不使用
child_process、不加载 native 模块、不运行动态下载的二进制。 - HTTP 面:仅在本机 dsh web 服务下注册
/dsh-any-background/{video,wallpaper,font}(GET/HEAD 流式服务)与对应*/upload(POST,上限 100 MB)及专用 RPC 通道/dsh-any-background;无新增对外监听端口。 - 是否需要重启:首次安装后需(重新)启动
dsh web加载客户端 bundle;此后的设置变更实时生效、自动落盘。更换插件版本后需重启以加载新的lib/client.js。 - 测试与验证:
pnpm run typecheck(tsc 全量类型检查)与pnpm run bundle(tsdown 产出lib/);无自动化单测,接口行为以手动验证为准。 - 已知限制:依赖宿主 DOM 结构的稳定标记(如
[data-sidebar-right-panel]、[data-dsh-bottom-panel])与 CSS 令牌名,宿主大版本重构样式层时选择器可能失效(表现为相关滑块不再作用于对应表面,不影响稳定性);版本相关的那部分选择器集中在对应的版本目录里,宿主改版通常只需改那一份;-webkit-text-stroke在部分单行省略号容器边缘约有 1px 裁切。
Star History
许可
MIT