Some checks failed
Release Gate / gate (push) Has been cancelled
- .gitignore에 bin/obj/publish 및 IDE/OS/비밀정보 패턴 추가 - Git 인덱스에서 publish 및 src 하위 bin/obj 빌드 부산물 추적을 해제하여 저장소 노이즈를 정리 - DraftQueue를 실행 대기/최근 결과 섹션과 상태 요약 pill 구조로 재정리 - composer 상단 모델/컨텍스트/프리셋 줄과 하단 작업 위치 칩 UI를 더 평평한 시각 언어로 통일 - 워크스페이스·브랜치·워크트리 패널에 공통 row 및 요약 strip을 적용해 panel UX를 정돈 - README.md와 docs/DEVELOPMENT.md, docs/AGENT_ROADMAP.md, AGENTS.md 이력을 갱신 검증 - dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ - 경고 0개, 오류 0개
133 lines
4.5 KiB
C#
133 lines
4.5 KiB
C#
namespace AxCopilot.Services.Agent;
|
|
|
|
/// <summary>
|
|
/// AX Agent permission mode constants and normalization helpers.
|
|
/// Uses AX-native permission vocabulary only.
|
|
/// </summary>
|
|
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<string> UserSelectableModes = new[]
|
|
{
|
|
Default,
|
|
AcceptEdits,
|
|
Plan,
|
|
BypassPermissions,
|
|
};
|
|
|
|
/// <summary>
|
|
/// Normalize global permission mode.
|
|
/// Supported values: ask/plan/auto/deny (case-insensitive).
|
|
/// </summary>
|
|
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,
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// Normalize tool override permission.
|
|
/// Tool override is constrained to ask/auto/deny.
|
|
/// </summary>
|
|
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,
|
|
};
|
|
}
|
|
}
|