# Task-522: 대시보드 CPU/RAM SSE 실시간 갱신

## 문제
task-521에서 서버 CPU/RAM 표시를 추가했으나, SSE refresh가 파일 변경 시에만 발생하여 CPU/RAM 수치가 거의 갱신되지 않음.

## 수정 방향
별도 폴링 대신, **기존 SSE 스트림에 server-stats 이벤트를 태운다.** 2초 간격 루프에서 파일 변경 체크와 함께 server-stats도 매번 (또는 5회마다=10초) 전송.

## 수정 파일

### 1. `/home/jay/workspace/dashboard/server.py`

#### Simple HTTP 버전 — `handle_stream()` 메서드 (977행 부근)
기존 2초 루프 안에 server-stats 이벤트 추가:
```python
# 기존 while True 루프 안, 파일 변경 체크 후:
# server-stats를 매 5사이클(10초)마다 전송
if keepalive_counter % 5 == 0:
    try:
        import psutil
        stats = {
            "cpu_percent": psutil.cpu_percent(interval=None),
            "ram_percent": psutil.virtual_memory().percent,
            "ram_used_gb": round(psutil.virtual_memory().used / (1024**3), 1),
            "ram_total_gb": round(psutil.virtual_memory().total / (1024**3), 1),
        }
        stats_data = json.dumps(stats)
        self.wfile.write(f"event: server-stats\ndata: {stats_data}\n\n".encode())
        self.wfile.flush()
    except Exception:
        pass
```

#### FastAPI 버전 — `stream_sse()` (1351행 부근)
동일하게 async generator 안에 추가:
```python
if keepalive_counter % 5 == 0:
    try:
        import psutil
        stats = {
            "cpu_percent": psutil.cpu_percent(interval=None),
            "ram_percent": psutil.virtual_memory().percent,
            "ram_used_gb": round(psutil.virtual_memory().used / (1024**3), 1),
            "ram_total_gb": round(psutil.virtual_memory().total / (1024**3), 1),
        }
        yield f"event: server-stats\ndata: {json.dumps(stats)}\n\n"
    except Exception:
        pass
```

### 2. `/home/jay/workspace/dashboard/index.html`

#### SSE 이벤트 리스너 추가 (1054행 부근, es.addEventListener 영역)
```javascript
es.addEventListener('server-stats', (e) => {
    try {
        const stats = JSON.parse(e.data);
        setServerStats(stats);
    } catch {}
});
```

#### fetchData에서 server-stats 제거 (선택적)
- Promise.all에서 `/api/server-stats` fetch 제거해도 됨 (SSE가 담당)
- 또는 초기 로드용으로 남겨도 OK

## 테스트
1. 대시보드 접속 → 10초마다 CPU/RAM 수치 자동 변경 확인
2. SSE 연결 상태에서 실시간 갱신 확인 (개발자 도구 Network → EventStream)
3. SSE 끊김 시 폴링 폴백에서도 server-stats 갱신 (fetchData에 남겨둔 경우)
4. LIVE OFF 시 갱신 중단 확인

## 작업 레벨: Lv.1
