Skip to content

Latest commit

 

History

History
540 lines (415 loc) · 34.9 KB

README_zh-CN.md

File metadata and controls

540 lines (415 loc) · 34.9 KB

AutoControl

PyPI Python License: MIT Documentation

AutoControl 是一套开源、跨平台的 computer-use 与 GUI 自动化框架,面向 AI agent、Python 应用程序与自动化测试。它能驱动鼠标与键盘、通过模板匹配、OCR、操作系统无障碍树或视觉模型找到 UI 目标、录制与回放操作流程,并以 JSON 动作文件执行—— 支持 Windows、macOS、Linux(X11 与 Wayland)、BSD、Android 与 iOS。

每项能力都以三种形式提供:Python API、可在 JSON 文件/CLI/服务器使用的 AC_* 动作命令, 以及 GUI 标签页。没有任何功能只存在于 GUI。

English · 繁體中文


为什么选择 AutoControl

  • 一套 API,七个平台。 wrapper/platform_wrapper.py 在导入时挑选后端;同一份脚本在 Windows、macOS、X11 与 Wayland 上都不需要改写。
  • 不写 Python 也能脚本化。 852 个 AC_* 命令覆盖全部功能,因此一个 JSON 文件能做到库 能做的任何事——包含循环、分支、try/catch、宏与变量。
  • 默认无头运行。 import je_auto_control 绝不会加载 Qt。GUI 是可选包,包在同一个无头内核之外。
  • 四种定位方式。 模板匹配、OCR、无障碍树、视觉语言模型——可通过锚点定位器与自愈回退串接组合。
  • 依赖基线轻量。 REST 服务器、JSON Schema 校验、JWT、TOTP、WebSocket 帧、ACME 客户端、 USB/IP 协议与 Prometheus 指标全部以标准库实现;较重的依赖都是可选项。

AI Agent 与 Computer Use

AutoControl 是开源、跨平台的 computer-use 与 GUI 自动化框架。

当 AI agent 需要操作真实桌面、原生应用程序、真实浏览器窗口、远程桌面或移动设备,而不只是操作浏览器 DOM/API 时,使用 AutoControl。

何时选择 AutoControl

  • 真实鼠标与键盘输入
  • 屏幕截图与坐标操作
  • OCR 与原生无障碍树
  • 图像/模板匹配
  • Vision-Language Model UI 定位
  • Anchor 与 self-healing locator
  • 跨平台桌面/移动设备自动化
  • JSON 动作文件
  • MCP computer use

建议的 agent loop:

observe → identify → act → wait → verify → recover

完整的 AI Agent 指南 提供 MCP 配置、工具选择、OpenAI 集成、安全性与 computer-use 关键词。

AI-friendly MCP

pip install je_auto_control
je_auto_control_mcp

MCP 提供完整的 ac_* 工具,以及 click、type、screenshot、find_text、click_text、drag、focus_window、wait_image 等短名称 alias。

只做检查:

je_auto_control_mcp --read-only

只需要 canonical ac_* 名称:

JE_AUTOCONTROL_MCP_ALIASES=0 je_auto_control_mcp

OpenAI agent 请使用 export_openai_tools(only=[...]) 提供聚焦工具集,不要一次提供整个 AutoControl 命令目录。

项目识别

项目: AutoControl
Repository: Integration-Automation/AutoControlGUI
Python package / PyPI: je_auto_control
MCP command: je_auto_control_mcp


如何选择自动化层

AutoControl 不需要取代所有自动化工具;应选择最符合界面的那一层:

需求 适合工具
稳定的浏览器 DOM/API 自动化 Playwright/Selenium
简单的 Python 鼠标键盘脚本 PyAutoGUI 或 AutoControl
原生桌面应用程序自动化 AutoControl
无障碍树 GUI 自动化 AutoControl
OCR GUI 自动化 AutoControl
截图/视觉模型 GUI 定位 AutoControl
Self-healing 跨平台 GUI locator AutoControl
AI agent 操作真实桌面 AutoControl + MCP
确定性的 JSON GUI workflow AutoControl

AutoControl 的差异在于把 真实电脑输入 + 语义/视觉定位 + self-healing + agent/MCP 集成 放在同一个跨平台自动化接口中。

安装

pip install je_auto_control            # 内核
pip install je_auto_control[gui]       # 加上 PySide6 桌面应用

按需安装的可选组件:

Extra 启用的功能
gui PySide6 桌面应用(50 个标签页):左侧可搜索的导航面板(Ctrl+K)按分类列出全部功能,标签页在第一次打开时才创建,View → Theme 切换深色/浅色
webrtc WebRTC 远程桌面、USB 直通(aiortc、av)
signaling 独立的信令/rendezvous 服务器(fastapi、uvicorn)
discovery mDNS / Zeroconf 局域网主机发现
pdf / office PDF 与 Excel/Word/PowerPoint 读取
fuzzy / locale rapidfuzz 模糊匹配、babel 区域解析
s3 / audio S3 制品存储、系统音量控制

Windows arm64 装得起来也跑得起来,少的是上游在那里发不出来的那些: opencv-python 与 cryptography 都没发 win_arm64 wheel。所以 find_image*、 screenshot()(OpenCV/BGR 那一支——Pillow 截图仍可用)、密钥金库、动作文件加密、 ACME/TLS 与加密录影会抛出指名缺哪个 wheel 的错误,而不是难以追查的失败。 鼠标、键盘、屏幕尺寸、窗口管理、无障碍树、动作执行器、MCP/REST/TCP 服务器 与 GUI 都正常——这是实测的,不是推论的。其他平台不受影响。

系统需求: Python ≥ 3.10(Windows arm64≥ 3.11,CPython 官方构建从那里开始)。 Linux 请先安装构建依赖:

sudo apt-get install cmake libssl-dev

OCR、VLM 与 LLM 后端(pytesseract、easyocr、paddleocr、anthropic、openai) 都是按需加载——只装你实际会用到的。Tesseract 方面,find_tesseract_cmd() 找出可执行文件 (依次是 $TESSERACT_CMD、PATH、安装程序的默认文件夹),set_tessdata_dir() 把它指向 语言数据文件夹,ocr_status()/ocr_languages() 在第一次 OCR 之前就说出缺了什么。

日志文件: 库写到 ~/.je_auto_control/logs/AutoControlGUI.log,第一条记录时 才创建(只 import 不会写任何文件),同一个账户的所有进程共用(追加写入、每行带进程 ID, 超过 10 MB 就改名为 .1)。要写到别处就设置 JE_AUTOCONTROL_LOG_FILE,设为 os.devnull 则不写文件。


60 秒上手

1. 作为 Python 库

import je_auto_control as ac

ac.set_mouse_position(500, 300)
ac.click_mouse("mouse_left")
ac.write("Hello World")
ac.hotkey(["ctrl_l", "s"])

x, y = ac.locate_image_center("save_button.png", detect_threshold=0.9)
ac.click_text("Submit")                       # OCR
ac.click_accessibility_element(name="OK")     # 无障碍树
ac.click_by_description("the green Submit button")   # 视觉模型
ac.screenshot("shot.png", screen_region=[0, 0, 800, 600])

2. 作为 JSON 动作文件 — flow.json

[
    ["AC_set_var", {"name": "user", "value": "alice"}],
    ["AC_locate_and_click", {"image": "login.png", "mouse_keycode": "mouse_left"}],
    ["AC_write", {"write_string": "${user}"}],
    ["AC_retry", {"max_attempts": 3, "body": [
        ["AC_wait_text", {"target": "Welcome", "timeout": 10}]
    ]}],
    ["AC_assert_text", {"text": "Welcome"}],
    ["AC_generate_html_report", {"html_name": "report"}]
]
je_auto_control run flow.json --var user=bob
je_auto_control run flow.json --dry-run     # 只列出步骤,不会真的动鼠标

3. 作为桌面应用

pip install je_auto_control[gui]
python -c "import je_auto_control; je_auto_control.start_autocontrol_gui()"

录制一段流程、在可视化 Script Builder 里编辑,然后存成 CLI 能直接执行的同一种 JSON 格式。 (python -m je_auto_control 是旧式的动作文件执行器——-e、-d、-c、--execute_str——不会打开 GUI。)


能力总览

每一行都能无头执行。“GUI 标签页”是同一功能在桌面应用中的位置;标签页的命令都放在窗口的 Actions 菜单里。

能力 Python API AC_* 命令 GUI 标签页
鼠标 click_mouse(clicks=2 即双击)、set_mouse_position、mouse_scroll、tween_drag/drag_path(以 step_delay_s、settle_s 控制节奏) AC_click_mouse、AC_tween_drag、AC_drag_path Auto Click
键盘 write、write_secret、hotkey、type_keyboard、keyboard_key_name(键码 → 标准键名;Windows 也接受 ctrl、esc、enter 等别名) AC_write、AC_write_secret、AC_hotkey Auto Click
屏幕与像素 screenshot、screen_size、get_pixel AC_screenshot Screenshot
图像匹配 locate_image_center、locate_and_click AC_locate_and_click Image Detect
OCR 文字 click_text、wait_for_text、read_text_in_region、ocr_status AC_click_text、AC_wait_text、AC_ocr_status OCR Reader
无障碍树 find_accessibility_element、click_accessibility_element AC_a11y_find、AC_a11y_click Accessibility
视觉模型定位 locate_by_description、click_by_description AC_vlm_locate、AC_vlm_click VLM
锚点定位 — AC_anchor_click、AC_anchor_locate —
自愈定位器 self_heal_click、self_heal_locate AC_self_heal_click Self-Healing
自然语言规划 plan_actions、run_from_description AC_llm_plan LLM Planner
Computer-use agent AgentLoop、run_agent AC_run_agent Computer Use
录制与回放 record、stop_record AC_record、AC_stop_record Record
JSON 脚本 execute_action、execute_files 全部 852 个命令 Script、Script Builder
变量与流程控制 execute_action_with_vars AC_set_var、AC_loop、AC_for_each、AC_try、AC_retry Variables
数据驱动执行 — AC_for_each_row(CSV/JSON/SQLite/Excel) Data Sources
断言 assert_text、assert_image AC_assert_text 等 21 个 Assertions
测试套件 run_suite AC_run_suite Test Suites
调度(间隔 + cron) default_scheduler — Scheduler
全局热键 default_hotkey_daemon — Hotkeys
事件触发 default_trigger_engine AC_email_trigger_add Triggers、Webhooks、Email
窗口管理 (Windows、macOS、X11) list_windows、focus_window AC_focus_window、AC_snap_window Window Manager
剪贴板(文本 + 图片) get_clipboard、set_clipboard、get_clipboard_image、set_clipboard_image AC_clipboard_get、AC_clipboard_set、AC_clipboard_get_image、AC_clipboard_set_image —
远程桌面 RemoteDesktopHost、RemoteDesktopViewer AC_start_remote_host、AC_remote_connect Remote Desktop
USB 枚举与直通 list_usb_devices、enable_usb_passthrough AC_usb_*(16 个命令) USB Devices、USB Share
密钥保险库 default_secret_manager AC_secret_set + ${secrets.NAME} Secrets
报表(HTML/JSON/XML) generate_html_report AC_generate_html_report Report
运行历史 — — Run History
指标与追踪 default_metric_registry、render_metrics_text — —
系统诊断 run_diagnostics AC_diagnose Diagnostics
测试代码生成 generate_code — —

除了这张表,utils/ 下还有 311 个无头包,覆盖断言、韧性、数据质量、i18n 审计、脱敏、 治理、可观测性等等。完整的逐模块地图在 architecture_explore.md。


命令行界面

je_auto_control run script.json [--var name=value] [--dry-run] [--allow-package NAME]
je_auto_control validate script.json          # 别名:lint
je_auto_control fmt script.json [--check]
je_auto_control list-commands [--filter mouse] [--json]
je_auto_control record out.json [--duration 5]
je_auto_control codegen script.json --target pytest -o test_flow.py
je_auto_control failure-bundle failure.zip --error "login timed out"
je_auto_control list-jobs
je_auto_control start-server --port 9938      # TCP socket 服务器
je_auto_control start-rest   --port 9939      # REST API
je_auto_control version

--var name=value 会尽量以 JSON 解析(count=10 会变成整数),否则视为字符串。 run 只要有任何动作失败就以 1 退出(仍会跑完整份脚本),CI 步骤会随之失败。旧版 python -m je_auto_control -e file.json 入口仍然可用,它的 -e、-d 与 --execute_str 标志也同样在有动作失败时以 1 退出。由 TestPioneer 启动时(它会设置 TEST_PIONEER_ARTIFACT_DIR),以相对名称要求的 HTML、JSON、XML 报告会写到该目录底下。


服务器与集成

接口 启动方式 说明
MCP 服务器 je_auto_control_mcp(stdio)或 AC_start_mcp_http_server 757 个工具,供 Claude Desktop/Claude Code/自定义 tool loop 使用:完整的 ac_* 工具接口,以及常用 GUI 操作的短名称 alias。除了以 initialize 握手的各版协议,也支持无状态的 MCP 2026-07-28。Bearer 认证、TLS、审计日志、限流、插件热重载、CI 假后端。
REST API je_auto_control start-rest Bearer token、按 IP 限流与锁定、SQLite 审计 hook、/metrics、/openapi.json、/docs Swagger UI、/dashboard。
TCP socket 服务器 je_auto_control start-server 以换行分隔的 JSON 动作列表。默认绑定 127.0.0.1。
pytest 插件 安装后自动生效 提供 fixture 与供 pytest-bdd/behave 使用的 Gherkin step library。
语言服务器 python -m autocontrol_lsp.server 为 AC_* 动作 JSON 提供补全与诊断,命令清单直接取自运行期的命令表。
远程桌面 RemoteDesktopHost 或 GUI TCP、WebSocket 或 WebRTC;TOTP、信任列表、TURN 配置、文件/剪贴板/音频同步。

除非明确指定,所有服务器都绑定在 127.0.0.1。

包闸门。 AC_add_package_to_executor 与 AC_add_package_to_callback_executor 会导入 Python 包并把成员注册成命令,所以从上面任何一个入口送来的动作列表都可能加载 os 或 subprocess。没有被放行的包不会加载:不在允许清单上的包在导入前就被拒绝,该动作以 AutoControlExecuteActionException 失败。放行包(含子模块)的方式:在 Python 里调用 executor.allow_packages("name", …);对所有入口——两个 CLI、socket/REST/MCP 服务器与调度器——设置环境变量 JE_AUTOCONTROL_ALLOWED_PACKAGES(以逗号分隔的名称,进程启动时读取);或只对一次 CLI 执行使用 je_auto_control run script.json --allow-package NAME(可重复)。executor.set_allow_arbitrary_packages(True) 会对所有包打开闸门,也就是先前版本的默认行为(当时会发 DeprecationWarning)。这些都不是 AC_* 命令,所以动作列表不能自己打开闸门。

可选的加固设置。 下列各项在设置之前都是关闭的,没设置的服务器行为与先前相同。JE_AUTOCONTROL_RBAC_USERS=<用户文件> 让 REST API 与 MCP HTTP 传输把 bearer token 对应到用户,并按角色(viewer/operator/admin)授权每一个路由、工具与特权 AC_* 命令;此时共用 token 会被拒绝。JE_AUTOCONTROL_MCP_PATH_ROOTS(以操作系统的路径分隔符分开的目录)把每一个属于文件路径的 MCP 工具参数限制在这些目录里,JE_AUTOCONTROL_MCP_PATH_ROOTS_FROM_CLIENT=1 再加上 client 的 roots/list,JE_AUTOCONTROL_MCP_ENV_REF_ALLOW 限制 ac_resolve_ref 可以读哪些 env:// 名称。JE_AUTOCONTROL_ACTION_SIGNING_PUBLIC_KEY 让端点只能验证 Ed25519 签名的动作文件而不能签名(create_signing_keypair;私钥留在签名的机器上)。远程桌面的 viewer 只把 host 推来的文件写在 ~/Downloads/AutoControl 下面(JE_AUTOCONTROL_REMOTE_DOWNLOAD_DIR);这一项默认就是开的。

其他可设置的项目。 JE_AUTOCONTROL_MCP_TOOL_MODE=progressive(或 je_auto_control_mcp --tool-mode)让 MCP session 从五个核心工具开始,再搜索、查询与启用其他工具;static 提供固定的工具组(JE_AUTOCONTROL_MCP_TOOL_PROFILE);默认的 full 模式不变。RBAC 的用户以 je_auto_control users add|remove|set-role|rotate-token|list、AC_user_* 命令或 REST API 标签页管理。JE_AUTOCONTROL_ACTION_SIGNING_PASSPHRASE 用来解开有口令保护的签名私钥。动作日志(start_action_journal、AC_journal_*)记录执行过的动作并先遮蔽秘密,je_auto_control codegen --from-log 把一次执行转成候选脚本。配置同步把数据存在 SQLite 并检查版本(--config-db、AC_SIGNALING_CONFIG_DB;旧版 client 需要 --allow-blind-config-writes)。Android 与 iOS 设备各有自己的 session(open_device、AC_android_*、AC_ios_*);移动设备的代码还没有在任何设备上跑过。Wayland 上 probe_capabilities/AC_probe_capabilities 报告输入与捕获能做什么、为什么,JE_AUTOCONTROL_WAYLAND_EI_WORKER=1 把 libei 移到辅助进程。GUI 会把主题、字号、面板与窗口位置记在 ~/.je_auto_control/gui_settings.ini(JE_AUTOCONTROL_GUI_SETTINGS)。

远程桌面的线路协议

把主机开放出去之前值得先了解,而且这一段在其他文档里都没有写。默认传输是裸 TCP 上的长度前缀分帧(不需要额外依赖),连接一开始就是 HMAC-SHA256 的 challenge/response 握手:认证不通过的观看端在拿到任何一帧之前就会被断开。 JPEG 帧按配置的 FPS 与质量编码,再通过一个共享的最新帧槽发给已认证的观看 端——所以慢的观看端是丢帧,不会把其他人一起卡住。观看端发来的输入是 JSON, 会先比对动作允许列表才交给既有的输入包装层执行,观看端无法自己发明新的操作。

# 让别人连进来——启动一个主机,把 token 与 port 给对方
from je_auto_control import RemoteDesktopHost
host = RemoteDesktopHost(token="hunter2", bind="127.0.0.1",
                         port=0, fps=10, quality=70)
host.start()
print("listening on", host.port, "viewers:", host.connected_clients)
# 控制另一台机器——连上去并发送输入
from je_auto_control import RemoteDesktopViewer
viewer = RemoteDesktopViewer(host="10.0.0.5", port=51234, token="hunter2",
                             on_frame=lambda jpeg: ...)
viewer.connect()
viewer.send_input({"action": "mouse_move", "x": 100, "y": 200})
viewer.disconnect()

也可以用 IP 允许列表(CIDR 网段或具体地址)限制谁能连进来,列表外的对端在握手 阶段就会被拒绝:

RemoteDesktopHost(token="tok", ip_allowlist=["10.0.0.0/8", "192.168.1.100"])

平台支持

平台 后端 输入 屏幕捕获 录制 窗口管理
Windows 10 / 11 Win32 ctypes(可选 Interception 驱动) ✅ ✅ ✅ ✅
macOS 10.15+ pyobjc / Quartz ✅ ✅ ✅¹ ✅
Linux X11 python-Xlib(可选 uinput) ✅ ✅ ✅ ✅
Linux Wayland 经桌面 portal 的 libei,或 ydotool/wtype + 截图工具 ✅ ✅ ❌ ❌
FreeBSD/OpenBSD/NetBSD python-Xlib,与 Linux 同一套 X11 后端 ✅² ⚠️² ✅² ✅²
Android adb + uiautomator2 ✅ ✅ — —
iOS WebDriverAgent / facebook-wda ✅ ✅ — —

¹ macOS 的录制走 Quartz event tap,需要辅助功能权限 (系统设置 → 隐私与安全性 → 辅助功能)。没有授权时会直接抛出并指名 缺的是哪个权限,而不是安静地录到一个空的 session。

² BSD 直接跑同一套 X11 后端——同一个 X server、同一个 python-Xlib,而输入、 录制与窗口管理就只依赖这一个包。freebsd CI job 在真的 FreeBSD 14 上驱动真的 输入,再从 X server 读回来;OpenBSD 与 NetBSD 走同一条代码路径,只是没有 CI runner。唯一的例外是屏幕截取,卡住的是打包而不是平台:它走 Pillow/mss 与 OpenCV,而 opencv-python、pillow、cryptography 都没有发 FreeBSD wheel。 从 ports 构建之后,截取、图像匹配、OCR 与动作加密也都能用—— import je_auto_control 本身已经不需要它们任何一个。

Wayland 的输入在 libei 走不通时会退回 ydotool CLI,而这条退路需要 ydotool 1.0 以上。AutoControl 送的每一个参数都是那一版才有的;0.1.x (Debian bookworm 与目前所有 Ubuntu 仍以这个名字提供,Debian trixie 则根本没有) 对同一批参数返回 0 却不送出任何事件。AutoControl 会检测并直接拒绝, 而不是为根本没送出的输入回报成功。Arch、Fedora 与 Debian unstable 提供的是 1.0。

这条退路要能准确定位,还有一个前提:合成器的指针加速度必须是关的。 ydotool mousemove --absolute 并不发任何绝对事件——它先把光标推到合成器夹取的 那个角落,再发相对位移,所以这段位移会被合成器加速。对真的 wlroots session 量到的是: libinput 的默认 profile 让光标走的距离正好是请求的两倍。ydotool 自己的 --help 也是这样写的;AutoControl 每个进程会记一次警告,而不是安静地把点击放到错的地方。 请对 ydotoold 的设备关掉加速度(sway:input type:pointer accel_profile flat 加上 pointer_accel 0),或者装上 liboeffis,改走协议层本来就是绝对坐标的 libei。

倍率是合成器自己的设置,客户端读不回来,所以只有你知道它关了没有: JE_AUTOCONTROL_WAYLAND_POINTER_ACCEL=flat 表示已经关掉,移动就不再出声; =strict 则宁可拒绝这次移动,也不让点击落在别的地方;不设置就维持 “警告一次后照样移动”的默认。

Wayland 的屏幕截取需要合成器对应的工具,因为没有单一工具能覆盖全部:wlroots 系 (sway、Hyprland、river)用 grim,GNOME 用 gnome-screenshot,KDE 用 spectacle。 装好其中一个之后,所有截取路径——截图、图像与锚点定位、OCR、屏幕录制、远程桌面——都会 经由它。三个都没装也还有 gdbus:最后会尝试 xdg-desktop-portal,只是第一次可能会弹 同意对话框。再不行,截取会带着安装提示明确失败,而不是返回空白的 XWayland root; je_auto_control.api.run_diagnostics()(以及 GUI 的 Diagnostics 标签页)的 screen_capture 检查会报告当前使用的是哪一层。

有一件只在 Wayland 出现、需要事先规划的事:截取回来的图里可能有鼠标光标。 这里没有任何一条截取请求光标,但只要 backend 没有光标平面(包含任何以 WLR_NO_HARDWARE_CURSORS=1 运行的 session),wlroots 就会画软件光标并把它 合成进输出缓冲区,而截取交回来的正是那一份。Windows 与 X11 都不含光标,所以 “定位器、模板匹配或 OCR 在目标中间看到一个光标形状的洞”只会在这里发生。 Wayland 不让客户端读光标位置,所以没有东西可以可靠地遮或避开:请在截取之前 把指针移离要拍的区域。screen_capture 检查会以 cursor_may_be_captured 报告这件事。

如果以上都不适用你的环境,可以直接指定自己的命令——它优先于所有检测,{output} 会被 换成临时 PNG 路径:

export JE_AUTOCONTROL_WAYLAND_CAPTURE_COMMAND="mycapture --png {output}"

Wayland 禁止非特权客户端进行全局输入录制——若要录制,请设置 JE_AUTOCONTROL_LINUX_DISPLAY_SERVER=x11 并在 X11 会话下运行。窗口管理支持 Windows、macOS(pyobjc)与 X11(含 XWayland);纯 Wayland 会话的协议不让客户端看到其他程序的窗口, 所以 list_windows() 返回空列表,其余窗口操作一律抛出带原因的 AutoControlUnsupportedOperationException。对于会忽略合成输入的应用, 可选用驱动层后端(JE_AUTOCONTROL_WIN32_BACKEND=interception、 JE_AUTOCONTROL_LINUX_BACKEND=uinput、ViGEm 虚拟手柄);驱动未安装时会自动回退到原有行为。


配置

AutoControl 读取的每一个环境变量。这里没有任何一项是必填的:完全不设置时,AutoControl 会自行选择平台后端,服务器只绑定 127.0.0.1,所有需要主动开启的功能(签名强制、RBAC、USB 直通、工具路径限制)都是关闭的。配置参考(源文件)列出完整的可接受值,并把每个变量链接到说明该功能的页面;CI 会拿它以及下面的表格和代码比对。

平台后端

变量 默认 作用
JE_AUTOCONTROL_WIN32_BACKEND sendinput 设为 interception 时键盘与鼠标改走 Interception 驱动程序;找不到驱动或 DLL 时会警告并回退到 SendInput。
JE_AUTOCONTROL_LINUX_BACKEND x11 设为 uinput 时直接写入内核输入事件;/dev/uinput 无法写入时会警告并回退到 XTest。
JE_AUTOCONTROL_LINUX_DISPLAY_SERVER auto 决定加载哪一个 Linux 后端:auto 读取 XDG_SESSION_TYPE 与 WAYLAND_DISPLAY;wayland 或 x11 则强制指定(在 Wayland 会话设为 x11 只能操作 XWayland 窗口)。

Windows Interception 驱动程序

变量 默认 作用
JE_AUTOCONTROL_INTERCEPTION_DLL 未设置:先找 PATH,再找包旁边 interception.dll 的完整路径。
JE_AUTOCONTROL_INTERCEPTION_KEYBOARD 1 键盘事件要发往的 Interception 设备编号(1–10)。
JE_AUTOCONTROL_INTERCEPTION_MOUSE 11 鼠标事件要发往的 Interception 设备编号(11–20)。

Wayland

变量 默认 作用
JE_AUTOCONTROL_WAYLAND_INPUT_BACKEND auto 设为 cli 时通过 ydotool 发送输入,完全不向桌面 portal 提出请求。这是启动前就做好的选择:用户拒绝授权后,AutoControl 不会自行切换过去。
JE_AUTOCONTROL_WAYLAND_EI_WORKER 未设置 设为 1 时把 libei 会话放到辅助进程里运行,而不是放在本进程。
JE_AUTOCONTROL_WAYLAND_POINTER_ACCEL warn 只影响 ydotool 路径的绝对移动(那其实是会被合成器加速的相对位移):warn 警告一次后照样移动,flat 表示加速已关闭、不再警告,strict 直接拒绝移动。
JE_AUTOCONTROL_WAYLAND_CAPTURE_COMMAND 未设置 自定义的截图命令行,以 {output} 表示 PNG 的输出路径。优先于 grim、gnome-screenshot、spectacle 与 portal。
JE_AUTOCONTROL_WAYLAND_RECORD_DEVICES 未设置:一个都不读 PhysicalRecorder 可以读取的 /dev/input/event* 设备(以逗号分隔);物理输入录制必须逐一指定设备才会启用。

MCP 服务器

变量 默认 作用
JE_AUTOCONTROL_MCP_READONLY 未设置 设为 1 时只提供、也只能调用标记为只读的工具。
JE_AUTOCONTROL_MCP_TOOL_MODE full tools/list 要提供注册表的多少内容:full、progressive 或 static。未知的值会报错,不会被当成 full。
JE_AUTOCONTROL_MCP_TOOL_PROFILE 未设置 static 模式的工具清单:以逗号分隔的工具名称与 category:<名称>。
JE_AUTOCONTROL_MCP_ALIASES 1 设为 0 时不注册 ac_* 工具之外的简短别名(click、screenshot …)。
JE_AUTOCONTROL_MCP_TOKEN 未设置 HTTP 传输的 Bearer 令牌。启用 RBAC 之后不再接受。
JE_AUTOCONTROL_MCP_ALLOWED_ORIGINS 未设置:只接受本机来源 HTTP 传输额外接受的浏览器来源(以逗号分隔,须完全相符,例如 https://example.test:8443)。
JE_AUTOCONTROL_MCP_CONFIRM_DESTRUCTIVE 未设置 设为 1 时具破坏性的工具在执行前先向客户端请求确认(MCP elicitation)。
JE_AUTOCONTROL_MCP_PATH_ROOTS 未设置:不限制 工具的每一个文件参数都必须落在这些目录内(以操作系统的路径分隔符分隔)。
JE_AUTOCONTROL_MCP_PATH_ROOTS_FROM_CLIENT 未设置 设为 1 时同时接受 MCP 客户端通过 roots/list 报告的根目录。
JE_AUTOCONTROL_MCP_ENV_REF_ALLOW 未设置:不限制 ac_resolve_ref 可以读取的环境变量名称(以逗号分隔,可用 fnmatch 模式);设了却没有指名任何变量时,一个都不允许。
JE_AUTOCONTROL_MCP_AUDIT 未设置 JSON-lines 文件的路径,每一次 tools/call 写入一条记录。
JE_AUTOCONTROL_MCP_ERROR_SHOTS 未设置 工具每次失败时存放截图的目录。
JE_AUTOCONTROL_FAKE_BACKEND 未设置 设为 1 时 MCP 服务器只在内存中记录鼠标、键盘与剪贴板调用而不实际执行,供没有显示器的 CI 使用。

REST/RBAC 与 chat-ops

变量 默认 作用
JE_AUTOCONTROL_RBAC_USERS 未设置:沿用共享令牌 用户文件的路径。设置它就等于为 REST API 与 MCP HTTP 传输启用角色。
JE_AUTOCONTROL_CHATOPS_SCRIPT_ROOT 未设置:run 会被拒绝 chat-ops 的 run 命令唯一可以加载动作文件的目录。

执行与签署动作文件

变量 默认 作用
JE_AUTOCONTROL_ALLOWED_PACKAGES 未设置:一个都不允许 AC_add_package_to_executor 可以加载的包(以逗号分隔,含子模块),对所有入口生效。只在进程启动时读取一次。
JE_AUTOCONTROL_REQUIRE_SIGNED_ACTIONS 未设置 设为 1 时所有会执行动作文件的路径,都拒绝没有有效签名文件的动作文件。
JE_AUTOCONTROL_ACTION_SIGNING_PRIVATE_KEY 未设置 Ed25519 私钥(PEM)的路径。只在负责签署的机器上设置;设置后签署会写出第 2 版的签名文件。
JE_AUTOCONTROL_ACTION_SIGNING_PUBLIC_KEY 未设置 对应公钥的路径。在每一台执行端设置:它只能验证,不能签署。
JE_AUTOCONTROL_ACTION_SIGNING_PASSPHRASE 未设置 私钥创建时若设置了口令,在这里提供。
JE_AUTOCONTROL_ACCEPT_LEGACY_ACTION_SIGNATURES 未设置 设为 1 是迁移模式:设置公钥之后,第 2 版之前写出的 HMAC 签名文件会被拒绝,除非设置了这个变量。所有文件重新签署后请再关掉。

远程桌面与信令

变量 默认 作用
JE_AUTOCONTROL_REMOTE_DOWNLOAD_DIR ~/Downloads/AutoControl 远程桌面查看端存放主机传来文件的目录。收到的路径一律限制在这个目录内。
JE_AUTOCONTROL_USB_PASSTHROUGH 未设置 设为 1 时在远程桌面通道上启用 USB 直通指令。
AC_SIGNALING_SECRET 未设置 信令/配置同步服务器的共享密钥(X-Signaling-Secret)。服务器在没有 --shared-secret 时读取它,config_sync_run 在没有 secret 时也读取它。
AC_SIGNALING_CONFIG_DB ~/.je_auto_control/config_sync.sqlite3 信令服务器存放配置同步数据的 SQLite 文件。

GUI

变量 默认 作用
JE_AUTOCONTROL_GUI_SETTINGS ~/.je_auto_control/gui_settings.ini 主窗口保存主题、文字大小、导航面板与窗口位置的文件。设为 off、0、none、false 或空字符串时,不读也不写。

日志、数据与测试

变量 默认 作用
JE_AUTOCONTROL_LOG_FILE ~/.je_auto_control/logs/AutoControlGUI.log 日志文件写入的位置。指定空设备(/dev/null、NUL)即可关闭文件输出。在写入第一条记录时才读取,而不是在 import 时。
JE_AUTOCONTROL_ENV default 资产库当前使用的环境(active_environment()),让同一份脚本在 dev 与 prod 读到不同的值。
JE_AUTOCONTROL_REDACTION off 截图遮蔽的默认策略:off、moderate 或 strict。未知的名称会报错,不会被当成 off。
JE_AUTOCONTROL_PYTEST_ARTIFACTS ./autocontrol_screenshots 测试没有使用 autocontrol_screenshot_dir fixture 时,pytest 插件写入失败截图的目录。

文档与示例

资源 内容
examples/ 33 个自包含脚本:截图点击、OCR、调度器、远程桌面、agent loop、可观测性、录制、变量、热键、触发器、报表、MCP、REST、密钥、插件、computer use、Wayland、跨主机 DAG、chat-ops、pytest/BDD、锚点定位。
Read the Docs 完整 API 参考,含英文与中文。
architecture_explore.md 逐层记录每个模块的职责。
docs/CAPABILITY_MATRIX.md 能力 × 平台对照矩阵。
docs/API_LIFECYCLE.md 稳定 API 与弃用策略。
docs/updates/ 更新记录:各版本说明与完成的工作,每月一个文件(原 WHATS_NEW.md)。
CHANGELOG.md 兼容性变更记录。
SECURITY.md 安全策略与报告方式。

开发

git clone https://github.com/Integration-Automation/AutoControlGUI.git
cd AutoControl
pip install -r dev_requirements.txt
uv sync                 # 或:以已提交的 uv.lock 做可重现安装
python -m pytest test/unit_test/headless      # 无头单元测试
python -m pytest test/integrated_test/        # 跨模块流程测试

ruff check je_auto_control/
pylint je_auto_control/
bandit -c pyproject.toml -r je_auto_control/

python test/verify/typing_contract_verify.py            # mypy,整个包,三个目标平台
python test/verify/typing_contract_verify.py --extras   # 同一项检查,改用真正的 PySide6/aiortc 类型
python -m sphinx -b html -W docs/source docs/_build/html  # 文档,警告视为错误

欢迎贡献——请见 CONTRIBUTING.md 与 CODE_OF_CONDUCT.md。CI 会强制两条规则:import je_auto_control 绝不能加载 PySide6;每个功能都必须同时具备无头 API 与 GUI 界面。


许可

MIT License © JE-Chen。 内含与可选第三方组件的许可请见 Third_Party_License.md。