返回 oh-my-ppt
handlers.ts
根目录 / src / main / history / handlers.ts
1 import { ipcMain } from 'electron'
2 import log from 'electron-log/main.js'
3 import type { IpcContext } from '../ipc/context'
4 import { GitHistoryService } from './git-history-service'
5 import { HISTORY_VERSION_LIMIT } from '@shared/history'
6
7 export function registerHistoryHandlers(ctx: IpcContext): void {
8 const { db, resolveSessionProjectDir, sessionRunStates } = ctx
9
10 ipcMain.handle(
11 'history:listVersions',
12 async (_event, payload: { sessionId?: unknown; limit?: unknown }) => {
13 const sessionId =
14 typeof payload?.sessionId === 'string' && payload.sessionId.trim().length > 0
15 ? payload.sessionId.trim()
16 : ''
17 if (!sessionId) throw new Error('缺少 sessionId')
18 const limit = Math.max(
19 1,
20 Math.min(HISTORY_VERSION_LIMIT, Math.floor(Number(payload?.limit) || HISTORY_VERSION_LIMIT))
21 )
22 const projectDir = await resolveSessionProjectDir(sessionId)
23 const service = new GitHistoryService(db)
24 await service.ensureBaseline(sessionId, projectDir).catch((error) => {
25 log.warn('[history:listVersions] ensureBaseline failed', {
26 sessionId,
27 message: error instanceof Error ? error.message : String(error)
28 })
29 })
30 return service.listVersions(sessionId, limit)
31 }
32 )
33
34 ipcMain.handle(
35 'history:rollbackToVersion',
36 async (_event, payload: { sessionId?: unknown; versionId?: unknown }) => {
37 const sessionId =
38 typeof payload?.sessionId === 'string' && payload.sessionId.trim().length > 0
39 ? payload.sessionId.trim()
40 : ''
41 const versionId =
42 typeof payload?.versionId === 'string' && payload.versionId.trim().length > 0
43 ? payload.versionId.trim()
44 : ''
45 if (!sessionId || !versionId) throw new Error('缺少历史版本参数')
46 const runState = sessionRunStates.get(sessionId)
47 if (runState?.status === 'queued' || runState?.status === 'running') {
48 throw new Error('当前会话正在生成或编辑,暂时不能回退。')
49 }
50 const projectDir = await resolveSessionProjectDir(sessionId)
51 return new GitHistoryService(db).rollbackToVersion({ sessionId, projectDir, versionId })
52 }
53 )
54
55 ipcMain.handle(
56 'history:recordSnapshot',
57 async (
58 _event,
59 payload: {
60 sessionId?: unknown
61 type?: unknown
62 scope?: unknown
63 prompt?: unknown
64 metadata?: unknown
65 }
66 ) => {
67 const sessionId =
68 typeof payload?.sessionId === 'string' && payload.sessionId.trim().length > 0
69 ? payload.sessionId.trim()
70 : ''
71 if (!sessionId) throw new Error('缺少 sessionId')
72 const projectDir = await resolveSessionProjectDir(sessionId)
73 const type = payload?.type === 'retry' || payload?.type === 'rollback' || payload?.type === 'addPage' || payload?.type === 'generate' || payload?.type === 'import' || payload?.type === 'reorder' || payload?.type === 'delete'
74 ? payload.type
75 : 'edit'
76 const scope = payload?.scope === 'deck' || payload?.scope === 'selector' || payload?.scope === 'shell' || payload?.scope === 'session'
77 ? payload.scope
78 : 'page'
79 const prompt = typeof payload?.prompt === 'string' ? payload.prompt : null
80 const metadata =
81 payload?.metadata && typeof payload.metadata === 'object' && !Array.isArray(payload.metadata)
82 ? (payload.metadata as Record<string, unknown>)
83 : {}
84 return new GitHistoryService(db).recordOperation({
85 sessionId,
86 projectDir,
87 type,
88 scope,
89 prompt,
90 metadata
91 })
92 }
93 )
94 }
95
95 lines TYPESCRIPT