diff --git a/memory/handoff-archive/2026-04-12-2200.md b/memory/handoff-archive/2026-04-12-2200.md new file mode 100644 index 0000000..1f1bb9c --- /dev/null +++ b/memory/handoff-archive/2026-04-12-2200.md @@ -0,0 +1,106 @@ +# Session Handoff — 2026-04-12 22:00 (Phase 3.3 SaaS 인프라 완결) + +> From: macOS (yunchan-ui-MacBookPro) +> Last commit: `3ef971e` — chore: project_status 갱신 — Admin CRM 독립 프로젝트 완료 +> Branch: `main` +> Remote: `https://gitlab.twentyoz.kr:8443/d3r0/voice.git` +> Working tree: clean (pushed) + +## 이번 세션에서 한 일 (12 커밋) + +### Phase 3.2-B 배포 + 버그 수정 +- Payple Edge Functions 3개 (`payple-checkout/webhook/manage`) 배포 ACTIVE +- DB migration `20260412000002_payple_billing.sql` 적용 +- Electron `OPEN_BILLING`: dev/prod URL 분기 (`app.isPackaged`) +- CloudSyncService: stored token 없을 때 `auth-changed null` emit 누락 수정 + +### 라이선스 UI 빅뱅 +- LicenseTab/LicenseModal: LemonSqueezy 키 입력 제거 → Payple 구독 UI +- `useLicenseState` 훅: 공용 상태 관리 추출 +- `PREMIUM_MODEL_LIMITS`: 3곳 중복 → `@d3ro/core/constants` 단일 소스 +- i18n: LS 키 18개 삭제, 구독 키 13개 추가 (12 locale) + +### 마스터플랜 4개 작업 +1. **LemonSqueezy 코드 제거** — LicenseService ~150줄 삭제 +2. **Payple 정기 갱신 크론** — `payple-renew` Edge Function + GitHub Actions (매일 01:00 UTC) +3. **관리자 CRM** — `apps/admin` 독립 Next.js 앱 (포트 3001) +4. **SSE 스트리밍** — `sse-parser.ts` + `invokeFunctionStream()` + `chatStream()` 업그레이드 + +### Admin CRM 독립화 + 버그 수정 +- `apps/admin` 독립 프로젝트로 분리 (apps/web에서 제거) +- RLS 재귀 참조 수정 → `app_metadata` 기반 +- OAuth 콜백 쿠키 설정 수정 +- middleware 추가 (Supabase 세션 갱신) + +## 현재 배포 상태 + +| 게이트 | 결과 | +|---|---| +| desktop `tsc --noEmit` | ✅ | +| web `tsc --noEmit` | ✅ | +| admin `tsc --noEmit` | ✅ | +| Payple Edge Functions 4개 | ✅ ACTIVE | +| DB migrations 4개 | ✅ 적용 | +| git push | ✅ | + +## 서비스 현황 + +| 서비스 | 포트 | 상태 | +|--------|------|------| +| Electron + Vite | :5173 | 실행 중 | +| Web (Next.js) | :3000 | 실행 중 | +| Admin CRM (Next.js) | :3001 | 실행 중 | +| Ollama | :11434 | gemma4:e4b + qwen3:4b | +| Supabase | remote | Edge Functions 배포 | + +## 다음 세션 우선순위 + +### A) Admin CRM 기능 강화 +- 유저 role 변경 기능 (admin → user / user → admin) +- 구독 수동 변경 (tier 변경, 기간 연장) +- 사용량 차트 (recharts) +- 결제 이력 조회 + +### B) SSE 스트리밍 E2E 테스트 +- Voice Conversation에서 Premium 모델 선택 → 토큰 단위 실시간 표시 확인 +- TTS 파이프라인과 연결 확인 + +### C) Payple 라이브 전환 준비 +- 테스트 키 → 라이브 키 교체 +- Webhook URL 등록 (Payple 관리자) +- PAYPLE_SITE_URL 프로덕션 값 설정 + +### D) 랜딩 페이지 (site/) 업데이트 +- 결제 섹션 Payple로 업데이트 +- 가격 정책 반영 + +### E) 코드 정리 백로그 +- `supabase-server.ts` / `supabase-browser.ts` 공통 패키지 추출 +- LicenseService의 오프라인 유예/재검증 로직 (LS 제거 후 불필요할 수 있음) +- `ActivateLicenseParams`/`Result` 타입 정리 + +## 다음 세션 시작 시 확인 + +```bash +git pull origin main # HEAD = 3ef971e +pgrep -lf "Electron\.app|next dev" +lsof -i :5173 -sTCP:LISTEN +lsof -i :3000 -sTCP:LISTEN +lsof -i :3001 -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 +nohup npm --workspace=@d3ro/admin run dev > /tmp/d3ro-admin.log 2>&1 & disown +``` + +## Admin CRM 접속 방법 +1. `http://localhost:3001` → Google OAuth 로그인 +2. admin 권한 필요: `UPDATE auth.users SET raw_app_meta_data = raw_app_meta_data || '{"role":"admin"}' WHERE id = '...'` +3. JWT 갱신을 위해 로그아웃 → 재로그인 필요 + +## 의존성 / 도구 + +- 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) diff --git a/memory/handoff-latest.md b/memory/handoff-latest.md index 1f1bb9c..9048281 100644 --- a/memory/handoff-latest.md +++ b/memory/handoff-latest.md @@ -1,47 +1,35 @@ -# Session Handoff — 2026-04-12 22:00 (Phase 3.3 SaaS 인프라 완결) +# Session Handoff — 2026-04-13 09:30 (Phase V2-6 Admin CRM 고도화 완료) > From: macOS (yunchan-ui-MacBookPro) -> Last commit: `3ef971e` — chore: project_status 갱신 — Admin CRM 독립 프로젝트 완료 +> Last commit: `8467ecb` — chore: project_status 갱신 — Phase V2-6 Admin CRM 고도화 완료 > Branch: `main` > Remote: `https://gitlab.twentyoz.kr:8443/d3r0/voice.git` -> Working tree: clean (pushed) +> Working tree: clean (pushed 대기) -## 이번 세션에서 한 일 (12 커밋) +## 이번 세션에서 한 일 (3 커밋) -### Phase 3.2-B 배포 + 버그 수정 -- Payple Edge Functions 3개 (`payple-checkout/webhook/manage`) 배포 ACTIVE -- DB migration `20260412000002_payple_billing.sql` 적용 -- Electron `OPEN_BILLING`: dev/prod URL 분기 (`app.isPackaged`) -- CloudSyncService: stored token 없을 때 `auth-changed null` emit 누락 수정 +### Phase V2-6: Admin CRM 고도화 (34파일, +3,142줄) +1. **DB 마이그레이션** — audit_log(diff 포함), admin_note, super_admin role, RLS 확장, SQL RPC 3종 +2. **Edge Functions 4개** — admin-users, admin-subscriptions, admin-payments, admin-audit-log + 공유 유틸 2개 +3. **Swagger UI** — 독립 정적 페이지 + OpenAPI 3.0 spec +4. **Admin CRUD 페이지** — 구독 생성/수정/삭제, role 변경, 감사로그 목록/상세 +5. **recharts 차트 3종** — FeatureUsage StackedBar, DAU Line, TopUsers HorizontalBar +6. **결제 이력** — DB + Payple API 병행 조회 (PaymentHistory 컴포넌트) +7. **권한 체계** — super_admin만 위험 작업, admin은 조회 전용 -### 라이선스 UI 빅뱅 -- LicenseTab/LicenseModal: LemonSqueezy 키 입력 제거 → Payple 구독 UI -- `useLicenseState` 훅: 공용 상태 관리 추출 -- `PREMIUM_MODEL_LIMITS`: 3곳 중복 → `@d3ro/core/constants` 단일 소스 -- i18n: LS 키 18개 삭제, 구독 키 13개 추가 (12 locale) - -### 마스터플랜 4개 작업 -1. **LemonSqueezy 코드 제거** — LicenseService ~150줄 삭제 -2. **Payple 정기 갱신 크론** — `payple-renew` Edge Function + GitHub Actions (매일 01:00 UTC) -3. **관리자 CRM** — `apps/admin` 독립 Next.js 앱 (포트 3001) -4. **SSE 스트리밍** — `sse-parser.ts` + `invokeFunctionStream()` + `chatStream()` 업그레이드 - -### Admin CRM 독립화 + 버그 수정 -- `apps/admin` 독립 프로젝트로 분리 (apps/web에서 제거) -- RLS 재귀 참조 수정 → `app_metadata` 기반 -- OAuth 콜백 쿠키 설정 수정 -- middleware 추가 (Supabase 세션 갱신) +### 배포 완료 +- DB migration `20260413000004_admin_enhancement.sql` → Supabase 리모트 적용 ✅ +- Edge Functions 4개 배포 ACTIVE ✅ ## 현재 배포 상태 | 게이트 | 결과 | |---|---| | desktop `tsc --noEmit` | ✅ | -| web `tsc --noEmit` | ✅ | | admin `tsc --noEmit` | ✅ | -| Payple Edge Functions 4개 | ✅ ACTIVE | -| DB migrations 4개 | ✅ 적용 | -| git push | ✅ | +| DB migration | ✅ 적용 | +| Edge Functions 8개 (기존 4 + 신규 4) | ✅ ACTIVE | +| git commit | ✅ (8467ecb) | ## 서비스 현황 @@ -55,47 +43,42 @@ ## 다음 세션 우선순위 -### A) Admin CRM 기능 강화 -- 유저 role 변경 기능 (admin → user / user → admin) -- 구독 수동 변경 (tier 변경, 기간 연장) -- 사용량 차트 (recharts) -- 결제 이력 조회 +### A) 브라우저 테스트 (V2-6 확인) +- http://localhost:3001 접속 → 전체 기능 시각 확인 +- super_admin 설정: `UPDATE auth.users SET raw_app_meta_data = raw_app_meta_data || '{"role":"super_admin"}' WHERE id = '...'` +- 구독 생성/수정/삭제 → 감사로그 기록 확인 +- 차트 렌더링 확인 (데이터 있으면) +- Swagger UI 동작 확인 ### B) SSE 스트리밍 E2E 테스트 -- Voice Conversation에서 Premium 모델 선택 → 토큰 단위 실시간 표시 확인 -- TTS 파이프라인과 연결 확인 +- Voice Conversation에서 Premium 모델 → 토큰 단위 실시간 표시 +- TTS 파이프라인 연결 -### C) Payple 라이브 전환 준비 +### C) Payple 라이브 전환 - 테스트 키 → 라이브 키 교체 -- Webhook URL 등록 (Payple 관리자) -- PAYPLE_SITE_URL 프로덕션 값 설정 +- Webhook URL 등록 -### D) 랜딩 페이지 (site/) 업데이트 +### D) 랜딩 페이지 업데이트 - 결제 섹션 Payple로 업데이트 - 가격 정책 반영 ### E) 코드 정리 백로그 - `supabase-server.ts` / `supabase-browser.ts` 공통 패키지 추출 -- LicenseService의 오프라인 유예/재검증 로직 (LS 제거 후 불필요할 수 있음) -- `ActivateLicenseParams`/`Result` 타입 정리 +- Database 타입에 RPC 함수 타입 추가 ## 다음 세션 시작 시 확인 ```bash -git pull origin main # HEAD = 3ef971e +git pull origin main # HEAD = 8467ecb pgrep -lf "Electron\.app|next dev" lsof -i :5173 -sTCP:LISTEN lsof -i :3000 -sTCP:LISTEN lsof -i :3001 -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 -nohup npm --workspace=@d3ro/admin run dev > /tmp/d3ro-admin.log 2>&1 & disown ``` ## Admin CRM 접속 방법 1. `http://localhost:3001` → Google OAuth 로그인 -2. admin 권한 필요: `UPDATE auth.users SET raw_app_meta_data = raw_app_meta_data || '{"role":"admin"}' WHERE id = '...'` +2. super_admin 설정: `UPDATE auth.users SET raw_app_meta_data = raw_app_meta_data || '{"role":"super_admin"}' WHERE id = '...'` 3. JWT 갱신을 위해 로그아웃 → 재로그인 필요 ## 의존성 / 도구 @@ -103,4 +86,5 @@ nohup npm --workspace=@d3ro/admin run dev > /tmp/d3ro-admin.log 2>&1 & disown - 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 +- recharts 2.15+ (apps/admin) - SoX 14.4.2 / faster-whisper base (CPU int8)