Commit Graph
32 Commits
Author SHA1 Message Date
Outis b5dfae814e Merge pull request #40 from outis1one/claude/read-repo-YMu21
fix: move test suite JS to external file for Firefox CSP, bump 0.9.3
2026-03-28 14:41:26 -04:00
Claude d3646fbdf3 fix: move test suite JS to external file for Firefox CSP, bump 0.9.3
Firefox extension CSP blocks inline <script> tags. Moved all test
code to test-suite.js (loaded via src attribute). Build script updated
to copy both files.

https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-28 18:37:58 +00:00
Outis 9e0588e4e3 Merge pull request #39 from outis1one/claude/read-repo-YMu21
Claude/read repo y mu21
2026-03-28 14:21:07 -04:00
Claude a2b598236c chore: bump version to 0.9.2
https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-28 18:20:21 +00:00
Outis 528fba7f6e Merge pull request #35 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-28 12:31:12 -04:00
Claude 4b478c71bd chore: set version to 0.9.0 for pre-release testing
https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-28 15:17:20 +00:00
Claude 9da922f662 chore: set version to 0.9.0 (beta)
Not a fully tested release. Marking as beta until all services
are verified and edge cases are resolved.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-28 12:00:10 +00:00
Outis 7576043542 Merge pull request #34 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-27 19:28:44 -04:00
Claude fa36a1f977 feat: add Copilot + Edge support, update README
Added copilot.microsoft.com to host_permissions, content_scripts
matches, and BUILTIN_URL_PATTERNS in both Chrome and Firefox manifests
plus the service worker.

Updated README:
- Added Copilot to supported services table
- Added Edge and Brave to browser list
- Added note about desktop apps (can't intercept, use web version)
- Removed old duplicate browser note

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 23:15:03 +00:00
Outis 893ecce6d4 Merge pull request #31 from outis1one/claude/read-repo-YMu21
feat: add AI services and developer/support sites to built-in domains
2026-03-27 17:26:31 -04:00
Claude e6e9894d99 feat: add AI services and developer/support sites to built-in domains
New AI sites: Perplexity, Copilot, DeepSeek, HuggingChat, Poe
Developer/support: GitHub, GitLab, Reddit (www + old), Stack Overflow, Pastebin

The existing interception is service-agnostic — it scans all JSON strings
in POST/PUT/PATCH requests through the 4-stage substitution pipeline.
No site-specific handling needed; all sites use the same method.

https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-27 21:12:13 +00:00
Claude eec0d52681 fix: PPI warning accept/ignore buttons — v2.0.14
Accept (+) button:
- Was reading raw storage (getStorageData) which returns encrypted
  blobs when encryption is enabled, silently failing to add mappings
- Fixed: adds directly to the local mappings array and persists via
  setStorageData (storage bridge handles encryption transparently)

Auto-detect false positives:
- Was only checking identity values, not explicit mappings — values
  already in the mappings table still got flagged as unconfigured PPI
- Fixed: now adds all mapping real/substitute values to the skip set

Ignore button:
- Changed from plain text link to grey pill button for better UX
- Still persists permanently via ss_ignored_ppi in storage

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 20:53:53 +00:00
Claude 5c863b084d fix: encrypted data breaks Firefox — injector can't decrypt — v2.0.13
When at-rest encryption is enabled, storage.local contains encrypted
blobs. The injector reads raw storage (content script world, no
access to IndexedDB CryptoKey) and sees { _ssLocalEncrypted: true }.
It passed empty config to content.js → no mappings → no substitution.

This is why Firefox stopped working after encryption was enabled.
Chrome/Brave worked because the user hadn't set up encryption there.

Fixed: injector now detects encrypted data and asks the background
script for decrypted config via 'get:decrypted-config' message.
The background uses the Storage module (which has IndexedDB access)
to decrypt and return the data. Falls back to empty config if the
vault is actually locked.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 16:58:40 +00:00
Claude c42a4aa55e revert: remove early fetch hook, restore simple injection — v2.0.12
The early hook approach (inline script, then external early-hook.js)
kept breaking Firefox due to CSP restrictions and timing issues with
the async external script load. Each fix for ChatGPT introduced a
new regression for Firefox/Brave.

Reverted to the original simple approach:
- Injector reads storage, injects content.js via <script src="...">
- content.js captures window.fetch at load time and patches it
- No inline scripts, no early hooks, no __ssOriginalFetch globals

This is what worked on Claude.ai across all browsers before the
ChatGPT fix attempts. ChatGPT support may need a different approach
later (possibly using declarativeNetRequest for header-only changes,
or a ChatGPT-specific content script), but it should not break the
core functionality on Claude.ai.

Kept the Request object handling in the fetch interceptor (needed for
some frameworks) but removed all early hook dependencies.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 16:42:09 +00:00
Claude 557b1ffd0c fix: Firefox broken — CSP blocks inline early hook script — v2.0.11
The inline <script> with textContent was blocked by claude.ai's
Content Security Policy on Firefox (Chrome is more permissive).
No fetch interception = no substitution = completely broken on FF.

Fixed by moving the early fetch hook to its own file (early-hook.js)
loaded via <script src="..."> which is CSP-compliant. Added to
web_accessible_resources in both Chrome and Firefox manifests.

Also fixed duplicate 'const api' declaration in injector.js that
would have crashed the content script.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 15:04:13 +00:00
Claude 85fbc6c4d0 fix: reveal mode broken + missing await + select rendering — v2.0.10
Bug 1 - Reveal mode not working (all browsers):
sessionSubstitutions stored "ademo demo" (full name) as key, but
buildRevealPairs looked up "ademo" and "demo" individually. No match,
no reveal pairs, reveal did nothing. Fixed by also storing individual
words from multi-word replacements so both "ademo demo" AND "ademo"
AND "demo" are in the map.

Bug 2 - Missing await on _handleDecryptedMeta (sync.js):
Two call sites returned the Promise instead of the resolved value.
Downstream code checking decResult.data got undefined. Added await.

Bug 3 - Profile selector broken by safeHTML (popup.js):
DOMParser.parseFromString wraps content in <html><body> which
mangles <option> elements when moved to a <select>. Replaced with
new Option() DOM API which creates proper option elements.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 12:41:47 +00:00
Claude 97e37e65ac fix: cross-browser sync import corrupting local encryption + v2.0.9
Root cause: when importing an encrypted sync code from another device,
_decryptFromSync was replacing the local encryption config (salt) with
the source device's salt. This caused:
1. Local key cache derived from wrong salt
2. Local data (encrypted with local salt) became unreadable
3. _applyData tried to write with the wrong key

Fixed with a complete refactor of cross-device decryption:
- authenticateForSync() derives a TEMPORARY key using the source salt
- Temporary key stored separately as 'tempSyncKey' in IndexedDB
- Local encryption config and cached key are NEVER modified
- After decryption, _applyData writes via _writeSecure using the
  LOCAL key (which uses the local salt)
- _handleDecryptedMeta extracted for code reuse

Also:
- Options.js auth handler detects pending sync import and routes to
  authenticateForSync instead of regular authenticate
- After auth success, automatically retries the import
- README updated: imported passwords are protected (dots in UI,
  vault password to reveal, AES-256 encrypted at rest)
- Bumped to v2.0.9

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 05:23:50 +00:00
Claude f284238792 chore: bump to 2.0.7
https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 04:29:39 +00:00
Claude 02c635c4d7 fix: ChatGPT fetch interception failure + bump to 2.0.6
ChatGPT (and potentially other AI services) calls fetch() with a
Request object as the first argument: fetch(new Request(url, opts))
instead of fetch(url, opts). The interceptor only handled the second
form, so ChatGPT's conversation requests passed through unmodified.

Fixed by handling both fetch signatures:
- fetch(url, options) — existing path
- fetch(Request) — new: extracts URL, method, headers, reads body
  via request.text() for JSON/text content types

Also handles non-string body types:
- Blob → text via blob.text()
- ArrayBuffer → text via TextDecoder
- URLSearchParams → string via toString()

These cover the various ways modern frameworks call fetch().

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 04:07:11 +00:00
Claude e739531cee fix: catch concatenated name forms (JohnSmith, john.smith, etc.)
Smart patterns now catch all concatenated combinations of first+last
names with common separators:

| Pattern | Example real | Example replaced |
|---------|-------------|-----------------|
| FirstLast | JohnSmith | AdemoDem |
| firstlast | johnsmith | ademodemo |
| first.last | john.smith | ademo.demo |
| first_last | john_smith | ademo_demo |
| first-last | john-smith | ademo-demo |
| LastFirst | SmithJohn | DemoAdemo |
| last.first | smith.john | demo.ademo |

Case is preserved: all-lowercase input → lowercase output,
ALL-UPPERCASE → uppercase, mixed case → as configured.

Also bumped all versions to 2.0.5.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 03:16:56 +00:00
Claude 3062d4689c chore: bump all versions to 2.0.3
https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 02:11:26 +00:00
Claude 75845d7ec7 fix: Firefox signing errors — manifest format + JS syntax
1. Removed data_collection_permissions from Firefox manifest — it
   requires Firefox 140+ but we target 128+. Only produces a warning
   when missing, not a blocking error.

2. Fixed JS syntax error in content.js line 450 — two extra closing
   braces from a bad merge in the proper noun detection function
   caused a parse error that blocked Mozilla validation.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 01:31:39 +00:00
Claude 64ed20bc88 chore: sync all versions to 2.0.0 + fix sign script
Set Chrome, Firefox, and package.json all to version 2.0.0
(major bump reflecting encrypted storage, document scanning,
org/team features, sync improvements).

Sign script rewritten:
- Tries current version first instead of always bumping
- Only bumps on "version already exists" errors
- Handles rate limiting by parsing throttle duration from error
  and waiting the exact time (not blindly retrying)
- Only updates source files on successful signing (not before)
- Reduced max attempts to 5 (with proper backoff, shouldn't need more)
- Commits version bump only after successful sign

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 22:50:17 +00:00
Claude 3ffac3299f fix: Firefox signing — manifest_version corruption + rate limiting
The sign script's sed command was replacing ALL "version" patterns
including "manifest_version": 3, corrupting it to "manifest_version": 1.
Fixed by anchoring the sed pattern to only match the top-level
"version" field (starts with two spaces at line beginning).

Also:
- Added data_collection_permissions to Firefox manifest (new Mozilla
  requirement for all extensions)
- Added 8-second sleep between retry attempts to avoid Mozilla API
  rate limiting (was causing cascading failures)

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 20:58:16 +00:00
Claude 70c7b759c6 feat: auto-sync, version history, merge, org policy, tamper guard
New modules:
- version-history.js: IndexedDB snapshot storage with pruning/rollback
- merge.js: three-way field-level merge for sync conflict resolution
- org-policy.js: team/org policy enforcement, compliance checking,
  invite codes, required mappings that can't be disabled
- tamper-guard.js: admin password to protect disable/clear/export
  actions, org policy can prevent disabling

Auto background sync:
- Gist/URL sync via chrome.alarms (MV3-safe, survives SW restarts)
- Configurable interval (5/15/30 min), push on local changes
- performAutoSync() orchestrates pull-then-conditional-push

Multi-device dashboard:
- Device auto-registration with UUID + browser/platform detection
- Device list embedded in sync data for cross-device visibility
- getDeviceInfo(), setDeviceName(), getDevices(), removeDevice()

Manifest changes:
- Added "alarms" permission for background polling

Service worker:
- Alarm listeners for auto-sync and org policy polling (hourly)
- Tamper guard message handlers
- Alarms set up on install and startup

WIP: Options UI integration pending for all new features.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 19:39:28 +00:00
Claude 1e475196d6 feat: sync notification badge + clarify cloud storage support
Notification system:
- When sync applies data (file folder, browser account, or sync code),
  ss_sync_notification is written to local storage with the source.
- Service worker catches it via storage.onChanged, shows a purple 'SYN'
  badge on the extension icon that persists until Options is opened, and
  fires a desktop notification ('Settings updated via sync folder — open
  Options to review').
- Clicking the desktop notification opens the Options page directly.
- On service worker wake, SYN badge is restored if the notification was
  not yet dismissed.
- Opening Options clears ss_sync_notification, resets the badge, and
  sends a sync:notification-seen message to the service worker.
- Added 'notifications' permission to both manifests.

Cloud storage clarity:
- Options page now explicitly lists that the folder sync works with any
  cloud storage that has a desktop sync client: Dropbox, OneDrive, Google
  Drive, iCloud Drive, Box, pCloud, Nextcloud, Synology Drive, etc.

https://claude.ai/code/session_01TKpSR9M8JgHLXCp5CeDsQP
2026-03-26 14:42:18 +00:00
Claude ea61db7f6e chore: bump version to 0.3.1 for Firefox re-signing
https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:32:58 +00:00
Claude 1995208941 feat: v0.3.0 — multiple entries per field, README setup guide
Identity fields now support multiple entries per type:
- Add unlimited names (first, last, middle, nickname), emails,
  usernames, hostnames, and phone numbers per profile
- "+ Add" button on each section, "x" to remove rows
- Names have a type selector (1st/Last/Mid/Nick)

README now includes:
- First-time setup walkthrough (step by step)
- Icon color legend (gray/black/blue/red)
- Keyboard shortcuts table
- Note that extension does nothing until configured

Also bumps version to 0.3.0 for Firefox re-signing.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:08:46 +00:00
Claude e7880b3b1a feat: keyboard shortcuts for reveal mode and enable toggle
Alt+Shift+R — toggle reveal mode (fake→real in responses)
Alt+Shift+S — toggle Silent Send on/off

Badge flashes "EYE" (blue) when reveal activates, "ON"/"OFF"
(green/red) when toggling enabled state. Users can remap these
in chrome://extensions/shortcuts or Firefox about:addons.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 02:33:38 +00:00
Claude 60b810b1b9 feat: custom domains for OpenWebUI + fix README issues
- Add custom domain support in Options page so users can add
  self-hosted AI services (e.g. https://ai.myserver.com)
- Background worker dynamically injects content scripts on
  custom domains using scripting.executeScript
- Add optional_host_permissions so Chrome can grant per-domain access
- Rewrite README: add clone step to Firefox instructions, clarify
  what "credentials" means in step 3, add Windows commands alongside
  Mac/Linux for every terminal step
- Bump version to 0.2.0

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 00:35:21 +00:00
Claude 6e3249b8ff feat: add support for ChatGPT, Grok, Gemini, and OpenWebUI
Extend Silent Send to intercept API requests on all major AI chat
services. Each service has different API shapes:

- ChatGPT: /backend-api/conversation with content.parts arrays
- Grok: GraphQL + /2/grok/add_response with message field
- Gemini: form-encoded f.req with nested arrays (+ generateContent)
- OpenWebUI: /api/chat and /ollama/api/chat (self-hosted)

All services share the same substitution pipeline. Manifests updated
for both Chrome and Firefox with host_permissions for all domains.
OpenWebUI supported via localhost/127.0.0.1 for self-hosted instances.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 00:27:07 +00:00
Claude 3ef5df7efb feat: add Firefox support with cross-browser compatibility
Add manifest.firefox.json for Firefox MV3 (gecko ID, background
scripts instead of service_worker, options_ui). Introduce
browser-polyfill.js shim so all modules use whichever API is
available (browser.* or chrome.*). Add build.sh to target
chrome, firefox, or both.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-25 23:36:59 +00:00