| import { findCodeRegions, isInsideCode } from "./code-regions.js"; |
| import { stripReasoningTagsFromText } from "./reasoning-tags.js"; |
|
|
| const MEMORY_TAG_RE = /<\s*(\/?)\s*relevant[-_]memories\b[^<>]*>/gi; |
| const MEMORY_TAG_QUICK_RE = /<\s*\/?\s*relevant[-_]memories\b/i; |
|
|
| function stripRelevantMemoriesTags(text: string): string { |
| if (!text || !MEMORY_TAG_QUICK_RE.test(text)) { |
| return text; |
| } |
| MEMORY_TAG_RE.lastIndex = 0; |
|
|
| const codeRegions = findCodeRegions(text); |
| let result = ""; |
| let lastIndex = 0; |
| let inMemoryBlock = false; |
|
|
| for (const match of text.matchAll(MEMORY_TAG_RE)) { |
| const idx = match.index ?? 0; |
| if (isInsideCode(idx, codeRegions)) { |
| continue; |
| } |
|
|
| const isClose = match[1] === "/"; |
| if (!inMemoryBlock) { |
| result += text.slice(lastIndex, idx); |
| if (!isClose) { |
| inMemoryBlock = true; |
| } |
| } else if (isClose) { |
| inMemoryBlock = false; |
| } |
|
|
| lastIndex = idx + match[0].length; |
| } |
|
|
| if (!inMemoryBlock) { |
| result += text.slice(lastIndex); |
| } |
|
|
| return result; |
| } |
|
|
| export function stripAssistantInternalScaffolding(text: string): string { |
| const withoutReasoning = stripReasoningTagsFromText(text, { mode: "preserve", trim: "start" }); |
| return stripRelevantMemoriesTags(withoutReasoning).trimStart(); |
| } |
|
|