From 1349072330b6239bf4d09d25d5b3b254c0ad646d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 27 Mar 2026 02:05:10 +0000 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20unreveal=20losing=20case=20=E2=80=94?= =?UTF-8?q?=20'Ademo=20Demo'=20became=20'ademo=20demo'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sessionSubstitutions stored keys as toLowerCase() for lookup, but the lowercase key was also used as the substitute value when building reveal pairs. This caused unrevealText to replace "John Smith" with "ademo demo" instead of "Ademo Demo". Fixed by storing both the original-case substitute and the original real value in sessionSubstitutions. The lowercase key is still used for lookup, but the preserved-case value is used for reveal pairs. https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn --- src/content/content.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/content/content.js b/src/content/content.js index 7ea70b1..10fa4a7 100644 --- a/src/content/content.js +++ b/src/content/content.js @@ -661,7 +661,11 @@ // Record what was actually substituted so reveal knows for (const r of replacements) { if (r.replaced && r.original) { - sessionSubstitutions.set(r.replaced.toLowerCase(), r.original); + // Store with lowercase key for lookup, but preserve original case + sessionSubstitutions.set(r.replaced.toLowerCase(), { + original: r.original, + replaced: r.replaced, // preserve original case + }); } } @@ -1272,7 +1276,8 @@ // Helper: only add if this substitute was actually sent function addIfUsed(from, to, caseSensitive) { if (!from || !to) return; - if (sessionSubstitutions.has(from.toLowerCase())) { + const entry = sessionSubstitutions.get(from.toLowerCase()); + if (entry) { pairs.push({ from, to, caseSensitive }); } } @@ -1301,9 +1306,9 @@ } // Also add auto-detect and secret scanner substitutions from this session - for (const [replaced, original] of sessionSubstitutions) { - if (!pairs.some(p => p.from.toLowerCase() === replaced)) { - pairs.push({ from: replaced, to: original }); + for (const [key, entry] of sessionSubstitutions) { + if (!pairs.some(p => p.from.toLowerCase() === key)) { + pairs.push({ from: entry.replaced, to: entry.original }); } } From 3062d4689cde668dd37c6ab12f81861fa220eb57 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 27 Mar 2026 02:11:26 +0000 Subject: [PATCH 2/2] chore: bump all versions to 2.0.3 https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn --- manifest.firefox.json | 2 +- manifest.json | 2 +- package.json | 2 +- src/options/options.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.firefox.json b/manifest.firefox.json index afb3c1c..27d0ca1 100644 --- a/manifest.firefox.json +++ b/manifest.firefox.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Silent Send", - "version": "2.0.0", + "version": "2.0.3", "description": "Intercepts personal info and substitutes it with user-defined replacements before sending to AI services.", "browser_specific_settings": { "gecko": { diff --git a/manifest.json b/manifest.json index efe7a11..034e60e 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Silent Send", - "version": "2.0.0", + "version": "2.0.3", "description": "Intercepts personal info and substitutes it with user-defined replacements before sending to AI services.", "permissions": [ "storage", diff --git a/package.json b/package.json index 74b78c5..a203aae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "silent-send", - "version": "2.0.0", + "version": "2.0.3", "private": true, "license": "BSL-1.1", "description": "Browser extension that substitutes personal data before sending to AI services", diff --git a/src/options/options.html b/src/options/options.html index ad41502..abe7481 100644 --- a/src/options/options.html +++ b/src/options/options.html @@ -589,7 +589,7 @@