Compare commits
2 Commits
43ee9154a8
...
d9309b45fa
| Author | SHA1 | Date | |
|---|---|---|---|
| d9309b45fa | |||
| a19f69b2ff |
@@ -1351,3 +1351,9 @@ MIT License
|
|||||||
- 업데이트: 2026-04-06 18:34 (KST)
|
- 업데이트: 2026-04-06 18:34 (KST)
|
||||||
- 다른 앱에서 타이핑할 때도 AX Copilot가 키 입력 훅 경로에서 과하게 개입하던 부분을 줄였다. [InputListener.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Core/InputListener.cs)는 이제 모든 키다운마다 시스템 파일 대화상자 판정을 하지 않고, 실제 핫키 메인 키·캡처 메인 키·키 필터가 필요한 경우에만 억제 창 검사를 수행한다.
|
- 다른 앱에서 타이핑할 때도 AX Copilot가 키 입력 훅 경로에서 과하게 개입하던 부분을 줄였다. [InputListener.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Core/InputListener.cs)는 이제 모든 키다운마다 시스템 파일 대화상자 판정을 하지 않고, 실제 핫키 메인 키·캡처 메인 키·키 필터가 필요한 경우에만 억제 창 검사를 수행한다.
|
||||||
- [SnippetExpander.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Core/SnippetExpander.cs)는 추적 중이 아닐 때 `;` 시작 키 외에는 즉시 반환하도록 바꿨다. 이전에는 일반 타이핑 중에도 모든 키마다 `Ctrl/Alt/Shift` 상태를 읽고 버퍼 로직을 거쳤는데, 이제는 실제 스니펫 시작 상황에서만 그런 검사를 하게 되어 글로벌 키보드 훅의 평상시 부담을 줄였다.
|
- [SnippetExpander.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Core/SnippetExpander.cs)는 추적 중이 아닐 때 `;` 시작 키 외에는 즉시 반환하도록 바꿨다. 이전에는 일반 타이핑 중에도 모든 키마다 `Ctrl/Alt/Shift` 상태를 읽고 버퍼 로직을 거쳤는데, 이제는 실제 스니펫 시작 상황에서만 그런 검사를 하게 되어 글로벌 키보드 훅의 평상시 부담을 줄였다.
|
||||||
|
업데이트: 2026-04-06 20:18 (KST)
|
||||||
|
- AX Agent 메시지 마크다운 렌더에 코드 심볼 강조를 추가해 Cowork/Code 답변의 파일 경로·camelCase/PascalCase·snake_case가 더 선명하게 보이도록 조정했다.
|
||||||
|
- 코드 탭 입력부 위에 저장소/브랜치/변경 수치를 보여주는 Git 요약 배너를 추가해 `claude-code` 스타일의 repo context를 더 빠르게 읽을 수 있게 맞췄다.
|
||||||
|
- 업데이트: 2026-04-06 20:28 (KST)
|
||||||
|
- AX Agent 코드 탭 입력부 위 저장소 요약줄을 더 `claude-code` 스타일에 가깝게 정리했습니다. `로컬/워크트리`, `upstream` 상태를 얇은 배지로 표시하고, 변경이 있을 때 액션 문구가 `변경 · 브랜치 보기`로 바뀌도록 했습니다.
|
||||||
|
- 코드 탭 저장소 요약줄에 `리뷰` 배지를 추가해 기존 slash 명령 `/review`로 바로 이어지게 했습니다. 입력 중인 문구가 있으면 유지한 채 리뷰 흐름만 얹도록 조정했습니다.
|
||||||
|
|||||||
@@ -5018,3 +5018,12 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
|
|||||||
- Document update: 2026-04-06 18:34 (KST) - `SnippetExpander.cs` now short-circuits immediately for normal typing unless snippet tracking is already active or the current key is the `;` trigger. This removes repeated `GetAsyncKeyState` and buffer logic from ordinary typing in other apps and makes the low-level hook substantially lighter under continuous input.
|
- Document update: 2026-04-06 18:34 (KST) - `SnippetExpander.cs` now short-circuits immediately for normal typing unless snippet tracking is already active or the current key is the `;` trigger. This removes repeated `GetAsyncKeyState` and buffer logic from ordinary typing in other apps and makes the low-level hook substantially lighter under continuous input.
|
||||||
|
|
||||||
|
|
||||||
|
업데이트: 2026-04-06 20:18 (KST)
|
||||||
|
- Improved AX Agent markdown rendering for Cowork/Code by highlighting file paths plus code-like symbols, and added a compact repository summary banner above the Code composer to surface branch and diff context closer to `claude-code`.
|
||||||
|
## 2026-04-06 20:28 (KST)
|
||||||
|
|
||||||
|
- AX Agent 코드 탭의 저장소 요약줄을 `claude-code` 레퍼런스에 더 가깝게 정리했다.
|
||||||
|
- 저장소/브랜치 외에 `로컬/워크트리` 배지와 `upstream` 배지를 추가
|
||||||
|
- 변경이 있을 때 액션 라벨을 `변경 · 브랜치 보기`로 동적으로 변경
|
||||||
|
- 코드 탭 저장소 요약줄에서 `/review` slash 명령으로 바로 이어지는 `리뷰` 배지를 추가했다.
|
||||||
|
- 기존 입력 중인 텍스트는 유지하고 slash chip만 덧붙이도록 구성
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ namespace AxCopilot.Services;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class MarkdownRenderer
|
public static class MarkdownRenderer
|
||||||
{
|
{
|
||||||
|
private static readonly Brush FilePathBrush = new SolidColorBrush(Color.FromRgb(0x3B, 0x82, 0xF6));
|
||||||
|
private static readonly Brush CodeSymbolBrush = new SolidColorBrush(Color.FromRgb(0xF2, 0x8C, 0x79));
|
||||||
|
|
||||||
public static StackPanel Render(string markdown, Brush textColor, Brush secondaryColor, Brush accentColor, Brush codeBg)
|
public static StackPanel Render(string markdown, Brush textColor, Brush secondaryColor, Brush accentColor, Brush codeBg)
|
||||||
{
|
{
|
||||||
var panel = new StackPanel();
|
var panel = new StackPanel();
|
||||||
@@ -272,19 +275,34 @@ public static class MarkdownRenderer
|
|||||||
/// <summary>파일 경로 활성 여부 (설정 연동).</summary>
|
/// <summary>파일 경로 활성 여부 (설정 연동).</summary>
|
||||||
public static bool EnableFilePathHighlight { get; set; } = true;
|
public static bool EnableFilePathHighlight { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>코드 심볼 강조 활성 여부 (설정/탭 연동).</summary>
|
||||||
|
public static bool EnableCodeSymbolHighlight { get; set; } = true;
|
||||||
|
|
||||||
|
private static readonly Regex CodeSymbolPattern = new(
|
||||||
|
@"(?<![\w/\\-])(" +
|
||||||
|
@"[A-Za-z_][A-Za-z0-9_]*\(\)|" + // Method()
|
||||||
|
@"[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*|" + // object.member
|
||||||
|
@"[A-Za-z_][A-Za-z0-9_]*_[A-Za-z0-9_]+|" + // snake_case / foo_bar
|
||||||
|
@"[a-z]+[A-Z][A-Za-z0-9_]*|" + // camelCase
|
||||||
|
@"(?:[A-Z][a-z0-9]+){2,}" + // PascalCase multi word
|
||||||
|
@")(?![\w/\\-])",
|
||||||
|
RegexOptions.Compiled);
|
||||||
|
|
||||||
/// <summary>일반 텍스트에서 파일 경로 패턴을 감지하여 파란색으로 강조합니다.</summary>
|
/// <summary>일반 텍스트에서 파일 경로 패턴을 감지하여 파란색으로 강조합니다.</summary>
|
||||||
private static void AddPlainTextWithFilePaths(InlineCollection inlines, string text)
|
private static void AddPlainTextWithFilePaths(InlineCollection inlines, string text)
|
||||||
{
|
{
|
||||||
if (!EnableFilePathHighlight)
|
if (!EnableFilePathHighlight && !EnableCodeSymbolHighlight)
|
||||||
{
|
{
|
||||||
inlines.Add(new Run(text));
|
inlines.Add(new Run(text));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var matches = FilePathPattern.Matches(text);
|
MatchCollection? matches = null;
|
||||||
if (matches.Count == 0)
|
if (EnableFilePathHighlight)
|
||||||
|
matches = FilePathPattern.Matches(text);
|
||||||
|
if (matches == null || matches.Count == 0)
|
||||||
{
|
{
|
||||||
inlines.Add(new Run(text));
|
AddPlainTextWithCodeSymbols(inlines, text);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,18 +311,54 @@ public static class MarkdownRenderer
|
|||||||
{
|
{
|
||||||
// 매치 전 텍스트
|
// 매치 전 텍스트
|
||||||
if (pm.Index > lastIndex)
|
if (pm.Index > lastIndex)
|
||||||
inlines.Add(new Run(text[lastIndex..pm.Index]));
|
AddPlainTextWithCodeSymbols(inlines, text[lastIndex..pm.Index]);
|
||||||
|
|
||||||
// 파일 경로 — 파란색 강조
|
// 파일 경로 — 파란색 강조
|
||||||
inlines.Add(new Run(pm.Value)
|
inlines.Add(new Run(pm.Value)
|
||||||
{
|
{
|
||||||
Foreground = new SolidColorBrush(Color.FromRgb(0x3B, 0x82, 0xF6)), // #3B82F6
|
Foreground = FilePathBrush,
|
||||||
FontWeight = FontWeights.Medium,
|
FontWeight = FontWeights.Medium,
|
||||||
});
|
});
|
||||||
lastIndex = pm.Index + pm.Length;
|
lastIndex = pm.Index + pm.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 남은 텍스트
|
// 남은 텍스트
|
||||||
|
if (lastIndex < text.Length)
|
||||||
|
AddPlainTextWithCodeSymbols(inlines, text[lastIndex..]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddPlainTextWithCodeSymbols(InlineCollection inlines, string text)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(text))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!EnableCodeSymbolHighlight)
|
||||||
|
{
|
||||||
|
inlines.Add(new Run(text));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var matches = CodeSymbolPattern.Matches(text);
|
||||||
|
if (matches.Count == 0)
|
||||||
|
{
|
||||||
|
inlines.Add(new Run(text));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var lastIndex = 0;
|
||||||
|
foreach (Match match in matches)
|
||||||
|
{
|
||||||
|
if (match.Index > lastIndex)
|
||||||
|
inlines.Add(new Run(text[lastIndex..match.Index]));
|
||||||
|
|
||||||
|
inlines.Add(new Run(match.Value)
|
||||||
|
{
|
||||||
|
Foreground = CodeSymbolBrush,
|
||||||
|
FontWeight = FontWeights.SemiBold,
|
||||||
|
});
|
||||||
|
lastIndex = match.Index + match.Length;
|
||||||
|
}
|
||||||
|
|
||||||
if (lastIndex < text.Length)
|
if (lastIndex < text.Length)
|
||||||
inlines.Add(new Run(text[lastIndex..]));
|
inlines.Add(new Run(text[lastIndex..]));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public partial class ChatWindow
|
|||||||
? "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 필요하면 작업 폴더 파일도 함께 참고합니다."
|
? "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 필요하면 작업 폴더 파일도 함께 참고합니다."
|
||||||
: "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 작업 폴더를 선택하면 관련 파일도 함께 참고합니다.",
|
: "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 작업 폴더를 선택하면 관련 파일도 함께 참고합니다.",
|
||||||
"Code" => hasFolder
|
"Code" => hasFolder
|
||||||
? "코드 수정, 원인 분석, 빌드·테스트를 요청하세요. 작업 폴더의 코드와 문서를 함께 검토합니다."
|
? "코드 수정, 원인 분석, 빌드·테스트를 요청하세요. 작업 폴더 코드를 참고하고, 상단 저장소 배너로 브랜치와 변경 상태를 함께 봅니다."
|
||||||
: "작업 폴더를 선택한 뒤 코드 수정, 원인 분석, 빌드·테스트를 요청하세요.",
|
: "작업 폴더를 선택한 뒤 코드 수정, 원인 분석, 빌드·테스트를 요청하세요.",
|
||||||
_ => "질문, 요약, 초안 작성, 아이디어 정리를 요청하세요.",
|
_ => "질문, 요약, 초안 작성, 아이디어 정리를 요청하세요.",
|
||||||
};
|
};
|
||||||
@@ -41,9 +41,9 @@ public partial class ChatWindow
|
|||||||
return preset.Description.Trim();
|
return preset.Description.Trim();
|
||||||
|
|
||||||
if (string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase))
|
||||||
return "이 작업 유형에 맞는 문서/데이터/파일 작업 흐름으로 이어집니다.";
|
return "선택한 작업 유형에 맞는 문서·데이터·파일 작업 흐름으로 이어집니다.";
|
||||||
|
|
||||||
return "이 주제에 맞는 답변 톤과 초안 방향으로 대화를 이어갑니다.";
|
return "선택한 대화 주제에 맞는 응답 방향과 초안 흐름으로 이어집니다.";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateFolderBar()
|
private void UpdateFolderBar()
|
||||||
@@ -78,6 +78,7 @@ public partial class ChatWindow
|
|||||||
UpdateDataUsageUI();
|
UpdateDataUsageUI();
|
||||||
RefreshContextUsageVisual();
|
RefreshContextUsageVisual();
|
||||||
ScheduleGitBranchRefresh();
|
ScheduleGitBranchRefresh();
|
||||||
|
UpdateGitBranchUi(_currentGitBranchName, GitBranchFilesText?.Text ?? "", GitBranchAddedText?.Text ?? "", GitBranchDeletedText?.Text ?? "", _currentGitTooltip ?? "", BtnGitBranch?.Visibility ?? Visibility.Collapsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateDataUsageUI()
|
private void UpdateDataUsageUI()
|
||||||
@@ -108,7 +109,7 @@ public partial class ChatWindow
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var preset = Services.PresetService.GetByTabWithCustom(_activeTab, _settings.Settings.Llm.CustomPresets)
|
var preset = PresetService.GetByTabWithCustom(_activeTab, _settings.Settings.Llm.CustomPresets)
|
||||||
.FirstOrDefault(p => string.Equals(p.Category?.Trim(), category, StringComparison.OrdinalIgnoreCase));
|
.FirstOrDefault(p => string.Equals(p.Category?.Trim(), category, StringComparison.OrdinalIgnoreCase));
|
||||||
if (preset == null)
|
if (preset == null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,9 +33,130 @@ public partial class ChatWindow
|
|||||||
GitBranchDeletedText.Text = deletedText;
|
GitBranchDeletedText.Text = deletedText;
|
||||||
if (GitBranchSeparator != null)
|
if (GitBranchSeparator != null)
|
||||||
GitBranchSeparator.Visibility = visibility;
|
GitBranchSeparator.Visibility = visibility;
|
||||||
|
|
||||||
|
UpdateCodeRepoSummaryUi(branchName, filesText, addedText, deletedText, tooltip, visibility);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateCodeRepoSummaryUi(string? branchName, string filesText, string addedText, string deletedText, string tooltip, Visibility visibility)
|
||||||
|
{
|
||||||
|
if (CodeRepoSummaryBar == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var currentFolder = GetCurrentWorkFolder();
|
||||||
|
var isVisible = visibility == Visibility.Visible &&
|
||||||
|
string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
!string.IsNullOrWhiteSpace(currentFolder);
|
||||||
|
|
||||||
|
CodeRepoSummaryBar.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
if (!isVisible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var gitRoot = _currentGitRoot ?? ResolveGitRoot(currentFolder);
|
||||||
|
var repoName = !string.IsNullOrWhiteSpace(gitRoot)
|
||||||
|
? System.IO.Path.GetFileName(gitRoot.TrimEnd('\\', '/'))
|
||||||
|
: "저장소";
|
||||||
|
var normalizedBranch = string.IsNullOrWhiteSpace(branchName) ? "detached" : branchName!;
|
||||||
|
var normalizedGitRoot = string.IsNullOrWhiteSpace(gitRoot)
|
||||||
|
? ""
|
||||||
|
: gitRoot!.TrimEnd('\\', '/');
|
||||||
|
var normalizedCurrentFolder = string.IsNullOrWhiteSpace(currentFolder)
|
||||||
|
? ""
|
||||||
|
: currentFolder!.TrimEnd('\\', '/');
|
||||||
|
var isWorkspaceSubfolder = !string.IsNullOrWhiteSpace(normalizedGitRoot) &&
|
||||||
|
!string.IsNullOrWhiteSpace(normalizedCurrentFolder) &&
|
||||||
|
!string.Equals(normalizedGitRoot, normalizedCurrentFolder, StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
if (CodeRepoSummaryRepoLabel != null)
|
||||||
|
CodeRepoSummaryRepoLabel.Text = repoName;
|
||||||
|
if (CodeRepoSummaryBranchLabel != null)
|
||||||
|
CodeRepoSummaryBranchLabel.Text = normalizedBranch;
|
||||||
|
|
||||||
|
if (CodeRepoSummaryDetailText != null)
|
||||||
|
{
|
||||||
|
var details = new List<string>();
|
||||||
|
if (!string.IsNullOrWhiteSpace(filesText))
|
||||||
|
details.Add($"변경 {filesText}");
|
||||||
|
if (!string.IsNullOrWhiteSpace(addedText))
|
||||||
|
details.Add(addedText);
|
||||||
|
if (!string.IsNullOrWhiteSpace(deletedText))
|
||||||
|
details.Add(deletedText);
|
||||||
|
if (!string.IsNullOrWhiteSpace(_currentGitUpstreamStatus))
|
||||||
|
details.Add(_currentGitUpstreamStatus!);
|
||||||
|
|
||||||
|
CodeRepoSummaryDetailText.Text = details.Count > 0
|
||||||
|
? string.Join(" · ", details)
|
||||||
|
: "현재 저장소 컨텍스트와 변경 상태를 기준으로 작업합니다.";
|
||||||
|
CodeRepoSummaryDetailText.ToolTip = string.IsNullOrWhiteSpace(tooltip) ? null : tooltip;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CodeRepoSummaryAddedPill != null && CodeRepoSummaryAddedText != null)
|
||||||
|
{
|
||||||
|
var hasAdded = !string.IsNullOrWhiteSpace(addedText);
|
||||||
|
CodeRepoSummaryAddedPill.Visibility = hasAdded ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
CodeRepoSummaryAddedText.Text = hasAdded ? addedText : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CodeRepoSummaryDeletedPill != null && CodeRepoSummaryDeletedText != null)
|
||||||
|
{
|
||||||
|
var hasDeleted = !string.IsNullOrWhiteSpace(deletedText);
|
||||||
|
CodeRepoSummaryDeletedPill.Visibility = hasDeleted ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
CodeRepoSummaryDeletedText.Text = hasDeleted ? deletedText : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CodeRepoSummaryWorkspacePill != null && CodeRepoSummaryWorkspaceText != null)
|
||||||
|
{
|
||||||
|
CodeRepoSummaryWorkspacePill.Visibility = Visibility.Visible;
|
||||||
|
CodeRepoSummaryWorkspaceText.Text = isWorkspaceSubfolder ? "워크트리" : "로컬";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CodeRepoSummaryUpstreamPill != null && CodeRepoSummaryUpstreamText != null)
|
||||||
|
{
|
||||||
|
var hasUpstream = !string.IsNullOrWhiteSpace(_currentGitUpstreamStatus);
|
||||||
|
CodeRepoSummaryUpstreamPill.Visibility = hasUpstream ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
CodeRepoSummaryUpstreamText.Text = hasUpstream ? _currentGitUpstreamStatus! : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CodeRepoSummaryActionText != null)
|
||||||
|
{
|
||||||
|
var hasChanges = _currentGitChangedFileCount > 0 ||
|
||||||
|
!string.IsNullOrWhiteSpace(addedText) ||
|
||||||
|
!string.IsNullOrWhiteSpace(deletedText);
|
||||||
|
CodeRepoSummaryActionText.Text = hasChanges ? "변경 · 브랜치 보기" : "브랜치 보기";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CodeRepoSummaryReviewPill != null)
|
||||||
|
CodeRepoSummaryReviewPill.Visibility = Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CodeRepoSummaryReviewPill_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||||||
|
{
|
||||||
|
e.Handled = true;
|
||||||
|
if (!string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase) || InputBox == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var existingText = InputBox.Text;
|
||||||
|
ShowSlashChip("/review");
|
||||||
|
if (!string.IsNullOrWhiteSpace(existingText))
|
||||||
|
{
|
||||||
|
InputBox.Text = existingText;
|
||||||
|
InputBox.CaretIndex = InputBox.Text.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
InputBox.Focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void CodeRepoSummaryBar_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||||||
|
{
|
||||||
|
e.Handled = true;
|
||||||
|
if (BtnGitBranch == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
await RefreshGitBranchStatusAsync();
|
||||||
|
BuildGitBranchPopup();
|
||||||
|
GitBranchPopup.IsOpen = true;
|
||||||
|
}
|
||||||
|
|
||||||
private void BuildGitBranchPopup()
|
private void BuildGitBranchPopup()
|
||||||
{
|
{
|
||||||
if (GitBranchItems == null)
|
if (GitBranchItems == null)
|
||||||
@@ -116,7 +237,7 @@ public partial class ChatWindow
|
|||||||
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
||||||
"\uE8C8",
|
"\uE8C8",
|
||||||
"상태 요약 복사",
|
"상태 요약 복사",
|
||||||
"브랜치 변경 파일, 추가/삭제 라인 복사",
|
"브랜치, 변경 파일, 추가/삭제 라인 요약을 복사합니다.",
|
||||||
false,
|
false,
|
||||||
accentBrush,
|
accentBrush,
|
||||||
secondaryText,
|
secondaryText,
|
||||||
@@ -129,8 +250,8 @@ public partial class ChatWindow
|
|||||||
|
|
||||||
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
||||||
"\uE72B",
|
"\uE72B",
|
||||||
"새로고침",
|
"다시 조회",
|
||||||
"Git 상태를 다시 조회합니다.",
|
"Git 상태를 다시 불러옵니다.",
|
||||||
false,
|
false,
|
||||||
accentBrush,
|
accentBrush,
|
||||||
secondaryText,
|
secondaryText,
|
||||||
@@ -213,7 +334,7 @@ public partial class ChatWindow
|
|||||||
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
||||||
"\uE710",
|
"\uE710",
|
||||||
"새 브랜치 생성",
|
"새 브랜치 생성",
|
||||||
"현재 작업 기준으로 새 브랜치를 만들고 전환합니다.",
|
"현재 작업을 기준으로 새 브랜치를 만들고 전환합니다.",
|
||||||
false,
|
false,
|
||||||
accentBrush,
|
accentBrush,
|
||||||
secondaryText,
|
secondaryText,
|
||||||
|
|||||||
@@ -51,10 +51,12 @@ public partial class ChatWindow
|
|||||||
var userCodeBgBrush = TryFindResource("HintBackground") as Brush ?? Brushes.DarkGray;
|
var userCodeBgBrush = TryFindResource("HintBackground") as Brush ?? Brushes.DarkGray;
|
||||||
MarkdownRenderer.EnableFilePathHighlight =
|
MarkdownRenderer.EnableFilePathHighlight =
|
||||||
(System.Windows.Application.Current as App)?.SettingsService?.Settings.Llm.EnableFilePathHighlight ?? true;
|
(System.Windows.Application.Current as App)?.SettingsService?.Settings.Llm.EnableFilePathHighlight ?? true;
|
||||||
|
MarkdownRenderer.EnableCodeSymbolHighlight = true;
|
||||||
bubble.Child = MarkdownRenderer.Render(content, primaryText, secondaryText, accentBrush, userCodeBgBrush);
|
bubble.Child = MarkdownRenderer.Render(content, primaryText, secondaryText, accentBrush, userCodeBgBrush);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
MarkdownRenderer.EnableCodeSymbolHighlight = false;
|
||||||
bubble.Child = new TextBlock
|
bubble.Child = new TextBlock
|
||||||
{
|
{
|
||||||
Text = content,
|
Text = content,
|
||||||
@@ -176,6 +178,9 @@ public partial class ChatWindow
|
|||||||
var app = System.Windows.Application.Current as App;
|
var app = System.Windows.Application.Current as App;
|
||||||
MarkdownRenderer.EnableFilePathHighlight =
|
MarkdownRenderer.EnableFilePathHighlight =
|
||||||
app?.SettingsService?.Settings.Llm.EnableFilePathHighlight ?? true;
|
app?.SettingsService?.Settings.Llm.EnableFilePathHighlight ?? true;
|
||||||
|
MarkdownRenderer.EnableCodeSymbolHighlight =
|
||||||
|
string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase);
|
||||||
var codeBgBrush = TryFindResource("HintBackground") as Brush ?? Brushes.DarkGray;
|
var codeBgBrush = TryFindResource("HintBackground") as Brush ?? Brushes.DarkGray;
|
||||||
if (IsBranchContextMessage(content))
|
if (IsBranchContextMessage(content))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1699,6 +1699,139 @@
|
|||||||
HorizontalAlignment="Center"
|
HorizontalAlignment="Center"
|
||||||
VerticalAlignment="Bottom">
|
VerticalAlignment="Bottom">
|
||||||
<StackPanel HorizontalAlignment="Stretch">
|
<StackPanel HorizontalAlignment="Stretch">
|
||||||
|
<Border x:Name="CodeRepoSummaryBar"
|
||||||
|
Visibility="Collapsed"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Background="{DynamicResource HintBackground}"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="12"
|
||||||
|
Padding="12,8"
|
||||||
|
Margin="0,0,0,10"
|
||||||
|
Cursor="Hand"
|
||||||
|
MouseLeftButtonUp="CodeRepoSummaryBar_MouseLeftButtonUp">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBlock Text=""
|
||||||
|
FontFamily="Segoe MDL2 Assets"
|
||||||
|
FontSize="12"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"
|
||||||
|
VerticalAlignment="Center"/>
|
||||||
|
<TextBlock x:Name="CodeRepoSummaryRepoLabel"
|
||||||
|
Text="저장소"
|
||||||
|
Margin="6,0,0,0"
|
||||||
|
FontSize="12.5"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"
|
||||||
|
VerticalAlignment="Center"/>
|
||||||
|
<TextBlock Text="·"
|
||||||
|
Margin="6,0"
|
||||||
|
FontSize="12"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"
|
||||||
|
VerticalAlignment="Center"/>
|
||||||
|
<TextBlock x:Name="CodeRepoSummaryBranchLabel"
|
||||||
|
Text="main"
|
||||||
|
FontSize="12"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"
|
||||||
|
VerticalAlignment="Center"/>
|
||||||
|
</StackPanel>
|
||||||
|
<TextBlock x:Name="CodeRepoSummaryDetailText"
|
||||||
|
Margin="0,4,0,0"
|
||||||
|
FontSize="11.5"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"
|
||||||
|
Text="현재 저장소 컨텍스트와 변경 상태를 기준으로 작업합니다."/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Grid.Column="1"
|
||||||
|
Orientation="Horizontal"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Margin="12,0,0,0">
|
||||||
|
<Border x:Name="CodeRepoSummaryWorkspacePill"
|
||||||
|
Visibility="Collapsed"
|
||||||
|
Background="{DynamicResource ItemBackground}"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="999"
|
||||||
|
Padding="8,3"
|
||||||
|
Margin="0,0,6,0">
|
||||||
|
<TextBlock x:Name="CodeRepoSummaryWorkspaceText"
|
||||||
|
Text="로컬"
|
||||||
|
FontSize="11"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"/>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="CodeRepoSummaryUpstreamPill"
|
||||||
|
Visibility="Collapsed"
|
||||||
|
Background="{DynamicResource ItemBackground}"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="999"
|
||||||
|
Padding="8,3"
|
||||||
|
Margin="0,0,6,0">
|
||||||
|
<TextBlock x:Name="CodeRepoSummaryUpstreamText"
|
||||||
|
Text="upstream"
|
||||||
|
FontSize="11"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"/>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="CodeRepoSummaryAddedPill"
|
||||||
|
Visibility="Collapsed"
|
||||||
|
Background="#E8F7EC"
|
||||||
|
BorderBrush="#B7E3C0"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="999"
|
||||||
|
Padding="8,3"
|
||||||
|
Margin="0,0,6,0">
|
||||||
|
<TextBlock x:Name="CodeRepoSummaryAddedText"
|
||||||
|
Text="+0"
|
||||||
|
FontSize="11"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Foreground="#15803D"/>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="CodeRepoSummaryDeletedPill"
|
||||||
|
Visibility="Collapsed"
|
||||||
|
Background="#FDECEC"
|
||||||
|
BorderBrush="#F4B9B9"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="999"
|
||||||
|
Padding="8,3"
|
||||||
|
Margin="0,0,6,0">
|
||||||
|
<TextBlock x:Name="CodeRepoSummaryDeletedText"
|
||||||
|
Text="-0"
|
||||||
|
FontSize="11"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Foreground="#B91C1C"/>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="CodeRepoSummaryReviewPill"
|
||||||
|
Background="{DynamicResource ItemBackground}"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="999"
|
||||||
|
Padding="9,4"
|
||||||
|
Margin="0,0,6,0"
|
||||||
|
Cursor="Hand"
|
||||||
|
MouseLeftButtonUp="CodeRepoSummaryReviewPill_MouseLeftButtonUp">
|
||||||
|
<TextBlock Text="리뷰"
|
||||||
|
FontSize="11.5"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
</Border>
|
||||||
|
<Border Background="{DynamicResource ItemBackground}"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="999"
|
||||||
|
Padding="9,4">
|
||||||
|
<TextBlock x:Name="CodeRepoSummaryActionText"
|
||||||
|
Text="브랜치 · 변경 보기"
|
||||||
|
FontSize="11.5"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
<Border x:Name="SelectedPresetGuide"
|
<Border x:Name="SelectedPresetGuide"
|
||||||
Visibility="Collapsed"
|
Visibility="Collapsed"
|
||||||
HorizontalAlignment="Center"
|
HorizontalAlignment="Center"
|
||||||
|
|||||||
Reference in New Issue
Block a user