DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
R

@local/dsh-remote-control

Remote Control

适合手机的远程控制页面:列出会话、查看正在运行的一轮、发送提示词、回答问题。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:Dynesshely/dsh-plugin-remote#db5106fe573a810f1d8c89683fd9a35437042909
README兼容性版本

兼容性与来源证明

Remote Control 以 @local/dsh-remote-control 发布,当前版本为 1.0.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
github
Registry 更新时间
2026/10/22

版本

1.0.0stable
2026/10/22

相关插件

正在加载相关插件…

最新版
1.0.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
any
许可证
AGPL-3.0-only
发布源
github
GitHub
★ 1
周下载
0
最近提交
2026/10/26
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 productivity-workflow 分类下经过校验的插件。

Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Experimental Schedule Bundle@deepseek-ai/dsh-experimental-schedule-bundle为 Web 组合添加 Schedule、其任务页面和时间上下文的可选捆绑包Client Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。Ab Ocrdsh-ab-ocr--- description: "外部 ocr 工具:逐页识别扫描的 PDF 或图像,仅在处理完最后一页后按顺序合并页面,并使用模型确定的标题级别保存为一个 Markdown 文档。" kind: "package-reference" ---

README

DeepSeek Remote — drive DeepSeek Harness from your phone

DeepSeek Remote

DeepSeek Remote is a plugin for DeepSeek Harness that serves the desktop app's conversation as a web page, so you can read answers, send prompts and manage sessions from a phone, a tablet or another machine on the same network. It talks to the Host it runs inside — no separate daemon, no cloud relay — and every request is gated by a token you own.

Features

  • The conversation, live. Transcript, streaming answers, reasoning chains, tool calls and grouped tool runs arrive over Server-Sent Events.
  • Prompts from anywhere. Markdown composer with live preview (CodeMirror 6) and image attachments.
  • Session management. Create, rename, pin, fork and archive — changes are mirrored both ways, so a pin made on the phone shows up on the desktop.
  • Model control. A picker with real brand marks, plus a catalogue browser showing context windows and available reasoning effort.
  • Balance and usage. One card fed either by an aggregated gateway endpoint or by per-vendor API keys.
  • Restart or quit DSH from the page, through an out-of-process helper that outlives the app.
  • Pictures that actually load. A same-origin image proxy resolves both real URLs and workspace paths, with click-to-zoom.
  • Built for a phone. Glass UI, prompt rail, lazy-rendered transcript, and scroll compensation so content that renders above the viewport never throws the reader off.
  • Token-gated, single process. One Host half with no build step, one static SPA, one shared secret.

Requirements

  • DeepSeek Harness desktop app — the plugin runs inside it and drives its Remotes.
  • Node.js 18+ — only to rebuild the SPA or run the test suites.
  • A phone, tablet or another computer on the same network, or a tunnel such as WireGuard or Tailscale.

Install

  1. Clone this repository and add it to your DSH profile as a bundle. cordis.patch.yml carries the ready profile line (bind, port, token).

  2. Start DSH. The Host log prints a URL you can open directly:

    http://127.0.0.1:19400/?k=<token>
    
  3. Open it on the device. ?k= is used once only — the page exchanges the token for an HttpOnly; SameSite=Strict cookie and cleans the address bar.

  4. The token is generated on first start and stored in ~/.dsh/remote-control/auth.json with 0600 permissions. Set token: in the config to pin your own instead.

Configuration

- id: remote-control
  name: '@local/dsh-remote-control'
  config:
    bind: '0.0.0.0'     # 127.0.0.1 keeps it local; 0.0.0.0 exposes it to the network
    port: 19400
    token: ''           # empty = generated once, then persisted

Exposing it

  • Tunnel (recommended). Keep bind: 127.0.0.1 and reach it through WireGuard, Tailscale or an SSH forward. Nothing is exposed, and the page still gets a secure context.
  • Direct LAN. Set bind: 0.0.0.0 and open http://<lan-ip>:19400/?k=<token>. Over plain HTTP on a non-loopback address the browser treats the page as an insecure context: installing it as an app, notifications and some clipboard APIs are unavailable. Terminate TLS in a reverse proxy if you need them.

Windows firewall

Direct LAN access also needs an inbound rule. The repository ships a script (needs administrator rights; it will raise a UAC prompt):

# allow inbound TCP 19400 for the Domain/Private profiles, local subnet only
pwsh -File plugins\remote-control\tools\firewall-remote-control.ps1

# remove the rule again
pwsh -File plugins\remote-control\tools\firewall-remote-control.ps1 -Remove

The rule is named DSH Remote Control (TCP <port>). It only opens the firewall — the listener still follows bind, so the rule exposes nothing while bind is 127.0.0.1.

How to Dev

Build the UI

The Host serves ui/dist, so the SPA has to be built before it is used:

pnpm --dir plugins/remote-control/ui install
pnpm --dir plugins/remote-control/ui run build   # emits ui/dist

Run the tests

Every suite is a standalone script; none of them needs DSH to be running. The integration suite boots the plugin in-process and drives it over real HTTP and SSE.

node plugins/remote-control/tools/test-remote-control.mjs      # Host: auth, routes, SSE, models, permissions, attachments, paging
node plugins/remote-control/tools/test-remote-ui-store.mjs     # transcript folding: tool groups, context notes, images
node plugins/remote-control/tools/test-remote-ui-questions.mjs # questions: argument/answer parsing, recommended flags
node plugins/remote-control/tools/test-remote-ui-rail.mjs      # prompt rail: ticks, active detection, geometry
node plugins/remote-control/tools/test-remote-ui-layout.mjs    # mobile detection: viewport vs overflow
node plugins/remote-control/tools/test-remote-ui-highlight.mjs # highlighting: language set, injection, Markdown pipeline

# read-only probe against a running instance
node plugins/remote-control/tools/smoke-remote-control.mjs http://127.0.0.1:19400 <sessionId>

Hot reload

  • Browser half. The SPA reloads like any Vite app; layout, styles and components need no restart.
  • host/hot.js and its siblings are imported with an mtime-derived query, so an edit takes effect on the next HTTP request — POST /api/__reload forces it.
  • index.js is part of the Loader's module generation: changes there need a DSH restart. Toggling the bundle only re-applies the cached module.

Project Structure

plugins/remote-control/
├── index.js               Host half: HTTP server, auth, routes, SSE, static files
├── host/
│   ├── hot.js             Hot-reloadable routes: session management, DSH control, presets
│   ├── usage.js           Balance and usage aggregation, gateway first
│   └── model-meta.js      Context windows, joined from the gateway's /v1/models
├── ui/                    Vue 3 + Vite SPA
│   ├── src/components/    Transcript, composer, sidebar, usage card, model browser …
│   ├── src/lib/           Store, Markdown pipeline, lazy rendering, API client
│   └── public/            App icons
├── locale/                UI strings (en, zh)
├── tools/                 Test suites, smoke probe, firewall and DSH control scripts
├── docs/poster.png        README hero image
├── page.html              Fallback page used when ui/dist is missing
└── package.json, cordis.patch.yml   Bundle manifest and profile line

HTTP API

Every route except / and /healthz requires the session cookie or Authorization: Bearer <token>.

RoutePurpose
GET /healthzUnauthenticated liveness check
POST /api/login, /api/logoutExchange the token for a cookie, and back
GET /api/stateSessions, workspaces, pending interactions, bind info
GET /api/stream?sessionId=SSE: hello, pending, sessions, frame, stream-error
GET /api/models, POST /api/select-modelModel catalogue and switching
GET /api/older?sessionId=&beforeSeq=One page of older history ({ records, hasMore })
GET /api/attachment?sessionId=&attachmentId=Image bytes from a session log
`GET /api/image?url=path=`
GET /api/usage, POST /api/usage/configBalance and usage, plus its configuration
GET /api/model-metaContext windows per model id
GET /api/dsh/info, POST /api/dsh/restart, /api/dsh/exitDescribe, restart or quit DSH
POST /api/send, /api/cancel, /api/answerSend a prompt, stop a turn, answer a question
GET /api/permissions, POST /api/permissionPermission presets and switching

Security

  • A 32-byte token gates every /api/* route; comparisons are constant-time, and both the session cookie and an Authorization: Bearer header are accepted.
  • Failed logins are rate-limited per peer (6 per minute); request bodies are capped; static-path traversal is rejected; the page runs under default-src 'none' with frame-ancestors 'none'.
  • Model output is sanitised with DOMPurify before it reaches the DOM — the page holds agent-control credentials, so no model text is trusted.
  • A token is equivalent to code execution on the machine that runs the agent. Do not share it, and put TLS or a tunnel in front of any non-loopback binding.

Limits, by design

  • Tool approvals cannot be confirmed remotely. Approval is a single-slot waterfall owned by the desktop answerer; hijacking it would leave the desktop panel waiting for an answer that never arrives. The page shows what is waiting and asks you to confirm on the desktop.
  • Switching permission presets needs a live session — a cold one is resumed first.
  • This is not a mirror of the desktop UI: no file tree, terminal, trace view or queue editing.

Star History

Star history chart

License

Released under the GNU Affero General Public License v3.0. In short: use it, change it, share it — but if you run a modified version as a network service, you have to offer its source to the people using it.