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")}";