- applyTag faisait un PATCH sur /api/notes/[id]/properties avec { tags: [...] }
mais l'API properties attend { properties: { propId: value } }
- Maintenant: PATCH /api/ai/organize-notebook qui appelle syncNoteLabels()
- Les tags sont appliqués comme LABELS (système existant) sur les notes
- Merge avec labels existants (n'écrase pas)
- Ancien bouton 'Organiser' (batch.organize) supprimé — doublon
- Nouvel organisateur (structuredViews.organizer) consolidé avec Planning + Résumé
- Actions IA regroupées avec séparateurs visuels
- Icônes plus petites (14px au lieu de 16px) pour gagner de la place
- Clé i18n corrigée : structuredViews.organizer au lieu de wizard.organizer
- CSV Import/Export maintenu dans la même zone
- OrganizeNotebookDialog marqué unused
Le champ Relation reproduit ce que les wikilinks font déjà.
Momento est centré sur les notes, pas sur les bases de données.
Ajoute de la complexité pour un bénéfice nul.
- AI Overview : synthèse IA en haut des résultats de recherche (Ctrl+K)
- Service search-overview.service.ts
- Endpoint /api/ai/search-overview
- Carte 'Réponse IA' avec Sparkles en haut du panneau gauche
- Pur additif, ne modifie pas le classement des résultats
- AI Writer inline : slash menu → 'Écrire avec l'IA' → champ inline
- Mode 'write' dans paragraph-refactor.service.ts
- Streaming paragraphe par paragraphe (120ms delay)
- Nettoyage HTML (espaces vides supprimés)
- Ref synchrone pour éviter fermeture du menu pendant la frappe
- Fix: index slashCommands AI Writer corrigé
- Fix: Loader2 import manquant
- i18n FR/EN
- Mode 'write' ajouté à paragraph-refactor.service.ts
- Endpoint /api/ai/reformulate étendu (option 'write' + writePrompt)
- UI : champ de prompt inline apparaît au curseur après slash menu
- Tape / → 'Écrire avec l'IA' → décrit ce que tu veux → Entrée
- L'IA génère et insère le contenu à la position du curseur
- Pas de migration DB, réutilise l'infra existante
- i18n FR/EN
- Service notebook-organizer.service.ts : analyse IA des notes
- Endpoint /api/ai/organize-notebook
- Dialog avec 4 sections :
1. Résumé de l'état du carnet
2. Tags suggérés (cliquable pour appliquer)
3. Regroupements logiques par catégorie
4. Détection de doublons avec explication
- Bouton 'Organiser' (Wand2) dans la barre du carnet
- i18n FR/EN complet
- Complète les 3 scénarios : Prof (wizard+exercices), Étudiant (wizard+planning), Ingénieur (organisateur)
- Menu déroulant GraduationCap : Flashcards + Exercices réunis
- Fix: language non défini dans toolbar (useLanguage destructuring)
- Fix: équations 658071 → KaTeX dans exercices (preprocessMathInHtml partagé)
- lib/text/math-preprocess.ts : utilitaire partagé wizard + exercices
- Toast avec bouton 'Voir' pour rafraîchir après création exercices
- emitNoteChange pour rafraîchir la liste
- i18n FR/EN
- Générateur d'exercices déplacé du menu ⋯ vers le panneau IA (onglet Actions > Outils de génération)
- Même design que les cartes slides/diagrammes
- Fix: import useLanguage supprimé de la route API (hook client en serveur)
- i18n FR/EN
- Générateur d'exercices : bouton dans menu note → IA crée 5 exercices
- Niveaux variés (facile/moyen/difficile) avec emojis 🟢🟡🔴
- Corrigés détaillés dans des toggles (cliquer pour révéler)
- Callout warning pour le niveau
- Notes créées dans le même carnet
- Planning de révision : bouton dans barre carnet → IA crée planning
- Choix date d'examen
- Répétition espacée (première lecture → revoir → révision globale)
- Rappels automatiques ajoutés aux notes (9h le jour J)
- Vue chronologique avec activités et notes par jour
- Services : exercise-generator.service.ts + study-planner.service.ts
- Endpoints : /api/ai/generate-exercises + /api/ai/study-plan
- i18n FR/EN complet
- Wizard IA: création de carnet complet (étudiant/prof/ingénieur)
- 3 profils, choix niveau, nombre de notes (3-12)
- Étapes numérotées, messages de progression, écran de succès
- Notes riches avec callouts, toggles, équations, colonnes
- Structured View auto-créé avec propriétés Statut/Difficulté
- Embeddings en arrière-plan
- Export PDF: clone le DOM réel, rend KaTeX, préserve couleurs callouts
- Fix: boutons toggle/callout en hover-only
- Fix: parsing JSON robuste (backslashes LaTeX)
- Fix: flushSync warning (queueMicrotask)
- Fix: drag handle clamp viewport
- Bouton wizard dans la sidebar (✨ à côté du +)
- i18n FR/EN complet
- Drag handle résout les blocs conteneurs (columns, toggle, callout) au lieu du paragraphe intérieur
- Delete agit sur tout le bloc conteneur, pas juste le paragraphe
- Menu popup (block action menu) clampé dans le viewport (Math.min + overflow auto)
- Drag handle clamped dans le viewport via MutationObserver + scroll/resize
- Architecture nested nodes: columns container → column children
- CSS seamless (pas de bordures, fin séparateur vertical entre colonnes)
- isolating: true sur les deux nœuds (curseur reste dans sa colonne)
- Commands addColumnBefore/addColumnAfter/deleteColumn
- Slash menu + drag handle + raccourci Mod+Shift+L
- i18n FR/EN complet
- Calculs en pied de tableau : Somme/Moyenne/Min/Max/Compte, cliquable pour changer
- Link Preview : métadonnées persistées + texte indexable pour recherche/embeddings
- Fix: bg-memento-paper → bg-card (dark mode) sur dialogs Structured Views
- Fix: bouton Ajouter un champ → brand-accent au lieu de primary
- Calendar view retiré du sélecteur (non pertinent)
- Bloc Link Preview : colle une URL → carte avec titre, description, image, favicon
- API /api/link-preview : extraction OpenGraph + meta tags
- API /api/image-proxy : contourne le hotlinking (Referer spoofing)
- Métadonnées persistées en HTML (data-preview JSON) — pas de refetch au reload
- Texte indexable : titre + description + URL inclus pour recherche/embeddings
- Modal propre pour saisir l'URL (plus de prompt())
- Slash menu + smart paste 'Coller comme carte aperçu'
- i18n FR/EN complet
- Fix: bouton calendrier retiré du sélecteur de vue
- Nouveau bloc Toggle : sections dépliables dans l'éditeur (slash menu + drag handle)
- Transformer un bloc existant en section repliable via le menu d'action
- Boutons désactiver (unwrap) et supprimer dans l'en-tête
- i18n FR/EN complet
- Infrastructure embeddings par fragments (inspiré AppFlowy)
- Table NoteEmbeddingChunk + index HNSW
- Chunking sémantique (~1000 chars, overlap 200, dedup par hash)
- Indexation incrémentale au save (createNote + updateNote + clip)
- Queue concurrence 4, retry backoff exponentiel
- ai-chat: sélecteur tone (Professional/Créatif/Académique/Décontracté)
passé via noteContext.tone dans le body vers /api/chat
- network-graph: dragended garde fx/fy → nœud épinglé après drag
double-clic sur nœud pour désépingler (fx=null, fy=null)
- sprint-status: 6-2 et 6-3 passés en done
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
L'input caché dans le toolbar était bloqué par le conteneur parent.
Maintenant l'input est créé dynamiquement dans le handler et détruit
après usage — garanti d'ouvrir l'explorateur fichiers.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- use-auto-tagging: onQuotaExceeded via ref stable → n'invalide plus
useCallback analyzeContent à chaque render parent
- note-editor-context: filteredSuggestions et existingLabelsLower
stabilisés avec useMemo (était recalculé sans memo → nouvelle ref
à chaque render → état useMemo state se réexécutait → boucle)
- deepseek.ts: generateTags via generateText (pas generateObject)
pour éviter response_format:json_schema non supporté
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- SlideChart reçoit isDark et adapte tooltip, tick, grid, cursor, légende
- margin bottom 40px pour que les labels X-axis ne soient plus coupés
- cursor et tooltip blancs en thème clair (fini le carré noir)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- slides-renderer: chart et diagram utilisent bg/text/muted du thème
(plus de fond #111827 forcé)
- slides.tool: prompt ultra-clair (<50 mots = max 3 slides)
+ cappedSlides.slice(0,8) côté serveur comme filet de sécurité
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Le graphe était noir car recharts cherchait xKey='name' mais les données
avaient {label,value}. Fix dans normalizeSlide case 'chart':
- data.map({label,value} → {name,value})
- xKey: 'name', yKeys: ['value'] explicitement
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- slides-renderer: SlideChart supporte le nouveau format plat
(slide.chartType + slide.data[{label,value}]) en plus de slide.chart
→ corrige la slide noire avec légende visible mais graphe vide
- slides.tool: nombre de slides adapté au contenu
(3-4 pour note courte, 5-7 moyenne, 8-12 longue)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reverts le changement qui avait cassé les graphes des slides.
data.spec → SlidesRenderer (recharts, graphes OK)
data.html → iframe (fallback si pas de spec)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- canvas-board.tsx: préfère data.html (iframe) sur data.spec (ancien renderer)
→ corrige slide 3 noire en mode HTML viewer
- pptx/route.ts: ajoute watermark 'memento-note.com' sur chaque slide
via buildPptx (PPTX téléchargé depuis le canvas)
- run-for-note/route.ts: checkEntitlementOrThrow avant création agent
- slides.tool.ts: incrementUsageAsync après canvas créé avec succès
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>