AX Agent 진행 시간 표기와 글로우 설정 위치를 정리한다\n\n- Cowork/Code 진행 카드에서 스트리밍 시작 시각이 준비되기 전 계산되며 수천만 시간으로 튀는 문제를 수정한다\n- 진행 카드 라이브 대기 색상을 테마 AccentColor 기반으로 조정해 주황색 고정 느낌을 제거한다\n- 채팅 입력창 글로우를 런처와 같은 리듬의 무지개 글로우로 완화하고 외곽선 두께와 블러를 정리한다\n- 일반 설정의 런처/채팅 글로우 토글을 제거하고 AX Agent 내부 설정 공통 탭으로 이동한다\n- README와 DEVELOPMENT 문서에 변경 내용과 시각을 반영한다\n\n검증 결과\n- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\\n- 경고 0 / 오류 0

This commit is contained in:
2026-04-07 08:52:37 +09:00
parent f8baea24f5
commit a686d822e7
6 changed files with 165 additions and 71 deletions

View File

@@ -5302,6 +5302,7 @@ public partial class ChatWindow : Window
ForceScrollToEnd(); // 사용자 메시지 전송 시 강제 하단 이동
PlayRainbowGlow(); // 무지개 글로우 애니메이션
_streamStartTime = DateTime.UtcNow;
_isStreaming = true;
_streamRunTab = runTab;
StartLiveAgentProgressHints();
@@ -5318,7 +5319,6 @@ public partial class ChatWindow : Window
_displayedLength = 0;
_cursorVisible = true;
_aiIconPulseStopped = false;
_streamStartTime = DateTime.UtcNow;
_elapsedTimer.Start();
SetStatus("응답 생성 중...", spinning: true);
@@ -6415,7 +6415,8 @@ public partial class ChatWindow : Window
var normalizedSummary = string.IsNullOrWhiteSpace(summary) ? null : summary.Trim();
var currentSummary = _liveAgentProgressHint?.Summary;
var currentToolName = _liveAgentProgressHint?.ToolName ?? "";
var elapsedMs = _isStreaming
var hasValidStreamStart = _streamStartTime.Year >= 2000 && _streamStartTime <= DateTime.UtcNow.AddSeconds(1);
var elapsedMs = _isStreaming && hasValidStreamStart
? Math.Max(0L, (long)(DateTime.UtcNow - _streamStartTime.ToUniversalTime()).TotalMilliseconds)
: 0L;
var inputTokens = Math.Max(0, _agentCumulativeInputTokens);
@@ -8769,22 +8770,18 @@ public partial class ChatWindow : Window
_rainbowTimer?.Stop();
_rainbowStartTime = DateTime.UtcNow;
// 페이드인 (빠르게)
InputGlowBorder.Effect = new System.Windows.Media.Effects.BlurEffect { Radius = 6 };
InputGlowBorder.BeginAnimation(UIElement.OpacityProperty,
new System.Windows.Media.Animation.DoubleAnimation(0, 0.9, TimeSpan.FromMilliseconds(150)));
new System.Windows.Media.Animation.DoubleAnimation(0, 0.62, TimeSpan.FromMilliseconds(180)));
// 그라데이션 회전 타이머 (~60fps) — 스트리밍 종료까지 지속
_rainbowTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(16) };
_rainbowTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(40) };
_rainbowTimer.Tick += (_, _) =>
{
var elapsed = (DateTime.UtcNow - _rainbowStartTime).TotalMilliseconds;
// 그라데이션 오프셋 회전
var shift = (elapsed / 1500.0) % 1.0; // 1.5초에 1바퀴 (느리게)
var shift = (elapsed / 2000.0) % 1.0;
var brush = InputGlowBorder.BorderBrush as LinearGradientBrush;
if (brush == null) return;
// 시작/끝점 회전 (원형 이동)
var angle = shift * Math.PI * 2;
brush.StartPoint = new Point(0.5 + 0.5 * Math.Cos(angle), 0.5 + 0.5 * Math.Sin(angle));
brush.EndPoint = new Point(0.5 - 0.5 * Math.Cos(angle), 0.5 - 0.5 * Math.Sin(angle));
@@ -10278,6 +10275,9 @@ public partial class ChatWindow : Window
llm.WorkflowVisualizer = ChkOverlayWorkflowVisualizer?.IsChecked == true;
llm.ShowTotalCallStats = ChkOverlayShowTotalCallStats?.IsChecked == true;
llm.EnableAuditLog = ChkOverlayEnableAuditLog?.IsChecked == true;
llm.EnableChatRainbowGlow = ChkOverlayEnableChatRainbowGlow?.IsChecked == true;
_settings.Settings.Launcher.EnableRainbowGlow = ChkOverlayEnableLauncherRainbowGlow?.IsChecked == true;
_settings.Settings.Launcher.EnableSelectionGlow = ChkOverlayEnableSelectionGlow?.IsChecked == true;
CommitOverlayEndpointInput(normalizeOnInvalid: true);
CommitOverlayApiKeyInput();
@@ -10482,6 +10482,12 @@ public partial class ChatWindow : Window
ChkOverlayShowTotalCallStats.IsChecked = llm.ShowTotalCallStats;
if (ChkOverlayEnableAuditLog != null)
ChkOverlayEnableAuditLog.IsChecked = llm.EnableAuditLog;
if (ChkOverlayEnableChatRainbowGlow != null)
ChkOverlayEnableChatRainbowGlow.IsChecked = llm.EnableChatRainbowGlow;
if (ChkOverlayEnableLauncherRainbowGlow != null)
ChkOverlayEnableLauncherRainbowGlow.IsChecked = _settings.Settings.Launcher.EnableRainbowGlow;
if (ChkOverlayEnableSelectionGlow != null)
ChkOverlayEnableSelectionGlow.IsChecked = _settings.Settings.Launcher.EnableSelectionGlow;
}
RefreshOverlayThemeCards();