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": "Без lock-in",
"noLockinDesc": "Смените провайдера в 1 клик.",
"cost": "Оптимизированные расходы",
@@ -2646,8 +2669,8 @@
"cta": {
"title1": "Готовы раскрыть свой",
"title2": "полный потенциал?",
"desc": "Присоединяйтесь к тысячам исследователей, дизайнеров и мыслителей, которые уже строят будущее с Momento.",
"button": "Запустить Momento"
"desc": "Присоединяйтесь к тысячам исследователей, дизайнеров и мыслителей, которые уже строят будущее с Memento.",
"button": "Запустить Memento"
},
"footer": {
"desc": "Второй мозг, усиленный ИИ. Создан для творческих умов.",
@@ -2704,7 +2727,7 @@
"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."
@@ -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"
}
}
}