에이전트 선택적 탐색 구조 개선과 경고 정리 반영
Some checks failed
Release Gate / gate (push) Has been cancelled

- claude-code 선택적 탐색 흐름을 참고해 Cowork/Code 시스템 프롬프트에서 folder_map 상시 선행 지시를 완화하고 glob/grep 기반 좁은 탐색을 우선하도록 조정함

- FolderMapTool 기본 depth를 2로, include_files 기본값을 false로 낮추고 MultiReadTool 최대 파일 수를 8개로 줄여 초기 과탐색 폭을 보수적으로 조정함

- AgentLoopExplorationPolicy partial을 추가해 탐색 범위 분류, broad-scan corrective hint, exploration_breadth 성능 로그를 연결함

- AgentLoopService에 탐색 범위 가이드 주입과 실행 중 탐색 폭 추적을 추가하고, 좁은 질문에서 반복적인 folder_map/대량 multi_read를 교정하도록 정리함

- DocxToHtmlConverter nullable 경고를 수정해 Release 빌드 경고 0 / 오류 0 기준을 다시 충족함

- README와 docs/DEVELOPMENT.md에 2026-04-09 10:36 (KST) 기준 개발 이력을 반영함
This commit is contained in:
2026-04-09 14:27:59 +09:00
parent 7931566212
commit 33c1db4dae
119 changed files with 4453 additions and 6943 deletions

View File

@@ -14,9 +14,91 @@ namespace AxCopilot.Views;
public partial class ChatWindow
{
// ── A-2: PermissionItems 이벤트 위임 ──
private bool _permPanelDelegationInitialized;
private sealed class PermissionItemTag
{
public required string Level { get; init; }
public required bool IsActive { get; init; }
public required Brush SelectedBackground { get; init; }
public required Brush HoverBackground { get; init; }
}
private void InitPermissionPanelDelegation()
{
if (_permPanelDelegationInitialized || PermissionItems == null)
return;
_permPanelDelegationInitialized = true;
PermissionItems.MouseMove += PermissionItems_DelegatedMouseMove;
PermissionItems.MouseLeave += PermissionItems_DelegatedMouseLeave;
PermissionItems.PreviewMouseLeftButtonDown += PermissionItems_DelegatedLeftButtonDown;
PermissionItems.PreviewKeyDown += PermissionItems_DelegatedKeyDown;
}
private Border? _lastHoveredPermBorder;
private void PermissionItems_DelegatedMouseMove(object sender, MouseEventArgs e)
{
var border = FindAncestorWithTag<Border>(e.OriginalSource as DependencyObject);
if (ReferenceEquals(border, _lastHoveredPermBorder))
return;
if (_lastHoveredPermBorder?.Tag is PermissionItemTag prevTag)
_lastHoveredPermBorder.Background = prevTag.IsActive ? prevTag.SelectedBackground : Brushes.Transparent;
_lastHoveredPermBorder = border;
if (border?.Tag is PermissionItemTag tag)
border.Background = tag.IsActive ? tag.SelectedBackground : tag.HoverBackground;
}
private void PermissionItems_DelegatedMouseLeave(object sender, MouseEventArgs e)
{
if (_lastHoveredPermBorder?.Tag is PermissionItemTag prevTag)
_lastHoveredPermBorder.Background = prevTag.IsActive ? prevTag.SelectedBackground : Brushes.Transparent;
_lastHoveredPermBorder = null;
}
private void PermissionItems_DelegatedLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var border = FindAncestorWithTag<Border>(e.OriginalSource as DependencyObject);
if (border?.Tag is PermissionItemTag tag)
{
e.Handled = true;
ApplyPermissionLevel(tag.Level);
}
}
private void PermissionItems_DelegatedKeyDown(object sender, KeyEventArgs e)
{
if (e.Key is not (Key.Enter or Key.Space))
return;
var border = FindAncestorWithTag<Border>(e.OriginalSource as DependencyObject);
if (border?.Tag is PermissionItemTag tag)
{
e.Handled = true;
ApplyPermissionLevel(tag.Level);
}
}
private void ApplyPermissionLevel(string level)
{
_settings.Settings.Llm.FilePermission = PermissionModeCatalog.NormalizeGlobalMode(level);
try { _settings.Save(); } catch { }
_appState.LoadFromSettings(_settings);
UpdatePermissionUI();
SaveConversationSettings();
RefreshInlineSettingsPanel();
RefreshOverlayModeButtons();
PermissionPopup.IsOpen = false;
}
private void BtnPermission_Click(object sender, RoutedEventArgs e)
{
if (PermissionPopup == null) return;
InitPermissionPanelDelegation();
_lastHoveredPermBorder = null;
PermissionItems.Children.Clear();
ChatConversation? currentConversation;
@@ -96,30 +178,14 @@ public partial class ChatWindow
row.Children.Add(check);
rowBorder.Child = row;
rowBorder.MouseEnter += (_, _) => rowBorder.Background = isActive ? selectedBackground : hoverBackground;
rowBorder.MouseLeave += (_, _) => rowBorder.Background = isActive ? selectedBackground : Brushes.Transparent;
var capturedLevel = level;
void ApplyPermission()
// A-2: 이벤트 위임 — 개별 람다 대신 Tag에 메타 저장
rowBorder.Tag = new PermissionItemTag
{
_settings.Settings.Llm.FilePermission = PermissionModeCatalog.NormalizeGlobalMode(capturedLevel);
try { _settings.Save(); } catch { }
_appState.LoadFromSettings(_settings);
UpdatePermissionUI();
SaveConversationSettings();
RefreshInlineSettingsPanel();
RefreshOverlayModeButtons();
PermissionPopup.IsOpen = false;
}
rowBorder.MouseLeftButtonDown += (_, _) => ApplyPermission();
rowBorder.KeyDown += (_, ke) =>
{
if (ke.Key is Key.Enter or Key.Space)
{
ke.Handled = true;
ApplyPermission();
}
Level = level,
IsActive = isActive,
SelectedBackground = selectedBackground,
HoverBackground = hoverBackground,
};
container.Children.Add(rowBorder);