v2.2.313~319: 보고 품질·조사 신뢰성 수술 + 네이버 쇼핑인사이트/검색어트렌드 연동
- 파트별 완성, 웹 실접속 증빙, 턴 의도 브리핑, 본문 불일치 검증, 하위 질문 체크리스트, 사이트 심층 수집 (PATCHNOTES.md v2.2.313~318 참조) - /naver-shopping, /naver-trend: 네이버 데이터랩 API 연동. compare/discover 자동 판별, API 배치 상한 캡슐화, 카테고리 트리 fuzzy 매칭, 자격증명은 Astra 설정 패널 SecretStorage 로 관리
This commit is contained in:
@@ -392,6 +392,36 @@
|
||||
<div id="googleError" class="error" hidden></div>
|
||||
</section>
|
||||
|
||||
<!-- Naver Trend (쇼핑인사이트 / 검색어트렌드) -->
|
||||
<section class="section" data-section="naver" data-tab="integrations">
|
||||
<h2>Naver Trend (쇼핑인사이트 · 검색어트렌드)</h2>
|
||||
<p class="hint"><code>/naver-shopping</code>, <code>/naver-trend</code> 명령이 쓰는 NAVER API HUB 자격증명. <a href="https://www.ncloud.com/product/applicationService/naverApiHub" target="_blank">NAVER API HUB</a> 콘솔의 Application → 인증 정보에서 Client ID/Secret 발급.</p>
|
||||
|
||||
<div class="row">
|
||||
<label>현재 상태</label>
|
||||
<div class="readout" id="naverStatus">—</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<label for="naverClientId">Client ID</label>
|
||||
<div class="input-group">
|
||||
<input id="naverClientId" type="password" placeholder="X-NCP-APIGW-API-KEY-ID" autocomplete="off" spellcheck="false" />
|
||||
<button data-save="naver.clientId">저장</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<label for="naverClientSecret">Client Secret</label>
|
||||
<div class="input-group">
|
||||
<input id="naverClientSecret" type="password" placeholder="X-NCP-APIGW-API-KEY" autocomplete="off" spellcheck="false" />
|
||||
<button data-save="naver.clientSecret">저장</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="naverFeedback" class="feedback" hidden></div>
|
||||
<div id="naverError" class="error" hidden></div>
|
||||
</section>
|
||||
|
||||
<!-- Cloud LLM Providers -->
|
||||
<section class="section" data-section="providers" data-tab="model">
|
||||
<h2>Cloud LLM Providers</h2>
|
||||
|
||||
@@ -98,6 +98,11 @@
|
||||
const prGeminiKey = $('prGeminiKey');
|
||||
const prGeminiDefault = $('prGeminiDefault');
|
||||
|
||||
// ---- Naver Trend ----
|
||||
const naverStatus = $('naverStatus');
|
||||
const naverClientId = $('naverClientId');
|
||||
const naverClientSecret = $('naverClientSecret');
|
||||
|
||||
// ---- Banner ----
|
||||
const bannerError = $('bannerError');
|
||||
|
||||
@@ -300,6 +305,16 @@
|
||||
vscode.postMessage({ type: 'providers.update', providerId: 'gemini', defaultModel: prGeminiDefault.value })
|
||||
);
|
||||
|
||||
// ---- Naver Trend listeners ----
|
||||
document.querySelector('[data-save="naver.clientId"]').addEventListener('click', () => {
|
||||
vscode.postMessage({ type: 'naver.update', clientId: naverClientId.value });
|
||||
naverClientId.value = '';
|
||||
});
|
||||
document.querySelector('[data-save="naver.clientSecret"]').addEventListener('click', () => {
|
||||
vscode.postMessage({ type: 'naver.update', clientSecret: naverClientSecret.value });
|
||||
naverClientSecret.value = '';
|
||||
});
|
||||
|
||||
document.querySelector('[data-save="advanced.ctxSize"]').addEventListener('click', () =>
|
||||
vscode.postMessage({ type: 'advanced.update', maxContextSize: Number(advCtxSize.value) })
|
||||
);
|
||||
@@ -552,6 +567,15 @@
|
||||
prGeminiKey.placeholder = pr.gemini.hasApiKey ? '••• 저장됨 (덮어쓰려면 새 값)' : 'AIzaSy...';
|
||||
setIfNotFocused(prGeminiDefault, pr.gemini.defaultModel);
|
||||
}
|
||||
|
||||
// ---- Naver Trend ----
|
||||
const nv = state.naver;
|
||||
if (nv) {
|
||||
naverClientId.placeholder = nv.hasCredentials ? '••• 저장됨 (덮어쓰려면 새 값 입력)' : 'X-NCP-APIGW-API-KEY-ID';
|
||||
naverClientSecret.placeholder = nv.hasCredentials ? '••• 저장됨 (덮어쓰려면 새 값 입력)' : 'X-NCP-APIGW-API-KEY';
|
||||
naverStatus.textContent = nv.hasCredentials ? '✅ Client ID/Secret 설정됨' : '⛔ 미설정 — /naver-shopping, /naver-trend 사용 불가';
|
||||
naverStatus.style.color = nv.hasCredentials ? '#10b981' : '';
|
||||
}
|
||||
}
|
||||
|
||||
// ---- Tabs (카테고리 네비) — 표현 계층만. 기존 refs/리스너/state 에 무영향 ----
|
||||
|
||||
Reference in New Issue
Block a user