Ignore managed hide flag in history hashes

This commit is contained in:
Hao19911125
2026-04-02 21:49:59 +08:00
parent 6ad234cd06
commit 2e3d08cfa2
3 changed files with 36 additions and 1 deletions

View File

@@ -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);
}

View File

@@ -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,
});

View File

@@ -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,