import type { ChatSession, Message, Contact } from './models' export interface ElectronAPI { window: { minimize: () => void maximize: () => void close: () => void openAgreementWindow: () => Promise completeOnboarding: () => Promise openOnboardingWindow: () => Promise setTitleBarOverlay: (options: { symbolColor: string }) => void } config: { get: (key: string) => Promise set: (key: string, value: unknown) => Promise clear: () => Promise } dialog: { openFile: (options?: Electron.OpenDialogOptions) => Promise openDirectory: (options?: Electron.OpenDialogOptions) => Promise saveFile: (options?: Electron.SaveDialogOptions) => Promise } shell: { openPath: (path: string) => Promise openExternal: (url: string) => Promise } app: { getDownloadsPath: () => Promise getVersion: () => Promise checkForUpdates: () => Promise<{ hasUpdate: boolean; version?: string; releaseNotes?: string }> downloadAndInstall: () => Promise onDownloadProgress: (callback: (progress: number) => void) => () => void onUpdateAvailable: (callback: (info: { version: string; releaseNotes: string }) => void) => () => void } log: { getPath: () => Promise read: () => Promise<{ success: boolean; content?: string; error?: string }> } dbPath: { autoDetect: () => Promise<{ success: boolean; path?: string; error?: string }> scanWxids: (rootPath: string) => Promise getDefault: () => Promise } wcdb: { testConnection: (dbPath: string, hexKey: string, wxid: string) => Promise<{ success: boolean; error?: string; sessionCount?: number }> open: (dbPath: string, hexKey: string, wxid: string) => Promise close: () => Promise } key: { autoGetDbKey: () => Promise<{ success: boolean; key?: string; error?: string; logs?: string[] }> autoGetImageKey: (manualDir?: string) => Promise<{ success: boolean; xorKey?: number; aesKey?: string; error?: string }> onDbKeyStatus: (callback: (payload: { message: string; level: number }) => void) => () => void onImageKeyStatus: (callback: (payload: { message: string }) => void) => () => void } chat: { connect: () => Promise<{ success: boolean; error?: string }> getSessions: () => Promise<{ success: boolean; sessions?: ChatSession[]; error?: string }> enrichSessionsContactInfo: (usernames: string[]) => Promise<{ success: boolean contacts?: Record error?: string }> getMessages: (sessionId: string, offset?: number, limit?: number) => Promise<{ success: boolean; messages?: Message[]; hasMore?: boolean; error?: string }> getLatestMessages: (sessionId: string, limit?: number) => Promise<{ success: boolean messages?: Message[] error?: string }> getContact: (username: string) => Promise getContactAvatar: (username: string) => Promise<{ avatarUrl?: string; displayName?: string } | null> getMyAvatarUrl: () => Promise<{ success: boolean; avatarUrl?: string; error?: string }> downloadEmoji: (cdnUrl: string, md5?: string) => Promise<{ success: boolean; localPath?: string; error?: string }> close: () => Promise getSessionDetail: (sessionId: string) => Promise<{ success: boolean detail?: { wxid: string displayName: string remark?: string nickName?: string alias?: string avatarUrl?: string messageCount: number firstMessageTime?: number latestMessageTime?: number messageTables: { dbName: string; tableName: string; count: number }[] } error?: string }> getImageData: (sessionId: string, msgId: string) => Promise<{ success: boolean; data?: string; error?: string }> getVoiceData: (sessionId: string, msgId: string) => Promise<{ success: boolean; data?: string; error?: string }> } image: { decrypt: (payload: { sessionId?: string; imageMd5?: string; imageDatName?: string; force?: boolean }) => Promise<{ success: boolean; localPath?: string; error?: string }> resolveCache: (payload: { sessionId?: string; imageMd5?: string; imageDatName?: string }) => Promise<{ success: boolean; localPath?: string; hasUpdate?: boolean; error?: string }> preload: (payloads: Array<{ sessionId?: string; imageMd5?: string; imageDatName?: string }>) => Promise onUpdateAvailable: (callback: (payload: { cacheKey: string; imageMd5?: string; imageDatName?: string }) => void) => () => void onCacheResolved: (callback: (payload: { cacheKey: string; imageMd5?: string; imageDatName?: string; localPath: string }) => void) => () => void } analytics: { getOverallStatistics: () => Promise<{ success: boolean data?: { totalMessages: number textMessages: number imageMessages: number voiceMessages: number videoMessages: number emojiMessages: number otherMessages: number sentMessages: number receivedMessages: number firstMessageTime: number | null lastMessageTime: number | null activeDays: number messageTypeCounts: Record } error?: string }> getContactRankings: (limit?: number) => Promise<{ success: boolean data?: Array<{ username: string displayName: string avatarUrl?: string messageCount: number sentCount: number receivedCount: number lastMessageTime: number | null }> error?: string }> getTimeDistribution: () => Promise<{ success: boolean data?: { hourlyDistribution: Record weekdayDistribution: Record monthlyDistribution: Record } error?: string }> onProgress: (callback: (payload: { status: string; progress: number }) => void) => () => void } groupAnalytics: { getGroupChats: () => Promise<{ success: boolean data?: Array<{ username: string displayName: string memberCount: number avatarUrl?: string }> error?: string }> getGroupMembers: (chatroomId: string) => Promise<{ success: boolean data?: Array<{ username: string displayName: string avatarUrl?: string }> error?: string }> getGroupMessageRanking: (chatroomId: string, limit?: number, startTime?: number, endTime?: number) => Promise<{ success: boolean data?: Array<{ member: { username: string displayName: string avatarUrl?: string } messageCount: number }> error?: string }> getGroupActiveHours: (chatroomId: string, startTime?: number, endTime?: number) => Promise<{ success: boolean data?: { hourlyDistribution: Record } error?: string }> getGroupMediaStats: (chatroomId: string, startTime?: number, endTime?: number) => Promise<{ success: boolean data?: { typeCounts: Array<{ type: number name: string count: number }> total: number } error?: string }> } annualReport: { getAvailableYears: () => Promise<{ success: boolean data?: number[] error?: string }> generateReport: (year: number) => Promise<{ success: boolean data?: { year: number totalMessages: number totalFriends: number coreFriends: Array<{ username: string displayName: string avatarUrl?: string messageCount: number sentCount: number receivedCount: number }> monthlyTopFriends: Array<{ month: number displayName: string avatarUrl?: string messageCount: number }> peakDay: { date: string messageCount: number topFriend?: string topFriendCount?: number } | null longestStreak: { friendName: string days: number startDate: string endDate: string } | null activityHeatmap: { data: number[][] } midnightKing: { displayName: string count: number percentage: number } | null selfAvatarUrl?: string mutualFriend: { displayName: string avatarUrl?: string sentCount: number receivedCount: number ratio: number } | null socialInitiative: { initiatedChats: number receivedChats: number initiativeRate: number } | null responseSpeed: { avgResponseTime: number fastestFriend: string fastestTime: number } | null topPhrases: Array<{ phrase: string count: number }> } error?: string }> exportImages: (payload: { baseDir: string; folderName: string; images: Array<{ name: string; dataUrl: string }> }) => Promise<{ success: boolean dir?: string error?: string }> onProgress: (callback: (payload: { status: string; progress: number }) => void) => () => void } export: { exportSessions: (sessionIds: string[], outputDir: string, options: ExportOptions) => Promise<{ success: boolean successCount?: number failCount?: number error?: string }> exportSession: (sessionId: string, outputPath: string, options: ExportOptions) => Promise<{ success: boolean error?: string }> } } export interface ExportOptions { format: 'chatlab' | 'chatlab-jsonl' | 'json' | 'html' | 'txt' | 'excel' | 'sql' dateRange?: { start: number; end: number } | null exportMedia?: boolean exportAvatars?: boolean } export interface WxidInfo { wxid: string modifiedTime: number } declare global { interface Window { electronAPI: ElectronAPI } // Electron 类型声明 namespace Electron { interface OpenDialogOptions { title?: string defaultPath?: string filters?: { name: string; extensions: string[] }[] properties?: ('openFile' | 'openDirectory' | 'multiSelections' | 'createDirectory')[] } interface OpenDialogReturnValue { canceled: boolean filePaths: string[] } interface SaveDialogOptions { title?: string defaultPath?: string filters?: { name: string; extensions: string[] }[] } interface SaveDialogReturnValue { canceled: boolean filePath?: string } } } export { }