Commit graph

15 commits

Author SHA1 Message Date
Yun Chan
f281809d05 Phase 9: About 탭 + 녹음 오디오 WAV 저장
- Settings: 정보(About) 탭 추가 (버전, 기술 스택, 음성 엔진 정보)
- VoiceModeService: 전사 완료 시 PCM→WAV 파일 저장 ({userData}/recordings/)
  - WAV 헤더 생성 (16kHz, 16bit, mono)
  - HistoryService와 연동 가능 (audioLocalPath)
- docs/phases/phase-9.md 설계 문서 작성
2026-04-05 11:20:10 +09:00
Yun Chan
c64ab3b58f 3대 근본 버그 수정 (RE 조사 기반)
1. HotkeyService: modifier 먼저 놓기 대응
   - Alt+1에서 Alt를 먼저 놓아도 release 감지
   - _handleKeyUp에서 pressed 핫키의 구성 키(main/modifier) 매칭

2. ResultPopup auto-close IPC 핸들러 추가
   - window:hideResultPopup 핸들러가 없어서 팝업이 안 꺼지던 버그
   - window-handlers.ts에 hideResultPopup/hideRecordingTip 핸들러 등록

3. bootstrap.ts 이중 팝업 제어 제거
   - session-completed에서 무조건 showResultPopup 호출하던 코드 제거
   - 팝업 제어는 VoiceModeService 내부에서만 처리
   - bootstrap은 효과음만 담당
2026-04-05 10:50:18 +09:00
Yun Chan
0c79af6b03 세션 완료 후 즉시 idle 복귀 (텍스트 삽입 비동기 분리)
- _completeSession: hideRecordingTip + IDLE 복귀를 먼저 실행
- 텍스트 삽입은 세션과 무관하게 비동기 (다음 핫키 즉시 사용 가능)
- 삽입 await 중 다음 press가 세션을 꼬이게 하는 버그 수정
2026-04-05 10:39:13 +09:00
Yun Chan
84b9d906be 핫키 press/release race condition 수정
- _handleRelease: 200ms 딜레이 제거 → 즉시 stopSession()
  (딜레이 중 새 press가 와서 세션 꼬이는 버그 수정)
- _resetToIdle: 200ms 딜레이 제거 → 즉시 IDLE 복귀
  (딜레이 때문에 다음 핫키가 안 먹히는 버그 수정)
2026-04-05 10:35:45 +09:00
Yun Chan
18d5fef594 VoiceModeService ↔ 팝업 연동 구현 (Speakly RE 패턴)
- startSession: RecordingTip 표시 (recording 상태)
- 오디오 레벨: sendAudioLevelToTip → 웨이브 바 애니메이션
- stopSession: RecordingTip → thinking 상태 전환
- completeSession: RecordingTip 숨김 + 삽입 실패 시 ResultPopup 표시
- cancelSession: RecordingTip 즉시 숨김
- handleError: RecordingTip에 에러 표시 → 3초 후 자동 숨김 → idle 복귀
- CLAUDE.md: 핵심 병목 + Speakly 파이프라인 패턴 문서화
2026-04-05 10:23:54 +09:00
Yun Chan
eed225c8d4 SoX 마이크 캡처 수정 + 카드 z-index 그림자
- AudioCaptureService: node-record-lpcm16 → SoX 직접 spawn
  Windows에서 '-t waveaudio default' 필수 (--default-device 미지원)
- DashboardPage: 각 섹션에 증가하는 zIndex 적용 (아래 카드가 상위 레이어)
2026-04-05 10:13:57 +09:00
Yun Chan
1647321540 오디오 디바이스 한글 깨짐 수정: PowerShell UTF-8 출력 강제 2026-04-05 10:08:55 +09:00
Yun Chan
438aa1de6c 오디오 소스 선택 기능 추가
- AudioCaptureService.getDevices(): PowerShell로 Windows 오디오 디바이스 열거
- SettingsModal 오디오 탭: 마이크 선택 드롭다운 (기본 + 감지된 디바이스)
- 선택 변경 시 ConfigService에 저장 → 다음 녹음 시 적용
2026-04-05 10:05:47 +09:00
Yun Chan
5741d55c0b Phase 8 마무리: HistoryPage 날짜 그룹핑 + AppConfig 음성 모드 필드
- HistoryPage: 평면 리스트 → TODAY/YESTERDAY/날짜 그룹핑 (DashboardPage와 동일 패턴)
- AppConfig: dictationEnabled, agentModeEnabled, handsFreeEnabled 필드 추가
- ConfigService: 기본값 설정 (dictation=true, agent=false, handsFree=false)
- recording-tip: 에러 아이콘 색상 #D32F2F → #ef4444 (d3roPalette.tag.red)
2026-04-05 09:58:28 +09:00
Yun Chan
3f4d0c5828 Phase 7~8 구현: 테스트 + 빌드 + CI/CD + SoundEffect + AutoLaunch + UI 리디자인
- vitest 41개 단위 테스트 (HistoryService, DictionaryService, CustomInstructionService, VoiceModeService, D3ROError)
- electron-builder.yml (NSIS, asarUnpack, extraResources)
- .gitlab-ci.yml (lint, typecheck, test, build, release)
- SoundEffectService: WAV 프리로드 + PowerShell 재생 + VoiceMode 연동
- AutoLaunchService: app.setLoginItemSettings + ConfigService 동기화
- TextInsertService: 간이 삽입 검증 (EditMonitor 경량)
- 번들링 인프라: SoX 다운로드 스크립트, PyInstaller 빌드, 경로 해상도 유틸
- AudioCaptureService/LocalSTTService: 번들 경로 자동 감지
- 08-design-system.md 기반 MUI 테마 (다크+라이트+auto 테마 시스템)
- 전체 UI 컴포넌트 리디자인: AppLayout, Dashboard, StatusBar, History, Dictionary, Commands, Settings
- 효과음 WAV 생성: recording-start, recording-stop, error
- EPIPE 에러 핸들링 추가
2026-04-05 09:12:56 +09:00
Yun Chan
d940c5020e Phase 6 구현: 커스텀 명령어 + i18n (ko/en)
- CustomInstructionService: 프리셋 5개 (번역/요약/전문리라이트/코드설명/자유프롬프트)
- 커스텀 명령어 CRUD + 프리셋 보호 (삭제 불가)
- CommandsPage: 명령어 목록 + 추가/편집 다이얼로그
- i18n: ko.json/en.json 리소스 파일, t() 함수, React 컨텍스트
- IPC: instruction 핸들러 6개
- AppLayout: Commands 네비게이션 추가
2026-04-05 02:53:32 +09:00
Yun Chan
291e2a29d0 Phase 5 구현: SQLite DB + History/Dictionary 서비스 + UI
- DB: better-sqlite3 + drizzle-orm (history/dictionary/stats, WAL 모드)
- HistoryService: CRUD + 검색 + 통계 + 30일 보존 정책, 세션 완료 시 자동 저장
- DictionaryService: CRUD + 검색 + 사용 횟수 추적 + STT 프롬프트 힌트
- HistoryPage: 목록 + 검색 + 삭제 + 복사 + 페이지네이션
- DictionaryPage: 목록 + 검색 + 추가 다이얼로그 + 삭제
- DashboardPage: 실데이터 통계 (총/오늘 세션, 시간, 단어수, 연속일수)
- IPC: history/dictionary/stats 핸들러 + preload API
- Bootstrap: DB 초기화 (critical) + 이력 자동 저장 연동
2026-04-05 02:32:53 +09:00
Yun Chan
4a5cf6c819 Phase 4 구현: Ollama LLM 연동 (다듬기, 번역, 스트리밍)
- LocalLLMService: Ollama REST API, 스트리밍 NDJSON 파싱, 5초 가용성 폴링
- 시스템 프롬프트: refine/translate/summarize/grammar/expand/custom 6개 액션
- VoiceModeService: 전사→LLM 후처리→텍스트 삽입, LLM 실패 시 원본 폴백
- LLM IPC 핸들러: status/models/process/cancel/serverUrl 8개
- StatusBar: Ollama 연결 상태 + 활성 모델 표시
- Preload: llm API 섹션 추가
- Bootstrap: llm-polling 초기화 단계 추가
2026-04-05 02:18:26 +09:00
Yun Chan
517210af2f Phase 3 구현: 텍스트 삽입 + RecordingTip/ResultPopup + Settings
- TextInsertService: clipboard save→set→Ctrl+V→restore (@nut-tree-fork/nut-js)
- RecordingTip 팝업: 9개 웨이브바 cos분포, thinking 점근수렴, 2-phase 리사이즈
- ResultPopup 팝업: 복사 버튼, auto-close, 마우스 호버 유지, 다크모드
- WindowManager: 팝업 프리로딩, 커서 위치 표시, 멀티모니터 보정
- Settings 모달: General/Audio/STT/LLM 탭
- VoiceModeService: 전사 완료 시 자동 텍스트 삽입 + 팝업 연동
- electron-vite: 팝업 HTML 멀티 엔트리 + popup preload 빌드
2026-04-05 02:11:58 +09:00
Yun Chan
1d152d01a1 Phase 1+2 구현: Electron 뼈대 + STT/핫키/오케스트레이터
Phase 1:
- 프로젝트 초기화 (TypeScript strict, electron-vite, ESLint, Prettier)
- shared 타입 (ipc-channels 113채널, types, errors, constants)
- 메인 프로세스 뼈대 (bootstrap, lifecycle, 단일 인스턴스)
- LoggerService, ConfigService (electron-store ESM dynamic import)
- React 19 + MUI 7 Dashboard, 시스템 트레이

Phase 2:
- AudioCaptureService (node-record-lpcm16, PCM16 16kHz mono)
- HotkeyService (uiohook-napi, 더블프레스, holdMode/toggleMode)
- LocalSTTService (faster-whisper Python sidecar, 이중 조건 플러시)
- VoiceModeService 오케스트레이터 (이중 상태머신, Action Queue)
- Python sidecar (FastAPI: health/load/transcribe/shutdown)
- IPC 핸들러 (voice, stt, hotkey) + Preload API 확장
2026-04-05 02:01:37 +09:00