6 lines
28 KiB
JavaScript
6 lines
28 KiB
JavaScript
|
|
(function(){"use strict";function f(o,e,t,s,a,n,u,i){var l=typeof o=="function"?o.options:o;return e&&(l.render=e,l.staticRenderFns=t,l._compiled=!0),{exports:o,options:l}}const D={extends:"k-writer-field",props:{ai:[String,Boolean]},data(){return{aiStreaming:!1,aiAbortController:null}},computed:{buttons(){if(!this.ai)return[];if(this.aiStreaming)return[{icon:"loader",text:this.$t("seo.ai.action.stop"),disabled:this.disabled||!this.aiEndpointUrl,theme:"red",click:()=>this.abortAiStream()}];const o=[{icon:this.value===""?"seo-ai":"refresh",text:this.value===""?this.$t("seo.ai.action.generate"):this.$t("seo.ai.action.regenerate"),disabled:this.disabled||!this.aiEndpointUrl,click:()=>this.startAiStream()},{icon:"cog",title:this.$t("seo.ai.action.customize"),disabled:this.disabled||!this.aiEndpointUrl,click:()=>this.openCustomizeDialog()}];return this.value!==""?[{icon:"seo-ai",text:this.$t("seo.ai.action.edit"),disabled:this.disabled||!this.aiEndpointUrl,click:()=>this.openEditDialog()},...o]:o},aiEndpointUrl(){var t,s,a;const o=(s=(t=this.$panel)==null?void 0:t.urls)==null?void 0:s.api,e=(a=this.endpoints)==null?void 0:a.field;return!o||!e?null:`${o}/${e}/ai/stream`.replace(/([^:]\/)\/+/g,"$1")}},beforeDestroy(){this.abortAiStream()},methods:{async startAiStream(o={}){var a,n,u,i;const e=this.aiEndpointUrl;if(!e||this.disabled||this.aiStreaming)return;(a=this.$refs.input)!=null&&a.focus&&this.$refs.input.focus();const t=this.getEditor();t&&t.clearContent();const s=new AbortController;this.aiAbortController=s,this.aiStreaming=!0;try{const l=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream","X-CSRF":(u=(n=this.$panel)==null?void 0:n.system)==null?void 0:u.csrf,"X-Language":(i=this.$panel)==null?void 0:i.language.code},body:JSON.stringify({instructions:o.instructions,edit:o.edit}),credentials:"same-origin",signal:s.signal});if(!l.ok)try{const d=await l.json();throw new Error((d==null?void 0:d.message)||this.$t("seo.ai.error.request"))}catch{throw new Error(this.$t("seo.ai.error.request"))}if(!l.body)throw new Error(this.$t("seo.ai.error.request"));await this.consumeStream(l.body.getReader())}catch(l){if(l&&l.name==="AbortError")return;console.error(l);const d=l&&l.message?l.message:this.$t("seo.ai.error.request");this.$panel.notification.error(d)}finally{this.aiAbortController=null,this.aiStreaming=!1}},async consumeStream(o){const e=new TextDecoder;let t="";try{for(;;){const{value:s,done:a}=await o.read();if(a)break;s&&(t+=e.decode(s,{stream:!0}),t=this.processStreamBuffer(t))}t+=e.decode(),this.processStreamBuffer(t)}finally{o&&typeof o.releaseLock=="function"&&o.releaseLock()}},processStreamBuffer(o){let e=o;for(;;){const t=e.indexOf(`
|
||
|
|
|
||
|
|
`);if(t===-1)return e;const s=e.slice(0,t);if(e=e.slice(t+2),s.trim()==="")continue;const a=s.split(`
|
||
|
|
`).filter(n=>n.trim().startsWith("data:")).map(n=>n.trim().slice(5)).join(`
|
||
|
|
`).trim();a!==""&&this.handleAiEvent(a)}},handleAiEvent(o){let e=null;try{e=JSON.parse(o)}catch(t){console.error("Failed to parse AI chunk",t,o);return}if(e.type!=="text-start"){if(e.type==="text-delta"){this.applyAiDelta(e.text||"");return}if(e.type!=="thinking-delta"&&!(e.type==="tool-call"||e.type==="tool-result")&&e.type!=="stream-end"&&e.type==="error")throw new Error(e.payload&&e.payload.message?e.payload.message:this.$t("seo.ai.error.request"))}},applyAiDelta(o){if(!o)return;const e=this.getEditor();if(!e)return;const{state:t,view:s}=e;if(!t||!s)return;const a=t.doc.content.size,n=t.schema.text(o),u=t.tr.insert(a,n);s.dispatch(u)},getEditor(){var e,t;const o=(t=(e=this.$refs.input)==null?void 0:e.$refs)==null?void 0:t.input;return(o==null?void 0:o.editor)||null},abortAiStream(){this.aiAbortController&&(this.aiAbortController.abort(),this.aiAbortController=null),this.aiStreaming=!1},openEditDialog(){this.$panel.dialog.open({component:"k-form-dialog",props:{fields:{instructions:{label:this.$t("seo.ai.dialog.instructions.label"),type:"textarea",buttons:!1,placeholder:this.$t("seo.ai.dialog.instructions.placeholder"),required:!0}},submitButton:this.$t("seo.ai.dialog.edit.submit")},on:{submit:o=>{this.$panel.dialog.close(),this.startAiStream({edit:this.value,instructions:o.instructions})}}})},openCustomizeDialog(){this.$panel.dialog.open({component:"k-form-dialog",props:{fields:{instructions:{label:this.$t("seo.ai.dialog.custom.label"),type:"textarea",buttons:!1,placeholder:this.$t("seo.ai.dialog.custom.placeholder"),required:!0}},submitButton:this.$t("seo.ai.dialog.custom.submit")},on:{submit:o=>{this.$panel.dialog.close(),this.startAiStream({instructions:o.instructions})}}})}}};var I=function(){var e=this,t=e._self._c;return t("k-field",e._b({class:["k-writer-field",e.$attrs.class],style:e.$attrs.style,attrs:{counter:e.counterOptions,input:e.id},scopedSlots:e._u([e.disabled?null:{key:"options",fn:function(){return[t("k-button-group",{ref:"buttons",staticClass:"k-field-options",attrs:{buttons:e.buttons,layout:"collapsed",size:"xs",variant:"filled"}})]},proxy:!0}],null,!0)},"k-field",e.$props,!1),[t("k-input",e._b({ref:"input",attrs:{after:e.after,before:e.before,icon:e.icon,type:"seo-writer"},on:{input:function(s){return e.$emit("input",s)}}},"k-input",e.$props,!1))],1)},O=[],U=f(D,I,O);const F=U.exports,M={extends:"k-writer-input",methods:{createNodes(){return Vue.component("k-writer-input").options.methods.createNodes.call(this).filter(e=>e.name!=="hardBreak")}}};var B=function(){var e=this,t=e._self._c;return t("div",{directives:[{name:"direction",rawName:"v-direction"}],ref:"editor",class:["k-writer","k-writer-input",e.$attrs.class],style:e.$attrs.style,attrs:{"data-disabled":e.disabled,"data-empty":e.isEmpty,"data-placeholder":e.placeholder,spellcheck:e.spellcheck}},[e.editor&&!e.disabled?t("k-writer-toolbar",e._b({ref:"toolbar",on:{command:e.onCommand}},"k-writer-toolbar",e.toolbarOptions,!1)):e._e(),t("textarea",{ref:"output",staticClass:"input-hidden",attrs:{name:e.name,required:e.required,tabindex:"-1"},domProps:{value:e.value}})],1)},V=[],z=f(M,B,V);const H=z.exports,r=window.Vue;function y(){return window.panel}function L(){return y().api}function q(){return y().app}function R(){const o=L();return{load:({parent:t,name:s})=>o.get(`${t}/sections/${s}`)}}const m=r.computed;r.customRef,r.defineAsyncComponent,r.defineComponent,r.effectScope,r.getCurrentInstance,r.getCurrentScope,r.h,r.inject,r.isProxy,r.isReactive,r.isReadonly,r.isRef,r.isShallow,r.markRaw;const Z=r.nextTick;r.onActivated,r.onBeforeMount,r.onBeforeUnmount,r.onBeforeUpdate,r.onDeactivated,r.onErrorCaptured;const C=r.onMounted;r.onRenderTracked,r.onRenderTriggered,r.onScopeDispose,r.onServerPrefetch;const S=r.onUnmounted;r.onUpdated,r.provide,r.proxyRefs,r.reactive,r.readonly;const v=r.ref;r.shallowReactive,r.shallowReadonly,r.shallowRef,r.toRaw,r.toRef,r.toRefs,r.triggerRef,r.unref,r.useAttrs,r.useCssModule,r.useCssVars,r.useListeners,r.useSlots;const x=r.watch;r.watchEffect,r.watchPostEffect,r.watchSyncEffect;const j={__name:"utm-share-dialog",
|