feat: publication IA (magazine/brief/essay) + fixes critique
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 1m22s
CI / Deploy production (on server) (push) Has been skipped

Publication IA:
- 4 templates (magazine, brief, essay, simple) avec CSS riche
- Rewrite IA (article/exercises/tutorial/reference/mixed)
- Modération avec timeout 12s + fallback safe
- Quotas publish_enhance par tier (basic=2, pro=15, business=100)
- Détection contenu stale (hash)
- Migration DB publishedContent/publishedTemplate/publishedSourceHash

Fixes:
- cheerio v1.2: Element -> AnyNode (domhandler), decodeEntities cast
- _isShared ajouté au type Note (champ virtuel serveur)
- callout colors PDF export: extraction fonction pure testable
- admin/published: guard note.userId null
- Cmd+S fonctionne en mode dialog (pas seulement fullPage)

i18n:
- 23 clés publish* traduites dans les 15 locales
- Extension Web Clipper: 13 locales mise à jour

Tests:
- callout-colors.test.ts (6 tests)
- note-visible-in-view.test.ts (5 tests)
- entitlements.test.ts + byok-entitlements.test.ts: mock usageLog + unstubAllEnvs
- 199/199 tests passent

Tracker: user-stories.md sync avec sprint-status.yaml
This commit is contained in:
Antigravity
2026-06-28 07:32:57 +00:00
parent 902fe95a69
commit 96e7902f01
169 changed files with 5382 additions and 1527 deletions

View File

@@ -575,7 +575,7 @@
"noNoteId": "No note ID"
},
"openAssistant": "AI सहायक खोलें",
"poweredByMomento": "Momento AI द्वारा संचालित",
"poweredByMomento": "Memento AI द्वारा संचालित",
"welcomeMsg": "नमस्ते! मैं आपका AI सहायक हूं। आज मैं आपकी नोट्स में कैसे मदद कर सकता हूं? मैं टोन को परिष्कृत करने, संदेशों का विस्तार करने या सामग्री को सारांशित करने में मदद कर सकता हूं।",
"summaryLast5": "पिछले 5 नोट्स का सारांश",
"analyzingProgress": "विश्लेषण हो रहा है...",
@@ -2184,7 +2184,30 @@
"importMarkdown": "Markdown आयात करें",
"markdownExportSuccess": "नोट Markdown के रूप में निर्यात किया गया",
"markdownExportError": "नोट निर्यात करने में विफल",
"markdownImportSuccess": "Markdown सफलतापूर्वक आयात किया गया"
"markdownImportSuccess": "Markdown सफलतापूर्वक आयात किया गया",
"publishTitle": "सार्वजनिक प्रकाशन",
"publishDesc": "इस नोट को एक सार्वजनिक URL पर प्रकाशित करें। किसी के पास लिंक हो तो पढ़ सकता है।",
"publish": "प्रकाशित करें",
"publishSuccess": "नोट प्रकाशित!",
"publishLive": "लाइव",
"unpublish": "प्रकाशन रद्द करें",
"unpublishSuccess": "नोट अप्रकाशित",
"publishBlocked": "प्रकाशन अस्वीकृत",
"publishSimple": "जैसा है वैसा प्रकाशित करें",
"publishSimpleHint": "मुफ्त — आपके नोट की सामग्री ज्यों की त्यों",
"publishWithAi": "AI से प्रकाशित करें",
"publishWithAiHint": "बेहतर लेआउट · {count} क्रेडिट शेष",
"publishWithAiLocked": "Pro प्लान में उपलब्ध",
"publishWithAiGenerating": "लेआउट बना रहा है…",
"publishTemplateMagazine": "मैगज़ीन लेख",
"publishTemplateBrief": "विशेषज्ञ ब्रीफिंग",
"publishTemplateEssay": "निबंध",
"publishAiSuccess": "AI-संवर्धित पेज प्रकाशित!",
"publishRewriteLabel": "वेब के लिए पुनर्लेखन करें",
"publishRewriteOnHint": "आपके एडिटर ब्लॉक्स (अभ्यास, टॉगल, कॉलआउट) को वेब के लिए व्यवस्थित करता है — AI केवल परिचय लिखता है",
"publishRewriteOffHint": "आपका मूल पाठ रखा जाता है; AI केवल संपादकीय ढांचा जोड़ता है",
"copyPublicLink": "लिंक कॉपी करें",
"openPublicPage": "सार्वजनिक पेज खोलें"
},
"brainstorm": {
"title": "Waves of Thought",
@@ -2492,7 +2515,7 @@
"badge": "कृत्रिम बुद्धिमत्ता से संचालित",
"title1": "आपका दूसरा दिमाग,",
"title2": "आखिरकार प्रबलित।",
"subtitle": "Momento सिर्फ़ नोट ऐप नहीं है। यह एक बुद्धिमान इकोसिस्टम है जो 6 प्रकार के AI एजेंट और अत्याधुनिक सिमैंटिक खोज के साथ आपके विचारों को रियल टाइम में जोड़ता, विश्लेषण करता और विकसित करता है।",
"subtitle": "Memento सिर्फ़ नोट ऐप नहीं है। यह एक बुद्धिमान इकोसिस्टम है जो 6 प्रकार के AI एजेंट और अत्याधुनिक सिमैंटिक खोज के साथ आपके विचारों को रियल टाइम में जोड़ता, विश्लेषण करता और विकसित करता है।",
"cta": "अभी साइन अप करें",
"secondary": "सुविधाएँ देखें",
"memoryEcho": "Memory Echo",
@@ -2504,7 +2527,7 @@
"label": "AI क्षमताएँ",
"title": "प्रवाही बुद्धि,",
"title2": "हर शब्द में बुनी हुई।",
"desc": "Momento मल्टी-प्रोवाइडर आर्किटेक्चर से आपके विचारों को व्यवस्थित करता है।",
"desc": "Memento मल्टी-प्रोवाइडर आर्किटेक्चर से आपके विचारों को व्यवस्थित करता है।",
"f1Title": "सिमैंटिक खोज",
"f1Desc": "कीवर्ड से खोजना छोड़ें। अवधारणा से खोजें। हमारा हाइब्रिड Vector + FTS इंजन आपके नोट्स के पीछे के इरादे को समझता है।",
"f2Title": "संदर्भित RAG चैट",
@@ -2590,7 +2613,7 @@
"popular": "सबसे लोकप्रिय",
"basic": {
"name": "Basic",
"desc": "Momento का जादू खोजें।",
"desc": "Memento का जादू खोजें।",
"cta": "शुरू करें",
"feature0": "अधिकतम 100 नोट",
"feature1": "3 नोटबुक",
@@ -2636,7 +2659,7 @@
"byok": {
"label": "ओपन क्लाउड तकनीक",
"title": "BYOK रणनीति",
"desc": "पहले से OpenAI, Anthropic या Google API कुंजी हैं? सीधे Momento से जोड़ें। बिना लागू क्रेडिट सीमा के AI उपयोग करें, केवल पसंदीदा प्रोवाइडर पर वास्तविक खपत का भुगतान करें।",
"desc": "पहले से OpenAI, Anthropic या Google API कुंजी हैं? सीधे Memento से जोड़ें। बिना लागू क्रेडिट सीमा के AI उपयोग करें, केवल पसंदीदा प्रोवाइडर पर वास्तविक खपत का भुगतान करें।",
"noLockin": "कोई लॉक-इन नहीं",
"noLockinDesc": "1 क्लिक में प्रोवाइडर बदलें।",
"cost": "अनुकूलित लागत",
@@ -2646,8 +2669,8 @@
"cta": {
"title1": "अपनी",
"title2": "पूरी क्षमता खोलने के लिए तैयार?",
"desc": "हज़ारों शोधकर्ताओं, डिज़ाइनरों और विचारकों से जुड़ें जो Momento से अपना भविष्य बना रहे हैं।",
"button": "Momento लॉन्च करें"
"desc": "हज़ारों शोधकर्ताओं, डिज़ाइनरों और विचारकों से जुड़ें जो Memento से अपना भविष्य बना रहे हैं।",
"button": "Memento लॉन्च करें"
},
"footer": {
"desc": "AI-प्रबलित दूसरा दिमाग। रचनात्मक दिमागों के लिए।",
@@ -2704,14 +2727,14 @@
"necessaryDesc": "These cookies are required to authenticate your session, save your language and theme preferences. They cannot be turned off.",
"alwaysOn": "Always On",
"analyticsTitle": "Anonymous Analytics",
"analyticsDesc": "Help us improve Momento by sending completely anonymous usage statistics. No personal data is ever tracked.",
"analyticsDesc": "Help us improve Memento by sending completely anonymous usage statistics. No personal data is ever tracked.",
"cancel": "Cancel",
"save": "Save Preferences",
"saved": "Preferences updated successfully."
},
"ai": {
"modalTitle": "AI प्रसंस्करण के लिए सहमति आवश्यक",
"modalDescription": "आपकी नोट्स, PDF या ब्रेनस्टॉर्म सत्रों का विश्लेषण करने के लिए Momento ये डेटा सुरक्षित रूप से तृतीय-पक्ष AI API (OpenAI, Gemini, DeepSeek) को भेजता है। हम सख्त शून्य-डेटा-रिटेंशन नीति लागू करते हैं। स्वीकार करने पर आप इस प्रसंस्करण को अधिकृत करते हैं।",
"modalDescription": "आपकी नोट्स, PDF या ब्रेनस्टॉर्म सत्रों का विश्लेषण करने के लिए Memento ये डेटा सुरक्षित रूप से तृतीय-पक्ष AI API (OpenAI, Gemini, DeepSeek) को भेजता है। हम सख्त शून्य-डेटा-रिटेंशन नीति लागू करते हैं। स्वीकार करने पर आप इस प्रसंस्करण को अधिकृत करते हैं।",
"zeroRetentionTitle": "शून्य डेटा रिटेंशन",
"zeroRetentionDesc": "सभी आउटबाउंड अनुरोधों में मॉडल प्रशिक्षण रोकने वाले फ्लैग शामिल हैं, ताकि आपकी बौद्धिक संपदा सुरक्षित रहे।",
"rememberMe": "मेरी पसंद याद रखें (दोबारा न पूछें)",
@@ -2725,10 +2748,10 @@
"statusActive": "सक्रिय",
"statusInactive": "नहीं दी गई",
"helpAriaLabel": "AI सहमति का क्या अर्थ है?",
"helpTooltip": "Momento आपका डेटा नहीं बेचता। यह सहमति केवल जब आप AI क्रिया चलाते हैं (शीर्षक, टैग, चैट, पुनर्लेखन) तब लागू होती है। इसके बिना ऐप का बाकी हिस्सा सामान्य रूप से काम करता है।",
"helpTooltip": "Memento आपका डेटा नहीं बेचता। यह सहमति केवल जब आप AI क्रिया चलाते हैं (शीर्षक, टैग, चैट, पुनर्लेखन) तब लागू होती है। इसके बिना ऐप का बाकी हिस्सा सामान्य रूप से काम करता है।",
"whatItMeansTitle": "इसका क्या मतलब है?",
"inactiveHint": "सहमति के बिना केवल AI सुविधाएँ बंद रहती हैं। नोट बनाना, संपादित करना और व्यवस्थित करना सामान्य रूप से जारी रह सकता है।",
"noCommercialUse": "Momento आपके व्यक्तिगत डेटा को न बेचता है न उससे आय अर्जित करता है।",
"noCommercialUse": "Memento आपके व्यक्तिगत डेटा को न बेचता है न उससे आय अर्जित करता है।",
"affectedFeatures": "प्रभावित सुविधाएँ: शीर्षक सुझाव, टैग, AI चैट, पुनर्लेखन, Memory Echo आदि।",
"dataPortabilityHint": "आप कभी भी सभी डेटा निर्यात या हटा सकते हैं (सेटिंग्स → डेटा)।",
"dataPortabilityLink": "मेरा डेटा निर्यात करें",
@@ -2782,7 +2805,7 @@
},
"onboarding": {
"welcome_title": "AI-संवर्धित आपकी स्मृति",
"welcome_subtitle": "Momento वह याद रखता है जो आप भूल जाते हैं।",
"welcome_subtitle": "Memento वह याद रखता है जो आप भूल जाते हैं।",
"welcome_cta": "शुरू करें",
"skip": "छोड़ें",
"step_notes_title": "आपके नोट्स",
@@ -2794,7 +2817,7 @@
"step_aha_title": "वह खोजें जो आप भूल गए",
"step_aha_subtitle": "एक प्रश्न लिखें। भूला हुआ नोट खोजें।",
"step_aha_placeholder": "उत्पादकता पर नोट्स...",
"step_aha_cta": "Momento एक्सप्लोर करें",
"step_aha_cta": "Memento एक्सप्लोर करें",
"progress": "{total} में से {current}",
"creating_demo_notes": "उदाहरण नोट्स बना रहे हैं...",
"demo_notes_ready": "5 उदाहरण नोट्स बनाए गए!",
@@ -2898,4 +2921,4 @@
"copyRefNoNote": "Save the note before copying a block reference",
"copyRefUnsupported": "This block type cannot be referenced yet"
}
}
}