dsh-session-temp-reaper:会话临时文件一键清理

前言

在 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 时刷新页面即可。

典型用法

  1. 点击输入框左侧清理按钮,触发扫描。
  2. 查看标记组:默认已勾选拟删除项;要保留则取消勾选。
  3. 不确定时展开「未标记的文件 N 个」,手动勾选需要删除的项。
  4. 点击「删除 N 个」,再点一次确认。
  5. 面板显示「已删除 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。

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

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

小夜