docs-combiner 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/renderer.js CHANGED
@@ -90051,7 +90051,7 @@ function App() {
90051
90051
  const rest = trimmed.slice(1).trim();
90052
90052
  const priceMatch = rest.match(/^(\d+(?:\.\d+)?)$/);
90053
90053
  if (priceMatch) {
90054
- return { price: priceMatch[1], currency: currencySymbolMap[firstChar] };
90054
+ return { price: priceMatch[1], currency: currencySymbolMap[firstChar], currencySymbol: firstChar };
90055
90055
  }
90056
90056
  }
90057
90057
  // Check if last character is a currency symbol (e.g., "48900 ₦" or "48900₦")
@@ -90060,7 +90060,7 @@ function App() {
90060
90060
  const rest = trimmed.slice(0, -1).trim();
90061
90061
  const priceMatch = rest.match(/^(\d+(?:\.\d+)?)$/);
90062
90062
  if (priceMatch) {
90063
- return { price: priceMatch[1], currency: currencySymbolMap[lastChar] };
90063
+ return { price: priceMatch[1], currency: currencySymbolMap[lastChar], currencySymbol: lastChar };
90064
90064
  }
90065
90065
  }
90066
90066
  // Try to match pattern: number followed by currency code (3 letters)
@@ -91635,10 +91635,19 @@ function App() {
91635
91635
  }
91636
91636
  // Check if there's reasoning but no images (model might have failed)
91637
91637
  if (message.reasoning_details && message.reasoning_details.length > 0) {
91638
+ logToTerminal('error', '❌ No images found in response. Model returned reasoning but no image was generated.');
91639
+ logToTerminal('error', '📋 Full response text:', responseText);
91640
+ logToTerminal('error', '📋 Parsed response data:', JSON.stringify(data, null, 2));
91641
+ logToTerminal('error', '📋 Message object:', JSON.stringify(message, null, 2));
91642
+ logToTerminal('error', '📋 Reasoning details:', JSON.stringify(message.reasoning_details, null, 2));
91638
91643
  const reasoningError = new Error('No images found in response. Model returned reasoning but no image was generated.');
91639
91644
  reasoningError.hasReasoning = true;
91640
91645
  throw reasoningError;
91641
91646
  }
91647
+ logToTerminal('error', '❌ No images found in response.');
91648
+ logToTerminal('error', '📋 Full response text:', responseText);
91649
+ logToTerminal('error', '📋 Parsed response data:', JSON.stringify(data, null, 2));
91650
+ logToTerminal('error', '📋 Message object:', JSON.stringify(message, null, 2));
91642
91651
  throw new Error(`No images found in response. Message: ${JSON.stringify(message)}`);
91643
91652
  }
91644
91653
  // Images are returned as base64 data URLs: data:image/png;base64,...
@@ -92723,15 +92732,17 @@ function App() {
92723
92732
  alert('Please fill in Product and Geo fields');
92724
92733
  return;
92725
92734
  }
92726
- const { price: generatePrice, currency: generateCurrency } = parsePriceAndCurrency(generatePriceWithCurrency);
92735
+ const { price: generatePrice, currency: generateCurrency, currencySymbol } = parsePriceAndCurrency(generatePriceWithCurrency);
92727
92736
  if (!generatePrice.trim() || !generateCurrency.trim()) {
92728
92737
  logToTerminal('error', '❌ Missing price or currency');
92729
92738
  alert('Please fill in Price field (format: "11400 HUF") for image generation');
92730
92739
  return;
92731
92740
  }
92741
+ // Use original currency symbol if available, otherwise use currency code
92742
+ const currencyForPrompt = currencySymbol || generateCurrency;
92732
92743
  logToTerminal('log', '📦 Product:', generateProduct);
92733
92744
  logToTerminal('log', '🌍 Geo:', generateGeo);
92734
- logToTerminal('log', '💰 Price:', generatePrice, generateCurrency);
92745
+ logToTerminal('log', '💰 Price:', generatePrice, currencyForPrompt);
92735
92746
  if (!driveFolderUrl.trim()) {
92736
92747
  logToTerminal('error', '❌ Missing Drive folder URL');
92737
92748
  alert('Please fill in Google Drive Folder URL');
@@ -92766,7 +92777,8 @@ function App() {
92766
92777
  // Base prompt structure
92767
92778
  // NOTE: This generation prompt is intentionally STRICTER than the image validator (`validateCreativeImage`).
92768
92779
  // Keep the prompt strict even if validator allows some "acceptable" deviations (e.g. 2-line headline, benefit headline, CTA position, discount emphasis).
92769
- const basePromptStructure = (0,_prompts__WEBPACK_IMPORTED_MODULE_1__.getImageGenerationBasePrompt)(generateGeo, generatePrice, generateCurrency);
92780
+ // Use original currency symbol if available, otherwise use currency code
92781
+ const basePromptStructure = (0,_prompts__WEBPACK_IMPORTED_MODULE_1__.getImageGenerationBasePrompt)(generateGeo, generatePrice, currencyForPrompt);
92770
92782
  // Generate 5 images with different approaches
92771
92783
  const approaches = _prompts__WEBPACK_IMPORTED_MODULE_1__.CREO_APPROACHES;
92772
92784
  // Initialize placeholders for 5 images
@@ -92958,10 +92970,12 @@ function App() {
92958
92970
  errorMsg.includes('Failed to fetch') ||
92959
92971
  errorMsg.includes('Network error') ||
92960
92972
  errorMsg.includes('timeout') ||
92961
- errorMsg.includes('Request timeout'));
92973
+ errorMsg.includes('Request timeout') ||
92974
+ errorMsg.includes('Provider returned error') ||
92975
+ errorMsg.toLowerCase().includes('provider error'));
92962
92976
  });
92963
92977
  if (retryableErrors.length > 0) {
92964
- addLog(formatLogMessage('log', `🔄 Повтор: найдено ${retryableErrors.length} ошибок (сеть/таймаут/JSON). Пробую ещё раз...`));
92978
+ addLog(formatLogMessage('log', `🔄 Повтор: найдено ${retryableErrors.length} ошибок (сеть/таймаут/JSON/Provider). Пробую ещё раз...`));
92965
92979
  const retryIndices = retryableErrors.map(r => r.index).sort((a, b) => a - b);
92966
92980
  let retryCursor = 0;
92967
92981
  const retryWorkers = Array.from({ length: Math.min(maxParallel, retryIndices.length) }, () => (async () => {
@@ -94485,7 +94499,7 @@ function getTitlesSystemPrompt(geo) {
94485
94499
  - Используй знания лучших практик рекламного копирайтинга
94486
94500
  - Избегай только жёстких медицинских гарантий («лечит», «вылечивает», «гарантируем»). Мягкие обещания результата разрешены («Nopți fără treziri», «Stomac liniștit», «Efect rapid»). Разрешены: сроки («în 14 zile»), цифры соц. доказательства («9 din 10 bărbați»), мягкие результаты. Запрещены: «100% гарантия», «навсегда», «излечение».
94487
94501
  - Избегай только: прямых медицинских диагнозов, слов «лечит/вылечивает/гарантируем», обещаний «100%/навсегда». Всё остальное — разрешено.
94488
- - Слова «paraziți», «viermi»использовать осторожно, не в каждом заголовке. Максимум 1 заголовок из 3 может содержать прямое упоминание. Предпочитай мягкие формулировки: «toxine», «disconfort digestiv», «curățare». Если все 3 заголовка содержат «paraziți/viermi» — перепиши 2 из них с мягкими альтернативами
94502
+ - Если в категории продукта есть специфические медицинские термины или диагнозы используй их осторожно, не в каждом заголовке. Максимум 1 заголовок из 3 может содержать прямое упоминание таких терминов. Предпочитай мягкие формулировки, описывающие симптомы и дискомфорт, а не диагнозы. Если все 3 заголовка содержат прямые медицинские термины — перепиши 2 из них с мягкими альтернативами, фокусируясь на ощущениях и симптомах
94489
94503
  - После создания проверь их правильность и разнообразие
94490
94504
  - Верни только заголовки, по одному на строку, без нумерации или буллетов
94491
94505
  - Заголовки должны быть на языке ${geo}
@@ -94546,8 +94560,8 @@ function getTextsSystemPrompt(geo) {
94546
94560
  - Разрешены формулировки: «reduce frecvența», «elimină disconfortul», «rezultat vizibil în X zile», «9 din 10 observă diferența». Запрещены только: «лечит/vindecă», «гарантируем 100%», «навсегда/definitiv».
94547
94561
  - Ты можешь усиливать эффект и результаты, но без прямых медицинских обещаний
94548
94562
  - Избегай только: прямых медицинских диагнозов, слов «лечит/вылечивает/гарантируем», обещаний «100%/навсегда». Всё остальное — разрешено.
94549
- - Слова «paraziți», «viermi» можно использовать, но не в каждом тексте. Максимум 1 текст из 3 может содержать прямое упоминание паразитов. Остальные тексты фокусируй на симптомах: «balonare», «disconfort», «digestie grea», «senzație de greutate», «toxine». Эвфемизмы вроде «oaspeți nedoriți»избегай, звучит неестественно
94550
- - Избегай упоминания туалета/стула напрямую («scaun», «constipație», «diaree»). Используй мягкие формулировки: «digestie lentă», «disconfort», «senzație de greutate»
94563
+ - Если в категории продукта есть специфические медицинские термины или диагнозы — используй их осторожно, не в каждом тексте. Максимум 1 текст из 3 может содержать прямое упоминание таких терминов. Остальные тексты фокусируй на симптомах, дискомфорте и ощущениях пользователя, релевантных категории продукта. Избегай эвфемизмов и искусственных замениспользуй естественные формулировки
94564
+ - Избегай прямых упоминаний интимных или деликатных деталей, связанных с проблемой. Используй мягкие формулировки, описывающие дискомфорт и симптомы, а не физиологические процессы
94551
94565
  - Избегай повторения полного названия продукта более 2 раз в одном тексте. Используй местоимения или более короткие ссылки при необходимости
94552
94566
 
94553
94567
  Требования к формату:
@@ -94630,7 +94644,7 @@ OTHER_TEXT: ["..."] (любой другой рекламный текст на
94630
94644
  - ЗАПРЕЩЕНЫ только: «лечит», «вылечивает», «гарантируем», «100%», «навсегда», «полностью избавляет», диагностика заболеваний
94631
94645
  - «Выводит/устраняет токсины» для детокс-продуктов — это мягкий клейм, НЕ медицинская гарантия
94632
94646
  - Если найден запрещённый клейм — ошибка. Мягкие клеймы — не ошибка.
94633
- - Слова «paraziți», «viermi» — разрешены, но не должны повторяться чрезмерно. Если в HEADLINE + BULLETS слово «paraziți» или «viermi» встречается более 1 раза — РЕКОМЕНДАЦИЯ: разнообразить формулировки
94647
+ - Специфические медицинские термины или диагнозы — разрешены, но не должны повторяться чрезмерно. Если в HEADLINE + BULLETS один и тот же специфический термин встречается более 1 раза — РЕКОМЕНДАЦИЯ: разнообразить формулировки, использовать синонимы или фокус на симптомах вместо повторения термина
94634
94648
 
94635
94649
  ШАГ 3 — TEXT LIMIT (критично):
94636
94650
  - Общее число слов в HEADLINE + BULLETS <= 16. Если больше — ошибка.
@@ -94663,6 +94677,14 @@ OTHER_TEXT: ["..."] (любой другой рекламный текст на
94663
94677
  function getImageGenerationBasePrompt(generateGeo, generatePrice, generateCurrency) {
94664
94678
  return `Создай рекламный креатив для Facebook Ads 1:1 (квадрат).
94665
94679
  Язык текста: ${generateGeo}.
94680
+
94681
+ КРИТИЧНО — РЕЛЕВАНТНОСТЬ ПРОДУКТУ:
94682
+ - Заголовок и буллиты ДОЛЖНЫ соответствовать категории и проблеме продукта из его названия и описания
94683
+ - НЕ копируй примеры из промпта буквально — примеры показывают только ФОРМАТ, не содержание
94684
+ - Определи категорию продукта (диабет, суставы, пищеварение, простата, зрение, похудение и т.д.) и используй ТОЛЬКО релевантные этой категории проблемы и выгоды
94685
+ - Если примеры в промпте про другую категорию — игнорируй их содержание, используй только структуру
94686
+ - Прочитай название и описание продукта внимательно и построй заголовок/буллиты вокруг ЕГО проблематики
94687
+
94666
94688
  Используй предоставленный рендер упаковки продукта как есть (форма/цвет без изменений). На упаковке запрещены текст/цена/буллеты/стикеры.
94667
94689
 
94668
94690
  CRITICAL RULES (это ВАЛИДАЦИЯ, не рекомендации; если нарушено — УДАЛИ ЛИШНЕЕ и ПЕРЕСОБЕРИ МАКЕТ):
@@ -94685,7 +94707,7 @@ HEADLINE (строгое правило):
94685
94707
  - если не влезает: сначала измени композицию (расширь блок/переставь элементы), затем перепиши короче. НЕЛЬЗЯ уменьшать шрифт.
94686
94708
  - Каждый из 5 креативов должен иметь УНИКАЛЬНЫЙ заголовок. Не повторяй один и тот же заголовок на разных визуалах. Варьируй: угол боли, формулировку, акцент (проблема vs облегчение)
94687
94709
  - Вторая часть заголовка = конкретное улучшение, не абстрактное слово. ПРАВИЛЬНО: «Stomac liniștit», «Zile fără disconfort», «Confort după masă». НЕ ТАК: «Mai ușor», «Mai bine», «Soluția»
94688
- - Слова «paraziți», «viermi» разрешены в заголовке, но не обязательны. Варьируй между прямыми («Paraziți?») и мягкими («Toxine? Disconfort?») формулировками для разных креативов
94710
+ - Специфические медицинские термины или диагнозы разрешены в заголовке, но не обязательны. Варьируй между прямыми формулировками (если релевантно категории) и мягкими формулировками, фокусирующимися на симптомах и дискомфорте, для разных креативов. Не используй один и тот же термин во всех креативах
94689
94711
  ПРИМЕР (HU, только как формат; для других GEO адаптируй язык, не копируй слова):
94690
94712
  - НЕ ТАК: «Makacs méreganyag ellen» (лозунг)
94691
94713
  - ТАК: «Puffadás gond? Könnyebb napok»
@@ -94735,32 +94757,32 @@ const CREO_APPROACHES = [
94735
94757
  {
94736
94758
  name: 'Врач / Эксперт (мужчина)',
94737
94759
  prompt: `ВРАЧ-ЭКСПЕРТ (мужчина): спокойный профессионал, кабинет/клиника; врач слева/по центру, продукт справа, чистый нейтральный фон, фронтальный ракурс. Врач виден минимум по пояс, в белом халате со стетоскопом.`,
94738
- headlineAngle: `ЗАГОЛОВОК ДЛЯ ЭТОГО КРЕАТИВА: угол "ежедневная проблема + спокойствие". Примеры: «Balonare zilnică? Stomac liniștit», «Disconfort frecvent? Liniște digestivă».`,
94739
- bulletsFocus: `БУЛЛИТЫ ДЛЯ ЭТОГО КРЕАТИВА: акцент на натуральности и доверии — выбери 3 из: «Formulă naturală», «Extracte din plante», «Recomandat de specialiști», «Fără chimicale».`
94760
+ headlineAngle: `ЗАГОЛОВОК: угол «ежедневная проблема + спокойствие». Возьми ключевую проблему из описания продукта + мягкое обещание облегчения. Примеры в промпте только для формата, НЕ копируй их содержание.`,
94761
+ bulletsFocus: `БУЛЛИТЫ: акцент на натуральности и доверии — натуральная формула, растительные экстракты, рекомендовано специалистами, без химии. Адаптируй под язык GEO и категорию продукта. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте — только ориентир для смысла, переводи их на нужный язык.`
94740
94762
  },
94741
94763
  {
94742
94764
  name: 'Врач / Эксперт (женщина)',
94743
94765
  prompt: `ВРАЧ-ЭКСПЕРТ (женщина): тёплый свет, уютный кабинет; врач справа/в углу, продукт слева/по центру. Врач в фокусе, чётко виден, лицо читаемое, профессиональный вид.`,
94744
- headlineAngle: `ЗАГОЛОВОК ДЛЯ ЭТОГО КРЕАТИВА: угол "после еды + облегчение". Примеры: «Balonare după masă? Digestie ușoară», «Greutate după masă? Confort rapid».`,
94745
- bulletsFocus: `БУЛЛИТЫ ДЛЯ ЭТОГО КРЕАТИВА: акцент на результате — выбери 3 из: «Reduce balonarea», «Confort abdominal», «Efect în 7-14 zile», «Digestie mai ușoară».`
94766
+ headlineAngle: `ЗАГОЛОВОК: угол «состояние/момент + облегчение». Возьми типичный момент проявления проблемы из описания продукта + конкретный результат. НЕ копируй примеры из других категорий.`,
94767
+ bulletsFocus: `БУЛЛИТЫ: акцент на результате — эффект, срок действия, улучшение состояния. Адаптируй под продукт и язык GEO. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте — только ориентир для смысла, переводи их на нужный язык.`
94746
94768
  },
94747
94769
  {
94748
94770
  name: 'Lifestyle / Clean',
94749
94771
  prompt: `LIFESTYLE/CLEAN: продукт в контексте момента приёма — кухня, обеденный стол, рядом с едой/чаем. Без человека, но с "историей" использования. Тёплые цвета, естественный свет.`,
94750
- headlineAngle: `ЗАГОЛОВОК ДЛЯ ЭТОГО КРЕАТИВА: угол "социальное доказательство". Примеры: «9 din 10 aleg pentru digestie», «Peste 5.000 de clienți mulțumiți», «Ales de mii pentru confort».`,
94751
- bulletsFocus: `БУЛЛИТЫ ДЛЯ ЭТОГО КРЕАТИВА: акцент на простоте использования — выбери 3 из: «Administrare ușoară», «O capsulă pe zi», «Potrivit zilnic», «Fără rețetă».`
94772
+ headlineAngle: `ЗАГОЛОВОК: угол «социальное доказательство». Цифры клиентов/пользователей + основная выгода продукта. Формат: «X из Y выбирают...», «Более X клиентов...». НЕ копируй примеры из других категорий.`,
94773
+ bulletsFocus: `БУЛЛИТЫ: акцент на простоте использования — лёгкость приёма, удобство, доступность без рецепта. Адаптируй под продукт и язык GEO. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте — только ориентир для смысла, переводи их на нужный язык.`
94752
94774
  },
94753
94775
  {
94754
94776
  name: 'WOW-эффект',
94755
94777
  prompt: `WOW-ЭФФЕКТ: визуальная метафора действия — свежесть, очищение, лёгкость. Капли воды, зелёные листья в движении, эффект «чистоты изнутри». Премиально, минималистично. Фокус на эффекте, не на человеке.`,
94756
- headlineAngle: `ЗАГОЛОВОК ДЛЯ ЭТОГО КРЕАТИВА: угол "очищение/детокс". Примеры: «Toxine? Curățare blândă», «Curățare naturală de toxine», «Organism curat, zi de zi».`,
94757
- bulletsFocus: `БУЛЛИТЫ ДЛЯ ЭТОГО КРЕАТИВА: акцент на действии продукта выбери 3 из: «Elimină toxinele», «Curățare naturală», «Susține digestia», «Detox blând».`
94778
+ headlineAngle: `ЗАГОЛОВОК: угол «ключевое действие продукта». Что продукт делает + мягкий результат. Визуальная метафора в заголовке. НЕ копируй примеры из других категорий.`,
94779
+ bulletsFocus: `БУЛЛИТЫ: акцент на механизме действия — что продукт делает, как работает, какой эффект даёт. Адаптируй под продукт и язык GEO. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте только ориентир для смысла, переводи их на нужный язык.`
94758
94780
  },
94759
94781
  {
94760
94782
  name: 'Эмоция результата',
94761
94783
  prompt: `ЭМОЦИЯ РЕЗУЛЬТАТА: реальный человек с естественным облегчением (тихий выдох, расслабленная поза), без стоковой улыбки. Фокус на человеке и его состоянии после приёма.`,
94762
- headlineAngle: `ЗАГОЛОВОК ДЛЯ ЭТОГО КРЕАТИВА: угол "срочность + результат". Примеры: «Doar aziconfort digestiv», «Ofertă limitată fără balonare», «Ultimele bucăți stomac ușor».`,
94763
- bulletsFocus: `БУЛЛИТЫ ДЛЯ ЭТОГО КРЕАТИВА: акцент на ощущениях — выбери 3 из: «Te simți mai ușor», «Mai multă energie», «Fără disconfort», «Confort după masă».`
94784
+ headlineAngle: `ЗАГОЛОВОК: угол «срочность + результат». Ограниченное предложение/время + основная выгода продукта. Формат: «Только сегодня ...», «Последние дни...». НЕ копируй примеры из других категорий.`,
94785
+ bulletsFocus: `БУЛЛИТЫ: акцент на ощущениях пользователя как человек себя чувствует после приёма, улучшение качества жизни. Адаптируй под продукт и язык GEO. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте — только ориентир для смысла, переводи их на нужный язык.`
94764
94786
  }
94765
94787
  ];
94766
94788