权限请求
默认行为(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
Prompt 上下文(promptRequest)
在较新的 CLI 运行时中,$invocation['promptRequest'] 可能包含面向用户的 prompt 上下文。
在自定义处理器中,可以根据该值判断是否需要人工响应。
当以下条件全部满足时,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 请求,而是作为会话事件(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 仓库。