diff --git a/memory/handoff-archive/2026-04-12-1830.md b/memory/handoff-archive/2026-04-12-1830.md new file mode 100644 index 0000000..ebc253c --- /dev/null +++ b/memory/handoff-archive/2026-04-12-1830.md @@ -0,0 +1,162 @@ +# 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 diff --git a/memory/handoff-latest.md b/memory/handoff-latest.md index ebc253c..1cee513 100644 --- a/memory/handoff-latest.md +++ b/memory/handoff-latest.md @@ -1,81 +1,75 @@ -# Session Handoff — 2026-04-12 18:30 (Phase 3.2 Premium LLM 완결 + Bug 13 + Gemma4) +# Session Handoff — 2026-04-12 21:00 (Phase 3.2-B Payple 결제 + 대시보드 Premium) > From: macOS (yunchan-ui-MacBookPro) -> Last commit: `6e52c18` — feat(desktop+server): Phase 3.2 Premium LLM +> 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 필요) -## ✅ 이번 세션 요약 — 빅뱅 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 키 +### `c9baf03` — Phase 3.2-B (27파일, +1318/-98) -### `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) +**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()` + 핸들러 -### `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 동시성, 등) +**B. 대시보드 Premium 상태 표시** +- DashboardPage services 배열에 PREMIUM LLM LED 추가 +- 백엔드 인디케이터 카드 (Local/Premium LED) + 티어 카드 +- 사용량 섹션: 전 티어에서 표시 + Premium 모델별(Haiku/Sonnet/Opus) 쿼터 +- 12개 locale × 14개 i18n 키 -## 🚧 미해결 이슈 (이월) +## 🚧 미해결 / 미테스트 -### 1. 세션 만료 렌더러 미동기화 버그 -CloudSyncService.init()에서 stored token 없을 때 auth-changed null 미emit → UI가 로그인 상태로 보이지만 실제론 비인증. Premium 선택 시 fallback으로 떨어짐. (memory/feedback_session_expiry_bug.md) +### 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. Payple 결제 연동 (Phase 3.2-B) -업그레이드 버튼 → "결제 연동 준비 중 (Payple)" alert 스텁. 사용자 Payple 가맹점 등록 선행 필요 (CST_ID + CUST_KEY). Stripe Edge Function 3개(checkout/webhook/portal) → Payple로 이관. +### 2. 대시보드 시각 확인 미완 +- 앱에서 직접 대시보드 UI 확인 필요 (Premium LED, 쿼터 바 등) -### 3. 대시보드 Premium 상태 표시 -현재 대시보드에 Premium LLM 쿼터/모델/사용량 정보 없음. CRT 서비스 섹션에 Premium LLM indicator 추가 필요. +### 3. 세션 만료 렌더러 미동기화 (기존 이슈) -### 4. Supabase verify_jwt 비호환 -2026 sb_publishable_ 키와 Edge Function Gateway의 JWT 검증 비호환. llm-proxy만 verify_jwt=false. 다른 함수들(stt-proxy, team-invite 등)도 같은 이슈 있을 수 있음 — 사용 시 확인. +### 4. LemonSqueezy 코드 잔존 +- LicenseService.ts에 deprecated 코드. 다음 사이클에서 정리 -### 5. LemonSqueezy 코드 잔존 -LicenseService에 LemonSqueezy API 호출 코드가 아직 남아있음 (LEMONSQUEEZY_API 상수). SaaS(Payple) 전환 시 정리 필요. +### 5. Payple 정기 갱신 크론 미구현 +- `payple-renew` Edge Function + pg_cron 필요 -## 🧭 다음 사이클 후보 +## 🧭 다음 사이클 계획 -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 코드 정리 +1. **Payple 가맹점 등록 + 테스트** + - 테스트 키로 E2E: 웹 결제창 → 빌링키 발급 → 첫 결제 → DB 확인 + - Electron: 업그레이드 버튼 → 웹 열림 → 결제 후 CloudSync tier 갱신 + - 대시보드 시각 확인 -2. **대시보드 Premium 상태 표시** - - CRT 서비스 섹션에 Premium LLM indicator - - 쿼터 사용량 카드 (오늘/주간) - - 모델 선택 UI (Haiku/Sonnet/Opus — 티어별 가용) +2. **Payple 정기 갱신 크론** (payple-renew) -3. **세션 만료 버그 수정** - - CloudSyncService.init() no-token 경로에 auth-changed emit - - 렌더러에 Cloud 기능 "로그인 필요" 배지 +3. **세션 만료 버그 수정** (CloudSyncService auth-changed emit) -4. **SSE 스트리밍 Premium** (현재 비스트리밍 → 실시간 토큰 yield) +4. **LemonSqueezy 코드 정리** -5. **Voice Conversation Premium** (chatStream도 Premium 경로 + SSE) +5. **관리자 백엔드 서비스 웹페이지** (백로그) + - 사용자 관리 CRM, 구독 현황 대시보드, 쿼터 관리, 결제 이력 조회 + - 별도 admin/ 앱 또는 apps/web 내 admin 라우트 그룹 ## 🔑 다음 세션 시작 시 확인 ```bash -git status # clean -git log --oneline -5 # HEAD=6e52c18 +git pull origin main # HEAD = c9baf03 pgrep -lf "Electron\.app|next dev" lsof -i :5173 -sTCP:LISTEN lsof -i :3000 -sTCP:LISTEN @@ -84,79 +78,71 @@ 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 기본, qwen3:4b 레거시) +- Ollama 0.20.5 (gemma4:e4b 기본) - 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 주입됨 +- SoX 14.4.2 / faster-whisper base (CPU int8) ## 🧪 마지막 검증 상태 | 게이트 | 결과 | |---|---| | 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 | ⏳ 미완 (사용자 확인 후) | +| web `tsc --noEmit` | ✅ EXIT 0 | +| Payple Edge Functions | 🔲 미배포 | +| DB migration | 🔲 미배포 | +| 웹 결제 E2E | 🔲 미테스트 | +| 대시보드 시각 확인 | 🔲 미확인 | +| git push | ⏳ 미완 | ## 🎯 다음 세션 시작 프롬프트 ``` -D3RO-VOICE Phase 3.2-B (Payple 결제 연동) 또는 대시보드 Premium 표시. +D3RO-VOICE Phase 3.2-B Payple 결제 연동 테스트 + 대시보드 확인. -지난 세션에서 빅뱅 8/8 마지막 성공 기준(Phase 3.2 Premium LLM) 달성. -Claude Haiku를 통한 프리미엄 받아쓰기 refine 1.6~3.2초로 동작 확인. +지난 세션에서 Payple 결제 연동 코드 구현 완료 (27파일 커밋). +아직 테스트/배포 미완. ## 시작 전 반드시 1. /session-handoff resume 2. memory/handoff-latest.md 3. memory/project_status.md -4. CLAUDE.md 강제 규칙 13개 -## 첫 액션 — dev 서버/앱 기동 +## 첫 액션 — dev 서버 기동 pgrep + lsof로 생존 확인, 죽어있으면 nohup 기동. -## 우선순위 제안 -A) Phase 3.2-B — Payple 결제 연동 - - 선행: 사용자 Payple 가맹점 등록 + CST_ID/CUST_KEY 발급 - - Stripe Edge Function 3개 → Payple 이관 - - 웹 결제 UI 교체 - - LemonSqueezy 코드 정리 +## 우선순위 +A) Payple 테스트 (가맹점 등록 완료 시) + - supabase db push (migration) + - supabase secrets set PAYPLE_* + - supabase functions deploy payple-checkout payple-webhook payple-manage + - 웹 billing 페이지에서 테스트 결제 + - Electron 업그레이드 버튼 → 웹 열기 확인 -B) 대시보드 Premium 상태 표시 - - CRT 서비스에 Premium LLM indicator - - 쿼터 사용량 카드 - - 모델 선택 UI +B) 대시보드 시각 확인 + - Premium LLM LED, 백엔드 카드, 쿼터 바 C) 세션 만료 버그 수정 - - CloudSyncService.init() auth-changed emit - - 렌더러 Cloud 기능 로그인 배지 -D) 새 기능 (사용자 제안) - -## 강제 규칙 -- any 금지, console.log 금지 -- 테마 SSOT: d3roPalette/d3roShadow -- i18n t() 사용 -- 작업 완료 즉시 memory/project_status.md 갱신 +D) 관리자 백엔드 CRM (백로그) ``` ## 🔗 참고 문서 -- `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 +- `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 개발자 문서