v0.2.69
v0.2.69 — CLI 에이전트 채팅 실시간 스트리밍 (Phase A.5)
handlers.ts
- 신규 IPC:
aiCliStreamStart/aiCliStreamCancel(invoke) +aiCliStreamData/aiCliStreamEnd(이벤트 push). - 신규
runCliStream(req, sender)—runCliOneShot와 동일 spawn (cwd/timeout/ANSI strip/8MB cap/ENOENT) 이지만 buffer 대신 stdout 청크를aiCliStreamData로 즉시 emit. 종료 시aiCliStreamEnd.activeCliStreamsMap 으로 취소 지원. - removeHandler 2개 cleanup 추가.
preload.ts
- IPC 상수 4개 +
AiCliStreamStartPayloadDto+ API 4개 (aiCliStreamStart/aiCliStreamCancel/onAiCliStreamData/onAiCliStreamEnd, 기존onTerminalData구독 패턴 mirror).
chatStore.ts
- transient state
streamingText: string|null(persist 안 함 — 토큰마다 localStorage 쓰기 방지) + actionsappendStreamingText/resetStreaming. sendChatMessageCLI 분기: 스트리밍 API 존재 시 streamId 생성 →onAiCliStreamData로 청크 accumulate (appendStreamingText) →onAiCliStreamEnd에서 Promise resolve. 미존재 시 one-shot fallback.finally에서resetStreaming.
ChatPanel.tsx
streamingText라이브 버블 (blinking cursor) + 첫 토큰 전까지만 "생성 중…" spinner + 스트리밍 갱신 시 auto-scroll.
검증
npx tsc --noEmitexit=0.npm run build성공 — main 396→400.89 kB, preload 11.5→12.35 kB, renderer 5.91s.
스트리밍 harness 테스트
- (가짜 streaming API 로 실제
sendChatMessage구동): - user "hi there" → assistant 청크 accumulate "Hello " → "Hello from " → "Hello from CLI stream" (라이브 확인) → 최종 메시지 영속 +
streamingTextnull reset. PASS ✓. - 임시 harness 삭제.
변경 파일
electron/ipc/handlers.ts— 스트리밍 IPC +runCliStream+ ChildProcessWithoutNullStreams import.electron/preload.ts— 스트리밍 IPC 상수 + DTO + API 4개.src/store/chatStore.ts— streamingText + 스트리밍 send 경로.src/components/Chat/ChatPanel.tsx— 라이브 버블 + spinner gate + auto-scroll.package.json0.2.68 → 0.2.69.
핸드오프 메모
- Phase A.5 = 매 메시지 spawn 이지만 stdout 라이브 스트리밍 (체감상 "세션처럼" 응답). 멀티턴은 여전히 history prepend.
- Phase B (영속 인터랙티브 PTY + xterm.js, node-pty) 는 미구현 — 진짜 TUI/권한프롬프트/장기 세션 필요 시.
- 라이브 round-trip 은 GUI + CLI 인증 필요 (사용자 검증). 스트리밍 누적 로직 자체는 harness 로 검증 완료.
📦 GitHub 릴리스 노트: v0.2.69