1
0
Fork 0

feat(ui): AI 설정창 + Codex CLI OAuth 백엔드 + ⚙ 진입점

사용자 원래 요구였던 Codex non-interactive OAuth를 실제 동작까지 검증해 통합. ChatGPT 구독으로 API 키 없이 AI 변환.

- CodexChatClient: codex exec --skip-git-repo-check --ephemeral -o <file> - (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 상태 토큰 영감
This commit is contained in:
Yun Chan 2026-06-01 14:46:28 +09:00
parent faffb8f205
commit 2a3d220db4
12 changed files with 480 additions and 8 deletions

View file

@ -2,7 +2,7 @@ using Microsoft.Win32;
namespace Everything2Everything.Core.Converters;
internal static class ExternalToolDetector
public static class ExternalToolDetector
{
public static bool TryFindLibreOfficeSoffice(out string sofficePath)
{
@ -82,6 +82,34 @@ internal static class ExternalToolDetector
return false;
}
/// <summary>
/// codex CLI(OpenAI Codex, ChatGPT 구독 OAuth 재사용) 설치 여부. npm 글로벌 + PATH에서
/// codex.cmd/codex.exe/codex.ps1을 탐지한다.
/// </summary>
public static bool IsCodexAvailable()
{
var names = new[] { "codex.cmd", "codex.exe", "codex.ps1" };
var dirs = new List<string>();
var appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
if (!string.IsNullOrEmpty(appdata)) dirs.Add(Path.Combine(appdata, "npm"));
var pathEnv = Environment.GetEnvironmentVariable("PATH") ?? "";
foreach (var d in pathEnv.Split(Path.PathSeparator))
if (!string.IsNullOrWhiteSpace(d)) dirs.Add(d.Trim());
foreach (var dir in dirs.Distinct())
{
try
{
foreach (var n in names)
if (File.Exists(Path.Combine(dir, n))) return true;
}
catch { /* 잘못된 경로 무시 */ }
}
return false;
}
public static bool IsH2OrestartInstalled()
{
try