前言¶
DeepSeek Harness(DSH)自帶 Web UI 體量較大,在經中繼的手機網絡上首屏加載往往要十秒以上,交互也偏桌面。社區裏另有名爲 dsh-mobile-gateway 的 npm 包,走的是掃碼與代理完整 UI 的路線。dsh-mobi-web 是另一類方案:在 harness 進程內掛一個 sidecar 網關,對外提供約 32 KB 的獨立移動頁,直連宿主服務,並支持「由手機發起的回合,審批只留在手機上」等行爲。下面按定位、能力、安裝與暴露方式說明用法與注意點。
這是什麼¶
dsh-mobi-web 是面向手機的 Web 客戶端插件,維護者爲 rainfish-home,歸類爲 DSH 客戶端插件。數據流大致爲:手機瀏覽器經 HTTPS(Tailscale Serve 或 Cloudflare Tunnel)訪問本機 127.0.0.1 上的網關端口,網關再與 harness 宿主服務同進程協作。
phone browser ──HTTPS──▶ Cloudflare tunnel / Tailscale ──▶ 127.0.0.1:3083 (this plugin) ──▶ harness host services
插件以 DSH bundle 形式發佈(自帶 cordis.patch.yml),當前 npm 包版本爲 0.1.0,許可證 MIT,要求 Node >=20。
核心功能¶
瀏覽與會話¶
- 按 workspace 分組展示會話,與桌面一樣按
SessionSummary.updatedAt排序;正在運行的會話有標記。 - 活躍會話(運行中或 24 小時內有過活動)與更早會話分開,舊會話默認摺疊;已歸檔會話不展示;各 workspace 摺疊狀態會記住。
閱讀消息¶
- 支持常見 Markdown:標題、列表、表格、引用、鏈接、行內與圍欄代碼塊。
- 圍欄內的 Mermaid 在設備上渲染爲 SVG,點開可全屏平移縮放,再點關閉。
- 長消息摺疊到約 460px,可「展開全文」;回覆支持 token 流式增長。
操作¶
- 多行輸入(Enter 換行,僅發送按鈕提交);最多 4 張圖片(單張 4 MB,inline base64)。
- 可中止正在運行的 turn;可在任意 workspace 標題欄「+」新建會話;可跳回最新消息。
審批(Origin affinity)¶
- 審批請求經 SSE 以卡片形式到達。
- 若該 turn 由手機發起,審批只留在手機端,最多等待 15 分鐘,超時取消,不會回落到無人值守的桌面;桌面發起的 turn 仍保持原有行爲(約 20 秒寬限後交回桌面)。
- 默認配置項
approvalPriority爲'phone-first';設爲'desktop'可關閉攔截。
連接與生命週期¶
- SSE 斷線指數退避重連(2 s 至 30 s),並以 6 s 輪詢兜底。
- 網關隨 harness 進程啓停,無需單獨守護進程。
安裝與啓用¶
插件是 DSH bundle,安裝後會把依賴寫入 package.json 的 dsh.profile.bundles;新 bundle 需重啓應用或 dsh 後纔會掛載。
Web 及其他 profile(npm CLI):
dsh plugin --profile web add dsh-mobi-web # from npm
dsh plugin --profile web add link:/path/to/dsh-mobi-web-plugin # from a checkout
Desktop profile(Electron 專用,npm CLI 不管理 desktop):在應用內插件管理器安裝,或使用應用自帶的 dsh:
dsh plugin --profile desktop add dsh-mobi-web
本地檢出目錄名慣例仍爲 dsh-mobi-web-plugin,與 npm 包名 dsh-mobi-web 不同,勿與無關包 dsh-mobile-gateway 混淆。
暴露訪問與登錄¶
網關默認只監聽環回地址,需用隧道把端口暴露給手機:
tailscale serve --bg 3083 # phone on the same tailnet
# or a Cloudflare tunnel ingress: host → http://127.0.0.1:3083
瀏覽器打開 https://<your-host>/m/。
訪問口令:未在 patch 裏設置 token 時,首次啓動會在 $DSH_HOME/dsh-mobi-web-token(權限 0600)生成令牌;啓動日誌只打印文件路徑,用 cat 該文件讀取。也可在配置中設置 token: '…',或在完全可信的網絡使用 token: false 關閉門控。不推薦開啓 allowTokenUrl(?t=… 易泄露)。
配置要點¶
在對應 profile 的 cordis.patch.yml 中覆蓋配置時,patch 會替換整段 config 對象,需寫全非默認值。示例:
- id: dsh-mobi-web
config:
listenHost: '127.0.0.1'
listenPort: 3083
blockPaths: ['/dsh-whale/']
| key | 默認值 | 含義 |
|---|---|---|
listenHost |
127.0.0.1 |
不綁定公網,由隧道終結 TLS |
listenPort |
3083(bundle patch;代碼默認 3080) |
監聽端口 |
token |
自動生成文件 | Cookie 門控密碼;false 關閉 |
allowTokenUrl |
false |
是否接受 URL 傳參令牌 |
blockPaths |
[] |
匹配前綴返回 204,減輕頁面負載 |
approvalPriority |
'phone-first' |
'desktop' 關閉手機側攔截 |
pwa |
true |
爲代理 UI 注入 manifest 與圖標 |
brotli |
true |
對代理 UI 的 JS 再壓縮 |
主要 HTTP 路由包括移動頁 GET /m/、會話與 SSE GET /m/api/...、寫操作 POST /m/api/prompt 等;存活探測 GET /__gw/health 無需認證。
典型用法¶
- 在目標 profile 執行
dsh plugin … add dsh-mobi-web,重啓 harness。 - 用 Tailscale Serve 或 Cloudflare Tunnel 把
3083映射到 HTTPS 主機名。 - 手機打開
/m/,輸入令牌登錄;在同一 tailnet 內使用,避免公網裸奔。 - 在手機上發起需要工具審批的對話;審批卡片只在本機瀏覽器出現,在時限內批准或拒絕。
- 需要看圖或流程時,在會話裏查看 Mermaid 渲染;需要發截圖時用圖片發送(最多 4 張)。
適用場景與注意¶
適合誰:已在單機跑 DSH、偶爾用手機查看會話、發 prompt、處理工具審批(含 shell)的開發者;網絡側願意用 Tailscale 等私有組網,或明確理解公網暴露風險的場景。
安全(README 強調):持有登錄令牌即相當於通過 harness 操作該機——可發 prompt、讀全部會話歷史、代你批准工具調用(含 shell)。網關代理的是整個 harness,而非僅聊天。建議放在 Tailscale 等私有網絡;令牌專用於此、不復用他處密碼;公網隧道需自知風險。插件以當前 dsh 進程權限運行,安裝前請閱讀 源碼與 MIT 許可證。
限制(文檔寫明):單用戶、單主機,無多賬號;無推送,手機休眠時審批只能等待(手機發起時最長約 15 分鐘)。歷史消息內圖片可渲染(README 在此處有截斷,其餘以倉庫爲準)。
設計約束:實現上拒絕在非環回地址啓動監聽;sidecar 內請求處理器均包 try/catch,避免未捕獲異常拖垮宿主。
結尾¶
dsh-mobi-web 用極小頁面和進程內網關,在弱網手機上補齊 DSH 的瀏覽、對話、Mermaid 與手機優先審批能力。安裝走官方 dsh plugin add dsh-mobi-web,暴露端口後訪問 /m/ 即可。更多說明見社區目錄 SkillHub 條目 與倉庫 GitHub README。