이벤트
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 안에 topic과 event를 넣습니다.
| 동작 | 계약 |
|---|---|
| Replay cursor | Last-Event-ID header 또는 ?lastEventId= query |
| Replay buffer | src/core/event-bus.ts의 최근 1000개 이벤트 |
| Listener cap | 동시 SSE listener 256개. 초과 시 503 {"error":"SSE_CAPACITY"} |
| Heartbeat | 15초마다 comment ping |
| Replay gap | {"topic":"system","event":"replay_gap"} |
| Fallback | WebSocket은 /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.ts와 src/manager/worker-sse-client.ts로 각 worker의 GET /api/events를 server-side 구독하고 latest-message cache를 갱신합니다.
트레이스 파일
세션 trace는 ~/.cli-jaw/traces/에 NDJSON 파일로 저장됩니다. 각 줄은 타임스탬프와 trace 식별자가 포함된 이벤트입니다.