前言¶
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: