dsh-session-artifacts:按会话日志预览并清理工作区产物

前言

在 DeepSeek Harness(DSH)里跑智能体会留下两类东西:侧栏里的会话记录,以及工作区里脚本、报告和生成文件。关掉对话或删掉会话行,往往只带走记录本身;DSH 默认并不维护「这个会话创建了哪些文件」的索引,手工翻目录既慢又容易误删。

社区插件 dsh-session-artifacts(维护者 ShirohaChan,分类 admin-security)从持久化的会话日志反推产物清单,在删除前展示完整列表和总大小,由你勾选后再执行。下面介绍它的定位、能力与安装用法。

这是什么

dsh-session-artifacts 是 DSH 的 npm 插件包(当前版本 0.7.2,MIT 许可),核心价值是:可选地删除会话记录,并可选地删除该会话在工作区留下的产物;默认不假设你要删产物,全程预览、逐项复核。

它与 dsh-chat-manager 的 /plugins/dsh-session-delete 路由无关,自行处理会话存储删除,因此在 chat-manager 未安装或被禁用时仍可工作。

核心功能

对话框里的三种组合

会话 ⋯ 菜单提供 删除会话与产物…。对话框用两个复选框组合出实际行为:

  1. 只删产物、保留对话 —— 清理遗留文件,会话与日志不动。
  2. 删除会话记录 —— 可勾选是否同时删除已预览的产物。
  3. 默认:删产物项不勾选,避免误操作。

确认后,若勾选删除记录,会先移除会话存储,再删除预览过的文件。若有文件删除失败,可用 重试未删除的文件,仅重试失败路径,不会对整个预览重新执行。

只删产物时,Host 用一次性 nonce 保存预览列表(约 10 分钟有效),无需动会话日志。

产物如何从日志归因

归因以会话 JSONL 日志为唯一权威来源,规则摘要如下:

证据 可删
write 且 meta.operation: "create" 是
shell 命令时间窗 + 文件创建时间(须唯一) 是(列表标为命令行 / shell)
present、 update、edit 否(仅报告或忽略)

present 表示交付而非创作,默认不纳入可删列表;配置 includeDelivered: true 可改为更激进的行为。Shell 产出无 meta 记录时,插件用命令起止时间窗与文件 birthtime 推断;窗口须紧、并发会话下须唯一,无法枚举兄弟会话时 fail closed 并在对话框说明。

删除会话记录时的安全拆除

持久化层不提供删除 API,插件按固定布局自行删除:

<sessionRoot>/<project>/<sessionId>/session[.vN].jsonl[.zstd]

路径经 resolveCurrentLog 解析,校验三段结构、禁止符号链接与越界后,采用「改名到临时目录 → 再校验 → 删除」的两步隔离;失败会还原。

若会话仍在宿主注册表中,须先取消运行中的轮次、通过自维护的 AgentHandle 追踪器 dispose Agent,待注册表排空后再删存储。插件加载前已存在的 Agent 无句柄则拒绝删记录,并提示重启 DSH;删产物仍可用。

安全围栏(节选)

  • 仅提议会话记录的工作目录内文件;~/.dsh 下路径永不作为产物。
  • 默认保护 DSH 包目录(含 SKILL.md、cordis.yml 等),protectPackages: false 可关闭。
  • 客户端不直接提交路径,删除集合由 Host 的 nonce 绑定;重试会钉住 device + inode,防止路径被替换。

安装与启用

将 <profile> 换成你使用的 DSH profile 名称。安装命令来自项目中文 README:

dsh plugin --profile <profile> add dsh-session-artifacts

从本地目录安装:

dsh plugin --profile <profile> add <path-to-this-directory>

安装后重启 DSH,以便 Host 与客户端完成组合加载。

卸载:

dsh plugin --profile <profile> remove dsh-session-artifacts

卸载只移除插件本身,不会自动删任何会话或文件。

依赖要点:按会话的 JSONL 持久化(sessionPersistence)、@deepseek-ai/dsh-agent 提供的 agents 注册表(须在 Agent 创建前装好句柄追踪器)、DSH 核心 0.2.x 的会话菜单与浮层插槽。sessions 服务存在时用于停止运行中的轮次。

典型用法

  1. 在侧栏打开目标会话的 ⋯ 菜单,选择 删除会话与产物…。
  2. 查看文件列表与总大小;仅交付、仅更新类的条目会按规则区分显示。
  3. 勾选「删除产物」和/或「删除会话记录」,至少勾一项。
  4. 确认执行;需要时对失败项使用 重试未删除的文件。

可选配置(均在插件配置中,字段均可选):

字段 默认值 含义
deleteSession true 为 false 时隐藏删记录,仅产物流程
includeShell true 是否运行 shell 时间窗归因
shellSlackMs 5000 命令窗口两侧时钟余量(毫秒)
protectPackages true 保护工作区内的 DSH 包目录
includeDelivered false 是否将仅 present 的文件纳入可删
lifecycleTimeoutMs 20000 等待会话离开活动注册表的超时

适用场景与注意

适合需要定期清理试验性会话遗留脚本、报告,或连同会话日志一并归档删除的场景。Shell 归因依赖文件系统 birthtime;不记录真实创建时间的文件系统上,shell 这一路可能为空。删除父会话不会自动清理子代理会话的产物;预览是快照,确认后新创建的文件不在列表中。

插件以当前 DSH 进程权限读写工作区与会话存储,删除为普通 unlink,不涉及安全擦除或云备份。安装前建议阅读源码与 MIT 许可证,确认围栏策略符合你的环境。社区目录 SkillHub 由生态维护,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-session-artifacts 用会话日志重建产物清单,在勾选与预览之后才删除,并自包含地处理会话记录拆除。需要进一步了解版本变更与测试说明,可查看仓库 README 与 CHANGELOG。

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

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

Xiaoye