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

# Contexte de session et filtrage

> Découvrez comment inspecter et filtrer les sessions avec SessionContext et SessionListFilter de Laravel Copilot SDK, à partir du répertoire de travail et des informations Git.

## Contexte de session et filtrage

À partir de la version 0.1.24 du GitHub Copilot SDK, un contexte incluant le répertoire de travail et les infos Git a été ajouté aux sessions, ce qui permet de filtrer la liste des sessions.

## SessionContext

`SessionContext` conserve le répertoire de travail et les informations du dépôt Git au moment de la création de la session.

### Propriétés

* `cwd` (`string`) : chemin absolu du répertoire de travail
* `gitRoot` (`?string`) : répertoire racine du dépôt Git (`null` en dehors d'un dépôt Git)
* `repository` (`?string`) : dépôt GitHub (format `owner/repo`, ex. `invokable/laravel-copilot-sdk`)
* `branch` (`?string`) : nom de la branche Git courante

### Exemple d'utilisation

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

// Récupérer la liste des sessions
$sessions = Copilot::client()->listSessions();

foreach ($sessions as $metadata) {
    echo "Session: {$metadata->sessionId}\n";

    if ($metadata->context !== null) {
        echo "  Répertoire de travail : {$metadata->context->cwd}\n";

        if ($metadata->context->repository !== null) {
            echo "  Dépôt : {$metadata->context->repository}\n";
            echo "  Branche : {$metadata->context->branch}\n";
        }
    }
}
```

## SessionListFilter

`SessionListFilter` vous permet de ne récupérer que les sessions d'un répertoire de travail ou d'un dépôt spécifique.

### Propriétés

* `cwd` (`?string`) : filtre par correspondance exacte de répertoire de travail
* `gitRoot` (`?string`) : filtre par racine Git
* `repository` (`?string`) : filtre par dépôt (format `owner/repo`)
* `branch` (`?string`) : filtre par nom de branche

### Exemples

#### Filtre en tableau

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

// Récupérer uniquement les sessions d'un dépôt donné
$sessions = Copilot::client()->listSessions([
    'repository' => 'invokable/laravel-copilot-sdk',
]);

// Récupérer les sessions travaillant sur une branche donnée
$sessions = Copilot::client()->listSessions([
    'repository' => 'owner/repo',
    'branch' => 'feature/new-feature',
]);

// Récupérer les sessions d'un répertoire de travail donné
$sessions = Copilot::client()->listSessions([
    'cwd' => '/home/user/projects/my-app',
]);
```

#### Utiliser la classe SessionListFilter

```php theme={null}
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionListFilter;

$filter = new SessionListFilter(
    repository: 'owner/repo',
    branch: 'main',
);

$sessions = Copilot::client()->listSessions($filter);
```

## Événement `session.context_changed`

Lorsque le répertoire de travail change en cours de session, l'événement `session.context_changed` est émis.

### Type d'événement

```php theme={null}
use Revolution\Copilot\Enums\SessionEventType;

SessionEventType::SESSION_CONTEXT_CHANGED; // 'session.context_changed'
```

### Données d'événement

Les données de l'événement contiennent le contexte mis à jour.

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

Copilot::start(function ($session) {
    $session->on(function ($event) {
        if ($event->type === 'session.context_changed') {
            $data = $event->data;

            echo "Le répertoire de travail a changé\n";
            echo "  cwd: {$data['cwd']}\n";
            echo "  repository: {$data['repository']}\n";
            echo "  branch: {$data['branch']}\n";
        }
    });

    $response = $session->sendAndWait(
        prompt: 'Change to a different directory and list files',
    );
});
```

## SessionMetadata

Une propriété `context` a été ajoutée à `SessionMetadata`.

### Nouvelle propriété

* `context` (`?SessionContext`) : répertoire de travail et informations Git de la session

### Exemple

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

$sessions = Copilot::client()->listSessions();

foreach ($sessions as $metadata) {
    echo "Session ID: {$metadata->sessionId}\n";
    echo "Heure de début : {$metadata->startTime}\n";

    // context est optionnel, une vérification null est nécessaire
    if ($metadata->context !== null) {
        echo "Contexte:\n";
        echo "  Répertoire de travail : {$metadata->context->cwd}\n";

        if ($metadata->context->repository !== null) {
            echo "  Dépôt : {$metadata->context->repository}\n";
        }

        if ($metadata->context->branch !== null) {
            echo "  Branche : {$metadata->context->branch}\n";
        }
    }

    echo "\n";
}
```

## Exemples pratiques

### Récupérer les sessions d'un projet précis

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

// Uniquement les sessions du projet Laravel Copilot SDK
$sessions = Copilot::client()->listSessions([
    'repository' => 'invokable/laravel-copilot-sdk',
]);

// Afficher les sessions en cours
foreach ($sessions as $metadata) {
    echo "{$metadata->sessionId}: {$metadata->summary}\n";
    echo "  Branche : {$metadata->context->branch}\n";
}
```

### Gérer les sessions d'une branche de fonctionnalité

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

$sessions = Copilot::client()->listSessions();

$featureSessions = array_filter($sessions, function ($metadata) {
    return $metadata->context !== null
        && str_starts_with($metadata->context->branch ?? '', 'feature/');
});

// Regrouper les sessions par branche de fonctionnalité
$byBranch = [];
foreach ($featureSessions as $metadata) {
    $branch = $metadata->context->branch;
    $byBranch[$branch][] = $metadata;
}

foreach ($byBranch as $branch => $sessions) {
    echo "{$branch}: " . count($sessions) . " sessions\n";
}
```

### Organiser les sessions par répertoire de travail

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

$sessions = Copilot::client()->listSessions();

// Regrouper par répertoire de travail
$byCwd = [];
foreach ($sessions as $metadata) {
    if ($metadata->context !== null) {
        $cwd = $metadata->context->cwd;
        $byCwd[$cwd][] = $metadata;
    }
}

// Afficher le nombre de sessions par répertoire
foreach ($byCwd as $cwd => $sessions) {
    echo "{$cwd}: " . count($sessions) . " sessions\n";
}
```

## Points d'attention

* `context` ne contient les infos Git (`gitRoot`, `repository`, `branch`) que pour les sessions créées dans un dépôt Git.
* Le champ `context` est disponible à partir du Copilot CLI v0.0.409. Les versions antérieures renvoient `null`.
* Le filtrage fonctionne par correspondance exacte. Les correspondances partielles et les wildcards ne sont pas pris en charge.
* Tous les champs de `SessionListFilter` sont optionnels. Sans filtre, toutes les sessions sont renvoyées.

<Info>
  Pour les dernières informations, consultez le [dépôt GitHub](https://github.com/invokable/laravel-copilot-sdk).
</Info>


## Related topics

- [Hooks de session](/fr/packages/laravel-copilot-sdk/hooks.md)
- [Cloud Sessions](/fr/packages/laravel-copilot-sdk/cloud-sessions.md)
- [Reprise de session](/fr/packages/laravel-copilot-sdk/resume.md)
- [Déploiement](/fr/deployment.md)
- [laravel/agent-skills — la collection officielle de skills d'agents IA Laravel](/fr/blog/agent-skills-introduction.md)
