import { type SonamuDBConfig } from "../database/db"; import { type MigrationResult } from "./migrator"; export type SlackConfirmResult = { status: "approved" | "rejected" | "pending" | "not_configured" | "error"; ts?: string; channel?: string; error?: string; }; export type SlackConfirmPendingResult = { type: "pending"; channel: string; ts: string; }; export declare class SlackConfirm { private config; private validateConfiguredTargets; /** * 설정이 있는지 확인합니다. */ isConfigured(): boolean; /** * 해당 target이 승인 대상인지 확인합니다. */ isTargetRequiresApproval(target: keyof SonamuDBConfig): boolean; /** * 마이그레이션 목록의 해시를 생성합니다. */ getMigrationsHash(migrations: string[]): string; /** * 로컬 파일 경로를 반환합니다. */ private getConfirmFilePath; /** * 기존 승인 요청을 조회합니다. */ getExistingRequest(migrations: string[]): Promise<{ channel: string; ts: string; } | null>; /** * 승인 요청을 저장합니다. */ saveRequest(migrations: string[], channel: string, ts: string): Promise; /** * 현재 사용자 이름을 반환합니다. */ private getRequestor; /** * 슬랙 메시지를 발송합니다. */ postApprovalRequest(migrations: string[], targets: string[], requestor?: string): Promise<{ channel: string; ts: string; }>; /** * 메시지 텍스트를 생성합니다. */ private buildMessageText; /** * 승인 상태를 확인합니다 (reactions.get). */ checkApproval(channel: string, ts: string): Promise<{ approved: boolean; rejected: boolean; approver?: string; }>; /** * Force 승인 처리를 수행합니다 (본인이 ✅ 찍고 스레드에 사유 남김). */ forceApproval(channel: string, ts: string, reason: string, requestor?: string): Promise; /** * 실행 완료 로그를 남깁니다. */ logExecution(channel: string, ts: string, results: MigrationResult, requestor?: string): Promise; } //# sourceMappingURL=slack-confirm.d.ts.map