AX Agent 상태 스트립과 작업 요약 팝업 밀도 추가 정리
Some checks failed
Release Gate / gate (push) Has been cancelled

- Cowork/Code 보조 상태 스트립의 폰트, 패딩, 간격을 더 줄여 본문 우선 시각 흐름에 맞춤

- 작업 요약 팝업 헤더/필터/최근 실행/훅/백그라운드 카드와 액션 버튼 규격을 축소

- README와 DEVELOPMENT 문서에 2026-04-05 17:27 (KST) 기준 이력 반영

- 검증: 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 14:52:21 +09:00
parent 3b223dc7dc
commit d575139a6f
4 changed files with 109 additions and 96 deletions

View File

@@ -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)의 작업 요약 팝업도 제목/설명/최근 실행 카드 밀도를 낮추고 최근 실행 목록을 2개만 보여 주도록 줄였습니다. 이제 상태 UI는 더 보조적인 레이어로 남고, 메시지 본문이 먼저 읽히는 쪽으로 가까워졌습니다.
- 이어서 작업 요약 내부 카드도 더 가볍게 줄였습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 `CreateTaskSummaryActionButton(...)`을 더 작은 버튼 규격으로 낮추고, 권한/훅/백그라운드 카드의 패딩과 마진도 한 단계 축소했습니다. - 이어서 작업 요약 내부 카드도 더 가볍게 줄였습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 `CreateTaskSummaryActionButton(...)`을 더 작은 버튼 규격으로 낮추고, 권한/훅/백그라운드 카드의 패딩과 마진도 한 단계 축소했습니다.
- 최근 권한 이력은 2개, 최근 훅은 3개, 최근 백그라운드 작업은 2개까지만 보여 주도록 줄여, 작업 요약 팝업이 긴 상태 대시보드처럼 커지지 않게 정리했습니다. - 최근 권한 이력은 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` 기반의 작은 배지형으로 바꿨습니다. - 좌측 패널과 하단 바도 `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`는 일반 로그에서는 빠른 액션이 붙은 카드형 대신 파일명 한 줄만 약하게 표시하도록 바꿨습니다. - 실행 로그 배너도 본문 침범을 더 줄였습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddAgentEventBanner(...)` 에서 debug 전용 `ToolInput` 카드 길이를 더 짧게 줄였고, `FilePath`는 일반 로그에서는 빠른 액션이 붙은 카드형 대신 파일명 한 줄만 약하게 표시하도록 바꿨습니다.

View File

@@ -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를 써서 응답 마감을 처리합니다. - 엔진 쪽은 [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\` - 검증 예정: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\`
- 업데이트: 2026-04-05 16:33 (KST) - 업데이트: 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)

View File

@@ -872,31 +872,31 @@
KeyDown="ChatTitleEdit_KeyDown"/> KeyDown="ChatTitleEdit_KeyDown"/>
</Grid> </Grid>
<Border x:Name="ConversationStatusStrip" Visibility="Collapsed" <Border x:Name="ConversationStatusStrip" Visibility="Collapsed"
Margin="8,0,0,0" Padding="5,1.5" Margin="7,0,0,0" Padding="4,1"
CornerRadius="6" CornerRadius="5"
Background="{DynamicResource HintBackground}" Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1"> BorderBrush="{DynamicResource BorderColor}" BorderThickness="1">
<TextBlock x:Name="ConversationStatusStripLabel" Text="" <TextBlock x:Name="ConversationStatusStripLabel" Text=""
FontSize="9" FontWeight="SemiBold" FontSize="8.5" FontWeight="SemiBold"
Foreground="{DynamicResource AccentColor}" Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</Border> </Border>
</StackPanel> </StackPanel>
<WrapPanel x:Name="ConversationQuickStrip" Visibility="Collapsed" <WrapPanel x:Name="ConversationQuickStrip" Visibility="Collapsed"
Margin="0,2,0,0"> Margin="0,1,0,0">
<Button x:Name="BtnQuickRunningFilter" Style="{StaticResource GhostBtn}" <Button x:Name="BtnQuickRunningFilter" Style="{StaticResource GhostBtn}"
Padding="6,1.5" Margin="0,0,4,0" Padding="5,1" Margin="0,0,3,0"
Click="BtnQuickRunningFilter_Click" Click="BtnQuickRunningFilter_Click"
Visibility="Collapsed" Visibility="Collapsed"
IsEnabled="False"> IsEnabled="False">
<TextBlock x:Name="QuickRunningLabel" Text="진행" <TextBlock x:Name="QuickRunningLabel" Text="진행"
FontSize="9" FontWeight="SemiBold"/> FontSize="8.5" FontWeight="SemiBold"/>
</Button> </Button>
<Button x:Name="BtnQuickHotSort" Style="{StaticResource GhostBtn}" <Button x:Name="BtnQuickHotSort" Style="{StaticResource GhostBtn}"
Padding="7,1.5" Padding="5.5,1"
Click="BtnQuickHotSort_Click"> Click="BtnQuickHotSort_Click">
<TextBlock x:Name="QuickHotLabel" Text="활동" <TextBlock x:Name="QuickHotLabel" Text="활동"
FontSize="9.5" FontWeight="SemiBold"/> FontSize="8.75" FontWeight="SemiBold"/>
</Button> </Button>
</WrapPanel> </WrapPanel>
</StackPanel> </StackPanel>
@@ -921,7 +921,7 @@
<Border x:Name="AgentProgressBar" Grid.Row="2" Visibility="Collapsed" <Border x:Name="AgentProgressBar" Grid.Row="2" Visibility="Collapsed"
Background="{DynamicResource HintBackground}" Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,0,0,1" BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,0,0,1"
Padding="10,2,10,2"> Padding="8,1.5,8,1.5">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
@@ -2310,68 +2310,68 @@
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
VerticalAlignment="Center"> VerticalAlignment="Center">
<Border x:Name="RuntimeActivityBadge" Visibility="Collapsed" <Border x:Name="RuntimeActivityBadge" Visibility="Collapsed"
CornerRadius="4" Padding="4,1.5" Margin="0,0,6,0" CornerRadius="4" Padding="3.5,1" Margin="0,0,5,0"
Background="{DynamicResource HintBackground}" ToolTip="현재 실행 중인 작업" Background="{DynamicResource HintBackground}" ToolTip="현재 실행 중인 작업"
Cursor="Hand" Cursor="Hand"
MouseLeftButtonUp="RuntimeTaskSummary_Click"> MouseLeftButtonUp="RuntimeTaskSummary_Click">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE945;" FontFamily="Segoe MDL2 Assets" FontSize="9" <TextBlock Text="&#xE945;" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,3,0"/> Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,2.5,0"/>
<TextBlock x:Name="RuntimeActivityLabel" Text="실행 중 0" <TextBlock x:Name="RuntimeActivityLabel" Text="실행 중 0"
FontSize="9.5" Foreground="{DynamicResource AccentColor}" FontSize="8.75" Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Border> </Border>
<TextBlock x:Name="LastCompletedLabel" Text="" <TextBlock x:Name="LastCompletedLabel" Text=""
FontSize="9.5" FontSize="8.75"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,6,0" VerticalAlignment="Center" Margin="0,0,5,0"
MaxWidth="180" TextTrimming="CharacterEllipsis" MaxWidth="160" TextTrimming="CharacterEllipsis"
Visibility="Collapsed" Visibility="Collapsed"
Cursor="Hand" Cursor="Hand"
MouseLeftButtonUp="RuntimeTaskSummary_Click"/> MouseLeftButtonUp="RuntimeTaskSummary_Click"/>
<Button x:Name="BtnToggleExecutionLog" Style="{StaticResource GhostBtn}" <Button x:Name="BtnToggleExecutionLog" Style="{StaticResource GhostBtn}"
Padding="5,1.5" Margin="0,0,6,0" Padding="4.5,1" Margin="0,0,5,0"
Click="BtnToggleExecutionLog_Click" Click="BtnToggleExecutionLog_Click"
ToolTip="실행 로그 표시/숨기기"> ToolTip="실행 로그 표시/숨기기">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock x:Name="ExecutionLogIcon" Text="&#xE7C1;" <TextBlock x:Name="ExecutionLogIcon" Text="&#xE7C1;"
FontFamily="Segoe MDL2 Assets" FontSize="9" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,3,0"/> VerticalAlignment="Center" Margin="0,0,2.5,0"/>
<TextBlock x:Name="ExecutionLogLabel" Text="실행 로그 0" <TextBlock x:Name="ExecutionLogLabel" Text="실행 로그 0"
FontSize="9.5" FontSize="8.75"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
<Border x:Name="SubAgentIndicator" Visibility="Collapsed" <Border x:Name="SubAgentIndicator" Visibility="Collapsed"
CornerRadius="4" Padding="4,1.5" Margin="0,0,6,0" CornerRadius="4" Padding="3.5,1" Margin="0,0,5,0"
Background="{DynamicResource HintBackground}" ToolTip="실행 중인 서브에이전트"> Background="{DynamicResource HintBackground}" ToolTip="실행 중인 서브에이전트">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE945;" FontFamily="Segoe MDL2 Assets" FontSize="9" <TextBlock Text="&#xE945;" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,3,0"/> Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,2.5,0"/>
<TextBlock x:Name="SubAgentIndicatorLabel" Text="서브에이전트 0" <TextBlock x:Name="SubAgentIndicatorLabel" Text="서브에이전트 0"
FontSize="9.5" Foreground="{DynamicResource AccentColor}" FontSize="8.75" Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Border> </Border>
<!-- 워크플로우 분석기 열기 버튼 (개발자 모드) --> <!-- 워크플로우 분석기 열기 버튼 (개발자 모드) -->
<Border x:Name="BtnShowAnalyzer" Visibility="Collapsed" <Border x:Name="BtnShowAnalyzer" Visibility="Collapsed"
CornerRadius="4" Padding="4,1.5" Margin="0,0,6,0" CornerRadius="4" Padding="3.5,1" Margin="0,0,5,0"
Background="{DynamicResource HintBackground}" Cursor="Hand" ToolTip="워크플로우 분석기" Background="{DynamicResource HintBackground}" Cursor="Hand" ToolTip="워크플로우 분석기"
MouseLeftButtonUp="BtnShowAnalyzer_Click"> MouseLeftButtonUp="BtnShowAnalyzer_Click">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE9D9;" FontFamily="Segoe MDL2 Assets" FontSize="9" <TextBlock Text="&#xE9D9;" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,3,0"/> Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center" Margin="0,0,2.5,0"/>
<TextBlock Text="분석기" FontSize="9.5" Foreground="{DynamicResource AccentColor}" <TextBlock Text="분석기" FontSize="8.75" Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Border> </Border>
<TextBlock x:Name="StatusElapsed" Text="" FontSize="9.5" <TextBlock x:Name="StatusElapsed" Text="" FontSize="8.75"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,8,0"/> VerticalAlignment="Center" Margin="0,0,6,0"/>
<TextBlock x:Name="StatusTokens" Text="" FontSize="9.5" <TextBlock x:Name="StatusTokens" Text="" FontSize="8.75"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>

View File

@@ -20106,21 +20106,21 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
panel.Children.Add(new TextBlock panel.Children.Add(new TextBlock
{ {
Text = "작업 요약", Text = "작업 요약",
FontSize = 11.5, FontSize = 11,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = primaryText, Foreground = primaryText,
Margin = new Thickness(10, 6, 10, 3), Margin = new Thickness(8, 5, 8, 2),
}); });
panel.Children.Add(new TextBlock panel.Children.Add(new TextBlock
{ {
Text = "현재 실행/권한/작업 흐름", Text = "현재 실행/권한/작업 흐름",
FontSize = 9.5, FontSize = 8.75,
Foreground = secondaryText, Foreground = secondaryText,
Margin = new Thickness(10, 0, 10, 4), Margin = new Thickness(8, 0, 8, 3),
}); });
var taskFilterRow = new WrapPanel 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("all", "전체"));
taskFilterRow.Children.Add(CreateTaskSummaryFilterChip("permission", "권한")); taskFilterRow.Children.Add(CreateTaskSummaryFilterChip("permission", "권한"));
@@ -20139,13 +20139,13 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
var currentRun = new Border var currentRun = new Border
{ {
Background = BrushFromHex("#F8FAFC"), Background = BrushFromHex("#F8FAFC"),
BorderBrush = BrushFromHex("#E2E8F0"), BorderBrush = BrushFromHex("#E2E8F0"),
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, 0, 8, 8), Margin = new Thickness(6, 0, 6, 6),
Child = new StackPanel Child = new StackPanel
{ {
Children = Children =
{ {
new TextBlock new TextBlock
@@ -20155,20 +20155,22 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
Foreground = primaryText, Foreground = primaryText,
}, },
new TextBlock new TextBlock
{ {
Text = $"{GetRunStatusLabel(_appState.AgentRun.Status)} · iteration {_appState.AgentRun.LastIteration}", Text = $"{GetRunStatusLabel(_appState.AgentRun.Status)} · iteration {_appState.AgentRun.LastIteration}",
Margin = new Thickness(0, 3, 0, 0), Margin = new Thickness(0, 2, 0, 0),
Foreground = GetRunStatusBrush(_appState.AgentRun.Status), Foreground = GetRunStatusBrush(_appState.AgentRun.Status),
}, FontSize = 9.5,
new TextBlock },
{ new TextBlock
Text = string.IsNullOrWhiteSpace(_appState.AgentRun.Summary) ? "요약 없음" : _appState.AgentRun.Summary, {
Margin = new Thickness(0, 4, 0, 0), Text = string.IsNullOrWhiteSpace(_appState.AgentRun.Summary) ? "요약 없음" : _appState.AgentRun.Summary,
TextWrapping = TextWrapping.Wrap, Margin = new Thickness(0, 3, 0, 0),
Foreground = Brushes.DimGray, TextWrapping = TextWrapping.Wrap,
Foreground = Brushes.DimGray,
FontSize = 9.5,
}
} }
} }
}
}; };
panel.Children.Add(currentRun); panel.Children.Add(currentRun);
} }
@@ -20184,9 +20186,9 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
Background = BrushFromHex("#FEF2F2"), Background = BrushFromHex("#FEF2F2"),
BorderBrush = BrushFromHex("#FECACA"), BorderBrush = BrushFromHex("#FECACA"),
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, 0, 8, 8), Margin = new Thickness(6, 0, 6, 6),
Child = new StackPanel Child = new StackPanel
{ {
Children = 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}", Text = $"{latestFailedRun.UpdatedAt:HH:mm:ss} · iteration {latestFailedRun.LastIteration}",
Margin = new Thickness(0, 2, 0, 0), Margin = new Thickness(0, 2, 0, 0),
Foreground = BrushFromHex("#B45309"), Foreground = BrushFromHex("#B45309"),
FontSize = 9.25,
}, },
new TextBlock new TextBlock
{ {
Text = string.IsNullOrWhiteSpace(latestFailedRun.Summary) ? "요약 없음" : latestFailedRun.Summary, Text = string.IsNullOrWhiteSpace(latestFailedRun.Summary) ? "요약 없음" : latestFailedRun.Summary,
Margin = new Thickness(0, 4, 0, 0), Margin = new Thickness(0, 3, 0, 0),
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
Foreground = secondaryText, 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 panel.Children.Add(new TextBlock
{ {
Text = "최근 에이전트 실행", Text = "최근 에이전트 실행",
FontSize = 10.5, FontSize = 10,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = Brushes.DimGray, Foreground = Brushes.DimGray,
Margin = new Thickness(10, 0, 10, 3), Margin = new Thickness(8, 0, 8, 2),
}); });
foreach (var run in recentAgentRuns) foreach (var run in recentAgentRuns)
@@ -20244,6 +20248,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
Text = runDisplay.MetaText, Text = runDisplay.MetaText,
Margin = new Thickness(0, 2, 0, 0), Margin = new Thickness(0, 2, 0, 0),
Foreground = secondaryText, Foreground = secondaryText,
FontSize = 9.25,
}, },
new TextBlock new TextBlock
{ {
@@ -20251,6 +20256,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
Margin = new Thickness(0, 2, 0, 0), Margin = new Thickness(0, 2, 0, 0),
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
Foreground = secondaryText, 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 activitySummary.Children.Add(new TextBlock
{ {
Text = $"실행 로그 {runEvents.Count} · 관련 파일 {runFilePaths.Count}", Text = $"실행 로그 {runEvents.Count} · 관련 파일 {runFilePaths.Count}",
FontSize = 9.5, FontSize = 8.75,
Foreground = secondaryText, Foreground = secondaryText,
}); });
@@ -20285,8 +20291,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
BorderBrush = BrushFromHex("#E2E8F0"), BorderBrush = BrushFromHex("#E2E8F0"),
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8), CornerRadius = new CornerRadius(8),
Padding = new Thickness(8, 6, 8, 6), Padding = new Thickness(7, 5, 7, 5),
Margin = new Thickness(0, 8, 0, 0), Margin = new Thickness(0, 6, 0, 0),
Child = activitySummary Child = activitySummary
}); });
} }
@@ -20327,9 +20333,9 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
Background = Brushes.White, Background = Brushes.White,
BorderBrush = BrushFromHex("#E5E7EB"), BorderBrush = BrushFromHex("#E5E7EB"),
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(9), CornerRadius = new CornerRadius(8),
Padding = new Thickness(9, 6, 9, 6), Padding = new Thickness(8, 5, 8, 5),
Margin = new Thickness(8, 0, 8, 6), Margin = new Thickness(6, 0, 6, 5),
Child = runCardStack Child = runCardStack
}); });
} }
@@ -20340,7 +20346,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
var actionsPanel = new StackPanel var actionsPanel = new StackPanel
{ {
Orientation = Orientation.Horizontal, Orientation = Orientation.Horizontal,
Margin = new Thickness(8, 2, 8, 8), Margin = new Thickness(6, 1, 6, 6),
}; };
var retryButton = CreateTaskSummaryActionButton( var retryButton = CreateTaskSummaryActionButton(
@@ -21269,10 +21275,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 = 9.5, FontSize = 8.75,
MinHeight = 24, MinHeight = 22,
Padding = new Thickness(8, 3, 8, 3), Padding = new Thickness(7, 2.5, 7, 2.5),
Margin = trailingMargin ? new Thickness(0, 0, 5, 0) : new Thickness(0), Margin = trailingMargin ? new Thickness(0, 0, 4, 0) : new Thickness(0),
Background = BrushFromHex(bg), Background = BrushFromHex(bg),
BorderBrush = BrushFromHex(border), BorderBrush = BrushFromHex(border),
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
@@ -21290,7 +21296,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
{ {
var actions = new WrapPanel var actions = new WrapPanel
{ {
Margin = new Thickness(0, 8, 0, 0), Margin = new Thickness(0, 6, 0, 0),
}; };
var primaryButton = CreateTaskSummaryActionButton( var primaryButton = CreateTaskSummaryActionButton(
@@ -21316,7 +21322,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
{ {
var actions = new WrapPanel 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) 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", Text = "\uE756",
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 11, FontSize = 10,
Foreground = hook.Success ? BrushFromHex("#334155") : BrushFromHex("#991B1B"), Foreground = hook.Success ? BrushFromHex("#334155") : BrushFromHex("#991B1B"),
Margin = new Thickness(0, 0, 6, 0), Margin = new Thickness(0, 0, 5, 0),
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
}, },
new TextBlock new TextBlock
{ {
Text = "훅 이벤트", Text = "훅 이벤트",
FontSize = 11, FontSize = 10,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = hook.Success ? BrushFromHex("#334155") : BrushFromHex("#991B1B"), 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 hookCardStack.Children.Add(new TextBlock
{ {
Text = _appState.FormatHookEventLine(hook), Text = _appState.FormatHookEventLine(hook),
FontSize = 10.5, FontSize = 9.5,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
Foreground = hook.Success ? secondaryText : BrushFromHex("#991B1B"), Foreground = hook.Success ? secondaryText : BrushFromHex("#991B1B"),
}); });
var hookActionRow = new WrapPanel var hookActionRow = new WrapPanel
{ {
Margin = new Thickness(0, 8, 0, 0), Margin = new Thickness(0, 6, 0, 0),
}; };
var hookFilterButton = CreateTaskSummaryActionButton( 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"), BorderBrush = hook.Success ? BrushFromHex("#E2E8F0") : BrushFromHex("#FECACA"),
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8), CornerRadius = new CornerRadius(8),
Padding = new Thickness(9, 6, 9, 6), Padding = new Thickness(8, 5, 8, 5),
Margin = new Thickness(8, 0, 8, 5), Margin = new Thickness(6, 0, 6, 4),
Child = hookCardStack Child = hookCardStack
}; };
} }
@@ -21436,15 +21442,15 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
{ {
Text = "\uE9F9", Text = "\uE9F9",
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 11, FontSize = 10,
Foreground = BrushFromHex("#1D4ED8"), Foreground = BrushFromHex("#1D4ED8"),
Margin = new Thickness(0, 0, 6, 0), Margin = new Thickness(0, 0, 5, 0),
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
}, },
new TextBlock new TextBlock
{ {
Text = $"실행 중인 백그라운드 작업 {activeBackgroundCount}개", Text = $"실행 중인 백그라운드 작업 {activeBackgroundCount}개",
FontSize = 11, FontSize = 10,
Foreground = BrushFromHex("#1D4ED8"), Foreground = BrushFromHex("#1D4ED8"),
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
} }
@@ -21456,8 +21462,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
activeBackgroundStack.Children.Add(new TextBlock activeBackgroundStack.Children.Add(new TextBlock
{ {
Text = $"· {job.Title} · {TruncateForStatus(job.Summary, 52)}", Text = $"· {job.Title} · {TruncateForStatus(job.Summary, 52)}",
Margin = new Thickness(0, 4, 0, 0), Margin = new Thickness(0, 3, 0, 0),
FontSize = 10.5, FontSize = 9.5,
Foreground = secondaryText, Foreground = secondaryText,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
}); });
@@ -21465,7 +21471,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
var activeActionRow = new WrapPanel var activeActionRow = new WrapPanel
{ {
Margin = new Thickness(0, 8, 0, 0), Margin = new Thickness(0, 6, 0, 0),
}; };
var runningFilterButton = CreateTaskSummaryActionButton( var runningFilterButton = CreateTaskSummaryActionButton(
@@ -21492,8 +21498,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
BorderBrush = BrushFromHex("#BFDBFE"), BorderBrush = BrushFromHex("#BFDBFE"),
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8), CornerRadius = new CornerRadius(8),
Padding = new Thickness(9, 6, 9, 6), Padding = new Thickness(8, 5, 8, 5),
Margin = new Thickness(8, 0, 8, 6), Margin = new Thickness(6, 0, 6, 5),
Child = activeBackgroundStack Child = activeBackgroundStack
}; };
} }
@@ -21513,15 +21519,15 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
{ {
Text = "\uE823", Text = "\uE823",
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 11, FontSize = 10,
Foreground = isFailed ? BrushFromHex("#991B1B") : BrushFromHex("#334155"), Foreground = isFailed ? BrushFromHex("#991B1B") : BrushFromHex("#334155"),
Margin = new Thickness(0, 0, 6, 0), Margin = new Thickness(0, 0, 5, 0),
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
}, },
new TextBlock new TextBlock
{ {
Text = $"{job.Title} · {GetTaskStatusLabel(job.Status)}", Text = $"{job.Title} · {GetTaskStatusLabel(job.Status)}",
FontSize = 11, FontSize = 10,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = isFailed ? BrushFromHex("#991B1B") : BrushFromHex("#334155"), 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 jobCardStack.Children.Add(new TextBlock
{ {
Text = $"{job.UpdatedAt:HH:mm:ss} · {TruncateForStatus(job.Summary, 72)}", Text = $"{job.UpdatedAt:HH:mm:ss} · {TruncateForStatus(job.Summary, 72)}",
FontSize = 10.5, FontSize = 9.5,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
Foreground = isFailed Foreground = isFailed
? BrushFromHex("#991B1B") ? BrushFromHex("#991B1B")
@@ -21539,7 +21545,7 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
var jobActionRow = new WrapPanel var jobActionRow = new WrapPanel
{ {
Margin = new Thickness(0, 8, 0, 0), Margin = new Thickness(0, 6, 0, 0),
}; };
var focusButton = CreateTaskSummaryActionButton( var focusButton = CreateTaskSummaryActionButton(
@@ -21590,8 +21596,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
: BrushFromHex("#E2E8F0"), : BrushFromHex("#E2E8F0"),
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8), CornerRadius = new CornerRadius(8),
Padding = new Thickness(9, 6, 9, 6), Padding = new Thickness(8, 5, 8, 5),
Margin = new Thickness(8, 0, 8, 5), Margin = new Thickness(6, 0, 6, 4),
Child = jobCardStack Child = jobCardStack
}; };
} }