const assert = require('assert'); const fs = require('fs'); const os = require('os'); const path = require('path'); const { responseMonitor, isStaffMessage } = require('../mcp/src/dashboard/response-monitor-service'); const root = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-response-monitor-')); const groupsDir = path.join(root, 'outputs', 'groups'); const messagesDir = path.join(root, 'outputs', 'messages'); fs.mkdirSync(groupsDir, { recursive: true }); fs.mkdirSync(messagesDir, { recursive: true }); fs.writeFileSync(path.join(groupsDir, 'confirmed-mapping.json'), JSON.stringify({ 'room-1': { roomName: '重点客户群' }, 'room-2': { roomName: '待同步客户群' }, }), 'utf8'); fs.writeFileSync(path.join(groupsDir, 'rooms-latest.json'), JSON.stringify([ { roomId: 'room-1', roomName: '重点客户群' }, ]), 'utf8'); fs.writeFileSync(path.join(messagesDir, 'room-room-1-2026-07-20T10-00-00.json'), JSON.stringify([ { msgId: 'group-1', senderId: 'customer-1', senderName: '客户甲', content: '麻烦尽快回复', timestamp: '2026-07-20T08:00:00.000Z' }, ]), 'utf8'); const result = responseMonitor({ projectRoot: root, now: Date.parse('2026-07-20T10:00:00.000Z'), warningMinutes: 15, urgentMinutes: 60, selfUserIds: ['staff-1'], selfNames: ['客服小夏'], conversations: [ { id: 'conversation-1', contactId: 'customer-1', displayName: '王刚', messages: [{ role: 'customer', content: '在吗', timestamp: '2026-07-20T09:40:00.000Z' }], }, { id: 'conversation-2', contactId: 'customer-2', displayName: '已回复客户', messages: [ { role: 'customer', content: '你好', timestamp: '2026-07-20T09:20:00.000Z' }, { role: 'human', content: '您好', timestamp: '2026-07-20T09:22:00.000Z' }, ], }, { id: 'conversation-3', contactId: 'customer-3', displayName: '无需回复客户', handledMessageId: 'ack-1', messages: [{ id: 'ack-1', role: 'customer', content: '收到', timestamp: '2026-07-20T09:00:00.000Z' }], }, ], }); assert.strictEqual(result.summary.monitoredCustomers, 3); assert.strictEqual(result.summary.monitoredGroups, 0); assert.strictEqual(result.summary.overdue, 1); assert.strictEqual(result.summary.urgent, 0); assert.strictEqual(result.summary.warning, 1); assert.strictEqual(result.summary.awaitingSync, 0); assert.strictEqual(result.reminders[0].kind, 'customer'); assert.strictEqual(result.reminders[0].conversationId, 'conversation-1'); assert.strictEqual(result.scope.customers[1].status, 'replied'); assert.strictEqual(result.scope.customers[2].status, 'no_reply_needed'); assert.strictEqual(result.scope.customers[2].waitingMinutes, 0); assert.deepStrictEqual(result.scope.groups, []); assert.strictEqual(isStaffMessage({ senderId: 'staff-1' }, ['staff-1'], []), true); assert.strictEqual(isStaffMessage({ senderName: '客服小夏' }, [], ['客服小夏']), true); const repliedResult = responseMonitor({ projectRoot: root, now: Date.parse('2026-07-20T10:00:00.000Z'), warningMinutes: 15, urgentMinutes: 60, selfUserIds: ['staff-1'], selfNames: ['客服小夏'], conversations: [], }); assert.deepStrictEqual(repliedResult.scope.groups, []); assert.strictEqual(repliedResult.summary.overdue, 0); fs.rmSync(root, { recursive: true, force: true }); console.log(JSON.stringify({ status: 'ok', checks: 16, monitoredCustomers: result.summary.monitoredCustomers, monitoredGroups: result.summary.monitoredGroups, overdue: result.summary.overdue, }, null, 2));