dsh-archive-manager:在 DSH Web GUI 里查看、恢复与永久删除归档会话

前言

如果你日常用 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。它提供四件事:

  1. 一个 “Show archived” 视图开关,控制归档会话是否显示;
  2. 归档会话的样式与保护:红色标题、着色背景、”Archived” 徽章,点击受保护不可打开;
  3. 取消归档,让会话回到原工作区位置;
  4. 会话的永久删除,清理所有相关存储。

整个插件以单个 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 分支不会被级联删除。

接入方式。 宿主侧通过 WorkspaceRegistrySessionProjectionCache 的子类增加 unarchiveSession / deleteSessiondelete(id) / whenIdle(),以 Typert Remote 端点 workspaceRegistry/unarchiveSessionworkspaceRegistry/deleteSession 暴露,不影响旧版 /api/workspace.* 网关。客户端是一个 fork 的 dsh-client-ui-workspace 浏览器 bundle,负责视图开关、归档行样式、受保护的打开行为、行菜单、确认对话框和 toast,界面支持简体中文与英文。

交付形态。 这三个实现作为内部子模块(workspace、projcache、client)打进一个 npm 包,通过根目录的 cordis.patch.yml 禁用官方的 workspacesession-projection-cacheui-workspace 行,插入对应的 workspace-archive-managersession-projection-cache-archive-managerui-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.jsonglobal.archivedSessionIds 和各工作区的 sessionIds 不再包含该 id,~/.dsh\storages\session_projcache.jsontables.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 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜