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
Some checks failed
Release Gate / gate (push) Has been cancelled
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user