SessionConfig
SessionConfig 클래스로 다양한 설정이 가능합니다.
Copilot::run(prompt: '...', config: $config)이나 Copilot::start(function (CopilotSession $session) { ... }, config: $config)와 같이 사용합니다.
단순히 모델을 지정하고 싶은 정도로 SessionConfig 클래스를 사용할 것도 없을 때는 배열로 지정할 수도 있습니다. Copilot::run(prompt: '...', config: ['model' => 'auto'])
remoteSession 옵션은 공식 SDK 1.0.26에서 삭제되었습니다. SessionConfig와 ResumeSessionConfig에서는 더 이상 지정할 수 없습니다.
검출 루트
skillDirectories, agentDirectories, hookDirectories, instructionDirectories는 스킬, 커스텀 에이전트, 파일 훅, 커스텀 인스트럭션을 위한 검출 전용 루트입니다.
에이전트에 일반적인 파일 접근 권한을 부여하지는 않습니다.
일반적인 파일 접근 위치를 추가하려면 additionalDirectories를 사용하세요.
검출 루트는 enableConfigDiscovery의 활성 여부와 관계없이 설정할 수 있습니다.
SDK는 상대 경로를 설정 시점의 유효한 workingDirectory를 기준으로 한 번만 해석합니다.
이후 워킹 디렉터리가 바뀌어도 루트는 이동하지 않습니다.
키를 생략하거나 null을 전달하면 기본 검출 소스는 변경되지 않습니다.
[]를 전달하면 SDK가 명시적으로 설정한 루트만 지워집니다.
스킬, 에이전트, 훅, 인스트럭션에 대한 소스별 비활성화 설정과 Managed Settings는 계속 적용됩니다.
워킹 디렉터리 신뢰
trustWorkingDirectory를 설정하면 세션 작성 시 워킹 디렉터리를 신뢰할 수 있는 디렉터리로 표시합니다.
WorkingDirectoryTrust::Session은 현재 세션에서만 디렉터리를 신뢰합니다.WorkingDirectoryTrust::User는 신뢰 설정을 영속화하여 이후 세션에서도 디렉터리를 신뢰합니다.
trustWorkingDirectory는 세션 작성 시에만 사용할 수 있습니다. ResumeSessionConfig에서는 지정할 수 없습니다.
메모리 주입 모드
MemoryConfiguration은 세션 간 메모리 기능을 제어합니다.
mode 옵션으로 런타임이 메모리를 주입할 위치를 정합니다.
MemoryMode::SystemPrompt(system-prompt)는 시스템 프롬프트에 메모리를 주입합니다.mode를 생략했을 때의 기본값입니다.MemoryMode::UserPrompt(user-prompt)는 생성되는 사용자 메시지에 메모리를 주입합니다.
앱 관리 메모리 스토어
MemoryConfiguration의 storeMemory에 클로저를 전달하면 런타임이 저장하려는 메모리를 앱에서 받아 저장할 수 있습니다. 클로저에는 StoredMemory(sessionId, subject, fact, citations, reason)와 취소 여부를 확인할 수 있는 signal을 가진 MemoryStoreCallOptions가 전달됩니다.
storeMemory를 사용할 때는enabled를true로 설정합니다.false인 채로 두면 예외가 발생합니다.storeMemory자체는 RPC 페이로드에 포함되지 않으며, SDK는 세션 생성·재개 시hasMemoryStore: true만 전송합니다.- 클라우드 세션에서는 사용할 수 없습니다.
- 런타임은 메모리를 회상하지 않으며
vote_memory도 사용할 수 없게 됩니다. 저장한 메모리의 회상은systemMessage등을 사용해 앱에서 보완하세요. - 콜백의
signal은 타임아웃이나 연결 끊김 시 취소되며, 그 이후에 반환된 결과는 폐기됩니다.
권한 모드
permissionMode를 지정하면 세션 생성·재개 시 권한 모드를 런타임에 전달합니다. 생략하면 런타임의 기본값이 유지됩니다. PermissionMode enum 또는 문자열로 지정할 수 있으며, ResumeSessionConfig에서도 동일하게 지정할 수 있습니다. 클라우드 세션에서는 지원되지 않습니다.
PermissionMode::Manual(manual)은 일반 승인 흐름으로 권한 요청을 처리합니다.PermissionMode::Assisted(assisted)는 권한 요청에 LLM의 안전성 권장 사항을 추가합니다. 클라이언트는 문제없다고 판단된 요청을 자동 승인할 수 있습니다.PermissionMode::AllowAll(allow-all)은 도구·경로·URL 권한 요청을 자동 승인합니다.
$session->permissionModeResult()로 가져올 수 있습니다. success는 적용 성공 여부, mode는 적용 후의 권한 모드입니다. 응답에 포함되지 않은 경우 null을 반환합니다.
자동 모드 복구
autoModeRecovery: true를 지정하면 활성 요청의 자동 복구를 런타임에 요청합니다. 기본값은 false입니다. 이 기능에는 onAutoModeSwitchRequest 핸들러가 필수이며, 지정하지 않으면 예외가 발생합니다. 복구 재시도와 되감기는 런타임이 수행하므로 앱에서 프롬프트를 다시 보낼 필요는 없습니다.
autoModeRecovery는 생성 시와 재개 시 모두 지정합니다. 런타임이 capabilities.ui.autoModeRecovery를 true로 응답하지 않으면 세션이 분리되고 예외가 발생합니다. 이 기능을 사용하지 않는 경우, 기존 onAutoModeSwitchRequest에 의한 이후 메시지용 전환 동작은 변하지 않습니다.
Managed Settings 제외
excludedManagedSettings에는 런타임이 가져오는 Managed Settings에서 제외할 설정 경로를 나열합니다.
managedSettings로 직접 주입하는 설정에는 영향을 주지 않습니다.
재개 후에도 제외를 유지하려면 ResumeSessionConfig에도 excludedManagedSettings를 다시 전달하세요.
ResumeSessionConfig 클래스를 사용합니다. SessionConfig와 거의 같지만 약간 다릅니다. ResumeSessionConfig는 설정을 바꾸고 싶은 항목만 지정합니다. 그 외는 새 세션 시작 시의 설정이 인계됩니다.
SDK는 작성과 재개 양쪽의 RPC 페이로드에 같은 세션 옵션을 전송합니다.
여기에는 BYOK 프로바이더와 모델, 메모리, enableMcpApps, interactiveUser, autopilot, sandboxConfig, excludedManagedSettings, 검출 루트, 그리고 onMcpAuthRequest, onExitPlanModeRequest, onAutoModeSwitchRequest 같은 핸들러가 포함됩니다.
재개 시에는 이것들을 ResumeSessionConfig 또는 같은 키를 가진 배열로 전달하세요.
클로저와 프로바이더 객체는 영속화되지 않으므로, 재개할 때마다 다시 지정해야 합니다.
Autopilot 자동 계속
autopilot으로 Autopilot 모드의 자동 계속 정책을 설정합니다.
세션 모드 자체는 변경하지 않습니다.
새 SDK 세션은 기본적으로 자동 계속이 활성화되며, maxContinues는 5입니다.
일반적인 자동 계속을 끄려면 maxContinues를 0으로 설정하세요.
ResumeSessionConfig 또는 배열에 같은 autopilot 키를 전달하세요.
warm resume에서는 생략한 필드의 현재 값이 유지됩니다.
런타임 재시작 후(cold resume)에는 설정을 다시 전달하세요.
샌드박스 설정
sandboxConfig로 세션의 CLI 샌드박스를 설정합니다.
SDK는 이 설정을 작성과 재개 양쪽의 요청에 전달합니다.
기존 코드와의 호환성을 위해 sandbox도 별칭으로 받습니다.
둘 다 설정한 경우 null이 아닌 sandboxConfig가 우선합니다.
auth와 credentials를 사용하면 자격 증명 값을 노출하지 않고 샌드박스 내 프로세스가 자격 증명을 사용할 수 있습니다.
auth는git과gh에 대한 자격 증명 주입을 활성화합니다.credentials.envVars는 환경 변수 이름과, 마스킹된 값을 받을 수 있는 HTTPS 호스트(injectHosts)를 매핑합니다. 자격 증명 값 자체는 설정에 넣지 마세요.
Revolution\Copilot\Types\Rpc 네임스페이스의 SandboxConfig, SandboxConfigAuth, SandboxCredentialsConfig, SandboxMaskedEnvVar, SandboxConfigUserPolicyExperimental, SandboxConfigUserPolicyExperimentalSeatbelt 같은 타입 객체도 사용할 수 있습니다.
네트워크 허용 및 차단 규칙은 CLI 샌드박스 기능과 버전에 따라 다릅니다.
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 캐시 스토어는 empty 모드의 기본값도 세션 옵션도 아닙니다. SDK는 더 이상 세션 작성이나 재개 요청에 enableGitHubCacheStore를 전송하지 않으며, 배열 설정에 키가 남아 있어도 무시합니다.
replace 모드의 systemMessage는 그대로 사용됩니다. 그 외 모드에서는 environment_context 섹션이 제거됩니다.
SDK는 CLI 프로세스에 COPILOT_DISABLE_KEYTAR=1도 설정합니다.
클라우드 실행은 Cloud Sessions, Plugin Directory는 Plugin Directories를 참고하세요.
최신 정보는 GitHub 저장소를 참고하세요.