> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Permission requests

> Beheer permission requests in de Laravel Copilot SDK met standaardwaarden, ingebouwde handlers en custom goedkeuringscallbacks.

## Permission requests

## Standaardgedrag (`deny-all`)

Als `permission_approve` in `config/copilot.php` op `"deny-all"` (de standaard) staat, worden permission requests bij `Copilot::run()` en `Copilot::start()` automatisch **geweigerd**.

Voor toepassingen die vooral tekst genereren zijn permissies vaak niet nodig, dus dit is een veilige standaard.

```php theme={null}
// config/copilot.php
'permission_approve' => env('COPILOT_PERMISSION_APPROVE', 'deny-all'),
```

## Mogelijke waarden

| Waarde             | Gedrag                                                                       |
| ------------------ | ---------------------------------------------------------------------------- |
| `"deny-all"`       | Alles automatisch weigeren (**standaard**)                                   |
| `"approve-safety"` | Alleen `shell` en `write` weigeren, de rest automatisch toestaan             |
| `"approve-all"`    | Alles automatisch toestaan                                                   |
| `false`            | Geen handler. `onPermissionRequest` is verplicht (zoals in de officiële SDK) |

```php theme={null}
// .env
COPILOT_PERMISSION_APPROVE="approve-safety"
```

<Warning>
  Als je prompts van gebruikers accepteert, zijn `"approve-safety"` en `"approve-all"` gevaarlijk.
  Gebruik dan altijd `false` of `"deny-all"`.
  Zelfs met read-only permissies kan de code van je Laravel-project worden gelezen.
</Warning>

## `PermissionHandler::approveAll()`

`PermissionHandler::approveAll()` staat alle requests automatisch toe.

```php theme={null}
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()` weigert alleen permissies met een hoog risico (`shell`, `write`) en staat de rest automatisch toe.

```php theme={null}
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);
```

Ook dit is niet gegarandeerd volledig veilig.
Wil je strikte controle, implementeer dan een custom handler en beoordeel op basis van `$request['kind']`.

## `PermissionHandler::denyAll()`

`PermissionHandler::denyAll()` weigert alles.

```php theme={null}
use Revolution\Copilot\Support\PermissionHandler;
use Revolution\Copilot\Types\SessionConfig;

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

## De Client direct gebruiken

Als je `CopilotClient` direct gebruikt, is het opgeven van `onPermissionRequest` **verplicht**, net als in de officiële SDK.

```php theme={null}
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 is verplicht
$session = $client->createSession([
    'onPermissionRequest' => PermissionHandler::approveSafety(),
]);

// Weglaten geeft een InvalidArgumentException
// $session = $client->createSession([]); // Error!
```

## Custom handler

Geef een closure door om toestaan of weigeren per requesttype te bepalen.
`$request` en `$invocation` zijn arrays zoals hieronder.

```php theme={null}
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`

De velden buiten `kind` en `toolCallId` verschillen afhankelijk van `kind`.

```text theme={null}
kind: "shell" | "write" | "mcp" | "read" | "url" | "custom-tool" | "memory" | "hook"
```

```php theme={null}
[
  "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`

```php theme={null}
[
  "sessionId" => "...",
]
```

## Response

Het resultaat van de permissiebeslissing retourneer je als array.
Met de klasse `PermissionRequestResultKind` wordt dit beter leesbaar.

```php theme={null}
return PermissionRequestResultKind::approveOnce();
return PermissionRequestResultKind::reject();
```

## Protocoldetails

In Protocol v3 (de huidige standaard) worden permission requests niet als JSON-RPC-requests maar als session-events (`permission.requested`) afgeleverd.
De SDK verwerkt dit intern en antwoordt via de RPC `session.permissions.handlePendingPermissionRequest`.

**Het gebruik van `SessionConfig` verandert niet.**
Als je een handler doorgeeft aan `onPermissionRequest`, vangt de SDK de protocolverschillen op.

## PermissionRequestResultKind

Je kunt ook direct de vorm `['kind' => 'approve-once']` retourneren, maar met `PermissionRequestResultKind` wordt het duidelijker.

```php theme={null}
use Revolution\Copilot\Support\PermissionRequestResultKind;

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

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

### Beschikbare methodes

| Methode                | Waarde                 | Beschrijving                                                              |
| ---------------------- | ---------------------- | ------------------------------------------------------------------------- |
| `approveOnce()`        | `approve-once`         | Alleen deze request toestaan                                              |
| `approveForSession()`  | `approve-for-session`  | Alle soortgelijke requests tijdens deze session toestaan                  |
| `approveForLocation()` | `approve-for-location` | Alle soortgelijke requests vanaf deze locatie (bestandspad e.d.) toestaan |
| `reject()`             | `reject`               | De request weigeren                                                       |
| `userNotAvailable()`   | `user-not-available`   | De gebruiker kan niet reageren (bijv. in een niet-interactieve omgeving)  |
| `noResult()`           | `no-result`            | De handler kan geen resultaat geven (de RPC-aanroep wordt overgeslagen)   |

Wil je `Laravel\Prompts\select` gebruiken, dan kun je de opties ophalen met `PermissionRequestResultKind::select()`.

```php theme={null}
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

Als de handler geen resultaat kan geven (bijvoorbeeld in een niet-interactieve omgeving), kun je `no-result` retourneren.
Bij `no-result` wordt de RPC-aanroep overgeslagen en geldt de standaardweigering aan de kant van de Copilot CLI.

```php theme={null}
return PermissionRequestResultKind::noResult();
// of ['kind' => 'no-result']
```

<Info>
  Raadpleeg de [GitHub-repository](https://github.com/invokable/laravel-copilot-sdk) voor de meest actuele informatie.
</Info>


## Related topics

- [Streaming events](/nl/packages/laravel-copilot-sdk/streaming-events.md)
- [Aan de slag - GitHub Copilot SDK voor Laravel](/nl/packages/laravel-copilot-sdk/getting-started.md)
- [Socialite - Laravel Bluesky](/nl/packages/laravel-bluesky/socialite.md)
- [Laravel Pint](/nl/pint.md)
- [Session hooks](/nl/packages/laravel-copilot-sdk/hooks.md)
