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>
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user