権限リクエスト
デフォルト動作(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 の指定が 必須 です。
カスタムハンドラ
リクエスト種別ごとに許可・拒否を制御するにはクロージャを渡します。$request と $invocation は以下のような配列です。
$request
kind と toolCallId 以外のフィールドは kind によって変わります。
$request['managedApprovalRequired'] が true の場合、組織の Managed Settings によってこのリクエストは自動承認できません。
PermissionHandler::approveAll() はこの場合 no-result を返し、Copilot CLI 側の標準フローに委ねます。
$invocation
プロンプトコンテキスト(promptRequest)
新しいCLIランタイムでは、$invocation['promptRequest'] にユーザー向けプロンプトのコンテキストが含まれることがあります。
カスタムハンドラでは、この値を見て人間の応答が必要かどうかを判断できます。
PermissionHandler::approveAll() は次の条件をすべて満たす場合、promptRequest['managedApprovalRequired'] を優先します。
promptRequest['kind']がcommands/read/write/url/workflowのいずれかpromptRequest['managedApprovalRequired']が boolean
$request['managedApprovalRequired'] がポリシー由来のマーカーとして残っていても、プロンプト上で人間の応答が不要なら自動承認できます。
$request の生のマーカーは引き続き保持されます。
promptRequest がない古いCLI、未対応の種類、または有効な boolean 値がない場合は、従来どおり $request['managedApprovalRequired'] で判断します。
Response
権限判定結果は配列で返します。PermissionRequestResultKind クラスを使うと読みやすくなります。
プロトコル詳細
Protocol v3(現在のデフォルト)では、権限リクエストは JSON-RPC リクエストではなくセッションイベント(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 リポジトリ を参照してください。