SessionConfig
SessionConfig 클래스로 다양한 설정이 가능합니다.
Copilot::run(prompt: '...', config: $config)이나 Copilot::start(function (CopilotSession $session) { ... }, config: $config)와 같이 사용합니다.
단순히 모델을 지정하고 싶은 정도로 SessionConfig 클래스를 사용할 것도 없을 때는 배열로 지정할 수도 있습니다. Copilot::run(prompt: '...', config: ['model' => 'auto'])
검출 루트
skillDirectories, agentDirectories, hookDirectories, instructionDirectories는 스킬, 커스텀 에이전트, 파일 훅, 커스텀 인스트럭션을 위한 검출 전용 루트입니다.
에이전트에 일반적인 파일 접근 권한을 부여하지는 않습니다.
일반적인 파일 접근 위치를 추가하려면 additionalDirectories를 사용하세요.
검출 루트는 enableConfigDiscovery의 활성 여부와 관계없이 설정할 수 있습니다.
SDK는 상대 경로를 설정 시점의 유효한 workingDirectory를 기준으로 한 번만 해석합니다.
이후 워킹 디렉터리가 바뀌어도 루트는 이동하지 않습니다.
키를 생략하거나 null을 전달하면 기본 검출 소스는 변경되지 않습니다.
[]를 전달하면 SDK가 명시적으로 설정한 루트만 지워집니다.
스킬, 에이전트, 훅, 인스트럭션에 대한 소스별 비활성화 설정과 Managed Settings는 계속 적용됩니다.
세션 재개 시에는 ResumeSessionConfig 클래스를 사용합니다. SessionConfig와 거의 같지만 약간 다릅니다. ResumeSessionConfig는 설정을 바꾸고 싶은 항목만 지정합니다. 그 외는 새 세션 시작 시의 설정이 인계됩니다.
SDK는 작성과 재개 양쪽의 RPC 페이로드에 같은 세션 옵션을 전송합니다.
여기에는 BYOK 프로바이더와 모델, 메모리, enableMcpApps, interactiveUser, enableGitHubCacheStore, 검출 루트, 그리고 onMcpAuthRequest, onExitPlanModeRequest, onAutoModeSwitchRequest 같은 핸들러가 포함됩니다.
재개 시에는 이것들을 ResumeSessionConfig 또는 같은 키를 가진 배열로 전달하세요.
클로저와 프로바이더 객체는 영속화되지 않으므로, 재개할 때마다 다시 지정해야 합니다.
Canvas 프로바이더
canvases로 캔버스를 선언하고, canvasHandler로 열기 요청과 액션 요청을 처리합니다.
에이전트가 캔버스를 열거나 액션을 호출하면 런타임이 리버스 RPC로 핸들러를 호출합니다.
requestCanvasRenderer: true를 설정하면 렌더러로 옵트인하며, 런타임이 이 커넥션에서 캔버스용 에이전트 도구를 모델에 공개합니다.
캔버스를 표시할 수 없는 SDK 호출 측에 영향을 주지 않도록 기본값은 비활성입니다.
requestExtensions: true는 확장 기능 영역에 옵트인합니다. 런타임이 이 커넥션의 세션에 확장 기능 관리 도구를 연결합니다. 기본값은 비활성입니다.extensionInfo: new ExtensionInfo(source: 'github-app', name: 'my-extension')는 이 커넥션의 캔버스 프로바이더에 고정된 확장 기능 ID를 설정합니다. 런타임은 커넥션별 ID 대신${source}:${name}을 사용합니다. 배열로도 지정할 수 있습니다.
canvases와 canvasHandler를 다시 전달하세요.
canvasHandler는 PHP 프로세스 안에서만 실행됩니다. SDK는 RPC 페이로드에 선언 메타데이터만 전송합니다.
ResumeSessionConfig는 세션이 중단되었을 때 열려 있던 캔버스의 스냅샷인 openCanvases도 받습니다.
런타임은 이를 사용해 캔버스 상태를 복원하므로, 캔버스를 다시 열 필요가 없습니다.
현재 열려 있는 캔버스는 $session->openCanvases()로 가져올 수 있습니다. SDK는 이 목록을 session.canvas.opened 및 session.canvas.closed 이벤트와 동기화합니다.
세션 파일 시스템 프로바이더
스킬 및 파일 시스템 콜백
애플리케이션이 관리하는 소스에서 스킬을 불러오려면skillProvider를 사용합니다.
콜백은 해당 세션에 속하며, Copilot 런타임으로 직렬화되지 않습니다.
클라우드 세션은 커스텀 스킬 프로바이더를 지원하지 않습니다.
SkillProviderCallOptions::$signal은 콜백의 취소 토큰을 제공합니다.
취소는 협조적으로 동작합니다. 콜백 측에서 시그널을 확인하고 진행 중인 작업을 직접 취소해야 합니다.
콜백 배열 대신 Revolution\Copilot\Contracts\SkillProvider를 구현할 수도 있습니다.
sessionFsProvider도 같은 세션 단위 설정을 사용합니다.
텍스트용 콜백은 readFile(path)와 writeFile(path, content, mode)입니다.
바이너리 파일을 지원하려면 readFileBytes(path)와 writeFileBytes(path, bytes, mode)를 모두 제공하거나, SessionFsBinaryProvider를 구현하세요.
이 콜백들은 원본 바이트를 받고 반환합니다. JSON-RPC 통신에서의 base64 인코딩은 SDK가 처리합니다.
파일 시스템 접근은 애플리케이션이 공개하려는 경로로 한정하세요.
sessionFs로 모든 세션 상태 위임
클라이언트 옵션 sessionFs(별칭 session_fs)를 설정하면 세션 상태 파일과 세션별 SQLite 데이터베이스를 포함한 Copilot CLI의 세션 상태 전체를 자체 스토리지로 옮길 수 있습니다.
설정한 경우, 모든 세션 설정에서 createSessionFsProvider 팩토리를 제공해야 합니다.
SDK는 createSession()과 resumeSession() 양쪽에서, 세션 ID가 확정된 후 런타임에 요청을 보내기 전에 팩토리를 호출합니다.
Copilot 파사드를 사용하는 경우 config/copilot.php에서 session_fs를 설정합니다.
initialCwd, sessionStatePath, conventions(posix 또는 windows)는 필수입니다.
필드가 누락되었거나 conventions 값이 올바르지 않으면 InvalidArgumentException이 발생합니다.
createSessionFsProvider는 Closure입니다. SessionConfig와 ResumeSessionConfig의 배열, fromArray(), toArray()에서도 동작합니다.
반환하는 프로바이더는 객체 또는 callable 배열일 수 있습니다. 각 옵션 기능에는 전용 인터페이스가 있습니다.
프로바이더가 선언된 capabilities를 충족하지 않으면 SDK가
InvalidArgumentException을 던집니다.
프로바이더가 지원하지 않는 작업을 호출하면 UNKNOWN 오류가 반환됩니다.
프로바이더는 예외를 던져 실패를 알립니다. code가 ENOENT(또는 errno 2)인 예외는 ENOENT가 되고, 그 외는 UNKNOWN이 됩니다.
errorClass(busyOrLocked, fatal, postCommitAmbiguous)를 보고하려면 transaction()에서 SessionFsSqliteTransactionFailure를 던지세요.
클라이언트의 sessionFs 옵션이 없으면 SDK는 createSessionFsProvider를 호출하지 않으며, 기존 sessionFsProvider(readFile와 writeFile)는 그대로 동작합니다.
멀티테넌트 앱을 위한 empty 모드
클라이언트의mode를 empty로 설정하면 Copilot CLI 호스트 환경이나 세션 간 상태에 의존하는 기능이 기본적으로 비활성화됩니다.
기본값은 기존 동작을 유지하는 copilot-cli입니다.
empty 모드에서는 base_directory, session_fs, 외부 서버 url 중 하나의 영속화 대상을 설정해야 합니다.
availableTools를 설정해야 합니다.
ToolSet을 사용하면 소스가 명시된 도구 필터(builtin:, custom:, mcp:)를 만들 수 있습니다.
BuiltInTools::Isolated는 단일 세션 안에 한정된 빌트인 도구만 허용하며, 호스트 파일 시스템, 환경, 네트워크, 세션 간 접근은 허용하지 않습니다.
/^[a-zA-Z0-9_-]+$/와 일치하거나 와일드카드 *여야 합니다. 그렇지 않으면 ToolSet이 InvalidArgumentException을 던집니다.
empty 모드는 세션 텔레메트리, 영속적인 MCP OAuth 토큰 저장, 임베딩 검색과 캐시, 인스트럭션 검출, 파일 훅, 호스트의 git 작업, 세션 스토어, GitHub 캐시 스토어, 스킬, 메모리, 실험적 모드에 안전한 기본값을 적용합니다.
명시적으로 설정한 세션 옵션은 이 기본값보다 우선합니다.
replace 모드의 systemMessage는 그대로 사용됩니다. 그 외 모드에서는 environment_context 섹션이 제거됩니다.
SDK는 CLI 프로세스에 COPILOT_DISABLE_KEYTAR=1도 설정합니다.
GitHub 캐시 스토어
읽기 전용 GitHub 캐시 스토어를 요청하려면enableGitHubCacheStore: true를 설정합니다.
CLI는 GITHUB_CACHE_STORE 기능 플래그가 활성화된 경우에만 github_sql 도구를 등록합니다.
최신 정보는 GitHub 저장소를 참고하세요.