前言¶
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 仓库 核实。
菜单与确认¶
- 打开已归档会话行的「…」菜单。
- 点击 彻底删除 / Shred session;第一次点击后文案变为 Confirm permanent delete(确认永久删除)。
- 第二次点击执行删除;关闭菜单会重置确认状态。
删除效果¶
- 成功后,该会话从工作区列表、未分组列表和归档集合中一并消失。
- 若日志目录已不存在但 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。
-
将插件源码放到稳定目录,例如
C:\plugins\dsh-shredder(路径与下文 JSON、pnpm 参数保持一致)。 -
编辑 profile manifest:
~/.dsh/profiles/<profile>/package.json,增加依赖与 bundle:
{
"dependencies": { "dsh-shredder": "file:C:/plugins/dsh-shredder" },
"dsh": { "profile": { "bundles": [ /* …existing bundles…, */ "dsh-shredder" ] } }
}
- 使用 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"
- 典型验证:归档某会话 → 打开其「…」→ 彻底删除 / 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。
典型用法¶
- 在 dsh 中将会话归档(归档会话仍可在对应工作区内通过视图过滤看到)。
- 在该会话行打开「…」菜单,确认出现红色删除行(未归档会话不会出现)。
- 第一次点击进入确认态,第二次点击执行;需要保留内容时,务必在操作前自行导出会话或日志。
适用场景与注意¶
适合谁: 已在用 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 版本为准。