diff --git a/README.md b/README.md index 663dbb7..e04cb3d 100644 --- a/README.md +++ b/README.md @@ -1363,4 +1363,8 @@ MIT License - AX Agent 테마 팔레트를 다시 분리해 `Claude`, `Codex`, `Slate`, `Nord`, `Ember`가 서로 더 다른 인상으로 보이게 조정했습니다. 특히 `Codex`는 웜 베이지를 걷고 더 차갑고 중성적인 회백/차콜 표면 계열로 재구성했습니다. - 입력창 포커스 시 거의 항상 주황 테두리처럼 보이던 경로를 제거하고, 각 테마의 `InputFocusBorderColor`를 따르도록 바꿨습니다. 같이 composer와 메시지 버블 라운딩도 더 둥글게 손봐 Codex 계열 박스 감각에 더 가깝게 맞췄습니다. - 업데이트: 2026-04-06 22:01 (KST) -- AX Agent 내부 설정의 코드/공통 기능 토글들이 눌러도 다시 원래 상태로 돌아가던 문제를 수정했습니다. 내부 설정 오버레이에서 `Code 결과 검토`, `코드 리뷰 도구 활성화`, `도구 병렬 실행`, `Worktree/Team/Cron 도구`를 포함한 기능 토글들이 이제 즉시 저장 루틴을 타도록 연결했습니다. + - AX Agent 내부 설정의 코드/공통 기능 토글들이 눌러도 다시 원래 상태로 돌아가던 문제를 수정했습니다. 내부 설정 오버레이에서 `Code 결과 검토`, `코드 리뷰 도구 활성화`, `도구 병렬 실행`, `Worktree/Team/Cron 도구`를 포함한 기능 토글들이 이제 즉시 저장 루틴을 타도록 연결했습니다. +- 업데이트: 2026-04-06 22:15 (KST) + - AX Agent 루프에 남아 있던 `무료 티어 모드` 대기를 Gemini 서비스에서만 적용하도록 좁혔습니다. 이제 예전 Gemini 무료 티어용 대기 설정이 vLLM/Ollama/Claude 같은 다른 서비스 작업을 불필요하게 늦추지 않습니다. + - AX Agent 내부 설정의 `Fast` 표기를 `Gemini 무료 티어 대기`로 바꾸고 설명 문구도 실제 동작 기준으로 수정했습니다. 사용자는 이제 내부 설정에서 이 대기를 명확히 끄고 켤 수 있습니다. + - Cowork/Code 중간 진행 정보가 hover처럼 우연히만 보이던 문제를 줄이기 위해 에이전트 이벤트 카드 스타일을 다시 조정했습니다. 단계 시작, 도구 호출, 대기/생각 중 상태가 더 큰 글씨와 얇은 배경 카드로 기본 노출되도록 정리해, 장시간 작업 중에도 “지금 무엇을 하는지”를 본문에서 바로 읽을 수 있게 했습니다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 455f626..5623ede 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -5045,3 +5045,16 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml)의 AX Agent 내부 설정 오버레이 토글들에 `Checked/Unchecked` 이벤트 연결을 복원했다. - 대상: 이미지 입력, proactive compact, skill/tool hooks, cowork/code 검토, 병렬 도구, project rules, agent memory, worktree/team/cron 도구 - [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)에 `ChkOverlayFeatureToggle_Changed(...)` 공통 저장 핸들러를 추가해, 토글 변경 즉시 `ApplyOverlaySettingsChanges(...)`를 타고 설정이 저장되도록 정리했다. + +## 2026-04-06 22:15 (KST) + +- [AgentLoopService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopService.cs)의 `FreeTierMode` 대기를 Gemini 서비스에서만 적용하도록 변경했다. + - 예전 Gemini 무료 티어 대응용 호출 간 딜레이가 모든 서비스에 전역으로 묻어 다니지 않게 정리 + - 대기 이벤트 문구도 `Gemini 무료 티어 대기`로 명확히 수정 +- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml), [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 내부 설정 공통/빠른 설정 문구를 실제 기능 기준으로 변경했다. + - `Fast` → `Gemini 무료 티어 대기` + - 설명 툴팁도 “Gemini 무료 티어처럼 호출 제한이 있는 환경에서만 쓰는 대기”라는 의미가 드러나도록 정리 +- [ChatWindow.AgentEventRendering.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs)의 에이전트 이벤트 배너를 다시 조정했다. + - 단계 시작 이벤트도 progress bar만 갱신하고 끝나는 것이 아니라 transcript pill로 함께 남기도록 변경 + - `ToolCall` 이벤트를 기본 transcript에서 숨기지 않도록 복원 + - 생각/단계/도구 호출 카드의 글씨 크기, 배경, 테두리, 패딩을 키워 hover로 우연히 보이는 tiny 로그 느낌을 줄임 diff --git a/src/AxCopilot/Services/Agent/AgentLoopService.cs b/src/AxCopilot/Services/Agent/AgentLoopService.cs index 1c2c69e..6d6fe43 100644 --- a/src/AxCopilot/Services/Agent/AgentLoopService.cs +++ b/src/AxCopilot/Services/Agent/AgentLoopService.cs @@ -466,11 +466,16 @@ public partial class AgentLoopService EmitEvent(AgentEventType.Thinking, "", $"LLM에 요청 중... (반복 {iteration}/{maxIterations})"); - // 무료 티어 모드: LLM 호출 간 딜레이 (RPM 한도 초과 방지) - if (llm.FreeTierMode && iteration > 1) + // Gemini 무료 티어 모드: LLM 호출 간 딜레이 (RPM 한도 초과 방지) + var activeService = (_settings.Settings.Llm.Service ?? "").Trim(); + var shouldApplyFreeTierDelay = + llm.FreeTierMode + && iteration > 1 + && string.Equals(activeService, "gemini", StringComparison.OrdinalIgnoreCase); + if (shouldApplyFreeTierDelay) { var delaySec = llm.FreeTierDelaySeconds > 0 ? llm.FreeTierDelaySeconds : 4; - EmitEvent(AgentEventType.Thinking, "", $"무료 티어 모드: {delaySec}초 대기 중..."); + EmitEvent(AgentEventType.Thinking, "", $"Gemini 무료 티어 대기: {delaySec}초 후 다음 호출을 진행합니다..."); await Task.Delay(delaySec * 1000, ct); } diff --git a/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs b/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs index ee7876e..f42ea35 100644 --- a/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs +++ b/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs @@ -14,12 +14,12 @@ public partial class ChatWindow { return new Border { - Background = Brushes.Transparent, - BorderBrush = Brushes.Transparent, - BorderThickness = new Thickness(0), + Background = hintBg, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(999), - Padding = new Thickness(6, 2, 6, 2), - Margin = new Thickness(8, 2, 220, 2), + Padding = new Thickness(8, 4, 8, 4), + Margin = new Thickness(8, 3, 180, 3), HorizontalAlignment = HorizontalAlignment.Left, Child = new StackPanel { @@ -30,16 +30,17 @@ public partial class ChatWindow { Text = "\uE9CE", FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 8, + FontSize = 9.5, Foreground = accentBrush, VerticalAlignment = VerticalAlignment.Center, }, new TextBlock { Text = summary, - FontSize = 8.75, - Foreground = secondaryText, - Margin = new Thickness(4, 0, 0, 0), + FontSize = 9.5, + FontWeight = FontWeights.Medium, + Foreground = primaryText, + Margin = new Thickness(5, 0, 0, 0), VerticalAlignment = VerticalAlignment.Center, } } @@ -442,6 +443,19 @@ public partial class ChatWindow if (evt.Type == AgentEventType.StepStart && evt.StepTotal > 0) { UpdateProgressBar(evt); + var compactPrimaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var compactSecondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var compactHintBg = TryFindResource("HintBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + var compactBorderBrush = TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + var compactAccentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.CornflowerBlue; + var stepSummary = !string.IsNullOrWhiteSpace(evt.Summary) + ? evt.Summary! + : $"단계 진행 중 ({evt.StepCurrent}/{evt.StepTotal})"; + var pill = CreateCompactEventPill(stepSummary, compactPrimaryText, compactSecondaryText, compactHintBg, compactBorderBrush, compactAccentBrush); + pill.Opacity = 0; + pill.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(160))); + MessagePanel.Children.Add(pill); return; } @@ -465,10 +479,6 @@ public partial class ChatWindow && evt.Type is AgentEventType.Paused or AgentEventType.Resumed) return; - if (!string.Equals(logLevel, "debug", StringComparison.OrdinalIgnoreCase) - && evt.Type == AgentEventType.ToolCall) - return; - var isTotalStats = evt.Type == AgentEventType.StepDone && evt.ToolName == "total_stats"; var transcriptBadgeLabel = GetTranscriptBadgeLabel(evt); var permissionPresentation = evt.Type switch @@ -522,12 +532,12 @@ public partial class ChatWindow var banner = new Border { - Background = Brushes.Transparent, - BorderBrush = Brushes.Transparent, - BorderThickness = new Thickness(0), - CornerRadius = new CornerRadius(0), - Padding = new Thickness(0), - Margin = new Thickness(12, 0, 12, 1), + Background = hintBg, + BorderBrush = borderColor, + BorderThickness = new Thickness(1), + CornerRadius = new CornerRadius(10), + Padding = new Thickness(9, 7, 9, 7), + Margin = new Thickness(12, 3, 12, 3), HorizontalAlignment = HorizontalAlignment.Stretch, }; if (!string.IsNullOrWhiteSpace(evt.RunId)) @@ -544,15 +554,15 @@ public partial class ChatWindow { Text = icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 8.25, + FontSize = 10, Foreground = accentBrush, VerticalAlignment = VerticalAlignment.Center, - Margin = new Thickness(0, 0, 3, 0), + Margin = new Thickness(0, 0, 5, 0), }); headerLeft.Children.Add(new TextBlock { Text = label, - FontSize = 8.25, + FontSize = 10, FontWeight = FontWeights.Medium, Foreground = secondaryText, VerticalAlignment = VerticalAlignment.Center, @@ -562,7 +572,7 @@ public partial class ChatWindow headerLeft.Children.Add(new TextBlock { Text = $" · {itemDisplayName}", - FontSize = 8.25, + FontSize = 10, FontWeight = FontWeights.SemiBold, Foreground = primaryText, VerticalAlignment = VerticalAlignment.Center, @@ -576,7 +586,7 @@ public partial class ChatWindow headerRight.Children.Add(new TextBlock { Text = evt.ElapsedMs < 1000 ? $"{evt.ElapsedMs}ms" : $"{evt.ElapsedMs / 1000.0:F1}s", - FontSize = 7.5, + FontSize = 8.5, Foreground = secondaryText, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(3, 0, 0, 0), @@ -599,7 +609,7 @@ public partial class ChatWindow Child = new TextBlock { Text = tokenText, - FontSize = 7.25, + FontSize = 8, Foreground = secondaryText, FontFamily = new FontFamily("Consolas"), }, @@ -621,11 +631,11 @@ public partial class ChatWindow sp.Children.Add(new TextBlock { Text = shortSummary, - FontSize = 8.4, + FontSize = 9.5, Foreground = secondaryText, TextWrapping = TextWrapping.NoWrap, TextTrimming = TextTrimming.CharacterEllipsis, - Margin = new Thickness(11, 1, 0, 0), + Margin = new Thickness(15, 2, 0, 0), }); } } @@ -635,10 +645,10 @@ public partial class ChatWindow sp.Children.Add(new TextBlock { Text = summaryText, - FontSize = 8.4, + FontSize = 9.5, Foreground = secondaryText, TextWrapping = TextWrapping.Wrap, - Margin = new Thickness(11, 1, 0, 0), + Margin = new Thickness(15, 2, 0, 0), }); } diff --git a/src/AxCopilot/Views/ChatWindow.xaml b/src/AxCopilot/Views/ChatWindow.xaml index 8d63ca4..aa9f15e 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml +++ b/src/AxCopilot/Views/ChatWindow.xaml @@ -3255,12 +3255,12 @@ - 호출 간격을 조정해 제한이 있는 환경에서 더 안정적으로 동작하게 합니다. + Gemini 무료 티어처럼 호출 제한이 있는 환경에서만 대기 시간을 둘 수 있습니다. 일반 서비스에서는 꺼두는 것을 권장합니다. - @@ -3269,8 +3269,8 @@ Grid.Column="1" Style="{StaticResource OverlayComboBox}" SelectionChanged="CmbOverlayFastMode_SelectionChanged"> - - + + diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index a7ee4b5..9c78220 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -9723,7 +9723,7 @@ public partial class ChatWindow : Window BuildInlineModelRows(models, llm.Model); } - BtnInlineFastMode.Content = GetQuickActionLabel("Fast", llm.FreeTierMode ? "켜짐" : "꺼짐"); + BtnInlineFastMode.Content = GetQuickActionLabel("Gemini 대기", llm.FreeTierMode ? "켜짐" : "꺼짐"); BtnInlineReasoning.Content = GetQuickActionLabel("추론", ReasoningLabel(llm.AgentDecisionLevel)); BtnInlinePermission.Content = GetQuickActionLabel("권한", PermissionModeCatalog.ToDisplayLabel(llm.FilePermission)); BtnInlineSkill.Content = $"스킬 · {(llm.EnableSkillSystem ? "On" : "Off")}";