Files
AX-Copilot-Codex/src/AxCopilot/Services/Agent/PermissionRequestPresentationCatalog.cs
lacvet d5c1266d3e
Some checks failed
Release Gate / gate (push) Has been cancelled
상태선/권한 카탈로그 구조 정리와 계획 모드 표현 잔재 제거
- OperationalStatusPresentationCatalog를 추가해 compact strip과 quick strip의 색상/노출 계산을 AppStateService 밖으로 분리함

- PermissionRequestPresentationCatalog와 ToolResultPresentationCatalog에 Kind/Description 메타를 추가해 transcript fallback 설명을 타입 기반으로 정리함

- PermissionModePresentationCatalog와 ChatWindow.PermissionPresentation에서 제거된 계획 모드 표현 분기를 걷어 권한 UI를 실제 지원 모드만 다루도록 단순화함

- README, DEVELOPMENT, claw-code parity plan 문서를 2026-04-06 09:36 (KST) 기준으로 갱신함

- 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ (경고 0 / 오류 0)
2026-04-06 09:44:53 +09:00

121 lines
4.2 KiB
C#

namespace AxCopilot.Services.Agent;
internal sealed record PermissionRequestPresentation(
string Kind,
string Icon,
string Label,
string Description,
string BackgroundHex,
string ForegroundHex);
internal static class PermissionRequestPresentationCatalog
{
public static PermissionRequestPresentation Resolve(string? toolName, bool pending)
{
var tool = (toolName ?? string.Empty).Trim().ToLowerInvariant();
if (tool.Contains("bash") || tool.Contains("powershell") || tool.Contains("process"))
return Build(
"command",
pending,
"\uE756",
"명령 실행 권한 요청",
"명령 실행 권한 확인",
"터미널 명령을 실행하기 전에 확인이 필요합니다.",
"명령 실행이 승인되어 계속 진행합니다.",
"#FEF2F2",
"#DC2626");
if (tool.Contains("web") || tool.Contains("fetch") || tool.Contains("http"))
return Build(
"web",
pending,
"\uE774",
"웹 요청 권한 요청",
"웹 요청 권한 확인",
"외부 웹 요청 전 사용자 확인이 필요합니다.",
"웹 요청이 승인되어 계속 진행합니다.",
"#FFF7ED",
"#C2410C");
if (tool.Contains("skill"))
return Build(
"skill",
pending,
"\uE8A5",
"스킬 실행 권한 요청",
"스킬 실행 권한 확인",
"연결된 스킬 실행 전 확인이 필요합니다.",
"스킬 실행이 승인되어 계속 진행합니다.",
"#F5F3FF",
"#7C3AED");
if (tool.Contains("ask"))
return Build(
"question",
pending,
"\uE897",
"의견 요청 확인",
"의견 요청 완료",
"사용자에게 선택이나 답변을 요청합니다.",
"사용자 의견을 받아 다음 단계로 진행합니다.",
"#EFF6FF",
"#2563EB");
if (tool.Contains("file_edit") || tool.Contains("file_write") || tool.Contains("edit"))
return Build(
"file_edit",
pending,
"\uE70F",
"파일 수정 권한 요청",
"파일 수정 권한 확인",
"파일을 만들거나 수정하기 전에 확인이 필요합니다.",
"파일 수정이 승인되어 계속 진행합니다.",
"#FFF7ED",
"#C2410C");
if (tool.Contains("file") || tool.Contains("glob") || tool.Contains("grep") || tool.Contains("folder"))
return Build(
"file_access",
pending,
"\uE8A5",
"파일 접근 권한 요청",
"파일 접근 권한 확인",
"폴더와 파일 내용을 읽기 전에 확인이 필요합니다.",
"파일 접근이 승인되어 계속 진행합니다.",
"#FFF7ED",
"#C2410C");
return Build(
"generic",
pending,
"\uE897",
"권한 요청",
"권한 확인",
"계속 진행하기 전에 사용자 확인이 필요합니다.",
"요청이 승인되어 계속 진행합니다.",
"#FFF7ED",
"#C2410C");
}
private static PermissionRequestPresentation Build(
string kind,
bool pending,
string icon,
string pendingLabel,
string resolvedLabel,
string pendingDescription,
string resolvedDescription,
string backgroundHex,
string foregroundHex)
{
return new PermissionRequestPresentation(
kind,
pending ? icon : "\uE73E",
pending ? pendingLabel : resolvedLabel,
pending ? pendingDescription : resolvedDescription,
pending ? backgroundHex : "#ECFDF5",
pending ? foregroundHex : "#059669");
}
}