[Phase 17-UI-A] AgentSettingsPanel 완전 통합 — 설정 버튼 직접 연결
ChatWindow.MoodMenu.cs (BtnSettings_Click 개선): - Shift+클릭 조건 제거 → 기어 버튼 클릭 시 AgentSettingsPanel 직접 열기 - Ctrl+클릭으로 전역 SettingsWindow 열기 (기존 동작 유지) - ToggleSettingsPanel(): _toolRegistry 패널에 전달, SettingsChanged 이벤트 연결 - OnSettingsPanelChanged() 신규: 설정 변경 시 ModelLabel·AnalyzerButton 즉시 갱신 ChatWindow.TabSwitching.cs: - UpdateTabUI(): 설정 패널 열린 상태이면 UpdateActiveTab() 자동 호출 - 탭 전환 시 탭별 전용 설정(Cowork 검증/Code LSP 등) 패널 자동 반영 ChatWindow.xaml: - 설정 버튼 ToolTip: "설정 패널 (Ctrl+클릭: 전역 설정)"으로 UX 안내 추가 AgentSettingsPanel.xaml.cs: - LoadFromSettings(): ToolRegistry? 매개변수 추가 (외부 레지스트리 주입) - BuildToolToggles(): 외부 레지스트리 우선, 없으면 ToolRegistry.CreateDefault() 폴백 - 반영 방식 개선: 리플렉션 해킹 제거 → 실제 ChatWindow._toolRegistry 참조 docs/NEXT_ROADMAP.md: - Phase 17-UI-A 완료 항목 추가 (변경 파일 테이블, 개선 효과) 빌드: 경고 0, 오류 0 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -4707,5 +4707,164 @@ ThemeResourceHelper에 5개 정적 필드 추가:
|
||||
|
||||
---
|
||||
|
||||
최종 업데이트: 2026-04-03 (Phase 22~45 구현 완료 — CC 동등성 37/37 + 코드 품질 리팩터링 13차)
|
||||
## Phase 46 — AgentLoopService·ChatWindow·SettingsViewModel·TemplateService·PlanViewerWindow 분리 (v2.3) ✅ 완료
|
||||
|
||||
> **목표**: 6개 대형 파일을 16개 파셜 파일로 분리.
|
||||
|
||||
| 원본 파일 | 원본 줄 | 신규 파일 | 내용 |
|
||||
|-----------|---------|-----------|------|
|
||||
| `AgentLoopService.cs` | 1,334 → 846 | `AgentLoopService.HtmlReport.cs` (151) | HTML 자동저장, 텍스트→HTML 변환 |
|
||||
| | | `AgentLoopService.Verification.cs` (349) | 도구 실행 후 검증, 문서 생성 감지 |
|
||||
| `ChatWindow.TaskDecomposition.cs` | 1,170 → 307 | `ChatWindow.PlanViewer.cs` (474) | Plan 카드, 결정 버튼, 플랜 뷰어 제어 |
|
||||
| | | `ChatWindow.EventBanner.cs` (411) | 에이전트 이벤트 배너, 파일 퀵액션 |
|
||||
| `SettingsViewModel.Properties.cs` | 837 → 427 | `SettingsViewModel.LlmProperties.cs` (417) | LLM/에이전트 설정 바인딩 프로퍼티 |
|
||||
| `TemplateService.cs` | 734 → 179 | `TemplateService.Css.cs` (559) | 11개 CSS 스타일 상수 |
|
||||
| `PlanViewerWindow.cs` | 931 → 324 | `PlanViewerWindow.StepRenderer.cs` (616) | 단계 목록 렌더링, 드래그, 편집 |
|
||||
|
||||
- **빌드**: 경고 0, 오류 0
|
||||
|
||||
---
|
||||
|
||||
## Phase 47 — ChatWindow 추가 분리 (v2.3) ✅ 완료
|
||||
|
||||
> **목표**: ChatWindow 관련 대형 파일 추가 분리.
|
||||
|
||||
| 원본 파일 | 원본 줄 | 신규 파일 | 내용 |
|
||||
|-----------|---------|-----------|------|
|
||||
| `ChatWindow.ResponseHandling.cs` | 741 → 269 | `ChatWindow.StreamingUI.cs` (303) | 스트리밍 컨테이너, 파싱, 토큰 |
|
||||
| | | `ChatWindow.ConversationExport.cs` (188) | 대화 분기, 커맨드 팔레트, 내보내기 |
|
||||
| `ChatWindow.PreviewAndFiles.cs` | 709 → ~340 | `ChatWindow.PreviewPopup.cs` (~230) | 프리뷰 탭 컨텍스트 메뉴, 팝업 |
|
||||
| `HelpDetailWindow.xaml.cs` | 673 → 254 | `HelpDetailWindow.Shortcuts.cs` (168) | 단축키 항목 목록 빌드 |
|
||||
| | | `HelpDetailWindow.Navigation.cs` (266) | 테마, 상단 메뉴, 카테고리 바, 페이지 이동 |
|
||||
| `SkillService.cs` | 661 → 386 | `SkillService.Import.cs` (203) | 스킬 내보내기/가져오기/도구명 매핑 |
|
||||
| `SkillDefinition.cs` | (신규) | `SkillDefinition.cs` (81) | SkillDefinition 클래스 독립 파일 |
|
||||
|
||||
- **빌드**: 경고 0, 오류 0
|
||||
|
||||
---
|
||||
|
||||
## Phase 48 — ChatWindow·WorkflowAnalyzer·SkillGallery 분리 (v2.3) ✅ 완료
|
||||
|
||||
> **목표**: 탭 전환, 드롭 액션, 워크플로우 타임라인, 스킬 상세 분리.
|
||||
|
||||
| 원본 파일 | 원본 줄 | 신규 파일 | 내용 |
|
||||
|-----------|---------|-----------|------|
|
||||
| `ChatWindow.Controls.cs` | 595 → 372 | `ChatWindow.TabSwitching.cs` (232) | 탭 전환, Plan 모드 UI, 대화 복원 |
|
||||
| `ChatWindow.SlashCommands.cs` | 579 → 406 | `ChatWindow.DropActions.cs` (160) | 드래그&드롭 액션 팝업, 코드/데이터 확장자 |
|
||||
| `WorkflowAnalyzerWindow.Charts.cs` | 667 → 397 | `WorkflowAnalyzerWindow.Timeline.cs` (281) | 타임라인 노드, 배지, 상세, 요약 카드 |
|
||||
| `SkillGalleryWindow.xaml.cs` | 631 → ~430 | `SkillGalleryWindow.SkillDetail.cs` (197) | 스킬 상세 팝업 |
|
||||
|
||||
- **빌드**: 경고 0, 오류 0
|
||||
|
||||
---
|
||||
|
||||
## Phase 49 — ChatWindow.Sending·MarkdownRenderer·MessageRendering 분리 (v2.3) ✅ 완료
|
||||
|
||||
> **목표**: 전송 로직, 마크다운 렌더러, 메시지 렌더링 분리.
|
||||
|
||||
| 원본 파일 | 원본 줄 | 신규 파일 | 내용 |
|
||||
|-----------|---------|-----------|------|
|
||||
| `ChatWindow.Sending.cs` | 720 → ~300 | `ChatWindow.MessageEdit.cs` (~180) | 편집 모드 진입, SubmitEditAsync |
|
||||
| | | `ChatWindow.StreamingTimers.cs` (~58) | 커서/경과시간/타이핑 타이머 |
|
||||
| `MarkdownRenderer.cs` | 621 → 405 | `MarkdownRenderer.CodeBlock.cs` (218) | 코드 블록 UI, 파일저장, 전체화면 |
|
||||
| `ChatWindow.MessageRendering.cs` | 522 → 220 | `ChatWindow.Animations.cs` (172) | 애니메이션 헬퍼, 체크 아이콘 |
|
||||
| | | `ChatWindow.FeedbackButtons.cs` (121) | 액션 버튼, 좋아요/싫어요 피드백 |
|
||||
|
||||
- **빌드**: 경고 0, 오류 0
|
||||
|
||||
---
|
||||
|
||||
## Phase 50 — PlanViewerWindow·SettingsWindow 추가 분리 (v2.3) ✅ 완료
|
||||
|
||||
> **목표**: 버튼 빌더, AI 토글, MCP 고급 설정 분리.
|
||||
|
||||
| 원본 파일 | 원본 줄 | 신규 파일 | 내용 |
|
||||
|-----------|---------|-----------|------|
|
||||
| `PlanViewerWindow.StepRenderer.cs` | 616 → 425 | `PlanViewerWindow.EditButtons.cs` (197) | 승인/실행/닫기 버튼, 편집 입력 |
|
||||
| `SettingsWindow.AgentConfig.cs` | 608 → 303 | `SettingsWindow.AiToggle.cs` (316) | AI 활성화·네트워크 모드 토글 |
|
||||
| `SettingsWindow.AgentHooks.cs` | 605 → 334 | `SettingsWindow.McpAdvanced.cs` (271) | MCP 서버 관리, 폴백 모델, 고급 설정 |
|
||||
|
||||
- **빌드**: 경고 0, 오류 0
|
||||
|
||||
---
|
||||
|
||||
## Phase 51 — 9개 대형 파일 → 19개 파일 분리 (v2.3) ✅ 완료
|
||||
|
||||
> **목표**: 핸들러·서비스·모델 대규모 분리.
|
||||
|
||||
| 원본 파일 | 원본 줄 | 신규 파일 | 내용 |
|
||||
|-----------|---------|-----------|------|
|
||||
| `SettingsWindow.Tools.cs` | 605 → 238 | `SettingsWindow.SkillListPanel.cs` (295) | 스킬 목록 섹션, 스킬 그룹 카드 |
|
||||
| `LauncherWindow.Keyboard.cs` | 593 → 454 | `LauncherWindow.ShortcutHelp.cs` (139) | 단축키 도움말, 토스트, 특수 액션 |
|
||||
| `CalculatorHandler.cs` | 566 → ~240 | `UnitConverter.cs` (152) | 단위 변환 클래스 독립 파일 |
|
||||
| | | `MathEvaluator.cs` (183) | 수식 파서 클래스 독립 파일 |
|
||||
| `EmojiHandler.cs` | 553 → 70 | `EmojiHandler.Data.cs` (490) | 이모지 데이터베이스 배열 |
|
||||
| `DocumentPlannerTool.cs` | 598 → 324 | `DocumentPlannerTool.Generators.cs` (274) | HTML/DOCX/Markdown 생성, 섹션 계획 |
|
||||
| `DocumentReaderTool.cs` | 571 → 338 | `DocumentReaderTool.Formats.cs` (233) | BibTeX/RIS/DOCX/XLSX/Text/Helpers |
|
||||
| `CodeIndexService.cs` | 588 → 285 | `CodeIndexService.Search.cs` (199) | 검색, TF-IDF, 토큰화, Dispose |
|
||||
| `ClipboardHistoryService.cs` | 575 → 458 | `ClipboardHistoryService.ImageCache.cs` (120) | 이미지 캐시 유틸리티 |
|
||||
| `IndexService.cs` | 568 → 412 | `IndexService.Helpers.cs` (163) | 경로 탐색 헬퍼, 검색 캐시 |
|
||||
|
||||
- **빌드**: 경고 0, 오류 0
|
||||
|
||||
---
|
||||
|
||||
## Phase 52 — 7개 파일 추가 분리 (v2.3) ✅ 완료
|
||||
|
||||
> **목표**: 스트리밍, 스킬, 핸들러, 모델, 뷰 분리 마무리.
|
||||
|
||||
| 원본 파일 | 원본 줄 | 신규 파일 | 내용 |
|
||||
|-----------|---------|-----------|------|
|
||||
| `LlmService.Streaming.cs` | 516 → 256 | `LlmService.GeminiClaude.cs` (260) | Gemini·Claude 스트리밍 메서드 |
|
||||
| `DocxSkill.cs` | 543 → 158 | `DocxSkill.Builders.cs` (290) | 11개 Word 문서 빌더 헬퍼 |
|
||||
| `ChartSkill.cs` | 537 → 174 | `ChartSkill.Renderers.cs` (280) | 7개 차트 렌더러, 헬퍼, Dataset |
|
||||
| `ScreenCaptureHandler.cs` | 637 → 241 | `ScreenCaptureHandler.Helpers.cs` (310) | 스크롤·영역 캡처, 이미지 처리 헬퍼 |
|
||||
| `SystemInfoHandler.cs` | 509 → 352 | `SystemInfoHandler.Helpers.cs` (161) | 8개 시스템 정보 헬퍼, StarInfoHandler |
|
||||
| `AppSettings.cs` | 564 → 309 | `AppSettings.Models.cs` (233) | 14개 설정 모델 클래스 |
|
||||
| `SkillEditorWindow.xaml.cs` | 528 → 303 | `SkillEditorWindow.PreviewSave.cs` (226) | 미리보기·저장·편집 모드 로드 |
|
||||
| `PreviewWindow.xaml.cs` | 505 → 317 | `PreviewWindow.Content.cs` (170) | 콘텐츠 로드, 타이틀바 핸들러 |
|
||||
|
||||
### 코드 품질 최종 결과 (Phase 46~52)
|
||||
|
||||
| 구분 | Phase 45 이전 | Phase 52 완료 후 |
|
||||
|------|-------------|----------------|
|
||||
| 500줄 이상 파일 | 40+ | **3개** (AgentLoopService 846줄·LauncherWindow.xaml 578줄·TemplateService.Css 559줄) |
|
||||
| 허용 이유 | — | RunAsync 679줄 단일 메서드 / 345줄 애니메이션 메서드 / CSS 데이터 상수 |
|
||||
| 신규 파일 수 | — | Phase 46~52 동안 **45개** 신규 partial 파일 생성 |
|
||||
|
||||
- **빌드**: 경고 0, 오류 0
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Phase 17-UI-A — AgentSettingsPanel 완전 통합 (v1.8.0) ✅ 완료
|
||||
|
||||
> **목표**: 채팅 창 우측 AgentSettingsPanel을 주 설정 엔트리로 승격.
|
||||
> 기어 버튼 클릭 → 인라인 패널 직접 열기 (Shift+Click 불필요).
|
||||
> ToolRegistry 의존 제거, 탭 전환 연동 완성.
|
||||
|
||||
### 변경 파일
|
||||
|
||||
| 파일 | 변경 내용 |
|
||||
|------|----------|
|
||||
| `ChatWindow.MoodMenu.cs` | `BtnSettings_Click`: Shift 조건 제거 → 직접 `ToggleSettingsPanel()` 호출; Ctrl+클릭만 SettingsWindow 열기 |
|
||||
| `ChatWindow.MoodMenu.cs` | `ToggleSettingsPanel()`: `_toolRegistry` 패널에 전달; `SettingsChanged` 이벤트 연결 → `UpdateModelLabel()` + `UpdateAnalyzerButtonVisibility()` 반영 |
|
||||
| `ChatWindow.MoodMenu.cs` | `OnSettingsPanelChanged()` 신규: 패널 설정 변경 시 ChatWindow UI 즉시 갱신 |
|
||||
| `ChatWindow.TabSwitching.cs` | `UpdateTabUI()`: 설정 패널 열림 상태이면 `UpdateActiveTab()` 자동 호출 |
|
||||
| `ChatWindow.xaml` | 설정 버튼 ToolTip: "설정 패널 (Ctrl+클릭: 전역 설정)" |
|
||||
| `AgentSettingsPanel.xaml.cs` | `LoadFromSettings()`: `ToolRegistry? toolRegistry` 매개변수 추가 |
|
||||
| `AgentSettingsPanel.xaml.cs` | `BuildToolToggles()`: 외부 레지스트리 우선, 없으면 `ToolRegistry.CreateDefault()` 폴백 |
|
||||
|
||||
### 개선 효과
|
||||
|
||||
- ⚙ 버튼 한 번 클릭으로 에이전트 설정 패널 바로 접근
|
||||
- 탭 전환(Chat/Cowork/Code) 시 패널 탭별 설정(검증 강제, LSP 등) 자동 반영
|
||||
- 설정 변경 즉시 ChatWindow 모델 라벨·분석기 버튼 상태 갱신
|
||||
- 도구 토글 패널: 실제 ChatWindow ToolRegistry 참조로 정확한 목록 표시
|
||||
- **빌드**: 경고 0, 오류 0
|
||||
|
||||
---
|
||||
|
||||
최종 업데이트: 2026-04-03 (Phase 22~52 + Phase 17-UI-A 구현 완료)
|
||||
|
||||
|
||||
@@ -418,15 +418,15 @@ public partial class ChatWindow
|
||||
|
||||
private void BtnSettings_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// Phase 32: Shift+클릭 → 인라인 설정 패널 토글, 일반 클릭 → SettingsWindow
|
||||
if (System.Windows.Input.Keyboard.Modifiers.HasFlag(System.Windows.Input.ModifierKeys.Shift))
|
||||
// Phase 17-UI: 기어 버튼 → 인라인 설정 패널 토글
|
||||
// Ctrl+클릭 → 전역 SettingsWindow
|
||||
if (System.Windows.Input.Keyboard.Modifiers.HasFlag(System.Windows.Input.ModifierKeys.Control))
|
||||
{
|
||||
ToggleSettingsPanel();
|
||||
if (System.Windows.Application.Current is App app)
|
||||
app.OpenSettingsFromChat();
|
||||
return;
|
||||
}
|
||||
|
||||
if (System.Windows.Application.Current is App app)
|
||||
app.OpenSettingsFromChat();
|
||||
ToggleSettingsPanel();
|
||||
}
|
||||
|
||||
/// <summary>Phase 32-E: 우측 설정 패널 슬라이드인/아웃 토글.</summary>
|
||||
@@ -442,9 +442,11 @@ public partial class ChatWindow
|
||||
if (TabCowork?.IsChecked == true) activeTab = "Cowork";
|
||||
else if (TabCode?.IsChecked == true) activeTab = "Code";
|
||||
|
||||
SettingsPanel.LoadFromSettings(_settings, activeTab);
|
||||
SettingsPanel.LoadFromSettings(_settings, activeTab, _toolRegistry);
|
||||
SettingsPanel.CloseRequested -= OnSettingsPanelClose;
|
||||
SettingsPanel.CloseRequested += OnSettingsPanelClose;
|
||||
SettingsPanel.SettingsChanged -= OnSettingsPanelChanged;
|
||||
SettingsPanel.SettingsChanged += OnSettingsPanelChanged;
|
||||
SettingsPanel.IsOpen = true;
|
||||
}
|
||||
}
|
||||
@@ -453,4 +455,13 @@ public partial class ChatWindow
|
||||
{
|
||||
SettingsPanel.IsOpen = false;
|
||||
}
|
||||
|
||||
/// <summary>Phase 17-UI: 설정 패널에서 설정 변경 시 ChatWindow UI를 갱신합니다.</summary>
|
||||
private void OnSettingsPanelChanged(object? sender, EventArgs e)
|
||||
{
|
||||
// 모델 라벨 갱신 — 설정 패널에서 모델/서비스 변경 가능성
|
||||
UpdateModelLabel();
|
||||
// 개발자 모드 변경 → 분석기 버튼 가시성 갱신
|
||||
UpdateAnalyzerButtonVisibility();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,6 +143,10 @@ public partial class ChatWindow
|
||||
// 현재 대화를 해당 탭 대화로 전환
|
||||
SwitchToTabConversation();
|
||||
|
||||
// Phase 17-UI: 설정 패널이 열려 있으면 탭 전환 시 패널 업데이트
|
||||
if (SettingsPanel?.IsOpen == true)
|
||||
SettingsPanel.UpdateActiveTab(_activeTab);
|
||||
|
||||
// Cowork/Code 탭 전환 시 팁 표시
|
||||
ShowRandomTip();
|
||||
}
|
||||
|
||||
@@ -453,7 +453,7 @@
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center" Margin="0,0,4,0"
|
||||
WindowChrome.IsHitTestVisibleInChrome="True">
|
||||
<Button Style="{StaticResource GhostBtn}" Click="BtnSettings_Click" ToolTip="설정">
|
||||
<Button Style="{StaticResource GhostBtn}" Click="BtnSettings_Click" ToolTip="설정 패널 (Ctrl+클릭: 전역 설정)">
|
||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="13"
|
||||
Foreground="{DynamicResource SecondaryText}"/>
|
||||
</Button>
|
||||
|
||||
@@ -43,7 +43,8 @@ public partial class AgentSettingsPanel : UserControl
|
||||
}
|
||||
|
||||
/// <summary>현재 설정값으로 UI를 초기화합니다.</summary>
|
||||
public void LoadFromSettings(SettingsService settings, string activeTab)
|
||||
public void LoadFromSettings(SettingsService settings, string activeTab,
|
||||
Services.Agent.ToolRegistry? toolRegistry = null)
|
||||
{
|
||||
_isLoading = true;
|
||||
|
||||
@@ -82,7 +83,7 @@ public partial class AgentSettingsPanel : UserControl
|
||||
}
|
||||
|
||||
// 도구 토글 동적 생성
|
||||
BuildToolToggles(settings);
|
||||
BuildToolToggles(settings, toolRegistry);
|
||||
|
||||
_isLoading = false;
|
||||
}
|
||||
@@ -95,11 +96,13 @@ public partial class AgentSettingsPanel : UserControl
|
||||
PanelCodeSettings.Visibility = tab == "Code" ? Visibility.Visible : Visibility.Collapsed;
|
||||
}
|
||||
|
||||
private void BuildToolToggles(SettingsService settings)
|
||||
private void BuildToolToggles(SettingsService settings,
|
||||
Services.Agent.ToolRegistry? externalRegistry = null)
|
||||
{
|
||||
PanelToolToggles.Children.Clear();
|
||||
|
||||
var registry = CurrentApp?.GetType().GetProperty("ToolRegistry")?.GetValue(CurrentApp) as Services.Agent.ToolRegistry;
|
||||
// Phase 17-UI: 외부에서 전달된 레지스트리 우선, 없으면 독립 생성
|
||||
var registry = externalRegistry ?? Services.Agent.ToolRegistry.CreateDefault();
|
||||
if (registry == null) return;
|
||||
|
||||
var disabled = new HashSet<string>(
|
||||
|
||||
Reference in New Issue
Block a user