diff --git a/docs/NEXT_ROADMAP.md b/docs/NEXT_ROADMAP.md
index e4ccf12..98305ae 100644
--- a/docs/NEXT_ROADMAP.md
+++ b/docs/NEXT_ROADMAP.md
@@ -4692,5 +4692,20 @@ ThemeResourceHelper에 5개 정적 필드 추가:
---
-최종 업데이트: 2026-04-03 (Phase 22~44 구현 완료 — CC 동등성 37/37 + 코드 품질 리팩터링 12차)
+## Phase 45 — AppSettings.cs 클래스 파일 분리 (v2.3) ✅ 완료
+
+> **목표**: 31개 클래스가 혼재된 AppSettings.cs (1,320줄)를 3개 파일로 분리.
+
+| 파일 | 줄 수 | 내용 |
+|------|-------|------|
+| `AppSettings.cs` | 564 | AppSettings·LauncherSettings·CustomThemeColors 등 17개 클래스 |
+| `AppSettings.LlmSettings.cs` | 481 | LlmSettings(408줄)·CodeSettings |
+| `AppSettings.AgentConfig.cs` | 284 | 권한·훅·이벤트·모델·프리셋 등 12개 설정 클래스 |
+
+- **메인 파일**: 1,320줄 → 564줄 (**57.3% 감소**)
+- **빌드**: 경고 0, 오류 0
+
+---
+
+최종 업데이트: 2026-04-03 (Phase 22~45 구현 완료 — CC 동등성 37/37 + 코드 품질 리팩터링 13차)
diff --git a/src/AxCopilot/Models/AppSettings.AgentConfig.cs b/src/AxCopilot/Models/AppSettings.AgentConfig.cs
new file mode 100644
index 0000000..fad328c
--- /dev/null
+++ b/src/AxCopilot/Models/AppSettings.AgentConfig.cs
@@ -0,0 +1,284 @@
+using System;
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace AxCopilot.Models;
+
+/// Phase 17-F: 에이전트 권한 설정.
+public class PermissionsConfig
+{
+ /// 권한 모드. default | acceptEdits | plan | bypassPermissions
+ [JsonPropertyName("mode")]
+ public string Mode { get; set; } = "default";
+
+ /// 허용 규칙 목록. 규칙 매칭 시 확인 없이 자동 허용.
+ [JsonPropertyName("allow")]
+ public List AllowRules { get; set; } = new();
+
+ /// 차단 규칙 목록. 규칙 매칭 시 즉시 차단.
+ [JsonPropertyName("deny")]
+ public List DenyRules { get; set; } = new();
+}
+
+/// 권한 규칙 항목 (설정 저장용).
+public class PermissionRuleEntry
+{
+ [JsonPropertyName("tool")]
+ public string ToolName { get; set; } = "";
+
+ [JsonPropertyName("pattern")]
+ public string? Pattern { get; set; }
+
+ [JsonPropertyName("behavior")]
+ public string Behavior { get; set; } = "allow"; // allow | deny | ask
+}
+
+/// Phase 17-B: 이벤트 로그 설정.
+public class EventLogConfig
+{
+ [JsonPropertyName("enabled")]
+ public bool Enabled { get; set; } = true;
+
+ [JsonPropertyName("retention_days")]
+ public int RetentionDays { get; set; } = 30;
+}
+
+/// Phase 17-A: Reflexion(자기성찰) 설정.
+public class ReflexionConfig
+{
+ [JsonPropertyName("enabled")]
+ public bool Enabled { get; set; } = true;
+
+ [JsonPropertyName("max_context_entries")]
+ public int MaxContextEntries { get; set; } = 5;
+
+ [JsonPropertyName("evaluate_on_success")]
+ public bool EvaluateOnSuccess { get; set; } = true;
+}
+
+/// Phase 17-C: 확장 훅 설정.
+public class ExtendedHooksConfig
+{
+ [JsonPropertyName("user_prompt_submit")]
+ public List UserPromptSubmit { get; set; } = new();
+
+ [JsonPropertyName("pre_compact")]
+ public List PreCompact { get; set; } = new();
+
+ [JsonPropertyName("post_compact")]
+ public List PostCompact { get; set; } = new();
+
+ [JsonPropertyName("file_changed")]
+ public List FileChanged { get; set; } = new();
+
+ [JsonPropertyName("session_start")]
+ public List SessionStart { get; set; } = new();
+
+ [JsonPropertyName("session_end")]
+ public List SessionEnd { get; set; } = new();
+
+ [JsonPropertyName("permission_request")]
+ public List PermissionRequest { get; set; } = new();
+}
+
+/// 확장 훅 항목 설정.
+public class ExtendedHookEntryConfig
+{
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = "";
+
+ [JsonPropertyName("mode")]
+ public string Mode { get; set; } = "command"; // command | http | prompt | agent
+
+ [JsonPropertyName("matcher")]
+ public string? Matcher { get; set; }
+
+ [JsonPropertyName("script_path")]
+ public string? ScriptPath { get; set; }
+
+ [JsonPropertyName("url")]
+ public string? Url { get; set; }
+
+ [JsonPropertyName("prompt")]
+ public string? Prompt { get; set; }
+
+ [JsonPropertyName("model")]
+ public string? Model { get; set; }
+
+ [JsonPropertyName("enabled")]
+ public bool Enabled { get; set; } = true;
+
+ [JsonPropertyName("once")]
+ public bool Once { get; set; } = false;
+
+ [JsonPropertyName("async")]
+ public bool IsAsync { get; set; } = false;
+
+ [JsonPropertyName("timeout_seconds")]
+ public int TimeoutSeconds { get; set; } = 30;
+
+ [JsonPropertyName("status_message")]
+ public string? StatusMessage { get; set; }
+
+ [JsonPropertyName("watch_paths")]
+ public List WatchPaths { get; set; } = new();
+}
+
+/// 사용자 정의 커스텀 프리셋 (settings.json에 저장).
+public class CustomPresetEntry
+{
+ [JsonPropertyName("id")]
+ public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8];
+
+ [JsonPropertyName("label")]
+ public string Label { get; set; } = "";
+
+ [JsonPropertyName("description")]
+ public string Description { get; set; } = "";
+
+ [JsonPropertyName("systemPrompt")]
+ public string SystemPrompt { get; set; } = "";
+
+ [JsonPropertyName("color")]
+ public string Color { get; set; } = "#6366F1";
+
+ [JsonPropertyName("symbol")]
+ public string Symbol { get; set; } = "\uE713";
+
+ /// 프리셋이 속하는 탭. "Chat" | "Cowork" | "Code"
+ [JsonPropertyName("tab")]
+ public string Tab { get; set; } = "Chat";
+}
+
+/// 사용자 정의 디자인 무드 (CSS 템플릿).
+public class CustomMoodEntry
+{
+ [JsonPropertyName("key")]
+ public string Key { get; set; } = "";
+
+ [JsonPropertyName("label")]
+ public string Label { get; set; } = "";
+
+ [JsonPropertyName("icon")]
+ public string Icon { get; set; } = "🎯";
+
+ [JsonPropertyName("description")]
+ public string Description { get; set; } = "";
+
+ [JsonPropertyName("css")]
+ public string Css { get; set; } = "";
+}
+
+/// 저장된 프롬프트 템플릿.
+public class PromptTemplate
+{
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = "";
+
+ [JsonPropertyName("content")]
+ public string Content { get; set; } = "";
+
+ [JsonPropertyName("icon")]
+ public string Icon { get; set; } = "\uE8BD";
+}
+
+///
+/// 사내 LLM 등록 모델. 별칭(UI 표시용) + 암호화된 실제 모델명.
+/// 향후 멀티 에이전트에서는 특화 업무와 연결됩니다.
+///
+public class RegisteredModel
+{
+ /// UI에 표시할 별칭 (예: "코드 리뷰 전용", "일반 대화")
+ [JsonPropertyName("alias")]
+ public string Alias { get; set; } = "";
+
+ /// 실제 모델명. EncryptionEnabled=true일 때 PortableEncrypt로 암호화된 Base64 값, false일 때 평문.
+ [JsonPropertyName("encryptedModelName")]
+ public string EncryptedModelName { get; set; } = "";
+
+ /// 이 모델이 연결될 서비스 타입. ollama | vllm
+ [JsonPropertyName("service")]
+ public string Service { get; set; } = "ollama";
+
+ /// 이 모델 전용 서버 엔드포인트. 비어있으면 LlmSettings의 기본 엔드포인트 사용.
+ [JsonPropertyName("endpoint")]
+ public string Endpoint { get; set; } = "";
+
+ /// 이 모델 전용 API 키. 비어있으면 LlmSettings의 기본 API 키 사용.
+ [JsonPropertyName("apiKey")]
+ public string ApiKey { get; set; } = "";
+
+ // ── CP4D (IBM Cloud Pak for Data) 인증 ──────────────────────────────
+
+ /// 인증 방식. bearer (기본) | cp4d
+ [JsonPropertyName("authType")]
+ public string AuthType { get; set; } = "bearer";
+
+ /// CP4D 인증 서버 URL (예: https://cpd-host.example.com)
+ [JsonPropertyName("cp4dUrl")]
+ public string Cp4dUrl { get; set; } = "";
+
+ /// CP4D 사용자 이름
+ [JsonPropertyName("cp4dUsername")]
+ public string Cp4dUsername { get; set; } = "";
+
+ /// CP4D 비밀번호 또는 API 키 (EncryptionEnabled=true 시 암호화 저장)
+ [JsonPropertyName("cp4dPassword")]
+ public string Cp4dPassword { get; set; } = "";
+}
+
+///
+/// 자동 모델 라우팅용 모델 능력 점수.
+/// 각 모델의 인텐트 카테고리별 적합도를 0.0~1.0으로 지정합니다.
+/// 개발자가 하드코딩 기본값을 수정하려면 ModelRouterService.GetDefaultCapabilities()를 참조하세요.
+///
+public class ModelCapability
+{
+ /// 서비스 타입. ollama | vllm | gemini | claude
+ [JsonPropertyName("service")]
+ public string Service { get; set; } = "";
+
+ /// 모델 식별자. 서비스별 모델 ID (예: "gemini-2.5-flash", "claude-sonnet-4-6")
+ [JsonPropertyName("model")]
+ public string Model { get; set; } = "";
+
+ /// UI 표시용 별칭.
+ [JsonPropertyName("alias")]
+ public string Alias { get; set; } = "";
+
+ /// 인텐트 카테고리별 적합도 점수. key=카테고리명, value=0.0~1.0
+ [JsonPropertyName("scores")]
+ public Dictionary Scores { get; set; } = new();
+
+ /// 라우팅 후보에 포함 여부.
+ [JsonPropertyName("enabled")]
+ public bool Enabled { get; set; } = true;
+}
+
+/// 에이전트 훅 설정 항목. 도구 실행 전/후 사용자 스크립트 실행.
+public class AgentHookEntry
+{
+ /// 훅 이름 (UI 표시용).
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = "";
+
+ /// 대상 도구 이름. "*" = 모든 도구, 특정 도구명 = 해당 도구만.
+ [JsonPropertyName("toolName")]
+ public string ToolName { get; set; } = "*";
+
+ /// 실행 타이밍. "pre" = 도구 실행 전, "post" = 도구 실행 후.
+ [JsonPropertyName("timing")]
+ public string Timing { get; set; } = "post";
+
+ /// 실행할 스크립트 경로 (.bat, .ps1, .cmd).
+ [JsonPropertyName("scriptPath")]
+ public string ScriptPath { get; set; } = "";
+
+ /// 스크립트에 전달할 추가 인수 (선택).
+ [JsonPropertyName("arguments")]
+ public string Arguments { get; set; } = "";
+
+ /// 활성화 여부.
+ [JsonPropertyName("enabled")]
+ public bool Enabled { get; set; } = true;
+}
diff --git a/src/AxCopilot/Models/AppSettings.LlmSettings.cs b/src/AxCopilot/Models/AppSettings.LlmSettings.cs
new file mode 100644
index 0000000..405d78a
--- /dev/null
+++ b/src/AxCopilot/Models/AppSettings.LlmSettings.cs
@@ -0,0 +1,481 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace AxCopilot.Models;
+
+// ─── LLM 채팅 설정 ──────────────────────────────────────────────────────────
+
+public class LlmSettings
+{
+ /// LLM 서비스 종류. ollama | vllm | gemini | claude
+ [JsonPropertyName("service")]
+ public string Service { get; set; } = "ollama";
+
+ /// 엔드포인트 URL. Ollama 기본값 http://localhost:11434
+ [JsonPropertyName("endpoint")]
+ public string Endpoint { get; set; } = "http://localhost:11434";
+
+ /// 모델 이름. 미설정 시 빈 문자열.
+ [JsonPropertyName("model")]
+ public string Model { get; set; } = "";
+
+ /// 암호화된 API 키 (사내 Ollama/vLLM 전용). DPAPI+AES로 암호화된 Base64.
+ [JsonPropertyName("encryptedApiKey")]
+ public string EncryptedApiKey { get; set; } = "";
+
+ /// 평문 API 키 (Gemini/Claude 등 외부 서비스). 사내 연결 제한으로 별도 암호화 없음.
+ [JsonPropertyName("apiKey")]
+ public string ApiKey { get; set; } = "";
+
+ /// 스트리밍 응답 활성화. 기본값 true.
+ [JsonPropertyName("streaming")]
+ public bool Streaming { get; set; } = true;
+
+ /// 최대 컨텍스트 토큰 수. 기본값 4096.
+ [JsonPropertyName("maxContextTokens")]
+ public int MaxContextTokens { get; set; } = 4096;
+
+ /// Phase 29: 자동 컴팩션 임계치 (%). 0이면 80% 기본값. CC auto_compact_threshold_percent 동등.
+ [JsonPropertyName("autoCompactThreshold")]
+ public int AutoCompactThreshold { get; set; } = 80;
+
+ /// 대화 보관 기간(일). 7 | 30 | 90 | 0(무제한). 기본값 30.
+ [JsonPropertyName("retentionDays")]
+ public int RetentionDays { get; set; } = 30;
+
+ /// Temperature. 0.0~2.0, 기본값 0.7.
+ [JsonPropertyName("temperature")]
+ public double Temperature { get; set; } = 0.7;
+
+ /// 사내 서비스(Ollama/vLLM)용 등록 모델 목록. 별칭 + 암호화된 모델명.
+ [JsonPropertyName("registeredModels")]
+ public List RegisteredModels { get; set; } = new();
+
+ ///
+ /// API 키/모델명 암호화 활성화 여부.
+ /// false: 평문 저장 (내부 개발 배포용)
+ /// true: PortableEncrypt로 암호화 저장 (운영 배포용)
+ /// 기본값 false. 운영 배포 시 true로 변경.
+ ///
+ [JsonPropertyName("encryptionEnabled")]
+ public bool EncryptionEnabled { get; set; } = false;
+
+ /// 프롬프트 템플릿 목록.
+ [JsonPropertyName("promptTemplates")]
+ public List PromptTemplates { get; set; } = new();
+
+ /// 작업 폴더 경로. 빈 문자열이면 미선택.
+ [JsonPropertyName("workFolder")]
+ public string WorkFolder { get; set; } = "";
+
+ /// 최근 사용한 작업 폴더 목록.
+ [JsonPropertyName("recentWorkFolders")]
+ public List RecentWorkFolders { get; set; } = new();
+
+ /// 최근 폴더 최대 표시 개수 (기본 10, 범위 3~30).
+ [JsonPropertyName("maxRecentFolders")]
+ public int MaxRecentFolders { get; set; } = 10;
+
+ /// 파일 탐색기 패널 표시 여부 (코워크 탭).
+ [JsonPropertyName("showFileBrowser")]
+ public bool ShowFileBrowser { get; set; } = false;
+
+ ///
+ /// 파일 접근 권한 수준.
+ /// Ask = 매번 확인 | Auto = 자동 허용 | Deny = 차단
+ ///
+ [JsonPropertyName("filePermission")]
+ public string FilePermission { get; set; } = "Ask";
+
+ /// Cowork/Code 탭의 기본 파일 접근 권한. 탭 전환 시 자동 적용.
+ [JsonPropertyName("defaultAgentPermission")]
+ public string DefaultAgentPermission { get; set; } = "Ask";
+
+ // ── 서비스별 독립 설정 ──────────────────────────────────────
+ [JsonPropertyName("ollamaEndpoint")] public string OllamaEndpoint { get; set; } = "http://localhost:11434";
+ [JsonPropertyName("ollamaApiKey")] public string OllamaApiKey { get; set; } = "";
+ [JsonPropertyName("ollamaModel")] public string OllamaModel { get; set; } = "";
+
+ [JsonPropertyName("vllmEndpoint")] public string VllmEndpoint { get; set; } = "";
+ [JsonPropertyName("vllmApiKey")] public string VllmApiKey { get; set; } = "";
+ [JsonPropertyName("vllmModel")] public string VllmModel { get; set; } = "";
+
+ [JsonPropertyName("geminiApiKey")] public string GeminiApiKey { get; set; } = "";
+ [JsonPropertyName("geminiModel")] public string GeminiModel { get; set; } = "gemini-2.5-flash";
+
+ [JsonPropertyName("claudeApiKey")] public string ClaudeApiKey { get; set; } = "";
+ [JsonPropertyName("claudeModel")] public string ClaudeModel { get; set; } = "claude-sonnet-4-6";
+
+ // ── Cowork 에이전트 설정 ─────────────────────────────────
+
+ /// 기본 출력 포맷. auto | xlsx | docx | html | md | csv
+ [JsonPropertyName("defaultOutputFormat")]
+ public string DefaultOutputFormat { get; set; } = "auto";
+
+ /// 기본 디자인 무드. modern | professional | creative 등
+ [JsonPropertyName("defaultMood")]
+ public string DefaultMood { get; set; } = "modern";
+
+ /// 문서 미리보기 자동 열기. auto | manual | off
+ [JsonPropertyName("autoPreview")]
+ public string AutoPreview { get; set; } = "off";
+
+ /// 에이전트 최대 루프 반복 횟수.
+ [JsonPropertyName("maxAgentIterations")]
+ public int MaxAgentIterations { get; set; } = 25;
+
+ /// 도구 실패 시 최대 재시도 횟수 (Self-Reflection).
+ [JsonPropertyName("maxRetryOnError")]
+ public int MaxRetryOnError { get; set; } = 3;
+
+ /// 테스트-수정 자동 반복 최대 횟수. auto_fix 모드에서 사용. 기본 5.
+ [JsonPropertyName("maxTestFixIterations")]
+ public int MaxTestFixIterations { get; set; } = 5;
+
+ /// 에이전트 로그 표시 수준. simple | detailed | debug
+ [JsonPropertyName("agentLogLevel")]
+ public string AgentLogLevel { get; set; } = "simple";
+
+ /// LLM이 다수 도구를 동시 호출할 때 병렬 실행 활성화. 파일 충돌 없는 도구만 병렬 실행.
+ [JsonPropertyName("enableParallelTools")]
+ public bool EnableParallelTools { get; set; } = false;
+
+ /// 멀티패스 문서 생성 사용 여부. 긴 문서(3페이지 이상) 작성 시 개요→섹션별 상세→조립 방식으로 품질 향상.
+ [JsonPropertyName("enableMultiPassDocument")]
+ public bool EnableMultiPassDocument { get; set; } = false;
+
+ ///
+ /// [Cowork] 도구 실행 후 검증 강제.
+ /// true: 문서 생성 도구(file_write, docx_create, html_create, xlsx_create 등) 실행 후
+ /// LLM에 검증 전용 호출을 자동 삽입하여 결과물 품질을 확인합니다.
+ /// false: LLM이 자율적으로 검증 여부를 결정합니다 (기존 동작).
+ ///
+ [JsonPropertyName("enableCoworkVerification")]
+ public bool EnableCoworkVerification { get; set; } = false;
+
+ ///
+ /// [Cowork] 검증 강제 시 워크스페이스 파일/폴더 참조를 채팅에서 파란색으로 강조 표시.
+ ///
+ [JsonPropertyName("enableFilePathHighlight")]
+ public bool EnableFilePathHighlight { get; set; } = true;
+
+ /// 멀티패스 자동 실행 기준 (예상 페이지 수 이상일 때). 기본 3페이지.
+ [JsonPropertyName("multiPassThresholdPages")]
+ public int MultiPassThresholdPages { get; set; } = 3;
+
+ /// 탭별 마지막 활성 대화 ID. 앱 재시작 시 마지막 대화를 자동 복원합니다.
+ [JsonPropertyName("lastConversationIds")]
+ public Dictionary LastConversationIds { get; set; } = new();
+
+ /// 폴더 데이터 활용 모드. active(적극) | passive(소극) | none(미활용)
+ [JsonPropertyName("folderDataUsage")]
+ public string FolderDataUsage { get; set; } = "active";
+
+ ///
+ /// 에이전트 의사결정 수준. AI가 중요한 작업 전에 사용자 확인을 요청하는 빈도.
+ /// minimal: 파일 삭제, 외부 명령만 확인
+ /// normal: + 새 파일 생성, 여러 파일 수정, 문서 생성, Git 커밋
+ /// detailed: + 모든 파일 수정에 diff 미리보기
+ ///
+ [JsonPropertyName("agentDecisionLevel")]
+ public string AgentDecisionLevel { get; set; } = "detailed";
+
+ ///
+ /// 플랜 모드. 에이전트가 도구 실행 전에 구조화된 실행 계획을 먼저 생성하도록 강제.
+ /// off: 비활성 (기존 동작)
+ /// always: 항상 계획 생성 후 사용자 승인 대기
+ /// auto: 복잡한 작업 감지 시 자동으로 계획 모드 진입
+ ///
+ [JsonPropertyName("planMode")]
+ public string PlanMode { get; set; } = "off";
+
+ ///
+ /// 프로젝트 규칙 자동 주입 활성화.
+ /// true: .ax/rules/ 디렉토리의 규칙을 시스템 프롬프트에 자동 포함
+ /// false: 규칙 주입 비활성 (project_rules 도구로 수동 읽기는 가능)
+ ///
+ [JsonPropertyName("enableProjectRules")]
+ public bool EnableProjectRules { get; set; } = true;
+
+ // ─── 모델 폴백 ──────────────────────────────────────────────────────
+
+ /// 모델 API 실패 시 순차 시도할 폴백 모델 리스트. (예: "gemini:gemini-2.5-flash")
+ [JsonPropertyName("fallbackModels")]
+ public List FallbackModels { get; set; } = new();
+
+ // ─── v1.4.0 에이전트 설정 ──────────────────────────────────────────────
+
+ /// 서브에이전트 최대 동시 실행 수. 기본 3.
+ [JsonPropertyName("maxSubAgents")]
+ public int MaxSubAgents { get; set; } = 3;
+
+ /// PDF 내보내기 기본 경로. 빈 문자열이면 바탕화면.
+ [JsonPropertyName("pdfExportPath")]
+ public string PdfExportPath { get; set; } = "";
+
+ // ─── 보안 감사 로그 ──────────────────────────────────────────────────
+
+ /// 에이전트 도구 호출 감사 로그 활성화. 기본 true.
+ [JsonPropertyName("enableAuditLog")]
+ public bool EnableAuditLog { get; set; } = true;
+
+ /// 에이전트 메모리 (지속적 학습) 활성화. 기본 true.
+ [JsonPropertyName("enableAgentMemory")]
+ public bool EnableAgentMemory { get; set; } = true;
+
+ /// 폴더별 최대 메모리 항목 수. 기본 100.
+ [JsonPropertyName("maxMemoryEntries")]
+ public int MaxMemoryEntries { get; set; } = 100;
+
+ // ─── 이미지 입력 (멀티모달) ──────────────────────────────────────────
+
+ /// 이미지 입력(Ctrl+V 붙여넣기, 파일 첨부) 활성화. 기본 true.
+ [JsonPropertyName("enableImageInput")]
+ public bool EnableImageInput { get; set; } = true;
+
+ /// 이미지 최대 크기(KB). 기본 5120 (5MB).
+ [JsonPropertyName("maxImageSizeKb")]
+ public int MaxImageSizeKb { get; set; } = 5120;
+
+ // ─── 자동 모델 라우팅 ─────────────────────────────────────────────
+
+ /// 자동 모델 라우팅 활성화. 질문 유형 감지 → 최적 모델 자동 선택. 기본 false (잠금).
+ [JsonPropertyName("enableAutoRouter")]
+ public bool EnableAutoRouter { get; set; } = false;
+
+ /// 자동 라우팅 최소 확신도. 이 값 미만이면 기본 모델 유지. 0.5~0.95, 기본 0.7.
+ [JsonPropertyName("autoRouterConfidence")]
+ public double AutoRouterConfidence { get; set; } = 0.7;
+
+ /// 모델별 능력 점수 설정. 인텐트 카테고리별 적합도 0.0~1.0.
+ [JsonPropertyName("modelCapabilities")]
+ public List ModelCapabilities { get; set; } = new();
+
+ // ─── MCP ──────────────────────────────────────────────────────────
+
+ /// MCP 서버 설정 목록.
+ [JsonPropertyName("mcpServers")]
+ public List McpServers { get; set; } = new();
+
+ // ─── 시각 효과 ──────────────────────────────────────────────────────
+
+ /// 채팅 입력창 무지개 글로우 효과 활성화. 기본 false (성능 고려).
+ [JsonPropertyName("enableChatRainbowGlow")]
+ public bool EnableChatRainbowGlow { get; set; } = false;
+
+ // ─── 알림 ──────────────────────────────────────────────────────────
+
+ /// 에이전트 작업 완료 시 시스템 알림 표시 여부. (Cowork/Code 공통)
+ [JsonPropertyName("notifyOnComplete")]
+ public bool NotifyOnComplete { get; set; } = false;
+
+ /// AI 대화창에서 팁 알림 표시 여부.
+ [JsonPropertyName("showTips")]
+ public bool ShowTips { get; set; } = false;
+
+ /// 팁 알림 자동 사라짐 시간 (초). 0이면 수동 닫기.
+ [JsonPropertyName("tipDurationSeconds")]
+ public int TipDurationSeconds { get; set; } = 5;
+
+ // ─── 개발자 모드 ──────────────────────────────────────────────────
+
+ /// 개발자 모드 활성화. 에이전트 워크플로우 상세 이력을 대화창에 실시간 표시.
+ [JsonPropertyName("devMode")]
+ public bool DevMode { get; set; } = false;
+
+ /// 개발자 모드: 도구 실행 전 매번 사용자 승인 대기 (스텝 바이 스텝 디버깅).
+ [JsonPropertyName("devModeStepApproval")]
+ public bool DevModeStepApproval { get; set; } = false;
+
+ /// 개발자 모드: 에이전트 실행 시 워크플로우 시각화 창을 자동으로 표시.
+ [JsonPropertyName("workflowVisualizer")]
+ public bool WorkflowVisualizer { get; set; } = false;
+
+ /// 개발자 모드: 무료 티어 호출 제한 모드. 활성화하면 LLM 호출 간 딜레이를 추가하여 RPM 한도를 초과하지 않습니다.
+ [JsonPropertyName("freeTierMode")]
+ public bool FreeTierMode { get; set; } = false;
+
+ /// 무료 티어 모드: LLM 호출 간 딜레이 (초). 기본 4초 (Gemini 무료 15 RPM ≈ 4초 간격).
+ [JsonPropertyName("freeTierDelaySeconds")]
+ public int FreeTierDelaySeconds { get; set; } = 4;
+
+ /// 개발자 모드: 전체 누적 호출 횟수 및 토큰 합계를 상태바에 표시.
+ [JsonPropertyName("showTotalCallStats")]
+ public bool ShowTotalCallStats { get; set; } = false;
+
+ /// 차단할 경로 패턴 목록 (에이전트 파일 접근 시 적용).
+ [JsonPropertyName("blockedPaths")]
+ public List BlockedPaths { get; set; } = new()
+ {
+ "*\\Windows\\*", "*\\Program Files\\*", "*\\Program Files (x86)\\*",
+ "*\\System32\\*", "*\\AppData\\Local\\*", "*Documents*",
+ };
+
+ /// 차단할 파일 확장자 목록.
+ [JsonPropertyName("blockedExtensions")]
+ public List BlockedExtensions { get; set; } = new()
+ {
+ ".exe", ".dll", ".sys", ".msi",
+ ".reg", ".vbs", ".com", ".scr", ".pif",
+ };
+
+ /// 사용자가 만든 커스텀 프리셋 목록.
+ [JsonPropertyName("customPresets")]
+ public List CustomPresets { get; set; } = new();
+
+ /// 사용자가 만든 커스텀 디자인 무드 목록.
+ [JsonPropertyName("customMoods")]
+ public List CustomMoods { get; set; } = new();
+
+ // ─── 도구 관리 ──────────────────────────────────────────────────
+
+ /// 비활성화된 에이전트 도구 이름 목록. 여기에 포함된 도구는 LLM에 노출되지 않습니다.
+ [JsonPropertyName("disabledTools")]
+ public List DisabledTools { get; set; } = new();
+
+ ///
+ /// 도구별 실행 권한 오버라이드. 키: 도구 이름, 값: "ask" | "auto" | "deny".
+ /// 여기에 없는 도구는 전역 FilePermission 설정을 따릅니다.
+ ///
+ [JsonPropertyName("toolPermissions")]
+ public Dictionary ToolPermissions { get; set; } = new();
+
+ // ─── 에이전트 훅 시스템 ───────────────────────────────────────────
+
+ /// 에이전트 훅 활성화 여부. 기본 true.
+ [JsonPropertyName("enableToolHooks")]
+ public bool EnableToolHooks { get; set; } = true;
+
+ /// 훅 스크립트 실행 타임아웃 (밀리초). 기본 10000 (10초).
+ [JsonPropertyName("toolHookTimeoutMs")]
+ public int ToolHookTimeoutMs { get; set; } = 10000;
+
+ /// 등록된 에이전트 훅 목록.
+ [JsonPropertyName("agentHooks")]
+ public List AgentHooks { get; set; } = new();
+
+ // ─── 스킬 시스템 ─────────────────────────────────────────────────
+
+ /// 스킬 시스템 활성화 여부. 기본 true.
+ [JsonPropertyName("enableSkillSystem")]
+ public bool EnableSkillSystem { get; set; } = true;
+
+ /// 추가 스킬 폴더 경로. 빈 문자열이면 기본 폴더만 사용.
+ [JsonPropertyName("skillsFolderPath")]
+ public string SkillsFolderPath { get; set; } = "";
+
+ /// 슬래시 명령어 팝업 한 번에 표시할 최대 항목 수 (3~20). 기본 7.
+ [JsonPropertyName("slashPopupPageSize")]
+ public int SlashPopupPageSize { get; set; } = 7;
+
+ /// 즐겨찾기 슬래시 명령어 목록 (팝업 상단에 고정 표시). 예: ["/review", "/summary"]
+ [JsonPropertyName("favoriteSlashCommands")]
+ public List FavoriteSlashCommands { get; set; } = new();
+
+ // ─── 드래그 앤 드롭 AI 처리 ──────────────────────────────────────
+
+ /// 파일 드래그 시 AI 액션 팝업 표시 여부. 기본 true.
+ [JsonPropertyName("enableDragDropAiActions")]
+ public bool EnableDragDropAiActions { get; set; } = true;
+
+ /// AI 액션 선택 시 자동 전송 여부. 기본 false.
+ [JsonPropertyName("dragDropAutoSend")]
+ public bool DragDropAutoSend { get; set; } = false;
+
+ /// Code 탭 전용 설정.
+ [JsonPropertyName("code")]
+ public CodeSettings Code { get; set; } = new();
+
+ // ─── Phase 17-F: 권한 시스템 ────────────────────────────────────────────
+
+ [JsonPropertyName("permissions")]
+ public PermissionsConfig Permissions { get; set; } = new();
+
+ // ─── Phase 17-B: 이벤트 로그 ────────────────────────────────────────────
+
+ [JsonPropertyName("event_log")]
+ public EventLogConfig EventLog { get; set; } = new();
+
+ // ─── Phase 17-A: Reflexion ──────────────────────────────────────────────
+
+ [JsonPropertyName("reflexion")]
+ public ReflexionConfig Reflexion { get; set; } = new();
+
+ // ─── Phase 17-C: 확장 훅 ────────────────────────────────────────────────
+
+ [JsonPropertyName("extended_hooks")]
+ public ExtendedHooksConfig ExtendedHooks { get; set; } = new();
+
+ // ─── Phase 17-B: Working Memory(TaskState) ──────────────────────────────
+
+ /// 에이전트 Working Memory 활성화. 대화 압축 시에도 작업 상태 유지. 기본 true.
+ [JsonPropertyName("enable_task_state")]
+ public bool EnableTaskState { get; set; } = true;
+}
+
+/// Code 탭 설정 — 사내 개발 환경 연동.
+public class CodeSettings
+{
+ /// 사내 Nexus 저장소 기본 URL. 빈 문자열이면 공용 저장소 사용.
+ [JsonPropertyName("nexusBaseUrl")]
+ public string NexusBaseUrl { get; set; } = "";
+
+ /// NuGet 패키지 소스 URL (.NET).
+ [JsonPropertyName("nugetSource")]
+ public string NugetSource { get; set; } = "https://api.nuget.org/v3/index.json";
+
+ /// PyPI/Conda 패키지 소스 URL (Python).
+ [JsonPropertyName("pypiSource")]
+ public string PypiSource { get; set; } = "https://conda.anaconda.org/conda-forge";
+
+ /// Maven 저장소 URL (Java).
+ [JsonPropertyName("mavenSource")]
+ public string MavenSource { get; set; } = "https://repo1.maven.org/maven2";
+
+ /// npm 레지스트리 URL (JavaScript/Node.js).
+ [JsonPropertyName("npmSource")]
+ public string NpmSource { get; set; } = "https://registry.npmjs.org";
+
+ /// 선호 IDE 실행 경로. 빈 문자열이면 자동 감지.
+ [JsonPropertyName("preferredIdePath")]
+ public string PreferredIdePath { get; set; } = "";
+
+ /// 빌드/테스트 명령 타임아웃 (초). 기본 120초.
+ [JsonPropertyName("buildTimeout")]
+ public int BuildTimeout { get; set; } = 120;
+
+ // ─── v1.4.0 코드 인텔리전스 설정 ─────────────────────────────────────────
+
+ /// LSP 코드 인텔리전스 활성화. 기본 true.
+ [JsonPropertyName("enableLsp")]
+ public bool EnableLsp { get; set; } = true;
+
+ /// 코드 시맨틱 검색 자동 인덱싱 활성화. 기본 true.
+ [JsonPropertyName("enableCodeIndex")]
+ public bool EnableCodeIndex { get; set; } = true;
+
+ /// 인덱싱 최대 파일 크기 (KB). 기본 500.
+ [JsonPropertyName("codeIndexMaxFileKb")]
+ public int CodeIndexMaxFileKb { get; set; } = 500;
+
+ /// 파일 수정 시 diff 뷰어 자동 표시. 기본 true.
+ [JsonPropertyName("enableAutoDiff")]
+ public bool EnableAutoDiff { get; set; } = true;
+
+ /// AI 코드 리뷰 도구 활성화. 기본 true.
+ [JsonPropertyName("enableCodeReview")]
+ public bool EnableCodeReview { get; set; } = true;
+
+ /// 코드 스니펫 즉시 실행 도구 활성화. 기본 true.
+ [JsonPropertyName("enableSnippetRunner")]
+ public bool EnableSnippetRunner { get; set; } = true;
+
+ ///
+ /// [Code] 도구 실행 후 검증 강제.
+ /// true: 코드 생성/수정 도구(script_create, file_write, file_edit 등) 실행 후
+ /// LLM에 검증 전용 호출을 자동 삽입하여 구문 오류, 참조 무결성을 확인합니다.
+ /// false: LLM이 자율적으로 검증 여부를 결정합니다 (기존 동작).
+ ///
+ [JsonPropertyName("enableCodeVerification")]
+ public bool EnableCodeVerification { get; set; } = false;
+}
diff --git a/src/AxCopilot/Models/AppSettings.cs b/src/AxCopilot/Models/AppSettings.cs
index 5f9b699..ba4acba 100644
--- a/src/AxCopilot/Models/AppSettings.cs
+++ b/src/AxCopilot/Models/AppSettings.cs
@@ -562,759 +562,3 @@ public class ReminderSettings
[JsonPropertyName("enabledCategories")]
public List EnabledCategories { get; set; } = new() { "motivational" };
}
-
-// ─── LLM 채팅 설정 ──────────────────────────────────────────────────────────
-
-public class LlmSettings
-{
- /// LLM 서비스 종류. ollama | vllm | gemini | claude
- [JsonPropertyName("service")]
- public string Service { get; set; } = "ollama";
-
- /// 엔드포인트 URL. Ollama 기본값 http://localhost:11434
- [JsonPropertyName("endpoint")]
- public string Endpoint { get; set; } = "http://localhost:11434";
-
- /// 모델 이름. 미설정 시 빈 문자열.
- [JsonPropertyName("model")]
- public string Model { get; set; } = "";
-
- /// 암호화된 API 키 (사내 Ollama/vLLM 전용). DPAPI+AES로 암호화된 Base64.
- [JsonPropertyName("encryptedApiKey")]
- public string EncryptedApiKey { get; set; } = "";
-
- /// 평문 API 키 (Gemini/Claude 등 외부 서비스). 사내 연결 제한으로 별도 암호화 없음.
- [JsonPropertyName("apiKey")]
- public string ApiKey { get; set; } = "";
-
- /// 스트리밍 응답 활성화. 기본값 true.
- [JsonPropertyName("streaming")]
- public bool Streaming { get; set; } = true;
-
- /// 최대 컨텍스트 토큰 수. 기본값 4096.
- [JsonPropertyName("maxContextTokens")]
- public int MaxContextTokens { get; set; } = 4096;
-
- /// Phase 29: 자동 컴팩션 임계치 (%). 0이면 80% 기본값. CC auto_compact_threshold_percent 동등.
- [JsonPropertyName("autoCompactThreshold")]
- public int AutoCompactThreshold { get; set; } = 80;
-
- /// 대화 보관 기간(일). 7 | 30 | 90 | 0(무제한). 기본값 30.
- [JsonPropertyName("retentionDays")]
- public int RetentionDays { get; set; } = 30;
-
- /// Temperature. 0.0~2.0, 기본값 0.7.
- [JsonPropertyName("temperature")]
- public double Temperature { get; set; } = 0.7;
-
- /// 사내 서비스(Ollama/vLLM)용 등록 모델 목록. 별칭 + 암호화된 모델명.
- [JsonPropertyName("registeredModels")]
- public List RegisteredModels { get; set; } = new();
-
- ///
- /// API 키/모델명 암호화 활성화 여부.
- /// false: 평문 저장 (내부 개발 배포용)
- /// true: PortableEncrypt로 암호화 저장 (운영 배포용)
- /// 기본값 false. 운영 배포 시 true로 변경.
- ///
- [JsonPropertyName("encryptionEnabled")]
- public bool EncryptionEnabled { get; set; } = false;
-
- /// 프롬프트 템플릿 목록.
- [JsonPropertyName("promptTemplates")]
- public List PromptTemplates { get; set; } = new();
-
- /// 작업 폴더 경로. 빈 문자열이면 미선택.
- [JsonPropertyName("workFolder")]
- public string WorkFolder { get; set; } = "";
-
- /// 최근 사용한 작업 폴더 목록.
- [JsonPropertyName("recentWorkFolders")]
- public List RecentWorkFolders { get; set; } = new();
-
- /// 최근 폴더 최대 표시 개수 (기본 10, 범위 3~30).
- [JsonPropertyName("maxRecentFolders")]
- public int MaxRecentFolders { get; set; } = 10;
-
- /// 파일 탐색기 패널 표시 여부 (코워크 탭).
- [JsonPropertyName("showFileBrowser")]
- public bool ShowFileBrowser { get; set; } = false;
-
- ///
- /// 파일 접근 권한 수준.
- /// Ask = 매번 확인 | Auto = 자동 허용 | Deny = 차단
- ///
- [JsonPropertyName("filePermission")]
- public string FilePermission { get; set; } = "Ask";
-
- /// Cowork/Code 탭의 기본 파일 접근 권한. 탭 전환 시 자동 적용.
- [JsonPropertyName("defaultAgentPermission")]
- public string DefaultAgentPermission { get; set; } = "Ask";
-
- // ── 서비스별 독립 설정 ──────────────────────────────────────
- [JsonPropertyName("ollamaEndpoint")] public string OllamaEndpoint { get; set; } = "http://localhost:11434";
- [JsonPropertyName("ollamaApiKey")] public string OllamaApiKey { get; set; } = "";
- [JsonPropertyName("ollamaModel")] public string OllamaModel { get; set; } = "";
-
- [JsonPropertyName("vllmEndpoint")] public string VllmEndpoint { get; set; } = "";
- [JsonPropertyName("vllmApiKey")] public string VllmApiKey { get; set; } = "";
- [JsonPropertyName("vllmModel")] public string VllmModel { get; set; } = "";
-
- [JsonPropertyName("geminiApiKey")] public string GeminiApiKey { get; set; } = "";
- [JsonPropertyName("geminiModel")] public string GeminiModel { get; set; } = "gemini-2.5-flash";
-
- [JsonPropertyName("claudeApiKey")] public string ClaudeApiKey { get; set; } = "";
- [JsonPropertyName("claudeModel")] public string ClaudeModel { get; set; } = "claude-sonnet-4-6";
-
- // ── Cowork 에이전트 설정 ─────────────────────────────────
-
- /// 기본 출력 포맷. auto | xlsx | docx | html | md | csv
- [JsonPropertyName("defaultOutputFormat")]
- public string DefaultOutputFormat { get; set; } = "auto";
-
- /// 기본 디자인 무드. modern | professional | creative 등
- [JsonPropertyName("defaultMood")]
- public string DefaultMood { get; set; } = "modern";
-
- /// 문서 미리보기 자동 열기. auto | manual | off
- [JsonPropertyName("autoPreview")]
- public string AutoPreview { get; set; } = "off";
-
- /// 에이전트 최대 루프 반복 횟수.
- [JsonPropertyName("maxAgentIterations")]
- public int MaxAgentIterations { get; set; } = 25;
-
- /// 도구 실패 시 최대 재시도 횟수 (Self-Reflection).
- [JsonPropertyName("maxRetryOnError")]
- public int MaxRetryOnError { get; set; } = 3;
-
- /// 테스트-수정 자동 반복 최대 횟수. auto_fix 모드에서 사용. 기본 5.
- [JsonPropertyName("maxTestFixIterations")]
- public int MaxTestFixIterations { get; set; } = 5;
-
- /// 에이전트 로그 표시 수준. simple | detailed | debug
- [JsonPropertyName("agentLogLevel")]
- public string AgentLogLevel { get; set; } = "simple";
-
- /// LLM이 다수 도구를 동시 호출할 때 병렬 실행 활성화. 파일 충돌 없는 도구만 병렬 실행.
- [JsonPropertyName("enableParallelTools")]
- public bool EnableParallelTools { get; set; } = false;
-
- /// 멀티패스 문서 생성 사용 여부. 긴 문서(3페이지 이상) 작성 시 개요→섹션별 상세→조립 방식으로 품질 향상.
- [JsonPropertyName("enableMultiPassDocument")]
- public bool EnableMultiPassDocument { get; set; } = false;
-
- ///
- /// [Cowork] 도구 실행 후 검증 강제.
- /// true: 문서 생성 도구(file_write, docx_create, html_create, xlsx_create 등) 실행 후
- /// LLM에 검증 전용 호출을 자동 삽입하여 결과물 품질을 확인합니다.
- /// false: LLM이 자율적으로 검증 여부를 결정합니다 (기존 동작).
- ///
- [JsonPropertyName("enableCoworkVerification")]
- public bool EnableCoworkVerification { get; set; } = false;
-
- ///
- /// [Cowork] 검증 강제 시 워크스페이스 파일/폴더 참조를 채팅에서 파란색으로 강조 표시.
- ///
- [JsonPropertyName("enableFilePathHighlight")]
- public bool EnableFilePathHighlight { get; set; } = true;
-
- /// 멀티패스 자동 실행 기준 (예상 페이지 수 이상일 때). 기본 3페이지.
- [JsonPropertyName("multiPassThresholdPages")]
- public int MultiPassThresholdPages { get; set; } = 3;
-
- /// 탭별 마지막 활성 대화 ID. 앱 재시작 시 마지막 대화를 자동 복원합니다.
- [JsonPropertyName("lastConversationIds")]
- public Dictionary LastConversationIds { get; set; } = new();
-
- /// 폴더 데이터 활용 모드. active(적극) | passive(소극) | none(미활용)
- [JsonPropertyName("folderDataUsage")]
- public string FolderDataUsage { get; set; } = "active";
-
- ///
- /// 에이전트 의사결정 수준. AI가 중요한 작업 전에 사용자 확인을 요청하는 빈도.
- /// minimal: 파일 삭제, 외부 명령만 확인
- /// normal: + 새 파일 생성, 여러 파일 수정, 문서 생성, Git 커밋
- /// detailed: + 모든 파일 수정에 diff 미리보기
- ///
- [JsonPropertyName("agentDecisionLevel")]
- public string AgentDecisionLevel { get; set; } = "detailed";
-
- ///
- /// 플랜 모드. 에이전트가 도구 실행 전에 구조화된 실행 계획을 먼저 생성하도록 강제.
- /// off: 비활성 (기존 동작)
- /// always: 항상 계획 생성 후 사용자 승인 대기
- /// auto: 복잡한 작업 감지 시 자동으로 계획 모드 진입
- ///
- [JsonPropertyName("planMode")]
- public string PlanMode { get; set; } = "off";
-
- ///
- /// 프로젝트 규칙 자동 주입 활성화.
- /// true: .ax/rules/ 디렉토리의 규칙을 시스템 프롬프트에 자동 포함
- /// false: 규칙 주입 비활성 (project_rules 도구로 수동 읽기는 가능)
- ///
- [JsonPropertyName("enableProjectRules")]
- public bool EnableProjectRules { get; set; } = true;
-
- // ─── 모델 폴백 ──────────────────────────────────────────────────────
-
- /// 모델 API 실패 시 순차 시도할 폴백 모델 리스트. (예: "gemini:gemini-2.5-flash")
- [JsonPropertyName("fallbackModels")]
- public List FallbackModels { get; set; } = new();
-
- // ─── v1.4.0 에이전트 설정 ──────────────────────────────────────────────
-
- /// 서브에이전트 최대 동시 실행 수. 기본 3.
- [JsonPropertyName("maxSubAgents")]
- public int MaxSubAgents { get; set; } = 3;
-
- /// PDF 내보내기 기본 경로. 빈 문자열이면 바탕화면.
- [JsonPropertyName("pdfExportPath")]
- public string PdfExportPath { get; set; } = "";
-
- // ─── 보안 감사 로그 ──────────────────────────────────────────────────
-
- /// 에이전트 도구 호출 감사 로그 활성화. 기본 true.
- [JsonPropertyName("enableAuditLog")]
- public bool EnableAuditLog { get; set; } = true;
-
- /// 에이전트 메모리 (지속적 학습) 활성화. 기본 true.
- [JsonPropertyName("enableAgentMemory")]
- public bool EnableAgentMemory { get; set; } = true;
-
- /// 폴더별 최대 메모리 항목 수. 기본 100.
- [JsonPropertyName("maxMemoryEntries")]
- public int MaxMemoryEntries { get; set; } = 100;
-
- // ─── 이미지 입력 (멀티모달) ──────────────────────────────────────────
-
- /// 이미지 입력(Ctrl+V 붙여넣기, 파일 첨부) 활성화. 기본 true.
- [JsonPropertyName("enableImageInput")]
- public bool EnableImageInput { get; set; } = true;
-
- /// 이미지 최대 크기(KB). 기본 5120 (5MB).
- [JsonPropertyName("maxImageSizeKb")]
- public int MaxImageSizeKb { get; set; } = 5120;
-
- // ─── 자동 모델 라우팅 ─────────────────────────────────────────────
-
- /// 자동 모델 라우팅 활성화. 질문 유형 감지 → 최적 모델 자동 선택. 기본 false (잠금).
- [JsonPropertyName("enableAutoRouter")]
- public bool EnableAutoRouter { get; set; } = false;
-
- /// 자동 라우팅 최소 확신도. 이 값 미만이면 기본 모델 유지. 0.5~0.95, 기본 0.7.
- [JsonPropertyName("autoRouterConfidence")]
- public double AutoRouterConfidence { get; set; } = 0.7;
-
- /// 모델별 능력 점수 설정. 인텐트 카테고리별 적합도 0.0~1.0.
- [JsonPropertyName("modelCapabilities")]
- public List ModelCapabilities { get; set; } = new();
-
- // ─── MCP ──────────────────────────────────────────────────────────
-
- /// MCP 서버 설정 목록.
- [JsonPropertyName("mcpServers")]
- public List McpServers { get; set; } = new();
-
- // ─── 시각 효과 ──────────────────────────────────────────────────────
-
- /// 채팅 입력창 무지개 글로우 효과 활성화. 기본 false (성능 고려).
- [JsonPropertyName("enableChatRainbowGlow")]
- public bool EnableChatRainbowGlow { get; set; } = false;
-
- // ─── 알림 ──────────────────────────────────────────────────────────
-
- /// 에이전트 작업 완료 시 시스템 알림 표시 여부. (Cowork/Code 공통)
- [JsonPropertyName("notifyOnComplete")]
- public bool NotifyOnComplete { get; set; } = false;
-
- /// AI 대화창에서 팁 알림 표시 여부.
- [JsonPropertyName("showTips")]
- public bool ShowTips { get; set; } = false;
-
- /// 팁 알림 자동 사라짐 시간 (초). 0이면 수동 닫기.
- [JsonPropertyName("tipDurationSeconds")]
- public int TipDurationSeconds { get; set; } = 5;
-
- // ─── 개발자 모드 ──────────────────────────────────────────────────
-
- /// 개발자 모드 활성화. 에이전트 워크플로우 상세 이력을 대화창에 실시간 표시.
- [JsonPropertyName("devMode")]
- public bool DevMode { get; set; } = false;
-
- /// 개발자 모드: 도구 실행 전 매번 사용자 승인 대기 (스텝 바이 스텝 디버깅).
- [JsonPropertyName("devModeStepApproval")]
- public bool DevModeStepApproval { get; set; } = false;
-
- /// 개발자 모드: 에이전트 실행 시 워크플로우 시각화 창을 자동으로 표시.
- [JsonPropertyName("workflowVisualizer")]
- public bool WorkflowVisualizer { get; set; } = false;
-
- /// 개발자 모드: 무료 티어 호출 제한 모드. 활성화하면 LLM 호출 간 딜레이를 추가하여 RPM 한도를 초과하지 않습니다.
- [JsonPropertyName("freeTierMode")]
- public bool FreeTierMode { get; set; } = false;
-
- /// 무료 티어 모드: LLM 호출 간 딜레이 (초). 기본 4초 (Gemini 무료 15 RPM ≈ 4초 간격).
- [JsonPropertyName("freeTierDelaySeconds")]
- public int FreeTierDelaySeconds { get; set; } = 4;
-
- /// 개발자 모드: 전체 누적 호출 횟수 및 토큰 합계를 상태바에 표시.
- [JsonPropertyName("showTotalCallStats")]
- public bool ShowTotalCallStats { get; set; } = false;
-
- /// 차단할 경로 패턴 목록 (에이전트 파일 접근 시 적용).
- [JsonPropertyName("blockedPaths")]
- public List BlockedPaths { get; set; } = new()
- {
- "*\\Windows\\*", "*\\Program Files\\*", "*\\Program Files (x86)\\*",
- "*\\System32\\*", "*\\AppData\\Local\\*", "*Documents*",
- };
-
- /// 차단할 파일 확장자 목록.
- [JsonPropertyName("blockedExtensions")]
- public List BlockedExtensions { get; set; } = new()
- {
- ".exe", ".dll", ".sys", ".msi",
- ".reg", ".vbs", ".com", ".scr", ".pif",
- };
-
- /// 사용자가 만든 커스텀 프리셋 목록.
- [JsonPropertyName("customPresets")]
- public List CustomPresets { get; set; } = new();
-
- /// 사용자가 만든 커스텀 디자인 무드 목록.
- [JsonPropertyName("customMoods")]
- public List CustomMoods { get; set; } = new();
-
- // ─── 도구 관리 ──────────────────────────────────────────────────
-
- /// 비활성화된 에이전트 도구 이름 목록. 여기에 포함된 도구는 LLM에 노출되지 않습니다.
- [JsonPropertyName("disabledTools")]
- public List DisabledTools { get; set; } = new();
-
- ///
- /// 도구별 실행 권한 오버라이드. 키: 도구 이름, 값: "ask" | "auto" | "deny".
- /// 여기에 없는 도구는 전역 FilePermission 설정을 따릅니다.
- ///
- [JsonPropertyName("toolPermissions")]
- public Dictionary ToolPermissions { get; set; } = new();
-
- // ─── 에이전트 훅 시스템 ───────────────────────────────────────────
-
- /// 에이전트 훅 활성화 여부. 기본 true.
- [JsonPropertyName("enableToolHooks")]
- public bool EnableToolHooks { get; set; } = true;
-
- /// 훅 스크립트 실행 타임아웃 (밀리초). 기본 10000 (10초).
- [JsonPropertyName("toolHookTimeoutMs")]
- public int ToolHookTimeoutMs { get; set; } = 10000;
-
- /// 등록된 에이전트 훅 목록.
- [JsonPropertyName("agentHooks")]
- public List AgentHooks { get; set; } = new();
-
- // ─── 스킬 시스템 ─────────────────────────────────────────────────
-
- /// 스킬 시스템 활성화 여부. 기본 true.
- [JsonPropertyName("enableSkillSystem")]
- public bool EnableSkillSystem { get; set; } = true;
-
- /// 추가 스킬 폴더 경로. 빈 문자열이면 기본 폴더만 사용.
- [JsonPropertyName("skillsFolderPath")]
- public string SkillsFolderPath { get; set; } = "";
-
- /// 슬래시 명령어 팝업 한 번에 표시할 최대 항목 수 (3~20). 기본 7.
- [JsonPropertyName("slashPopupPageSize")]
- public int SlashPopupPageSize { get; set; } = 7;
-
- /// 즐겨찾기 슬래시 명령어 목록 (팝업 상단에 고정 표시). 예: ["/review", "/summary"]
- [JsonPropertyName("favoriteSlashCommands")]
- public List FavoriteSlashCommands { get; set; } = new();
-
- // ─── 드래그 앤 드롭 AI 처리 ──────────────────────────────────────
-
- /// 파일 드래그 시 AI 액션 팝업 표시 여부. 기본 true.
- [JsonPropertyName("enableDragDropAiActions")]
- public bool EnableDragDropAiActions { get; set; } = true;
-
- /// AI 액션 선택 시 자동 전송 여부. 기본 false.
- [JsonPropertyName("dragDropAutoSend")]
- public bool DragDropAutoSend { get; set; } = false;
-
- /// Code 탭 전용 설정.
- [JsonPropertyName("code")]
- public CodeSettings Code { get; set; } = new();
-
- // ─── Phase 17-F: 권한 시스템 ────────────────────────────────────────────
-
- [JsonPropertyName("permissions")]
- public PermissionsConfig Permissions { get; set; } = new();
-
- // ─── Phase 17-B: 이벤트 로그 ────────────────────────────────────────────
-
- [JsonPropertyName("event_log")]
- public EventLogConfig EventLog { get; set; } = new();
-
- // ─── Phase 17-A: Reflexion ──────────────────────────────────────────────
-
- [JsonPropertyName("reflexion")]
- public ReflexionConfig Reflexion { get; set; } = new();
-
- // ─── Phase 17-C: 확장 훅 ────────────────────────────────────────────────
-
- [JsonPropertyName("extended_hooks")]
- public ExtendedHooksConfig ExtendedHooks { get; set; } = new();
-
- // ─── Phase 17-B: Working Memory(TaskState) ──────────────────────────────
-
- /// 에이전트 Working Memory 활성화. 대화 압축 시에도 작업 상태 유지. 기본 true.
- [JsonPropertyName("enable_task_state")]
- public bool EnableTaskState { get; set; } = true;
-}
-
-/// Code 탭 설정 — 사내 개발 환경 연동.
-public class CodeSettings
-{
- /// 사내 Nexus 저장소 기본 URL. 빈 문자열이면 공용 저장소 사용.
- [JsonPropertyName("nexusBaseUrl")]
- public string NexusBaseUrl { get; set; } = "";
-
- /// NuGet 패키지 소스 URL (.NET).
- [JsonPropertyName("nugetSource")]
- public string NugetSource { get; set; } = "https://api.nuget.org/v3/index.json";
-
- /// PyPI/Conda 패키지 소스 URL (Python).
- [JsonPropertyName("pypiSource")]
- public string PypiSource { get; set; } = "https://conda.anaconda.org/conda-forge";
-
- /// Maven 저장소 URL (Java).
- [JsonPropertyName("mavenSource")]
- public string MavenSource { get; set; } = "https://repo1.maven.org/maven2";
-
- /// npm 레지스트리 URL (JavaScript/Node.js).
- [JsonPropertyName("npmSource")]
- public string NpmSource { get; set; } = "https://registry.npmjs.org";
-
- /// 선호 IDE 실행 경로. 빈 문자열이면 자동 감지.
- [JsonPropertyName("preferredIdePath")]
- public string PreferredIdePath { get; set; } = "";
-
- /// 빌드/테스트 명령 타임아웃 (초). 기본 120초.
- [JsonPropertyName("buildTimeout")]
- public int BuildTimeout { get; set; } = 120;
-
- // ─── v1.4.0 코드 인텔리전스 설정 ─────────────────────────────────────────
-
- /// LSP 코드 인텔리전스 활성화. 기본 true.
- [JsonPropertyName("enableLsp")]
- public bool EnableLsp { get; set; } = true;
-
- /// 코드 시맨틱 검색 자동 인덱싱 활성화. 기본 true.
- [JsonPropertyName("enableCodeIndex")]
- public bool EnableCodeIndex { get; set; } = true;
-
- /// 인덱싱 최대 파일 크기 (KB). 기본 500.
- [JsonPropertyName("codeIndexMaxFileKb")]
- public int CodeIndexMaxFileKb { get; set; } = 500;
-
- /// 파일 수정 시 diff 뷰어 자동 표시. 기본 true.
- [JsonPropertyName("enableAutoDiff")]
- public bool EnableAutoDiff { get; set; } = true;
-
- /// AI 코드 리뷰 도구 활성화. 기본 true.
- [JsonPropertyName("enableCodeReview")]
- public bool EnableCodeReview { get; set; } = true;
-
- /// 코드 스니펫 즉시 실행 도구 활성화. 기본 true.
- [JsonPropertyName("enableSnippetRunner")]
- public bool EnableSnippetRunner { get; set; } = true;
-
- ///
- /// [Code] 도구 실행 후 검증 강제.
- /// true: 코드 생성/수정 도구(script_create, file_write, file_edit 등) 실행 후
- /// LLM에 검증 전용 호출을 자동 삽입하여 구문 오류, 참조 무결성을 확인합니다.
- /// false: LLM이 자율적으로 검증 여부를 결정합니다 (기존 동작).
- ///
- [JsonPropertyName("enableCodeVerification")]
- public bool EnableCodeVerification { get; set; } = false;
-}
-
-/// Phase 17-F: 에이전트 권한 설정.
-public class PermissionsConfig
-{
- /// 권한 모드. default | acceptEdits | plan | bypassPermissions
- [JsonPropertyName("mode")]
- public string Mode { get; set; } = "default";
-
- /// 허용 규칙 목록. 규칙 매칭 시 확인 없이 자동 허용.
- [JsonPropertyName("allow")]
- public List AllowRules { get; set; } = new();
-
- /// 차단 규칙 목록. 규칙 매칭 시 즉시 차단.
- [JsonPropertyName("deny")]
- public List DenyRules { get; set; } = new();
-}
-
-/// 권한 규칙 항목 (설정 저장용).
-public class PermissionRuleEntry
-{
- [JsonPropertyName("tool")]
- public string ToolName { get; set; } = "";
-
- [JsonPropertyName("pattern")]
- public string? Pattern { get; set; }
-
- [JsonPropertyName("behavior")]
- public string Behavior { get; set; } = "allow"; // allow | deny | ask
-}
-
-/// Phase 17-B: 이벤트 로그 설정.
-public class EventLogConfig
-{
- [JsonPropertyName("enabled")]
- public bool Enabled { get; set; } = true;
-
- [JsonPropertyName("retention_days")]
- public int RetentionDays { get; set; } = 30;
-}
-
-/// Phase 17-A: Reflexion(자기성찰) 설정.
-public class ReflexionConfig
-{
- [JsonPropertyName("enabled")]
- public bool Enabled { get; set; } = true;
-
- [JsonPropertyName("max_context_entries")]
- public int MaxContextEntries { get; set; } = 5;
-
- [JsonPropertyName("evaluate_on_success")]
- public bool EvaluateOnSuccess { get; set; } = true;
-}
-
-/// Phase 17-C: 확장 훅 설정.
-public class ExtendedHooksConfig
-{
- [JsonPropertyName("user_prompt_submit")]
- public List UserPromptSubmit { get; set; } = new();
-
- [JsonPropertyName("pre_compact")]
- public List PreCompact { get; set; } = new();
-
- [JsonPropertyName("post_compact")]
- public List PostCompact { get; set; } = new();
-
- [JsonPropertyName("file_changed")]
- public List FileChanged { get; set; } = new();
-
- [JsonPropertyName("session_start")]
- public List SessionStart { get; set; } = new();
-
- [JsonPropertyName("session_end")]
- public List SessionEnd { get; set; } = new();
-
- [JsonPropertyName("permission_request")]
- public List PermissionRequest { get; set; } = new();
-}
-
-/// 확장 훅 항목 설정.
-public class ExtendedHookEntryConfig
-{
- [JsonPropertyName("name")]
- public string Name { get; set; } = "";
-
- [JsonPropertyName("mode")]
- public string Mode { get; set; } = "command"; // command | http | prompt | agent
-
- [JsonPropertyName("matcher")]
- public string? Matcher { get; set; }
-
- [JsonPropertyName("script_path")]
- public string? ScriptPath { get; set; }
-
- [JsonPropertyName("url")]
- public string? Url { get; set; }
-
- [JsonPropertyName("prompt")]
- public string? Prompt { get; set; }
-
- [JsonPropertyName("model")]
- public string? Model { get; set; }
-
- [JsonPropertyName("enabled")]
- public bool Enabled { get; set; } = true;
-
- [JsonPropertyName("once")]
- public bool Once { get; set; } = false;
-
- [JsonPropertyName("async")]
- public bool IsAsync { get; set; } = false;
-
- [JsonPropertyName("timeout_seconds")]
- public int TimeoutSeconds { get; set; } = 30;
-
- [JsonPropertyName("status_message")]
- public string? StatusMessage { get; set; }
-
- [JsonPropertyName("watch_paths")]
- public List WatchPaths { get; set; } = new();
-}
-
-/// 사용자 정의 커스텀 프리셋 (settings.json에 저장).
-public class CustomPresetEntry
-{
- [JsonPropertyName("id")]
- public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8];
-
- [JsonPropertyName("label")]
- public string Label { get; set; } = "";
-
- [JsonPropertyName("description")]
- public string Description { get; set; } = "";
-
- [JsonPropertyName("systemPrompt")]
- public string SystemPrompt { get; set; } = "";
-
- [JsonPropertyName("color")]
- public string Color { get; set; } = "#6366F1";
-
- [JsonPropertyName("symbol")]
- public string Symbol { get; set; } = "\uE713";
-
- /// 프리셋이 속하는 탭. "Chat" | "Cowork" | "Code"
- [JsonPropertyName("tab")]
- public string Tab { get; set; } = "Chat";
-}
-
-/// 사용자 정의 디자인 무드 (CSS 템플릿).
-public class CustomMoodEntry
-{
- [JsonPropertyName("key")]
- public string Key { get; set; } = "";
-
- [JsonPropertyName("label")]
- public string Label { get; set; } = "";
-
- [JsonPropertyName("icon")]
- public string Icon { get; set; } = "🎯";
-
- [JsonPropertyName("description")]
- public string Description { get; set; } = "";
-
- [JsonPropertyName("css")]
- public string Css { get; set; } = "";
-}
-
-/// 저장된 프롬프트 템플릿.
-public class PromptTemplate
-{
- [JsonPropertyName("name")]
- public string Name { get; set; } = "";
-
- [JsonPropertyName("content")]
- public string Content { get; set; } = "";
-
- [JsonPropertyName("icon")]
- public string Icon { get; set; } = "\uE8BD";
-}
-
-///
-/// 사내 LLM 등록 모델. 별칭(UI 표시용) + 암호화된 실제 모델명.
-/// 향후 멀티 에이전트에서는 특화 업무와 연결됩니다.
-///
-public class RegisteredModel
-{
- /// UI에 표시할 별칭 (예: "코드 리뷰 전용", "일반 대화")
- [JsonPropertyName("alias")]
- public string Alias { get; set; } = "";
-
- /// 실제 모델명. EncryptionEnabled=true일 때 PortableEncrypt로 암호화된 Base64 값, false일 때 평문.
- [JsonPropertyName("encryptedModelName")]
- public string EncryptedModelName { get; set; } = "";
-
- /// 이 모델이 연결될 서비스 타입. ollama | vllm
- [JsonPropertyName("service")]
- public string Service { get; set; } = "ollama";
-
- /// 이 모델 전용 서버 엔드포인트. 비어있으면 LlmSettings의 기본 엔드포인트 사용.
- [JsonPropertyName("endpoint")]
- public string Endpoint { get; set; } = "";
-
- /// 이 모델 전용 API 키. 비어있으면 LlmSettings의 기본 API 키 사용.
- [JsonPropertyName("apiKey")]
- public string ApiKey { get; set; } = "";
-
- // ── CP4D (IBM Cloud Pak for Data) 인증 ──────────────────────────────
-
- /// 인증 방식. bearer (기본) | cp4d
- [JsonPropertyName("authType")]
- public string AuthType { get; set; } = "bearer";
-
- /// CP4D 인증 서버 URL (예: https://cpd-host.example.com)
- [JsonPropertyName("cp4dUrl")]
- public string Cp4dUrl { get; set; } = "";
-
- /// CP4D 사용자 이름
- [JsonPropertyName("cp4dUsername")]
- public string Cp4dUsername { get; set; } = "";
-
- /// CP4D 비밀번호 또는 API 키 (EncryptionEnabled=true 시 암호화 저장)
- [JsonPropertyName("cp4dPassword")]
- public string Cp4dPassword { get; set; } = "";
-}
-
-///
-/// 자동 모델 라우팅용 모델 능력 점수.
-/// 각 모델의 인텐트 카테고리별 적합도를 0.0~1.0으로 지정합니다.
-/// 개발자가 하드코딩 기본값을 수정하려면 ModelRouterService.GetDefaultCapabilities()를 참조하세요.
-///
-public class ModelCapability
-{
- /// 서비스 타입. ollama | vllm | gemini | claude
- [JsonPropertyName("service")]
- public string Service { get; set; } = "";
-
- /// 모델 식별자. 서비스별 모델 ID (예: "gemini-2.5-flash", "claude-sonnet-4-6")
- [JsonPropertyName("model")]
- public string Model { get; set; } = "";
-
- /// UI 표시용 별칭.
- [JsonPropertyName("alias")]
- public string Alias { get; set; } = "";
-
- /// 인텐트 카테고리별 적합도 점수. key=카테고리명, value=0.0~1.0
- [JsonPropertyName("scores")]
- public Dictionary Scores { get; set; } = new();
-
- /// 라우팅 후보에 포함 여부.
- [JsonPropertyName("enabled")]
- public bool Enabled { get; set; } = true;
-}
-
-/// 에이전트 훅 설정 항목. 도구 실행 전/후 사용자 스크립트 실행.
-public class AgentHookEntry
-{
- /// 훅 이름 (UI 표시용).
- [JsonPropertyName("name")]
- public string Name { get; set; } = "";
-
- /// 대상 도구 이름. "*" = 모든 도구, 특정 도구명 = 해당 도구만.
- [JsonPropertyName("toolName")]
- public string ToolName { get; set; } = "*";
-
- /// 실행 타이밍. "pre" = 도구 실행 전, "post" = 도구 실행 후.
- [JsonPropertyName("timing")]
- public string Timing { get; set; } = "post";
-
- /// 실행할 스크립트 경로 (.bat, .ps1, .cmd).
- [JsonPropertyName("scriptPath")]
- public string ScriptPath { get; set; } = "";
-
- /// 스크립트에 전달할 추가 인수 (선택).
- [JsonPropertyName("arguments")]
- public string Arguments { get; set; } = "";
-
- /// 활성화 여부.
- [JsonPropertyName("enabled")]
- public bool Enabled { get; set; } = true;
-}