이벤트

CLI-JAW의 브라우저 UI는 SSE-first 이벤트 채널을 사용합니다. Provider 출력은 내부 NDJSON/stream-json 파서로 정규화되고, public Web 이벤트는 GET /api/events로 전달됩니다.

SSE 이벤트 채널

GET /api/events
Accept: text/event-stream
Last-Event-ID: <last-seen-id>

/api/events는 data-only SSE stream입니다. 서버는 SSE event: 필드를 쓰지 않고, JSON data: payload 안에 topicevent를 넣습니다.

동작계약
Replay cursorLast-Event-ID header 또는 ?lastEventId= query
Replay buffersrc/core/event-bus.ts의 최근 1000개 이벤트
Listener cap동시 SSE listener 256개. 초과 시 503 {"error":"SSE_CAPACITY"}
Heartbeat15초마다 comment ping
Replay gap{"topic":"system","event":"replay_gap"}
FallbackWebSocket은 /api/events가 한 번도 열리지 않는 pre-X-01 server에서만 client/TUI fallback
Transient drop UX빠른 SSE 재연결은 조용히 복구하고, 8초 이상 지속되는 끊김만 disconnected 메시지로 표시

주요 이벤트

이벤트페이로드설명
message{id, role, content}저장된 채팅 메시지
agent_tool{traceId, name, input}에이전트 도구 호출
agent_output{traceId, content}에이전트 텍스트 출력 조각
agent_done{traceId, status}에이전트 실행 종료
queue_update{pending, active}메시지 큐 상태
orc_state{phase, status}PABCD 오케스트레이션 상태
steer_started{prompt}Steer 프롬프트 주입
goal_done{goalId}목표 완료
goal_done_rejected{reason}목표 완료 요청 거부
goal_pause_detected{reason}목표 일시정지 감지
goal_pause_gate_pending{reason}첫 감사 pause armed; 자동 goal continuation 억제
session_switched{sessionId}활성 세션 전환
agent:claude-e:*{event}Claude employee 런타임 이벤트 네임스페이스

Provider NDJSON 스트림

메시지 전송과 명령 실행은 REST 요청으로 시작되며, provider 출력은 줄바꿈으로 구분된 JSON 이벤트로 스트리밍됩니다. 정규화된 이벤트는 src/core/bus.ts를 거쳐 public 이벤트는 SSE event bus로 publish되고, collector/forwarder용 internal listener에도 fan-out됩니다.

POST /api/message
POST /api/command

{"type":"thinking","content":"..."}
{"type":"text","content":"Hello! "}
{"type":"tool","name":"Bash","input":{...}}
{"type":"done","status":"ok"}

Manager worker SSE

jaw dashboard serve의 React manager app은 manager HTTP endpoint를 polling합니다. Worker instance의 live progress는 manager server가 src/manager/worker-events.tssrc/manager/worker-sse-client.ts로 각 worker의 GET /api/events를 server-side 구독하고 latest-message cache를 갱신합니다.

트레이스 파일

세션 trace는 ~/.cli-jaw/traces/에 NDJSON 파일로 저장됩니다. 각 줄은 타임스탬프와 trace 식별자가 포함된 이벤트입니다.