namespace AxCopilot.Services.Agent; /// /// AX Agent permission mode constants and normalization helpers. /// Uses AX-native permission vocabulary only. /// public static class PermissionModeCatalog { public const string Default = "Default"; public const string Ask = Default; public const string AcceptEdits = "AcceptEdits"; public const string Plan = "Plan"; public const string BypassPermissions = "BypassPermissions"; public const string DontAsk = "DontAsk"; public const string Auto = AcceptEdits; public const string Deny = "Deny"; public static readonly IReadOnlyList UserSelectableModes = new[] { Default, AcceptEdits, Plan, BypassPermissions, }; /// /// Normalize global permission mode. /// Supported values: ask/plan/auto/deny (case-insensitive). /// public static string NormalizeGlobalMode(string? value) { if (string.IsNullOrWhiteSpace(value)) return Default; return value.Trim().ToLowerInvariant() switch { "default" => Default, "ask" => Ask, "passive" => Default, "소극활용" => Default, "소극 활용" => Default, "acceptedits" => AcceptEdits, "accept" => AcceptEdits, "auto" => Auto, "active" => AcceptEdits, "적극활용" => AcceptEdits, "적극 활용" => AcceptEdits, "plan" => Plan, "planning" => Plan, "계획중심" => Plan, "계획 중심" => Plan, "bypasspermissions" => BypassPermissions, "bypass" => BypassPermissions, "fullauto" => BypassPermissions, "완전자동" => BypassPermissions, "완전 자동" => BypassPermissions, "dontask" => BypassPermissions, "don't ask" => BypassPermissions, "silent" => BypassPermissions, "질문없이진행" => BypassPermissions, "질문 없이 진행" => BypassPermissions, "allow" => AcceptEdits, "none" => Deny, "disabled" => Deny, "활용하지않음" => Deny, "활용하지 않음" => Deny, "deny" => Deny, _ => Default, }; } /// /// Normalize tool override permission. /// Tool override is constrained to ask/auto/deny. /// public static string NormalizeToolOverride(string? value) { var mode = NormalizeGlobalMode(value); return mode switch { AcceptEdits => AcceptEdits, Plan => Plan, BypassPermissions => BypassPermissions, DontAsk => DontAsk, Deny => Deny, _ => Default, }; } public static bool IsAuto(string? mode) => IsAcceptEdits(mode) || IsBypassPermissions(mode) || IsDontAsk(mode); public static bool IsDefault(string? mode) => string.Equals(NormalizeGlobalMode(mode), Default, StringComparison.OrdinalIgnoreCase); public static bool IsAcceptEdits(string? mode) => string.Equals(NormalizeGlobalMode(mode), AcceptEdits, StringComparison.OrdinalIgnoreCase); public static bool IsPlan(string? mode) => string.Equals(NormalizeGlobalMode(mode), Plan, StringComparison.OrdinalIgnoreCase); public static bool IsBypassPermissions(string? mode) => string.Equals(NormalizeGlobalMode(mode), BypassPermissions, StringComparison.OrdinalIgnoreCase); public static bool IsDontAsk(string? mode) => string.Equals(NormalizeGlobalMode(mode), DontAsk, StringComparison.OrdinalIgnoreCase); public static bool IsDeny(string? mode) => string.Equals(NormalizeGlobalMode(mode), Deny, StringComparison.OrdinalIgnoreCase); public static bool RequiresUserApproval(string? mode) { var normalized = NormalizeGlobalMode(mode); return !IsAcceptEdits(normalized) && !IsBypassPermissions(normalized) && !string.Equals(normalized, Deny, StringComparison.OrdinalIgnoreCase); } public static string ToDisplayLabel(string? mode) { var normalized = NormalizeGlobalMode(mode); return normalized switch { Default => "권한 요청", AcceptEdits => "편집 자동 승인", Plan => "계획 모드", BypassPermissions => "권한 건너뛰기", Deny => "읽기 전용", _ => normalized, }; } }