feat(core): 자기지식 접지·웹 접근·환경 자가점검 — 할루시네이션 방어 3중화 (v2.2.247)
- Alignment Self-Learning: 자가 조사(질문 전 두뇌 검색)·사용자 답변 두뇌 저장·핵심메시지/프로젝트 컨텍스트 주입 (alignmentResearch.ts 신규)
- 웹 접근: Bridge 폴백 직접 fetch(webFetch.ts 신규)·<fetch_url> 액션 태그·기업 모드 URL/아키텍처 컨텍스트 주입·bare 도메인 인식
- 트리거 버그 수정: startsWith('/') 가 절대경로를 슬래시 명령으로 오인 — 분석 지시·URL 주입 전멸 원인 (회귀 테스트 고정)
- 자기지식 접지: 기능 인벤토리 lazy 재생성·학습 메커니즘 정본 섹션·[인벤토리 대조] 태그 의무화·결정론적 재구현 제안 정정 훅(featureConceptMap.ts 신규)
- 환경 자가점검: HealthCheckMonitor 에 Bridge/두뇌 볼륨/git 자격증명/확장 버전 검사 4종 + readyBar ⚠ 표시
- 두뇌 동기화: 원격 미설정 시 로컬 새로고침 모드·staged 기준 commit 판정·인증 부재 안내
- 기타: outputFormat 기본 markdown(제목 렌더 복구)·레슨/행동제약 truncation 보호 구역 이동·[CONTEXT] 절단 우선순위 재정렬
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1037,6 +1037,17 @@
|
||||
border-left: 2px solid var(--accent);
|
||||
background: rgba(99,102,241,0.04);
|
||||
}
|
||||
.company-alignment-card .cal-self-research {
|
||||
margin-top: 6px; padding: 6px 8px;
|
||||
border-left: 2px solid #22c55e;
|
||||
background: rgba(34,197,94,0.05);
|
||||
}
|
||||
.company-alignment-card .cal-self-research ul {
|
||||
margin: 4px 0 4px 16px; padding: 0;
|
||||
}
|
||||
.company-alignment-card .cal-self-research li {
|
||||
margin-bottom: 2px; color: var(--text-primary);
|
||||
}
|
||||
.company-alignment-card .cal-q-head {
|
||||
font-weight: 600; color: var(--text-bright); margin-bottom: 4px;
|
||||
}
|
||||
|
||||
+31
-1
@@ -416,10 +416,15 @@
|
||||
if (s.lmStudioError) {
|
||||
segs.push(`<span class="rb-seg bad" title="${escAttr(s.lmStudioError)}">⚠ LM Studio 로드 실패</span>`);
|
||||
}
|
||||
// 환경 전제 조건 경고 (Bridge·두뇌 볼륨·자격증명·확장 버전) — 전체 목록은 hover.
|
||||
if (Array.isArray(s.healthWarnings) && s.healthWarnings.length > 0) {
|
||||
segs.push(`<span class="rb-seg bad" title="${escAttr(s.healthWarnings.join('\n'))}">⚠ 환경 ${s.healthWarnings.length}건</span>`);
|
||||
}
|
||||
rbContent.innerHTML = segs.join('<span class="rb-sep">·</span>');
|
||||
if (rbDot) {
|
||||
const on = s.engine && s.engine.online;
|
||||
rbDot.className = 'rb-dot ' + (on === true ? 'ok' : on === false ? 'bad' : 'warn');
|
||||
const hasEnvWarn = Array.isArray(s.healthWarnings) && s.healthWarnings.length > 0;
|
||||
rbDot.className = 'rb-dot ' + (on === false ? 'bad' : hasEnvWarn ? 'warn' : on === true ? 'ok' : 'warn');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1205,6 +1210,31 @@
|
||||
summary.appendChild(dl('형식', c.format));
|
||||
card.appendChild(summary);
|
||||
|
||||
// ── 자가 조사로 해결된 항목 — 묻기 전에 두뇌에서 스스로 찾은 답 ──
|
||||
const SELF_RESEARCH_PREFIX = '(자가 조사로 두뇌에서 확인) ';
|
||||
if (Array.isArray(c.answeredQuestions)) {
|
||||
const selfResearched = c.answeredQuestions
|
||||
.filter((qa) => qa && typeof qa.a === 'string' && qa.a.startsWith(SELF_RESEARCH_PREFIX))
|
||||
.slice(0, 3);
|
||||
if (selfResearched.length > 0) {
|
||||
const srBlock = document.createElement('div');
|
||||
srBlock.className = 'cal-self-research';
|
||||
const srHead = document.createElement('div');
|
||||
srHead.className = 'cal-q-head';
|
||||
srHead.textContent = '🔎 스스로 확인한 정보 (두뇌 검색):';
|
||||
srBlock.appendChild(srHead);
|
||||
const srUl = document.createElement('ul');
|
||||
for (const qa of selfResearched) {
|
||||
const li = document.createElement('li');
|
||||
const ans = qa.a.slice(SELF_RESEARCH_PREFIX.length);
|
||||
li.textContent = `${qa.q} → ${ans.length > 150 ? ans.slice(0, 150) + '…' : ans}`;
|
||||
srUl.appendChild(li);
|
||||
}
|
||||
srBlock.appendChild(srUl);
|
||||
card.appendChild(srBlock);
|
||||
}
|
||||
}
|
||||
|
||||
// ── 미해결 질문 ──
|
||||
if (Array.isArray(c.openQuestions) && c.openQuestions.length > 0 && v.kind === 'questions') {
|
||||
const qBlock = document.createElement('div');
|
||||
|
||||
Reference in New Issue
Block a user