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

# Contesto e filtraggio della sessione

> Descrive come verificare e filtrare le sessioni per working directory e informazioni Git con SessionContext e SessionListFilter di Laravel Copilot SDK.

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

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

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

```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);
```

## Evento `session.context_changed`

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

### Tipo di evento

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

```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 "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

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

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

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

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

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

<Info>
  Per le informazioni più recenti fai riferimento al [repository GitHub](https://github.com/invokable/laravel-copilot-sdk).
</Info>


## Related topics

- [Ripresa della sessione](/it/packages/laravel-copilot-sdk/resume.md)
- [Hook di sessione](/it/packages/laravel-copilot-sdk/hooks.md)
- [Eventi del ciclo di vita della sessione](/it/packages/laravel-copilot-sdk/session-lifecycle-event.md)
- [Introduzione - GitHub Copilot SDK for Laravel](/it/packages/laravel-copilot-sdk/getting-started.md)
- [Loop dell'agente](/it/packages/laravel-copilot-sdk/agent-loop.md)
