前言¶
在 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 插件,解决「会话与投影缓存怎么干净删掉」和「会话上下文里图片怎么可视、可摘、可按需删源文件」。
两个能力互不干扰:
- 会话删除:左侧栏底部 会话管理 入口,多选后先让 DSH 归档,再删磁盘上的会话主体与投影缓存。
- 图片管理:右侧栏与「工作区文件 / 上下文 / 终端 / 浏览器」并列的 图片管理 页签,统计张数与体积,多选从后续请求中摘除,并可勾选(默认关闭)删除磁盘上的源文件与附件对象。
会话删除¶
入口与列表¶
入口挂在 sidebar.footer.action,与费用、上下文等插件共用底部动作区。打开面板后可以搜索、按工作区过滤(多工作区时出现下拉),工具栏提供全选、清空,以及三种级联:
- 选中子 agent:所有后代会话。
- 选中团队成员:同父下的兄弟会话。
- 选中整族:上溯到根并带上全部后代。
列表同时展示左侧栏可见的会话,以及扫盘发现的 仅磁盘 残留(列表已消失但文件仍在)。每行显示体积、路径条数、最近活动时间;正在运行的会话标 运行中(归档时会 stopActivity)。
删除顺序¶
删除不是「只 rm 目录」。官方契约是先归档、再删盘:
- 调用 DSH 归档,左侧栏立即不再显示该会话,并停掉其活动。
- 删除
<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 安装目录(删源文件时会禁删该目录)。
典型用法¶
清理会话与残留¶
- 点击侧边栏底部 会话管理。
- 用搜索或工作区下拉定位目标;若需删整棵子 agent 树,点 选中子 agent 或 选中整族。
- 勾选行(注意 仅磁盘 残留),查看底部已选数量与合计体积。
- 点 删除选中,在确认条中核对路径数与释放空间后确认。
为当前会话腾图片预算¶
- 先打开 要操作的会话(冷会话无法写入摘除)。
- 打开右侧栏 图片管理,点 刷新 查看「共几张 / 仍在上下文几张 / 体积」。
- 多选要摘的图片,或使用「最早 N 张」等快捷;留意底部 移除后请求体积 与 缓存代价预估。
- 一般情况只点 摘除选中;确需释放磁盘且接受不可恢复时,再勾选 同时删除磁盘上的原文件,阅读「可删 / 跳过」摘要后确认。
宿主 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 并重启宿主。