openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
60 lines (59 loc) • 2.74 kB
JavaScript
import { t as escapeRegExp } from "./regexp-BZyMFTlj.mjs";
import { o as parseUsageCountedSessionIdFromFileName } from "./transcript-file-names-BZ8jA63H.mjs";
import "./session-key-runtime-DcC4DAZ0.mjs";
import "./text-utility-runtime-BB0hWeEg.mjs";
//#region extensions/memory-core/src/memory-forget-content.ts
function referencesSession(value, agentId, sessionIds) {
const agent = escapeRegExp(agentId);
const references = new RegExp(`(?:^|[\\s[/:])(?:sessions/${agent}/|${agent}:(?!sessions/))([^\\s\\]#;:/]+)`, "gu");
return [...value.matchAll(references)].some(([, reference]) => sessionIds.has(parseUsageCountedSessionIdFromFileName(reference) ?? reference)) || [...value.matchAll(/\bSession ID:\s*([^;\s]+)/giu)].some(([, sessionId]) => sessionIds.has(sessionId));
}
const PROMOTION_MARKER = /^\s*<!--\s*openclaw-memory-promotion:([^\n]*?)\s*-->\s*$/u;
const LINEAGE_MARKER = /^\s*<!--\s*openclaw-memory-lineage:[^\n]*?-->\s*$/u;
function scrubMemoryContent(params) {
const lines = params.content.split("\n");
const corpusSnippets = [...params.corpusSnippets];
let removedEntries = 0;
let removedLines = 0;
for (let index = 0; index < lines.length; index += 1) {
const markerKey = PROMOTION_MARKER.exec(lines[index] ?? "")?.[1]?.trim();
if (markerKey && params.entryKeys.has(markerKey)) {
const start = index > 0 && LINEAGE_MARKER.test(lines[index - 1] ?? "") ? index - 1 : index;
let end = index + 1;
if (end < lines.length && !PROMOTION_MARKER.test(lines[end] ?? "")) {
end += 1;
while (end < lines.length && /^\s+\S/u.test(lines[end] ?? "")) end += 1;
}
lines.splice(start, end - start);
removedEntries += 1;
index = start - 1;
continue;
}
if (corpusSnippets.some((snippet) => lines[index]?.includes(snippet))) {
lines.splice(index, 1);
removedLines += 1;
index -= 1;
continue;
}
if (!referencesSession(lines[index] ?? "", params.agentId, params.sessionIds)) continue;
const heading = /^(#{1,6})\s/u.exec(lines[index] ?? "");
const rowIndent = /^(\s*)[-*+]\s/u.exec(lines[index] ?? "")?.[1]?.length;
if (!heading && !/\bSession ID:/iu.test(lines[index] ?? "")) continue;
let end = index + 1;
while (end < lines.length) {
const nextHeading = /^(#{1,6})\s/u.exec(lines[end] ?? "");
if (rowIndent !== void 0 && (lines[end] ?? "").search(/\S/u) <= rowIndent || nextHeading && (!heading || nextHeading[1].length <= heading[1].length) || /\bSession ID:/iu.test(lines[end] ?? "")) break;
end += 1;
}
lines.splice(index, end - index);
removedEntries += 1;
index -= 1;
}
return {
content: lines.join("\n"),
removedEntries,
removedLines
};
}
//#endregion
export { referencesSession as n, scrubMemoryContent as r, PROMOTION_MARKER as t };