插件同步 · dsh-plugin-sync
在多台登录了 DSH 的设备之间,让「装了哪些插件、哪些开、哪些关」保持一致。
两种传输方式,同一套加密载荷:
- 同步码:在 A 设备生成一段加密文本(
DSHSYNC1:开头),在 B 设备粘贴导入。不依赖任何服务器。 - 加密中转:把加密后的清单推送到一个 HTTPS 中转(插件自带 Cloudflare Worker + KV 的部署脚本,可在面板里一键部署),其它设备手动或定时拉取。中转只看到密文。
同步的是插件清单:包名、版本、启用/停用。配置项(cordis.patch.yml 里的 config)和插件源码不在同步范围内,也不会同步任何密钥或会话数据。
安装
在 DSH 里装(推荐,一行)
打开 设置 → 插件 → 安装插件,粘贴:
github:Wystan68/dsh-plugin-sync
或在终端装(需要 dsh 命令可用)
dsh plugin --profile desktop add github:Wystan68/dsh-plugin-sync
desktop 换成你正在用的 profile 名(不填 profile 时默认是 web)。桌面版可用完整路径调用:
"/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh" plugin --profile desktop add github:Wystan68/dsh-plugin-sync
装完重启 DSH,左侧栏会出现「插件同步」图标(第 6 个)。
使用
设同步密钥:打开面板,输入一把至少 8 位的密钥(例如
correct horse battery staple),点「设置」。密钥只在本机派生,明文不上传、不写入同步数据。两台设备用同一把密钥,面板上会显示相同的同步组码(如
qvi2a-jwfkq),表示它们在同一个组。之后任选一种方式:
- 同步码:A 点「生成同步码」复制,B 点「导入同步码」粘贴 → 预览差异 → 应用。
- 中转:在「加密中转」里部署或填写地址 → A 点「推送」,B 点「拉取」→ 预览差异 → 应用。也可勾选「自动拉取并应用」。
差异预览会列出:要安装的插件、要切换的启用状态、跳过项(本地链接插件、无安装来源)、版本差异提示。确认后再点「应用变更」。
同步语义
- 谁推送,以谁为准:同一同步组的远端只有一份最新快照,后推送的会覆盖先前的;应用后本机也变成这份清单的副本。
- 最小改动:只安装缺失的插件、只切换与远端不同的启用状态;未列出的插件不会被卸载。版本不同只提示,不自动升降级。
- 不会同步自己:插件同步自己的停用状态会被忽略,避免应用后界面消失。
- 安装来源:npm 包按
name@version安装;link:/file:本地插件在其它设备上没有源码目录,会列入「跳过」并提示手动安装。 - 账号通道:已登录 DeepSeek 账号时面板会显示账号信息;账号云同步接口尚未开放,当前同步由同步密钥驱动,接口就绪后可作为可选通道加入。
加密中转
一键部署(推荐)
在「加密中转」里填一个 Cloudflare API Token,点「自动部署」。Token 需要:
- Account Settings: Read
- Workers Scripts: Edit
- Workers KV Storage: Edit
插件会创建 dsh-plugin-sync KV 命名空间、上传 Worker(绑定 SYNC)、尝试开启 *.workers.dev 子域,最后把地址填回面板。每一步的结果都会显示。
手动部署
在面板里打开「手动部署」,复制 Worker 脚本,或在仓库里取 worker.mjs:
- Cloudflare 控制台 → Workers & Pages → 创建 Worker,粘贴脚本。
- 绑定 KV 命名空间,变量名必须是
SYNC。 - 部署后把
https://<worker>.<子域>.workers.dev填回面板。
中转协议
GET /health
GET /v1/snapshots/{group} → 密文信封 JSON,或 404
PUT /v1/snapshots/{group} → 写入信封
DELETE /v1/snapshots/{group}
Authorization: Bearer <由密钥派生的令牌>
- 载荷是端到端加密的 AES-256-GCM 密文,中转无法解密。
- 同一同步组第一次写入时,中转会把令牌的 SHA-256 钉在 KV 里;换成另一把密钥既读不到也覆盖不了这个组。
- 单次请求体上限 200 KB。
安全
- 密钥 → PBKDF2-SHA256(210,000 次)→ 32 字节主密钥;同步组码、中转令牌、加密密钥都由主密钥 HMAC 派生。
- 本机只保存派生后的主密钥(DSH 凭据库
plugin-sync/settings),明文口令不会落盘。 - 同步载荷在加密前先 gzip,使用随机 12 字节 IV 与 AAD(绑定同步组),防止跨组重放。
- 中转只存密文;删除同步组会同时删除令牌哈希。
卸载
在 设置 → 插件 里停用或移除「插件同步」,或:
dsh plugin --profile desktop remove dsh-plugin-sync
开发
纯 ESM,无运行时依赖,要求 Node.js ≥ 20。
node --test test/*.test.mjs # 36 个测试:密钥派生、加解密、同步码、差异计划、Worker、部署、Host 端到端
结构:
index.js Host 插件:/plugin-sync/api/state 与 /api/action(仅 owner 可访问)
client.js Client 插件:侧栏入口与面板 UI
lib/crypto.js 密钥派生、信封加解密、同步码编解码
lib/snapshot.js 读取并规范化本机插件清单
lib/diff.js 远端 vs 本机 → 差异计划
lib/apply.js 按计划执行安装与开关
lib/relay.js 中转读写、Worker 部署
worker.mjs Cloudflare Worker(中转服务端)
License
MIT
No comments yet. Be the first to write one.