Skip to content

Latest commit

 

History

History
540 lines (415 loc) · 34.9 KB

README_zh-TW.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 session 下執行。視窗管理支援 Windows、macOS(pyobjc)與 X11(含 XWayland);純 Wayland session 的協定不讓用戶端看到別的程式的視窗, 所以 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。