DeepSeek Harness 存档会话管理插件:在设置面板管理归档会话(恢复/删除)与回收站。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:imrascal/dsh-archive
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DeepSeek Harness(DSH)归档会话管理插件:在设置面板中管理归档会话与回收站。
- 存档会话(Archived Sessions):查看已归档的会话(从侧边栏隐藏但记录保留),单个或全部恢复,或移入回收站。
- 回收站(Trash):查看已删除的会话,恢复、彻底删除(purge)单条,或清空全部。
删除是可逆的:删除会话 = 移入回收站(~/.dsh/trash),只有 purge / 清空才是永久删除。
运行中的(live)会话拒绝删除,UI 会给出明确提示。
安装
dsh plugin --profile web add github:imrascal/dsh-archive
或从本地目录安装:
dsh plugin --profile web add file:C:/path/to/dsh-archive
安装后重启应用(宿主插件随启动加载),再刷新页面即可在 设置 → 存档会话 看到本插件。
需要
pnpm在 PATH 中(dsh plugin是 pnpm 转发器)。
工作原理
本插件把一个原本以「内置包补丁」形式存在的功能(dsh-workspace / dsh-session-persistence-jsonl /
dsh-host-apiproxy / dsh-client-runtime / dsh-client-ui-workspace 等 12 个文件的本地改动,见
patches/ 参考补丁)重写为独立插件,并做了双路径设计:
| 路径 | 触发条件 | 行为 |
|---|---|---|
| 原生(native) | 宿主/客户端已带归档 API(如本仓库改过的安装) | 客户端直接调用 ctx.workspaces.unarchiveSession / trashList / ...,走宿主 RPC 与 store 帧同步,与内置实现完全一致 |
| 降级(fallback) | 升级后宿主或客户端回到原版(stock) | 宿主半在启动时自动补齐 sessionPersistence 的回收站层与 workspaceRegistry 的归档 API;客户端走插件自带的 /dsh-archive/session HTTP 接口 |
因此应用升级后功能不丢:回收站数据在 ~/.dsh/trash(与应用代码无关,升级天然保留);
归档集合在 workspace registry 的持久化状态中;无论升级后代码变成什么样,插件都会在运行时
feature-detect 并补上缺失的部分。
文件结构
dsh/index.js 宿主半:sessionPersistence 回收站层 + workspaceRegistry API + /dsh-archive/session 路由
dsh/client.js 浏览器半:设置面板「存档会话」区块(settings.section 插槽),零构建、仅依赖 react
cordis.patch.yml bundle 挂载声明
patches/ 内置补丁的参考 diff(宿主侧 6 个文件;客户端侧由插件直接取代)
scripts/ eval-check.mjs(客户端 factory 求值校验)与 host-logic-test.mjs(宿主半逻辑测试)
从「内置补丁」迁移到插件(可选)
如果你的 DSH 安装之前打过本地的存档管理补丁(本仓库的开发环境即是如此),插件与内置补丁会
重复注册同一个 archived-sessions 设置区块。迁移步骤:
- 恢复
node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/client.js为官方原版 (删除内置的 ArchivedSessionsSection 注册;宿主侧补丁可保留,插件会自动识别并 no-op)。 - 安装并重启本插件。
- 插件检测到同名区块已存在时会自动让位(stand down),避免重复;移除内置补丁后插件接管。
如果你希望宿主侧也回到官方原版(让插件全权接管),可先备份
~/.dsh数据目录,再按patches/的逆向来恢复宿主包,最后用本插件的宿主半自动补齐。回收站数据(~/.dsh/trash) 与归档集合不受影响。
数据安全
- 删除会话 → 移到
~/.dsh/trash/<sessionId>-<时间戳>/,可随时恢复。 彻底删除/清空回收站为永久操作,UI 有二次确认弹窗。- 附件为内容寻址共享存储,删除会话不会删除附件。
- 运行中的会话(live)不可删除,宿主返回
session-live,UI 提示先切换或重启。
兼容性
- 目标 DSH:
0.1.0-rc.5起,同时兼容原生 Web UI(dsh web浏览器访问)与桌面版 GUI (Electron 窗口)——两者共用同一套宿主服务与客户端 bundle,一份实现双端生效。 - 原版宿主(rc.5 未打补丁 / rc.6):宿主半运行时补齐回收站层与 registry API;客户端走
/dsh-archive/session降级接口。 - 自带该功能的宿主——rc.5 打了内置补丁的,以及上游已原生合并同一套后端的宿主:所有步骤自动
检测并 no-op;客户端直连原生
ctx.workspacesAPI。原生能力每次调用实时判定,服务晚到 (registry 放在 inject 门后)也会自动切回原生,不会永远卡在降级路径。 - 原生 API 只带一半(0.2.4 修复):上游是逐个方法补齐 registry API 的——DSH
0.1.7-rc.1原生有archiveSession/unarchiveSession,但没有deleteSession,persistence 也完全没有回收站层。插件现在逐方法特征检测:只补缺失的那几个(这里是deleteSession+trashList/trashRestore/trashPurge/trashEmpty与 persistence 回收站层),原生方法一律不覆盖。 0.2.3 及更早把「有unarchiveSession」当成「整套 API 都在」,直接跳过补丁 → 每次删除都报workspace registry backend is not available yet。 deleteSession采用 fail-closed:persistence 不具备回收站能力时拒绝删除(不删任何东西), 插件永远不会驱动官方硬删除后端。- 宿主半对每个补丁都有形状守卫,遇到不认识的形态安全跳过并打日志,不会拖垮应用。
- Cordis 4 严格注入(0.2.1 修复):DSH Desktop 新版携带
@deepseek-ai/cordis4.x,从 ctx 直接读服务属性(ctx.sessionPersistence)仅在当前 fiber 的inject声明了该服务时才允许, 否则抛cannot get property "X" without inject。宿主半改用ctx.get(...)与补丁方法的接收者this.ctx(Cordis 会 shadow 回注册表自身 fiber)解析服务——绝不通过registry.ctx读追踪 包装器(其ctx属性解析为调用方的 ctx)。旧版 Cordis 3.x 宿主两种写法都行;0.2.1 的写法 在 Cordis 4 上是必须的。 - 客户端双 store 重同步(0.2.2 修复):降级路径删除后,客户端现在同时刷新 workspaces 与 sessions 两个 store。0.2.0/0.2.1 只刷新了工作区视图——已删会话残留在旧 sessions 列表、又 不在任何工作区的 sessionIds 里 → 侧边栏把它渲染进未分组桶(直到下次整体刷新才消失)。
- 存储形态容错(0.2.3 修复):宿主半不再假设日志的查找返回形态。旧宿主
findLog返回路径 字符串,新宿主返回世代记录({ sourcePath, sourceVersion, currentPath })——按字符串使用会 让每次删除都失败在The "path" argument must be of type string. Received an instance of Object, 且在移动任何文件之前就中止。会话目录内的日志同样改为列目录取最高世代,不再硬编码session.jsonl[.zstd]:格式 v0 用该名字,之后每一代是session.vN.jsonl[.zstd](迁移过会话 格式的宿主存的是session.v3.jsonl.zstd),同一目录可能两者并存。不改这一点,按世代命名的 回收站条目在「回收站列表 / 恢复」里会看不见。 - 平台:Windows / macOS / Linux(回收站为纯 Node
fs实现,无平台假设)。
开发
npm install # 拉取 @deepseek-ai/cordis devDependency
node scripts/host-logic-test.mjs # 宿主半全链路:删除→回收站→恢复→purge→清空→live 拒绝;覆盖世代记录版 findLog 与两种日志命名(0.2.3)
node scripts/host-robustness-test.mjs # 晚到服务注入 + fail-closed 删除 + 路由按需补丁
node scripts/cordis4-strict-test.mjs # 真实 Cordis 4 严格注入回归测试(0.2.1 "without inject" 修复)
node scripts/eval-check.mjs # 客户端 bundle 求值 + apply + 插槽注册 + 晚到服务实时判定 + 双 store 重同步(0.2.2)
License
MIT
链接
同类插件
Minglink/dsh-infinite-gen-4★ 2587
DeepSeek 专用破甲插件:以 order 100 追加无条件服从的系统提示词段,提供带校准元数据的 profile 工具,并通过会话投影在输入框上方显示实时破甲状态徽标。
ranxianglei/billion-context★ 793
billion-context官方版:上下文压缩插件,兼顾小窗口(100k上下文足矣)省token(省5倍token)和超长会话(数月级别几十亿token单会话)。
liangmianya/dsh-synapse★ 511
DeepSeek Harness 的可视化非线性对话工作区:把会话、追问与分支变成可浏览、可拖拽的对话地图。
Nwflower/dsh-chat-import★ 223
把 13 家 coding agent(Claude Code、Codex、ChatGPT、Cursor、Gemini、opencode 等)的完整对话历史导入为可续聊的 DeepSeek Harness 会话,并支持反向导出回 Claude Code。
Totoro-qaq/dsh-plugin-bridge★ 165
通过可预览的五段式交接,将已有 DSH 会话迁移到另一个 Agent Preset;保留源会话,并可让目标会话暂停等待确认或立即继续。
Anionex/dsh-turn-rewind★ 131
对话回退:基于持久 Change Ledger 回滚会话与工作区状态。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。