前言¶
在 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 后若未生效,同样刷新或重启。
典型用法¶
- 左侧会话行 →
...→ 「在右侧打开」(或悬停点 ⧉)。 - 右栏出现该会话 tab,正常发消息、审批、停止即可。
- 右栏标题栏的
+/ 分栏可再开一格;×关闭 tab。 - 主区切换到其他会话时,右栏已打开的 tab 会跟随;要清空右栏则关闭对应 tab。
- 跨栏搬运内容:在对话中选中一段(或不选),点输入框旁 ⇄ 填入另一侧;按住 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 命令。