@ desklink/ axi
查看并驱动代理服务器的活桌面:文本先行,按请求显示像素.
一个桌面CLI,用于桌面链接引擎上的编码代理. 它用OCR文本进行回答,校对以点击并更改区域,并且仅在被问到时返回一个图像裁剪,所以一个转弯会花费文本符号而不是截图.
安装
从 npm 安装; 上面的徽章跟踪注册版本 :
npm install -g @desklink/axi
desklink-axi --version 编辑 --help 页眉显示已安装的版本,包括任何dev/release后缀.
或者从寄存器根建立 npm install && npm run build。 。 。 .
删除已复制 *.tsbuildinfo 在重建被移动的工作树之前.
引擎通过 @desklink/host; 见其 安装指南
用于支持平台和 macOS 设置。 。 。 .
设定 DESKLINK_AXI_ENGINE 用于匹配源构建。 将新AXI指向0.3.x引擎的超接功能不支持;主机和引擎版本必须匹配.
Linux 桌面 AXI 预览有 macOS 。 它运行每个会话的私人桥, 抓取只读帧通过 @desklink/host 协议 v3, 仅通过 WebRTC 发送输入 control 频道. 桥的Unix套接字住在 $XDG_RUNTIME_DIR/desklink-axi (或OS临时目录) DESKLINK_AXI_SESSION 选择一个孤立的套接字。 它打开一个单独的引擎会话; 在别人控制时不要驱动桌面.
对于macOS源先决条件,签名和许可归属,遵循 主机设置指南1. 通过其经签字的当地装置启动第XI号决议 open -n /absolute/DesklinkHost.app --args axi-bridge /absolute/path/to/packages/axi/bin/desklink-axi.js 从登录的Mac会话。 OCR 需要可选选项 tesseract 可执行文件( e)brew install tesseract, (中文(简体) ), sudo pacman -S tesseract 或者说 sudo apt install tesseract-ocr; 在macOS AXI上,当发射服务公司从PATH中省略出Homebrew的标准安装路径时,也会找到Homebrew的标准安装路径. look 工作没有它.
desklink-axi start --source x11 --display :97
desklink-axi screen --query "Budget"
desklink-axi tree --query "Save"
desklink-axi type "hello" --into @a3.10
desklink-axi click @a3.7
desklink-axi marks
desklink-axi click 100,120
desklink-axi type "hello"
desklink-axi batch '[{"verb":"snapshot","name":"ui"},{"verb":"click","args":["@ui.2"]},{"verb":"assert","args":["Saved"]}]'
desklink-axi diff
desklink-axi look @r1
desklink-axi stop
start --cursor hidden 选择为无光标捕获; 省略已有的行为 。 使用 desklink-axi cursor 排出源坐标光标样本(x, (中文(简体) ), y, (中文(简体) ), visible, (中文(简体) ), timestamp_us附加时 hotspot 作曲者在现场报告时; dropped:N 报告更古老的样本 在它的一万个样本缓冲器填满后被覆盖 在Wayland,当没有位置时,隐藏的会话仍然在运行,并说为什么在 cursor.limitation; 见 光标协议。 。 。 .
health 报告捕捉状态,最新帧序列, 和流停止 理由没有OCR. start 允许其同一用户配对的消费者使用所有可用的访问; Linux 使用门户, 除非 --source x11 --display :N ,而macOS使用主显示,除非 --source display --display <id> 给出。 门户可以要求桌面同意提示;其单用途还原符被保存在其中 $XDG_STATE_HOME/desklink-axi/<session>.portal-token (否则) ~/.local/state/desklink-axi/<session>.portal-token),在每次赠款后,在解剖学上取而代之的是0600模式; <session> 实值 DESKLINK_AXI_SESSION,与会话的套接字和浏览器状态使用的名称相同,因此两条道从不将对方的赠款交给自己的消费者. 设定 DESKLINK_AXI_RESTORE_TOKEN_FILE 用不同的路径。 macOS 屏幕记录和无障碍属于启动桥和其引擎子的应用程序. 不要在别人的展出上不小心运行它。 输入和剪贴板不需要应用程序授权; 不可用的OS后端每个动作失败 。 遗产 start --control 被接受和忽略。 见 剪贴板协议 用于X11目标、转移限制和选择寿命. stop 释放有投入。 确认的行动 input: applied 立即,不等待一个框架。 每项行动( A)click, (中文(简体) ), type, (中文(简体) ), press, (中文(简体) ), scroll, (中文(简体) ), drag接受 --wait settle|change|none|<milliseconds>; 应用输入返回后的框架超时 input: applied; frame: timed out 成功状态. batch jSON 数组为 1 - 30 [verb, ...args] 步骤(点击/类型/press/scroll/wait/snapshot/sert/tree/marks),按一次套接字往返的顺序运行,在第一个失败的步骤上停下来,并返回一个紧凑的每步结果。 OCR refs 仅在文本和位置仍然匹配新收件时才能存活到推进帧数;需要移动或模糊的文本 screen --query。 。 。 . screen --query 重用目标作物的先前匹配文本位置,然后返回完整的OCR,并报告估计文本符号。 开始 screen --query 或者说 --region 在此之前 --full。对于网页,如果有DOM/浏览器自动化功能,则倾向于DOM/浏览器自动化;AXI是用于本地应用程序或全桌面任务. wait change 财务报告和审定财务报表 wait settle 而不是投票. diff * 报告一再单独改变区域,作为 animating· ; diff --include-animating 将它们包括在普通变化中. look 写一个PNG收成. --help 列出命令及其旗帜。 错误结构化, CLI 不提示 .
引导不输入的人,使用 desklink-axi point 400,300 --label "Here" --timeout 3000,或 desklink-axi point --clear见 主机协议参考 用于支持源、坐标和限制.
浏览器道( opt- in, 仅循环)
对于网页,浏览器道通过语义控制 剧作家核心 超过 CDP; 桌面道保留用于本地应用程序和全桌面任务 。 任何内容都没有隐含地附上:
desklink-axi browser attach --cdp 127.0.0.1:9222 # a Chromium YOU started with --remote-debugging-port (loopback only)
desklink-axi browser launch --profile /tmp/task-profile # or: isolated task-owned Chromium, debug port on loopback only
desklink-axi browser tabs # 'selected' = this lane's page, 'front' = the browser's actual activated tab
desklink-axi browser snapshot # compact accessibility snapshot with [ref=eN] elements; no screenshots
desklink-axi browser click @e12 / fill @e5 "text" / upload @e9 /tmp/report.pdf / press Enter
desklink-axi browser select 1 / open <url> / navigate <url> / close 1 / detach
非落下端点被拒绝; launch 打开 $DISPLAY (X11)所以它从不遵循 WAYLAND_DISPLAY 到另一个桌面,以及 --arg <chromium flag> (可重复)通过诸如 --arg=--window-size=1280,640。快照参考器被重新生成到每个命令,并被拒绝为 stale-ref 当页面改变. upload 只设置文件于 <input type=file>; 对于OS级对话框, 它返回 not-supported 并命名桌面车道(desklink-axi click/type),这也是真实的本土-对话导航的路线——DOM上传不等于完成本土文件对话框. detach 仅在该道启动时停止浏览器; 通过 --profile 目录被保存,一个车道创建的临时配置被删除.
在 Linux 上,一个行道启动浏览器所记录的 PID 和启动时间必须匹配
在连接或清理之前。 旧版本未设置的缓存会话
拒绝录制开始时间; 使用新鲜 DESKLINK_AXI_SESSION 和简介.
清理验证辅助器 PID/启动时间对接私人发射标记
在发出信号之前 所附浏览器 --cdp 仍为呼叫者所有.
批量结果
batch 步骤是 [verb, ...args] 数组或 {verb, args?, name?, wait?} 有动词的对象 click, type, press, scroll, wait, snapshot, assert, tree, marks。一个命名的快照步骤会绑定其OCR项目,以便以后的步骤能够瞄准 @name.n· ; assert 步骤使成功取决于所观察到的屏幕文本;每行分开 input: applied (运输确认) effect: change observed | none within timeout,脚印上说 effects: asserted[n] 或者说 effects: unverified (input acknowledgements only) ——输入确认绝不是经过核实的结果,因此错误的焦点打字或不点击会失败批次而不是报告成功.
证据和测量
带有任务所建引擎的寄存器根( R)DESKLINK_AXI_ENGINE继续
Linux, 跟着 私人实验室指导数字 :
node packages/axi/test/smoke.mjs——清洁树木重建主机+axi,然后batch财务报告和审定财务报表click(b) 声称没有属于任务所属的幸存者.node packages/axi/test/flow.mjs– 完整的桌面证明(帧/损坏,点坐标/出站/清空而无指针或焦点变化,点击通过,输入,和弦,批量结果,注入失败清理).node packages/axi/test/browser-flow.mjs——通过浏览器道的开口/出道/出道/出道-出道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-取道-道-道-道-道-道-道-道-道-道-道-道-道-道-道-道-道-道-道-道-道-道-道-道--道-道-----道-.node packages/axi/test/bench.mjs [runs]– 比较 p50/p95( 默认 20 运行于 3 warums 后) 浏览器道对 AXI 倒置于 open/form/tabs/ native 固定装置之上; text-token 代理ceil(stdout chars/4)一个代理,而不是一个象征性的.
以一台由任务拥有的Chromium 151 (Xvfb) 所测量的单相机1280x720 Xvfb--window-position=0,0 --window-size=1280,640,在3次热身后每任务20次测量跑道,每跑道CLI墙壁时间
| 任务 | 车道 | p50 ms (英语) | p95 分钟 | 呼叫/运行 | 重试 | 文本脚本代理/运行 | 失败 |
|---|---|---|---|---|---|---|---|
| 本地输入 | 轴 | 页:1 | 68国 | 1.0 国家 | 0 个 | 22个 | 第1/23号决议 |
| 打开 + 验证标题 | 浏览器 | 532个 | 558 (韩语) | 2.0 数据 | 0 个 | 149个 | 0/23 (英语) |
| 打开 + 验证标题 | 轴 | 6043 (英语) | 第8659号 | 2.0 数据 | 0 个 | 107国 | 0/23 (英语) |
| 表格填充+保存+验证 | 浏览器 | 1735 (英语) | 6082号 | 4.0 (韩语) | 0 个 | 290国 | 0/23 (英语) |
| 两个标签同时读取 | 浏览器 | 第5176条 | 6007 (英语) | 17.0 (中文(简体) ) | 0 个 | 900个 | 0/23 (英语) |
| 表格填充+保存+验证 | 轴 | 未完成 —— OCR 单词目标步骤 (--into Name, (中文(简体) ), click Save板凳序列呈片状;孤立地通过同样的台阶,批/装机在流.mjs中得到证明。 后继:稳定后再进行再测量. | |||||
| 两个标签同时读取 | 轴 | 未完成 —— 弹出- 链接点击器上相同的 OCR 字- 目标限制; 孤立工作, 尚未在被测量的序列中进行. |
浏览器道用紧凑的文本快照完成了每条网络任务23/23;桌面道的OCR倒置对本土证明保持可靠,并在小网络文本上降解,与2026-09-27计算机使用基准中的双行道排名相匹配.
对于一个远程签名的Mac桥,启动一次 在许可的应用程序内,然后将其Unix套接字转发到一个持续的SSH连接上: ssh -N -L "$LOCAL_RUNTIME/desklink-axi/default.sock:$REMOTE_RUNTIME/desklink-axi/default.sock" mac-host设置 XDG_RUNTIME_DIR=$LOCAL_RUNTIME 客户端( 创建) $LOCAL_RUNTIME/desklink-axi 模式 0700,先运行 desklink-axi screen, (中文(简体) ), batch等当地. SSH 登录不启动引擎, 转发的套接字授权控制: 使用私有目录, 完成后关闭 SSH 。 不运行本地 start 对接转发的套接字。 切换和重签每个运行的可执行文件 。 使用相同的密钥更新整个应用程序的现有路径 packages/desktop-host/release/install-mac-app.sh;更新后核实赠款.
desklink-axi setup hooks 加一个克劳德 SessionStart 钩入 .claude/settings.local.json ;它不开始抓取.
为孤立的融合证明运行 DESKLINK_AXI_ENGINE=/path/to/engine CARGO_TARGET_DIR=/tmp/task-owned-target node packages/axi/test/flow.mjs 从寄存器根。 它通过精确的PID发射并杀死自己的Xvfb进程. test/a11y-flow.mjs 是可访问性+标记证明:它也开始一个私有的D-Bus会话总线,一个私有的AT-SPI总线,以及一个GTK3固定应用程序(所有任务拥有,私人 XDG_RUNTIME_DIR),声称语义-ref驱动窗体控件和文件对话框,每个命令的打印p50/p95 --measure 20它跳过自己,当 busctl编号 :dbus-daemon编号 :at-spi2-core/GTK缺席,从来不会触碰用户的无障碍巴士.
对于200个字的OCR和查询证明,添加 DESKLINK_OCR_SCALE=1 或者说 DESKLINK_OCR_SCALE=1.5 财务报告和审定财务报表 DESKLINK_OCR_EVIDENCE=/absolute/output/directory 到那个命令。 后者采用1.5级的私人3840×2160显示. 每次运行都会保存地面真相,OCR,单词diff,截图和每个可见标签查询. 添加 DESKLINK_OCR_UPDATE_README=1 到 1x 运行以直接以 CLI 输出取代 README 记录;没有记录行是手编辑的。 使用 DESKLINK_OCR_SHOWCASE_ONLY=1 与 1x 命令重放编辑并重出原样,而不重复标签-query 检查。 这个证据需要铬和宇宙魔方 2.5 s 的输入内读取下个框(多至1.3 s后)并画出细细的柱子相闪烁在二者之间,所以文本护栏不读作后缀 |永不切入窗口的护身符仍然可以读取。 全帧OCR在宇宙魔方之前的软件上提升了3x,因此一个3840x2160帧的瞬间需要11520x6480(~74.6M px,~298MB RGBA)缓冲器外加PNG编码外加放大图像上的宇宙魔方.
要检查 CLI 对 AXI 规格, 运行 axi-axi validate "node bin/desklink-axi.js" --dir . 从 packages/axi。 。 。 .
在1280x720 Xvfb客户端上测量: diff → click 100,100 → look @r1 → type abc 返回 79+ 79+ 39+ 30= 227个文本符号 (单位:千美元)@anthropic-ai/tokenizer 0.0.4),外加~5个令牌,用于64×64作物. 四张完整截图将花费~4×1,229= 4 916个图像符号 在同一公布的宽度x高/750估计值(~21x相差)下。 这是一个短暂的合成任务,而不是生产-工作量基准;表示器是遗留的,所以绝对数是相近的.
无障碍树tree)——Linux AT-SPI (英语)
tree 在 D- Bus 上读取桌面的 AT- SPI 访问树, 返回绑定的 TON 行 ref,role,name,value,x,y,w,h,states。读取和输入动作共享相同的对齐会话。 参考文献为生成标记( Q)@a<gen>.<n>),在较新的快照中保持可用,并在使用时重新验证:其角色、名称或屏幕范围改变或对象消失的参考文献返回 stale-ref 而不是装瞎.
- 能力探测器: 总线从
AT_SPI_BUS_ADDRESS,则org.a11y.Bus.GetAddress在会话总线。 无法获取 + 结构a11y-unavailable错误; 每个其它命令继续工作 。 macOS AX 是 未执行 并贴上这样的标签. - 值:文本和值部件在
value栏(Text/Value 接口),所以可以不使用像素来验证一个已输入的条目. - 国家包括:
enabled, (中文(简体) ),showing, (中文(简体) ),focused, (中文(简体) ),editable, (中文(简体) ),checked; 对已禁用或隐藏的参考返回采取行动not-actionable。 。 。 . click @a<gen>.<n>执行部件自己的 AT- SPI 动作( U)input: applied (atspi action "Click")); 没有动作接口的节点会回落到其中心点击的坐标上(coordinate fallback) (中文(简体) ).type "text" --into @a<n>首先抓取AT-SPI焦点(atspi focus; 工具包拒绝时坐标回落)。 原始截图/坐标/OCR路径不变.tree --query <words>按名称/作用/值过滤;输出范围为40行,除非--full· ;--fields选择列.tree财务报告和审定财务报表marks可用作batch步骤.
测量事实(私营Xvfb + 私营公共汽车,2026年9月); test/a11y-flow.mjs:
- GTK3 (3.24, atk-bridge):完全暴露. 已命名的角色, 边框, 状态, 值, 和行动全部在 D- Bus 上工作; 语义点击会带真实效果( fixture- 校验文件导出) 。 期间a
GtkDialog.run()模式循环开始, atk- bridge 答案 没有 AT-SPI方法调用(测量了25分超时)——对话框必须读取后才能打开或非模式显示. - Qt6 (6.11, QtAtSpi): 用重复的注册条目在 a11y 总线上注册应用程序(一个应用程序有3个根,两个共享一个总线名称),其命名的形式控件可见于行走 (3/3 in the fixture); 一些根拒绝
GetChildCount方法(只有财产),行走可以容忍。 将每个工具Kit角色拼写("按下按钮"与"按钮")处理,并复制根作为正常输入. - Wayland/portal:11y总线是显示-protocol独立的,但通过compositor的门户/permission路径曝光是 未测量 在这项任务中(没有拥有Wayland固定); 范围之前依赖它.
- 测量出20多条暖跑道(1280x720 Xvfb,GTK3固定道,私人公交):
tree --fullp50 472 ms / p95 573 ms,语义学clickp50 69 ms / p95 85 ms, (英语),type --intop50 69 ms / p95 83 ms, (英语),marksp50 657 ms / p95 774 ms, 0 stale-ref retries 横跨整个套房. 每个tree编号 :marks行走是受约束的(~100-400受约束的busctl产卵,每个水平平行).
标记( E)marks)——编号为可视倒置
marks 将数字框覆盖在可操作候选人的作物上——AT-SPI节点并加上OCR文本——并返回图像路径和一个紧凑 mark,ref,label,role 地图。 从已编号的图像中选择一个控件, 然后按其可读性行事; 没有像素猜测 。 成本线报告作物的尺寸和估计的图像符号(dimensions=1280x720 cost: ~1229 tokens) (中文(简体) ). 地图中的折射器会失效 就像 tree 参考:已更改的几何或内容返回 stale-ref 在使用时. --region x,y,w,h 扩大作物范围; --out <path> 选择文物路径(默认写在会话旁边)。 覆盖图是纯粹的缓冲操作( P)src/marks.ts没有捆绑的探测器.