dsh-split-chat:在 DSH 右侧栏并排打开完整对话

前言

在 DeepSeek Harness(DSH)里做智能体或长任务时,常见做法是开多个会话、或在主区来回切换。主区只能承载一条当前对话;若要在对照另一条会话的同时继续主区输入、审批或停止,往往只能依赖系统窗口分屏或频繁切换标签,交互成本高。

下面介绍社区客户端插件 dsh-split-chat(维护者 imshz6669):把任意已有会话作为完整对话 tab 开进右侧栏,主区对话保持不动;两侧均可正常收发。右栏还可再分一格,主区加右栏最多同时 3 个独立对话。插件归类为「客户端」,在 SkillHub 目录页 可检索;生态目录为独立社区站点,与 DeepSeek / 幻方无官方从属关系。

这是什么

dsh-split-chat 是 DSH 的 client bundle 插件:通过右侧栏资源协议 dsh-resource://splitchat/session/<id> 挂载嵌入版对话视图,与主区共用 DSH 的 Session Controller,但输入、审批、停止各自独立。无 Host 逻辑、无数据库变更、无额外模型或 token 成本;源码与许可证见 GitHub 仓库(MIT,package.json 版本 0.2.0)。

核心功能

场景 行为
会话行 ... 菜单 新增 「在右侧打开「会话名」」;点击后右栏展开,出现该会话的对话 tab
会话行悬停 同一动作的图标按钮(⧉)
打开后 右栏为完整对话 + 输入框;主区不变;重复打开同一会话按 contentId 去重,仅聚焦已有 tab
右栏分栏 右栏可再分一格 → 主区 + 右栏最多 3 个对话
切换主区会话 已打开的右栏 tab 全局跟随到新主会话的 dock 布局;原收起状态保持收起
主区已是当前会话 右栏显示「该会话已在主区打开」(会话编辑器单 root,不重复挂载)
跨栏发送 输入框旁 ⇄:将本栏选中文字(未选则取最后一条 assistant 回复)填入另一侧输入框;Shift+点击 直接发送

窄窗口(宽度 < 768px)时右栏自动全屏,避免高度塌陷。关闭 tab 或收起右栏会释放 sessions.retain,不影响主区;归档或删除的会话在 tab 内提示「无法打开该会话」。

安装与启用

环境要求:DSH 0.2.1-rc.2 及以上(desktop 与 Web 使用同一套 client 插件机制)。插件依赖 DSH 内部公共接口;README 写明已在 0.2.1-rc.2 验收,0.2.2+ 升级后需自行回归。

安装前请阅读仓库 lib/client.js 与许可证;插件在 当前 DSH 进程权限 下运行,与宿主共享会话与输入能力。

方式 A:插件页 / plugin_manager

将本插件目录作为本地插件安装(需本机已有该目录的绝对路径):

  • GUI:设置 → 插件 → 添加插件 → 本地绝对路径
  • CLI:
dsh plugin --profile <profile> add link:<本目录绝对路径>

安装器会写入 profile 的 dependencies 与 dsh.profile.bundles(包声明了 dsh.bundle.patch)。

方式 B:手工编辑 profile

编辑 profile 的 package.json,在 dependencies 与 dsh.profile.bundles 末尾追加 dsh-split-chat,例如:

{
  "dependencies": {
    "dsh-split-chat": "link:D:/path/to/dsh-split-chat"
  },
  "dsh": {
    "profile": {
      "bundles": [
        // ...末尾追加
        "dsh-split-chat"
      ]
    }
  }
}

在 profile 目录执行:

pnpm add link:D:/path/to/dsh-split-chat

然后重启客户端。README 注明:在 0.2.1-rc.2 上,新装的 client bundle 可能经 client-modules HMR 热生效,菜单可直接出现;若断线或未跟上,刷新页面,仍不行再重启。修改 lib/client.js 后若未生效,同样刷新或重启。

典型用法

  1. 左侧会话行 → ... → 「在右侧打开」(或悬停点 ⧉)。
  2. 右栏出现该会话 tab,正常发消息、审批、停止即可。
  3. 右栏标题栏的 + / 分栏可再开一格;× 关闭 tab。
  4. 主区切换到其他会话时,右栏已打开的 tab 会跟随;要清空右栏则关闭对应 tab。
  5. 跨栏搬运内容:在对话中选中一段(或不选),点输入框旁 ⇄ 填入另一侧;按住 Shift 点 ⇄ 则直接发送。

注意:会话行须至少有 一条非 blank 消息 才会出现 ... 与悬停按钮——这是 DSH 对 blank 会话的规则,非本插件限制;新会话先发一句即可。hero 页(未选中会话)无 dock 时,openResource 会失败,插件会回退为在主区打开该会话。插件不提供「在右栏新建会话」。

工作原理(简述)

入口在会话菜单 / 行按钮,调用 ctx.sidebarRight.openResource('dsh-resource://splitchat/session/<id>', { kind: 'splitchat' });右栏按 kind 渲染 tab,经 ctx.sessions.retain(id, { source: 'splitChat', signal }) 保活会话,并用 renderFactorySlot 嵌入 variant: 'embedded' 的对话视图。全局跟随订阅 ctx.sidebarRight.mounted,在主会话切换时于新会话 dock 中重新 openResource。跨栏发送在 conversation.input.right 注册 ⇄,经 conversation.input.shell(目标会话).actions 的 setDraft / submit 写入目标输入框。注册点集中在 lib/client.js 的 apply(),无构建链,为手写 client-module bundle。

适用场景与限制

适合:对照两个(或三个)会话并行推进;主区跑当前任务、右栏盯参考会话或子任务;需要在两侧之间快速引用最后一条回复或选中片段。

限制(摘自 README):同一会话不能主区与右栏同时编辑;跨栏发送为纯文本,不保留富文本 / Markdown;右栏宽度初始约 45%、最大 70%、主区保底 400px;依赖宿主 conversation.input 等服务,缺失时 ⇄ 可能提示失败。全局跟随会把 tab 写入各主会话自己的 dock 持久化布局——关掉 tab 后再切会话不会复活该 tab。

结尾

dsh-split-chat 在不大改 DSH 的前提下,用右侧栏资源与嵌入对话视图实现主区 + 右栏(最多三格)并行聊天,并辅以全局跟随与跨栏 ⇄。安装以本地 link: 路径为准,勿凭仓库名臆造远程 dsh plugin add 命令。

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

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

Xiaoye