feat: complete release preparation, 10+ ad mediation, CI/CD, and docker deployment
Some checks failed
CI Pipeline / Code Quality & Typecheck (push) Waiting to run
CI Pipeline / Test Suite (macos-latest) (push) Blocked by required conditions
CI Pipeline / Test Suite (ubuntu-latest) (push) Blocked by required conditions
CI Pipeline / Test Suite (windows-latest) (push) Blocked by required conditions
CI Pipeline / Build Validation (admin) (push) Blocked by required conditions
CI Pipeline / Build Validation (desktop) (push) Blocked by required conditions
Deploy Landing Page / deploy (push) Blocked by required conditions
Deploy Landing Page / build (push) Waiting to run
Release & Packaging Pipeline / Build & Publish Admin Docker Image (push) Failing after 8s
Release & Code Signing CA Pipeline / build-and-sign-windows (push) Failing after 1m51s
Build macOS / Build & Package (macOS) (push) Failing after 4s
Build macOS / Build & Package (macOS)-1 (push) Failing after 5s
Release & Code Signing CA Pipeline / build-and-sign-macos (push) Failing after 3s
Release & Packaging Pipeline / Package macOS Desktop App (push) Failing after 4s
Release & Packaging Pipeline / Package Windows Desktop App (push) Failing after 2m28s
Release & Packaging Pipeline / Publish Official GitHub Release (push) Has been skipped

This commit is contained in:
Yun Chan 2026-08-20 11:12:05 +09:00
parent 5cd1de6859
commit 708e20f747
406 changed files with 42464 additions and 6199 deletions

View file

@ -8,7 +8,7 @@ import fs from 'fs'
import { app, dialog } from 'electron'
import { eq } from 'drizzle-orm'
import { getLogger } from './LoggerService'
import { getLocalLLMService } from './LocalLLMService'
import { getPremiumLLMService } from './PremiumLLMService'
import { getCloudSyncService } from './CloudSyncService'
import { getDatabase } from '../db'
import { history } from '../db/schema'
@ -19,6 +19,8 @@ import type { MeetingSummaryResult, MeetingSummaryProgress } from '@d3ro/core/ty
const logger = getLogger('MeetingSummaryService')
let isShowingSummarySaveDialog = false
const MEETING_SUMMARY_PROMPT = `다음은 회의 전사록입니다. 아래 형식으로 정리해주세요:
## 요약
@ -74,7 +76,7 @@ class MeetingSummaryService extends EventEmitter {
try {
// LLM 요약 생성
const llmService = getLocalLLMService()
const llmService = getPremiumLLMService()
const result = await llmService.generate(transcript, {
systemPrompt: MEETING_SUMMARY_PROMPT,
temperature: 0.3,
@ -151,12 +153,23 @@ class MeetingSummaryService extends EventEmitter {
const date = new Date(entry.createdAt)
const dateStr = date.toISOString().slice(0, 10)
const defaultName = `meeting-summary-${dateStr}.md`
const result = await dialog.showSaveDialog({
defaultPath: path.join(app.getPath('documents'), defaultName),
filters: [{ name: 'Markdown', extensions: ['md'] }],
})
if (isShowingSummarySaveDialog) {
throw new D3ROError(ErrorCode.MeetingSummaryExportFailed, 'Export dialog already active')
}
isShowingSummarySaveDialog = true
let result: Electron.SaveDialogReturnValue
try {
const mainWindow = getMainWindow()
const dialogOptions = {
defaultPath: path.join(app.getPath('documents'), defaultName),
filters: [{ name: 'Markdown', extensions: ['md'] }],
}
result = mainWindow
? await dialog.showSaveDialog(mainWindow, dialogOptions)
: await dialog.showSaveDialog(dialogOptions)
} finally {
isShowingSummarySaveDialog = false
}
if (result.canceled || !result.filePath) {
throw new D3ROError(ErrorCode.MeetingSummaryExportFailed, 'Export cancelled')
@ -253,6 +266,11 @@ class MeetingSummaryService extends EventEmitter {
// ── 싱글톤 ──
let instance: MeetingSummaryService | null = null
export function resetMeetingSummaryServiceForTests(): void {
if (instance) instance.removeAllListeners()
instance = null
}
export function getMeetingSummaryService(): MeetingSummaryService {
if (!instance) {
instance = new MeetingSummaryService()