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

This commit is contained in:
2026-04-05 16:39:32 +09:00
parent b53af39358
commit 500c8ffb06
4 changed files with 209 additions and 96 deletions

View File

@@ -902,6 +902,11 @@ ow + toggle 시각 언어로 통일했습니다.
- `AgentEventType.Planning` 도 더 `claw-code`처럼 기본 transcript에서는 큰 계획 카드 대신 얇은 compact pill만 남기도록 바꿨습니다. 이제 debug가 아니면 계획이 카드 형태로 본문을 밀어내지 않습니다. - `AgentEventType.Planning` 도 더 `claw-code`처럼 기본 transcript에서는 큰 계획 카드 대신 얇은 compact pill만 남기도록 바꿨습니다. 이제 debug가 아니면 계획이 카드 형태로 본문을 밀어내지 않습니다.
- 검증: `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 19:24 (KST) - 업데이트: 2026-04-05 19:24 (KST)
- AX Agent 좌측 패널과 작업 유형 카드의 크기를 다시 키웠습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서 사이드바 폭을 `246`으로 넓히고 `새 대화`, `검색`, 필터 드롭다운, 탭별 메뉴의 폰트/패딩/아이콘을 전반적으로 키워 첫 번째 레퍼런스 이미지처럼 더 읽기 쉽게 정리했습니다.
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 `BuildTopicButtons()` 에서는 작업 유형 카드 크기를 `148 x 124`로 늘리고, 아이콘 원형과 제목·hover 설명 라벨 폰트도 함께 키워 현재 화면 글자 크기가 너무 작게 보이던 문제를 보정했습니다.
- 하단 컨텍스트 사용량 UI도 카드형에서 심볼형으로 바꿨습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 의 `TokenUsageCard` 는 작은 원형 심볼만 남기고, 상세 정보는 `TokenUsagePopup` 커스텀 팝업으로 분리했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서는 hover 진입/이탈 시 팝업을 제어하고, `RefreshContextUsageVisual()` 이 심볼 상태와 팝업 텍스트를 함께 갱신하도록 연결했습니다.
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0
- 업데이트: 2026-04-05 19:38 (KST)
--- ---

View File

@@ -4662,3 +4662,9 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
- `AddAgentEventBanner(...)` 의 Planning 처리도 바꿨습니다. 이제 `AgentEventType.Planning` 은 log level과 무관하게 기본 transcript에 compact pill만 남기고, 큰 계획 카드는 기본 흐름에서 사용하지 않습니다. `claw-code`처럼 transcript 중심 읽기 흐름을 유지하기 위한 정리입니다. - `AddAgentEventBanner(...)` 의 Planning 처리도 바꿨습니다. 이제 `AgentEventType.Planning` 은 log level과 무관하게 기본 transcript에 compact pill만 남기고, 큰 계획 카드는 기본 흐름에서 사용하지 않습니다. `claw-code`처럼 transcript 중심 읽기 흐름을 유지하기 위한 정리입니다.
- 검증: `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 19:24 (KST) - 업데이트: 2026-04-05 19:24 (KST)
- AX Agent 레이아웃 타이포를 사용자 피드백 기준으로 다시 키웠습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서 `SidebarColumn` 폭을 `246`으로 넓히고, `SidebarNewChatTrigger`, `SidebarSearchTrigger`, `SidebarSearchEditor`, `BtnCategoryDrop`, `SidebarChatMenu`, `SidebarCoworkMenu`, `SidebarCodeMenu` 의 폰트/패딩/아이콘 크기를 한 단계 올렸습니다. 첫 번째 레퍼런스처럼 좌측 패널이 너무 작아 보이지 않도록 보정한 변경입니다.
- 같은 파일에서 `EmptyStateTitle`, `EmptyStateDesc``22 / 14.25` 기준으로 키우고 하단 `TokenUsageCard` 를 작은 원형 심볼형으로 교체했습니다. 기존 summary/hint/button 텍스트는 기본 노출에서 제거했고, `TokenUsagePopup` 을 새로 추가해 hover 시에만 컨텍스트 상태를 보여주게 했습니다.
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `BuildTopicButtons()` 는 작업 유형 카드 크기를 `148 x 124`로 키우고, 아이콘 원형/제목/hover 설명 라벨 폰트를 함께 올려 현재 Cowork 첫 화면 글자 크기가 지나치게 작게 보이던 문제를 보정했습니다.
- 같은 파일에 `_tokenUsagePopupCloseTimer`, `TokenUsageCard_MouseEnter/Leave`, `TokenUsagePopup_MouseEnter/Leave` 를 추가했고, `RefreshContextUsageVisual()` 은 이제 카드 텍스트 대신 popup 전용 타이틀/요약/압축 안내 텍스트를 갱신합니다. 기본 WPF 툴팁 문자열은 제거해 `Codex` 쪽의 아이콘 + hover 상세 구조에 더 가깝게 맞췄습니다.
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0
- 업데이트: 2026-04-05 19:38 (KST)

View File

@@ -412,7 +412,7 @@
<!-- 축소 아이콘 바 (사이드바 닫힘 시 표시) --> <!-- 축소 아이콘 바 (사이드바 닫힘 시 표시) -->
<ColumnDefinition x:Name="IconBarColumn" Width="0"/> <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 Width="*"/>
<!-- 미리보기 스플리터 --> <!-- 미리보기 스플리터 -->
<ColumnDefinition x:Name="SplitterColumn" Width="0"/> <ColumnDefinition x:Name="SplitterColumn" Width="0"/>
@@ -506,8 +506,8 @@
<StackPanel> <StackPanel>
<Border x:Name="SidebarNewChatTrigger" <Border x:Name="SidebarNewChatTrigger"
Background="Transparent" Background="Transparent"
CornerRadius="5" CornerRadius="7"
Padding="6,4" Padding="8,6"
Cursor="Hand" Cursor="Hand"
MouseEnter="SidebarNewChatTrigger_MouseEnter" MouseEnter="SidebarNewChatTrigger_MouseEnter"
MouseLeave="SidebarNewChatTrigger_MouseLeave" MouseLeave="SidebarNewChatTrigger_MouseLeave"
@@ -518,25 +518,25 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="&#xE710;" FontFamily="Segoe MDL2 Assets" FontSize="9.75" <TextBlock Text="&#xE710;" FontFamily="Segoe MDL2 Assets" FontSize="11.5"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/> Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="새 대화" <TextBlock Grid.Column="1" Text="새 대화"
Foreground="{DynamicResource PrimaryText}" 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" <TextBlock x:Name="SidebarNewChatShortcutHint"
Grid.Column="2" Grid.Column="2"
Text="Ctrl+N" Text="Ctrl+N"
Visibility="Collapsed" Visibility="Collapsed"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
FontSize="9.25" FontSize="10.5"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</Grid> </Grid>
</Border> </Border>
<Border x:Name="SidebarSearchTrigger" <Border x:Name="SidebarSearchTrigger"
Background="Transparent" Background="Transparent"
CornerRadius="5" CornerRadius="7"
Padding="6,4" Padding="8,6"
Cursor="Hand" Cursor="Hand"
MouseEnter="SidebarSearchTrigger_MouseEnter" MouseEnter="SidebarSearchTrigger_MouseEnter"
MouseLeave="SidebarSearchTrigger_MouseLeave" MouseLeave="SidebarSearchTrigger_MouseLeave"
@@ -547,17 +547,17 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="9.75" <TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="11.5"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/> Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="검색" <TextBlock Grid.Column="1" Text="검색"
Foreground="{DynamicResource PrimaryText}" 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" <TextBlock x:Name="SidebarSearchShortcutHint"
Grid.Column="2" Grid.Column="2"
Text="Ctrl+K" Text="Ctrl+K"
Visibility="Collapsed" Visibility="Collapsed"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
FontSize="9.25" FontSize="10.5"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</Grid> </Grid>
</Border> </Border>
@@ -565,7 +565,7 @@
<Border x:Name="SidebarSearchEditor" <Border x:Name="SidebarSearchEditor"
Background="{DynamicResource ItemBackground}" Background="{DynamicResource ItemBackground}"
CornerRadius="7" CornerRadius="7"
Padding="7,4" Padding="9,6"
Visibility="Collapsed" Visibility="Collapsed"
Opacity="0" Opacity="0"
RenderTransformOrigin="0,0.5"> RenderTransformOrigin="0,0.5">
@@ -580,35 +580,35 @@
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="11" <TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="12.5"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/> Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
<TextBox x:Name="SearchBox" Grid.Column="1" <TextBox x:Name="SearchBox" Grid.Column="1"
Background="Transparent" BorderThickness="0" Background="Transparent" BorderThickness="0"
Foreground="{DynamicResource PrimaryText}" Foreground="{DynamicResource PrimaryText}"
CaretBrush="{DynamicResource AccentColor}" FontSize="10.5" CaretBrush="{DynamicResource AccentColor}" FontSize="12.5"
VerticalAlignment="Center" Margin="8,0,6,0" VerticalAlignment="Center" Margin="9,0,7,0"
TextChanged="SearchBox_TextChanged"/> TextChanged="SearchBox_TextChanged"/>
<Button x:Name="BtnConversationSort" Grid.Column="2" <Button x:Name="BtnConversationSort" Grid.Column="2"
Style="{StaticResource GhostBtn}" Style="{StaticResource GhostBtn}"
Padding="6,2.5" MinWidth="50" Padding="7,3.5" MinWidth="58"
Margin="0,0,0,0" Margin="0,0,0,0"
VerticalAlignment="Center" VerticalAlignment="Center"
Click="BtnConversationSort_Click" Click="BtnConversationSort_Click"
ToolTip="대화 정렬 기준 전환" ToolTip="대화 정렬 기준 전환"
Visibility="Collapsed"> Visibility="Collapsed">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE8CB;" FontFamily="Segoe MDL2 Assets" FontSize="10" <TextBlock Text="&#xE8CB;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,4,0"/> VerticalAlignment="Center" Margin="0,0,4,0"/>
<TextBlock x:Name="ConversationSortLabel" Text="활동" <TextBlock x:Name="ConversationSortLabel" Text="활동"
FontSize="10" FontWeight="SemiBold" FontSize="11.5" FontWeight="SemiBold"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
<Button x:Name="BtnRunningOnlyFilter" Grid.Column="3" <Button x:Name="BtnRunningOnlyFilter" Grid.Column="3"
Style="{StaticResource GhostBtn}" Style="{StaticResource GhostBtn}"
Padding="6,2.5" MinWidth="50" Padding="7,3.5" MinWidth="58"
Margin="5,0,0,0" Margin="5,0,0,0"
VerticalAlignment="Center" VerticalAlignment="Center"
Click="BtnRunningOnlyFilter_Click" Click="BtnRunningOnlyFilter_Click"
@@ -616,24 +616,24 @@
Visibility="Collapsed" Visibility="Collapsed"
IsEnabled="False"> IsEnabled="False">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE768;" FontFamily="Segoe MDL2 Assets" FontSize="10" <TextBlock Text="&#xE768;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center" Margin="0,0,4,0"/> VerticalAlignment="Center" Margin="0,0,4,0"/>
<TextBlock x:Name="RunningOnlyFilterLabel" Text="진행" <TextBlock x:Name="RunningOnlyFilterLabel" Text="진행"
FontSize="10" FontWeight="SemiBold" FontSize="11.5" FontWeight="SemiBold"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
<Button Grid.Column="4" <Button Grid.Column="4"
Style="{StaticResource GhostBtn}" Style="{StaticResource GhostBtn}"
Padding="6,3" Padding="7,4"
Margin="5,0,0,0" Margin="5,0,0,0"
Click="BtnSidebarSearchClose_Click" Click="BtnSidebarSearchClose_Click"
ToolTip="검색 닫기"> ToolTip="검색 닫기">
<TextBlock Text="&#xE711;" <TextBlock Text="&#xE711;"
FontFamily="Segoe MDL2 Assets" FontFamily="Segoe MDL2 Assets"
FontSize="9.75" FontSize="10.5"
Foreground="{DynamicResource SecondaryText}"/> Foreground="{DynamicResource SecondaryText}"/>
</Button> </Button>
</Grid> </Grid>
@@ -644,20 +644,20 @@
<!-- 상단 필터 드롭다운 --> <!-- 상단 필터 드롭다운 -->
<Border Grid.Row="2" Margin="12,0,12,4"> <Border Grid.Row="2" Margin="12,0,12,4">
<Button x:Name="BtnCategoryDrop" Style="{StaticResource GhostBtn}" <Button x:Name="BtnCategoryDrop" Style="{StaticResource GhostBtn}"
HorizontalAlignment="Stretch" Padding="7,3.5" HorizontalAlignment="Stretch" Padding="9,5"
Click="BtnCategoryDrop_Click"> Click="BtnCategoryDrop_Click">
<Grid HorizontalAlignment="Stretch"> <Grid HorizontalAlignment="Stretch">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock x:Name="CategoryIcon" Text="&#xE8BD;" <TextBlock x:Name="CategoryIcon" Text="&#xE8BD;"
FontFamily="Segoe MDL2 Assets" FontSize="10" FontFamily="Segoe MDL2 Assets" FontSize="11.5"
Foreground="{DynamicResource AccentColor}" Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center" Margin="0,0,6,0"/> VerticalAlignment="Center" Margin="0,0,7,0"/>
<TextBlock x:Name="CategoryLabel" Text="모든 주제" <TextBlock x:Name="CategoryLabel" Text="모든 주제"
FontSize="10.25" FontWeight="SemiBold" FontSize="12" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}" Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
<TextBlock Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="8.5" <TextBlock Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9.5"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
HorizontalAlignment="Right" VerticalAlignment="Center"/> HorizontalAlignment="Right" VerticalAlignment="Center"/>
</Grid> </Grid>
@@ -674,18 +674,18 @@
<StackPanel> <StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,4" Visibility="Collapsed"> <StackPanel Orientation="Horizontal" Margin="0,0,0,4" Visibility="Collapsed">
<TextBlock x:Name="SidebarModeBadgeIcon" Text="&#xE8BD;" <TextBlock x:Name="SidebarModeBadgeIcon" Text="&#xE8BD;"
FontFamily="Segoe MDL2 Assets" FontSize="10.5" FontFamily="Segoe MDL2 Assets" FontSize="11.5"
Foreground="{DynamicResource AccentColor}" Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center" Margin="0,0,6,0"/> VerticalAlignment="Center" Margin="0,0,6,0"/>
<TextBlock x:Name="SidebarModeBadgeTitle" Text="Chat 메뉴" <TextBlock x:Name="SidebarModeBadgeTitle" Text="Chat 메뉴"
FontSize="10.5" FontWeight="SemiBold" FontSize="11.75" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}" Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
<StackPanel x:Name="SidebarChatMenu" Visibility="Visible"> <StackPanel x:Name="SidebarChatMenu" Visibility="Visible">
<Border Cursor="Hand" Background="Transparent" CornerRadius="8" <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"> MouseLeftButtonUp="SidebarChatAll_MouseLeftButtonUp">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
@@ -693,17 +693,17 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="10" <TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center"/> Foreground="{DynamicResource AccentColor}" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="주제" <TextBlock Grid.Column="1" Text="주제"
Foreground="{DynamicResource PrimaryText}" 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" Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="8.5" <TextBlock Grid.Column="2" Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9.5"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/> Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
</Grid> </Grid>
</Border> </Border>
<Border x:Name="SidebarChatRunningRow" Cursor="Hand" Background="Transparent" CornerRadius="8" <Border x:Name="SidebarChatRunningRow" Cursor="Hand" Background="Transparent" CornerRadius="8"
Padding="7,3.5" Padding="9,5"
MouseLeftButtonUp="SidebarChatRunning_MouseLeftButtonUp" MouseLeftButtonUp="SidebarChatRunning_MouseLeftButtonUp"
Visibility="Collapsed"> Visibility="Collapsed">
<Grid> <Grid>
@@ -712,21 +712,21 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="&#xE768;" FontFamily="Segoe MDL2 Assets" FontSize="10" <TextBlock Text="&#xE768;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="#22C55E" VerticalAlignment="Center"/> Foreground="#22C55E" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="진행 중 대화만 보기" <TextBlock Grid.Column="1" Text="진행 중 대화만 보기"
Foreground="{DynamicResource PrimaryText}" 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" <TextBlock Grid.Column="2" x:Name="SidebarChatRunningState" Text="OFF"
Foreground="{DynamicResource SecondaryText}" Foreground="{DynamicResource SecondaryText}"
FontSize="9.75" VerticalAlignment="Center"/> FontSize="10.75" VerticalAlignment="Center"/>
</Grid> </Grid>
</Border> </Border>
</StackPanel> </StackPanel>
<StackPanel x:Name="SidebarCoworkMenu" Visibility="Collapsed"> <StackPanel x:Name="SidebarCoworkMenu" Visibility="Collapsed">
<Border Cursor="Hand" Background="Transparent" CornerRadius="8" <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"> MouseLeftButtonUp="SidebarCoworkCategory_MouseLeftButtonUp">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
@@ -734,12 +734,12 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="&#xE8FD;" FontFamily="Segoe MDL2 Assets" FontSize="10" <TextBlock Text="&#xE8FD;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="#3B82F6" VerticalAlignment="Center"/> Foreground="#3B82F6" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="작업 유형" <TextBlock Grid.Column="1" Text="작업 유형"
Foreground="{DynamicResource PrimaryText}" 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" Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="8.5" <TextBlock Grid.Column="2" Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9.5"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/> Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
</Grid> </Grid>
</Border> </Border>
@@ -747,7 +747,7 @@
<StackPanel x:Name="SidebarCodeMenu" Visibility="Collapsed"> <StackPanel x:Name="SidebarCodeMenu" Visibility="Collapsed">
<Border Cursor="Hand" Background="Transparent" CornerRadius="8" <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"> MouseLeftButtonUp="SidebarCodeCategory_MouseLeftButtonUp">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
@@ -755,12 +755,12 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="&#xE943;" FontFamily="Segoe MDL2 Assets" FontSize="10" <TextBlock Text="&#xE943;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="#3B82F6" VerticalAlignment="Center"/> Foreground="#3B82F6" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="워크스페이스" <TextBlock Grid.Column="1" Text="워크스페이스"
Foreground="{DynamicResource PrimaryText}" 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" Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="8.5" <TextBlock Grid.Column="2" Text="&#xE70D;" FontFamily="Segoe MDL2 Assets" FontSize="9.5"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/> Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
</Grid> </Grid>
</Border> </Border>
@@ -1217,14 +1217,14 @@
HorizontalAlignment="Center" VerticalAlignment="Center"/> HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border> </Border>
<TextBlock x:Name="EmptyStateTitle" Text="작업을 시작하세요" FontSize="18" FontWeight="SemiBold" <TextBlock x:Name="EmptyStateTitle" Text="작업을 시작하세요" FontSize="22" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}" HorizontalAlignment="Center"/> Foreground="{DynamicResource PrimaryText}" HorizontalAlignment="Center"/>
<TextBlock x:Name="EmptyStateDesc" Text="프롬프트를 입력하거나 아래 작업 유형을 선택하면 됩니다" <TextBlock x:Name="EmptyStateDesc" Text="프롬프트를 입력하거나 아래 작업 유형을 선택하면 됩니다"
FontSize="12.5" Foreground="{DynamicResource SecondaryText}" FontSize="14.25" Foreground="{DynamicResource SecondaryText}"
HorizontalAlignment="Center" HorizontalAlignment="Center"
TextAlignment="Center" TextAlignment="Center"
Width="380" Width="430"
Margin="0,5,0,0"/> Margin="0,7,0,0"/>
</StackPanel> </StackPanel>
<ScrollViewer x:Name="TopicPresetScrollViewer" <ScrollViewer x:Name="TopicPresetScrollViewer"
@@ -1692,25 +1692,25 @@
<Border x:Name="TokenUsageCard" <Border x:Name="TokenUsageCard"
Grid.Column="2" Grid.Column="2"
Margin="6,0,0,0" Margin="6,0,0,0"
Padding="6,3" Padding="0"
Width="28"
Height="28"
CornerRadius="999" CornerRadius="999"
BorderBrush="{DynamicResource BorderColor}" BorderBrush="Transparent"
BorderThickness="1" BorderThickness="0"
Background="{DynamicResource ItemBackground}" Background="Transparent"
VerticalAlignment="Center" VerticalAlignment="Center"
Visibility="Collapsed"> Visibility="Collapsed"
Cursor="Hand"
MouseEnter="TokenUsageCard_MouseEnter"
MouseLeave="TokenUsageCard_MouseLeave">
<Grid> <Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid Width="28" Height="28" VerticalAlignment="Center"> <Grid Width="28" Height="28" VerticalAlignment="Center">
<Ellipse Stroke="{DynamicResource HintBackground}" <Ellipse Stroke="{DynamicResource HintBackground}"
StrokeThickness="3.5"/> StrokeThickness="3"/>
<Path x:Name="TokenUsageArc" <Path x:Name="TokenUsageArc"
Stroke="{DynamicResource AccentColor}" Stroke="{DynamicResource AccentColor}"
StrokeThickness="3.5" StrokeThickness="3"
StrokeStartLineCap="Round" StrokeStartLineCap="Round"
StrokeEndLineCap="Round"/> StrokeEndLineCap="Round"/>
<Canvas IsHitTestVisible="False"> <Canvas IsHitTestVisible="False">
@@ -1721,15 +1721,13 @@
</Canvas> </Canvas>
<TextBlock x:Name="TokenUsagePercentText" <TextBlock x:Name="TokenUsagePercentText"
Text="0%" Text="0%"
FontSize="9" FontSize="8.25"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}" Foreground="{DynamicResource PrimaryText}"
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</Grid> </Grid>
<StackPanel Grid.Column="1" <StackPanel Visibility="Collapsed">
Margin="7,0,5,0"
VerticalAlignment="Center">
<TextBlock x:Name="TokenUsageSummaryText" <TextBlock x:Name="TokenUsageSummaryText"
Text="컨텍스트" Text="컨텍스트"
FontSize="10.5" FontSize="10.5"
@@ -1741,8 +1739,8 @@
Foreground="{DynamicResource SecondaryText}"/> Foreground="{DynamicResource SecondaryText}"/>
</StackPanel> </StackPanel>
<Button x:Name="BtnCompactNow" <Button x:Name="BtnCompactNow"
Grid.Column="2"
Style="{StaticResource GhostBtn}" Style="{StaticResource GhostBtn}"
Visibility="Collapsed"
Padding="6,3" Padding="6,3"
Margin="0" Margin="0"
VerticalAlignment="Center" VerticalAlignment="Center"
@@ -1764,6 +1762,53 @@
</Button> </Button>
</Grid> </Grid>
</Border> </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" <Button x:Name="BtnTemplateSelector"
Style="{StaticResource OutlineHoverBtn}" Style="{StaticResource OutlineHoverBtn}"
Grid.Column="3" Grid.Column="3"

View File

@@ -87,6 +87,7 @@ public partial class ChatWindow : Window
private readonly DispatcherTimer _taskSummaryRefreshTimer; private readonly DispatcherTimer _taskSummaryRefreshTimer;
private readonly DispatcherTimer _conversationPersistTimer; private readonly DispatcherTimer _conversationPersistTimer;
private readonly DispatcherTimer _agentUiEventTimer; private readonly DispatcherTimer _agentUiEventTimer;
private readonly DispatcherTimer _tokenUsagePopupCloseTimer;
private CancellationTokenSource? _gitStatusRefreshCts; private CancellationTokenSource? _gitStatusRefreshCts;
private int _displayedLength; // 현재 화면에 표시된 글자 수 private int _displayedLength; // 현재 화면에 표시된 글자 수
private ResourceDictionary? _agentThemeDictionary; private ResourceDictionary? _agentThemeDictionary;
@@ -270,6 +271,13 @@ public partial class ChatWindow : Window
_agentUiEventTimer.Stop(); _agentUiEventTimer.Stop();
FlushPendingAgentUiEvent(); FlushPendingAgentUiEvent();
}; };
_tokenUsagePopupCloseTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(140) };
_tokenUsagePopupCloseTimer.Tick += (_, _) =>
{
_tokenUsagePopupCloseTimer.Stop();
if (TokenUsagePopup != null)
TokenUsagePopup.IsOpen = false;
};
KeyDown += ChatWindow_KeyDown; KeyDown += ChatWindow_KeyDown;
UpdateConversationFailureFilterUi(); UpdateConversationFailureFilterUi();
@@ -12113,8 +12121,8 @@ public partial class ChatWindow : Window
Padding = new Thickness(14, 14, 14, 12), Padding = new Thickness(14, 14, 14, 12),
Margin = new Thickness(6, 6, 6, 8), Margin = new Thickness(6, 6, 6, 8),
Cursor = Cursors.Hand, Cursor = Cursors.Hand,
Width = 132, Width = 148,
Height = 110, Height = 124,
ClipToBounds = true, ClipToBounds = true,
}; };
@@ -12127,17 +12135,17 @@ public partial class ChatWindow : Window
var iconCircle = new Border var iconCircle = new Border
{ {
Width = 42, Height = 42, Width = 46, Height = 46,
CornerRadius = new CornerRadius(21), CornerRadius = new CornerRadius(23),
Background = new SolidColorBrush(((SolidColorBrush)btnColor).Color) { Opacity = 0.15 }, Background = new SolidColorBrush(((SolidColorBrush)btnColor).Color) { Opacity = 0.15 },
HorizontalAlignment = HorizontalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center,
Margin = new Thickness(0, 0, 0, 10), Margin = new Thickness(0, 0, 0, 12),
}; };
var iconTb = new TextBlock var iconTb = new TextBlock
{ {
Text = preset.Symbol, Text = preset.Symbol,
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 18.5, FontSize = 20,
Foreground = btnColor, Foreground = btnColor,
HorizontalAlignment = HorizontalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
@@ -12148,13 +12156,13 @@ public partial class ChatWindow : Window
stack.Children.Add(new TextBlock stack.Children.Add(new TextBlock
{ {
Text = preset.Label, Text = preset.Label,
FontSize = 14, FontSize = 15.5,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = primaryText, Foreground = primaryText,
HorizontalAlignment = HorizontalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center,
TextAlignment = TextAlignment.Center, TextAlignment = TextAlignment.Center,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
MaxWidth = 98, MaxWidth = 112,
}); });
var hoverLabel = new Border var hoverLabel = new Border
@@ -12172,10 +12180,10 @@ public partial class ChatWindow : Window
Child = new TextBlock Child = new TextBlock
{ {
Text = preset.Description, Text = preset.Description,
FontSize = 10.5, FontSize = 11.5,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
TextTrimming = TextTrimming.CharacterEllipsis, TextTrimming = TextTrimming.CharacterEllipsis,
MaxHeight = 30, MaxHeight = 34,
Foreground = secondaryText, Foreground = secondaryText,
TextAlignment = TextAlignment.Center, TextAlignment = TextAlignment.Center,
} }
@@ -12244,8 +12252,8 @@ public partial class ChatWindow : Window
Padding = new Thickness(14, 14, 14, 12), Padding = new Thickness(14, 14, 14, 12),
Margin = new Thickness(6, 6, 6, 8), Margin = new Thickness(6, 6, 6, 8),
Cursor = Cursors.Hand, Cursor = Cursors.Hand,
Width = 132, Width = 148,
Height = 110, Height = 124,
ClipToBounds = true, ClipToBounds = true,
}; };
@@ -12258,17 +12266,17 @@ public partial class ChatWindow : Window
var etcIconCircle = new Border var etcIconCircle = new Border
{ {
Width = 42, Height = 42, Width = 46, Height = 46,
CornerRadius = new CornerRadius(21), CornerRadius = new CornerRadius(23),
Background = new SolidColorBrush(((SolidColorBrush)etcColor).Color) { Opacity = 0.15 }, Background = new SolidColorBrush(((SolidColorBrush)etcColor).Color) { Opacity = 0.15 },
HorizontalAlignment = HorizontalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center,
Margin = new Thickness(0, 0, 0, 10), Margin = new Thickness(0, 0, 0, 12),
}; };
etcIconCircle.Child = new TextBlock etcIconCircle.Child = new TextBlock
{ {
Text = "\uE70F", // Edit 아이콘 Text = "\uE70F", // Edit 아이콘
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 18.5, FontSize = 20,
Foreground = etcColor, Foreground = etcColor,
HorizontalAlignment = HorizontalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center, VerticalAlignment = VerticalAlignment.Center,
@@ -12278,7 +12286,7 @@ public partial class ChatWindow : Window
etcStack.Children.Add(new TextBlock etcStack.Children.Add(new TextBlock
{ {
Text = "기타", Text = "기타",
FontSize = 14, FontSize = 15.5,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = primaryText, Foreground = primaryText,
HorizontalAlignment = HorizontalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center,
@@ -12299,10 +12307,10 @@ public partial class ChatWindow : Window
Child = new TextBlock Child = new TextBlock
{ {
Text = "프리셋 없이 자유롭게 대화합니다", Text = "프리셋 없이 자유롭게 대화합니다",
FontSize = 10.5, FontSize = 11.5,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
TextTrimming = TextTrimming.CharacterEllipsis, TextTrimming = TextTrimming.CharacterEllipsis,
MaxHeight = 30, MaxHeight = 34,
Foreground = secondaryText, Foreground = secondaryText,
TextAlignment = TextAlignment.Center, TextAlignment = TextAlignment.Center,
} }
@@ -12334,8 +12342,8 @@ public partial class ChatWindow : Window
Padding = new Thickness(14, 14, 14, 12), Padding = new Thickness(14, 14, 14, 12),
Margin = new Thickness(6, 6, 6, 8), Margin = new Thickness(6, 6, 6, 8),
Cursor = Cursors.Hand, Cursor = Cursors.Hand,
Width = 132, Width = 148,
Height = 110, Height = 124,
ClipToBounds = true, ClipToBounds = true,
}; };
@@ -12347,17 +12355,17 @@ public partial class ChatWindow : Window
{ {
Text = "\uE710", Text = "\uE710",
FontFamily = new FontFamily("Segoe MDL2 Assets"), FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 24, FontSize = 26,
Foreground = secondaryText, Foreground = secondaryText,
HorizontalAlignment = HorizontalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center,
Margin = new Thickness(0, 10, 0, 8), Margin = new Thickness(0, 12, 0, 10),
}; };
addStack.Children.Add(plusIcon); addStack.Children.Add(plusIcon);
addStack.Children.Add(new TextBlock addStack.Children.Add(new TextBlock
{ {
Text = "프리셋 추가", Text = "프리셋 추가",
FontSize = 13, FontSize = 14.5,
FontWeight = FontWeights.SemiBold, FontWeight = FontWeights.SemiBold,
Foreground = secondaryText, Foreground = secondaryText,
HorizontalAlignment = HorizontalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center,
@@ -12378,10 +12386,10 @@ public partial class ChatWindow : Window
Child = new TextBlock Child = new TextBlock
{ {
Text = "새 작업 유형 카드를 직접 추가합니다", Text = "새 작업 유형 카드를 직접 추가합니다",
FontSize = 10.5, FontSize = 11.5,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
TextTrimming = TextTrimming.CharacterEllipsis, TextTrimming = TextTrimming.CharacterEllipsis,
MaxHeight = 30, MaxHeight = 34,
Foreground = secondaryText, Foreground = secondaryText,
TextAlignment = TextAlignment.Center, TextAlignment = TextAlignment.Center,
} }
@@ -18702,10 +18710,59 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
postCompactionUsage + postCompactionUsage +
pendingPostCompaction; 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); UpdateCircularUsageArc(TokenUsageArc, usageRatio, 18, 18, 14);
PositionThresholdMarker(TokenUsageThresholdMarker, triggerRatio, 18, 18, 14, 3); 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) private static string BuildUsageModelKey(string? service, string? model)
{ {
var normalizedService = (service ?? "").Trim().ToLowerInvariant(); var normalizedService = (service ?? "").Trim().ToLowerInvariant();