Bug réel : la bannière 'Surlignez le texte à clipper' n'apparaissait
jamais en pratique parce que le side panel envoyait SET_PICK_MODE
avant que le content script ne soit prêt (race condition MV3 entre
chrome.scripting.executeScript et la mise en place du listener
chrome.runtime.onMessage). Le retry PING dans ensureContentScript
ne suffisait pas : le listener sidepanel peut aussi être en retard.
Fix radical : content.js affiche la bannière IMMÉDIATEMENT à
l'initialisation, sans attendre SET_PICK_MODE. L'utilisateur voit
immédiatement que l'extension est active. Un bouton ✕ permet de
la fermer (state local au tab). Pas de dépendance sur le side panel
pour le feedback visuel.
+ manifest : retrait de optional_host_permissions (redondant avec
host_permissions http://*/* et https://*/*, peut perturber Chrome
en dev).
+ bannière rediseignée : max-width 640px responsive, animation
slideIn, bouton ✕ accessible.
+ nouvelles clés i18n bannerDismiss dans les 15 locales.
+ build : exclusion de store-assets/ du zip et du xpi (sinon le
package Store faisait 327 Ko au lieu de 47 Ko).
- extension/scripts/generate-store-assets.py : générateur Python/PIL avec
la palette x.ai premium (BG #0B0A09, TEXT #F4F1EA, OCHRE #D4A373).
- extension/store-assets/ :
* icon-128.png (128×128)
* promo-tile-small.png (440×280)
* promo-tile-large.png (920×680)
* marquee.png (1400×560)
* screenshot-1.png (1280×800) — sidebar idle avec sélecteur de carnet
* screenshot-2.png (1280×800) — confirmation IA avec résumé + tags
* screenshot-3.png (1280×800) — vue RTL/persan (font DejaVu pour glyphes)
Tous les assets respectent les dimensions Chrome Web Store et sont prêts
pour la soumission.
- Nouvelle page /privacy bilingue (FR/EN) avec sélection par Accept-Language
ou ?lang=, sections complètes (données collectées, IA/BYOK, RGPD, sécurité,
contact). Style sombre aligné sur la landing (x.ai premium).
- Liens footer landing.footer.legal.* mis à jour vers /privacy dans les 15 locales.
- Extension Web Clipper rendue cross-browser :
* background.js détecte chrome.sidePanel vs browser.sidebarAction
* sidepanel.js ajoute un shim chrome<->browser pour Firefox
* manifest.json inclut sidebar_action + browser_specific_settings.gecko
+ optional_host_permissions (Chrome les ignore)
- Script scripts/build-firefox.mjs pour produire un .xpi signé pour AMO,
symétrique de build-chrome-store.mjs. Exclusion mutuelle des artefacts
Chrome/Firefox pour éviter la cross-contamination.
- Branding corrigé : 176 occurrences de 'Momento' -> 'Memento' dans le
bundle de traductions embarqué.
- Version bumpée 0.3.1 -> 0.4.0.
1. Recherche: fetchChunkSnippets() — après le classement RRF existant,
récupère les passages précis qui matchent depuis NoteEmbeddingChunk.
Pur affichage, AUCUN changement de classement.
2. Script migration: scripts/migrate-chunk-embeddings.ts
Indexe toutes les notes existantes en fragments.
Batch de 10, barre de progression.
Usage: npx tsx scripts/migrate-chunk-embeddings.ts
3. Memory Echo chunk-level: à faire (US restante)