在 DSH 网页界面中实时查看 Agent 所在机器的桌面(含声音),经 DSH 自身登录转发。遇到验证码或扫码登录时可接管,支持剪贴板与文件传输,手机上也能用。需要同一台机器上 Cua 桌面镜像自带的 cua-spacesd。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:soffits/dsh-desktop-view
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
该插件的 README 只有英文版本。
Watch, live from the Web UI, the machine your DeepSeek Harness agent is running on: hear and see what it does, and step in whenever assistance is required (a QR-code login, a CAPTCHA, an unexpected dialog). While you hold control, two-way clipboard access plus file upload and download are available as well.
The desktop stream that cua-spacesd (Cua's in-guest daemon) generates, together with Cua's web viewer, is carried over DSH's existing auth and web server. Nothing extra is exposed: no port or subdomain is opened, and no daemon credential ever reaches the browser.
What you get
- A Desktop tab on the right sidebar, reachable either through the sidebar guide or via the monitor button in the session header.
- A full-screen page at
/desktop-view/, served from your DSH origin. It adapts to a phone screen, supports touch, and supports direct linking. Adding?control=1makes it open directly in control mode, letting an agent that needs help send you a link; an agent asking for help sends/desktop-view/?control=1&help=1&session=<its session id>, so that giving control back wakes it to carry on. - Watching is the default mode. You see and hear the desktop, while clicks, keystrokes, clipboard and files are refused. Picking "Take control" switches modes; "Give back" returns you to watching. Control likewise ends on its own after a stretch with no input, or when the view is closed. Merely hiding the Desktop tab (another sidebar tab, a collapsed sidebar, another session) keeps your control; the stream pauses until you look again.
- All the desktop viewer's features while you hold control: mouse, keyboard and touch input, an on-screen keyboard, clipboard syncing, drag-and-drop file uploads, file browsing and downloads, display selection, scaling, and the microphone wherever the desktop supports one.
- The agent is kept informed. For as long as you hold control, a small JSON file is written by the plugin; the agent ought to read it before acting on the desktop, and each control change notifies the session that opened the view.
Requirements
- DSH 0.2.2-rc.1 or later.
cua-spacesd0.12 or later on the same machine, with the DSH process able to reach the env token (on Cua's desktop image that means127.0.0.1:3211, the token being at/run/cua/env-token).- An up-to-date browser: Chrome, Edge, Firefox or Safari 17+. On mobile, both Safari for iOS and Chrome for Android are supported.
Installation
Directly from GitHub:
dsh plugin --profile web add github:soffits/dsh-desktop-view
Alternatively, add the bundle through the Web UI's plugin manager. Restart DSH afterwards.
Configuration
Every option appears as a field in the desktop-view plugin row.
| Setting | Default | Description |
|---|---|---|
endpoint |
http://127.0.0.1:3211 |
Address on which cua-spacesd listens. Leave it on loopback, as this address receives the env token. |
tokenFile |
/run/cua/env-token |
File containing the env token; it stays on the server at all times. |
maxFps |
30 |
Frame rate requested by the viewer. Reducing it lowers CPU and bandwidth use. |
clipboard |
true |
Clipboard syncing while you hold control. |
filesRoot |
~ |
Desktop folder you can browse, upload to and download from while you hold control. Leaving it empty disables file transfer. |
microphone |
true |
Permit sending your microphone to the desktop while you hold control, where the desktop supports it. |
idleSeconds |
120 |
After this many seconds with no input, control reverts to watching. |
stateFile |
/tmp/dsh-desktop-view/control.json |
Path at which the plugin writes the control state that the agent reads. |
notifyAgent |
wake |
Notify the session that opened the view whenever control changes: wake (returning control wakes the agent if it is running or sent the help link; otherwise the note waits), quiet (notes always wait for the agent's next step), off. |
What the agent can see
As an example, stateFile contains:
{
"controller": "user",
"since": "2026-11-08T12:00:00.000Z",
"sessionId": "01H…",
"updatedAt": "2026-11-08T12:00:04.120Z"
}
When the owner holds control, controller is "user"; otherwise it is null. In the null case, the file also records the most recent reason control ended (lastReason: released, idle, disconnected, replaced, stopped). Any script or skill that drives the desktop should check it first and yield whenever the value is not null.
When notifyAgent is on, the session that opened a view gets a short note each time someone takes control (queued; the agent is never woken for it) and each time control returns. The return note wakes the agent only when it has to carry on: it is still running, or the view came from its help link (help=1). Otherwise it waits quietly for the agent's next step, so no turn starts for nothing. In the chat the notes appear as a small "Desktop control" row.
Security
- All requests aimed at the plugin's paths pass through DSH's admission checks: the Host/Origin fence first, blocking cross-site and DNS-rebinding requests, then the browser's signed cookie, and no principal but the owner's is let in.
- The env token of cua-spacesd, along with the viewer tickets minted from it by the plugin, never leave the Host process. The browser keeps only short-lived relay tickets, which function through this relay together with your DSH sign-in, and only for as long as the view (and, for control, your control) persists.
- The server decides what the browser is allowed to do. Watching uses a view-only viewer ticket, so input, clipboard and files are refused by the daemon itself; beyond that, only the media messages and calls that the viewer requires in each mode are forwarded by the relay. Only one view holds control at a time, and control ends once that view disappears.
- The plugin's own pages go out with
no-store, no referrer, and a content security policy that is strict and same-origin.
Licensing
MIT. The desktop viewer displayed is Cua's web viewer, which your own cua-spacesd serves at runtime under Cua's FSL-1.1-MIT licence; the plugin here is independent of Cua and neither includes nor redistributes that viewer.
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-remote-web-ui★ 9959
手机/PC 远程操控 dsh web 工作区:扫码配对、令牌门控通道、SSE 实时同步,提供移动端与完整桌面 GUI 两种远程形态。
zhu1090093659/dsh-web#packages/dsh-ssh★ 9959
SSH 远程运维面板:Web 终端、SFTP 传输、本地端口转发与一条命令并发集群执行,Agent 与面板共用同一份主机配置。
liguobao/ds-harness-remote★ 1319
通过端到端加密通道远程访问 DeepSeek Harness 及兼容的编码工作区,支持自适应 Relay/WebRTC 传输、设备授权、工作区文件、只读预览、终端和可选的 Codex Remote。
saya-ch/dsh-mobile★ 728
通过 Android App 或手机浏览器访问 DeepSeek Harness,支持安全局域网连接、远程访问、持久设备配对和可自定义移动界面。
uumit-ai/dsh-uumit-remote★ 381
用 UUMit 账号在手机或其他电脑上打开这台电脑的 dsh web,不用自建服务器、不装其他程序:插件内置通道客户端连接 UUMit 托管的通道,侧栏里的面板负责配对和选择谁能用(仅自己、通过邀请链接或手机号授权的人、所有人),可随时撤销。需 dsh web 且 DSH >=0.2.1-rc.2。
ZSeven-W/dsh-ios★ 355
在对话里直接操作 iOS 模拟器或 USB 连接的 iPhone:22 个 Agent 工具用于启动、构建、按无障碍标识或 OCR 文本驱动 UI、列表行操作与 SwiftUI 预览热重载,并附带可点击拖拽的流式侧边栏面板。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。