🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Windows 桌面操控 gxpppp/dsh-computer-use

DeepSeek Harness
gxpppp35 天前有提交已提供中文文档扫描:含敏感能力

用可访问性树操控 Windows 窗口与输入

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add gxpppp/dsh-computer-use
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · ui
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/1) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 30 处,展示前 28 条)
  • 读取本地文件
    lib/index.js:129
    if (!existsSync(root)) return void 0;
  • 读取本地文件
    lib/index.js:133
    if (!existsSync(candidate)) continue;
  • 读取本地文件
    lib/index.js:136
    mtime = statSync(candidate).mtimeMs;
  • 读取本地文件
    lib/index.js:146
    return readdirSync(root, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name);
  • 读取本地文件
    lib/index.js:310
    if (!existsSync(helperPath)) {
  • 执行外部命令来自配置/变量
    lib/index.js:321
    child = spawn(helperPath, ["--parent-pid", String(process.pid)], {
  • 执行外部命令固定命令
    lib/index.js:678
    const child = spawn2(
  • 读取本地文件
    lib/index.js:778
    const helperFound = helperPath !== "" && existsSync2(helperPath);
  • 删除本地文件递归
    lib/index.js:1016
    await rm(dir, { recursive: true, force: true }).catch(() => void 0);
  • 执行外部命令固定命令
    lib/index.js:1044
    const child = spawn3(
  • 写入本地文件
    lib/index.js:1424
    await writeFile(textPath, text, "utf8");
  • 删除本地文件递归
    lib/index.js:1434
    await rm2(dir, { recursive: true, force: true }).catch(() => void 0);
  • 执行外部命令固定命令
    lib/index.js:1449
    const child = spawn4(
  • 发起网络请求
    lib/index.js:2072
    const outcome = await approval.request({
  • 读取本地文件
    src/capture/printwindow.ts:67
    data = new Uint8Array(await readFile(outPath))
  • 删除本地文件递归
    src/capture/printwindow.ts:97
    await rm(dir, { recursive: true, force: true }).catch(() => undefined)
  • 执行外部命令固定命令
    src/capture/printwindow.ts:145
    const child = spawn(
  • 执行外部命令固定命令
    src/desktop/session.ts:130
    const child = spawn(
  • 发起网络请求
    src/index.ts:81
    const outcome = await approval.request({
  • 写入本地文件
    src/input/clipboard.ts:39
    await writeFile(textPath, text, 'utf8')
  • 删除本地文件递归
    src/input/clipboard.ts:49
    await rm(dir, { recursive: true, force: true }).catch(() => undefined)
  • 执行外部命令固定命令
    src/input/clipboard.ts:67
    const child = spawn(
  • 读取本地文件
    src/transport/helper.ts:64
    if (!existsSync(root)) return undefined
  • 读取本地文件
    src/transport/helper.ts:68
    if (!existsSync(candidate)) continue
  • 读取本地文件
    src/transport/helper.ts:71
    mtime = statSync(candidate).mtimeMs
  • 读取本地文件
    src/transport/helper.ts:82
    return readdirSync(root, { withFileTypes: true })
  • 读取本地文件
    src/transport/helper.ts:333
    if (!existsSync(helperPath)) {
  • 执行外部命令来自配置/变量
    src/transport/helper.ts:345
    child = spawn(helperPath, ['--parent-pid', String(process.pid)], {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-attachment@deepseek-ai/dsh-llm@deepseek-ai/dsh-settings@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh-user-approval@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 操控Windows窗口
  • 模拟键盘鼠标输入
  • 基于可访问性树

README

由 DeepSeek 最新模型翻译生成
dsh-computer-use 把 Codex 的 Windows Computer Use 能力接进 DeepSeek Harness 的插件。 它不做像素级识别:用 UI Automation 可访问性树「看」窗口,用 SendInput 输入注入「动」窗口。 底层复用本机已安装的 Codex 原生助手 codex-computer-use.exe,不重新实现一遍 Win32 交互。 目录:和 Codex 原版的关系 · 依赖 · 能力矩阵 · 六个工具 · 授权模型 · 配置项 · 架构 · 安装 · 开发 · 故障排查 它和 Codex 原版的关系 | 维度 | Codex 原版 | 本插件 | | 模型接口 | node_repl 持久 JS 会话 + @oai/sky | 6 个扁平 DSH 工具 | | 传输 | stdio / 命名管道 JSON-RPC | 同一套 stdio JSON-RPC(4 字节长度前缀在管道模式下,stdio 模式按 \n 分帧) | | 原生层 | codex-computer-use.exe | 同一个 exe,直接复用 | | 审批 | MCP elicitation | DSH approval.request() |
展开完整文档(README 剩余 1 节)
dsh-computer-use

把 Codex 的 Windows Computer Use 能力接进 DeepSeek Harness 的插件。

它不做像素级识别:用 UI Automation 可访问性树「看」窗口,用 SendInput 输入注入「动」窗口。
底层复用本机已安装的 Codex 原生助手 codex-computer-use.exe,不重新实现一遍 Win32 交互。

目录:和 Codex 原版的关系 · 依赖 · 能力矩阵 · 六个工具 · 授权模型 · 配置项 · 架构 · 安装 · 开发 · 故障排查

它和 Codex 原版的关系

| 维度 | Codex 原版 | 本插件 |
| 模型接口 | node_repl 持久 JS 会话 + @oai/sky | 6 个扁平 DSH 工具 |
| 传输 | stdio / 命名管道 JSON-RPC | 同一套 stdio JSON-RPC(4 字节长度前缀在管道模式下,stdio 模式按 \n 分帧) |
| 原生层 | codex-computer-use.exe | 同一个 exe,直接复用 |
| 审批 | MCP elicitation | DSH approval.request() |
| 提示词 | SKILL.md + guidance/api/confirmations | 同一结构,改写为 DSH 工具形态 |

去掉了 JS 中转层,因为 DSH 的工具调用本身就很轻,扁平工具的 token 成本低于"写 JS 调 API"。

依赖

必须本机已安装 Codex 桌面版(helper 与 codex.exe 由它提供)。
插件会自动在以下位置探测,也支持在设置里手写路径:

- helper:%LOCALAPPDATA%\OpenAI\Codex\runtimes\cua_node\\bin\node_modules\@oai\sky\bin\windows\codex-computer-use.exe
- codex:%LOCALAPPDATA%\OpenAI\Codex\bin\\codex.exe

helper 需要 CODEX_CLI_PATH 指向 codex.exe,否则报 failed to launch codex app-server: program not found。
插件默认自动注入这两个环境变量。

能力矩阵

| 能力 | Windows 11 (build ≥ 22000) | Windows 10 | 说明 |
| 应用/窗口枚举 | ✅ | ✅ | 只读,不需授权 |
| 可访问性树 + 元素索引 | ✅ | ✅ | 桌面自动化的主力路径 |
| 输入注入(点击/输入/按键/滚动/拖拽) | ✅ | ✅ | SendInput |
| 剪贴板粘贴(中文/长文本) | ✅ | ✅ | 写剪贴板 + Ctrl+V,走应用自己的粘贴路径 |
| 截图 | ✅ 原生 WGC | ✅ PrintWindow 兜底 | Win10 上约 1–3 秒一张,且读不到硬件加速窗口 |
| 窗口故障自愈 | ✅ | ✅ | 最小化 / 几何变化 / 句柄失效就地恢复并重试一次 |
| 等待原语 | ✅ | ✅ | 等文本出现/消失或窗口关闭,替代手写轮询 |
| 桌面锁定探测 | ✅ | ✅ | 锁屏时主动报告并解释连带失败,避免模型逐个误判 |
| 浏览器窗口自动化 | ❌ | ❌ | helper 需要判定当前 URL 才能执行策略;独立运行环境不提供该通道,会主动拒绝 |
| 终端类应用 | ❌ | ❌ | 提示词与原生层双重禁止 |

六个工具

| 工具 | 作用 | 首次触碰某应用需授权 |
| computer_use_status | 自检(helper 定位、进程、截图能力、已授权应用、免审批白名单);action="reset" 清授权并重启 helper | 否 |
| computer_use_apps | 枚举应用或窗口(只读) | 否 |
| computer_use_state | 取窗口快照:可访问性树(含索引与焦点)、截图,或两者 | 是 |
| computer_use_act | 执行一个动作(含 paste_text),默认自动刷新并回传新状态 | 是 |
| computer_use_wait | 等界面就绪:文本出现/消失、窗口关闭 | 是 |
| computer_use_launch | 启动应用并轮询等待窗口出现 | 是 |

完整参数见 docs/api.md;工作流纪律见 docs/guidance.md;确认策略见 docs/confirmations.md;面向模型侧的精简版在 SKILL.md。

授权模型

每个应用在被操作之前,都要先拿到一张票。 拿不到就报未授权 Computer Use 使用「应用名」——而且一次都不会真正碰到那个窗口。

票只有两个来源,按这个顺序检查:

| 顺序 | 来源 | 判定条件 |
| 1 | 免审批白名单 | 应用名命中 alwaysAllowedAppIds(归一化后比较) |
| 2 | 审批弹窗 | 走 DSH approval.request(),必须返回 allowed-once |

票缓存在 helper 进程的内存里,DSH 或 helper 重启即失效。

alwaysAllowedAppIds 的匹配规则

比较前会把两边都归一化成小写、去扩展名、去路径、去 process: 前缀的叶子名:

| 你写的 | helper 上报的 | 归一化后 | 是否命中 |
| msedge.exe | MSEdge | msedge / msedge | ✅ |
| msedge | process:C:\...\msedge.exe | msedge / msedge | ✅ |
| 画图 | mspaint.exe | 画图 / mspaint | ❌ |

写 exe 名的命中率最高;中文显示名只有在 helper 上报的恰好就是该中文名时才匹配。

配置写在哪

cordis.patch.yml —— profile 的 loader patch 层
- id: computer-use
disabled: false
config:
alwaysAllowedAppIds:
- mspaint.exe
- msedge.exe

这条路别指望 GUI 设置页。 插件用 settings.installSection() 注册配置项,而部分 DSH 版本只提供旧的 register(),从设置面板写进去的值不会落地到插件读的配置对象上。把白名单固定在 loader patch 层最稳;改完重启 DSH 生效。

拿不到票时按这个顺序排查

1. computer_use_status 的「免审批白名单」一行,确认目标应用确实在里面;
2. 审批弹窗那条路要求当前会话的 approval 策略是 ask。策略为 never 时审批请求会被直接判定为拒绝,弹窗根本不会出现——这不是插件故障,是策略本身的行为;
3. 两条路都走不通时,用 computer_use_status 的 action="reset" 清空已授权集合再重试。

配置项

| 键 | 默认 | 说明 |
| enabled | true | 总开关 |
| helperPath | '' | 空 = 自动探测 |
| codexCliPath | '' | 空 = 自动探测 |
| codexHome | '' | 空 = %USERPROFILE%\.codex |
| requestTimeoutMs | 15000 | 单次 RPC 超时 |
| launchTimeoutMs | 25000 | launch_app 专用超时 |
| alwaysAllowedAppIds | [] | 免审批白名单;写法与匹配规则见授权模型 |
| autoRefreshAfterAction | true | 动作后自动刷新状态 |
| maxTreeChars | 12000 | 回传的树字符上限 |
| allowScreenshots | true | 是否允许截图请求;Win10 上建议设 false(PrintWindow 每张 1–3 秒,且读不到硬件加速窗口) |
| idleShutdownMs | 300000 | helper 空闲回收时间,0 = 常驻 |

架构

DSH 工具层(6 个工具) │ 参数校验、树截断、截图发布为附件、错误中文化 ▼ ComputerUseHelper(src/transport/helper.ts) │ · 惰性 spawn codex-computer-use.exe(带 --parent-pid) │ · stdio JSON-RPC,按 \n 分帧 │ · 审批闭环:approvalRequest → DSH approval → 带 x-oai-cua-approved-app 重试 │ · 崩溃自愈、空闲回收、超时管理 ▼ codex-computer-use.exe(Rust 原生助手) │ SendInput + UI Automation + Windows.Graphics.Capture

安装

前置条件:Node ^22.19.0 || >=24.0.0(见 package.json 的 engines)。

从 git 安装(开箱即用):

{
"dependencies": {
"dsh-computer-use": "github:gxpppp/dsh-computer-use"
},
"dsh": {
"profile": {
"bundles": [
// …其它 bundle "dsh-computer-use" ] } } }

仓库自带预构建的 lib/index.js,装完直接可用,不需要任何构建步骤。

这一点是刻意的:DSH 从 git 安装插件时只加载 lib/index.js,不会执行构建。
仓库里没有它,插件就会以 failed to import 启动失败。

本地开发(link 模式):

{
"dependencies": {
"dsh-computer-use": "link:/dsh-computer-use"
},
"dsh": {
"profile": {
"bundles": [
// …其它 bundle "dsh-computer-use" ] } } }

改完重启 DSH。cordis.patch.yml 会把插件行插进配置。

开发

npm run build # esbuild 打包 src/index.ts → lib/index.js
npm run smoke # 真实驱动 helper 的冒烟测试(只读,不点击不输入)

另有两个直接 node 跑的脚本,没有挂进 npm run:

node scripts/load-check.mjs # 加载验证:用 mock context 跑一遍 apply(),确认工具注册与注入路径
node scripts/smoke-capture.mjs # 离线冒烟:截图兜底、剪贴板写入、桌面会话探测(不依赖 DSH)

npm run smoke 覆盖:路径探测、进程启动、JSON-RPC 往返、审批闭环(含 fail-closed 与缓存命中)、进程回收。
load-check 适合在改 profile 配置之前先跑一次——它完全不触碰桌面。

故障排查

先跑 computer_use_status:

- 桌面会话:已锁定 → 这是最容易被误判的一条。锁屏会让激活窗口、剪贴板、输入注入同时失灵,而截图照常可用,症状看起来像一堆互不相关的故障。锁定时请先解锁桌面,换法子重试没有任何意义。
- helper 未找到 → Codex 未安装,或把 helperPath 设成实际路径。
- codex.exe 未找到 → 同上,设 codexCliPath。
- 提示 failed to activate captured window → 优先怀疑桌面锁定;解锁后若仍失败,多半是目标窗口被别的进程占着前台。
- 提示 could not determine the current browser URL → 目标是浏览器。这是策略边界,不是 bug;浏览器任务改用专门通道或让用户手动完成。
- 提示 SetIsBorderRequired failed → 只会出现在强制指定 helper 截图后端时; Win10 默认已改走本地 PrintWindow。
- 截图报「几乎全黑」 → 该窗口使用硬件加速渲染,PrintWindow 读不到;改用可访问性树。
- 报 未授权 Computer Use 使用「X」、或每次操作都要重新确认 → 该应用没拿到授权票,处理办法见授权模型。

为什么锁屏要单独识别

锁屏时三类 API 会同时变脸,而它们的报错各说各话:

| API | 锁屏时的表现 |
| SetForegroundWindow | 被拒 → failed to activate captured window |
| 剪贴板 | 被系统独占 → ExternalException / Access is denied |
| 输入注入 | 没有焦点可送 → 操作"成功"但界面纹丝不动 |
| PrintWindow | 照常可用(不需要前台),所以最容易被当成"一切正常"的证据 |

插件因此把桌面锁定做成显式探测:computer_use_status 直接报告,输入类动作失败时也会补一次探测并把真正原因写进错误里。

许可

MIT,见 LICENSE。

配套文件:SKILL.md(模型侧精简说明)、docs/api.md(完整参数)、 docs/guidance.md(工作流纪律)、docs/confirmations.md(确认策略)。
预览分享卡片长什么样 ↓gxpppp/dsh-computer-use
分享 · DeepSeek Harness Hub
gxpppp/dsh-computer-use

用可访问性树操控 Windows 窗口与输入

这是你的仓库?认领条目

回到顶部