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>계층 메모리 시스템 활성화 여부 (AX.md @include 해석 + 경로 범위 규칙). 기본 true.</summary>
    [JsonPropertyName("enableMemorySystem")]
    public bool EnableMemorySystem { get; set; } = true;

    /// <summary>멀티파일 Diff 추적 활성화 여부. 쓰기 도구 실행 전후 파일 변경을 기록. 기본 true.</summary>
    [JsonPropertyName("enableDiffTracker")]
    public bool EnableDiffTracker { get; set; } = true;

    /// <summary>Phase 18-A1: 코디네이터 에이전트 모드 활성화. true이면 LLM이 먼저 계획을 수립 후 서브에이전트에 위임. 기본 false.</summary>
    [JsonPropertyName("enableCoordinatorMode")]
    public bool EnableCoordinatorMode { get; set; } = false;

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