feat: implement M2 Chrome browser extension
Build the CookieBridge Chrome extension (Manifest V3) with:
- Background service worker: cookie monitoring via chrome.cookies.onChanged,
WebSocket connection to relay server with auto-reconnect, HTTP polling
fallback, device registration and pairing flow
- Browser-compatible crypto: libsodium-wrappers-sumo for XChaCha20-Poly1305
encryption, Ed25519 signing, X25519 key exchange (mirrors server's
sodium-native API)
- Popup UI: device registration, connection status indicator (gray/blue/
green/red), cookie/device/sync stats, one-click current site sync,
whitelist quick-add, device pairing with 6-digit code
- Options page: server URL config, connection mode (auto/WS/polling),
poll interval slider, auto-sync toggle, domain whitelist/blacklist
management, paired device list, key export/import, data clearing
- Sync engine: LWW conflict resolution with Lamport clocks (same as
server), bidirectional cookie sync with all paired peers, echo
suppression to prevent sync loops
- Badge management: icon color reflects state (gray=not logged in,
blue=connected, green=syncing with count, red=error)
- Build system: esbuild bundling for Chrome 120+, TypeScript with
strict mode, clean type checking
Co-Authored-By: Paperclip <noreply@paperclip.ing>