Passer au contenu principal

Demandes de permission

Comportement par défaut (deny-all)

Lorsque permission_approve dans config/copilot.php vaut "deny-all" (par défaut), les demandes de permission émises depuis Copilot::run() ou Copilot::start() sont automatiquement refusées. Comme les usages orientés génération de texte ne nécessitent souvent pas de permission, c’est une valeur par défaut sûre.
// config/copilot.php
'permission_approve' => env('COPILOT_PERMISSION_APPROVE', 'deny-all'),

Valeurs configurables

ValeurComportement
"deny-all"Tout est refusé automatiquement (défaut)
"approve-safety"Seuls shell et write sont refusés, tout le reste est approuvé automatiquement
"approve-all"Tout est approuvé automatiquement
falseAucun gestionnaire. onPermissionRequest est obligatoire (identique au SDK officiel)
// .env
COPILOT_PERMISSION_APPROVE="approve-safety"
Lorsque vous acceptez des prompts saisis par l’utilisateur, "approve-safety" et "approve-all" sont dangereux. Utilisez impérativement false ou "deny-all". Même avec des permissions en lecture seule, le code du projet Laravel peut être lu.

PermissionHandler::approveAll()

PermissionHandler::approveAll() approuve automatiquement toutes les demandes.
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Support\PermissionHandler;
use Revolution\Copilot\Types\SessionConfig;

$config = new SessionConfig(
    onPermissionRequest: PermissionHandler::approveAll(),
);

$response = Copilot::run(prompt: 'Hello', config: $config);

PermissionHandler::approveSafety()

PermissionHandler::approveSafety() refuse uniquement les permissions à haut risque (shell, write) et approuve automatiquement le reste.
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Support\PermissionHandler;
use Revolution\Copilot\Types\SessionConfig;

$config = new SessionConfig(
    onPermissionRequest: PermissionHandler::approveSafety(),
);

$response = Copilot::run(prompt: 'Hello', config: $config);
Ce n’est pas totalement sûr pour autant. Pour un contrôle strict, implémentez un gestionnaire personnalisé qui se base sur $request['kind'].

PermissionHandler::denyAll()

PermissionHandler::denyAll() refuse tout.
use Revolution\Copilot\Support\PermissionHandler;
use Revolution\Copilot\Types\SessionConfig;

$config = new SessionConfig(
    onPermissionRequest: PermissionHandler::denyAll(),
);

Utilisation directe du Client

Si vous utilisez CopilotClient directement, onPermissionRequest est obligatoire, comme dans le SDK officiel.
use Revolution\Copilot\Client;
use Revolution\Copilot\Support\PermissionHandler;

$client = new Client([
    'cli_path' => 'copilot',
    'cli_args' => [],
    'cwd' => base_path(),
    'log_level' => 'info',
    'env' => null,
]);
$client->start();

// onPermissionRequest est obligatoire
$session = $client->createSession([
    'onPermissionRequest' => PermissionHandler::approveSafety(),
]);

// Si omis, InvalidArgumentException est levée
// $session = $client->createSession([]); // Error!

Gestionnaire personnalisé

Pour contrôler l’approbation par type de requête, passez une closure. $request et $invocation sont des tableaux comme suit.
use Illuminate\Support\Facades\Artisan;
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Support\PermissionRequestResultKind;
use Revolution\Copilot\Types\SessionConfig;

use function Laravel\Prompts\{confirm, note, spin, text};

Artisan::command('copilot:chat', function () {
    $config = new SessionConfig(
        onPermissionRequest: function (array $request, array $invocation) {
            $confirm = confirm(
                label: 'Do you accept the requested permissions?',
            );
            if ($confirm) {
                return PermissionRequestResultKind::approveOnce();
            } else {
                return PermissionRequestResultKind::reject();
            }
        },
    );

    Copilot::start(function (CopilotSession $session) use ($config) {
        while (true) {
            $prompt = text(
                label: 'Enter your prompt',
                placeholder: 'Ask me anything...',
                required: true,
                hint: 'Ctrl+C to exit',
            );

            $response = spin(
                callback: fn () => $session->sendAndWait($prompt),
                message: 'Waiting for Copilot response...',
            );

            note($response->content());
        }
    }, config: $config);
});

$request

Les champs autres que kind et toolCallId varient selon kind.
kind: "shell" | "write" | "mcp" | "read" | "url" | "custom-tool" | "memory" | "hook"
[
  "kind" => "shell",
  "toolCallId" => "toolu_...",
  "fullCommandText" => "...",
  "intention" => "Run copilot:ping to test permission request",
  "commands" => [
    [
      "identifier" => "bash",
      "readOnly" => false,
    ]
  ]
  "possiblePaths" => [],
  "possibleUrls" => [],
  "hasWriteFileRedirection" => false,
  "canOfferSessionApproval" => false,
]

$invocation

[
  "sessionId" => "...",
]

Réponse

Le résultat de la décision est renvoyé sous forme de tableau. La classe PermissionRequestResultKind la rend plus lisible.
return PermissionRequestResultKind::approveOnce();
return PermissionRequestResultKind::reject();

Détails du protocole

Dans le Protocol v3 (défaut actuel), la demande de permission n’est pas une requête JSON-RPC mais un événement de session (permission.requested). Le SDK le traite en interne et répond via le RPC session.permissions.handlePendingPermissionRequest. L’usage de SessionConfig ne change pas. Si vous fournissez un gestionnaire à onPermissionRequest, le SDK absorbe les différences de protocole.

PermissionRequestResultKind

Vous pouvez renvoyer directement ['kind' => 'approve-once'], mais PermissionRequestResultKind rend le code plus clair.
use Revolution\Copilot\Support\PermissionRequestResultKind;

$confirm = confirm(
    label: 'Do you accept the requested permissions?',
);

if ($confirm) {
    return PermissionRequestResultKind::approveOnce();
} else {
    return PermissionRequestResultKind::reject();
}

Méthodes disponibles

MéthodeValeurDescription
approveOnce()approve-onceAutorise uniquement la requête courante
approveForSession()approve-for-sessionAutorise toutes les requêtes du même type pendant cette session
approveForLocation()approve-for-locationAutorise toutes les requêtes du même type depuis cet emplacement (chemin, etc.)
reject()rejectRefuse la requête
userNotAvailable()user-not-availableUtilisateur indisponible (environnement non interactif, etc.)
noResult()no-resultLe gestionnaire ne peut pas renvoyer de résultat (ignore l’appel RPC)
Pour utiliser Laravel\Prompts\select, PermissionRequestResultKind::select() fournit les options.
use Revolution\Copilot\Support\PermissionRequestResultKind;
use function Laravel\Prompts\select;

$select = select(
    label: 'Do you accept the requested permissions?',
    options: PermissionRequestResultKind::select(),
);

return ['kind' => $select];

no-result

Si le gestionnaire ne peut pas renvoyer de résultat (par ex. en environnement non interactif), utilisez no-result. Renvoyer no-result ignore l’appel RPC et applique le refus par défaut côté Copilot CLI.
return PermissionRequestResultKind::noResult();
// ou ['kind' => 'no-result']
Pour les dernières informations, consultez le dépôt GitHub.
Dernière modification le 13 juillet 2026