diff --git a/README.md b/README.md index b5fa264..2da0569 100644 --- a/README.md +++ b/README.md @@ -897,6 +897,11 @@ ow + toggle 시각 언어로 통일했습니다. - 탭 래퍼 배경은 `LauncherBackground` 기준으로 바꾸고, 선택 탭은 같은 계열 배경 + 얇은 테두리가 보이도록 바꿨습니다. 라벨도 `채팅 / Cowork / 코드`로 맞춰 이전보다 읽기 쉬운 상단 내비로 정리했습니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 19:16 (KST) +- `claw-code`의 `StatusLine + PromptInput + Messages` 기준으로 AX Agent 보조 상태 노출을 한 단계 더 줄였습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서 `ConversationQuickStrip` 은 단순 카운트가 있을 때 자동 노출되지 않고, 사용자가 실제로 `진행 중만 보기` 또는 정렬 전환을 켰을 때만 보이도록 바꿨습니다. +- 같은 파일에서 상단 `ConversationStatusStrip` 은 `권한 대기 / 실패 / 권한 거부`만 유지하고, `queue`, `queue_blocked` 같은 보조 상태는 기본 화면에서 숨기도록 정리했습니다. Cowork/Code transcript가 queue 상태 배너로 과하게 시끄럽던 부분을 줄이기 위한 변경입니다. +- `AgentEventType.Planning` 도 더 `claw-code`처럼 기본 transcript에서는 큰 계획 카드 대신 얇은 compact pill만 남기도록 바꿨습니다. 이제 debug가 아니면 계획이 카드 형태로 본문을 밀어내지 않습니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 +- 업데이트: 2026-04-05 19:24 (KST) --- diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 8611249..59927cb 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4657,3 +4657,8 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - 탭 래퍼 자체도 `LauncherBackground` 기준으로 바꾸고 패딩을 늘렸으며, 상단 라벨은 `채팅 / Cowork / 코드`로 변경해 첫 번째 참고 이미지처럼 읽히는 내비 구조로 복구했습니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 19:16 (KST) +- `claw-code`의 `StatusLine + PromptInput + Messages` 축과 더 맞추기 위해 AX Agent 보조 상태 UI를 추가로 최소화했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `UpdateConversationQuickStripUi()` 는 단순 실행 개수/활동 개수만으로 자동 노출되지 않고, 사용자가 직접 필터나 정렬을 바꿨을 때만 보이도록 변경했습니다. +- 같은 파일의 상단 `ConversationStatusStrip` 은 `permission_waiting / failed_run / permission_denied` 세 경우만 유지하고, `queue` 및 `queue_blocked` 는 기본 transcript 상단에서 숨기도록 바꿨습니다. queue 상태는 요약 팝업/대기열 내부에서만 확인하게 정리한 것입니다. +- `AddAgentEventBanner(...)` 의 Planning 처리도 바꿨습니다. 이제 `AgentEventType.Planning` 은 log level과 무관하게 기본 transcript에 compact pill만 남기고, 큰 계획 카드는 기본 흐름에서 사용하지 않습니다. `claw-code`처럼 transcript 중심 읽기 흐름을 유지하기 위한 정리입니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 +- 업데이트: 2026-04-05 19:24 (KST) diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index f31d427..a335d38 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -9241,8 +9241,7 @@ public partial class ChatWindow : Window var showCompactStrip = !string.Equals(_activeTab, "Chat", StringComparison.OrdinalIgnoreCase) && (string.Equals(status.StripKind, "permission_waiting", StringComparison.OrdinalIgnoreCase) || string.Equals(status.StripKind, "failed_run", StringComparison.OrdinalIgnoreCase) - || string.Equals(status.StripKind, "permission_denied", StringComparison.OrdinalIgnoreCase) - || string.Equals(status.StripKind, "queue_blocked", StringComparison.OrdinalIgnoreCase)); + || string.Equals(status.StripKind, "permission_denied", StringComparison.OrdinalIgnoreCase)); if (!showCompactStrip) { @@ -9266,22 +9265,6 @@ public partial class ChatWindow : Window ConversationStatusStripLabel.Foreground = BrushFromHex("#991B1B"); ConversationStatusStripLabel.Text = status.StripText; } - else if (string.Equals(status.StripKind, "queue", StringComparison.OrdinalIgnoreCase)) - { - ConversationStatusStrip.Visibility = Visibility.Visible; - ConversationStatusStrip.Background = BrushFromHex("#F5F3FF"); - ConversationStatusStrip.BorderBrush = BrushFromHex("#C4B5FD"); - ConversationStatusStripLabel.Foreground = BrushFromHex("#6D28D9"); - ConversationStatusStripLabel.Text = status.StripText; - } - else if (string.Equals(status.StripKind, "queue_blocked", StringComparison.OrdinalIgnoreCase)) - { - ConversationStatusStrip.Visibility = Visibility.Visible; - ConversationStatusStrip.Background = BrushFromHex("#FFFBEB"); - ConversationStatusStrip.BorderBrush = BrushFromHex("#FCD34D"); - ConversationStatusStripLabel.Foreground = BrushFromHex("#B45309"); - ConversationStatusStripLabel.Text = status.StripText; - } else { ConversationStatusStrip.Visibility = Visibility.Collapsed; @@ -9300,8 +9283,8 @@ public partial class ChatWindow : Window var allowQuickStrip = !string.Equals(_activeTab, "Chat", StringComparison.OrdinalIgnoreCase); var hasQuickSignal = allowQuickStrip - && (_runningConversationCount > 0 - || _spotlightConversationCount > 0); + && (_runningOnlyFilter + || !_sortConversationsByRecent); ConversationQuickStrip.Visibility = hasQuickSignal ? Visibility.Visible @@ -10343,29 +10326,22 @@ public partial class ChatWindow : Window { var logLevel = _settings.Settings.Llm.AgentLogLevel; - // Planning 이벤트는 기본적으로 얇은 요약만 보이고, debug에서만 큰 카드로 펼칩니다. + // Planning 이벤트는 claw-code 기준으로 기본 transcript에 요약 pill만 남깁니다. if (evt.Type == AgentEventType.Planning && evt.Steps is { Count: > 0 }) { - if (string.Equals(logLevel, "debug", StringComparison.OrdinalIgnoreCase)) - { - AddPlanningCard(evt); - } - else - { - 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 summary = !string.IsNullOrWhiteSpace(evt.Summary) - ? evt.Summary! - : $"계획 {evt.Steps.Count}단계"; - var pill = CreateCompactEventPill(summary, compactPrimaryText, compactSecondaryText, compactHintBg, compactBorderBrush, compactAccentBrush); - pill.Opacity = 0; - pill.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(160))); - MessagePanel.Children.Add(pill); - } + 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 summary = !string.IsNullOrWhiteSpace(evt.Summary) + ? evt.Summary! + : $"계획 {evt.Steps.Count}단계"; + var pill = CreateCompactEventPill(summary, compactPrimaryText, compactSecondaryText, compactHintBg, compactBorderBrush, compactAccentBrush); + pill.Opacity = 0; + pill.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(160))); + MessagePanel.Children.Add(pill); return; }