message-archive-smoke-test.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/usr/bin/env node
  2. 'use strict';
  3. const assert = require('assert/strict');
  4. const fs = require('fs');
  5. const os = require('os');
  6. const path = require('path');
  7. async function main() {
  8. const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-message-archive-'));
  9. const previousArchive = process.env.QIWEI_MESSAGE_ARCHIVE_ENABLED;
  10. const previousMemory = process.env.QIWEI_AGENT_MEMORY_ENABLED;
  11. const previousRoot = process.env.QIWEI_MESSAGES_DIR;
  12. try {
  13. process.env.QIWEI_MESSAGES_DIR = tempRoot;
  14. delete process.env.QIWEI_MESSAGE_ARCHIVE_ENABLED;
  15. delete process.env.QIWEI_AGENT_MEMORY_ENABLED;
  16. const archive = require('../mcp/src/core/message-archive');
  17. assert.equal(archive.archiveEnabled(), false);
  18. assert.equal(archive.memoryEnabled(), false);
  19. await archive.appendChatRecord({ wxid: 'contact/unsafe', content: '默认不落盘', dir: 'in' });
  20. assert.equal(fs.existsSync(path.join(tempRoot, 'chat')), false);
  21. process.env.QIWEI_MESSAGE_ARCHIVE_ENABLED = '1';
  22. await archive.appendChatRecord({
  23. wxid: 'contact/unsafe', messageId: 'm-1', externalId: 'e-1', dir: 'in', senderType: 'customer',
  24. content: '需要下周安排一次产品演示', createdAt: '2026-08-03T10:00:00.000Z', source: 'smoke',
  25. });
  26. await archive.appendGroupRecord({
  27. roomId: 'room:demo', messageId: 'g-1', seq: 1, msgType: 1, senderId: 'member-1',
  28. senderName: '测试成员', self: false, content: '群内测试消息', timestamp: '2026-08-03T10:01:00.000Z',
  29. });
  30. await archive.drainQueues();
  31. const chatFile = path.join(tempRoot, 'chat', 'contact_unsafe', '2026-08-03.json');
  32. const groupFile = path.join(tempRoot, 'group', 'room_demo', '2026-08-03.json');
  33. assert.equal(JSON.parse(fs.readFileSync(chatFile, 'utf8')).content, '需要下周安排一次产品演示');
  34. assert.equal(JSON.parse(fs.readFileSync(groupFile, 'utf8')).roomId, 'room:demo');
  35. assert.deepEqual(archive.ensureMemory('contact-1', '刘总'), { enabled: false, dir: '', created: [] });
  36. process.env.QIWEI_AGENT_MEMORY_ENABLED = '1';
  37. const memory = archive.ensureMemory('contact-1', '刘总');
  38. assert.equal(memory.enabled, true);
  39. assert.deepEqual(memory.created.sort(), [...archive.MEMORY_FILES].sort());
  40. const templates = archive.MEMORY_FILES.map(name => fs.readFileSync(path.join(memory.dir, name), 'utf8')).join('\n');
  41. assert.match(templates, /当前目标与需求/);
  42. assert.doesNotMatch(templates, /房源|购房|看房|小牛/);
  43. assert.match(archive.memoryIndexText('contact-1'), /用户记忆索引/);
  44. assert.equal(archive.memoryRelBase('contact/1'), 'messages/memory/contact_1');
  45. process.stdout.write(`${JSON.stringify({ status: 'ok', checks: 14, archiveDefault: 'off', memoryDefault: 'off' }, null, 2)}\n`);
  46. } finally {
  47. if (previousArchive === undefined) delete process.env.QIWEI_MESSAGE_ARCHIVE_ENABLED;
  48. else process.env.QIWEI_MESSAGE_ARCHIVE_ENABLED = previousArchive;
  49. if (previousMemory === undefined) delete process.env.QIWEI_AGENT_MEMORY_ENABLED;
  50. else process.env.QIWEI_AGENT_MEMORY_ENABLED = previousMemory;
  51. if (previousRoot === undefined) delete process.env.QIWEI_MESSAGES_DIR;
  52. else process.env.QIWEI_MESSAGES_DIR = previousRoot;
  53. fs.rmSync(tempRoot, { recursive: true, force: true });
  54. }
  55. }
  56. main().catch(error => {
  57. process.stderr.write(`${error.stack || error.message}\n`);
  58. process.exitCode = 1;
  59. });