- Accueil
- Plugins
- Outils et capacités
- dsh-workspace-sync
dsh-workspace-sync
coldrainlab/dsh-workspace-sync
Sync workspaces, session history and automations to your own cloud folder (any folder-synced backend), so a new machine picks up where you left off. The cloud folder holds plaintext session logs; workspaces hidden or locked by dsh-workspace-vault are not uploaded.
Installer
dsh plugin --profile web add github:coldrainlab/dsh-workspace-syncREADME
dsh-workspace-sync(工作区云同步)
把 DeepSeek Harness 的工作区列表、会话聊天记录和**自动化任务(定时任务)**同步到你自己选的一个「云端目录」,换一台电脑指向同一个目录,拉取后就能看到原来的工作和任务。
关于 DeepSeek 账号:DSH 的 DeepSeek 账号登录只提供身份、余额与推理鉴权,官方没有给第三方存用户数据的云空间(Files API 只能传图片、不能取回数据)。所以「登录账号即自动出现」无法在客户端实现;本插件把数据存到你自己的云端(网盘同步文件夹 / 以后接入的 WebDAV),DeepSeek 账号只用于命名空间与展示。
功能
- 双向同步:上传本地 → 合并远端 → 拉取远端;也可以只做「上传到云端」或「从云端恢复」。
- 同步内容:工作区(路径/标题/会话分组)、会话日志(
session.v4.jsonl.zstd)、自动化任务(schedule 任务行,含运行记录)。 - 本地豁免:隐藏空间(
<DSH_HOME>/hidden-space下的工作区)与加密工作区(dsh-workspace-vault记录的 id)不上传,云端的这类数据也不会被拉回本地;规则见下。 - 冲突安全:同一会话两台机器都改过时较新者胜,旧版本备份在云端
conflicts/,不会静默丢数据。 - 自动同步:启动后 15 秒一次 + 每 N 分钟一次(可在面板关闭或改间隔)。
- 可插拔后端:首版是「文件夹后端」(指向 OneDrive / 坚果云 / 任何同步盘里的目录);
lib/backends/已按接口预留 WebDAV 等实现位置。 - 面板:侧栏底部「☁ 云同步」入口 → 面板里配置云端目录、看状态、跑同步、看冲突与错误。
- 侧栏排布:「云同步」与「垃圾箱」(dsh-session-delete)合并成一行,中间一条细竖线分隔,两半各自居中;其它 footer 条目保持整行。
安装(桌面版)
本机已经装好(profile 里是 link: 指向本目录,改源码后宿主 HMR 会热加载;客户端改完刷新页面即可):
& "D:\Program Files\Deepseek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add "link:C:/Users/ROG-STRIX/Documents/deepseek-harness/DSH新增功能/dsh-workspace-sync"
已同时打包一份稳定版供分发/重装(tgz 内含 lib 与清单,不含测试):
C:\Users\ROG-STRIX\.dsh\plugin-archives\dsh-workspace-sync\v0.1.0\dsh-workspace-sync-0.1.0.tgz
卸载:
& "D:\Program Files\Deepseek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop remove dsh-workspace-sync
使用
- 点侧栏底部「☁ 云同步」。
- 在「云端目录」里填一个会被网盘同步的文件夹,例如:
- OneDrive:
C:\Users\<你>\OneDrive\DSH-Sync - 坚果云同步盘:
C:\Users\<你>\Nutstore\我的坚果云\DSH-Sync - 先用本地目录测试:
C:\Users\<你>\Documents\DSH-Sync
- OneDrive:
- 点「保存」→「立即双向同步」。
- 另一台电脑:装同一个插件 → 指向同一个云端目录 → 「从云端恢复」。工作区、会话、任务就会出现(工作区路径不存在时会自动建空目录)。
隐藏空间 / 加密工作区(不同步)
这两个功能由 dsh-workspace-vault 提供,数据只留本机,因此本插件把它们从同步中排除:
- 状态文件:
<DSH_HOME>/workspace-vault/state.json(默认~/.dsh/workspace-vault/state.json,由dsh-workspace-vault原子写入)。 - 排除对象:
hiddenWorkspaceIds与encryptedWorkspaceIds里的工作区(按storages/workspace.json里的本地 workspaceId 匹配);- 路径位于
<DSH_HOME>/hidden-space之下的工作区(resolve规范化后做前缀比较:尾分隔符、..、/与\都会归一;Windows 不区分大小写)。
- 应用位置:上传/合并时从工作区快照里移除这些条目,并收集它们的
sessionIds;扫描sessions/<projectKey>/<sessionId>/session.v4.jsonl.zstd时这些会话文件不读取、不哈希、不上传(拿不到 sessionId 时按 projectKey 与排除工作区路径的关系保守跳过;archivedSessionIds/pinnedSessionIds里的相关 id 也不传输)。从云端拉取时同样跳过这些工作区和会话,不写回本地,也不会因本地缺失而删除本地数据(保持并集语义)。 - 容错:状态文件缺失、JSON 损坏、字段类型不对都按「无排除」处理,只记告警,绝不中断同步。
<DSH_HOME>/hidden-space前缀规则不依赖状态文件,始终生效。 - 注意:判定依据是本机的状态文件;之前在云端 manifest 里留下的排除条目会在下一次上传时移除,但
objects/里的旧会话对象不会自动删除(见「已知限制」第 7 条)。
数据在哪
| 项 | 位置 |
|---|---|
| 插件配置 / 设备 id / 同步状态 | <DSH_HOME>/workspace-sync/(默认 ~/.dsh/workspace-sync/) |
| 工作区 vault 状态(排除依据,由 dsh-workspace-vault 维护) | <DSH_HOME>/workspace-vault/state.json |
| 隐藏空间工作区目录 | <DSH_HOME>/hidden-space/ |
| 云端目录(默认) | ~/Documents/DSH-Sync,可在面板改 |
| 云端实际布局 | <云端目录>/<命名空间>/manifest.json、objects/、devices/、conflicts/ |
| 命名空间 | 登录 DeepSeek 账号时按账号 id 派生(acct-<hash16>),否则 default |
objects/ 是内容寻址的会话日志原文件;manifest.json 是权威清单(工作区/任务文档 + 会话哈希)。写入全部是「临时文件 + rename」原子发布,网盘客户端不会看到半个文件。
已知限制(v0.1)
- 删除不跨设备传播:垃圾桶、永久删除、取消归档、取消置顶都不会同步;同步只做并集与较新者胜。
- 跨机器要求工作区绝对路径一致:不存在时会建空目录,但目录里的业务文件不随本插件同步(需要网盘/ git 自己同步项目目录)。
- 同一会话两台机器同时编辑:较新者胜,旧版本备份在云端
conflicts/,不自动合并事件流。 - 不同步附件/图片、插件与设置(体积大、跨机器易不兼容)。
- 首版无加密:云端目录里是明文 JSON / zstd 会话日志,请放在你自己可信的网盘;后续版本可加口令加密。
- 单文件 > 64 MiB 的会话会被跳过并记录,避免异常文件拖垮同步。
- 云端
objects/只增不删:内容寻址对象不会自动清理(自动同步每 5 分钟会把仍在写入的会话保存为新版本)。长期使用如需回收空间,可在确认所有设备都已同步后手动清理objects/里旧对象;后续版本会加保留策略 / GC。 - 隐藏空间 / 加密工作区不同步:见「隐藏空间 / 加密工作区(不同步)」一节。判定依赖本机 vault 状态文件;云端已有的旧
objects/不会自动删除(同第 7 条)。
已验证(2026-10-26,DSH 0.2.1-rc.3 / Windows)
| 项 | 结果 |
|---|---|
tests/merge.test.mjs | 24 tests / 24 pass |
tests/host.test.mjs | 23 tests / 23 pass |
tests/client.test.mjs | 21 tests / 21 pass |
tests/vault-exclude.test.mjs(隐藏空间/加密工作区排除:无/坏 state、id 命中、hidden-space 路径、拉取不写回) | 13 tests / 13 pass |
tests/e2e.two-homes.mjs(两套 DSH_HOME + 假 Cordis 上下文,走真实路由) | 3 tests / 3 pass:A 推送 → B 拉取,工作区/会话字节/定时任务全部到位 |
| 真机推送 | 56 个会话 / 41.3 MB / 3 个工作区,uploaded.count=56,无冲突 |
| 真机恢复 | 把云端快照拉进一个全新 DSH_HOME:56 个会话文件、3 个工作区(真实路径)完整还原 |
| 云端对象完整性 | 57 个对象全部存在、sha256 全部匹配 manifest |
| 宿主热加载 | GET /api/workspace-sync/health → {ok:true,version:"0.1.0"} |
| 客户端模块图 | dsh-feature-check:Loader entries 206→207、client modules 80→81,无 issue/warning |
| 自动同步 | onStart 15s 后自动跑了一次 two-way,lastDirection=two-way、lastSyncAt 已写入 |
开发
- 契约:
SPEC.md(数据格式、合并规则、路由、验收标准)。 - 文件:
lib/index.js(路由/定时器/apply 适配器)、lib/engine.js(同步引擎)、lib/merge.js(合并)、lib/backends/(后端)、lib/client.js(Web 面板)。 - 测试(用 DSH 自带 node 直接跑,不用
node --test):
$n = "C:\Users\ROG-STRIX\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\node\bin\node.exe"
& $n tests\merge.test.mjs
& $n tests\host.test.mjs
& $n tests\client.test.mjs
& $n tests\vault-exclude.test.mjs
& $n tests\e2e.two-homes.mjs
- 宿主接口(JSON,失败信封
{ ok:false, error:{ code, message } }):
| 方法 | 路径 | 作用 |
|---|---|---|
| GET | /api/workspace-sync/health | { ok, version, dshVersion } |
| GET | /api/workspace-sync/config | 读取配置与默认目录 |
| POST | /api/workspace-sync/config | 保存部分配置(backend/autoSync/namespace/scope/enabled) |
| GET | /api/workspace-sync/status | 状态(云端目录、上次同步、本地/云端数量、账号、自动同步) |
| GET | /api/workspace-sync/diff | 待上传/待拉取摘要 |
| POST | /api/workspace-sync/sync | { mode:"two-way"|"push"|"pull" } |
| GET | /api/workspace-sync/log | 最近同步记录 |
版本记录
0.1.2
- 同步排除
dsh-workspace-vault的隐藏空间与加密工作区:读取<DSH_HOME>/workspace-vault/state.json(缺失/损坏/字段类型错均视为无排除),按 workspaceId 与<DSH_HOME>/hidden-space路径前缀双重判定;push / pull / diff / status 四处生效,云端旧排除引用在 push 时清理 (objects/不 GC)。 - 新增
tests/vault-exclude.test.mjs(13 项);全量 84 项测试通过。
0.1.1
- 侧栏底部「云同步 / 垃圾箱」合并成一行;同步状态看板修正。
License
MIT
Plugins associés
archify (deepseek-harness)
tt-a1i/archify
WeKnora (dsh-weknora)
tencent/weknora
next-ai-draw-io (dsh-plugin)
dayuanjiang/next-ai-draw-io
weknora
tencent/weknora