Passer au contenu principal

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

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

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

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

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.
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

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

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é

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

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.
Pour les dernières informations, consultez le dépôt GitHub.
Dernière modification le 13 juillet 2026