前言¶
如果你日常用 DeepSeek Harness(DSH)的 Web GUI,可能遇到过这样的情况:会话归档之后,侧边栏里就再也找不到了。底层确实维护着一个全局的 archivedSessionIds 集合,但官方 UI 没有提供任何入口去查看归档会话、取消归档,更不用说永久删除一个会话。简单地从列表里把归档会话隐藏掉,只会让它们在 GUI 层面彻底不可恢复;而删除一个会话又要按顺序清理多个相互独立的存储——转录目录、工作区账目、归档标记、投影缓存——顺序错了就会留下残留。
dsh-archive-manager 就是为填补这块空缺而写的。下面介绍它的功能、安装方式和典型用法。
这是什么¶
dsh-archive-manager(npm 包名 @gamegeek-saikel/dsh-archive-manager,当前版本 0.1.1)是 Saikel-Orado-Liu 维护的一个面向 DSH Web GUI 的归档会话管理插件,MIT 许可证,目标平台为 web。它提供四件事:
- 一个 “Show archived” 视图开关,控制归档会话是否显示;
- 归档会话的样式与保护:红色标题、着色背景、”Archived” 徽章,点击受保护不可打开;
- 取消归档,让会话回到原工作区位置;
- 会话的永久删除,清理所有相关存储。
整个插件以单个 npm 包交付,官方包文件零修改。这一点后面展开讲。
核心功能¶
视图开关。 “Show archived” 选项与分组、排序放在同一个持久化存储 dsh.workspace.view.v5 里,重启浏览器后选择仍然保留。分组列表、平铺列表和搜索共用同一条可见性推导路径,所以归档会话在所有界面上的显示与隐藏是一致的。
归档样式与保护。 归档行以红色标题、着色背景和 “Archived” 徽章展示。点击归档会话不会打开它,而是弹出 toast 提示,消息发送也被阻止。归档行的行菜单只包含 [Unarchive, Delete session] 两项。
取消归档。 归档操作从来不会移动会话在工作区账目中的位置,所以 unarchiveSession 只是把它从全局 archivedSessionIds 集合里移除,会话就会恢复到原工作区位置。这个操作是幂等的。
永久删除。 deleteSession 在注册表的操作队列里串行执行,顺序是固定的:flush → detach(session/disposed)→ 等待投影缓存的 write-behind 落盘(whenIdle)→ 删除转录目录 → 清除归档标记 → 移除工作区账目 → 删除投影缓存行 → 尽力而为的子代理级联与溢出清理。每个会失败的步骤都是幂等可重试的,重试可以修复半删除状态。子代理级联只作用于 origin 为 subagent 的子会话,fork 分支不会被级联删除。
接入方式。 宿主侧通过 WorkspaceRegistry 和 SessionProjectionCache 的子类增加 unarchiveSession / deleteSession 与 delete(id) / whenIdle(),以 Typert Remote 端点 workspaceRegistry/unarchiveSession 和 workspaceRegistry/deleteSession 暴露,不影响旧版 /api/workspace.* 网关。客户端是一个 fork 的 dsh-client-ui-workspace 浏览器 bundle,负责视图开关、归档行样式、受保护的打开行为、行菜单、确认对话框和 toast,界面支持简体中文与英文。
交付形态。 这三个实现作为内部子模块(workspace、projcache、client)打进一个 npm 包,通过根目录的 cordis.patch.yml 禁用官方的 workspace、session-projection-cache、ui-workspace 行,插入对应的 workspace-archive-manager、session-projection-cache-archive-manager、ui-workspace-archive-manager 行。官方包文件不做任何修改。
测试方面,项目有 22 个测试用例,覆盖 4 个 node:test 套件:host、client bundle、client remote 和 installed copies。
安装与启用¶
先确认 Node 版本满足 ^22.19.0 || >=24.0.0,然后用 DSH CLI 安装:
npx @deepseek-ai/dsh plugin --profile web add @gamegeek-saikel/dsh-archive-manager
如果已经全局安装了 DSH CLI,可以用 dsh 代替 npx @deepseek-ai/dsh。
安装时 DSH CLI 会应用包内的 cordis.patch.yml,也就是上面提到的:禁用官方三行,插入 archive-manager 三行。安装完成后启动 DSH Web:
npx @deepseek-ai/dsh web
如需回滚或卸载:
npx @deepseek-ai/dsh plugin --profile web remove @gamegeek-saikel/dsh-archive-manager
典型用法¶
安装并重启 DSH Web 后,可以在界面上逐项验证:
1、打开视图选项菜单,找到与分组、排序并列的 “Show archived” 项(以分隔符隔开)。切换它可以显示或隐藏归档会话,分组列表、平铺列表和搜索结果都生效。
2、归档行显示为红色标题加着色背景,带 “Archived” 徽章。点击它不会打开会话,而是弹出 toast:”This session is archived. Unarchive it to continue the conversation.”,消息发送保持被阻止。
3、归档行的行菜单只有 [Unarchive, Delete session]。选择 Unarchive 后,会话恢复正常样式、可以打开,并回到它原来的工作区位置。
4、普通会话的行菜单新增一个 danger 样式的 “Delete session” 项。删除走两步确认对话框,提示文本为 “This permanently deletes session … This cannot be undone.”。确认后会话被永久移除;如果删除过程中某一步失败,对话框保持打开,可以重试。
5、删除当前正在打开的会话时,输入框置灰、会话行消失,UI 不会崩溃。
删除完成后可以核对磁盘状态:~/.dsh\sessions\…\session-<id>\ 目录不存在,~/.dsh\storages\workspace.json 中 global.archivedSessionIds 和各工作区的 sessionIds 不再包含该 id,~/.dsh\storages\session_projcache.json 的 tables.sessions 中也不再包含该 id。
适用场景与注意¶
这个插件适合的场景很明确:你在 DSH Web 里归档过会话,又希望在 GUI 里能再看到它们、必要时恢复,或者干脆彻底删除以清理磁盘残留。删除流程对顺序和幂等的处理比较严格,重试即可修复半删除状态,这是它区别于“直接改文件”方案的地方。
使用前有几点需要注意:
1、删除是永久操作,不可撤销。确认对话框的两步设计就是为此,但操作前仍建议想清楚。
2、插件以当前 dsh 进程的权限运行,能接触会话存储与相关配置。安装前请到 GitHub 仓库检查源码与许可证(本项目为 MIT),确认接受再安装。
3、Node 版本需满足 ^22.19.0 || >=24.0.0。
4、子代理级联删除只覆盖 origin 为 subagent 的子会话,fork 出来的分支不会被级联删除,这一点在评估删除影响时可以放心。
结尾¶
dsh-archive-manager 做的事情不复杂,但做得很守规矩:不改官方包文件、用一条串行化的删除流程处理多个存储、每个失败步骤幂等可重试。对需要在 DSH Web GUI 里管理归档会话的用户来说,它补上了官方 UI 缺失的那几块拼图。
插件收录于社区插件目录(独立站点,与 DeepSeek / 幻方无官方从属关系):https://www.skillhub.cn/plugins/Saikel-Orado-Liu/dsh-archive-manager ,源码与问题反馈见 GitHub:https://github.com/Saikel-Orado-Liu/dsh-archive-manager 。