dsh-ownsync
把 DeepSeek Harness(DSH)的工作区登记、会话和聊天附件同步到你自己的 Git 服务器, 换台电脑接着用。
界面只有三个按钮:上传、下载、检查更新。没有自动同步、没有分支、没有合并。
它怎么工作
服务器上就是一个普通的空仓库:
git init --bare /srv/git/dsh-sync.git
每次「上传」会:
- 扫描本机数据目录里的三类内容(见下);
- 把文件写进本地同步仓库
.ownsync/repo.git; - 生成一个只含当前内容的根提交,推到
main。
所以服务器上的 main 是一份可以直接 git clone 下来的快照,仓库体积等于当前内容,
不会随着上传次数膨胀。
每次「下载」会:
- 取回
main; - 按文件写回本机(覆盖前先把原件存到
.ownsync/backup/); - 记录本机基线版本。
服务器是唯一权威:服务器有什么,本机就变成什么。
同步什么
| 类别 | 内容 |
|---|---|
| 工作区 | storages/workspace.json:全部工作区、标题、顺序、会话归属、归档状态 |
| 会话 | sessions/** 下每个会话的最高代际日志 |
| 聊天附件 | attachments/** 中被上述会话日志引用到的文件 |
不同步:项目文件夹里的代码文档、settings.yaml、cordis.patch.yml、插件清单、
凭据、缓存、日志、AGENTS.md、skills/。
只有 header、没有任何事件的空白会话也不参与同步。
界面
侧栏左下角(头像上方)是一张卡片:
┌──────────────────────────────┐
│ ● 已同步 │
│ 本机 v12 │
│ 服务器 v12 │
│ 上次同步 2026-11-08 12:30 │
│ [ 上传 ] [ 下载 ] [ 检查更新 ] │
└──────────────────────────────┘
⟳ 同步 ← 点它打开设置弹层
- 上传 / 下载:按当前状态自动启用或禁用,禁用时悬停会说明原因;
- 检查更新:任何状态都能按,立刻向服务器 fetch 一次版本;
- 同步:打开设置弹层(仓库地址、分支、两个刷新间隔)。
状态与按钮
| 状态 | 含义 | 可用按钮 |
|---|---|---|
| 未填写仓库地址 | 还没配置同步仓库 | 无 |
| 尚未检查服务器 | 还没连过服务器 | 无(先点「检查更新」) |
| 无法连接服务器:… | 地址、网络或认证问题 | 无 |
| 服务器上还没有内容,建议上传 | 服务器是空仓库(首次使用) | 上传 |
| 本机尚未下载 | 本机还没有服务器基线 | 下载 |
| 有会话待写回本机 | 有会话被宿主占用,等重启后写回 | 下载 |
| 本机有 N 处未上传改动 | 本机内容比服务器新 | 上传 |
| 服务器版本较新,建议下载 | 另一台电脑传过更新 | 下载 |
| 本机版本较新,建议上传 | 本机有内容还没传 | 上传 |
| 本机与服务器内容不同 | 两边版本号相同但内容不同 | 上传 / 下载 |
| 已同步 | 两边一致 | 无 |
两个刷新间隔
设置弹层里可以改,单位秒,范围 1–600:
| 设置 | 默认 | 行为 |
|---|---|---|
| 本机状态刷新间隔 | 5 秒 | 读版本、pending、改动数,纯本地扫描,不联网 |
| 服务器自动检查间隔 | 10 秒 | 每次 git fetch,只刷新版本状态 |
两个间隔都保存在本机浏览器里(不参与同步);页面在后台或正在上传/下载时会跳过自动检查。 自动检查不抢焦点、不打断输入。
使用前提
- 同一时间只有一台电脑在改内容;
- 换电脑之前,先在原来那台点「上传」;
- 到新电脑先点「下载」,再开始用。
按这个顺序用,就不会出现两份都改过、需要合并的情况。
插件调用的是系统 PATH 里的 git(Windows 上是 Git for Windows,DSH 不自带)。 如果点上传/下载时提示「这台电脑上找不到 git 命令」,安装 Git for Windows 后 完全退出并重新打开 DSH 即可,消息里会列出当前 PATH 方便排查。
安装
插件发布在 npm(或你们自己的 registry)上,直接在 DSH 里装:
- 打开 DSH → 设置 → 插件;
- 输入包名
dsh-ownsync,点安装; - 完全退出 DSH 再打开。
等价的命令行安装:
# Web 端
dsh plugin --profile web add dsh-ownsync
# Windows 桌面端
& "$env:LOCALAPPDATA\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add dsh-ownsync
升级时指定版本,例如 dsh-ownsync@1.1.0,装完同样要完全退出再打开。
如果 DSH 用的不是公共 npm,需要先在 profile 的
.npmrc里配置 registry, 或在安装命令后加--registry <地址>。
第一次使用
1. 准备服务器
在服务器上建一个空仓库:
git init --bare /srv/git/dsh-sync.git
不要设置 receive.denyNonFastForwards:每次上传都是一次强制推送。
2. 配好 git 凭据
插件不弹任何登录窗口,先把这台电脑的 git 访问打通:
- SSH:
ssh-keygen生成密钥,把公钥加到服务器,ssh -T user@host能通; - HTTPS:在终端执行一次
git ls-remote <仓库地址>,按提示输入账号与访问令牌, 交给系统 Git 凭据管理器保存。
3. 填仓库地址
打开 DSH,点侧栏左下「同步」,填入仓库地址(例如
ssh://git@backup.example.com:2222/srv/git/dsh-sync.git),点「保存」。
4. 第一次上传(在已经有内容的那台电脑)
点「检查更新」。因为服务器还是空仓库,状态会显示**「服务器上还没有内容,建议上传」**, 此时只有「上传」可用;点一下就在服务器上建出 v1。
5. 在新电脑第一次下载
装好插件、填同一个地址,点「检查更新」→ 状态变成「服务器版本较新,建议下载」→ 点「下载」。
- 覆盖前会把本机原件备份到
.ownsync/backup/; - 下载完成后完全退出 DSH 再打开,新会话才会出现在侧栏;
- 如果目标会话正被占用,会走「切空白会话 + 提示重启」的流程。
6. 之后
- 换电脑前:在原机器点「上传」;
- 到新机器:点「检查更新」,再点「下载」;
- 同一时间只在一台电脑上改内容。
安全边界
- 下载会覆盖本机:覆盖前把原件存到
<数据目录>/.ownsync/backup/<时间>/files/…, 需要时可以手工拷回; - 一次删掉多个文件要确认:上传时如果发现本机少了 3 个以上(或超过一半)上次同步过的 文件,会先让你确认,并把服务器上的旧版本备份到本机;
- 本机有未上传改动时下载要确认:确认后以服务器为准;
(DSH 打开会话时追加的
session/end-seed标记不算改动); - 上传是「比较交换」:如果服务器在你上次下载之后被改过,上传会被拒绝并提示先下载, 不会覆盖别人的内容;
- 服务器只是传输通道,不是备份:真正的备份责任在本机的数据目录和
.ownsync/backup。
已知限制
- 下载写回会话后需要重启 DSH 才能看到:DSH 页面显示的是打开会话时读到的内容, 宿主进程重启才会重新读盘;下载结果只提示"重启后可见",不提供按钮;
- 会话被占用时下载会引导重启:写入权归活着的 Agent,切走界面不一定释放,只有进程退出 才释放。遇到被占用的会话时,插件会切到空白会话并提示重启;重启后自动补写并尽量跳回原会话, 没抢到时机就停在「有会话待写回本机」,再点一次「下载」即可;
- 插件无法自动重启 DSH:桌面端的宿主是 Electron 以纯 Node 模式拉起的子进程,没有 Electron API,也没有可用的 CLI 重启命令,所以「重启 DSH」按钮只能给出手动指引;
- 会话正在生成时上传会被拒绝:等这轮回复结束再点;
- 会话日志只追加,所以下载时如果发现服务器版本比本机长,会通过宿主接口追加而不是整体替换;
- 单文件上限 256 MiB(会话和附件),超过的附件会被跳过并列在上传结果里。
致谢
本插件基于 chatsync 插件(https://github.com/dpskk2/dsh-chatsync)修改而来:同步范围、 会话日志的处理方式、宿主写入接口等思路都来自 chatsync,ownsync 在这之上删掉了不需要的部分 (托管平台 API、分支合并、自动同步等),改成面向自建 Git 服务器的手动同步。
如果你需要的是 GitHub / Gitee 等代码托管平台的同步(自动同步、平台侧历史、多分支等), 请优先使用 chatsync,那才是它为这些场景做的。
目录
lib/
index.js 插件入口(挂接口、启动补写、注册页面)
engine.js 上传 / 下载 / 状态 / 待写回补写
scope.js 同步范围(三类内容)
snapshot.js 本机快照与清单
apply.js 把远端快照写回本机
sessions.js 会话日志解析、校验、内容指纹
session-path.js 会话 id 与代际
session-transfer.js 经宿主接口写入会话
recovery.js 覆盖前的原件备份
host-restart.js 尝试重启宿主(Electron / 手动降级)
git-repo.js 裸仓库、写树、CAS 推送
git.js git 子进程封装
git-failure.js git 错误归类
config.js ownsync.json
http/ 接口、来源校验
src/client/ 浏览器端源码(拼接成 lib/client.js)
tests/ node:test 回归(不碰真实数据目录)
开发
npm test # 全部测试
npm run build:client # 修改 src/client 后重新生成 lib/client.js
npm run check:client # 只检查产物是否最新
发布新版本(维护者)
npm run build:client -- --check
npm test
npm pack --dry-run # 确认包里只有 lib/、locale/、cordis.patch.yml、README、LICENSE
npm version patch # 或 minor / major
npm publish --access public # 私有 registry 用 --registry <地址>
发布后,其他人在 DSH 插件界面输入 dsh-ownsync 即可安装;升级时安装命令里指定版本。
No comments yet. Be the first to write one.