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