前言¶
在 DeepSeek Harness(DSH)里做智能体开发,会话日志和 profile 里的插件环境往往只留在本机:$DSH_HOME/sessions 下的压缩日志、各 profile 的 package.json、锁文件与 Cordis 补丁等,换机或重装后很难完整找回。手工拷贝目录既容易漏文件,也无法在多设备之间判断「哪一份是最新的」。
社区插件 dsh-webdav-sync(维护者 alfredhuang211,分类:记忆)把上述两类数据同步到任意 WebDAV 服务,支持增量备份与恢复,并用 generation / rev 与三方比较处理冲突。仓库参考实现为 v0.2.2,已在 dsh 0.2.0-rc.1 的 web profile 上跑通双源同步与强制恢复;实现上零额外运行时依赖(Node 内置 zstd 与 fetch),同时提供宿主侧逻辑与设置页客户端。
这是什么¶
dsh-webdav-sync 是 DSH 插件:将会话日志与插件环境备份到 WebDAV,并可从远端恢复。它不注册斜杠命令,因此会话窗口的 + / / 菜单里不会出现 webdav-sync 入口;日常配置走 设置 → WebDAV 同步,界面外可通过插件注册的同源 HTTP 路由或 curl 调用。
- 目录页:https://www.skillhub.cn/plugins/alfredhuang211/dsh-webdav-sync
- 源码:https://github.com/alfredhuang211/dsh-webdav-sync(MIT)
同步范围¶
下面三类是插件明确会处理的源;node_modules 视为可重装产物,永不同步。
| 源 | 内容 | 说明 |
|---|---|---|
| 会话 | $DSH_HOME/sessions/**/*.jsonl.zstd |
字节级同步;恢复时按日志头部的 cwd 重算落位目录 |
| 插件环境 | profile 的 package.json、cordis.patch.yml、pnpm-lock.yaml、pnpm-workspace.yaml、$DSH_HOME/cordis.patch.yml(可选)、插件市场状态(可选) |
环境「真身」文件,不含 node_modules |
| 插件清单 | 自动生成的 environment/inventory.json |
各插件名称、版本与启用状态;版本由插件从 node_modules 读取(宿主清单 API 不含版本号) |
版本与冲突¶
远端 manifest.json 为 v2 结构:整份备份有 generation(有变化才递增),每个条目有 sha1、rev(内容变才递增)、updatedAt 与最后写入设备信息。
判定规则(lib/versioning.js)概括如下:
sha1相同 → 一致,不动作。- 本机存有
base(上次同步的共同祖先)时,仅一端相对 base 变化 → 推进该端,不算冲突。 - 两端相对 base 都变了 → 冲突,按
conflictPolicy处理:
-prefer-newer(默认):先比rev,再比updatedAt,最后用device字典序收敛,保证两端结论一致;
- 另有keep-local/keep-remote/keep-both/manual。 - 落败一方默认另存为
.conflict-<设备>-r<版本>副本,不静默丢弃。
安全与恢复边界¶
插件在 README 中写明了若干红线,使用前建议通读:
- push / pull 都不删除本机会话。
- 覆盖本机文件的前提是「本机相对 base 未改过」;本机已改动的文件需显式
pullOverwrite,或通过「以云端为准」(POST /pull?force=1)。 - 环境文件覆盖前会写
.bak-<时间戳>;运行中的会话不参与覆盖。 - 同步两侧会剥离本插件自身配置行,避免换机恢复后把 WebDAV 目标改回旧机器;恢复时保留本机那一行(换机后新填的地址不会被云端旧值覆盖)。
- 永不触碰
node_modules。
恢复 package.json / pnpm-lock.yaml 后需要重装依赖:设置页点「安装依赖」(等价 POST /webdav-sync/install),或在本机 profile 目录执行:
cd $DSH_HOME/profiles/<profile> && pnpm install
安装与启用¶
CLI / web 或自定义 profile(命令来自仓库 README):
# 已发布到 npm 后
dsh plugin --profile web add dsh-webdav-sync
# 从 GitHub 源码安装(pnpm git 协议,按本地源码构建/链接)
dsh plugin --profile web add github:alfredhuang211/dsh-webdav-sync
Desktop:desktop profile 由 Electron 托管,CLI 会拒绝上述操作,需在 App 内插件市场安装。package.json 声明 engines.dsh 为 >=0.2.0-rc.1 <0.3.0,Node >=22,peer 依赖 @deepseek-ai/cordis、@deepseek-ai/dsh、@deepseek-ai/dsh-settings 等同版本段。
社区插件目录站 SkillHub 与 DeepSeek / 幻方无官方从属关系,安装前请自行查看源码与 MIT 许可证;插件以当前 dsh 进程权限访问本机文件与 WebDAV,Credentials 应只交给可信端点。
典型用法¶
设置页¶
打开 设置 → WebDAV 同步,按三组表单配置连接、同步内容与版本/冲突策略。状态面板会显示本机设备名、云端 generation 与文件数、待上传/待恢复/冲突计数等。常用按钮包括:保存、状态/版本、测试连接、预演、立即备份、从云端恢复、以云端为准、安装依赖。
本插件不注册斜杠命令;需要脚本或自动化时,使用 README 所述同源 HTTP 路由(请求首行经 ctx.connection.requestRejection 信任栅栏)。
开发与自测¶
仓库内测试方式:
pnpm install # 仅为 @deepseek-ai/schemastery
node --test test/*.test.mjs
README 记载 43 个用例,覆盖版本排序与三方比较、WebDAV 路径与建目录、冲突策略、双源端到端、force 恢复、运行中会话跳过、鉴权失败等。
适用场景与注意¶
适合需要在多台机器或多套环境之间对齐 DSH 会话与 profile 环境、并愿意把备份放在自建或第三方 WebDAV(如 NAS、网盘 WebDAV 网关)上的开发者。若只需要单次导出会话、不涉及环境与冲突合并,仍可按需选手工拷贝或其他工具;本插件的价值在于双源、清单版本与可恢复的冲突策略。
注意:WebDAV 账号与 URL 写入插件配置后由同步逻辑使用;务必确认服务端 TLS 与访问控制。Desktop 与 CLI 的安装路径不同,勿在 desktop profile 上强行走 CLI dsh plugin add。
结尾¶
dsh-webdav-sync 把会话压缩日志与插件环境真身文件推到 WebDAV,用 manifest v2 与三方比较在多设备间收敛版本,并在设置页提供备份、预演、恢复与装依赖的完整路径。进一步了解可从 SkillHub 目录页与 GitHub 仓库 README 入手。