d3ro-voice/memory/handoff-archive/2026-04-12-1830.md

162 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Session Handoff — 2026-04-12 18:30 (Phase 3.2 Premium LLM 완결 + Bug 13 + Gemma4)
> From: macOS (yunchan-ui-MacBookPro)
> Last commit: `6e52c18` — feat(desktop+server): Phase 3.2 Premium LLM
> Branch: `main`
> Remote: `https://gitlab.twentyoz.kr:8443/d3r0/voice.git`
> Working tree: clean (push 필요)
## ✅ 이번 세션 요약 — 빅뱅 8/8 마지막 성공 기준 달성 (commit 3개)
### `a744551` — Bug 13 전면 해소
- VoiceConversationPage: Snackbar 에러 배너 (severity=warning filled, 4초)
- VoiceModeService: minBytes 가드 + 빈 STT 가드 + _errorHideTimer leak 수정
- i18n: conversation.error.phase.{stt,llm,tts} + noSpeech 키
### `d397bcb` — LLM 기본 모델 gemma4:e4b 전면 전환
- LocalLLMService 3개 fallback + think:false 명시
- 12개 locale JSON + 10개 site locale TS + OnboardingModal/OllamaGuideModal
- 설계서 00/05, phase-14, V2-5 Mac 가이드 업데이트
- 실측: refine 42.9초 → 3.9초 (gemma4:e4b, non-reasoning)
### `6e52c18` — Phase 3.2 Premium LLM (23파일, +1107/-307)
- **PremiumLLMService** 신규 — Supabase functions.invoke() 기반, processText/chatStream
- **llm-prompts.ts** — SYSTEM_PROMPTS 공유 모듈 (resolveSystemPrompt)
- **VoiceModeService** — _getLLMProcessor/_runProcessorWithFallback 라우터 + premium-llm-fallback 이벤트
- **CloudSyncService** — getAccessToken(async), invokeFunction(에러 body 파싱)
- **quota.ts** — 모델별 쿼터 (llm_haiku/sonnet/opus × free/pro/pro_plus), 주간/일간 분리
- **llm-proxy** — 모델별 체크+소비, verify_jwt=false (2026 sb_publishable_ 호환)
- **Migration** — tier team→pro_plus, overage_credits, consume_quota RPC
- **Settings UI** — Backend 드롭다운 + Premium 시 Ollama 숨김 + 라이선스 모달 오픈
- **LicenseModal** — SaaS 전환 (키 입력 제거 → 구독 관리 + 업그레이드 버튼)
- **AppLayout** — 상단 중앙 fallback Snackbar 배너
- **코드 리뷰 /simplify** — 7개 이슈 수정 (SYSTEM_PROMPTS 중복, IPC 헬퍼, consumeQuota 이중 DB, AbortController 동시성, 등)
## 🚧 미해결 이슈 (이월)
### 1. 세션 만료 렌더러 미동기화 버그
CloudSyncService.init()에서 stored token 없을 때 auth-changed null 미emit → UI가 로그인 상태로 보이지만 실제론 비인증. Premium 선택 시 fallback으로 떨어짐. (memory/feedback_session_expiry_bug.md)
### 2. Payple 결제 연동 (Phase 3.2-B)
업그레이드 버튼 → "결제 연동 준비 중 (Payple)" alert 스텁. 사용자 Payple 가맹점 등록 선행 필요 (CST_ID + CUST_KEY). Stripe Edge Function 3개(checkout/webhook/portal) → Payple로 이관.
### 3. 대시보드 Premium 상태 표시
현재 대시보드에 Premium LLM 쿼터/모델/사용량 정보 없음. CRT 서비스 섹션에 Premium LLM indicator 추가 필요.
### 4. Supabase verify_jwt 비호환
2026 sb_publishable_ 키와 Edge Function Gateway의 JWT 검증 비호환. llm-proxy만 verify_jwt=false. 다른 함수들(stt-proxy, team-invite 등)도 같은 이슈 있을 수 있음 — 사용 시 확인.
### 5. LemonSqueezy 코드 잔존
LicenseService에 LemonSqueezy API 호출 코드가 아직 남아있음 (LEMONSQUEEZY_API 상수). SaaS(Payple) 전환 시 정리 필요.
## 🧭 다음 사이클 후보
1. **Phase 3.2-B — Payple 결제 연동** (Stripe → Payple 전면 이관)
- Payple 가맹점 등록 → CST_ID/CUST_KEY 발급
- Edge Function 재작성 (payple-checkout/webhook/portal)
- DB subscriptions 컬럼 개편 (stripe_* → payple_*)
- 웹 결제 페이지 UI 교체
- LemonSqueezy 코드 정리
2. **대시보드 Premium 상태 표시**
- CRT 서비스 섹션에 Premium LLM indicator
- 쿼터 사용량 카드 (오늘/주간)
- 모델 선택 UI (Haiku/Sonnet/Opus — 티어별 가용)
3. **세션 만료 버그 수정**
- CloudSyncService.init() no-token 경로에 auth-changed emit
- 렌더러에 Cloud 기능 "로그인 필요" 배지
4. **SSE 스트리밍 Premium** (현재 비스트리밍 → 실시간 토큰 yield)
5. **Voice Conversation Premium** (chatStream도 Premium 경로 + SSE)
## 🔑 다음 세션 시작 시 확인
```bash
git status # clean
git log --oneline -5 # HEAD=6e52c18
pgrep -lf "Electron\.app|next dev"
lsof -i :5173 -sTCP:LISTEN
lsof -i :3000 -sTCP:LISTEN
# 죽어있으면
nohup npm run dev > /tmp/d3ro-desktop.log 2>&1 & disown
nohup npm --workspace=@d3ro/web run dev > /tmp/d3ro-web.log 2>&1 & disown
```
## 📦 의존성 / 도구
- Node 22.22.2 / Python 3.13.13 / Supabase CLI 2.84.2
- Ollama 0.20.5 (gemma4:e4b 기본, qwen3:4b 레거시)
- Electron 33.4.11 / Next.js 15.5.14
- SoX 14.4.2 (brew) / faster-whisper base (CPU int8)
- Anthropic API: SUPABASE_SECRETS에 ANTHROPIC_API_KEY 주입됨
## 🧪 마지막 검증 상태
| 게이트 | 결과 |
|---|---|
| desktop `tsc --noEmit` | ✅ EXIT 0 |
| Premium LLM (Claude Haiku refine) | ✅ 1.6~3.2초, fallback 없음 |
| Local LLM (gemma4:e4b refine) | ✅ 3.9초 |
| Bug 13 Dictation 가드 | ✅ |
| Bug 13 Conversation 배너 | ✅ |
| Recording tip hide 타이머 leak | ✅ |
| LicenseModal SaaS UI | ✅ (Payple 스텁) |
| Settings Backend 드롭다운 | ✅ (Premium/Local 전환) |
| DB migration (tier + overage) | ✅ 배포 완료 |
| Edge Function llm-proxy 배포 | ✅ verify_jwt=false |
| git push | ⏳ 미완 (사용자 확인 후) |
## 🎯 다음 세션 시작 프롬프트
```
D3RO-VOICE Phase 3.2-B (Payple 결제 연동) 또는 대시보드 Premium 표시.
지난 세션에서 빅뱅 8/8 마지막 성공 기준(Phase 3.2 Premium LLM) 달성.
Claude Haiku를 통한 프리미엄 받아쓰기 refine 1.6~3.2초로 동작 확인.
## 시작 전 반드시
1. /session-handoff resume
2. memory/handoff-latest.md
3. memory/project_status.md
4. CLAUDE.md 강제 규칙 13개
## 첫 액션 — dev 서버/앱 기동
pgrep + lsof로 생존 확인, 죽어있으면 nohup 기동.
## 우선순위 제안
A) Phase 3.2-B — Payple 결제 연동
- 선행: 사용자 Payple 가맹점 등록 + CST_ID/CUST_KEY 발급
- Stripe Edge Function 3개 → Payple 이관
- 웹 결제 UI 교체
- LemonSqueezy 코드 정리
B) 대시보드 Premium 상태 표시
- CRT 서비스에 Premium LLM indicator
- 쿼터 사용량 카드
- 모델 선택 UI
C) 세션 만료 버그 수정
- CloudSyncService.init() auth-changed emit
- 렌더러 Cloud 기능 로그인 배지
D) 새 기능 (사용자 제안)
## 강제 규칙
- any 금지, console.log 금지
- 테마 SSOT: d3roPalette/d3roShadow
- i18n t() 사용
- 작업 완료 즉시 memory/project_status.md 갱신
```
## 🔗 참고 문서
- `memory/project_status.md` — Phase 3.2 전체 기록
- `memory/feedback_session_expiry_bug.md` — 세션 만료 렌더러 미동기화 버그
- `memory/feedback_dev_autostart.md` — 세션 시작 시 dev 기동 규칙
- `apps/desktop/src/main/services/PremiumLLMService.ts` — Premium LLM 서비스
- `apps/desktop/src/main/services/llm-prompts.ts` — 공유 시스템 프롬프트
- `server/supabase/functions/llm-proxy/index.ts` — Edge Function (모델별 쿼터)
- `server/supabase/functions/_shared/quota.ts` — 쿼터 정책 + consume_quota
- Supabase Dashboard: https://supabase.com/dashboard/project/llnocwyqvhgwpdjcqqyw