Phase 14 구현: 회의 모드 (Meeting Mode)
실시간 녹음 + 타임스탬프 메모 + STT 전사 + LLM 구조화 회의록 + PDF/MD 내보내기. CaptionService 연동, 동시 사용 충돌 방지, 긴 회의 2-pass 요약 지원. DB 2테이블, IPC 15채널, UI 3뷰(목록/녹음/상세), 12개 locale i18n.
This commit is contained in:
parent
dd68fc9ccd
commit
d0c4f9ee53
38 changed files with 2550 additions and 769 deletions
115
src/main/ipc/meeting-mode-handlers.ts
Normal file
115
src/main/ipc/meeting-mode-handlers.ts
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
// src/main/ipc/meeting-mode-handlers.ts
|
||||
// Phase 14: Meeting Mode IPC 핸들러
|
||||
|
||||
import { ipcMain } from 'electron'
|
||||
import { IPC_CHANNELS } from '@shared/ipc-channels'
|
||||
import { ErrorCode, ipcSuccess, ipcError } from '@shared/errors'
|
||||
import { getMeetingModeService } from '../services/MeetingModeService'
|
||||
import { getLogger } from '../services/LoggerService'
|
||||
import type {
|
||||
MeetingAddMemoParams,
|
||||
MeetingGetSessionsParams,
|
||||
MeetingGetSessionParams,
|
||||
MeetingDeleteSessionParams,
|
||||
MeetingExportParams,
|
||||
} from '@shared/types'
|
||||
|
||||
const logger = getLogger('meeting-mode-handlers')
|
||||
|
||||
export function registerMeetingModeHandlers(): void {
|
||||
const ch = IPC_CHANNELS.MEETING_MODE
|
||||
|
||||
ipcMain.handle(ch.START_RECORDING, async () => {
|
||||
try {
|
||||
const result = await getMeetingModeService().startRecording()
|
||||
return ipcSuccess(result)
|
||||
} catch (err) {
|
||||
logger.error(`startRecording 실패: ${err instanceof Error ? err.message : String(err)}`)
|
||||
return ipcError(ErrorCode.MeetingAlreadyRecording, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(ch.STOP_RECORDING, async () => {
|
||||
try {
|
||||
await getMeetingModeService().stopRecording()
|
||||
return ipcSuccess(undefined)
|
||||
} catch (err) {
|
||||
logger.error(`stopRecording 실패: ${err instanceof Error ? err.message : String(err)}`)
|
||||
return ipcError(ErrorCode.MeetingNotRecording, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(ch.ADD_MEMO, async (_event, params: MeetingAddMemoParams) => {
|
||||
try {
|
||||
const memo = await getMeetingModeService().addMemo(params.content)
|
||||
return ipcSuccess(memo)
|
||||
} catch (err) {
|
||||
logger.error(`addMemo 실패: ${err instanceof Error ? err.message : String(err)}`)
|
||||
return ipcError(ErrorCode.MeetingNotRecording, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(ch.GET_STATE, () => {
|
||||
try {
|
||||
return ipcSuccess(getMeetingModeService().getStateInfo())
|
||||
} catch (err) {
|
||||
return ipcError(ErrorCode.UnknownError, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(ch.GET_SESSIONS, (_event, params: MeetingGetSessionsParams) => {
|
||||
try {
|
||||
return ipcSuccess(getMeetingModeService().getSessions(params.page, params.pageSize))
|
||||
} catch (err) {
|
||||
return ipcError(ErrorCode.UnknownError, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(ch.GET_SESSION, (_event, params: MeetingGetSessionParams) => {
|
||||
try {
|
||||
return ipcSuccess(getMeetingModeService().getSession(params.sessionId))
|
||||
} catch (err) {
|
||||
return ipcError(ErrorCode.MeetingSessionNotFound, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(ch.DELETE_SESSION, (_event, params: MeetingDeleteSessionParams) => {
|
||||
try {
|
||||
getMeetingModeService().deleteSession(params.sessionId)
|
||||
return ipcSuccess(undefined)
|
||||
} catch (err) {
|
||||
return ipcError(ErrorCode.MeetingSessionNotFound, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(ch.UPDATE_TITLE, (_event, params: { sessionId: string; title: string }) => {
|
||||
try {
|
||||
getMeetingModeService().updateTitle(params.sessionId, params.title)
|
||||
return ipcSuccess(undefined)
|
||||
} catch (err) {
|
||||
return ipcError(ErrorCode.MeetingSessionNotFound, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(ch.EXPORT_PDF, async (_event, params: MeetingExportParams) => {
|
||||
try {
|
||||
const filePath = await getMeetingModeService().exportPdf(params.sessionId)
|
||||
return ipcSuccess(filePath)
|
||||
} catch (err) {
|
||||
logger.error(`exportPdf 실패: ${err instanceof Error ? err.message : String(err)}`)
|
||||
return ipcError(ErrorCode.MeetingPdfFailed, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(ch.EXPORT_MARKDOWN, async (_event, params: MeetingExportParams) => {
|
||||
try {
|
||||
const filePath = await getMeetingModeService().exportMarkdown(params.sessionId)
|
||||
return ipcSuccess(filePath)
|
||||
} catch (err) {
|
||||
logger.error(`exportMarkdown 실패: ${err instanceof Error ? err.message : String(err)}`)
|
||||
return ipcError(ErrorCode.MeetingExportFailed, err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
})
|
||||
|
||||
logger.info('Meeting Mode IPC handlers registered')
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue