feat(desktop): SaaS [3.5] 로컬 모드 = entry point (빅뱅 Phase 1.5)
비즈니스 모델 수정: - 무료 로컬 모드 = 사용자 onboarding funnel 입구 (킬러 피처, 회원가입 0) - 유료 클라우드 SaaS = 수익화 (OAuth 로그인 + pro + premium 모델 + sync) - 이전 세션 SaaS [2] OAuth 강제 게이트 철회 db/index.ts: - LOCAL_USER_ID = '_local' 상수 export - openLocal() 헬퍼 — userData/users/_local/d3ro.db - isLocalMode() 헬퍼 bootstrap.ts: - database step 복원 (critical). openLocal() 호출로 앱 시작 시 로컬 DB 자동 오픈 — 로그인 없이 즉시 메인 UI 진입 가능 CloudSyncService._onSignOut(): - closeCurrent() 후 openLocal() 호출 — 로그아웃 시 로컬 모드 DB로 복귀 - 앱은 계속 로컬 모드로 동작 (entry point 철학) App.tsx: - AuthGate 상태머신 제거 (loading/login-required/authenticated/legacy) - LoginScreen import 제거, 항상 AppLayout 렌더 - LoginScreen.tsx 파일은 유지 (추후 Welcome 화면 재활용 가능) 검증: - desktop tsc --noEmit ✅ - desktop build ✅ - dev 런타임: [bootstrap] local database opened → Main window shown - users/_local/d3ro.db 파일 생성 확인
This commit is contained in:
parent
816f527592
commit
1a01cea33c
5 changed files with 102 additions and 91 deletions
|
|
@ -153,18 +153,16 @@ V2 6차 고도화 (2026-04-11):
|
|||
- `configGet('supabaseUrl'/'supabaseAnonKey')`은 빌드 타임 값 절대 우선
|
||||
- `configSet`는 빌드 타임 모드일 때 supabaseUrl/AnonKey 변경 거부
|
||||
|
||||
### SaaS [2] OAuth 첫 실행 강제 게이트
|
||||
- `CloudSyncState`에 `saasMode: boolean` 필드 추가
|
||||
- `LoginScreen.tsx` 신규: Google/GitHub 버튼만, MetalCard + PhosphorText, URL/Key 입력 노출 0
|
||||
- `App.tsx` `AuthGate` 상태머신: `loading | login-required | authenticated | legacy`
|
||||
- `saasMode && !authenticated` → LoginScreen 강제
|
||||
- `saasMode && authenticated` → 기존 AppLayout
|
||||
- `!saasMode` → legacy (기존 동작 유지)
|
||||
- `onAuthChanged` 구독으로 로그인 후 자동 전환
|
||||
- `CloudSyncSection` (Settings 안):
|
||||
- `saasMode`일 때 URL/Key 입력 필드 완전 숨김 (OAuth 버튼만)
|
||||
- `!saasMode` (legacy)일 때만 기존 입력 화면 유지
|
||||
- 검증: 이전엔 항상 떴던 `CloudSync disabled — Supabase URL/key not configured` 로그 사라짐
|
||||
### SaaS [2] OAuth 첫 실행 강제 게이트 → **철회 (Phase 1.5에서 로컬 모드 entry point로 변경)**
|
||||
- `CloudSyncState`에 `saasMode: boolean` 필드 추가 (유지)
|
||||
- `CloudSyncSection`: saasMode에서 OAuth 버튼만, legacy에서는 URL/Key 입력 UI (유지)
|
||||
- ~~`LoginScreen.tsx` 강제 게이트~~ → 제거 (App.tsx에서 사용 안 함, 파일 자체는 유지)
|
||||
- ~~`App.tsx` AuthGate 상태머신~~ → 제거 (항상 메인 UI 렌더)
|
||||
|
||||
**철회 이유** (2026-04-11 빅뱅 Phase 1.5):
|
||||
사용자 피드백 "무료 로컬은 사용자 엔트리 포인트가 될 거구, 수익화는 클라우드 SaaS 서비스임".
|
||||
로컬 STT/LLM이 이 앱의 킬러 피처 → 회원가입 없이 즉시 체험 가능해야 함 (onboarding funnel 입구).
|
||||
OAuth provider도 아직 Supabase에 설정 안 된 상태. 강제 게이트는 철학 + 인프라 양쪽 모두 위배.
|
||||
|
||||
### SaaS [3] 사용자별 SQLite 격리 — ✅ **완료 (2026-04-11, 빅뱅 Phase 1)**
|
||||
|
||||
|
|
@ -210,6 +208,40 @@ V2 6차 고도화 (2026-04-11):
|
|||
- `~/Library/Application Support/d3ro-voice/users/${uuid}/d3ro.db` 파일 생성 확인
|
||||
- 기존 `d3ro-voice.db`가 있는 환경에서 archive rename 동작 확인
|
||||
|
||||
### SaaS [3.5] 로컬 모드 = entry point (Phase 1.5, 2026-04-11)
|
||||
|
||||
> 비즈니스 모델: 무료 로컬 모드 = onboarding funnel 입구 (킬러 피처),
|
||||
> 유료 클라우드 SaaS = 수익화 (OAuth 로그인 + pro 구독 + premium 모델 + sync).
|
||||
> SaaS [2] OAuth 강제 게이트 철회.
|
||||
|
||||
- **`db/index.ts`**
|
||||
- `LOCAL_USER_ID = '_local'` 상수 export
|
||||
- `openLocal()` 헬퍼 — `openForUser('_local')` 래퍼. 경로: `users/_local/d3ro.db`
|
||||
- `isLocalMode()` 헬퍼 — `currentUserId === LOCAL_USER_ID`
|
||||
- **`bootstrap.ts`**
|
||||
- `database` step 복원 (critical). `openLocal()` 호출로 앱 시작 시 로컬 DB 자동 오픈
|
||||
- 순서: logger → config → **database (local)** → license → windows → tray → ipc → ... → cloud-sync
|
||||
- **`CloudSyncService._onAuthenticated(session)`**
|
||||
- `openForUser(userId)` — 내부에서 기존 로컬 DB close 후 사용자 DB 재오픈 (자동)
|
||||
- auth-changed(user) emit 후 Realtime 시작
|
||||
- **`CloudSyncService._onSignOut()`**
|
||||
- VoiceMode cancel → MeetingMode stopRecording → Caption stop → Realtime stop → auth.signOut → token clear
|
||||
- `closeCurrent()` → `openLocal()` — **로컬 모드 DB로 복귀** (앱은 계속 로컬 모드로 동작)
|
||||
- auth-changed(null) emit
|
||||
- **`App.tsx`**
|
||||
- AuthGate 상태머신 완전 제거. `LoginScreen` import 제거.
|
||||
- 항상 `<AppLayout /> <UpgradePromptModal />` 렌더링 (로그인/로그아웃 무관)
|
||||
- **`LoginScreen.tsx`**
|
||||
- 파일 유지 (dead code — 추후 Welcome 화면 재활용 가능)
|
||||
- **검증**
|
||||
- desktop `tsc --noEmit` ✅
|
||||
- desktop `npm run build` ✅ (main 992kB, renderer 2,126kB)
|
||||
- dev 런타임 ✅:
|
||||
- `[bootstrap] local database opened: .../users/_local/d3ro.db (created=true)`
|
||||
- `[bootstrap] database initialized` → 나머지 step 정상
|
||||
- `Main window shown` — LoginScreen 없이 바로 메인 UI
|
||||
- 파일시스템: `users/_local/d3ro.db` + WAL/SHM 정상 생성
|
||||
|
||||
## 빅뱅 다음 세션 목표 (2026-04-11 wrap-up)
|
||||
|
||||
데스크톱을 진짜 SaaS 클라이언트로 완성. 자세한 계획 + 단계별 prompt는
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue