revert: ASTRA 이메일 기능 제거 — Datacollect wiki화로 피벗
Revert "feat(astra): 이메일 Settings 패널 섹션" (eb4bef0) Revert "feat(astra): Project Astra 이메일 자산화 Phase 1+2" (7e96e56) 방향 전환: 이메일은 ASTRA에 전용 소스로 넣는 대신 Datacollect가 수집·wiki화해 brain(제2뇌)에 저장하고, ASTRA는 기존 brain 검색으로 그대로 활용한다. Gmail 인증은 Datacollect 소유. /email-status(라이브 현황)는 폐기. gmailApi 파싱 로직은 Datacollect 이전 시 재사용 예정. 타입체크·빌드 통과. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -6,9 +6,6 @@ import type { TelegramBot } from '../../integrations/telegram/telegramBot';
|
||||
import { logError, logInfo } from '../../utils';
|
||||
import { discoverModels } from '../../lib/discoverModels';
|
||||
import { pickConfigTarget } from '../../lib/paths';
|
||||
import { getConfig } from '../../config';
|
||||
import { loadEmailRecords } from '../email/emailStore';
|
||||
import { syncEmails } from '../email/emailSync';
|
||||
|
||||
/**
|
||||
* Astra Settings webview.
|
||||
@@ -104,20 +101,6 @@ interface SettingsState {
|
||||
maxPages: number;
|
||||
synthesisTemperature: number;
|
||||
};
|
||||
email: {
|
||||
autoSync: boolean;
|
||||
autoSyncIntervalMinutes: number;
|
||||
syncDays: number;
|
||||
syncMaxMessages: number;
|
||||
/** 로컬 인덱스에 저장된 메일 수. */
|
||||
indexedCount: number;
|
||||
/** 가장 최근 메일 날짜(YYYY-MM-DD) — 없으면 ''. */
|
||||
newestDate: string;
|
||||
/** 마지막 '지금 동기화' 결과 메시지. */
|
||||
lastSyncMessage: string;
|
||||
/** 동기화 진행 중. */
|
||||
syncing: boolean;
|
||||
};
|
||||
google: {
|
||||
clientId: string;
|
||||
/** secret 자체는 client 에 echo 안 함 — *설정 여부* 만. true 면 input placeholder 가 "저장됨" 으로 바뀜. */
|
||||
@@ -165,10 +148,6 @@ export class SettingsPanelProvider implements vscode.WebviewViewProvider {
|
||||
|
||||
constructor(private readonly _deps: SettingsPanelDeps) {}
|
||||
|
||||
// Project Astra — 이메일 '지금 동기화' 상태(패널 표시용).
|
||||
private _emailSyncing = false;
|
||||
private _emailLastSyncMsg = '';
|
||||
|
||||
public resolveWebviewView(view: vscode.WebviewView): void {
|
||||
this._view = view;
|
||||
this._setupWebview(view.webview);
|
||||
@@ -279,12 +258,6 @@ export class SettingsPanelProvider implements vscode.WebviewViewProvider {
|
||||
case 'datacollect.update':
|
||||
await this._handleDatacollectUpdate(msg);
|
||||
return;
|
||||
case 'email.update':
|
||||
await this._handleEmailUpdate(msg);
|
||||
return;
|
||||
case 'email.syncNow':
|
||||
await this._handleEmailSyncNow();
|
||||
return;
|
||||
case 'google.update':
|
||||
await this._handleGoogleUpdate(msg);
|
||||
return;
|
||||
@@ -665,70 +638,6 @@ export class SettingsPanelProvider implements vscode.WebviewViewProvider {
|
||||
}
|
||||
}
|
||||
|
||||
// ────────────── Email (Project Astra) ──────────────
|
||||
|
||||
private async _handleEmailUpdate(msg: any): Promise<void> {
|
||||
if (typeof msg.autoSync === 'boolean') {
|
||||
await this._safeConfigUpdate('email.autoSync', msg.autoSync);
|
||||
}
|
||||
if (typeof msg.autoSyncIntervalMinutes === 'number' && Number.isFinite(msg.autoSyncIntervalMinutes)) {
|
||||
await this._safeConfigUpdate('email.autoSyncIntervalMinutes', Math.max(5, Math.min(1440, Math.floor(msg.autoSyncIntervalMinutes))));
|
||||
}
|
||||
if (typeof msg.syncDays === 'number' && Number.isFinite(msg.syncDays)) {
|
||||
await this._safeConfigUpdate('email.syncDays', Math.max(1, Math.min(365, Math.floor(msg.syncDays))));
|
||||
}
|
||||
if (typeof msg.syncMaxMessages === 'number' && Number.isFinite(msg.syncMaxMessages)) {
|
||||
await this._safeConfigUpdate('email.syncMaxMessages', Math.max(1, Math.min(2000, Math.floor(msg.syncMaxMessages))));
|
||||
}
|
||||
}
|
||||
|
||||
/** 패널의 '지금 동기화' 버튼 — 슬래시 명령과 동일한 syncEmails 코어 호출. */
|
||||
private async _handleEmailSyncNow(): Promise<void> {
|
||||
if (this._emailSyncing) return;
|
||||
const c = vscode.workspace.getConfiguration('g1nation');
|
||||
const days = c.get<number>('email.syncDays', 7) ?? 7;
|
||||
const maxResults = Math.max(1, Math.min(2000, c.get<number>('email.syncMaxMessages', 200) ?? 200));
|
||||
this._emailSyncing = true;
|
||||
this._emailLastSyncMsg = '동기화 중…';
|
||||
await this._refreshState();
|
||||
try {
|
||||
const r = await syncEmails(this._deps.context, { days, maxResults });
|
||||
this._emailLastSyncMsg = r.ok
|
||||
? `완료 — 신규 ${r.added} / 총 ${r.total}${r.embedded ? ` · 임베딩 ${r.embedded}` : ''}${r.failed ? ` · 실패 ${r.failed}` : ''}`
|
||||
: `실패 — ${r.error}`;
|
||||
} catch (e: any) {
|
||||
this._emailLastSyncMsg = `오류 — ${e?.message || String(e)}`;
|
||||
} finally {
|
||||
this._emailSyncing = false;
|
||||
await this._refreshState();
|
||||
}
|
||||
}
|
||||
|
||||
private _buildEmailState(): SettingsState['email'] {
|
||||
const c = vscode.workspace.getConfiguration('g1nation');
|
||||
let indexedCount = 0;
|
||||
let newestDate = '';
|
||||
try {
|
||||
const brainPath = (getConfig().localBrainPath || '').trim();
|
||||
if (brainPath) {
|
||||
const records = loadEmailRecords(brainPath);
|
||||
indexedCount = records.length;
|
||||
const newest = records.reduce((m, r) => (r.date > m ? r.date : m), 0);
|
||||
if (newest > 0) newestDate = new Date(newest).toISOString().slice(0, 10);
|
||||
}
|
||||
} catch { /* status 표시 실패는 무해 */ }
|
||||
return {
|
||||
autoSync: c.get<boolean>('email.autoSync', false),
|
||||
autoSyncIntervalMinutes: c.get<number>('email.autoSyncIntervalMinutes', 30) ?? 30,
|
||||
syncDays: c.get<number>('email.syncDays', 7) ?? 7,
|
||||
syncMaxMessages: c.get<number>('email.syncMaxMessages', 200) ?? 200,
|
||||
indexedCount,
|
||||
newestDate,
|
||||
lastSyncMessage: this._emailLastSyncMsg,
|
||||
syncing: this._emailSyncing,
|
||||
};
|
||||
}
|
||||
|
||||
private async _refreshState(): Promise<void> {
|
||||
if (!this._view && !this._panel) return;
|
||||
const cfg = vscode.workspace.getConfiguration('g1nation');
|
||||
@@ -791,7 +700,6 @@ export class SettingsPanelProvider implements vscode.WebviewViewProvider {
|
||||
maxPages: cfg.get<number>('datacollectMaxPages', 8) ?? 8,
|
||||
synthesisTemperature: cfg.get<number>('datacollectSynthesisTemperature', 0.1) ?? 0.1,
|
||||
},
|
||||
email: this._buildEmailState(),
|
||||
google: this._buildGoogleState(),
|
||||
providers: await this._buildProvidersState(),
|
||||
devilAgent: { enabled: cfg.get<boolean>('devilAgent.enabled', false) },
|
||||
|
||||
Reference in New Issue
Block a user