using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Text.Encodings.Web; using System.Text.Json; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Forms; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Effects; using AxCopilot.Core; using AxCopilot.Models; using AxCopilot.Services; using AxCopilot.Services.Agent; using AxCopilot.ViewModels; using Microsoft.Win32; namespace AxCopilot.Views; public class SettingsWindow : Window, IComponentConnector, IStyleConnector { private readonly SettingsViewModel _vm; private readonly Action _previewCallback; private readonly Action _revertCallback; private bool _saved; private bool _notifyMoved; private bool _toolCardsLoaded; private HashSet _disabledTools = new HashSet(StringComparer.OrdinalIgnoreCase); internal System.Windows.Controls.RadioButton GeneralSubTabMain; internal System.Windows.Controls.RadioButton GeneralSubTabNotify; internal System.Windows.Controls.RadioButton GeneralSubTabStorage; internal ScrollViewer GeneralMainPanel; internal System.Windows.Controls.CheckBox AiEnabledToggle; internal System.Windows.Controls.ComboBox HotkeyCombo; internal System.Windows.Controls.TextBox NewIndexPathBox; internal System.Windows.Controls.TextBox NewExtensionBox; internal ScrollViewer GeneralNotifyPanel; internal StackPanel NotifyContent; internal ScrollViewer GeneralStoragePanel; internal TextBlock StorageSummaryText2; internal TextBlock StorageDriveText2; internal StackPanel StorageDetailPanel2; internal System.Windows.Controls.RadioButton ThemeSubTabSelect; internal System.Windows.Controls.RadioButton ThemeSubTabColors; internal ScrollViewer ThemeSelectPanel; internal ItemsControl ThemeCardsPanel; internal Grid ThemeColorsPanel; internal System.Windows.Controls.CheckBox ChkDockAutoShow; internal System.Windows.Controls.CheckBox ChkDockRainbowGlow; internal Slider SliderDockOpacity; internal StackPanel DockItemsPanel; internal StackPanel QuoteCategoryPanel; internal StackPanel FunctionSubTabBar; internal System.Windows.Controls.RadioButton FuncSubTab_AI; internal System.Windows.Controls.RadioButton FuncSubTab_Launcher; internal System.Windows.Controls.RadioButton FuncSubTab_Design; internal ScrollViewer FuncPanel_AI; internal System.Windows.Controls.CheckBox ChkEnableTextAction; internal StackPanel TextActionCommandsPanel; internal System.Windows.Controls.CheckBox ChkEnableFileDialog; internal ScrollViewer FuncPanel_Launcher; internal ScrollViewer FuncPanel_Design; internal System.Windows.Controls.CheckBox ChkEnableAutoCategory; internal TabItem AgentTabItem; internal StackPanel AgentSubTabs; internal System.Windows.Controls.RadioButton AgentTabCommon; internal System.Windows.Controls.RadioButton AgentTabChat; internal System.Windows.Controls.RadioButton AgentTabCoworkCode; internal System.Windows.Controls.RadioButton AgentTabCowork; internal System.Windows.Controls.RadioButton AgentTabCode; internal System.Windows.Controls.RadioButton AgentTabDev; internal System.Windows.Controls.RadioButton AgentTabTools; internal System.Windows.Controls.RadioButton AgentTabEtc; internal ScrollViewer AgentPanelCommon; internal StackPanel ServiceSubTabs; internal System.Windows.Controls.RadioButton SvcTabOllama; internal System.Windows.Controls.RadioButton SvcTabVllm; internal System.Windows.Controls.RadioButton SvcTabGemini; internal System.Windows.Controls.RadioButton SvcTabClaude; internal StackPanel SvcPanelOllama; internal System.Windows.Controls.Button BtnAddModel; internal System.Windows.Controls.ComboBox CboActiveModel; internal StackPanel SvcPanelVllm; internal System.Windows.Controls.Button BtnAddVllmModel; internal System.Windows.Controls.ComboBox CboActiveVllmModel; internal StackPanel SvcPanelGemini; internal StackPanel SvcPanelClaude; internal System.Windows.Controls.Button BtnTestConnection; internal TextBlock StorageSummaryText; internal TextBlock StorageDriveText; internal StackPanel StorageDetailPanel; internal StackPanel AgentBlockSection; internal StackPanel HookListPanel; internal System.Windows.Controls.Button BtnBrowseSkillFolder; internal System.Windows.Controls.Button BtnOpenSkillFolder; internal ScrollViewer AgentPanelChat; internal System.Windows.Controls.Button BtnAddTemplate; internal ScrollViewer AgentPanelCoworkCode; internal ScrollViewer AgentPanelCowork; internal ScrollViewer AgentPanelCode; internal ScrollViewer AgentPanelDev; internal System.Windows.Controls.CheckBox DevModeCheckBox; internal StackPanel DevModeContent; internal System.Windows.Controls.CheckBox StepApprovalCheckBox; internal StackPanel FallbackModelsPanel; internal System.Windows.Controls.TextBox FallbackModelsBox; internal StackPanel McpServerListPanel; internal System.Windows.Controls.TextBox McpServersBox; internal ScrollViewer AgentPanelEtc; internal StackPanel AgentEtcContent; internal ScrollViewer AgentPanelTools; internal StackPanel ToolCardsPanel; internal StackPanel McpStatusPanel; internal TextBlock VersionInfoText; private bool _contentLoaded; public Action? SuspendHotkeyCallback { get; set; } private bool IsEncryptionEnabled => (System.Windows.Application.Current as App)?.SettingsService?.Settings.Llm.EncryptionEnabled == true; public SettingsWindow(SettingsViewModel vm, Action previewCallback, Action revertCallback) { SettingsWindow settingsWindow = this; InitializeComponent(); _vm = vm; _previewCallback = previewCallback; _revertCallback = revertCallback; base.DataContext = vm; vm.ThemePreviewRequested += delegate { settingsWindow._previewCallback(vm.SelectedThemeKey); }; vm.SaveCompleted += delegate { settingsWindow._saved = true; settingsWindow.Close(); Task.Run(async delegate { try { IndexService indexService = (System.Windows.Application.Current as App)?.IndexService; if (indexService != null) { await indexService.BuildAsync(); } } catch { } }); }; base.Loaded += async delegate { settingsWindow.RefreshHotkeyBadges(); settingsWindow.SetVersionText(); settingsWindow.EnsureHotkeyInCombo(); settingsWindow.BuildQuoteCategoryCheckboxes(); settingsWindow.BuildDockBarSettings(); settingsWindow.BuildTextActionCommandsPanel(); settingsWindow.MoveBlockSectionToEtc(); App app = System.Windows.Application.Current as App; if (SkillService.Skills.Count <= 0 && app?.SettingsService?.Settings.Llm.EnableSkillSystem == true) { await Task.Run(delegate { SkillService.EnsureSkillFolder(); SkillService.LoadSkills(app?.SettingsService?.Settings.Llm.SkillsFolderPath); }); } settingsWindow.BuildToolRegistryPanel(); settingsWindow.LoadAdvancedSettings(); settingsWindow.RefreshStorageInfo(); settingsWindow.UpdateDevModeContentVisibility(); settingsWindow.ApplyAiEnabledState(app?.SettingsService?.Settings.AiEnabled == true, init: true); }; } private void MoveBlockSectionToEtc() { if (AgentBlockSection != null && AgentEtcContent != null && AgentBlockSection.Parent is System.Windows.Controls.Panel panel) { panel.Children.Remove(AgentBlockSection); AgentBlockSection.Margin = new Thickness(0.0, 0.0, 0.0, 16.0); AgentEtcContent.Children.Add(AgentBlockSection); } } private Border CreateCollapsibleSection(string title, UIElement content, bool expanded = true) { //IL_0106: Unknown result type (might be due to invalid IL or missing references) SolidColorBrush headerColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#AAAACC")); StackPanel stackPanel = new StackPanel(); StackPanel contentPanel = new StackPanel { Visibility = ((!expanded) ? Visibility.Collapsed : Visibility.Visible) }; if (content is System.Windows.Controls.Panel) { contentPanel.Children.Add(content); } else { contentPanel.Children.Add(content); } TextBlock arrow = new TextBlock { Text = "\ue70d", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 9.0, Foreground = headerColor, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 6.0, 0.0), RenderTransformOrigin = new Point(0.5, 0.5), RenderTransform = new RotateTransform(expanded ? 90 : 0) }; TextBlock titleBlock = new TextBlock { Text = title, FontSize = 10.5, FontWeight = FontWeights.SemiBold, Foreground = headerColor, VerticalAlignment = VerticalAlignment.Center }; StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; stackPanel2.Children.Add(arrow); stackPanel2.Children.Add(titleBlock); Border border = new Border { Background = Brushes.Transparent, Cursor = System.Windows.Input.Cursors.Hand, Padding = new Thickness(2.0, 10.0, 2.0, 6.0), Child = stackPanel2 }; border.MouseLeftButtonUp += delegate { bool flag = contentPanel.Visibility == Visibility.Visible; contentPanel.Visibility = (flag ? Visibility.Collapsed : Visibility.Visible); arrow.RenderTransform = new RotateTransform((!flag) ? 90 : 0); }; border.MouseEnter += delegate { titleBlock.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#CCCCEE")); }; border.MouseLeave += delegate { titleBlock.Foreground = headerColor; }; stackPanel.Children.Add(border); stackPanel.Children.Add(contentPanel); return new Border { Child = stackPanel, Margin = new Thickness(0.0, 2.0, 0.0, 0.0) }; } private Border CreateCollapsibleSection(string title, IEnumerable children, bool expanded = true) { StackPanel stackPanel = new StackPanel(); foreach (UIElement child in children) { stackPanel.Children.Add(child); } return CreateCollapsibleSection(title, stackPanel, expanded); } private void BuildToolRegistryPanel() { //IL_07a2: Unknown result type (might be due to invalid IL or missing references) if (AgentEtcContent == null) { return; } (string, string, string, (string, string)[])[] array = new(string, string, string, (string, string)[])[7] { ("파일/검색", "\ue8b7", "#F59E0B", new(string, string)[7] { ("file_read", "파일 읽기 — 텍스트/바이너리 파일의 내용을 읽습니다"), ("file_write", "파일 쓰기 — 새 파일을 생성하거나 기존 파일을 덮어씁니다"), ("file_edit", "파일 편집 — 줄 번호 기반으로 파일의 특정 부분을 수정합니다"), ("glob", "파일 패턴 검색 — 글로브 패턴으로 파일을 찾습니다 (예: **/*.cs)"), ("grep_tool", "텍스트 검색 — 정규식으로 파일 내용을 검색합니다"), ("folder_map", "폴더 구조 — 프로젝트의 디렉토리 트리를 조회합니다"), ("document_read", "문서 읽기 — PDF, DOCX 등 문서 파일의 텍스트를 추출합니다") }), ("프로세스/빌드", "\ue756", "#06B6D4", new(string, string)[3] { ("process", "프로세스 실행 — 외부 명령/프로그램을 실행합니다"), ("build_run", "빌드/테스트 — 프로젝트 타입을 감지하여 빌드/테스트를 실행합니다"), ("dev_env_detect", "개발 환경 감지 — IDE, 런타임, 빌드 도구를 자동으로 인식합니다") }), ("코드 분석", "\ue943", "#818CF8", new(string, string)[6] { ("search_codebase", "코드 키워드 검색 — TF-IDF 기반으로 관련 코드를 찾습니다"), ("code_review", "AI 코드 리뷰 — Git diff 분석, 파일 정적 검사, PR 요약"), ("lsp", "LSP 인텔리전스 — 정의 이동, 참조 검색, 심볼 목록 (C#/TS/Python)"), ("test_loop", "테스트 루프 — 테스트 생성/실행/분석 자동화"), ("git_tool", "Git 작업 — status, log, diff, commit 등 Git 명령 실행"), ("snippet_runner", "코드 실행 — C#/Python/JavaScript 스니펫 즉시 실행") }), ("문서 생성", "\ue8a5", "#34D399", new(string, string)[9] { ("excel_create", "Excel 생성 — .xlsx 스프레드시트를 생성합니다"), ("docx_create", "Word 생성 — .docx 문서를 생성합니다"), ("csv_create", "CSV 생성 — CSV 파일을 생성합니다"), ("markdown_create", "마크다운 생성 — .md 파일을 생성합니다"), ("html_create", "HTML 생성 — HTML 파일을 생성합니다"), ("chart_create", "차트 생성 — 데이터 시각화 차트를 생성합니다"), ("batch_create", "배치 생성 — 스크립트 파일을 생성합니다"), ("document_review", "문서 검증 — 문서 품질을 검사합니다"), ("format_convert", "포맷 변환 — 문서 형식을 변환합니다") }), ("데이터 처리", "\ue9f5", "#F59E0B", new(string, string)[6] { ("json_tool", "JSON 처리 — JSON 파싱, 변환, 검증, 포맷팅"), ("regex_tool", "정규식 — 정규식 테스트, 추출, 치환"), ("diff_tool", "텍스트 비교 — 두 파일/텍스트 비교, 통합 diff 출력"), ("base64_tool", "인코딩 — Base64/URL 인코딩, 디코딩"), ("hash_tool", "해시 계산 — MD5/SHA256 해시 계산 (파일/텍스트)"), ("datetime_tool", "날짜/시간 — 날짜 변환, 타임존, 기간 계산") }), ("시스템/환경", "\ue770", "#06B6D4", new(string, string)[6] { ("clipboard_tool", "클립보드 — Windows 클립보드 읽기/쓰기 (텍스트/이미지)"), ("notify_tool", "알림 — Windows 시스템 알림 전송"), ("env_tool", "환경변수 — 환경변수 읽기/설정 (프로세스 범위)"), ("zip_tool", "압축 — 파일 압축(zip) / 해제"), ("http_tool", "HTTP — 로컬/사내 HTTP API 호출 (GET/POST)"), ("sql_tool", "SQLite — SQLite DB 쿼리 실행 (로컬 파일)") }), ("에이전트", "\ue99a", "#F472B6", new(string, string)[5] { ("spawn_agent", "서브에이전트 — 하위 작업을 병렬로 실행하는 서브에이전트를 생성합니다"), ("wait_agents", "에이전트 대기 — 실행 중인 서브에이전트의 결과를 수집합니다"), ("memory", "에이전트 메모리 — 프로젝트 규칙, 선호도를 저장/검색합니다"), ("skill_manager", "스킬 관리 — 스킬 목록 조회, 상세 정보, 재로드"), ("project_rules", "프로젝트 지침 — AX.md 개발 지침을 읽고 씁니다") }) }; List list = new List(); list.Add(new TextBlock { Text = $"등록된 도구/커넥터 ({array.Sum(((string Category, string Icon, string IconColor, (string Name, string Desc)[] Tools) g) => g.Tools.Length)})", FontSize = 13.0, FontWeight = FontWeights.SemiBold, Foreground = ((TryFindResource("PrimaryText") as Brush) ?? Brushes.White), Margin = new Thickness(2.0, 4.0, 0.0, 4.0) }); list.Add(new TextBlock { Text = "에이전트가 사용할 수 있는 도구 목록입니다. 코워크/코드 탭에서 LLM이 자동으로 호출합니다.", FontSize = 11.0, Foreground = ((TryFindResource("SecondaryText") as Brush) ?? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#9999BB"))), Margin = new Thickness(2.0, 0.0, 0.0, 10.0), TextWrapping = TextWrapping.Wrap }); (string, string, string, (string, string)[])[] array2 = array; for (int num = 0; num < array2.Length; num++) { (string, string, string, (string, string)[]) tuple = array2[num]; Border border = new Border(); border.Background = (TryFindResource("ItemBackground") as Brush) ?? Brushes.White; border.CornerRadius = new CornerRadius(10.0); border.Padding = new Thickness(14.0, 10.0, 14.0, 10.0); border.Margin = new Thickness(0.0, 0.0, 0.0, 6.0); Border border2 = border; StackPanel stackPanel = new StackPanel(); StackPanel toolItemsPanel = new StackPanel { Visibility = Visibility.Collapsed }; TextBlock arrow = new TextBlock { Text = "\ue70d", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 9.0, Foreground = ((TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 6.0, 0.0), RenderTransformOrigin = new Point(0.5, 0.5), RenderTransform = new RotateTransform(0.0) }; Border border3 = new Border { Background = Brushes.Transparent, Cursor = System.Windows.Input.Cursors.Hand }; StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; stackPanel2.Children.Add(arrow); stackPanel2.Children.Add(new TextBlock { Text = tuple.Item2, FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 14.0, Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(tuple.Item3)), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 8.0, 0.0) }); TextBlock textBlock = new TextBlock(); textBlock.Text = $"{tuple.Item1} ({tuple.Item4.Length})"; textBlock.FontSize = 12.5; textBlock.FontWeight = FontWeights.SemiBold; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1A1B2E")); textBlock.VerticalAlignment = VerticalAlignment.Center; TextBlock element = textBlock; stackPanel2.Children.Add(element); border3.Child = stackPanel2; border3.MouseLeftButtonDown += delegate(object s, MouseButtonEventArgs e) { e.Handled = true; bool flag = toolItemsPanel.Visibility == Visibility.Visible; toolItemsPanel.Visibility = (flag ? Visibility.Collapsed : Visibility.Visible); arrow.RenderTransform = new RotateTransform((!flag) ? 90 : 0); }; stackPanel.Children.Add(border3); toolItemsPanel.Children.Add(new Border { Height = 1.0, Background = ((TryFindResource("BorderColor") as Brush) ?? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F0F0F4"))), Margin = new Thickness(0.0, 6.0, 0.0, 4.0) }); (string, string)[] item = tuple.Item4; for (int num2 = 0; num2 < item.Length; num2++) { (string, string) tuple2 = item[num2]; string item2 = tuple2.Item1; string item3 = tuple2.Item2; Grid grid = new Grid { Margin = new Thickness(0.0, 3.0, 0.0, 3.0) }; grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Auto) }); grid.ColumnDefinitions.Add(new ColumnDefinition()); textBlock = new TextBlock(); textBlock.Text = item2; textBlock.FontSize = 12.0; textBlock.FontFamily = new FontFamily("Consolas, Cascadia Code, Segoe UI"); textBlock.Foreground = (TryFindResource("AccentColor") as Brush) ?? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4B5EFC")); textBlock.VerticalAlignment = VerticalAlignment.Center; textBlock.MinWidth = 130.0; textBlock.Margin = new Thickness(4.0, 0.0, 12.0, 0.0); TextBlock element2 = textBlock; Grid.SetColumn(element2, 0); grid.Children.Add(element2); textBlock = new TextBlock(); textBlock.Text = item3; textBlock.FontSize = 11.5; textBlock.Foreground = (TryFindResource("SecondaryText") as Brush) ?? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#6666AA")); textBlock.VerticalAlignment = VerticalAlignment.Center; textBlock.TextWrapping = TextWrapping.Wrap; TextBlock element3 = textBlock; Grid.SetColumn(element3, 1); grid.Children.Add(element3); toolItemsPanel.Children.Add(grid); } stackPanel.Children.Add(toolItemsPanel); border2.Child = stackPanel; list.Add(border2); } foreach (UIElement item4 in list) { AgentEtcContent.Children.Insert(AgentEtcContent.Children.Count, item4); } int insertIdx = AgentEtcContent.Children.Count; BuildSkillListSection(ref insertIdx); } private void BuildSkillListSection(ref int insertIdx) { if (AgentEtcContent == null) { return; } IReadOnlyList skills = SkillService.Skills; if (skills.Count == 0) { return; } Color color = (Color)ColorConverter.ConvertFromString("#4B5EFC"); Color color2 = (Color)ColorConverter.ConvertFromString("#6666AA"); List list = new List(); list.Add(new TextBlock { Text = "/ 명령으로 호출할 수 있는 스킬 목록입니다. 앱 내장 + 사용자 추가 스킬이 포함됩니다.\n(스킬은 사용자가 직접 /명령어를 입력해야 실행됩니다. LLM이 자동 호출하지 않습니다.)", FontSize = 11.0, Foreground = new SolidColorBrush(color2), Margin = new Thickness(2.0, 0.0, 0.0, 10.0), TextWrapping = TextWrapping.Wrap }); List list2 = skills.Where((SkillDefinition s) => string.IsNullOrEmpty(s.Requires)).ToList(); List list3 = skills.Where((SkillDefinition s) => !string.IsNullOrEmpty(s.Requires)).ToList(); if (list2.Count > 0) { Border item = CreateSkillGroupCard("내장 스킬", "\ue768", "#34D399", list2); list.Add(item); } if (list3.Count > 0) { Border item2 = CreateSkillGroupCard("고급 스킬 (런타임 필요)", "\ue9d9", "#A78BFA", list3); list.Add(item2); } StackPanel stackPanel = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal, Margin = new Thickness(2.0, 4.0, 0.0, 10.0) }; Border border = new Border { Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4B5EFC")), CornerRadius = new CornerRadius(8.0), Padding = new Thickness(14.0, 7.0, 14.0, 7.0), Margin = new Thickness(0.0, 0.0, 8.0, 0.0), Cursor = System.Windows.Input.Cursors.Hand }; StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; stackPanel2.Children.Add(new TextBlock { Text = "\ue8b5", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, Foreground = Brushes.White, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 6.0, 0.0) }); stackPanel2.Children.Add(new TextBlock { Text = "스킬 가져오기 (.zip)", FontSize = 12.0, FontWeight = FontWeights.SemiBold, Foreground = Brushes.White, VerticalAlignment = VerticalAlignment.Center }); border.Child = stackPanel2; border.MouseLeftButtonUp += SkillImport_Click; border.MouseEnter += delegate(object s, System.Windows.Input.MouseEventArgs _) { ((Border)s).Opacity = 0.85; }; border.MouseLeave += delegate(object s, System.Windows.Input.MouseEventArgs _) { ((Border)s).Opacity = 1.0; }; stackPanel.Children.Add(border); Border border2 = new Border { Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F0F1F5")), CornerRadius = new CornerRadius(8.0), Padding = new Thickness(14.0, 7.0, 14.0, 7.0), Cursor = System.Windows.Input.Cursors.Hand }; StackPanel stackPanel3 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; stackPanel3.Children.Add(new TextBlock { Text = "\uede1", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#555")), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 6.0, 0.0) }); stackPanel3.Children.Add(new TextBlock { Text = "스킬 내보내기", FontSize = 12.0, FontWeight = FontWeights.SemiBold, Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#444")), VerticalAlignment = VerticalAlignment.Center }); border2.Child = stackPanel3; border2.MouseLeftButtonUp += SkillExport_Click; border2.MouseEnter += delegate(object s, System.Windows.Input.MouseEventArgs _) { ((Border)s).Opacity = 0.85; }; border2.MouseLeave += delegate(object s, System.Windows.Input.MouseEventArgs _) { ((Border)s).Opacity = 1.0; }; stackPanel.Children.Add(border2); list.Add(stackPanel); StackPanel stackPanel4 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal, Margin = new Thickness(2.0, 0.0, 0.0, 12.0) }; Border border3 = new Border { CornerRadius = new CornerRadius(8.0), Padding = new Thickness(14.0, 7.0, 14.0, 7.0), Margin = new Thickness(0.0, 0.0, 8.0, 0.0), Background = new SolidColorBrush(Color.FromArgb(24, 75, 94, 252)), Cursor = System.Windows.Input.Cursors.Hand }; StackPanel stackPanel5 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; stackPanel5.Children.Add(new TextBlock { Text = "\ue768", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4B5EFC")), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 6.0, 0.0) }); stackPanel5.Children.Add(new TextBlock { Text = "스킬 갤러리 열기", FontSize = 12.0, FontWeight = FontWeights.SemiBold, Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4B5EFC")) }); border3.Child = stackPanel5; border3.MouseLeftButtonUp += delegate { SkillGalleryWindow skillGalleryWindow = new SkillGalleryWindow(); skillGalleryWindow.Owner = Window.GetWindow((DependencyObject)(object)this); skillGalleryWindow.ShowDialog(); }; border3.MouseEnter += delegate(object s, System.Windows.Input.MouseEventArgs _) { ((Border)s).Opacity = 0.8; }; border3.MouseLeave += delegate(object s, System.Windows.Input.MouseEventArgs _) { ((Border)s).Opacity = 1.0; }; stackPanel4.Children.Add(border3); Border border4 = new Border { CornerRadius = new CornerRadius(8.0), Padding = new Thickness(14.0, 7.0, 14.0, 7.0), Background = new SolidColorBrush(Color.FromArgb(24, 167, 139, 250)), Cursor = System.Windows.Input.Cursors.Hand }; StackPanel stackPanel6 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; stackPanel6.Children.Add(new TextBlock { Text = "\ue9d9", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#A78BFA")), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 6.0, 0.0) }); stackPanel6.Children.Add(new TextBlock { Text = "실행 통계 보기", FontSize = 12.0, FontWeight = FontWeights.SemiBold, Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#A78BFA")) }); border4.Child = stackPanel6; border4.MouseLeftButtonUp += delegate { AgentStatsDashboardWindow agentStatsDashboardWindow = new AgentStatsDashboardWindow(); agentStatsDashboardWindow.Owner = Window.GetWindow((DependencyObject)(object)this); agentStatsDashboardWindow.ShowDialog(); }; border4.MouseEnter += delegate(object s, System.Windows.Input.MouseEventArgs _) { ((Border)s).Opacity = 0.8; }; border4.MouseLeave += delegate(object s, System.Windows.Input.MouseEventArgs _) { ((Border)s).Opacity = 1.0; }; stackPanel4.Children.Add(border4); list.Add(stackPanel4); TextBlock textBlock = new TextBlock(); textBlock.Text = $"슬래시 스킬 ({skills.Count})"; textBlock.FontSize = 13.0; textBlock.FontWeight = FontWeights.SemiBold; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.White; textBlock.Margin = new Thickness(2.0, 16.0, 0.0, 8.0); TextBlock element = textBlock; AgentEtcContent.Children.Insert(insertIdx++, element); foreach (UIElement item3 in list) { AgentEtcContent.Children.Insert(insertIdx++, item3); } } private Border CreateSkillGroupCard(string title, string icon, string colorHex, List skills) { //IL_0176: Unknown result type (might be due to invalid IL or missing references) Color color = (Color)ColorConverter.ConvertFromString(colorHex); Border border = new Border(); border.Background = (TryFindResource("ItemBackground") as Brush) ?? Brushes.White; border.CornerRadius = new CornerRadius(10.0); border.Padding = new Thickness(14.0, 10.0, 14.0, 10.0); border.Margin = new Thickness(0.0, 0.0, 0.0, 6.0); Border border2 = border; StackPanel stackPanel = new StackPanel(); StackPanel skillItemsPanel = new StackPanel { Visibility = Visibility.Collapsed }; TextBlock arrow = new TextBlock { Text = "\ue70d", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 9.0, Foreground = ((TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 6.0, 0.0), RenderTransformOrigin = new Point(0.5, 0.5), RenderTransform = new RotateTransform(0.0) }; Border border3 = new Border { Background = Brushes.Transparent, Cursor = System.Windows.Input.Cursors.Hand }; StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; stackPanel2.Children.Add(arrow); stackPanel2.Children.Add(new TextBlock { Text = icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 14.0, Foreground = new SolidColorBrush(color), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 8.0, 0.0) }); stackPanel2.Children.Add(new TextBlock { Text = $"{title} ({skills.Count})", FontSize = 12.5, FontWeight = FontWeights.SemiBold, Foreground = ((TryFindResource("PrimaryText") as Brush) ?? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1A1B2E"))), VerticalAlignment = VerticalAlignment.Center }); border3.Child = stackPanel2; border3.MouseLeftButtonDown += delegate(object s, MouseButtonEventArgs e) { e.Handled = true; bool flag = skillItemsPanel.Visibility == Visibility.Visible; skillItemsPanel.Visibility = (flag ? Visibility.Collapsed : Visibility.Visible); arrow.RenderTransform = new RotateTransform((!flag) ? 90 : 0); }; stackPanel.Children.Add(border3); skillItemsPanel.Children.Add(new Border { Height = 1.0, Background = ((TryFindResource("BorderColor") as Brush) ?? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F0F0F4"))), Margin = new Thickness(0.0, 2.0, 0.0, 4.0) }); foreach (SkillDefinition skill in skills) { StackPanel stackPanel3 = new StackPanel { Margin = new Thickness(0.0, 4.0, 0.0, 4.0) }; StackPanel stackPanel4 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; stackPanel4.Children.Add(new TextBlock { Text = "/" + skill.Name, FontSize = 12.0, FontFamily = new FontFamily("Consolas, Cascadia Code, Segoe UI"), Foreground = (skill.IsAvailable ? ((TryFindResource("AccentColor") as Brush) ?? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4B5EFC"))) : Brushes.Gray), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(4.0, 0.0, 8.0, 0.0), Opacity = (skill.IsAvailable ? 1.0 : 0.5) }); if (!skill.IsAvailable && !string.IsNullOrEmpty(skill.Requires)) { stackPanel4.Children.Add(new Border { Background = new SolidColorBrush(Color.FromArgb(32, 248, 113, 113)), CornerRadius = new CornerRadius(4.0), Padding = new Thickness(5.0, 1.0, 5.0, 1.0), VerticalAlignment = VerticalAlignment.Center, Child = new TextBlock { Text = skill.UnavailableHint, FontSize = 9.0, Foreground = new SolidColorBrush(Color.FromRgb(248, 113, 113)), FontWeight = FontWeights.SemiBold } }); } else if (skill.IsAvailable && !string.IsNullOrEmpty(skill.Requires)) { stackPanel4.Children.Add(new Border { Background = new SolidColorBrush(Color.FromArgb(32, 52, 211, 153)), CornerRadius = new CornerRadius(4.0), Padding = new Thickness(5.0, 1.0, 5.0, 1.0), VerticalAlignment = VerticalAlignment.Center, Child = new TextBlock { Text = "✓ 사용 가능", FontSize = 9.0, Foreground = new SolidColorBrush(Color.FromRgb(52, 211, 153)), FontWeight = FontWeights.SemiBold } }); } stackPanel3.Children.Add(stackPanel4); stackPanel3.Children.Add(new TextBlock { Text = skill.Label + " — " + skill.Description, FontSize = 11.5, Foreground = ((TryFindResource("SecondaryText") as Brush) ?? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#6666AA"))), TextWrapping = TextWrapping.Wrap, Margin = new Thickness(4.0, 3.0, 0.0, 0.0), Opacity = (skill.IsAvailable ? 1.0 : 0.5) }); skillItemsPanel.Children.Add(stackPanel3); } stackPanel.Children.Add(skillItemsPanel); border2.Child = stackPanel; return border2; } private void BuildTextActionCommandsPanel() { if (TextActionCommandsPanel == null) { return; } TextActionCommandsPanel.Children.Clear(); SettingsService svc = (System.Windows.Application.Current as App)?.SettingsService; if (svc == null) { return; } List enabled = svc.Settings.Launcher.TextActionCommands; Style style = TryFindResource("ToggleSwitch") as Style; foreach (var availableCommand in TextActionPopup.AvailableCommands) { string item = availableCommand.Key; string item2 = availableCommand.Label; Grid grid = new Grid { Margin = new Thickness(0.0, 3.0, 0.0, 3.0) }; grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); TextBlock textBlock = new TextBlock(); textBlock.Text = item2; textBlock.FontSize = 12.5; textBlock.VerticalAlignment = VerticalAlignment.Center; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; TextBlock element = textBlock; Grid.SetColumn(element, 0); grid.Children.Add(element); string capturedKey = item; System.Windows.Controls.CheckBox cb = new System.Windows.Controls.CheckBox { IsChecked = enabled.Contains(item, StringComparer.OrdinalIgnoreCase), HorizontalAlignment = System.Windows.HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center }; if (style != null) { cb.Style = style; } cb.Checked += delegate { if (!enabled.Contains(capturedKey)) { enabled.Add(capturedKey); } svc.Save(); }; cb.Unchecked += delegate { if (enabled.Count <= 1) { cb.IsChecked = true; } else { enabled.RemoveAll((string x) => x == capturedKey); svc.Save(); } }; Grid.SetColumn(cb, 1); grid.Children.Add(cb); TextActionCommandsPanel.Children.Add(grid); } } private void ThemeSubTab_Checked(object sender, RoutedEventArgs e) { if (ThemeSelectPanel != null && ThemeColorsPanel != null) { System.Windows.Controls.RadioButton themeSubTabSelect = ThemeSubTabSelect; if (themeSubTabSelect != null && themeSubTabSelect.IsChecked == true) { ThemeSelectPanel.Visibility = Visibility.Visible; ThemeColorsPanel.Visibility = Visibility.Collapsed; } else { ThemeSelectPanel.Visibility = Visibility.Collapsed; ThemeColorsPanel.Visibility = Visibility.Visible; } } } private void GeneralSubTab_Checked(object sender, RoutedEventArgs e) { if (GeneralMainPanel == null || GeneralNotifyPanel == null) { return; } if (!_notifyMoved && NotifyContent != null) { MoveNotifyTabContent(); _notifyMoved = true; } ScrollViewer generalMainPanel = GeneralMainPanel; System.Windows.Controls.RadioButton generalSubTabMain = GeneralSubTabMain; generalMainPanel.Visibility = ((generalSubTabMain == null || generalSubTabMain.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); ScrollViewer generalNotifyPanel = GeneralNotifyPanel; System.Windows.Controls.RadioButton generalSubTabNotify = GeneralSubTabNotify; generalNotifyPanel.Visibility = ((generalSubTabNotify == null || generalSubTabNotify.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); if (GeneralStoragePanel != null) { ScrollViewer generalStoragePanel = GeneralStoragePanel; System.Windows.Controls.RadioButton generalSubTabStorage = GeneralSubTabStorage; generalStoragePanel.Visibility = ((generalSubTabStorage == null || generalSubTabStorage.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); System.Windows.Controls.RadioButton generalSubTabStorage2 = GeneralSubTabStorage; if (generalSubTabStorage2 != null && generalSubTabStorage2.IsChecked == true) { RefreshStorageInfo2(); } } } private void MoveNotifyTabContent() { System.Windows.Controls.TabControl tabControl = ((base.Content is Grid grid) ? grid.Children.OfType().FirstOrDefault() : null) ?? FindVisualChild((DependencyObject)(object)this); if (tabControl == null) { return; } TabItem tabItem = null; foreach (TabItem item in (IEnumerable)tabControl.Items) { if (item.Header?.ToString() == "알림") { tabItem = item; break; } } if (tabItem?.Content is ScrollViewer { Content: StackPanel content }) { List list = content.Children.Cast().ToList(); content.Children.Clear(); foreach (UIElement item2 in list) { NotifyContent.Children.Add(item2); } } if (tabItem != null) { tabItem.Visibility = Visibility.Collapsed; } } private static T? FindVisualChild(DependencyObject parent) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { DependencyObject child = VisualTreeHelper.GetChild(parent, i); T val = (T)(object)((child is T) ? child : null); if (val != null) { return val; } T val2 = FindVisualChild(child); if (val2 != null) { return val2; } } return default(T); } private void BuildDockBarSettings() { SettingsService svc = (System.Windows.Application.Current as App)?.SettingsService; if (svc == null) { return; } LauncherSettings launcher = svc.Settings.Launcher; ChkDockAutoShow.IsChecked = launcher.DockBarAutoShow; ChkDockAutoShow.Checked += delegate { launcher.DockBarAutoShow = true; svc.Save(); (System.Windows.Application.Current as App)?.ToggleDockBar(); }; ChkDockAutoShow.Unchecked += delegate { launcher.DockBarAutoShow = false; svc.Save(); }; ChkDockRainbowGlow.IsChecked = launcher.DockBarRainbowGlow; ChkDockRainbowGlow.Checked += delegate { launcher.DockBarRainbowGlow = true; svc.Save(); RefreshDock(); }; ChkDockRainbowGlow.Unchecked += delegate { launcher.DockBarRainbowGlow = false; svc.Save(); RefreshDock(); }; SliderDockOpacity.Value = launcher.DockBarOpacity; SliderDockOpacity.ValueChanged += delegate(object _, RoutedPropertyChangedEventArgs e) { launcher.DockBarOpacity = e.NewValue; svc.Save(); RefreshDock(); }; if (DockItemsPanel == null) { return; } DockItemsPanel.Children.Clear(); Style style = TryFindResource("ToggleSwitch") as Style; List enabled = launcher.DockBarItems; foreach (var availableItem in DockBarWindow.AvailableItems) { string item = availableItem.Key; string item2 = availableItem.Icon; string item3 = availableItem.Tooltip; Grid grid = new Grid { Margin = new Thickness(0.0, 3.0, 0.0, 3.0) }; grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); TextBlock textBlock = new TextBlock(); textBlock.Text = item3 ?? ""; textBlock.FontSize = 12.5; textBlock.VerticalAlignment = VerticalAlignment.Center; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; TextBlock element = textBlock; Grid.SetColumn(element, 0); grid.Children.Add(element); string capturedKey = item; System.Windows.Controls.CheckBox checkBox = new System.Windows.Controls.CheckBox { IsChecked = enabled.Contains(item), HorizontalAlignment = System.Windows.HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center }; if (style != null) { checkBox.Style = style; } checkBox.Checked += delegate { if (!enabled.Contains(capturedKey)) { enabled.Add(capturedKey); } svc.Save(); RefreshDock(); }; checkBox.Unchecked += delegate { enabled.RemoveAll((string x) => x == capturedKey); svc.Save(); RefreshDock(); }; Grid.SetColumn(checkBox, 1); grid.Children.Add(checkBox); DockItemsPanel.Children.Add(grid); } } private static SolidColorBrush BrushFromHex(string hex) { try { return new SolidColorBrush((Color)ColorConverter.ConvertFromString(hex)); } catch { return new SolidColorBrush(Colors.Gray); } } private static void RefreshDock() { (System.Windows.Application.Current as App)?.RefreshDockBar(); } private void BtnDockResetPosition_Click(object sender, RoutedEventArgs e) { MessageBoxResult messageBoxResult = CustomMessageBox.Show("독 바를 화면 하단 중앙으로 이동하시겠습니까?", "독 바 위치 초기화", MessageBoxButton.YesNo, MessageBoxImage.Question); if (messageBoxResult == MessageBoxResult.Yes) { SettingsService settingsService = (System.Windows.Application.Current as App)?.SettingsService; if (settingsService != null) { settingsService.Settings.Launcher.DockBarLeft = -1.0; settingsService.Settings.Launcher.DockBarTop = -1.0; settingsService.Save(); (System.Windows.Application.Current as App)?.RefreshDockBar(); } } } private void RefreshStorageInfo() { if (StorageSummaryText == null) { return; } StorageReport storageReport = StorageAnalyzer.Analyze(); StorageSummaryText.Text = "앱 전체 사용량: " + StorageAnalyzer.FormatSize(storageReport.TotalAppUsage); StorageDriveText.Text = $"드라이브 {storageReport.DriveLabel} 여유: {StorageAnalyzer.FormatSize(storageReport.DriveFreeSpace)} / {StorageAnalyzer.FormatSize(storageReport.DriveTotalSpace)}"; if (StorageDetailPanel == null) { return; } StorageDetailPanel.Children.Clear(); (string, long)[] array = new(string, long)[8] { ("대화 기록", storageReport.Conversations), ("감사 로그", storageReport.AuditLogs), ("앱 로그", storageReport.Logs), ("코드 인덱스", storageReport.CodeIndex), ("임베딩 DB", storageReport.EmbeddingDb), ("클립보드 히스토리", storageReport.ClipboardHistory), ("플러그인", storageReport.Plugins), ("JSON 스킬", storageReport.Skills) }; (string, long)[] array2 = array; for (int i = 0; i < array2.Length; i++) { var (text, num) = array2[i]; if (num != 0) { Grid grid = new Grid { Margin = new Thickness(0.0, 2.0, 0.0, 2.0) }; grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); TextBlock textBlock = new TextBlock(); textBlock.Text = text; textBlock.FontSize = 12.0; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; textBlock.VerticalAlignment = VerticalAlignment.Center; TextBlock element = textBlock; Grid.SetColumn(element, 0); grid.Children.Add(element); TextBlock element2 = new TextBlock { Text = StorageAnalyzer.FormatSize(num), FontSize = 12.0, FontFamily = new FontFamily("Consolas"), Foreground = Brushes.Gray, VerticalAlignment = VerticalAlignment.Center }; Grid.SetColumn(element2, 1); grid.Children.Add(element2); StorageDetailPanel.Children.Add(grid); } } } private void BtnStorageRefresh_Click(object sender, RoutedEventArgs e) { RefreshStorageInfo(); } private void RefreshStorageInfo2() { if (StorageSummaryText2 == null) { return; } StorageReport storageReport = StorageAnalyzer.Analyze(); StorageSummaryText2.Text = "앱 전체 사용량: " + StorageAnalyzer.FormatSize(storageReport.TotalAppUsage); StorageDriveText2.Text = $"드라이브 {storageReport.DriveLabel} 여유: {StorageAnalyzer.FormatSize(storageReport.DriveFreeSpace)} / {StorageAnalyzer.FormatSize(storageReport.DriveTotalSpace)}"; if (StorageDetailPanel2 == null) { return; } StorageDetailPanel2.Children.Clear(); (string, long)[] array = new(string, long)[8] { ("대화 기록", storageReport.Conversations), ("감사 로그", storageReport.AuditLogs), ("앱 로그", storageReport.Logs), ("코드 인덱스", storageReport.CodeIndex), ("임베딩 DB", storageReport.EmbeddingDb), ("클립보드 히스토리", storageReport.ClipboardHistory), ("플러그인", storageReport.Plugins), ("JSON 스킬", storageReport.Skills) }; (string, long)[] array2 = array; for (int i = 0; i < array2.Length; i++) { var (text, num) = array2[i]; if (num != 0) { Grid grid = new Grid { Margin = new Thickness(0.0, 2.0, 0.0, 2.0) }; grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); TextBlock textBlock = new TextBlock(); textBlock.Text = text; textBlock.FontSize = 12.0; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; TextBlock element = textBlock; Grid.SetColumn(element, 0); grid.Children.Add(element); TextBlock element2 = new TextBlock { Text = StorageAnalyzer.FormatSize(num), FontSize = 12.0, FontFamily = new FontFamily("Consolas"), Foreground = Brushes.Gray }; Grid.SetColumn(element2, 1); grid.Children.Add(element2); StorageDetailPanel2.Children.Add(grid); } } } private void BtnStorageRefresh2_Click(object sender, RoutedEventArgs e) { RefreshStorageInfo2(); } private void BtnStorageCleanup_Click(object sender, RoutedEventArgs e) { Brush background = (TryFindResource("LauncherBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(26, 27, 46)); Brush brush = (TryFindResource("PrimaryText") as Brush) ?? Brushes.White; Brush foreground = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush brush2 = (TryFindResource("BorderColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(75, 94, 252)); Brush brush3 = (TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromArgb(16, byte.MaxValue, byte.MaxValue, byte.MaxValue)); Brush hoverBg = (TryFindResource("ItemHoverBackground") as Brush) ?? new SolidColorBrush(Color.FromArgb(34, byte.MaxValue, byte.MaxValue, byte.MaxValue)); Color color = ((TryFindResource("ShadowColor") is Color color2) ? color2 : Colors.Black); Window popup = new Window { WindowStyle = WindowStyle.None, AllowsTransparency = true, Background = Brushes.Transparent, Width = 360.0, SizeToContent = SizeToContent.Height, WindowStartupLocation = WindowStartupLocation.CenterOwner, Owner = this, ShowInTaskbar = false, Topmost = true }; int selectedDays = -1; Border border = new Border { Background = background, CornerRadius = new CornerRadius(14.0), BorderBrush = brush2, BorderThickness = new Thickness(1.0), Margin = new Thickness(16.0), Effect = new DropShadowEffect { BlurRadius = 20.0, ShadowDepth = 4.0, Opacity = 0.3, Color = color } }; StackPanel stackPanel = new StackPanel { Margin = new Thickness(24.0, 20.0, 24.0, 20.0) }; stackPanel.Children.Add(new TextBlock { Text = "보관 기간 선택", FontSize = 15.0, FontWeight = FontWeights.SemiBold, Foreground = brush, Margin = new Thickness(0.0, 0.0, 0.0, 6.0) }); stackPanel.Children.Add(new TextBlock { Text = "선택한 기간 이전의 데이터를 삭제합니다.\n※ 통계/대화 기록은 삭제되지 않습니다.", FontSize = 12.0, Foreground = foreground, TextWrapping = TextWrapping.Wrap, Margin = new Thickness(0.0, 0.0, 0.0, 16.0) }); (int, string)[] array = new(int, string)[4] { (7, "최근 7일만 보관"), (14, "최근 14일만 보관"), (30, "최근 30일만 보관"), (0, "전체 삭제") }; (int, string)[] array2 = array; for (int i = 0; i < array2.Length; i++) { (int, string) tuple = array2[i]; int item = tuple.Item1; string item2 = tuple.Item2; int d = item; bool flag = d == 0; SolidColorBrush solidColorBrush = new SolidColorBrush(Color.FromArgb(24, byte.MaxValue, 68, 68)); SolidColorBrush solidColorBrush2 = new SolidColorBrush(Color.FromArgb(64, byte.MaxValue, 68, 68)); SolidColorBrush solidColorBrush3 = new SolidColorBrush(Color.FromRgb(byte.MaxValue, 102, 102)); Border border2 = new Border { CornerRadius = new CornerRadius(10.0), Cursor = System.Windows.Input.Cursors.Hand, Padding = new Thickness(14.0, 10.0, 14.0, 10.0), Margin = new Thickness(0.0, 0.0, 0.0, 6.0), Background = (flag ? solidColorBrush : brush3), BorderBrush = (flag ? solidColorBrush2 : brush2), BorderThickness = new Thickness(1.0) }; border2.Child = new TextBlock { Text = item2, FontSize = 13.0, Foreground = (flag ? solidColorBrush3 : brush) }; Brush normalBg = (flag ? solidColorBrush : brush3); border2.MouseEnter += delegate(object s, System.Windows.Input.MouseEventArgs _) { if (s is Border border4) { border4.Background = hoverBg; } }; border2.MouseLeave += delegate(object s, System.Windows.Input.MouseEventArgs _) { if (s is Border border4) { border4.Background = normalBg; } }; border2.MouseLeftButtonUp += delegate { selectedDays = d; popup.Close(); }; stackPanel.Children.Add(border2); } Border border3 = new Border { CornerRadius = new CornerRadius(10.0), Cursor = System.Windows.Input.Cursors.Hand, Padding = new Thickness(14.0, 8.0, 14.0, 8.0), Margin = new Thickness(0.0, 6.0, 0.0, 0.0), Background = Brushes.Transparent }; border3.Child = new TextBlock { Text = "취소", FontSize = 12.0, Foreground = foreground, HorizontalAlignment = System.Windows.HorizontalAlignment.Center }; border3.MouseLeftButtonUp += delegate { popup.Close(); }; stackPanel.Children.Add(border3); border.Child = stackPanel; popup.Content = border; popup.ShowDialog(); if (selectedDays >= 0) { string message = ((selectedDays == 0) ? "전체 데이터를 삭제합니다. 정말 진행하시겠습니까?" : $"최근 {selectedDays}일 이전의 데이터를 삭제합니다. 정말 진행하시겠습니까?"); MessageBoxResult messageBoxResult = CustomMessageBox.Show(message, "삭제 확인", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); if (messageBoxResult == MessageBoxResult.Yes) { long bytes = StorageAnalyzer.Cleanup(selectedDays, cleanConversations: false, cleanAuditLogs: true, cleanLogs: true, cleanCodeIndex: true, selectedDays == 0); CustomMessageBox.Show(StorageAnalyzer.FormatSize(bytes) + "를 확보했습니다.", "정리 완료", MessageBoxButton.OK, MessageBoxImage.Asterisk); RefreshStorageInfo(); } } } private void BuildQuoteCategoryCheckboxes() { if (QuoteCategoryPanel == null) { return; } QuoteCategoryPanel.Children.Clear(); List enabled = _vm.GetReminderCategories(); Style style = TryFindResource("ToggleSwitch") as Style; (string, string, Func)[] categories = QuoteService.Categories; for (int i = 0; i < categories.Length; i++) { (string, string, Func) tuple = categories[i]; string item = tuple.Item1; string item2 = tuple.Item2; Func item3 = tuple.Item3; int value = item3(); string text = ((item == "today_events") ? $"{item2} ({value}개, 오늘 {QuoteService.GetTodayMatchCount()}개)" : $"{item2} ({value}개)"); Grid grid = new Grid { Margin = new Thickness(0.0, 3.0, 0.0, 3.0) }; grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); TextBlock textBlock = new TextBlock(); textBlock.Text = text; textBlock.FontSize = 12.5; textBlock.VerticalAlignment = VerticalAlignment.Center; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.White; TextBlock element = textBlock; Grid.SetColumn(element, 0); grid.Children.Add(element); System.Windows.Controls.CheckBox checkBox = new System.Windows.Controls.CheckBox { IsChecked = enabled.Contains(item, StringComparer.OrdinalIgnoreCase), Tag = item, HorizontalAlignment = System.Windows.HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center }; if (style != null) { checkBox.Style = style; } checkBox.Checked += delegate(object s, RoutedEventArgs _) { if (s is System.Windows.Controls.CheckBox { Tag: string tag } && !enabled.Contains(tag)) { enabled.Add(tag); } }; checkBox.Unchecked += delegate(object s, RoutedEventArgs _) { if (s is System.Windows.Controls.CheckBox { Tag: var tag }) { string k = tag as string; if (k != null) { enabled.RemoveAll((string x) => x.Equals(k, StringComparison.OrdinalIgnoreCase)); } } }; Grid.SetColumn(checkBox, 1); grid.Children.Add(checkBox); QuoteCategoryPanel.Children.Add(grid); } } private void SetVersionText() { try { Assembly executingAssembly = Assembly.GetExecutingAssembly(); FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(executingAssembly.Location); string text = versionInfo.ProductVersion ?? versionInfo.FileVersion ?? "?"; int num = text.IndexOf('+'); if (num > 0) { text = text.Substring(0, num); } VersionInfoText.Text = "AX Copilot · v" + text; } catch { VersionInfoText.Text = "AX Copilot"; } } private void RefreshHotkeyBadges() { } private void EnsureHotkeyInCombo() { if (HotkeyCombo == null) { return; } string hotkey = _vm.Hotkey; if (string.IsNullOrWhiteSpace(hotkey)) { return; } foreach (ComboBoxItem item in (IEnumerable)HotkeyCombo.Items) { if (item.Tag is string text && text == hotkey) { return; } } string text2 = hotkey.Replace("+", " + "); ComboBoxItem insertItem = new ComboBoxItem { Content = text2 + " (사용자 정의)", Tag = hotkey }; HotkeyCombo.Items.Insert(0, insertItem); HotkeyCombo.SelectedIndex = 0; } private void Window_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) { } private unsafe static string GetKeyName(Key key) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Invalid comparison between Unknown and I4 //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Expected I4, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Expected I4, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Invalid comparison between Unknown and I4 //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Invalid comparison between Unknown and I4 //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected I4, but got Unknown //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Invalid comparison between Unknown and I4 //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Invalid comparison between Unknown and I4 if (1 == 0) { } string result; if ((int)key >= 44) { if ((int)key >= 90) { if ((int)key > 101) { switch (key - 140) { case 6: break; case 3: goto IL_01d9; case 1: goto IL_01e1; case 9: goto IL_01e9; case 11: goto IL_01f1; case 10: case 14: goto IL_01f9; case 0: goto IL_0201; case 12: goto IL_0209; case 2: goto IL_0211; case 4: goto IL_0219; case 5: goto IL_0221; default: goto IL_0229; } result = "`"; } else { result = ((object)(*(Key*)(&key))/*cast due to .constrained prefix*/).ToString(); } } else { if ((int)key > 69) { goto IL_0229; } result = ((object)(*(Key*)(&key))/*cast due to .constrained prefix*/).ToString(); } } else if ((int)key < 34) { switch (key - 2) { case 16: goto IL_00fa; case 4: goto IL_0105; case 1: goto IL_0110; case 0: goto IL_011b; case 11: goto IL_0131; case 20: goto IL_013c; case 19: goto IL_0147; case 17: goto IL_0152; case 18: goto IL_015d; case 21: goto IL_0168; case 23: goto IL_0173; case 22: goto IL_017e; case 24: goto IL_0189; case 2: case 3: case 5: case 6: case 7: case 8: case 9: case 10: case 12: case 13: case 14: case 15: goto IL_0229; } if ((int)key != 31) { if ((int)key != 32) { goto IL_0229; } result = "Delete"; } else { result = "Insert"; } } else { result = (key - 34).ToString(); } goto IL_0239; IL_0219: result = "."; goto IL_0239; IL_0201: result = ";"; goto IL_0239; IL_01f1: result = "]"; goto IL_0239; IL_01e9: result = "["; goto IL_0239; IL_011b: result = "Backspace"; goto IL_0239; IL_0110: result = "Tab"; goto IL_0239; IL_0105: result = "Enter"; goto IL_0239; IL_0131: result = "Escape"; goto IL_0239; IL_00fa: result = "Space"; goto IL_0239; IL_0152: result = "PageUp"; goto IL_0239; IL_015d: result = "PageDown"; goto IL_0239; IL_0147: result = "End"; goto IL_0239; IL_013c: result = "Home"; goto IL_0239; IL_0168: result = "Left"; goto IL_0239; IL_017e: result = "Up"; goto IL_0239; IL_0173: result = "Right"; goto IL_0239; IL_0189: result = "Down"; goto IL_0239; IL_0209: result = "'"; goto IL_0239; IL_0229: result = ((object)(*(Key*)(&key))/*cast due to .constrained prefix*/).ToString(); goto IL_0239; IL_01f9: result = "\\"; goto IL_0239; IL_0239: if (1 == 0) { } return result; IL_01d9: result = "-"; goto IL_0239; IL_0211: result = ","; goto IL_0239; IL_0221: result = "/"; goto IL_0239; IL_01e1: result = "="; goto IL_0239; } private void HotkeyCombo_SelectionChanged(object sender, SelectionChangedEventArgs e) { } private async void BtnTestConnection_Click(object sender, RoutedEventArgs e) { System.Windows.Controls.Button btn = sender as System.Windows.Controls.Button; if (btn != null) { btn.Content = "테스트 중..."; } try { LlmService llm = new LlmService(_vm.Service); var (ok, msg) = await llm.TestConnectionAsync(); llm.Dispose(); CustomMessageBox.Show(msg, ok ? "연결 성공" : "연결 실패", MessageBoxButton.OK, ok ? MessageBoxImage.Asterisk : MessageBoxImage.Exclamation); } catch (Exception ex) { Exception ex2 = ex; CustomMessageBox.Show(ex2.Message, "오류", MessageBoxButton.OK, MessageBoxImage.Hand); } finally { if (btn != null) { btn.Content = "테스트"; } } } private string GetCurrentServiceSubTab() { System.Windows.Controls.RadioButton svcTabOllama = SvcTabOllama; if (svcTabOllama != null && svcTabOllama.IsChecked == true) { return "ollama"; } System.Windows.Controls.RadioButton svcTabVllm = SvcTabVllm; if (svcTabVllm != null && svcTabVllm.IsChecked == true) { return "vllm"; } System.Windows.Controls.RadioButton svcTabGemini = SvcTabGemini; if (svcTabGemini != null && svcTabGemini.IsChecked == true) { return "gemini"; } System.Windows.Controls.RadioButton svcTabClaude = SvcTabClaude; if (svcTabClaude != null && svcTabClaude.IsChecked == true) { return "claude"; } return _vm.LlmService; } private void BtnBrowseSkillFolder_Click(object sender, RoutedEventArgs e) { FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog { Description = "스킬 파일이 있는 폴더를 선택하세요", ShowNewFolderButton = true }; if (!string.IsNullOrEmpty(_vm.SkillsFolderPath) && Directory.Exists(_vm.SkillsFolderPath)) { folderBrowserDialog.SelectedPath = _vm.SkillsFolderPath; } if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { _vm.SkillsFolderPath = folderBrowserDialog.SelectedPath; } } private void BtnOpenSkillFolder_Click(object sender, RoutedEventArgs e) { string text = ((!string.IsNullOrEmpty(_vm.SkillsFolderPath) && Directory.Exists(_vm.SkillsFolderPath)) ? _vm.SkillsFolderPath : Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "AxCopilot", "skills")); if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } try { Process.Start("explorer.exe", text); } catch { } } private void SkillImport_Click(object sender, MouseButtonEventArgs e) { Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog { Filter = "스킬 패키지 (*.zip)|*.zip", Title = "가져올 스킬 zip 파일을 선택하세요" }; if (openFileDialog.ShowDialog() == true) { int num = SkillService.ImportSkills(openFileDialog.FileName); if (num > 0) { CustomMessageBox.Show($"스킬 {num}개를 성공적으로 가져왔습니\ufffd\ufffd.\n스킬 목록이 갱신됩니다.", "스킬 가져오기"); } else { CustomMessageBox.Show("스킬 가져오기에 실패했습니다.\nzip 파일에 .skill.md 또는 SKILL.md 파일이 포함되어야 합니다.", "스킬 가져오기"); } } } private void SkillExport_Click(object sender, MouseButtonEventArgs e) { IReadOnlyList skills = SkillService.Skills; if (skills.Count == 0) { CustomMessageBox.Show("내보낼 스킬이 없습니다.", "스킬 내보내기"); return; } Window popup = new Window { WindowStyle = WindowStyle.None, AllowsTransparency = true, Background = Brushes.Transparent, SizeToContent = SizeToContent.WidthAndHeight, WindowStartupLocation = WindowStartupLocation.CenterOwner, Owner = this, MaxHeight = 450.0 }; Brush background = (TryFindResource("LauncherBackground") as Brush) ?? Brushes.White; Brush foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; Brush foreground2 = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Border border = new Border { Background = background, CornerRadius = new CornerRadius(12.0), Padding = new Thickness(20.0), MinWidth = 360.0, Effect = new DropShadowEffect { BlurRadius = 20.0, ShadowDepth = 4.0, Opacity = 0.3, Color = Colors.Black } }; StackPanel stackPanel = new StackPanel(); stackPanel.Children.Add(new TextBlock { Text = "내보낼 스킬 선택", FontSize = 15.0, FontWeight = FontWeights.SemiBold, Foreground = foreground, Margin = new Thickness(0.0, 0.0, 0.0, 12.0) }); List<(System.Windows.Controls.CheckBox cb, SkillDefinition skill)> checkBoxes = new List<(System.Windows.Controls.CheckBox, SkillDefinition)>(); StackPanel stackPanel2 = new StackPanel(); foreach (SkillDefinition item in skills) { System.Windows.Controls.CheckBox checkBox = new System.Windows.Controls.CheckBox { Content = "/" + item.Name + " — " + item.Label, FontSize = 12.5, Foreground = foreground, Margin = new Thickness(0.0, 3.0, 0.0, 3.0), IsChecked = false }; checkBoxes.Add((checkBox, item)); stackPanel2.Children.Add(checkBox); } ScrollViewer element = new ScrollViewer { Content = stackPanel2, MaxHeight = 280.0, VerticalScrollBarVisibility = ScrollBarVisibility.Auto }; stackPanel.Children.Add(element); StackPanel stackPanel3 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal, HorizontalAlignment = System.Windows.HorizontalAlignment.Right, Margin = new Thickness(0.0, 14.0, 0.0, 0.0) }; Border border2 = new Border { Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F0F1F5")), CornerRadius = new CornerRadius(8.0), Padding = new Thickness(16.0, 7.0, 16.0, 7.0), Margin = new Thickness(0.0, 0.0, 8.0, 0.0), Cursor = System.Windows.Input.Cursors.Hand, Child = new TextBlock { Text = "취소", FontSize = 12.0, Foreground = foreground2 } }; border2.MouseLeftButtonUp += delegate { popup.Close(); }; stackPanel3.Children.Add(border2); Border border3 = new Border { Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4B5EFC")), CornerRadius = new CornerRadius(8.0), Padding = new Thickness(16.0, 7.0, 16.0, 7.0), Cursor = System.Windows.Input.Cursors.Hand, Child = new TextBlock { Text = "내보내기", FontSize = 12.0, FontWeight = FontWeights.SemiBold, Foreground = Brushes.White } }; border3.MouseLeftButtonUp += delegate { List list = (from x in checkBoxes where x.cb.IsChecked == true select x.skill).ToList(); if (list.Count == 0) { CustomMessageBox.Show("내보낼 스킬을 선택하세요.", "스킬 내보내기"); } else { FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog { Description = "스킬 zip을 저장할 폴더를 선택하세요" }; if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { int num = 0; foreach (SkillDefinition item2 in list) { string text = SkillService.ExportSkill(item2, folderBrowserDialog.SelectedPath); if (text != null) { num++; } } popup.Close(); if (num > 0) { CustomMessageBox.Show($"{num}개 스킬을 내보냈습니다.\n경로: {folderBrowserDialog.SelectedPath}", "스킬 내보내기"); } else { CustomMessageBox.Show("내보내기에 실패했습니다.", "스킬 내보내기"); } } } }; stackPanel3.Children.Add(border3); stackPanel.Children.Add(stackPanel3); border.Child = stackPanel; popup.Content = border; popup.KeyDown += delegate(object _, System.Windows.Input.KeyEventArgs ke) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 if ((int)ke.Key == 13) { popup.Close(); } }; popup.ShowDialog(); } private void BtnAddModel_Click(object sender, RoutedEventArgs e) { string currentServiceSubTab = GetCurrentServiceSubTab(); ModelRegistrationDialog modelRegistrationDialog = new ModelRegistrationDialog(currentServiceSubTab); modelRegistrationDialog.Owner = this; if (modelRegistrationDialog.ShowDialog() == true) { _vm.RegisteredModels.Add(new RegisteredModelRow { Alias = modelRegistrationDialog.ModelAlias, EncryptedModelName = CryptoService.EncryptIfEnabled(modelRegistrationDialog.ModelName, IsEncryptionEnabled), Service = currentServiceSubTab, Endpoint = modelRegistrationDialog.Endpoint, ApiKey = modelRegistrationDialog.ApiKey, AuthType = modelRegistrationDialog.AuthType, Cp4dUrl = modelRegistrationDialog.Cp4dUrl, Cp4dUsername = modelRegistrationDialog.Cp4dUsername, Cp4dPassword = CryptoService.EncryptIfEnabled(modelRegistrationDialog.Cp4dPassword, IsEncryptionEnabled) }); BuildFallbackModelsPanel(); } } private void BtnEditModel_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: RegisteredModelRow tag }) { string existingModel = CryptoService.DecryptIfEnabled(tag.EncryptedModelName, IsEncryptionEnabled); string existingCp4dPassword = CryptoService.DecryptIfEnabled(tag.Cp4dPassword ?? "", IsEncryptionEnabled); string currentServiceSubTab = GetCurrentServiceSubTab(); ModelRegistrationDialog modelRegistrationDialog = new ModelRegistrationDialog(currentServiceSubTab, tag.Alias, existingModel, tag.Endpoint, tag.ApiKey, tag.AuthType ?? "bearer", tag.Cp4dUrl ?? "", tag.Cp4dUsername ?? "", existingCp4dPassword); modelRegistrationDialog.Owner = this; if (modelRegistrationDialog.ShowDialog() == true) { tag.Alias = modelRegistrationDialog.ModelAlias; tag.EncryptedModelName = CryptoService.EncryptIfEnabled(modelRegistrationDialog.ModelName, IsEncryptionEnabled); tag.Service = currentServiceSubTab; tag.Endpoint = modelRegistrationDialog.Endpoint; tag.ApiKey = modelRegistrationDialog.ApiKey; tag.AuthType = modelRegistrationDialog.AuthType; tag.Cp4dUrl = modelRegistrationDialog.Cp4dUrl; tag.Cp4dUsername = modelRegistrationDialog.Cp4dUsername; tag.Cp4dPassword = CryptoService.EncryptIfEnabled(modelRegistrationDialog.Cp4dPassword, IsEncryptionEnabled); BuildFallbackModelsPanel(); } } } private void BtnDeleteModel_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: RegisteredModelRow tag }) { MessageBoxResult messageBoxResult = CustomMessageBox.Show("'" + tag.Alias + "' 모델을 삭제하시겠습니까?", "모델 삭제", MessageBoxButton.YesNo, MessageBoxImage.Question); if (messageBoxResult == MessageBoxResult.Yes) { _vm.RegisteredModels.Remove(tag); BuildFallbackModelsPanel(); } } } private void BtnAddTemplate_Click(object sender, RoutedEventArgs e) { PromptTemplateDialog promptTemplateDialog = new PromptTemplateDialog(); promptTemplateDialog.Owner = this; if (promptTemplateDialog.ShowDialog() == true) { _vm.PromptTemplates.Add(new PromptTemplateRow { Name = promptTemplateDialog.TemplateName, Content = promptTemplateDialog.TemplateContent }); } } private void BtnEditTemplate_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: PromptTemplateRow tag }) { PromptTemplateDialog promptTemplateDialog = new PromptTemplateDialog(tag.Name, tag.Content); promptTemplateDialog.Owner = this; if (promptTemplateDialog.ShowDialog() == true) { tag.Name = promptTemplateDialog.TemplateName; tag.Content = promptTemplateDialog.TemplateContent; } } } private void BtnDeleteTemplate_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: PromptTemplateRow tag }) { MessageBoxResult messageBoxResult = CustomMessageBox.Show("'" + tag.Name + "' 템플릿을 삭제하시겠습니까?", "템플릿 삭제", MessageBoxButton.YesNo, MessageBoxImage.Question); if (messageBoxResult == MessageBoxResult.Yes) { _vm.PromptTemplates.Remove(tag); } } } private void AgentSubTab_Checked(object sender, RoutedEventArgs e) { if (AgentPanelCommon == null) { return; } AgentPanelCommon.Visibility = ((AgentTabCommon.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); AgentPanelChat.Visibility = ((AgentTabChat.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); AgentPanelCoworkCode.Visibility = ((AgentTabCoworkCode.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); AgentPanelCowork.Visibility = ((AgentTabCowork.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); AgentPanelCode.Visibility = ((AgentTabCode.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); if (AgentPanelDev != null) { AgentPanelDev.Visibility = ((AgentTabDev.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); } if (AgentPanelEtc != null) { AgentPanelEtc.Visibility = ((AgentTabEtc.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); } if (AgentPanelTools != null) { bool valueOrDefault = AgentTabTools.IsChecked == true; AgentPanelTools.Visibility = ((!valueOrDefault) ? Visibility.Collapsed : Visibility.Visible); if (valueOrDefault) { LoadToolCards(); } } } private void LoadToolCards() { if (_toolCardsLoaded || ToolCardsPanel == null) { return; } _toolCardsLoaded = true; LlmSettings llmSettings = ((!(System.Windows.Application.Current is App app)) ? null : app.SettingsService?.Settings.Llm); using ToolRegistry toolRegistry = ToolRegistry.CreateDefault(); _disabledTools = new HashSet(llmSettings?.DisabledTools ?? new List(), StringComparer.OrdinalIgnoreCase); HashSet disabledTools = _disabledTools; Dictionary> dictionary = new Dictionary> { ["파일/검색"] = new List(), ["문서 생성"] = new List(), ["문서 품질"] = new List(), ["코드/개발"] = new List(), ["데이터/유틸"] = new List(), ["시스템"] = new List() }; Dictionary dictionary2 = new Dictionary(StringComparer.OrdinalIgnoreCase) { ["file_read"] = "파일/검색", ["file_write"] = "파일/검색", ["file_edit"] = "파일/검색", ["glob"] = "파일/검색", ["grep"] = "파일/검색", ["folder_map"] = "파일/검색", ["document_read"] = "파일/검색", ["file_watch"] = "파일/검색", ["excel_skill"] = "문서 생성", ["docx_skill"] = "문서 생성", ["csv_skill"] = "문서 생성", ["markdown_skill"] = "문서 생성", ["html_skill"] = "문서 생성", ["chart_skill"] = "문서 생성", ["batch_skill"] = "문서 생성", ["pptx_skill"] = "문서 생성", ["document_planner"] = "문서 생성", ["document_assembler"] = "문서 생성", ["document_review"] = "문서 품질", ["format_convert"] = "문서 품질", ["template_render"] = "문서 품질", ["text_summarize"] = "문서 품질", ["dev_env_detect"] = "코드/개발", ["build_run"] = "코드/개발", ["git_tool"] = "코드/개발", ["lsp"] = "코드/개발", ["sub_agent"] = "코드/개발", ["wait_agents"] = "코드/개발", ["code_search"] = "코드/개발", ["test_loop"] = "코드/개발", ["code_review"] = "코드/개발", ["project_rule"] = "코드/개발", ["process"] = "시스템", ["skill_manager"] = "시스템", ["memory"] = "시스템", ["clipboard"] = "시스템", ["notify"] = "시스템", ["env"] = "시스템", ["image_analyze"] = "시스템" }; foreach (IAgentTool item in toolRegistry.All) { string value; string key = (dictionary2.TryGetValue(item.Name, out value) ? value : "데이터/유틸"); if (dictionary.ContainsKey(key)) { dictionary[key].Add(item); } else { dictionary["데이터/유틸"].Add(item); } } Brush accentBrush = (TryFindResource("AccentColor") as Brush) ?? Brushes.CornflowerBlue; Brush secondaryText = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush itemBg = (TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(245, 245, 248)); foreach (KeyValuePair> item2 in dictionary) { if (item2.Value.Count == 0) { continue; } TextBlock textBlock = new TextBlock(); textBlock.Text = $"{item2.Key} ({item2.Value.Count})"; textBlock.FontSize = 13.0; textBlock.FontWeight = FontWeights.SemiBold; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; textBlock.Margin = new Thickness(0.0, 8.0, 0.0, 6.0); TextBlock element = textBlock; ToolCardsPanel.Children.Add(element); WrapPanel wrapPanel = new WrapPanel { Margin = new Thickness(0.0, 0.0, 0.0, 4.0) }; foreach (IAgentTool item3 in item2.Value.OrderBy((IAgentTool t) => t.Name)) { bool isEnabled = !disabledTools.Contains(item3.Name); Border element2 = CreateToolCard(item3, isEnabled, disabledTools, accentBrush, secondaryText, itemBg); wrapPanel.Children.Add(element2); } ToolCardsPanel.Children.Add(wrapPanel); } LoadMcpStatus(); } private Border CreateToolCard(IAgentTool tool, bool isEnabled, HashSet disabled, Brush accentBrush, Brush secondaryText, Brush itemBg) { Border card = new Border { Background = itemBg, CornerRadius = new CornerRadius(8.0), Padding = new Thickness(10.0, 8.0, 10.0, 8.0), Margin = new Thickness(0.0, 0.0, 8.0, 8.0), Width = 240.0, BorderBrush = (isEnabled ? Brushes.Transparent : new SolidColorBrush(Color.FromArgb(48, 220, 38, 38))), BorderThickness = new Thickness(1.0) }; Grid grid = new Grid(); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); StackPanel stackPanel = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; TextBlock textBlock = new TextBlock(); textBlock.Text = tool.Name; textBlock.FontSize = 12.0; textBlock.FontWeight = FontWeights.SemiBold; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; textBlock.TextTrimming = TextTrimming.CharacterEllipsis; TextBlock element = textBlock; stackPanel.Children.Add(element); string text = tool.Description; if (text.Length > 50) { text = text.Substring(0, 50) + "…"; } TextBlock element2 = new TextBlock { Text = text, FontSize = 10.5, Foreground = secondaryText, TextTrimming = TextTrimming.CharacterEllipsis, Margin = new Thickness(0.0, 2.0, 0.0, 0.0) }; stackPanel.Children.Add(element2); Grid.SetColumn(stackPanel, 0); grid.Children.Add(stackPanel); System.Windows.Controls.CheckBox checkBox = new System.Windows.Controls.CheckBox(); checkBox.IsChecked = isEnabled; checkBox.Style = TryFindResource("ToggleSwitch") as Style; checkBox.VerticalAlignment = VerticalAlignment.Center; checkBox.Margin = new Thickness(8.0, 0.0, 0.0, 0.0); System.Windows.Controls.CheckBox checkBox2 = checkBox; checkBox2.Checked += delegate { disabled.Remove(tool.Name); card.BorderBrush = Brushes.Transparent; }; checkBox2.Unchecked += delegate { disabled.Add(tool.Name); card.BorderBrush = new SolidColorBrush(Color.FromArgb(48, 220, 38, 38)); }; Grid.SetColumn(checkBox2, 1); grid.Children.Add(checkBox2); card.Child = grid; return card; } private void LoadMcpStatus() { if (McpStatusPanel == null) { return; } McpStatusPanel.Children.Clear(); List list = ((!(System.Windows.Application.Current is App app)) ? null : app.SettingsService?.Settings.Llm)?.McpServers; if (list == null || list.Count == 0) { McpStatusPanel.Children.Add(new TextBlock { Text = "등록된 MCP 서버가 없습니다.", FontSize = 12.0, Foreground = ((TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray), Margin = new Thickness(0.0, 4.0, 0.0, 0.0) }); return; } Brush background = (TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(245, 245, 248)); foreach (McpServerEntry item in list) { Border border = new Border { Background = background, CornerRadius = new CornerRadius(8.0), Padding = new Thickness(12.0, 8.0, 12.0, 8.0), Margin = new Thickness(0.0, 0.0, 0.0, 6.0) }; Grid grid = new Grid(); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); Border element = new Border { Width = 8.0, Height = 8.0, CornerRadius = new CornerRadius(4.0), Background = new SolidColorBrush(Color.FromRgb(52, 168, 83)), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 8.0, 0.0) }; Grid.SetColumn(element, 0); grid.Children.Add(element); StackPanel stackPanel = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; stackPanel.Children.Add(new TextBlock { Text = (item.Name ?? "(이름 없음)"), FontSize = 12.0, FontWeight = FontWeights.SemiBold, Foreground = ((TryFindResource("PrimaryText") as Brush) ?? Brushes.Black) }); stackPanel.Children.Add(new TextBlock { Text = (item.Command ?? ""), FontSize = 10.5, Foreground = ((TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray), TextTrimming = TextTrimming.CharacterEllipsis }); Grid.SetColumn(stackPanel, 1); grid.Children.Add(stackPanel); TextBlock element2 = new TextBlock { Text = "등록됨", FontSize = 11.0, Foreground = new SolidColorBrush(Color.FromRgb(52, 168, 83)), VerticalAlignment = VerticalAlignment.Center }; Grid.SetColumn(element2, 2); grid.Children.Add(element2); border.Child = grid; McpStatusPanel.Children.Add(border); } } private void FuncSubTab_Checked(object sender, RoutedEventArgs e) { if (FuncPanel_AI != null) { FuncPanel_AI.Visibility = ((FuncSubTab_AI.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); FuncPanel_Launcher.Visibility = ((FuncSubTab_Launcher.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); FuncPanel_Design.Visibility = ((FuncSubTab_Design.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); } } private void CollapsibleSection_Toggle(object sender, MouseButtonEventArgs e) { if (sender is Border { Tag: Expander tag }) { tag.IsExpanded = !tag.IsExpanded; } } private void ServiceSubTab_Checked(object sender, RoutedEventArgs e) { if (SvcPanelOllama != null) { SvcPanelOllama.Visibility = ((SvcTabOllama.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); SvcPanelVllm.Visibility = ((SvcTabVllm.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); SvcPanelGemini.Visibility = ((SvcTabGemini.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); SvcPanelClaude.Visibility = ((SvcTabClaude.IsChecked != true) ? Visibility.Collapsed : Visibility.Visible); } } private void ThemeCard_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: string tag }) { _vm.SelectTheme(tag); } } private void ColorSwatch_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: ColorRowModel tag }) { _vm.PickColor(tag); } } private void DevModeCheckBox_Checked(object sender, RoutedEventArgs e) { if (!(sender is System.Windows.Controls.CheckBox { IsChecked: var isChecked } checkBox) || isChecked != true || !base.IsLoaded) { return; } Brush background = (TryFindResource("LauncherBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(30, 30, 46)); Brush foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.White; Brush foreground2 = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush borderBrush = (TryFindResource("BorderColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(64, 64, 96)); Brush background2 = (TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(42, 42, 64)); Window dlg = new Window { Title = "개발자 모드 — 비밀번호 확인", Width = 340.0, SizeToContent = SizeToContent.Height, WindowStartupLocation = WindowStartupLocation.CenterOwner, Owner = this, ResizeMode = ResizeMode.NoResize, WindowStyle = WindowStyle.None, AllowsTransparency = true, Background = Brushes.Transparent }; Border border = new Border { Background = background, CornerRadius = new CornerRadius(12.0), BorderBrush = borderBrush, BorderThickness = new Thickness(1.0), Padding = new Thickness(20.0) }; StackPanel stackPanel = new StackPanel(); stackPanel.Children.Add(new TextBlock { Text = "\ud83d\udd12 개발자 모드 활성화", FontSize = 15.0, FontWeight = FontWeights.SemiBold, Foreground = foreground, Margin = new Thickness(0.0, 0.0, 0.0, 12.0) }); stackPanel.Children.Add(new TextBlock { Text = "비밀번호를 입력하세요:", FontSize = 12.0, Foreground = foreground2, Margin = new Thickness(0.0, 0.0, 0.0, 6.0) }); PasswordBox pwBox = new PasswordBox { FontSize = 14.0, Padding = new Thickness(8.0, 6.0, 8.0, 6.0), Background = background2, Foreground = foreground, BorderBrush = borderBrush, PasswordChar = '*' }; stackPanel.Children.Add(pwBox); StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal, HorizontalAlignment = System.Windows.HorizontalAlignment.Right, Margin = new Thickness(0.0, 16.0, 0.0, 0.0) }; System.Windows.Controls.Button button = new System.Windows.Controls.Button { Content = "취소", Padding = new Thickness(16.0, 6.0, 16.0, 6.0), Margin = new Thickness(0.0, 0.0, 8.0, 0.0) }; button.Click += delegate { dlg.DialogResult = false; }; stackPanel2.Children.Add(button); System.Windows.Controls.Button button2 = new System.Windows.Controls.Button { Content = "확인", Padding = new Thickness(16.0, 6.0, 16.0, 6.0), IsDefault = true }; button2.Click += delegate { if (pwBox.Password == "mouse12#") { dlg.DialogResult = true; } else { pwBox.Clear(); pwBox.Focus(); } }; stackPanel2.Children.Add(button2); stackPanel.Children.Add(stackPanel2); border.Child = stackPanel; dlg.Content = border; dlg.Loaded += delegate { pwBox.Focus(); }; if (dlg.ShowDialog() != true) { _vm.DevMode = false; checkBox.IsChecked = false; } UpdateDevModeContentVisibility(); } private void DevModeCheckBox_Unchecked(object sender, RoutedEventArgs e) { UpdateDevModeContentVisibility(); } private void UpdateDevModeContentVisibility() { if (DevModeContent != null) { DevModeContent.Visibility = ((!_vm.DevMode) ? Visibility.Collapsed : Visibility.Visible); } } private void ApplyAiEnabledState(bool enabled, bool init = false) { if (AiEnabledToggle != null && AiEnabledToggle.IsChecked != enabled) { AiEnabledToggle.IsChecked = enabled; } if (AgentTabItem != null) { AgentTabItem.Visibility = ((!enabled) ? Visibility.Collapsed : Visibility.Visible); } } private void AiEnabled_Changed(object sender, RoutedEventArgs e) { if (!base.IsLoaded) { return; } System.Windows.Controls.CheckBox aiEnabledToggle = AiEnabledToggle; if (aiEnabledToggle == null || aiEnabledToggle.IsChecked != true) { App app = System.Windows.Application.Current as App; if (app?.SettingsService?.Settings != null) { app.SettingsService.Settings.AiEnabled = false; app.SettingsService.Save(); } ApplyAiEnabledState(enabled: false); } else { if (System.Windows.Application.Current is App app2 && app2.SettingsService?.Settings.AiEnabled == true) { return; } Brush background = (TryFindResource("LauncherBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(30, 30, 46)); Brush foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.White; Brush foreground2 = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush borderBrush = (TryFindResource("BorderColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(64, 64, 96)); Brush background2 = (TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(42, 42, 64)); Window dlg = new Window { Title = "AI 기능 활성화 — 비밀번호 확인", Width = 340.0, SizeToContent = SizeToContent.Height, WindowStartupLocation = WindowStartupLocation.CenterOwner, Owner = this, ResizeMode = ResizeMode.NoResize, WindowStyle = WindowStyle.None, AllowsTransparency = true, Background = Brushes.Transparent }; Border border = new Border { Background = background, CornerRadius = new CornerRadius(12.0), BorderBrush = borderBrush, BorderThickness = new Thickness(1.0), Padding = new Thickness(20.0) }; StackPanel stackPanel = new StackPanel(); stackPanel.Children.Add(new TextBlock { Text = "\ud83d\udd12 AI 기능 활성화", FontSize = 15.0, FontWeight = FontWeights.SemiBold, Foreground = foreground, Margin = new Thickness(0.0, 0.0, 0.0, 12.0) }); stackPanel.Children.Add(new TextBlock { Text = "비밀번호를 입력하세요:", FontSize = 12.0, Foreground = foreground2, Margin = new Thickness(0.0, 0.0, 0.0, 6.0) }); PasswordBox pwBox = new PasswordBox { FontSize = 14.0, Padding = new Thickness(8.0, 6.0, 8.0, 6.0), Background = background2, Foreground = foreground, BorderBrush = borderBrush, PasswordChar = '*' }; stackPanel.Children.Add(pwBox); StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal, HorizontalAlignment = System.Windows.HorizontalAlignment.Right, Margin = new Thickness(0.0, 16.0, 0.0, 0.0) }; System.Windows.Controls.Button button = new System.Windows.Controls.Button { Content = "취소", Padding = new Thickness(16.0, 6.0, 16.0, 6.0), Margin = new Thickness(0.0, 0.0, 8.0, 0.0) }; button.Click += delegate { dlg.DialogResult = false; }; stackPanel2.Children.Add(button); System.Windows.Controls.Button button2 = new System.Windows.Controls.Button { Content = "확인", Padding = new Thickness(16.0, 6.0, 16.0, 6.0), IsDefault = true }; button2.Click += delegate { if (pwBox.Password == "axgo123!") { dlg.DialogResult = true; } else { pwBox.Clear(); pwBox.Focus(); } }; stackPanel2.Children.Add(button2); stackPanel.Children.Add(stackPanel2); border.Child = stackPanel; dlg.Content = border; dlg.Loaded += delegate { pwBox.Focus(); }; if (dlg.ShowDialog() == true) { App app3 = System.Windows.Application.Current as App; if (app3?.SettingsService?.Settings != null) { app3.SettingsService.Settings.AiEnabled = true; app3.SettingsService.Save(); } ApplyAiEnabledState(enabled: true); } else if (AiEnabledToggle != null) { AiEnabledToggle.IsChecked = false; } } } private void StepApprovalCheckBox_Checked(object sender, RoutedEventArgs e) { if (!(sender is System.Windows.Controls.CheckBox { IsChecked: var isChecked } checkBox) || isChecked != true || !base.IsLoaded) { return; } Brush background = (TryFindResource("LauncherBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(30, 30, 46)); Brush foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.White; Brush foreground2 = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush borderBrush = (TryFindResource("BorderColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(64, 64, 96)); Brush background2 = (TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(42, 42, 64)); Window dlg = new Window { Title = "스텝 바이 스텝 승인 — 비밀번호 확인", Width = 340.0, SizeToContent = SizeToContent.Height, WindowStartupLocation = WindowStartupLocation.CenterOwner, Owner = this, ResizeMode = ResizeMode.NoResize, WindowStyle = WindowStyle.None, AllowsTransparency = true, Background = Brushes.Transparent }; Border border = new Border { Background = background, CornerRadius = new CornerRadius(12.0), BorderBrush = borderBrush, BorderThickness = new Thickness(1.0), Padding = new Thickness(20.0) }; StackPanel stackPanel = new StackPanel(); stackPanel.Children.Add(new TextBlock { Text = "\ud83d\udd0d 스텝 바이 스텝 승인 활성화", FontSize = 15.0, FontWeight = FontWeights.SemiBold, Foreground = foreground, Margin = new Thickness(0.0, 0.0, 0.0, 12.0) }); stackPanel.Children.Add(new TextBlock { Text = "개발자 비밀번호를 입력하세요:", FontSize = 12.0, Foreground = foreground2, Margin = new Thickness(0.0, 0.0, 0.0, 6.0) }); PasswordBox pwBox = new PasswordBox { FontSize = 14.0, Padding = new Thickness(8.0, 6.0, 8.0, 6.0), Background = background2, Foreground = foreground, BorderBrush = borderBrush, PasswordChar = '*' }; stackPanel.Children.Add(pwBox); StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal, HorizontalAlignment = System.Windows.HorizontalAlignment.Right, Margin = new Thickness(0.0, 16.0, 0.0, 0.0) }; System.Windows.Controls.Button button = new System.Windows.Controls.Button { Content = "취소", Padding = new Thickness(16.0, 6.0, 16.0, 6.0), Margin = new Thickness(0.0, 0.0, 8.0, 0.0) }; button.Click += delegate { dlg.DialogResult = false; }; stackPanel2.Children.Add(button); System.Windows.Controls.Button button2 = new System.Windows.Controls.Button { Content = "확인", Padding = new Thickness(16.0, 6.0, 16.0, 6.0), IsDefault = true }; button2.Click += delegate { if (pwBox.Password == "mouse12#") { dlg.DialogResult = true; } else { pwBox.Clear(); pwBox.Focus(); } }; stackPanel2.Children.Add(button2); stackPanel.Children.Add(stackPanel2); border.Child = stackPanel; dlg.Content = border; dlg.Loaded += delegate { pwBox.Focus(); }; if (dlg.ShowDialog() != true) { checkBox.IsChecked = false; } } private void BtnClearMemory_Click(object sender, RoutedEventArgs e) { MessageBoxResult messageBoxResult = CustomMessageBox.Show("에이전트 메모리를 초기화하면 학습된 모든 규칙과 선호도가 삭제됩니다.\n계속하시겠습니까?", "에이전트 메모리 초기화", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); if (messageBoxResult == MessageBoxResult.Yes) { if (System.Windows.Application.Current is App app) { app.MemoryService?.Clear(); } CustomMessageBox.Show("에이전트 메모리가 초기화되었습니다.", "완료", MessageBoxButton.OK, MessageBoxImage.Asterisk); } } private void AddHookBtn_Click(object sender, MouseButtonEventArgs e) { ShowHookEditDialog(null, -1); } private static TextBlock CreatePlaceholder(string text, Brush foreground, string? currentValue) { return new TextBlock { Text = text, FontSize = 13.0, Foreground = foreground, Opacity = 0.45, IsHitTestVisible = false, VerticalAlignment = VerticalAlignment.Center, Padding = new Thickness(14.0, 8.0, 14.0, 8.0), Visibility = ((!string.IsNullOrEmpty(currentValue)) ? Visibility.Collapsed : Visibility.Visible) }; } private void ShowHookEditDialog(AgentHookEntry? existing, int index) { Brush background = (TryFindResource("LauncherBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(30, 30, 46)); Brush foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.White; Brush foreground2 = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush borderBrush = (TryFindResource("BorderColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(64, 64, 96)); Brush background2 = (TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(42, 42, 64)); Brush brush = (TryFindResource("AccentColor") as Brush) ?? Brushes.CornflowerBlue; bool isNew = existing == null; Window dlg = new Window { Title = (isNew ? "훅 추가" : "훅 편집"), Width = 420.0, SizeToContent = SizeToContent.Height, WindowStartupLocation = WindowStartupLocation.CenterOwner, Owner = this, ResizeMode = ResizeMode.NoResize, WindowStyle = WindowStyle.None, AllowsTransparency = true, Background = Brushes.Transparent }; Border border = new Border { Background = background, CornerRadius = new CornerRadius(12.0), BorderBrush = borderBrush, BorderThickness = new Thickness(1.0), Padding = new Thickness(20.0) }; StackPanel stackPanel = new StackPanel(); stackPanel.Children.Add(new TextBlock { Text = (isNew ? "⚙ 훅 추가" : "⚙ 훅 편집"), FontSize = 15.0, FontWeight = FontWeights.SemiBold, Foreground = foreground, Margin = new Thickness(0.0, 0.0, 0.0, 14.0) }); dlg.KeyDown += delegate(object _, System.Windows.Input.KeyEventArgs e) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 if ((int)e.Key == 13) { dlg.Close(); } }; stackPanel.Children.Add(new TextBlock { Text = "훅 이름", FontSize = 12.0, Foreground = foreground2, Margin = new Thickness(0.0, 0.0, 0.0, 4.0) }); System.Windows.Controls.TextBox nameBox = new System.Windows.Controls.TextBox { Text = (existing?.Name ?? ""), FontSize = 13.0, Foreground = foreground, Background = background2, BorderBrush = borderBrush, Padding = new Thickness(12.0, 8.0, 12.0, 8.0) }; TextBlock nameHolder = CreatePlaceholder("예: 코드 리뷰 후 알림", foreground2, existing?.Name); nameBox.TextChanged += delegate { nameHolder.Visibility = ((!string.IsNullOrEmpty(nameBox.Text)) ? Visibility.Collapsed : Visibility.Visible); }; Grid grid = new Grid(); grid.Children.Add(nameBox); grid.Children.Add(nameHolder); stackPanel.Children.Add(grid); stackPanel.Children.Add(new TextBlock { Text = "대상 도구 (* = 모든 도구)", FontSize = 12.0, Foreground = foreground2, Margin = new Thickness(0.0, 10.0, 0.0, 4.0) }); System.Windows.Controls.TextBox toolBox = new System.Windows.Controls.TextBox { Text = (existing?.ToolName ?? "*"), FontSize = 13.0, Foreground = foreground, Background = background2, BorderBrush = borderBrush, Padding = new Thickness(12.0, 8.0, 12.0, 8.0) }; TextBlock toolHolder = CreatePlaceholder("예: file_write, grep_tool", foreground2, existing?.ToolName ?? "*"); toolBox.TextChanged += delegate { toolHolder.Visibility = ((!string.IsNullOrEmpty(toolBox.Text)) ? Visibility.Collapsed : Visibility.Visible); }; Grid grid2 = new Grid(); grid2.Children.Add(toolBox); grid2.Children.Add(toolHolder); stackPanel.Children.Add(grid2); stackPanel.Children.Add(new TextBlock { Text = "실행 타이밍", FontSize = 12.0, Foreground = foreground2, Margin = new Thickness(0.0, 10.0, 0.0, 4.0) }); StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; System.Windows.Controls.RadioButton preRadio = new System.Windows.Controls.RadioButton { Content = "Pre (실행 전)", Foreground = foreground, FontSize = 13.0, Margin = new Thickness(0.0, 0.0, 16.0, 0.0), IsChecked = ((existing?.Timing ?? "post") == "pre") }; System.Windows.Controls.RadioButton element = new System.Windows.Controls.RadioButton { Content = "Post (실행 후)", Foreground = foreground, FontSize = 13.0, IsChecked = ((existing?.Timing ?? "post") != "pre") }; stackPanel2.Children.Add(preRadio); stackPanel2.Children.Add(element); stackPanel.Children.Add(stackPanel2); stackPanel.Children.Add(new TextBlock { Text = "스크립트 경로 (.bat / .cmd / .ps1)", FontSize = 12.0, Foreground = foreground2, Margin = new Thickness(0.0, 10.0, 0.0, 4.0) }); Grid grid3 = new Grid(); grid3.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid3.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); Grid grid4 = new Grid(); System.Windows.Controls.TextBox pathBox = new System.Windows.Controls.TextBox { Text = (existing?.ScriptPath ?? ""), FontSize = 13.0, Foreground = foreground, Background = background2, BorderBrush = borderBrush, Padding = new Thickness(12.0, 8.0, 12.0, 8.0) }; TextBlock pathHolder = CreatePlaceholder("예: C:\\scripts\\review-notify.bat", foreground2, existing?.ScriptPath); pathBox.TextChanged += delegate { pathHolder.Visibility = ((!string.IsNullOrEmpty(pathBox.Text)) ? Visibility.Collapsed : Visibility.Visible); }; grid4.Children.Add(pathBox); grid4.Children.Add(pathHolder); Grid.SetColumn(grid4, 0); grid3.Children.Add(grid4); Border border2 = new Border { Background = background2, CornerRadius = new CornerRadius(6.0), Padding = new Thickness(10.0, 6.0, 10.0, 6.0), Margin = new Thickness(6.0, 0.0, 0.0, 0.0), Cursor = System.Windows.Input.Cursors.Hand, VerticalAlignment = VerticalAlignment.Center }; border2.Child = new TextBlock { Text = "...", FontSize = 13.0, Foreground = brush }; border2.MouseLeftButtonUp += delegate { Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog { Filter = "스크립트 파일|*.bat;*.cmd;*.ps1|모든 파일|*.*", Title = "훅 스크립트 선택" }; if (openFileDialog.ShowDialog() == true) { pathBox.Text = openFileDialog.FileName; } }; Grid.SetColumn(border2, 1); grid3.Children.Add(border2); stackPanel.Children.Add(grid3); stackPanel.Children.Add(new TextBlock { Text = "추가 인수 (선택)", FontSize = 12.0, Foreground = foreground2, Margin = new Thickness(0.0, 10.0, 0.0, 4.0) }); System.Windows.Controls.TextBox argsBox = new System.Windows.Controls.TextBox { Text = (existing?.Arguments ?? ""), FontSize = 13.0, Foreground = foreground, Background = background2, BorderBrush = borderBrush, Padding = new Thickness(12.0, 8.0, 12.0, 8.0) }; TextBlock argsHolder = CreatePlaceholder("예: --verbose --output log.txt", foreground2, existing?.Arguments); argsBox.TextChanged += delegate { argsHolder.Visibility = ((!string.IsNullOrEmpty(argsBox.Text)) ? Visibility.Collapsed : Visibility.Visible); }; Grid grid5 = new Grid(); grid5.Children.Add(argsBox); grid5.Children.Add(argsHolder); stackPanel.Children.Add(grid5); StackPanel stackPanel3 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal, HorizontalAlignment = System.Windows.HorizontalAlignment.Right, Margin = new Thickness(0.0, 16.0, 0.0, 0.0) }; Border border3 = new Border { Background = background2, CornerRadius = new CornerRadius(8.0), Padding = new Thickness(16.0, 8.0, 16.0, 8.0), Margin = new Thickness(0.0, 0.0, 8.0, 0.0), Cursor = System.Windows.Input.Cursors.Hand }; border3.Child = new TextBlock { Text = "취소", FontSize = 13.0, Foreground = foreground2 }; border3.MouseLeftButtonUp += delegate { dlg.Close(); }; stackPanel3.Children.Add(border3); Border border4 = new Border { Background = brush, CornerRadius = new CornerRadius(8.0), Padding = new Thickness(16.0, 8.0, 16.0, 8.0), Cursor = System.Windows.Input.Cursors.Hand }; border4.Child = new TextBlock { Text = (isNew ? "추가" : "저장"), FontSize = 13.0, Foreground = Brushes.White, FontWeight = FontWeights.SemiBold }; border4.MouseLeftButtonUp += delegate { if (string.IsNullOrWhiteSpace(nameBox.Text) || string.IsNullOrWhiteSpace(pathBox.Text)) { CustomMessageBox.Show("훅 이름과 스크립트 경로를 입력하세요.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Exclamation); } else { AgentHookEntry agentHookEntry = new AgentHookEntry { Name = nameBox.Text.Trim(), ToolName = (string.IsNullOrWhiteSpace(toolBox.Text) ? "*" : toolBox.Text.Trim()), Timing = ((preRadio.IsChecked == true) ? "pre" : "post"), ScriptPath = pathBox.Text.Trim(), Arguments = argsBox.Text.Trim(), Enabled = (existing?.Enabled ?? true) }; List agentHooks = _vm.Service.Settings.Llm.AgentHooks; if (isNew) { agentHooks.Add(agentHookEntry); } else if (index >= 0 && index < agentHooks.Count) { agentHooks[index] = agentHookEntry; } BuildHookCards(); dlg.Close(); } }; stackPanel3.Children.Add(border4); stackPanel.Children.Add(stackPanel3); border.Child = stackPanel; dlg.Content = border; dlg.ShowDialog(); } private void BuildHookCards() { if (HookListPanel == null) { return; } HookListPanel.Children.Clear(); List hooks = _vm.Service.Settings.Llm.AgentHooks; Brush foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; Brush foreground2 = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush foreground3 = (TryFindResource("AccentColor") as Brush) ?? Brushes.Blue; for (int i = 0; i < hooks.Count; i++) { AgentHookEntry agentHookEntry = hooks[i]; int idx = i; Border border = new Border(); border.Background = (TryFindResource("ItemBackground") as Brush) ?? Brushes.LightGray; border.CornerRadius = new CornerRadius(8.0); border.Padding = new Thickness(10.0, 8.0, 10.0, 8.0); border.Margin = new Thickness(0.0, 0.0, 0.0, 4.0); Border border2 = border; Grid grid = new Grid(); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); System.Windows.Controls.CheckBox checkBox = new System.Windows.Controls.CheckBox(); checkBox.IsChecked = agentHookEntry.Enabled; checkBox.VerticalAlignment = VerticalAlignment.Center; checkBox.Margin = new Thickness(0.0, 0.0, 8.0, 0.0); checkBox.Style = TryFindResource("ToggleSwitch") as Style; System.Windows.Controls.CheckBox checkBox2 = checkBox; AgentHookEntry capturedHook = agentHookEntry; checkBox2.Checked += delegate { capturedHook.Enabled = true; }; checkBox2.Unchecked += delegate { capturedHook.Enabled = false; }; Grid.SetColumn(checkBox2, 0); grid.Children.Add(checkBox2); StackPanel stackPanel = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; string text = ((agentHookEntry.Timing == "pre") ? "PRE" : "POST"); string value = ((agentHookEntry.Timing == "pre") ? "#FF9800" : "#4CAF50"); StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal }; stackPanel2.Children.Add(new TextBlock { Text = agentHookEntry.Name, FontSize = 13.0, FontWeight = FontWeights.SemiBold, Foreground = foreground, VerticalAlignment = VerticalAlignment.Center }); stackPanel2.Children.Add(new Border { Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString(value)), CornerRadius = new CornerRadius(4.0), Padding = new Thickness(5.0, 1.0, 5.0, 1.0), Margin = new Thickness(6.0, 0.0, 0.0, 0.0), VerticalAlignment = VerticalAlignment.Center, Child = new TextBlock { Text = text, FontSize = 9.0, Foreground = Brushes.White, FontWeight = FontWeights.Bold } }); if (agentHookEntry.ToolName != "*") { stackPanel2.Children.Add(new Border { Background = new SolidColorBrush(Color.FromArgb(40, 100, 100, byte.MaxValue)), CornerRadius = new CornerRadius(4.0), Padding = new Thickness(5.0, 1.0, 5.0, 1.0), Margin = new Thickness(4.0, 0.0, 0.0, 0.0), VerticalAlignment = VerticalAlignment.Center, Child = new TextBlock { Text = agentHookEntry.ToolName, FontSize = 9.0, Foreground = foreground3 } }); } stackPanel.Children.Add(stackPanel2); stackPanel.Children.Add(new TextBlock { Text = Path.GetFileName(agentHookEntry.ScriptPath), FontSize = 11.0, Foreground = foreground2, TextTrimming = TextTrimming.CharacterEllipsis, MaxWidth = 200.0 }); Grid.SetColumn(stackPanel, 1); grid.Children.Add(stackPanel); Border border3 = new Border { Cursor = System.Windows.Input.Cursors.Hand, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(4.0, 0.0, 4.0, 0.0), Padding = new Thickness(6.0) }; border3.Child = new TextBlock { Text = "\ue70f", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, Foreground = foreground2 }; border3.MouseLeftButtonUp += delegate { ShowHookEditDialog(hooks[idx], idx); }; Grid.SetColumn(border3, 2); grid.Children.Add(border3); Border border4 = new Border { Cursor = System.Windows.Input.Cursors.Hand, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 0.0, 0.0), Padding = new Thickness(6.0) }; border4.Child = new TextBlock { Text = "\ue74d", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, Foreground = new SolidColorBrush(Color.FromRgb(239, 83, 80)) }; border4.MouseLeftButtonUp += delegate { hooks.RemoveAt(idx); BuildHookCards(); }; Grid.SetColumn(border4, 3); grid.Children.Add(border4); border2.Child = grid; HookListPanel.Children.Add(border2); } } private void BtnAddMcpServer_Click(object sender, RoutedEventArgs e) { InputDialog inputDialog = new InputDialog("MCP 서버 추가", "서버 이름:", "", "예: my-mcp-server"); inputDialog.Owner = this; if (inputDialog.ShowDialog() == true && !string.IsNullOrWhiteSpace(inputDialog.ResponseText)) { string name = inputDialog.ResponseText.Trim(); InputDialog inputDialog2 = new InputDialog("MCP 서버 추가", "실행 명령:", "", "예: npx -y @anthropic/mcp-server"); inputDialog2.Owner = this; if (inputDialog2.ShowDialog() == true && !string.IsNullOrWhiteSpace(inputDialog2.ResponseText)) { McpServerEntry item = new McpServerEntry { Name = name, Command = inputDialog2.ResponseText.Trim(), Enabled = true }; _vm.Service.Settings.Llm.McpServers.Add(item); BuildMcpServerCards(); } } } private void BuildMcpServerCards() { if (McpServerListPanel == null) { return; } McpServerListPanel.Children.Clear(); List servers = _vm.Service.Settings.Llm.McpServers; Brush foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; Brush foreground2 = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush brush = (TryFindResource("AccentColor") as Brush) ?? Brushes.Blue; for (int i = 0; i < servers.Count; i++) { McpServerEntry mcpServerEntry = servers[i]; int idx = i; Border border = new Border(); border.Background = TryFindResource("ItemBackground") as Brush; border.CornerRadius = new CornerRadius(10.0); border.Padding = new Thickness(14.0, 10.0, 14.0, 10.0); border.Margin = new Thickness(0.0, 4.0, 0.0, 0.0); border.BorderBrush = TryFindResource("BorderColor") as Brush; border.BorderThickness = new Thickness(1.0); Border border2 = border; Grid grid = new Grid(); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); StackPanel stackPanel = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; stackPanel.Children.Add(new TextBlock { Text = mcpServerEntry.Name, FontSize = 13.5, FontWeight = FontWeights.SemiBold, Foreground = foreground }); StackPanel stackPanel2 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal, Margin = new Thickness(0.0, 3.0, 0.0, 0.0) }; stackPanel2.Children.Add(new Border { Background = (mcpServerEntry.Enabled ? brush : Brushes.Gray), CornerRadius = new CornerRadius(4.0), Padding = new Thickness(6.0, 1.0, 6.0, 1.0), Margin = new Thickness(0.0, 0.0, 8.0, 0.0), Opacity = 0.8, Child = new TextBlock { Text = (mcpServerEntry.Enabled ? "활성" : "비활성"), FontSize = 10.0, Foreground = Brushes.White, FontWeight = FontWeights.SemiBold } }); stackPanel2.Children.Add(new TextBlock { Text = mcpServerEntry.Command + " " + string.Join(" ", mcpServerEntry.Args), FontSize = 11.0, Foreground = foreground2, VerticalAlignment = VerticalAlignment.Center, MaxWidth = 300.0, TextTrimming = TextTrimming.CharacterEllipsis }); stackPanel.Children.Add(stackPanel2); Grid.SetColumn(stackPanel, 0); grid.Children.Add(stackPanel); StackPanel stackPanel3 = new StackPanel { Orientation = System.Windows.Controls.Orientation.Horizontal, VerticalAlignment = VerticalAlignment.Center }; System.Windows.Controls.Button button = new System.Windows.Controls.Button { Content = (mcpServerEntry.Enabled ? "\ue73e" : "\ue711"), FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, ToolTip = (mcpServerEntry.Enabled ? "비활성화" : "활성화"), Background = Brushes.Transparent, BorderThickness = new Thickness(0.0), Foreground = (mcpServerEntry.Enabled ? brush : Brushes.Gray), Padding = new Thickness(6.0, 4.0, 6.0, 4.0), Cursor = System.Windows.Input.Cursors.Hand }; button.Click += delegate { servers[idx].Enabled = !servers[idx].Enabled; BuildMcpServerCards(); }; stackPanel3.Children.Add(button); System.Windows.Controls.Button button2 = new System.Windows.Controls.Button { Content = "\ue74d", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, ToolTip = "삭제", Background = Brushes.Transparent, BorderThickness = new Thickness(0.0), Foreground = new SolidColorBrush(Color.FromRgb(221, 68, 68)), Padding = new Thickness(6.0, 4.0, 6.0, 4.0), Cursor = System.Windows.Input.Cursors.Hand }; button2.Click += delegate { servers.RemoveAt(idx); BuildMcpServerCards(); }; stackPanel3.Children.Add(button2); Grid.SetColumn(stackPanel3, 1); grid.Children.Add(stackPanel3); border2.Child = grid; McpServerListPanel.Children.Add(border2); } } private void BtnOpenAuditLog_Click(object sender, RoutedEventArgs e) { try { Process.Start("explorer.exe", AuditLogService.GetAuditFolder()); } catch { } } private void BuildFallbackModelsPanel() { if (FallbackModelsPanel == null) { return; } FallbackModelsPanel.Children.Clear(); LlmSettings llm = _vm.Service.Settings.Llm; List fallbacks = llm.FallbackModels; Style style = TryFindResource("ToggleSwitch") as Style; (string, string, string, List)[] array = new(string, string, string, List)[4] { ("ollama", "Ollama", "#107C10", new List()), ("vllm", "vLLM", "#0078D4", new List()), ("gemini", "Gemini", "#4285F4", new List()), ("claude", "Claude", "#8B5CF6", new List()) }; foreach (RegisteredModelRow registeredModel in _vm.RegisteredModels) { string svc = (registeredModel.Service ?? "").ToLowerInvariant(); string text = ((!string.IsNullOrEmpty(registeredModel.Alias)) ? registeredModel.Alias : registeredModel.EncryptedModelName); (string, string, string, List) tuple = array.FirstOrDefault(((string Service, string Label, string Color, List Models) s) => s.Service == svc); if (tuple.Item4 != null && !string.IsNullOrEmpty(text) && !tuple.Item4.Contains(text)) { tuple.Item4.Add(text); } } foreach (RegisteredModel registeredModel2 in llm.RegisteredModels) { string svc2 = (registeredModel2.Service ?? "").ToLowerInvariant(); string text2 = ((!string.IsNullOrEmpty(registeredModel2.Alias)) ? registeredModel2.Alias : registeredModel2.EncryptedModelName); (string, string, string, List) tuple2 = array.FirstOrDefault(((string Service, string Label, string Color, List Models) s) => s.Service == svc2); if (tuple2.Item4 != null && !string.IsNullOrEmpty(text2) && !tuple2.Item4.Contains(text2)) { tuple2.Item4.Add(text2); } } if (!string.IsNullOrEmpty(llm.OllamaModel) && !array[0].Item4.Contains(llm.OllamaModel)) { array[0].Item4.Add(llm.OllamaModel); } if (!string.IsNullOrEmpty(llm.VllmModel) && !array[1].Item4.Contains(llm.VllmModel)) { array[1].Item4.Add(llm.VllmModel); } string[] array2 = new string[5] { "gemini-2.5-flash", "gemini-2.5-pro", "gemini-2.0-flash", "gemini-1.5-pro", "gemini-1.5-flash" }; foreach (string item in array2) { if (!array[2].Item4.Contains(item)) { array[2].Item4.Add(item); } } string[] array3 = new string[4] { "claude-sonnet-4-6", "claude-opus-4-6", "claude-haiku-4-5", "claude-sonnet-4-5" }; foreach (string item2 in array3) { if (!array[3].Item4.Contains(item2)) { array[3].Item4.Add(item2); } } (string, string, string, List)[] array4 = array; for (int num3 = 0; num3 < array4.Length; num3++) { var (text3, text4, hex, list) = array4[num3]; FallbackModelsPanel.Children.Add(new TextBlock { Text = text4, FontSize = 11.0, FontWeight = FontWeights.SemiBold, Foreground = BrushFromHex(hex), Margin = new Thickness(0.0, 8.0, 0.0, 4.0) }); if (list.Count == 0) { FallbackModelsPanel.Children.Add(new TextBlock { Text = "등록된 모델 없음", FontSize = 11.0, Foreground = Brushes.Gray, FontStyle = FontStyles.Italic, Margin = new Thickness(8.0, 2.0, 0.0, 4.0) }); continue; } foreach (string item3 in list) { string text5 = text3 + ":" + item3; Grid grid = new Grid { Margin = new Thickness(8.0, 2.0, 0.0, 2.0) }; grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); TextBlock textBlock = new TextBlock(); textBlock.Text = item3; textBlock.FontSize = 12.0; textBlock.FontFamily = new FontFamily("Consolas, Courier New"); textBlock.VerticalAlignment = VerticalAlignment.Center; textBlock.Foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.Black; TextBlock element = textBlock; Grid.SetColumn(element, 0); grid.Children.Add(element); string captured = text5; System.Windows.Controls.CheckBox checkBox = new System.Windows.Controls.CheckBox { IsChecked = fallbacks.Contains(text5, StringComparer.OrdinalIgnoreCase), HorizontalAlignment = System.Windows.HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center }; if (style != null) { checkBox.Style = style; } checkBox.Checked += delegate { if (!fallbacks.Contains(captured)) { fallbacks.Add(captured); } FallbackModelsBox.Text = string.Join("\n", fallbacks); }; checkBox.Unchecked += delegate { fallbacks.RemoveAll((string x) => x.Equals(captured, StringComparison.OrdinalIgnoreCase)); FallbackModelsBox.Text = string.Join("\n", fallbacks); }; Grid.SetColumn(checkBox, 1); grid.Children.Add(checkBox); FallbackModelsPanel.Children.Add(grid); } } } private void LoadAdvancedSettings() { LlmSettings llm = _vm.Service.Settings.Llm; if (FallbackModelsBox != null) { FallbackModelsBox.Text = string.Join("\n", llm.FallbackModels); } BuildFallbackModelsPanel(); if (McpServersBox != null) { try { string text = JsonSerializer.Serialize(llm.McpServers, new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); McpServersBox.Text = text; } catch { McpServersBox.Text = "[]"; } } BuildMcpServerCards(); BuildHookCards(); } private void SaveAdvancedSettings() { LlmSettings llm = _vm.Service.Settings.Llm; if (FallbackModelsBox != null) { llm.FallbackModels = (from s in FallbackModelsBox.Text.Split('\n', StringSplitOptions.RemoveEmptyEntries) select s.Trim() into s where s.Length > 0 select s).ToList(); } if (McpServersBox != null && !string.IsNullOrWhiteSpace(McpServersBox.Text)) { try { llm.McpServers = JsonSerializer.Deserialize>(McpServersBox.Text) ?? new List(); } catch { } } if (_toolCardsLoaded) { llm.DisabledTools = _disabledTools.ToList(); } } private void AddSnippet_Click(object sender, RoutedEventArgs e) { if (!_vm.AddSnippet()) { CustomMessageBox.Show("키워드와 내용은 필수 항목입니다.\n동일한 키워드가 이미 존재하면 추가할 수 없습니다.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Exclamation); } } private void DeleteSnippet_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: SnippetRowModel tag }) { _vm.RemoveSnippet(tag); } } private void Browse_Click(object sender, RoutedEventArgs e) { _vm.BrowseTarget(); } private void AddShortcut_Click(object sender, RoutedEventArgs e) { if (!_vm.AddShortcut()) { CustomMessageBox.Show("키워드와 실행 대상은 필수 항목입니다.\n이미 동일한 키워드가 존재하면 추가할 수 없습니다.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Exclamation); } } private void DeleteShortcut_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: AppShortcutModel tag }) { _vm.RemoveShortcut(tag); } } private void AddBatchCommand_Click(object sender, RoutedEventArgs e) { if (!_vm.AddBatchCommand()) { CustomMessageBox.Show("키워드와 명령어는 필수 항목입니다.\n동일한 키워드가 이미 존재하면 추가할 수 없습니다.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Exclamation); } } private void DeleteBatchCommand_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: BatchCommandModel tag }) { _vm.RemoveBatchCommand(tag); } } private void ResetCommandAliases_Click(object sender, RoutedEventArgs e) { _vm.ResetSystemCommandAliases(); } private void AddIndexPath_Click(object sender, RoutedEventArgs e) { string text = NewIndexPathBox?.Text?.Trim() ?? ""; if (!string.IsNullOrWhiteSpace(text)) { _vm.AddIndexPath(text); if (NewIndexPathBox != null) { NewIndexPathBox.Text = ""; } } } private void BrowseIndexPath_Click(object sender, RoutedEventArgs e) { _vm.BrowseIndexPath(); } private void ResetCapPrefix_Click(object sender, RoutedEventArgs e) { _vm.ResetCapPrefix(); } private void ResetCapGlobalHotkey_Click(object sender, RoutedEventArgs e) { _vm.ResetCapGlobalHotkey(); } private unsafe void CapHotkeyRecorder_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Invalid comparison between Unknown and I4 //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Invalid comparison between Unknown and I4 //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Invalid comparison between Unknown and I4 //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Invalid comparison between Unknown and I4 //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Invalid comparison between Unknown and I4 //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Invalid comparison between Unknown and I4 e.Handled = true; Key val = (((int)e.Key == 156) ? e.SystemKey : e.Key); bool flag = ((val - 70 <= 1 || val - 116 <= 5) ? true : false); if (!flag && (int)val != 13) { List list = new List(); if (((Enum)Keyboard.Modifiers).HasFlag((Enum)(object)(ModifierKeys)2)) { list.Add("Ctrl"); } if (((Enum)Keyboard.Modifiers).HasFlag((Enum)(object)(ModifierKeys)1)) { list.Add("Alt"); } if (((Enum)Keyboard.Modifiers).HasFlag((Enum)(object)(ModifierKeys)4)) { list.Add("Shift"); } if (((Enum)Keyboard.Modifiers).HasFlag((Enum)(object)(ModifierKeys)8)) { list.Add("Win"); } if (1 == 0) { } string text = (((int)val == 7) ? "Pause" : (((int)val == 30) ? "PrintScreen" : (((int)val != 115) ? ((object)(*(Key*)(&val))/*cast due to .constrained prefix*/).ToString() : "ScrollLock"))); if (1 == 0) { } string item = text; list.Add(item); string text2 = string.Join("+", list); if (HotkeyParser.TryParse(text2, out var _)) { _vm.CapGlobalHotkey = text2; } } } private void ReminderCorner_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.RadioButton { Tag: string tag }) { _vm.ReminderCorner = tag; } } private void ReminderPreview_Click(object sender, RoutedEventArgs e) { try { SettingsService service = _vm.Service; (string Text, string? Author) random = QuoteService.GetRandom(service.Settings.Reminder.EnabledCategories); string item = random.Text; string item2 = random.Author; TimeSpan todayUsage = TimeSpan.FromMinutes(42.0); ReminderSettings reminder = service.Settings.Reminder; string corner = reminder.Corner; int displaySeconds = reminder.DisplaySeconds; reminder.Corner = _vm.ReminderCorner; reminder.DisplaySeconds = _vm.ReminderDisplaySeconds; ReminderPopupWindow reminderPopupWindow = new ReminderPopupWindow(item, item2, todayUsage, service); reminderPopupWindow.Show(); reminder.Corner = corner; reminder.DisplaySeconds = displaySeconds; } catch (Exception ex) { LogService.Warn("알림 미리보기 실패: " + ex.Message); } } private void RemoveIndexPath_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: string tag }) { _vm.RemoveIndexPath(tag); } } private void AddExtension_Click(object sender, RoutedEventArgs e) { string text = NewExtensionBox?.Text?.Trim() ?? ""; if (!string.IsNullOrWhiteSpace(text)) { _vm.AddExtension(text); if (NewExtensionBox != null) { NewExtensionBox.Text = ""; } } } private void RemoveExtension_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button { Tag: string tag }) { _vm.RemoveExtension(tag); } } private void Save_Click(object sender, RoutedEventArgs e) { SaveAdvancedSettings(); _vm.Save(); CustomMessageBox.Show("설정이 저장되었습니다.", "AX Copilot", MessageBoxButton.OK, MessageBoxImage.Asterisk); } private void Cancel_Click(object sender, RoutedEventArgs e) { Close(); } private void ExportSettings_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.SaveFileDialog saveFileDialog = new Microsoft.Win32.SaveFileDialog { Title = "설정 내보내기", Filter = "AX Copilot 설정|*.axsettings", FileName = $"AxCopilot_Settings_{DateTime.Now:yyyyMMdd}", DefaultExt = ".axsettings" }; if (saveFileDialog.ShowDialog() != true) { return; } try { string settingsPath = SettingsService.SettingsPath; if (File.Exists(settingsPath)) { File.Copy(settingsPath, saveFileDialog.FileName, overwrite: true); CustomMessageBox.Show("설정이 내보내졌습니다:\n" + saveFileDialog.FileName, "AX Copilot", MessageBoxButton.OK, MessageBoxImage.Asterisk); } } catch (Exception ex) { CustomMessageBox.Show("내보내기 실패: " + ex.Message, "오류"); } } private void ImportSettings_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog { Title = "설정 불러오기", Filter = "AX Copilot 설정|*.axsettings|모든 파일|*.*" }; if (openFileDialog.ShowDialog() != true) { return; } MessageBoxResult messageBoxResult = CustomMessageBox.Show("설정을 불러오면 현재 설정이 덮어씌워집니다.\n계속하시겠습니까?", "AX Copilot — 설정 불러오기", MessageBoxButton.YesNo, MessageBoxImage.Question); if (messageBoxResult != MessageBoxResult.Yes) { return; } try { string text = File.ReadAllText(openFileDialog.FileName); string text2 = CryptoService.PortableDecrypt(text); if (string.IsNullOrEmpty(text2)) { try { AppSettings appSettings = JsonSerializer.Deserialize(text); if (appSettings != null) { text2 = text; } } catch { } } if (string.IsNullOrEmpty(text2)) { CustomMessageBox.Show("유효하지 않은 설정 파일입니다.", "오류"); return; } AppSettings appSettings2 = JsonSerializer.Deserialize(text2); if (appSettings2 == null) { CustomMessageBox.Show("설정 파일을 파싱할 수 없습니다.", "오류"); return; } string contents = CryptoService.PortableEncrypt(text2); File.WriteAllText(SettingsService.SettingsPath, contents); CustomMessageBox.Show("설정이 불러와졌습니다.\n변경 사항을 적용하려면 앱을 재시작하세요.", "AX Copilot", MessageBoxButton.OK, MessageBoxImage.Asterisk); Close(); } catch (Exception ex) { CustomMessageBox.Show("불러오기 실패: " + ex.Message, "오류"); } } protected override void OnClosing(CancelEventArgs e) { base.OnClosing(e); } protected override void OnClosed(EventArgs e) { if (!_saved) { _revertCallback(); } base.OnClosed(e); } [DebuggerNonUserCode] [GeneratedCode("PresentationBuildTasks", "10.0.5.0")] public void InitializeComponent() { if (!_contentLoaded) { _contentLoaded = true; Uri resourceLocator = new Uri("/AxCopilot;component/views/settingswindow.xaml", UriKind.Relative); System.Windows.Application.LoadComponent(this, resourceLocator); } } [DebuggerNonUserCode] [GeneratedCode("PresentationBuildTasks", "10.0.5.0")] [EditorBrowsable(EditorBrowsableState.Never)] void IComponentConnector.Connect(int connectionId, object target) { switch (connectionId) { case 1: ((SettingsWindow)target).PreviewKeyDown += Window_PreviewKeyDown; break; case 2: GeneralSubTabMain = (System.Windows.Controls.RadioButton)target; GeneralSubTabMain.Checked += GeneralSubTab_Checked; break; case 3: GeneralSubTabNotify = (System.Windows.Controls.RadioButton)target; GeneralSubTabNotify.Checked += GeneralSubTab_Checked; break; case 4: GeneralSubTabStorage = (System.Windows.Controls.RadioButton)target; GeneralSubTabStorage.Checked += GeneralSubTab_Checked; break; case 5: GeneralMainPanel = (ScrollViewer)target; break; case 6: AiEnabledToggle = (System.Windows.Controls.CheckBox)target; AiEnabledToggle.Checked += AiEnabled_Changed; AiEnabledToggle.Unchecked += AiEnabled_Changed; break; case 7: HotkeyCombo = (System.Windows.Controls.ComboBox)target; HotkeyCombo.SelectionChanged += HotkeyCombo_SelectionChanged; break; case 9: NewIndexPathBox = (System.Windows.Controls.TextBox)target; break; case 10: ((System.Windows.Controls.Button)target).Click += BrowseIndexPath_Click; break; case 11: ((System.Windows.Controls.Button)target).Click += AddIndexPath_Click; break; case 13: NewExtensionBox = (System.Windows.Controls.TextBox)target; break; case 14: ((System.Windows.Controls.Button)target).Click += AddExtension_Click; break; case 15: GeneralNotifyPanel = (ScrollViewer)target; break; case 16: NotifyContent = (StackPanel)target; break; case 17: GeneralStoragePanel = (ScrollViewer)target; break; case 18: StorageSummaryText2 = (TextBlock)target; break; case 19: StorageDriveText2 = (TextBlock)target; break; case 20: ((System.Windows.Controls.Button)target).Click += BtnStorageRefresh2_Click; break; case 21: ((System.Windows.Controls.Button)target).Click += BtnStorageCleanup_Click; break; case 22: StorageDetailPanel2 = (StackPanel)target; break; case 23: ThemeSubTabSelect = (System.Windows.Controls.RadioButton)target; ThemeSubTabSelect.Checked += ThemeSubTab_Checked; break; case 24: ThemeSubTabColors = (System.Windows.Controls.RadioButton)target; ThemeSubTabColors.Checked += ThemeSubTab_Checked; break; case 25: ThemeSelectPanel = (ScrollViewer)target; break; case 26: ThemeCardsPanel = (ItemsControl)target; break; case 28: ThemeColorsPanel = (Grid)target; break; case 30: ChkDockAutoShow = (System.Windows.Controls.CheckBox)target; break; case 31: ChkDockRainbowGlow = (System.Windows.Controls.CheckBox)target; break; case 32: SliderDockOpacity = (Slider)target; break; case 33: ((System.Windows.Controls.Button)target).Click += BtnDockResetPosition_Click; break; case 34: DockItemsPanel = (StackPanel)target; break; case 35: ((System.Windows.Controls.Button)target).Click += AddSnippet_Click; break; case 37: ((System.Windows.Controls.Button)target).Click += ResetCapPrefix_Click; break; case 38: ((System.Windows.Controls.TextBox)target).PreviewKeyDown += CapHotkeyRecorder_PreviewKeyDown; break; case 39: ((System.Windows.Controls.Button)target).Click += ResetCapGlobalHotkey_Click; break; case 40: ((System.Windows.Controls.RadioButton)target).Click += ReminderCorner_Click; break; case 41: ((System.Windows.Controls.RadioButton)target).Click += ReminderCorner_Click; break; case 42: ((System.Windows.Controls.RadioButton)target).Click += ReminderCorner_Click; break; case 43: ((System.Windows.Controls.RadioButton)target).Click += ReminderCorner_Click; break; case 44: QuoteCategoryPanel = (StackPanel)target; break; case 45: ((System.Windows.Controls.Button)target).Click += ReminderPreview_Click; break; case 46: ((System.Windows.Controls.Button)target).Click += ResetCommandAliases_Click; break; case 47: ((System.Windows.Controls.Button)target).Click += Browse_Click; break; case 48: ((System.Windows.Controls.Button)target).Click += AddShortcut_Click; break; case 50: ((System.Windows.Controls.Button)target).Click += AddBatchCommand_Click; break; case 52: FunctionSubTabBar = (StackPanel)target; break; case 53: FuncSubTab_AI = (System.Windows.Controls.RadioButton)target; FuncSubTab_AI.Checked += FuncSubTab_Checked; break; case 54: FuncSubTab_Launcher = (System.Windows.Controls.RadioButton)target; FuncSubTab_Launcher.Checked += FuncSubTab_Checked; break; case 55: FuncSubTab_Design = (System.Windows.Controls.RadioButton)target; FuncSubTab_Design.Checked += FuncSubTab_Checked; break; case 56: FuncPanel_AI = (ScrollViewer)target; break; case 57: ChkEnableTextAction = (System.Windows.Controls.CheckBox)target; break; case 58: TextActionCommandsPanel = (StackPanel)target; break; case 59: ChkEnableFileDialog = (System.Windows.Controls.CheckBox)target; break; case 60: FuncPanel_Launcher = (ScrollViewer)target; break; case 61: FuncPanel_Design = (ScrollViewer)target; break; case 62: ChkEnableAutoCategory = (System.Windows.Controls.CheckBox)target; break; case 63: AgentTabItem = (TabItem)target; break; case 64: AgentSubTabs = (StackPanel)target; break; case 65: AgentTabCommon = (System.Windows.Controls.RadioButton)target; AgentTabCommon.Checked += AgentSubTab_Checked; break; case 66: AgentTabChat = (System.Windows.Controls.RadioButton)target; AgentTabChat.Checked += AgentSubTab_Checked; break; case 67: AgentTabCoworkCode = (System.Windows.Controls.RadioButton)target; AgentTabCoworkCode.Checked += AgentSubTab_Checked; break; case 68: AgentTabCowork = (System.Windows.Controls.RadioButton)target; AgentTabCowork.Checked += AgentSubTab_Checked; break; case 69: AgentTabCode = (System.Windows.Controls.RadioButton)target; AgentTabCode.Checked += AgentSubTab_Checked; break; case 70: AgentTabDev = (System.Windows.Controls.RadioButton)target; AgentTabDev.Checked += AgentSubTab_Checked; break; case 71: AgentTabTools = (System.Windows.Controls.RadioButton)target; AgentTabTools.Checked += AgentSubTab_Checked; break; case 72: AgentTabEtc = (System.Windows.Controls.RadioButton)target; AgentTabEtc.Checked += AgentSubTab_Checked; break; case 73: AgentPanelCommon = (ScrollViewer)target; break; case 74: ServiceSubTabs = (StackPanel)target; break; case 75: SvcTabOllama = (System.Windows.Controls.RadioButton)target; SvcTabOllama.Checked += ServiceSubTab_Checked; break; case 76: SvcTabVllm = (System.Windows.Controls.RadioButton)target; SvcTabVllm.Checked += ServiceSubTab_Checked; break; case 77: SvcTabGemini = (System.Windows.Controls.RadioButton)target; SvcTabGemini.Checked += ServiceSubTab_Checked; break; case 78: SvcTabClaude = (System.Windows.Controls.RadioButton)target; SvcTabClaude.Checked += ServiceSubTab_Checked; break; case 79: SvcPanelOllama = (StackPanel)target; break; case 80: BtnAddModel = (System.Windows.Controls.Button)target; BtnAddModel.Click += BtnAddModel_Click; break; case 83: CboActiveModel = (System.Windows.Controls.ComboBox)target; break; case 84: SvcPanelVllm = (StackPanel)target; break; case 85: BtnAddVllmModel = (System.Windows.Controls.Button)target; BtnAddVllmModel.Click += BtnAddModel_Click; break; case 88: CboActiveVllmModel = (System.Windows.Controls.ComboBox)target; break; case 89: SvcPanelGemini = (StackPanel)target; break; case 90: SvcPanelClaude = (StackPanel)target; break; case 91: BtnTestConnection = (System.Windows.Controls.Button)target; BtnTestConnection.Click += BtnTestConnection_Click; break; case 92: StorageSummaryText = (TextBlock)target; break; case 93: StorageDriveText = (TextBlock)target; break; case 94: ((System.Windows.Controls.Button)target).Click += BtnStorageRefresh_Click; break; case 95: ((System.Windows.Controls.Button)target).Click += BtnStorageCleanup_Click; break; case 96: StorageDetailPanel = (StackPanel)target; break; case 97: AgentBlockSection = (StackPanel)target; break; case 98: HookListPanel = (StackPanel)target; break; case 99: ((Border)target).MouseLeftButtonUp += AddHookBtn_Click; break; case 100: BtnBrowseSkillFolder = (System.Windows.Controls.Button)target; BtnBrowseSkillFolder.Click += BtnBrowseSkillFolder_Click; break; case 101: BtnOpenSkillFolder = (System.Windows.Controls.Button)target; BtnOpenSkillFolder.Click += BtnOpenSkillFolder_Click; break; case 102: AgentPanelChat = (ScrollViewer)target; break; case 103: BtnAddTemplate = (System.Windows.Controls.Button)target; BtnAddTemplate.Click += BtnAddTemplate_Click; break; case 106: AgentPanelCoworkCode = (ScrollViewer)target; break; case 107: ((System.Windows.Controls.Button)target).Click += BtnClearMemory_Click; break; case 108: AgentPanelCowork = (ScrollViewer)target; break; case 109: AgentPanelCode = (ScrollViewer)target; break; case 110: AgentPanelDev = (ScrollViewer)target; break; case 111: DevModeCheckBox = (System.Windows.Controls.CheckBox)target; DevModeCheckBox.Checked += DevModeCheckBox_Checked; DevModeCheckBox.Unchecked += DevModeCheckBox_Unchecked; break; case 112: DevModeContent = (StackPanel)target; break; case 113: StepApprovalCheckBox = (System.Windows.Controls.CheckBox)target; StepApprovalCheckBox.Checked += StepApprovalCheckBox_Checked; break; case 114: ((System.Windows.Controls.Button)target).Click += BtnOpenAuditLog_Click; break; case 115: FallbackModelsPanel = (StackPanel)target; break; case 116: FallbackModelsBox = (System.Windows.Controls.TextBox)target; break; case 117: ((System.Windows.Controls.Button)target).Click += BtnAddMcpServer_Click; break; case 118: McpServerListPanel = (StackPanel)target; break; case 119: McpServersBox = (System.Windows.Controls.TextBox)target; break; case 120: AgentPanelEtc = (ScrollViewer)target; break; case 121: AgentEtcContent = (StackPanel)target; break; case 122: AgentPanelTools = (ScrollViewer)target; break; case 123: ToolCardsPanel = (StackPanel)target; break; case 124: McpStatusPanel = (StackPanel)target; break; case 125: VersionInfoText = (TextBlock)target; break; case 126: ((System.Windows.Controls.Button)target).Click += ExportSettings_Click; break; case 127: ((System.Windows.Controls.Button)target).Click += ImportSettings_Click; break; case 128: ((System.Windows.Controls.Button)target).Click += Cancel_Click; break; case 129: ((System.Windows.Controls.Button)target).Click += Save_Click; break; default: _contentLoaded = true; break; } } [DebuggerNonUserCode] [GeneratedCode("PresentationBuildTasks", "10.0.5.0")] [EditorBrowsable(EditorBrowsableState.Never)] void IStyleConnector.Connect(int connectionId, object target) { switch (connectionId) { case 8: ((System.Windows.Controls.Button)target).Click += RemoveIndexPath_Click; break; case 12: ((System.Windows.Controls.Button)target).Click += RemoveExtension_Click; break; case 27: ((System.Windows.Controls.Button)target).Click += ThemeCard_Click; break; case 29: ((System.Windows.Controls.Button)target).Click += ColorSwatch_Click; break; case 36: ((System.Windows.Controls.Button)target).Click += DeleteSnippet_Click; break; case 49: ((System.Windows.Controls.Button)target).Click += DeleteShortcut_Click; break; case 51: ((System.Windows.Controls.Button)target).Click += DeleteBatchCommand_Click; break; case 81: ((System.Windows.Controls.Button)target).Click += BtnEditModel_Click; break; case 82: ((System.Windows.Controls.Button)target).Click += BtnDeleteModel_Click; break; case 86: ((System.Windows.Controls.Button)target).Click += BtnEditModel_Click; break; case 87: ((System.Windows.Controls.Button)target).Click += BtnDeleteModel_Click; break; case 104: ((System.Windows.Controls.Button)target).Click += BtnEditTemplate_Click; break; case 105: ((System.Windows.Controls.Button)target).Click += BtnDeleteTemplate_Click; break; } } }