新功能 (2026-06-19) — 交易式工作佇列

把 AutoControl 從「跑一支腳本」升級成「跑一個機器人」。以 SQLite 為底的 工作佇列實作了標準生產級 RPA 的 dispatcher/performer 模式:dispatcher 把工作項目入列,*performer* 一次處理一項,具備每項狀態、去重與重試—— 因此處理上千項的執行能在**當機後續跑**,並可由多個 worker 平行處理。

純標準庫、完全 headless,走完整五層(facade、AC_* 執行器指令、 MCP 工具、Script Builder)。由競品研究指出為相對 UiPath Orchestrator 佇列 / REFramework 所缺的一塊。

Dispatcher / performer

from je_auto_control import WorkQueue

q = WorkQueue("run.db", name="invoices")

# Dispatcher:把工作入列(依 live reference 去重)。
for inv in invoices:
    q.add({"path": inv}, reference=inv)

# Performer:把佇列處理完,可跨重啟續跑。
item = q.get_next()
while item is not None:
    try:
        process(item.data)
        q.complete(item.id, output={"ok": True})
    except BusinessError as exc:           # 資料有問題——不重試
        q.fail(item.id, str(exc), kind="business")
    except Exception as exc:               # 暫時性——重試
        q.fail(item.id, str(exc), kind="application")
    item = q.get_next()

get_next 會原子性地認領最舊的 new 項目(標為 in_progress), 因此多個 performer 不會重複處理。

失敗語意

兩種失敗類型,對應 REFramework:

  • **application**(暫時性——逾時、stale element):重試至 max_retries (預設 3)次,然後標為 failed

  • **business**(資料本身無效):永不重試——立即標為 failed。請丟出 BusinessError 或傳 kind="business"

stats() 回傳各狀態計數(new / in_progress / success / failed),供儀表板與執行報告使用。

執行器指令

  • AC_queue_add — 入列 data``(依 ``reference 去重)。

  • AC_queue_next — 認領下一項(排空時回 null)。

  • AC_queue_complete — 標記項目成功。

  • AC_queue_fail — 以 kind``(``application / business)失敗。

  • AC_queue_stats — 各狀態計數。

同一個 db 檔 + name 識別一個佇列,因此 dispatcher 腳本與 performer 腳本(或多個平行 performer)可共用它。