From 51ff046e1a419e29c3af20d1441ca0a7b1dff741 Mon Sep 17 00:00:00 2001 From: lacvet Date: Sun, 5 Apr 2026 16:15:31 +0900 Subject: [PATCH] =?UTF-8?q?AX=20Agent=20=ED=83=80=EC=9E=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EA=B8=B0=EB=B3=B8=20=EB=85=B8=EC=B6=9C=20=EC=B6=95?= =?UTF-8?q?=EC=86=8C=20=EB=B0=8F=20=EA=B3=84=ED=9A=8D/=EC=9E=91=EC=97=85?= =?UTF-8?q?=20=EC=B9=B4=EB=93=9C=20=EA=B2=BD=EB=9F=89=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - non-debug 기본 로그에서 ToolCall 중간 이벤트를 숨겨 Cowork/Code 타임라인을 결과 중심으로 재정리함 - 계획 카드와 작업 요약 카드, 액션 버튼의 패딩/폰트/폭을 낮춰 transcript 중심 흐름을 강화함 - 권한 작업 카드에서 계획 모드 버튼을 제거해 현재 엔진 정책과 UI를 일치시킴 - README 및 DEVELOPMENT 문서에 2026-04-05 18:49 (KST) 기준 변경 이력과 parity 진척율을 반영함 검증: - dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ - 경고 0 / 오류 0 --- README.md | 6 ++ docs/DEVELOPMENT.md | 6 ++ src/AxCopilot/Views/ChatWindow.xaml.cs | 77 +++++++++++++------------- 3 files changed, 50 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 05dd214..7873a9c 100644 --- a/README.md +++ b/README.md @@ -873,6 +873,12 @@ ow + toggle 시각 언어로 통일했습니다. - 현재 `claw-code` 대비 추정 진척율은 핵심 엔진 `88%`, 채팅 메인 UI `95%`, Cowork/Code 상태 UX `91%`, 내부 설정 연결 `88%`, 전체 AX Agent `93%` 정도입니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 18:40 (KST) +- 실행 타임라인과 계획 카드도 기본 노출을 더 줄였습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddAgentEventBanner(...)` 는 `debug`가 아닐 때 `ToolCall` 중간 이벤트를 숨기고, 일반 요약 문구도 더 짧은 길이로 잘라 본문보다 덜 튀게 조정했습니다. +- `AddPlanningCard(...)`는 계획 카드 라운드, 패딩, 헤더 텍스트, 단계 폰트와 최대 폭을 더 줄여 transcript 안의 보조 계획 메모처럼 보이게 바꿨고, `BuildTaskSummaryCard(...)` 와 `CreateTaskSummaryActionButton(...)` 도 카드/버튼 크기를 한 단계 더 낮췄습니다. +- 같은 정리에서 권한 작업 카드 액션은 `계획 모드` 버튼을 제거해 현재 엔진 정책과 UI가 다시 어긋나지 않게 맞췄습니다. +- 현재 `claw-code` 대비 추정 진척율은 핵심 엔진 `89%`, 채팅 메인 UI `96%`, Cowork/Code 상태 UX `92%`, 내부 설정 연결 `88%`, 전체 AX Agent `94%` 정도입니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 +- 업데이트: 2026-04-05 18:49 (KST) --- diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index ec75a57..f52feea 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4633,3 +4633,9 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - 현재 `claw-code` 대비 추정 진척율은 핵심 엔진 `88%`, 채팅 메인 UI `95%`, Cowork/Code 상태 UX `91%`, 내부 설정 연결 `88%`, 전체 AX Agent `93%` 정도로 봅니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 18:40 (KST) +- Cowork/Code 실행 타임라인도 더 `claw-code` 기준으로 눌렀습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddAgentEventBanner(...)` 는 `debug`가 아닐 때 `ToolCall` 중간 이벤트를 기본 타임라인에서 숨기고, 일반 요약 문구 길이와 메타 폰트도 더 줄여 결과/오류 중심 흐름이 먼저 보이게 정리했습니다. +- `AddPlanningCard(...)`는 계획 카드 라운드, 패딩, 헤더 문구, 단계 폰트와 최대 폭을 더 낮춰 “계획 패널”보다 “짧은 계획 메모”에 가깝게 축소했습니다. transcript에 붙는 계획 표시가 이제 본문과 더 같은 축을 쓰도록 정리됐습니다. +- 같은 변경에서 `BuildTaskSummaryCard(...)` 와 `CreateTaskSummaryActionButton(...)` 도 한 단계 더 소형화했고, `BuildTaskSummaryActionRow(...)` 의 권한 카드 액션에서는 이미 제거한 `계획 모드` 버튼을 빼서 엔진 기본 정책과 UI가 다시 어긋나지 않게 맞췄습니다. +- 현재 `claw-code` 대비 추정 진척율은 핵심 엔진 `89%`, 채팅 메인 UI `96%`, Cowork/Code 상태 UX `92%`, 내부 설정 연결 `88%`, 전체 AX Agent `94%` 정도로 봅니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 +- 업데이트: 2026-04-05 18:49 (KST) diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index 69b7793..f96b71d 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -9411,7 +9411,6 @@ public partial class ChatWindow : Window var steps = evt.Steps!; var primaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.Black; var secondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.DimGray; - var itemBg = TryFindResource("ItemBackground") as Brush ?? BrushFromHex("#FFFFFF"); var hintBg = TryFindResource("HintBackground") as Brush ?? BrushFromHex("#F8FAFC"); var borderBrush = TryFindResource("BorderColor") as Brush ?? BrushFromHex("#E2E8F0"); var accentBrush = TryFindResource("AccentColor") as Brush ?? BrushFromHex("#4B5EFC"); @@ -9421,9 +9420,9 @@ public partial class ChatWindow : Window Background = hintBg, BorderBrush = borderBrush, BorderThickness = new Thickness(1), - CornerRadius = new CornerRadius(10), - Padding = new Thickness(10, 8, 10, 8), - Margin = new Thickness(8, 3, 228, 6), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(8, 6, 8, 6), + Margin = new Thickness(8, 2, 248, 5), HorizontalAlignment = HorizontalAlignment.Left, MaxWidth = GetMessageMaxWidth(), }; @@ -9436,17 +9435,17 @@ public partial class ChatWindow : Window { Text = "\uE9D5", // plan icon FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 9, + FontSize = 8, Foreground = accentBrush, - VerticalAlignment = VerticalAlignment.Center, - Margin = new Thickness(0, 0, 4, 0), + VerticalAlignment = VerticalAlignment.Center }); header.Children.Add(new TextBlock { - Text = $"작업 {steps.Count}개 · 0 완료", - FontSize = 9.5, FontWeight = FontWeights.SemiBold, + Text = $"계획 {steps.Count}단계", + FontSize = 9, FontWeight = FontWeights.SemiBold, Foreground = secondaryText, VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(4, 0, 0, 0), }); sp.Children.Add(header); @@ -9473,7 +9472,7 @@ public partial class ChatWindow : Window _planProgressText = new TextBlock { Text = "0%", - FontSize = 8.5, FontWeight = FontWeights.SemiBold, + FontSize = 8, FontWeight = FontWeights.SemiBold, Foreground = secondaryText, Margin = new Thickness(5, 0, 0, 0), VerticalAlignment = VerticalAlignment.Center, @@ -9496,7 +9495,7 @@ public partial class ChatWindow : Window stepRow.Children.Add(new TextBlock { Text = "○", // 빈 원 (미완료) - FontSize = 9, + FontSize = 8.5, Foreground = secondaryText, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 4, 0), @@ -9505,10 +9504,10 @@ public partial class ChatWindow : Window stepRow.Children.Add(new TextBlock { Text = $"{i + 1}. {steps[i]}", - FontSize = 9.5, + FontSize = 8.75, Foreground = primaryText, TextWrapping = TextWrapping.Wrap, - MaxWidth = Math.Max(320, GetMessageMaxWidth() - 52), + MaxWidth = Math.Max(280, GetMessageMaxWidth() - 68), VerticalAlignment = VerticalAlignment.Center, }); @@ -10397,8 +10396,9 @@ public partial class ChatWindow : Window && evt.Type is AgentEventType.Paused or AgentEventType.Resumed) return; - // simple 모드: ToolCall은 건너뜀 (ToolResult만 한 줄로 표시) - if (logLevel == "simple" && evt.Type == AgentEventType.ToolCall) + // 기본 로그에서는 중간 ToolCall을 숨겨 결과/오류 중심으로 정리합니다. + if (!string.Equals(logLevel, "debug", StringComparison.OrdinalIgnoreCase) + && evt.Type == AgentEventType.ToolCall) return; // 전체 통계 이벤트는 별도 색상 (보라색 계열) @@ -10437,7 +10437,7 @@ public partial class ChatWindow : Window BorderThickness = new Thickness(0), CornerRadius = new CornerRadius(0), Padding = new Thickness(0), - Margin = new Thickness(12, 1, 12, 1), + Margin = new Thickness(12, 0, 12, 1), HorizontalAlignment = HorizontalAlignment.Stretch, }; if (!string.IsNullOrWhiteSpace(evt.RunId)) @@ -10456,7 +10456,7 @@ public partial class ChatWindow : Window { Text = icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 8.75, + FontSize = 8.25, Foreground = accentBrush, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 3, 0), @@ -10464,7 +10464,7 @@ public partial class ChatWindow : Window headerLeft.Children.Add(new TextBlock { Text = label, - FontSize = 8.75, + FontSize = 8.25, FontWeight = FontWeights.Medium, Foreground = secondaryText, VerticalAlignment = VerticalAlignment.Center, @@ -10478,7 +10478,7 @@ public partial class ChatWindow : Window headerRight.Children.Add(new TextBlock { Text = evt.ElapsedMs < 1000 ? $"{evt.ElapsedMs}ms" : $"{evt.ElapsedMs / 1000.0:F1}s", - FontSize = 8, + FontSize = 7.5, Foreground = secondaryText, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(3, 0, 0, 0), @@ -10501,7 +10501,7 @@ public partial class ChatWindow : Window Child = new TextBlock { Text = tokenText, - FontSize = 7.5, + FontSize = 7.25, Foreground = secondaryText, FontFamily = new FontFamily("Consolas"), }, @@ -10528,25 +10528,25 @@ public partial class ChatWindow : Window sp.Children.Add(new TextBlock { Text = shortSummary, - FontSize = 8.9, + FontSize = 8.4, Foreground = secondaryText, TextWrapping = TextWrapping.NoWrap, TextTrimming = TextTrimming.CharacterEllipsis, - Margin = new Thickness(12, 1, 0, 0), + Margin = new Thickness(11, 1, 0, 0), }); } } // detailed/debug 모드: 실행 줄 아래에 얕은 설명만 표시 else if (!string.IsNullOrEmpty(evt.Summary)) { - var summaryText = evt.Summary.Length > 120 ? evt.Summary[..120] + "…" : evt.Summary; + var summaryText = evt.Summary.Length > 92 ? evt.Summary[..92] + "…" : evt.Summary; sp.Children.Add(new TextBlock { Text = summaryText, - FontSize = 8.9, + FontSize = 8.4, Foreground = secondaryText, TextWrapping = TextWrapping.Wrap, - Margin = new Thickness(12, 1, 0, 0), + Margin = new Thickness(11, 1, 0, 0), }); } @@ -21154,9 +21154,9 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi { Text = kindIcon, FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 11, + FontSize = 9.5, Foreground = kindColor, - Margin = new Thickness(0, 0, 6, 0), + Margin = new Thickness(0, 0, 4, 0), VerticalAlignment = VerticalAlignment.Center, }); headerRow.Children.Add(new TextBlock @@ -21164,7 +21164,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi Text = active ? $"진행 중 · {task.Title}" : $"{GetTaskStatusLabel(task.Status)} · {task.Title}", - FontSize = 11, + FontSize = 9.5, FontWeight = FontWeights.SemiBold, Foreground = active ? primaryText : secondaryText, TextWrapping = TextWrapping.Wrap, @@ -21175,8 +21175,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi { taskStack.Children.Add(new TextBlock { - Text = task.Summary, - FontSize = 10.5, + Text = TruncateForStatus(task.Summary, 96), + FontSize = 8.75, Foreground = secondaryText, TextWrapping = TextWrapping.Wrap, }); @@ -21196,12 +21196,12 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi return new Border { - Background = active ? BrushFromHex("#F8FAFC") : Brushes.White, + Background = active ? BrushFromHex("#F8FAFC") : (TryFindResource("LauncherBackground") as Brush ?? Brushes.White), BorderBrush = BrushFromHex("#E5E7EB"), BorderThickness = new Thickness(1), - CornerRadius = new CornerRadius(8), - Padding = new Thickness(10, 7, 10, 7), - Margin = new Thickness(8, 0, 8, 6), + CornerRadius = new CornerRadius(7), + Padding = new Thickness(8, 5, 8, 5), + Margin = new Thickness(8, 0, 8, 4), Child = taskStack }; } @@ -21217,10 +21217,10 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi var button = new Button { Content = label, - FontSize = 8.75, - MinHeight = 22, - Padding = new Thickness(7, 2.5, 7, 2.5), - Margin = trailingMargin ? new Thickness(0, 0, 4, 0) : new Thickness(0), + FontSize = 8.25, + MinHeight = 20, + Padding = new Thickness(6, 2, 6, 2), + Margin = trailingMargin ? new Thickness(0, 0, 3, 0) : new Thickness(0), Background = BrushFromHex(bg), BorderBrush = BrushFromHex(border), BorderThickness = new Thickness(1), @@ -21277,7 +21277,6 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi actions.Children.Add(BuildPermissionButton("권한 요청", "#EFF6FF", "#BFDBFE", "#1D4ED8", PermissionModeCatalog.Default)); actions.Children.Add(BuildPermissionButton("편집 자동 승인", "#ECFDF5", "#BBF7D0", "#166534", PermissionModeCatalog.AcceptEdits)); - actions.Children.Add(BuildPermissionButton("계획 모드", "#EEF2FF", "#C7D2FE", "#3730A3", PermissionModeCatalog.Plan)); actions.Children.Add(BuildPermissionButton("권한 건너뛰기", "#FFF7ED", "#FDBA74", "#C2410C", PermissionModeCatalog.BypassPermissions)); actions.Children.Add(BuildPermissionButton("해제", "#F3F4F6", "#D1D5DB", "#374151", null, margin: false)); return actions;