PageSourceSearch

https://gptea.ru/_nuxt/zw26q5hD.js

js gptea.ru collected 2026-10-08 16:30:13 UTC 37,901 bytes, 7 lines download raw bytes

1import{f as gt,d as ft,s as we,_ as yt}from"./hTp37XXB.js";import{d as bt,y as ht,x as kt,w as $t,A as u,a2 as t,a3 as wt,a1 as St,R as B,ae as E,ah as c,ao as Y,u as n,m as Z,a7 as Le,aj as b,ac as m,a6 as i,Q as h,a5 as W,a4 as Be,f as v,n as Se,e as C,r as xt,$ as d}from"./oW-lkGAh.js";import"./tvf1fRvD.js";import"./DgzPmcdk.js";const Mt={class:"article-lab"},It={class:"lab-header"},Ct={class:"stage-strip","aria-label":"Этапы генератора статей"},Pt=["onClick"],Tt={class:"ideas-panel"},Vt={class:"panel-head"},Ut={class:"idea-actions"},At={class:"compact-control"},Lt=["disabled"],Bt={key:0,class:"error-message"},Et={key:1,class:"info-message"},_t={key:2,class:"info-message loading-message"},Dt={key:3,class:"info-message"},Ot={key:4,class:"batch-panel"},jt={class:"batch-actions"},Rt=["disabled"],Nt=["disabled"],Ht=["disabled"],Kt=["disabled"],Gt={key:5,class:"batch-run-panel server"},Wt={class:"batch-run-head"},zt={class:"batch-progress"},qt={class:"batch-summary-row"},Ft={class:"batch-results"},Qt={key:0},Jt={key:1},Xt=["onClick"],Yt={key:6,class:"batch-run-panel"},Zt={class:"batch-run-head"},el={class:"batch-progress"},tl={class:"batch-results"},ll=["onClick"],al={key:7,class:"article-ideas-grid"},nl={class:"idea-card-head"},sl={class:"idea-check"},ol=["checked","onChange"],rl={key:0,class:"related-style-note"},il={class:"keyword-row"},ul=["onClick"],dl={class:"workspace"},pl={class:"panel editor-panel"},ml={class:"panel-head"},cl={class:"status-pill"},vl={class:"grid two"},gl={class:"grid two"},fl={class:"grid two"},yl={class:"actions"},bl=["disabled"],hl=["disabled"],kl=["disabled"],$l={key:0,class:"error-message"},wl={key:1,class:"info-message"},Sl={key:2,class:"info-message loading-message"},xl={class:"preview-toolbar"},Ml={class:"article-preview"},Il={class:"preview-kind"},Cl={key:0,class:"preview-description"},Pl={class:"preview-meta"},Tl=["innerHTML"],Vl={key:0,class:"preview-keywords"},Ul={key:1,class:"draft-grid"},Al={class:"panel"},Ll={class:"panel"},Bl=["onUpdate:modelValue"],El=["onUpdate:modelValue"],_l={class:"panel wide"},Dl={class:"panel"},Ol={class:"panel-head compact"},jl={class:"status-pill"},Rl=["onUpdate:modelValue"],Nl=["onUpdate:modelValue"],Hl=["onUpdate:modelValue"],Kl={class:"panel"},Gl={class:"checklist"},Wl={class:"metrics"},zl=["disabled"],ql={key:0,class:"error-message"},Fl={key:1,class:"save-result"},Ql=bt({__name:"article-lab",setup(Jl){gt({title:"Генератор статей - GPTea tools",meta:[{name:"robots",content:"noindex, nofollow"}]});const Ee=[{id:"brief",number:"1",label:"Бриф"},{id:"seo",number:"2",label:"SEO"},{id:"outline",number:"3",label:"Структура"},{id:"content",number:"4",label:"Текст"},{id:"media",number:"5",label:"Картинки"},{id:"save",number:"6",label:"Публикация"}],A=v("brief"),s=xt({kind:"general",model:"gpt-5.4",topic:"",keywords:"",audience:"",goal:"",mediaMode:"prompts-only",maxLength:1600,imageCount:3,imageStylePrompt:""}),o=v(null),R=v(!1),N=v(0),ee=v(""),L=v(""),te=v(!1),_=v(""),T=v(null),le=v("image"),ie=v(""),ue=v(20),P=v([]),z=v(null),D=v(!1),O=v(0),x=v(""),q=v(""),V=v(!1),de=v(null),M=v([]),ae=v(10),j=v("cover-inline"),pe=v("publish"),U=v(!1),S=v([]),k=v(null),_e=v([]),fe=v(!1);let ne=null,F=null,Q=null;const xe=C(()=>s.topic.trim().length>=3),De=C(()=>o.value?o.value.metadata.source==="article-lab"?"статья готова":"результат готов":"ожидает тему"),me=C(()=>o.value?.content.split(/\s+/).filter(Boolean).length||0),ce=C(()=>o.value?o.value.images?.length?o.value.images.length:(o.value.coverImagePrompt?1:0)+o.value.inlineImagePrompts.length:0),Oe=C(()=>
1{if(!S.value.length)return 0;const l=S.value.filter(e=>e.status==="ready"||e.status==="error").length;return Math.round(l/S.value.length*100)}),je=C(()=>{if(!S.value.length)return"Пачка еще не запускалась.";const l=S.value.filter(a=>a.status==="ready").length,e=S.value.filter(a=>a.status==="error").length,r=S.value.find(a=>a.status==="running");return r?`Сейчас пишется: ${r.idea.title}. Готово ${l} из ${S.value.length}.`:`Готово ${l} из ${S.value.length}. Ошибок: ${e}.`}),J=C(()=>fe.value||k.value?.status==="running"),Re=C(()=>D.value?O.value<10?"Собираю SEO-сигналы: Вебмастер, Wordstat и базовые запросы...":O.value<45?`Нейросеть собирает идеи статей. Прошло ${O.value} сек.`:O.value<120?`Если первая модель молчит, сервер пробует резервные модели. Прошло ${O.value} сек.`:`Запрос еще живой: жду ответ или подробную ошибку модели. Прошло ${O.value} сек.`:""),Ne=C(()=>R.value?N.value<20?"Пишу текст статьи и SEO-поля...":N.value<90?`Текст готовится через модель, затем пойдут картинки. Прошло ${N.value} сек.`:s.mediaMode!=="none"&&s.mediaMode!=="prompts-only"?`Генерирую изображения для статьи. Это самый долгий этап. Прошло ${N.value} сек.`:`Жду ответ генератора статьи. Прошло ${N.value} сек.`:""),He=C(()=>{const l=k.value;if(!l?.summary?.total)return 0;const e=Number(l.summary.ready||0)+Number(l.summary.needsReview||0)+Number(l.summary.rejected||0)+Number(l.summary.errors||0);return Math.round(e/Number(l.summary.total)*100)}),Ke=C(()=>{const l=k.value;if(!l)return"Серверная партия еще не запускалась.";const e=(l.items||[]).filter(r=>["running","auditing","saving"].includes(r.status));if(e.length){const r=e.map(a=>a.idea.title).join("; ");return`Сейчас создаются ${e.length} статьи: ${r}. Готово ${l.summary.ready} из ${l.summary.total}.`}return l.status==="running"?`Ожидает следующий шаг. Готово ${l.summary.ready} из ${l.summary.total}.`:`Готово ${l.summary.ready} из ${l.summary.total}. На проверке: ${l.summary.needsReview||0}. Отклонено: ${l.summary.rejected||0}. Ошибок: ${l.summary.errors||0}.`}),Ge=C(()=>
1{if(!o.value)return"";const l=o.value.images||[],e=Ae(o.value.content),r=new Set([...e.matchAll(/!\[[^\]]*\]\((https?:\/\/[^)]+|\/[^)]+|data:image\/[^)]+)\)/gi)].map(f=>Me(f[1]))),a=l.filter(f=>!r.has(Me(f?.url))),p=a[0],g=a.slice(1),y=[];return p?.url?y.push(ke(p,"Обложка статьи")):o.value.coverImagePrompt&&y.push($e("Обложка",o.value.coverImagePrompt)),y.push(mt(e)),g.forEach((f,$)=>{y.push(ke(f,`Иллюстрация ${$+1}`))}),!g.length&&o.value.inlineImagePrompts.length&&(y.push('<section class="preview-image-prompts">'),o.value.inlineImagePrompts.forEach((f,$)=>{y.push($e(`Иллюстрация ${$+1}: ${f.title}`,f.prompt))}),y.push("</section>")),y.join(`
2`)});function Me(l){return String(l||"").trim().replace(/\/$/,"")}function We(l){return o.value?l==="brief"?!0:l==="seo"?!!(o.value.seoTitle&&o.value.seoDescription):l==="outline"?o.value.outline.length>0:l==="content"?me.value>80:l==="media"?o.value.mediaMode==="none"||ce.value>0:l==="save"?!!T.value:!1:!1}function ye(l){z.value=l,s.kind=l.kind,s.topic=l.topic,s.keywords=l.keywords.join(", "),s.audience=l.audience,s.goal=l.goal,s.imageStylePrompt=l.imageStylePrompt,s.mediaMode="cover-inline",s.imageCount=3,o.value=null,T.value=null,_.value="",L.value=`Выбрана идея: ${l.title}`,A.value="brief"}function se(l){return`${l.kind}:${l.topic}`.toLowerCase()}function ze(l){return M.value.includes(se(l))}function qe(l){const e=se(l);M.value=M.value.includes(e)?M.value.filter(r=>r!==e):[...M.value,e]}function Fe(l=ae.value){M.value=P.value.slice().sort((e,r)=>r.score-e.score).slice(0,Math.max(1,Math.min(30,Number(l)||10))).map(se)}function Ie(){const l=new Set(M.value);return P.value.filter(e=>l.has(se(e)))}async function Qe(l){ye(l),s.mediaMode=j.value,s.imageCount=j.value==="cover-inline"?3:j.value==="cover"?1:0;const e=await $fetch("/api/article/generate",{method:"POST",body:{topic:s.topic,model:s.model,maxLength:s.maxLength,imageCount:s.mediaMode==="none"||s.mediaMode==="prompts-only"?0:s.imageCount,style:"professional",includeImages:s.mediaMode!=="none"&&s.mediaMode!=="prompts-only",stream:!1,async:!1,category:s.kind==="image"?"image":s.kind==="video"?"video":"text",imageStylePrompt:s.imageStylePrompt,relatedStyle:l.relatedStyle},timeout:3e5});return be(e)}async function Je(){if(U.value)return;const l=Ie();if(!l.length){x.value="Выбери хотя бы одну идею для массового запуска.";return}U.value=!0,x.value="",ee.value="",_.value="",T.value=null,S.value=l.map(e=>({key:se(e),idea:e,status:"pending",message:"Ожидает очереди"}));for(const e of S.value){e.status="running",e.message="Пишу статью и собираю SEO-поля";try{const r=await Qe(e.idea);e.draft=r,e.status="ready",e.message=`${r.metadata.wordCount||me.value} слов, ${r.images?.length||0} картинок`,o.value=r,V.value=!0,A.value="seo"}catch(r){e.status="error",e.message=r?.data?.message||r?.message||"Не удалось собрать статью"}}U.value=!1,L.value="Массовый запуск завершен. Готовые статьи можно открыть из списка результатов."}function ve(){ne&&(clearInterval(ne),ne=null)}function Ce(){ve(),ne=we(()=>{Pe()},3e3)}async function Pe(){try{const l=await $fetch("/api/article/batch/status");k.value=l?.current||null,_e.value=Array.isArray(l?.history)?l.history:[],k.value?.status==="running"&&!ne?Ce():k.value?.status!=="running"&&ve()}catch(l){x.value=l?.data?.message||l?.message||"Не удалось получить статус серверной партии",ve()}}async function Xe(){const l=Ie();if(!l.length||J.value){x.value=l.length?"":"Выбери хотя бы одну идею для серверного запуска.";return}fe.value=!0,x.value="",L.value="",S.value=[];try{const e=await $fetch("/api/article/batch/start",{method:"POST",body:{ideas:l,model:s.model,maxLength:s.maxLength,mediaMode:j.value,saveMode:pe.value},timeout:3e4});k.value=e?.run||null,Ce(),L.value="Серверная партия запущена. Статус обновляется автоматически."}catch(e){x.value=e?.data?.message||e?.message||"Не удалось запустить серверную партию"}finally{fe.value=!1}}function Ye(l){l.draft&&(o.value=l.draft,z.value=l.idea,V.value=!0,A.value="seo",Se(()=>de.value?.scrollIntoView({behavior:"smooth",block:"start"})))}function Ze(l){if(!l?.draft)return;const e=l.idea;ye(e),s.mediaMode=k.value?.mediaMode||j.value,o.value=be(l.draft),z.value=e,V.value=!0,A.value="seo",Se(()=>de.value?.scrollIntoView({behavior:"smooth",block:"start"}))}function et(l){return l==="approve"?"approve":l==="needs_review"?"нужна проверка":l==="reject"?"reject":l||"без статуса"}function tt(){O.value=0,F&&clearInterval(F),F=we(()=>{O.value+=1},1e3)}function Te(){F&&(clearInterval(F),F=null)}function lt(){N.value=0,Q&&clearInterval(Q),Q=we(()=>{N.value+=1},1e3)}function Ve(){Q&&(clearInterval(Q),Q=null)}function at(l){const e=l?.data?.data||l?.data||{},r=l?.data?.message||l?.statusMessage||l?.message||"Не удалось получить идеи от LLM.",a=Array.isArray(e?.modelErrors)?e.modelErrors.map(y=>`${y.model}: ${y.error}`).join("; "):"",p=Array.isArray(e?.attemptedModels)?e.attemptedModels.join(", "):"",g=[r];return a?g.push(`Модели: ${a}`):p&&g.push(`Пробовались модели: ${p}`),e?.apiUrl&&g.push(`API: ${e.apiUrl}`),e?.timeoutMs&&g.push(`Таймаут модели: ${Math.round(Number(e.timeoutMs)/1e3)} сек.`),g.join(" ")}async function nt(){if(!D.value){D.value=!0,tt(),x.value="",q.value="Запустил сбор идей. Это может занять 30-120 секунд, потому что сервер проверяет спрос и ждет LLM.";try{const l=await $fetch("/api/article/ideas",{method:"POST",body:{kind:le.value,topic:ie.value,count:Math.max(6,Math.min(30,Number(ue.value)||20))},timeout:26e4});P.value=Array.isArray(l?.ideas)?l.ideas:[];const e=l?.meta?.source==="llm"?"нейросеть":"неизвестно",r=l?.meta?.signalCounts||{},a=l?.meta?.source==="llm"?` Модель: ${l?.meta?.model||"н/д"}. Сигналы: ${r.total||0} (Вебмастер: ${r.seo||0}, Wordstat: ${r.wordstat||0}).`:"";q.value=`Идей: ${P.value.length}. Источник: ${e}.${a}`,P.value.length||(x.value="Модель не вернула идеи. Попробуй другое направление или проверь настройки модели.")}catch(l){P.value=[],M.value=[],q.value="",x.value=at(l)}finally{D.value=!1,Te()}}}async function st(){if(!(!xe.value||R.value)){R.value=!0,lt(),ee.value="",L.value="",_.value="",T.value=null;try{const l=await $fetch("/api/article/generate",{method:"POST",body:{topic:s.topic,model:s.model,maxLength:s.maxLength,imageCount:s.mediaMode==="none"||s.mediaMode==="prompts-only"?0:s.imageCount,style:"professional",includeImages:s.mediaMode!=="none"&&s.mediaMode!=="prompts-only",stream
2:!1,async:!1,category:s.kind==="image"?"image":s.kind==="video"?"video":"text",imageStylePrompt:s.imageStylePrompt,relatedStyle:z.value?.relatedStyle},timeout:3e5});o.value=be(l),V.value=!0,L.value="Статья создана единым генератором статей.",A.value="seo",await Se(),de.value?.scrollIntoView({behavior:"smooth",block:"start"})}catch(l){ee.value=l?.data?.message||l?.message||"Не удалось сгенерировать статью"}finally{R.value=!1,Ve()}}}function be(l){const e=l?.seo||{},r=Array.isArray(l?.images)?l.images:[],a=Ae(String(l?.content||"")),p=e.title||e.seoTitle||s.topic,g=e.description||e.seoDescription||"",y=Array.isArray(e.keywords)?e.keywords:typeof e.seoKeywords=="string"?he(e.seoKeywords):he(s.keywords),f=e.h1||e.seoH1||p,$=e.excerpt||e.seoExcerpt||"",H=a.split(`
3`).map(w=>w.trim()).filter(w=>/^#{2,3}\s+/.test(w)).map(w=>w.replace(/^#{2,3}\s+/,"").trim()).slice(0,8),I=p,re=e.slug||s.topic.toLowerCase().replace(/[^a-zа-яё0-9]+/gi,"-").replace(/^-|-$/g,""),K=H.length?H.map(w=>({title:w,notes:"Блок создан основным генератором статей."})):[{title:"Текст статьи",notes:"Основной генератор вернул текст без markdown-заголовков."}];H.length||K.splice(0,K.length,...ot(s.topic,s.kind).map(w=>({title:w,notes:"Запасная идея показана, если модель вернула текст без markdown-заголовков."})));const ge=r.slice(1).map((w,G)=>({title:w.alt||`Картинка ${G+2}`,prompt:w.prompt||"",alt:w.alt||I,afterSection:G+1}));return{topic:s.topic.trim(),kind:s.kind,model:s.model,audience:s.audience.trim(),goal:s.goal.trim(),keywords:he(s.keywords),title:I,h1:f,slug:re,seoTitle:p,seoDescription:g,seoKeywords:y,excerpt:$,outline:K,content:a,mediaMode:s.mediaMode,coverImagePrompt:r[0]?.prompt||s.imageStylePrompt,inlineImagePrompts:ge,images:r,checklist:[{label:"Текст создан основным генератором",status:"ready"},{label:"SEO-поля получены",status:p||g?"ready":"later"},{label:"Картинки сгенерированы или отключены настройкой",status:s.mediaMode==="none"||s.mediaMode==="prompts-only"||r.length?"ready":"later"},{label:"SEO-сигналы учтены на этапе выбора идеи",status:z.value?"ready":"later"}],metadata:{wordCount:l?.metadata?.wordCount||a.split(/\s+/).filter(Boolean).length,imageCount:l?.metadata?.imageCount||r.length,generationTime:l?.metadata?.generationTime||0,model:l?.metadata?.model||s.model,source:"article-lab"}}}function ot(l,e){const r=l.trim()||"тема статьи";return e==="image"?[`Какой визуальный результат нужен по теме "${r}"`,"Какие исходные фото лучше загрузить","Как описать стиль, фон, свет и настроение","Где использовать готовую картинку","Какие ограничения результата важно учитывать"]:e==="video"?[`Какой ролик нужен по теме "${r}"`,"Какие фото или видео подготовить","Как описать движение и камеру","Где использовать готовый ролик","Какие ограничения видео стоит учитывать"]:[`Что пользователь хочет получить по теме "${r}"`,"Кому подходит этот сценарий","Как попробовать это в GPTea","Какие ошибки чаще всего мешают результату","Какой честный результат можно ожидать"]}function he(l){return l.split(/[,;\n]/).map(e=>e.trim()).filter(Boolean).slice(0,20)}function oe(l){return l.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function rt(l){return/^https?:\/\//i.test(l)||l.startsWith("/")||l.startsWith("data:image/")}function ke(l,e){if(!l.url||!rt(l.url))return l.prompt?$e(e,l.prompt):"";const r=l.alt||e,a=/^generated image/i.test(r)||r.length>90,p=oe(a?e:r);return['<figure class="preview-figure">',`<img src="${oe(l.url)}" alt="${p}" loading="lazy">`,a?"":`<figcaption>${p}</figcaption>`,"</figure>"].join("")}function $e(l,e){return['<aside class="preview-prompt-card">',`<b>${oe(l)}</b>`,`<p>${oe(e)}</p>`,"</aside>"].join("")}function X(l){return oe(l).replace(/`([^`]+)`/g,"<code>$1</code>").replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>").replace(/__([^_]+)__/g,"<strong>$1</strong>").replace(/\*([^*\n]+)\*/g,"<em>$1</em>").replace(/_([^_\n]+)_/g,"<em>$1</em>")}function Ue(l){return/^\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?$/.test(l)}function it(l){return Ue(l)?!0:l.replace(/^\|/,"").replace(/\|$/,"").split("|").map(r=>
3r.trim()).filter(Boolean).length>1}function ut(l){return l.replace(/^\|/,"").replace(/\|$/,"").split("|").map(e=>e.trim())}function dt(l){const e=l.filter(f=>f.some(Boolean));if(!e.length)return"";const[r,...a]=e,p=a.length>0,g=p?`<thead><tr>${r.map(f=>`<th>${X(f)}</th>`).join("")}</tr></thead>`:"",y=(p?a:e).map(f=>`<tr>${f.map($=>`<td>${X($)}</td>`).join("")}</tr>`).join("");return`<div class="preview-table-wrap"><table>${g}<tbody>${y}</tbody></table></div>`}function pt(l){let e=String(l||"").trim();const r=e.search(/^#{1,3}\s+/m);if(r>0){const a=e.slice(0,r).trim();a.length<500&&/стать|материал|публикац|ниже|готов/i.test(a)&&(e=e.slice(r).trim())}return e.replace(/^\s*#\s+[^\n]+\n+/i,"").trim()}function mt(l){const e=pt(l).split(`
4`),r=[];let a=[],p=[],g=[];const y=()=>{a.length&&(r.push(`<p>${X(a.join(" "))}</p>`),a=[])},f=()=>{p.length&&(r.push(`<ul>${p.map(H=>`<li>${X(H)}</li>`).join("")}</ul>`),p=[])},$=()=>{g.length&&(r.push(dt(g)),g=[])};return e.forEach(H=>{const I=H.trim();if(!I){y(),f(),$();return}const re=I.match(/^!\[(.*?)\]\((https?:\/\/[^)]+|\/[^)]+|data:image\/[^)]+)\)$/i);if(re){y(),f(),$();const G=re[1]?.trim()||"Иллюстрация статьи";r.push(ke({url:re[2],alt:G},"Иллюстрация статьи"));return}if(/^!\[[^\]]*\](?:\([^)]*\))?$/.test(I)){y(),f(),$();return}if(it(I)){y(),f(),Ue(I)||g.push(ut(I));return}const K=I.match(/^(#{1,4})\s+(.+)$/);if(K){y(),f(),$();const G=K[1].length;r.push(`<h${G}>${X(K[2])}</h${G}>`);return}const ge=I.match(/^>\s+(.+)$/);if(ge){y(),f(),$(),r.push(`<blockquote>${X(ge[1])}</blockquote>`);return}const w=I.match(/^(?:[-*]|\d+[.)])\s+(.+)$/);if(w){y(),$(),p.push(w[1]);return}f(),$(),a.push(I)}),y(),f(),$(),r.join(`
5`)}function Ae(l){return l.replace(/^!\[Generated image:[^\]]*\]\((https?:\/\/[^)]+|\/[^)]+|data:image\/[^)]+)\)\s*$/gim,"").replace(/^!\[Generated image:[^\]]*\]\s*\n\s*\((https?:\/\/[^)]+|\/[^)]+|data:image\/[^)]+)\)\s*$/gim,"").replace(/^!\[[^\]]*\]\(\s*\)\s*$/gim,"").replace(/^!\[[^\]]*\]\s*$/gim,"").replace(/\n{3,}/g,`
6
7`).trim()}function ct(){o.value=null,V.value=!1,_.value="",L.value="",T.value=null,A.value="brief"}ht(()=>{Pe()}),kt(()=>{ve(),Te(),Ve()}),$t(le,()=>{D.value||(P.value=[],M.value=[],S.value=[],k.value=null,q.value="",x.value="")});async function vt(){if(!(!o.value||te.value)){te.value=!0,_.value="",T.value=null;try{T.value=await $fetch("/api/article-lab/save",{method:"POST",body:{draft:o.value,mode:"publish"},timeout:12e4}),A.value="save"}catch(l){_.value=l?.data?.message||l?.message||"Не удалось опубликовать статью"}finally{te.value=!1}}}return(l,e)=>{const r=ft;return d(),u("main",Mt,[t("header",It,[wt(r,{to:"/compilations",class:"back-link"},{default:St(()=>[...e[28]||(e[28]=[m("Назад к инструментам",-1)])]),_:1}),e[29]||(e[29]=t("p",{class:"eyebrow"},"GPTea tools",-1)),e[30]||(e[30]=t("h1",null,"Генератор статей",-1)),e[31]||(e[31]=t("p",{class:"subtitle"}," Один рабочий поток: тема, SEO, полноценный текст, тематические картинки, проверка и публикация. Идея выбирается сверху, дальше генератор сам собирает бриф и готовит статью. ",-1))]),t("section",Ct,[(d(),u(B,null,E(Ee,a=>t("button",{key:a.id,type:"button",class:W({active:n(A)===a.id,done:We(a.id)}),onClick:p=>A.value=a.id},[t("span",null,i(a.number),1),m(" "+i(a.label),1)],10,Pt)),64))]),t("section",Tt,[t("div",Vt,[e[34]||(e[34]=t("div",null,[t("h2",null,"Идеи для статей"),t("p",null,"Сначала выбираем готовую SEO-идею, потом генератор сам заполняет бриф и запускает статью.")],-1)),t("div",Ut,[c(t("select",{"onUpdate:modelValue":e[0]||(e[0]=a=>Z(le)?le.value=a:null)},[...e[32]||(e[32]=[Le('<option value="image" data-v-37978a69>Фото / изображения</option><option value="video" data-v-37978a69>Видео</option><option value="character" data-v-37978a69>Персонажи</option><option value="general" data-v-37978a69>Общие статьи</option><option value="seo" data-v-37978a69>SEO</option>',5)])],512),[[Y,n(le)]]),c(t("input",{"onUpdate:modelValue":e[1]||(e[1]=a=>Z(ie)?ie.value=a:null),type:"text",placeholder:"Направление можно не заполнять"},null,512),[[b,n(ie)]]),t("label",At,[e[33]||(e[33]=m(" Идей ",-1)),c(t("input",{"onUpdate:modelValue":e[2]||(e[2]=a=>Z(ue)?ue.value=a:null),type:"number",min:"6",max:"30"},null,512),[[b,n(ue),void 0,{number:!0}]])]),t("button",{type:"button",disabled:n(D),onClick:nt},i(n(D)?"Ищу идеи...":"Сгенерировать идеи"),9,Lt)])]),n(x)?(d(),u("p",Bt,i(n(x)),1)):h("",!0),n(q)?(d(),u("p",Et,i(n(q)),1)):h("",!0),n(D)?(d(),u("p",_t,i(n(Re)),1)):!n(P).length&&!n(x)?(d(),u("p",Dt," В
7ыбери раздел и нажми «Сгенерировать идеи». При открытии страницы запросы не запускаются. ")):h("",!0),n(P).length?(d(),u("div",Ot,[e[40]||(e[40]=t("div",null,[t("h3",null,"Массовый запуск"),t("p",null,"Отметь идеи и запусти пачку. Каждая статья проходит аудит; на сайт публикуются только результаты со статусом approve.")],-1)),t("div",jt,[t("label",null,[e[35]||(e[35]=m(" Сколько взять ",-1)),c(t("input",{"onUpdate:modelValue":e[3]||(e[3]=a=>Z(ae)?ae.value=a:null),type:"number",min:"1",max:"30"},null,512),[[b,n(ae),void 0,{number:!0}]])]),t("label",null,[e[37]||(e[37]=m(" Картинки ",-1)),c(t("select",{"onUpdate:modelValue":e[4]||(e[4]=a=>Z(j)?j.value=a:null)},[...e[36]||(e[36]=[t("option",{value:"prompts-only"},"только промты",-1),t("option",{value:"cover"},"обложка",-1),t("option",{value:"cover-inline"},"обложка + внутри",-1),t("option",{value:"none"},"без картинок",-1)])],512),[[Y,n(j)]])]),t("label",null,[e[39]||(e[39]=m(" После approve ",-1)),c(t("select",{"onUpdate:modelValue":e[5]||(e[5]=a=>Z(pe)?pe.value=a:null)},[...e[38]||(e[38]=[t("option",{value:"publish"},"опубликовать",-1),t("option",{value:"draft"},"сохранить черновик",-1),t("option",{value:"none"},"только показать результат",-1)])],512),[[Y,n(pe)]])]),t("button",{type:"button",class:"secondary",disabled:n(U),onClick:e[6]||(e[6]=a=>Fe(n(ae)))},"Выбрать лучшие",8,Rt),t("button",{type:"button",class:"secondary",disabled:n(U),onClick:e[7]||(e[7]=a=>M.value=[])},"Снять выбор",8,Nt),t("button",{type:"button",class:"secondary",disabled:n(U)||n(J)||!n(M).length,onClick:Je},i(n(U)?"Быстрый тест идет...":"Быстрый тест"),9,Ht),t("button",{type:"button",disabled:n(U)||n(J)||!n(M).length,onClick:Xe},i(n(J)?"Серверная партия идет...":`Запустить серверно ${n(M).length}`),9,Kt)])])):h("",!0),n(k)?(d(),u("section",Gt,[t("div",Wt,[t("div",null,[e[41]||(e[41]=t("h3",null,"Серверная партия",-1)),t("p",null,i(n(Ke)),1)]),t("span",{class:W(["status-pill",{running:n(J)}])},i(n(J)?"в работе":"завершено"),3)]),t("div",zt,[t("span",{style:Be({width:`${n(He)}%`})},null,4)]),t("div",qt,[t("span",null,"Готово: "+i(n(k).summary?.ready||0),1),t("span",null,i(n(k).saveMode==="publish"?"Опубликовано":"Сохранено")+": "+i(n(k).summary?.saved||0),1),t("span",null,"На проверке: "+i(n(k).summary?.needsReview||0),1),t("span",null,"Отклонено: "+i(n(k).summary?.rejected||0),1),t("span",null,"Ошибки: "+i(n(k).summary?.errors||0),1)]),t("div",Ft,[(d(!0),u(B,null,E(n(k).items,a=>(d(),u("article",{key:a.id,class:W(["batch-result",a.status])},[t("div",null,[t("b",null,i(a.idea.title),1),t("small",null,i(a.message),1),a.audit?(d(),u("small",Qt,"Аудит: "+i(a.audit.score)+" баллов, "+i(et(a.audit.decision)),1)):h("",!0),a.savedArticle?(d(),u("small",Jt,i(a.savedArticle.publishedAt?"Опубликовано":"Сохранено")+": "+i(a.savedArticle.slug),1)):h("",!0)]),a.draft?(d(),u("button",{key:0,type:"button",class:"secondary",onClick:p=>Ze(a)},"Открыть результат",8,Xt)):h("",!0)],2))),128))])])):h("",!0),n(S).length?(d(),u("section",Yt,[t("div",Zt,[t("div",null,[e[42]||(e[42]=t("h3",null,"Ход массовой генерации",-1)),t("p",null,i(n(je)),1)]),t("span",{class:W(["status-pill",{running:n(U)}])},i(n(U)?"в работе":"готово"),3)]),t("div",el,[t("span",{style:Be({width:`${n(Oe)}%`})},null,4)]),t("div",tl,[(d(!0),u(B,null,E(n(S),a=>(d(),u("article",{key:a.key,class:W(["batch-result",a.status])},[t("div",null,[t("b",null,i(a.idea.title),1),t("small",null,i(a.message),1)]),a.draft?(d(),u("button",{key:0,type:"button",class:"secondary",onClick:p=>Ye(a)},"Открыть результат",8,ll)):h("",!0)],2))),128))])])):h("",!0),n(P).length?(d(),u("div",al,[(d(!0),u(B,null,E(n(P),a=>(d(),u("article",{key:a.topic,class:W(["article-idea-card",{selected:n(z)?.topic===a.topic}])},[t("div",nl,[t("label",sl,[t("input",{type:"checkbox",checked:ze(a),onChange:p=>qe(a)},null,40,ol),t("h3",null,i(a.title),1)]),t("span",null,i(a.score)+"%",1)]),t("p",null,i(a.why),1),t("small",null,i(a.audience),1),a.relatedStyle?(d(),u("small",rl," Связанный стиль: "+i(a.relatedStyle.name)+" · ссылка будет добавлена в статью ",1)):h("",!0),t("div",il,[(d(!0),u(B,null,E(a.keywords.slice(0,4),p=>(d(),u("span",{key:p},i(p),1))),128))]),t("button",{type:"button",onClick:p=>ye(a)},"Открыть одну",8,ul)],2))),128))])):h("",!0)]),t("section",dl,[t("article",pl,[t("div",ml,[e[43]||(e[43]=t("div",null,[t("h2",null,"Основа статьи"),t("p",null,"Одна статья за запуск: сначала собираем и проверяем материал, затем публикуем готовую статью.")],-1)),t("span",cl,i(n(o)?n(De):"ожидает тему"),1)]),t("div",vl,[t("label",null,[e[45]||(e[45]=m(" Тип статьи ",-1)),c(t("select",{"onUpdate:modelValue":e[8]||(e[8]=a=>n(s).kind=a)},[...e[44]||(e[44]=[Le('<option value="general" data-v-37978a69>Общая статья</option><option value="image" data-v-37978a69>Фото / стили / изображения</option><option value="video" data-v-37978a69>Видео</option><option value="character" data-v-37978a69>Персонажи</option><option value="seo" data-v-37978a69>SEO-материал</option>',5)])],512),[[Y,n(s).kind]])]),t("label",null,[e[47]||(e[47]=m(" Модель ",-1)),c(t("select",{"onUpdate:modelValue":e[9]||(e[9]=a=>n(s).model=a)},[...e[46]||(e[46]=[t("option",{value:"gpt-5.4"},"GPT-5.4",-1)])],512),[[Y,n(s).model]])])]),t("label",null,[e[48]||(e[48]=m(" Тема ",-1)),c(t("input",{"onUpdate:modelValue":e[10]||(e[10]=a=>n(s).topic=a),type:"text",placeholder:"Например: как сделать фото в стиле комикса"},null,512),[[b,n(s).topic]])]),t("label",null,[e[49]||(e[49]=m(" Ключи ",-1)),c(t("textarea",{"onUpdate:modelValue":e[11]||(e[11]=a=>n(s).keywords=a),rows:"3",placeholder:"Через запятую или с новой строки. Wordstat подключим следующим слоем."},null,512),[[b,n(s).keywords]])]),t("div",gl,[t("label",null,[e[50]||(e[50]=m(" Кому ",-1)),c(t("input",{"onUpdate:modelValue":e[12]||(e[12]=a=>n(s).audience=a),type:"text",placeholder:"Например: пользователи, которые хотят быстро сделать фото"},null,512),[[b,n(s).audience]])]),t("label",null,[e[51]||(e[51]=m(" Цель ",-1)),c(t("input",{"onUpdate:modelValue":e[13]||(e[13]=a=>n(s).goal=a),type:"text",placeholder:"SEO-трафик, объяснение продукта, переход в генератор"},null,512),[[b,n(s).goal]])])]),t("label",null,[e[53]||(e[53]=m(" Картинки ",-1)),c(t("select",{"onUpdate:modelValue":e[14]||(e[14]=a=>n(s).mediaMode=a)},[...e[52]||(e[52]=[t("option",{value:"prompts-only"},"Только промты картинок",-1),t("option",{value:"cover"},"Обложка",-1),t("option",{value:"cover-inline"},"Обложка + картинки внутри",-1),t("option",{value:"none"},"Без картинок",-1)])],512),[[Y,n(s).mediaMode]])]),t("div",fl,[t("label",null,[e[54]||(e[54]=m(" Длина, слов ",-1)),c(t("input",{"onUpdate:modelValue":e[15]||(e[15]=a=>n(s).maxLength=a),type:"number",min:"600",max:"5000",step:"100"},null,512),[[b,n(s).maxLength,void 0,{number:!0}]])]),t("label",null,[e[55]||(e[55]=m(" Картинок ",-1)),c(t("input",{"onUpdate:modelValue":e[16]||(e[16]=a=>n(s).imageCount=a),type:"number",min:"0",max:"10"},null,512),[[b,n(s).imageCount,void 0,{number:!0}]])])]),t("label",null,[e[56]||(e[56]=m(" Стиль картинок ",-1)),c(t("input",{"onUpdate:modelValue":e[17]||(e[17]=a=>n(s).imageStylePrompt=a),type:"text",placeholder:"Например: чистая editorial-иллюстрация, без текста на изображении"},null,512),[[b,n(s).imageStylePrompt]])]),t("div",yl,[t("button",{type:"button",disabled:n(R)||!n(xe),onClick:st},i(n(R)?"Генерирую статью...":"Сгенерировать статью"),9,bl),t("button",{type:"button",class:"secondary",disabled:!n(o),onClick:ct}," Очистить ",8,hl),t("button",{type:"button",class:"secondary",disabled:!n(o),onClick:e[18]||(e[18]=a=>V.value=!n(V))},i(n(V)?"Скрыть предпросмотр":"Предпросмотр"),9,kl)]),n(ee)?(d(),u("p",$l,i(n(ee)),1)):h("",!0),n(L)?(d(),u("p",wl,i(n(L)),1)):h("",!0),n(R)?(d(),u("p",Sl,i(n(Ne)),1)):h("",!0)]),e[57]||(e[57]=t("aside",{class:"panel schema-
7panel"},[t("h2",null,"Как это работает"),t("ul",null,[t("li",null,"Генерация идет через единый серверный поток статей."),t("li",null,"Он пишет текст, SEO и при включенных картинках запускает существующий image-провайдер."),t("li",null,"Каждая статья проходит аудит перед сохранением."),t("li",null,"В массовом режиме автоматически публикуются только статьи со статусом approve."),t("li",null,"Запись в удаленный Strapi работает только при явном разрешении."),t("li",null,"Если генерация упала, показывается ошибка, а не подставляется другой тип черновика.")])],-1))]),n(o)&&n(V)?(d(),u("section",{key:0,ref_key:"previewRef",ref:de,class:"article-preview-panel"},[t("div",xl,[e[58]||(e[58]=t("div",null,[t("p",{class:"eyebrow"},"preview"),t("h2",null,"Предпросмотр статьи")],-1)),t("button",{type:"button",class:"secondary",onClick:e[19]||(e[19]=a=>V.value=!1)},"Закрыть")]),t("article",Ml,[t("header",null,[t("p",Il,i(n(o).kind)+" / предпросмотр",1),t("h1",null,i(n(o).h1||n(o).title),1),n(o).seoDescription?(d(),u("p",Cl,i(n(o).seoDescription),1)):h("",!0),t("div",Pl,[t("span",null,i(n(me))+" слов",1),t("span",null,i(n(ce))+" Ð
7ºÐ°Ñ€Ñ‚инок",1),t("span",null,i(n(o).model),1)])]),t("div",{class:"preview-body",innerHTML:n(Ge)},null,8,Tl),n(o).seoKeywords.length?(d(),u("section",Vl,[(d(!0),u(B,null,E(n(o).seoKeywords,a=>(d(),u("span",{key:a},i(a),1))),128))])):h("",!0)])],512)):h("",!0),n(o)?(d(),u("section",Ul,[t("article",Al,[e[65]||(e[65]=t("div",{class:"panel-head compact"},[t("h2",null,"SEO и поля"),t("span",{class:"status-pill"},"этап 2")],-1)),t("label",null,[e[59]||(e[59]=m("title",-1)),c(t("input",{"onUpdate:modelValue":e[20]||(e[20]=a=>n(o).title=a),type:"text"},null,512),[[b,n(o).title]])]),t("label",null,[e[60]||(e[60]=m("h1",-1)),c(t("input",{"onUpdate:modelValue":e[21]||(e[21]=a=>n(o).h1=a),type:"text"},null,512),[[b,n(o).h1]])]),t("label",null,[e[61]||(e[61]=m("slug",-1)),c(t("input",{"onUpdate:modelValue":e[22]||(e[22]=a=>n(o).slug=a),type:"text"},null,512),[[b,n(o).slug]])]),t("label",null,[e[62]||(e[62]=m("seoTitle",-1)),c(t("input",{"onUpdate:modelValue":e[23]||(e[23]=a=>n(o).seoTitle=a),type:"text"},null,512),[[b,n(o).seoT
7itle]])]),t("label",null,[e[63]||(e[63]=m("seoDescription",-1)),c(t("textarea",{"onUpdate:modelValue":e[24]||(e[24]=a=>n(o).seoDescription=a),rows:"3"},null,512),[[b,n(o).seoDescription]])]),t("label",null,[e[64]||(e[64]=m("excerpt",-1)),c(t("textarea",{"onUpdate:modelValue":e[25]||(e[25]=a=>n(o).excerpt=a),rows:"3"},null,512),[[b,n(o).excerpt]])])]),t("article",Ll,[e[67]||(e[67]=t("div",{class:"panel-head compact"},[t("h2",null,"Структура"),t("span",{class:"status-pill"},"этап 3")],-1)),(d(!0),u(B,null,E(n(o).outline,(a,p)=>(d(),u("div",{key:p,class:"outline-item"},[t("label",null,[m(" Блок "+i(p+1)+" ",1),c(t("input",{"onUpdate:modelValue":g=>a.title=g,type:"text"},null,8,Bl),[[b,a.title]])]),t("label",null,[e[66]||(e[66]=m(" Задача блока ",-1)),c(t("textarea",{"onUpdate:modelValue":g=>a.notes=g,rows:"2"},null,8,El),[[b,a.notes]])])]))),128))]),t("article",_l,[e[68]||(e[68]=t("div",{class:"panel-head compact"},[t("h2",null,"Текст"),t("span",{class:"status-pill"},"этап 4")],-1)),c(t("textarea",{"onUpdate:modelValue":e[26]||(e[26]=a=>n(o).content=a),class:"content-editor",rows:"18"},null,512),[[b,n(o).content]])]),t("article",Dl,[t("div",Ol,[e[69]||(e[69]=t("h2",null,"Картинки",-1)),t("span",jl,i(n(ce))+" промтов",1)]),t("label",null,[e[70]||
7(e[70]=m(" Обложка ",-1)),c(t("textarea",{"onUpdate:modelValue":e[27]||(e[27]=a=>n(o).coverImagePrompt=a),rows:"4",placeholder:"Промт обложки"},null,512),[[b,n(o).coverImagePrompt]])]),(d(!0),u(B,null,E(n(o).inlineImagePrompts,(a,p)=>(d(),u("div",{key:p,class:"image-prompt"},[t("label",null,[e[71]||(e[71]=m("Блок",-1)),c(t("input",{"onUpdate:modelValue":g=>a.title=g,type:"text"},null,8,Rl),[[b,a.title]])]),t("label",null,[e[72]||(e[72]=m("prompt",-1)),c(t("textarea",{"onUpdate:modelValue":g=>a.prompt=g,rows:"3"},null,8,Nl),[[b,a.prompt]])]),t("label",null,[e[73]||(e[73]=m("alt",-1)),c(t("input",{"onUpdate:modelValue":g=>a.alt=g,type:"text"},null,8,Hl),[[b,a.alt]])])]))),128))]),t("article",Kl,[e[78]||(e[78]=t("div",{class:"panel-head compact"},[t("h2",null,"Проверка"),t("span",{class:"status-pill"},"этап 5")],-1)),t("div",Gl,[(d(!0),u(B,null,E(n(o).checklist,a=>(d(),u("div",{key:a.label,class:W(["check-item",a.status])},[t("span",null,i(a.status==="ready"?"готово":"позже"),1),m(" "+i(a.label),1)],2))),128))]),t("dl",Wl,[t("div",null,[e[74]||(e[74]=t("dt",null,"Слов",-1)),t("dd",null,i(n(me)),1)]),t("div",null,[e[75]||(e[75]=t("dt",null,"Картинок",-1)),t("dd",null,i(n(ce)),1)]),e[76]||(e[76]=t("div",null,[t("dt",null,"Статус"),t("dd",null,"готово к публикации")],-1))]),t("button",{type:"button",disabled:n(te),onClick:vt},i(n(te)?"Публикую...":"Опубликовать статью"),9,zl),e[79]||(e[79]=t("p",{class:"save-note"},"На боевой Strapi генератор не пишет без флага `ARTICLE_LAB_ALLOW_REMOTE_STRAPI=1`.",-1)),n(_)?(d(),u("p",ql,i(n(_)),1)):h("",!0),n(T)?(d(),u("div",Fl,[e[77]||(e[77]=t("b",null,"Сохранено:",-1)),m(" "+i(n(T).article.title)+" / "+i(n(T).article.slug),1)])):h("",!0)])])):h("",!0)])}}}),ta=yt(Ql,[["__scopeId","data-v-37978a69"]]);export{ta as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.