pending_approval 裁決時,代理的工具呼叫會被
保留而非被派發——它現在在等待一個人類。本頁是給審查者的:如何
從主控台批准代理工具呼叫保留(或拒絕它們)、佇列向你顯示什麼,
以及 OrcaRouter 如何防止兩位審查者在同一個決定上相撞。
這是人工介入的解決那一半。關於一個呼叫為何被保留,以及被保留的
代理之後如何重新提交,參見
裁決與更深入的
審批參考。要從你自己的系統而非
主控台解決,參見審批 webhook。
1. 被保留呼叫的生命週期,從一位審查者的位置
一個被保留的呼叫是一個短暫的頻道外迴圈。你的工作是中間那一步:呼叫被保留
一條規則解析為
pending_approval。中繼傳回 HTTP 400,帶有
代碼 firewall_approval_pending 與一個審批 id;該呼叫永遠不抵達
工具。代理開始輪詢那個 id。解決一個保留把關到 Developer+——與防火牆 Events 動態相同的閘門。
較低的角色可以讀取防火牆政策、設定與 discovered tools,但只有
Developer 及以上的角色能列出審批佇列或批准/拒絕一個被保留的工具
呼叫。參見角色與範圍。
2. 列出待處理佇列
Approvals 分頁讀取GET /api/workspace/firewall/approvals。沒有篩選時,
它傳回 pending 佇列,最舊在前——所以等待最久的呼叫坐在頂端,
而你依序處理積壓。
state 是那個重要的篩選。各值對應到審批的生命週期:
state | 傳回的審批 |
|---|---|
pending (預設) | 已保留,等待一個決定——你的工作佇列。 |
approved | 已讓通過。 |
rejected | 已封鎖。 |
3. 讀取呼叫為何被保留
每一列攜帶一位審查者需要的決策輸入——工具名稱(tool_name)、
一個引數指紋(args_hash,正規化後呼叫引數的 SHA-256——原始
引數值不儲存在審批中)、請求 id,以及一行指名觸發的政策、規則
與子句的白話來源行:
policy_name — 哪個政策保留了它
policy_name — 哪個政策保留了它
匹配到的規則所屬的命名政策,以工作區範圍解析,所以一個過時的 id
絕不會浮現另一個租戶的政策名稱。
rule_label + matched_clause — 人類原因
rule_label + matched_clause — 人類原因
規則的標籤與一行「為何」描述符——例如
command contains rm -rf,
或對一個僅 glob 的規則為 tool matches "http_fetch"。這渲染佇列中
的「Held because…」那一行。rule_changed — 你可以信任的來源
rule_changed — 你可以信任的來源
當匹配到的規則在這個審批被建立時或之後被編輯時為
true。
即時的標籤與子句接著會被抑制(它們可能不再反映實際保留了該呼叫
的東西),而佇列會改顯示一個「rule since changed」備註而非過時的
來源。工具名稱與引數——真正的決策輸入——總是會被顯示。4. 批准或拒絕
解決會發送PATCH /api/workspace/firewall/approvals/:id,帶有一個
approved 或 rejected 的 decision 與一個可選的 reason。當你
點擊按鈕時主控台會為你做這個;其形狀是:
approved→ 被保留的呼叫可以繼續。代理的下一次重新提交,攜帶 那個一次性的審批標頭,會被讓通過一次。rejected→ 該呼叫保持被封鎖。代理看見該拒絕並能挑選另一條 路徑、詢問使用者,或停止。
decision 會對照封閉的 {approved, rejected} 集合驗證——任何其他
東西都會被拒絕。reason 會與決定一起被記錄,並與行為者、工具名稱
與請求 id 一起寫入防火牆稽核記錄。
每一次解決都會寫入一筆工作區稽核列,指名誰決定、決定為何,以及
原因。主控台解決記錄人類行為者;
webhook 解決記錄一個
系統行為者。解決來源絕不會被靜默丟棄。
5. 先寫者勝出:沒有重複解決
一個待處理的審批可能被競爭——主控台中的兩位審查者,或一次主控台 點擊與一個webhook 回呼 同時抵達。OrcaRouter 以一個單一的先寫者勝出規則解決這個:- 該決定是一個原子性的條件式更新,只在審批仍是
pending時觸發。 第一個寫者勝出並套用該決定。 - 每個稍後的寫者觀察到「已解決」,並被當作一個冪等的 no-op——它 得到 HTTP 200 與已解決的文件,而非一個錯誤。
resolved: true 意味著你的呼叫套用了該決定;already_resolved: true 意味著有某人(或某個 webhook)先到那裡了,而你看見的是他們的
結果。無論哪種方式,佇列都調和到一個一致的狀態。
6. 一次具體地走過佇列
一個 balanced 自主的工作區因為一條規則匹配command contains rm -rf
而保留一個代理的 shell.exec 呼叫。作為審查者,你:
- 開啟 Approvals——被保留的
shell.exec坐在最舊在前的pending清單頂端。 - 讀取該列:工具
shell.exec、args_hash指紋、請求 id,以及 「Held because…command contains rm -rf」那一行(從匹配到的規則 子句渲染)。沒有rule_changed旗標,所以來源是當前的。 - 目標是一個暫存目錄,所以你帶著一個原因批准。
- 你的
PATCH傳回resolved: true;代理的下一次輪詢看見approved、帶著它的一次性標頭重新提交,而該指令正好執行一次。
already_resolved: true——沒有傷害、沒有重複執行。
接下來去哪裡
審批參考
完整的 HITL 迴圈:保留、輪詢、重新提交,以及一次性標頭。
審批 webhook
用一個 HMAC 簽署的回呼從你自己的系統解決保留。
裁決
pending_approval 在六個防火牆裁決中坐落的位置。
事件記錄
在動態中確認一個已解決呼叫的下游結果。
