import { ElectronAPI } from '@electron-toolkit/preload' import type { AnalysisSession, MemberActivity, MemberNameHistory, HourlyActivity, DailyActivity, WeekdayActivity, MonthlyActivity, MessageType, ImportProgress, RepeatAnalysis, CatchphraseAnalysis, NightOwlAnalysis, DragonKingAnalysis, DivingAnalysis, MonologueAnalysis, MentionAnalysis, LaughAnalysis, MemeBattleAnalysis, CheckInAnalysis, FileParseInfo, ConflictCheckResult, MergeParams, MergeResult, MemberWithStats, } from '../../src/types/chat' interface TimeFilter { startTs?: number endTs?: number } interface ChatApi { selectFile: () => Promise<{ filePath?: string; format?: string; error?: string } | null> import: (filePath: string) => Promise<{ success: boolean; sessionId?: string; error?: string }> getSessions: () => Promise getSession: (sessionId: string) => Promise deleteSession: (sessionId: string) => Promise renameSession: (sessionId: string, newName: string) => Promise getAvailableYears: (sessionId: string) => Promise getMemberActivity: (sessionId: string, filter?: TimeFilter) => Promise getMemberNameHistory: (sessionId: string, memberId: number) => Promise getHourlyActivity: (sessionId: string, filter?: TimeFilter) => Promise getDailyActivity: (sessionId: string, filter?: TimeFilter) => Promise getWeekdayActivity: (sessionId: string, filter?: TimeFilter) => Promise getMonthlyActivity: (sessionId: string, filter?: TimeFilter) => Promise getMessageTypeDistribution: ( sessionId: string, filter?: TimeFilter ) => Promise> getTimeRange: (sessionId: string) => Promise<{ start: number; end: number } | null> getDbDirectory: () => Promise getSupportedFormats: () => Promise> onImportProgress: (callback: (progress: ImportProgress) => void) => () => void getRepeatAnalysis: (sessionId: string, filter?: TimeFilter) => Promise getCatchphraseAnalysis: (sessionId: string, filter?: TimeFilter) => Promise getNightOwlAnalysis: (sessionId: string, filter?: TimeFilter) => Promise getDragonKingAnalysis: (sessionId: string, filter?: TimeFilter) => Promise getDivingAnalysis: (sessionId: string, filter?: TimeFilter) => Promise getMonologueAnalysis: (sessionId: string, filter?: TimeFilter) => Promise getMentionAnalysis: (sessionId: string, filter?: TimeFilter) => Promise getLaughAnalysis: (sessionId: string, filter?: TimeFilter, keywords?: string[]) => Promise getMemeBattleAnalysis: (sessionId: string, filter?: TimeFilter) => Promise getCheckInAnalysis: (sessionId: string, filter?: TimeFilter) => Promise // 成员管理 getMembers: (sessionId: string) => Promise updateMemberAliases: (sessionId: string, memberId: number, aliases: string[]) => Promise deleteMember: (sessionId: string, memberId: number) => Promise } interface Api { send: (channel: string, data?: unknown) => void receive: (channel: string, func: (...args: unknown[]) => void) => void removeListener: (channel: string, func: (...args: unknown[]) => void) => void dialog: { showOpenDialog: (options: Electron.OpenDialogOptions) => Promise } } interface MergeApi { parseFileInfo: (filePath: string) => Promise checkConflicts: (filePaths: string[]) => Promise mergeFiles: (params: MergeParams) => Promise clearCache: (filePath?: string) => Promise onParseProgress: (callback: (data: { filePath: string; progress: ImportProgress }) => void) => () => void } // AI 相关类型 interface SearchMessageResult { id: number senderName: string senderPlatformId: string content: string timestamp: number type: number } interface AIConversation { id: string sessionId: string title: string | null createdAt: number updatedAt: number } // 内容块类型(用于 AI 消息的混合渲染) type AIContentBlock = | { type: 'text'; text: string } | { type: 'tool' tool: { name: string displayName: string status: 'running' | 'done' | 'error' params?: Record } } interface AIMessage { id: string conversationId: string role: 'user' | 'assistant' content: string timestamp: number dataKeywords?: string[] dataMessageCount?: number contentBlocks?: AIContentBlock[] } interface AiApi { searchMessages: ( sessionId: string, keywords: string[], filter?: TimeFilter, limit?: number, offset?: number ) => Promise<{ messages: SearchMessageResult[]; total: number }> getMessageContext: (sessionId: string, messageId: number, contextSize?: number) => Promise createConversation: (sessionId: string, title?: string) => Promise getConversations: (sessionId: string) => Promise getConversation: (conversationId: string) => Promise updateConversationTitle: (conversationId: string, title: string) => Promise deleteConversation: (conversationId: string) => Promise addMessage: ( conversationId: string, role: 'user' | 'assistant', content: string, dataKeywords?: string[], dataMessageCount?: number, contentBlocks?: AIContentBlock[] ) => Promise getMessages: (conversationId: string) => Promise deleteMessage: (messageId: string) => Promise } // LLM 相关类型 interface LLMProviderInfo { id: string name: string description: string defaultBaseUrl: string models: Array<{ id: string; name: string; description?: string }> } // 单个 AI 服务配置(前端显示用,API Key 已脱敏) interface AIServiceConfigDisplay { id: string name: string provider: string apiKey: string // 脱敏后的 API Key apiKeySet: boolean model?: string baseUrl?: string maxTokens?: number createdAt: number updatedAt: number } interface LLMChatMessage { role: 'system' | 'user' | 'assistant' content: string } interface LLMChatOptions { temperature?: number maxTokens?: number } interface LLMChatStreamChunk { content: string isFinished: boolean finishReason?: 'stop' | 'length' | 'error' } interface LlmApi { // 提供商 getProviders: () => Promise // 多配置管理 API getAllConfigs: () => Promise getActiveConfigId: () => Promise addConfig: (config: { name: string provider: string apiKey: string model?: string baseUrl?: string maxTokens?: number disableThinking?: boolean }) => Promise<{ success: boolean; config?: AIServiceConfigDisplay; error?: string }> updateConfig: ( id: string, updates: { name?: string provider?: string apiKey?: string model?: string baseUrl?: string maxTokens?: number disableThinking?: boolean } ) => Promise<{ success: boolean; error?: string }> deleteConfig: (id?: string) => Promise<{ success: boolean; error?: string }> setActiveConfig: (id: string) => Promise<{ success: boolean; error?: string }> // 验证和检查 validateApiKey: (provider: string, apiKey: string, baseUrl?: string, model?: string) => Promise hasConfig: () => Promise // 聊天功能 chat: ( messages: LLMChatMessage[], options?: LLMChatOptions ) => Promise<{ success: boolean; content?: string; error?: string }> chatStream: ( messages: LLMChatMessage[], options?: LLMChatOptions, onChunk?: (chunk: LLMChatStreamChunk) => void ) => Promise<{ success: boolean; error?: string }> } // Agent 相关类型 interface AgentStreamChunk { type: 'content' | 'tool_start' | 'tool_result' | 'done' | 'error' content?: string toolName?: string toolParams?: Record toolResult?: unknown error?: string isFinished?: boolean } interface AgentResult { content: string toolsUsed: string[] toolRounds: number } interface ToolContext { sessionId: string timeFilter?: { startTs: number; endTs: number } /** 用户配置:每次发送给 AI 的最大消息条数 */ maxMessagesLimit?: number } // 用户自定义提示词配置 interface PromptConfig { roleDefinition: string responseRules: string } interface AgentApi { runStream: ( userMessage: string, context: ToolContext, onChunk?: (chunk: AgentStreamChunk) => void, historyMessages?: Array<{ role: 'user' | 'assistant'; content: string }>, chatType?: 'group' | 'private', promptConfig?: PromptConfig ) => { requestId: string; promise: Promise<{ success: boolean; result?: AgentResult; error?: string }> } abort: (requestId: string) => Promise<{ success: boolean; error?: string }> } // Cache API 类型 interface CacheDirectoryInfo { id: string name: string description: string path: string icon: string canClear: boolean size: number fileCount: number exists: boolean } interface CacheInfo { baseDir: string directories: CacheDirectoryInfo[] totalSize: number } interface CacheApi { getInfo: () => Promise clear: (cacheId: string) => Promise<{ success: boolean; error?: string; message?: string }> openDir: (cacheId: string) => Promise<{ success: boolean; error?: string }> } declare global { interface Window { electron: ElectronAPI api: Api chatApi: ChatApi mergeApi: MergeApi aiApi: AiApi llmApi: LlmApi agentApi: AgentApi cacheApi: CacheApi } } export { ChatApi, Api, MergeApi, AiApi, LlmApi, AgentApi, CacheApi, SearchMessageResult, AIConversation, AIMessage, LLMProviderInfo, LLMConfig, AIServiceConfigDisplay, LLMChatMessage, LLMChatOptions, LLMChatStreamChunk, AgentStreamChunk, AgentResult, ToolContext, PromptConfig, CacheDirectoryInfo, CacheInfo, }