v2.2.292-296: 메모리·발열 최적화 + Pixel Office 완전 제거 + 소형 모델 추론 강화(calculate/run_code/지식 스코프)

- v2.2.292 메모리·발열: 헬스체크 워크스페이스 쓰기→fs.access(워처 연쇄 제거)·git 검사 비동기 30분 주기,
  웹뷰 retainContextWhenHidden 정리(채팅만 유지), 브레인 인덱스 유휴 30분 TTL 해제,
  채팅 DOM 200개 상한, @lmstudio/sdk 지연 로드
- v2.2.293 Pixel Office 시각화 폐기: astraOffice 모듈·사이드바 매니저 3종·스프라이트 17MB 삭제,
  sidebarProvider collector 섹션 통삭제 (기업 모드 판단 로직 무변경, vsix 12.2MB→1.3MB)
- v2.2.294 도구 메뉴 'NotebookLM 백엔드 실행/종료' 버튼: OS 자동 감지, 프로젝트 자동 탐색+폴더 선택 저장,
  포트 정리 폴백 (터미널 없이 Research 백엔드 켜고 끄기)
- v2.2.295 추론 강화 1탄: [ACTION 16] <calculate> Python 계산 위임(결과 재주입·자가수정 루프),
  단계별 지식 스코프(General+Specialty, 결정적 도메인 분류, 설정 지식·기억 탭 UI)
- v2.2.296 추론 강화 2탄: [ACTION 17] <run_code> 실행 확인(stdout 회수→수정→재실행 루프),
  문법 오류 재주입 자가수정, 도구 라우팅 힌트(dynamicBlocks), Grounding rescue 도메인 스코프 확장
- 검증: jest 818 통과(신규 29개), tsc 무오류, esbuild 정상

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 18:59:47 +09:00
parent fa397d7fa1
commit bb7cd6b879
466 changed files with 1285 additions and 6588 deletions
+24 -6
View File
@@ -812,9 +812,28 @@
msgEl.appendChild(head); msgEl.appendChild(body);
msgEl.appendChild(actions);
chat.appendChild(msgEl); chat.scrollTop = chat.scrollHeight;
trimChatDom();
return { body, msgEl };
}
// [메모리 개선] 채팅 DOM 상한 — 이 웹뷰는 retainContextWhenHidden 이라 하루 종일 켜두면
// 메시지 노드가 무한히 쌓여 메모리가 단조 증가한다. 최근 MAX_CHAT_DOM_MESSAGES 개만
// DOM 에 유지하고 오래된 것부터 제거한다 (내용이 필요한 메시지는 Copy/Export 로 보존).
const MAX_CHAT_DOM_MESSAGES = 200;
let _trimNotice = null;
function trimChatDom() {
const msgs = chat.querySelectorAll(':scope > .msg');
const excess = msgs.length - MAX_CHAT_DOM_MESSAGES;
if (excess <= 0) return;
for (let i = 0; i < excess; i++) msgs[i].remove();
if (!_trimNotice || !_trimNotice.isConnected) {
_trimNotice = document.createElement('div');
_trimNotice.style.cssText = 'text-align:center;opacity:.55;font-size:11px;padding:6px 0;';
_trimNotice.textContent = '⏳ 오래된 메시지는 메모리 절약을 위해 화면에서 정리되었습니다';
}
chat.insertBefore(_trimNotice, chat.firstChild);
}
window.addEventListener('message', e => {
const msg = e.data;
switch(msg.type) {
@@ -1119,12 +1138,6 @@
chatEl.scrollTop = chatEl.scrollHeight;
break;
}
case 'pixelOfficeUpdate':
case 'officeSnapshot': {
// Pixel Office 채팅 배너는 v2.2.267 에서 제거 — 백엔드가 여전히 보내는
// 상태 메시지는 조용히 무시 (풀스크린 Astra Office 패널은 별도 webview 로 수신).
break;
}
case 'devilRebuttal': {
// Devil Agent (도현) 카드. main assistant 답변 직후 chat 하단에 한 장 추가.
// 사용자가 '재반박' 누르면 그 텍스트가 다음 user prompt 로 가서 main turn 한 번 더 돌고,
@@ -1928,6 +1941,11 @@
const syncBrain = () => { Sound.play(550, 'sine', 0.1); vscode.postMessage({ type: 'syncBrain' }); };
document.getElementById('brainBtn').onclick = syncBrain;
saveWikiRawBtn.onclick = () => vscode.postMessage({ type: 'saveWikiRaw' });
// NotebookLM 로컬 백엔드 (Datacollector Research 용) 실행/종료 — 터미널 없이 버튼으로.
const nlmBridgeStartBtn = document.getElementById('nlmBridgeStartBtn');
if (nlmBridgeStartBtn) nlmBridgeStartBtn.onclick = () => vscode.postMessage({ type: 'startNotebookLmBridge' });
const nlmBridgeStopBtn = document.getElementById('nlmBridgeStopBtn');
if (nlmBridgeStopBtn) nlmBridgeStopBtn.onclick = () => vscode.postMessage({ type: 'stopNotebookLmBridge' });
addBrainBtn.onclick = () => vscode.postMessage({ type: 'addBrain' });
// v2.2.67 — 만약 dropdown 이 'new' 상태로 굳어있어도 수정/삭제는 직전 유효 선택(또는 첫 실제 옵션)
// 을 기준으로 동작하도록 폴백. 이전엔 'new' 인 순간 그냥 early-return 해서 "수정 안 됨" 버그 발생.