메인 콘텐츠로 건너뛰기

세션 컨텍스트와 필터링

GitHub Copilot SDK v0.1.24 이후에서는 세션에 작업 디렉터리와 Git 정보를 포함한 컨텍스트가 추가되어, 세션 목록에서 필터링할 수 있게 되었습니다.

SessionContext

SessionContext는 세션 작성 시의 작업 디렉터리와 Git 저장소 정보를 보관합니다.

프로퍼티

  • cwd (string): 작업 디렉터리의 절대 경로
  • gitRoot (?string): Git 저장소의 루트 디렉터리(Git 저장소 밖에서는 null)
  • repository (?string): GitHub 저장소(owner/repo 형식, 예: invokable/laravel-copilot-sdk)
  • branch (?string): 현재의 Git 브랜치 이름

사용 예시

use Revolution\Copilot\Facades\Copilot;

// 세션 목록 가져오기
$sessions = Copilot::client()->listSessions();

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

    if ($metadata->context !== null) {
        echo "  작업 디렉터리: {$metadata->context->cwd}\n";

        if ($metadata->context->repository !== null) {
            echo "  저장소: {$metadata->context->repository}\n";
            echo "  브랜치: {$metadata->context->branch}\n";
        }
    }
}

SessionListFilter

SessionListFilter를 사용하면 특정 작업 디렉터리나 저장소의 세션만 가져올 수 있습니다.

프로퍼티

  • cwd (?string): 작업 디렉터리로 완전 일치 필터
  • gitRoot (?string): Git 루트 디렉터리로 필터
  • repository (?string): 저장소(owner/repo 형식)로 필터
  • branch (?string): 브랜치 이름으로 필터

사용 예시

배열로 필터 지정

use Revolution\Copilot\Facades\Copilot;

// 특정 저장소의 세션만 가져오기
$sessions = Copilot::client()->listSessions([
    'repository' => 'invokable/laravel-copilot-sdk',
]);

// 특정 브랜치에서 작업 중인 세션 가져오기
$sessions = Copilot::client()->listSessions([
    'repository' => 'owner/repo',
    'branch' => 'feature/new-feature',
]);

// 특정 작업 디렉터리의 세션 가져오기
$sessions = Copilot::client()->listSessions([
    'cwd' => '/home/user/projects/my-app',
]);

SessionListFilter 클래스 사용

use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionListFilter;

$filter = new SessionListFilter(
    repository: 'owner/repo',
    branch: 'main',
);

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

session.context_changed 이벤트

세션 중에 작업 디렉터리가 변경되면 session.context_changed 이벤트가 발화합니다.

이벤트 타입

use Revolution\Copilot\Enums\SessionEventType;

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

이벤트 데이터

이벤트 데이터에는 업데이트 후의 컨텍스트 정보가 포함됩니다.
use Revolution\Copilot\Facades\Copilot;

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

            echo "작업 디렉터리가 변경되었습니다\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

SessionMetadatacontext 프로퍼티가 추가되었습니다.

새로운 프로퍼티

  • context (?SessionContext): 세션의 작업 디렉터리와 Git 정보

사용 예시

use Revolution\Copilot\Facades\Copilot;

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

foreach ($sessions as $metadata) {
    echo "Session ID: {$metadata->sessionId}\n";
    echo "시작 시각: {$metadata->startTime}\n";

    // context는 옵셔널이므로 null 체크가 필요
    if ($metadata->context !== null) {
        echo "컨텍스트:\n";
        echo "  작업 디렉터리: {$metadata->context->cwd}\n";

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

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

    echo "\n";
}

실용 예시

특정 프로젝트의 세션 가져오기

use Revolution\Copilot\Facades\Copilot;

// Laravel Copilot SDK 프로젝트의 세션만 가져오기
$sessions = Copilot::client()->listSessions([
    'repository' => 'invokable/laravel-copilot-sdk',
]);

// 작업 중 세션 표시
foreach ($sessions as $metadata) {
    echo "{$metadata->sessionId}: {$metadata->summary}\n";
    echo "  브랜치: {$metadata->context->branch}\n";
}

기능 브랜치의 세션 관리

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

// 기능 브랜치별로 세션을 그룹화
$byBranch = [];
foreach ($featureSessions as $metadata) {
    $branch = $metadata->context->branch;
    $byBranch[$branch][] = $metadata;
}

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

작업 디렉터리별로 세션 정리

use Revolution\Copilot\Facades\Copilot;

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

// 작업 디렉터리로 그룹화
$byCwd = [];
foreach ($sessions as $metadata) {
    if ($metadata->context !== null) {
        $cwd = $metadata->context->cwd;
        $byCwd[$cwd][] = $metadata;
    }
}

// 디렉터리별 세션 수 표시
foreach ($byCwd as $cwd => $sessions) {
    echo "{$cwd}: " . count($sessions) . " 세션\n";
}

주의사항

  • context는 Git 저장소 안에서 작성한 세션에서만 Git 관련 정보(gitRoot, repository, branch)를 포함합니다.
  • context 필드는 Copilot CLI v0.0.409 이후에서 사용할 수 있습니다. 오래된 버전에서는 null이 반환됩니다.
  • 필터링은 완전 일치로 동작합니다. 부분 일치나 와일드카드는 미지원입니다.
  • SessionListFilter의 모든 필드는 옵셔널입니다. 필터를 지정하지 않으면 전체 세션이 반환됩니다.
최신 정보는 GitHub 저장소를 참고하세요.
마지막 수정일 2026년 7월 13일