Compare commits
2 Commits
0fd6940975
...
500c8ffb06
| Author | SHA1 | Date | |
|---|---|---|---|
| 500c8ffb06 | |||
| b53af39358 |
10
README.md
10
README.md
@@ -897,6 +897,16 @@ ow + toggle 시각 언어로 통일했습니다.
|
|||||||
- 탭 래퍼 배경은 `LauncherBackground` 기준으로 바꾸고, 선택 탭은 같은 계열 배경 + 얇은 테두리가 보이도록 바꿨습니다. 라벨도 `채팅 / Cowork / 코드`로 맞춰 이전보다 읽기 쉬운 상단 내비로 정리했습니다.
|
- 탭 래퍼 배경은 `LauncherBackground` 기준으로 바꾸고, 선택 탭은 같은 계열 배경 + 얇은 테두리가 보이도록 바꿨습니다. 라벨도 `채팅 / Cowork / 코드`로 맞춰 이전보다 읽기 쉬운 상단 내비로 정리했습니다.
|
||||||
- 검증: `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:16 (KST)
|
- 업데이트: 2026-04-05 19:16 (KST)
|
||||||
|
- `claw-code`의 `StatusLine + PromptInput + Messages` 기준으로 AX Agent 보조 상태 노출을 한 단계 더 줄였습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서 `ConversationQuickStrip` 은 단순 카운트가 있을 때 자동 노출되지 않고, 사용자가 실제로 `진행 중만 보기` 또는 정렬 전환을 켰을 때만 보이도록 바꿨습니다.
|
||||||
|
- 같은 파일에서 상단 `ConversationStatusStrip` 은 `권한 대기 / 실패 / 권한 거부`만 유지하고, `queue`, `queue_blocked` 같은 보조 상태는 기본 화면에서 숨기도록 정리했습니다. Cowork/Code transcript가 queue 상태 배너로 과하게 시끄럽던 부분을 줄이기 위한 변경입니다.
|
||||||
|
- `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
|
||||||
|
- 업데이트: 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)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -4657,3 +4657,14 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
|
|||||||
- 탭 래퍼 자체도 `LauncherBackground` 기준으로 바꾸고 패딩을 늘렸으며, 상단 라벨은 `채팅 / Cowork / 코드`로 변경해 첫 번째 참고 이미지처럼 읽히는 내비 구조로 복구했습니다.
|
- 탭 래퍼 자체도 `LauncherBackground` 기준으로 바꾸고 패딩을 늘렸으며, 상단 라벨은 `채팅 / Cowork / 코드`로 변경해 첫 번째 참고 이미지처럼 읽히는 내비 구조로 복구했습니다.
|
||||||
- 검증: `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:16 (KST)
|
- 업데이트: 2026-04-05 19:16 (KST)
|
||||||
|
- `claw-code`의 `StatusLine + PromptInput + Messages` 축과 더 맞추기 위해 AX Agent 보조 상태 UI를 추가로 최소화했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `UpdateConversationQuickStripUi()` 는 단순 실행 개수/활동 개수만으로 자동 노출되지 않고, 사용자가 직접 필터나 정렬을 바꿨을 때만 보이도록 변경했습니다.
|
||||||
|
- 같은 파일의 상단 `ConversationStatusStrip` 은 `permission_waiting / failed_run / permission_denied` 세 경우만 유지하고, `queue` 및 `queue_blocked` 는 기본 transcript 상단에서 숨기도록 바꿨습니다. queue 상태는 요약 팝업/대기열 내부에서만 확인하게 정리한 것입니다.
|
||||||
|
- `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
|
||||||
|
- 업데이트: 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)
|
||||||
|
|||||||
@@ -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="" FontFamily="Segoe MDL2 Assets" FontSize="9.75"
|
<TextBlock Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="9.75"
|
<TextBlock Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="11"
|
<TextBlock Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
<TextBlock Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
<TextBlock Text="" 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=""
|
<TextBlock Text=""
|
||||||
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=""
|
<TextBlock x:Name="CategoryIcon" Text=""
|
||||||
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="" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
|
<TextBlock Text="" 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=""
|
<TextBlock x:Name="SidebarModeBadgeIcon" Text=""
|
||||||
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="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
<TextBlock Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
|
<TextBlock Grid.Column="2" Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
<TextBlock Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
<TextBlock Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
|
<TextBlock Grid.Column="2" Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="10"
|
<TextBlock Text="" 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="" FontFamily="Segoe MDL2 Assets" FontSize="8.5"
|
<TextBlock Grid.Column="2" Text="" 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"
|
||||||
|
|||||||
@@ -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();
|
||||||
@@ -9241,8 +9249,7 @@ public partial class ChatWindow : Window
|
|||||||
var showCompactStrip = !string.Equals(_activeTab, "Chat", StringComparison.OrdinalIgnoreCase)
|
var showCompactStrip = !string.Equals(_activeTab, "Chat", StringComparison.OrdinalIgnoreCase)
|
||||||
&& (string.Equals(status.StripKind, "permission_waiting", StringComparison.OrdinalIgnoreCase)
|
&& (string.Equals(status.StripKind, "permission_waiting", StringComparison.OrdinalIgnoreCase)
|
||||||
|| string.Equals(status.StripKind, "failed_run", StringComparison.OrdinalIgnoreCase)
|
|| string.Equals(status.StripKind, "failed_run", StringComparison.OrdinalIgnoreCase)
|
||||||
|| string.Equals(status.StripKind, "permission_denied", StringComparison.OrdinalIgnoreCase)
|
|| string.Equals(status.StripKind, "permission_denied", StringComparison.OrdinalIgnoreCase));
|
||||||
|| string.Equals(status.StripKind, "queue_blocked", StringComparison.OrdinalIgnoreCase));
|
|
||||||
|
|
||||||
if (!showCompactStrip)
|
if (!showCompactStrip)
|
||||||
{
|
{
|
||||||
@@ -9266,22 +9273,6 @@ public partial class ChatWindow : Window
|
|||||||
ConversationStatusStripLabel.Foreground = BrushFromHex("#991B1B");
|
ConversationStatusStripLabel.Foreground = BrushFromHex("#991B1B");
|
||||||
ConversationStatusStripLabel.Text = status.StripText;
|
ConversationStatusStripLabel.Text = status.StripText;
|
||||||
}
|
}
|
||||||
else if (string.Equals(status.StripKind, "queue", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
ConversationStatusStrip.Visibility = Visibility.Visible;
|
|
||||||
ConversationStatusStrip.Background = BrushFromHex("#F5F3FF");
|
|
||||||
ConversationStatusStrip.BorderBrush = BrushFromHex("#C4B5FD");
|
|
||||||
ConversationStatusStripLabel.Foreground = BrushFromHex("#6D28D9");
|
|
||||||
ConversationStatusStripLabel.Text = status.StripText;
|
|
||||||
}
|
|
||||||
else if (string.Equals(status.StripKind, "queue_blocked", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
ConversationStatusStrip.Visibility = Visibility.Visible;
|
|
||||||
ConversationStatusStrip.Background = BrushFromHex("#FFFBEB");
|
|
||||||
ConversationStatusStrip.BorderBrush = BrushFromHex("#FCD34D");
|
|
||||||
ConversationStatusStripLabel.Foreground = BrushFromHex("#B45309");
|
|
||||||
ConversationStatusStripLabel.Text = status.StripText;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ConversationStatusStrip.Visibility = Visibility.Collapsed;
|
ConversationStatusStrip.Visibility = Visibility.Collapsed;
|
||||||
@@ -9300,8 +9291,8 @@ public partial class ChatWindow : Window
|
|||||||
|
|
||||||
var allowQuickStrip = !string.Equals(_activeTab, "Chat", StringComparison.OrdinalIgnoreCase);
|
var allowQuickStrip = !string.Equals(_activeTab, "Chat", StringComparison.OrdinalIgnoreCase);
|
||||||
var hasQuickSignal = allowQuickStrip
|
var hasQuickSignal = allowQuickStrip
|
||||||
&& (_runningConversationCount > 0
|
&& (_runningOnlyFilter
|
||||||
|| _spotlightConversationCount > 0);
|
|| !_sortConversationsByRecent);
|
||||||
|
|
||||||
ConversationQuickStrip.Visibility = hasQuickSignal
|
ConversationQuickStrip.Visibility = hasQuickSignal
|
||||||
? Visibility.Visible
|
? Visibility.Visible
|
||||||
@@ -10343,14 +10334,8 @@ public partial class ChatWindow : Window
|
|||||||
{
|
{
|
||||||
var logLevel = _settings.Settings.Llm.AgentLogLevel;
|
var logLevel = _settings.Settings.Llm.AgentLogLevel;
|
||||||
|
|
||||||
// Planning 이벤트는 기본적으로 얇은 요약만 보이고, debug에서만 큰 카드로 펼칩니다.
|
// Planning 이벤트는 claw-code 기준으로 기본 transcript에 요약 pill만 남깁니다.
|
||||||
if (evt.Type == AgentEventType.Planning && evt.Steps is { Count: > 0 })
|
if (evt.Type == AgentEventType.Planning && evt.Steps is { Count: > 0 })
|
||||||
{
|
|
||||||
if (string.Equals(logLevel, "debug", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
AddPlanningCard(evt);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
var compactPrimaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.White;
|
var compactPrimaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.White;
|
||||||
var compactSecondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray;
|
var compactSecondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray;
|
||||||
@@ -10365,7 +10350,6 @@ public partial class ChatWindow : Window
|
|||||||
pill.Opacity = 0;
|
pill.Opacity = 0;
|
||||||
pill.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(160)));
|
pill.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(160)));
|
||||||
MessagePanel.Children.Add(pill);
|
MessagePanel.Children.Add(pill);
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -12137,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,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -12151,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,
|
||||||
@@ -12172,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
|
||||||
@@ -12196,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,
|
||||||
}
|
}
|
||||||
@@ -12268,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,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -12282,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,
|
||||||
@@ -12302,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,
|
||||||
@@ -12323,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,
|
||||||
}
|
}
|
||||||
@@ -12358,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,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -12371,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,
|
||||||
@@ -12402,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,
|
||||||
}
|
}
|
||||||
@@ -18726,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();
|
||||||
|
|||||||
Reference in New Issue
Block a user