Skip to main content

세션 훅

hooks를 사용하면 Copilot 세션의 각 라이프사이클에 처리를 끼워 넣을 수 있습니다. 도구 실행 제어, 감사 로그, 프롬프트 보강, 에러 처리 등을 코어 구현을 변경하지 않고 추가할 수 있습니다. 이는 커스텀 에이전트 정의 내의 선언형 hooks나 파일 기반 훅 로드와는 별개의 기능입니다. 에이전트 단위 설정은 커스텀 에이전트를 참조하세요.

파일 기반 훅 검색

hookDirectories에는 파일 기반 훅을 검색할 명시적인 루트를 지정할 수 있습니다. 이는 검색 전용이며, 에이전트에 일반적인 파일 접근 권한을 부여하지 않습니다. enableConfigDiscovery나 enableFileHooks가 비활성화되어 있어도 명시적 루트는 사용할 수 있습니다. 상대 경로는 지정 시점의 유효한 workingDirectory를 기준으로 한 번만 해석됩니다.
  • 생략 또는 null: 다른 검색 소스를 변경하지 않습니다
  • []: 명시한 SDK 루트만 비웁니다
훅의 소스 비활성화 설정이나 Managed Settings는 계속 적용됩니다. enableFileHooks는 리포지토리 유래의 파일 훅(.github/hooks/나 신뢰된 리포지토리 설정의 루트)을 제어합니다. 명시적인 hookDirectories나 PHP 콜백의 hooks는 비활성화하지 않습니다.

훅의 흐름

기본 사용법

사용 가능한 훅

null을 반환하면 기본 동작이 계속됩니다.

프롬프트 차단

onUserPromptSubmitted는 decision: 'block'을 반환해 프롬프트를 거부할 수 있습니다. 거부된 경우 모델 턴은 시작되지 않으며, 사용자 메시지도 기록되지 않습니다. reason을 지정하면 그 내용이 warningType: "policy_blocked"인 일시적 session.warning 이벤트에 포함됩니다.

대표적인 사용 사례

1) Permission control(실행 제어)

  • onPreToolUse에서 허용 도구를 allow-list 방식으로 설정
  • 파괴적 조작은 permissionDecision: 'ask'로 사람에게 승인 요청
  • permissionDecisionReason으로 거부 이유를 명시
  • toolName의 후보는 Tools의 목록에서 확인(예: view, glob, bash)

2) Auditing / compliance(감사)

  • 라이프사이클 훅을 조합해 감사 이벤트를 수집
  • 수집 데이터는 세션 ID 단위로 영속화

3) Prompt enrichment(입력 보강)

  • onSessionStart에서 프로젝트 정보(언어, FW, 규약)를 additionalContext에 추가
  • onUserPromptSubmitted에서 단축키(/fix, /test)를 확장

4) Result filtering(결과 정형화)

  • onPostToolUse에서 API key / token / password 등을 마스킹
  • 너무 긴 결과는 요약하고 필요 시에만 상세를 반환

5) Error recovery(장애 복구)

  • onErrorOccurred에서 model_call이면서 recoverable=true일 때만 retry
  • 비복구 계열은 userNotification으로 사용자에게 간결하게 알림

6) Session metrics(계측)

  • onSessionStart에서 시작 시각을 기록
  • onPreToolUse / onUserPromptSubmitted에서 카운터 업데이트
  • onSessionEnd에서 소요 시간, 도구 횟수, 종료 이유를 출력

Hook input / output 타입

공통 입력(BaseHookInput)

agentId / agentType / parentAgentId는 서브에이전트가 액터가 되는 훅에서 사용할 수 있습니다. 루트 에이전트의 훅에는 포함되지 않습니다. 오래된 런타임에서는 정보가 없을 경우 필드 자체가 생략됩니다. 따라서 모두 null이 될 수 있습니다.

PreToolUseHookInput

PreToolUseHookOutput

PostToolUseHookInput

PostToolUseHookOutput

UserPromptSubmittedHookInput

UserPromptSubmittedHookOutput

SessionStartHookInput

SessionStartHookOutput

SessionEndHookInput

SessionEndHookOutput

ErrorOccurredHookInput

ErrorOccurredHookOutput

ToolResultObject

도구 실행 결과의 표준 객체입니다.

베스트 프랙티스

  1. 무거운 동기 처리를 훅 내에서 직접 너무 많이 실행하지 마세요. 필요하다면 비동기화합니다.
  2. 변경이 불필요한 경우 null을 반환해 기본 동작에 맡깁니다.
  3. permissionDecision은 가능한 한 명시합니다.
  4. 크리티컬 에러는 너무 억제하지 말고 로그/통지 경로를 확보합니다.
  5. 세션 단위의 상태는 session id 기반으로 관리하고 onSessionEnd에서 정리합니다.
최신 정보는 GitHub 저장소를 참고하세요.
마지막 수정일 2026년 10월 19일