dsh-vdesktop
Vdesktop
DSH plugin dsh-vdesktop
The plugin will be installed here. Keep web if you are unsure.
npx -y @deepseek-ai/dsh plugin --profile web add github:jafewff/dsh-vdesktop#5ea4840908d5be289d7dc8cf171906f1bf9aa0f5



dsh-vdesktop
DSH plugin dsh-vdesktop
The plugin will be installed here. Keep web if you are unsure.
npx -y @deepseek-ai/dsh plugin --profile web add github:jafewff/dsh-vdesktop#5ea4840908d5be289d7dc8cf171906f1bf9aa0f5



DSH plugin dsh-vdesktop
Vdesktop is published as dsh-vdesktop and currently resolves to version 0.2.0. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.
dsh-vdesktop 是 DSH(DeepSeek Harness) 的一个 cordis 插件:它在你本机上开一个用户看不见的 Win32 虚拟桌面(CreateDesktopW),把 GUI 应用跑进这个隔离桌面里,然后——
vdesk_* 工具,让 Agent 对虚拟桌面上的应用截图、点击、打字、读文本、存文件;面板截图(本机 Windows 10 1809 LTSC 实测,均为 DSH Web GUI 中的 VDesktopPanel):
| VDesktopPanel 面板 | |
|---|---|
| View image 面板总览:桌面切换、实时帧(1280×720)、底部「输入到虚拟桌面」直发通道 | View image 虚拟桌面里正在运行的浏览器(DeepSeek 官网),右上角橙色为叠加光标 |
| View image 画面细节可放大看清:桌面内浏览器的 DevTools 控制台 | View image 点任务栏打开的资源管理器窗口,光标叠加在客户区 |
dshv- 前缀的桌面在 DSH 启动时自动 sweep)。vdesk_* 工具):桌面生命周期、整桌截图、区域放大(1x–4x zoom)、鼠标(move/click/double/right/middle/drag/scroll)、键盘(type/press/hotkey,含中文与 emoji)、写文本、读文本、把窗口文本存成文件。frameServer(HTTP,127.0.0.1:8790 起自动探测到 8799),Web 面板通过它低频轮询 PNG 帧;光标位置经响应头(X-Cursor-X/Y)随帧下发,由面板叠加绘制。WM_NCHITTEST 判别后直接发 WM_CLOSE / SC_MINIMIZE / SC_MAXIMIZE|RESTORE(对记事本、资源管理器这类标准框直接生效);postmessage 客户区消息,走应用自己的处理逻辑;┌─────────────────────────────── DSH (cordis) 应用进程 ───────────────────────────────┐
│ 插件 dsh-vdesktop (lib/index.js) │
│ ├─ SidecarSupervisor ──JSON-RPC over stdio──▶ python -m dshv (sidecar 子进程) │
│ ├─ FrameServer (127.0.0.1:8790+) ◀──HTTP 抓帧/输入── DSH Web GUI (VDesktopPanel) │
│ └─ 12 个 vdesk_* 工具 + computerUse 注入(供 Agent 使用) │
└──────────────────────────────────────────────────────────────────────────────────────┘
│
python dshv (纯 ctypes,无第三方依赖)
│ CreateDesktopW / BitBlt / PostMessage
┌───────────────────▼───────────────────┐
│ 虚拟桌面 dshv-*(用户屏幕上看不到) │
│ notepad / explorer / 任意 GUI 应用 │
└───────────────────────────────────────┘
sidecar/dshv/):纯 Python ctypes 实现,虚拟桌面生命周期、GDI 抓帧、缩放、编码,以及输入链路(SendInput → PostMessage → SendMessage 逐级降级 + 光标自维护)。src/frameServer.ts):轻量 HTTP 服务,/vdesk/frame、/vdesk/desktops、/vdesk/input、/vdesk/launch、/vdesk/processes、/vdesk/activate、/vdesk/close_window 等路由,转发给 sidecar。| 组件 | 要求 |
|---|---|
| 操作系统 | Windows 10 / 11(1809 LTSC 实测) |
| 运行时 | Node.js LTS(构建与插件宿主) |
| Python | 3.11+(sidecar 纯 ctypes,无需 pip 安装任何依赖) |
| 宿主 | DSH(含 cordis 插件机制) |
克隆本仓库并构建(仓库已附带 lib/ 构建产物,仅当源码有改动时才需要重新构建):
git clone <本仓库地址> dsh-vdesktop
cd dsh-vdesktop
npm install
npm run build # esbuild → lib/(可选,lib/ 已入库)
在 DSH 的 web profile 中安装插件(以 C:\Users\<你>\.dsh\profiles\web 为例):
package.json 的 dependencies 里加一行指向本仓库的 link: 依赖;dsh-vdesktop 加入 dsh.profile.bundles;pnpm install(或 npm install)后重启 DSH。链接安装的写法示例:"dsh-vdesktop": "link:<本仓库绝对路径>"。
确认 sidecar 工作目录:插件以 python -m dshv --rpc stdio 拉起 sidecar,工作目录由 sidecarCwd 决定。仓库自带的 cordis.patch.yml 与 src/config.ts 中的默认值是作者的本地路径(D:\Project\dsh-virtaul-computer\sidecar),安装时请改成 <本仓库路径>\sidecar(绝对路径)。
安装后自检(DSH 重启、插件加载后,任选其一):
curl.exe -s http://127.0.0.1:8790/vdesk/desktops # 返回 {"desktops":[...]} 即数据面已就绪
curl.exe -s -o NUL -w "%{http_code}" "http://127.0.0.1:8790/vdesk/frame?desktop=dshv-e2e" # 200 即抓帧链路通
打开 DSH Web GUI,VDesktopPanel 面板出现桌面画面即全部就绪。
WM_NCHITTEST 非客户区拦截,自绘窗口走 postmessage);点任务栏按钮等价于激活 / 启动对应应用;X-Cursor-X/Y 响应头跟随),不是烧进帧里的。vdesk_*)| 工具 | 用途 |
|---|---|
vdesk_desktop_create | 创建虚拟桌面并启动一个 GUI 应用(返回桌面句柄 / PID / 顶层 HWND) |
vdesk_desktop_close | 关闭虚拟桌面并终止其上的进程 |
vdesk_desktop_list | 列出所有 dshv-* 虚拟桌面 |
vdesk_orphan_sweep | 清理孤儿虚拟桌面 |
vdesk_screenshot | 整桌截图落盘(jpg/png,可选质量) |
vdesk_zoom | 指定区域 1x–4x 放大截图 |
vdesk_click | 单点(left/right,客户区坐标) |
vdesk_mouse | move / click / double_click / right_click / middle_click / drag / scroll |
vdesk_keyboard | type / press / hotkey(支持中文、emoji 与组合键) |
vdesk_type | 向目标窗口写入整段文本 |
vdesk_read_text | 读取目标窗口文本(优先 Edit 子窗) |
vdesk_save_file | 把窗口文本保存到文件 |
SendInput 恒 ACCESS_DENIED(虚拟桌面非前台),因此客户区点击实际走 postmessage(客户区坐标);标准框标题栏按钮由 WM_NCHITTEST 判别后直接发窗口管理消息,两条路径都已在验收矩阵覆盖。/vdesk/launch 立即返回 pid(windowReady 恒为 false),目标窗口稍后才出现,请按 pid 匹配顶层窗口。taskbar/start 动作,完整开始菜单操作需要真实输入通道,暂未实现。http://127.0.0.1:3080(DSH Web GUI)。npm run build # TS 侧 esbuild → lib/
cd sidecar
python -m py_compile dshv\rpc_stdio.py # sidecar 语法自检
python -m dshv --help # CLI:--create-desktop / --attach-desktop / --sweep / --rpc stdio
gui-agent-plan 01–07b)、里程碑交接记录保留在作者本地工作区,未随仓库发布(仓库只含运行所需代码);scripts/patch-*.mjs、scripts/accept-*.mjs 等)保留在作者本地工作区,未随仓库发布;BitBlt + 缩放 + JPEG/PNG 编码),不依赖 GDI+ 或任何第三方 Python 包。├── src/ # TS 插件主体(supervisor / frameServer / 工具 / Web 面板)
│ ├── client/ # VDesktopPanel Web UI
│ ├── tools/ # 12 个 vdesk_* 工具定义
│ └── transport/ # JSON-RPC over stdio
├── lib/ # esbuild 构建产物(link: 安装免构建即用)
├── sidecar/
│ ├── pyproject.toml # dshv 包定义(Python 3.11+,纯 ctypes)
│ └── dshv/ # sidecar 产品包(win32 抓帧/输入/桌面生命周期)
├── scripts/build-ts.mjs # npm run build(tsc + esbuild → lib/)
├── screenshots/ # README 引用的面板截图
├── cordis.patch.yml # cordis 服务声明(安装时按本机路径修改 sidecarCwd)
├── package.json # 插件包 dsh-vdesktop
└── esbuild.config.mjs / tsconfig.json
MIT © dsh-vdesktop contributors
基于 DSH / cordis 插件机制构建。
dsh-vdesktop is a plugin for DSH (DeepSeek Harness / cordis) that runs GUI applications on an isolated, invisible Win32 virtual desktop (CreateDesktopW). An LLM agent drives those apps through 12 vdesk_* tools (screenshots, zoom, mouse, keyboard, text I/O, desktop lifecycle), while the DSH web GUI ships a VDesktopPanel so a human can watch the virtual desktop live and operate it with real mouse clicks — title-bar buttons, taskbar buttons and window management all behave like a normal desktop.
Stack: TypeScript plugin (src/, built to lib/) + a dependency-free pure-ctypes Python sidecar (sidecar/dshv/, JSON-RPC over stdio) + a built-in frame server (127.0.0.1:8790+). Windows 10/11, Node LTS, Python 3.11+. See the Chinese section above for installation and usage details.