#!/usr/bin/env node 'use strict'; const assert = require('assert/strict'); const fs = require('fs'); const os = require('os'); const path = require('path'); const root = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-account-isolation-')); process.env.QIWEI_OUTPUTS_DIR = path.join(root, 'outputs'); process.env.QIWEI_MESSAGES_DIR = path.join(root, 'messages'); process.env.QIWEI_LEGACY_ACCOUNT_KEY = 'legacy-default'; process.env.QIWEI_MESSAGE_ARCHIVE_ENABLED = '1'; process.env.QIWEI_AGENT_MEMORY_ENABLED = '1'; const { setActiveQiweiContext, qiweiAccountKey } = require('../mcp/src/core/credentials'); const { writeCustomer, readCustomerById, customerFilePath } = require('../mcp/src/core/customer-broker-store'); const { appendChatRecord, ensureMemory, memoryRelBase, drainQueues } = require('../mcp/src/core/message-archive'); const { writeConfirmedMapping, readConfirmedMapping } = require('../mcp/src/tools/qiwei-group-management-run'); async function run() { const accountA = { uid: 'shared-device', userId: 'wecom-user-a', nickname: 'A' }; const accountB = { uid: 'shared-device', userId: 'wecom-user-b', nickname: 'B' }; const keyA = qiweiAccountKey(accountA); const keyB = qiweiAccountKey(accountB); assert.notEqual(keyA, keyB); setActiveQiweiContext(accountA); writeCustomer({ customerId: 'customer-1', name: 'Customer A' }); appendChatRecord({ wxid: 'customer-1', content: 'A', createdAt: '2026-08-04T10:00:00.000Z' }); ensureMemory('customer-1', 'Customer A'); writeConfirmedMapping({ 'room-a': { roomId: 'room-a' } }); const customerAPath = customerFilePath('customer-1'); const memoryA = memoryRelBase('customer-1'); setActiveQiweiContext(accountB); assert.equal(readCustomerById('customer-1'), null); assert.deepEqual(readConfirmedMapping(), {}); writeCustomer({ customerId: 'customer-1', name: 'Customer B' }); appendChatRecord({ wxid: 'customer-1', content: 'B', createdAt: '2026-08-04T10:00:00.000Z' }); ensureMemory('customer-1', 'Customer B'); writeConfirmedMapping({ 'room-b': { roomId: 'room-b' } }); const customerBPath = customerFilePath('customer-1'); const memoryB = memoryRelBase('customer-1'); await drainQueues(); assert.notEqual(customerAPath, customerBPath); assert.notEqual(memoryA, memoryB); assert.equal(JSON.parse(fs.readFileSync(customerAPath, 'utf8')).name, 'Customer A'); assert.equal(JSON.parse(fs.readFileSync(customerBPath, 'utf8')).name, 'Customer B'); assert(fs.existsSync(path.join(root, 'messages', 'chat', keyA, 'customer-1', '2026-08-04.json'))); assert(fs.existsSync(path.join(root, 'messages', 'chat', keyB, 'customer-1', '2026-08-04.json'))); assert(fs.existsSync(path.join(root, 'outputs', 'groups', keyA, 'confirmed-mapping.json'))); assert(fs.existsSync(path.join(root, 'outputs', 'groups', keyB, 'confirmed-mapping.json'))); console.log(`account isolation smoke test passed (${keyA} != ${keyB})`); } run() .finally(() => fs.rmSync(root, { recursive: true, force: true })) .catch(error => { console.error(error); process.exitCode = 1; });