Vai al contenuto principale

Contesto e filtraggio della sessione

Da GitHub Copilot SDK v0.1.24 è stato aggiunto un contesto che include working directory e informazioni Git nella sessione, ed è ora possibile filtrare l’elenco delle sessioni.

SessionContext

SessionContext conserva la working directory e le informazioni del repository Git al momento della creazione della sessione.

Proprietà

  • cwd (string): percorso assoluto della working directory
  • gitRoot (?string): directory radice del repository Git (null fuori da un repository Git)
  • repository (?string): repository GitHub (formato owner/repo, ad es. invokable/laravel-copilot-sdk)
  • branch (?string): nome del branch Git corrente

Esempio d’uso

use Revolution\Copilot\Facades\Copilot;

// Ottieni l'elenco delle sessioni
$sessions = Copilot::client()->listSessions();

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

    if ($metadata->context !== null) {
        echo "  working directory: {$metadata->context->cwd}\n";

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

SessionListFilter

Con SessionListFilter puoi ottenere solo le sessioni di una specifica working directory o repository.

Proprietà

  • cwd (?string): filtro con match esatto sulla working directory
  • gitRoot (?string): filtro sulla directory Git root
  • repository (?string): filtro sul repository (formato owner/repo)
  • branch (?string): filtro sul nome del branch

Esempio d’uso

Specificare il filtro come array

use Revolution\Copilot\Facades\Copilot;

// Ottieni solo le sessioni di un repository specifico
$sessions = Copilot::client()->listSessions([
    'repository' => 'invokable/laravel-copilot-sdk',
]);

// Ottieni le sessioni in corso su un branch specifico
$sessions = Copilot::client()->listSessions([
    'repository' => 'owner/repo',
    'branch' => 'feature/new-feature',
]);

// Ottieni le sessioni di una working directory specifica
$sessions = Copilot::client()->listSessions([
    'cwd' => '/home/user/projects/my-app',
]);

Uso della 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);

Evento session.context_changed

Se durante la sessione la working directory cambia, viene emesso l’evento session.context_changed.

Tipo di evento

use Revolution\Copilot\Enums\SessionEventType;

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

Dati dell’evento

I dati dell’evento includono le informazioni di contesto aggiornate.
use Revolution\Copilot\Facades\Copilot;

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

            echo "La working directory è cambiata\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

A SessionMetadata è stata aggiunta la proprietà context.

Nuova proprietà

  • context (?SessionContext): working directory e informazioni Git della sessione

Esempio d’uso

use Revolution\Copilot\Facades\Copilot;

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

foreach ($sessions as $metadata) {
    echo "Session ID: {$metadata->sessionId}\n";
    echo "Ora di inizio: {$metadata->startTime}\n";

    // context è opzionale, quindi controlla null
    if ($metadata->context !== null) {
        echo "Contesto:\n";
        echo "  working directory: {$metadata->context->cwd}\n";

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

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

    echo "\n";
}

Esempi pratici

Ottenere le sessioni di un progetto specifico

use Revolution\Copilot\Facades\Copilot;

// Ottieni solo le sessioni del progetto Laravel Copilot SDK
$sessions = Copilot::client()->listSessions([
    'repository' => 'invokable/laravel-copilot-sdk',
]);

// Mostra le sessioni in corso
foreach ($sessions as $metadata) {
    echo "{$metadata->sessionId}: {$metadata->summary}\n";
    echo "  branch: {$metadata->context->branch}\n";
}

Gestire le sessioni di un feature branch

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/');
});

// Raggruppa le sessioni per feature branch
$byBranch = [];
foreach ($featureSessions as $metadata) {
    $branch = $metadata->context->branch;
    $byBranch[$branch][] = $metadata;
}

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

Organizzare le sessioni per working directory

use Revolution\Copilot\Facades\Copilot;

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

// Raggruppa per working directory
$byCwd = [];
foreach ($sessions as $metadata) {
    if ($metadata->context !== null) {
        $cwd = $metadata->context->cwd;
        $byCwd[$cwd][] = $metadata;
    }
}

// Mostra il numero di sessioni per directory
foreach ($byCwd as $cwd => $sessions) {
    echo "{$cwd}: " . count($sessions) . " sessioni\n";
}

Note

  • context include informazioni Git (gitRoot, repository, branch) solo per sessioni create all’interno di un repository Git.
  • Il campo context è disponibile da Copilot CLI v0.0.409 in avanti. Nelle versioni precedenti viene restituito null.
  • Il filtraggio funziona con match esatto. Non sono supportati match parziali o wildcard.
  • Tutti i campi di SessionListFilter sono opzionali. Senza filtro vengono restituite tutte le sessioni.
Per le informazioni più recenti fai riferimento al repository GitHub.
Ultima modifica il 13 luglio 2026