From 2a3d220db447aea27d45e0a828beed102ce2fc7b Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Mon, 1 Jun 2026 14:46:28 +0900 Subject: [PATCH] =?UTF-8?q?feat(ui):=20AI=20=EC=84=A4=EC=A0=95=EC=B0=BD=20?= =?UTF-8?q?+=20Codex=20CLI=20OAuth=20=EB=B0=B1=EC=97=94=EB=93=9C=20+=20?= =?UTF-8?q?=E2=9A=99=20=EC=A7=84=EC=9E=85=EC=A0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자 원래 요구였던 Codex non-interactive OAuth를 실제 동작까지 검증해 통합. ChatGPT 구독으로 API 키 없이 AI 변환. - CodexChatClient: codex exec --skip-git-repo-check --ephemeral -o - (stdin 프롬프트). 실제 한글→영어 번역 검증 완료 - ExternalProcessRunner: stdin 지원 + UTF-8 인코딩(한글 깨짐 해결) - ExternalToolDetector.IsCodexAvailable() + public 승격 - LlmProvider: codex 백엔드 + auto 폴백(키 없으면 Codex) - SettingsWindow: OpenAI/Anthropic 키(2단계 Verify) + Codex(OAuth) + 외부도구 상태/다운로드 CTA + 모델 선택 - App.Settings를 LlmProvider와 공유(키 저장 즉시 반영) - MainWindow 네비바 ⚙ 설정 진입점 - 디자인: Cursor/Zed/Raycast 설정 UX + Radix 상태 토큰 영감 --- src/Everything2Everything.App/App.xaml.cs | 10 +- .../Views/FormatShiftTheme.xaml | 37 ++++ .../Views/MainWindow.xaml | 3 + .../Views/MainWindow.xaml.cs | 8 + .../Views/SettingsWindow.xaml | 162 ++++++++++++++++++ .../Views/SettingsWindow.xaml.cs | 157 +++++++++++++++++ .../Converters/ChatClients.cs | 49 ++++++ .../Converters/ExternalProcessRunner.cs | 18 +- .../Converters/ExternalToolDetector.cs | 30 +++- .../Converters/LlmProvider.cs | 7 +- .../Everything2EverythingBootstrap.cs | 4 +- .../LlmProviderTests.cs | 3 +- 12 files changed, 480 insertions(+), 8 deletions(-) create mode 100644 src/Everything2Everything.App/Views/SettingsWindow.xaml create mode 100644 src/Everything2Everything.App/Views/SettingsWindow.xaml.cs diff --git a/src/Everything2Everything.App/App.xaml.cs b/src/Everything2Everything.App/App.xaml.cs index 6c03b33..3c7b93a 100644 --- a/src/Everything2Everything.App/App.xaml.cs +++ b/src/Everything2Everything.App/App.xaml.cs @@ -7,7 +7,15 @@ namespace Everything2Everything.App; public partial class App : Application { - public ConversionEngine Engine { get; } = Everything2EverythingBootstrap.CreateDefault(); + /// App·LlmProvider가 공유하는 설정 저장소 (키 저장 즉시 변환에 반영). + public ISettingsStore Settings { get; } = new DpapiSettingsStore(); + + public ConversionEngine Engine { get; } + + public App() + { + Engine = Everything2EverythingBootstrap.CreateDefault(Settings); + } protected override async void OnStartup(StartupEventArgs e) { diff --git a/src/Everything2Everything.App/Views/FormatShiftTheme.xaml b/src/Everything2Everything.App/Views/FormatShiftTheme.xaml index 784011c..6aa50c0 100644 --- a/src/Everything2Everything.App/Views/FormatShiftTheme.xaml +++ b/src/Everything2Everything.App/Views/FormatShiftTheme.xaml @@ -338,4 +338,41 @@ + + + + + + diff --git a/src/Everything2Everything.App/Views/MainWindow.xaml b/src/Everything2Everything.App/Views/MainWindow.xaml index 31b5a84..3af73c6 100644 --- a/src/Everything2Everything.App/Views/MainWindow.xaml +++ b/src/Everything2Everything.App/Views/MainWindow.xaml @@ -334,6 +334,9 @@ +