diff --git a/README.md b/README.md index a92a53e..f2b6e2f 100644 --- a/README.md +++ b/README.md @@ -815,6 +815,9 @@ ow + toggle 시각 언어로 통일했습니다. - [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 작업 요약 팝업도 제목/설명/최근 실행 카드 밀도를 낮추고 최근 실행 목록을 2개만 보여 주도록 줄였습니다. 이제 상태 UI는 더 보조적인 레이어로 남고, 메시지 본문이 먼저 읽히는 쪽으로 가까워졌습니다. - 이어서 작업 요약 내부 카드도 더 가볍게 줄였습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 `CreateTaskSummaryActionButton(...)`을 더 작은 버튼 규격으로 낮추고, 권한/훅/백그라운드 카드의 패딩과 마진도 한 단계 축소했습니다. - 최근 권한 이력은 2개, 최근 훅은 3개, 최근 백그라운드 작업은 2개까지만 보여 주도록 줄여, 작업 요약 팝업이 긴 상태 대시보드처럼 커지지 않게 정리했습니다. +- 같은 축으로 Cowork/Code 보조 상태 레이어를 한 번 더 눌렀습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 의 `ConversationStatusStrip`, `ConversationQuickStrip`, `AgentProgressBar`, `RuntimeActivityBadge`, `LastCompletedLabel`, `ExecutionLog`, `SubAgentIndicator`, `StatusElapsed`, `StatusTokens`는 패딩·폰트·간격을 추가로 줄여 상시 노출돼도 본문보다 덜 튀도록 정리했습니다. +- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `ShowTaskSummaryPopup()`, `CreateTaskSummaryActionButton(...)`, `BuildHookSummaryCard(...)`, `BuildActiveBackgroundSummaryCard(...)`, `BuildRecentBackgroundJobCard(...)` 도 같은 시각 언어로 다시 줄였습니다. 팝업 헤더/필터/최근 실행 카드/백그라운드 카드/훅 카드의 라운드, 패딩, 마진, 텍스트 크기를 전반적으로 낮춰 작업 요약이 진단용 보조 패널에 더 가깝게 보이게 했습니다. +- 업데이트: 2026-04-05 17:27 (KST) - 좌측 패널과 하단 바도 `claw-code` 쪽 밀도로 다시 맞췄습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서 사이드바 폭을 줄이고, 헤더 앱 배지를 강조색 채운 정사각형 대신 `HintBackground + BorderColor` 기반의 작은 배지형으로 바꿨습니다. - `새 대화`, `검색`, `작업 유형/워크스페이스`, 하단 사용자 영역, 삭제 영역까지 패딩과 폰트, 아이콘 크기를 함께 낮췄고, 하단 상태바는 다이아몬드 아이콘을 작은 원형 점으로 바꿔 더 단순한 상태선처럼 보이게 정리했습니다. - 실행 로그 배너도 본문 침범을 더 줄였습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddAgentEventBanner(...)` 에서 debug 전용 `ToolInput` 카드 길이를 더 짧게 줄였고, `FilePath`는 일반 로그에서는 빠른 액션이 붙은 카드형 대신 파일명 한 줄만 약하게 표시하도록 바꿨습니다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 5879129..e9372fc 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4588,3 +4588,7 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - 엔진 쪽은 [AxAgentExecutionEngine.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AxAgentExecutionEngine.cs)에 `FinalizeExecutionContent(...)` 를 추가해 취소/오류/빈 응답 정규화를 공통 helper로 모았습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 일반 전송과 재생성은 이제 같은 helper를 써서 응답 마감을 처리합니다. - 검증 예정: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` - 업데이트: 2026-04-05 16:33 (KST) +- Cowork/Code 보조 상태 레이어도 한 단계 더 줄였습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml)의 `ConversationStatusStrip`, `ConversationQuickStrip`, `AgentProgressBar`, `RuntimeActivityBadge`, `LastCompletedLabel`, `ExecutionLog`, `SubAgentIndicator`, `StatusElapsed`, `StatusTokens`는 패딩·폰트·간격을 추가로 낮춰 `claw-code`처럼 상시 노출돼도 본문보다 덜 튀는 보조 레이어로 정리했습니다. +- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `ShowTaskSummaryPopup()`, `CreateTaskSummaryActionButton(...)`, `BuildHookSummaryCard(...)`, `BuildActiveBackgroundSummaryCard(...)`, `BuildRecentBackgroundJobCard(...)`는 팝업 헤더, 필터 칩, 최근 실행 카드, 훅/백그라운드 카드의 라운드·패딩·마진·글자 크기를 다시 줄여 작업 요약이 상태 대시보드보다 진단용 팝업에 가깝게 보이도록 맞췄습니다. +- 검증 예정: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` +- 업데이트: 2026-04-05 17:27 (KST) diff --git a/src/AxCopilot/Views/ChatWindow.xaml b/src/AxCopilot/Views/ChatWindow.xaml index f5b084b..f2da0db 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml +++ b/src/AxCopilot/Views/ChatWindow.xaml @@ -872,31 +872,31 @@ KeyDown="ChatTitleEdit_KeyDown"/> + Margin="0,1,0,0"> @@ -921,7 +921,7 @@ + Padding="8,1.5,8,1.5"> @@ -2310,68 +2310,68 @@ - + - + - - + - - + diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index 204e699..a96c9d0 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -20106,21 +20106,21 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi panel.Children.Add(new TextBlock { Text = "작업 요약", - FontSize = 11.5, + FontSize = 11, FontWeight = FontWeights.SemiBold, Foreground = primaryText, - Margin = new Thickness(10, 6, 10, 3), + Margin = new Thickness(8, 5, 8, 2), }); panel.Children.Add(new TextBlock { Text = "현재 실행/권한/작업 흐름", - FontSize = 9.5, + FontSize = 8.75, Foreground = secondaryText, - Margin = new Thickness(10, 0, 10, 4), + Margin = new Thickness(8, 0, 8, 3), }); var taskFilterRow = new WrapPanel { - Margin = new Thickness(8, 0, 8, 8), + Margin = new Thickness(6, 0, 6, 6), }; taskFilterRow.Children.Add(CreateTaskSummaryFilterChip("all", "전체")); taskFilterRow.Children.Add(CreateTaskSummaryFilterChip("permission", "권한")); @@ -20139,13 +20139,13 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi var currentRun = new Border { Background = BrushFromHex("#F8FAFC"), - BorderBrush = BrushFromHex("#E2E8F0"), - BorderThickness = new Thickness(1), - CornerRadius = new CornerRadius(10), - Padding = new Thickness(10, 8, 10, 8), - Margin = new Thickness(8, 0, 8, 8), - Child = new StackPanel - { + BorderBrush = BrushFromHex("#E2E8F0"), + BorderThickness = new Thickness(1), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(8, 6, 8, 6), + Margin = new Thickness(6, 0, 6, 6), + Child = new StackPanel + { Children = { new TextBlock @@ -20155,20 +20155,22 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi Foreground = primaryText, }, new TextBlock - { - Text = $"{GetRunStatusLabel(_appState.AgentRun.Status)} · iteration {_appState.AgentRun.LastIteration}", - Margin = new Thickness(0, 3, 0, 0), - Foreground = GetRunStatusBrush(_appState.AgentRun.Status), - }, - new TextBlock - { - Text = string.IsNullOrWhiteSpace(_appState.AgentRun.Summary) ? "요약 없음" : _appState.AgentRun.Summary, - Margin = new Thickness(0, 4, 0, 0), - TextWrapping = TextWrapping.Wrap, - Foreground = Brushes.DimGray, + { + Text = $"{GetRunStatusLabel(_appState.AgentRun.Status)} · iteration {_appState.AgentRun.LastIteration}", + Margin = new Thickness(0, 2, 0, 0), + Foreground = GetRunStatusBrush(_appState.AgentRun.Status), + FontSize = 9.5, + }, + new TextBlock + { + Text = string.IsNullOrWhiteSpace(_appState.AgentRun.Summary) ? "요약 없음" : _appState.AgentRun.Summary, + Margin = new Thickness(0, 3, 0, 0), + TextWrapping = TextWrapping.Wrap, + Foreground = Brushes.DimGray, + FontSize = 9.5, + } } } - } }; panel.Children.Add(currentRun); } @@ -20184,9 +20186,9 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi Background = BrushFromHex("#FEF2F2"), BorderBrush = BrushFromHex("#FECACA"), BorderThickness = new Thickness(1), - CornerRadius = new CornerRadius(10), - Padding = new Thickness(10, 8, 10, 8), - Margin = new Thickness(8, 0, 8, 8), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(8, 6, 8, 6), + Margin = new Thickness(6, 0, 6, 6), Child = new StackPanel { Children = @@ -20202,13 +20204,15 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi Text = $"{latestFailedRun.UpdatedAt:HH:mm:ss} · iteration {latestFailedRun.LastIteration}", Margin = new Thickness(0, 2, 0, 0), Foreground = BrushFromHex("#B45309"), + FontSize = 9.25, }, new TextBlock { Text = string.IsNullOrWhiteSpace(latestFailedRun.Summary) ? "요약 없음" : latestFailedRun.Summary, - Margin = new Thickness(0, 4, 0, 0), + Margin = new Thickness(0, 3, 0, 0), TextWrapping = TextWrapping.Wrap, Foreground = secondaryText, + FontSize = 9.25, } } } @@ -20218,10 +20222,10 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi panel.Children.Add(new TextBlock { Text = "최근 에이전트 실행", - FontSize = 10.5, + FontSize = 10, FontWeight = FontWeights.SemiBold, Foreground = Brushes.DimGray, - Margin = new Thickness(10, 0, 10, 3), + Margin = new Thickness(8, 0, 8, 2), }); foreach (var run in recentAgentRuns) @@ -20244,6 +20248,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi Text = runDisplay.MetaText, Margin = new Thickness(0, 2, 0, 0), Foreground = secondaryText, + FontSize = 9.25, }, new TextBlock { @@ -20251,6 +20256,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi Margin = new Thickness(0, 2, 0, 0), TextWrapping = TextWrapping.Wrap, Foreground = secondaryText, + FontSize = 9.25, } } }; @@ -20261,7 +20267,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi activitySummary.Children.Add(new TextBlock { Text = $"실행 로그 {runEvents.Count} · 관련 파일 {runFilePaths.Count}", - FontSize = 9.5, + FontSize = 8.75, Foreground = secondaryText, }); @@ -20285,8 +20291,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi BorderBrush = BrushFromHex("#E2E8F0"), BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(8), - Padding = new Thickness(8, 6, 8, 6), - Margin = new Thickness(0, 8, 0, 0), + Padding = new Thickness(7, 5, 7, 5), + Margin = new Thickness(0, 6, 0, 0), Child = activitySummary }); } @@ -20327,9 +20333,9 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi Background = Brushes.White, BorderBrush = BrushFromHex("#E5E7EB"), BorderThickness = new Thickness(1), - CornerRadius = new CornerRadius(9), - Padding = new Thickness(9, 6, 9, 6), - Margin = new Thickness(8, 0, 8, 6), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(8, 5, 8, 5), + Margin = new Thickness(6, 0, 6, 5), Child = runCardStack }); } @@ -20340,7 +20346,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi var actionsPanel = new StackPanel { Orientation = Orientation.Horizontal, - Margin = new Thickness(8, 2, 8, 8), + Margin = new Thickness(6, 1, 6, 6), }; var retryButton = CreateTaskSummaryActionButton( @@ -21269,10 +21275,10 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi var button = new Button { Content = label, - FontSize = 9.5, - MinHeight = 24, - Padding = new Thickness(8, 3, 8, 3), - Margin = trailingMargin ? new Thickness(0, 0, 5, 0) : new Thickness(0), + 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), Background = BrushFromHex(bg), BorderBrush = BrushFromHex(border), BorderThickness = new Thickness(1), @@ -21290,7 +21296,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi { var actions = new WrapPanel { - Margin = new Thickness(0, 8, 0, 0), + Margin = new Thickness(0, 6, 0, 0), }; var primaryButton = CreateTaskSummaryActionButton( @@ -21316,7 +21322,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi { var actions = new WrapPanel { - Margin = new Thickness(0, 8, 0, 0), + Margin = new Thickness(0, 6, 0, 0), }; Button BuildPermissionButton(string label, string bg, string border, string fg, string? mode, bool margin = true) @@ -21352,15 +21358,15 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi { Text = "\uE756", FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 11, + FontSize = 10, Foreground = hook.Success ? BrushFromHex("#334155") : BrushFromHex("#991B1B"), - Margin = new Thickness(0, 0, 6, 0), + Margin = new Thickness(0, 0, 5, 0), VerticalAlignment = VerticalAlignment.Center, }, new TextBlock { Text = "훅 이벤트", - FontSize = 11, + FontSize = 10, FontWeight = FontWeights.SemiBold, Foreground = hook.Success ? BrushFromHex("#334155") : BrushFromHex("#991B1B"), } @@ -21369,14 +21375,14 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi hookCardStack.Children.Add(new TextBlock { Text = _appState.FormatHookEventLine(hook), - FontSize = 10.5, + FontSize = 9.5, TextWrapping = TextWrapping.Wrap, Foreground = hook.Success ? secondaryText : BrushFromHex("#991B1B"), }); var hookActionRow = new WrapPanel { - Margin = new Thickness(0, 8, 0, 0), + Margin = new Thickness(0, 6, 0, 0), }; var hookFilterButton = CreateTaskSummaryActionButton( @@ -21417,8 +21423,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi BorderBrush = hook.Success ? BrushFromHex("#E2E8F0") : BrushFromHex("#FECACA"), BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(8), - Padding = new Thickness(9, 6, 9, 6), - Margin = new Thickness(8, 0, 8, 5), + Padding = new Thickness(8, 5, 8, 5), + Margin = new Thickness(6, 0, 6, 4), Child = hookCardStack }; } @@ -21436,15 +21442,15 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi { Text = "\uE9F9", FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 11, + FontSize = 10, Foreground = BrushFromHex("#1D4ED8"), - Margin = new Thickness(0, 0, 6, 0), + Margin = new Thickness(0, 0, 5, 0), VerticalAlignment = VerticalAlignment.Center, }, new TextBlock { Text = $"실행 중인 백그라운드 작업 {activeBackgroundCount}개", - FontSize = 11, + FontSize = 10, Foreground = BrushFromHex("#1D4ED8"), FontWeight = FontWeights.SemiBold, } @@ -21456,8 +21462,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi activeBackgroundStack.Children.Add(new TextBlock { Text = $"· {job.Title} · {TruncateForStatus(job.Summary, 52)}", - Margin = new Thickness(0, 4, 0, 0), - FontSize = 10.5, + Margin = new Thickness(0, 3, 0, 0), + FontSize = 9.5, Foreground = secondaryText, TextWrapping = TextWrapping.Wrap, }); @@ -21465,7 +21471,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi var activeActionRow = new WrapPanel { - Margin = new Thickness(0, 8, 0, 0), + Margin = new Thickness(0, 6, 0, 0), }; var runningFilterButton = CreateTaskSummaryActionButton( @@ -21492,8 +21498,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi BorderBrush = BrushFromHex("#BFDBFE"), BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(8), - Padding = new Thickness(9, 6, 9, 6), - Margin = new Thickness(8, 0, 8, 6), + Padding = new Thickness(8, 5, 8, 5), + Margin = new Thickness(6, 0, 6, 5), Child = activeBackgroundStack }; } @@ -21513,15 +21519,15 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi { Text = "\uE823", FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 11, + FontSize = 10, Foreground = isFailed ? BrushFromHex("#991B1B") : BrushFromHex("#334155"), - Margin = new Thickness(0, 0, 6, 0), + Margin = new Thickness(0, 0, 5, 0), VerticalAlignment = VerticalAlignment.Center, }, new TextBlock { Text = $"{job.Title} · {GetTaskStatusLabel(job.Status)}", - FontSize = 11, + FontSize = 10, FontWeight = FontWeights.SemiBold, Foreground = isFailed ? BrushFromHex("#991B1B") : BrushFromHex("#334155"), } @@ -21530,7 +21536,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi jobCardStack.Children.Add(new TextBlock { Text = $"{job.UpdatedAt:HH:mm:ss} · {TruncateForStatus(job.Summary, 72)}", - FontSize = 10.5, + FontSize = 9.5, TextWrapping = TextWrapping.Wrap, Foreground = isFailed ? BrushFromHex("#991B1B") @@ -21539,7 +21545,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi var jobActionRow = new WrapPanel { - Margin = new Thickness(0, 8, 0, 0), + Margin = new Thickness(0, 6, 0, 0), }; var focusButton = CreateTaskSummaryActionButton( @@ -21590,8 +21596,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi : BrushFromHex("#E2E8F0"), BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(8), - Padding = new Thickness(9, 6, 9, 6), - Margin = new Thickness(8, 0, 8, 5), + Padding = new Thickness(8, 5, 8, 5), + Margin = new Thickness(6, 0, 6, 4), Child = jobCardStack }; }