import { describe, it, expect } from 'vitest' import { DatabaseSync } from 'node:sqlite' import { migrate } from '../../src/main/db/migrate' import { AiSessionRepository } from '../../src/main/db/repositories/ai-session.repo' import { InteractiveWritingService } from '../../src/main/services/interactive-writing.service' import { AiClientService } from '../../src/main/services/ai-client.service' import { DEFAULT_AI_CONFIG } from '../../src/shared/types' const AI_TEST_CONFIG = { ...DEFAULT_AI_CONFIG, timeoutMs: 240_000, maxTokens: 4096 } describe('interactive scene integration', () => { const service = (db: DatabaseSync) => new InteractiveWritingService(db, new AiClientService(() => AI_TEST_CONFIG)) it('IT-INT-02: generateScene returns non-empty draft', async () => { const db = new DatabaseSync(':memory:') migrate(db) const session = new AiSessionRepository(db).create('t', DEFAULT_AI_CONFIG.model) const svc = service(db) const flow = svc.start(session.id) svc.confirmContext(flow.id, { binding: { chapterIds: [], outlineIds: [], settingIds: [], inspirationIds: [], knowledgeIds: [] }, systemPrompt: '林远在演武场测试灵根,众人围观。', contextSummary: '0章·0纲·0设·0感·0知' }) const plots = await svc.suggestPlots(flow.id) svc.selectPlot(flow.id, { optionIds: [plots[0].id] }) const afterGen = await svc.generateScene(flow.id, () => {}) if (afterGen.step === 'naming_pause' && afterGen.namingPending) { await svc.resolveNaming(flow.id, afterGen.namingPending.options[0], () => {}) } const draft = svc.getSceneDraft(flow.id) expect(draft.trim().length).toBeGreaterThan(50) db.close() }, 240_000) })