AX Agent UI를 claw-code 방향으로 골격 재정렬
Some checks failed
Release Gate / gate (push) Has been cancelled

- 좌측 패널, 축소 아이콘 바, 상태 스트립, 메시지 축, 컴포저를 더 얇고 평평한 업무형 레이아웃으로 조정

- 메시지 최대 폭 880, 컴포저 최대 폭 820 기준으로 반응형 폭 계산을 다시 맞춰 창 크기 변화에도 중심선이 자연스럽게 유지되도록 수정

- 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ (경고 0 / 오류 0)
This commit is contained in:
2026-04-05 14:40:44 +09:00
parent d99b46e3e2
commit 7cc2b5b9b5
4 changed files with 51 additions and 44 deletions

View File

@@ -13,6 +13,11 @@ Windows 전용 시맨틱 런처 & 워크스페이스 매니저
- 메시지 행과 좌측 대화 목록도 `claw-code` 방향으로 다시 단순화했습니다. 사용자/assistant 버블의 패딩, 라운드, 메타 텍스트를 줄였고, 대화 목록의 실행 상태도 배지 카드보다 얇은 텍스트 요약 중심으로 바꿔 읽는 축이 먼저 보이도록 눌렀습니다.
- 검증 예정: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\`
- 업데이트: 2026-04-05 17:03 (KST)
- AX Agent UI를 `claw-code` 쪽 시각 언어에 더 가깝게 맞추기 위해 레이아웃 골격을 다시 조정했습니다. 좌측 패널 폭과 헤더/액션 행 높이, 축소 아이콘 바, 상태 스트립, 메시지 축, 컴포저 폭과 코너 반경을 전반적으로 더 얇고 평평하게 정리했습니다.
- 반응형 폭 계산도 새 골격에 맞춰 다시 조정했습니다. 메시지 축은 최대 `880`, 컴포저는 최대 `820` 기준으로 더 자연스럽게 줄어들도록 바꿔 창 크기가 변해도 `claw-code`처럼 중심선이 크게 흔들리지 않게 맞췄습니다.
- 검증 예정: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\`
- 업데이트: 2026-04-05 16:02 (KST)
- `document_plan` 후속 실행 분기를 `claw-code` 기준으로 다시 보강했습니다. 이제 문서 플래너 출력에서 body 골격과 즉시 실행 지시를 깨진 문자열 비교에 의존하지 않고 안정적으로 추출해, `html_create / document_assemble / docx_create / markdown_create` 후속 호출 유도가 실제로 이어집니다.
- 코워크 문서형 작업은 설정이 `planMode=off`여도 내부적으로 `always` 플랜 경로를 타도록 보정했습니다. 그래서 문서/보고서/제안서 요청은 먼저 계획을 세우고, 그 계획을 바탕으로 실제 문서 생성 단계까지 이어가도록 정리했습니다.

View File

@@ -3,6 +3,8 @@
- Document update: 2026-04-05 16:55 (KST) - Recorded the current `claw-code` parity estimate for AX Agent: core execution engine `82%`, main chat UI `68%`, Cowork/Code status UX `63%`, internal settings linkage `88%`, overall AX Agent parity `74%`.
- Document update: 2026-04-05 16:55 (KST) - Added an engine-settings review rule for ongoing cleanup: settings that materially alter the main execution route should be minimized, kept developer-only when necessary, or removed from user-facing surfaces when they no longer represent real runtime choices. Plan-mode remnants were reduced further as part of this pass.
- Document update: 2026-04-05 16:55 (KST) - Simplified AX Agent message rows and sidebar conversation items toward the `claw-code` reading model. Message bubbles now use tighter padding/radius/meta text, and conversation rows now prefer lightweight running/failure summary text over heavier success/failure badge cards.
- Document update: 2026-04-05 17:03 (KST) - Reworked the AX Agent UI skeleton further toward `claw-code`: sidebar width and row heights were tightened, the collapsed icon rail and sidebar header were flattened, status strips were reduced, and the composer shell/input chrome was made slimmer and less card-like.
- Document update: 2026-04-05 17:03 (KST) - Re-tuned responsive width calculation for the new shell so the message axis now scales up to `880` and the composer up to `820`, keeping both aligned on the same center line as the window narrows or expands.
- Document update: 2026-04-05 16:02 (KST) - Fixed the Cowork document execution handoff around `document_plan`. The loop no longer depends on broken localized marker strings to detect the scaffold/body block or the immediate-next-step hint; it now extracts body markers robustly and resolves the correct follow-up tool (`html_create`, `document_assemble`, `docx_create`, `markdown_create`) before re-prompting the model.
- Document update: 2026-04-05 16:02 (KST) - Added `ResolveEffectivePlanMode(...)` so Cowork document/content tasks automatically use the `always` plan path even when the persisted plan mode is `off`. This brings Cowork closer to the `claw-code` expectation of plan-first execution for document-heavy work.
- Document update: 2026-04-05 16:02 (KST) - Strengthened `BuildCoworkSystemPrompt()` so document/report/proposal/manual requests must produce an execution plan first and are not considered complete until a real output file path has been created or updated.

View File

@@ -406,7 +406,7 @@
<!-- 축소 아이콘 바 (사이드바 닫힘 시 표시) -->
<ColumnDefinition x:Name="IconBarColumn" Width="0"/>
<!-- 사이드바 (열림 시 표시) -->
<ColumnDefinition x:Name="SidebarColumn" Width="220" MinWidth="0"/>
<ColumnDefinition x:Name="SidebarColumn" Width="236" MinWidth="0"/>
<ColumnDefinition Width="*"/>
<!-- 미리보기 스플리터 -->
<ColumnDefinition x:Name="SplitterColumn" Width="0"/>
@@ -422,32 +422,32 @@
Visibility="Collapsed">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="46"/>
<RowDefinition Height="44"/>
<RowDefinition Height="*"/>
<RowDefinition Height="46"/>
<RowDefinition Height="44"/>
</Grid.RowDefinitions>
<!-- 상단 아이콘들 -->
<StackPanel Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,2,0,0">
<Button Style="{StaticResource GhostBtn}" Padding="6,5" Width="32" Height="32"
<Button Style="{StaticResource GhostBtn}" Padding="5,4" Width="30" Height="30"
Click="BtnNewChat_Click" ToolTip="새 대화"
WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="&#xE710;" FontFamily="Segoe MDL2 Assets" FontSize="12"
<TextBlock Text="&#xE710;" FontFamily="Segoe MDL2 Assets" FontSize="11.5"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</StackPanel>
<StackPanel Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,6,0,0">
<Button Style="{StaticResource GhostBtn}" Padding="6,5" Width="32" Height="32"
<Button Style="{StaticResource GhostBtn}" Padding="5,4" Width="30" Height="30"
Click="BtnToggleSidebar_Click" ToolTip="검색"
WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="11.5"
<TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
<Button Style="{StaticResource GhostBtn}" Padding="6,5" Width="32" Height="32" Margin="0,2,0,0"
<Button Style="{StaticResource GhostBtn}" Padding="5,4" Width="30" Height="30" Margin="0,2,0,0"
Click="BtnCategoryDrop_Click" ToolTip="대화 필터"
WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="11.5"
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
</Button>
</StackPanel>
@@ -457,11 +457,11 @@
HorizontalAlignment="Center" VerticalAlignment="Center"
ToolTip="" Padding="0"
WindowChrome.IsHitTestVisibleInChrome="True">
<Border Width="28" Height="28" CornerRadius="14"
<Border Width="26" Height="26" CornerRadius="13"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1">
<TextBlock x:Name="UserInitialIconBar" Text="U" FontSize="11.5" FontWeight="SemiBold"
<TextBlock x:Name="UserInitialIconBar" Text="U" FontSize="11" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</Button>
@@ -477,7 +477,7 @@
BorderThickness="0,0,1,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="48"/>
<RowDefinition Height="44"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
@@ -492,11 +492,11 @@
<Border Background="{DynamicResource HintBackground}" CornerRadius="6"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
Width="22" Height="22">
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="11"
Width="20" Height="20">
<TextBlock Text="&#xE8BD;" FontFamily="Segoe MDL2 Assets" FontSize="10.5"
Foreground="{DynamicResource AccentColor}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<TextBlock Text="AX Agent" FontSize="13" FontWeight="SemiBold"
<TextBlock Text="AX Agent" FontSize="12.5" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center" Margin="8,0,0,0"/>
</StackPanel>
@@ -507,8 +507,8 @@
<StackPanel>
<Border x:Name="SidebarNewChatTrigger"
Background="Transparent"
CornerRadius="7"
Padding="8,6"
CornerRadius="6"
Padding="7,5"
Cursor="Hand"
MouseEnter="SidebarNewChatTrigger_MouseEnter"
MouseLeave="SidebarNewChatTrigger_MouseLeave"
@@ -519,25 +519,25 @@
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="&#xE710;" FontFamily="Segoe MDL2 Assets" FontSize="11"
<TextBlock Text="&#xE710;" FontFamily="Segoe MDL2 Assets" FontSize="10.5"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="새 대화"
Foreground="{DynamicResource PrimaryText}"
FontSize="10.8" Margin="7,0,0,0" VerticalAlignment="Center"/>
FontSize="10.5" Margin="7,0,0,0" VerticalAlignment="Center"/>
<TextBlock x:Name="SidebarNewChatShortcutHint"
Grid.Column="2"
Text="Ctrl+N"
Visibility="Collapsed"
Foreground="{DynamicResource SecondaryText}"
FontSize="10.5"
FontSize="10"
VerticalAlignment="Center"/>
</Grid>
</Border>
<Border x:Name="SidebarSearchTrigger"
Background="Transparent"
CornerRadius="7"
Padding="8,6"
CornerRadius="6"
Padding="7,5"
Cursor="Hand"
MouseEnter="SidebarSearchTrigger_MouseEnter"
MouseLeave="SidebarSearchTrigger_MouseLeave"
@@ -548,25 +548,25 @@
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="11"
<TextBlock Text="&#xE721;" FontFamily="Segoe MDL2 Assets" FontSize="10.5"
Foreground="{DynamicResource SecondaryText}" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="검색"
Foreground="{DynamicResource PrimaryText}"
FontSize="10.8" Margin="7,0,0,0" VerticalAlignment="Center"/>
FontSize="10.5" Margin="7,0,0,0" VerticalAlignment="Center"/>
<TextBlock x:Name="SidebarSearchShortcutHint"
Grid.Column="2"
Text="Ctrl+K"
Visibility="Collapsed"
Foreground="{DynamicResource SecondaryText}"
FontSize="10.5"
FontSize="10"
VerticalAlignment="Center"/>
</Grid>
</Border>
<Border x:Name="SidebarSearchEditor"
Background="{DynamicResource ItemBackground}"
CornerRadius="10"
Padding="9,6"
CornerRadius="8"
Padding="8,5"
Visibility="Collapsed"
Opacity="0"
RenderTransformOrigin="0,0.5">
@@ -586,7 +586,7 @@
<TextBox x:Name="SearchBox" Grid.Column="1"
Background="Transparent" BorderThickness="0"
Foreground="{DynamicResource PrimaryText}"
CaretBrush="{DynamicResource AccentColor}" FontSize="11.5"
CaretBrush="{DynamicResource AccentColor}" FontSize="11"
VerticalAlignment="Center" Margin="10,0,8,0"
TextChanged="SearchBox_TextChanged"/>
<Button x:Name="BtnConversationSort" Grid.Column="2"
@@ -872,25 +872,25 @@
KeyDown="ChatTitleEdit_KeyDown"/>
</Grid>
<Border x:Name="ConversationStatusStrip" Visibility="Collapsed"
Margin="8,0,0,0" Padding="6,1.5"
CornerRadius="7"
Margin="8,0,0,0" Padding="5,1.5"
CornerRadius="6"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1">
<TextBlock x:Name="ConversationStatusStripLabel" Text=""
FontSize="9.5" FontWeight="SemiBold"
FontSize="9" FontWeight="SemiBold"
Foreground="{DynamicResource AccentColor}"
VerticalAlignment="Center"/>
</Border>
</StackPanel>
<WrapPanel x:Name="ConversationQuickStrip" Visibility="Collapsed"
Margin="0,3,0,0">
Margin="0,2,0,0">
<Button x:Name="BtnQuickRunningFilter" Style="{StaticResource GhostBtn}"
Padding="7,1.5" Margin="0,0,5,0"
Padding="6,1.5" Margin="0,0,4,0"
Click="BtnQuickRunningFilter_Click"
Visibility="Collapsed"
IsEnabled="False">
<TextBlock x:Name="QuickRunningLabel" Text="진행"
FontSize="9.5" FontWeight="SemiBold"/>
FontSize="9" FontWeight="SemiBold"/>
</Button>
<Button x:Name="BtnQuickHotSort" Style="{StaticResource GhostBtn}"
Padding="7,1.5"
@@ -1183,8 +1183,8 @@
Background="{DynamicResource LauncherBackground}"
Padding="18,10,18,6">
<StackPanel x:Name="MessagePanel"
Margin="0,0,0,14"
MaxWidth="840"
Margin="0,0,0,12"
MaxWidth="880"
HorizontalAlignment="Center">
<StackPanel.RenderTransform>
<TranslateTransform/>
@@ -1560,9 +1560,9 @@
<!-- ── 입력 바 ── -->
<Border x:Name="ComposerShell" Grid.Row="4"
Margin="18,0,18,16"
Margin="18,0,18,14"
Width="Auto"
MaxWidth="760"
MaxWidth="820"
HorizontalAlignment="Center"
VerticalAlignment="Bottom">
<StackPanel HorizontalAlignment="Stretch">
@@ -1651,7 +1651,7 @@
<!-- 실제 입력 영역 -->
<Border x:Name="InputBorder"
Background="{DynamicResource LauncherBackground}"
CornerRadius="10" Padding="5"
CornerRadius="9" Padding="4"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1">
<Border.Effect>
<DropShadowEffect BlurRadius="10" ShadowDepth="0" Opacity="0.04"/>

View File

@@ -10975,14 +10975,14 @@ public partial class ChatWindow : Window
// claw-code처럼 메시지 축과 입력축이 같은 중심선을 공유하도록,
// 본문 폭 상한을 조금 더 낮추고 창 폭 변화에 더 부드럽게 반응시킵니다.
var contentWidth = Math.Max(340, viewportWidth - 32);
var messageWidth = Math.Clamp(contentWidth * 0.86, 340, 840);
var composerWidth = Math.Clamp(contentWidth * 0.78, 340, 760);
var contentWidth = Math.Max(340, viewportWidth - 28);
var messageWidth = Math.Clamp(contentWidth * 0.88, 340, 880);
var composerWidth = Math.Clamp(contentWidth * 0.82, 340, 820);
if (contentWidth < 760)
{
messageWidth = Math.Clamp(contentWidth - 10, 332, 760);
composerWidth = Math.Clamp(contentWidth - 20, 328, 700);
messageWidth = Math.Clamp(contentWidth - 8, 332, 780);
composerWidth = Math.Clamp(contentWidth - 14, 328, 740);
}
var changed = false;