import { type AuthErrorPayload } from './errors.js'; import { type AuthDomainId } from './scopes.js'; export type { AuthDomainId } from './scopes.js'; export interface StoredTokens { access_token: string; refresh_token: string; token_type: string; expiry_date: number; /** 공백 구분 부여 스코프. 신규 도구(GA4 등) pre-flight 스코프 검사에 사용. 구 토큰은 undefined. */ scope?: string; } export declare function getStoredCredentials(): { clientId: string; clientSecret: string; } | null; export declare function saveCredentials(clientId: string, clientSecret: string): void; export declare function getStoredTokens(): StoredTokens | null; /** * tokens.json mtime — 마지막 refresh 시각의 근사값. * (saveTokens 가 매번 writeFileSync 으로 갱신하므로 mtime ≈ 마지막 갱신/저장.) * Google refresh_token 은 7일(미인증 앱) ~ 6개월(인증 앱) 미사용 시 revoke 됨. * auth_status 응답 enrichment 에 사용. */ export declare function getTokensLastRefreshMs(): number | null; export declare function createOAuth2Client(clientId: string, clientSecret: string): import("google-auth-library").OAuth2Client; /** * Get authenticated OAuth2 client. * Returns null if not authenticated yet. */ export declare function getAuthenticatedClient(): ReturnType | null; /** * OAuth 플로우 시작. * URL과 대기 Promise를 즉시 반환. localhost:9876 콜백 서버는 백그라운드로 실행. * 호출자가 URL을 사용자에게 전달하거나 private 브라우저를 직접 연다. * `wait` Promise: 토큰 저장 시 resolve, 타임아웃/에러 시 reject. * 재호출 시 기존 세션 자동 정리. * * `domains` 로 권한 도메인 서브셋만 요청할 수 있다 (미지정 시 전체 — 기존 동작). * include_granted_scopes 덕에 재로그인은 기존 부여 스코프를 유지한 채 새 스코프만 * 얹는다(incremental authorization) — 토큰 응답의 scope 필드에도 누적 전체가 온다. */ export declare function startAuth(clientId: string, clientSecret: string, options?: { timeoutMs?: number; domains?: readonly AuthDomainId[]; }): { url: string; wait: Promise; }; export type RefreshStatus = { status: 'fresh'; tokens: StoredTokens; msUntilExpiry: number; } | { status: 'refreshed'; tokens: StoredTokens; msUntilExpiry: number; } | { status: 'expired_refresh_failed'; tokens: StoredTokens; error: AuthErrorPayload; } | { status: 'unauthenticated'; error: AuthErrorPayload; }; /** * 저장된 access_token이 만료/곧만료면 refresh_token으로 silent 갱신 시도. * - 갱신 성공 시 tokens.json 업데이트 * - refresh_token 자체가 invalid한 경우 'expired_refresh_failed' 반환 * - 토큰 자체가 없으면 'unauthenticated' * * MCP 도구와 CLI 양쪽에서 공유. */ /** * 사전 갱신 마진. 기존 60_000(1분)에서 300_000(5분)으로 상향 — Google OAuth access_token 의 * 통상 lifetime 이 1h 이므로, 5분 마진으로 매 도구 호출 시 만료 임박 시 사전 갱신해 * "토큰 만료 → 도구 fail → 재호출" 의 단절 마찰 제거. 5분 마진은 평균 도구 작업 시간을 흡수. */ export declare function ensureFreshAccessToken(marginMs?: number): Promise;