diff --git a/AGENTS.md b/AGENTS.md index ad83d34..9ae810b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -62,7 +62,7 @@ text extracted from all text parts. ### Cache Strategy `aiCache` persists classification results. Each key is the SHA‑256 hex of -`"|"` and maps to an object with `matched` and `reason` +`"|"` and maps to an object with `matched` and `reason` properties. Any legacy `aiReasonCache` data is merged into `aiCache` the first time the add-on loads after an update. diff --git a/README.md b/README.md index ed362eb..e6aecbe 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ message meets a specified criterion. ### Cache Storage Classification results are stored under the `aiCache` key in extension storage. -Each entry maps a SHA‑256 hash of `"|"` to an object +Each entry maps a SHA‑256 hash of `"|"` to an object containing `matched` and `reason` fields. Older installations with a separate `aiReasonCache` will be migrated automatically on startup. diff --git a/modules/AiClassifier.js b/modules/AiClassifier.js index ff80aac..a546fcd 100644 --- a/modules/AiClassifier.js +++ b/modules/AiClassifier.js @@ -76,11 +76,26 @@ function buildCacheKeySync(id, criterion) { return sha256HexSync(`${id}|${criterion}`); } -async function buildCacheKey(id, criterion) { - if (Services) { - return buildCacheKeySync(id, criterion); +async function resolveHeaderId(id) { + if (typeof id === "number" && typeof messenger?.messages?.get === "function") { + try { + const hdr = await messenger.messages.get(id); + if (hdr?.headerMessageId) { + return hdr.headerMessageId; + } + } catch (e) { + aiLog(`Failed to resolve headerMessageId for ${id}`, { level: 'warn' }, e); + } } - return sha256Hex(`${id}|${criterion}`); + return String(id); +} + +async function buildCacheKey(id, criterion) { + const resolvedId = await resolveHeaderId(id); + if (Services) { + return buildCacheKeySync(resolvedId, criterion); + } + return sha256Hex(`${resolvedId}|${criterion}`); } async function loadCache() {