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%` 정도입니다.
- 검증: `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)
---

View File

@@ -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)

View File

@@ -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;