dsh-session-delete:为 DSH Web 会话增加可恢复的回收站

前言

DeepSeek Harness(DSH)侧栏里,原生对会话主要是「归档」:日志仍落在 ~/.dsh/sessions/,没有真正意义上的删除入口。长时间开发或试验后,侧栏和磁盘上的会话会越堆越多,想清掉某条又不敢硬删日志时比较别扭。

dsh-session-delete 是社区维护的客户端 bundle,在 Web GUI 上补「删除会话」能力,并把删除做成先移入回收站、默认保留 3 天、可恢复或立即清除的流程。下面介绍它做什么、怎么装、怎么用,以及和原生归档的差别。

这是什么

  • 插件名称:dsh-session-delete(GitHub:Zyl20030506/dsh-session-delete)
  • 维护者:Zyl20030506(package 作者字段为 zyl54)
  • 分类:客户端(dsh.client,platform: web)
  • 许可证:MIT
  • 版本(package.json):1.0.0

一句话:给 DSH 加一个会话回收站——红色菜单项把会话移入回收站,侧栏底部可打开回收站恢复或清空;到期由清扫任务永久删除。

核心功能

界面行为(README 中的对照表)如下。

位置 行为
会话「…」菜单 → 删除会话 确认后移入回收站;日志移出持久化根,侧栏立即不再显示
侧栏底部 → 回收站 列出待处理会话:标题、删除时间、剩余天数
回收站 → 恢复 日志搬回原路径并取消归档,回到原工作区原位置(原置顶会恢复置顶)
回收站 → 立即清除 二次确认后永久删除该条
回收站 → 清空回收站 二次确认后清空全部
到期清扫 插件启动时、每 30 分钟、每次打开回收站前各扫一次

要点:

  • 删除 ≠ 硬删:先进入 <DSH_HOME>/session-trash/v1/<sessionId>/,不在 sessions/ 持久化根下,因此会从会话列表、侧栏、搜索索引里消失,而不是仅靠标记隐藏。
  • 隐藏手段:删除流程里会调用 DSH 的归档机制隐藏行;恢复时用回收站的「恢复」,不要用原生「取消归档」(那只把行放回来,日志仍在回收站里)。
  • 文案:界面支持中文 / English / 日本語,跟随 DSH 语言设置。

与原生「归档会话」对比:

操作 归档标记 日志位置 到期自动删
原生「归档会话」 设置 原地不动 不会
本插件「删除会话」 设置(作为隐藏手段) 移入回收站 会(默认可配置)

安装与启用

插件是普通 DSH bundle(package.json 声明 dsh.bundle.patch 与 dsh.client)。从 GitHub 安装 Web profile:

dsh plugin --profile web add github:Zyl20030506/dsh-session-delete

装完后重启 DSH(客户端插件代码会缓存在页面里)。卸载:

dsh plugin --profile web remove dsh-session-delete

本地改代码时,可用安装器从目录 link(README 示例为 plugin_manager 的 install_bundle,target 为本目录绝对路径);改完刷新页面即生效。包名 dsh-session-delete 若改名,须同步 package.json 的 name、client.js 里 _ModuleLoader__.load({ id }) 的 id,以及 cordis.patch.yml 里的 name。

安全说明:插件以后端路由和文件操作方式在 DSH 进程权限下运行。安装前建议查看 GitHub 仓库 源码与 MIT 许可证,确认符合你的环境策略。

配置

保留期与清扫间隔可在 profile 的 bundle 配置里调整:

- id: session-delete
  name: 'dsh-session-delete'
  config:
    retentionDays: 7    # 默认 3
    sweepMinutes: 60    # 默认 30

若不想自动过期删除,可把 retentionDays 调大(例如 3650),仅用手动「立即清除」。

典型用法

  1. 在侧栏打开某会话的「…」菜单,点底部红色「删除会话」,确认后该会话从侧栏消失。
  2. 点侧栏底部(设置按钮旁)的回收站入口,查看角标上的待清理数量。
  3. 在回收站里对单条会话选择「恢复」,或「立即清除」;也可「清空回收站」一次处理全部。
  4. 不操作则默认保留 3 天(或你配置的 retentionDays),由清扫任务到期删除。

Host 侧对外两条路由(受 DSH 浏览器鉴权保护):

POST /api/plugin.session-delete   { sessionId, title }             → 移入回收站
POST /api/plugin.session-trash    { action, sessionId?, payload? } → list | restore | purge | empty

回收站目录结构(概念上):

<DSH_HOME>/session-trash/v1/<sessionId>/
  meta.json                      # 标题、删除时间、到期时间、原始路径、工作区与位置信息、是否置顶等
  data/session.v4.jsonl.zstd     # 从 sessions 目录整体搬来的日志

工作原理与安全边界(简叙)

删除前会查询 workspace/session-activity:有正在运行的回合、子任务、后台任务或定时提醒时会拒绝,并告知类型。还会拒绝删除当前主视图正在显示的会话(避免视图继续往已移走的日志里写)。文件 rename 若遇占用(EPERM/EBUSY/EACCES)会提示并回滚。步骤失败时尽量搬回文件、取消归档,保持原状态。

不会删除:用户附件(~/.dsh/attachments)、临时 spill(%TEMP%\dsh-spill-*)、会话在工作区产出的文件等。

已知 UI 现象:「显示已归档」筛选里有时仍能看到已进回收站的会话(Agent 仍驻留时会被列出);点开会提示无法打开,彻底清除或 Agent 释放后消失。

DSH 升级可能导致部分内部 API 漂移;插件在能力缺失时会拒绝删除并提示 incompatible,回收站弹窗顶部也会列出缺少的能力。排查可在 DevTools 控制台搜 session-delete。

适用场景

  • 日常用 DSH Web GUI,需要清理试验会话或错误创建的会话,又希望有几天的反悔期。
  • 希望和「只归档、日志不动」区分开:要明确把日志移出 sessions/ 并支持定时清扫。
  • 在 Windows 上 README 称已完整验证;POSIX 依赖回收站与 sessions/ 同在 DSH_HOME 下的同卷 rename。

不适合指望它清理附件、工作区产出或 spill 临时文件的场景;那些需用 DSH 或其它工具单独处理。

开发与测试

Host 逻辑测试无额外依赖,需 Node ≥ 22:

npm test     # 等价于 node test/trash.test.mjs

README 说明测试用临时目录与伪造 Cordis 服务,覆盖入站、列表、恢复、清除、清扫、活动会话拒绝等 18 个用例。

结尾

dsh-session-delete 用回收站把「删会话」做成可逆操作:菜单删除、侧栏回收站、可配置保留期,并在有活动任务或文件占用时保守拒绝。社区目录与 DeepSeek / 幻方无官方从属关系,安装方式以仓库 README 为准。

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

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

Xiaoye