AX Agent 타임라인 기본 노출 축소 및 계획/작업 카드 경량화
Some checks failed
Release Gate / gate (push) Has been cancelled

- 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
This commit is contained in:
2026-04-05 16:15:31 +09:00
parent abd6928e4a
commit 51ff046e1a
3 changed files with 50 additions and 39 deletions

View File

@@ -873,6 +873,12 @@ ow + toggle 시각 언어로 통일했습니다.
- 현재 `claw-code` 대비 추정 진척율은 핵심 엔진 `88%`, 채팅 메인 UI `95%`, Cowork/Code 상태 UX `91%`, 내부 설정 연결 `88%`, 전체 AX Agent `93%` 정도입니다. - 현재 `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 - 검증: `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) - 업데이트: 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)
--- ---

View File

@@ -4633,3 +4633,9 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
- 현재 `claw-code` 대비 추정 진척율은 핵심 엔진 `88%`, 채팅 메인 UI `95%`, Cowork/Code 상태 UX `91%`, 내부 설정 연결 `88%`, 전체 AX Agent `93%` 정도로 봅니다. - 현재 `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 - 검증: `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) - 업데이트: 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)

View File

@@ -9411,7 +9411,6 @@ public partial class ChatWindow : Window
var steps = evt.Steps!; var steps = evt.Steps!;
var primaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.Black; var primaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.Black;
var secondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.DimGray; 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 hintBg = TryFindResource("HintBackground") as Brush ?? BrushFromHex("#F8FAFC");
var borderBrush = TryFindResource("BorderColor") as Brush ?? BrushFromHex("#E2E8F0"); var borderBrush = TryFindResource("BorderColor") as Brush ?? BrushFromHex("#E2E8F0");
var accentBrush = TryFindResource("AccentColor") as Brush ?? BrushFromHex("#4B5EFC"); var accentBrush = TryFindResource("AccentColor") as Brush ?? BrushFromHex("#4B5EFC");
@@ -9421,9 +9420,9 @@ public partial class ChatWindow : Window
Background = hintBg, Background = hintBg,
BorderBrush = borderBrush, BorderBrush = borderBrush,
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(10), CornerRadius = new CornerRadius(8),
Padding = new Thickness(10, 8, 10, 8), Padding = new Thickness(8, 6, 8, 6),
Margin = new Thickness(8, 3, 228, 6), Margin = new Thickness(8, 2, 248, 5),
HorizontalAlignment = HorizontalAlignment.Left, HorizontalAlignment = HorizontalAlignment.Left,
MaxWidth = GetMessageMaxWidth(), MaxWidth = GetMessageMaxWidth(),
}; };
@@ -9436,17 +9435,17 @@ public partial class ChatWindow : Window
{ {
Text = "\uE9D5", // plan icon Text = "\uE9D5", // plan icon
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 9, FontSize = 8,
Foreground = accentBrush, Foreground = accentBrush,
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center
Margin = new Thickness(0, 0, 4, 0),
}); });
header.Children.Add(new TextBlock header.Children.Add(new TextBlock
{ {
Text = $"작업 {steps.Count}개 · 0 완료", Text = $"계획 {steps.Count}단계",
FontSize = 9.5, FontWeight = FontWeights.SemiBold, FontSize = 9, FontWeight = FontWeights.SemiBold,
Foreground = secondaryText, Foreground = secondaryText,
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
Margin = new Thickness(4, 0, 0, 0),
}); });
sp.Children.Add(header); sp.Children.Add(header);
@@ -9473,7 +9472,7 @@ public partial class ChatWindow : Window
_planProgressText = new TextBlock _planProgressText = new TextBlock
{ {
Text = "0%", Text = "0%",
FontSize = 8.5, FontWeight = FontWeights.SemiBold, FontSize = 8, FontWeight = FontWeights.SemiBold,
Foreground = secondaryText, Foreground = secondaryText,
Margin = new Thickness(5, 0, 0, 0), Margin = new Thickness(5, 0, 0, 0),
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
@@ -9496,7 +9495,7 @@ public partial class ChatWindow : Window
stepRow.Children.Add(new TextBlock stepRow.Children.Add(new TextBlock
{ {
Text = "○", // 빈 원 (미완료) Text = "○", // 빈 원 (미완료)
FontSize = 9, FontSize = 8.5,
Foreground = secondaryText, Foreground = secondaryText,
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
Margin = new Thickness(0, 0, 4, 0), Margin = new Thickness(0, 0, 4, 0),
@@ -9505,10 +9504,10 @@ public partial class ChatWindow : Window
stepRow.Children.Add(new TextBlock stepRow.Children.Add(new TextBlock
{ {
Text = $"{i + 1}. {steps[i]}", Text = $"{i + 1}. {steps[i]}",
FontSize = 9.5, FontSize = 8.75,
Foreground = primaryText, Foreground = primaryText,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
MaxWidth = Math.Max(320, GetMessageMaxWidth() - 52), MaxWidth = Math.Max(280, GetMessageMaxWidth() - 68),
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
}); });
@@ -10397,8 +10396,9 @@ public partial class ChatWindow : Window
&& evt.Type is AgentEventType.Paused or AgentEventType.Resumed) && evt.Type is AgentEventType.Paused or AgentEventType.Resumed)
return; return;
// simple 모드: ToolCall은 건너뜀 (ToolResult만 한 줄로 표시) // 기본 로그에서는 중간 ToolCall을 숨겨 결과/오류 중심으로 정리합니다.
if (logLevel == "simple" && evt.Type == AgentEventType.ToolCall) if (!string.Equals(logLevel, "debug", StringComparison.OrdinalIgnoreCase)
&& evt.Type == AgentEventType.ToolCall)
return; return;
// 전체 통계 이벤트는 별도 색상 (보라색 계열) // 전체 통계 이벤트는 별도 색상 (보라색 계열)
@@ -10437,7 +10437,7 @@ public partial class ChatWindow : Window
BorderThickness = new Thickness(0), BorderThickness = new Thickness(0),
CornerRadius = new CornerRadius(0), CornerRadius = new CornerRadius(0),
Padding = new Thickness(0), Padding = new Thickness(0),
Margin = new Thickness(12, 1, 12, 1), Margin = new Thickness(12, 0, 12, 1),
HorizontalAlignment = HorizontalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Stretch,
}; };
if (!string.IsNullOrWhiteSpace(evt.RunId)) if (!string.IsNullOrWhiteSpace(evt.RunId))
@@ -10456,7 +10456,7 @@ public partial class ChatWindow : Window
{ {
Text = icon, Text = icon,
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 8.75, FontSize = 8.25,
Foreground = accentBrush, Foreground = accentBrush,
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
Margin = new Thickness(0, 0, 3, 0), Margin = new Thickness(0, 0, 3, 0),
@@ -10464,7 +10464,7 @@ public partial class ChatWindow : Window
headerLeft.Children.Add(new TextBlock headerLeft.Children.Add(new TextBlock
{ {
Text = label, Text = label,
FontSize = 8.75, FontSize = 8.25,
FontWeight = FontWeights.Medium, FontWeight = FontWeights.Medium,
Foreground = secondaryText, Foreground = secondaryText,
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
@@ -10478,7 +10478,7 @@ public partial class ChatWindow : Window
headerRight.Children.Add(new TextBlock headerRight.Children.Add(new TextBlock
{ {
Text = evt.ElapsedMs < 1000 ? $"{evt.ElapsedMs}ms" : $"{evt.ElapsedMs / 1000.0:F1}s", Text = evt.ElapsedMs < 1000 ? $"{evt.ElapsedMs}ms" : $"{evt.ElapsedMs / 1000.0:F1}s",
FontSize = 8, FontSize = 7.5,
Foreground = secondaryText, Foreground = secondaryText,
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
Margin = new Thickness(3, 0, 0, 0), Margin = new Thickness(3, 0, 0, 0),
@@ -10501,7 +10501,7 @@ public partial class ChatWindow : Window
Child = new TextBlock Child = new TextBlock
{ {
Text = tokenText, Text = tokenText,
FontSize = 7.5, FontSize = 7.25,
Foreground = secondaryText, Foreground = secondaryText,
FontFamily = new FontFamily("Consolas"), FontFamily = new FontFamily("Consolas"),
}, },
@@ -10528,25 +10528,25 @@ public partial class ChatWindow : Window
sp.Children.Add(new TextBlock sp.Children.Add(new TextBlock
{ {
Text = shortSummary, Text = shortSummary,
FontSize = 8.9, FontSize = 8.4,
Foreground = secondaryText, Foreground = secondaryText,
TextWrapping = TextWrapping.NoWrap, TextWrapping = TextWrapping.NoWrap,
TextTrimming = TextTrimming.CharacterEllipsis, TextTrimming = TextTrimming.CharacterEllipsis,
Margin = new Thickness(12, 1, 0, 0), Margin = new Thickness(11, 1, 0, 0),
}); });
} }
} }
// detailed/debug 모드: 실행 줄 아래에 얕은 설명만 표시 // detailed/debug 모드: 실행 줄 아래에 얕은 설명만 표시
else if (!string.IsNullOrEmpty(evt.Summary)) 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 sp.Children.Add(new TextBlock
{ {
Text = summaryText, Text = summaryText,
FontSize = 8.9, FontSize = 8.4,
Foreground = secondaryText, Foreground = secondaryText,
TextWrapping = TextWrapping.Wrap, 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, Text = kindIcon,
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 11, FontSize = 9.5,
Foreground = kindColor, Foreground = kindColor,
Margin = new Thickness(0, 0, 6, 0), Margin = new Thickness(0, 0, 4, 0),
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
}); });
headerRow.Children.Add(new TextBlock headerRow.Children.Add(new TextBlock
@@ -21164,7 +21164,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
Text = active Text = active
? $"진행 중 · {task.Title}" ? $"진행 중 · {task.Title}"
: $"{GetTaskStatusLabel(task.Status)} · {task.Title}", : $"{GetTaskStatusLabel(task.Status)} · {task.Title}",
FontSize = 11, FontSize = 9.5,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = active ? primaryText : secondaryText, Foreground = active ? primaryText : secondaryText,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
@@ -21175,8 +21175,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
{ {
taskStack.Children.Add(new TextBlock taskStack.Children.Add(new TextBlock
{ {
Text = task.Summary, Text = TruncateForStatus(task.Summary, 96),
FontSize = 10.5, FontSize = 8.75,
Foreground = secondaryText, Foreground = secondaryText,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
}); });
@@ -21196,12 +21196,12 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
return new Border return new Border
{ {
Background = active ? BrushFromHex("#F8FAFC") : Brushes.White, Background = active ? BrushFromHex("#F8FAFC") : (TryFindResource("LauncherBackground") as Brush ?? Brushes.White),
BorderBrush = BrushFromHex("#E5E7EB"), BorderBrush = BrushFromHex("#E5E7EB"),
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8), CornerRadius = new CornerRadius(7),
Padding = new Thickness(10, 7, 10, 7), Padding = new Thickness(8, 5, 8, 5),
Margin = new Thickness(8, 0, 8, 6), Margin = new Thickness(8, 0, 8, 4),
Child = taskStack Child = taskStack
}; };
} }
@@ -21217,10 +21217,10 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
var button = new Button var button = new Button
{ {
Content = label, Content = label,
FontSize = 8.75, FontSize = 8.25,
MinHeight = 22, MinHeight = 20,
Padding = new Thickness(7, 2.5, 7, 2.5), Padding = new Thickness(6, 2, 6, 2),
Margin = trailingMargin ? new Thickness(0, 0, 4, 0) : new Thickness(0), Margin = trailingMargin ? new Thickness(0, 0, 3, 0) : new Thickness(0),
Background = BrushFromHex(bg), Background = BrushFromHex(bg),
BorderBrush = BrushFromHex(border), BorderBrush = BrushFromHex(border),
BorderThickness = new Thickness(1), 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("권한 요청", "#EFF6FF", "#BFDBFE", "#1D4ED8", PermissionModeCatalog.Default));
actions.Children.Add(BuildPermissionButton("편집 자동 승인", "#ECFDF5", "#BBF7D0", "#166534", PermissionModeCatalog.AcceptEdits)); 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("권한 건너뛰기", "#FFF7ED", "#FDBA74", "#C2410C", PermissionModeCatalog.BypassPermissions));
actions.Children.Add(BuildPermissionButton("해제", "#F3F4F6", "#D1D5DB", "#374151", null, margin: false)); actions.Children.Add(BuildPermissionButton("해제", "#F3F4F6", "#D1D5DB", "#374151", null, margin: false));
return actions; return actions;