AX Agent 폴더 데이터 활용 사용자 옵션 제거 및 자동 정책 고정
Some checks are pending
Release Gate / gate (push) Waiting to run
Some checks are pending
Release Gate / gate (push) Waiting to run
- 코워크/코드의 폴더 내 문서 활용을 사용자 설정에서 제거하고 탭별 자동 정책으로 고정 - ChatWindow 하단 데이터 활용 버튼과 AX Agent 내부 설정 row, 메인 설정/구형 설정창의 관련 UI 제거 - Chat/Cowork/Code 탭별 자동 데이터 활용 정책을 none/passive/active로 고정하고 저장 경로에서 사용자 선택값 반영 제거 - README와 DEVELOPMENT 문서에 변경 이력 및 적용 기준 반영 - 검증: 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:
@@ -1117,3 +1117,6 @@ MIT License
|
||||
- AX Agent transcript 품질 향상을 위해 렌더 책임을 실제로 분리했다. [ChatWindow.InlineInteractions.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.InlineInteractions.cs), [ChatWindow.TaskSummary.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.TaskSummary.cs)를 추가해 `의견 요청`, `계획 승인`, `작업 요약` UI 로직을 메인 [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)에서 분리했다.
|
||||
- [PermissionRequestPresentationCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/PermissionRequestPresentationCatalog.cs), [ToolResultPresentationCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ToolResultPresentationCatalog.cs)를 추가해 권한 요청과 도구 결과를 `명령/네트워크/파일`, `성공/실패/거부/취소` 기준으로 나눠 transcript badge에 재사용하도록 정리했다.
|
||||
- [AppStateService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/AppStateService.cs)에 `OperationalStatusPresentationState`와 `GetOperationalStatusPresentation(...)`을 추가해 status/runtime summary 계산을 전용 요약 모델로 한 번 더 계층화했다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 상태선 갱신은 이제 이 presentation summary를 소비한다.
|
||||
- 업데이트: 2026-04-06 01:12 (KST)
|
||||
- AX Agent 코워크/코드의 `폴더 내 문서 활용`을 사용자 옵션에서 제거했다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml), [SettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml), [AgentSettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/AgentSettingsWindow.xaml) 에서 하단 버튼, 내부 설정 행, 구형 설정창 항목을 걷어냈다.
|
||||
- 런타임은 옵션이 아닌 자동 정책으로 유지한다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서 채팅은 `none`, 코워크는 `passive`, 코드는 `active`를 자동 적용하고, 더 이상 오버레이 저장 시 `FolderDataUsage`를 사용자 선택값으로 저장하지 않는다.
|
||||
|
||||
@@ -4879,3 +4879,6 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
|
||||
- 권한/도구 결과 presentation catalog를 추가했다. [PermissionRequestPresentationCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/PermissionRequestPresentationCatalog.cs)는 `명령/네트워크/파일/일반` 권한 요청·허용 메타를, [ToolResultPresentationCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ToolResultPresentationCatalog.cs)는 `success/error/reject/cancel` 기준의 도구 결과 badge 메타를 제공한다.
|
||||
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddAgentEventBanner(...)`는 이제 이 catalog를 사용해 권한 요청과 도구 결과 badge를 결정한다.
|
||||
- [AppStateService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/AppStateService.cs)에 `OperationalStatusPresentationState`와 `GetOperationalStatusPresentation(...)`을 추가해 status line/runtime summary 계산을 presentation layer로 분리했다. `UpdateTaskSummaryIndicators()`는 presentation summary만 소비하도록 바뀌었다.
|
||||
- 업데이트: 2026-04-06 01:12 (KST)
|
||||
- 코워크/코드의 `폴더 내 문서 활용`은 사용자 제어 옵션에서 제거하고 탭별 자동 정책으로 고정했다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서 하단 데이터 활용 버튼과 AX Agent 내부 설정의 관련 row를 제거했고, [SettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml), [AgentSettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/AgentSettingsWindow.xaml) 의 대응 UI도 정리했다.
|
||||
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 는 이제 `GetAutomaticFolderDataUsage()`만 사용해 채팅=`none`, 코워크=`passive`, 코드=`active`를 적용한다. 오버레이 저장에서도 `llm.FolderDataUsage`를 더 이상 사용자 입력으로 덮어쓰지 않으며, UI 클릭/선택 변경 핸들러는 자동 정책 유지용 no-op 수준으로 축소했다.
|
||||
|
||||
@@ -391,7 +391,7 @@
|
||||
Grid.Column="1"
|
||||
Style="{StaticResource ToggleSwitch}"/>
|
||||
</Grid>
|
||||
<Grid Margin="0,8,0,0">
|
||||
<Grid Margin="0,8,0,0" Visibility="Collapsed">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
@@ -533,32 +533,6 @@
|
||||
Style="{StaticResource OutlineHoverBtn}"
|
||||
Click="BtnReasoningMode_Click"/>
|
||||
</Grid>
|
||||
<Grid Margin="0,8,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="폴더 데이터 활용"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
VerticalAlignment="Center"/>
|
||||
<Border Width="16" Height="16" CornerRadius="8" Background="{DynamicResource ItemHoverBackground}" Margin="6,0,0,0" Cursor="Help" VerticalAlignment="Center">
|
||||
<TextBlock Text="?" FontSize="10" FontWeight="Bold" Foreground="{DynamicResource AccentColor}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
<Border.ToolTip>
|
||||
<ToolTip Style="{StaticResource HelpTooltipStyle}">
|
||||
<TextBlock TextWrapping="Wrap" Foreground="White" FontSize="12" LineHeight="18" MaxWidth="320">
|
||||
현재 작업 폴더 파일과 문맥을 AI가 얼마나 적극적으로 참고할지 정합니다.
|
||||
</TextBlock>
|
||||
</ToolTip>
|
||||
</Border.ToolTip>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
<Button x:Name="BtnFolderDataUsage"
|
||||
Grid.Column="1"
|
||||
MinWidth="120"
|
||||
Style="{StaticResource OutlineHoverBtn}"
|
||||
Click="BtnFolderDataUsage_Click"/>
|
||||
</Grid>
|
||||
<Grid Margin="0,8,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
|
||||
@@ -17,7 +17,6 @@ public partial class AgentSettingsWindow : Window
|
||||
private readonly LlmSettings _llm;
|
||||
private string _permissionMode = PermissionModeCatalog.Deny;
|
||||
private string _reasoningMode = "detailed";
|
||||
private string _folderDataUsage = "active";
|
||||
private string _operationMode = OperationModePolicy.InternalMode;
|
||||
private string _displayMode = "rich";
|
||||
private string _defaultOutputFormat = "auto";
|
||||
@@ -48,7 +47,6 @@ public partial class AgentSettingsWindow : Window
|
||||
ModelInput.Text = _selectedModel;
|
||||
_permissionMode = PermissionModeCatalog.NormalizeGlobalMode(_llm.FilePermission);
|
||||
_reasoningMode = string.IsNullOrWhiteSpace(_llm.AgentDecisionLevel) ? "detailed" : _llm.AgentDecisionLevel;
|
||||
_folderDataUsage = string.IsNullOrWhiteSpace(_llm.FolderDataUsage) ? "active" : _llm.FolderDataUsage;
|
||||
_operationMode = OperationModePolicy.Normalize(_settings.Settings.OperationMode);
|
||||
_displayMode = "rich";
|
||||
_defaultOutputFormat = string.IsNullOrWhiteSpace(_llm.DefaultOutputFormat) ? "auto" : _llm.DefaultOutputFormat;
|
||||
@@ -114,7 +112,6 @@ public partial class AgentSettingsWindow : Window
|
||||
BtnOperationMode.Content = BuildOperationModeLabel(_operationMode);
|
||||
BtnPermissionMode.Content = PermissionModeCatalog.ToDisplayLabel(_permissionMode);
|
||||
BtnReasoningMode.Content = BuildReasoningModeLabel(_reasoningMode);
|
||||
BtnFolderDataUsage.Content = BuildFolderDataUsageLabel(_folderDataUsage);
|
||||
}
|
||||
|
||||
private void RefreshDisplayModeCards()
|
||||
@@ -173,16 +170,6 @@ public partial class AgentSettingsWindow : Window
|
||||
};
|
||||
}
|
||||
|
||||
private static string BuildFolderDataUsageLabel(string mode)
|
||||
{
|
||||
return (mode ?? "none").ToLowerInvariant() switch
|
||||
{
|
||||
"active" => "적극 활용",
|
||||
"passive" => "소극 활용",
|
||||
_ => "활용하지 않음",
|
||||
};
|
||||
}
|
||||
|
||||
private static string BuildOutputFormatLabel(string format)
|
||||
{
|
||||
return (format ?? "auto").ToLowerInvariant() switch
|
||||
@@ -469,17 +456,6 @@ public partial class AgentSettingsWindow : Window
|
||||
RefreshModeLabels();
|
||||
}
|
||||
|
||||
private void BtnFolderDataUsage_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
_folderDataUsage = _folderDataUsage switch
|
||||
{
|
||||
"none" => "passive",
|
||||
"passive" => "active",
|
||||
_ => "none",
|
||||
};
|
||||
RefreshModeLabels();
|
||||
}
|
||||
|
||||
private void BtnDefaultOutputFormat_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
_defaultOutputFormat = (_defaultOutputFormat ?? "auto").ToLowerInvariant() switch
|
||||
@@ -514,7 +490,6 @@ public partial class AgentSettingsWindow : Window
|
||||
_llm.FilePermission = _permissionMode;
|
||||
_llm.DefaultAgentPermission = _permissionMode;
|
||||
_llm.AgentDecisionLevel = _reasoningMode;
|
||||
_llm.FolderDataUsage = _folderDataUsage;
|
||||
_llm.AgentUiExpressionLevel = "rich";
|
||||
_llm.DefaultOutputFormat = _defaultOutputFormat;
|
||||
_llm.DefaultMood = _defaultMood;
|
||||
|
||||
@@ -1360,22 +1360,6 @@
|
||||
</Border>
|
||||
</Popup>
|
||||
|
||||
<!-- ── 데이터 활용 수준 팝업 ── -->
|
||||
<Popup x:Name="DataUsagePopup" Grid.Row="4"
|
||||
PlacementTarget="{Binding ElementName=BtnDataUsage}"
|
||||
Placement="Top" StaysOpen="False"
|
||||
AllowsTransparency="True" PopupAnimation="Fade">
|
||||
<Border Background="{DynamicResource LauncherBackground}"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
BorderThickness="1" CornerRadius="18"
|
||||
Padding="10" MinWidth="300">
|
||||
<Border.Effect>
|
||||
<DropShadowEffect BlurRadius="22" ShadowDepth="0" Opacity="0.15"/>
|
||||
</Border.Effect>
|
||||
<StackPanel x:Name="DataUsageItems" Margin="2"/>
|
||||
</Border>
|
||||
</Popup>
|
||||
|
||||
<!-- ── 슬래시 명령어 팝업 ── -->
|
||||
<Popup x:Name="SlashPopup" Grid.Row="4"
|
||||
PlacementTarget="{Binding ElementName=InputBorder}"
|
||||
@@ -2198,28 +2182,7 @@
|
||||
<Border x:Name="FormatMoodSeparator" Grid.Column="4" Width="1" Height="18" Margin="4,0"
|
||||
Background="{DynamicResource SeparatorColor}" Visibility="Collapsed"/>
|
||||
|
||||
<!-- 데이터 활용 메뉴 -->
|
||||
<Border x:Name="BtnDataUsage" Grid.Column="5" Cursor="Hand"
|
||||
Background="Transparent"
|
||||
BorderBrush="Transparent"
|
||||
BorderThickness="0"
|
||||
Padding="10,5"
|
||||
CornerRadius="8"
|
||||
MouseLeftButtonUp="BtnDataUsage_Click"
|
||||
ToolTip="폴더 데이터 활용 수준">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock x:Name="DataUsageIcon" Text="" FontFamily="Segoe MDL2 Assets" FontSize="12"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBlock x:Name="DataUsageLabel" Text="활용하지 않음" FontSize="12"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- 구분선 -->
|
||||
<Border Grid.Column="6" Width="1" Height="18" Margin="4,0"
|
||||
Background="{DynamicResource SeparatorColor}"/>
|
||||
<!-- 폴더 데이터 활용은 코드/코워크 자동 정책으로만 동작 -->
|
||||
|
||||
<!-- 권한 메뉴 -->
|
||||
<Button x:Name="BtnPermission" Grid.Column="7" Style="{StaticResource OutlineHoverBtn}"
|
||||
@@ -3493,43 +3456,6 @@
|
||||
<ComboBoxItem Content="모드 · 사외 모드" Tag="external"/>
|
||||
</ComboBox>
|
||||
</Grid>
|
||||
<Grid x:Name="OverlayFolderDataUsageRow" Margin="0,8,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<TextBlock Text="폴더 데이터 활용"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
VerticalAlignment="Center"/>
|
||||
<Border Style="{StaticResource OverlayHelpBadge}">
|
||||
<TextBlock Text="?"
|
||||
FontSize="10"
|
||||
FontWeight="Bold"
|
||||
Foreground="{DynamicResource AccentColor}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
<Border.ToolTip>
|
||||
<ToolTip Style="{StaticResource HelpTooltipStyle}">
|
||||
<TextBlock TextWrapping="Wrap"
|
||||
Foreground="White"
|
||||
FontSize="12"
|
||||
LineHeight="18"
|
||||
MaxWidth="280">현재 폴더의 파일과 문맥을 응답에 얼마나 적극적으로 활용할지 정합니다. 적극 활용은 관련 파일을 더 넓게 참조하고, 활용하지 않음은 현재 입력 중심으로만 답합니다.</TextBlock>
|
||||
</ToolTip>
|
||||
</Border.ToolTip>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
<ComboBox x:Name="CmbOverlayFolderDataUsage"
|
||||
Grid.Column="1"
|
||||
MinWidth="140"
|
||||
Style="{StaticResource OverlayComboBox}"
|
||||
SelectionChanged="CmbOverlayFolderDataUsage_SelectionChanged">
|
||||
<ComboBoxItem Content="데이터 · 활용하지 않음" Tag="none"/>
|
||||
<ComboBoxItem Content="데이터 · 소극 활용" Tag="passive"/>
|
||||
<ComboBoxItem Content="데이터 · 적극 활용" Tag="active"/>
|
||||
</ComboBox>
|
||||
</Grid>
|
||||
|
||||
<Grid x:Name="OverlayTlsRow" Visibility="Collapsed" Margin="0,0,0,0">
|
||||
<CheckBox x:Name="OverlayHiddenTlsToggle" Visibility="Collapsed"/>
|
||||
|
||||
@@ -206,7 +206,7 @@ public partial class ChatWindow : Window
|
||||
|
||||
// 설정에서 초기값 로드 (Loaded 전에도 null 방지)
|
||||
_selectedMood = settings.Settings.Llm.DefaultMood ?? "modern";
|
||||
_folderDataUsage = settings.Settings.Llm.FolderDataUsage ?? "none";
|
||||
_folderDataUsage = "none";
|
||||
|
||||
_cursorTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(530) };
|
||||
_cursorTimer.Tick += CursorTimer_Tick;
|
||||
@@ -295,7 +295,7 @@ public partial class ChatWindow : Window
|
||||
// ── 즉시 필요한 UI 초기화만 동기 실행 ──
|
||||
SetupUserInfo();
|
||||
_selectedMood = _settings.Settings.Llm.DefaultMood ?? "modern";
|
||||
_folderDataUsage = _settings.Settings.Llm.FolderDataUsage ?? "none";
|
||||
_folderDataUsage = GetAutomaticFolderDataUsage();
|
||||
UpdateAnalyzerButtonVisibility();
|
||||
UpdateModelLabel();
|
||||
RefreshInlineSettingsPanel();
|
||||
@@ -1815,9 +1815,7 @@ public partial class ChatWindow : Window
|
||||
: fallbackPermission;
|
||||
_settings.Settings.Llm.FilePermission = conversationPermission;
|
||||
|
||||
_folderDataUsage = IsFolderDataAlwaysEnabledTab()
|
||||
? "active"
|
||||
: (conv?.DataUsage ?? llm.FolderDataUsage ?? "none");
|
||||
_folderDataUsage = GetAutomaticFolderDataUsage();
|
||||
_selectedMood = conv?.Mood ?? llm.DefaultMood ?? "modern";
|
||||
}
|
||||
|
||||
@@ -1853,7 +1851,7 @@ public partial class ChatWindow : Window
|
||||
try
|
||||
{
|
||||
var normalizedPermission = PermissionModeCatalog.NormalizeGlobalMode(_settings.Settings.Llm.FilePermission);
|
||||
var dataUsage = IsFolderDataAlwaysEnabledTab() ? "active" : (_folderDataUsage ?? "none");
|
||||
var dataUsage = GetAutomaticFolderDataUsage();
|
||||
var mood = _selectedMood ?? (_settings.Settings.Llm.DefaultMood ?? "modern");
|
||||
var outputFormat = conv.OutputFormat ?? "auto";
|
||||
|
||||
@@ -2259,114 +2257,21 @@ public partial class ChatWindow : Window
|
||||
|
||||
private void BtnDataUsage_Click(object sender, System.Windows.Input.MouseButtonEventArgs e)
|
||||
{
|
||||
if (IsFolderDataAlwaysEnabledTab())
|
||||
return;
|
||||
if (DataUsagePopup == null) return;
|
||||
DataUsageItems.Children.Clear();
|
||||
|
||||
var options = new (string Key, string Sym, string Label, string Desc, string Color, string CheckColor)[]
|
||||
{
|
||||
("none", "\uE8D8", "활용하지 않음", "폴더 내 문서를 읽기만 포함해 참조하지 않습니다", "#6B7280", "#6B7280"),
|
||||
("passive", "\uE8FD", "소극 활용", "사용자가 요청할 때만 폴더 데이터를 참조합니다", "#D97706", "#D97706"),
|
||||
("active", "\uE9F5", "적극 활용", "폴더 내 문서를 자동 탐색하여 보고서 작성에 적극 활용합니다", "#107C10", "#107C10"),
|
||||
};
|
||||
|
||||
foreach (var (key, sym, label, desc, color, checkColor) in options)
|
||||
{
|
||||
var isActive = key.Equals(_folderDataUsage, StringComparison.OrdinalIgnoreCase);
|
||||
var row = new Border
|
||||
{
|
||||
Background = isActive ? BrushFromHex("#F8FAFC") : Brushes.Transparent,
|
||||
BorderBrush = isActive ? BrushFromHex("#C7D2FE") : BrushFromHex("#E5E7EB"),
|
||||
BorderThickness = new Thickness(isActive ? 2 : 0, 0, 0, 1),
|
||||
Cursor = Cursors.Hand,
|
||||
Padding = new Thickness(8, 9, 8, 9),
|
||||
Margin = new Thickness(0),
|
||||
};
|
||||
var sp = new StackPanel { Orientation = Orientation.Horizontal };
|
||||
var checkIcon = CreateCheckIcon(isActive);
|
||||
if (checkIcon is TextBlock checkText)
|
||||
checkText.Foreground = isActive ? BrushFromHex(checkColor) : Brushes.Transparent;
|
||||
sp.Children.Add(checkIcon);
|
||||
sp.Children.Add(new TextBlock
|
||||
{
|
||||
Text = sym, FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 14,
|
||||
Foreground = BrushFromHex(color),
|
||||
VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 10, 0),
|
||||
});
|
||||
var textStack = new StackPanel();
|
||||
textStack.Children.Add(new TextBlock
|
||||
{
|
||||
Text = label, FontSize = 11.5, FontWeight = FontWeights.SemiBold,
|
||||
Foreground = BrushFromHex(color),
|
||||
});
|
||||
textStack.Children.Add(new TextBlock
|
||||
{
|
||||
Text = desc, FontSize = 10.5,
|
||||
Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray,
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
MaxWidth = 240,
|
||||
});
|
||||
sp.Children.Add(textStack);
|
||||
row.Child = sp;
|
||||
|
||||
var capturedKey = key;
|
||||
row.MouseEnter += (_, _) =>
|
||||
{
|
||||
row.Background = BrushFromHex("#F8FAFC");
|
||||
row.BorderBrush = isActive ? BrushFromHex("#C7D2FE") : BrushFromHex("#E2E8F0");
|
||||
};
|
||||
row.MouseLeave += (_, _) =>
|
||||
{
|
||||
row.Background = isActive ? BrushFromHex("#F8FAFC") : Brushes.Transparent;
|
||||
row.BorderBrush = isActive ? BrushFromHex("#C7D2FE") : BrushFromHex("#E5E7EB");
|
||||
};
|
||||
row.MouseLeftButtonDown += (_, _) =>
|
||||
{
|
||||
_folderDataUsage = capturedKey;
|
||||
UpdateDataUsageUI();
|
||||
SaveConversationSettings();
|
||||
RefreshOverlayModeButtons();
|
||||
DataUsagePopup.IsOpen = false;
|
||||
};
|
||||
DataUsageItems.Children.Add(row);
|
||||
}
|
||||
DataUsagePopup.IsOpen = true;
|
||||
_folderDataUsage = GetAutomaticFolderDataUsage();
|
||||
}
|
||||
|
||||
private void UpdateDataUsageUI()
|
||||
{
|
||||
if (DataUsageLabel == null || DataUsageIcon == null) return;
|
||||
if (IsFolderDataAlwaysEnabledTab())
|
||||
_folderDataUsage = "active";
|
||||
var (label, icon, color) = _folderDataUsage switch
|
||||
{
|
||||
"none" => ("데이터 미활용", "\uE8D8", "#6B7280"),
|
||||
"passive" => ("데이터 소극", "\uE8FD", "#D97706"),
|
||||
_ => ("데이터 적극", "\uE9F5", "#107C10"),
|
||||
};
|
||||
DataUsageLabel.Text = label;
|
||||
DataUsageIcon.Text = icon;
|
||||
DataUsageIcon.Foreground = BrushFromHex(color);
|
||||
if (BtnDataUsage != null)
|
||||
{
|
||||
BtnDataUsage.Visibility = IsFolderDataAlwaysEnabledTab() ? Visibility.Collapsed : Visibility.Visible;
|
||||
BtnDataUsage.Background = Brushes.Transparent;
|
||||
BtnDataUsage.BorderBrush = Brushes.Transparent;
|
||||
BtnDataUsage.BorderThickness = new Thickness(0);
|
||||
BtnDataUsage.ToolTip = _folderDataUsage switch
|
||||
{
|
||||
"none" => "폴더 문서와 파일을 읽지 않거나 참조하지 않습니다.",
|
||||
"passive" => "사용자가 요청할 때만 폴더 데이터를 참조합니다.",
|
||||
_ => "폴더 문서와 파일을 자동 탐색해 작업에 적극 활용합니다."
|
||||
};
|
||||
}
|
||||
if (IsFolderDataAlwaysEnabledTab() && DataUsagePopup != null)
|
||||
DataUsagePopup.IsOpen = false;
|
||||
_folderDataUsage = GetAutomaticFolderDataUsage();
|
||||
}
|
||||
|
||||
private bool IsFolderDataAlwaysEnabledTab()
|
||||
=> string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase);
|
||||
private string GetAutomaticFolderDataUsage()
|
||||
=> _activeTab switch
|
||||
{
|
||||
"Code" => "active",
|
||||
"Cowork" => "passive",
|
||||
_ => "none",
|
||||
};
|
||||
|
||||
/// <summary>Cowork/Code 탭 진입 시 설정의 기본 권한을 적용.</summary>
|
||||
private void ApplyTabDefaultPermission()
|
||||
@@ -8652,8 +8557,8 @@ public partial class ChatWindow : Window
|
||||
sb.AppendLine($"File permission mode: {llm.FilePermission}");
|
||||
sb.Append(BuildSubAgentDelegationSection(false));
|
||||
|
||||
// 폴더 데이터 활용 지침
|
||||
switch (_folderDataUsage)
|
||||
// 폴더 데이터 활용 지침 (사용자 옵션이 아닌 탭별 자동 정책)
|
||||
switch (GetAutomaticFolderDataUsage())
|
||||
{
|
||||
case "active":
|
||||
sb.AppendLine("IMPORTANT: Folder Data Usage = ACTIVE. You have 'document_read' and 'folder_map' tools available.");
|
||||
@@ -13964,7 +13869,6 @@ public partial class ChatWindow : Window
|
||||
llm.WorkflowVisualizer = ChkOverlayWorkflowVisualizer?.IsChecked == true;
|
||||
llm.ShowTotalCallStats = ChkOverlayShowTotalCallStats?.IsChecked == true;
|
||||
llm.EnableAuditLog = ChkOverlayEnableAuditLog?.IsChecked == true;
|
||||
llm.FolderDataUsage = _folderDataUsage;
|
||||
|
||||
CommitOverlayEndpointInput(normalizeOnInvalid: true);
|
||||
CommitOverlayApiKeyInput();
|
||||
@@ -14884,12 +14788,6 @@ public partial class ChatWindow : Window
|
||||
OverlayModelEditorPanel.Visibility = showBasic ? Visibility.Visible : Visibility.Collapsed;
|
||||
if (OverlayAnchorPermission != null)
|
||||
OverlayAnchorPermission.Visibility = showBasic ? Visibility.Visible : Visibility.Collapsed;
|
||||
if (IsFolderDataAlwaysEnabledTab())
|
||||
_folderDataUsage = "active";
|
||||
if (OverlayFolderDataUsageRow != null)
|
||||
OverlayFolderDataUsageRow.Visibility = IsFolderDataAlwaysEnabledTab()
|
||||
? Visibility.Collapsed
|
||||
: (showShared || showCowork ? Visibility.Visible : Visibility.Collapsed);
|
||||
if (OverlayTlsRow != null)
|
||||
OverlayTlsRow.Visibility = showChat ? Visibility.Visible : Visibility.Collapsed;
|
||||
if (OverlayAnchorAdvanced != null)
|
||||
@@ -16257,7 +16155,6 @@ public partial class ChatWindow : Window
|
||||
{
|
||||
var llm = _settings.Settings.Llm;
|
||||
SelectComboTag(CmbOverlayOperationMode, OperationModePolicy.Normalize(_settings.Settings.OperationMode));
|
||||
SelectComboTag(CmbOverlayFolderDataUsage, _folderDataUsage);
|
||||
SelectComboTag(CmbOverlayPermission, PermissionModeCatalog.NormalizeGlobalMode(llm.FilePermission));
|
||||
SelectComboTag(CmbOverlayReasoning, llm.AgentDecisionLevel);
|
||||
SelectComboTag(CmbOverlayFastMode, llm.FreeTierMode ? "on" : "off");
|
||||
@@ -16713,19 +16610,7 @@ public partial class ChatWindow : Window
|
||||
|
||||
private void BtnOverlayFolderDataUsage_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (IsFolderDataAlwaysEnabledTab())
|
||||
{
|
||||
_folderDataUsage = "active";
|
||||
PersistOverlaySettingsState(refreshOverlayDeferredInputs: false);
|
||||
return;
|
||||
}
|
||||
_folderDataUsage = _folderDataUsage switch
|
||||
{
|
||||
"none" => "passive",
|
||||
"passive" => "active",
|
||||
_ => "none",
|
||||
};
|
||||
PersistOverlaySettingsState(refreshOverlayDeferredInputs: false);
|
||||
_folderDataUsage = GetAutomaticFolderDataUsage();
|
||||
}
|
||||
|
||||
private void CmbOverlayFastMode_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
@@ -16800,11 +16685,7 @@ public partial class ChatWindow : Window
|
||||
|
||||
private void CmbOverlayFolderDataUsage_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (_isOverlaySettingsSyncing || CmbOverlayFolderDataUsage.SelectedItem is not ComboBoxItem selected || selected.Tag is not string tag)
|
||||
return;
|
||||
|
||||
_folderDataUsage = IsFolderDataAlwaysEnabledTab() ? "active" : tag;
|
||||
PersistOverlaySettingsState(refreshOverlayDeferredInputs: false);
|
||||
_folderDataUsage = GetAutomaticFolderDataUsage();
|
||||
}
|
||||
|
||||
private void CmbOverlayAgentLogLevel_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
|
||||
@@ -4957,22 +4957,6 @@
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<TextBlock Style="{StaticResource SectionHeader}" Text="폴더 데이터 활용"/>
|
||||
<Border Style="{StaticResource SettingsRow}">
|
||||
<Grid>
|
||||
<StackPanel HorizontalAlignment="Left">
|
||||
<TextBlock Style="{StaticResource RowLabel}" Text="기본 데이터 활용 수준"/>
|
||||
<TextBlock Style="{StaticResource RowHint}" Text="작업 폴더 내 문서/데이터를 보고서 작성에 활용하는 수준입니다."/>
|
||||
</StackPanel>
|
||||
<ComboBox HorizontalAlignment="Right" VerticalAlignment="Center"
|
||||
Width="180" SelectedValue="{Binding FolderDataUsage, Mode=TwoWay}"
|
||||
SelectedValuePath="Tag">
|
||||
<ComboBoxItem Content="활용하지 않음" Tag="none"/>
|
||||
<ComboBoxItem Content="소극 활용 (요청 시)" Tag="passive"/>
|
||||
<ComboBoxItem Content="적극 활용 (자동 탐색)" Tag="active"/>
|
||||
</ComboBox>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- ── 품질 검증 ── -->
|
||||
<TextBlock Style="{StaticResource SectionHeader}" Text="품질 검증"/>
|
||||
|
||||
Reference in New Issue
Block a user