dsh-plugin-better-mobile-ui
Better UI for DeepSeek Harness's web view on mobile.
davidgereb
@davidgereb
⬇ 1
★ 0
main
安装
dsh plugin --profile web add github:davidgereb/dsh-plugin-better-mobile-ui
需要可复现安装时,可在仓库后追加 #commit 固定提交。
Better UI for DeepSeek Harness's web view on mobile.
该插件未提供要点说明,请参考仓库 README。
deepseek-harnessdeepseek-harness-plugindeepseek-harness-pluginsdshdsh-plugindsh-plugins
- 安装并启动 DeepSeek Harness:
npx @deepseek-ai/dsh web - 在终端执行上面的安装命令(CLI 会解析插件并核验来源)
- 用 dsh plugins list 确认已安装,必要时重启 Harness 生效
插件以当前 dsh 进程的权限运行,安装时可能执行代码。请先通读仓库源码与许可证,确认无破坏性命令与越权访问;本站只做索引,不对第三方插件安全性作担保。
| 代码仓库 | github.com/davidgereb/dsh-plugin-better-mobile-ui |
| 许可证 | MIT |
| 主要语言 | main |
| 下载量 | 1 |
| GitHub 星标 | 0 |
| 最近推送 | 2026-08-15 |
| 收录日期 | 2026-09-19 |
| 分类 | 界面增强 |
事实信息来自公开插件目录快照(2026-10-03),介绍文案由本站再加工。
以下为插件仓库 README 全文(原始内容,由公开目录抓取整理)。
# dsh-plugin-better-mobile-ui
A **dsh web** client plugin that makes the GUI usable on phones/tablets
(viewport ≤ 768px by default). It only activates in the mobile media query —
desktop is byte-for-byte untouched.
## Install
### From GitHub
One block — installs the plugin and registers the loader row:
```sh
dsh plugin --profile web add github:davidgereb/dsh-plugin-better-mobile-ui
PATCH="${DSH_HOME:-$HOME/.dsh}/profiles/web/cordis.patch.yml"
grep -q "name: dsh-plugin-better-mobile-ui" "$PATCH" 2>/dev/null || cat >> "$PATCH" <<'EOF'
- insert:
- id: ui-better-mobile
name: dsh-plugin-better-mobile-ui
EOF
```
### From a local checkout
```sh
# 1. build
node scripts/build-client.js
# 2. make the package resolvable by the profile
dsh plugin --profile web link /path/to/dsh-plugin-better-mobile-ui
# 3. register the loader row in cordis.patch.yml (see above)
```
## What it fixes
1. **Sidebar → swipe drawer** — the sidebar grid track is forced to 0 on
mobile, so the collapsed 56px rail no longer eats screen space. The sidebar
becomes an off-canvas drawer:
* swipe **right** anywhere on the conversation (mid-screen works — Android
owns the screen edges) to slide it in;
* swipe **left** anywhere to go back (see the navigation stack below);
* the ☰ button in the top bar toggles it;
* the app's own layout store is kept in the "expanded" state on mobile, so
the drawer always shows the full sidebar (sessions, workspaces), never
the icon rail.
2. **Settings as drawer screens** (Android-settings style navigation stack).
The app's settings modal renders inside the sidebar column, so on mobile it
becomes two screens:
* tapping **Settings** in the drawer shows the section list (General,
Models, Plugins, …) filling the drawer, with a ← back arrow;
* selecting a section **expands the drawer to the full viewport** as the
settings page;
* the **X** dismisses back to the settings list; the **left-swipe** backs
are fully **drag-follow** like the sidebar — the drawer follows the
finger and snaps on release: settings page → settings list → sidebar →
hidden.
3. **Session header dropdown** — the header (session title + Chat/Trajectory
mode tabs) is hidden on mobile and becomes a **dropdown menu** under the
**⋯** button in the top bar (tabs stack vertically). Picking a tab or
crumb dismisses it; **action/utility buttons inside it (e.g. the
cost-lens cheapass toggle) stay usable** with the menu open. Tapping
outside or pressing Escape dismisses it too.
4. **Top action bar** — a 48px fixed bar shows the **session title** next to
a ☰ sidebar button, with the **⋯** menu button on the right. The background
is fully opaque; a gradient fades its bottom edge into the content. It
stays pinned while the mobile keyboard is open: `html/body` are locked
against document scrolling, the bar re-anchors to
`visualViewport.offsetTop`, and the app frame tracks
`visualViewport.height` (via `--bmu-vh`) so the **composer always rides
above the keyboard**. The override is cleared when the keyboard closes
(falling back to `100dvh`), and a slow re-sync interval plus
window/orientation listeners keep the frame from getting stuck raised if a
keyboard show/hide event is missed.
5. **Composer toolbar** — the model selector used to get crushed to zero width
while its label overlapped the "+" commands button. The toolbar now wraps,
the trailing group shrinks instead of overflowing, the token-context meter
is dropped on mobile, and the model name ellipsizes instead of colliding
with icons. **Plain Enter inserts a newline** (mobile only); submission
happens via the blue send button (modifier chords like Ctrl/Cmd+Enter keep
the app's accelerated behavior). **While the agent runs**, the primary
button becomes Stop, so an extra **send button** appears next to it —
tapping it queues the message via the app's own steering path without
stopping the run.
6. **Sidebar navigation** — opening a session (or New Session) closes the
drawer; expanding/collapsing a workspace or its action buttons keep it
open.
Swipes deliberately do **not** trigger on buttons/links/inputs, on transient
popups (menus/dialogs — the settings panel is a full-screen page, so it is
exempt), or on horizontally scrollable areas (wide tables, the attachment
rail). Swiping on the message box (composer) is allowed on purpose — it sits
at thumb height.
## Layout
```
dsh-plugin-better-mobile-ui/
├── package.json # dsh.client web plugin declaration
├── lib/
│ ├── index.js # host-side stub (empty apply; makes the loader entry real)
│ └── client.js # browser bundle (generated)
├── src/
│ └── client-source.js # single source of truth for the browser half
└── scripts/
└── build-client.js # generates lib/client.js
```
## How it works
* `dsh.client` in package.json; `exports["./client"]` is the ModuleLoader
bundle; the bundle's `inject` asks for the **`layout`** service so the
plugin can drive the app's sidebar state (`ctx.layout.toggleSidebar()`).
* The browser half injects one `
数据来源:公开的 DeepSeek Harness 插件目录与各插件 GitHub 仓库。本站为独立第三方目录,与 DeepSeek、幻方(High-Flyer)及插件作者均无隶属或背书关系。