dsh-shredder:在原生会话菜单里彻底删除已归档会话

前言

DeepSeek Harness(dsh)会把会话归档后仍保留日志目录与归档记录,便于日后取消归档。长期下来,归档区里会堆着确定不再需要的会话:占磁盘、占列表,而宿主本身不提供「从归档直接永久删除」这一动作。社区里也有带归档面板、批量操作的插件;若你只想在会话行自己的「…」菜单里补上一刀,且不要额外面板或侧边栏,dsh-shredder(碎纸机)就是针对这一缺口的客户端 bundle 插件。

这是什么

dsh-shredder 由社区组织 LEEKINBUN-dsh-tools 维护,当前 npm 包版本为 0.2.1(MIT)。它不是 DeepSeek 官方产品,通过 Cordis bundle 注入客户端:在原生会话行「…」菜单中、紧挨「取消归档」下方,增加一行红色 彻底删除 / Shred session,且仅当该会话已归档时才会出现;普通未归档会话在这里看不到删除项。

归档列表仍由 dsh 自带的工作区视图与 View options → hide / show / only archived 过滤完成,本插件不另做归档页、侧边栏入口或批量删除。

核心功能

下面介绍 README 中已写明的行为,均可对照 GitHub 仓库 核实。

菜单与确认

  1. 打开已归档会话行的「…」菜单。
  2. 点击 彻底删除 / Shred session;第一次点击后文案变为 Confirm permanent delete(确认永久删除)。
  3. 第二次点击执行删除;关闭菜单会重置确认状态。

删除效果

  • 成功后,该会话从工作区列表、未分组列表和归档集合中一并消失。
  • 若日志目录已不存在但 id 仍留在归档集合(陈旧归档记录),同一菜单项会改为仅清除记录,并给出相应提示。

刻意不提供的能力

  • 无归档面板、无额外页面、无侧边栏项;无批量删除、搜索、预览、先恢复再打开。
  • 无回收站、无撤销。「Shred」指从文件系统 unlink 会话目录,并不覆写磁盘块;恢复只能依赖文件恢复工具,成功率不保证。

实现概要(供排查)

宿主侧 lib/index.js 提供 loopback HTTP;客户端 lib/client.js 在 sidebar.workspaces.session.menu.item(order: 450)注入菜单行。删除接口:

Method Path Body Result
POST /dsh-shredder/delete { sessionId } { ok, action: 'deleted' \| 'record-only', … }

删除顺序包括:经官方 workspace/session-stop 停任务、flush、从 session store 驱逐实例、WorkspaceEntity.detachSession、删除 <session root>/<project>/<id>/、再 unarchiveSession 清归档记录等;并在 +2s / +6s / +15s 做后台复查,以防迟到的 flush 把目录写回。

环境与要求

  • 作者在 dsh 0.2.0-rc.2 上验证;更旧宿主可通过 fallback 路径支持(缺少公开 unarchiveSession 时能力受限),但以当前发布为准。
  • 需要加载 bundle 的 profile(随 dsh 提供的 desktop / web)。
  • Node >= 20(见 package.json 的 engines)。

安装与启用

安装方式以 README 为准:通过 profile 的 package.json 声明 file: 依赖并把 bundle 名写入 dsh.profile.bundles,再用 dsh 自带的 pnpm 安装。bundle 在进程启动时解析,仅刷新页面不够,需重启 dsh。

  1. 将插件源码放到稳定目录,例如 C:\plugins\dsh-shredder(路径与下文 JSON、pnpm 参数保持一致)。

  2. 编辑 profile manifest:~/.dsh/profiles/<profile>/package.json,增加依赖与 bundle:

{
  "dependencies": { "dsh-shredder": "file:C:/plugins/dsh-shredder" },
  "dsh": { "profile": { "bundles": [ /* …existing bundles…, */ "dsh-shredder" ] } }
}
  1. 使用 dsh 安装目录内的 pnpm 安装并重启 dsh。桌面版 profile 一般为 desktop;该环境下 dsh --profile desktop --dump-config 会被拒绝(由 Electron 独占管理),可通过重启后打开归档会话的「…」菜单验证是否出现删除行:
& "<dsh install>\resources\runtime\pnpm\bin\pnpm.cjs" --dir "$HOME\.dsh\profiles\<profile>" add "file:C:/plugins/dsh-shredder"
  1. 典型验证:归档某会话 → 打开其「…」→ 彻底删除 / Shred session → 连续点击两次。

修改本地源码后更新

file: 依赖会以拷贝形式安装,不是符号链接。只删 node_modules 再 pnpm install 可能不会重新拷贝(pnpm 可能报 Already up to date,插件静默不再挂载)。应重新声明依赖并确认输出含 Packages: +1,必要时对比两侧 lib/*.js 的 sha256 后重启:

Remove-Item "$HOME\.dsh\profiles\<profile>\node_modules\dsh-shredder" -Recurse -Force
& "<pnpm.cjs>" --dir "$HOME\.dsh\profiles\<profile>" add "file:C:/plugins/dsh-shredder"

卸载

从 dependencies 与 dsh.profile.bundles 中移除对应项,再执行安装并重启。若只想停止挂载而不删依赖,可只移除 bundles 项。不要用树中不存在的 id 写 disabled: true,否则每次启动 stderr 会出现 patch: entry "shredder" not found。

典型用法

  1. 在 dsh 中将会话归档(归档会话仍可在对应工作区内通过视图过滤看到)。
  2. 在该会话行打开「…」菜单,确认出现红色删除行(未归档会话不会出现)。
  3. 第一次点击进入确认态,第二次点击执行;需要保留内容时,务必在操作前自行导出会话或日志。

适用场景与注意

适合谁: 已在用 dsh 原生归档流程、偶尔需要永久清理个别归档会话、且希望操作留在会话行菜单里的桌面或 Web profile 用户。

权限与安全: 插件以当前 dsh 进程的权限运行,删除的是本机(或当前宿主可见的)会话目录。安装前请阅读源码与 MIT 许可证,确认信任维护者与删除逻辑。

不可逆与边界(README Known boundaries):

  • 删除前请导出可能需要的内容。
  • 会话实例正忙、或当前进程未驻留该会话时,可能出现「文件已删但归档行暂留」;客户端会尝试通过官方 sessions 服务 refresh() 后再清记录,失败时行仍显示为归档,后台约 15 秒内可能清掉延迟实例的记录。
  • 其他浏览器标签在部分「absent」场景下不会即时收到通知,需自行重新拉列表。
  • 旧格式会话日志删除可能更慢(与 sessionPersistence.stat() 对整个 session 根目录的 stat 有关,非本插件单独引入的 I/O)。
  • 碎纸后会话日志目录被移除;storages/session_projcache/sessions/ 下的投影缓存及 attachments/ 中内容寻址上传等仍由 dsh 自身管理,本插件不清理。
  • 固定(pin)与会话归档在 dsh 中互斥,经此菜单操作的会话不会处于 pin 状态。

结尾

dsh-shredder 在 DeepSeek Harness「一切皆插件」的社区生态里,只补一件事:在原生会话菜单里给已归档会话增加红色「彻底删除」,两步确认、无额外归档 UI。目录与源码:

  • SkillHub 目录页:https://www.skillhub.cn/plugins/LEEKINBUN-dsh-tools/dsh-shredder
  • GitHub:https://github.com/LEEKINBUN-dsh-tools/dsh-shredder

社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系;使用前请以仓库 README 与本地 dsh 版本为准。

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

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

Xiaoye