Skip to main content

Copilot SDK의 스트리밍 이벤트

          코필로트 SDK에서 내보낸 참조 세션 이벤트와 각 이벤트에 포함된 데이터 필드를 참조하십시오.

누가 이 기능을 사용할 수 있나요?

GitHub Copilot SDK 는 모든 Copilot 계획에서 사용할 수 있습니다.

참고

          코필로트 SDK가 현재 기술 미리 보기에 있습니다. 기능 및 가용성은 변경될 수 있습니다.

에이전트가 Copilot 수행하는 모든 작업(생각, 코드 작성, 실행 도구)은 구독할 수 있는 세션 이벤트 로 내보내집니다. 이 문서는 각 이벤트 유형에 대한 필드 수준 참조이므로 예상되는 데이터를 정확히 알 수 있습니다.

세션에서 설정되면 streaming: true SDK는 지속형 이벤트(전체 메시지, 도구 결과)와 함께 임시 이벤트(델타, 진행률 업데이트)를 실시간으로 내보냅니다. 모든 이벤트는 공통 엔벨로프를 공유하며, 이벤트 type 형식에 따라 달라지는 data 페이로드를 전달합니다. 전체 이벤트 흐름의 시퀀스 다이어그램은 리포지토리를github/copilot-sdk 참조하세요.

개념설명
          **임시 이벤트** | 일시적인; 실시간으로 스트리밍되지만 세션 로그에 유지 **되지 않습니다** . 세션 다시 시작에서 재생되지 않습니다. |

| 지속형 이벤트 | 디스크의 세션 이벤트 로그에 저장됩니다. 세션을 다시 열 때 재생됩니다. | | 델타 이벤트 | 임시 스트리밍 청크(텍스트 또는 추론)입니다. 델타를 누적하여 전체 콘텐츠를 빌드합니다. | | ** parentId 체인** | 각 이벤트는 parentId 이전 이벤트를 가리키며 걸을 수 있는 연결된 목록을 형성합니다. |

이벤트 봉투

형식에 관계없이 모든 세션 이벤트에는 다음 필드가 포함됩니다.

분야유형설명
id
          `string` (UUID v4) | 고유 이벤트 식별자 |

| timestamp | string (ISO 8601) | 이벤트를 만든 경우 | | parentId | string \| null | 체인에 있는 이전 이벤트의 ID입니다. null 첫 번째 이벤트에 대한 | | ephemeral | boolean? | true 일시적 이벤트의 경우 없음; 지속형 이벤트의 경우 false | | type | string | 이벤트 유형 판별자(아래 표 참조) | | data | object | 이벤트별 페이로드 |

이벤트 구독

// All events
session.on((event) => {
    console.log(event.type, event.data);
});

// Specific event type — data is narrowed automatically
session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});

Python, Go 및 .NET의 예제는 리포지토리를github/copilot-sdk 참조하세요.

          **Python/Go:** 이러한 SDK는 가능한 모든 필드가 있는 단일 `Data` 클래스/구조체를 선택적/nullable로 사용합니다. 아래 표에 나열된 필드만 각 이벤트 유형에 대해 채워집니다. 나머지는 다음과 같습니다 `None` / `nil`.
          **.Net:** .NET SDK는 이벤트당 강력한 형식의 별도의 데이터 클래스를 `AssistantMessageDeltaData`사용하므로 각 형식에 관련 필드만 존재합니다.
          **TypeScript:** TypeScript SDK는 식별된 유니온을 사용합니다. 일치 항목을 기준으로 하면 `event.type`가 `data` 페이로드를 자동으로 올바른 형식으로 좁힙니다.

도우미 이벤트

이러한 이벤트는 턴 시작부터 스트리밍 청크를 거쳐 최종 메시지까지 에이전트의 응답 수명 주기를 추적합니다.

assistant.turn_start

에이전트가 턴 처리를 시작할 때 내보내집니다.

데이터 필드유형필수설명
turnIdstring턴 식별자(일반적으로 문자열화된 턴 번호)
interactionIdstring
원격 분석 상관 관계에 대한 상호 작용 식별자

assistant.intent

임시. 에이전트가 현재 수행하는 작업에 대한 간단한 설명이며 작동하면서 업데이트됩니다.

데이터 필드유형필수설명
intentstring사람이 읽을 수 있는 의도(예: "코드베이스 탐색")

assistant.reasoning

모델에서 확장된 사고 블록을 완성합니다. 추론이 완료된 후 내보냅니다.

데이터 필드유형필수설명
reasoningIdstring이 추론 블록의 고유 식별자
contentstring확장된 사고 전체 텍스트

assistant.reasoning_delta

임시. 모델의 확장된 사고의 증분 조각이 실시간으로 스트리밍됩니다.

데이터 필드유형필수설명
reasoningIdstring해당 이벤트와 일치 assistant.reasoning
deltaContentstring추론 콘텐츠에 추가할 텍스트 청크

assistant.message

이 LLM 호출에 대한 도우미의 전체 응답입니다. 도구 호출 요청을 포함할 수 있습니다.

데이터 필드유형필수설명
messageIdstring이 메시지의 고유 식별자
contentstring도우미의 텍스트 응답
toolRequestsToolRequest[]
도우미가 수행하려는 도구 호출(아래 참조)
reasoningOpaquestring
암호화된 확장 사고(인류 모델); 세션 바인딩
reasoningTextstring
확장된 사고에서 읽을 수 있는 추론 텍스트
encryptedContentstring
암호화된 추론 콘텐츠(OpenAI 모델); 세션 바인딩
phasestring
생성 단계(예: "thinking""response")
outputTokensnumber
API 응답의 실제 출력 토큰 수
interactionIdstring
원격 분석에 대한 상호 작용 식별자
parentToolCallIdstring
이 메시지가 하위 에이전트에서 시작되는 경우 설정
          **
          `ToolRequest` 필드:**
분야유형필수설명
toolCallIdstring이 도구 호출의 고유 ID
namestring도구 이름(예: "bash", "edit", "grep")
argumentsobject
구문 분석된 도구의 인수
type"function" | "custom"
호출 유형; 없는 경우 기본값은 "function" 입니다.

assistant.message_delta

임시. 실시간으로 스트리밍되는 도우미 텍스트 응답의 증분 청크입니다.

데이터 필드유형필수설명
messageIdstring해당 이벤트와 일치 assistant.message
deltaContentstring메시지에 추가할 텍스트 청크
parentToolCallIdstring
하위 에이전트에서 시작될 때 설정

assistant.turn_end

에이전트가 턴을 완료할 때 내보내집니다(모든 도구 실행이 완료되고 최종 응답이 전달됨).

데이터 필드유형필수설명
turnIdstring해당 이벤트와 일치 assistant.turn_start

assistant.usage

임시. 개별 API 호출에 대한 토큰 사용량 및 비용 정보입니다.

데이터 필드유형필수설명
modelstring모델 식별자(예: "gpt-4.1")
inputTokensnumber
사용된 입력 토큰
outputTokensnumber
생성된 출력 토큰
cacheReadTokensnumber
프롬프트 캐시에서 읽은 토큰
cacheWriteTokensnumber
프롬프트 캐시에 기록된 토큰
costnumber
청구에 대한 모델 승수 비용
durationnumber
API 호출 기간(밀리초)
initiatorstring
이 호출을 트리거한 항목(예: "sub-agent"); 사용자가 시작한 경우 없음
apiCallIdstring
공급자의 완료 ID(예: chatcmpl-abc123)
providerCallIdstring
          GitHub 요청 추적 ID(`x-github-request-id`) |

| parentToolCallId | string | | 하위 에이전트에서 사용이 시작되는 경우 설정 | | quotaSnapshots | Record<string, QuotaSnapshot> | | 할당량별 리소스 사용량( 할당량 식별자 키 지정) | | copilotUsage | CopilotUsage | | API의 항목별 토큰 비용 분석 |

assistant.streaming_delta

임시. 낮은 수준의 네트워크 진행률 표시기 - 스트리밍 API 응답에서 받은 총 바이트 수입니다.

데이터 필드유형필수설명
totalResponseSizeBytesnumber지금까지 받은 누적 바이트

도구 실행 이벤트

이러한 이벤트는 실행부터 완료까지 도구 호출을 요청하는 모델에서 각 도구 호출의 전체 수명 주기를 추적합니다.

tool.execution_start

도구 실행을 시작할 때 내보냅니다.

데이터 필드유형필수설명
toolCallIdstring이 도구 호출에 대한 고유 식별자
toolNamestring도구의 이름(예: "bash", , "edit"``"grep")
argumentsobject
구문 분석된 인수가 도구에 전달됨
mcpServerNamestring
MCP 서버에서 도구를 제공하는 경우 MCP 서버 이름
mcpToolNamestring
MCP 서버의 원래 도구 이름
parentToolCallIdstring
하위 에이전트에서 호출할 때 설정

tool.execution_partial_result

임시. 실행 중인 도구의 증분 출력(예: 스트리밍 bash 출력).

데이터 필드유형필수설명
toolCallIdstring해당 항목과 일치 tool.execution_start
partialOutputstring증분 출력 청크

tool.execution_progress

임시. 실행 중인 도구에서 사람이 읽을 수 있는 진행 상태(예: MCP 서버 진행률 알림).

데이터 필드유형필수설명
toolCallIdstring해당 항목과 일치 tool.execution_start
progressMessagestring진행 상태 메시지

tool.execution_complete

도구 실행이 성공적으로 또는 오류와 함께 완료될 때 내보냅니다.

데이터 필드유형필수설명
toolCallIdstring해당 항목과 일치 tool.execution_start
successboolean실행 성공 여부
modelstring
이 도구 호출을 생성한 모델
interactionIdstring
상호 작용 식별자
isUserRequestedboolean
          `true` 사용자가 이 도구 호출을 명시적으로 요청한 경우 |

| result | Result | | 성공 시 프레젠테이션(아래 참조) | | error | { message, code? } | | 실패 시 표시됨 | | toolTelemetry | object | | 도구별 원격 분석 | | parentToolCallId | string | | 하위 에이전트에서 호출할 때 설정 |

          **
          `Result` 필드:**
분야유형필수설명
contentstringLLM으로 전송된 간결한 결과(토큰 효율성을 위해 잘려질 수 있음)
detailedContentstring
전체 표시 결과, diffs와 같은 전체 콘텐츠 유지
contentsContentBlock[]
구조적 콘텐츠 블록(텍스트, 터미널, 이미지, 오디오, 리소스)

tool.user_requested

사용자가 도구 호출을 명시적으로 요청할 때 내보내집니다(모델이 호출하도록 선택하는 대신).

데이터 필드유형필수설명
toolCallIdstring이 도구 호출에 대한 고유 식별자
toolNamestring사용자가 호출하려는 도구의 이름
argumentsobject
호출에 대한 인수

세션 수명 주기 이벤트

session.idle

임시. 에이전트가 모든 처리를 완료했으며 다음 메시지를 준비했습니다. 이는 턴이 완전히 완료되었다는 신호입니다.

데이터 필드유형필수설명
backgroundTasksBackgroundTasks
에이전트가 유휴 상태가 되었을 때 백그라운드 에이전트/셸이 계속 실행됩니다.

session.error

세션 처리 중에 오류가 발생했습니다.

데이터 필드유형필수설명
errorTypestring오류 범주(예: "authentication", "quota", "rate_limit")
messagestring사람이 읽을 수 있는 오류 메시지
stackstring
오류 스택 추적
statusCodenumber
업스트림 요청의 HTTP 상태 코드
providerCallIdstring
          GitHub 서버 쪽 로그 상관 관계에 대한 요청 추적 ID |

session.compaction_start

컨텍스트 창 압축이 시작되었습니다. 데이터 페이로드가 비어 있습니다({}).

session.compaction_complete

컨텍스트 창 압축이 완료되었습니다.

데이터 필드유형필수설명
successboolean압축 성공 여부
errorstring
압축에 실패한 경우 오류 메시지
preCompactionTokensnumber
압축 전 토큰
postCompactionTokensnumber
압축 후 토큰
preCompactionMessagesLengthnumber
압축 전 메시지 수
messagesRemovednumber
제거된 메시지
tokensRemovednumber
제거된 토큰
summaryContentstring
압축된 기록의 LLM 생성 요약
checkpointNumbernumber
복구를 위해 만든 검사점 스냅샷 번호
checkpointPathstring
검사점이 저장된 파일 경로
compactionTokensUsed{ input, output, cachedInput }
압축 LLM 호출에 대한 토큰 사용량
requestIdstring
          GitHub 압축 호출에 대한 요청 추적 ID |

session.title_changed

임시. 세션의 자동 생성된 타이틀이 업데이트되었습니다.

데이터 필드유형필수설명
titlestring새 세션 제목

session.context_changed

세션의 작업 디렉터리 또는 리포지토리 컨텍스트가 변경되었습니다.

데이터 필드유형필수설명
cwdstring현재 작업 디렉터리
gitRootstring
Git 리포지토리 루트
repositorystring
형식의 "owner/name" 리포지토리
branchstring
현재 Git 브랜치

session.usage_info

임시. 컨텍스트 창 사용률 스냅샷

데이터 필드유형필수설명
tokenLimitnumber모델의 컨텍스트 창에 대한 최대 토큰
currentTokensnumber컨텍스트 창의 현재 토큰
messagesLengthnumber대화의 현재 메시지 수

session.task_complete

에이전트가 할당된 작업을 완료했습니다.

데이터 필드유형필수설명
summarystring
완료된 작업의 요약

session.shutdown

세션이 종료되었습니다.

데이터 필드유형필수설명
shutdownType"routine" | "error"정상적인 종료 또는 충돌
errorReasonstring
          `shutdownType`이 `"error"`일 때 오류 설명 |

| totalPremiumRequests | number | ✅ | 사용된 총 프리미엄 API 요청 | | totalApiDurationMs | number | ✅ | 누적 API 호출 시간(밀리초) | | sessionStartTime | number | ✅ | 세션이 시작된 때의 Unix 타임스탬프(ms) | | codeChanges | { linesAdded, linesRemoved, filesModified } | ✅ | 집계 코드 변경 메트릭 | | modelMetrics | Record<string, ModelMetric> | ✅ | 모델별 사용량 분석 | | currentModel | string | | 종료 시 선택한 모델 |

권한 및 사용자 입력 이벤트

이러한 이벤트는 에이전트가 계속하기 전에 사용자의 승인 또는 입력이 필요할 때 내보내집니다.

permission.requested

임시. 에이전트는 작업을 수행할 수 있는 권한이 필요합니다(명령 실행, 파일 쓰기 등).

데이터 필드유형필수설명
requestIdstring이를 통해 응답하세요. session.respondToPermission()
permissionRequestPermissionRequest요청되는 권한의 세부 정보
          `permissionRequest`는 `kind`에 대한 구별된 합집합입니다.
kind주요 필드설명
"shell"
          `fullCommandText`, `intention`, , `commands[]`, `possiblePaths[]` | 셸 명령 실행 |

| "write" | fileName, diff, , intention, newFileContents? | 파일 쓰기/수정 | | "read" | path, intention | 파일 또는 디렉터리 읽기 | | "mcp" | serverName, toolName, toolTitle, args?``readOnly | MCP 도구 호출 | | "url" | url, intention | URL 가져오기 | | "memory" | subject, fact, citations | 메모리 저장 | | "custom-tool" | toolName, toolDescription, args? | 사용자 지정 도구 호출 |

또한 모든 kind 변형에는 요청을 트리거한 도구 호출에 대한 선택적 toolCallId 연결도 포함됩니다.

permission.completed

임시. 권한 요청이 해결되었습니다.

데이터 필드유형필수설명
requestIdstring해당 항목과 일치 permission.requested
result.kindstring다음 중 하나: "approved", "denied-by-rules", "denied-interactively-by-user", "denied-no-approval-rule-and-could-not-request-from-user"``"denied-by-content-exclusion-policy"

user_input.requested

임시. 에이전트가 사용자에게 질문을 하고 있습니다.

데이터 필드유형필수설명
requestIdstring다음 방법으로 응답하십시오: session.respondToUserInput()
questionstring사용자에게 제시할 질문
choicesstring[]
사용자에 대해 미리 정의된 선택
allowFreeformboolean
자유 형식 텍스트 입력 허용 여부

user_input.completed

임시. 사용자 입력 요청이 확인되었습니다.

데이터 필드유형필수설명
requestIdstring해당 항목과 일치 user_input.requested

elicitation.requested

임시. 에이전트에는 사용자의 구조적 양식 입력이 필요합니다(MCP 유도 프로토콜).

데이터 필드유형필수설명
requestIdstring이를 통해 응답하세요. session.respondToElicitation()
messagestring필요한 정보에 대한 설명
mode"form"
유도 모드(현재는 "form"만 가능)
requestedSchema{ type: "object", properties, required? }양식 필드를 설명하는 JSON 스키마

elicitation.completed

임시. 유도 요청이 확인되었습니다.

데이터 필드유형필수설명
requestIdstring해당 항목과 일치 elicitation.requested

하위 에이전트 및 기술 이벤트

subagent.started

사용자 지정 에이전트가 하위 에이전트로 호출되었습니다.

데이터 필드유형필수설명
toolCallIdstring이 하위 에이전트를 생성한 부모 도구 호출
agentNamestring하위 에이전트의 내부 이름
agentDisplayNamestring사람이 읽을 수 있는 표시 이름
agentDescriptionstring하위 에이전트가 수행하는 작업 설명

subagent.completed

하위 에이전트가 성공적으로 완료되었습니다.

데이터 필드유형필수설명
toolCallIdstring해당 항목과 일치 subagent.started
agentNamestring내부 이름
agentDisplayNamestring표시 이름

subagent.failed

하위 에이전트에 오류가 발생했습니다.

데이터 필드유형필수설명
toolCallIdstring해당 항목과 일치 subagent.started
agentNamestring내부 이름
agentDisplayNamestring표시 이름
errorstring오류 메시지

subagent.selected

현재 요청을 처리하기 위해 사용자 지정 에이전트를 선택(유추)했습니다.

데이터 필드유형필수설명
agentNamestring선택한 에이전트의 내부 이름
agentDisplayNamestring표시 이름
toolsstring[] | null이 에이전트에서 사용할 수 있는 도구 이름; null 모든 도구에 대해

subagent.deselected

사용자 지정 에이전트가 선택 취소되어 기본 에이전트로 돌아갑니다. 응답 페이로드는 비어 있습니다({}).

skill.invoked

현재 대화에 대한 기술이 활성화되었습니다.

데이터 필드유형필수설명
namestring기술 이름
pathstringSKILL.md 정의에 대한 파일 경로
contentstring기술 콘텐츠 전체가 대화에 삽입됨
allowedToolsstring[]
이 기술이 활성 상태일 때 자동으로 승인된 도구
pluginNamestring
스킬이 기원한 플러그인
pluginVersionstring
플러그 인 버전

기타 이벤트

abort

현재 턴이 중단되었습니다.

데이터 필드유형필수설명
reasonstring순서가 중단된 이유(예: "user initiated")

user.message

사용자가 메시지를 보냈습니다. 세션 타임라인을 위해 기록됩니다.

데이터 필드유형필수설명
contentstring사용자의 메시지 텍스트
transformedContentstring
전처리 후 변환된 버전
attachmentsAttachment[]
파일, 디렉터리, 선택 영역, Blob 또는 GitHub 참조 첨부 파일
sourcestring
메시지 원본 식별자
agentModestring
에이전트 모드: "interactive", "plan", "autopilot"또는 "shell"
interactionIdstring
상호 작용 식별자

system.message

시스템 또는 개발자 프롬프트가 대화에 삽입되었습니다.

데이터 필드유형필수설명
contentstring프롬프트 텍스트
role"system" | "developer"메시지 역할
namestring
원본 식별자
metadata{ promptVersion?, variables? }
프롬프트 템플릿 메타데이터

external_tool.requested

임시. 에이전트는 외부 도구(SDK 소비자가 제공하는 도구)를 호출하려고 합니다.

데이터 필드유형필수설명
requestIdstring이를 통해 응답하세요. session.respondToExternalTool()
sessionIdstring이 요청이 속한 세션
toolCallIdstring이 호출에 대한 도구 호출 ID
toolNamestring외부 도구의 이름
argumentsobject
도구의 인수

external_tool.completed

임시. 외부 도구 요청이 확인되었습니다.

데이터 필드유형필수설명
requestIdstring해당 항목과 일치 external_tool.requested

exit_plan_mode.requested

임시. 에이전트가 계획을 만들고 계획 모드를 종료하려고 합니다.

데이터 필드유형필수설명
requestIdstring이를 통해 응답하세요. session.respondToExitPlanMode()
summarystring계획 요약
planContentstring전체 계획 파일 콘텐츠
actionsstring[]사용 가능한 사용자 작업(예: 승인, 편집, 거부)
recommendedActionstring제안된 작업

exit_plan_mode.completed

임시. 종료 계획 모드 요청이 해결되었습니다.

데이터 필드유형필수설명
requestIdstring해당 항목과 일치 exit_plan_mode.requested

command.queued

임시. 슬래시 명령이 실행을 위해 큐에 대기되었습니다.

데이터 필드유형필수설명
requestIdstring이를 통해 응답하세요. session.respondToQueuedCommand()
commandstring슬래시 명령 텍스트(예: /help, /clear)

command.completed

임시. 큐에 대기된 명령이 해결되었습니다.

데이터 필드유형필수설명
requestIdstring해당 항목과 일치 command.queued

빠른 참조: 에이전시적 단계 흐름

일반적인 에이전트 동작은 다음 순서로 이벤트를 발생시킵니다.

assistant.turn_start          → Turn begins
├── assistant.intent          → What the agent plans to do (ephemeral)
├── assistant.reasoning_delta → Streaming thinking chunks (ephemeral, repeated)
├── assistant.reasoning       → Complete thinking block
├── assistant.message_delta   → Streaming response chunks (ephemeral, repeated)
├── assistant.message         → Complete response (may include toolRequests)
├── assistant.usage           → Token usage for this API call (ephemeral)
│
├── [If tools were requested:]
│   ├── permission.requested  → Needs user approval (ephemeral)
│   ├── permission.completed  → Approval result (ephemeral)
│   ├── tool.execution_start  → Tool begins
│   ├── tool.execution_partial_result  → Streaming tool output (ephemeral, repeated)
│   ├── tool.execution_progress        → Progress updates (ephemeral, repeated)
│   ├── tool.execution_complete        → Tool finished
│   │
│   └── [Agent loops: more reasoning → message → tool calls...]
│
assistant.turn_end            → Turn complete
session.idle                  → Ready for next message (ephemeral)

모든 이벤트 유형 한눈에 보기

이벤트 유형Ephemeral카테고리키 데이터 필드
assistant.turn_start
도우미
          `turnId`, `interactionId?` |

| assistant.intent | ✅ | 도우미 | intent | | assistant.reasoning | | 도우미 | reasoningId, content | | assistant.reasoning_delta | ✅ | 도우미 | reasoningId, deltaContent | | assistant.streaming_delta | ✅ | 도우미 | totalResponseSizeBytes | | assistant.message | | 도우미 | messageId, content, toolRequests?, outputTokens?``phase? | | assistant.message_delta | ✅ | 도우미 | messageId, deltaContent, parentToolCallId? | | assistant.turn_end | | 도우미 | turnId | | assistant.usage | ✅ | 도우미 | model, inputTokens?, outputTokens?, cost?``duration? | | tool.user_requested | | 도구 | toolCallId, toolName, arguments? | | tool.execution_start | | 도구 | toolCallId, toolName, , arguments?, mcpServerName? | | tool.execution_partial_result | ✅ | 도구 | toolCallId, partialOutput | | tool.execution_progress | ✅ | 도구 | toolCallId, progressMessage | | tool.execution_complete | | 도구 | toolCallId, success, , result?, error? | | session.idle | ✅ | 세션 | backgroundTasks? | | session.error | | 세션 | errorType, message, statusCode? | | session.compaction_start | | 세션 | (비어 있음) | | session.compaction_complete | | 세션 | success, preCompactionTokens?, summaryContent? | | session.title_changed | ✅ | 세션 | title | | session.context_changed | | 세션 | cwd, gitRoot?, , repository?, branch? | | session.usage_info | ✅ | 세션 | tokenLimit, currentTokens, messagesLength | | session.task_complete | | 세션 | summary? | | session.shutdown | | 세션 | shutdownType, codeChanges, modelMetrics | | permission.requested | ✅ | 허가 | requestId, permissionRequest | | permission.completed | ✅ | 허가 | requestId, result.kind | | user_input.requested | ✅ | 사용자 입력 | requestId, question, choices? | | user_input.completed | ✅ | 사용자 입력 | requestId | | elicitation.requested | ✅ | 사용자 입력 | requestId, message, requestedSchema | | elicitation.completed | ✅ | 사용자 입력 | requestId | | subagent.started | | 하위 에이전트 | toolCallId, agentName, agentDisplayName | | subagent.completed | | 하위 에이전트 | toolCallId, agentName, agentDisplayName | | subagent.failed | | 하위 에이전트 | toolCallId, agentName, error | | subagent.selected | | 하위 에이전트 | agentName, agentDisplayName, tools | | subagent.deselected | | 하위 에이전트 | (비어 있음) | | skill.invoked | | 기술 | name, path, , content, allowedTools? | | abort | | 제어 | reason | | user.message | | 사용자 | content, attachments?, agentMode? | | system.message | | 시스템 | content, role | | external_tool.requested | ✅ | 외부 도구 | requestId, toolName, arguments? | | external_tool.completed | ✅ | 외부 도구 | requestId | | command.queued | ✅ | Command | requestId, command | | command.completed | ✅ | Command | requestId | | exit_plan_mode.requested | ✅ | 계획 모드 | requestId, summary, , planContent, actions | | exit_plan_mode.completed | ✅ | 계획 모드 | requestId |