diff --git a/README.md b/README.md index 9db43b5..1c54fbd 100644 --- a/README.md +++ b/README.md @@ -1374,3 +1374,5 @@ MIT License - 업데이트: 2026-04-06 22:42 (KST) - AX Agent의 라이브 대기/압축 진행 힌트를 `claw-code`처럼 더 읽기 쉬운 진행 한 줄로 보강했습니다. 이제 Cowork/Code에서 오래 걸릴 때 `처리 중...`, `컨텍스트 압축 중...` 같은 요약줄이 transcript에 살아 있는 진행 상태로 나타납니다. - 같은 진행 줄 우측에는 `경과 시간`과 `현재 누적 토큰`이 함께 표시되어, 사용자가 “지금 멈춘 건지 아직 처리 중인지”를 기다릴 근거와 함께 바로 확인할 수 있게 조정했습니다. +- 업데이트: 2026-04-06 22:48 (KST) + - AX Agent의 라이브 대기 진행 줄에 작은 펄스 애니메이션을 추가했습니다. 오래 걸리는 `처리 중...`, `컨텍스트 압축 중...` 상태는 이제 좌측 마커가 은은하게 살아 움직여, 멈춘 로그가 아니라 실제 진행 중인 상태라는 점이 더 분명하게 보입니다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index ed7bee3..272c365 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -5075,3 +5075,9 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - [ChatWindow.AgentEventRendering.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs)의 process feed 요약줄에 우측 메타 영역을 추가했다. - `처리 중...`, `컨텍스트 압축 중...` 같은 라이브 진행 줄에 `6m 46s · 38.8K tokens`처럼 기다릴 근거가 함께 노출된다. - 라이브 대기/압축 상태는 기존 chevron 대신 강조 마커와 조금 더 진한 제목 톤을 써서 일반 이벤트보다 눈에 잘 들어오도록 구분했다. + +## 2026-04-06 22:48 (KST) + +- [ChatWindow.AgentEventRendering.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs)의 라이브 진행 줄에 작은 펄스 애니메이션을 추가했다. + - `처리 중...`, `컨텍스트 압축 중...`처럼 오래 걸리는 thinking 상태는 좌측 마커가 opacity/scale 펄스를 반복하며 살아 있는 상태임을 보여준다. + - transcript 분위기를 과하게 흔들지 않도록 마커 하나만 은은하게 움직이고, 본문 레이아웃은 그대로 유지해 `claude-code`의 담백한 진행감에 가깝게 맞췄다. diff --git a/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs b/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs index 692500b..23d7d8b 100644 --- a/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs +++ b/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs @@ -169,6 +169,8 @@ public partial class ChatWindow liveWaitingStyle); summaryRow.Opacity = 0; summaryRow.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(140))); + if (liveWaitingStyle) + ApplyLiveWaitingPulse(summaryRow); stack.Children.Add(summaryRow); var body = (eventSummaryText ?? string.Empty).Trim(); @@ -212,6 +214,45 @@ public partial class ChatWindow MessagePanel.Children.Add(stack); } + private static void ApplyLiveWaitingPulse(Border summaryRow) + { + if (summaryRow.Child is not Grid grid || grid.Children.Count == 0 || grid.Children[0] is not StackPanel panel) + return; + if (panel.Children.Count == 0 || panel.Children[0] is not TextBlock marker) + return; + + marker.Text = "✶"; + marker.RenderTransformOrigin = new Point(0.5, 0.5); + marker.RenderTransform = new ScaleTransform(1, 1); + + var pulse = new DoubleAnimation + { + From = 0.42, + To = 1.0, + Duration = TimeSpan.FromMilliseconds(780), + AutoReverse = true, + RepeatBehavior = RepeatBehavior.Forever, + EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseInOut }, + }; + marker.BeginAnimation(UIElement.OpacityProperty, pulse); + + if (marker.RenderTransform is ScaleTransform scale) + { + var scaleAnimX = new DoubleAnimation + { + From = 0.92, + To = 1.08, + Duration = TimeSpan.FromMilliseconds(780), + AutoReverse = true, + RepeatBehavior = RepeatBehavior.Forever, + EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseInOut }, + }; + var scaleAnimY = scaleAnimX.Clone(); + scale.BeginAnimation(ScaleTransform.ScaleXProperty, scaleAnimX); + scale.BeginAnimation(ScaleTransform.ScaleYProperty, scaleAnimY); + } + } + private string BuildProcessFeedMetaText(AgentEvent evt) { var parts = new List();