Astra v2.2.41: /benchmark LLM 4-lens synthesis + Datacollect settings

- /benchmark now runs the full scan -> LLM 3-stage 4-lens synthesis ->
  markdown report pipeline, matching the Datacollect web app output
- Add settings: datacollectSynthesisTemperature (0.1), datacollectCrawlDepth,
  datacollectMaxPages, datacollectSavePath; new "Datacollect" Settings section
- Fix slash result not rendering (missing streamStart) and /benchmark URL
  parsing when natural language is appended
- Rename view container/view ids to g1nation-* to avoid conflict with the
  Antigravity built-in "Connect AI" extension
- Version bump 2.2.34 -> 2.2.41

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 13:22:26 +09:00
parent fce6938e1c
commit 9e7c7fe605
13 changed files with 666 additions and 59 deletions
+45
View File
@@ -45,6 +45,51 @@
</div>
</section>
<!-- Datacollect -->
<section class="section" data-section="datacollect">
<h2>Datacollect (slash 명령)</h2>
<p class="hint">채팅에서 <code>/research</code> · <code>/benchmark</code> · <code>/youtube</code> 를 입력하면 Datacollect Bridge로 위임됩니다. Bridge는 Datacollect 프로젝트에서 <code>npm run bridge</code> 로 실행해야 합니다.</p>
<div class="row">
<label for="dcBridgeUrl">Bridge URL</label>
<div class="input-group">
<input id="dcBridgeUrl" type="text" placeholder="http://127.0.0.1:3002" spellcheck="false" />
<button data-save="datacollect.bridgeUrl">저장</button>
</div>
</div>
<div class="row">
<label for="dcSavePath">결과물 저장 폴더</label>
<div class="input-group">
<input id="dcSavePath" type="text" placeholder="(비우면 Bridge 기본 위치)" spellcheck="false" />
<button data-save="datacollect.savePath">저장</button>
</div>
<small class="hint">/benchmark 등의 결과 markdown 저장 위치. 비워두면 Bridge의 <code>WIKI_RAW_PATH</code> 환경변수가 결정합니다 (코드에 절대경로 하드코딩 없음). 특정 폴더로 저장하려면 절대경로를 입력하세요.</small>
</div>
<div class="row">
<label for="dcCrawlDepth">크롤 깊이 기본값</label>
<div class="input-group narrow">
<input id="dcCrawlDepth" type="number" min="0" max="3" step="1" />
<button data-save="datacollect.crawlDepth">저장</button>
</div>
<small class="hint">/benchmark 사이트맵 크롤 깊이. 0=루트만, 1=직속 자식, 2=손자, 3=깊은 크롤. 명령어에서 <code>depth=N</code> 으로 그때그때 덮어쓸 수 있습니다.</small>
</div>
<div class="row">
<label for="dcMaxPages">최대 페이지 기본값</label>
<div class="input-group narrow">
<input id="dcMaxPages" type="number" min="1" max="20" step="1" />
<button data-save="datacollect.maxPages">저장</button>
</div>
<small class="hint">/benchmark 스캔 최대 페이지 수. 명령어에서 <code>pages=N</code> 으로 덮어쓸 수 있습니다 (Bridge 상한 20).</small>
</div>
<div class="row">
<label for="dcSynthTemp">합성 Temperature</label>
<div class="input-group narrow">
<input id="dcSynthTemp" type="number" min="0" max="2" step="0.05" />
<button data-save="datacollect.synthesisTemperature">저장</button>
</div>
<small class="hint">/benchmark LLM 4-렌즈 합성의 temperature. 낮을수록(0.1) 환각·깨진 문자가 줄고 결정적입니다. 기본 0.1 권장.</small>
</div>
</section>
<!-- Memory -->
<section class="section" data-section="memory">
<h2>메모리</h2>
+34
View File
@@ -24,6 +24,13 @@
const cnRefreshModels = $('cnRefreshModels');
const cnModelHint = $('cnModelHint');
// ---- Datacollect ----
const dcBridgeUrl = $('dcBridgeUrl');
const dcSavePath = $('dcSavePath');
const dcCrawlDepth = $('dcCrawlDepth');
const dcMaxPages = $('dcMaxPages');
const dcSynthTemp = $('dcSynthTemp');
// ---- Memory ----
const memEnabled = $('memEnabled');
const memShort = $('memShort');
@@ -113,6 +120,23 @@
vscode.postMessage({ type: 'connection.update', requestTimeout: Number(cnTimeout.value) })
);
// ---- Datacollect listeners ----
document.querySelector('[data-save="datacollect.bridgeUrl"]').addEventListener('click', () =>
vscode.postMessage({ type: 'datacollect.update', bridgeUrl: dcBridgeUrl.value })
);
document.querySelector('[data-save="datacollect.savePath"]').addEventListener('click', () =>
vscode.postMessage({ type: 'datacollect.update', savePath: dcSavePath.value })
);
document.querySelector('[data-save="datacollect.crawlDepth"]').addEventListener('click', () =>
vscode.postMessage({ type: 'datacollect.update', crawlDepth: Number(dcCrawlDepth.value) })
);
document.querySelector('[data-save="datacollect.maxPages"]').addEventListener('click', () =>
vscode.postMessage({ type: 'datacollect.update', maxPages: Number(dcMaxPages.value) })
);
document.querySelector('[data-save="datacollect.synthesisTemperature"]').addEventListener('click', () =>
vscode.postMessage({ type: 'datacollect.update', synthesisTemperature: Number(dcSynthTemp.value) })
);
// ---- Memory listeners ----
memEnabled.addEventListener('change', (e) =>
vscode.postMessage({ type: 'memory.update', memoryEnabled: e.target.checked })
@@ -338,6 +362,16 @@
? '모델 목록 가져오는 중…'
: `사이드바에서 선택한 모델이 여기에도 동기화됩니다. (${list.length}개 발견)`;
// ---- Datacollect ----
const dc = state.datacollect;
if (dc) {
setIfNotFocused(dcBridgeUrl, dc.bridgeUrl);
setIfNotFocused(dcSavePath, dc.savePath);
setIfNotFocused(dcCrawlDepth, dc.crawlDepth);
setIfNotFocused(dcMaxPages, dc.maxPages);
setIfNotFocused(dcSynthTemp, dc.synthesisTemperature);
}
// ---- Memory ----
const mem = state.memory;
memEnabled.checked = !!mem.memoryEnabled;