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": "فتح مساعد الذكاء الاصطناعي",
"poweredByMomento": "مدعوم من Momento AI",
"poweredByMomento": "مدعوم من Memento AI",
"welcomeMsg": "مرحبًا! أنا مساعدك الذكي. كيف يمكنني مساعدتك في ملاحظاتك اليوم؟ يمكنني تحسين النبرة أو توسيع الرسائل أو تلخيص المحتوى.",
"summaryLast5": "ملخص آخر 5 ملاحظات",
"analyzingProgress": "جاري التحليل...",
@@ -2184,7 +2184,30 @@
"importMarkdown": "استيراد Markdown",
"markdownExportSuccess": "تم تصدير الملاحظة كـ Markdown",
"markdownExportError": "فشل تصدير الملاحظة",
"markdownImportSuccess": "تم استيراد Markdown بنجاح"
"markdownImportSuccess": "تم استيراد Markdown بنجاح",
"publishTitle": "النشر العام",
"publishDesc": "انشر هذه الملاحظة على رابط عام. يمكن لأي شخص لديه الرابط قراءتها.",
"publish": "نشر",
"publishSuccess": "تم نشر الملاحظة!",
"publishLive": "مباشر",
"unpublish": "إلغاء النشر",
"unpublishSuccess": "تم إلغاء نشر الملاحظة",
"publishBlocked": "تم رفض النشر",
"publishSimple": "نشر كما هو",
"publishSimpleHint": "مجاني — محتوى ملاحظتك كما هو",
"publishWithAi": "النشر بالذكاء الاصطناعي",
"publishWithAiHint": "تخطيط محسّن · {count} رصيد متبقي",
"publishWithAiLocked": "متاح في باقة Pro",
"publishWithAiGenerating": "جاري إنشاء التخطيط…",
"publishTemplateMagazine": "مقال مجلات",
"publishTemplateBrief": "إفادة خبير",
"publishTemplateEssay": "مقال",
"publishAiSuccess": "تم نشر الصفحة المحسّنة بالذكاء الاصطناعي!",
"publishRewriteLabel": "إعادة الكتابة للويب",
"publishRewriteOnHint": "ينظّم كتل المحرر (تمارين، أقسام قابلة للطي، صناديق تنبيه) للويب — الذكاء الاصطناعي يكتب المقدمة فقط",
"publishRewriteOffHint": "يُحفظ نصك الأصلي؛ الذكاء الاصطناعي يضيف فقط الإطار التحريري",
"copyPublicLink": "نسخ الرابط",
"openPublicPage": "فتح الصفحة العامة"
},
"brainstorm": {
"title": "Waves of Thought",
@@ -2492,7 +2515,7 @@
"badge": "مدعوم بالذكاء الاصطناعي",
"title1": "عقلك الثاني،",
"title2": "مُعزَّز أخيرًا.",
"subtitle": "Momento ليست مجرد تطبيق للملاحظات. إنها منظومة ذكية تربط أفكارك وتحللها وتطورها في الوقت الفعلي بفضل 6 أنواع من وكلاء الذكاء الاصطناعي والبحث الدلالي المتقدم.",
"subtitle": "Memento ليست مجرد تطبيق للملاحظات. إنها منظومة ذكية تربط أفكارك وتحللها وتطورها في الوقت الفعلي بفضل 6 أنواع من وكلاء الذكاء الاصطناعي والبحث الدلالي المتقدم.",
"cta": "سجّل الآن",
"secondary": "استكشف الميزات",
"memoryEcho": "Memory Echo",
@@ -2504,7 +2527,7 @@
"label": "قدرات الذكاء الاصطناعي",
"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": "لديك مفاتيح API من OpenAI أو Anthropic أو Google؟ اربطها مباشرة بـ Momento. استخدم الذكاء الاصطناعي دون حدود ائتمان مفروضة، وادفع فقط ما تستهلكه لدى مزوّدك المفضل.",
"desc": "لديك مفاتيح API من OpenAI أو Anthropic أو Google؟ اربطها مباشرة بـ Memento. استخدم الذكاء الاصطناعي دون حدود ائتمان مفروضة، وادفع فقط ما تستهلكه لدى مزوّدك المفضل.",
"noLockin": "بدون قفل",
"noLockinDesc": "بدّل المزوّد بنقرة واحدة.",
"cost": "تكاليف محسّنة",
@@ -2646,8 +2669,8 @@
"cta": {
"title1": "مستعد لإطلاق",
"title2": "إمكاناتك الكاملة؟",
"desc": "انضم إلى آلاف الباحثين والمصممين والمفكرين الذين يستخدمون Momento لبناء مستقبلهم.",
"button": "تشغيل Momento"
"desc": "انضم إلى آلاف الباحثين والمصممين والمفكرين الذين يستخدمون Memento لبناء مستقبلهم.",
"button": "تشغيل Memento"
},
"footer": {
"desc": "العقل الثاني المعزّز بالذكاء الاصطناعي. صُمم للعقول المبدعة.",
@@ -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": "مطلوب موافقة على معالجة الذكاء الاصطناعي",
"modalDescription": "لتحليل ملاحظاتك أو ملفات PDF أو جلسات العصف الذهني، ينقل Momento هذه البيانات بأمان إلى واجهات ذكاء اصطناعي تابعة لجهات خارجية (OpenAI وGemini وDeepSeek). نطبّق سياسة صارمة بعدم الاحتفاظ بالبيانات. بقبولك، تفوّض هذا المعالجة.",
"modalDescription": "لتحليل ملاحظاتك أو ملفات PDF أو جلسات العصف الذهني، ينقل Memento هذه البيانات بأمان إلى واجهات ذكاء اصطناعي تابعة لجهات خارجية (OpenAI وGemini وDeepSeek). نطبّق سياسة صارمة بعدم الاحتفاظ بالبيانات. بقبولك، تفوّض هذا المعالجة.",
"zeroRetentionTitle": "عدم الاحتفاظ بالبيانات",
"zeroRetentionDesc": "تتضمن جميع الطلبات الصادرة مؤشرات لمنع تدريب النماذج لحماية ملكيتك الفكرية.",
"rememberMe": "تذكّر اختياري (عدم السؤال مجدداً)",
@@ -2725,10 +2748,10 @@
"statusActive": "نشط",
"statusInactive": "غير ممنوح",
"helpAriaLabel": "ماذا تعني موافقة الذكاء الاصطناعي؟",
"helpTooltip": "Momento لا تبيع بياناتك. هذه الموافقة تنطبق فقط عند تشغيل إجراء ذكاء اصطناعي (العناوين، الوسوم، الدردشة، إعادة الصياغة). بدونها، يعمل بقية التطبيق بشكل طبيعي.",
"helpTooltip": "Memento لا تبيع بياناتك. هذه الموافقة تنطبق فقط عند تشغيل إجراء ذكاء اصطناعي (العناوين، الوسوم، الدردشة، إعادة الصياغة). بدونها، يعمل بقية التطبيق بشكل طبيعي.",
"whatItMeansTitle": "ماذا يعني هذا؟",
"inactiveHint": "بدون موافقة، تُعطَّل ميزات الذكاء الاصطناعي فقط. يمكنك متابعة إنشاء الملاحظات وتحريرها وتنظيمها كالمعتاد.",
"noCommercialUse": "Momento لا تبيع بياناتك الشخصية ولا تحقق منها أي عائد مالي.",
"noCommercialUse": "Memento لا تبيع بياناتك الشخصية ولا تحقق منها أي عائد مالي.",
"affectedFeatures": "الميزات المتأثرة: اقتراحات العناوين، الوسوم، الدردشة، إعادة الصياغة، Memory Echo، إلخ.",
"dataPortabilityHint": "يمكنك تصدير أو حذف جميع بياناتك في أي وقت (الإعدادات → البيانات).",
"dataPortabilityLink": "تصدير بياناتي",
@@ -2782,7 +2805,7 @@
},
"onboarding": {
"welcome_title": "ذاكرتك المعززة بالذكاء الاصطناعي",
"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": "{current} من {total}",
"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"
}
}
}