dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
让 DeepSeek Harness 在老手机(Chrome 114 WebView)上可用:反向代理 + 热补丁通道 + DSH 插件。零 DSH 改动、免重装 APK,改文件刷新即生效。
让 DeepSeek Harness 在手机上真正可用。 一个反向代理 + 热补丁通道:不改 DSH 本体、不重装 APK,改一个文件刷新即生效。 Make DeepSeek Harness actually usable on a phone — a reverse proxy plus a hot-patch channel: no DSH modification, no APK reinstall, edit one file and refresh.
v0.2.2 · 作者 @yuxiaole_awa · 仓库
手机端界面修复版:弹窗底色、菜单文字、右侧边栏全屏、底部面板滚动;客户端界面支持中英双语。
安全上做过一轮 10 轮 CTF 攻防演练(9/10 → 10/10 全拦),见 docs/PENTEST.md。
DSH 的网页端是给桌面浏览器写的。放到手机上(视口只有 360×780、移动浏览器内核偏旧)会遇到一串具体问题:按键重叠、设置页被挤成竖排、点文件被第三方 App 抢走、底部用量被省略号截断、某些覆盖层没有关闭入口……
这个仓库把这些坑一条条堵上,做法是三层,你可以只用其中一层或两层:
DSH's web UI is built for desktop browsers. On a phone (360×780 viewport, older mobile engine) it hits a list of concrete problems: overlapping buttons, a settings page squeezed into vertical text, file taps hijacked by third-party apps, truncated usage numbers, overlay panels with no way to close…
This repo fixes them one by one, in three layers — use one, two, or all three:
┌──────────────────────── 手机 / Phone ─────────────────────────┐
│ Android 壳(android/)· Android shell │
│ WebView + 预装资源 · 原生桥(录音/打开方式)· 线路双模切换 │
└───────────────────────────┬───────────────────────────────────┘
│ http://<host>:19390
┌───────────────────────────▼───────────────────────────────────┐
│ 反向代理(proxy/)· reverse proxy(optional) │
│ 鉴权 · 文件 API /f /d /dl · API 缓存 · 热补丁注入 │
└───────────────────────────┬───────────────────────────────────┘
│ 127.0.0.1:19387
┌───────────────────────────▼───────────────────────────────────┐
│ DSH 本体 + DSH 插件(plugin/,dsh-mobile-kit) │
└───────────────────────────────────────────────────────────────┘你想要的 · You want · 需要哪几层 · Layers needed 手机能打开完整版、布局不挤 · open the full UI on a phone · 代理 +(或)插件 · proxy and/or plugin 点文件在应用内预览 + 语法高亮 · in-app file preview with highlighting · 代理 · proxy 苹果用户免装 APK · iPhone/iPad without any APK · 代理(浏览器直开)· proxy only 手机点麦克风能出字 · working voice input on the phone · 代理 + Android 壳 · proxy + Android shell 发大图不被吞 · large uploads not dropped · 代理(大 body 先收后转)· proxy
proxy/proxy.py,默认 0.0.0.0:19390):capability key 鉴权、Cookie 会话、文件 API、API 磁盘缓存、大 body 先收完再转发proxy/hotpatch/):按请求实时读取 CSS/JS 并注入页面,改文件刷新即生效(每个文件独立 IIFE + try/catch,坏一个不影响其它)?lang=en / ?lang=zh 强制plugin/,dsh-mobile-kit):dsh.bundle.patch + 客户端半,可单独使用标题栏(不再重叠)header, no overlap · “…”菜单(实心可读)menu, opaque · 文件预览 + 语法高亮preview & highlighting · ·
设置页(整屏)settings (full screen) · 右侧边栏(整屏)right sidebar (full screen) · 底部面板(可滚动)bottom panel (scrollable) · ·
轻量版 /mlite version · Android 壳启动页Android shell ·
截图取自实机/无头浏览器模拟(360×780),不含任何会话内容与服务器地址。
Captured on device / headless at 360×780, with no session content or server addresses.
# 1) 在装有 DSH 的电脑上起代理 · run the proxy on the DSH machine
python proxy/proxy.py
# 默认监听 0.0.0.0:19390,上游 127.0.0.1:19387
# listening on 0.0.0.0:19390, upstream 127.0.0.1:19387
# 2) 手机打开 · open on the phone
# 完整版 full: http://<PC-IP>:19390/?k=<cap.key>
# 轻量版 lite: http://<PC-IP>:19390/m
# 3) 体检 · health check
pwsh -File tools/healthcheck_mobile.ps1苹果用户 / iPhone · iPad:浏览器直接打开完整版链接 → 分享 → “添加到主屏幕”即可当 App 用,不需要 APK。详见 docs/USE-IOS.md。
挂成 DSH 插件 / mount as a DSH plugin(可选 · optional):
# profile 的 cordis.patch.yml · in the profile's cordis.patch.yml
- insert:
- id: mobile-kit
name: 'dsh-mobile-kit' # 或绝对路径 · or an absolute path验证 · verify:GET /mobile-kit/health → {"ok":true,"name":"mobile-kit",...}
能力 · Capability · 用法 · How · 解决什么 · Problem solved 消除按键重叠 · no overlapping buttons · 自动 · automatic · 标题栏 chip 与图标按钮曾画在同一位置(实测重叠 108px) 底部用量折叠 · collapse usage · 点 ⌄ / ⌃ · 状态行占地方,状态存 localStorage 长按展开 · long-press to expand · 长按用量条 / chip / 折叠的工具行 · 看完整数值、全称、展开内容 手势 · gestures · 用量条上滑=展开,下滑=收起 · 单手操作 覆盖层关闭 ✕ · overlay close · 整屏覆盖层出现时右上角自动挂 · 该覆盖层自身没有任何关闭控件 设置页/侧边栏整屏 · full-screen panels · 自动 · automatic · 原本被挤成竖排(内容列只剩 124px)/ 停在屏幕外(x=416) 代码高亮 · syntax highlighting · 点代码文件 · 预览自带高亮,零外部依赖 面板可滚动 · scrollable panels · 自动 · automatic · 内层 overflow-y:hidden 导致手指滑不动
开关 · kill switches:?no-hot=1 关全部热补丁 · ?no-uiux=1 只关交互层 · ?no-chipview=1 只关文件 chip 拦截
手机端交互层(折叠按钮、文件预览、覆盖层关闭等)自动跟随 DSH 的语言(读 `); 也可以强制:地址后加 ?lang=en 或 ?lang=zh`(选择会被记住)。
The injected UI (collapse button, file preview, overlay close, …) follows DSH's language by reading `; you can also force it with ?lang=en / ?lang=zh` (remembered).
实测(无头浏览器,360×780)· measured headless at 360×780:
项 · Item · 实测 · Result 连点 10 次控件 · 10 rapid taps · 0 长任务,单次约 4ms(瓶颈在网络往返) 静置 12 秒 · 12s idle · 0 长任务 目录接口缓存 · catalog API cache · listBundles 86KB / pluginInventory 88KB / listPlugins 70KB 命中本地缓存 渲染 · rendering · content-visibility:auto + 大面板去模糊 + 过渡 0.08s 自身定时器 · own timers · 1.5s → 4s,页面隐藏时不做 DOM 扫描 75 秒 25 次操作 · 25 ops / 75s · 堆 +14.5MB(含未回收垃圾),注入元素恒为 1 个(不累积)
⚠️ 单密钥鉴权:拿到 capability key 就等于拿到电脑上的命令执行权(DSH 的 agent 工具能读写文件、执行命令)。
不要部署到公网,只在可信局域网 / Tailscale 内使用。
Single capability key only: whoever holds the key can run commands on the machine through
DSH's agent tools. Do not expose it to the public internet — keep it on a trusted LAN or inside Tailscale.
项 · Item · 做法 · What we do 凭据 · credentials · key 不入库、不入日志(历史明文已脱敏);仓库内地址全部占位符 文件权限 · file ACL · 代理目录(含 cap.key)断开继承,只留 SYSTEM/Administrators/当前用户 客户端内存 · client memory · 错误数组上限 30/60 条,防长跑增长 CI · 每次 push 扫描密钥与真实地址(.github/workflows/secret-scan.yml) 发布物 · artifacts · Release 的 APK 由 CI 从脱敏源码构建,并逐个审计(无 key、无地址、无个人信息)
10 轮 CTF 攻防演练(从另一台主机、外部视角、非破坏性)· 10-round CTF from an external host:
轮 · 攻击 · Attack · 结果 · Result R1–R5 · 无密钥读文件 / 带密钥目录穿越 / 热补丁通道读取与写入 / 目录列举 · ✅ 全拦 · blocked R6 · 缓存越权(密钥预热后用无密钥请求同一路径) · ✅ 403(鉴权在缓存查找之前) R7–R8 · 日志泄露 / 外部连重启通道 19395 · ✅ 无路由、不可达 R9 · SMB 445 对局域网暴露(主机自身,非本项目) · ⚠️ 第 1/2 轮落败 → 修复后 ✅ R10 · 无密钥调用 /api/*(RCE 前置) · ✅ 全 403
第 1/2 轮 9/10,修复后第 3 轮 10/10。完整记录 · full record:docs/PENTEST.md
establish/
├─ proxy/ 反向代理 · reverse proxy
│ ├─ proxy.py 鉴权 / 文件 API / API 缓存 / 热补丁注入
│ ├─ forward_watch.py 看门狗(无窗口自动拉起)
│ ├─ mobile.html 轻量版页面(路由 /m)
│ └─ hotpatch/ 热补丁(按文件名顺序拼接注入)
│ ├─ 05-i18n.js 中英双语(跟随 <html lang> / ?lang=)
│ ├─ 00-base.css 布局 + 交互层样式 + 性能加固
│ ├─ 10-base.js 原生桥补全
│ ├─ 45-chipview.js 文件 chip 点击 → 自建预览层
│ ├─ 50-fileview.js 预览层(图片 / PDF / 代码高亮)
│ ├─ 60-autocollapse.js / 70-voiceselfheal.js
│ └─ 90-uiux.js 折叠按钮 / 长按 / 手势 / 覆盖层 ✕
├─ plugin/ DSH 插件 dsh-mobile-kit(package.json + cordis.patch.yml + index.js + client.js)
├─ android/ Android 壳源码(离线构建,不需要 Gradle)
├─ appassets/ 离线预装资源(打进 APK 的 assets/bundle/)
├─ docs/ 文档(架构 / 安装 / 插件 / 安全 / 攻防 / 发布 / iOS)
├─ docs/screenshots/ 实机截图
└─ tools/ 体检 / 协议验收 / 安全审计 / 10 轮 CTF / 性能与内存探针python tools/ctf_10_rounds.py # 10 轮夺旗(自动种旗 → 攻击 → 记分 → 清理)
python tools/pentest_proxy.py # 代理攻击面自查
python tools/security_audit.py # 密钥/地址泄露 + 缓存与内存
pwsh -File tools/healthcheck_mobile.ps1 # 体检本版回归 · this release:交互层 16/16 PASS、设置页 6/6 PASS、CTF 10/10 全拦、体检 HEALTHY
装 APK 提示签名不符? CI 每次用新生成的 debug keystore 签名 → 先卸载再装;或把自己的 keystore 配成 Secrets(docs/PUBLISH.md 第八节)。 *APK signature mismatch?* CI signs with a freshly generated debug keystore — uninstall first, or provide your own keystore via Secrets.
改插件代码后不生效? 宿主半(index.js)改动需重启 DSH;客户端半(client.js)刷新页面即生效。 *Plugin changes not applied?* The host half needs a DSH restart; the client half applies on refresh.
手机上打不开? 先访问 http://:19390/__health(免密钥)应返回 proxy-ok;再确认用的是带 ?k= 的完整链接。 *Can't open on the phone?* Check /__health first, then make sure you used the full ?k= link.
appassets/ 变更需重新生成并提交 · regenerate and commit appassets/ when the preload changesSETUP · ARCHITECTURE · PLUGIN · SECURITY · PENTEST · PUBLISH · USE-IOS · PLUGIN-COMPAT
MIT © 2026 yuxiaole_awa · 见 LICENSE
本仓库不含任何凭据:访问密钥、服务令牌、私钥都是运行时文件,已被 .gitignore 排除;android/里的DEFAULT_HOST/DEFAULT_KEY是占位符,首次启动请在 App 里填自己的地址与密钥。
*No credentials are committed*: keys and tokens are runtime files excluded by .gitignore; thedefaults in android/ are placeholders — enter your own host and key in the app on first launch.