權限請求
預設行為(deny-all)
當 config/copilot.php 的 permission_approve 為 "deny-all"(預設)時,Copilot::run() 與 Copilot::start() 中的權限請求會自動 拒絕。
以文字生成為主的用途通常不需要權限,因此這是一個安全的預設值。
可設定的值
PermissionHandler::approveAll()
PermissionHandler::approveAll() 會自動核准所有請求。
PermissionHandler::approveSafety()
PermissionHandler::approveSafety() 僅拒絕高風險權限(shell, write),其他自動核准。
$request['kind'] 進行判斷。
PermissionHandler::denyAll()
PermissionHandler::denyAll() 拒絕所有請求。
直接使用 Client 時
若直接使用CopilotClient,與官方 SDK 一樣,必須 指定 onPermissionRequest。
自訂處理器
若要依請求類型個別控制核准或拒絕,請傳入 closure。$request 與 $invocation 是如下的陣列。
$request
除了 kind 與 toolCallId 之外的欄位會隨 kind 而變化。
$request['managedApprovalRequired'] 為 true 時,表示依組織的 Managed Settings,此請求無法自動核准。
此時 PermissionHandler::approveAll() 會回傳 no-result,交由 Copilot CLI 端的標準流程處理。
$invocation
Prompt 脈絡(promptRequest)
在較新的 CLI 執行期中,$invocation['promptRequest'] 可能包含面向使用者的 prompt 脈絡。
自訂 handler 可依此值判斷是否需要人工回應。
當以下條件全部符合時,PermissionHandler::approveAll() 會優先採用 promptRequest['managedApprovalRequired']。
promptRequest['kind']為commands/read/write/url/workflow其中之一promptRequest['managedApprovalRequired']為 boolean
$request['managedApprovalRequired'] 仍保留為來自政策的標記,只要 prompt 上不需要人工回應,即可自動核准。
$request 中的原始標記仍會保留。
若為沒有 promptRequest 的舊版 CLI、不支援的類型,或沒有有效的 boolean 值,則與以往相同,依 $request['managedApprovalRequired'] 判斷。
Response
權限判斷結果以陣列回傳。 使用PermissionRequestResultKind 類別可讓程式碼更易讀。
協定細節
在 Protocol v3(目前的預設)中,權限請求並非以 JSON-RPC 請求形式,而是以 Session Event(permission.requested)形式傳遞。
SDK 會在內部處理此事件,並透過 session.permissions.handlePendingPermissionRequest RPC 回應。
SessionConfig 的使用方式並未改變。
只要在 onPermissionRequest 傳入處理器,協定差異即由 SDK 吸收處理。
PermissionRequestResultKind
雖然也可以直接回傳['kind' => 'approve-once'] 這樣的格式,但使用 PermissionRequestResultKind 會更清楚。
可用方法
若想使用
Laravel\Prompts\select,可透過 PermissionRequestResultKind::select() 取得選項清單。
no-result
當處理器無法傳回結果時(例如非互動式環境),可回傳no-result。
回傳 no-result 會略過 RPC 呼叫,並套用 Copilot CLI 端的預設拒絕行為。
最新資訊請參閱 GitHub 儲存庫。