dsh-multi-chat
在 DSH Web 界面里并排运行、监控多个对话实例:多窗口墙 + 自动发现 + 单窗控制,内置带口令认证的局域网网关,手机/平板也能看。
安装
dsh plugin --profile web add dsh-multi-chat
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
💬 dsh-multi-chat —— 多对话,一屏驾驭
[English](README.md) | 中文
<p align="center">
<a href="https://www.npmjs.com/package/dsh-multi-chat"><img src="https://img.shields.io/npm/v/dsh-multi-chat" alt="npm version"></a>
<a href="https://www.npmjs.com/package/dsh-multi-chat"><img src="https://img.shields.io/npm/dm/dsh-multi-chat" alt="npm downloads"></a>
<a href="https://github.com/daetz-coder/dsh-multi-chat/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="license"></a>
<a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/dsh--plugin-community-brightgreen" alt="dsh-plugin"></a>
</p>
<p align="center">
<a href="https://awesome-dsh-plugin.com/p/daetz-coder/dsh-multi-chat/"><img src="https://awesome-dsh-plugin.com/badge.svg" alt="awesome-dsh-plugin"></a>
<a href="https://dshfind.com/plugins/daetz-coder/dsh-multi-chat"><img src="https://dshfind.com/api/badge/daetz-coder/dsh-multi-chat" alt="dshfind"></a>
<a href="https://github.com/awesome-dsh-plugin/awesome-dsh-plugin"><img src="https://img.shields.io/badge/listed%20on-awesome--dsh--plugin-4d6bfe" alt="listed on awesome-dsh-plugin"></a>
</p>
在 DeepSeek Harness 里同时开 N 个对话,并排盯住每一个 Agent 的实时进度,还能用手机/平板躺着看。 一个浏览器,从「一次一个对话」升级成「全景多对话驾驶舱」。
给 DeepSeek Harness (DSH) 官方 Web 界面装上一面多窗口墙:在一张网格里同时显示 N 个正在运行的 DSH 对话实例(每个实例独立跑一个任务),所有 Agent 的实时进度、对话、输出一眼尽收,不用在无数标签页/窗口之间切来切去。
✨ 它能做什么
能力 · 说明
📺 多窗口 · 侧边栏一键进入,右侧对话区原位变成窗口网格,一个端口一格,并排看全部任务
🔍 自动发现 · 扫描端口区间自动发现正在运行的 DSH 实例,也可手动管理
➕ 一键新建窗口 · 墙内直接启动全新 DSH 实例,凑成你的多对话矩阵
📱 手机访问 · 点「手机访问」自动起一个内置带口令认证的局域网网关,手机打开 URL、输入口令即可看进度
🛑 窗口控制 · 单窗口放大、刷新、新标签页打开、关闭实例、列数切换(自动/1/2/3/4/6)
多对话 = 多端口。 启动 N 个 dsh web --port <n>,每个实例独立跑一个对话/任务;在任意一个实例里打开多窗口墙,即可并排看到全部。
📸 运行效果
🖥️ Windows · 双对话并排 —— 两个正在运行的 DSH 实例并排列出,每格都是完整的官方对话界面,带实时在线状态点与单窗控制(放大 / 刷新 / 新标签页 / 移除):
📱 iPad · 双对话移动端 —— 同一局域网内,iPad 打开带口令认证的网关地址,即可在平板上一屏并排盯住两个 Agent 的实时进度:
🖥️ Windows · 三对话全景 —— 3 列网格并排显示 3 个正在运行的实例,一屏尽收全部 Agent,把「一次一个对话」升级成「全景多对话驾驶舱」:
🚀 30 秒上手
# 1. 安装 —— 从 npm 官方源一条命令搞定(无需下载任何 CLI): dsh plugin --profile web add dsh-multi-chat # 适用于 dsh web dsh plugin --profile desktop add dsh-multi-chat # 适用于桌面版应用 # ……或通过插件自带的 npx CLI(先打包再安装): npx dsh-multi-chat install # 2. 启动几个实例 npx dsh-multi-chat start --ports 3080,3081,3082 # 3.(重新)打开任意实例,点侧边栏底部「多窗口」→ 完成 🎉
为什么这样做
- 不改动任何官方逻辑:插件只注册两个增量列表槽位(
conversation.view视图环条目、sidebar.footer.action侧边栏快捷入口)和五个只读 JSON 路由(/multi/api/ports、/multi/api/status、/multi/api/stop、/multi/api/create、/multi/api/link)。不替换任何既有槽位、不改写任何行、不触碰会话/代理/工具等核心逻辑。 - 界面就是官方界面:墙是官方视图环的一个视图,渲染在对话主面板内(不是弹层),主题、字号、图标、控件全部走官方
--dsw-*token 与官方 primitives(Button/Input/Menu/StateDot)。 - 递归防护:墙永远不嵌入自身端口;被嵌入页面带
?multi-wall=embed标记,不注册任何墙界面,杜绝「墙中墙」无限递归。 - 最小改动:一个声明式 client 插件包 —— 包内自带
dsh.bundle.patch+cordis.patch.yml,DSH 启动时自动作为 bundle 层挂载,无需手改任何文件。
目录结构
dsh-multi-chat/ # 单包结构
lib/ # 已构建产物(lib/index.js + lib/client.js + 类型)
src/ # 源码(node half + browser half)
bin/dsh-multi-chat.mjs # 跨平台 npx CLI(install/start/stop/gateway)
scripts/
install-plugin.ps1 # 打包 + 装进 profile(DSH 自动挂载 bundle 层)
start-multi.ps1 / stop-multi.ps1 # 启停多个 dsh web 实例
gateway.mjs # 带令牌认证的反向代理网关(手机/远程访问)
cordis.patch.yml # DSH bundle 层声明
platform-seeds.json # 本插件构建所依据的 DSH 模块表契约
安装与启用(Windows)
# 1) 打包并装进 web profile。插件声明了 dsh.bundle.patch, # DSH 会自动挂载其 bundle 层 —— 无需手改 patch。 .\scripts\install-plugin.ps1 # 2) 重启 dsh web,打开任意实例 dsh web --port 3084 # 浏览器打开 http://127.0.0.1:3084 ,侧边栏底部出现「多窗口」按钮
或手动:
npm pack # 得到 tarball (dsh-multi-chat-<version>.tgz) dsh plugin --profile web add ./dsh-multi-chat-*.tgz # DSH 自动把包加入 bundle 层栈
卸载(一条命令,无需手动清理任何文件 —— 重启 dsh web 后生效):
dsh plugin --profile web remove dsh-multi-chat
使用
1. 先启动若干实例:.\scripts\start-multi.ps1 -Ports "3080,3081,3082,3084"(或手动 dsh web --port <n>)。
2. 打开任意实例,点侧边栏底部的「多窗口」快捷入口(或点对话区头部的「多窗口」标签页)。
3. 墙视图内:自动发现实例(自动排除自身端口)、列数切换(自动/1/2/3/4/6,默认横向铺满)、点标题放大、⟳ 单独刷新、↗ 新标签页打开、✕ 从视图移除、全部刷新、实时在线状态点。布局保存在 localStorage。
4. 退出墙:点工具栏右上角的「退出」按钮,一键切回对话视图。
启动令牌(DSH 0.2)
从 DSH 0.2 起,每个 dsh web 进程会生成一个启动令牌(launch token),不带令牌的 / 请求会得到 401,只有带上令牌才返回界面。因此不带令牌的探活会把每一个真实运行中的实例都判成离线,墙就会一直是空的。
墙会自动带上这个令牌。用 dsh-multi-chat start 启动时,它会从各实例的控制台读到令牌并记录到 $DSH_HOME/multi-wall-instances.json,node 半边会自动读取,无需任何配置:
dsh-multi-chat start --ports 3080,3081 # 令牌自动捕获
用其他方式启动的实例需要手动登记 —— 可以直接编辑上面那个 JSON 文件,或者在 profile 的 patch 层里写:
- id: ui-multi-wall
name: dsh-multi-chat
config:
tokens:
"3085": "<dsh web 启动时打印的令牌>"
"3086": "<dsh web 启动时打印的令牌>"
令牌是每进程的:重启实例会生成新的,记得从该实例的启动输出里重新读取。dsh-multi-chat start 同时会把每个实例的完整控制台日志留在 $DSH_HOME/multi-wall-logs/instance-<port>.log。
手机 / 远程访问(内置认证网关)
官方 dsh web 出于安全刻意禁止 --host 0.0.0.0(会向网络暴露远程代码执行)。本插件内置了一个带令牌认证的内联网关:点工具栏「手机访问」按钮,它会自动为本实例启动一个网关(监听 0.0.0.0,反向代理到 127.0.0.1:<本实例端口>),并返回局域网 URL + 登录口令。
点击「手机访问」→ 得到: 手机在同一网络时可用:http://10.105.7.204:9477 口令:2efb23eade16
手机打开该 URL、输入口令即可进入完整 DSH 界面。网关的安全模型:
- HMAC 签名的 HttpOnly/SameSite 会话 Cookie(默认 12h),
?token=供脚本快捷使用,按 IP 限流登录失败 - 所有代理请求把 Host/Origin 重写为回环目标,官方
/api浏览器信任栅栏(DNS-rebinding 防线)判定为本地请求,无需重启加--trusted-host - WebSocket 升级与
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:25,最后更新 2026-10-01