dsh-session-cleaner-host:会话删除与选文 Quote / Ask

前言

在 DeepSeek Harness(DSH)里用 Web GUI 聊久了,侧边栏会堆很多会话;官方持久化层对会话文件是追加式设计,也没有对外暴露「删除整段对话」的 API。另一方面,想在某条消息里选中一段话追问或引用到输入框,桌面端原生右键菜单在 Electron 主进程里画,渲染层插件改不了。jingleboat 维护的 dsh-session-cleaner-host(仓库名 dsh-session-cleaner)把 host 与 Web 客户端打在一个 bundle 里,针对上述缺口补了两类能力:侧边栏删除会话,以及消息内选文的 Copy / Quote / Ask。

这是什么

dsh-session-cleaner-host 是社区 DSH 插件(SkillHub 目录:jingleboat/dsh-session-cleaner-host,源码:GitHub)。维护者 jingleboat;package.json 中版本为 1.0.2,MIT 许可证。它不依赖 @deepseek-ai/* 运行时包,host 半部仅使用 Node 内置模块。

一句话:在 DSH Web 界面增加「删除会话」入口,并用插件自绘的右键菜单支持复制、引用到 composer、以及通过复用的并发 subagent 在右侧栏流式回答追问。

核心功能

下面按 DSH 扩展点说明插件挂载的能力(与 README Features 表一致)。

删除会话

扩展点:sidebar.workspaces.session.menu.item。

从侧边栏会话行的菜单执行 Delete session 时,插件会:停止正在运行的会话(flush + detach)、从 workspace 注册表解除绑定、失效对应 projection 缓存、物理删除会话目录、清理 spill 目录;对 origin: subagent 的子会话级联删除(fork 分支不会级联);最后广播 api-session/removed。若删除的是当前打开的会话,会停止该会话并把页面切到新会话。

选文右键:Copy / Quote / Ask

扩展点:shell.overlay。

在聊天消息里选中文字后右键,插件拦截 contextmenu(preventDefault()),避免 Electron 主进程原生菜单弹出,改为显示 Copy / Quote / Ask(Copy 在最前,与原先复制项位置一致):

  • Copy:把选中内容写入剪贴板(行为与原先复制一致,由插件绘制)。
  • Quote:向 composer 插入带 role 与 turn 元数据的 Markdown 引用块。
  • Ask:弹出问题框;发送后由并发 subagent 处理,答案在右侧栏流式输出,不打断主对话。

在 composer 内右键,或未选中文字时右键,仍使用系统菜单(剪切 / 粘贴 / 全选)。选中内容原样引用,上限 2000 字符;跨两条消息或落在流式未完成消息内的选中会被忽略。

Follow-up 侧栏

扩展点:sidebar.right.pane.tab。

Follow-up 标签页用于展示 Ask 子智能体的回答(含 reasoning 与正文流式输出)。

Ask 子智能体与压缩

每次提问不会新建 subagent:插件在每个父会话下维护一个可继续的、标签为 ask 的子智能体,通过官方 subagents.listChildren() 发现已有实例(host 重启后仍可找到),再把下一问投递给它。

因该 ask 子智能体上下文会随提问增长,插件在 host 侧注册 agent/pre-step 监听,仅对自己的 ask subagent 调用 ctx.compaction.compactIfNeeded(agent, "pressure", signal)。全局自动压缩保持关闭(profile 里挂载 compaction-basic 且 auto: false),主对话不受影响。

安装与启用

插件以普通 DSH bundle 形式安装:把本地路径 link 进 profile 的 package.json,并在 dsh.profile.bundles 中注册。包名在三处必须一致:package.json 的 name、client.js 里 window.__ModuleLoader__.load({ id: "…" })、以及 bundles 列表项。

在 profile 的 package.json 中增加:

{
  "dependencies": {
    "@local/dsh-session-cleaner-host": "link:/absolute/path/to/dsh-session-cleaner-host"
  },
  "dsh": {
    "profile": {
      "bundles": [
        // …
        "@local/dsh-session-cleaner-host"
      ]
    }
  }
}

将 link: 后的路径换成你机器上该插件目录的绝对路径。README 要求不要把 compaction-basic 写进插件自己的 bundle patch,而应写在 profile 的 patch 层(~/.dsh/profiles/<profile>/cordis.patch.yml),且该 patch 在每一层 bundle 之后应用:

# Compaction backend for the ask subagent's scoped auto-compaction.
# `auto: false` keeps GLOBAL automatic compaction off; the plugin calls
# ctx.compaction.compactIfNeeded() itself, scoped to its own ask subagents.
- id: compaction-basic
  name: "@deepseek-ai/dsh-compaction-basic"
  disabled: false
  config:
    auto: false

修改 host 侧代码后需重启 DSH,再刷新页面。可用版本接口确认当前加载的构建:

curl -s http://127.0.0.1:19387/api/dsh-session-cleaner/version
# {"ok":true,"name":"dsh-session-cleaner","build":"…","features":{…}}

典型用法

Quote / Ask

  1. 在聊天消息中选中一段文字。
  2. 在选中区域内右键。
  3. 菜单出现 Copy / Quote / Ask(Copy 在前,其后为分隔线)。
  4. 选 Quote 会在 composer 末尾追加引用块;选 Ask 会换成问题输入框,发送后右侧打开 Follow-up 并流式显示回答。

删除对话

侧边栏会话行 → ⋯ → Delete session。

HTTP API(host 同源,浏览器 cookie 鉴权)

Method Path Body 用途
GET /api/dsh-session-cleaner/version — 诊断当前构建
POST /api/dsh-session-cleaner/ask { sessionId, text } 向复用的 ask subagent 投递问题,必要时创建一次
POST /api/dsh-session-cleaner/delete-session { sessionId } 删除整段会话并级联 subagent 子节点
POST /api/dsh-session-cleaner/delete-subagent { childId, parentId } 删除一个直接 subagent 子节点(有 lineage 校验)
POST /api/dsh-session-cleaner/terminate-children { sessionId } 排空某会话下所有可继续的后代

适用场景与注意

适合谁:长期在 DSH Web GUI 里开多会话、需要清理磁盘与会话列表的开发者;需要在不离开当前主对话的前提下,对消息片段做引用或侧栏追问的用户。

实现上的硬约束(README Design notes,违反可能导致静默数据丢失):DSH 无官方删会话 API,插件做的是经身份校验的磁盘侧操作;默认不重写父会话 log(rewriteParentLog 为 false);不修改 append-only 的 subagent/catalog 行;delete-subagent 带 parent/child lineage 校验。压缩只能在 agent/pre-step、子智能体 turn 仍存活时触发,无法对已结束的 subagent 按需压缩。

安全与信任:插件以当前 DSH 进程权限运行,删除会话会直接操作会话目录。安装前请自行阅读 GitHub 仓库 源码与 MIT 许可证。SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系。

本地可运行 README 中的测试:

npm test

结尾

dsh-session-cleaner-host 用一个小 bundle 补上 Web 侧「删会话」和「选文 Copy / Quote / Ask」两条路径,Ask 通过单会话复用 subagent 与定向 compaction 控制上下文膨胀。需要安装步骤与 API 细节时,以仓库 README 为准。

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

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

Xiaoye