feat(astra): 이메일 Settings 패널 섹션 (자동동기화 토글 + 지금 동기화 + 인덱스 상태)

Astra Settings 패널에 Email 섹션 추가 — autoSync 토글, 간격/범위/최대수 설정,
'지금 동기화' 버튼(슬래시와 동일 syncEmails 코어), 인덱스 상태(건수/최신일) 표시.
VSCode 설정 JSON 안 건드리고 패널에서 관리. 타입체크·빌드 통과.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-05 18:39:41 +09:00
parent 7e96e56381
commit eb4bef0744
3 changed files with 173 additions and 0 deletions
+41
View File
@@ -34,6 +34,15 @@
const dcMaxPages = $('dcMaxPages');
const dcSynthTemp = $('dcSynthTemp');
// ---- Email (Project Astra) ----
const emailStatus = $('emailStatus');
const emailAutoSync = $('emailAutoSync');
const emailInterval = $('emailInterval');
const emailDays = $('emailDays');
const emailMax = $('emailMax');
const emailSyncNow = $('emailSyncNow');
const emailSyncMsg = $('emailSyncMsg');
// ---- Memory ----
const memEnabled = $('memEnabled');
const memShort = $('memShort');
@@ -153,6 +162,23 @@
vscode.postMessage({ type: 'datacollect.update', synthesisTemperature: Number(dcSynthTemp.value) })
);
// ---- Email listeners ----
emailAutoSync.addEventListener('change', () =>
vscode.postMessage({ type: 'email.update', autoSync: emailAutoSync.checked })
);
document.querySelector('[data-save="email.interval"]').addEventListener('click', () =>
vscode.postMessage({ type: 'email.update', autoSyncIntervalMinutes: Number(emailInterval.value) })
);
document.querySelector('[data-save="email.days"]').addEventListener('click', () =>
vscode.postMessage({ type: 'email.update', syncDays: Number(emailDays.value) })
);
document.querySelector('[data-save="email.max"]').addEventListener('click', () =>
vscode.postMessage({ type: 'email.update', syncMaxMessages: Number(emailMax.value) })
);
emailSyncNow.addEventListener('click', () =>
vscode.postMessage({ type: 'email.syncNow' })
);
// ---- Memory listeners ----
memEnabled.addEventListener('change', (e) =>
vscode.postMessage({ type: 'memory.update', memoryEnabled: e.target.checked })
@@ -409,6 +435,21 @@
setIfNotFocused(dcSynthTemp, dc.synthesisTemperature);
}
// ---- Email (Project Astra) ----
const em = state.email;
if (em) {
if (document.activeElement !== emailAutoSync) emailAutoSync.checked = !!em.autoSync;
setIfNotFocused(emailInterval, em.autoSyncIntervalMinutes);
setIfNotFocused(emailDays, em.syncDays);
setIfNotFocused(emailMax, em.syncMaxMessages);
emailStatus.textContent = em.indexedCount > 0
? `${em.indexedCount}건 저장됨${em.newestDate ? ` · 최신 ${em.newestDate}` : ''}`
: '수집된 메일 없음 — "지금 동기화" 또는 /email-sync 실행';
emailSyncMsg.textContent = em.lastSyncMessage || '';
emailSyncNow.disabled = !!em.syncing;
emailSyncNow.textContent = em.syncing ? '동기화 중…' : '지금 동기화';
}
// ---- Memory ----
const mem = state.memory;
memEnabled.checked = !!mem.memoryEnabled;