Files
memind/conversation-transcript-persist.test.mjs
john bdeab23b83 fix: persist direct chat transcript before Goosed escalation
Prevent portal direct-chat history from being lost when snapshot cache
is invalidated on Goosed submit by writing non-empty messages to DB first,
and stop caching empty Goose placeholder messages in snapshots.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 11:16:55 +08:00

72 lines
2.6 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {
filterNonemptyUserVisibleMessages,
persistSessionTranscriptFromSnapshot,
persistSessionTranscriptMessages,
} from './conversation-transcript-persist.mjs';
test('filterNonemptyUserVisibleMessages drops empty userVisible placeholders', () => {
const filtered = filterNonemptyUserVisibleMessages([
{ role: 'user', content: [{ type: 'text', text: 'hello' }], metadata: { userVisible: true } },
{ role: 'assistant', id: 'msg_c7f5', content: [{ type: 'text', text: '' }], metadata: { userVisible: true } },
{ role: 'assistant', content: [{ type: 'text', text: 'reply' }], metadata: { userVisible: true } },
{ role: 'system', content: [{ type: 'text', text: 'hidden' }], metadata: { userVisible: false } },
]);
assert.equal(filtered.length, 2);
assert.equal(filtered[0].content[0].text, 'hello');
assert.equal(filtered[1].content[0].text, 'reply');
});
test('persistSessionTranscriptMessages skips empty payloads', async () => {
const saved = [];
const result = await persistSessionTranscriptMessages({
conversationMemoryService: {
async saveConversationMessages(sessionId, userId, messages) {
saved.push({ sessionId, userId, messages });
return messages;
},
},
sessionId: 'session-1',
userId: 'user-1',
messages: [{ role: 'assistant', content: [{ type: 'text', text: '' }] }],
});
assert.equal(result.saved, 0);
assert.equal(saved.length, 0);
});
test('persistSessionTranscriptFromSnapshot copies prior direct session into new goose session', async () => {
const saved = [];
const snapshots = new Map([
[
'h5direct_old',
{
messages: [
{ role: 'user', content: [{ type: 'text', text: '中考政策' }] },
{ role: 'assistant', content: [{ type: 'text', text: '这是回复' }], metadata: { source: 'portal-direct-chat' } },
],
},
],
]);
const result = await persistSessionTranscriptFromSnapshot({
sessionSnapshotService: {
async get(sessionId) {
return snapshots.get(sessionId) ?? null;
},
},
conversationMemoryService: {
async saveConversationMessages(sessionId, userId, messages) {
saved.push({ sessionId, userId, messages });
return messages;
},
},
sessionId: '20260705_2',
userId: 'user-john',
sourceSessionId: 'h5direct_old',
});
assert.equal(result.saved, 2);
assert.equal(saved.length, 1);
assert.equal(saved[0].sessionId, '20260705_2');
assert.equal(saved[0].messages.length, 2);
});