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