前言¶
桌面版 DeepSeek Harness(DSH)的 workspace.json 只能由宿主进程写入,外部进程去改这个文件,要么被静默覆盖,要么破坏完整性校验,导致工作区面板加载失败。另一个常见问题是:把会话挂进工作区时,只更新了成员列表,客户端的会话摘要表(sidebar)不会同步出现。
这个插件从宿主内部把这两个缺口一起补上:写入只经过宿主,登记时发出官方客户端消费的 api-session/added 事件,归档由注册表自己发布持久化。
插件定位¶
- 名称:dsh-workspace-hot
- 维护者:thdlrt
- 核心价值:让运行中的 DSH 具备「从外部创建 / 归档会话」的能力,不重启、不刷新页面
- 分类:工作流
安装与启用¶
安装前请确认 DSH 桌面版版本不低于 0.2.0-rc.2。
dsh plugin --profile web add dsh-workspace-hot
安装后重启宿主一次,让插件与它的宿主侧服务加载。此后登记和归档都即时生效,不再需要重启。
核心功能¶
1. 外部进程写入只经过宿主¶
插件运行在宿主进程内部,调用公开的注册表 API:
- create
- attachSession
- archiveSession
- unarchiveSession
workspace.json 始终只有一个写者,避免外部进程直接修改文件导致的冲突。
2. 通知客户端会话摘要¶
登记时发出 api-session/added 事件,客户端侧边栏立即出现该会话,无需手动刷新。
3. 归档是宿主的持久化写入¶
归档集由注册表自己发布,UI 自动更新。归档不会删除任何 session-* 文件,只是从各个分组界面隐藏。
请求协议¶
任何丢进 $DSH_HOME/dsh-workspace-hot/requests/(默认 ~/.dsh/dsh-workspace-hot/requests/)的 JSON 就是一条请求。先写 <id>.json.tmp 再重命名,避免读到写了一半的文件。
请求字段:
| 字段 | 类型 | 必填 | 含义 |
|---|---|---|---|
version |
1 |
是 | 协议版本 |
id |
字符串 [A-Za-z0-9_-]{1,100} |
是 | 必须等于文件名主干,也是回执文件名 |
action |
register | archive | unarchive |
否,默认 register |
操作类型 |
workspacePath |
绝对路径 | register 必填 |
要创建或复用的工作区 |
sessionId |
session-… |
register 可选;归档类必填 |
要放入或隐藏的会话 |
title |
非空字符串 | 否 | 工作区新建时的标题 |
stopActivity |
布尔 | 否 | 会话正在跑时强制归档(默认宿主会拒绝) |
回执写入 receipts/<id>.json:
{ "version": 1, "id": "register-…", "ok": true,
"action": "register", "workspaceId": "…", "workspacePath": "E:\\code\\app",
"sessionId": "session-…", "registered": true, "summaryPublished": true,
"completedAt": "2026-10-22T06:29:41.512Z" }
ok: false 一定带 error。归档回执报 archived(最终状态)与 changed(本次是否真的改动)。
命令行助手(Windows PowerShell)¶
两个脚本都会先校验 status.json(插件已加载、版本匹配、pid 存活),宿主没就绪就什么都不碰。
# 把会话放进工作区,并发布会话摘要
.\register-workspace.ps1 -WorkspacePath 'E:\code\app' -SessionId 'session-…'
# 隐藏 / 恢复会话(文件保留,位置可还原)
.\session-actions.ps1 -Action archive -SessionId 'session-…'
.\session-actions.ps1 -Action unarchive -SessionId 'session-…'
# 强制归档仍在运行的会话
.\session-actions.ps1 -Action archive -SessionId 'session-…' -StopActivity
# 查看插件状态
.\register-workspace.ps1 -Check
DSH 目录不在 ~/.dsh 时加 -DshHome。
典型用法:从外部派发会话¶
派发系统通常把活干在另一个进程里(dsh --profile headless <task>)。那个会话是真实存在的,但它诞生于桌面宿主之外,左栏什么都没有。接着只剩两个坏选择:重启 app(对话没了),或者手改 workspace.json(数据可能没了)。
有了这个插件,外部派发者可以:
- 起会话;
- 写一条
register请求; - 它立刻出现在左栏——能点开、能续聊、能归档。
同一条通道也覆盖清理:把一次性会话归档而不删文件,需要时再取消归档回到原位。
兼容性与限制¶
- 基于 DSH
0.2.0-rc.2桌面版(Cordis 插件 API,ctx.inject/ctx.effect)。 - 注入
workspaceRegistry、sessionPersistence、sessionQuery、sessions、agents。若未来版本改了其中某个名字,插件会激活失败并在~/.dsh/logs/dsh-workspace-hot.log写明原因。 - 登记要求会话已落盘(
sessionPersistence.stat),且其 header 的cwd解析后等于目标工作区——这条校验属于宿主,是有意为之。 - 归档不是删除:
session-*文件仍留在磁盘,注册表只是把它从各个分组界面隐藏。 - 文件队列意味着「同机同用户」。它不开网络监听,也没有需要配置的鉴权。
生态背景¶
DSH 理念是「一切皆插件」。社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。
- 插件目录页:https://www.skillhub.cn/plugins/thdlrt/dsh-workspace-hot
- GitHub 仓库:https://github.com/thdlrt/dsh-workspace-hot