d3ro-voice/memory/handoff-latest.md

148 lines
6 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 21:00 (Phase 3.2-B Payple 결제 + 대시보드 Premium)
> From: macOS (yunchan-ui-MacBookPro)
> Last commit: `c9baf03` — feat(server+web+desktop): Phase 3.2-B Payple 결제 연동 + 대시보드 Premium 상태 표시
> Branch: `main`
> Remote: `https://gitlab.twentyoz.kr:8443/d3r0/voice.git`
> Working tree: clean (push 필요)
## ✅ 이번 세션에서 한 일
### `c9baf03` — Phase 3.2-B (27파일, +1318/-98)
**A. Payple 결제 연동 (Stripe → Payple 전면 교체)**
- `_shared/payple.ts` — Payple REST API 래퍼 (auth, billing, cancel, deleteBillingKey, 유틸리티)
- `payple-checkout/index.ts` — 빌링키로 첫 결제 실행 + subscriptions/profiles 업데이트
- `payple-webhook/index.ts` — 결제완료/취소 이벤트 수신 + DB 반영
- `payple-manage/index.ts` — 구독 취소 (빌링키 해지 + cancel_at 설정)
- DB migration: `payment_provider`, `payple_payer_id`, `payple_pay_oid` 컬럼
- `config.toml`: payple-* 3개 함수 verify_jwt=false
-`billing/page.tsx`: 티어 통일(team→pro_plus), Payple 컴포넌트로 교체
- `payple-checkout-button.tsx`: Payple JS SDK 결제창 + callbackFunction 패턴
- `payple-manage-button.tsx`: 구독 취소 확인 다이얼로그
- Electron `LicenseModal`: alert 스텁 → `shell.openExternal(billingUrl)`
- IPC: `LICENSE.OPEN_BILLING` + preload `license.openBilling()` + 핸들러
**B. 대시보드 Premium 상태 표시**
- DashboardPage services 배열에 PREMIUM LLM LED 추가
- 백엔드 인디케이터 카드 (Local/Premium LED) + 티어 카드
- 사용량 섹션: 전 티어에서 표시 + Premium 모델별(Haiku/Sonnet/Opus) 쿼터
- 12개 locale × 14개 i18n 키
## 🚧 미해결 / 미테스트
### 1. Payple 테스트 미완 (선행 필요)
- Payple 가맹점 등록 → CST_ID/CUST_KEY/REFUND_KEY/CLIENT_KEY 발급
- Supabase Secrets: `supabase secrets set PAYPLE_CST_ID=... PAYPLE_CUST_KEY=... PAYPLE_REFUND_KEY=... PAYPLE_CLIENT_KEY=...`
- DB migration 배포: `supabase db push` (20260412000002_payple_billing.sql)
- Payple 관리자에서 webhook URL 등록: `https://{project-ref}.supabase.co/functions/v1/payple-webhook`
- 웹 환경변수: `NEXT_PUBLIC_PAYPLE_CLIENT_KEY` (없으면 테스트 키 폴백)
### 2. 대시보드 시각 확인 미완
- 앱에서 직접 대시보드 UI 확인 필요 (Premium LED, 쿼터 바 등)
### 3. 세션 만료 렌더러 미동기화 (기존 이슈)
### 4. LemonSqueezy 코드 잔존
- LicenseService.ts에 deprecated 코드. 다음 사이클에서 정리
### 5. Payple 정기 갱신 크론 미구현
- `payple-renew` Edge Function + pg_cron 필요
## 🧭 다음 사이클 계획
1. **Payple 가맹점 등록 + 테스트**
- 테스트 키로 E2E: 웹 결제창 → 빌링키 발급 → 첫 결제 → DB 확인
- Electron: 업그레이드 버튼 → 웹 열림 → 결제 후 CloudSync tier 갱신
- 대시보드 시각 확인
2. **Payple 정기 갱신 크론** (payple-renew)
3. **세션 만료 버그 수정** (CloudSyncService auth-changed emit)
4. **LemonSqueezy 코드 정리**
5. **관리자 백엔드 서비스 웹페이지** (백로그)
- 사용자 관리 CRM, 구독 현황 대시보드, 쿼터 관리, 결제 이력 조회
- 별도 admin/ 앱 또는 apps/web 내 admin 라우트 그룹
## 🔑 다음 세션 시작 시 확인
```bash
git pull origin main # HEAD = c9baf03
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
```
## ⚠️ Payple 연동 핵심 포인트
- **Payple JS SDK**: 브라우저 전용 → Electron에서는 웹 페이지 경유
- **테스트 키**: `cst_id: test`, `custKey: abcd1234567890`, `clientKey: test_DF55F29DA654A8CBC0F0A9DD4B556486`
- **테스트 서버**: `democpay.payple.kr` (라이브: `cpay.payple.kr`)
- **Referer 검증**: Payple이 Referer 헤더로 도메인 확인 → `PAYPLE_SITE_URL` 환경변수 설정 필수
- **결제 흐름**: JS SDK → callbackFunction → Edge Function(payple-checkout) → DB 업데이트
- **빌링 결제는 서버→서버**: Edge Function이 `paypleAuth()``paypleBilling()` 호출
## 📦 의존성 / 도구
- Node 22.22.2 / Python 3.13.13 / Supabase CLI 2.84.2
- Ollama 0.20.5 (gemma4:e4b 기본)
- Electron 33.4.11 / Next.js 15.5.14
- SoX 14.4.2 / faster-whisper base (CPU int8)
## 🧪 마지막 검증 상태
| 게이트 | 결과 |
|---|---|
| desktop `tsc --noEmit` | ✅ EXIT 0 |
| web `tsc --noEmit` | ✅ EXIT 0 |
| Payple Edge Functions | 🔲 미배포 |
| DB migration | 🔲 미배포 |
| 웹 결제 E2E | 🔲 미테스트 |
| 대시보드 시각 확인 | 🔲 미확인 |
| git push | ⏳ 미완 |
## 🎯 다음 세션 시작 프롬프트
```
D3RO-VOICE Phase 3.2-B Payple 결제 연동 테스트 + 대시보드 확인.
지난 세션에서 Payple 결제 연동 코드 구현 완료 (27파일 커밋).
아직 테스트/배포 미완.
## 시작 전 반드시
1. /session-handoff resume
2. memory/handoff-latest.md
3. memory/project_status.md
## 첫 액션 — dev 서버 기동
pgrep + lsof로 생존 확인, 죽어있으면 nohup 기동.
## 우선순위
A) Payple 테스트 (가맹점 등록 완료 시)
- supabase db push (migration)
- supabase secrets set PAYPLE_*
- supabase functions deploy payple-checkout payple-webhook payple-manage
- 웹 billing 페이지에서 테스트 결제
- Electron 업그레이드 버튼 → 웹 열기 확인
B) 대시보드 시각 확인
- Premium LLM LED, 백엔드 카드, 쿼터 바
C) 세션 만료 버그 수정
D) 관리자 백엔드 CRM (백로그)
```
## 🔗 참고 문서
- `memory/project_status.md` — 전체 현황
- `server/supabase/functions/_shared/payple.ts` — Payple API 래퍼
- `server/supabase/functions/payple-checkout/index.ts` — 결제 Edge Function
- `apps/web/src/components/billing/payple-checkout-button.tsx` — 웹 결제 컴포넌트
- `apps/desktop/src/renderer/pages/DashboardPage.tsx` — 대시보드 Premium UI
- https://docs.payple.kr/ — Payple 개발자 문서