chore: version up to 2.80.36 and package with UI/UX refinement

This commit is contained in:
g1nation
2026-05-12 23:41:18 +09:00
parent f6b27a125b
commit e0af15767a
15 changed files with 390 additions and 149 deletions
+36 -7
View File
@@ -334,6 +334,11 @@ export class AgentExecutor {
this.activeRunId = runId;
this.currentTaskId = `task_${Date.now()}`;
await this.context.workspaceState.update('lastActionStr', undefined);
// Clear last-turn retrieval telemetry up front: when a casual turn (or anything else) skips
// buildMemoryContext, the previous turn's value would otherwise leak into this turn's
// "참조 범위" footer (the exact "안녕 → 🔎 참조: 에피소드기억" bug).
this._lastRetrievalInfo = null;
this._lastLessonContents = [];
}
// 1. Prepare Context
@@ -503,7 +508,9 @@ export class AgentExecutor {
const astraStanceCtx = prompt && !isCasualConversation
? `\n\n${this.buildAstraStanceContext(prompt, localPathContext)}`
: '';
const v4PolicyCtx = [
// The v4 knowledge-management policy only matters when knowledge is actually in play —
// skip it for greetings/small talk so it doesn't dilute the [CASUAL CONVERSATION MODE] directive.
const v4PolicyCtx = isCasualConversation ? '' : [
"\n### 🏛️ 지식 관리 정책 v4.0 (Knowledge Management Policy Applied)",
"- [신뢰도] '의도적으로 작성된 글'은 Medium 이상의 신뢰도를 부여하여 최우선 근거로 활용할 것.",
"- [품질] 데이터의 양보다 '추론 기여 밀도'를 중시하여 핵심 위주로 깊이 있게 서술할 것.",
@@ -1505,19 +1512,41 @@ export class AgentExecutor {
return /(어떤\s*거?\s*같|어때|어떻게\s*생각|의견|판단|방향|설계|아키텍처|구조|자비스|생각.*정리|갈림길|architecture|design|direction|opinion|think|judge)/i.test(prompt);
}
/**
* Standalone greetings / acknowledgements / fillers — must match the *whole* (normalized) message.
* "안녕, 이 프로젝트 분석해줘" is NOT here because the work intent makes it longer than one phrase.
*/
private static readonly CASUAL_PHRASES = new Set<string>([
// greetings
'안녕', '안녕하세요', '안녕하십니까', '안뇽', '하이', '하잉', '헬로', '헬로우', 'hello', 'hi', 'hii', 'hey', 'yo', 'ㅎㅇ', 'ㅎㅇㅎㅇ', '굿모닝', 'good morning', 'morning', 'gm',
// farewells
'잘가', '잘가요', '안녕히', '안녕히가세요', '안녕히계세요', '바이', '바이바이', 'bye', 'byebye', 'bye bye', 'goodbye', 'good bye', '굿바이', '잘자', '잘자요', '굿나잇', 'good night', 'gn',
// acknowledgements / affirmations
'네', '넵', '넹', '예', '응', '웅', '음', '흠', '엄', '그래', '그렇구나', '그렇군', '그렇네', '오케이', '오케', 'ok', 'okay', 'okey', 'k', 'ㅇㅋ', 'ㅇㅇ', '알겠어', '알겠습니다', '알겠어요', '알았어', '알았다', '알았어요', 'yes', 'yeah', 'yep', 'yup', 'sure', '좋아', '좋아요', '좋네', '좋다', 'good', 'fine',
// negations (still small talk — needs no RAG; the prior turn is already in the chat history)
'아니', '아니요', '아니오', 'ㄴㄴ', 'no', 'nope', 'nah',
// thanks / praise
'고마워', '고마워요', '고맙습니다', '감사', '감사해요', '감사합니다', 'thanks', 'thank you', 'thx', 'ty', '굿', '굳', '굿잡', 'good job', '잘했어', '잘했네', '훌륭', '훌륭해', '대박', 'nice', 'cool', 'great', 'awesome', 'perfect', '완벽', '수고', '수고했어', '수고하셨습니다', '고생했어', '고생많았어',
// laughs / fillers
'lol', 'haha', 'hmm', 'hmmm', 'umm', 'uh',
]);
private isCasualConversationPrompt(prompt: string): boolean {
const normalized = (prompt || '')
.trim()
.replace(/[~!?.。!?\s]+$/g, '')
.replace(/\s+/g, ' ')
.replace(/[~!?.,,。!?·…\s]+$/g, '')
.toLowerCase();
if (!normalized) return false;
if (normalized.length > 40) return false;
// Greetings, acknowledgements, and light conversational nudges should
// not trigger Second Brain/RAG. Otherwise a single "안녕" can retrieve
// old project records and the model answers that stale context instead
// of the user's actual greeting.
return /^(안녕|안녕하세요|하이|헬로|hello|hi|hey|yo|ㅎㅇ|좋아|오케이|ok|okay|ㅇㅋ|고마워|감사|thanks|thank you|넵|네|응|음|흠|그래)$/.test(normalized);
// Greetings, acknowledgements, and light conversational nudges should not trigger
// Second Brain/RAG. Otherwise a single "안녕" can retrieve old project records and the
// model answers that stale context instead of the user's actual greeting.
if (AgentExecutor.CASUAL_PHRASES.has(normalized)) return true;
if (/^[ㅋㅎ]{2,}$/.test(normalized)) return true; // ㅋㅋ, ㅎㅎㅎ, ㅋㅎㅋㅎ
if (/^(?:ha){2,}h?$|^(?:he){2,}h?$/.test(normalized)) return true; // haha, hahaha, hehe
return false;
}
private isAstraModeArchitectureQuestion(prompt: string): boolean {