前言¶
在 DeepSeek Harness(DSH)里和模型对谈时,经常会遇到「只想就某一段回复深入聊几句,又不想主会话里堆满分叉讨论」的情况。Codex 里有 /side:选中一段,在旁边开一个线程,主会话界面保持干净。DSH 没有一模一样的原语——直接 fork、归档隐藏、或伪装成 subagent 都会在当前平台规则下踩坑(README 里逐条说明了为什么)。dsh-side-chat 是社区维护者 BlakrPander 提交的客户端插件,用「空白会话 + 右侧栏页签 + 会话引用」把类似体验落到 DSH 上:选中文本后点「侧栏会话」,右侧打开独立对话,侧栏里的内容不进主会话记录。
下面介绍它做什么、怎么用,以及安装时需要注意的权限与边界。
这是什么¶
- 仓库与插件名:
dsh-side-chat(npm 包名同 README 目录结构) - 维护者:BlakrPander
- 分类:客户端(
package.json中dsh.client,platform: "web") - 当前版本(资料中的
package.json):1.0.1,许可证 MIT - 目录页:https://www.skillhub.cn/plugins/BlakrPander/dsh-side-chat
- 源码:https://github.com/BlakrPander/dsh-side-chat
一句话:仿 Codex /side 的交互——选中对话里的一段文字,在右侧栏开一个空白会话,用引用把父会话与选区上下文交给模型,界面仍从空白开始。
核心功能¶
已核实的行为如下(与 README「它做了什么」一致):
| 操作 | 结果 |
|---|---|
| 在对话里选中文字 | 浮层出现「引用文本」「侧栏会话」两个胶囊(接管原生「引用文本」单胶囊格位,引用行为不变) |
| 点「侧栏会话」 | Host 创建空白会话;右侧栏打开页签;输入框预填父会话引用 + 选区引用 |
| 同一条主会话再开侧栏 | 复用同一条侧栏会话,不新建 |
| 关闭侧栏页签 | 会话仍可能在磁盘上(平台无删除 API),但不在工作区里;不归档、不阻塞,可随时再开 |
| 主会话尚未发过消息 | 拒绝开启,提示「先发一条消息」(与 Codex /side 守卫一致) |
侧栏页签标题固定为「侧栏会话」,地址形如 dsh-resource://sidechat/session/<sessionId>,可拖动、拆分、浮动,与普通页签相同。
与主会话的隔离:侧栏对话不出现在主会话聊天记录里;上下文通过 dsh-session-reference 规范的 mention 进入模型请求,界面不铺整段历史。
典型用法¶
- 在主会话里先至少发送一条消息(否则无法开侧栏)。
- 用鼠标选中助手或你自己消息里的一段文字。
- 在浮层点 侧栏会话(需要时点 引用文本 仍走原有引用逻辑)。
- 右侧栏出现空白会话;输入框里已有「父会话引用胶囊」和选区引用,直接输入例如「这里为什么……」即可。
- 聊完关闭右侧页签即可;同一主会话再次点侧栏会话会打开同一条侧栏会话。
Host 侧创建会话走 HTTP:
POST /api/side-chat/open
Content-Type: application/json
{ "parentSessionId": "session-..." }
成功时返回 { "sessionId": "session-..." }。该路由仅对 peer.principal.kind === 'owner' 执行;非 owner 为 403。客户端若遇 404,README 说明可理解为宿主未加载新版本,重启应用后再试。
安装与启用¶
插件没有在资料中给出 dsh plugin add github:owner/repo 这类一行远程安装命令;README 推荐通过插件管理器指向本地目录(例如你已下载或解压的仓库路径)。
推荐:插件管理器安装 bundle
在 DSH 插件管理器中使用 install_bundle,将 target 设为插件目录的绝对路径。
等价 CLI(会写 profile 的 package.json / patch 层,一般不必手工操作):
dsh plugin --profile desktop add link:/path/to/side-chat
将 /path/to/side-chat 换成你本机上的 dsh-side-chat 目录。
启用 / 停用 / 移除(资料原文):
plugin_manager: set_bundle target=dsh-side-chat enabled=false # 停用
plugin_manager: remove_bundle target=dsh-side-chat # 移除
cordis.patch.yml 会向 bundle 插入 include:side-chat。以 link 方式安装时:改 client.js 刷新页面即可;改 index.js 由 Host HMR 监听 link 目标自动替换。
架构要点(便于排查问题)¶
插件一个包、两半职责:
index.js(Host):注册POST /api/side-chat/open,校验parentSessionId,用ctx.agents.create创建普通空白会话(继承父会话cwd,不挂 workspace)。client.js(Client):选区浮层、右侧栏页签类型、资源供给dsh-resource://sidechat/session/...、预填输入框;父子映射记在localStorage['side-chat.v3.side-sessions']。
侧栏页签体复用与 ui-subagent 类似的 embedded 会话内容槽位配方。扩展点包括 conversation.chat.text-interaction 的 quote 槽、sidebar.right.pane.tab、ctx.resources.register({ protocol: 'sidechat' }) 等,完整表格见仓库 README。
适用场景与注意¶
适合谁
- 经常在 DSH 桌面/Web 客户端里做长对话,需要对某一两句展开推演、对照论文、改措辞,又不想 fork 后主列表多一条带全量历史的子会话。
- 接受 Codex
/side式语义:侧栏是辅助讨论,关掉页签即结束当前右栏使用,不强求「完全从磁盘抹掉会话」。
平台与产品层面的取舍(资料明确写出)
- 侧栏会话是普通会话,会出现在左侧「未归组」列表;一条主会话最多复用一条侧栏,靠复用控数量。这是为了在「不能同时隐藏又当普通会话用」的约束下优先保证可输入、可附件、可正常 prompt。
- 插件随 当前 DSH 进程权限 运行;安装前应自行阅读源码与 MIT 许可证,确认
index.js里创建会话与/api/side-chat/open是否符合你的安全预期(仅 owner 可调用创建接口)。
已知限制节选
- 空主会话不能开侧栏。
- 父会话不存在或创建失败时 HTTP 409;请求体超过 4 KiB 或缺少父 id 时 400。
- 归档会话等闸门行为与平台一致,侧栏不会 magically 绕过
ArchivedSessionGate。
开发自测(维护者脚本,可选):node tools/side-chat-check.mjs;语法检查 node --check client.js / index.js。
结尾¶
dsh-side-chat 把「选中一段 → 右侧独立聊 → 主会话界面不增噪」落到 DSH 客户端:交互上对齐 Codex /side,实现上尊重 DSH 对 fork、归档、subagent 会话的限制。若你在做 harness 上的对话式工作流,值得把它当作客户端侧的一个可安装扩展来试用。
- 社区目录:https://www.skillhub.cn/plugins/BlakrPander/dsh-side-chat(独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」)
- GitHub:https://github.com/BlakrPander/dsh-side-chat