연속 개선: 권한 상태 간소화·설정창 외부 진입 안정화·컴포저 반응형 보강
Some checks failed
Release Gate / gate (push) Has been cancelled

- 권한 상태 텍스트(/permissions,/allowed-tools)를 운영 모드 포함 축약형으로 재정리
- 하단 권한 버튼 툴팁에 운영 모드/기본값/예외 개수 정보를 일관 반영
- 탭 전환 시 좌측 메뉴 Visibility 재할당을 최소화해 UI 흔들림 완화
- 상단 모델 라벨에 MaxWidth+말줄임 적용으로 긴 모델명 레이아웃 깨짐 방지
- AX Agent 설정창 오픈 시 리소스 병합 예외를 방어하고 외부 진입 경로를 Dispatcher 기반으로 안정화
- UI 체크리스트/개발문서/README에 2026-04-04 12:41 기준 점검 이력 업데이트
- 검증: build 경고0/오류0, 운영모드 필터 18건 통과, 전체 테스트 436건 통과
This commit is contained in:
2026-04-04 12:42:49 +09:00
parent e8e701e4a1
commit 6e65cf6026
5 changed files with 82 additions and 17 deletions

View File

@@ -717,9 +717,12 @@ public partial class ChatWindow : Window
if (SidebarChatMenu == null || SidebarCoworkMenu == null || SidebarCodeMenu == null)
return;
SidebarChatMenu.Visibility = _activeTab == "Chat" ? Visibility.Visible : Visibility.Collapsed;
SidebarCoworkMenu.Visibility = _activeTab == "Cowork" ? Visibility.Visible : Visibility.Collapsed;
SidebarCodeMenu.Visibility = _activeTab == "Code" ? Visibility.Visible : Visibility.Collapsed;
var chatVisible = _activeTab == "Chat" ? Visibility.Visible : Visibility.Collapsed;
var coworkVisible = _activeTab == "Cowork" ? Visibility.Visible : Visibility.Collapsed;
var codeVisible = _activeTab == "Code" ? Visibility.Visible : Visibility.Collapsed;
if (SidebarChatMenu.Visibility != chatVisible) SidebarChatMenu.Visibility = chatVisible;
if (SidebarCoworkMenu.Visibility != coworkVisible) SidebarCoworkMenu.Visibility = coworkVisible;
if (SidebarCodeMenu.Visibility != codeVisible) SidebarCodeMenu.Visibility = codeVisible;
if (SidebarModeBadgeTitle != null && SidebarModeBadgeIcon != null)
{
@@ -2139,7 +2142,10 @@ public partial class ChatWindow : Window
_ => "\uE8D7",
};
if (BtnPermission != null)
BtnPermission.ToolTip = $"{summary.Description}\n기본값 {PermissionModeCatalog.ToDisplayLabel(summary.DefaultMode)} · override {summary.OverrideCount}개";
{
var operationMode = OperationModePolicy.Normalize(_settings.Settings.OperationMode);
BtnPermission.ToolTip = $"{summary.Description}\n운영 모드: {operationMode}\n기본값 {PermissionModeCatalog.ToDisplayLabel(summary.DefaultMode)} · 예외 {summary.OverrideCount}개";
}
if (!string.Equals(_lastPermissionBannerMode, perm, StringComparison.OrdinalIgnoreCase))
{
@@ -2275,10 +2281,11 @@ public partial class ChatWindow : Window
lock (_convLock) currentConversation = _currentConversation;
var summary = _appState.GetPermissionSummary(currentConversation);
var mode = PermissionModeCatalog.NormalizeGlobalMode(summary.EffectiveMode);
var operationMode = OperationModePolicy.Normalize(_settings.Settings.OperationMode);
var overrides = summary.TopOverrides.Count > 0
? string.Join(", ", summary.TopOverrides.Select(x => $"{x.Key}:{x.Value}"))
? string.Join(", ", summary.TopOverrides.Take(3).Select(x => $"{x.Key}:{PermissionModeCatalog.ToDisplayLabel(x.Value)}"))
: "없음";
return $"현재 권한 모드: {PermissionModeCatalog.ToDisplayLabel(mode)} ({mode})\n설명: {summary.Description}\n기본값: {PermissionModeCatalog.ToDisplayLabel(summary.DefaultMode)} · override: {summary.OverrideCount}개\n상위 override: {overrides}";
return $"현재 권한 모드: {PermissionModeCatalog.ToDisplayLabel(mode)}\n운영 모드: {operationMode}\n기본값: {PermissionModeCatalog.ToDisplayLabel(summary.DefaultMode)} · 예외 {summary.OverrideCount}개\n예외 미리보기: {overrides}";
}
private void OpenPermissionPanelFromSlash(string command, string usageText)
@@ -12972,13 +12979,19 @@ public partial class ChatWindow : Window
_agentSettingsWindow = null;
}
var win = new AgentSettingsWindow(_settings)
{
Owner = IsLoaded && IsVisible ? this : null,
};
var win = new AgentSettingsWindow(_settings);
if (IsLoaded && IsVisible)
win.Owner = this;
_agentSettingsWindow = win;
win.Closed += (_, _) => _agentSettingsWindow = null;
win.Resources.MergedDictionaries.Add(Resources);
try
{
win.Resources.MergedDictionaries.Add(Resources);
}
catch
{
// 리소스 병합 실패 시에도 설정창 자체는 열리도록 유지
}
bool changed;
try
@@ -12988,8 +13001,12 @@ public partial class ChatWindow : Window
catch
{
// 모달 창 오픈에 실패하면 일반 창으로라도 설정 접근을 보장
win.Show();
win.Activate();
try
{
win.Show();
win.Activate();
}
catch { }
return;
}
if (!changed)
@@ -13006,9 +13023,12 @@ public partial class ChatWindow : Window
public void OpenAgentSettingsFromExternal()
{
Show();
Activate();
OpenAgentSettingsWindow();
Dispatcher.BeginInvoke(() =>
{
Show();
Activate();
OpenAgentSettingsWindow();
}, DispatcherPriority.Input);
}
private void BtnInlineSettingsClose_Click(object sender, RoutedEventArgs e)