前言¶
在 DSH(DeepSeek Harness)里跑智能体会产生大量中间产物:调试脚本、命令重定向输出、scratch 目录里的文件。若靠「按时间猜哪些是临时」去扫盘,容易把别的会话的交付物、插件源码一并列进来,甚至让模型给出「可以删」的结论——误删风险很高。维护者 liyolin 的插件 dsh-session-temp-reaper 改走另一条路:在聊天输入框旁提供清理按钮,由模型用工具登记临时文件,面板分组展示,删除需两次确认,并在 Host 侧对交付物与 profile 依赖做硬保护。
这是什么¶
dsh-session-temp-reaper 是 DSH 社区插件(分类 admin-security),仓库 github.com/liyolin/dsh-session-temp-reaper,目录页 skillhub.cn/plugins/liyolin/dsh-session-temp-reaper。当前 npm 包版本 0.1.0,许可证 MIT。
它解决的是:本会话里写过、命令写出、以及落在临时目录里的文件,如何安全地列清单、勾选删除,而不是自动扫全盘猜归属。
设计要点:模型登记 + 启发式仅作参考¶
早期若按时间窗推断临时文件,会把同一工作区里别的会话或别的程序产出的文件算进来。现版改为 模型主动登记:
- 插件注册工具
mark_temp_files,模型在写临时脚本、调试产物、一次性中间文件时调用 - 系统提示中有
## Temporary files段提醒模型这么做 - 面板分两组:模型标记的(默认勾选删除)和 未标记的(折叠,默认保留,仅作参考)
启发式扫描仍保留,但只负责填充「未标记」组,不再决定默认勾选。
核心功能¶
下面介绍界面与 Host 侧已文档化的能力(均以 README 为准)。
界面与操作¶
- 输入框左侧按钮,面板浮在输入框上方;
Esc或点击外部关闭 - 两组清单:标记组默认勾选;未标记组折叠且默认不勾
- 每行显示类型、来源徽章(会话写入 / 指令写入 / 未确认归属 / 系统临时 / 临时目录)、大小、时间和说明
- 交付物(
present出来的文件、可交付记录)和「正在被 profile 使用的插件/依赖」即使被标记也不勾;另有已交付、正在使用提示 - 问模型:把当前清单塞进输入框草稿并提交,让模型说明用途与可否删除——只问,不删
- 全部保留 / 全部删除 批量切换;删除按钮两次点击确认,5 秒后自动复位
- 中英双语,跟随 DSH 语言设置
模型侧工具¶
模型在会话中登记临时路径:
mark_temp_files({
paths: ["scripts/probe.mjs", "out/report.tmp"], // 相对 cwd 或绝对路径
note: "调试用的临时脚本" // 可选,显示在面板里
})
返回 { marked, ignored }:marked 为登记成功路径;ignored 为被拒路径及原因(如 git、empty、outside-cwd)。标记写入会话日志(一条 tool/call),无额外状态文件;同一会话重复标记同一路径幂等。
不应标记:用户要的交付文件、改过的既有源码。标了也会被 present/依赖根保护挡住,但那是兜底,不是设计意图。
会话 scratch 目录¶
工具 session_temp_dir 返回并创建 <工作区>/.dsh-tmp/<会话id前8位>/。系统提示要求模型把 scratch 写进该目录;目录内文件无需日志提名也会出现在清单中。建议将 .dsh-tmp/ 加入工作区 .gitignore。
HTTP 接口(需 DSH Web 载体)¶
两条 exact Fetch 路由,挂在 DSH 已认证的 /api 通道上:
| 路由 | 请求 | 响应 |
|---|---|---|
POST /api/session-temp-reaper/scan |
{ sessionId } |
{ cwd, items[], profileKnown } |
POST /api/session-temp-reaper/delete |
{ sessionId, paths[] } |
{ results[], removed } |
认证由 DSH connection 层负责;插件不自行实现认证。扫描结果在 Host 内存缓存 10 分钟、上限 64 条;删除只接受该会话最近一次扫描里出现过的路径。
安全边界(摘要)¶
- 只删扫描过的路径;限定在会话 cwd、本会话 spill、或命令写到 OS 临时根下的文件
- 交付物与 profile 依赖目录:Host 侧拒删(
protected),不依赖客户端勾选 .git路径永不列出、永不删除- 插件从不自动删除;删除需用户在面板二次确认
- 纯 CLI 环境无 Web 载体时,按钮不出现
安装与启用¶
DSH 生态是「一切皆插件」;社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系。安装前请自行阅读仓库源码与 MIT 许可证——插件以当前 DSH 进程权限运行。
假设 profile 在 ~/.dsh/profiles/desktop,从 GitHub 安装:
cd ~/.dsh/profiles/desktop
npm install --save "github:liyolin/dsh-session-temp-reaper"
在同一 package.json 的 dsh.profile.bundles 数组中加入 "dsh-session-temp-reaper",然后重启 DSH。
本地开发可用 npm install --save "link:<本项目绝对路径>",同样加入 bundles。若改 Host 侧 index.js,需在 GUI 里通过 plugin_manager 的 set_plugin 关开插件或重启 DSH;只改 client.js 时刷新页面即可。
典型用法¶
- 点击输入框左侧清理按钮,触发扫描。
- 查看标记组:默认已勾选拟删除项;要保留则取消勾选。
- 不确定时展开「未标记的文件 N 个」,手动勾选需要删除的项。
- 点击「删除 N 个」,再点一次确认。
- 面板显示「已删除 X 个,失败 Y 个」。
仓库内行为探针:
npm test # 等价于 node test/probe.mjs
适用场景与注意¶
适合:长期在 DSH Web 界面里做智能体开发、调试命令与临时脚本,希望在会话结束前可控清理中间文件,又需要交付物与依赖目录不被误删的场景。
注意(README 已知限制):
- 模型未调用
mark_temp_files时,标记组为空——此时仅未标记组可参考,默认不会误删 - 命令动态生成且未写入
.dsh-tmp、日志又未点名的文件不会列出 - 删除不可恢复,无回收站
- 定位不到 profile 时,面板会警告「无法确认插件依赖」,此时不假装依赖保护生效
结尾¶
dsh-session-temp-reaper 把「清理本会话临时文件」做成输入框旁的可审清单:模型登记为主、启发式为辅,Host 侧保护交付与依赖,删除双重确认。需要进一步了解可访问目录页 skillhub.cn/plugins/liyolin/dsh-session-temp-reaper 与 GitHub 仓库 github.com/liyolin/dsh-session-temp-reaper。