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[] { Deny, Default, AcceptEdits, Plan, BypassPermissions, DontAsk, }; /// /// 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, "acceptedits" => AcceptEdits, "accept" => AcceptEdits, "auto" => Auto, "plan" => Plan, "bypasspermissions" => BypassPermissions, "bypass" => BypassPermissions, "dontask" => DontAsk, "don't ask" => DontAsk, "allow" => AcceptEdits, "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) && !IsDontAsk(normalized) && !string.Equals(normalized, Deny, StringComparison.OrdinalIgnoreCase); } public static string ToDisplayLabel(string? mode) { var normalized = NormalizeGlobalMode(mode); return normalized switch { Default => "소극 활용", AcceptEdits => "적극 활용", Plan => "계획 중심", BypassPermissions => "완전 자동", DontAsk => "질문 없이 진행", Deny => "활용하지 않음", _ => normalized, }; } }