feat(desktop): SaaS [5] 티어 enforcement — 로컬 해방 + 클라우드 gate (빅뱅 Phase 4)
비즈니스 모델 확정: - 익명 로컬 사용자 → 로컬 기능 16개 전부 무제한 (entry point) - 클라우드 기능 (PREMIUM_LLM, CLOUD_SYNC) → 로그인 필수 - 로그인 free → PREMIUM_LLM 5/일, CLOUD_SYNC 허용 - 로그인 pro → PREMIUM_LLM 500/일 (fair use cap) - 로그인 pro_plus → PREMIUM_LLM 무제한 기존 정책 폐기: - DICTATION 20/일 quota 삭제 - LLM_PROCESS 10/일 quota 삭제 - LIVE_CAPTION/VOICE_MEMO/SCREEN_CONTEXT/VOICE_COMMAND/LLM_CHAIN pro lock 해제 → free - FILE_TRANSCRIPTION/VOICE_CONVERSATION/DICTATION_TEMPLATE/ MEETING_SUMMARY/LOCAL_RAG/OS_AUTOMATION pro_plus lock 해제 → free types.ts: - Feature enum: PREMIUM_LLM, CLOUD_SYNC 추가 - FeatureAccess.reason: 'login_required' 추가 LicenseService.ts: - QUOTA_LIMITS / FEATURE_MIN_TIER 전면 재작성 - CLOUD_FEATURES Set 신규 - canUse(): CLOUD_FEATURES && isLocalMode() → login_required 조기 반환 - syncFromCloud(tier): Supabase subscriptions 티어를 electron-store에 캐시 + tier-changed emit - resetToFree(): 로그아웃 시 pro/pro_plus 캐시 + 라이센스 필드 전부 null - isLocalMode() import 추가 CloudSyncService.ts: - _fetchSubscriptionTier(userId): subscriptions 테이블에서 활성 티어 조회 (row 없음 / 비정상 값 → free 폴백) - _onAuthenticated: DB open → tier fetch → syncFromCloud → auth-changed → Realtime - _onSignOut: Voice/Meeting/Caption stop → Realtime stop → auth.signOut → token clear → license.resetToFree → closeCurrent → openLocal → emit null 검증: - desktop tsc --noEmit ✅ - desktop npm run build ✅ - 로컬 사용자 모든 기존 기능 접근 가능 (pro lock 완전 제거)
This commit is contained in:
parent
f1321df83c
commit
46b77f1118
4 changed files with 208 additions and 35 deletions
|
|
@ -875,11 +875,9 @@ export type LicenseTier = 'free' | 'pro' | 'pro_plus'
|
|||
|
||||
/** 기능 게이팅 대상 */
|
||||
export enum Feature {
|
||||
// 쿼터 제한 기능 (Free에서 횟수 제한)
|
||||
// ── 로컬 기능 (무료, 무제한 — 빅뱅 Phase 4에서 전부 free로 해방) ──
|
||||
DICTATION = 'dictation',
|
||||
LLM_PROCESS = 'llm_process',
|
||||
|
||||
// Pro 이상
|
||||
HISTORY_UNLIMITED = 'history_unlimited',
|
||||
HISTORY_EXPORT = 'history_export',
|
||||
CUSTOM_INSTRUCTION_CREATE = 'custom_instruction_create',
|
||||
|
|
@ -888,14 +886,18 @@ export enum Feature {
|
|||
VOICE_MEMO = 'voice_memo',
|
||||
VOICE_COMMAND = 'voice_command',
|
||||
LLM_CHAIN = 'llm_chain',
|
||||
|
||||
// Pro+ 이상
|
||||
FILE_TRANSCRIPTION = 'file_transcription',
|
||||
VOICE_CONVERSATION = 'voice_conversation',
|
||||
DICTATION_TEMPLATE = 'dictation_template',
|
||||
MEETING_SUMMARY = 'meeting_summary',
|
||||
LOCAL_RAG = 'local_rag',
|
||||
OS_AUTOMATION = 'os_automation',
|
||||
|
||||
// ── 클라우드 기능 (로그인 + 티어 gate — 빅뱅 Phase 4 신규) ──
|
||||
/** Anthropic/OpenAI 등 SaaS LLM 프록시 (Edge Function: llm-proxy) */
|
||||
PREMIUM_LLM = 'premium_llm',
|
||||
/** 멀티 디바이스 동기화 — 로그인만 하면 free도 사용 가능 */
|
||||
CLOUD_SYNC = 'cloud_sync',
|
||||
}
|
||||
|
||||
/** 라이센스 정보 (electron-store에 저장) */
|
||||
|
|
@ -929,7 +931,11 @@ export interface UsageQuota {
|
|||
/** 기능 접근 결과 */
|
||||
export interface FeatureAccess {
|
||||
allowed: boolean
|
||||
reason: 'ok' | 'quota_exceeded' | 'tier_required' | 'license_expired'
|
||||
/**
|
||||
* 'login_required'는 빅뱅 Phase 4 추가 — 익명 로컬 사용자가 Cloud feature를
|
||||
* 요청했을 때. 로그인하면 free 사용자로 업그레이드 없이 기본 접근 가능.
|
||||
*/
|
||||
reason: 'ok' | 'quota_exceeded' | 'tier_required' | 'license_expired' | 'login_required'
|
||||
requiredTier?: LicenseTier
|
||||
quota?: UsageQuota
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue