mcpField
N
NexusWindows for Codex

NexusWindows for Codex

本地服务
julienpiron.fr生产力31 天前更新

关于 NexusWindows for Codex

NexusWindows for Codex 是用于操作 Windows 桌面应用的 MCP 服务和 Codex skill,可让用户继续使用前台窗口。它会读取应用状态,并优先采用后台 UI 技术,再以实体输入作为后备。

主要功能

  1. 01枚举窗口并检查 UI Automation
  2. 02捕获被遮挡的窗口
  3. 03通过 Win32 和 UI Automation 后台操作
  4. 04用明确后置条件验证操作
  5. 05将实体输入作为后备

适用场景

  1. 01操作应用时不切换前台窗口
  2. 02操作前检查被遮挡的窗口
  3. 03执行经过验证的桌面操作序列

MCP 相关

MCP 服务提供列出、检查、启动、操作和关闭 Windows 应用窗口的工具。每项操作都会根据应用状态进行检查;实体鼠标和键盘输入仅作为后备。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"pironjulien-nexus-windows-codex": {
"command": "npx",
"args": [
"-y",
"nexus-windows-codex"
]
}
}
}
启动命令npx -y nexus-windows-codex

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmnexus-windows-codex3.7.4

工具

5

收录的工具列表 · 更新于 1 天前

参数类型必填说明
filterstring否

详细介绍

面向 Codex 的 NexusWindows

发布 测试 OpenSSF 评分卡 许可证:MIT npm Node 22+ .NET 8 Windows 10/11

NexusWindows:面向 AI Agent 的后台 Windows 电脑操作。适用于 Claude、Codex 和 Antigravity。

面向 Codex 的后台 Windows 电脑操作。 一个 MCP 服务(nexus-windows-codex,只需一条 npx 命令),让 OpenAI Codex 能查看并操作 Windows 桌面应用,同时用户仍可使用鼠标、键盘和前台窗口。Codex 自带的 Computer Use 功能最先登陆 macOS;在 Windows 上,OpenAI 的文档指出,运行期间应让目标应用保持在活动桌面上并可见(Codex 文档)。NexusWindows for Codex 自带本地 .NET 辅助程序来处理所有操作:窗口清单、UI Automation 树、对被遮挡窗口进行 PrintWindow 捕获、不切换焦点的 Win32 消息和 UI Automation 模式,以及作为最后手段的真实鼠标和键盘操作,并由共享的前台令牌控制。每项操作都会根据应用程序的真实状态进行判断,每个批处理步骤都必须明确指定后置条件。它还提供 Codex 技能,可通过 @oai/sky 在 Codex 的 Computer Use API 上使用同一会话。

版本 3.0.1 · Windows 10/11 · Node 22+ · .NET 8 · MIT 许可证

Nexus 系列的一员:NexusWindows (Claude · Codex · Antigravity)、 NexusBrowser(代码仓库)、 NexusAndroid(代码仓库)。 项目主页:julienpiron.fr/nexuswindows。

为什么

Codex 内置的 Computer Use 使用物理鼠标和键盘操作:它会将目标窗口置于最前方,用户必须在它操作期间停止工作。许多 Windows 应用可以在后台操作。NexusWindows for Codex 会优先尝试后台操作技术,根据应用程序的真实状态判断结果,只有在用户暂停输入后,才会将辅助程序的真实鼠标和键盘操作作为后备方案,并由 PC 上其他 Agent 共用的令牌控制。

这是一个 MCP 服务(Node,无 npm 依赖),带有自包含的 .NET 辅助程序:不监听网络端口、不需要令牌,也不使用私有 Electron API。可选的 Codex 技能则通过 Codex 的 Computer Use API,在 Codex 的 Node REPL 中运行同一会话。

NexusWindows 系列

三个 MCP 服务,分别面向一个 Agent,单独构建,因为每个模型都需要为其量身定制工具;它们有着相同的承诺:用户可以继续使用鼠标、键盘和前台窗口,并且每项操作都会读回验证。

ClaudeCodexAntigravity
安装uvx --python 3.14 nexus-windows-claudenpx -y nexus-windows-codexuvx --python 3.14 nexus-windows-antigravity
软件包PyPInpmPyPI
工具windows look act launch window,以及 notifications 和 logswindows look act launch windowwindows look act launch window
仓库NexusWindows-ClaudeNexusWindows-CodexNexusWindows-Antigravity

每个步骤都会报告 ✓ 已验证、= 已完成、~ 未知(不会重放)或 ✗ 失败或已拒绝。三个服务共用防护策略、前台令牌、紧急停止快捷键(Ctrl+Alt+Shift+Esc)、通用日志格式和通用基准测试。

安装

要求:Windows 10 或 11,以及 Node 22+。npm 软件包内含独立辅助程序:无需安装 .NET。

从 npm 安装,在 Codex 的 ~/.codex/config.toml 中添加:

[mcp_servers.nexus-windows]
command = "cmd"
args = ["/c", "npx", "-y", "nexus-windows-codex"]

在 Windows 上,npx 是一个 .cmd 脚本,因此需要使用 cmd /c。同一命令也适用于任何 MCP 客户端 ("command": "cmd", "args": ["/c", "npx", "-y", "nexus-windows-codex"])。

Codex 技能(替代方案,从克隆仓库安装)

此技能会在 Codex 的 Node REPL 中运行同一会话,也可以回退到使用 Codex 的 Computer Use API。需要安装 Codex 桌面应用、其 Computer Use 插件和 .NET 8 SDK:

git clone https://github.com/pironjulien/NexusWindows-Codex.git
cd NexusWindows-Codex
pwsh -NoProfile -File install.ps1             # build the helper, install the skill into %USERPROFILE%\.codex\skills\nexus-windows
pwsh -NoProfile -File install.ps1 -CheckOnly  # verify the installation matches the sources

install.ps1 会将带版本号的辅助程序构建文件保存在 %LOCALAPPDATA%\NexusCodex\ComputerUse(或 -StateRoot)下,在技能旁写入一个链接到源代码的 entry.mjs(因此请保持克隆仓库的位置不变),通过哈希检查四个 .NET 运行时文件,并串行处理并发安装。CODEX_HOME 或 -CodexHome 可更改 Codex 文件夹。更新克隆仓库后请重新运行该脚本。注意:构建路径必须保持在 Windows 260 个字符的限制内。MCP 服务从克隆仓库运行时也能找到此辅助程序。

新启动的 Codex 会话会加载此技能。已导入旧版本的 REPL 必须重置,因为 JavaScript 模块缓存不会重新加载模块。

工具

工具用途
windows(filter)应用窗口(id、应用、标题、pid),类似任务栏;不会列出密码管理器
look(window, mode)根据 id 或标题或应用名称中的唯一部分查找一个窗口:提供 UI Automation 树,以及可在被遮挡窗口上使用的截图,mode="image" 或 "both";选定的窗口可供 act 使用
act(steps)在上次 look 选定的窗口上执行一个步骤,或最多 32 个步骤,每个步骤都有自己的 expect;遇到首个未验证的步骤时停止
launch(app)启动一个应用(名称、路径、Store 应用 id)、文件夹、文档或设置页面(ms-settings:),并将前台控制权交还
window(action, window)action="close":发送一次关闭消息并读回验证;如出现“是否保存?”提示,会报告但不会回答

步骤类型:click(选择器,或坐标和原生截图 id;button、count)、setValue、typeText、key、 select、menu、secondary、scroll、drag。每个步骤都会报告 ✓ 已验证、= 已完成、~ 未知(再次查看, 不会重放)或 ✗ 失败或已拒绝。

使用方法

作为 MCP 服务:先运行 windows,再查看一个窗口(look),然后使用该次查看得到的选择器执行 act,并提供一个能证明操作效果的 expect。一次观察仅对一个 act 有效,且会在 60 秒后过期。

作为技能,Agent 遵循 SKILL.md 和 API 参考。 在 Codex 的 Node REPL 中:

if (!globalThis.sky) { const { sky } = await import('@oai/sky'); globalThis.sky = sky; }
const home = nodeRepl.homeDir ?? (await import('node:os')).homedir();
globalThis.nexusWindows = await import('file:///' + home.replaceAll('\\', '/') + '/.codex/skills/nexus-windows/entry.mjs');
globalThis.win = nexusWindows.createWindowsSession(sky);
nodeRepl.write(await win.windows());          // pick exactly one window from this list
await win.bind({ id: chosenWindowId, app: chosenAppId });
globalThis.obs = await win.observe();
globalThis.result = await win.act(obs, {
  kind: 'click', selector: { automationId: 'okButton', role: 'button' },
  expect: { selector: { automationId: 'status' }, field: 'name', equals: 'Saved' }
});

读取 result.status、result.technique 和 result.foregroundTaken,然后从 result.observation 继续。 最后调用 await win.close()。

本地文件:

位置内容
%USERPROFILE%\.codex\skills\nexus-windows已安装的技能和 entry.mjs
%LOCALAPPDATA%\NexusCodex\ComputerUse\native\<fingerprint>带版本号的辅助程序构建版本
%LOCALAPPDATA%\NexusCodex\ComputerUse\recipes已验证的配方(仅包含静态 UI 标签)
%LOCALAPPDATA%\NexusCodex\ComputerUse\reports明确的测量数据,不含窗口内容或输入的文本
%LOCALAPPDATA%\NexusCodex\ComputerUse\captures原生捕获,最多保留 10 分钟和 32 个文件

功能说明

优先在后台操作,最后才使用物理输入

每个语义操作 click、setValue、typeText、secondary、select 和 menu 都会优先发送给辅助程序:

UI 系列后台技术绝不使用
Win32向父窗口发送 BN_CLICKED(复选框和单选按钮组使用 BM_SETCHECK),EM_SETSEL + EM_REPLACESEL,通过 CB_SHOWDROPDOWN 打开并关闭组合框列表(通过 CB_GETDROPPEDSTATE 读回状态),通过 CB_SETCURSEL + CBN_SELCHANGE + CBN_SELENDOK 选择选项(先关闭已打开的列表:关闭会取消操作并恢复之前的选择),LB_SETCURSEL + LBN_SELCHANGE,TCM_SETCURFOCUS,菜单 WM_COMMAND;UIA ToggleUIA Invoke(Win32 代理会调用 SetForegroundWindow),对列表使用 UIA Select(无提示)
WinFormsUIA Invoke/Toggle;针对 Edit、ComboBox(与 Win32 相同,包括打开列表)和 ListBox 使用消息对复选框使用 BN_CLICKED,对列表使用 UIA Select
WPF、UWP/WinUI、Chromium/Electron使用 AutoSetFocus = FALSE 的 COM UI Automation:Invoke、Toggle、Value、ExpandCollapse(读回状态)、SelectionItem;选择后会再次关闭组合框

一项实测结果影响了设计:在某个进程中使用过托管的 System.Windows.Automation 客户端后,即使设置了 AutoSetFocus = FALSE,同一进程发出的 COM Invoke 或 Toggle 仍会激活目标窗口(WPF 和 .NET 8 上的 WinForms 均如此)。因此,UI Automation 模式会从一个从未加载托管客户端的子进程(--com-worker)发送。自 1.4.0 起,托管客户端不再在任何地方加载:通过 COM UI Automation 客户端以一次往返读取树(CacheRequest、Subtree 范围、control view;读取基准表单约需 50 毫秒,而此前需要 150 到 300 毫秒)。执行操作时,只会重新读取目标及其祖先,并且任何与观察结果的差异都会导致操作被拒绝。

Win32/WinForms 组合框的选项通过消息读取(CB_GETCOUNT、CB_GETLBTEXT、CB_GETCURSEL),无论列表是否打开,都会作为其下的 list/listitem 节点显示;expanded 的状态来自 CB_GETDROPPEDSTATE。实测发现:打开的 WinForms 组合框的 UIA 子树约 7 秒后会返回 “Malformed Cacheresponse”,随后停止响应,因此绝不会遍历该子树。

每种技术都会读回操作效果:applied(已应用)、none(未发生变化)或 sent(无法读回)。仅在没有可用技术,或 expect 未满足且没有任何可观察到的变化时,才会使用物理输入作为回退。不会通过物理输入重复执行部分生效的操作;fallback:false 会禁止使用物理输入路径。每个结果都会说明执行操作的技术(background:messages、background:uia、foreground:uia、physical:sky、sky:semantic)、前台是否被激活,以及每次尝试的情况。

显式后置条件

expect 可区分 verified、unmet、already-satisfied 和未知结果。每条观察只能使用一次;如果观察已过期、来自另一个窗口、控件缺失或存在歧义,或控件标识已更改,则会在输入任何内容之前中止操作。截断的 UIA 值不能满足精确相等条件,空树也不能证明控件已消失。原生密码字段会被拒绝。

只有当后置条件在操作之前已成立,且它是操作会改变的精确状态(目标上的 value、checked、selected、expanded 或 focused,或另一个元素上的结果)时,才会跳过该操作(already-satisfied,不发送任何内容)。仅复述目标本身的后置条件(“按钮存在”)会被拒绝;如果非精确条件在操作之前已成立(exists、includes、目标的标签),也会在输入任何内容之前被拒绝:因为它无法区分操作的效果与先前状态。组合框中的选项是否选中,以组合框的 value 为准,绝不以其选项元素为准。

使用 PrintWindow 清晰捕获

observe({mode:'image', capture:'native'}) 使用 PrintWindow(PW_RENDERFULLCONTENT) 捕获已绑定窗口,即使窗口被遮挡也不会将其置于前台:感知每台显示器的 DPI,按 DWM 窗框裁剪;DPI 感知不匹配的窗口会按其逻辑尺寸绘制并缩放。在 Codex 技能中,捕获结果为空白、窗口已最小化或捕获失败时,会回退到 Sky 的截图;MCP 服务没有此类回退,并会报告失败。原生图像是本地 PNG 文件(最多 32 个;在下一次捕获、服务器启动时以及正常停止时,移除超过 10 分钟的文件):这些文件既是模型的证据,也是指定图像的点操作的坐标参考系(screenshotId)。

已验证的批处理(actBatch)

actBatch(obs, steps) 可在一次调用中运行最多 32 个操作。每一步都需要 expect;所有步骤都会在输入任何内容之前完成验证;每一步都基于上一步刷新后的观察执行;批处理会在第一个结果既非 verified 也非 already-satisfied 的步骤处停止。

多个窗口

会话无需新的 bind 即可跟随对话框和弹出窗口:包括由已跟随窗口拥有的窗口、会禁用前台窗口的窗口(模态窗口),以及操作期间出现的同一进程窗口。对话框关闭时,会话会返回到最近的打开状态的所有者窗口。每条观察都会报告 windowStack 和 windowChange。不会跟随临时弹出窗口(带有 WS_EX_NOACTIVATE 的无标题栏 WS_POPUP 窗口,例如打开的下拉列表、工具提示、WPF 弹出窗口;或 Win32 ComboLBox):这些窗口通过所属窗口的树读取,并列在 obs.popups 中。

安全护栏:一套共享策略

从 1.5.0 起,安全护栏采用 NexusWindows 三个版本(Codex、Claude、Antigravity)共享的策略 garde-fous.json,其中包含一个 codex 条目。本仓库根目录中嵌有一份副本;在作者的私有工作区内,则会读取实际使用的共享文件(测试会检查两者的字节是否完全一致)。 NEXUS_GARDE_FOUS 可指向其他文件;指定的路径绝不会被悄悄替换。策略缺失或无效时,会拒绝所有操作(默认失败关闭),而 .NET 助手在没有可读取的策略时会拒绝所有窗口请求。

硬性拦截(读取或输入前即拒绝):安全桌面(UAC、锁屏、登录界面)、Windows 凭据提示框、密码管理器(KeePass、Bitwarden、1Password、Dashlane、NordPass、RoboForm、LastPass,按进程名前缀判断),以及 Codex 自身的应用(Codex、ChatGPT),因为 Codex Computer Use 会在其主窗口中请求应用访问权限。控制台和终端、文件资源管理器及管理工具不再被拒绝(1.4.1 及之前的版本会拒绝):该层面向已经允许 Codex 运行命令的用户。任何位置的密码字段仍会被拒绝,其值绝不会被读取。

确认(在操作中设置 confirm:true,仅在用户明确下令或同意后设置):付费、拨打电话、发送、发布、永久删除、格式化、卸载、重置、取消订阅、将仓库设为公开;以及在标题与付款或格式化相关的窗口中执行通用动词操作(Validate、OK、Start)。检查的是手势会触发什么,而非手势的形式;检查发生在任何输入之前,与后续采用何种技术无关:通过选择器或截图坐标点击(单击或双击;按钮内的文本或图标也视为按钮的一部分)、按 Enter、Ctrl+Enter、Space、Alt+字母(访问键或带下划线的字母)、输入包含换行符的文本、执行菜单命令,以及执行展开、折叠、切换、选择或滚动以外的辅助操作。拒绝(error.confirmationRequired)时不会发送任何内容;批处理会在该步骤停止。已学习的操作配方绝不会携带 confirm。直接调用 Sky 会绕过这一层:务必通过会话操作。

用户在场(Raw Input)

一个长期运行的 --stop-guard 进程会注册 Raw Input(RIDEV_INPUTSINK,仅消息窗口,无挂钩)。它只报告每次物理键盘或鼠标输入发生的瞬间,绝不读取输入内容。注入的输入(包括 Sky 自身的 SendInput)没有来源设备,因此会被忽略。执行任何物理输入前,会先等待 1.618 s,确保用户没有输入(最长等待 8 s;超时则延后操作,不发送任何内容);随后按每块最多 48 个字素输入。如果用户重新使用键盘或鼠标,输入会停止(标记为 interrupted,绝不重新发送)。没有 Raw Input 时,会回退使用 GetLastInputInfo,并排除自身的输入注入。

应用记忆

经过验证的语义点击或辅助操作可保存为操作配方,并附带其预期效果、可执行文件元数据指纹以及一份控件结构指纹。任何变更都会触发重新检查。绝不会重放控件编号或像素坐标,也绝不会存储输入的内容。

Agent 正在工作

操作运行期间(act、actBatch、activate;观察操作除外),绑定窗口所在屏幕的右下角会显示一个小徽标,原地旋转,效果类似游戏加载画面,并带有呼吸般明暗变化的蓝色光晕。最后一次操作结束 1.6 s 后,徽标消失。整个 REPL 生命周期中一直运行的紧急停止守护进程,会在收到 busy <hwnd> 和 idle 命令时绘制徽标(native/BusyIndicator.cs):这是一个分层窗口,始终置顶、无边框、可点击穿透、不会激活、不显示在任务栏中,并且不会出现在屏幕截图里。渲染采用解析方式,光晕、阴影和圆片均由 GDI+ 解码的 native/logo.png 绘制,不会增加依赖项。设置 NEXUS_WINDOWS_INDICATOR=0 可关闭该功能。

与其他 Agent 协同工作

此层与同一台 PC 上的另外两个桌面 Agent 并行运行(一个 Claude MCP 服务, NexusWindows for Claude,以及一个 Antigravity 层)。 它们通过两种基于文件的协议进行协调,任何 Agent 都可以实现这些协议:

前台令牌(%USERPROFILE%\.nexus\foreground.lock):仅在实际使用鼠标或前台时持有(Sky 物理输入、激活、前台 UIA 回退),读取或使用后台技术时不持有。 持有该令牌意味着在偏移量 2^32 处对 1 个字节执行独占 LockFileEx(在 C# 中:使用 FileStream,并设置 FileShare.ReadWrite | FileShare.Delete,然后调用 Lock(1L << 32, 1))。Windows 会在句柄关闭时释放它,包括进程退出时。持有者写入 {"owner", "pid", "since", "purpose"},仅供诊断使用。等待者最多等待 8 s,之后报告操作已延后,不发送任何内容。

紧急停止(Ctrl+Alt+Shift+Esc,文件位于 %USERPROFILE%\.nexus\):每台 PC 上有一个进程持有 RegisterHotKey(MOD_NOREPEAT)(其他进程每 3 s 重试一次),并每 3 s 更新一次 stop.owner;按下快捷键时,会将 stop 重写为 {"by", "pid", "at", "hold_s": 120, "nonce"}。在此场景下,只要 Codex REPL 仍在运行,--stop-guard 辅助程序就会在无人持有热键时接管它。JavaScript 会话每 0.2 s 检查一次 stop,并在每次操作前检查;辅助程序也会在每次 UIA 操作和令牌获取前再次检查。年龄不足 120 s 的新版本会在剩余时间内阻止所有桌面操作;观察操作仍可进行。停止状态会以单调时钟锁存在内存中:删除文件或更改时钟都不会解除该状态。

架构

flowchart LR
    Codex["Codex"] --> MCP["MCP server bin and lib mcp.mjs"]
    MCP --> Provider["lib native-provider.mjs"]
    Provider --> Session["lib session.mjs"]
    Codex --> Skill["skill entry.mjs in the Node REPL"]
    Skill --> Session
    Session -. skill only .-> Sky["Codex Computer Use API"]
    Session --> Native["lib native.mjs"]
    Native --> Helper["NexusCodex.UIA server"]
    Helper --> Messages["Win32 messages"]
    Helper --> ComWorker["COM only worker for UIA patterns"]
    Helper --> Capture["PrintWindow capture"]
    Session --> Guard["stop guard with Raw Input"]
    Guard --> Shared["shared files in USERPROFILE nexus"]
    Helper --> Shared
bin/nexus-windows-codex.mjs   the MCP server command (stdio)
lib/
  mcp.mjs        MCP protocol and tools (no npm dependency)
  native-provider.mjs  window inventory by the helper, every window driven by the helper alone
  session.mjs    WindowsSession: bind, observe, act, actBatch, recipes, window following
  native.mjs     client for the .NET helper (one reused process, correlated requests, timeouts)
  tree.mjs       accessibility tree normalisation and digests
  memory.mjs     recipes and metrics (atomic, locked writes)
  presence.mjs   user presence from the stop guard
  stop.mjs       emergency stop watcher and guard process
native/          .NET 8 helper: Program.cs (modes --server, --com-worker, --stop-guard, --foreground-token),
                 Background.cs, ComUia.cs, ComWorker.cs, Capture.cs, Presence.cs, EmergencyStop.cs,
                 ForegroundToken.cs, Win32.cs
skill/nexus-windows/   SKILL.md and references (API, per-application notes)
tests/           node:test suites; tests/live: real validation fixture (WinForms, Win32, WPF)
install.ps1      builds the helper and installs the skill
test.ps1         offline check; -Full adds the real validation

测量结果

摘自 VALIDATION.md(2026 年 10 月 15 日,在仓库自带的测试夹具上进行的实际验证;该文件为法语)。未激活的 Windows 窗口显示在 Z 顺序底部,Win32 窗口被 WinForms 窗口覆盖。 每项操作均验证了后置条件,应用程序对事件进行了计数,前台未改变,光标保持静止。

操作技术耗时(输入与回读)
Win32 按钮、复选框、输入文本、在插入点追加、组合框、列表、菜单消息105 到 159 ms
WinForms 输入文本、组合框、列表消息292 到 338 ms
WinForms 复选框、按钮、对话框打开后关闭(自动跟进)COM UIA Toggle / Invoke205 到 441 ms
WPF 按钮、复选框、值COM UIA Invoke / Toggle / Value193 到 241 ms
执行 3 步的批处理,在第 2 步停止(从未发送第 3 步)消息658 ms
捕获被覆盖的 Win32 窗口PrintWindow,非空白19 ms

离线测试套件:108 个 JavaScript 测试,103 个通过;在 -Full 以外跳过了 5 个真实环境测试(test.ps1,2026 年 10 月 16 日)。耗时主要由完整的 UIA 树回读造成。此轮测试跳过了会切换前台的物理回退,因为当时用户正在操作;此项不计为通过。

跨 Agent 基准测试(2026 年 10 月 16 日)

在这台电脑上使用的三个 Windows 桌面 Agent(本层、Claude 服务和 Antigravity 层)针对由 powershell.exe 承载的 WinForms 和 WPF 窗体运行了相同的任务。窗体在未激活的情况下创建于 Z 顺序底部,同时用户继续工作:填写三个字段、勾选一个复选框、打开“Formule”下拉列表、在打开的列表中选择“Bravo”,然后确认。证据是从应用程序中读回的结果标签。此次真实会话和 .NET 辅助程序使用了一个会拒绝并统计任何物理输入的伪 Sky。

检查项WinFormsWPF
三个字段✓ 后台:messages,103 至 124 ms✓ 后台:uia,170 至 189 ms
打开列表(expanded = true)✓ 已验证(1.3.0:错误地显示为 already-satisfied)✓ 已验证(1.3.0:先显示 unmet,随后窗体控件丢失)
在打开的列表中选择“Bravo”并确认✓ 已验证✓ 已验证(1.3.0:跳过了确认)
简单后置条件(“按钮存在”)✓ 在任何输入前拒绝✓
应用程序结果Formule=Bravo;Envois=1Formule=Bravo;Envois=1
物理输入/切换到前台123 次采样中均为 00 / 0
耗时(观察 + 批处理)0.12 + 1.16 s0.11 + 1.41 s(1.3.0:4.5 至 8 s)
Agent上午修复后
本层(1.3.0,随后为 1.4.0)16/2019/20
NexusWindows for Claude17/2019/20
Antigravity 层18/2019/20

仍使本层未能达到 20 分的因素:本次基准测试未测量 Codex 应用内经由 Sky 的真实路径 (伪 Sky)。同一天,在用户空闲时运行的 test.ps1 -Full:15 项真实验证检查通过,0 项失败,0 项跳过; 物理回退 ✓(前台:uia,123 ms);基准测试窗体耗时:WinForms 1.1 s,WPF 2.0 s;227 次前台采样中 0 次切换到前台。

安全性

  • 后台技术不会触碰用户的键盘、鼠标,也不会抢占前台。物理输入会等待用户暂停、 持有共享令牌,并在用户接管时停止。
  • 上述紧急停止会阻止所有桌面操作 2 分钟;被拒绝的操作绝不会重放。
  • 遇到拒绝情况(密码字段、硬阻止的应用程序、缺少确认、控件身份已更改、窗口或菜单命令已禁用)时,不会发送任何内容,也绝不会回退。
  • Codex 自身的 Computer Use 规则(应用程序访问、敏感操作)仍然适用;本层不能绕过 被拒绝的应用程序或操作。页面文本、控件和操作流程都是数据,绝非授权。
  • OneDrive 文件夹中的捕获操作会被拒绝;指标绝不包含 UI 文本、屏幕截图、输入值或标题。

隐私

NexusWindows for Codex 完全在你的 PC 上运行。它没有账户,不收集遥测数据,不做分析,也不会自行发起网络请求。它只建立本地连接:连接到它控制的 Chromium 或 Electron 窗口在 127.0.0.1 上的 DevTools 端口,绝不连接其他机器。

  • 读取的内容:Codex 所操作应用的无障碍树和窗口图像,且仅在 Codex 调用它时读取。
  • 内容去向:结果会返回给 Codex,Codex 可能根据自身的隐私政策将其发送给 OpenAI;本服务不会将任何内容发送到其他地方。
  • 存储的内容:在 %LOCALAPPDATA%/NexusCodex/ComputerUse 下,存储已安装的辅助程序、你选择记住的操作流程配方(仅静态界面标签,绝不包含文档文本或输入值)、每个会话的指标(操作类型、结果、技术、耗时;不含界面文本、屏幕截图、输入值或标题)以及窗口截图,其中只保留最新的 32 张;超过 10 分钟的截图会在下次截图、服务启动时以及正常停止时删除(如果服务被强制结束,截图可能会保留到下次启动)。在 ~/.nexus 下,存储共享前台令牌和紧急停止状态。在 %LOCALAPPDATA%/NexusJournal/windows/codex 下(或 NEXUS_JOURNAL_HOME 指定的位置),存储简短的月度 JSONL 日志,格式与其他 NexusWindows 工具相同(应用可执行文件名称、操作、技术、结果、耗时、是否使用前台);绝不包含界面文本、输入值、标题或路径。本服务绝不会删除该日志。
  • 删除方法:删除这些文件夹(以及 %LOCALAPPDATA%/NexusJournal),并从 Codex 中删除本服务或技能。

如有疑问或顾虑,请在此仓库提交 issue。

限制

  • 支持不代表所有 Windows 应用都经过认证。画布、3D 视图以及没有无障碍提供程序的控件,仍需要使用屏幕截图和物理操作。
  • 消息技术会模拟真实点击发送的通知;只响应真实鼠标输入的应用不会识别它们,实际效果由后置条件判断。
  • 原始点击、滚轮、键盘快捷键以及没有 Edit 控件的富文本编辑器仍需要物理输入。Tk 没有 UI Automation,也会忽略已发送的输入。
  • 如果某个效果在无障碍树中没有踪迹,就无法将其与“无效果”区分开:请提供能够观察该效果的后置条件,或设置 fallback:false。
  • launch 会根据进程将窗口归属于启动操作,并通过 proof 说明依据:process 表示 Shell 返回的进程;application 表示对于由可执行文件或 Store ID 指定的应用(其启动器可能会将任务交给另一个进程),归属于该请求发出后启动的该应用的进程。使用 application 时,同一时刻由其他程序启动的该应用的另一个实例可能会被误认为是它。文件和文件夹需要使用绝对路径;除非 Shell 返回了显示这些文件或文件夹的进程,否则相应窗口会作为候选项返回。
  • 在技能中,Sky 的物理输入无法在 Codex REPL 之外测试;其编排(暂停、令牌、分块、中断)仅由离线测试覆盖。MCP 服务从不使用 Sky。
  • 技能、注释和部分消息是为单个用户编写的(其中会提到该用户),部分内容使用法语。

开发

pwsh -NoProfile -File test.ps1         # node tests + helper build in a temp folder; never touches %USERPROFILE%\.nexus
pwsh -NoProfile -File test.ps1 -Full   # also real token/stop tests and the background validation on the fixture

许可

MIT,详见 LICENSE。版权所有 (c) 2026 Julien Piron。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。