diff --git a/src/services/zeroNotes.js b/src/services/zeroNotes.js index 7cc2cbb..339d5bc 100644 --- a/src/services/zeroNotes.js +++ b/src/services/zeroNotes.js @@ -171,6 +171,19 @@ async function generateDraft(channelId, opts = {}) { .replace(/\s*```\s*$/i, '') .trim(); + // 5b. Защита от обрезанного ответа AI-шлюза: гейт возвращал коротким текстом + // без ошибки (например "Когда-то я дума"), и это тихо улетало в паблик. + // Считаем валидной заметку не короче 120 символов и заканчивающуюся на + // знак препинания/эмодзи (не оборванную на полуслове). + const MIN_NOTE_LEN = 120; + const endsCleanly = /[.!?…"»)\p{Emoji_Presentation}]\s*$/u.test(content); + if (content.length < MIN_NOTE_LEN || !endsCleanly) { + throw new Error( + `AI вернул обрезанный/подозрительно короткий текст (${content.length} симв., ` + + `конец="${content.slice(-20)}"). Черновик НЕ сохранён, генерацию нужно перезапустить.` + ); + } + // 6. Подбираем позу Зеро по тексту const pose = zeroChar.pickPose({ title: prompt.themeHint,