前言¶
DeepSeek Harness(DSH)通常在桌面或浏览器里操作智能体会话。若想在 iPhone、iPad 上以原生 SwiftUI 界面查看流式回复、思考过程、工具卡片和审批,而不去 fork 客户端或上架自建 App,需要在本机提供 Hermex 所识别的 hermes-webui(HTTP + SSE)或 Hermes host(REST + WebSocket JSON-RPC)服务。
dsh-hermes-facade 是 DSH 的 host 插件:在本地监听回环端口,在 Hermex 与 DSH 的 Typer Gateway 之间做协议转换,不改动 DSH 原生的 :3080 入口。维护者为 Gnanesh Kunal,源码在 GitHub 以 MIT 许可证发布,当前 package 版本为 0.3.0。
插件定位与架构¶
一句话:让本机 DSH 对外表现为 Hermex 免费客户端(Hermex,App Store)可连接的 Hermes 系列服务端。
README 中的数据路径示意如下:
Hermex (iOS) --HTTPS/SSE--> tailscale serve :9443 --> 127.0.0.1:9120
|
dsh-hermes-facade
| in-process
dsh typertGateway
插件选择「门面」而非 fork Hermex 的原因也很明确:Hermex 主界面走 hermes-webui 契约;冒充 webui 主机是变更面最小的做法,无需维护 Xcode 工程或独立 App Store 条目。
核心功能¶
下面只列 README 与 package.json 中已写明的能力。
hermes-webui 监听(默认端口 9120)¶
- 会话列表、详情、历史(最新 200 条;在最新 800 条内支持 50 条一页的向前翻页)。
- 会话搜索(id、标题、消息内容;内容匹配带摘要)。
- 聊天:SSE 流式输出、取消、token 增量、思考块、工具卡片及结果。
- 审批(once / session / always / deny)与澄清问答;重连后保留命令描述,过期提示返回
409 {"stale":true}。 - 模型选择与 reasoning effort;用量遥测(无费用字段,因 DSH 无定价)。
- 工作区:列表只读;工作区文件浏览器只读。
- 健康检查、密码认证与签名 Cookie。
Hermes-protocol 监听(可选,端口 9121)¶
Hermex 2.x 默认对接 Hermes host。插件可在同一进程内同时提供两套契约:
| 端口 | 契约 | 在 App 中的表现 |
|---|---|---|
| 9120 | hermes-webui(HTTP + SSE) | Legacy 服务器;可能出现迁往 Hermes 的提示 |
| 9121 | Hermes host(REST + WS JSON-RPC) | 原生 Hermes 服务器 |
网关监听器不重复实现 DSH,而是通过内部 token 转回本机 webui 门面。README 列出聊天附件、会话内 Git(读写在无进行中的 turn 时可用)、Memory、Skills(只读)、Tasks/cron 等覆盖面;Bots 与会话导入未实现(返回 JSON-RPC -32601,App 会隐藏相关控件)。细节见仓库内 docs/06-hermes-gateway.md。
启用第二监听器的配置示例(来自 README):
config:
gatewayEnabled: true # false 时仅保留 webui 监听
gatewayPort: 9121
gatewayBindHost: 127.0.0.1
gatewayLanHost: auto # 同时在 Wi-Fi LAN 与 Tailscale IPv4 上提供明文 HTTP
环境与依赖¶
package.json 要求:
dsh:>=0.2.1-rc.1node:>=22.6
安装与启用¶
先做插件安装,再把 bundle 写进 profile,最后重启 host。
1、安装插件(命令须与 README 一致):
dsh plugin --profile web add dsh-hermes-facade
2、在 ~/.dsh/profiles/web/package.json 的 bundle 列表中加入包名:
"dsh": { "profile": { "bundles": [ "... existing ...", "dsh-hermes-facade" ] } }
3、重启 host 以加载插件:
dsh web
首次启动会在日志中打印一次性密码,例如:
hermes-facade: FIRST RUN password = xxxxxxxxxxxx
哈希结果保存在 ~/.dsh/hermes-facade/password.json(权限 0600)。若要重置,删除该文件后重启即可。
典型用法:从手机连到本机¶
经 Tailscale HTTPS 暴露(仅 tailnet,不用 Funnel)¶
webui 契约:
tailscale serve --bg --https=9443 http://127.0.0.1:9120
若已启用 Hermes 监听器,可单独暴露第二端口(App 通过 GET /api/status 判定服务器类型,同一 URL 不能兼有两种角色):
tailscale serve --bg --https=9444 http://127.0.0.1:9121
tailscale serve status
在 Hermex 中选择 Add server,URL 填 https://<machine>.<tailnet>.ts.net:9443,密码填首次启动时打印的值。
取消暴露时:
tailscale serve --https=9443 off
注意:不要用 serve reset,否则会连带关闭 Funnel 与 :8443。
局域网或 Tailscale 明文 HTTP¶
Hermex 允许对本地网段主机及 Tailscale 100.64.0.0/10 使用明文 HTTP,因此前两种方式可不配 TLS:
| 场景 | URL 示例 |
|---|---|
| 同一 Wi-Fi | http://<mac-lan-ip>:9120 |
| Tailscale 明文 | http://<mac-tailscale-ip>:9120 |
| Tailscale + serve | https://<machine>.<tailnet>.ts.net:9443 |
查地址可用:
ipconfig getifaddr en0 # Wi-Fi LAN
tailscale ip -4 # Tailscale IPv4
cordis.patch.yml 中 lanHost: auto 时才会在非回环地址监听;否则仅 127.0.0.1,手机只能经 tailscale serve 到达。iOS 首次访问会申请本地网络权限,需允许。
若 HTTPS 地址长时间无响应,可改用 Tailscale 明文 IP,跳过 MagicDNS 与 TLS 握手。
开发与调试¶
Host 插件在 dsh web 启动时加载,修改插件后需重启。若只迭代 HTTP/SSE 契约,可单独起 mock 服务:
node scripts/standalone.mjs --port 9120
该入口与 npm test 相同,可用 curl 覆盖整面 API。
从源码目录加入 profile 时(README 节选):
dsh plugin --profile web add ~/self/dsh-hermes-facade
(需先在本机准备好对应路径的 checkout,并按仓库说明执行 npm run check && npm test。)
适用场景与注意¶
适合谁:已在运行 DSH、希望通过 Hermex 在移动设备上管理同一会话流(含审批、工具卡、澄清)的自托管用户;已使用或计划使用 Tailscale 将本机服务暴露给个人设备,且接受自行保管一次性密码。
权限与安全:插件作为 DSH host 的一部分,与当前 dsh 进程共享权限,可触达 DSH 已开放的工作区与工具能力。安装前应阅读 GitHub 仓库 源码与 MIT 许可证;勿将 Funnel 用于 Hermes 门面 README 明确反对的对外公开场景。
生态说明:DSH 奉行「一切皆插件」;Skillhub 插件目录 为社区站点,与 DeepSeek、幻方无官方从属关系。
结尾¶
经过上面的步骤,本机 DSH 即可在移动端正向 Hermex 呈现会话、流式输出与审批流程,而无需维护 fork 版客户端。更多信息见目录页与仓库 README: