d3ro-voice/memory
윤찬 816f527592 feat(desktop): SaaS [3] 사용자별 SQLite 격리 (빅뱅 Phase 1)
db/index.ts 전면 재설계:
- initDatabase/closeDatabase 폐기
- openForUser(userId), closeCurrent, getDatabase, getCurrentUserId 신 API
- 경로: userData/users/${userId}/d3ro.db
- applySchema() 추출 — 새 user DB마다 테이블 + ALTER 마이그레이션 재실행
- legacy d3ro-voice.db는 silent archive (archive-legacy-ISO.db로 rename만)

CloudSyncService 인증 lifecycle SSOT:
- _onAuthenticated(session, reason) 단일 진입점
  init() 세션 복원, handleAuthCallback() 신규 로그인 모두 수렴
  DB open 실패 시 세션 롤백 + sync-error emit
- _onSignOut() 안전 종료 시퀀스
  VoiceMode cancel → MeetingMode stopRecording → Caption stop →
  Realtime stop → auth.signOut → token clear →
  auth-changed(null) emit → closeCurrent
- VoiceMode/MeetingMode/Caption은 dynamic import로 순환 의존 회피

bootstrap.ts:
- database step 제거 (DB는 _onAuthenticated에서만 열림)
- cloud-sync step이 마지막 유지 (세션 복원 → DB open → auth-changed)
2026-04-11 09:58:00 +09:00
..
handoff-archive chore: 빅뱅 사이클 wrap-up — 핸드오프 + 상세 다음 세션 프롬프트 2026-04-11 09:45:20 +09:00
big-bang-prompt.md chore: 빅뱅 사이클 wrap-up — 핸드오프 + 상세 다음 세션 프롬프트 2026-04-11 09:45:20 +09:00
handoff-latest.md chore: 빅뱅 사이클 wrap-up — 핸드오프 + 상세 다음 세션 프롬프트 2026-04-11 09:45:20 +09:00
project_status.md feat(desktop): SaaS [3] 사용자별 SQLite 격리 (빅뱅 Phase 1) 2026-04-11 09:58:00 +09:00