dsh-delete:DSH 会话删除与图片管理

前言

在 DeepSeek Harness(DSH)里长期跑智能体会话,左侧栏会堆满根会话、子 agent 和团队成员;磁盘上还可能留下「列表里已经看不见、但文件还在」的残留目录。另一方面,一个会话里图片攒多了,可能触达路由对单条请求的图片字节或张数预算,新消息直接被拒绝——这和「单条消息最多添加几张图」是两套限额,单靠调 dsh-attachment-local 的 maxImagesPerMessage 解决不了历史撑爆的问题。

dsh-delete(维护者 ycm50,仓库 ycm50/dsh-delete)把两类能力装在同一插件包里:侧边栏多选删除会话(含磁盘文件与 DSH 归档),以及右侧栏页签里的图片统计、摘除与可选删盘。实现全部走官方插槽、右侧栏页签与 web server 路由,不改 DSH 本体源码。当前版本 0.2.0,MIT 许可,要求宿主 DSH >= 0.2.0-rc.1。

社区目录页:https://www.skillhub.cn/plugins/ycm50/dsh-delete(SkillHub 为独立社区站点,与 DeepSeek / 幻方无官方从属关系)。

这是什么

一句话:dsh-delete 是面向 DSH 桌面 profile 的 bundle 插件,解决「会话与投影缓存怎么干净删掉」和「会话上下文里图片怎么可视、可摘、可按需删源文件」。

两个能力互不干扰:

  1. 会话删除:左侧栏底部 会话管理 入口,多选后先让 DSH 归档,再删磁盘上的会话主体与投影缓存。
  2. 图片管理:右侧栏与「工作区文件 / 上下文 / 终端 / 浏览器」并列的 图片管理 页签,统计张数与体积,多选从后续请求中摘除,并可勾选(默认关闭)删除磁盘上的源文件与附件对象。

会话删除

入口与列表

入口挂在 sidebar.footer.action,与费用、上下文等插件共用底部动作区。打开面板后可以搜索、按工作区过滤(多工作区时出现下拉),工具栏提供全选、清空,以及三种级联:

  • 选中子 agent:所有后代会话。
  • 选中团队成员:同父下的兄弟会话。
  • 选中整族:上溯到根并带上全部后代。

列表同时展示左侧栏可见的会话,以及扫盘发现的 仅磁盘 残留(列表已消失但文件仍在)。每行显示体积、路径条数、最近活动时间;正在运行的会话标 运行中(归档时会 stopActivity)。

删除顺序

删除不是「只 rm 目录」。官方契约是先归档、再删盘:

  1. 调用 DSH 归档,左侧栏立即不再显示该会话,并停掉其活动。
  2. 删除 <DSH_HOME>/sessions/<工作区>/<会话 id>/ 下的主体(含 session.v4.jsonl.zstd 等),以及 storages/session_projcache/sessions/<会话 id>.json 投影缓存(可选保留投影缓存见配置 keepProjCache)。

若只删文件不归档,宿主内存里仍活着的会话会继续出现在侧栏,且文件删掉后官方归档可能失败,容易留下清不掉的行。设置里 archiveOnDelete 默认开启;关掉后插件退化为只删文件,面板会给出提示。

二次确认默认开启(confirmBeforeDelete),确认条会给出将移除的路径数与释放体积。磁盘删除不进回收站、不可撤销。

安全边界

会话 id 必须在入口通过形状校验(裸 UUID 或 session-<uuid>);每条待删路径经 insideRoot() 复核,只落在 sessions 与 session_projcache 约定根下。附件目录、费用账本等不在删除范围内。

图片管理

解决什么问题

DSH 对图片有多处限额,例如 dsh-attachment-local 的 maxImagesPerMessage,以及 dsh-llm-deepseek / dsh-llm-pi-ai 等对单条请求的图片字节与张数预算。历史消息里图片过多时,路由可能以超预算失败;本面板让你看见每一张图,并把选中的从后续请求里摘掉。

注意:单条消息最多 N 张 仍由 dsh-attachment-local.maxImagesPerMessage(默认 20)控制;图片管理处理的是「上下文里图片把请求撑爆」,两者不互相替代。要放宽单条添加上限,需在 设置 → 插件配置 → dsh-attachment-local 里改 maxImagesPerMessage。

摘除机制

插件复用 DSH 官方的 image/offload 事件:追加与 dsh-compaction-image-offload 同类型的事件,由已有投影把对应位置换成占位文本,后续请求不再消耗视觉 token;会话日志与附件文件本身不改字节,占位里仍带只读路径可读回。标记持久、不可自动回滚。

面板支持缩略图墙、按来源与时间筛选,以及快捷 最早 N 张、除最近 N 张外全部。勾选多张后一次确认会写入 一条 image/offload(多个 targets),只断一次前缀缓存;分多次操作则断多次。底部会显示 缓存代价预估(基于日志里 usage 锚点),便于权衡腾预算与 KV 重算。

删除磁盘原文件(默认关闭)

勾选 同时删除磁盘上的原文件 后,源文件(tool/result 里与 image 同排的绝对路径)与附件对象(<DSH_HOME>/attachments/v1/objects/...,仅由 sha256 id 派生)分两路判定;系统目录、DSH 安装目录、<DSH_HOME> 会话区等有多层安全闸,全库扫描其它会话引用,被共享的默认跳过并可在二次确认后强制删除。同一批操作顺序为 先摘除、后删盘;删盘不可恢复。<DSH_HOME>/cache/attachments/request-images/ 派生缓存 intentionally 不删。

限制与降级

情况 行为
会话未打开(冷 / 已归档) 可只读看张数,写入口禁用,提示先打开会话
会话正在跑一轮 默认拒绝摘除(blockOffloadWhileRunning 默认开)
无 sessions 服务 图片能力降级,会话删除仍可用
选中项已不在当前上下文 跳过并说明原因,其余照常

安装与启用

插件按 DSH 的 bundle 层 接入 profile,默认 profile 路径为 ~/.dsh/profiles/desktop(Windows 下为 %USERPROFILE%\.dsh\profiles\desktop)。README 未提供 dsh plugin add 一类命令,需取得源码后链接进 profile 并声明 bundle。

1. 取得代码

将仓库放到本机任意目录(下例路径仅作占位):

# 放在任意位置;下例假设 A:\Downloads\dsh-delete

可从 GitHub 下载 release 或源码包:https://github.com/ycm50/dsh-delete。

2. 链接进 profile

在 Windows 上可用目录联接指向源码目录:

New-Item -ItemType Junction `
  -Path  "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-delete" `
  -Target "A:\Downloads\dsh-delete"

Linux/macOS 上需将 node_modules/dsh-delete 指向同一套源码(具体命令依平台而定,原则与上例一致:profile 的 node_modules 下出现名为 dsh-delete 的包目录)。

3. 声明为 bundle

编辑 ~/.dsh/profiles/desktop/package.json,在 dependencies 与 dsh.profile.bundles 各增加一项:

{
  "dependencies": {
    "dsh-delete": "file:A:/Downloads/dsh-delete"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "dsh-delete"
      ]
    }
  }
}

file: 路径改为你本机源码实际位置。包内 cordis.patch.yml 会由 bundle 机制叠入,无需手改。

4. 重启 DSH

客户端模块图在启动时快照,改 bundle 后需 重启 DSH 才会加载浏览器侧的 client.js;重启后侧边栏底部出现 会话管理,右侧栏出现 图片管理 页签(可在配置里关闭入口)。

插件配置

在 设置 → 插件配置 → dsh-delete 中调整(字段均为 .volatile(),改完即时生效):

字段 默认 作用
enabled 开 会话管理总开关
confirmBeforeDelete 开 删会话前二次确认
keepProjCache 关 只删会话主体,保留投影缓存 JSON
archiveOnDelete 开 删盘前先归档
imageManagerEnabled 开 图片管理页签总开关
confirmBeforeOffload 开 摘除前二次确认
blockOffloadWhileRunning 开 会话跑任务时禁止摘除
thumbnailMaxEdge 192 缩略图长边像素

非标准布局时可在 cordis.patch.yml 写死 home;环境变量 DSH_HOME 覆盖数据目录,DSH_INSTALL 覆盖 DSH 安装目录(删源文件时会禁删该目录)。

典型用法

清理会话与残留

  1. 点击侧边栏底部 会话管理。
  2. 用搜索或工作区下拉定位目标;若需删整棵子 agent 树,点 选中子 agent 或 选中整族。
  3. 勾选行(注意 仅磁盘 残留),查看底部已选数量与合计体积。
  4. 点 删除选中,在确认条中核对路径数与释放空间后确认。

为当前会话腾图片预算

  1. 先打开 要操作的会话(冷会话无法写入摘除)。
  2. 打开右侧栏 图片管理,点 刷新 查看「共几张 / 仍在上下文几张 / 体积」。
  3. 多选要摘的图片,或使用「最早 N 张」等快捷;留意底部 移除后请求体积 与 缓存代价预估。
  4. 一般情况只点 摘除选中;确需释放磁盘且接受不可恢复时,再勾选 同时删除磁盘上的原文件,阅读「可删 / 跳过」摘要后确认。

宿主 HTTP 路由前缀为 /plugins/dsh-delete(如 POST .../delete、POST .../images/offload),面板通过 web server 调用,日常使用不必手调 API。

适用场景与注意

适合需要定期清理 DSH 会话磁盘占用、处理子 agent / 团队会话级联删除,或在截图、视觉调试较多的会话里主动控制上下文图片与请求预算的开发者。

安装前建议自行阅读仓库源码与 MIT 许可证;插件以 当前 DSH 进程权限 读写 <DSH_HOME> 与用户指定的源文件路径,删除与会话相关的操作具有破坏性。SkillHub 目录页星标为 0,不代表功能完整度,以 GitHub README 与版本 0.2.0 为准。

结尾

dsh-delete 把「会话归档 + 删盘」和「官方 image/offload 摘除 + 可选删源/附件」收进同一 bundle,对齐 DSH 0.2.0-rc.x 磁盘契约,并通过 smoke 测试覆盖逻辑与坐标(日志 位置 与 seq 分离)等易错点。若你已在用 DSH 桌面 profile 并希望在不改本体的前提下管理会话与图片,可按上文步骤链接 bundle 并重启宿主。

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

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

Xiaoye