- AX Agent 내부 설정에서 스킬/차단 탭을 도구, 스킬, 차단으로 분리하고 각 패널을 기능별로 재배치 - 공통 탭에 테마 스타일과 테마 모드를 실제 선택 카드 UI로 복구하고 기존 숨김 플레이스홀더를 제거 - 메인 설정 좌측의 AX Agent 이동 항목을 맨 아래로 재배치하고 README 및 DEVELOPMENT 문서 이력을 2026-04-05 15:06 (KST) 기준으로 갱신 - 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ / 경고 0 오류 0
This commit is contained in:
@@ -788,8 +788,10 @@ ow + toggle 시각 언어로 통일했습니다.
|
|||||||
- 대화 목록 행 카드와 축소 아이콘 바도 같은 시각 언어로 더 정리했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddConversationItem(...)`에서 선택 강조 배경과 좌측 액센트 바 두께를 더 얇게 줄이고, 행 패딩/아이콘/폰트/배지 크기를 전반적으로 낮춰 `claw-code`처럼 목록 자체가 먼저 튀지 않도록 정리했습니다.
|
- 대화 목록 행 카드와 축소 아이콘 바도 같은 시각 언어로 더 정리했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddConversationItem(...)`에서 선택 강조 배경과 좌측 액센트 바 두께를 더 얇게 줄이고, 행 패딩/아이콘/폰트/배지 크기를 전반적으로 낮춰 `claw-code`처럼 목록 자체가 먼저 튀지 않도록 정리했습니다.
|
||||||
- `진행 중`, `성공`, `실패` 배지와 실행 요약 텍스트도 더 작고 중립적인 톤으로 줄였고, 호버 시 확대 애니메이션은 제거해 목록이 더 차분하게 반응하도록 맞췄습니다. 편집 버튼도 더 작은 규격과 낮은 opacity를 써서 필요할 때만 보조 액션으로 보이게 조정했습니다.
|
- `진행 중`, `성공`, `실패` 배지와 실행 요약 텍스트도 더 작고 중립적인 톤으로 줄였고, 호버 시 확대 애니메이션은 제거해 목록이 더 차분하게 반응하도록 맞췄습니다. 편집 버튼도 더 작은 규격과 낮은 opacity를 써서 필요할 때만 보조 액션으로 보이게 조정했습니다.
|
||||||
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml)의 축소 아이콘 바는 상하 행 높이, 버튼 패딩, 아이콘 크기, 사용자 배지 크기를 한 단계 더 줄여 현재 사이드바와 같은 밀도로 묶었습니다. 이제 축소 상태에서도 검색/필터/새 대화 아이콘이 더 균일한 간격으로 정리되고, 하단 사용자 배지도 과하게 튀지 않는 중립형으로 유지됩니다.
|
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml)의 축소 아이콘 바는 상하 행 높이, 버튼 패딩, 아이콘 크기, 사용자 배지 크기를 한 단계 더 줄여 현재 사이드바와 같은 밀도로 묶었습니다. 이제 축소 상태에서도 검색/필터/새 대화 아이콘이 더 균일한 간격으로 정리되고, 하단 사용자 배지도 과하게 튀지 않는 중립형으로 유지됩니다.
|
||||||
|
- AX Agent 내부 설정 탭도 다시 정리했습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml), [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서 사라졌던 `테마 스타일`, `테마 모드`를 `공통` 탭에 실제 선택 카드로 복구했고, 기존 `스킬/차단` 탭은 `도구 / 스킬 / 차단`으로 나눠 각 항목이 맞는 탭에서만 보이게 재배치했습니다.
|
||||||
|
- 이제 `도구` 탭에서는 훅과 도구/커넥터 목록을, `스킬` 탭에서는 스킬 폴더, 슬래시 설정, 드래그 앤 드롭, 로드된 스킬, 폴백 모델, MCP 서버를, `차단` 탭에서는 차단 경로/확장자만 관리합니다. 같이 [SettingsWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml.cs) 에서 메인 설정의 `AX Agent` 바로가기 탭을 좌측 사이드바 맨 아래로 재배치했습니다.
|
||||||
- 검증: `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 14:57 (KST)
|
- 업데이트: 2026-04-05 15:06 (KST)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -4555,3 +4555,8 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
|
|||||||
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml)의 축소 아이콘 바는 상하 row 높이와 버튼 규격, 아이콘 크기, 사용자 배지 크기를 함께 줄여 현재 사이드바 헤더/하단 계정 영역과 같은 밀도로 묶었습니다.
|
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml)의 축소 아이콘 바는 상하 row 높이와 버튼 규격, 아이콘 크기, 사용자 배지 크기를 함께 줄여 현재 사이드바 헤더/하단 계정 영역과 같은 밀도로 묶었습니다.
|
||||||
- 검증: `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 14:57 (KST)
|
- 업데이트: 2026-04-05 14:57 (KST)
|
||||||
|
- AX Agent 내부 설정 탭 구조도 다시 나눴습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 의 좌측 네비에서 기존 `스킬/차단`을 `도구 / 스킬 / 차단`으로 분리했고, [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `SetOverlaySection(...)` 가시성 로직도 각 탭에 맞는 패널만 보이도록 재구성했습니다.
|
||||||
|
- `공통` 탭에는 숨겨져 있던 `테마 스타일`, `테마 모드`를 실제 선택 카드로 복구했고, `도구` 탭에는 훅/도구 커넥터 목록, `스킬` 탭에는 스킬 폴더/슬래시/로드된 스킬/폴백 모델/MCP 서버, `차단` 탭에는 차단 경로와 확장자만 남도록 분리했습니다.
|
||||||
|
- 메인 설정 쪽은 [SettingsWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml.cs) 에서 `AgentShortcutTabItem`을 `MainSettingsTab` 맨 끝으로 다시 추가해, AX Agent 이동 항목이 좌측 사이드바 맨 아래에 오도록 정리했습니다.
|
||||||
|
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0
|
||||||
|
- 업데이트: 2026-04-05 15:06 (KST)
|
||||||
|
|||||||
@@ -2481,22 +2481,30 @@
|
|||||||
Margin="0,4,0,0"
|
Margin="0,4,0,0"
|
||||||
Checked="OverlayNav_Checked"
|
Checked="OverlayNav_Checked"
|
||||||
Tag="dev"/>
|
Tag="dev"/>
|
||||||
<RadioButton x:Name="OverlayNavTools"
|
<RadioButton x:Name="OverlayNavTools"
|
||||||
Content="도구"
|
Content="도구"
|
||||||
|
GroupName="OverlayNav"
|
||||||
|
Style="{StaticResource SettingsNavBtn}"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Margin="0,4,0,0"
|
||||||
|
Checked="OverlayNav_Checked"
|
||||||
|
Tag="tools"/>
|
||||||
|
<RadioButton x:Name="OverlayNavSkill"
|
||||||
|
Content="스킬"
|
||||||
GroupName="OverlayNav"
|
GroupName="OverlayNav"
|
||||||
Style="{StaticResource SettingsNavBtn}"
|
Style="{StaticResource SettingsNavBtn}"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
Margin="0,4,0,0"
|
Margin="0,4,0,0"
|
||||||
Checked="OverlayNav_Checked"
|
Checked="OverlayNav_Checked"
|
||||||
Tag="tools"/>
|
Tag="skill"/>
|
||||||
<RadioButton x:Name="OverlayNavEtc"
|
<RadioButton x:Name="OverlayNavBlock"
|
||||||
Content="스킬/차단"
|
Content="차단"
|
||||||
GroupName="OverlayNav"
|
GroupName="OverlayNav"
|
||||||
Style="{StaticResource SettingsNavBtn}"
|
Style="{StaticResource SettingsNavBtn}"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
Margin="0,4,0,0"
|
Margin="0,4,0,0"
|
||||||
Checked="OverlayNav_Checked"
|
Checked="OverlayNav_Checked"
|
||||||
Tag="etc"/>
|
Tag="block"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
<ScrollViewer Grid.Row="0" Grid.RowSpan="2" Grid.Column="1"
|
<ScrollViewer Grid.Row="0" Grid.RowSpan="2" Grid.Column="1"
|
||||||
@@ -2953,21 +2961,105 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
<StackPanel x:Name="OverlayThemeStylePanel"
|
<StackPanel x:Name="OverlayThemeStylePanel"
|
||||||
Visibility="Collapsed"
|
Visibility="Collapsed"
|
||||||
Height="0"
|
Margin="0,0,0,12">
|
||||||
Margin="0"
|
<TextBlock Text="테마 스타일"
|
||||||
IsHitTestVisible="False">
|
FontSize="12.5"
|
||||||
<Border x:Name="OverlayThemeStyleClawCard"/>
|
FontWeight="SemiBold"
|
||||||
<Border x:Name="OverlayThemeStyleCodexCard"/>
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
<Border x:Name="OverlayThemeStyleSlateCard"/>
|
<TextBlock Text="AX Agent 전용 시각 언어를 고릅니다. 채팅 본문과 설정 카드 모두 같은 스타일로 바뀝니다."
|
||||||
|
Margin="0,4,0,8"
|
||||||
|
FontSize="11"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"/>
|
||||||
|
<WrapPanel>
|
||||||
|
<Border x:Name="OverlayThemeStyleClawCard"
|
||||||
|
Cursor="Hand"
|
||||||
|
CornerRadius="8"
|
||||||
|
BorderThickness="1"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
Padding="10,7"
|
||||||
|
Margin="0,0,8,8"
|
||||||
|
MouseLeftButtonUp="OverlayThemeStyleClawCard_MouseLeftButtonUp">
|
||||||
|
<TextBlock Text="Claw"
|
||||||
|
FontSize="12"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="OverlayThemeStyleCodexCard"
|
||||||
|
Cursor="Hand"
|
||||||
|
CornerRadius="8"
|
||||||
|
BorderThickness="1"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
Padding="10,7"
|
||||||
|
Margin="0,0,8,8"
|
||||||
|
MouseLeftButtonUp="OverlayThemeStyleCodexCard_MouseLeftButtonUp">
|
||||||
|
<TextBlock Text="Codex"
|
||||||
|
FontSize="12"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="OverlayThemeStyleSlateCard"
|
||||||
|
Cursor="Hand"
|
||||||
|
CornerRadius="8"
|
||||||
|
BorderThickness="1"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
Padding="10,7"
|
||||||
|
Margin="0,0,8,8"
|
||||||
|
MouseLeftButtonUp="OverlayThemeStyleSlateCard_MouseLeftButtonUp">
|
||||||
|
<TextBlock Text="Slate"
|
||||||
|
FontSize="12"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
</Border>
|
||||||
|
</WrapPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel x:Name="OverlayThemePanel"
|
<StackPanel x:Name="OverlayThemePanel"
|
||||||
Visibility="Collapsed"
|
Visibility="Collapsed"
|
||||||
Height="0"
|
Margin="0,0,0,12">
|
||||||
Margin="0"
|
<TextBlock Text="테마 모드"
|
||||||
IsHitTestVisible="False">
|
FontSize="12.5"
|
||||||
<Border x:Name="OverlayThemeSystemCard"/>
|
FontWeight="SemiBold"
|
||||||
<Border x:Name="OverlayThemeLightCard"/>
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
<Border x:Name="OverlayThemeDarkCard"/>
|
<TextBlock Text="시스템 테마를 따르거나, AX Agent만 별도로 라이트/다크 모드로 고정할 수 있습니다."
|
||||||
|
Margin="0,4,0,8"
|
||||||
|
FontSize="11"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"/>
|
||||||
|
<WrapPanel>
|
||||||
|
<Border x:Name="OverlayThemeSystemCard"
|
||||||
|
Cursor="Hand"
|
||||||
|
CornerRadius="8"
|
||||||
|
BorderThickness="1"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
Padding="10,7"
|
||||||
|
Margin="0,0,8,8"
|
||||||
|
MouseLeftButtonUp="OverlayThemeSystemCard_MouseLeftButtonUp">
|
||||||
|
<TextBlock Text="System"
|
||||||
|
FontSize="12"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="OverlayThemeLightCard"
|
||||||
|
Cursor="Hand"
|
||||||
|
CornerRadius="8"
|
||||||
|
BorderThickness="1"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
Padding="10,7"
|
||||||
|
Margin="0,0,8,8"
|
||||||
|
MouseLeftButtonUp="OverlayThemeLightCard_MouseLeftButtonUp">
|
||||||
|
<TextBlock Text="Light"
|
||||||
|
FontSize="12"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="OverlayThemeDarkCard"
|
||||||
|
Cursor="Hand"
|
||||||
|
CornerRadius="8"
|
||||||
|
BorderThickness="1"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
Padding="10,7"
|
||||||
|
Margin="0,0,8,8"
|
||||||
|
MouseLeftButtonUp="OverlayThemeDarkCard_MouseLeftButtonUp">
|
||||||
|
<TextBlock Text="Dark"
|
||||||
|
FontSize="12"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
</Border>
|
||||||
|
</WrapPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Grid x:Name="OverlayDefaultOutputFormatRow" Margin="0,0,0,8">
|
<Grid x:Name="OverlayDefaultOutputFormatRow" Margin="0,0,0,8">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
@@ -4715,7 +4807,7 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
<StackPanel x:Name="OverlayHookListPanel"/>
|
<StackPanel x:Name="OverlayHookListPanel"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Border x:Name="OverlayEtcInfoPanel"
|
<Border x:Name="OverlaySkillInfoPanel"
|
||||||
Visibility="Collapsed"
|
Visibility="Collapsed"
|
||||||
Background="{DynamicResource ItemBackground}"
|
Background="{DynamicResource ItemBackground}"
|
||||||
BorderBrush="{DynamicResource BorderColor}"
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
@@ -4724,7 +4816,7 @@
|
|||||||
Padding="14,12"
|
Padding="14,12"
|
||||||
Margin="0,14,0,0">
|
Margin="0,14,0,0">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Text="스킬/차단 설명"
|
<TextBlock Text="스킬 설명"
|
||||||
FontSize="12.5"
|
FontSize="12.5"
|
||||||
FontWeight="SemiBold"
|
FontWeight="SemiBold"
|
||||||
Foreground="{DynamicResource PrimaryText}"/>
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
@@ -4750,9 +4842,35 @@
|
|||||||
</TextBlock>
|
</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
<StackPanel x:Name="OverlayEtcRuntimePanel"
|
<Border x:Name="OverlayBlockInfoPanel"
|
||||||
Visibility="Collapsed"
|
Visibility="Collapsed"
|
||||||
Margin="0,14,0,0">
|
Background="{DynamicResource ItemBackground}"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="12"
|
||||||
|
Padding="14,12"
|
||||||
|
Margin="0,14,0,0">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Text="차단 설명"
|
||||||
|
FontSize="12.5"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
<TextBlock Text="차단 탭에서는 에이전트가 접근하거나 수정하면 안 되는 경로와 파일 형식을 확인합니다."
|
||||||
|
Margin="0,4,0,10"
|
||||||
|
FontSize="11"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"/>
|
||||||
|
<TextBlock FontSize="11.5"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Foreground="{DynamicResource PrimaryText}">
|
||||||
|
시스템 보호 경로와 실행 위험이 높은 형식은 기본값으로 막아 둡니다.
|
||||||
|
<LineBreak/>운영 정책에 맞춰 차단 기준을 검토할 때 이 탭을 확인하면 됩니다.
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<StackPanel x:Name="OverlayBlockRuntimePanel"
|
||||||
|
Visibility="Collapsed"
|
||||||
|
Margin="0,14,0,0">
|
||||||
<TextBlock Text="에이전트 접근 차단"
|
<TextBlock Text="에이전트 접근 차단"
|
||||||
FontSize="12.5"
|
FontSize="12.5"
|
||||||
FontWeight="SemiBold"
|
FontWeight="SemiBold"
|
||||||
@@ -4794,6 +4912,10 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel x:Name="OverlaySkillRuntimePanel"
|
||||||
|
Visibility="Collapsed"
|
||||||
|
Margin="0,14,0,0">
|
||||||
<TextBlock Text="스킬 설정"
|
<TextBlock Text="스킬 설정"
|
||||||
FontSize="12.5"
|
FontSize="12.5"
|
||||||
FontWeight="SemiBold"
|
FontWeight="SemiBold"
|
||||||
@@ -5052,7 +5174,10 @@
|
|||||||
Margin="0,8,0,14">
|
Margin="0,8,0,14">
|
||||||
<StackPanel x:Name="OverlayMcpServerListPanel"/>
|
<StackPanel x:Name="OverlayMcpServerListPanel"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel x:Name="OverlayToolRegistrySection"
|
||||||
|
Visibility="Collapsed"
|
||||||
|
Margin="0,14,0,0">
|
||||||
<TextBlock Text="등록된 도구/커넥터"
|
<TextBlock Text="등록된 도구/커넥터"
|
||||||
FontSize="12.5"
|
FontSize="12.5"
|
||||||
FontWeight="SemiBold"
|
FontWeight="SemiBold"
|
||||||
|
|||||||
@@ -15214,7 +15214,8 @@ public partial class ChatWindow : Window
|
|||||||
var showCode = section == "code";
|
var showCode = section == "code";
|
||||||
var showDev = section == "dev";
|
var showDev = section == "dev";
|
||||||
var showTools = section == "tools";
|
var showTools = section == "tools";
|
||||||
var showEtc = section == "etc";
|
var showSkill = section == "skill";
|
||||||
|
var showBlock = section == "block";
|
||||||
|
|
||||||
OverlaySectionService.Visibility = showBasic ? Visibility.Visible : Visibility.Collapsed;
|
OverlaySectionService.Visibility = showBasic ? Visibility.Visible : Visibility.Collapsed;
|
||||||
OverlaySectionQuick.Visibility = showShared || showCowork || showCode ? Visibility.Visible : Visibility.Collapsed;
|
OverlaySectionQuick.Visibility = showShared || showCowork || showCode ? Visibility.Visible : Visibility.Collapsed;
|
||||||
@@ -15228,7 +15229,8 @@ public partial class ChatWindow : Window
|
|||||||
"code" => "코드 설정",
|
"code" => "코드 설정",
|
||||||
"dev" => "개발자 설정",
|
"dev" => "개발자 설정",
|
||||||
"tools" => "도구 설정",
|
"tools" => "도구 설정",
|
||||||
"etc" => "스킬/차단 설정",
|
"skill" => "스킬 설정",
|
||||||
|
"block" => "차단 설정",
|
||||||
_ => "공통 설정"
|
_ => "공통 설정"
|
||||||
};
|
};
|
||||||
var headingDescription = section switch
|
var headingDescription = section switch
|
||||||
@@ -15239,7 +15241,8 @@ public partial class ChatWindow : Window
|
|||||||
"code" => "코드 작업, 검증, 개발 도구 사용에 맞춘 설정입니다.",
|
"code" => "코드 작업, 검증, 개발 도구 사용에 맞춘 설정입니다.",
|
||||||
"dev" => "실행 이력, 감사, 시각화 같은 개발자용 설정입니다.",
|
"dev" => "실행 이력, 감사, 시각화 같은 개발자용 설정입니다.",
|
||||||
"tools" => "AX Agent가 사용할 도구와 훅 동작을 관리합니다.",
|
"tools" => "AX Agent가 사용할 도구와 훅 동작을 관리합니다.",
|
||||||
"etc" => "스킬 로드와 차단 규칙, 보조 연결을 관리합니다.",
|
"skill" => "슬래시 스킬, 스킬 폴더, 폴백 모델, MCP 연결을 관리합니다.",
|
||||||
|
"block" => "에이전트가 접근하거나 수정하면 안 되는 경로와 형식을 관리합니다.",
|
||||||
_ => "Chat, Cowork, Code에서 공통으로 쓰는 기본 설정입니다."
|
_ => "Chat, Cowork, Code에서 공통으로 쓰는 기본 설정입니다."
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -15289,19 +15292,25 @@ public partial class ChatWindow : Window
|
|||||||
if (OverlayDeveloperExtraPanel != null)
|
if (OverlayDeveloperExtraPanel != null)
|
||||||
OverlayDeveloperExtraPanel.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed;
|
OverlayDeveloperExtraPanel.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayAdvancedTogglePanel != null)
|
if (OverlayAdvancedTogglePanel != null)
|
||||||
OverlayAdvancedTogglePanel.Visibility = showDev || showCowork || showCode || showTools || showEtc ? Visibility.Visible : Visibility.Collapsed;
|
OverlayAdvancedTogglePanel.Visibility = showDev || showCowork || showCode || showTools || showSkill ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayToolsInfoPanel != null)
|
if (OverlayToolsInfoPanel != null)
|
||||||
OverlayToolsInfoPanel.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToolsInfoPanel.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayToolsRuntimePanel != null)
|
if (OverlayToolsRuntimePanel != null)
|
||||||
OverlayToolsRuntimePanel.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToolsRuntimePanel.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayEtcInfoPanel != null)
|
if (OverlayToolRegistrySection != null)
|
||||||
OverlayEtcInfoPanel.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToolRegistrySection.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayEtcRuntimePanel != null)
|
if (OverlaySkillInfoPanel != null)
|
||||||
OverlayEtcRuntimePanel.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed;
|
OverlaySkillInfoPanel.Visibility = showSkill ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
if (OverlaySkillRuntimePanel != null)
|
||||||
|
OverlaySkillRuntimePanel.Visibility = showSkill ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
if (OverlayBlockInfoPanel != null)
|
||||||
|
OverlayBlockInfoPanel.Visibility = showBlock ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
if (OverlayBlockRuntimePanel != null)
|
||||||
|
OverlayBlockRuntimePanel.Visibility = showBlock ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayToggleProactiveCompact != null)
|
if (OverlayToggleProactiveCompact != null)
|
||||||
OverlayToggleProactiveCompact.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToggleProactiveCompact.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayToggleSkillSystem != null)
|
if (OverlayToggleSkillSystem != null)
|
||||||
OverlayToggleSkillSystem.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToggleSkillSystem.Visibility = showSkill ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayToggleToolHooks != null)
|
if (OverlayToggleToolHooks != null)
|
||||||
OverlayToggleToolHooks.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToggleToolHooks.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayToggleHookInputMutation != null)
|
if (OverlayToggleHookInputMutation != null)
|
||||||
@@ -15317,9 +15326,9 @@ public partial class ChatWindow : Window
|
|||||||
if (OverlayToggleParallelTools != null)
|
if (OverlayToggleParallelTools != null)
|
||||||
OverlayToggleParallelTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToggleParallelTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayToggleProjectRules != null)
|
if (OverlayToggleProjectRules != null)
|
||||||
OverlayToggleProjectRules.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToggleProjectRules.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayToggleAgentMemory != null)
|
if (OverlayToggleAgentMemory != null)
|
||||||
OverlayToggleAgentMemory.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToggleAgentMemory.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayTogglePlanModeTools != null)
|
if (OverlayTogglePlanModeTools != null)
|
||||||
OverlayTogglePlanModeTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed;
|
OverlayTogglePlanModeTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (OverlayToggleWorktreeTools != null)
|
if (OverlayToggleWorktreeTools != null)
|
||||||
@@ -15329,7 +15338,7 @@ public partial class ChatWindow : Window
|
|||||||
if (OverlayToggleCronTools != null)
|
if (OverlayToggleCronTools != null)
|
||||||
OverlayToggleCronTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed;
|
OverlayToggleCronTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
|
||||||
if (showTools || showEtc)
|
if (showTools || showSkill || showBlock)
|
||||||
RefreshOverlayEtcPanels();
|
RefreshOverlayEtcPanels();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,14 @@ public partial class SettingsWindow : Window
|
|||||||
_revertCallback = revertCallback;
|
_revertCallback = revertCallback;
|
||||||
DataContext = vm;
|
DataContext = vm;
|
||||||
|
|
||||||
|
if (MainSettingsTab != null && AgentTabItem != null && MainSettingsTab.Items.Contains(AgentTabItem))
|
||||||
|
MainSettingsTab.Items.Remove(AgentTabItem);
|
||||||
|
if (MainSettingsTab != null && AgentShortcutTabItem != null && MainSettingsTab.Items.Contains(AgentShortcutTabItem))
|
||||||
|
{
|
||||||
|
MainSettingsTab.Items.Remove(AgentShortcutTabItem);
|
||||||
|
MainSettingsTab.Items.Add(AgentShortcutTabItem);
|
||||||
|
}
|
||||||
|
|
||||||
vm.ThemePreviewRequested += (_, _) => _previewCallback(vm.SelectedThemeKey);
|
vm.ThemePreviewRequested += (_, _) => _previewCallback(vm.SelectedThemeKey);
|
||||||
vm.SaveCompleted += (_, _) =>
|
vm.SaveCompleted += (_, _) =>
|
||||||
{
|
{
|
||||||
@@ -60,8 +68,11 @@ public partial class SettingsWindow : Window
|
|||||||
BuildQuoteCategoryCheckboxes();
|
BuildQuoteCategoryCheckboxes();
|
||||||
BuildDockBarSettings();
|
BuildDockBarSettings();
|
||||||
BuildTextActionCommandsPanel();
|
BuildTextActionCommandsPanel();
|
||||||
MoveBlockSectionToEtc();
|
if (HasLegacyAgentTab())
|
||||||
BuildServiceModelPanels();
|
{
|
||||||
|
MoveBlockSectionToEtc();
|
||||||
|
BuildServiceModelPanels();
|
||||||
|
}
|
||||||
|
|
||||||
// 스킬이 아직 로드되지 않았으면 백그라운드에서 로드 후 UI 구성
|
// 스킬이 아직 로드되지 않았으면 백그라운드에서 로드 후 UI 구성
|
||||||
var app = System.Windows.Application.Current as App;
|
var app = System.Windows.Application.Current as App;
|
||||||
@@ -76,8 +87,11 @@ public partial class SettingsWindow : Window
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildToolRegistryPanel();
|
if (HasLegacyAgentTab())
|
||||||
LoadAdvancedSettings();
|
{
|
||||||
|
BuildToolRegistryPanel();
|
||||||
|
LoadAdvancedSettings();
|
||||||
|
}
|
||||||
RefreshStorageInfo();
|
RefreshStorageInfo();
|
||||||
// 개발자 모드는 저장된 설정 유지 (끄면 하위 기능 모두 비활성)
|
// 개발자 모드는 저장된 설정 유지 (끄면 하위 기능 모두 비활성)
|
||||||
UpdateDevModeContentVisibility();
|
UpdateDevModeContentVisibility();
|
||||||
@@ -85,10 +99,14 @@ public partial class SettingsWindow : Window
|
|||||||
ApplyAiEnabledState(app?.SettingsService?.Settings.AiEnabled ?? false, init: true);
|
ApplyAiEnabledState(app?.SettingsService?.Settings.AiEnabled ?? false, init: true);
|
||||||
ApplyOperationModeState(app?.SettingsService?.Settings.OperationMode);
|
ApplyOperationModeState(app?.SettingsService?.Settings.OperationMode);
|
||||||
InitializeDisplayModeUi();
|
InitializeDisplayModeUi();
|
||||||
SyncAgentSelectionCards();
|
if (HasLegacyAgentTab())
|
||||||
|
SyncAgentSelectionCards();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool HasLegacyAgentTab()
|
||||||
|
=> MainSettingsTab != null && AgentTabItem != null && MainSettingsTab.Items.Contains(AgentTabItem);
|
||||||
|
|
||||||
private void SyncAgentSelectionCards()
|
private void SyncAgentSelectionCards()
|
||||||
{
|
{
|
||||||
var service = (_vm.LlmService ?? "").Trim().ToLowerInvariant();
|
var service = (_vm.LlmService ?? "").Trim().ToLowerInvariant();
|
||||||
@@ -139,8 +157,9 @@ public partial class SettingsWindow : Window
|
|||||||
private void InitializeDisplayModeUi()
|
private void InitializeDisplayModeUi()
|
||||||
{
|
{
|
||||||
var app = System.Windows.Application.Current as App;
|
var app = System.Windows.Application.Current as App;
|
||||||
var saved = app?.SettingsService?.Settings?.Llm?.AgentUiExpressionLevel;
|
if (app?.SettingsService?.Settings?.Llm != null)
|
||||||
SetDisplayMode(saved ?? "balanced", persist: false);
|
app.SettingsService.Settings.Llm.AgentUiExpressionLevel = "rich";
|
||||||
|
SetDisplayMode("rich", persist: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisplayMode_Checked(object sender, RoutedEventArgs e)
|
private void DisplayMode_Checked(object sender, RoutedEventArgs e)
|
||||||
@@ -159,14 +178,7 @@ public partial class SettingsWindow : Window
|
|||||||
private void AgentDisplayMode_Checked(object sender, RoutedEventArgs e)
|
private void AgentDisplayMode_Checked(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (_isDisplayModeSyncing) return;
|
if (_isDisplayModeSyncing) return;
|
||||||
var rb = sender as RadioButton;
|
SetDisplayMode("rich", persist: true);
|
||||||
var next = rb?.Name switch
|
|
||||||
{
|
|
||||||
"AgentDisplayModeRich" => "rich",
|
|
||||||
"AgentDisplayModeSimple" => "simple",
|
|
||||||
_ => "balanced",
|
|
||||||
};
|
|
||||||
SetDisplayMode(next, persist: true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetDisplayMode(string mode, bool persist)
|
private void SetDisplayMode(string mode, bool persist)
|
||||||
@@ -195,7 +207,8 @@ public partial class SettingsWindow : Window
|
|||||||
}
|
}
|
||||||
|
|
||||||
ApplyMainTabVisibility(mode);
|
ApplyMainTabVisibility(mode);
|
||||||
ApplyAgentSubTabVisibility(mode);
|
if (HasLegacyAgentTab())
|
||||||
|
ApplyAgentSubTabVisibility(mode);
|
||||||
|
|
||||||
if (!persist) return;
|
if (!persist) return;
|
||||||
var app = System.Windows.Application.Current as App;
|
var app = System.Windows.Application.Current as App;
|
||||||
@@ -210,11 +223,11 @@ public partial class SettingsWindow : Window
|
|||||||
|
|
||||||
var simpleKeep = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
var simpleKeep = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
||||||
{
|
{
|
||||||
"일반", "테마", "기능", "AX Agent"
|
"일반", "테마", "기능"
|
||||||
};
|
};
|
||||||
var balancedKeep = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
var balancedKeep = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
||||||
{
|
{
|
||||||
"일반", "테마", "클립보드", "캡처", "시스템", "기능", "AX Agent"
|
"일반", "테마", "클립보드", "캡처", "시스템", "기능"
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach (var item in MainSettingsTab.Items.OfType<TabItem>())
|
foreach (var item in MainSettingsTab.Items.OfType<TabItem>())
|
||||||
@@ -229,12 +242,6 @@ public partial class SettingsWindow : Window
|
|||||||
|
|
||||||
if (string.Equals(header, "알림", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(header, "알림", StringComparison.OrdinalIgnoreCase))
|
||||||
visible = false;
|
visible = false;
|
||||||
if (string.Equals(header, "AX Agent", StringComparison.OrdinalIgnoreCase)
|
|
||||||
&& !((System.Windows.Application.Current as App)?.SettingsService?.Settings.AiEnabled ?? false))
|
|
||||||
{
|
|
||||||
visible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
item.Visibility = visible ? Visibility.Visible : Visibility.Collapsed;
|
item.Visibility = visible ? Visibility.Visible : Visibility.Collapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2583,31 +2590,12 @@ public partial class SettingsWindow : Window
|
|||||||
/// <summary>AI 기능 토글 상태를 UI와 설정에 반영합니다.</summary>
|
/// <summary>AI 기능 토글 상태를 UI와 설정에 반영합니다.</summary>
|
||||||
private void ApplyAiEnabledState(bool enabled, bool init = false)
|
private void ApplyAiEnabledState(bool enabled, bool init = false)
|
||||||
{
|
{
|
||||||
// 토글 스위치 체크 상태 동기화 (init 시에는 이벤트 억제)
|
|
||||||
if (AiEnabledToggle != null && AiEnabledToggle.IsChecked != enabled)
|
|
||||||
{
|
|
||||||
AiEnabledToggle.IsChecked = enabled;
|
|
||||||
}
|
|
||||||
if (AgentAiEnabledToggle != null && AgentAiEnabledToggle.IsChecked != enabled)
|
|
||||||
{
|
|
||||||
AgentAiEnabledToggle.IsChecked = enabled;
|
|
||||||
}
|
|
||||||
if (AgentTabItem != null)
|
|
||||||
AgentTabItem.Visibility = enabled ? Visibility.Visible : Visibility.Collapsed;
|
|
||||||
|
|
||||||
ApplyMainTabVisibility(NormalizeDisplayMode((System.Windows.Application.Current as App)?.SettingsService?.Settings?.Llm?.AgentUiExpressionLevel));
|
ApplyMainTabVisibility(NormalizeDisplayMode((System.Windows.Application.Current as App)?.SettingsService?.Settings?.Llm?.AgentUiExpressionLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SelectAgentSettingsTab()
|
public void SelectAgentSettingsTab()
|
||||||
{
|
{
|
||||||
if (AgentTabItem == null || MainSettingsTab == null || AgentTabItem.Visibility != Visibility.Visible)
|
OpenAgentSettingsShortcut(closeAfterOpen: false);
|
||||||
return;
|
|
||||||
|
|
||||||
MainSettingsTab.SelectedItem = AgentTabItem;
|
|
||||||
if (AgentTabCommon != null)
|
|
||||||
AgentTabCommon.IsChecked = true;
|
|
||||||
AgentSubTab_Checked(this, new RoutedEventArgs());
|
|
||||||
Activate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BtnAgentSettingsBack_Click(object sender, RoutedEventArgs e)
|
private void BtnAgentSettingsBack_Click(object sender, RoutedEventArgs e)
|
||||||
@@ -2625,13 +2613,32 @@ public partial class SettingsWindow : Window
|
|||||||
|
|
||||||
private void BtnAgentShortcut_Click(object sender, RoutedEventArgs e)
|
private void BtnAgentShortcut_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
SelectAgentSettingsTab();
|
OpenAgentSettingsShortcut(closeAfterOpen: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainSettingsTab_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (MainSettingsTab?.SelectedItem is not TabItem selected)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!ReferenceEquals(selected, AgentShortcutTabItem))
|
||||||
|
return;
|
||||||
|
|
||||||
|
OpenAgentSettingsShortcut(closeAfterOpen: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OpenAgentSettingsShortcut(bool closeAfterOpen)
|
||||||
|
{
|
||||||
|
var app = System.Windows.Application.Current as App;
|
||||||
|
app?.OpenAgentSettingsInChat();
|
||||||
|
|
||||||
|
if (closeAfterOpen)
|
||||||
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ApplyOperationModeState(string? mode)
|
private void ApplyOperationModeState(string? mode)
|
||||||
{
|
{
|
||||||
var normalized = OperationModePolicy.Normalize(mode);
|
var normalized = OperationModePolicy.Normalize(mode);
|
||||||
SyncOperationModeCombo(OperationModeCombo, normalized);
|
|
||||||
if (AgentOperationModeInternal != null) AgentOperationModeInternal.IsChecked = normalized == OperationModePolicy.InternalMode;
|
if (AgentOperationModeInternal != null) AgentOperationModeInternal.IsChecked = normalized == OperationModePolicy.InternalMode;
|
||||||
if (AgentOperationModeExternal != null) AgentOperationModeExternal.IsChecked = normalized == OperationModePolicy.ExternalMode;
|
if (AgentOperationModeExternal != null) AgentOperationModeExternal.IsChecked = normalized == OperationModePolicy.ExternalMode;
|
||||||
}
|
}
|
||||||
@@ -2833,7 +2840,6 @@ public partial class SettingsWindow : Window
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 취소/실패 ? 토글 원상복구
|
// 취소/실패 ? 토글 원상복구
|
||||||
if (AiEnabledToggle != null) AiEnabledToggle.IsChecked = false;
|
|
||||||
if (AgentAiEnabledToggle != null) AgentAiEnabledToggle.IsChecked = false;
|
if (AgentAiEnabledToggle != null) AgentAiEnabledToggle.IsChecked = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user