# dsh-mobile-upgrade

[English](../../README.md) | 简体中文 | [繁體中文](../zh-Hant/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.
