AX Agent 계획 모드 잔재를 더 걷어내고 UI hover 안정화\n\n- AgentLoop 실행 경로에서 계획 모드 분기를 비활성 정책 기준으로 단순화해 기본 런타임이 설정값에 흔들리지 않게 정리\n- 내부 설정의 숨김 상태 계획 모드 버튼과 콤보 이벤트 연결 및 관련 dead code 제거\n- 작업유형 카드에서 hover 라벨과 ToolTip 충돌로 발생하던 깜박임을 해결\n- README와 DEVELOPMENT 문서에 parity 진척율, 남은 작업축, 설정 제거 후보를 반영\n\n검증 결과\n- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\\n- 경고 0 / 오류 0
Some checks failed
Release Gate / gate (push) Has been cancelled

This commit is contained in:
2026-04-05 16:51:24 +09:00
parent a315f587bf
commit f8e62bde2a
5 changed files with 16 additions and 43 deletions

View File

@@ -199,8 +199,8 @@ public partial class AgentLoopService
var recentTaskRetryQuality = TryGetRecentTaskRetryQuality(taskPolicy.TaskType);
maxRetry = ComputeQualityAwareMaxRetry(maxRetry, recentTaskRetryQuality, taskPolicy.TaskType);
// 플랜 모드 설정
var planMode = ResolveEffectivePlanMode(llm.PlanMode, ActiveTab, taskPolicy.TaskType); // off | always | auto
// 플랜 prelude는 현재 정책상 비활성
var shouldGeneratePlanPrelude = false;
var context = BuildContext();
InjectTaskTypeGuidance(messages, taskPolicy);
@@ -282,8 +282,8 @@ public partial class AgentLoopService
workFolder = context.WorkFolder
}));
// ── 플랜 모드 "always": 첫 번째 호출은 계획만 생성 (도구 없이) ──
if (planMode == "always")
// ── 과거 plan mode 잔재. 현재 정책상 비활성 ──
if (shouldGeneratePlanPrelude)
{
iteration++;
EmitEvent(AgentEventType.Thinking, "", "실행 계획 생성 중...");
@@ -637,7 +637,7 @@ public partial class AgentLoopService
// 플랜 모드 "auto"에서만 승인 대기
// - auto: 계획 감지 시 승인 대기 (단, 도구 호출이 함께 있으면 이미 실행 중이므로 스킵)
// - off/always: 승인창 띄우지 않음 (off=자동 진행, always=앞에서 이미 처리됨)
var requireApproval = planMode == "auto" && toolCalls.Count == 0;
const bool requireApproval = false;
if (requireApproval && UserDecisionCallback != null)
{

View File

@@ -1929,8 +1929,7 @@
Visibility="Collapsed"
IsEnabled="False"
Margin="0,0,6,6"
Padding="9,4"
Click="BtnInlinePlanMode_Click"/>
Padding="9,4"/>
<Button x:Name="BtnInlinePermission"
Style="{StaticResource OutlineHoverBtn}"
Visibility="Collapsed"
@@ -3019,8 +3018,7 @@
<ComboBox x:Name="CmbOverlayPlanMode"
Grid.Column="1"
Visibility="Collapsed"
Style="{StaticResource OverlayComboBox}"
SelectionChanged="CmbOverlayPlanMode_SelectionChanged">
Style="{StaticResource OverlayComboBox}">
<ComboBoxItem Content="계획 · 끄기" Tag="off"/>
<ComboBoxItem Content="계획 · 자동 계획" Tag="auto"/>
<ComboBoxItem Content="계획 · 항상 계획" Tag="always"/>

View File

@@ -13904,18 +13904,6 @@ public partial class ChatWindow : Window
BtnModelSelector.ToolTip = $"현재 서비스: {serviceLabel}\n현재 모델: {GetCurrentModelDisplayName()}\n모델/추론 빠른 설정";
}
private static string NextPlanMode(string current) => (current ?? "off").ToLowerInvariant() switch
{
"off" => "auto",
"auto" => "always",
_ => "off",
};
private static string PlanModeLabel(string value) => (value ?? "off").ToLowerInvariant() switch
{
"always" => "항상 계획",
"auto" => "자동 계획",
_ => "끄기",
};
private static string NextReasoning(string current) => (current ?? "normal").ToLowerInvariant() switch
{
"minimal" => "normal",
@@ -14076,7 +14064,6 @@ public partial class ChatWindow : Window
BtnInlineFastMode.Content = GetQuickActionLabel("Fast", llm.FreeTierMode ? "켜짐" : "꺼짐");
BtnInlineReasoning.Content = GetQuickActionLabel("추론", ReasoningLabel(llm.AgentDecisionLevel));
BtnInlinePlanMode.Content = GetQuickActionLabel("계획", PlanModeLabel("off"));
BtnInlinePermission.Content = GetQuickActionLabel("권한", PermissionModeCatalog.ToDisplayLabel(llm.FilePermission));
BtnInlineSkill.Content = $"스킬 · {(llm.EnableSkillSystem ? "On" : "Off")}";
BtnInlineCommandBrowser.Content = "명령/스킬 브라우저";
@@ -14087,7 +14074,6 @@ public partial class ChatWindow : Window
ApplyQuickActionVisual(BtnInlineFastMode, llm.FreeTierMode, "#ECFDF5", "#166534");
ApplyQuickActionVisual(BtnInlineReasoning, !string.Equals(llm.AgentDecisionLevel, "normal", StringComparison.OrdinalIgnoreCase), "#EEF2FF", "#1D4ED8");
ApplyQuickActionVisual(BtnInlinePlanMode, false, "#EEF2FF", "#4338CA");
ApplyQuickActionVisual(BtnInlinePermission,
!string.Equals(PermissionModeCatalog.NormalizeGlobalMode(llm.FilePermission), PermissionModeCatalog.Deny, StringComparison.OrdinalIgnoreCase),
"#FFF7ED",
@@ -16323,7 +16309,6 @@ public partial class ChatWindow : Window
SelectComboTag(CmbOverlayOperationMode, OperationModePolicy.Normalize(_settings.Settings.OperationMode));
SelectComboTag(CmbOverlayFolderDataUsage, _folderDataUsage);
SelectComboTag(CmbOverlayPermission, PermissionModeCatalog.NormalizeGlobalMode(llm.FilePermission));
SelectComboTag(CmbOverlayPlanMode, "off");
SelectComboTag(CmbOverlayReasoning, llm.AgentDecisionLevel);
SelectComboTag(CmbOverlayFastMode, llm.FreeTierMode ? "on" : "off");
SelectComboTag(CmbOverlayDefaultOutputFormat, llm.DefaultOutputFormat ?? "auto");
@@ -16834,15 +16819,6 @@ public partial class ChatWindow : Window
PersistOverlaySettingsState(refreshOverlayDeferredInputs: false);
}
private void CmbOverlayPlanMode_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (_isOverlaySettingsSyncing)
return;
_settings.Settings.Llm.PlanMode = "off";
PersistOverlaySettingsState(refreshOverlayDeferredInputs: false);
}
private void CmbOverlayPermission_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (_isOverlaySettingsSyncing || CmbOverlayPermission.SelectedItem is not ComboBoxItem selected || selected.Tag is not string tag)
@@ -17049,16 +17025,6 @@ public partial class ChatWindow : Window
RefreshOverlayVisualState(loadDeferredInputs: false);
}
private void BtnInlinePlanMode_Click(object sender, RoutedEventArgs e)
{
var llm = _settings.Settings.Llm;
llm.PlanMode = "off";
_settings.Save();
_appState.LoadFromSettings(_settings);
RefreshInlineSettingsPanel();
RefreshOverlayVisualState(loadDeferredInputs: false);
}
private void BtnInlinePermission_Click(object sender, RoutedEventArgs e)
{
var llm = _settings.Settings.Llm;