前言¶
DeepSeek Harness(下文简称 dsh)是 DeepSeek 开源的智能体运行时,官方仓库在 deepseek-ai/deepseek-harness,核心理念是「一切皆插件」:模型适配、工具、会话、循环、界面都可以换成插件,挂到 Cordis 运行时上。它目前仍是 developer preview,上游几乎每天会发一个新的 snapshots/... 快照分支。
对长期挂着 dsh web 的人来说,这会带来一组很具体的问题:今天的快照能不能安全切过去?切完 web 起不来怎么办?重启会不会把正在跑的 agent 打断?会话看起来丢了,该从哪修?这些问题不是换皮肤能解决的,而是运维问题。
社区目录 DeepSeek Harness 插件库 把 dsh-harness-ops 收在「界面增强」分类下。需要先说清楚:这个站点是独立的社区目录,与 DeepSeek 或幻方没有从属、背书或赞助关系;官方发现插件的入口仍是 GitHub topic dsh-plugin。本文只介绍这个仓库已经写进 README 和安装脚本的能力,不把它写成官方应用商店里的推荐位。
这是什么¶
dsh-harness-ops 是一套给 dsh 用的运维工具箱,GitHub 仓库为 fakechris/dsh-harness-ops,维护者是 fakechris。许可证是 MIT,版权栏写的是 songchuansheng(2026)。仓库根目录 VERSION 当前为 0.3.2(CHANGELOG 标注日期 2026-08-14);截至 2026-08-17,GitHub 显示 11 星,目录页仍写 9 星,以仓库页面为准。
它不是单一的 Cordis 插件,而是「4 个 skill + 1 个 bundle 插件」的混合仓库。2026-08-11 曾用名 dsh-skill-snapshot-ab,后来从「纯 A/B 轮换 skill」长成了现在的工具箱;skill 目录名 dsh-snapshot-ab 保持不变,因为它同时是触发名和 ab.sh 的安装路径。
仓库 README 用五个问题概括它要回答的事:
- web 挂了谁拉起?
- 拉起后工作继续吗?
- 会话看起来丢了怎么办?
- 官方发新版本怎么安全切换?
- A/B 两个槽都挂了怎么一键救?
对应组件如下。
| 组件 | 类型 | 管什么 |
|---|---|---|
skills/dsh-snapshot-ab |
skill | 官方每日快照 A/B 双槽轮换,验收通过才原子切换 |
skills/dsh-web-guard |
skill | launchd / systemd 守护,端口空闲约 10 秒内拉起 dsh web |
skills/dsh-session-recovery |
skill | 「0 sessions」或日志损坏时的定位与无损修复 |
skills/dsh-web-doctor |
skill | web / A/B 全挂时,终端一键诊断 → 修复 → 拉起 |
plugins/dsh-restart-recover |
Cordis bundle | 重启后检测被打断的 turn,自动注入续接 |
bundle 插件已发布到 npm,包名是 @fakechris/dsh-restart-recover,当前 package.json 版本为 0.2.1。skill 走的是 ~/.dsh/skills/ 目录扫描,不进 npm。
核心功能¶
A/B 双槽:新快照先进隔离槽¶
心智模型可以画成下面这样:
~/.local/bin/dsh
└─> ~/.dsh/source/current ← 符号链接,指向当前生效的槽
├─ slot-a/ 旧版(已验证,生产兜底)
└─ slot-b/ 新快照(构建 + 验收通过后的候选)
生产实例永远只跑 current 指向的那个槽,默认地址是 http://127.0.0.1:3080。切换是一次原子的 ln -sfn,再加上重启 dsh web。A/B 是槽位身份,目录名固定;内容每天互换:旧版占一个槽,新快照进另一个槽。
prepare 在非当前槽里做完整流水线:检出快照、pnpm install --frozen-lockfile、build:lib + build:web、扩展 relink、typecheck / build / test、运行时依赖检查、staging 端口(默认 3081)冒烟 HTTP 200。任何一步失败都会还原扩展链接,不动生产,phase 回到 idle。
验收过了才 switch。默认 acceptance.mode 是 manual,必须带 --yes;也可以改成 auto,前提是 e2e 已经用真实浏览器断言过配置里的 UI 元素(例如 #dsh-track-fab)。切换后还要 $AB confirm,才会解锁下一天回收回滚槽——在此之前,旧槽始终是退路。$AB rollback --yes 会把 current 指回上一版并重启 web。
仓库把这套设计和官方 dsh-upgrade 区分开:后者是 rebase 到上游 master 的整合流程;本机制面向「官方每日快照 + 本地扩展外挂」的日常轮换,两者可以共存。
10 秒守护 + 断点续接¶
dsh-web-guard 用 macOS 的 launchd 或 Linux 的 systemd 托管,PPID=1,不跟 web 进程绑在一起。v0.3.1 起判活只认 LISTEN 态 socket(lsof -ti :PORT -sTCP:LISTEN),避免浏览器还挂着旧连接时把端口误判为「被占用」,从而永不拉起。CHANGELOG 记录过 2026-08-14 的实测:旧判定下 3080 停机大约 20 分钟都没有被拉起来。
光把进程拉起来不够。dsh-restart-recover 监听 agent/created,发现上一轮是 interrupted 就自动注入续接消息,用户不用再敲「继续」。它和 guard 的分工是:guard 负责进程,bundle 负责会话。ab.sh switch/rollback 杀掉 web 之后,guard 拉起新的 current,restart-recover 再续上被打断的 turn。
web 全挂时走终端医生¶
agent 是由 web 托管的。web 起不来,GUI 和 agent 一起没了,这时再依赖页面上的插件没有意义。dsh-web-doctor 是 out-of-band 入口:纯终端,不加载 web 扩展,依赖本机的 node / zstd / jq / curl / ps / lsof。
安装脚本会把 doctor.sh 链到 ~/.local/bin/dsh-doctor。常用入口:
dsh-doctor # 交互菜单(默认英文,菜单里可切中文)
dsh-doctor --guide # mini TUI:看完整思维链,随时 Ctrl-C 打断再指引
诊断固定九项:web 健康、launcher 链、扩展 relink、槽可启动、session 文件层、web.log、profile bundles 依赖、LLM 配置(.env key)、最近会话最后发生的事。修复分两层:菜单 2 是机械修复已知配置故障(relink、插件依赖、launcher、session、LLM 凭据),不调模型;菜单 3 / 4 用 dsh --profile headless 起一次性 agent,读报告和日志推理根因。headless 不加载 web 的扩展 bundle,所以扩展把 web 搞挂时,医生自己还能跑。
README 写明:2026-08-13 有一次无人值守的 --agent 长跑失败,所以后来加了 --guide 的人机协同模式——LLM 自动判断和修复,人看完整思维链,觉得不对就打断。这是仓库自己的设计取舍,不是第三方评测。
会话如果只是「侧边栏变成 0 sessions」或 zstd 日志损坏,先走同仓库的 dsh-session-recovery,不要一上来就整槽回滚。
安装与启用¶
目录页给出的安装命令如下,在 DeepSeek Harness 终端里可以直接跑:
dsh plugin add github:fakechris/dsh-harness-ops
如需可复现安装,按目录页说明固定 commit 哈希。截至 2026-08-17,仓库 main 最新提交是 c2d10c9d4707eb6685669ff375fa7617a7554a47:
dsh plugin add github:fakechris/dsh-harness-ops#c2d10c9d4707eb6685669ff375fa7617a7554a47
这条命令走的是 dsh CLI 的 GitHub 解析路径。对本仓库来说,完整工具箱(4 个 skill、dsh-doctor 入口、以及 web profile 里的 restart-recover bundle)以 README 的 git clone + scripts/install.sh 为准。README 原文克隆的是 dsh-external/dsh-harness-ops;该地址目前可以打开,内容与 fakechris/dsh-harness-ops 一致。下面按已核实的维护者仓库来写:
git clone https://github.com/fakechris/dsh-harness-ops.git
cd dsh-harness-ops
bash scripts/install.sh
install.sh 做四件事:把四个 skill 拷进 ~/.dsh/skills/;用 dsh plugin --profile web add @fakechris/dsh-restart-recover@<version> 把已发布的 npm 包装进 web profile(不再本地 link:,避免仓库里被 gitignore 的 lib/ 被清掉后 web 起不来);把 dsh-doctor 链到 ~/.local/bin;提示可选的守护进程安装。脚本可重复执行。
自愈守护是可选的,macOS 走 launchd,Linux 走 systemd:
bash skills/dsh-web-guard/scripts/install.sh
之后更新不必本地构建插件:
cd dsh-harness-ops && bash scripts/update.sh
update.sh 的流程是 git pull --ff-only → 重跑 install.sh → 从 npm 重装 bundle。首次建议看一下 ~/.dsh/source/ab-config.json,确认 extensions(示例里包含 dsh-restart-recover)、web.port(默认 3081)和 web.productionPort(默认 3080),然后:
# $AB 指 ~/.dsh/skills/dsh-snapshot-ab/scripts/ab.sh
$AB status
插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前应检查源码仓库和 MIT 许可证。
典型用法¶
约定:下文 $AB 均指装好 skill 之后的 ~/.dsh/skills/dsh-snapshot-ab/scripts/ab.sh。
第一次把正在跑的版本收编为 A 槽,不会重启服务:
$AB status # 确认 current 指向、slots 为空、phase=idle
$AB init --yes # 新建 slot-a worktree,pnpm install + 完整构建
$AB status # current=a,phase=idle
日常生产启动不指定 A/B,永远跑 current:
dsh web
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3080/
只想看官方今天改了什么、先不切版本,在对话里说「分析一下今天和昨天的快照」即可触发 skill;等价命令是:
$AB discover # fetch 上游,列快照,候选更新时附官方 changelog
$AB notes # 打印两个快照之间新增的 Agent Note
官方仓库没有独立 CHANGELOG 文档,但非平凡改动会写进 .agents/notes/implemented/。discover / notes 把这段笔记当成该快照的 changelog 列出来。
真正升级走完整轮换:
$AB status
$AB discover
$AB prepare # 在非当前槽构建、挂扩展、staging 冒烟,全程不动生产
$AB verify # 可选,对已 prepared 的候选重跑扩展测试 + 冒烟
$AB e2e # 可选但推荐:真实浏览器断言前端真的挂上了
$AB switch --yes # manual 模式必须 --yes;会重启 web,当前会话会断
switch 会断当前 agent 会话,这是预期行为,不是故障。切完后:
readlink ~/.dsh/source/current
$AB status # current 已切到候选槽,confirmed=false
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3080/
浏览器需要硬刷新(macOS 上是 Cmd+Shift+R)。README 记载过 2026-08-11 的坑:旧 tab 仍是切换前加载的 boot manifest,新的 client 面板不会出现。观察几天没问题再执行:
$AB confirm
新版有问题随时回滚:
$AB rollback --yes
web 彻底起不来、连 agent 都没有时:
dsh-doctor --guide
想确认守护是否会拉起,README 给的自愈验证是:kill $(lsof -ti :3080),大约 10 秒内应自动拉起,已装 restart-recover 时会话会自动续接。这会中断当前 web,只在你明确要做故障演练时使用。
适用场景与注意事项¶
适合已经把 dsh 当日常工作台、并且会跟官方每日快照走的人:本机长期跑 dsh web 的用户、要在新快照上验证自有扩展的插件作者、需要回滚和自愈而不是每次重装的部署人员。如果只用官方模板偶尔试一下,没有本地扩展、也不在乎快照日期,这套 A/B 机制偏重。
使用时有几条硬边界,都来自仓库自己的说明,不是额外发挥:
- 两个槽共享
~/.dsh。 sessions 是 append-only 共享文件,storages 是单进程串行写。生产只保留一个常驻实例;另一个槽用$AB stage短起、只读、看完即关。不要直接<槽>/bin/dsh web --port 3081裸跑。 switch/rollback会断当前会话。 会话文件在~/.dsh/sessions/,重启后会重新索引,一般不会丢盘;但当前这一轮对话会被打断。装了 restart-recover 会尝试从 interrupted turn 续上。- 切完必须硬刷新。 普通刷新不够。
prepare失败不要切。 失败时current不动。扩展 typecheck / build / test 红,说明扩展和该快照不兼容,应先修扩展再重跑prepare。- 守护进程绑定平台。
dsh-web-guard的安装脚本面向 macOS launchd 与 Linux systemd,README 没有把 Windows 服务列为同等支持。 - 医生会调 LLM。 机械修复不依赖模型;深度检测需要本机 LLM 凭据,推理过程会打到终端。不要在不信任的环境把诊断日志随手外发。
- 权限与许可证。 插件以当前 dsh 进程权限运行,安装脚本会往
~/.dsh/skills、webprofile 和~/.local/bin写文件。安装前检查 源码 和 MIT 许可证。
小结¶
dsh-harness-ops 把「切对版本、拉起进程、续上会话、全挂自救」收进同一个仓库。A/B 双槽让官方每日快照先在隔离槽里构建和验收,通过才原子切换,旧槽一直能回滚;guard 在 web 死后约 10 秒拉起进程;restart-recover 把被打断的 turn 接回去;dsh-doctor 在 GUI 完全不可用时提供终端入口。
它解决的是 preview 阶段跟快照跑的运维成本,不是把 dsh 变成托管服务。目录页与源码地址如下,安装前以仓库 README 和 scripts/install.sh 为准:
- 目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-harness-ops/
- GitHub:https://github.com/fakechris/dsh-harness-ops