'use strict'; const assert = require('assert'); const fs = require('fs'); const os = require('os'); const path = require('path'); const { createUnifiedTaskService } = require('../mcp/src/dashboard/unified-task-service'); const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-diagnosis-actions-')); async function main() { try { const service = createUnifiedTaskService({ outputsDir: tempDir, getConversations: () => ({ status: 'ok', data: { conversations: [] } }) }); const input = { question: '哪些客户今天必须跟进?', diagnosisType: 'customer-operations', scope: { date: '2026-07-24' }, action: { id: 'open-customer-master', label: '打开客户主档', description: '按任务与画像完整度处理', route: '#customer-ops', priority: 'high' }, evidence: [{ label: '画像覆盖率', value: 40, source: 'dashboard-state' }], dataGaps: [{ code: 'LOW_PORTRAIT_COVERAGE', label: '画像覆盖不足' }] }; const created = service.createDiagnosisCandidate(input); assert.equal(created.status, 'ok'); assert.equal(created.summary.created, true); assert.equal(created.summary.requiresPromotion, true); assert.match(created.data.candidate.sourceKey, /^diagnosis:/); const duplicate = service.createDiagnosisCandidate(input); assert.equal(duplicate.summary.created, false); assert.equal(duplicate.summary.duplicate, true); const firstHub = service.hub(); assert.equal(firstHub.summary.candidates, 1); const candidate = firstHub.data.tasks.find(task => task.source === 'diagnosis-candidate'); assert(candidate); assert.equal(candidate.actions.promote, true); const promoted = service.createLocalTask({ title: candidate.title, priority: candidate.priority, evidence: candidate.evidence, sourceTitle: candidate.sourceTitle, source: candidate.source, sourceKey: candidate.id }); assert.equal(promoted.summary.created, true); const prematureFeedback = service.updateDiagnosisOutcome({ taskId: promoted.data.task.id, outcome: 'effective' }); assert.equal(prematureFeedback.status, 'error'); const completed = await service.update({ source: 'local', taskId: promoted.data.task.id, status: 'done' }); assert.equal(completed.status, 'ok'); const feedback = service.updateDiagnosisOutcome({ taskId: promoted.data.task.id, outcome: 'effective', note: '跟进任务按计划完成,复盘确认流程有效。', actor: 'smoke-test' }); assert.equal(feedback.status, 'ok'); assert.equal(feedback.summary.internalOnly, true); assert.equal(feedback.summary.customerMessageSent, false); const secondHub = service.hub(); assert.equal(secondHub.summary.promotedCandidates, 1); assert.equal(secondHub.summary.diagnosisFeedback.candidates, 1); assert.equal(secondHub.summary.diagnosisFeedback.promoted, 1); assert.equal(secondHub.summary.diagnosisFeedback.completed, 1); assert.equal(secondHub.summary.diagnosisFeedback.effective, 1); assert.equal(secondHub.summary.diagnosisFeedback.adoptionRate, 1); assert.equal(secondHub.summary.diagnosisFeedback.effectivenessRate, 1); assert.equal(secondHub.data.tasks.find(task => task.id === candidate.id).actions.promote, false); const completedTask = secondHub.data.tasks.find(task => task.id === promoted.data.task.id); assert.equal(completedTask.diagnosisOutcome.value, 'effective'); assert.equal(completedTask.actions.diagnosisFeedback, true); const candidateStore = service.readDiagnosisCandidates(); assert(candidateStore.candidates[0].lifecycle.some(item => item.event === 'promoted')); assert(candidateStore.candidates[0].lifecycle.some(item => item.event === 'completed')); assert(candidateStore.candidates[0].lifecycle.some(item => item.event === 'outcome_recorded')); assert(fs.existsSync(path.join(tempDir, 'knowledge', 'diagnoses', 'action-candidates.json'))); process.stdout.write(`${JSON.stringify({ status: 'ok', checks: 30, candidateSource: candidate.source, promotedCandidates: secondHub.summary.promotedCandidates, effectivenessRate: secondHub.summary.diagnosisFeedback.effectivenessRate }, null, 2)}\n`); } finally { fs.rmSync(tempDir, { recursive: true, force: true }); } } main().catch(error => { process.stderr.write(`${error.stack || error.message}\n`); process.exit(1); });