Files
memind/conversation-transcript-persist.mjs
T
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

61 lines
1.9 KiB
JavaScript

/**
* Persist portal direct-chat transcripts before Goosed escalation wipes snapshot cache.
*/
import { extractConversationMessageText } from './conversation-memory.mjs';
export function filterNonemptyUserVisibleMessages(messages) {
if (!Array.isArray(messages)) return [];
return messages.filter((message) => {
if (message?.metadata?.userVisible === false) return false;
return Boolean(extractConversationMessageText(message));
});
}
export async function loadSnapshotMessages(sessionSnapshotService, sessionId) {
if (!sessionSnapshotService?.get || !sessionId) return [];
const snapshot = await sessionSnapshotService.get(sessionId).catch(() => null);
return Array.isArray(snapshot?.messages) ? snapshot.messages : [];
}
export async function persistSessionTranscriptMessages({
conversationMemoryService,
sessionId,
userId,
messages,
} = {}) {
if (!conversationMemoryService?.saveConversationMessages || !sessionId || !userId) {
return { saved: 0, skipped: true };
}
const persistable = filterNonemptyUserVisibleMessages(messages);
if (!persistable.length) return { saved: 0, skipped: true };
const saved = await conversationMemoryService.saveConversationMessages(
sessionId,
userId,
persistable,
);
return { saved: Array.isArray(saved) ? saved.length : persistable.length, skipped: false };
}
export async function persistSessionTranscriptFromSnapshot({
sessionSnapshotService,
conversationMemoryService,
sessionId,
userId,
sourceSessionId = null,
} = {}) {
const sourceIds = [...new Set([sourceSessionId, sessionId].filter(Boolean))];
let totalSaved = 0;
for (const sourceId of sourceIds) {
const messages = await loadSnapshotMessages(sessionSnapshotService, sourceId);
const result = await persistSessionTranscriptMessages({
conversationMemoryService,
sessionId,
userId,
messages,
});
totalSaved += result.saved;
}
return { saved: totalSaved };
}