From 303a23130b7ec62c1c6351204d273a84fb090d99 Mon Sep 17 00:00:00 2001 From: lacvet Date: Sun, 5 Apr 2026 17:11:30 +0900 Subject: [PATCH] =?UTF-8?q?AX=20Agent=20=ED=94=8C=EB=9E=9C=EB=AA=A8?= =?UTF-8?q?=EB=93=9C=20=EC=9E=94=EC=9E=AC=20=EC=A0=9C=EA=B1=B0=EC=99=80=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EB=B0=94=20=EC=86=8C=EC=9D=8C=20=EC=B6=95?= =?UTF-8?q?=EC=86=8C=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AX Agent 내부 설정 오버레이에서 Plan Mode 도구 저장/노출 경로를 false 고정으로 정리 - 메인 설정에 남아 있던 플랜 모드 및 Plan Mode 도구 UI를 숨기고 카드 상태를 off 고정으로 정리 - Cowork/Code 상태바가 debug가 아닐 때 ToolCall/SkillCall/Paused/Resumed 이벤트로 과하게 흔들리지 않도록 조정 - claw-code parity 계획 문서와 README, DEVELOPMENT 이력을 현재 정책과 진척율 기준으로 갱신 - 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ 경고 0 / 오류 0 --- README.md | 5 +++++ docs/DEVELOPMENT.md | 6 ++++++ docs/claw-code-parity-plan.md | 7 +++++-- src/AxCopilot/Views/ChatWindow.xaml.cs | 18 +++++++++++++++--- src/AxCopilot/Views/SettingsWindow.xaml | 4 ++-- src/AxCopilot/Views/SettingsWindow.xaml.cs | 14 ++++---------- 6 files changed, 37 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 9df9758..40eba64 100644 --- a/README.md +++ b/README.md @@ -921,6 +921,11 @@ ow + toggle 시각 언어로 통일했습니다. - 사이드바 하단 사용자 영역의 설정 버튼도 `32x32`, 아이콘 `15px` 기준으로 키워 너무 작게 보이던 문제를 함께 보정했습니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 19:59 (KST) +- AX Agent의 `PlanMode` 잔재를 실제 런타임 정책에 맞게 더 걷어냈습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서는 내부 설정 저장/로드 시 `Code.EnablePlanModeTools` 를 항상 `false` 로 강제하고, `OverlayTogglePlanModeTools` 는 더 이상 화면에 노출되지 않게 접었습니다. +- [SettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml), [SettingsWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml.cs) 에 남아 있던 메인 설정의 `플랜 모드`, `Plan Mode 도구` UI도 숨기고 카드 상태는 `off` 고정으로 맞췄습니다. 사용자에게 보이는 설정과 실제 엔진 정책을 일치시키기 위한 정리입니다. +- Cowork/Code 상태바 소음도 줄였습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 `UpdateStatusBar(...)` 는 이제 `debug` 로그가 아닐 때 `ToolCall`, `SkillCall`, `Paused`, `Resumed` 이벤트로 상태줄을 흔들지 않습니다. `claw-code`처럼 기본 transcript와 상태선이 더 차분하게 유지되도록 맞춘 변경입니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 +- 업데이트: 2026-04-05 20:08 (KST) --- diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 53e08db..4f20e36 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4684,3 +4684,9 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - 상단 탭 그룹과 사이드바 설정 버튼도 다시 키웠습니다. `TopTabBtn` 은 폰트 `14.5`, 패딩 `24x10`, 최소 너비 `78` 기준으로 키우고 선택 상태 배경을 `ItemBackground` 로 바꿨으며, 탭 래퍼도 `HintBackground + Padding=6` 으로 복구했습니다. 하단 사용자 영역의 `BtnSidebarSettings` 는 `32x32`, 아이콘 `15px` 로 키워 기존보다 접근성이 좋아졌습니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 19:59 (KST) +- `PlanMode` 잔재를 사용자 노출/UI 저장 경로에서 한 단계 더 걷어냈습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 는 내부 설정 오버레이에서 `Code.EnablePlanModeTools` 를 항상 `false` 로 저장하고, 로드 시에도 `ChkOverlayEnablePlanModeTools` 를 `false` 로 고정하도록 바꿨습니다. `OverlayTogglePlanModeTools` 의 가시성도 무조건 `Collapsed` 로 맞췄습니다. +- 메인 설정에 남아 있던 관련 UI도 정리했습니다. [SettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml) 의 `플랜 모드`, `Plan Mode 도구` 행은 `Collapsed` 처리했고, [SettingsWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml.cs) 의 plan mode 카드 sync/체크 로직은 `off` 고정값만 반영하게 축소했습니다. +- Cowork/Code 기본 상태 노출도 더 `claw-code` 쪽으로 조정했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 `UpdateStatusBar(AgentEvent evt)` 는 `debug` 로그가 아닐 때 `ToolCall`, `SkillCall`, `Paused`, `Resumed` 이벤트로 상태줄을 바꾸지 않습니다. 기본 상태선은 `planning / permission / step / complete / error` 중심만 유지해 긴 실행 시 화면 churn 을 더 줄였습니다. +- 이번 묶음 후 추정 parity는 `core engine 90% / main transcript UI 96% / Cowork·Code runtime UX 94% / internal settings 91% / overall 94%` 정도로 재평가했습니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 +- 업데이트: 2026-04-05 20:08 (KST) diff --git a/docs/claw-code-parity-plan.md b/docs/claw-code-parity-plan.md index bd4d0da..d1dc158 100644 --- a/docs/claw-code-parity-plan.md +++ b/docs/claw-code-parity-plan.md @@ -159,8 +159,11 @@ ## Settings Review - Remove candidate: - `PlanMode` - - current state: UI에서는 사실상 제거됐지만 `AppSettings`, `SettingsViewModel`, `AppStateService`, `AgentLoopService` 잔재가 남아 있음 + - current state: 사용자 노출 UI와 저장 경로는 `off` 고정으로 정리됐지만 `AppSettings`, `SettingsViewModel`, `AppStateService` 타입 잔재가 남아 있음 - rationale: 현재 정책이 `off` 고정이라 사용자 선택값이 엔진에 의미 있게 기여하지 않음 + - `Code.EnablePlanModeTools` + - current state: UI/저장 경로는 `false` 고정으로 정리됐지만 모델/설정 타입에 잔재가 남아 있음 + - rationale: 현재 엔진 정책에서 실제 실행 경로를 더 이상 바꾸지 않음 - Move to developer-only candidate: - `FreeTierDelaySeconds` - rationale: 일반 사용자가 조정할 이유가 적고 엔진 지연 정책에 직접 영향 @@ -174,7 +177,7 @@ - `EnableProactiveContextCompact` - `EnableCoworkVerification` - `EnableCodeVerification` - - `Code.EnablePlanModeTools / EnableWorktreeTools / EnableTeamTools / EnableCronTools` + - `Code.EnableWorktreeTools / EnableTeamTools / EnableCronTools` ## Known UX / Performance Risks - Topic preset hover flicker was caused by duplicate hover systems: diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index 825772b..db2dbb9 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -14327,7 +14327,7 @@ public partial class ChatWindow : Window llm.EnableParallelTools = ChkOverlayEnableParallelTools?.IsChecked == true; llm.EnableProjectRules = ChkOverlayEnableProjectRules?.IsChecked == true; llm.EnableAgentMemory = ChkOverlayEnableAgentMemory?.IsChecked == true; - llm.Code.EnablePlanModeTools = ChkOverlayEnablePlanModeTools?.IsChecked == true; + llm.Code.EnablePlanModeTools = false; llm.Code.EnableWorktreeTools = ChkOverlayEnableWorktreeTools?.IsChecked == true; llm.Code.EnableTeamTools = ChkOverlayEnableTeamTools?.IsChecked == true; llm.Code.EnableCronTools = ChkOverlayEnableCronTools?.IsChecked == true; @@ -14528,7 +14528,7 @@ public partial class ChatWindow : Window if (ChkOverlayEnableAgentMemory != null) ChkOverlayEnableAgentMemory.IsChecked = llm.EnableAgentMemory; if (ChkOverlayEnablePlanModeTools != null) - ChkOverlayEnablePlanModeTools.IsChecked = llm.Code.EnablePlanModeTools; + ChkOverlayEnablePlanModeTools.IsChecked = false; if (ChkOverlayEnableWorktreeTools != null) ChkOverlayEnableWorktreeTools.IsChecked = llm.Code.EnableWorktreeTools; if (ChkOverlayEnableTeamTools != null) @@ -15287,7 +15287,7 @@ public partial class ChatWindow : Window if (OverlayToggleAgentMemory != null) OverlayToggleAgentMemory.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed; if (OverlayTogglePlanModeTools != null) - OverlayTogglePlanModeTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed; + OverlayTogglePlanModeTools.Visibility = Visibility.Collapsed; if (OverlayToggleWorktreeTools != null) OverlayToggleWorktreeTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed; if (OverlayToggleTeamTools != null) @@ -17913,6 +17913,8 @@ public partial class ChatWindow : Window private void UpdateAgentProgressBar(AgentEvent evt) { + var isDebugLogLevel = string.Equals(_settings.Settings.Llm.AgentLogLevel, "debug", StringComparison.OrdinalIgnoreCase); + switch (evt.Type) { case AgentEventType.Planning when evt.Steps is { Count: > 0 }: @@ -18372,6 +18374,8 @@ public partial class ChatWindow : Window _ => evt.ToolName, }; + var isDebugLogLevel = string.Equals(_settings.Settings.Llm.AgentLogLevel, "debug", StringComparison.OrdinalIgnoreCase); + switch (evt.Type) { case AgentEventType.Thinking: @@ -18394,6 +18398,8 @@ public partial class ChatWindow : Window SetStatus(GetDecisionStatusText(evt.Summary), spinning: IsDecisionPending(evt.Summary)); break; case AgentEventType.ToolCall: + if (!isDebugLogLevel) + break; SetStatus($"{toolLabel} 실행 중...", spinning: true); break; case AgentEventType.ToolResult: @@ -18406,6 +18412,8 @@ public partial class ChatWindow : Window SetStatus($"[{evt.StepCurrent}/{evt.StepTotal}] 단계 완료", spinning: true); break; case AgentEventType.SkillCall: + if (!isDebugLogLevel) + break; SetStatus($"스킬 실행 중: {TruncateForStatus(evt.Summary)}", spinning: true); break; case AgentEventType.Complete: @@ -18417,9 +18425,13 @@ public partial class ChatWindow : Window StopStatusAnimation(); break; case AgentEventType.Paused: + if (!isDebugLogLevel) + break; SetStatus("⏸ 일시정지", spinning: false); break; case AgentEventType.Resumed: + if (!isDebugLogLevel) + break; SetStatus("▶ 재개됨", spinning: true); break; } diff --git a/src/AxCopilot/Views/SettingsWindow.xaml b/src/AxCopilot/Views/SettingsWindow.xaml index fe06430..4cf0d9d 100644 --- a/src/AxCopilot/Views/SettingsWindow.xaml +++ b/src/AxCopilot/Views/SettingsWindow.xaml @@ -4697,7 +4697,7 @@ - + @@ -5154,7 +5154,7 @@ - + diff --git a/src/AxCopilot/Views/SettingsWindow.xaml.cs b/src/AxCopilot/Views/SettingsWindow.xaml.cs index d63a75c..4f5c6d4 100644 --- a/src/AxCopilot/Views/SettingsWindow.xaml.cs +++ b/src/AxCopilot/Views/SettingsWindow.xaml.cs @@ -126,10 +126,9 @@ public partial class SettingsWindow : Window if (AgentDecisionCardNormal != null) AgentDecisionCardNormal.IsChecked = decision == "normal"; if (AgentDecisionCardDetailed != null) AgentDecisionCardDetailed.IsChecked = decision == "detailed"; - var planMode = (_vm.PlanMode ?? "off").Trim().ToLowerInvariant(); - if (AgentPlanModeCardOff != null) AgentPlanModeCardOff.IsChecked = planMode == "off"; - if (AgentPlanModeCardAlways != null) AgentPlanModeCardAlways.IsChecked = planMode == "always"; - if (AgentPlanModeCardAuto != null) AgentPlanModeCardAuto.IsChecked = planMode == "auto"; + if (AgentPlanModeCardOff != null) AgentPlanModeCardOff.IsChecked = true; + if (AgentPlanModeCardAlways != null) AgentPlanModeCardAlways.IsChecked = false; + if (AgentPlanModeCardAuto != null) AgentPlanModeCardAuto.IsChecked = false; var operationMode = OperationModePolicy.Normalize(_vm.OperationMode); if (AgentOperationModeInternal != null) AgentOperationModeInternal.IsChecked = operationMode == OperationModePolicy.InternalMode; @@ -2217,12 +2216,7 @@ public partial class SettingsWindow : Window private void AgentPlanModeCard_Checked(object sender, RoutedEventArgs e) { if (!IsLoaded || sender is not RadioButton rb || rb.IsChecked != true) return; - _vm.PlanMode = rb.Name switch - { - "AgentPlanModeCardAlways" => "always", - "AgentPlanModeCardAuto" => "auto", - _ => "off", - }; + _vm.PlanMode = "off"; } private void AgentOperationModeCard_Checked(object sender, RoutedEventArgs e)