preview 상태 고정과 no-LSP 언어 fallback 마감
목적: - 긴 세션, compact, query view 생성 시점에도 tool_result preview 축약 상태를 더 안정적으로 유지합니다. - 격리 환경에서 로컬 LSP 서버가 없더라도 코드 탭이 언어별 정적 분석 힌트를 계속 제공하도록 마감합니다. - 설정/프롬프트/로드맵 문서까지 현재 구현 상태와 일치시키고 남은 고도화 범위를 정리합니다. 핵심 수정: - AgentQueryContextBuilder와 ContextCondenser가 query/compact 진입 전에 누락된 tool_result preview를 먼저 복원하도록 정리했습니다. - AgentToolResultBudget는 sourceMessages가 없는 호출에서도 현재 window의 tool_use_id preview를 재사용하도록 보강했습니다. - CodeLanguageCatalog에 언어별 manifest/build/test/lint fallback 힌트를 추가하고, LspTool은 LSP 서버 미가동 시 정적 fallback 안내를 반환하도록 변경했습니다. - SettingsViewModel, SettingsWindow, ChatWindow.SystemPromptBuilder에 Fallback 분석 설명과 LSP 미사용 시 대체 분석 지침을 반영했습니다. - AgentQueryContextBuilderTests를 새로 추가하고 AgentToolResultBudgetTests, CodeLanguageCatalogTests를 확장했습니다. - README.md, docs/DEVELOPMENT.md, docs/AGENT_ROADMAP.md, docs/NEXT_ROADMAP.md를 2026-04-15 08:32 (KST) 기준으로 갱신했습니다. 검증: - dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_lang_finish\\ -p:IntermediateOutputPath=obj\\verify_loop_lang_finish\\ - dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolResultBudgetTests|AgentQueryContextBuilderTests|CodeLanguageCatalogTests|ContextCondenserTests" -p:OutputPath=bin\\verify_loop_lang_finish_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_lang_finish_tests\\ (통과 20)
This commit is contained in:
@@ -27,6 +27,9 @@ public static class AgentQueryContextBuilder
|
||||
|
||||
public static AgentQueryContextWindowResult Build(IReadOnlyList<ChatMessage> sourceMessages)
|
||||
{
|
||||
if (sourceMessages is IList<ChatMessage> mutableSourceMessages)
|
||||
AgentMessageInvariantHelper.PopulateMissingToolResultPreviews(mutableSourceMessages);
|
||||
|
||||
if (sourceMessages.Count == 0)
|
||||
{
|
||||
return new AgentQueryContextWindowResult
|
||||
|
||||
@@ -27,10 +27,12 @@ public static class AgentToolResultBudget
|
||||
IReadOnlyList<ChatMessage>? sourceMessages = null)
|
||||
{
|
||||
var result = new AgentToolResultBudgetResult();
|
||||
AgentMessageInvariantHelper.PopulateMissingToolResultPreviews(messages);
|
||||
var sourceById = sourceMessages?
|
||||
.Where(message => !string.IsNullOrWhiteSpace(message.MsgId))
|
||||
.ToDictionary(message => message.MsgId, StringComparer.OrdinalIgnoreCase);
|
||||
var sourcePreviewByToolResultId = AgentMessageInvariantHelper.BuildToolResultPreviewMap(sourceMessages);
|
||||
var previewSourceMessages = sourceMessages ?? messages;
|
||||
var sourcePreviewByToolResultId = AgentMessageInvariantHelper.BuildToolResultPreviewMap(previewSourceMessages);
|
||||
var nonSystemIndexes = messages
|
||||
.Select((message, index) => new { message, index })
|
||||
.Where(x => !string.Equals(x.message.Role, "system", StringComparison.OrdinalIgnoreCase))
|
||||
|
||||
@@ -117,6 +117,8 @@ public static class ContextCondenser
|
||||
if (messages.Count < 6) return result;
|
||||
if (!force && !proactiveEnabled) return result;
|
||||
|
||||
AgentMessageInvariantHelper.PopulateMissingToolResultPreviews(messages);
|
||||
|
||||
// 현재 모델의 입력 토큰 한도
|
||||
var settings = llm.GetCurrentModelInfo();
|
||||
// 사용자가 설정한 컨텍스트 크기를 우선 사용. 미설정 시 모델별 기본값 적용.
|
||||
|
||||
@@ -23,6 +23,7 @@ public class LspTool : IAgentTool, IDisposable
|
||||
"- action=\"incoming_calls\": 현재 심볼을 호출하는 상위 호출자를 찾습니다\n" +
|
||||
"- action=\"outgoing_calls\": 현재 심볼이 호출하는 하위 호출 대상을 찾습니다\n" +
|
||||
$"지원 언어 서버: {Services.CodeLanguageCatalog.BuildLspSupportDescription()}\n" +
|
||||
$"정적 fallback: {Services.CodeLanguageCatalog.BuildFallbackSupportDescription()}\n" +
|
||||
"line/character는 기본적으로 1-based 입력을 기대하며, 0-based 값도 호환 처리합니다.";
|
||||
|
||||
public ToolParameterSchema Parameters => new()
|
||||
@@ -99,12 +100,16 @@ public class LspTool : IAgentTool, IDisposable
|
||||
// 언어 감지
|
||||
var language = DetectLanguage(filePath);
|
||||
if (language == null)
|
||||
return ToolResult.Fail($"지원하지 않는 파일 형식: {Path.GetExtension(filePath)}");
|
||||
return ToolResult.Ok(
|
||||
$"지원하지 않는 LSP 파일 형식: {Path.GetExtension(filePath)}\n\n" +
|
||||
Services.CodeLanguageCatalog.BuildFallbackSummary(filePath));
|
||||
|
||||
// LSP 클라이언트 시작 (캐시)
|
||||
var client = await GetOrCreateClientAsync(language, context.WorkFolder, ct);
|
||||
if (client == null || !client.IsConnected)
|
||||
return ToolResult.Fail($"{language} 언어 서버를 시작할 수 없습니다. 해당 언어 서버가 설치되어 있는지 확인하세요.");
|
||||
return ToolResult.Ok(
|
||||
$"{language} 언어 서버를 시작할 수 없습니다. 로컬 LSP 서버가 없거나 연결되지 않았습니다.\n\n" +
|
||||
Services.CodeLanguageCatalog.BuildFallbackSummary(filePath));
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user