AX Agent 좌측 패널과 컨텍스트 사용량 UI를 Codex 기준으로 재정렬\n\n- 좌측 사이드바 폭과 새 대화/검색/필터/탭 메뉴 타이포를 키워 레퍼런스와 더 비슷한 밀도로 조정\n- Cowork 작업 유형 카드 크기와 제목/hover 설명 라벨 폰트를 확대해 가독성 보정\n- 하단 컨텍스트 사용량 카드를 작은 원형 심볼로 축소하고 hover 전용 커스텀 팝업으로 상세 정보 분리\n- README와 DEVELOPMENT 문서에 변경 이력 및 검증 결과 즉시 반영\n\n검증 결과\n- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\\n- 경고 0 / 오류 0
Some checks failed
Release Gate / gate (push) Has been cancelled
Some checks failed
Release Gate / gate (push) Has been cancelled
This commit is contained in:
@@ -412,7 +412,7 @@
|
||||
<!-- 축소 아이콘 바 (사이드바 닫힘 시 표시) -->
|
||||
<ColumnDefinition x:Name="IconBarColumn" Width="0"/>
|
||||
<!-- 사이드바 (열림 시 표시) -->
|
||||
<ColumnDefinition x:Name="SidebarColumn" Width="220" MinWidth="0"/>
|
||||
<ColumnDefinition x:Name="SidebarColumn" Width="246" MinWidth="0"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<!-- 미리보기 스플리터 -->
|
||||
<ColumnDefinition x:Name="SplitterColumn" Width="0"/>
|
||||
@@ -506,8 +506,8 @@
|
||||
<StackPanel>
|
||||
<Border x:Name="SidebarNewChatTrigger"
|
||||
Background="Transparent"
|
||||
CornerRadius="5"
|
||||
Padding="6,4"
|
||||
CornerRadius="7"
|
||||
Padding="8,6"
|
||||
Cursor="Hand"
|
||||
MouseEnter="SidebarNewChatTrigger_MouseEnter"
|
||||
MouseLeave="SidebarNewChatTrigger_MouseLeave"
|
||||
@@ -518,25 +518,25 @@
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="9.75"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="11.5"
|
||||
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="1" Text="새 대화"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
FontSize="10" Margin="6,0,0,0" VerticalAlignment="Center"/>
|
||||
FontSize="12.5" FontWeight="SemiBold" Margin="8,0,0,0" VerticalAlignment="Center"/>
|
||||
<TextBlock x:Name="SidebarNewChatShortcutHint"
|
||||
Grid.Column="2"
|
||||
Text="Ctrl+N"
|
||||
Visibility="Collapsed"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
FontSize="9.25"
|
||||
FontSize="10.5"
|
||||
VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<Border x:Name="SidebarSearchTrigger"
|
||||
Background="Transparent"
|
||||
CornerRadius="5"
|
||||
Padding="6,4"
|
||||
CornerRadius="7"
|
||||
Padding="8,6"
|
||||
Cursor="Hand"
|
||||
MouseEnter="SidebarSearchTrigger_MouseEnter"
|
||||
MouseLeave="SidebarSearchTrigger_MouseLeave"
|
||||
@@ -547,17 +547,17 @@
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="9.75"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="11.5"
|
||||
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="1" Text="검색"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
FontSize="10" Margin="6,0,0,0" VerticalAlignment="Center"/>
|
||||
FontSize="12.5" FontWeight="SemiBold" Margin="8,0,0,0" VerticalAlignment="Center"/>
|
||||
<TextBlock x:Name="SidebarSearchShortcutHint"
|
||||
Grid.Column="2"
|
||||
Text="Ctrl+K"
|
||||
Visibility="Collapsed"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
FontSize="9.25"
|
||||
FontSize="10.5"
|
||||
VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
@@ -565,7 +565,7 @@
|
||||
<Border x:Name="SidebarSearchEditor"
|
||||
Background="{DynamicResource ItemBackground}"
|
||||
CornerRadius="7"
|
||||
Padding="7,4"
|
||||
Padding="9,6"
|
||||
Visibility="Collapsed"
|
||||
Opacity="0"
|
||||
RenderTransformOrigin="0,0.5">
|
||||
@@ -580,35 +580,35 @@
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="11"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12.5"
|
||||
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
|
||||
<TextBox x:Name="SearchBox" Grid.Column="1"
|
||||
Background="Transparent" BorderThickness="0"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
CaretBrush="{DynamicResource AccentColor}" FontSize="10.5"
|
||||
VerticalAlignment="Center" Margin="8,0,6,0"
|
||||
CaretBrush="{DynamicResource AccentColor}" FontSize="12.5"
|
||||
VerticalAlignment="Center" Margin="9,0,7,0"
|
||||
TextChanged="SearchBox_TextChanged"/>
|
||||
<Button x:Name="BtnConversationSort" Grid.Column="2"
|
||||
Style="{StaticResource GhostBtn}"
|
||||
Padding="6,2.5" MinWidth="50"
|
||||
Padding="7,3.5" MinWidth="58"
|
||||
Margin="0,0,0,0"
|
||||
VerticalAlignment="Center"
|
||||
Click="BtnConversationSort_Click"
|
||||
ToolTip="대화 정렬 기준 전환"
|
||||
Visibility="Collapsed">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="11"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBlock x:Name="ConversationSortLabel" Text="활동"
|
||||
FontSize="10" FontWeight="SemiBold"
|
||||
FontSize="11.5" FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button x:Name="BtnRunningOnlyFilter" Grid.Column="3"
|
||||
Style="{StaticResource GhostBtn}"
|
||||
Padding="6,2.5" MinWidth="50"
|
||||
Padding="7,3.5" MinWidth="58"
|
||||
Margin="5,0,0,0"
|
||||
VerticalAlignment="Center"
|
||||
Click="BtnRunningOnlyFilter_Click"
|
||||
@@ -616,24 +616,24 @@
|
||||
Visibility="Collapsed"
|
||||
IsEnabled="False">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="11"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBlock x:Name="RunningOnlyFilterLabel" Text="진행"
|
||||
FontSize="10" FontWeight="SemiBold"
|
||||
FontSize="11.5" FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button Grid.Column="4"
|
||||
Style="{StaticResource GhostBtn}"
|
||||
Padding="6,3"
|
||||
Padding="7,4"
|
||||
Margin="5,0,0,0"
|
||||
Click="BtnSidebarSearchClose_Click"
|
||||
ToolTip="검색 닫기">
|
||||
<TextBlock Text=""
|
||||
FontFamily="Segoe MDL2 Assets"
|
||||
FontSize="9.75"
|
||||
FontSize="10.5"
|
||||
Foreground="{DynamicResource SecondaryText}"/>
|
||||
</Button>
|
||||
</Grid>
|
||||
@@ -644,20 +644,20 @@
|
||||
<!-- 상단 필터 드롭다운 -->
|
||||
<Border Grid.Row="2" Margin="12,0,12,4">
|
||||
<Button x:Name="BtnCategoryDrop" Style="{StaticResource GhostBtn}"
|
||||
HorizontalAlignment="Stretch" Padding="7,3.5"
|
||||
HorizontalAlignment="Stretch" Padding="9,5"
|
||||
Click="BtnCategoryDrop_Click">
|
||||
<Grid HorizontalAlignment="Stretch">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock x:Name="CategoryIcon" Text=""
|
||||
FontFamily="Segoe MDL2 Assets" FontSize="10"
|
||||
FontFamily="Segoe MDL2 Assets" FontSize="11.5"
|
||||
Foreground="{DynamicResource AccentColor}"
|
||||
VerticalAlignment="Center" Margin="0,0,6,0"/>
|
||||
VerticalAlignment="Center" Margin="0,0,7,0"/>
|
||||
<TextBlock x:Name="CategoryLabel" Text="모든 주제"
|
||||
FontSize="10.25" FontWeight="SemiBold"
|
||||
FontSize="12" FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="9.5"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
HorizontalAlignment="Right" VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
@@ -674,18 +674,18 @@
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,4" Visibility="Collapsed">
|
||||
<TextBlock x:Name="SidebarModeBadgeIcon" Text=""
|
||||
FontFamily="Segoe MDL2 Assets" FontSize="10.5"
|
||||
FontFamily="Segoe MDL2 Assets" FontSize="11.5"
|
||||
Foreground="{DynamicResource AccentColor}"
|
||||
VerticalAlignment="Center" Margin="0,0,6,0"/>
|
||||
<TextBlock x:Name="SidebarModeBadgeTitle" Text="Chat 메뉴"
|
||||
FontSize="10.5" FontWeight="SemiBold"
|
||||
FontSize="11.75" FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel x:Name="SidebarChatMenu" Visibility="Visible">
|
||||
<Border Cursor="Hand" Background="Transparent" CornerRadius="8"
|
||||
Padding="7,3.5" Margin="0,0,0,2"
|
||||
Padding="9,5" Margin="0,0,0,3"
|
||||
MouseLeftButtonUp="SidebarChatAll_MouseLeftButtonUp">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
@@ -693,17 +693,17 @@
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="11"
|
||||
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="1" Text="주제"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
FontSize="10.25" Margin="6,0,0,0" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="2" Text="" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
|
||||
FontSize="12" Margin="7,0,0,0" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="2" Text="" FontFamily="Segoe MDL2 Assets" FontSize="9.5"
|
||||
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
<Border x:Name="SidebarChatRunningRow" Cursor="Hand" Background="Transparent" CornerRadius="8"
|
||||
Padding="7,3.5"
|
||||
Padding="9,5"
|
||||
MouseLeftButtonUp="SidebarChatRunning_MouseLeftButtonUp"
|
||||
Visibility="Collapsed">
|
||||
<Grid>
|
||||
@@ -712,21 +712,21 @@
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="11"
|
||||
Foreground="#22C55E" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="1" Text="진행 중 대화만 보기"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
FontSize="10.25" Margin="6,0,0,0" VerticalAlignment="Center"/>
|
||||
FontSize="12" Margin="7,0,0,0" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="2" x:Name="SidebarChatRunningState" Text="OFF"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
FontSize="9.75" VerticalAlignment="Center"/>
|
||||
FontSize="10.75" VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel x:Name="SidebarCoworkMenu" Visibility="Collapsed">
|
||||
<Border Cursor="Hand" Background="Transparent" CornerRadius="8"
|
||||
Padding="7,3.5" Margin="0,0,0,2"
|
||||
Padding="9,5" Margin="0,0,0,3"
|
||||
MouseLeftButtonUp="SidebarCoworkCategory_MouseLeftButtonUp">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
@@ -734,12 +734,12 @@
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="11"
|
||||
Foreground="#3B82F6" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="1" Text="작업 유형"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
FontSize="10.25" Margin="6,0,0,0" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="2" Text="" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
|
||||
FontSize="12" Margin="7,0,0,0" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="2" Text="" FontFamily="Segoe MDL2 Assets" FontSize="9.5"
|
||||
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
@@ -747,7 +747,7 @@
|
||||
|
||||
<StackPanel x:Name="SidebarCodeMenu" Visibility="Collapsed">
|
||||
<Border Cursor="Hand" Background="Transparent" CornerRadius="8"
|
||||
Padding="7,3.5" Margin="0,0,0,2"
|
||||
Padding="9,5" Margin="0,0,0,3"
|
||||
MouseLeftButtonUp="SidebarCodeCategory_MouseLeftButtonUp">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
@@ -755,12 +755,12 @@
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="11"
|
||||
Foreground="#3B82F6" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="1" Text="워크스페이스"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
FontSize="10.25" Margin="6,0,0,0" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="2" Text="" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
|
||||
FontSize="12" Margin="7,0,0,0" VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="2" Text="" FontFamily="Segoe MDL2 Assets" FontSize="9.5"
|
||||
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
@@ -1217,14 +1217,14 @@
|
||||
HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
|
||||
<TextBlock x:Name="EmptyStateTitle" Text="작업을 시작하세요" FontSize="18" FontWeight="SemiBold"
|
||||
<TextBlock x:Name="EmptyStateTitle" Text="작업을 시작하세요" FontSize="22" FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource PrimaryText}" HorizontalAlignment="Center"/>
|
||||
<TextBlock x:Name="EmptyStateDesc" Text="프롬프트를 입력하거나 아래 작업 유형을 선택하면 됩니다"
|
||||
FontSize="12.5" Foreground="{DynamicResource SecondaryText}"
|
||||
FontSize="14.25" Foreground="{DynamicResource SecondaryText}"
|
||||
HorizontalAlignment="Center"
|
||||
TextAlignment="Center"
|
||||
Width="380"
|
||||
Margin="0,5,0,0"/>
|
||||
Width="430"
|
||||
Margin="0,7,0,0"/>
|
||||
</StackPanel>
|
||||
|
||||
<ScrollViewer x:Name="TopicPresetScrollViewer"
|
||||
@@ -1692,25 +1692,25 @@
|
||||
<Border x:Name="TokenUsageCard"
|
||||
Grid.Column="2"
|
||||
Margin="6,0,0,0"
|
||||
Padding="6,3"
|
||||
Padding="0"
|
||||
Width="28"
|
||||
Height="28"
|
||||
CornerRadius="999"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
BorderThickness="1"
|
||||
Background="{DynamicResource ItemBackground}"
|
||||
BorderBrush="Transparent"
|
||||
BorderThickness="0"
|
||||
Background="Transparent"
|
||||
VerticalAlignment="Center"
|
||||
Visibility="Collapsed">
|
||||
Visibility="Collapsed"
|
||||
Cursor="Hand"
|
||||
MouseEnter="TokenUsageCard_MouseEnter"
|
||||
MouseLeave="TokenUsageCard_MouseLeave">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid Width="28" Height="28" VerticalAlignment="Center">
|
||||
<Ellipse Stroke="{DynamicResource HintBackground}"
|
||||
StrokeThickness="3.5"/>
|
||||
StrokeThickness="3"/>
|
||||
<Path x:Name="TokenUsageArc"
|
||||
Stroke="{DynamicResource AccentColor}"
|
||||
StrokeThickness="3.5"
|
||||
StrokeThickness="3"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"/>
|
||||
<Canvas IsHitTestVisible="False">
|
||||
@@ -1721,28 +1721,26 @@
|
||||
</Canvas>
|
||||
<TextBlock x:Name="TokenUsagePercentText"
|
||||
Text="0%"
|
||||
FontSize="9"
|
||||
FontSize="8.25"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
<StackPanel Grid.Column="1"
|
||||
Margin="7,0,5,0"
|
||||
VerticalAlignment="Center">
|
||||
<StackPanel Visibility="Collapsed">
|
||||
<TextBlock x:Name="TokenUsageSummaryText"
|
||||
Text="컨텍스트"
|
||||
FontSize="10.5"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource PrimaryText}"/>
|
||||
<TextBlock x:Name="TokenUsageHintText"
|
||||
Text="0 / 0"
|
||||
FontSize="9"
|
||||
Foreground="{DynamicResource SecondaryText}"/>
|
||||
Text="0 / 0"
|
||||
FontSize="9"
|
||||
Foreground="{DynamicResource SecondaryText}"/>
|
||||
</StackPanel>
|
||||
<Button x:Name="BtnCompactNow"
|
||||
Grid.Column="2"
|
||||
Style="{StaticResource GhostBtn}"
|
||||
Visibility="Collapsed"
|
||||
Padding="6,3"
|
||||
Margin="0"
|
||||
VerticalAlignment="Center"
|
||||
@@ -1764,6 +1762,53 @@
|
||||
</Button>
|
||||
</Grid>
|
||||
</Border>
|
||||
<Popup x:Name="TokenUsagePopup"
|
||||
Grid.Column="2"
|
||||
PlacementTarget="{Binding ElementName=TokenUsageCard}"
|
||||
Placement="Top"
|
||||
HorizontalOffset="-8"
|
||||
VerticalOffset="-10"
|
||||
AllowsTransparency="True"
|
||||
PopupAnimation="Fade"
|
||||
StaysOpen="True">
|
||||
<Border Background="{DynamicResource LauncherBackground}"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="14"
|
||||
Padding="12,10"
|
||||
MinWidth="186"
|
||||
MouseEnter="TokenUsagePopup_MouseEnter"
|
||||
MouseLeave="TokenUsagePopup_MouseLeave">
|
||||
<Border.Effect>
|
||||
<DropShadowEffect BlurRadius="18" ShadowDepth="0" Opacity="0.16"/>
|
||||
</Border.Effect>
|
||||
<StackPanel>
|
||||
<TextBlock x:Name="TokenUsagePopupTitle"
|
||||
Text="컨텍스트 창"
|
||||
FontSize="12"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource PrimaryText}"/>
|
||||
<TextBlock x:Name="TokenUsagePopupUsage"
|
||||
Margin="0,6,0,0"
|
||||
Text="76% 창"
|
||||
FontSize="18"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource PrimaryText}"/>
|
||||
<TextBlock x:Name="TokenUsagePopupDetail"
|
||||
Margin="0,2,0,0"
|
||||
Text="197k/258k 캐시 토큰 사용"
|
||||
FontSize="11.5"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
TextWrapping="Wrap"/>
|
||||
<TextBlock x:Name="TokenUsagePopupCompact"
|
||||
Margin="0,8,0,0"
|
||||
Text="AX Agent가 컨텍스트를 자동으로 압축합니다"
|
||||
FontSize="11.5"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Popup>
|
||||
<Button x:Name="BtnTemplateSelector"
|
||||
Style="{StaticResource OutlineHoverBtn}"
|
||||
Grid.Column="3"
|
||||
|
||||
@@ -87,6 +87,7 @@ public partial class ChatWindow : Window
|
||||
private readonly DispatcherTimer _taskSummaryRefreshTimer;
|
||||
private readonly DispatcherTimer _conversationPersistTimer;
|
||||
private readonly DispatcherTimer _agentUiEventTimer;
|
||||
private readonly DispatcherTimer _tokenUsagePopupCloseTimer;
|
||||
private CancellationTokenSource? _gitStatusRefreshCts;
|
||||
private int _displayedLength; // 현재 화면에 표시된 글자 수
|
||||
private ResourceDictionary? _agentThemeDictionary;
|
||||
@@ -270,6 +271,13 @@ public partial class ChatWindow : Window
|
||||
_agentUiEventTimer.Stop();
|
||||
FlushPendingAgentUiEvent();
|
||||
};
|
||||
_tokenUsagePopupCloseTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(140) };
|
||||
_tokenUsagePopupCloseTimer.Tick += (_, _) =>
|
||||
{
|
||||
_tokenUsagePopupCloseTimer.Stop();
|
||||
if (TokenUsagePopup != null)
|
||||
TokenUsagePopup.IsOpen = false;
|
||||
};
|
||||
|
||||
KeyDown += ChatWindow_KeyDown;
|
||||
UpdateConversationFailureFilterUi();
|
||||
@@ -12113,8 +12121,8 @@ public partial class ChatWindow : Window
|
||||
Padding = new Thickness(14, 14, 14, 12),
|
||||
Margin = new Thickness(6, 6, 6, 8),
|
||||
Cursor = Cursors.Hand,
|
||||
Width = 132,
|
||||
Height = 110,
|
||||
Width = 148,
|
||||
Height = 124,
|
||||
ClipToBounds = true,
|
||||
};
|
||||
|
||||
@@ -12127,17 +12135,17 @@ public partial class ChatWindow : Window
|
||||
|
||||
var iconCircle = new Border
|
||||
{
|
||||
Width = 42, Height = 42,
|
||||
CornerRadius = new CornerRadius(21),
|
||||
Width = 46, Height = 46,
|
||||
CornerRadius = new CornerRadius(23),
|
||||
Background = new SolidColorBrush(((SolidColorBrush)btnColor).Color) { Opacity = 0.15 },
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
Margin = new Thickness(0, 0, 0, 10),
|
||||
Margin = new Thickness(0, 0, 0, 12),
|
||||
};
|
||||
var iconTb = new TextBlock
|
||||
{
|
||||
Text = preset.Symbol,
|
||||
FontFamily = new FontFamily("Segoe MDL2 Assets"),
|
||||
FontSize = 18.5,
|
||||
FontSize = 20,
|
||||
Foreground = btnColor,
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
@@ -12148,13 +12156,13 @@ public partial class ChatWindow : Window
|
||||
stack.Children.Add(new TextBlock
|
||||
{
|
||||
Text = preset.Label,
|
||||
FontSize = 14,
|
||||
FontSize = 15.5,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
Foreground = primaryText,
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
TextAlignment = TextAlignment.Center,
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
MaxWidth = 98,
|
||||
MaxWidth = 112,
|
||||
});
|
||||
|
||||
var hoverLabel = new Border
|
||||
@@ -12172,10 +12180,10 @@ public partial class ChatWindow : Window
|
||||
Child = new TextBlock
|
||||
{
|
||||
Text = preset.Description,
|
||||
FontSize = 10.5,
|
||||
FontSize = 11.5,
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
TextTrimming = TextTrimming.CharacterEllipsis,
|
||||
MaxHeight = 30,
|
||||
MaxHeight = 34,
|
||||
Foreground = secondaryText,
|
||||
TextAlignment = TextAlignment.Center,
|
||||
}
|
||||
@@ -12244,8 +12252,8 @@ public partial class ChatWindow : Window
|
||||
Padding = new Thickness(14, 14, 14, 12),
|
||||
Margin = new Thickness(6, 6, 6, 8),
|
||||
Cursor = Cursors.Hand,
|
||||
Width = 132,
|
||||
Height = 110,
|
||||
Width = 148,
|
||||
Height = 124,
|
||||
ClipToBounds = true,
|
||||
};
|
||||
|
||||
@@ -12258,17 +12266,17 @@ public partial class ChatWindow : Window
|
||||
|
||||
var etcIconCircle = new Border
|
||||
{
|
||||
Width = 42, Height = 42,
|
||||
CornerRadius = new CornerRadius(21),
|
||||
Width = 46, Height = 46,
|
||||
CornerRadius = new CornerRadius(23),
|
||||
Background = new SolidColorBrush(((SolidColorBrush)etcColor).Color) { Opacity = 0.15 },
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
Margin = new Thickness(0, 0, 0, 10),
|
||||
Margin = new Thickness(0, 0, 0, 12),
|
||||
};
|
||||
etcIconCircle.Child = new TextBlock
|
||||
{
|
||||
Text = "\uE70F", // Edit 아이콘
|
||||
FontFamily = new FontFamily("Segoe MDL2 Assets"),
|
||||
FontSize = 18.5,
|
||||
FontSize = 20,
|
||||
Foreground = etcColor,
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
@@ -12278,7 +12286,7 @@ public partial class ChatWindow : Window
|
||||
etcStack.Children.Add(new TextBlock
|
||||
{
|
||||
Text = "기타",
|
||||
FontSize = 14,
|
||||
FontSize = 15.5,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
Foreground = primaryText,
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
@@ -12299,10 +12307,10 @@ public partial class ChatWindow : Window
|
||||
Child = new TextBlock
|
||||
{
|
||||
Text = "프리셋 없이 자유롭게 대화합니다",
|
||||
FontSize = 10.5,
|
||||
FontSize = 11.5,
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
TextTrimming = TextTrimming.CharacterEllipsis,
|
||||
MaxHeight = 30,
|
||||
MaxHeight = 34,
|
||||
Foreground = secondaryText,
|
||||
TextAlignment = TextAlignment.Center,
|
||||
}
|
||||
@@ -12334,8 +12342,8 @@ public partial class ChatWindow : Window
|
||||
Padding = new Thickness(14, 14, 14, 12),
|
||||
Margin = new Thickness(6, 6, 6, 8),
|
||||
Cursor = Cursors.Hand,
|
||||
Width = 132,
|
||||
Height = 110,
|
||||
Width = 148,
|
||||
Height = 124,
|
||||
ClipToBounds = true,
|
||||
};
|
||||
|
||||
@@ -12347,17 +12355,17 @@ public partial class ChatWindow : Window
|
||||
{
|
||||
Text = "\uE710",
|
||||
FontFamily = new FontFamily("Segoe MDL2 Assets"),
|
||||
FontSize = 24,
|
||||
FontSize = 26,
|
||||
Foreground = secondaryText,
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
Margin = new Thickness(0, 10, 0, 8),
|
||||
Margin = new Thickness(0, 12, 0, 10),
|
||||
};
|
||||
addStack.Children.Add(plusIcon);
|
||||
|
||||
addStack.Children.Add(new TextBlock
|
||||
{
|
||||
Text = "프리셋 추가",
|
||||
FontSize = 13,
|
||||
FontSize = 14.5,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
Foreground = secondaryText,
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
@@ -12378,10 +12386,10 @@ public partial class ChatWindow : Window
|
||||
Child = new TextBlock
|
||||
{
|
||||
Text = "새 작업 유형 카드를 직접 추가합니다",
|
||||
FontSize = 10.5,
|
||||
FontSize = 11.5,
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
TextTrimming = TextTrimming.CharacterEllipsis,
|
||||
MaxHeight = 30,
|
||||
MaxHeight = 34,
|
||||
Foreground = secondaryText,
|
||||
TextAlignment = TextAlignment.Center,
|
||||
}
|
||||
@@ -18702,10 +18710,59 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
|
||||
postCompactionUsage +
|
||||
pendingPostCompaction;
|
||||
|
||||
if (TokenUsagePopupTitle != null)
|
||||
TokenUsagePopupTitle.Text = $"컨텍스트 창 {percentText}";
|
||||
if (TokenUsagePopupUsage != null)
|
||||
TokenUsagePopupUsage.Text = $"{Services.TokenEstimator.Format(currentTokens)}/{Services.TokenEstimator.Format(maxContextTokens)}";
|
||||
if (TokenUsagePopupDetail != null)
|
||||
{
|
||||
TokenUsagePopupDetail.Text = currentModelTotalTokens > 0
|
||||
? $"오늘 {currentService} · {currentModel} 사용량 {FormatTokenCount(currentModelTotalTokens)}"
|
||||
: $"{summary} · 자동 압축 시작 {triggerPercent}%";
|
||||
}
|
||||
if (TokenUsagePopupCompact != null)
|
||||
{
|
||||
var compactText = compactLabel switch
|
||||
{
|
||||
"지금 압축" => "지금 압축이 필요합니다",
|
||||
"압축 권장" => "곧 자동 압축이 시작됩니다",
|
||||
"미리 압축" => "여유가 있을 때 먼저 압축할 수 있습니다",
|
||||
_ => "AX Agent가 컨텍스트를 자동으로 관리합니다",
|
||||
};
|
||||
TokenUsagePopupCompact.Text = compactText;
|
||||
}
|
||||
TokenUsageCard.ToolTip = null;
|
||||
|
||||
UpdateCircularUsageArc(TokenUsageArc, usageRatio, 18, 18, 14);
|
||||
PositionThresholdMarker(TokenUsageThresholdMarker, triggerRatio, 18, 18, 14, 3);
|
||||
}
|
||||
|
||||
private void TokenUsageCard_MouseEnter(object sender, MouseEventArgs e)
|
||||
{
|
||||
_tokenUsagePopupCloseTimer.Stop();
|
||||
if (TokenUsagePopup != null && TokenUsageCard?.Visibility == Visibility.Visible)
|
||||
TokenUsagePopup.IsOpen = true;
|
||||
}
|
||||
|
||||
private void TokenUsageCard_MouseLeave(object sender, MouseEventArgs e)
|
||||
{
|
||||
_tokenUsagePopupCloseTimer.Stop();
|
||||
_tokenUsagePopupCloseTimer.Start();
|
||||
}
|
||||
|
||||
private void TokenUsagePopup_MouseEnter(object sender, MouseEventArgs e)
|
||||
{
|
||||
_tokenUsagePopupCloseTimer.Stop();
|
||||
if (TokenUsagePopup != null)
|
||||
TokenUsagePopup.IsOpen = true;
|
||||
}
|
||||
|
||||
private void TokenUsagePopup_MouseLeave(object sender, MouseEventArgs e)
|
||||
{
|
||||
_tokenUsagePopupCloseTimer.Stop();
|
||||
_tokenUsagePopupCloseTimer.Start();
|
||||
}
|
||||
|
||||
private static string BuildUsageModelKey(string? service, string? model)
|
||||
{
|
||||
var normalizedService = (service ?? "").Trim().ToLowerInvariant();
|
||||
|
||||
Reference in New Issue
Block a user