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

# Contexto de sesión y filtrado

> Explica cómo comprobar y filtrar sesiones por directorio de trabajo o información de Git usando SessionContext y SessionListFilter de Laravel Copilot SDK.

## Contexto de sesión y filtrado

Desde GitHub Copilot SDK v0.1.24, se ha añadido al contexto de sesión información del directorio de trabajo y de Git, y puedes filtrar la lista de sesiones por esa información.

## SessionContext

`SessionContext` guarda el directorio de trabajo y la información del repositorio Git en el momento en que se crea la sesión.

### Propiedades

* `cwd` (`string`): ruta absoluta del directorio de trabajo
* `gitRoot` (`?string`): directorio raíz del repositorio Git (`null` fuera de un repositorio Git)
* `repository` (`?string`): repositorio de GitHub (formato `owner/repo`, por ejemplo `invokable/laravel-copilot-sdk`)
* `branch` (`?string`): nombre de la rama Git actual

### Ejemplo de uso

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

// Obtén la lista de sesiones
$sessions = Copilot::client()->listSessions();

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

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

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

## SessionListFilter

Con `SessionListFilter` puedes obtener solo las sesiones de un directorio de trabajo o repositorio concretos.

### Propiedades

* `cwd` (`?string`): filtro de coincidencia exacta por directorio de trabajo
* `gitRoot` (`?string`): filtro por directorio raíz de Git
* `repository` (`?string`): filtro por repositorio (formato `owner/repo`)
* `branch` (`?string`): filtro por nombre de rama

### Ejemplos de uso

#### Filtro como array

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

// Obtén solo las sesiones de un repositorio concreto
$sessions = Copilot::client()->listSessions([
    'repository' => 'invokable/laravel-copilot-sdk',
]);

// Obtén las sesiones que están trabajando en una rama concreta
$sessions = Copilot::client()->listSessions([
    'repository' => 'owner/repo',
    'branch' => 'feature/new-feature',
]);

// Obtén las sesiones de un directorio de trabajo concreto
$sessions = Copilot::client()->listSessions([
    'cwd' => '/home/user/projects/my-app',
]);
```

#### Usar la clase 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`

Cuando el directorio de trabajo cambia durante la sesión, se dispara el evento `session.context_changed`.

### Tipo de evento

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

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

### Datos del evento

Los datos del evento incluyen la información del contexto actualizado.

```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 "Directorio de trabajo cambiado\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

Se ha añadido la propiedad `context` a `SessionMetadata`.

### Nueva propiedad

* `context` (`?SessionContext`): directorio de trabajo e información de Git de la sesión

### Ejemplo de uso

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

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

foreach ($sessions as $metadata) {
    echo "Session ID: {$metadata->sessionId}\n";
    echo "Hora de inicio: {$metadata->startTime}\n";

    // context es opcional, hay que comprobar null
    if ($metadata->context !== null) {
        echo "Contexto:\n";
        echo "  Directorio de trabajo: {$metadata->context->cwd}\n";

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

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

    echo "\n";
}
```

## Ejemplos prácticos

### Obtener las sesiones de un proyecto concreto

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

// Obtén solo las sesiones del proyecto Laravel Copilot SDK
$sessions = Copilot::client()->listSessions([
    'repository' => 'invokable/laravel-copilot-sdk',
]);

// Muestra las sesiones activas
foreach ($sessions as $metadata) {
    echo "{$metadata->sessionId}: {$metadata->summary}\n";
    echo "  Rama: {$metadata->context->branch}\n";
}
```

### Gestionar sesiones de ramas de feature

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

// Agrupa las sesiones por rama de feature
$byBranch = [];
foreach ($featureSessions as $metadata) {
    $branch = $metadata->context->branch;
    $byBranch[$branch][] = $metadata;
}

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

### Organizar sesiones por directorio de trabajo

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

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

// Agrupa por directorio de trabajo
$byCwd = [];
foreach ($sessions as $metadata) {
    if ($metadata->context !== null) {
        $cwd = $metadata->context->cwd;
        $byCwd[$cwd][] = $metadata;
    }
}

// Muestra el número de sesiones por directorio
foreach ($byCwd as $cwd => $sessions) {
    echo "{$cwd}: " . count($sessions) . " sesiones\n";
}
```

## Consideraciones

* `context` solo incluye información relacionada con Git (`gitRoot`, `repository`, `branch`) en sesiones creadas dentro de un repositorio Git.
* El campo `context` está disponible desde Copilot CLI v0.0.409. En versiones anteriores devuelve `null`.
* El filtrado se realiza con coincidencia exacta. No hay soporte para coincidencias parciales ni comodines.
* Todos los campos de `SessionListFilter` son opcionales. Si no indicas ningún filtro, se devuelven todas las sesiones.

<Info>
  Consulta la información más reciente en el [repositorio de GitHub](https://github.com/invokable/laravel-copilot-sdk).
</Info>


## Related topics

- [Context (contexto)](/es/context.md)
- [Hooks de sesión](/es/packages/laravel-copilot-sdk/hooks.md)
- [Reanudar sesión](/es/packages/laravel-copilot-sdk/resume.md)
- [Sesión](/es/session.md)
- [Socialite - Laravel Bluesky](/es/packages/laravel-bluesky/socialite.md)
