dsh-turn-cleanup:在 turn 边界用硬闸门收尾清场

前言

在 DeepSeek Harness(DSH)里跑 agent,一轮 turn 结束往往意味着交付汇报已经写好。但若本轮写过探针脚本、诊断 shell、或随手备份,工作区里会留下 probe-*.mjs、check*.sh、*.bak-* 等文件。框架层虽有 agent/turn-stopping 钩子,现有消费者多记变更或写记忆,并不自动清理;提示词里「交付前清临时件」又只能依赖模型自觉。长期下来,没人敢随便删这些遗骸。

dsh-turn-cleanup 把这条约定写成代码:在 turn 即将结束时检查本轮临时文件与超量备份,非空则通过 agent.steer(...) 或排入下一轮,逼模型在同一约束下处理——不是提醒,而是拦路。

这是什么

dsh-turn-cleanup 是 DSH 工作流类插件,维护者为 Leonlee114514,当前包版本为 0.3.1(MIT)。它挂在 agent/turn-stopping(serial 模式,await 在 turn 边界提交之前)上:发现未清场的临时件或超量 .bak 副本时,向模型推送清单并让其再走一步(或进入下一轮),直到处理完或你选择关闭闸门。

生态上,DSH 强调「一切皆插件」;社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

钩子与闸门机制

turn-stopping 在 turnEnds 且 inbox.nextStep.length === 0 时串行派发。本插件在 listener 里若判定需要清场,则调用 agent.steer(input),走 send(input, 'next-step', true),使 nextStep.length 变为 1,同一个 turn 多跑一步。也可通过配置 steerMode: followup(默认)把清单排到 next-turn,本轮正常结束,下一轮开头再清场——硬度略低,但 chat UI 不会因 steer 成为最后一步而把交付汇报折进「过程」区。

每 (sessionId, turn) 只拦一次(tripped Set),避免模型每多一步就再被拦、turn 永远无法结束。

三个检出通道

通道 1 — 约定目录(主机制)
临时件一律放 <cwd>/.agent-tmp/(tmpDirName 可配)。turn 结束时目录存在且非空即触发。不进该目录的不算本轮临时件。

通道 2 — 本 turn 写入追踪
挂 fs/write-intent waterfall,按 session.id + turn 记录写入路径;结束时只检查这些路径里匹配临时件特征的条目(如 probe-*、tmp-*、scratch-*、check*、diag_*、bench*、*.bak-*,或位于 .agent-tmp/)。不扫全工作区;判定为「本 turn 记录 ∩ 模式匹配 ∩ 文件仍存在」。

通道 3 — 备份保留
按「同目录 + 同原件名」把 .bak 及 .bak- / .bak. 后缀的备份聚成家族,默认只留最近 keep 份(默认 3)。mode: steer 只列超量清单;mode: prune 时插件可删副本,并有原件存在、普通文件、保护路径、每轮删除上限等四道闸。只处理本轮碰过的家族。

通道 1 / 2 永远不删文件,只 steer;删留由模型判断。子会话(origin === "subagent" 或 delegationDepth > 0)整段跳过。

steer 文案与统计面板

拦截时推送结构化中文说明(临时件列表、超量备份列表可分段)。超过 maxSteerPaths 会追加「还有 N 个」。

插件提供 Web 面板:设置页 → 收尾清场 展示拦截次数、报出文件数、已清文件数、依从率及最近记录;各 turn 末尾可有徽章。依从率在下一轮 turn 结束时对上一轮清单路径再 stat 计算,避免跨轮虚高。

安装与启用

包带 dsh.bundle,推荐走市场 / bundle 安装。

在 DSH 内:

plugin_manager install_bundle → "dsh-turn-cleanup"

或命令行(将 <name> 换成你的 profile 名):

dsh plugin --profile <name> add dsh-turn-cleanup

包根 cordis.patch.yml 会自动应用,闸门默认开启。改配置请在同一 profile 的 cordis.patch.yml 里用同 id 覆盖,不要另加一条 - insert(同 id 两条会被 cordis 拒绝)。

不需要重启 DSH;dsh-hmr 监听配置与 package.json,十几秒内可生效。验证加载:

cordis_inspect_query → host / Config / listConfigs, name: dsh-turn-cleanup

status: "absent" 表示 fiber 已启动、未 disabled(本插件故意不导出 Config schema)。inactive 则 import 失败。

要求:dsh 引擎 >=0.2.1-rc.5,Node >=20。

典型用法与配置要点

约定用法:让 agent 把本轮临时产出写入 .agent-tmp/,或在命名上符合 patterns;turn 结束若未清空,会自动收到清场指令。

更硬的同轮闸门:在 profile 的 cordis.patch.yml 中为 turn-cleanup 设置 steerMode: steer(默认 followup)。

常用配置项(完整表见仓库 README):

键 默认 说明
enabled true false 则不注册 listener
tmpDirName .agent-tmp 约定目录名
steerMode followup steer 为同轮多一步
backupRetention.enabled true 关闭则跳过通道 3
backupRetention.keep 3 同原件保留备份份数
backupRetention.mode steer prune 为插件自动删超量备份
logFile "" 可选落盘旁路日志

可选 logFile 记录每次拦截,行首为实际交付方式(followup / steer / prune)。

适用场景与注意

适合:长期在同一工作区跑 DSH agent、希望 turn 边界自动复核临时文件与 .bak 堆积、又不愿全仓扫描误伤存量文件的场景。

务必注意:

  • 插件以当前 DSH 进程权限运行;prune 模式会不可逆删除备份副本,启用前请阅读源码与 MIT 许可证,并理解四道删除闸。
  • 不做 git status 兜底;不碰 .git、node_modules、.tmp-sessions、out/ 等保护路径(清场指令也会提醒模型)。
  • listener 仅 readdir / stat,避免在 turn 边界拖慢每次结束。

结尾

dsh-turn-cleanup 把「收尾清场」从提示词自觉变成 turn-stopping 上的可配置闸门:约定目录、写入追踪、备份保留三条通道分工明确,默认只 steer、不擅自删用户文件。需要时可查阅 社区目录页 与 GitHub 仓库 获取最新 README 与 issue。

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

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

小夜