fix(quotas): unifier le décompte IA (BYOK, rollback) et combler les fuites
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m55s
CI / Deploy production (on server) (push) Successful in 36s

Centralise la réserve via ai-quota, corrige admin unavailable (-1), brancher les routes sans quota et le host-pays brainstorm, avec usage-meter élargi, noms de clusters, MCP et ajustements dashboard/insights.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Antigravity
2026-07-15 20:42:25 +00:00
parent 30da592ba2
commit 4fe31ebc99
75 changed files with 2949 additions and 785 deletions

View File

@@ -1764,7 +1764,11 @@
"featureCharts": "Graphiques IA",
"featurePublishEnhance": "Publication IA",
"featureBrainstormExpand": "Extensions brainstorm",
"featureBrainstormEnrich": "Enrichissements brainstorm"
"featureBrainstormEnrich": "Enrichissements brainstorm",
"featureFlashcards": "Flashcards IA",
"featureVoice": "Transcription vocale",
"featureSlides": "Génération de diapositives",
"featureDiagrams": "Génération de diagrammes"
},
"generalSettings": {
"title": "Généraux",
@@ -2042,6 +2046,8 @@
"mcpSettings": {
"title": "MCP",
"description": "Gérez vos clés API et configurez les outils externes",
"tierRequired": "Réservé Pro+",
"upgradeHint": "L'accès MCP (clés API pour Cursor, Claude Desktop, etc.) nécessite un abonnement Pro ou supérieur. Passez à Pro dans Facturation pour débloquer cette fonctionnalité.",
"whatIsMcp": {
"title": "Qu'est-ce que MCP ?",
"description": "Le Model Context Protocol (MCP) est un protocole ouvert qui permet aux modèles IA d'interagir de manière sécurisée avec des outils et sources de données externes. Avec MCP, vous pouvez connecter des outils comme Claude Code, Cursor ou N8N à votre instance Memento pour lire, créer et organiser vos notes par programmation.",
@@ -2067,7 +2073,12 @@
"lastUsed": "Dernière utilisation",
"never": "Jamais",
"confirmRevoke": "Êtes-vous sûr de vouloir révoquer cette clé ? Les outils qui l'utilisent perdront leur accès.",
"confirmDelete": "Êtes-vous sûr de vouloir supprimer définitivement cette clé ?"
"confirmDelete": "Êtes-vous sûr de vouloir supprimer définitivement cette clé ?",
"errors": {
"generate": "Échec de la génération de la clé",
"revoke": "Échec de la révocation de la clé",
"delete": "Échec de la suppression de la clé"
}
},
"createDialog": {
"title": "Générer une clé API",
@@ -2097,6 +2108,15 @@
"title": "N8N",
"description": "Utilisez ces identifiants dans votre nœud MCP N8N :"
}
},
"helpBox": {
"title": "Qu'est-ce que MCP (Model Context Protocol) ?",
"step1": "MCP est un protocole qui permet aux agents IA de Memento de se connecter à des outils externes (bases de données, APIs, fichiers, etc.).",
"step2": "Memento expose un serveur MCP avec 22 outils — vos agents peuvent lire/créer des notes, chercher dans votre base, gérer les carnets, etc.",
"step3": "Créez une clé API ici, puis configurez-la dans votre client MCP (Claude Desktop, Cursor, Continue.dev…) avec l'URL du serveur.",
"step4": "Format de configuration : URL du serveur MCP + votre clé dans le header Authorization.",
"step4Link": "Documentation MCP",
"step5": "Cas d'usage : demandez à Claude Desktop d'écrire une note dans Memento, de chercher dans vos carnets, ou de créer un agent."
}
},
"agents": {
@@ -3281,14 +3301,19 @@
"checkoutFailed": "Échec du démarrage du paiement. Veuillez réessayer.",
"portalFailed": "Échec de l'ouverture du portail de facturation.",
"cancelFailed": "Échec de l'annulation de l'abonnement.",
"downloadPdf": "Télécharger le PDF"
"downloadPdf": "Télécharger le PDF",
"fetchStatusFailed": "Échec du chargement des informations de facturation",
"fetchQuotasFailed": "Échec du chargement des quotas",
"fetchInvoicesFailed": "Impossible de charger l'historique de facturation.",
"savePercent": "Économisez ~17%"
},
"quotaPaywall": {
"title": "Limite mensuelle atteinte",
"description": "Vous avez épuisé vos crédits pour la fonctionnalité {feature} ce mois-ci.",
"upgrade": "Passer au plan supérieur",
"useOwnKey": "Clé API perso",
"later": "Peut-être plus tard"
"later": "Peut-être plus tard",
"closingIn": "Fermeture dans {n}s"
},
"landing": {
"nav": {
@@ -3554,6 +3579,10 @@
"staleResults": "Résultats affichés depuis la dernière analyse. Beaucoup de notes ont changé depuis — cliquez « Resynchroniser le réseau » pour mettre à jour.",
"semanticGraphLegend": "Aperçu des thèmes détectés (pas la carte des liens)",
"fitGraphView": "Ajuster la vue",
"legendFilterPlaceholder": "Filtrer les thèmes…",
"legendShowMore": "+{count} autres",
"legendShowLess": "Réduire",
"dashboardFilterPlaceholder": "Filtrer notes-ponts, thèmes…",
"graphPreviewHint": "Aperçu par thème : le chiffre = nombre de notes. Survolez un point pour le titre, cliquez pour ouvrir. Liste complète à droite.",
"graphMoreNotes": "+{count} autres dans ce thème",
"graphNotesLabel": "notes",
@@ -3562,8 +3591,10 @@
"emptyTitle": "Découvrez vos clusters de connaissance",
"emptyDescription": "Cliquez sur « Resynchroniser le réseau » pour analyser vos notes et révéler des connexions cachées",
"stats": {
"clusters": "Clusters",
"bridgeNotes": "Notes pont"
"clusters": "Thèmes",
"bridgeNotes": "Notes pont",
"themesSubtitle": "thèmes détectés",
"bridgesSubtitle": "notes transversales"
},
"clusters": {
"title": "Clusters sémantiques",
@@ -3572,16 +3603,24 @@
"emptyCluster": "Aucune note dans ce cluster"
},
"bridgeNotes": {
"title": "Notes pont stratégiques",
"title": "Notes pont",
"score": "Score : {score} %",
"affinity": "Affinité {score} %",
"scoreHint": "Affinité sémantique moyenne avec les deux thèmes que cette note relie (similarité cosinus).",
"moreThemes": "+{count}",
"needsResync": "Resynchronisez le réseau pour rafraîchir les paires de thèmes.",
"empty": "Aucune note pont significative pour l'instant. Approfondissez vos recherches pour découvrir de nouvelles connexions."
},
"suggestions": {
"title": "Liens manquants (générés par l'IA)",
"title": "Liens manquants",
"bridging": "Relier {clusterA} et {clusterB}",
"emptyTitle": "Aucune suggestion de connexion",
"emptyDescription": "Vos clusters sont peut-être déjà bien reliés entre eux !",
"createNote": "Créer la note pont"
"emptyDescription": "Aucune paire de thèmes « presque liés » pour l'instant — ou resynchronisez pour rafraîchir les prédictions.",
"createNote": "Créer la note pont",
"created": "Note pont créée",
"createError": "Impossible de créer la note pont",
"dismiss": "Ignorer",
"dismissError": "Impossible d'ignorer cette suggestion"
},
"unknownNote": "Note sans titre",
"viewSplit": "Combiné",
@@ -3602,11 +3641,11 @@
"echoTitle": "Tu reviens sur cette idée",
"tipClusters": "L'IA a regroupé tes notes par affinité sémantique — indépendamment de tes carnets. Chaque thème représente un sujet sur lequel ton esprit revient régulièrement.",
"tipClustersAction": "Clique sur un thème pour voir ses notes. Clique sur une note pour l'ouvrir.",
"tipBridgeNotes": "Ces notes parlent de deux thèmes différents à la fois. Elles montrent où ta pensée traverse des frontières — souvent là où se cachent les idées les plus originales.",
"tipBridgeNotes": "Une note pont se situe au croisement de deux thèmes (brokerage sémantique). On garde la paire la plus forte — pas tous les thèmes faibles touchés au passage.",
"tipBridgeNotesAction": "Clique sur une note pour l'ouvrir et comprendre le lien.",
"tipEcho": "Le Memory Echo détecte deux notes écrites à des moments très différents mais qui parlent de la même chose. Ton esprit a revisité une idée sans que tu t'en rendes compte.",
"tipEchoAction": "Deux notes, même idée, moments différents. Clique pour explorer.",
"tipSuggestions": "Ces thèmes n'ont pas encore de note qui les relie. L'IA te propose une idée de départ. Clique sur « Créer la note pont » pour la rédiger et l'ouvrir dans l'éditeur.",
"tipSuggestions": "Suggestions uniquement pour des paires de thèmes proches (link prediction) : assez liées pour mériter un pont, pas des métaphores forcées. Créez la note si l'objet ou la méthode partagée est réelle.",
"tipSuggestionsAction": "Clique sur « Créer la note pont » pour créer la note et l'ouvrir immédiatement.",
"tipIsolated": "Ces thèmes sont isolés : aucune note ne les relie aux autres. Peut-être explores-tu une idée encore fragile ? Une note de synthèse suffirait à créer le lien.",
"tipIsolatedAction": "Ces thèmes n'ont aucune note qui les relie au reste de ta réflexion.",
@@ -3618,6 +3657,13 @@
},
"resetFocus": "Réinitialiser focus",
"listView": "Liste",
"listFilterPlaceholder": "Filtrer thèmes ou notes…",
"listFilterEmpty": "Aucun thème ni note ne correspond à ce filtre.",
"listFilterMatch": "correspondances",
"listSortLabel": "Trier",
"listSortSize": "Par taille",
"listSortBridges": "Par ponts",
"listSortAlpha": "AZ",
"graphAriaLabel": "Réseau sémantique : {clusters} thèmes, {notes} notes, {bridges} notes-ponts. Basculez en vue Liste pour une navigation accessible.",
"listAriaLabel": "Liste accessible des clusters avec notes et connexions ponts"
},
@@ -4024,6 +4070,9 @@
"notes": "notes",
"continue": "Reprendre ici",
"noRecentNotes": "Aucune note récente.",
"resumeEmptyHint": "Vos notes récentes apparaîtront ici. Capturez une idée ou ouvrez un carnet pour commencer.",
"resumeEmptyCta": "Capturer une idée",
"resumeAlso": "Aussi récemment",
"untitled": "Sans titre",
"inbox": "Inbox",
"sentiment": "Analyse émotionnelle",
@@ -4160,6 +4209,11 @@
"flashRetention": "Maîtrisées",
"flashStreak": "Série",
"flashTotal": "Cartes",
"flashEmptyHint": "Pas encore de flashcards. Générez-en depuis une note (icône diplôme dans léditeur), puis suivez votre progression ici.",
"flashEmptyCta": "Ouvrir les révisions",
"flashDueCta": "{count} cartes à réviser aujourdhui",
"flashOpenCta": "Voir la progression",
"activityEmptyHint": "Éditez des notes pour voir votre rythme décriture sur 90 jours.",
"pathTypes": {
"continue": "Continuer",
"connect": "Lien sémantique",