diff --git a/hide-engine.js b/hide-engine.js index 9416621..f01f310 100644 --- a/hide-engine.js +++ b/hide-engine.js @@ -12,6 +12,8 @@ const hideState = { operationVersion: 0, }; +const BME_HIDE_HASH_MARKER = "__st_bme_hide_managed"; + function getTimerApi(runtime = {}) { const rawSetTimeout = typeof runtime.setTimeout === "function" @@ -179,6 +181,12 @@ function restoreManagedSystemFlags(chat, runtime = {}) { const message = chat[index]; if (!message || message.is_system !== true) continue; message.is_system = false; + if (message.extra && typeof message.extra === "object") { + delete message.extra[BME_HIDE_HASH_MARKER]; + if (Object.keys(message.extra).length === 0) { + delete message.extra; + } + } restored.push(index); } @@ -195,6 +203,10 @@ function markManagedSystemRange(chat, start, end, runtime = {}) { const message = chat[index]; if (!message || message.is_system === true) continue; message.is_system = true; + const extra = + message.extra && typeof message.extra === "object" ? message.extra : {}; + extra[BME_HIDE_HASH_MARKER] = true; + message.extra = extra; hideState.managedSystemIndices.add(index); marked.push(index); } diff --git a/runtime-state.js b/runtime-state.js index 4fc02ec..0def616 100644 --- a/runtime-state.js +++ b/runtime-state.js @@ -208,10 +208,15 @@ export function stableHashString(text) { } export function buildMessageHash(message) { + const managedHideMarker = Boolean( + message?.extra && + typeof message.extra === "object" && + message.extra.__st_bme_hide_managed === true, + ); const swipeId = Number.isFinite(message?.swipe_id) ? message.swipe_id : null; const payload = JSON.stringify({ isUser: Boolean(message?.is_user), - isSystem: Boolean(message?.is_system), + isSystem: managedHideMarker ? false : Boolean(message?.is_system), text: String(message?.mes || ""), swipeId, }); diff --git a/tests/runtime-history.mjs b/tests/runtime-history.mjs index 142182d..aeb4e02 100644 --- a/tests/runtime-history.mjs +++ b/tests/runtime-history.mjs @@ -51,6 +51,24 @@ const editedDetection = detectHistoryMutation(editedChat, { assert.equal(editedDetection.dirty, true); assert.equal(editedDetection.earliestAffectedFloor, 1); +const bmeHiddenChat = structuredClone(chat); +bmeHiddenChat[1].is_system = true; +bmeHiddenChat[1].extra = { __st_bme_hide_managed: true }; +const bmeHiddenDetection = detectHistoryMutation(bmeHiddenChat, { + lastProcessedAssistantFloor: 3, + processedMessageHashes: hashes, +}); +assert.equal(bmeHiddenDetection.dirty, false); + +const realSystemFlipChat = structuredClone(chat); +realSystemFlipChat[1].is_system = true; +const realSystemFlipDetection = detectHistoryMutation(realSystemFlipChat, { + lastProcessedAssistantFloor: 3, + processedMessageHashes: hashes, +}); +assert.equal(realSystemFlipDetection.dirty, true); +assert.equal(realSystemFlipDetection.earliestAffectedFloor, 1); + const truncatedChat = chat.slice(0, 2); const truncatedDetection = detectHistoryMutation(truncatedChat, { lastProcessedAssistantFloor: 3,