# dsh-mobile-upgrade

[English](../../README.md) | [简体中文](../zh-Hans/README.md) | 繁體中文 | [日本語](../ja/README.md) | [한국어](../ko/README.md) | [Español](../es/README.md) | [Français](../fr/README.md) | [Deutsch](../de/README.md) | [Русский](../ru/README.md)

面向 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)（`dsh`）web profile 的行動版體驗修復，以單一外掛交付。所有介面皆透過宿主自身的槽位與狀態訊號呈現——不接管版面、不放浮動元件、不輪詢聊天內容。

## 你會得到

- **重新啟動服務列** — 設定 → 一般裡多一條「重新啟動服務」。先確認，再重新啟動 `dsh` 程序，服務恢復應答後頁面自動重新整理。
- **輸入模態開關** — 原生供應商編輯表單的每個模型列上追加 text/image/video 核取方塊，把模型的 `input` 陣列寫回 `settings.yaml`（寫入前備份）。未自訂過的目錄模型僅唯讀顯示開關。
- **窄螢幕抽屜側欄** — 1024px 以下側欄收成角落小晶片，只保留宿主自己的開關；展開時完整側欄以抽屜浮在全寬內容之上，選取會話自動收合。晶片與抽屜原子互換（沒有會在主執行緒忙碌時凍結的幾何動畫），關閉抽屜的那一次點擊會在同一幀內把它收合，而不是等宿主重新渲染——因此同時跑著大量會話的手機不會讓抽屜卡在半展開狀態，收合後的晶片也不會白底蓋在宿主已經清空的側欄軌道上。
- **窄螢幕設定標籤** — 700px 以下設定對話框的側向導覽變成一行可水平捲動的標籤。
- **全寬模型選單** — 700px 以下輸入框的模型選單重新錨定為正好手機寬度（左右各 12px 邊距），不再落到螢幕外；垂直落點（觸發器上方）仍由宿主負責。
- **可捲動的問題卡片** — 1024px 以下待回答的問題再也無法埋沒自己的選項：問題被限制在自有的捲動區域內，於是長問題就地捲動，下方的選項清單保有剩餘空間，選項、提交列與收合/關閉按鈕始終留在螢幕上並可以點到。短問題不受影響，卡片仍貼合自身內容。
- **詳細面板防呆** — 目前宿主的全螢幕工具詳細面板關閉控件失效，窄螢幕上不再渲染它，聊天不會被擋住。
- **風暴安全的反應性** — 抽屜/選單觀察器與設定輪詢器以受限速率回應串流訊息爆發，宿主無法連線時自動退避；重連期間側欄軌道重新掛載時保留抽屜狀態而不是來回擺動，關閉抽屜的點擊在重新掛載後重試而不是落在過期的開關上：大量會話同時串流輸出不再凍結輸入，也不會把側欄抽動到點不動——無論抽屜展開還是收合。
- **子代理目錄防護** — 宿主每次請求都列舉整個會話語料來產生子代理目錄（長歷史下約 1s），其用戶端又在每次選取、晶片懸停與成員變動事件時發起詢問。外掛包住這次重新整理：活躍會話清單中沒有子代理的父層不再被詢問，同一父層至多每 2.5s 被問一次，重新整理起點彼此錯開——子代理扇出不再以全量語料掃描拖垮宿主。
- **點擊展開的譜系晶片** — 桌面端上，子代理晶片（「N 個子代理」與子代理標題切換器）在目前宿主裡只對懸停展開，點擊無效。外掛把晶片上的點擊轉換成宿主已經理解的懸停事件對，於是點擊即可開合子代理樹（祖先麵包屑保留原有的點擊導覽）。
- **窄螢幕頭部收納器** — 1024px 以下，會話頭部的晶片（譜系、任務、預設）比手機還寬且僅能懸停。它們摺疊成一枚膠囊（`≡ 標題 · N agents · M jobs`）；點按後開啟全寬面板，內含會話譜系（每個祖先皆可點按，並標註各自的後代數）、以家族根為根的子代理樹——列資料渲染自活躍會話清單，分支經防護重新整理按需擷取目錄——以及本會話的背景任務。桌面端維持不變。
- **自我更新** — 用戶端 bundle 按修訂版不可變發佈，手機分頁可能連跑舊版好幾天。頁面把啟動時的修訂版與伺服器目前發佈的修訂版比對，待頁面閒置時（絕不在輸入草稿期間）自行重新整理，或提供可點按的橫幅。
- **會話列表渲染節流** — 宿主對每個已掛載會話的每次投影變化都推送一個全值幀，而執行中子代理的計時視圖在每個已提交事件上都會變化，於是繁忙的後台機群會以每秒 50-150 幀灌進頁面。每個幀此前都會重渲染整個會話列表（一次重建要遍歷全部摘要外加 O(n²) 快取清掃——實測佔掉主執行緒的大半時間，頁面凍結到只能重新載入）。插件把這些重渲染合併到一個自適應的尾隨間隔上，同時數值仍原封不動地流入各會話自己的儲存——背景串流不再凍結頁面，無論是新會話還是舊會話。
- **逐功能開關** — 外掛在 設定 → 外掛 裡安裝 `dsh-mobile-upgrade` 設定節，每個功能一枚開關。

## 截圖

懸浮球與側欄抽屜（含標註）：

| | |
|---|---|
| ![懸浮球](../../res/shot-floating-chip.png) | ![側欄抽屉](../../res/shot-drawer.png) |

## 安裝

```sh
dsh plugin --profile web add dsh-mobile-upgrade
```

重新啟動 `dsh web`，然後在手機上開啟 web profile：重新啟動列在 設定 → 一般，功能開關在 設定 → 外掛 → dsh-mobile-upgrade。附件請直接使用宿主輸入框內建的附件系統。

需要 `dsh` 0.1.5-rc.1 或更新版本（宿主內建附件系統已取代本外掛的上傳功能）。

## 設定

外掛設定卡提供：

| 鍵 | 預設值 | 意義 |
|---|---|---|
| `restartEnabled` | `true` | 提供重新啟動服務列及其路由 |

## 功能開關

上文每個功能都可以在 設定 → 外掛 → dsh-mobile-upgrade 裡切換（下次頁面載入生效），也可以按裝置用 `localStorage` 鍵覆寫——`mfx-restart`、`mfx-settle`、`mfx-drawer`、`mfx-settings`、`mfx-modality`、`mfx-menus`、`mfx-net`、`mfx-questions`、`mfx-selfupdate`、`mfx-agents`、`mfx-header`、`mfx-listthrottle`——值為 `"0"` 即關閉該功能。

## 已知限制

- 客戶端按宿主 UI 的雜湊 CSS 類別名稱（選單、抽屜開關、供應商編輯器、會話頭部晶片）掛鉤。宿主建置若重新命名這些類別，對應功能會降級，待本外掛跟進調整；其餘功能不受影響。問題卡片中的問題區域則改由卡片自身的 `data-question-key` 鉤子定位，因此宿主重新建置若只是重新雜湊 CSS 模組，它仍能繼續運作。
- 頭部收納器與譜系點擊墊片都跑在宿主自身的資料上（活躍會話清單及其子代理目錄）；除受防護的分支擷取外不新增請求，點按某個模式仍在載入中的列，會在對應目錄送達後自行完成。
- 輸入模態開關只能補寫你自行自訂過的供應商路由；純目錄路由依設計唯讀——憑空造一個目錄節會導致模型目錄崩塌。

## 安全說明

外掛的 HTTP 路由（重新啟動、設定編輯）自身不做任何鑑別——它們信任所載入的 `dsh` web 表層。對外暴露部署之前，請把它放到保護其餘介面的同一道閘門之後（反向代理認證、僅回環繫結）。

## 社群連結

- [Linux.Do](https://linux.do) —— 一個分享與討論技術的社群。

## 授權

以[合成原始碼授權條款（SySL）1.0 版](LICENSE)散佈。

> NOTICE: This software includes code generated by artificial intelligence. See the LICENSE file for the Synthetic Source License terms, including model disclosure requirements.
