Saltar al contenido principal

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

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

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

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

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

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

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

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

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.
Consulta la información más reciente en el repositorio de GitHub.
Última modificación el 13 de julio de 2026