dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Forge-Cathedral tech-gothic theme for DeepSeek Harness. Unofficial fan-made skin, original SVG art, provided gear-skull emblem. 机械神教 · 铸炉圣殿 DSH 外观插件。
状态:v0.9.3。macOS 应用图标替换器现在可以在「App 管理」里授权后直接替换(无需退出 DSH,本机已实测成功并在 Dock 刷新);同时保留 v0.9.2 的输入框精简(移除思考程度进度条)、v0.9.1 的展开命令行图标、v0.9.0 的图标 / 推荐标签 / 发送键修复。 Windows 适配细节见文末「Windows 适配(v0.7.0 · 实测)」,其中包含实测过的安装流程、失败模式与可复现的渲染审计脚本。 当前桌面 profile 以
link:方式指向本仓库:client 半边的改动会被 HMR 热替换;宿主半边的启动前奏注入需要插件行重新挂载(或在「插件」页停用/启用一次),之后刷新页面即生效。 图标标准 = 你提供的齿轮-骷髅:只改颜色、等比缩放,不重绘。

macOS 会拦截对其它应用包的写入;把替换器 applet 加入「系统设置 → 隐私与安全性 → App 管理(App Management)」的允许列表后,就可以在 DSH 运行中直接替换图标(本机实测:icon.icns md5 9260bae121fd01f3261200d19a4c055e,icon.png 同步替换,Dock 已刷新)。
# 生成并打开替换器(首次会请求「允许修改其他 App」)
tools/build-macos-app-icon-fixer.sh
替换器逻辑:把 assets/app-icon/AppIcon.icns / icon-1024.png 复制到 /Applications/DeepSeek Harness.app/Contents/Resources/icon.icns 与 icon.png,touch 应用包、lsregister -f 刷新 LaunchServices、killall Dock;官方图标备份在 ~/.dsh-theme-admech/app-icon-backup/。
tools/install-macos-app-icon.sh restore,或把备份目录里的两个文件手动拖回 Resources;![]()
按需求彻底删除会话框(输入框)里的「◆ 思考程度 · MAX ▾」进度条与点击交互:输入框恢复干净,只保留模型控件本身。
::before 文案、点击打开滑块的自动钻取与悬浮定位、相关 CSS 动画与响应式规则、模型控件上的提示 title;layout_audit 连续两次 PASS(1440×900 + 390×844,0 errors)。
>_ 图标根因:展开后的过程明细行使用的是一套 data-variant + data-sample 的组件(运行命令 / bash 行没有 data-tool),图标宿主是 [class*="iconIdle"];主题此前的映射只看 data-tool / data-process-activity / data-variant="think",所以这些行退回原生终端图标。
修复:新增 variant → 图标映射(bash / read / write / edit / search / web / code / plan / …),并对 iconIdle / iconActive / iconDone / iconError 宿主统一打主题 glyph;运行中、完成、折叠与展开状态都会保持主题图标。
![]()
▾ 提示;点击后原地弹出与模型设置里完全相同的离散滑块(同一套 DOM / 样式 / 拖拽与 ← → / Home / End 操作),浮在进度条正上方。

验证:
data-admech-effort-float="true"、位于进度条正上方且水平居中、4 个档位;拖拽 Max → High 后 aria / 进度条同步更新,再次点击进度条可恢复 Max;模型控件原菜单不受影响。data-admech-icon="terminal",mask 与黄铜色生效。layout_audit 1440×900 + 390×844 PASS,0 errors(.layout-guard/runs/20261021-093454-dsg7-audit);layout_assert(进度条打开同一滑块、4 档、提交 High、恢复 Max)PASS(.layout-guard/runs/20261021-093500-wkpc-assert)。现象:智能体运行中、有排队消息时,输入框提示「Cmd/Ctrl+Enter 插话发送全部排队消息」出现两层重影,第二行被裁切。
根因:v0.9.0 为了让 web / hero 输入框的占位文字也被接管,把「把原生占位文字字号归零」的选择器从 [data-composer-placeholder][data-admech-placeholder="true"] 弱化成 [data-admech-placeholder="true"]。宿主自带规则 [data-composer-placeholder] { font-size: 14px !important } 在样式表中更靠后、特异性相同而获胜,于是原生占位文字(14px / 24px 行高)与主题的 ::before 副本同时绘制,行高翻倍后第二层被裁切 —— 纯套件回归,与 DSH 本身无关。
修复:恢复双属性高特异性选择器,同时保留 [data-admech-placeholder="true"][class*="placeholder"] 覆盖 web / hero 变体;v0.9.1 起提示文字只绘制一层。当前真机 computed 样式:原生占位 font-size: 0px,仅 ::before 以 14px/24px 绘制。按旧级联注入样式可稳定复现两层重影(下两图:上为重影复现,下为修复后)。

应用图标按 macOS 圆角方形规范重绘(1024px 画布、824px 内容、185px 圆角):铁黑底 + 黄铜双框 + 尖拱 portal 线稿 + 发光的齿轮-骷髅 + 火星红封印,32px 下仍可辨认。
![]()
生成:python3 tools/build-macos-app-icon.py(Pillow + iconutil),产物在 assets/app-icon/:AppIcon.icns、icon-1024.png、icon-512.png、icon-256.png。
安装 / 还原(推荐方式,走「App 管理」授权,无需退出 DSH):
tools/build-macos-app-icon-fixer.sh # 生成并打开替换器;首次允许它「修改其他 App」
tools/install-macos-app-icon.sh status # 查看当前状态
tools/install-macos-app-icon.sh restore # 还原官方图标
说明:macOS 会拦截对正在运行的应用包的写入(直接 cp / root / installer 都会报 Operation not permitted)。解决办法是在「系统设置 → 隐私与安全性 → App 管理」中允许负责替换的 applet(tools/build-macos-app-icon-fixer.sh 生成的 AdmechIconFixer.app,或 Terminal)。授权后即可在 DSH 运行中直接替换(v0.9.3 实测通过)。安装器会把原始图标备份到 ~/.dsh-theme-admech/app-icon-backup/,替换 icon.icns / icon.png,刷新 LaunchServices 与 Dock。若 Dock 仍显示旧图标,退出重开一次 DSH;DSH 更新会恢复官方图标,更新后重新运行替换器即可。资源替换会让应用包的 codesign 校验失效(本地正常启动不受影响,需要时执行 restore)。Finder 手动替换包:macos-app-icon-drop/(双击打开后拖入 Resources 亦可)。
宿主用 --dsw-specific-sidebar-nav-item-active-accent 做底色、用 --dsw-alias-button-info-fill 做文字色,而本主题把这两个 token 都设成了黄铜 → 金底金字。现在给推荐标签单独的黄铜描边 + 磷光文字配色,任何主题 token 调整都不会再吞掉文字。

发送键与「停止生成」共用宿主的 yhfFVG_primary 槽位,标签会随状态在 发送消息 / 排队发送 / 插话发送 / 停止生成 之间切换。主题此前只匹配 aria-label="发送消息",所以智能体运行时输入文字,按钮退回到宿主默认的 --button-info-fill(本主题 = 黄铜)——一颗纯金圆点,而里面被 mask 成黄铜色的发送箭头也和底色融为一体,看起来像图标消失。
修复:按宿主主按钮 class 统一上火星红圆环样式,发送/排队/插话三种状态都保持红色 + 米白图标;排队与插话额外加琥珀色外环表示「插入正在运行的轮次」;停止状态继续使用红色脉冲圆环。

验证:真机取三种状态的计算样式,背景均为火星红径向渐变、图标为 #f7ecd5、尺寸 34px;推荐标签为 34×18px、文字 #e3c184 落在半透明黄铜底上。主题 CSS 改动后 layout_audit 重新 PASS(1440×900 + 390×844,0 errors)。
lib/index.js)通过 webserver/index-inject 向 index 注入启动前奏:暗色大教堂背景 + 齿轮-骷髅徽记 + 「铸造圣殿」标题 + 黄铜进度轨 + 实时百分比;前奏背景由 /theme-admech/forge-cathedral.svg 路由提供,并缓存一天;HARNESS / Loading plugins… 启动屏隐藏(CSS :has + 注入脚本双保险),客户端未加载或加载失败时注入脚本自动撤掉前奏,绝不遮住原生错误页;showSplash() 检测到前奏后原地接管:加 is-continue 关闭淡入、读取前奏进度并折算进启动计时,点火序列从当前百分比续播,随后无缝回到界面;prefers-reduced-motion 时保留静态前奏直到界面挂载;自动化用的 #admech-splash=0 会立即移除前奏并直接进入界面。

data-* 与自定义属性,不向 React 节点插入 DOM,保持宿主 reconcile 安全。

← → / Home / End 调整;提交仍走原生 menuitemradio 按钮,键盘与读屏行为不变;

验证:
display:none,568ms 客户端点火以 is-continue 无缝接管,全程只有一段套件动画;layout_audit(真实渲染页,隔离 profile):1440×900 + 390×844 PASS,0 errors(.layout-guard/runs/20261021-091023-su9w-audit);.layout-guard/runs/20261021-091038-kovh-audit 等);layout_assert 项目不变量全部 PASS:遥测条位于输入框下方且不越界、三仪表同排、输入框内进度条显示「思考程度 · Max」、滑块 4 档同排且填充到 Max、移动端进度条隐藏(.layout-guard/runs/20261021-091144-vdk4-assert 等)。问题:停用插件时,cleanup 只移除了主题 CSS 和根节点属性,没有恢复被替换的 SVG 图标(viewBox / fill / stroke / width / height / innerHTML),也没有恢复被替换成内联 SVG 的 img 元素;因此关闭插件后页面仍显示 Forge-Cathedral 图标,需要刷新才恢复。
修复:
验证(真实 DSH 0.2.1-rc.2,隔离 profile):



验证:
现象:发送一条消息后,composer / 输入框永久消失;新建会话、切换其他会话也没有输入框,刷新才恢复。
根因:
原图标替换会直接改写 React 管理的原生 SVG 的 viewBox / fill / stroke / innerHTML;
从 hero 输入区切换到 chat composer 时,React 尝试移除已被我们替换掉的 SVG 子节点;
控制台出现:
NotFoundError: Failed to execute 'removeChild' on 'Node' slot entry crashed in 'conversation.composer.bar'
composer.bar 插槽崩溃后,输入框被永久卸载。
修复(v0.5.1):
验证(真实 DSH 0.2.1-rc.2,隔离 profile):

![]()
将 DeepSeek 的鲸鱼/内置过程图标替换为 Forge-Cathedral 原生图形:
| DSH 状态 | 图标 |
|---|---|
| thinking / 正在分析请求 | process_think(机魂之眼) |
| read / readImage | process_read(圣典) |
| webFetch | process_web(罗盘) |
| search / webSearch | search(带十字准星的透镜) |
| edit / write | process_edit(羽毛笔) |
| commands | terminal(终端圣龛) |
| code | process_code(代码终端) |
| subagents | trinity(三机魂节点) |
| plan | process_plan(计划卷轴) |
| questions | vox(声讯) |
| tools | tools(工具) |
实现方式仍是 CSS mask over untouched native SVG:不替换 React 节点、不改写 SVG 子节点,因此不会重新引入 composer 的 removeChild 崩溃;关闭插件时只移除属性与 mask style,原生图标恢复。所有动画在系统开启减少动态效果时关闭。
验证:

上一版只替换了 process 组头部的 activity 图标。展开 process 组后,内部 ToolRow 仍显示 DSH 原生工具图标,因此出现“展开后原型鄙陋”的问题。v0.6.0 追加:
验证:
v0.6.0 给文件卡图标的 SVG 加了较强的 sepia / brightness filter,把 FileTypeIcon 自身的白色底板和彩色字形一起洗白,最终出现“白色空方块”。
v0.6.1 移除这组洗白滤镜,只保留轻微阴影;图标盒仍保留黄铜边框与暗色衬底。文件类型图标恢复原本的颜色与字形。
展开 process 组后,ReasoningRow 使用的是 DSH 原生 IconThinkOutlineRegular(原子/轨道图标),不属于 ToolRow,所以上次映射没有覆盖到。
v0.6.1 增加:
验证:
隔离环境检查结果:
v0.6.2 增加的防御性处理:
如果你的环境里仍打不开,请提供“点击后具体表现”(无反应 / 空白原生页 / 报错)以及 DevTools Console 错误;这通常需要区分是账号状态 links 缺失、WebContentsView 宿主问题,还是 DSH 版本问题。
DSH Desktop 的“查询用量 / 充值”会挂载一个原生 Platform WebContentsView。它的宿主 DOM 是一个:
<div role="dialog" aria-modal="true">
<header data-window-drag="true">…返回 DeepSeek Harness…</header>
<div class="…viewport">…</div>
</div>
主题的通用 role=dialog 哥特框样式把它也当成了普通对话框,覆盖了它的:
position: fixed; inset: 0; overflow: visible; border; background; …
导致 PlatformOverlay 的 .viewport 尺寸/位置错误,bridge.open(page, bounds) 拿不到有效 bounds,加载失败,只显示“操作未完成,请重试 / 返回 DeepSeek Harness”。
用 role=dialog:has(> header [data-window-drag]) 识别原生 Platform 宿主;
JS 同时打上 data-admech-platform-overlay="true" 作为兼容标记;
对这两种选择器强制恢复:
position: fixed; inset: 0; z-index: 1001; display: flex; flex-direction: column; background: var(--dsw-alias-bg-base); background-image: none; border: 0; border-radius: 0; box-shadow: none;
隐藏主题的 ::before / ::after(内框与徽章),不再影响原生页 bounds。

授权注意:该 SVG 是从你提供的参考照片做的同人矢量重建,参考照片的权利状态未验证;仅建议自用/非商业,不纳入 MIT 或 CC 授权。


tagProcessIcons(),MutationObserver 每批 DOM 变化先补标;data-process-activity / data-tool / data-variant 等状态属性;
process_pause;运行/思考容器未打标原生图标数 0;工具栏带 data-variant="think" 时正确显示 process_code;layout_audit desktop/mobile PASS(0 errors)。data-process-activity:按关键字兜底到 process_code / process_web / process_think;data-tool:兜底到 tools,不再保留原生工具图标;mystery_exec → process_codemystery_tool → toolsprocess_pauseWindows 11 上点「查询用量」或「充值」:返回栏出现、先显示加载转圈,随后内容区变黑,原生 Platform 页面始终加载不出来。macOS 上同一路径正常。
DSH Desktop 的内嵌 Platform 页是一个原生 WebContentsView,宿主 DOM 为:
<div role="dialog" aria-modal="true">
<header data-window-drag="true">…返回 DeepSeek Harness…</header>
<div class="…viewport">…</div>
</div>
PlatformOverlay 在 useEffect 里用 .viewport 的 getBoundingClientRect() 作为传给主进程的 bounds。主题的通用 [role="dialog"] 哥特框会把宿主容器改成 position: relative(主题选择器优先级高于宿主自带的 .overlay),只有平台专用规则才能把它恢复成 position: fixed; inset: 0。
平台专用规则原来写的是:
[role="dialog"]:has(> header [data-window-drag])
这是 header 的后代;而 DSH 把 data-window-drag 放在 header 自己身上,所以该选择器永远不匹配。实际上要等主题 MutationObserver 的 tagNodes() 补上 data-admech-platform-overlay="true" 之后,CSS 才生效——已经晚于 React useEffect 读取 bounds 的时机。
实测(隔离环境,模拟 Windows 标题栏 40px,合成同一个 PlatformOverlay DOM):
| 时刻 | overlay position | viewport rect | 传给主进程的 bounds |
|---|---|---|---|
| 挂载当帧(shipped 0.7.16) | relative | x=1, y=989, 1433×0 | 高度 0、已在窗口外 |
| 挂载当帧(修正选择器后) | fixed | x=0, y=88, 1440×812 | 正确 |
| 1 帧后(JS 打标完成) | fixed | x=0, y=88, 1440×812 | 正确 |
Windows 上原生视图按「高度 0、y=989(窗口外)」创建后,之后再 setBounds 也不会重新绘制,于是内容区一直是黑的;macOS 的合成器会重绘,所以之前只在 mac 上看不出问题。
:has(> header[data-window-drag])(保留原来的后代形式兼容旧 DOM),让 host 在第一帧就是 position: fixed; inset: 0,::before/::after 也在第一帧隐藏;[role="dialog"],只给「直接子 header 带 data-window-drag(或 header 内含该属性)」的 dialog 打标,不再用 document.querySelector("[role=\"dialog\"] [data-window-drag]") 取全局第一个;bounds = {x:0, y:88, width:1440, height:812}(Windows 标题栏模拟,1440×900);{0,88,1440,812},说明修复后与宿主原生布局一致;data-admech-platform-overlay="true"),作为无 :has() 环境的兜底。
light / dark / system / 第三方主题 id);ctx.theme.setTheme(previousThemePreference),恢复到启用前的主题;data-ds-dark-theme、color-scheme: dark 等强制暗色标记;bodyBg: rgb(255,255,255)、colorScheme: light),不再出现“显示暗色但实际设置是亮色”。[role="dialog"] 全部套上弹窗边框和 position: relative !important;position: fixed 浮动面板,被主题改成 relative 后位置错乱,看起来像点击无效;[role="dialog"] 选择器加上 :not([class*="_panel"]),统计/上下文/token 面板不再套用模态弹窗框;role="dialog" 不受影响(实测 class _dialog_o6lrb_33 仍使用主题边框和徽章);position: fixed、无主题伪元素,触发按钮点击可正常显示。合成 PlatformOverlay DOM 检查:
左侧栏 插件 → 添加插件(或箭头 → 安装第三方插件)
路径:
/Users/richard_dou/Desktop/插件工厂/admech-theme/plugin
安装 → 立即启用;提示重启就重启 DSH。
src/icons.json # 32 枚 UI 图标,emblem 使用你提供的图标
src/styles.css # token / 输入框 shrine / 会话框 crest / 图标
src/client-template.js # 主题、图标替换、徽记与装饰
src/build-client.mjs # 生成 lib/client.js
assets/gear-skull-gold-*.png
assets/forge-cathedral.svg / .png
cd admech-theme/plugin
node src/build-client.mjs
node --check lib/client.js
粉丝向原创演绎;背景为原创 SVG;齿轮-骷髅来自你提供的素材,仅按你的要求用于自用主题。
仓库地址:
https://github.com/RichardDou0607/dsh-theme-admech
左侧栏 插件 → 添加插件(或箭头 → 安装第三方插件);
输入 Git 地址:
github:RichardDou0607/dsh-theme-admech
或:
https://github.com/RichardDou0607/dsh-theme-admech
安装 → 立即启用;提示重启就重启 DSH。
也可以直接下载仓库 ZIP,解压后以本地目录安装。
Windows 提示:
github:规格依赖 Git 与可用代理,在「代理失效 / 证书链不全」的机器上会直接失败(实测见文末)。Windows 上推荐「下载 ZIP → 本地file:安装」,完全离线且不需要 Git。
dsh plugin --profile web add "github:RichardDou0607/dsh-theme-admech"
Windows 上若上面这条因为代理 / 证书失败,改用本地目录(实测可用):
dsh plugin --profile web add "file:C:\dsh-theme-admech\dsh-theme-admech-main"
本仓库是混合许可,不是单一 OSI 开源许可:
实测环境:Windows 11(10.0.26300,中文系统,代码页 936)· DSH Desktop Web(运行时 0.2.1-rc.2,Electron 44.7.0)· Chromium 154 · 同一台机器的 100% / 125% / 150% 三档缩放。渲染与度量通过
tools/win-audit/里的 CDP 审计脚本完成(见文末「Windows 渲染审计」)。
v0.4.1 只加了字体回退,没有在 Windows 真机上跑过。v0.7.0 补上了真机验收,并修掉了下面这些只有 Windows 才会暴露的问题。

Windows 11 · 1440×900 · 100% 缩放。
Windows 版 DSH 用 titleBarStyle: "hidden" + titleBarOverlay,宿主会在 html 上打 data-windows-titlebar 标记,并给整个 frame 加 padding-top: var(--dsh-windows-titlebar-height)(本机 40px)来给最小化/最大化/关闭让位。主题本身不碰这块,实测主题色(--dsw-specific-sidebar-fill)会自动铺满这条 40px 带,与侧边栏、会话区衔接正常,无需额外处理——但如果你换了 --dsw-specific-sidebar-fill,记得这条带是跟着它走的。

Windows 桌面:顶部 40px 原生标题栏条(data-windows-titlebar)与侧边栏、会话区的衔接。
Windows 最常见的缩放是 125%(笔记本)和 150%(1080p 屏)。1 CSS px 在这些缩放下落到 1.25 / 1.5 设备像素,Chromium 只能用抗锯齿去凑,结果就是铜色花丝比 macOS(2× 下 1px = 整整 2 设备像素)更暗、更糊。
--admech-hairline:客户端半按 devicePixelRatio 计算,100% → 1px,125% → 0.8px,150% → 0.667px(都正好 1 设备像素),200% 及以上回到 1px;border*: 1px、inset 0 0 0 1px、焦点环)全部改成 var(--admech-hairline, 1px);resize 会重新计算,不用重启。
1920×1080 · 150% 缩放(CSS 视口 1280×720)。
实测:150% 下量同一列像素,边框亮带的过渡从「6 列渐变」收到「5 列、核心更亮」,视觉上是一条干净的线而不是一层雾。
花角字形画在 48 单位的画布里,缩到 26px 时 stroke-width: 1.15 只剩 0.62 CSS px;macOS 2× 下还有 1.24 设备像素,Windows 100% 下只有 0.62 设备像素,等于一层鬼影。