import type { ProjectEvent } from '#shared/types' /** SSE:推送任务进度、写作增量、章节变更 */ export default defineEventHandler(async (event) => { const projectId = param(event) getProject(projectId) const stream = createEventStream(event) const send = (e: ProjectEvent) => { stream.push(JSON.stringify(e)).catch(() => {}) } const unsubscribe = subscribeProject(projectId, send) const run = getActiveRun(projectId) send({ type: 'pipeline', running: Boolean(run), message: run?.label }) const heartbeat = setInterval(() => { stream.push({ event: 'ping', data: String(Date.now()) }).catch(() => {}) }, 20_000) stream.onClosed(async () => { clearInterval(heartbeat) unsubscribe() await stream.close() }) return stream.send() })