bdeab23b83
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>
72 lines
2.6 KiB
JavaScript
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);
|
|
});
|