dsh-session-hub
Aggregate and natively control DeepSeek Harness sessions across multiple remote dsh web servers from one pane: server registry, merged session list, history, prompt, cancel, rename, fork, model selection and approval/question answering.
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Asaiuta/dsh-session-hub说明文档
阅读完整 README ↗dsh-session-hub
⚠️ Alpha — 0.1.0-alpha.1:协议与 API 仍在演进,核心链路(网关路由 / 官方 UI 桥接 / 实时帧注入)已实机验证,但配置格式与安全边界可能变化。
在单个 DSH Web UI 里聚合并原生操控多台 DeepSeek Harness 服务器的会话。
这个插件把若干台远端 dsh web 部署的会话聚合到一个面板中:服务器管理、合并的会话树、会话历史/发送/取消/重命名/派生、模型选择、以及远端审批/提问的应答——全部通过 DSH 自有的 /api 协议原生完成,不依赖 SSH、不做屏幕抓取、不改远端任何配置。
为什么可行(协议分析)
DSH 的 Web 传输层本身就是一个完整的远程控制协议(client-connection 包 + host-apiproxy 包):
- 上行:
POST /api/,JSON 信封 RPC。会话域方法齐备:session.list / history / prompt / cancel / rename / fork / create / models / selectModel / updateQueue / attachment / search,加上host.describe与应答通道POST /api/respond。 - 下行:WS 升级
/api/events.mux与/api/events.host两条事件流——官方浏览器客户端、orbis 手机客户端、dsh-desktop 桌面客户端都走同一协议。 - 信任围栏(
api-request-trust.ts):Node 客户端不携带 Origin / Sec-Fetch-*,只要Host头是环回地址(SSH 隧道)或远端trustedHosts/CLI 派生的 LAN IP 字面量即可通过;会话类方法均为非特权方法(只有 settings/credentials/目录选择器固定在环回)。因此本插件的 Node 端可以直连任意远端的标准/api。 - 应答交互:远端 mux 流推送
approval/requested/question/requested帧(带稳定 rpcId),本插件捕获后经本地 UI 呈现,用户的批准/回答通过POST /api/respond回填远端——与官方浏览器完全同构。
架构
┌──────────────────────── 本地 DSH 进程 ────────────────────────┐
│ host 插件 (src/index.ts → hub/) │
│ │
│ ServerRegistry ──持久化── ~/.dsh/plugins/dsh-session-hub.json │
│ │ 每个 ServerLink ── RemoteApiClient(AbstractApiClient) │
│ │ · HTTP unary → 远端 /api/session.* │
│ │ · WS mux/host 双流 + 指数退避重连 │
│ │ · 会话列表缓存 / pending 交互表 (rpcId→服务器索引) │
│ ├── HubGateway(exact 路由优先于官方 /api prefix) │
│ │ 接管 session.list/history/prompt/cancel/rename/fork/ │
│ │ models/selectModel/updateQueue/attachment/search/respond│
│ │ 按会话归属路由:远端 → ServerLink,本地 → 官方 ApiProxy │
│ │ session.list 合并去重(官方 items + 远端 rows) │
│ └── SessionHubRuntime (TypertRemoteService @Remote) │
│ 暴露 wire 命名空间 sessionHub(服务器管理/远端建会话) │
│ SSE /hub/events(token + 环回 + same-origin 围栏) │
└──────────────┬────────────────────────────────────────────────┘
│ 官方 /api unary(浏览器→网关→路由)
│ SSE 远端 mux 帧(原样转发)
┌──────────────▼────────────────────────────────────────────────┐
│ browser:官方 UI(零替换) │
│ · 官方工作区树:/api/session.list 由网关合并 → 远端会话直接 │
│ 出现在官方树(未归档区);点击打开 │
│ · 官方对话区:远端会话 open() 走 /api/session.history 网关路由,│
│ 实时 mux 帧由 client 桥 (startOfficialBridge) 注入官方 │
│ sessions.handleMuxEnvelope → 官方逐 token 流式渲染/审批卡 │
│ · 侧边栏底部 SESSION-HUB 区块(官方树零改动):服务器增删/ │
│ 状态/探活、远端新建会话 │
└────────────────────────────────────────────────────────────────┘