Commit graph

183 commits

Author SHA1 Message Date
Yun Chan
36be3a349a ci(mac): brew/volta PATH 명시 — CI 셸은 로그인 셸이 아님 2026-07-21 16:03:00 +09:00
Yun Chan
3e6e392920 ci: 첫 파이프라인 실패 2건 수정 — alpha 채널 감지 차단 + mac sox 자동 설치
Some checks failed
Build macOS / Build & Package (macOS) (push) Failing after 5s
Build macOS / Build & Package (macOS)-1 (push) Failing after 3s
- detectUpdateChannel:false — prerelease 버전이 alpha.yml을 만들어 latest.yml
  글롭/가드에 안 걸리던 문제 (electron-updater 기본 채널 latest와 정렬)
- artifacts 글롭 *.yml로 방어적 확장, publish 스크립트 메타데이터 regex 확장
- package-macos: sox 미설치 시 brew install sox 폴백
2026-07-21 15:48:21 +09:00
Yun Chan
c6fd8c9a9a ci: runner 인프라 정렬 + 자동 업데이트 feed 활성화 (프로젝트 1172)
- CI 태그를 실제 사내 runner에 맞게 교체: build-win-x64(TW-VIVEN-BUILD) /
  build-mac-arm64(TW-BUILD-MAC-ARM64) / build-linux-x64(TW-BUILD01, release+검증 잡)
- package-macos: volta 부트스트랩 폴백 추가
- update-feed.ts + electron-builder.yml publish.url에 프로젝트 ID 1172 기입
- release-guide: 완료된 설정 반영 (D3RO_MAC_RUNNER, registry public pull)
2026-07-21 15:33:30 +09:00
Yun Chan
3beba99668 feat(release): switchboard 릴리스 체계 이식 — Mac 배포 + Registry 게시 + 자동 업데이트
- package-macos CI job: arm64 무서명(ad-hoc) dmg+zip, D3RO_MAC_RUNNER 변수 게이트
- sync-version.mjs: 태그 → package.json 버전 동기화
- publish-gitlab-release.mjs: Generic Package Registry(버전별+latest) 업로드 + Release 생성
- electron-builder: publish generic(latest.yml 생성), 공백 없는 artifactName, mac arm64 단일화
- UpdateService: electron-updater 4h 주기 체크 + 재시작 다이얼로그 (update-feed.ts SSOT)
- @rollup/rollup-win32-x64-msvc → optionalDependencies (mac npm ci EBADPLATFORM 해소)
- docs/deployment/release-guide.md: runner 등록·feed 설정·파일명 규칙 가이드

리뷰 워크플로(3관점 적대적 검증)로 확정된 결함 8건 반영:
publish 부재로 latest.yml 미생성, 파일명 공백 vs 레지스트리 404,
mac EBADPLATFORM, needs optional의 실패 미커버, DELETE 권한 의존,
CHANGELOG regex 경계, --arm64 무시, 다이얼로그 parent 부재
2026-07-21 12:43:16 +09:00
Yun Chan
8f7d300b89 feat(conversation): OpenAI gpt-realtime-2.1 라이브 음성 대화 Premium 백엔드
- realtime-token Edge Function: 티어 검증 + realtime_session 쿼터 + ephemeral key 발급
- useRealtimeConversation 훅: WebRTC 직결 (마이크 → OpenAI, 오디오 자동 재생)
- VoiceConversationPage: conversationBackend 분기 + 연결 실패 시 로컬 fallback
- AppConfig.conversationBackend + SettingsModal 음성 대화 엔진 선택
- ErrorCode 799 ConversationRealtimeTokenFailed, i18n ko/en
2026-07-21 12:10:13 +09:00
Yun Chan
983c60cda2 feat(bootstrap): Whisper large-v3-turbo 기본 전환 + 온보딩 2단계 다운로드 진행률
- 기본 STT 모델 base → large-v3-turbo (6배 빠름, 1.6GB)
- 사이드카: /download, /download/status, /download/cancel + --models-dir
- LocalSTTService: downloadModel/cancelDownload + download-progress 이벤트
- IPC: 설계서 02의 stt:downloadModel/cancelDownload/downloadProgress 구현
- OnboardingModal: LLM(gemma4:e4b) → STT(turbo) 2단계 순차 다운로드 UI
- SettingsModal turbo 선택지 + settings.model.largeTurbo 12 locale
- 테스트: 모노레포 잔재 import 수정 (src/shared → @d3ro/core), 41/41 통과
2026-07-21 11:59:49 +09:00
yunchan8804
9dc8b26c11 ci: lint/typecheck/unit-test를 manual 트리거로 — Docker runner 부재로 stuck 방지
main 푸시마다 자동으로 도는 구조였는데 사내 GitLab에 Docker runner 없어서 계속
pending으로 남음. 필요할 때 UI에서 수동 트리거. Docker runner 붙이면 rules 복원.
2026-04-15 23:11:38 +09:00
yunchan8804
e947d90644 docs: 세션 래핑 — v0.1.0-alpha 배포 성공 + 설치 성공 기록 + 다음 작업 2026-04-15 23:06:51 +09:00
yunchan8804
d48146438e fix(i18n): 온보딩 모달 플레이스홀더 {{var}} 포맷으로 수정 — 단일 중괄호는 치환 안됨 2026-04-15 23:04:03 +09:00
yunchan8804
72144a4c2e fix(installer): 대용량 NSIS 크래시 해소 — Ollama GPU 런타임 가지치기 + oneClick 전환
Some checks failed
Build macOS / Build & Package (macOS) (push) Failing after 5s
Build macOS / Build & Package (macOS)-1 (push) Failing after 5s
- download-ollama.ps1: cuda_v11, cuda_v12, rocm_avx 런타임 삭제 (~1GB 절감)
  첫 실행 시 gemma4:e4b는 CPU로 충분. GPU 가속 필요 시 별도 Ollama 설치 또는 차기 빌드.
- electron-builder.yml nsis: oneClick=true로 전환 — oneClick=false+perMachine=false가
  System.dll 0xc0000005 유발하는 electron-builder 알려진 이슈(#7921) 회피.
2026-04-15 22:57:39 +09:00
yunchan8804
8e31b36337 fix(installer): custom NSIS include 비활성화 — System.dll 0xc0000005 크래시 해소
- 이전 installer.nsh의 ReadRegDWORD + MessageBox 조합이 설치 중 System.dll에서
  access violation 유발 (WER로 확인)
- electron-builder 기본 installer UX만 사용 → 안정화 후 단계적으로 커스텀 재추가
- installer.nsh는 최소 버전으로 보존(향후 참고)
2026-04-15 22:30:10 +09:00
yunchan8804
eba5f7c540 fix(ci): artifacts expose_as 제거 — 와일드카드 paths와 병행 불가 2026-04-15 22:05:05 +09:00
yunchan8804
62a1390903 fix(ci): artifacts 경로 좁힘 — .exe + 메타만 업로드 (win-unpacked 제외)
- apps/desktop/release/ 전체(1490 파일)는 GitLab 아티팩트 용량 한도 초과
- 최종 산출물인 NSIS 설치파일(*.exe) + latest.yml + blockmap만 업로드
2026-04-15 22:03:51 +09:00
yunchan8804
5e74272aef fix(build): buildResources → build/ — resources/icons/ 빈폴더 자동 스캔 우회 2026-04-15 21:50:46 +09:00
yunchan8804
a18666dd6a fix(build): 아이콘 의존 제거 + NSISdl 비의존화
- electron-builder.yml: win/mac/linux icon 경로 제거 (resources/icons/가 비어있어 아이콘 수집 실패)
  Electron 기본 아이콘 사용. 추후 resources/icons/icon.ico 준비되면 win.icon 복원.
- extraResources의 resources/icons/ 복사 엔트리 삭제
- installer.nsh: NSISdl::download 제거 → 번들 플러그인 의존 제거
  VC++ 재배포 미설치 시 수동 설치 링크 안내만 표시
2026-04-15 21:43:39 +09:00
yunchan8804
adc88853fa fix(build): electronVersion 33.3.0 명시 — 모노레포 hoisting 자동감지 실패 우회 2026-04-15 21:29:08 +09:00
yunchan8804
02f88585d0 fix(build): electron-builder v26 호환 — package.json의 configFile 제거, --config 플래그 명시 2026-04-15 21:20:07 +09:00
yunchan8804
07c3c3873c fix(ci): Ollama 다운로드를 curl.exe로 전환 — IWR 대용량 파일 hang 해소 2026-04-15 21:13:23 +09:00
yunchan8804
8a8fb63636 fix(ci): download-ollama.ps1 메시지 영문화 — 한글 인코딩으로 PowerShell 파싱 실패 해소 2026-04-15 20:49:00 +09:00
yunchan8804
31902513bd build: SoX Windows 바이너리 직접 번들 (SourceForge 다운로드 차단 우회)
- apps/desktop/resources/sox/sox.exe + 의존 DLL 직접 커밋
- .gitignore 화이트리스트 조정
- download-sox.ps1는 파일 존재 시 자동 스킵하므로 CI에서 그대로 통과
2026-04-15 20:44:12 +09:00
yunchan8804
77114029a8 ci: Windows self-hosted runner 단독 배포 흐름 — Docker 의존 제거
- lint/typecheck/unit-test는 태그 푸시에서 제외(allow_failure 추가)
- release-create 잡을 release-cli 도커 이미지 대신 shell+curl(Invoke-RestMethod)로 전환
- 태그 파이프라인은 package-windows → release-create 2단계, 둘 다 Windows runner에서 실행
2026-04-15 20:07:05 +09:00
yunchan8804
aa65e710ec feat: 배포 파이프라인 — Ollama/sidecar 번들 + NSIS 자동 VC++ + GitLab CI + 온보딩 모달
- sidecar 슬림화: torch/pyannote 제거, ctranslate2 GPU 감지, /diarize 삭제
- Ollama 번들: resources/ollama/에 포터블 바이너리 배치, LocalLLMService 1순위 탐색
- installer.nsh: VC++ 재배포 x64 자동 다운로드(aka.ms 경유) + 사일런트 설치
- electron-builder: extraResources에 ollama 추가, nsis.include로 installer.nsh 연결
- scripts: download-ollama.ps1/sh 신규
- LLM.PULL_MODEL IPC 핸들러 + LocalLLMService.pullModel() 구현 (api/pull 스트리밍)
- 온보딩 모달: gemma4:e4b 미설치 감지 시 자동 표시, 진행률 UI, i18n(ko/en) 키 추가
- .gitlab-ci.yml: Windows 러너에서 sidecar/sox/ollama 준비 후 NSIS 패키징, 태그 시 Release 자동 생성
2026-04-15 19:47:27 +09:00
yunchan8804
d1edad6727 chore: 세션 핸드오프 — RN CLI 전환 빌드 정보 + 다음 작업 목록 2026-04-13 21:15:33 +09:00
yunchan8804
bf36a9d97d feat(mobile): Expo → RN CLI 전환 + Android 빌드 성공
RN 0.85 + React 19 기반 apps/mobile-rn 프로젝트 생성.
6개 화면 이식 (Login, Dash, History, Record, Talk, Settings).
@react-navigation/native + bottom-tabs 네비게이션 구성.
Windows NDK CMake libc++_shared 링크 버그 워크아라운드 포함.
Galaxy Fold (SM_F956N) 무선 디버깅 APK 설치 확인.
2026-04-13 21:13:40 +09:00
yunchan8804
55eb62189a feat(mobile): Phase M-2 D3RO 디자인 시스템 모바일 적용
DS 컴포넌트 9개 (ScreenPanel, WaveBars, AppStatusBar, Header, FilterChip 신규),
5개 탭 + 로그인 화면 D3RO 인스트루먼트 미학 적용,
i18n 연결 (I18nProvider + 모바일 전용 키 80+개),
모노레포 workspaces에 apps/mobile 추가.
2026-04-13 17:32:31 +09:00
yunchan8804
541f04d02b refactor: saasMode 분기 제거 — 항상 SaaS(OAuth only)로 동작
Mac/Windows 환경 불일치 해소. BUILD_TIME 상수, CONFIGURE 채널,
개발자 모드 UI 전부 제거. Supabase 설정은 supabase-config.ts SSOT.
2026-04-13 17:20:55 +09:00
윤찬
feb82abbf7 번역 2026-04-13 14:53:17 +09:00
윤찬
9f7ea1d729 chore: 세션 핸드오프 — V3 모바일 Phase M-1 완료 2026-04-13 03:23:24 +09:00
윤찬
211673bc6c feat(mobile): Phase M-1 모바일 프로젝트 기반 + V3 마스터 플랜
- V3 모바일 마스터 플랜 작성 (docs/v3/00-mobile-master-plan.md)
  11개 Phase, 5주 로드맵, 전략 결정사항 확정
- 7개 디자인 HTML 레퍼런스 저장 (docs/v3/designs/)
- app.json → app.config.ts 전환 + 환경변수 체계
- 5탭 네비게이션 (DASH/HIST/REC FAB/TALK/SET)
- metro.config.js monorepo 격리 (root RN 0.84 충돌 해결)
- ui-native 테마 디자인 목업 색상 동기화
- SafeArea 적용 (useSafeAreaInsets)
- DEV 로그인 우회 (__DEV__ 전용)
- Supabase .env 연동
- iOS 시뮬레이터 검증 완료
2026-04-13 03:22:15 +09:00
윤찬
ffca07d120 chore: 세션 핸드오프 — V2-7 완료 2026-04-13 01:28:55 +09:00
윤찬
8af75a0a1e feat: V2-7 Admin 콘솔 리디자인 + 3단계 권한 + SaaS 전환 + 코드 정리
- Admin CRM: D3RO Console 스타일 전체 적용 (panelSx/tableSx/filterBtnSx)
- 3단계 권한: manager/admin/super_admin (DB + Edge Functions + Frontend)
- 랜딩 페이지: 1회 결제 → 월간/연간 구독 SaaS 모델 (10개 언어)
- SSE 스트리밍: VoiceConversation Premium LLM 라우팅 + fallback
- Supabase 클라이언트: packages/api-client 공통 추출 (browser+server)
- RPC 함수 타입: 9개 정의 (admin_usage_by_feature 등)
- callAdminApi 401 버그 수정 (getUser() 선행 토큰 갱신)
2026-04-13 01:28:10 +09:00
윤찬
d0e854c255 chore: 세션 핸드오프 — Phase V2-6 완료 + 배포 2026-04-12 21:35:11 +09:00
윤찬
8467ecbdb5 chore: project_status 갱신 — Phase V2-6 Admin CRM 고도화 완료 2026-04-12 21:33:17 +09:00
윤찬
dca1b90faa feat(admin): Phase V2-6 Admin CRM 고도화 — CRUD + 차트 + 결제 + 감사
- DB: audit_log 테이블(diff 포함) + subscriptions.admin_note + super_admin role
- Edge Functions 4개: admin-users, admin-subscriptions, admin-payments, admin-audit-log
- 공유 유틸: admin-auth.ts(권한 검증), audit.ts(감사로그 기록)
- Swagger UI: 독립 정적 페이지 + OpenAPI 3.0 spec
- CRUD 페이지: 구독 생성/수정/삭제, role 변경, 감사로그 목록/상세
- recharts: feature별 StackedBar + DAU Line + Top Users HorizontalBar
- 결제 이력: DB + Payple API 병행 조회
- 권한: super_admin만 위험 작업, admin은 조회 전용
- RLS: admin/super_admin IN 정책 + super_admin 쓰기 정책
- SQL RPC: admin_usage_by_feature, admin_top_users, admin_dau
2026-04-12 21:32:47 +09:00
윤찬
f7c50eb2ed docs: Phase V2-6 Admin CRM 고도화 설계서
Admin API(Edge Function) + Swagger UI + CRUD 웹페이지 +
recharts 차트 + 결제 이력 + 감사로그 설계.
2026-04-12 21:18:19 +09:00
윤찬
1439ed3c7a chore: Phase 3.3 세션 핸드오프 — SaaS 인프라 완결 2026-04-12 20:57:34 +09:00
윤찬
3ef971e0fd chore: project_status 갱신 — Admin CRM 독립 프로젝트 완료 2026-04-12 20:55:58 +09:00
윤찬
eb4c504fea fix(admin): RLS 재귀 수정 + OAuth 쿠키 + 코드 정리
- RLS: profiles 재귀 참조 → app_metadata 기반으로 교체
- auth callback: 쿠키를 response에 직접 설정 (세션 유지)
- middleware: Supabase 세션 갱신 추가
- layout: requireAdmin() 사용으로 통합 (중복 제거)
- admin-guard: app_metadata.role 기반 (JWT, DB 쿼리 불필요)
- debug 라우트 제거
- config.toml: localhost:3000/3001 redirect URL 추가
2026-04-12 20:52:56 +09:00
윤찬
46673ee941 refactor(admin): CRM을 apps/admin 독립 프로젝트로 분리
- apps/web에서 admin 라우트/가드/sidebar 링크 제거
- apps/admin: 독립 Next.js 앱 (포트 3001)
  - 자체 login/unauthorized/auth callback
  - admin-sidebar: Overview/Users/Subscriptions/Usage
  - requireAdmin() 가드: profile.role='admin' 체크
- monorepo workspace에 apps/admin 등록
2026-04-12 20:36:24 +09:00
윤찬
daed9f90d5 chore: project_status 갱신 — 마스터플랜 4개 작업 전체 완료 2026-04-12 20:26:46 +09:00
윤찬
7467bd6ce9 feat(desktop): Premium LLM SSE 스트리밍 — 토큰 단위 실시간 응답
- sse-parser.ts: Anthropic SSE 파서 (content_block_delta.text 추출)
- CloudSyncService.invokeFunctionStream(): raw fetch + SSE ReadableStream
- PremiumLLMService.chatStream(): stream=true, 토큰 단위 yield
- SSE 실패 시 자동 비스트리밍 fallback
- AbortController 연결 (취소 지원)
2026-04-12 20:26:17 +09:00
윤찬
667c09242b feat(web): 관리자 CRM 웹페이지 — admin role + 4개 페이지
- migration: profiles.role 컬럼 + admin RLS 정책
- admin-guard.ts: RSC용 admin 권한 체크
- /admin: CRM 대시보드 (총 유저, 유료 구독자, API 호출, 만료 예정)
- /admin/users: 유저 목록 (검색/필터/페이지네이션)
- /admin/users/[id]: 유저 상세 (프로필+구독+30일 사용량)
- /admin/subscriptions: 구독 목록 (상태 필터)
- /admin/usage: 사용량 집계 (7/14/30일)
- Sidebar에 Admin 네비게이션 추가
2026-04-12 20:24:26 +09:00
윤찬
d3c2a4348d feat(server): Payple 정기 갱신 크론 — payple-renew Edge Function + GitHub Actions
- payple-renew: 만료 구독 조회 → paypleBilling → 기간 갱신
- 3회 연속 실패 시 tier=free, status=expired 다운그레이드
- migration: subscriptions.renewal_failures 컬럼 추가
- payple-webhook: 결제 완료 시 renewal_failures=0 리셋
- GitHub Actions: 매일 01:00 UTC 스케줄
2026-04-12 20:18:11 +09:00
윤찬
36031acda9 refactor(desktop): LemonSqueezy API 코드 완전 제거 (~150줄)
- LicenseService: LS API 상수/인터페이스/메서드 4개 삭제
- activate(): 로컬 키 검증 전용으로 단순화
- deactivate(): LS API 호출 제거
- initialize(): _tryPeriodicValidation 제거
- site/ taxNote: LemonSqueezy → Payple (10 locale)
2026-04-12 20:15:40 +09:00
윤찬
1f2843c383 fix(i18n): 10개 locale에 구독 관련 키 13개 추가 (en fallback 누락 수정) 2026-04-12 19:56:01 +09:00
윤찬
1d6d9bded3 chore: project_status 갱신 — 라이선스 UI 빅뱅 완료 2026-04-12 19:54:25 +09:00
윤찬
996def683b refactor(desktop): 라이선스 UI 빅뱅 — 키 입력 제거, 구독 기반 전환
- LicenseTab/LicenseModal: LemonSqueezy 키 입력 삭제, Payple 구독 UI로 전환
- useLicenseState 훅: 라이선스+클라우드 인증 공용 상태 관리 추출
- PREMIUM_MODEL_LIMITS: 3곳 중복 → @d3ro/core/constants 단일 소스
- i18n: LemonSqueezy 전용 키 18개 삭제, 구독 관련 키 13개 추가 (12 locale)
- DashboardPage: dashboard.model* → license.model* 키 통일
2026-04-12 19:54:04 +09:00
윤찬
68881bf0d0 fix(desktop): Payple 배포 완료 + billing URL 환경분기 + 세션만료 버그 수정
- OPEN_BILLING: app.isPackaged 기반 dev/prod URL 분기
- CloudSyncService: stored token 없을 때 auth-changed null emit 누락 수정
- Payple Edge Functions 3개 배포 ACTIVE 확인
2026-04-12 19:31:02 +09:00
윤찬
ad058fbd4d chore: Phase 3.2-B wrap-up — project_status + handoff + 다음 세션 프롬프트 2026-04-12 19:19:55 +09:00
윤찬
c9baf031c9 feat(server+web+desktop): Phase 3.2-B Payple 결제 연동 + 대시보드 Premium 상태 표시
Payple PG 연동:
- _shared/payple.ts: Payple API 래퍼 (auth/billing/cancel/deleteBillingKey)
- payple-checkout Edge Function: 빌링키 결제 + 구독 활성화
- payple-webhook Edge Function: 결제완료/취소 이벤트
- payple-manage Edge Function: 구독 취소 (빌링키 해지)
- DB migration: payment_provider + payple_payer_id + payple_pay_oid
- 웹 billing 페이지: Payple JS SDK 결제창 + 관리 버튼 (Stripe 대체)
- Electron LicenseModal: shell.openExternal → 웹 결제 페이지

대시보드 Premium 상태:
- CrtDisplay services에 PREMIUM LLM LED 추가
- 백엔드 인디케이터 카드 (Local/Premium) + 티어 카드
- 사용량 섹션: 전 티어 표시 + 모델별 Premium 쿼터
- 12개 locale × 14개 i18n 키
2026-04-12 19:18:40 +09:00