deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:s17179XTY/dsh-mobile
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
dsh-mobile is a DeepSeek Harness (DSH) plugin that brings the official
phone-connect experience to any DSH web profile: a LAN pairing bridge, a
mobile-optimized DSH client for your phone, and a phone entry in the
settings row of the web GUI. It is a faithful port of the
dsh-desktop phone-connect
feature.
This plugin is built for DeepSeek Harness, not for any specific shell
app. It works in every deployment that runs a DSH web profile — plain
dsh web from the CLI, Bigfish, DSH Desktop-style desktop shells, or any
other wrapper. It contains no Bigfish- or DSH Desktop-specific code.
dsh-mobile 是面向 DeepSeek Harness 本体 的插件:任何运行 DSH web profile
的部署(命令行 dsh web、Bigfish、类 DSH Desktop 的桌面壳、或任何封装)都可以
安装使用,不绑定任何特定应用。
workspace.list,
session.list, session.history, session.create, session.prompt,
session.cancel), strict CSP headers.Phone ──HTTP──▶ lan-bridge.mjs (LAN, random port)
│ QR pairing / mobile client / allowlisted RPC
│ (RPC forwarded to the harness /api with the
│ client-request envelope)
▼
Harness web UI ──▶ /phone-connect/bridge (host plugin, same-origin)
│ bridge snapshot: port/status/connected/desktopUrl
▼
/desktop* loopback endpoints (CORS for the GUI origin)
| Piece | File | Role |
|---|---|---|
| Bridge | lan-bridge.mjs |
Standalone Node HTTP server on 0.0.0.0 (random port): pairing, mobile client, RPC forwarding, /desktop* JSON/QR endpoints with CORS. |
| Pages | pages.mjs |
Verbatim ports of dsh-desktop's mobile client and pairing pages (brand name parameterized). |
| Host plugin | lib/index.js |
Spawns/monitors the bridge (auto-restart, capped), exposes /phone-connect/bridge + /phone-connect/config. |
| Client plugin | lib/client.js |
__ModuleLoader__ bundle: settings-row phone entry (green dot), pairing dialog, copy/countdown/approve UI. |
Requires a DeepSeek Harness web profile (any deployment — the profile
mechanism is core DSH, so this works on plain dsh web, Bigfish, desktop
shells that mount a web profile, etc.).
dsh plugin --profile web add https://github.com/s17179XTY/dsh-mobile
# or via the DSH plugin market / dshmarket UI
Then restart the harness (or re-boot the profile) so the cordis.patch.yml
row mounts. The package depends on qrcode, installed automatically by the
profile's package manager.
"Shell" here means the app that hosts the harness around the web profile. The plugin integrates with the shell at two levels:
The plugin's browser half registers into the web profile's own slot system: the settings-row phone entry (with the connected-status dot) and the pairing dialog appear in any DSH web GUI automatically. A browser-only deployment needs nothing else.
For a desktop shell with its own chrome (e.g., a DSH Desktop-style Electron app), the shell can add a native entry — a "Connect Phone…" menu item or tray action — that opens the bridge's desktop pairing page:
GET /phone-connect/bridge,
including desktopUrl (http://127.0.0.1:<port>/desktop, loopback-only).Shell (native chrome) ──GET /phone-connect/bridge──▶ desktopUrl
│ │
└──── open http://127.0.0.1:<port>/desktop ◀───┘ (loopback-only page)
Yes. Every runtime piece the plugin needs is core DeepSeek Harness
capability available to any profile: the profile-plugin mechanism
(cordis.patch.yml + dsh plugin add), webServer route registration,
the subprocess service, the standalone LAN bridge, and the browser-side
slot system. Nothing in this plugin depends on a particular shell app.
The one thing a plugin cannot do from inside the harness is inject native
menu items into a desktop shell's own menu bar — that chrome belongs to the
shell's code (it is exactly how dsh-desktop ships its "Harness → Connect
Phone…" item natively). For that case the plugin provides the
desktopUrl hook above, and the shell wires a menu/tray item to it.
The pairing URL stays valid across dialog sessions for its full lifetime — only an expired token is rotated.
0.0.0.0 on a random port and rejects non-private
clients (10/8, 172.16/12, 192.168/16, ULA/link-local IPv6)./desktop* endpoints are loopback-only; CORS is granted only to the
harness GUI origin.dsh-mobile row from
cordis.patch.yml (or uninstall) when you do not need phone access.GET /phone-connect/bridge on the harness origin should return
{"status":"running", ..., "port": <n>}; the bridge's own
http://127.0.0.1:<port>/desktop/snapshot should return
{"running": true, ...}. The dialog accepts both liveness fields.error field of /phone-connect/bridge carries
the last exit reason and stderr tail.--locale zh|en and --app-name are passed to the bridge by the host; the
web UI posts its locale automatically to /phone-connect/config.webServer.port, so a changed GUI port
needs no configuration.npm install # dev deps (qrcode etc.)
npm run check # node --check on all sources
npm test # end-to-end bridge test (HARNESS_URL overrides the target)
The bridge can also be run standalone:
node lan-bridge.mjs --harness-url http://127.0.0.1:6730 \
--gui-origin http://127.0.0.1:6730 \
--locale zh --port 0
MIT — see LICENSE. The phone/mobile pages are ports of code from dataelement/dsh-desktop (MIT).
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。