dsh-session-tool:为 DSH 补上可配置的会话删除与头部重命名

前言

在 DeepSeek Harness(DSH)里长期跑智能体,侧栏会话会越积越多。官方归档只是把会话从列表里藏起来,磁盘上的记录仍在;想彻底清掉一条对话,或给会话改个好认的名字,往往要在菜单里翻找,操作路径也不直观。

社区插件 dsh-session-tool(维护者 immortal-akx)针对的就是这类会话管理缺口:在侧栏「⋯」里提供可配置的「删除会话」,在对话区头部提供一键重命名,并可选隐藏官方悬停区的归档、置顶按钮。下文按安装、功能、配置与注意事项说明用法;事实以 GitHub 仓库 README 为准。

这是什么

dsh-session-tool 是 DSH 的 Cordis 插件(npm 包名 dsh-session-tool,当前资料中版本为 0.12.6,MIT 许可)。它不改变 DSH 的会话存储模型,而是在 Web 客户端注入菜单与头部工具,并在宿主侧注册 HTTP 路由,完成「永久删除磁盘目录 + 清理记账」以及通过官方 sessions 服务重命名。

插件目录页:skillhub.cn/plugins/immortal-akx/dsh-session-tool。社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系;安装前建议自行查看源码与许可证,插件以当前 DSH 进程权限运行。

核心功能

侧栏「⋯」删除会话

  • 在会话行「⋯」菜单中增加 「删除会话」(默认文案;可通过配置改 label、order、显隐、红色危险样式、禁用态)。
  • 删除前需勾选「我已了解后果」,未勾选时删除按钮禁用。
  • 删除为永久删除,不可恢复(本插件没有回收站)。删除正在运行的会话时,会先停止该会话,然后再删除。
  • 运行中删除时,弹窗会额外提示会话正在运行,按钮文案为「停止并删除」。

对话区头部重命名

  • 头部工具栏最左侧提供 ✏️「重命名会话」,走官方 sessions 服务;改完后侧栏与头部标题即时更新。
  • 输入框预填当前名称并自动聚焦;名称为空时「确定」禁用;回车提交、Esc 取消;失败在弹窗内显示原因。

官方菜单与悬停按钮的可配置性

  • 可通过 MenuItems.official 调整官方四项(置顶、重命名、分叉、归档)的文案、顺序或隐藏(重命名项仅支持 hidden)。
  • 可通过 ButtonItems.official 隐藏会话行悬停时的官方 归档、置顶 图标按钮(仅支持 hidden)。本插件不提供自己的悬停按钮。

审计日志

配置问题与每一次删除会写入 ~/.dsh/logs/dsh-session-tool.log(超过 1 MB 轮转为 .log.1)。配置键写错不会打断 DSH 启动,只会记日志并忽略该项。

安装与启用

将 <profile> 换成你的 profile 名(例如 web、desktop)。安装命令来自仓库 README:

# npm
dsh plugin --profile <profile> add dsh-session-tool

# 本地目录
dsh plugin --profile <profile> add file:C:/path/to/dsh-session-tool

# GitHub
dsh plugin --profile <profile> add github:<owner>/dsh-session-tool

装完后重启 DSH 生效。

卸载:

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

运行环境要求(package.json):Node >=22.19,peer 依赖 @deepseek-ai/cordis ~4.0.4。

典型用法与配置

配置写在 profile 的补丁文件 ~/.dsh/profiles/<profile>/cordis.patch.yml。键名区分大小写(例如误写 menuItems 会被忽略并记警告日志),改完需重启 DSH。只写需要覆盖的字段,其余使用默认值。

默认删除项与 order 参考

order 为升序数字,越小越靠前;不写等于 0。官方菜单项参考:置顶 100、重命名 200、分叉 300、归档 400;本插件「删除会话」默认 500。

维护者在 README 中给出的实际配置示例:保留删除菜单项,并隐藏悬停区的归档、置顶按钮:

# order 参考:官方 pin 100 / rename 200 / fork 300 / archive 400;本插件 delete 默认 500
- id: dsh-session-tool
  name: dsh-session-tool
  config:
    MenuItems:
      official:
        pin: {}
        rename: {}
        fork: {}
        archive: {}
      plugin:
        delete:
          label: "删除会话"
          order: 500
          hidden: false
          danger: true
          disabled: false
    ButtonItems:
      official:
        archive:
          hidden: true
        pin:
          hidden: true
      plugin: {}

完整 schema(含 shortcut、separatorBefore 等已登记但未实现字段)见 GitHub README 配置一节。

删除在后台做了什么

README 将删除链路概括为六步,便于理解「为何要先停再删」:

  1. 界面校验:回环地址与同源请求(否则 403/405)。
  2. 运行中的会话:cancel 并等待静默(最多 15 秒)。
  3. flush 写盘并从内存会话表 detach,避免收尾阶段把日志目录重建。
  4. 删除磁盘目录(永久删除,不进入回收目录)。
  5. 清理记账:投影缓存、工作区 sessionIds、归档集合等。
  6. 写审计日志。

客户端加载时,apply 须同步完成;配置在后台读取(3 秒超时,失败重试 5 次 × 2 秒),读不到则用默认值。宿主侧 /list、/config、/diag、/delete 等 HTTP 路由按进程级单例注册,避免重复加载撞路由。

适用场景与注意

适合谁:需要定期清理试验会话、希望删除真正释放磁盘、或习惯在对话头部改名的 DSH 用户;想用配置统一菜单顺序、隐藏官方悬停归档/置顶的人也可一并使用。

务必注意:

  • 删除不可恢复,操作前确认会话内容已备份或不再需要。
  • 插件以 DSH 进程权限删除目录与改记账,安装前应阅读 lib/ 与许可证。
  • 隐藏官方悬停按钮依赖 DOM/CSS 与官方按钮的 aria-label 文案;若 DSH 更新改了文案,需在 lib/client.js 的 ARCHIVE_LABELS / PIN_LABELS 中维护,加载日志中的 cssRules= 可用于核对规则条数。

结尾

DSH 生态强调「一切皆插件」;dsh-session-tool 在不大改官方模型的前提下,把「删干净」和「改名字」放到侧栏菜单和对话头部,并用 cordis.patch.yml 把菜单顺序与显隐交给用户。若你要试用或贡献 issue,可从目录页与仓库入手:

  • 目录页:https://www.skillhub.cn/plugins/immortal-akx/dsh-session-tool
  • GitHub:https://github.com/immortal-akx/dsh-session-tool
羽毛球分组比赛记分
小程序二维码

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

小夜