배경
#39 (PR #68) 검증 중 UG/FE 인터페이스 결함 2 가지 확인:
- SSE 가 끊기면 UI agent 버블의 "발화중" 표시가 영구히 풀리지 않고 stuck.
- 응답 도중 사용자가 명시 중단을 원할 때 처리 path 가 없음.
Chat.tsx 의 AbortController 가 dead code.
본 이슈는 UG/FE 의 인터페이스 측 결함만 다룸. 사용자 메시지의 의미 판단 / batch merge 정책은 Primary 책임 (#72).
상태 (#75 PR 4 머지 후)
✅ 해소
결함 1 — Streaming flag stuck
❌ 남은 작업
결함 2 — Stop 버튼 + AbortController 활용
- 명시 Stop 버튼이 UI 에 없음
Chat.tsx 의 AbortController 가 여전히 dead code (만들기만 하고 abort() 미호출)
- 자연어 cancel (예: "그만") 은 main LLM 의 의미 판단 — latency 큼. Stop 버튼으로 즉시 cancel 이 깔끔.
- POST
/api/chat 진행 중 abort 시 Primary 의 background task cancel 처리 (SessionRuntime.aclose 와 비슷한 패턴) 도 필요
결함 3 — queued SSE 이벤트 UI 표시
별 영역 (본 이슈 scope 아님)
- 결함 3 (외부 proxy SSE idle timeout, 17~20s cancel) — 환경 진단 후 UG
keepalive=15s 단축 고려. 별 이슈로 추적
작업 plan
A. Stop 버튼 + AbortController 활성화 (FE)
- 사용자 발화 입력창 옆 Stop 버튼 (응답 진행 중에만 활성화)
- 클릭 시
ctrl.abort() 호출 → UG POST /api/chat 요청 중단
- streaming agent 버블 강제 마무리 + "(중단됨)" 표시
B. Primary 측 task cancel 연동
C. queued 이벤트 표시 (FE)
배경
#39 (PR #68) 검증 중 UG/FE 인터페이스 결함 2 가지 확인:
Chat.tsx의AbortController가 dead code.본 이슈는 UG/FE 의 인터페이스 측 결함만 다룸. 사용자 메시지의 의미 판단 / batch merge 정책은 Primary 책임 (#72).
상태 (#75 PR 4 머지 후)
✅ 해소
결함 1 — Streaming flag stuck
Chat.tsx의done/error이벤트 처리에서streaming: false풀어줌.error시failed: true표시도 추가client_disconnect시 종료 이벤트 송출 부분은 M3 재설계 — UG↔P/A chat tier 분리 + schema 재정의 + 어휘 정렬 #75 chat protocol 전환 (UG ↔ Primary 의GET /chat/streamforward) 로 자연 해소❌ 남은 작업
결함 2 — Stop 버튼 + AbortController 활용
Chat.tsx의AbortController가 여전히 dead code (만들기만 하고 abort() 미호출)/api/chat진행 중 abort 시 Primary 의 background task cancel 처리 (SessionRuntime.aclose 와 비슷한 패턴) 도 필요결함 3 —
queuedSSE 이벤트 UI 표시ChatEventType.QUEUED가 wire schema 에 정의되어 있으나 FE 가 표시 안 함별 영역 (본 이슈 scope 아님)
keepalive=15s단축 고려. 별 이슈로 추적작업 plan
A. Stop 버튼 + AbortController 활성화 (FE)
ctrl.abort()호출 → UGPOST /api/chat요청 중단B. Primary 측 task cancel 연동
/chat/sendbackground task 도 cancelSessionRuntime.attach_task로 보관 중인 task 를 명시 cancel 하는 endpoint (POST /chat/cancel?session_id=X) 추가 또는 비슷한 pathC.
queued이벤트 표시 (FE)Chat.tsx의handleSSEEvent에queuedcase 추가 → 활성 user 버블에 "큐 적재됨" 표시