Files
AX-Copilot-Codex/docs/DEVELOPMENT.md
lacvet 227f5ab0d3
Some checks are pending
Release Gate / gate (push) Waiting to run
에이전트 진행 표시 구조를 claude-code식 row 기반으로 재정리
- AgentTranscriptDisplayCatalog를 row presentation 중심으로 재구성해 thinking/waiting/compact/tool activity/permission/tool result/status를 타입별로 분리함
- PermissionRequestPresentationCatalog와 ToolResultPresentationCatalog를 정리해 권한 요청과 결과 상태를 행위/상태 기준으로 더 명확하게 표현함
- ChatWindow.AgentEventRendering에서 process feed 계열 이벤트를 GroupKey 기준으로 병합해 append 수를 줄이고 진행 흐름이 기본 transcript에 남도록 조정함
- FooterPresentation에서 Cowork/Chat 프리셋 안내 카드가 execution event 이후 자동으로 숨겨지도록 하고 입력 워터마크와 footer 기본 문구를 정리함
- render_messages 성능 로그에 processFeed append/merge 수치와 rowKindCounts를 추가해 %APPDATA%\\AxCopilot\\perf 기준 실검증이 가능하도록 함
- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ 기준 경고 0 / 오류 0 확인
2026-04-09 14:49:53 +09:00

475 lines
28 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AX Copilot - 媛쒕컻 臾몄꽌
## claude-code식 transcript 표시 구조 정리
- 업데이트: 2026-04-09 13:05 (KST)
- AgentTranscriptDisplayCatalog를 row presentation 중심으로 재구성해 thinking / waiting / compact / tool activity / permission / tool result / status를 개별 transcript row 의미로 다룰 수 있게 정리했습니다.
- ChatWindow.AgentEventRendering은 process feed 계열 이벤트를 같은 GroupKey 단위로 병합해, 긴 Cowork/Code 실행 중 append 수를 줄이면서도 주요 활동 흐름이 기본 transcript에 남도록 조정했습니다.
- PermissionRequestPresentationCatalog, ToolResultPresentationCatalog를 다시 정리해 권한 요청과 도구 결과를 행위/상태 기준으로 구분하고, transcript 렌더와 popup이 같은 메타를 공유하도록 맞췄습니다.
- ChatWindow.FooterPresentation은 execution event가 생긴 뒤에는 프리셋 안내 카드를 자동으로 숨기도록 바꿔 결과/진행 화면을 덮지 않게 했고, Cowork/Code 입력 워터마크와 footer 기본 문구도 정상 한국어 기준으로 다시 정리했습니다.
- render_messages 성능 로그에는 processFeedAppends, processFeedMerges, rowKindCounts를 함께 남겨 %APPDATA%\\AxCopilot\\perf 기준으로 transcript grouping 효과를 수치로 비교할 수 있게 했습니다.
## 1. ?꾨줈?앺듃 媛쒖슂
AX Copilot?€ Windows???앹궛???곗쿂 + AI ?먯씠?꾪듃 ?곗뒪?ы넲 ?깆엯?덈떎.
- **?곗쿂**: Alfred/Raycast ?ㅽ??쇱쓽 ?쇱? 寃€?? 紐낅졊 ?ㅽ뻾, ?꾩젽
- **?먯씠?꾪듃**: LLM 湲곕컲 ?€?뷀삎 肄붾뱶/臾몄꽌 ?묒뾽 ?먮룞??(?꾧뎄 ?몄텧 猷⑦봽)
- **??諛?*: ?쒖뒪??由ъ냼?? ?대┰蹂대뱶, ?ㅽ겕由곗꺑 ??鍮좊Ⅸ ?묎렐
---
## 2. 湲곗닠 ?ㅽ깮
| ??ぉ | 媛?|
|------|-----|
| ?꾨젅?꾩썙??| .NET 8 (net8.0-windows10.0.17763.0) |
| UI | WPF + Windows Forms (?섏씠釉뚮━?? |
| ?몄뼱 | C# 12 |
| ?⑦꽩 | MVVM, ?대깽??湲곕컲, ?깃????쒕퉬??|
| ?뚯뒪??| xUnit 2.9 + FluentAssertions 6.12 |
| 鍮뚮뱶 | dotnet CLI, PublishSingleFile |
### 二쇱슂 NuGet ?⑦궎吏€
| ?⑦궎吏€ | ?⑸룄 |
|--------|------|
| DocumentFormat.OpenXml 3.2.0 | DOCX/XLSX/PPTX ?앹꽦 |
| Markdig 0.37.0 | Markdown ??HTML ?뚮뜑留?|
| Microsoft.Data.Sqlite 8.0 | SQLite (?€???€?μ냼) |
| Microsoft.Web.WebView2 | HTML 誘몃━蹂닿린, 媛€?대뱶 酉곗뼱 |
| QRCoder 1.6.0 | QR 肄붾뱶 ?앹꽦 |
| System.Security.Cryptography.ProtectedData | DPAPI ?뷀샇??|
| UglyToad.PdfPig | PDF ?쎄린 |
---
## 3. ?붾(??援ъ“
```
src/
?쒋??€ AxCopilot/ # 硫붿씤 WPF ??(v0.7.3)
?? ?쒋??€ Assets/ # ?꾩씠肄? ?꾨━??JSON, ?뷀샇?붾맂 媛€?대뱶, 留덉뒪肄뷀듃
?? ?쒋??€ Core/ # FuzzyEngine, CommandResolver, InputListener, PluginHost
?? ?쒋??€ Handlers/ # 136媛?鍮뚰듃??紐낅졊 ?몃뱾???? ?쒋??€ Models/ # AppSettings, ChatModels, McpSettings
?? ?쒋??€ Security/ # AntiTamper (?붾쾭嫄??붿뺨?뚯씪???먯?)
?? ?쒋??€ Services/ # 60媛??쒕퉬???? ?? ?붴??€ Agent/ # ?먯씠?꾪듃 猷⑦봽 + 114媛??꾧뎄
?? ?쒋??€ Themes/ # 9媛??뚮쭏 (Dark, Light, OLED, Nord, Monokai ??
?? ?쒋??€ ViewModels/ # LauncherViewModel, SettingsViewModel, StatisticsViewModel
?? ?붴??€ Views/ # 30媛?XAML ?덈룄???쒋??€ AxCopilot.SDK/ # ?뚮윭洹몄씤 SDK (IActionHandler ?명꽣?섏씠??
?쒋??€ AxCopilot.Installer/ # Windows Forms ?ㅼ튂 ?꾨줈洹몃옩 (.NET Framework 4.8)
?쒋??€ AxCopilot.Tests/ # xUnit ?⑥쐞/?듯빀 ?뚯뒪???붴??€ AxKeyEncryptor/ # API ??DPAPI ?뷀샇???좏떥由ы떚
```
---
## 4. ???쒖옉 ?먮쫫 (App.xaml.cs)
```
OnStartup()
?쒋? AntiTamper ?붾쾭嫄?媛먯? (Release 鍮뚮뱶)
?쒋? ?⑥씪 ?몄뒪?댁뒪 裕ㅽ뀓???뺤씤
?쒋? SettingsService 珥덇린??+ ?ㅼ젙 濡쒕뱶
?쒋? ChatStorageService 蹂닿? ?뺤콉 ?ㅽ뻾 (留뚮즺 ?€???뺣━)
?쒋? L10n ?몄뼱 珥덇린?? ?쒋? ?쒕퉬??珥덇린?? ?? ?쒋? AgentMemoryService
?? ?쒋? ChatSessionStateService
?? ?쒋? AppStateService
?? ?쒋? IndexService (諛깃렇?쇱슫???뚯씪 ?몃뜳??
?? ?쒋? FuzzyEngine + CommandResolver
?? ?쒋? ContextManager
?? ?쒋? SessionTrackingService
?? ?쒋? WorktimeReminderService
?? ?붴? ClipboardHistoryService
?쒋? 鍮뚰듃???몃뱾???깅줉 (136媛?
?쒋? SchedulerService + PluginHost 珥덇린?? ?쒋? InputListener ?쒖옉 (湲€濡쒕쾶 ?ロ궎)
?붴? ?곗쿂/?ㅼ젙/?몃젅???덈룄???앹꽦
```
---
## 5. ?듭떖 ?꾪궎?띿쿂
### 5.1 ?곗쿂 (Launcher)
**寃€???뚯씠?꾨씪??*: ?ъ슜???낅젰 ??`CommandResolver` (?묐몢??留ㅼ묶) ??`FuzzyEngine` (?쇱? 寃€?? ??寃곌낵 ?뺣젹 ??UI ?뚮뜑留?
- `FuzzyEngine`: ?뚯씪 ?몃뜳??湲곕컲 ?쇱? 留ㅼ묶, ?먯닔 ?쒖쐞
- `CommandResolver`: ?몃뱾???쇱슦??(?묐몢??`@`, `!`, `#`, `~`, `>`, `$` ??
- `IndexService`: 諛깃렇?쇱슫???뚯씪 ?몃뜳??(`.git`, `node_modules` ???쒖쇅)
**?꾩젽**: ?깅뒫 紐⑤땲?? ?щえ?꾨줈, 硫붾え, ?좎뵪, 罹섎┛?? 諛고꽣由?
### 5.2 ?먯씠?꾪듃 (Agent Loop)
```
?ъ슜??硫붿떆吏€
??LlmService.StreamAsync() (LLM API ?몄텧)
???묐떟 ?ㅽ듃由щ컢 ?섏떊
???꾧뎄 ?몄텧 媛먯? ??
??ToolRegistry?먯꽌 ?꾧뎄 議고쉶
??沅뚰븳 ?뺤씤 (AskPermissionCallback)
???꾧뎄 ?ㅽ뻾
??寃곌낵瑜?而⑦뀓?ㅽ듃??異붽?
??LLM ?ы샇異?(諛섎났)
??理쒖쥌 ?띿뒪???묐떟 諛섑솚
```
**?듭떖 ?대옒??*:
- `AgentLoopService` ??猷⑦봽 ?붿쭊 (諛섎났, ?쇱떆?뺤?/?ш컻, ?대깽??諛쒗뻾)
- `AxAgentExecutionEngine` ???꾧뎄 ?ㅽ뻾 議곗쑉
- `AgentLoopParallelExecution` ??蹂묐젹 ?꾧뎄 ?ㅽ뻾
- `AgentLoopTransitions` / `.Execution` ???곹깭 ?꾩씠 濡쒖쭅
- `ToolRegistry` ???꾧뎄 ?깅줉/議고쉶
- `ContextCondenser` ??而⑦뀓?ㅽ듃 ?뺤텞 (?좏겙 愿€由?
**?꾧뎄 移댄뀒怨좊━** (114媛?:
| 移댄뀒怨좊━ | ?덉떆 |
|---------|------|
| ?뚯씪 I/O | FileReadTool, FileEditTool, FileManageTool, FileWriteTool |
| 寃€??| GlobTool, GrepTool, CodeSearchTool, FileSearchTool |
| 臾몄꽌 | DocumentReaderTool, ExcelSkill, DocxSkill, PptxSkill, CsvSkill, HtmlSkill |
| 肄붾뱶 | BuildRunTool, SnippetRunnerTool, CodeReviewTool, TestLoopTool, LspTool |
| ?곗씠??| JsonTool, XmlTool, SqlTool, DataPivotTool, RegexTool |
| ?쒖뒪??| ProcessTool, EnvTool, ZipTool, ClipboardTool |
| 怨꾪쉷/異붿쟻 | TodoWriteTool, TaskTrackerTool, CheckpointTool, PlaybookTool |
| ?ъ슜??| UserAskTool, SuggestActionsTool, NotifyTool |
| MCP | McpTool, McpListResourcesTool, McpReadResourceTool |
### 5.3 LLM ?쒕퉬??
**吏€??怨듦툒??*:
| ?쒕퉬??| ?ㅻ챸 |
|--------|------|
| `claude` / `sigmoid` | Anthropic Claude (Sigmoid API 寃쎌쑀) |
| `gemini` | Google Gemini API |
| `vllm` | OpenAI ?명솚 vLLM (IBM CP4D 吏€???ы븿) |
| `ollama` | 濡쒖뺄 Ollama 紐⑤뜽 |
**紐⑤뜽 ?쇱슦??*: `ModelRouterService`瑜??듯븳 ?ㅻ쾭?쇱씠???ㅽ깮 ???€??以?紐⑤뜽/?쒕퉬?ㅻ? ?숈쟻?쇰줈 ?꾪솚 媛€??
**?좏겙 愿€由?*: `TokenEstimator`濡?而⑦뀓?ㅽ듃 湲몄씠 異붿젙, ?ㅻ쾭?뚮줈????`ContextCondenser`媛€ ?먮룞 ?뺤텞
### 5.4 ?€???€?μ냼
- `ChatStorageService`: SQLite 湲곕컲 ?€???곸냽??- `ChatSessionStateService`: 硫붾え由????몄뀡 ?곹깭 愿€由?- `ChatConversation`: 硫붿떆吏€ 紐⑸줉 + ?ㅽ뻾 ?대깽???€?꾨씪??
---
## 6. UI 怨꾩링
### 二쇱슂 ?덈룄??
| ?덈룄??| ??븷 |
|--------|------|
| `LauncherWindow` | 硫붿씤 ?곗쿂 (寃€?? ?꾩젽, 寃곌낵 紐⑸줉) |
| `ChatWindow` | AI ?먯씠?꾪듃 ?€??(梨꾪똿/Cowork/肄붾뱶 ?? |
| `DockBarWindow` | ??諛?(?쒖뒪??由ъ냼?? 鍮좊Ⅸ ?묎렐) |
| `SettingsWindow` | ?ㅼ젙 愿€由?|
| `AgentSettingsWindow` | ?먯씠?꾪듃 ?꾩슜 ?ㅼ젙 |
| `AgentStatsDashboardWindow` | ?먯씠?꾪듃 ?듦퀎 ?€?쒕낫??|
| `SkillEditorWindow` | ?ㅽ궗 ?몄쭛湲?|
| `SkillGalleryWindow` | ?ㅽ궗 媛ㅻ윭由?|
| `TrayMenuWindow` | ?쒖뒪???몃젅??硫붾돱 |
| `PreviewWindow` | 臾몄꽌 誘몃━蹂닿린 (WebView2) |
### ChatWindow 遺꾪븷 援ъ“
`ChatWindow.xaml.cs`??partial class濡?湲곕뒫蹂?遺꾪븷:
| ?뚯씪 | ??븷 |
|------|------|
| `ChatWindow.xaml.cs` | 硫붿씤 ?ㅼ??ㅽ듃?덉씠?? ?ㅽ듃由щ컢, ?낅젰 泥섎━ |
| `ChatWindow.AgentEventProcessor.cs` | ?먯씠?꾪듃 ?대깽???섏떊/?쇱슦??|
| `ChatWindow.AgentEventRendering.cs` | ?먯씠?꾪듃 ?대깽??諛곕꼫/移대뱶 ?뚮뜑留?|
| `ChatWindow.ComposerQueuePresentation.cs` | ?묒꽦湲???UI |
| `ChatWindow.ContextUsagePresentation.cs` | 而⑦뀓?ㅽ듃 ?ъ슜??留??앹뾽 |
| `ChatWindow.ConversationFilterPresentation.cs` | ?€???꾪꽣留?|
| `ChatWindow.ConversationListPresentation.cs` | ?ъ씠?쒕컮 ?€??紐⑸줉 |
| `ChatWindow.ConversationManagementPresentation.cs` | ?€???앹꽦/??젣/愿€由?|
| `ChatWindow.FileBrowserPresentation.cs` | ?뚯씪 釉뚮씪?곗? UI |
| `ChatWindow.FooterPresentation.cs` | ?섎떒 諛?(?대뜑, 沅뚰븳) |
| `ChatWindow.GitBranchPresentation.cs` | Git 釉뚮옖移??쒖떆/?꾪솚 |
| `ChatWindow.LiveProgressPresentation.cs` | ?ㅼ떆媛?吏꾪뻾 ?곹깭 |
| `ChatWindow.MessageBubblePresentation.cs` | 硫붿떆吏€ 踰꾨툝 ?뚮뜑留?|
| `ChatWindow.MessageInteractions.cs` | 硫붿떆吏€ 蹂듭궗/?몄쭛/?ъ쟾??|
| `ChatWindow.PermissionPresentation.cs` | 沅뚰븳 ?앹뾽/諛곕꼫 UI |
| `ChatWindow.PlanApprovalPresentation.cs` | 怨꾪쉷 ?뱀씤 移대뱶 |
| `ChatWindow.PopupPresentation.cs` | 怨듯넻 ?앹뾽 援ъ꽦 |
| `ChatWindow.PreviewPresentation.cs` | ?뚯씪 誘몃━蹂닿린 ??|
| `ChatWindow.SelectionPopupPresentation.cs` | ?뚰겕?몃━ ?좏깮 ?앹뾽 |
| `ChatWindow.SidebarInteractionPresentation.cs` | ?ъ씠?쒕컮 ?곹샇?묒슜 |
| `ChatWindow.StatusPresentation.cs` | ?곹깭 諛곗?/?ㅽ듃由?|
| `ChatWindow.SurfaceVisualPresentation.cs` | ?쒓컖 ?④낵 (湲€濡쒖슦, ?꾩뒪 ?? |
| `ChatWindow.TaskSummary.cs` | ?묒뾽 ?붿빟 移대뱶 |
| `ChatWindow.TimelinePresentation.cs` | ?€?꾨씪???뺣젹, 罹먯떆, ?대깽???꾪꽣留?|
| `ChatWindow.TopicPresetPresentation.cs` | 二쇱젣 ?꾨━??UI |
| `ChatWindow.TranscriptHost.cs` | ?몃옖?ㅽ겕由쏀듃 ?몄뒪??而⑦뀒?대꼫 |
| `ChatWindow.TranscriptPolicy.cs` | ?몃옖?ㅽ겕由쏀듃 ?쒖떆 ?뺤콉 |
| `ChatWindow.TranscriptRenderExecution.cs` | ?몃옖?ㅽ겕由쏀듃 ?뚮뜑 ?ㅽ뻾 |
| `ChatWindow.TranscriptRenderPlanner.cs` | ?몃옖?ㅽ겕由쏀듃 ?뚮뜑 怨꾪쉷 |
| `ChatWindow.TranscriptRendering.cs` | ?몃옖?ㅽ겕由쏀듃 ?뚮뜑留?|
| `ChatWindow.TranscriptVirtualization.cs` | ?몃옖?ㅽ겕由쏀듃 媛€?곹솕 (?€洹쒕え ?€?? |
| `ChatWindow.UserAskPresentation.cs` | ?ъ슜??吏덈Ц ?몃씪??移대뱶 |
| `ChatWindow.VisualInteractionHelpers.cs` | ?쒓컖 ?곹샇?묒슜 ?ы띁 |
### ?뚮쭏 ?쒖뒪??
9媛??뚮쭏 XAML 由ъ냼???뺤뀛?덈━: `Dark`, `Light`, `OLED`, `Nord`, `Monokai`, `Catppuccin`, `Sepia`, `Alfred`, `AlfredLight`
?고????뚮쭏 ?꾪솚: `SettingsService.Settings.Launcher.Theme` 蹂€寃???由ъ냼???뺤뀛?덈━ 援먯껜
---
## 7. ?ㅼ젙 援ъ“ (AppSettings)
### 理쒖긽???ㅼ젙
| ?띿꽦 | 湲곕낯媛?| ?ㅻ챸 |
|------|--------|------|
| `AiEnabled` | true | AI 湲곕뒫 ?쒖꽦??|
| `OperationMode` | "internal" | ?댁쁺 紐⑤뱶 (internal/external) |
| `Hotkey` | "Alt+Space" | ?곗쿂 ?⑥텞??|
| `CleanupPeriodDays` | 30 | ?€??蹂닿? 湲곌컙 (?? |
| `InternalModeEnabled` | true | ?щ궡 紐⑤뱶 ?щ? |
### LauncherSettings (以묒꺽)
| 洹몃9 | 二쇱슂 ?띿꽦 |
|------|----------|
| ?쒖떆 | `Theme`, `Opacity`, `Position`, `Width`, `MaxResults` |
| 湲€濡쒖슦 | `EnableRainbowGlow`, `EnableSelectionGlow`, `ShowLauncherBorder` |
| ?꾩젽 | `ShowWidgetPerf`, `ShowWidgetPomo`, `ShowWidgetNote`, `ShowWidgetWeather`, `ShowWidgetCalendar`, `ShowWidgetBattery` |
| ??諛?| `DockBarItems`, `DockBarAutoShow`, `DockBarOpacity`, `DockBarRainbowGlow` |
| 湲곕뒫 | `EnableFavorites`, `EnableRecent`, `EnableActionMode`, `EnableClipboardAutoCategory` |
### LlmSettings (以묒꺽)
?먯씠?꾪듃??LLM ?곌껐 ?ㅼ젙: ?쒕퉬???좏깮, 紐⑤뜽, API ??(DPAPI ?뷀샇??, ?붾뱶?ъ씤?? ?⑤룄, 理쒕? ?좏겙 ??
| ?띿꽦 | 湲곕낯媛?| ?ㅻ챸 |
|------|--------|------|
| `UseAutomaticProfileTemperature` | true | ?깅줉 紐⑤뜽 ?꾨줈?뚯씪???먮룞 temperature ?뺤콉 |
| `EnableDetailedLog` | false | ?뚰겕?뚮줈???곸꽭 濡쒓렇 (LLM ?붿껌/?묐떟, ?꾧뎄 ?대젰) |
| `DetailedLogRetentionDays` | 3 | ?곸꽭 濡쒓렇 蹂닿? 湲곌컙 (?? |
| `EnableRawLlmLog` | false | LLM ?붿껌/?묐떟 ?먮Ц 湲곕줉 (?붾쾭源낆슜) |
### RegisteredModel ?ㅽ뻾 ?꾨줈?뚯씪
紐⑤뜽蹂?`ExecutionProfile`濡??꾧뎄 ?몄텧 媛뺣룄, ?ъ떆?? 硫붾え由??뺤텞 二쇱엯?됱쓣 議곗젅:
| ?꾨줈?뚯씪 | ?ㅻ챸 |
|---------|------|
| `balanced` | 湲곕낯 洹좏삎 紐⑤뱶 |
| `tool_call_strict` | ?꾧뎄 ?몄텧 媛뺤젣/?꾧꺽 紐⑤뱶 |
| `reasoning_first` | 異붾줎 ?곗꽑 紐⑤뱶 |
| `fast_readonly` | 鍮좊Ⅸ ?쎄린 ?꾩슜 紐⑤뱶 |
| `document_heavy` | 臾몄꽌 泥섎━ 吏묒쨷 紐⑤뱶 |
---
## 8. ?뚮윭洹몄씤 ?쒖뒪??
### SDK (AxCopilot.SDK)
```csharp
public interface IActionHandler
{
string? Prefix { get; } // ?묐몢??(null?대㈃ ?쇱? 寃€?됰쭔)
PluginMetadata Metadata { get; }
Task<IEnumerable<LauncherItem>
## claude-code식 transcript
- : 2026-04-09 13:05 (KST)
- AgentTranscriptDisplayCatalog를 row presentation hinking / waiting / compact / tool activity / permission / tool result / status를 transcript row .
- ChatWindow.AgentEventRendering은 process feed GroupKey , Cowork/Code append transcript에 .
- PermissionRequestPresentationCatalog, ToolResultPresentationCatalog를 / , transcript popup이 .
- ChatWindow.FooterPresentation은 execution event가 / , Cowork/Code footer .
-
ender_messages processFeedAppends, processFeedMerges,
owKindCounts를 %APPDATA%\\AxCopilot\\perf transcript grouping .
## 9. ??
###
```bash
dotnet build src/AxCopilot/AxCopilot.csproj
```
### 由대━??鍮뚮뱶 (?⑥씪 ?뚯씪)
```bash
dotnet publish src/AxCopilot/AxCopilot.csproj -c Release -r win-x64 --self-contained
```
由대━??鍮뚮뱶 ?듭뀡:
- `PublishSingleFile`: ?⑥씪 ?ㅽ뻾 ?뚯씪
- `EnableCompressionInSingleFile`: ?뺤텞 ?곸슜
- `PublishReadyToRun`: AOT ?꾨━而댄뙆??- `DebugType=none`: ?붾쾭洹??щ낵 ?쒓굅
- `TrimMode=partial`: IL ?몃━諛?
### ?뚯뒪??
```bash
dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj
```
---
## 10. 踰꾩쟾 愿€由?
- `AxCopilot.csproj`??`<Version>` ?쒓렇 ?섎굹留?蹂€寃쏀븯硫????꾩껜??諛섏쁺
- ?ㅼ젙 ?ㅽ궎留?踰꾩쟾?€ `SettingsService.cs` ??`CurrentSettingsVersion`?먯꽌 蹂꾨룄 愿€由?- 留덉씠洹몃젅?댁뀡: `SettingsService`媛€ ?댁쟾 踰꾩쟾 ?ㅼ젙 ?뚯씪???먮룞 ?낃렇?덉씠??
---
## 11. 蹂댁븞
| ??ぉ | 援ы쁽 |
|------|------|
| API ???€??| DPAPI ?뷀샇??(System.Security.Cryptography.ProtectedData) |
| ??愿€由??꾧뎄 | AxKeyEncryptor (蹂꾨룄 ?좏떥由ы떚) |
| ?덊떚 ?ы띁 | ?붾쾭嫄??붿뺨?뚯씪??媛먯? (Release 鍮뚮뱶, `Security/AntiTamper.cs`) |
| Unsafe 肄붾뱶 | `AllowUnsafeBlocks=true` (ScreenCaptureHandler ?ъ씤???곗궛?? |
---
## 12. ?깅뒫 理쒖쟻???댁뿭
### ?좏쑕 CPU 理쒖쟻??(2026-04-09)
| ?€??| 蹂€寃???| 蹂€寃???|
|------|---------|---------|
| PerformanceMonitorService ?대쭅 | 2珥?| 5珥?|
| ?꾩젽 ?€?대㉧ | 1珥?| 3珥?|
| ?덉씤蹂댁슦 湲€濡쒖슦 ?€?대㉧ | 150ms | 300ms |
| ServerStatusService ??| 15珥?| 60珥?|
### ?ㅽ듃由щ컢 ?뚮뜑留?理쒖쟻??(2026-04-09)
- **TypingTimer**: 50ms ??80ms, `string.Concat` ??`char[]` 踰꾪띁 ?ъ궗??- **CursorTimer**: ?꾩껜 臾몄옄???ъ깮????留덉?留?臾몄옄留?援먯껜
- **StringBuilder.ToString()**: 30ms 理쒖냼 媛꾧꺽 ?곕줈?€留?- **RenderMessages**: ?ㅽ듃由щ컢 以?遺덊븘?뷀븳 ?꾩껜 ?щ젋?붾쭅 諛⑹? (議곌린 諛섑솚)
- **?€?꾨씪???대깽??*: ?묓엺 紐⑤뱶?먯꽌 ?곗냽 ?숈씪 ToolCall 蹂묓빀
### ?고????덉젙???섏젙 (2026-04-09)
| ?뚯씪 | ?섏젙 ?댁슜 |
|------|----------|
| `CsvSkill.cs` | JSON 諛곗뿴 泥??붿냼 `ValueKind` 寃€利?異붽? |
| `HtmlSkill.cs` | gradient `Split(',')` 寃곌낵 `Length >= 2` 媛€??異붽? |
| `ChatWindow.xaml.cs` | `ParseGenericAction` 鍮?諛곗뿴 媛€?? `ShowDropActionMenu` null 媛€?? `GetAgentLoop` `.FirstOrDefault()` ?꾪솚 |
| `ChatWindow.GitBranchPresentation.cs` | async void ?몃뱾??try/catch 蹂댄샇 |
| `ChatWindow.xaml.cs` (BtnGitBranch_Click) | async void ?몃뱾??try/catch 蹂댄샇 |
### UI ?ㅻ젅??遺€??理쒖쟻??2李?(2026-04-09)
| ?€??| 蹂€寃???| 蹂€寃???| ?④낵 |
|------|---------|---------|------|
| ?ㅽ겕濡??좊땲硫붿씠??| 留ㅻ쾲 ??16ms ?€?대㉧ ?앹꽦 | ?ъ궗??32ms ?€?대㉧ 1媛?| GC ?뺣젰 + ?€?대㉧ ?꾩쟻 ?댁냼 |
| ?ъ씠?쒕컮 ?좊땲硫붿씠??| 留ㅻ쾲 ??10ms ?€?대㉧ ?앹꽦 | ?ъ궗??32ms ?€?대㉧ 1媛?| ?숈씪 |
| Git 釉뚮옖移?UI | `Dispatcher.Invoke` (釉붾줈?? | `Dispatcher.InvokeAsync` (?쇰툝濡쒗궧) | UI ?ㅻ젅??李⑤떒 ?댁냼 |
| ?좏겙 ?ъ슜????| 留?250ms PathGeometry ?ъ깮??| 1% 誘몃쭔 蹂€?????뚮뜑留??앸왂 | 遺덊븘?뷀븳 ?덉씠?꾩썐 ?곗궛 ?쒓굅 |
| ?€??寃€???€?대㉧ | 140ms | 300ms | 珥덈떦 7????3??|
| ?먯씠?꾪듃 ?대깽???€?대㉧ | 140ms (?ㅽ듃由щ컢: 300/420) | 200ms (?ㅽ듃由щ컢: 350/500) | ?대깽??泥섎━ 鍮덈룄 ?꾪솕 |
| 諛섏쓳???덉씠?꾩썐 ?€?대㉧ | 120ms | 250ms | 由ъ궗?댁쫰 ?붾컮?댁뒪 媛뺥솕 |
| ?€??紐⑸줉 LINQ | Where횞2 + Count횞3 = 由ъ뒪??5???쒗쉶 | Where 1??蹂묓빀 + ?⑥씪 猷⑦봽 移댁슫??| ?좊떦/?쒗쉶 ?€??媛먯냼 |
### 援ъ“??硫붾え由??덉젙???섏젙 (2026-04-09)
| 臾몄젣 | ?꾩튂 | ?섏젙 |
|------|------|------|
| Events 而щ젆??臾댄븳 ?깆옣 | `AgentLoopService.cs` | 500媛?珥덇낵 ???ㅻ옒???대깽???먮룞 ?쒓굅 |
| ?뚯씪 釉뚮씪?곗? ?€?대㉧ 醫€鍮?| `ChatWindow.FileBrowserPresentation.cs` | 留ㅻ쾲 ???€?대㉧ ?앹꽦 ???ъ궗???⑦꽩 |
| ?섎━癒쇳듃 罹먯떆 誘몄젙由?| `ChatWindow.TranscriptVirtualization.cs` | 蹂댁쑀 ?쒕룄 240??20, 1.5諛?珥덇낵 ???뺣━ |
| WorkflowAnalyzer UI 釉붾줈??| `WorkflowAnalyzerWindow.xaml.cs` | `Dispatcher.Invoke` ??`InvokeAsync` |
### 援ъ“??由ы뙥?좊쭅 P1 (2026-04-09)
| ?€??| ?뚯씪 | 蹂€寃?|
|------|------|------|
| ?명겕由щ찘???뚮뜑 hiddenCount ?덉젙??| `ChatWindow.TranscriptRenderPlanner.cs` | ?ㅽ듃由щ컢 以?hiddenCount 媛먯냼 李⑤떒 ??prefix ??遺덉씪移섎줈 ?명븳 ?꾩껜 ?щ퉴???대갚 諛⑹? |
| 鍮꾧????뚮뜑 李⑤떒 | `ChatWindow.TranscriptRendering.cs` | 理쒖냼???④? ?곹깭?먯꽌 RenderMessages 利됱떆 諛섑솚 ??遺덊븘?뷀븳 UI ?ш뎄異??쒓굅 |
| ConversationList ?대깽???꾩엫 | `ChatWindow.ConversationListPresentation.cs` | ??ぉ??5媛??뚮떎 ?몃뱾????ConversationPanel???⑥씪 ?꾩엫 ?몃뱾??(Tag 湲곕컲 遺꾧린). ???꾪솚 ??250媛??몃뱾???꾩쟻 ?댁냼 |
| TopicPreset ?대깽???꾩엫 | `ChatWindow.TopicPresetPresentation.cs` | 移대뱶??3媛??뚮떎 ?몃뱾????TopicButtonPanel???⑥씪 ?꾩엫 ?몃뱾?? ???꾪솚 ??45媛??몃뱾???꾩쟻 ?댁냼 |
| 怨듯넻 VisualTree ?ы띁 | `ChatWindow.VisualInteractionHelpers.cs` | `FindAncestorWithTag<T>`, `FindAncestor<T>` ?좏떥 異붽? |
### 援ъ“??由ы뙥?좊쭅 P2 (2026-04-09)
| ?€??| ?뚯씪 | 蹂€寃?|
|------|------|------|
| _agentLiveContainer ?명겕由щ찘???덉슜 | `TranscriptRenderPlanner.cs`, `TranscriptRenderExecution.cs` | ?쇱씠釉?而⑦뀒?대꼫瑜?expectedChildCount???ы븿, ?명겕由щ찘?????꾩떆 遺꾨━/?ъ궫????`hasExternalChildren` 李⑤떒 ?댁냼 |
| ?ㅽ듃由щ컢 append-only ?뚮뜑 | `TranscriptRenderExecution.cs`, `TranscriptRendering.cs` | prefix 鍮꾧탳 ?고쉶?섎뒗 `TryApplyStreamingAppendRender` 異붽? ??stable ??遺€遺꾩쭛??愿€怨꾨쭔 ?뺤씤, ????ぉ留?異붽? |
| Permission ?대깽???꾩엫 | `ChatWindow.PermissionPresentation.cs` | ?됰떦 4媛??뚮떎 ??PermissionItems???⑥씪 ?꾩엫 ?몃뱾??+ `PermissionItemTag` |
| Preview ???대깽???꾩엫 | `ChatWindow.PreviewPresentation.cs` | ??떦 7媛??뚮떎 ??PreviewTabPanel???⑥씪 ?꾩엫 ?몃뱾??+ `PreviewTabTag` |
| GitBranch ?대깽???꾩엫 | `ChatWindow.GitBranchPresentation.cs`, `SelectionPopupPresentation.cs` | `CreateFlatPopupRow`/`CreatePopupMenuRow` ?됱쓽 ?뚮떎 ??GitBranchItems???⑥씪 ?꾩엫 + `PopupRowTag` |
### 援ъ“??由ы뙥?좊쭅 P3 (2026-04-09)
| ?€??| ?뚯씪 | 蹂€寃?|
|------|------|------|
| FileBrowser 紐낆떆???댁젣 | `ChatWindow.FileBrowserPresentation.cs` | TreeViewItem ?뚮떎?믩챸紐?硫붿꽌??`FileTreeItem_Expanded/DoubleClick/RightClick`) ?꾪솚. `BuildFileTree()` ??`DetachFileTreeHandlers()` ?ш? ?몄텧濡?Clear ???몃뱾???댁젣. ?몃━ ?ш뎄異뺣떦 300媛??몃뱾???꾩쟻 ?댁냼 |
## claude-code식 transcript 표시 구조 정리
- 업데이트: 2026-04-09 13:05 (KST)
- AgentTranscriptDisplayCatalog를 row presentation 중심으로 재구성해 hinking / waiting / compact / tool activity / permission / tool result / status를 개별 transcript row 의미로 다룰 수 있게 정리했습니다.
- ChatWindow.AgentEventRendering은 process feed 계열 이벤트를 같은 GroupKey 단위로 병합해, 긴 Cowork/Code 실행 중 append 수를 줄이면서도 주요 활동 흐름이 기본 transcript에 남도록 조정했습니다.
- PermissionRequestPresentationCatalog, ToolResultPresentationCatalog를 다시 정리해 권한 요청과 도구 결과를 행위/상태 기준으로 구분하고, transcript 렌더와 popup이 같은 메타를 공유하도록 맞췄습니다.
- ChatWindow.FooterPresentation은 execution event가 생긴 뒤에는 프리셋 안내 카드를 자동으로 숨기도록 바꿔 결과/진행 화면을 덮지 않게 했고, Cowork/Code 입력 워터마크와 footer 기본 문구도 정상 한국어 기준으로 다시 정리했습니다.
-
ender_messages 성능 로그에는 processFeedAppends, processFeedMerges,
owKindCounts를 함께 남겨 %APPDATA%\\AxCopilot\\perf 기준으로 transcript grouping 효과를 수치로 비교할 수 있게 했습니다.
## 13. ?붾젆?좊━蹂?媛€?대뱶
| ?붾젆?좊━ | ?섏젙 ??二쇱쓽?ы빆 |
|---------|----------------|
| `Core/` | `FuzzyEngine` ?먯닔 怨듭떇 蹂€寃???寃€???덉쭏??吏곸젒 ?곹뼢 |
| `Handlers/` | ???몃뱾??異붽? ??`App.xaml.cs`???깅줉 ?꾩슂 |
| `Services/Agent/` | ???꾧뎄 異붽? ??`ToolRegistry`???깅줉 + ?ㅽ궗 ?뚯씪(`.skill.md`) ?묒꽦 |
| `Themes/` | 由ъ냼????蹂€寃???紐⑤뱺 ?뚮쭏???숈씪?섍쾶 ?곸슜 ?꾩슂 |
| `Models/AppSettings.cs` | ?띿꽦 異붽? ??`SettingsService` 留덉씠洹몃젅?댁뀡 怨좊젮 |
| `Views/ChatWindow.*` | partial class 遺꾪븷 ??愿€??湲곕뒫?€ ?대떦 ?뚯씪?먯꽌 ?섏젙 |
---
## 14. 愿€??臾몄꽌
| 臾몄꽌 | ?댁슜 |
|------|------|
| `docs/AGENT_ROADMAP.md` | ?먯씠?꾪듃 湲곕뒫 濡쒕뱶留?|
| `docs/LAUNCHER_ROADMAP.md` | ?곗쿂 湲곕뒫 濡쒕뱶留?|
| `docs/CLAW_CODE_PARITY_PLAN.md` | Claude Code 湲곕뒫 ?€??怨꾪쉷 |
| `docs/TOOL_PARITY_REPORT.md` | ?꾧뎄 ?명솚??由ы룷??|
| `docs/AX_AGENT_UI_CHECKLIST.md` | ?먯씠?꾪듃 UI 泥댄겕由ъ뒪??|
| `docs/UI_UX_CHECKLIST.md` | UI/UX 泥댄겕由ъ뒪??|
---
### ?좏깮???먯깋 援ъ“ 媛쒖꽑 (2026-04-09 10:36 KST)
- `claude-code`??`Glob/Grep/FileRead` ?꾨\?꾪듃?€ `toolOrchestration.ts` ?먮쫫???ㅼ떆 ?€議고븳 寃곌낵, AX??`folder_map`???덈Т ?쎄쾶 癒쇱? ?몄텧?섎룄濡??좊룄?섎뒗 洹쒖튃 ?뚮Ц??吏덈Ц怨?臾닿????꾩껜 ?뚰겕?ㅽ럹?댁뒪瑜??묐뒗 寃쏀뼢???덉뿀?듬땲??
- `src/AxCopilot/Views/ChatWindow.xaml.cs`
- Cowork/Code ?쒖뒪???꾨\?꾪듃?먯꽌 `folder_map`????긽 泥??④퀎濡??붽뎄?섎뜕 臾멸뎄瑜??꾪솕?덉뒿?덈떎.
- 醫곸? 踰붿쐞??吏덈Ц?€ `glob/grep + targeted file_read`瑜??곗꽑?섍퀬, ?€?μ냼 ?꾩껜 援ъ“媛€ ?뺣쭚 ?꾩슂???뚮쭔 `folder_map`???곕룄濡?諛붽엥?듬땲??
- `src/AxCopilot/Services/Agent/FolderMapTool.cs`
- 湲곕낯 ?먯깋 depth瑜?`3 -
## claude-code식 transcript 표시 구조 정리
- 업데이트: 2026-04-09 13:05 (KST)
- AgentTranscriptDisplayCatalog를 row presentation 중심으로 재구성해 hinking / waiting / compact / tool activity / permission / tool result / status를 개별 transcript row 의미로 다룰 수 있게 정리했습니다.
- ChatWindow.AgentEventRendering은 process feed 계열 이벤트를 같은 GroupKey 단위로 병합해, 긴 Cowork/Code 실행 중 append 수를 줄이면서도 주요 활동 흐름이 기본 transcript에 남도록 조정했습니다.
- PermissionRequestPresentationCatalog, ToolResultPresentationCatalog를 다시 정리해 권한 요청과 도구 결과를 행위/상태 기준으로 구분하고, transcript 렌더와 popup이 같은 메타를 공유하도록 맞췄습니다.
- ChatWindow.FooterPresentation은 execution event가 생긴 뒤에는 프리셋 안내 카드를 자동으로 숨기도록 바꿔 결과/진행 화면을 덮지 않게 했고, Cowork/Code 입력 워터마크와 footer 기본 문구도 정상 한국어 기준으로 다시 정리했습니다.
-
ender_messages 성능 로그에는 processFeedAppends, processFeedMerges,
owKindCounts를 함께 남겨 %APPDATA%\\AxCopilot\\perf 기준으로 transcript grouping 효과를 수치로 비교할 수 있게 했습니다.
### transcript row 怨꾩빟 諛?activity grouping ?뺣━ (2026-04-09 11:12 KST)
- `claude-code`??`Messages.tsx`, `MessageRow.tsx`, `GroupedToolUseContent.tsx`, `UserToolResultMessage`, `PermissionRequest`瑜??ㅼ떆 ?€議고빐 AX transcript瑜?row ?€??以묒떖?쇰줈 ?뺣━?덉뒿?덈떎.
- `src/AxCopilot/Services/Agent/AgentTranscriptDisplayCatalog.cs`
- `TranscriptRowKind`, `AgentTranscriptRowPresentation`??異붽??덉뒿?덈떎.
- thinking / waiting / compact / tool activity / permission / tool result / status瑜??섎굹??移댄깉濡쒓렇?먯꽌 ?뺢퇋?뷀븯?꾨줉 諛붽엥?듬땲??
- process feed row??`GroupKey`, `CanGroup`, `Emphasize` 硫뷀?瑜??④퍡 怨꾩궛???뚮뜑?ш? 怨좊퉰???대깽?몃? ???곸? ?됱쑝濡?臾띠쓣 ???덇쾶 ?덉뒿?덈떎.
- `src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs`
- process feed ?뚮뜑媛€ row presentation??吏곸젒 諛쏆븘 ?쒕ぉ/?ㅻ챸/媛뺤“ ?щ?瑜?援ъ꽦?섎룄濡?諛붽엥?듬땲??
- 媛숈? 醫낅쪟??read/search/step ?대깽?몃뒗 留덉?留?grouped row瑜?援먯껜?섎뒗 諛⑹떇?쇰줈 merge?섏뿬 append ?섎? 以꾩??듬땲??
- permission/result card??row 硫뷀??€ presentation catalog瑜???吏곸젒?곸쑝濡??ъ슜?섎룄濡??곌껐?덉뒿?덈떎.
- `src/AxCopilot/Services/Agent/ToolResultPresentationCatalog.cs`
- ?깃났/?ㅽ뙣/嫄곕?/痍⑥냼/?뱀씤 ?꾩슂/遺€遺??꾨즺瑜?clean??硫뷀? 援ъ“濡??ㅼ떆 ?뺣━?덉뒿?덈떎.
- `src/AxCopilot/Services/Agent/PermissionRequestPresentationCatalog.cs`
- bash / powershell / command / web / mcp / skill / ask / file edit / file write / git / document / filesystem???됱쐞蹂?沅뚰븳 移대뱶 硫뷀?濡??ъ젙?섑뻽?듬땲??
- `src/AxCopilot/Views/ChatWindow.TranscriptHost.cs`
- transcript 珥덇린????grouped process feed ?곹깭?€ 移댁슫?곕룄 ?④퍡 由ъ뀑?섎룄濡?蹂닿컯?덉뒿?덈떎.
- `src/AxCopilot/Views/ChatWindow.TranscriptRendering.cs`
- performance log detail??`processFeedAppends`, `processFeedMerges`瑜?異붽???grouped activity row???④낵瑜??ㅼ궗??濡쒓렇?먯꽌 ?뺤씤?????덇쾶 ?덉뒿?덈떎.