mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-04-25 21:32:41 +08:00
237 lines
6.3 KiB
TypeScript
237 lines
6.3 KiB
TypeScript
/**
|
||
* 聊天记录查询 IPC 处理器
|
||
* 提供通用的消息查询功能:搜索、筛选、上下文、无限滚动等
|
||
*/
|
||
|
||
import { ipcMain } from 'electron'
|
||
import type { IpcContext } from './types'
|
||
import * as worker from '../worker/workerManager'
|
||
|
||
export function registerMessagesHandlers({ win }: IpcContext): void {
|
||
console.log('[IPC] Registering Messages handlers...')
|
||
|
||
/**
|
||
* 关键词搜索消息
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:searchMessages',
|
||
async (
|
||
_,
|
||
sessionId: string,
|
||
keywords: string[],
|
||
filter?: { startTs?: number; endTs?: number },
|
||
limit?: number,
|
||
offset?: number,
|
||
senderId?: number
|
||
) => {
|
||
try {
|
||
return await worker.searchMessages(sessionId, keywords, filter, limit, offset, senderId)
|
||
} catch (error) {
|
||
console.error('搜索消息失败:', error)
|
||
return { messages: [], total: 0 }
|
||
}
|
||
}
|
||
)
|
||
|
||
/**
|
||
* 获取消息上下文
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:getMessageContext',
|
||
async (_, sessionId: string, messageIds: number | number[], contextSize?: number) => {
|
||
try {
|
||
return await worker.getMessageContext(sessionId, messageIds, contextSize)
|
||
} catch (error) {
|
||
console.error('获取消息上下文失败:', error)
|
||
return []
|
||
}
|
||
}
|
||
)
|
||
|
||
/**
|
||
* 获取最近消息(AI Agent 专用)
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:getRecentMessages',
|
||
async (_, sessionId: string, filter?: { startTs?: number; endTs?: number }, limit?: number) => {
|
||
try {
|
||
return await worker.getRecentMessages(sessionId, filter, limit)
|
||
} catch (error) {
|
||
console.error('获取最近消息失败:', error)
|
||
return { messages: [], total: 0 }
|
||
}
|
||
}
|
||
)
|
||
|
||
/**
|
||
* 获取所有最近消息(消息查看器专用)
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:getAllRecentMessages',
|
||
async (_, sessionId: string, filter?: { startTs?: number; endTs?: number }, limit?: number) => {
|
||
try {
|
||
return await worker.getAllRecentMessages(sessionId, filter, limit)
|
||
} catch (error) {
|
||
console.error('获取所有最近消息失败:', error)
|
||
return { messages: [], total: 0 }
|
||
}
|
||
}
|
||
)
|
||
|
||
/**
|
||
* 获取两人之间的对话
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:getConversationBetween',
|
||
async (
|
||
_,
|
||
sessionId: string,
|
||
memberId1: number,
|
||
memberId2: number,
|
||
filter?: { startTs?: number; endTs?: number },
|
||
limit?: number
|
||
) => {
|
||
try {
|
||
return await worker.getConversationBetween(sessionId, memberId1, memberId2, filter, limit)
|
||
} catch (error) {
|
||
console.error('获取对话失败:', error)
|
||
return { messages: [], total: 0, member1Name: '', member2Name: '' }
|
||
}
|
||
}
|
||
)
|
||
|
||
/**
|
||
* 获取指定消息之前的 N 条(用于向上无限滚动)
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:getMessagesBefore',
|
||
async (
|
||
_,
|
||
sessionId: string,
|
||
beforeId: number,
|
||
limit?: number,
|
||
filter?: { startTs?: number; endTs?: number },
|
||
senderId?: number,
|
||
keywords?: string[]
|
||
) => {
|
||
try {
|
||
return await worker.getMessagesBefore(sessionId, beforeId, limit, filter, senderId, keywords)
|
||
} catch (error) {
|
||
console.error('获取之前消息失败:', error)
|
||
return { messages: [], hasMore: false }
|
||
}
|
||
}
|
||
)
|
||
|
||
/**
|
||
* 获取指定消息之后的 N 条(用于向下无限滚动)
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:getMessagesAfter',
|
||
async (
|
||
_,
|
||
sessionId: string,
|
||
afterId: number,
|
||
limit?: number,
|
||
filter?: { startTs?: number; endTs?: number },
|
||
senderId?: number,
|
||
keywords?: string[]
|
||
) => {
|
||
try {
|
||
return await worker.getMessagesAfter(sessionId, afterId, limit, filter, senderId, keywords)
|
||
} catch (error) {
|
||
console.error('获取之后消息失败:', error)
|
||
return { messages: [], hasMore: false }
|
||
}
|
||
}
|
||
)
|
||
|
||
// ==================== 自定义筛选 ====================
|
||
|
||
/**
|
||
* 按条件筛选消息并扩充上下文(支持分页)
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:filterMessagesWithContext',
|
||
async (
|
||
_,
|
||
sessionId: string,
|
||
keywords?: string[],
|
||
timeFilter?: { startTs: number; endTs: number },
|
||
senderIds?: number[],
|
||
contextSize?: number,
|
||
page?: number,
|
||
pageSize?: number
|
||
) => {
|
||
try {
|
||
return await worker.filterMessagesWithContext(
|
||
sessionId,
|
||
keywords,
|
||
timeFilter,
|
||
senderIds,
|
||
contextSize,
|
||
page,
|
||
pageSize
|
||
)
|
||
} catch (error) {
|
||
console.error('筛选消息失败:', error)
|
||
return {
|
||
blocks: [],
|
||
stats: { totalMessages: 0, hitMessages: 0, totalChars: 0 },
|
||
pagination: { page: page ?? 1, pageSize: pageSize ?? 50, totalBlocks: 0, totalHits: 0, hasMore: false },
|
||
}
|
||
}
|
||
}
|
||
)
|
||
|
||
/**
|
||
* 获取多个会话的完整消息(支持分页)
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:getMultipleSessionsMessages',
|
||
async (_, sessionId: string, chatSessionIds: number[], page?: number, pageSize?: number) => {
|
||
try {
|
||
return await worker.getMultipleSessionsMessages(sessionId, chatSessionIds, page, pageSize)
|
||
} catch (error) {
|
||
console.error('获取多个会话消息失败:', error)
|
||
return {
|
||
blocks: [],
|
||
stats: { totalMessages: 0, hitMessages: 0, totalChars: 0 },
|
||
pagination: { page: page ?? 1, pageSize: pageSize ?? 50, totalBlocks: 0, totalHits: 0, hasMore: false },
|
||
}
|
||
}
|
||
}
|
||
)
|
||
|
||
/**
|
||
* 导出筛选结果到文件(后端生成,支持进度)
|
||
*/
|
||
ipcMain.handle(
|
||
'ai:exportFilterResultToFile',
|
||
async (
|
||
_,
|
||
params: {
|
||
sessionId: string
|
||
sessionName: string
|
||
outputDir: string
|
||
filterMode: 'condition' | 'session'
|
||
keywords?: string[]
|
||
timeFilter?: { startTs: number; endTs: number }
|
||
senderIds?: number[]
|
||
contextSize?: number
|
||
chatSessionIds?: number[]
|
||
}
|
||
) => {
|
||
try {
|
||
return await worker.exportFilterResultToFile(params, (progress) => {
|
||
// 发送进度到渲染进程
|
||
win.webContents.send('ai:exportProgress', progress)
|
||
})
|
||
} catch (error) {
|
||
console.error('导出筛选结果失败:', error)
|
||
return { success: false, error: String(error) }
|
||
}
|
||
}
|
||
)
|
||
}
|