이벤트 받기
CLI가 말하는 모든 것은 AbstractEvent 하위 클래스로 도착합니다.
import { AssistantEvent, ResultEvent, SystemEvent } from 'activecli';
command.subscribe((event) => { if (event instanceof AssistantEvent && event.hasText()) { process.stdout.write(event.text); }
if (event instanceof ResultEvent) { console.log('turn finished:', event.raw['subtype']); }});AssistantEvent.text
섹션 제목: “AssistantEvent.text”AssistantEvent.text는 그러지 않았다면 모든 호출자가 손으로 써야 했을 message.content 순회입니다 — CLI는 텍스트를 그 안에 블록 배열로 중첩해 넣고, 그중 일부만이 텍스트입니다. 어시스턴트가 도구만 호출했을 때는 비어 있는데, 이는 정상이며 어시스턴트가 아무 말도 하지 않은 것과는 다릅니다.
미리 알아둘 두 가지 동작
섹션 제목: “미리 알아둘 두 가지 동작”- 모델링되지 않은 항목도 도착합니다. 라이브러리에 대응하는 클래스가 없는 항목 타입은 버려지는 대신
GenericEvent가 됩니다. 그래서 이 라이브러리보다 앞서 나간 CLI가 있어도 이벤트가 조용히 사라지지 않습니다. - 프로토콜이 아닌 출력은 실패가 아니라 건너뜁니다. CLI들은 경고를 프로토콜과 같은 스트림에 씁니다. JSON이 아닌 줄은 그냥 지나칩니다.
raw는 원본 항목을 보관합니다
섹션 제목: “raw는 원본 항목을 보관합니다”모든 이벤트는 CLI의 원본 항목을 raw 아래에 그대로 보관합니다. 어떤 필드도 제거되거나 이름이 바뀌지 않습니다.
command.subscribe((event) => { const unknown = event.raw['unknown_future_field']; // 그대로 남아 있음});GenericEvent가 단지 “치명적이지 않은” 수준을 넘어 쓸모 있는 이유가 바로 이것입니다. 라이브러리가 모델링하지 않은 항목이라도, 그것을 이해하는 호출자는 여전히 온전히 읽을 수 있습니다.
다음으로 볼 것
섹션 제목: “다음으로 볼 것”- 권한 요청에 답하기 —
PermissionRequestEvent는 별도 채널을 갖습니다. - 레퍼런스: 이벤트 — 모든 하위 클래스와 그것이 실어 나르는 것.
- 세션 생명주기 — 인터럽트 이후의
error_during_executionsubtype이 실제로 뜻하는 것.