Saltar al contenido principal
C

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.

Instalar

dsh plugin --profile web add github:coldrainlab/dsh-workspace-sync

README

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

使用

  1. 点侧栏底部「☁ 云同步」。
  2. 在「云端目录」里填一个会被网盘同步的文件夹,例如:
    • OneDrive:C:\Users\<你>\OneDrive\DSH-Sync
    • 坚果云同步盘:C:\Users\<你>\Nutstore\我的坚果云\DSH-Sync
    • 先用本地目录测试:C:\Users\<你>\Documents\DSH-Sync
  3. 点「保存」→「立即双向同步」。
  4. 另一台电脑:装同一个插件 → 指向同一个云端目录 → 「从云端恢复」。工作区、会话、任务就会出现(工作区路径不存在时会自动建空目录)。

隐藏空间 / 加密工作区(不同步)

这两个功能由 dsh-workspace-vault 提供,数据只留本机,因此本插件把它们从同步中排除:

  • 状态文件:<DSH_HOME>/workspace-vault/state.json(默认 ~/.dsh/workspace-vault/state.json,由 dsh-workspace-vault 原子写入)。
  • 排除对象:
    1. hiddenWorkspaceIds 与 encryptedWorkspaceIds 里的工作区(按 storages/workspace.json 里的本地 workspaceId 匹配);
    2. 路径位于 <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)

  1. 删除不跨设备传播:垃圾桶、永久删除、取消归档、取消置顶都不会同步;同步只做并集与较新者胜。
  2. 跨机器要求工作区绝对路径一致:不存在时会建空目录,但目录里的业务文件不随本插件同步(需要网盘/ git 自己同步项目目录)。
  3. 同一会话两台机器同时编辑:较新者胜,旧版本备份在云端 conflicts/,不自动合并事件流。
  4. 不同步附件/图片、插件与设置(体积大、跨机器易不兼容)。
  5. 首版无加密:云端目录里是明文 JSON / zstd 会话日志,请放在你自己可信的网盘;后续版本可加口令加密。
  6. 单文件 > 64 MiB 的会话会被跳过并记录,避免异常文件拖垮同步。
  7. 云端 objects/ 只增不删:内容寻址对象不会自动清理(自动同步每 5 分钟会把仍在写入的会话保存为新版本)。长期使用如需回收空间,可在确认所有设备都已同步后手动清理 objects/ 里旧对象;后续版本会加保留策略 / GC。
  8. 隐藏空间 / 加密工作区不同步:见「隐藏空间 / 加密工作区(不同步)」一节。判定依赖本机 vault 状态文件;云端已有的旧 objects/ 不会自动删除(同第 7 条)。

已验证(2026-10-26,DSH 0.2.1-rc.3 / Windows)

项结果
tests/merge.test.mjs24 tests / 24 pass
tests/host.test.mjs23 tests / 23 pass
tests/client.test.mjs21 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 relacionados