# dsh-mobile-upgrade

[English](../../README.md) | [简体中文](../zh-Hans/README.md) | [繁體中文](../zh-Hant/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 プロファイルのためのモバイル UI 改善プラグイン。すべての描画はホスト自身のスロットと状態シグナルを通じて行われます — レイアウトの乗っ取りも、浮遊ウィジェットも、チャット内容の DOM ポーリングもありません。

## 得られるもの

- **再起動行** — 設定 → 全般に「サービスを再起動」を追加。最初に確認し、`dsh` プロセスを再起動し、サービスが再応答したらページを自動リロードします。
- **入力モダリティスイッチ** — ネイティブのプロバイダー編集フォームの各モデル行に text/image/video チェックボックスを追加し、モデルの `input` 配列を `settings.yaml` に書き戻します（書き込み前にバックアップ）。未カスタマイズのカタログモデルではスイッチは読み取り専用です。
- **狭い画面のドロワー** — 1024px 以下ではサイドバーはホスト自身のトグルを残す小さなコーナーチップに縮みます。展開するとサイドバー全体がフル幅コンテンツの上にドロワーとして浮かび、セッションを選ぶと再び閉じます。チップとドロワーはアトミックに入れ替わり（メインスレッドが忙しいときに固まるようなジオメトリのアニメーションはありません）、ドロワーを閉じるタップはホストの再レンダリングを待たずにその同じフレームで折りたたみます — そのため、多数のセッションを動かしているスマートフォンでもドロワーを半展開のまま取り残すことはなく、閉じたチップがホストですでに空にしたレールの上に白く残ることもありません。
- **狭い画面の設定タブ** — 700px 以下では設定ダイアログのサイドナビゲーションが横スクロール可能なタブ列になります。
- **全幅モデルメニュー** — 700px 以下ではコンポーザーのモデルメニューが端末の幅ちょうど（左右 12px マージン）に再アンカーされ、画面の外に落ちなくなります。トリガーの上という垂直配置はホストが担い続けます。
- **スクロール可能な質問カード** — 1024px 以下では、保留中の質問が自分の選択肢を覆い隠してしまうことはなくなります。質問は専用のスクロール領域に収まるよう高さが上限付きになり、長い質問はその場でスクロールし、その下の選択肢リストは残った高さをそのまま使うため、選択肢、送信行、最小化／閉じるボタンは画面に残ったまま操作できます。短い質問はそのままの表示で、カードは引き続き内容にぴったり収まります。
- **詳細オーバーレイの対処** — 現在のホストで閉じる操作が無効な全画面ツール詳細オーバーレイを狭い画面では描画しないため、チャットが塞がれません。
- **ストーム時でも安全なリアクティビティ** — ドロワー/メニューのオブザーバーと設定ポーラーは、ストリーミングメッセージの殺到に対して上限付きのレートで反応し、ホストに到達できない間はバックオフします。再接続中にレールが再マウントされてもドロワー状態を保ってバタつかせず、ドロワーを閉じるタップは無効になったトグルに当たるのではなく、再マウントを通して再試行します — 多数のセッションが同時にストリーミングしても、開いていても閉じていても、入力が凍り付いたり、サイドバーがクリック不能になるまで痙攣したりしなくなります。
- **サブエージェントカタログのガード** — ホストはサブエージェントカタログを、リクエストごとにセッションコーパス全体を列挙して提供し（長い履歴では約1秒）、そのクライアントは選択、チップホバー、メンバーシップイベントのたびに問い合わせます。プラグインはこのリフレッシュをラップします。ライブセッションリストに子のいない親には一切問い合わせず、同じ親への再問い合わせは最大でも2.5秒に1回とし、リフレッシュの開始は間隔を空けます — サブエージェントのファンアウトが、コーパス全体のスキャンでホストを飢えさせることがなくなります。
- **クリックで開くリネージチップ** — デスクトップでは、サブエージェントチップ（「N subagents」とサブエージェントタイトルスイッチャー）は現在のホストではホバーでのみ開き、クリックには反応しません。プラグインはチップ上のクリックを、ホストがすでに理解しているホバーイベントのペアに変換します。これによりクリックでツリーを開閉できるようになります（祖先のパンくずはクリックでのナビゲートを維持します）。
- **狭い画面のヘッダーコレクター** — 1024px 以下では、セッションヘッダーのチップ（リネージ、ジョブ、プリセット）は端末より幅が広く、ホバー専用です。それらは1つのピル（`≡ タイトル · N agents · M jobs`）に折りたたまれ、タップすると全幅のシートが開きます。そこにはセッションのリネージ（各祖先はタップ可能で、それぞれの子孫数を伴う）、ファミリールートを根とするサブエージェントツリー — 行はライブセッションリストから描画され、ブランチはガードされたリフレッシュを通して必要に応じてカタログを取得します — と、このセッションのバックグラウンドジョブが並びます。デスクトップでは何も変わりません。
- **セルフアップデート** — クライアントバンドルはリビジョン単位でイミュータブルに配信されるため、スマートフォンのタブは古いビルドを何日も動かし続けることがあります。ページは、起動時のリビジョンをサーバーが現在公開しているリビジョンと比較し、ページがアイドルになってから（下書きの入力中は決して）自分自身をリロードするか、タップ可能なバナーを表示します。
- **セッションリストの描画スロットル** — ホストはアタッチされた全セッションのプロジェクション変更ごとに全値フレームを送り、実行中サブエージェントのタイミングビューはコミット済みイベントごとに変化するため、忙しいバックグラウンド群は毎秒 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 プロファイルを開いてください。再起動行は 設定 → 全般 に、機能トグルは 設定 → プラグイン → 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 サーフェスを信頼します。localhost 以外に公開する前に、UI の他の部分を守っているのと同じゲート（リバースプロキシ認証、ループバック束縛）の背後に置いてください。

## コミュニティリンク

- [Linux.Do](https://linux.do) — 技術を共有し、語り合うコミュニティ。

## ライセンス

[Synthetic Source License（SySL）Version 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.
