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; -}