koishi-plugin-media-luna 0.0.5 → 0.0.7
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/client/components/GenerateView.vue +294 -62
- package/client/components/PresetPicker.vue +738 -0
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineComponent as ne,computed as ae,ref as h,resolveComponent as E,createElementBlock as s,openBlock as t,createElementVNode as e,createCommentVNode as o,Fragment as S,renderList as K,normalizeClass as Z,toDisplayString as u,createVNode as a,withKeys as Ee,withCtx as I,createStaticVNode as Ce,createBlock as ee,watch as pe,withDirectives as ye,vShow as be,withModifiers as de,createTextVNode as R,onMounted as ve,onUnmounted as Fe,Teleport as qe,Transition as Ne,createSlots as Re,onBeforeUnmount as Be,h as Ue,resolveDynamicComponent as Se,KeepAlive as He}from"vue";import{send as Ge,message as J}from"@koishijs/client";async function A(i,C){const p=await Ge(i,C);if(!p.success)throw new Error(p.error||"请求失败");return p.data}const fe={list:()=>A("media-luna/channels/list"),get:i=>A("media-luna/channels/get",{id:i}),create:i=>A("media-luna/channels/create",i),update:(i,C)=>A("media-luna/channels/update",{id:i,data:C}),delete:i=>A("media-luna/channels/delete",{id:i}),toggle:(i,C)=>A("media-luna/channels/toggle",{id:i,enabled:C}),tags:()=>A("media-luna/channels/tags"),getByTags:(i,C)=>A("media-luna/channels/by-tags",{tags:i,matchAll:C})},ge={list:i=>A("media-luna/presets/list",{enabledOnly:i}),get:i=>A("media-luna/presets/get",{id:i}),create:i=>A("media-luna/presets/create",i),update:(i,C)=>A("media-luna/presets/update",{id:i,data:C}),delete:i=>A("media-luna/presets/delete",{id:i}),toggle:(i,C)=>A("media-luna/presets/toggle",{id:i,enabled:C}),copy:i=>A("media-luna/presets/copy",{id:i}),matching:i=>A("media-luna/presets/matching",{channelId:i}),tags:()=>A("media-luna/presets/tags"),getByTags:(i,C)=>A("media-luna/presets/by-tags",{tags:i,matchAll:C})},_e={list:i=>A("media-luna/tasks/list",i),get:i=>A("media-luna/tasks/get",{id:i}),delete:i=>A("media-luna/tasks/delete",{id:i}),stats:i=>A("media-luna/tasks/stats",{channelId:i}),cleanup:i=>A("media-luna/tasks/cleanup",{days:i}),recent:(i,C)=>A("media-luna/tasks/recent",{userId:i,limit:C}),my:i=>A("media-luna/tasks/my",i)},Je={me:()=>A("media-luna/auth/me")},$e={list:()=>A("media-luna/middlewares/list"),get:i=>A("media-luna/middlewares/get",{name:i}),update:(i,C)=>A("media-luna/middlewares/update",{name:i,data:C}),reset:i=>A("media-luna/middlewares/reset",{name:i}),executionOrder:()=>A("media-luna/middlewares/execution-order"),cardFields:()=>A("media-luna/middlewares/card-fields")},ke={list:()=>A("media-luna/connectors/list"),get:i=>A("media-luna/connectors/get",{id:i}),fields:i=>A("media-luna/connectors/fields",{id:i}),schema:()=>A("media-luna/connectors/schema")},je={generate:i=>A("media-luna/generate",i),preview:i=>A("media-luna/generate/preview",i)},We={upload:(i,C,p)=>A("media-luna/cache/upload",{data:i,mime:C,filename:p}),cacheUrl:i=>A("media-luna/cache/cache-url",{url:i}),get:i=>A("media-luna/cache/get",{id:i}),read:i=>A("media-luna/cache/read",{id:i}),delete:i=>A("media-luna/cache/delete",{id:i}),stats:()=>A("media-luna/cache/stats"),clear:()=>A("media-luna/cache/clear")},Oe={panels:()=>A("media-luna/settings/panels"),get:i=>A("media-luna/settings/get",{id:i}),update:(i,C)=>A("media-luna/settings/update",{id:i,config:C}),syncRemotePresets:()=>A("media-luna/presets/sync")},Ve={list:()=>A("media-luna/plugins/list"),get:i=>A("media-luna/plugins/get",{id:i}),updateConfig:(i,C)=>A("media-luna/plugins/update-config",{pluginId:i,config:C}),enable:i=>A("media-luna/plugins/enable",{id:i}),disable:i=>A("media-luna/plugins/disable",{id:i}),externalList:()=>A("media-luna/plugins/external/list"),externalAdd:i=>A("media-luna/plugins/external/add",{moduleName:i}),externalRemove:i=>A("media-luna/plugins/external/remove",{moduleName:i})},Ke={class:"tag-filter"},Qe={class:"filter-tags"},Xe=["onClick"],Ye={key:0,class:"filter-input-wrapper"},Ze=ne({__name:"TagFilter",props:{modelValue:{default:()=>[]},allTags:{},presetTags:{default:()=>[]},showInput:{type:Boolean,default:true},maxDynamicTags:{default:20}},emits:["update:modelValue","change"],setup(i,{emit:C}){const p=i,x=C,c=ae({get:()=>p.modelValue,set:m=>{x("update:modelValue",m),x("change",m)}}),b=h(""),D=ae(()=>{const m=p.allTags.filter(y=>!p.presetTags.includes(y)).slice(0,p.maxDynamicTags);return[...p.presetTags,...m]}),T=m=>{const y=[...c.value],H=y.indexOf(m);H>=0?y.splice(H,1):y.push(m),c.value=y},f=()=>{const m=b.value.trim();m&&!c.value.includes(m)&&(c.value=[...c.value,m]),b.value=""};return(m,y)=>{const H=E("k-icon"),z=E("el-input");return t(),s("div",Ke,[e("div",Qe,[(t(true),s(S,null,K(D.value,r=>(t(),s("span",{key:r,class:Z(["filter-tag",{active:c.value.includes(r)}]),onClick:k=>T(r)},u(r),11,Xe))),128))]),i.showInput?(t(),s("div",Ye,[a(z,{modelValue:b.value,"onUpdate:modelValue":y[0]||(y[0]=r=>b.value=r),placeholder:"输入标签筛选...",size:"small",clearable:"",onKeyup:Ee(f,["enter"]),class:"filter-input"},{prefix:I(()=>[a(H,{name:"search"})]),_:1},8,["modelValue"])])):o("v-if",true)])}}}),oe=(i,C)=>{const p=i.__vccOpts||i;for(const[x,c]of C)p[x]=c;return p},Pe=oe(Ze,[["__scopeId","data-v-61b504c8"]]),et={class:"view-mode-switch"},tt=ne({__name:"ViewModeSwitch",props:{modelValue:{}},emits:["update:modelValue"],setup(i){return(C,p)=>(t(),s("div",et,[e("button",{class:Z(["mode-btn",{active:i.modelValue==="card"}]),onClick:p[0]||(p[0]=x=>C.$emit("update:modelValue","card")),title:"卡片视图"},[...p[2]||(p[2]=[Ce('<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" data-v-ae3ef498><rect x="3" y="3" width="8" height="8" rx="1" data-v-ae3ef498></rect><rect x="13" y="3" width="8" height="8" rx="1" data-v-ae3ef498></rect><rect x="3" y="13" width="8" height="8" rx="1" data-v-ae3ef498></rect><rect x="13" y="13" width="8" height="8" rx="1" data-v-ae3ef498></rect></svg>',1)])],2),e("button",{class:Z(["mode-btn",{active:i.modelValue==="list"}]),onClick:p[1]||(p[1]=x=>C.$emit("update:modelValue","list")),title:"列表视图"},[...p[3]||(p[3]=[e("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},[e("rect",{x:"3",y:"4",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"10.5",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"17",width:"18",height:"3",rx:"1"})],-1)])],2)]))}}),Le=oe(tt,[["__scopeId","data-v-ae3ef498"]]),lt={class:"tag-input"},st=ne({__name:"TagInput",props:{modelValue:{},suggestions:{},placeholder:{}},emits:["update:modelValue"],setup(i,{emit:C}){const p=i,x=C,c=ae({get:()=>p.modelValue,set:b=>x("update:modelValue",b)});return(b,D)=>{const T=E("el-option"),f=E("el-select");return t(),s("div",lt,[a(f,{modelValue:c.value,"onUpdate:modelValue":D[0]||(D[0]=m=>c.value=m),multiple:"",filterable:"","allow-create":"","default-first-option":"",placeholder:i.placeholder,class:"tag-select","tag-type":"primary"},{default:I(()=>[(t(true),s(S,null,K(i.suggestions,m=>(t(),ee(T,{key:m,label:m,value:m},null,8,["label","value"]))),128))]),_:1},8,["modelValue","placeholder"])])}}}),Ae=oe(st,[["__scopeId","data-v-68388640"]]),at={class:"config-renderer"},nt={key:0,class:"form-row"},ot={class:"field-container"},it={key:6,class:"field-desc"},dt=ne({__name:"ConfigRenderer",props:{fields:{},modelValue:{},clearable:{type:Boolean,default:false}},emits:["update:modelValue"],setup(i,{emit:C}){const p=i,x=C,c=T=>p.modelValue[T],b=(T,f)=>{const m={...p.modelValue,[T]:f};x("update:modelValue",m)},D=T=>{if(!T.showWhen)return true;const{field:f,value:m}=T.showWhen;return p.modelValue[f]===m};return(T,f)=>{const m=E("el-switch"),y=E("el-option"),H=E("el-select"),z=E("el-input-number"),r=E("el-input");return t(),s("div",at,[(t(true),s(S,null,K(i.fields,k=>(t(),s(S,{key:k.key},[D(k)?(t(),s("div",nt,[e("div",{class:Z(["form-label",{required:k.required}])},u(k.label),3),e("div",ot,[o(" Boolean 类型 "),k.type==="boolean"?(t(),ee(m,{key:0,"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v)},null,8,["model-value","onUpdate:modelValue"])):k.type==="select"?(t(),s(S,{key:1},[o(" Select 类型 "),a(H,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),placeholder:k.placeholder||"请选择",clearable:i.clearable,style:{width:"100%"}},{default:I(()=>[(t(true),s(S,null,K(k.options,v=>(t(),ee(y,{key:String(v.value),label:v.label,value:v.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)):k.type==="number"?(t(),s(S,{key:2},[o(" Number 类型 "),a(z,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),placeholder:k.placeholder,controls:true},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):k.type==="textarea"?(t(),s(S,{key:3},[o(" Textarea 类型 "),a(r,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),type:"textarea",rows:4,placeholder:k.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):k.type==="password"?(t(),s(S,{key:4},[o(" Password 类型 "),a(r,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),type:"password","show-password":"",placeholder:k.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(t(),s(S,{key:5},[o(" Text/String 类型 (默认) "),a(r,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),placeholder:k.placeholder,clearable:i.clearable},null,8,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)),o(" 字段描述 "),k.description?(t(),s("div",it,u(k.description),1)):o("v-if",true)])])):o("v-if",true)],64))),128))])}}}),xe=oe(dt,[["__scopeId","data-v-d82952a0"]]),rt={class:"dialog-layout"},ct={class:"tab-nav"},ut=["onClick"],vt={key:0,class:"tab-badge"},mt={class:"tab-content"},pt={class:"content-section"},gt={class:"form-group"},ft={class:"form-row"},_t={class:"form-group flex-1"},ht={class:"form-group"},yt={class:"switch-wrapper"},bt={class:"switch-label"},kt={class:"form-group"},$t={class:"section-divider"},wt={class:"content-section"},Vt={class:"override-hint-bar"},Ct={class:"pipeline-flow"},xt={class:"phase-icon"},It={class:"phase-info"},Ut={class:"phase-name"},St={class:"phase-desc"},Ot={class:"phase-badge"},Tt={key:0,class:"phase-middlewares"},Dt={class:"mw-card"},zt={class:"mw-content"},Ft={class:"mw-name"},Pt={class:"mw-desc"},Lt={key:2,class:"phase-connector"},At={class:"connector-arrow"},Mt={class:"content-section"},Et={class:"override-hint-bar"},qt={key:0,class:"plugins-override-list"},Nt=["onClick"],Rt={class:"plugin-info"},Bt={class:"plugin-name"},Ht={key:0,class:"override-badge"},Gt={class:"plugin-actions"},Jt={class:"plugin-config-fields"},jt={key:0,class:"override-field-row"},Wt={class:"field-label"},Kt={class:"field-input"},Qt={key:0,class:"field-hint"},Xt={key:1,class:"empty-hint"},Yt={class:"dialog-footer"},Zt=ne({__name:"ChannelConfigDialog",props:{modelValue:{type:Boolean},channel:{default:null}},emits:["update:modelValue","saved"],setup(i,{emit:C}){const p=i,x=C,c=ae({get:()=>p.modelValue,set:w=>x("update:modelValue",w)}),b=ae(()=>{var w;return!!((w=p.channel)!=null&&w.id)}),D=h("basic"),T=h(false),f=h(new Set),m=h([]),y=h({}),H=h([]),z=h([]),r=h({name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}),k=[{id:"basic",label:"基本信息",icon:"file-text"},{id:"middlewares",label:"中间件流程",icon:"git-branch"},{id:"plugins",label:"插件配置",icon:"puzzle"}],v=[{id:"lifecycle-prepare",label:"准备",description:"验证、权限检查",icon:"clipboard-check",colorClass:"phase-prepare"},{id:"lifecycle-pre-request",label:"预处理",description:"预设应用、参数处理",icon:"settings",colorClass:"phase-pre"},{id:"lifecycle-request",label:"执行",description:"调用连接器生成",icon:"play",colorClass:"phase-request"},{id:"lifecycle-post-request",label:"后处理",description:"结果缓存、格式转换",icon:"package",colorClass:"phase-post"},{id:"lifecycle-finalize",label:"完成",description:"计费结算、记录保存",icon:"check-circle",colorClass:"phase-finalize"}],M={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},G=ae(()=>r.value.connectorId?y.value[r.value.connectorId]||[]:[]),Q=ae(()=>{const w=m.value.find(d=>d.id===r.value.connectorId);return(w==null?void 0:w.name)||"连接器"}),N=ae(()=>k.map(w=>{let d="";return w.id==="middlewares"&&(d=String(H.value.length)),w.id==="plugins"&&q.value.length>0&&(d=String(q.value.length)),{...w,badge:d}})),q=ae(()=>z.value.filter(w=>w.configFields&&w.configFields.length>0)),g=w=>H.value.filter(d=>d.phase===w),W=(w,d)=>{var B,le,ce;return(ce=(le=(B=r.value.pluginOverrides)==null?void 0:B[w])==null?void 0:le.middlewares)==null?void 0:ce[d]},se=(w,d,B)=>{r.value.pluginOverrides||(r.value.pluginOverrides={}),r.value.pluginOverrides[w]||(r.value.pluginOverrides[w]={}),r.value.pluginOverrides[w].middlewares||(r.value.pluginOverrides[w].middlewares={}),B==null?(delete r.value.pluginOverrides[w].middlewares[d],Object.keys(r.value.pluginOverrides[w].middlewares).length===0&&delete r.value.pluginOverrides[w].middlewares,Object.keys(r.value.pluginOverrides[w]).length===0&&delete r.value.pluginOverrides[w]):r.value.pluginOverrides[w].middlewares[d]=B},re=w=>{const d=W(w.configGroup||w.name,w.name);return d!==void 0?d?"active override":"override":w.enabled?"active":""},P=(w,d)=>{var B,le;return(le=(B=r.value.pluginOverrides)==null?void 0:B[w])==null?void 0:le[d]},$=(w,d,B)=>{r.value.pluginOverrides||(r.value.pluginOverrides={}),r.value.pluginOverrides[w]||(r.value.pluginOverrides[w]={}),B==null||B===""?(delete r.value.pluginOverrides[w][d],Object.keys(r.value.pluginOverrides[w]).length===0&&delete r.value.pluginOverrides[w]):r.value.pluginOverrides[w][d]=B},O=w=>{var B;const d=(B=r.value.pluginOverrides)==null?void 0:B[w];return d&&Object.keys(d).length>0},_=w=>{r.value.pluginOverrides&&delete r.value.pluginOverrides[w]},V=w=>{f.value.has(w)?f.value.delete(w):f.value.add(w)},l=(w,d)=>{var L,ue;if(!d.showWhen)return true;const{field:B,value:le}=d.showWhen,ce=(ue=(L=r.value.pluginOverrides)==null?void 0:L[w.id])==null?void 0:ue[B],me=w.config[B];return(ce!==void 0?ce:me)===le},n=async w=>{if(r.value.connectorConfig={},w&&!y.value[w])try{const d=await ke.fields(w);y.value[w]=d}catch(d){console.error("Failed to load connector fields:",d)}},U=async()=>{var w;if(!r.value.name){J.error("请输入渠道名称");return}if(!r.value.connectorId){J.error("请选择连接器");return}T.value=true;try{b.value&&((w=p.channel)!=null&&w.id)?(await fe.update(p.channel.id,r.value),J.success("保存成功")):(await fe.create(r.value),J.success("创建成功")),x("saved"),c.value=false}catch(d){J.error(d instanceof Error?d.message:"操作失败")}finally{T.value=false}},j=()=>{D.value="basic",f.value.clear()},te=async()=>{try{const[w,d,B]=await Promise.all([ke.list(),$e.list(),Ve.list()]);m.value=w,H.value=d,z.value=B.filter(le=>le.configFields&&le.configFields.length>0||le.middlewares&&le.middlewares.length>0)}catch(w){console.error("Failed to load data:",w)}};return pe(()=>p.modelValue,async w=>{if(w)if(await te(),p.channel){if(r.value=JSON.parse(JSON.stringify(p.channel)),r.value.pluginOverrides||(r.value.pluginOverrides={}),r.value.connectorConfig||(r.value.connectorConfig={}),r.value.connectorId&&!y.value[r.value.connectorId])try{const d=await ke.fields(r.value.connectorId);y.value[r.value.connectorId]=d}catch(d){console.error("Failed to load connector fields:",d)}for(const d of Object.keys(r.value.pluginOverrides))f.value.add(d)}else r.value={name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}}),(w,d)=>{const B=E("k-icon"),le=E("el-input"),ce=E("el-option"),me=E("el-select"),he=E("el-switch"),L=E("k-button"),ue=E("el-input-number"),ie=E("el-dialog");return t(),ee(ie,{modelValue:c.value,"onUpdate:modelValue":d[6]||(d[6]=F=>c.value=F),title:b.value?"编辑渠道":"创建渠道",width:"800px","close-on-click-modal":false,class:"channel-config-dialog",onClosed:j},{footer:I(()=>[e("div",Yt,[a(L,{onClick:d[5]||(d[5]=F=>c.value=false)},{default:I(()=>[...d[24]||(d[24]=[R("取消",-1)])]),_:1}),a(L,{type:"primary",onClick:U,loading:T.value},{default:I(()=>[R(u(b.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:I(()=>[e("div",rt,[o(" 左侧 Tab 导航 "),e("div",ct,[(t(true),s(S,null,K(N.value,F=>(t(),s("div",{key:F.id,class:Z(["tab-item",{active:D.value===F.id}]),onClick:X=>D.value=F.id},[a(B,{name:F.icon},null,8,["name"]),e("span",null,u(F.label),1),F.badge?(t(),s("span",vt,u(F.badge),1)):o("v-if",true)],10,ut))),128))]),o(" 右侧内容区 "),e("div",mt,[o(" 基本信息 "),ye(e("div",pt,[d[13]||(d[13]=e("div",{class:"section-header"},[e("h4",null,"基本信息"),e("p",null,"设置渠道的名称、连接器和标签")],-1)),e("div",gt,[d[7]||(d[7]=e("label",{class:"form-label required"},"渠道名称",-1)),a(le,{modelValue:r.value.name,"onUpdate:modelValue":d[0]||(d[0]=F=>r.value.name=F),placeholder:"如 OpenAI DALL-E"},null,8,["modelValue"]),d[8]||(d[8]=e("div",{class:"form-hint"},"用户可见的渠道名称,冲突时会自动添加后缀",-1))]),e("div",ft,[e("div",_t,[d[9]||(d[9]=e("label",{class:"form-label required"},"连接器",-1)),a(me,{modelValue:r.value.connectorId,"onUpdate:modelValue":d[1]||(d[1]=F=>r.value.connectorId=F),placeholder:"选择连接器",onChange:n,style:{width:"100%"}},{default:I(()=>[(t(true),s(S,null,K(m.value,F=>(t(),ee(ce,{key:F.id,label:F.name,value:F.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",ht,[d[10]||(d[10]=e("label",{class:"form-label"},"启用状态",-1)),e("div",yt,[a(he,{modelValue:r.value.enabled,"onUpdate:modelValue":d[2]||(d[2]=F=>r.value.enabled=F)},null,8,["modelValue"]),e("span",bt,u(r.value.enabled?"启用":"禁用"),1)])])]),e("div",kt,[d[11]||(d[11]=e("label",{class:"form-label"},"标签",-1)),a(Ae,{modelValue:r.value.tags,"onUpdate:modelValue":d[3]||(d[3]=F=>r.value.tags=F),placeholder:"输入标签后按回车..."},null,8,["modelValue"]),d[12]||(d[12]=e("div",{class:"form-hint"},"用于分类和筛选渠道",-1))]),o(" 连接器配置(内嵌) "),G.value.length>0?(t(),s(S,{key:0},[e("div",$t,[e("span",null,u(Q.value)+" 配置",1)]),a(xe,{fields:G.value,modelValue:r.value.connectorConfig,"onUpdate:modelValue":d[4]||(d[4]=F=>r.value.connectorConfig=F)},null,8,["fields","modelValue"])],64)):o("v-if",true)],512),[[be,D.value==="basic"]]),o(" 中间件流程 "),ye(e("div",wt,[d[18]||(d[18]=e("div",{class:"section-header"},[e("h4",null,"中间件流程"),e("p",null,"控制此渠道的中间件启用状态")],-1)),e("div",Vt,[a(B,{name:"info-circle"}),d[14]||(d[14]=e("span",null,"留空表示跟随全局配置",-1))]),e("div",Ct,[(t(),s(S,null,K(v,(F,X)=>e("div",{key:F.id,class:"phase-section"},[o(" 阶段标题 "),e("div",{class:Z(["phase-header",F.colorClass])},[e("div",xt,[a(B,{name:F.icon},null,8,["name"])]),e("div",It,[e("span",Ut,u(F.label),1),e("span",St,u(F.description),1)]),e("span",Ot,u(g(F.id).length),1)],2),o(" 中间件列表 "),g(F.id).length>0?(t(),s("div",Tt,[(t(true),s(S,null,K(g(F.id),Y=>(t(),s("div",{key:Y.name,class:Z(["mw-item",{"has-override":W(Y.configGroup||Y.name,Y.name)!==void 0}])},[e("div",Dt,[e("div",{class:Z(["mw-status",re(Y)])},null,2),e("div",zt,[e("span",Ft,u(Y.displayName),1),e("span",Pt,u(Y.description||M[Y.category]||Y.category),1)]),a(me,{"model-value":W(Y.configGroup||Y.name,Y.name),"onUpdate:modelValue":Me=>se(Y.configGroup||Y.name,Y.name,Me),placeholder:Y.enabled?"全局: 启用":"全局: 禁用",clearable:"",size:"small",class:"mw-switch"},{default:I(()=>[a(ce,{label:"启用",value:true}),a(ce,{label:"禁用",value:false})]),_:1},8,["model-value","onUpdate:modelValue","placeholder"])])],2))),128))])):(t(),s(S,{key:1},[o(" 空状态 "),d[15]||(d[15]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),o(" 阶段间连接箭头 "),X<v.length-1?(t(),s("div",Lt,[d[16]||(d[16]=e("div",{class:"connector-line"},null,-1)),e("div",At,[a(B,{name:"chevron-down"})]),d[17]||(d[17]=e("div",{class:"connector-line"},null,-1))])):o("v-if",true)])),64))]),o(" 底部说明 "),d[19]||(d[19]=e("div",{class:"pipeline-footer"},[e("div",{class:"footer-item"},[e("span",{class:"dot active"}),e("span",null,"启用 - 中间件将在请求中执行")]),e("div",{class:"footer-item"},[e("span",{class:"dot"}),e("span",null,"禁用 - 中间件将被跳过")]),e("div",{class:"footer-item"},[e("span",{class:"dot override"}),e("span",null,"已覆盖 - 与全局配置不同")])],-1))],512),[[be,D.value==="middlewares"]]),o(" 插件配置 "),ye(e("div",Mt,[d[23]||(d[23]=e("div",{class:"section-header"},[e("h4",null,"插件配置覆盖"),e("p",null,"为此渠道单独配置插件参数")],-1)),e("div",Et,[a(B,{name:"info-circle"}),d[20]||(d[20]=e("span",null,"留空使用全局配置,填写后将覆盖全局设置",-1))]),q.value.length>0?(t(),s("div",qt,[(t(true),s(S,null,K(q.value,F=>(t(),s("div",{key:F.id,class:Z(["plugin-override-card",{expanded:f.value.has(F.id)}])},[e("div",{class:"plugin-header",onClick:X=>V(F.id)},[e("div",Rt,[e("span",Bt,u(F.name),1),O(F.id)?(t(),s("span",Ht,"已覆盖")):o("v-if",true)]),e("div",Gt,[O(F.id)?(t(),ee(L,{key:0,size:"mini",onClick:de(X=>_(F.id),["stop"])},{default:I(()=>[...d[21]||(d[21]=[R(" 清除 ",-1)])]),_:1},8,["onClick"])):o("v-if",true),a(B,{name:f.value.has(F.id)?"chevron-up":"chevron-down"},null,8,["name"])])],8,Nt),ye(e("div",Jt,[(t(true),s(S,null,K(F.configFields,X=>(t(),s(S,{key:X.key},[l(F,X)?(t(),s("div",jt,[e("label",Wt,u(X.label),1),e("div",Kt,[o(" Boolean 类型 "),X.type==="boolean"?(t(),ee(me,{key:0,"model-value":P(F.id,X.key),"onUpdate:modelValue":Y=>$(F.id,X.key,Y),placeholder:"使用全局配置",clearable:""},{default:I(()=>[a(ce,{label:"是",value:true}),a(ce,{label:"否",value:false})]),_:1},8,["model-value","onUpdate:modelValue"])):X.type==="select"?(t(),s(S,{key:1},[o(" Select 类型 "),a(me,{"model-value":P(F.id,X.key),"onUpdate:modelValue":Y=>$(F.id,X.key,Y),placeholder:`全局: ${F.config[X.key]??"未设置"}`,clearable:""},{default:I(()=>[(t(true),s(S,null,K(X.options,Y=>(t(),ee(ce,{key:String(Y.value),label:Y.label,value:Y.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder"])],64)):X.type==="number"?(t(),s(S,{key:2},[o(" Number 类型 "),a(ue,{"model-value":P(F.id,X.key),"onUpdate:modelValue":Y=>$(F.id,X.key,Y),placeholder:`全局: ${F.config[X.key]??""}`},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(t(),s(S,{key:3},[o(" Text/String 类型 (默认) "),a(le,{"model-value":P(F.id,X.key),"onUpdate:modelValue":Y=>$(F.id,X.key,Y),placeholder:`全局: ${F.config[X.key]??"未设置"}`,clearable:""},null,8,["model-value","onUpdate:modelValue","placeholder"])],64))]),X.description?(t(),s("div",Qt,u(X.description),1)):o("v-if",true)])):o("v-if",true)],64))),128))],512),[[be,f.value.has(F.id)]])],2))),128))])):(t(),s("div",Xt,[a(B,{name:"apps"}),d[22]||(d[22]=e("span",null,"暂无可配置的插件",-1))]))],512),[[be,D.value==="plugins"]])])])]),_:1},8,["modelValue","title"])}}}),el=oe(Zt,[["__scopeId","data-v-74bfe0c7"]]),tl={key:0},ll=ne({__name:"LoadingState",props:{text:{default:"加载中..."},icon:{default:"sync"},size:{default:"default"}},setup(i){const C=i,p=ae(()=>`size-${C.size}`);return(x,c)=>{const b=E("k-icon");return t(),s("div",{class:Z(["loading-state",p.value])},[a(b,{name:i.icon,class:"loading-icon"},null,8,["name"]),i.text?(t(),s("span",tl,u(i.text),1)):o("v-if",true)],2)}}}),sl=oe(ll,[["__scopeId","data-v-99cf565d"]]),al={class:"ml-view-container"},nl={class:"ml-view-header"},ol={class:"ml-header-left"},il={class:"ml-header-right"},dl={class:"ml-view-content"},rl={class:"ml-grid"},cl=["onClick"],ul={class:"card-header"},vl={class:"header-main"},ml={class:"channel-name"},pl={class:"header-meta"},gl={class:"connector-badge"},fl={key:0,class:"cost-badge"},_l={class:"card-body"},hl={key:0,class:"field-list"},yl={class:"field-label"},bl={class:"field-value"},kl={key:1,class:"tags-list"},$l={class:"ml-table-container"},wl={class:"ml-table"},Vl=["onClick"],Cl={class:"col-name"},xl={class:"name-text"},Il={class:"col-connector"},Ul={class:"connector-badge"},Sl={class:"col-tags"},Ol={class:"tags-wrapper"},Tl={key:0,class:"mini-tag more"},Dl={class:"col-cost"},zl={key:0,class:"cost-value"},Fl={class:"action-btns"},Pl=ne({__name:"ChannelsView",setup(i){const C=["text2img","img2img","NSFW"],p=h(false),x=h("card"),c=h([]),b=h([]),D=h([]),T=h({}),f=h(false),m=h(null),y=h([]),H=ae(()=>{const P=new Set;return c.value.forEach($=>{($.tags||[]).forEach(O=>P.add(O))}),Array.from(P).sort()}),z=ae(()=>y.value.length===0?c.value:c.value.filter(P=>y.value.every($=>(P.tags||[]).includes($)))),r=P=>{const $=b.value.find(O=>O.id===P);return $?$.name:P},k=P=>{var O;const $=b.value.find(_=>_.id===P.connectorId);return(O=$==null?void 0:$.cardFields)!=null&&O.length?$.cardFields.map(_=>{const V=$.fields.find(l=>l.key===_.key);return{key:_.key,label:_.label||(V==null?void 0:V.label)||_.key,format:_.format||"text"}}):[]},v=(P,$)=>{var _,V,l,n,U;const O=$.configGroup;switch($.source){case"channel":if(O){const j=(V=(_=P.pluginOverrides)==null?void 0:_[O])==null?void 0:V[$.key];if(j!==void 0)return j}return P[$.key];case"connectorConfig":return(l=P.connectorConfig)==null?void 0:l[$.key];case"pluginOverride":return O?(U=(n=P.pluginOverrides)==null?void 0:n[O])==null?void 0:U[$.key]:void 0;default:return}},M=(P,$)=>{var l,n,U;const O=$.configGroup;if(!O)return $.suffix||"";const _=(n=(l=P.pluginOverrides)==null?void 0:l[O])==null?void 0:n.currencyLabel;if(_)return` ${_}${$.suffix||""}`;const V=(U=T.value[O])==null?void 0:U.currencyLabel;return V?` ${V}${$.suffix||""}`:` 积分${$.suffix||""}`},G=(P,$,O)=>{if(P==null||P==="")return"-";let _;switch($){case"password-mask":_="••••••";break;case"boolean":_=P?"是":"否";break;case"number":_=String(P);break;case"size":_=String(P);break;case"currency":_=P===0?"免费":String(P);break;default:_=String(P)}return O?`${_} ${O}`:_},Q=async()=>{p.value=true;try{const[P,$,O]=await Promise.all([fe.list(),ke.list(),$e.cardFields()]);c.value=P,b.value=$,D.value=O.fields,T.value=O.globalConfigs}catch{J.error("加载数据失败")}finally{p.value=false}},N=()=>{m.value=null,f.value=true},q=P=>{m.value=P,f.value=true},g=()=>{Q()},W=async P=>{if(confirm(`确定要删除渠道 "${P.name}" 吗?`))try{await fe.delete(P.id),J.success("删除成功"),Q()}catch{J.error("删除失败")}},se=async P=>{try{await fe.toggle(P.id,P.enabled)}catch{P.enabled=!P.enabled,J.error("操作失败")}},re=P=>{const $=JSON.parse(JSON.stringify(P));delete $.id,$.name=`${P.name} (副本)`,m.value=$,f.value=true};return ve(()=>{Q()}),(P,$)=>{const O=E("k-icon"),_=E("k-button"),V=E("el-switch");return t(),s("div",al,[e("div",nl,[e("div",ol,[a(_,{solid:"",type:"primary",onClick:N},{icon:I(()=>[a(O,{name:"add"})]),default:I(()=>[$[7]||($[7]=R(" 新建渠道 ",-1))]),_:1}),a(Pe,{modelValue:y.value,"onUpdate:modelValue":$[0]||($[0]=l=>y.value=l),"all-tags":H.value,"preset-tags":C},null,8,["modelValue","all-tags"])]),e("div",il,[a(Le,{modelValue:x.value,"onUpdate:modelValue":$[1]||($[1]=l=>x.value=l)},null,8,["modelValue"])])]),e("div",dl,[p.value?(t(),ee(sl,{key:0})):x.value==="card"?(t(),s(S,{key:1},[o(" 卡片视图 "),e("div",rl,[(t(true),s(S,null,K(z.value,l=>(t(),s("div",{key:l.id},[e("div",{class:"ml-card ml-card--clickable",onClick:n=>q(l)},[e("div",ul,[e("div",vl,[e("div",ml,u(l.name),1),a(V,{modelValue:l.enabled,"onUpdate:modelValue":n=>l.enabled=n,size:"small",onChange:n=>se(l),onClick:$[2]||($[2]=de(()=>{},["stop"]))},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("div",pl,[e("span",gl,[a(O,{name:"link"}),R(" "+u(r(l.connectorId)),1)]),o(" 中间件字段(如费用)显示在标题旁 "),(t(true),s(S,null,K(D.value,n=>(t(),s(S,{key:`mw-${n.key}`},[n.key==="cost"?(t(),s("span",fl,u(G(v(l,n),n.format,M(l,n))),1)):o("v-if",true)],64))),128))])]),e("div",_l,[o(" 配置字段列表 "),k(l).length?(t(),s("div",hl,[(t(true),s(S,null,K(k(l),n=>(t(),s("div",{key:n.key,class:"field-item"},[e("span",yl,u(n.label),1),e("span",bl,u(G(l.connectorConfig[n.key],n.format)),1)]))),128))])):o("v-if",true),o(" 标签 "),l.tags&&l.tags.length?(t(),s("div",kl,[(t(true),s(S,null,K(l.tags,n=>(t(),s("span",{key:n,class:"tag-pill"},u(n),1))),128))])):o("v-if",true)]),e("div",{class:"card-footer",onClick:$[3]||($[3]=de(()=>{},["stop"]))},[a(_,{size:"mini",class:"ml-btn-outline-primary",onClick:n=>re(l)},{icon:I(()=>[a(O,{name:"copy"})]),default:I(()=>[$[8]||($[8]=R(" 复制 ",-1))]),_:1},8,["onClick"]),$[10]||($[10]=e("div",{class:"spacer"},null,-1)),a(_,{size:"mini",class:"ml-btn-outline-danger",onClick:n=>W(l)},{icon:I(()=>[a(O,{name:"delete"})]),default:I(()=>[$[9]||($[9]=R(" 删除 ",-1))]),_:1},8,["onClick"])])],8,cl)]))),128))])],2112)):(t(),s(S,{key:2},[o(" 列表视图 "),e("div",$l,[e("table",wl,[$[13]||($[13]=e("thead",null,[e("tr",null,[e("th",{class:"col-name"},"名称"),e("th",{class:"col-connector"},"连接器"),e("th",{class:"col-tags"},"标签"),e("th",{class:"col-cost"},"费用"),e("th",{class:"col-status"},"状态"),e("th",{class:"col-actions"},"操作")])],-1)),e("tbody",null,[(t(true),s(S,null,K(z.value,l=>(t(),s("tr",{key:l.id,onClick:n=>q(l)},[e("td",Cl,[e("span",xl,u(l.name),1)]),e("td",Il,[e("span",Ul,u(r(l.connectorId)),1)]),e("td",Sl,[e("div",Ol,[(t(true),s(S,null,K((l.tags||[]).slice(0,2),n=>(t(),s("span",{key:n,class:"mini-tag"},u(n),1))),128)),l.tags&&l.tags.length>2?(t(),s("span",Tl,"+"+u(l.tags.length-2),1)):o("v-if",true)])]),e("td",Dl,[(t(true),s(S,null,K(D.value,n=>(t(),s(S,{key:`mw-${n.key}`},[n.key==="cost"?(t(),s("span",zl,u(G(v(l,n),n.format,M(l,n))),1)):o("v-if",true)],64))),128))]),e("td",{class:"col-status",onClick:$[4]||($[4]=de(()=>{},["stop"]))},[a(V,{modelValue:l.enabled,"onUpdate:modelValue":n=>l.enabled=n,size:"small",onChange:n=>se(l)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:$[5]||($[5]=de(()=>{},["stop"]))},[e("div",Fl,[a(_,{size:"mini",class:"ml-btn-outline-primary",onClick:n=>re(l)},{icon:I(()=>[a(O,{name:"copy"})]),default:I(()=>[$[11]||($[11]=R(" 复制 ",-1))]),_:1},8,["onClick"]),a(_,{size:"mini",class:"ml-btn-outline-danger",onClick:n=>W(l)},{icon:I(()=>[a(O,{name:"delete"})]),default:I(()=>[$[12]||($[12]=R(" 删除 ",-1))]),_:1},8,["onClick"])])])],8,Vl))),128))])])])],2112))]),o(" 编辑/创建对话框 "),a(el,{modelValue:f.value,"onUpdate:modelValue":$[6]||($[6]=l=>f.value=l),channel:m.value,onSaved:g},null,8,["modelValue","channel"])])}}}),Ll=oe(Pl,[["__scopeId","data-v-67a4b49d"]]),Al={class:"json-editor"},Ml={key:0,class:"error-msg"},El=ne({__name:"JsonEditor",props:{modelValue:{},rows:{}},emits:["update:modelValue"],setup(i,{emit:C}){const p=i,x=C,c=h(""),b=h("");pe(()=>p.modelValue,T=>{try{c.value=JSON.stringify(T,null,2)}catch{c.value=""}},{immediate:true});const D=()=>{try{const T=JSON.parse(c.value);b.value="",x("update:modelValue",T)}catch{b.value="Invalid JSON format"}};return(T,f)=>{const m=E("el-input");return t(),s("div",Al,[a(m,{modelValue:c.value,"onUpdate:modelValue":f[0]||(f[0]=y=>c.value=y),type:"textarea",rows:i.rows,class:"code-input",onBlur:D},null,8,["modelValue","rows"]),b.value?(t(),s("div",Ml,u(b.value),1)):o("v-if",true)])}}}),ql=oe(El,[["__scopeId","data-v-4d47b7db"]]),Nl={class:"image-upload"},Rl={key:0,class:"image-list"},Bl={class:"image-preview"},Hl=["src","alt"],Gl={class:"image-overlay"},Jl={class:"image-name"},jl={class:"upload-content"},Wl={key:1,class:"upload-loading"},Kl=ne({__name:"ImageUpload",props:{modelValue:{},maxCount:{}},emits:["update:modelValue"],setup(i,{emit:C}){const p=i,x=C,c=h(),b=h(false),D=h([]),T=async()=>{var v;const k=[];for(const M of p.modelValue)M&&k.push({url:M,filename:((v=M.split("/").pop())==null?void 0:v.split("?")[0])||"image",mime:"image/png",previewUrl:M});D.value=k};pe(()=>p.modelValue,()=>{T()},{immediate:true});const f=()=>{var k;(k=c.value)==null||k.click()},m=async k=>{const v=k.target;!v.files||v.files.length===0||(await H(Array.from(v.files)),v.value="")},y=async k=>{var M;const v=(M=k.dataTransfer)==null?void 0:M.files;!v||v.length===0||await H(Array.from(v).filter(G=>G.type.startsWith("image/")))},H=async k=>{if(k.length===0)return;const v=p.maxCount||10;D.value.length+k.length>v&&(J.warning(`最多上传 ${v} 张图片`),k=k.slice(0,v-D.value.length)),b.value=true;try{for(const M of k){const G=await z(M),Q=await We.upload(G,M.type,M.name);if(!Q.url){J.error("缓存服务未配置 selfUrl,无法获取图片 URL");continue}D.value.push({url:Q.url,filename:Q.filename,mime:Q.mime,previewUrl:Q.url})}x("update:modelValue",D.value.map(M=>M.url))}catch(M){J.error("上传失败"),console.error(M)}finally{b.value=false}},z=k=>new Promise((v,M)=>{const G=new FileReader;G.onload=()=>{const N=G.result.split(",")[1];v(N)},G.onerror=M,G.readAsDataURL(k)}),r=k=>{D.value.splice(k,1),x("update:modelValue",D.value.map(v=>v.url))};return ve(()=>{T()}),(k,v)=>{const M=E("k-icon"),G=E("k-button");return t(),s("div",Nl,[o(" 已上传的图片列表 "),D.value.length>0?(t(),s("div",Rl,[(t(true),s(S,null,K(D.value,(Q,N)=>(t(),s("div",{key:Q.url||N,class:"image-item"},[e("div",Bl,[e("img",{src:Q.previewUrl,alt:Q.filename},null,8,Hl),e("div",Gl,[a(G,{size:"mini",class:"remove-btn",onClick:q=>r(N)},{icon:I(()=>[a(M,{name:"delete"})]),_:1},8,["onClick"])])]),e("div",Jl,u(Q.filename),1)]))),128))])):o("v-if",true),o(" 上传按钮 "),e("div",{class:"upload-area",onClick:f,onDragover:v[0]||(v[0]=de(()=>{},["prevent"])),onDrop:de(y,["prevent"])},[e("input",{ref_key:"fileInput",ref:c,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:m},null,544),e("div",jl,[a(M,{name:"add",class:"upload-icon"}),v[1]||(v[1]=e("span",{class:"upload-text"},"点击或拖拽上传图片",-1))])],32),o(" 加载状态 "),b.value?(t(),s("div",Wl,[a(M,{name:"sync",class:"loading-icon"}),v[2]||(v[2]=R(" 上传中... ",-1))])):o("v-if",true)])}}}),Te=oe(Kl,[["__scopeId","data-v-47f2485e"]]),Ql={class:"ml-view-container"},Xl={class:"ml-view-header"},Yl={class:"ml-header-left"},Zl={class:"ml-header-right"},es={class:"ml-view-content"},ts={key:0,class:"loading-state"},ls={class:"ml-masonry"},ss=["onClick"],as={key:0,class:"card-thumbnail"},ns=["src","alt"],os={class:"thumbnail-overlay"},is={key:0,class:"ref-count"},ds={key:1,class:"card-thumbnail placeholder"},rs={class:"card-content"},cs={class:"card-title"},us={key:0,class:"card-tags"},vs={key:0,class:"mini-tag more"},ms={class:"ml-table-container"},ps={class:"ml-table"},gs=["onClick"],fs={class:"col-thumb"},_s={class:"thumb-wrapper"},hs=["src","alt"],ys={key:1,class:"thumb-placeholder"},bs={class:"col-name"},ks={class:"name-text"},$s={class:"col-template"},ws={class:"template-preview"},Vs={class:"col-refs"},Cs={key:0,class:"ref-badge"},xs={key:1,class:"no-data"},Is={class:"col-source"},Us={class:"action-btns"},Ss={class:"dialog-footer"},Os=ne({__name:"PresetsView",setup(i){const C=["本地","远程","text2img","img2img","NSFW"],p=h(false),x=h([]),c=h(false),b=h(false),D=h([]),T=h("card"),f=ae(()=>{const q=new Set;return x.value.forEach(g=>{(g.tags||[]).forEach(W=>q.add(W))}),Array.from(q).sort()}),m=h({name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"}),y=h([]);pe(()=>m.value.thumbnail,q=>{y.value=q?[q]:[]},{immediate:true}),pe(y,q=>{m.value.thumbnail=q.length>0?q[0]:""});const H=ae(()=>D.value.length===0?x.value:x.value.filter(q=>D.value.every(g=>g==="本地"?q.source==="user":g==="远程"?q.source==="api":(q.tags||[]).includes(g)))),z=async()=>{p.value=true;try{x.value=await ge.list()}catch{J.error("加载数据失败")}finally{p.value=false}},r=()=>{b.value=false,m.value={name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"},c.value=true},k=q=>{b.value=true,m.value=JSON.parse(JSON.stringify(q)),c.value=true},v=q=>{b.value=false;const g=JSON.parse(JSON.stringify(q));delete g.id,g.name=`${q.name} (副本)`,g.source="user",m.value=g,c.value=true},M=async q=>{try{await ge.toggle(q.id,q.enabled)}catch{q.enabled=!q.enabled,J.error("操作失败")}},G=(q,g=50)=>{if(!q)return"-";const W=q.replace(/\s+/g," ").trim();return W.length<=g?W:W.slice(0,g)+"..."},Q=async()=>{if(!m.value.name||!m.value.promptTemplate){J.warning("请填写必要信息");return}try{b.value&&m.value.id?(await ge.update(m.value.id,m.value),J.success("更新成功")):(await ge.create(m.value),J.success("创建成功")),c.value=false,z()}catch{J.error("操作失败")}},N=async q=>{if(confirm(`确定要删除预设 "${q.name}" 吗?`))try{await ge.delete(q.id),J.success("删除成功"),z()}catch{J.error("删除失败")}};return ve(()=>{z()}),(q,g)=>{const W=E("k-icon"),se=E("k-button"),re=E("el-switch"),P=E("el-input"),$=E("el-form-item"),O=E("el-divider"),_=E("el-form"),V=E("el-dialog");return t(),s("div",Ql,[e("div",Xl,[e("div",Yl,[a(se,{solid:"",type:"primary",onClick:r},{icon:I(()=>[a(W,{name:"add"})]),default:I(()=>[g[14]||(g[14]=R(" 新建预设 ",-1))]),_:1}),a(Pe,{modelValue:D.value,"onUpdate:modelValue":g[0]||(g[0]=l=>D.value=l),"all-tags":f.value,"preset-tags":C},null,8,["modelValue","all-tags"])]),e("div",Zl,[a(Le,{modelValue:T.value,"onUpdate:modelValue":g[1]||(g[1]=l=>T.value=l)},null,8,["modelValue"])])]),e("div",es,[p.value?(t(),s("div",ts,[a(W,{name:"sync",class:"ml-spin"}),g[15]||(g[15]=R(" 加载中... ",-1))])):T.value==="card"?(t(),s(S,{key:1},[o(" 卡片视图 (瀑布流) "),e("div",ls,[(t(true),s(S,null,K(H.value,l=>{var n,U;return t(),s("div",{key:l.id,class:"ml-masonry-item"},[e("div",{class:"preset-card",onClick:j=>k(l)},[o(" 缩略图 "),l.thumbnail?(t(),s("div",as,[e("img",{src:l.thumbnail,alt:l.name,loading:"lazy"},null,8,ns),e("div",os,[(n=l.referenceImages)!=null&&n.length?(t(),s("span",is,[a(W,{name:"image"}),R(" "+u(l.referenceImages.length),1)])):o("v-if",true)])])):(t(),s("div",ds,[a(W,{name:"image",class:"placeholder-icon"})])),o(" 内容 "),e("div",rs,[e("div",cs,u(l.name),1),(U=l.tags)!=null&&U.length?(t(),s("div",us,[(t(true),s(S,null,K(l.tags.slice(0,4),j=>(t(),s("span",{key:j,class:"mini-tag"},u(j),1))),128)),l.tags.length>4?(t(),s("span",vs,"+"+u(l.tags.length-4),1)):o("v-if",true)])):o("v-if",true)]),o(" 操作按钮 "),e("div",{class:"card-actions",onClick:g[2]||(g[2]=de(()=>{},["stop"]))},[a(re,{modelValue:l.enabled,"onUpdate:modelValue":j=>l.enabled=j,size:"small",onChange:j=>M(l)},null,8,["modelValue","onUpdate:modelValue","onChange"]),a(se,{size:"mini",class:"ml-btn-outline-primary",onClick:j=>v(l)},{icon:I(()=>[a(W,{name:"copy"})]),default:I(()=>[g[16]||(g[16]=R(" 复制 ",-1))]),_:1},8,["onClick"]),l.source==="user"?(t(),ee(se,{key:0,size:"mini",class:"ml-btn-outline-danger",onClick:j=>N(l)},{icon:I(()=>[a(W,{name:"delete"})]),default:I(()=>[g[17]||(g[17]=R(" 删除 ",-1))]),_:1},8,["onClick"])):o("v-if",true)]),o(" 来源标记 "),e("div",{class:Z(["source-indicator",l.source])},u(l.source==="api"?"远程":"本地"),3)],8,ss)])}),128))])],2112)):(t(),s(S,{key:2},[o(" 列表视图 "),e("div",ms,[e("table",ps,[g[20]||(g[20]=e("thead",null,[e("tr",null,[e("th",{class:"col-thumb"},"缩略图"),e("th",{class:"col-name"},"名称"),e("th",{class:"col-template"},"Prompt 模板"),e("th",{class:"col-refs"},"参考图"),e("th",{class:"col-source"},"来源"),e("th",{class:"col-status"},"状态"),e("th",{class:"col-actions"},"操作")])],-1)),e("tbody",null,[(t(true),s(S,null,K(H.value,l=>{var n;return t(),s("tr",{key:l.id,onClick:U=>k(l)},[e("td",fs,[e("div",_s,[l.thumbnail?(t(),s("img",{key:0,src:l.thumbnail,alt:l.name},null,8,hs)):(t(),s("div",ys,[a(W,{name:"image"})]))])]),e("td",bs,[e("span",ks,u(l.name),1)]),e("td",$s,[e("span",ws,u(G(l.promptTemplate)),1)]),e("td",Vs,[(n=l.referenceImages)!=null&&n.length?(t(),s("span",Cs,[a(W,{name:"image"}),R(" "+u(l.referenceImages.length),1)])):(t(),s("span",xs,"-"))]),e("td",Is,[e("span",{class:Z(["source-badge",l.source])},u(l.source==="api"?"远程":"本地"),3)]),e("td",{class:"col-status",onClick:g[3]||(g[3]=de(()=>{},["stop"]))},[a(re,{modelValue:l.enabled,"onUpdate:modelValue":U=>l.enabled=U,size:"small",onChange:U=>M(l)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:g[4]||(g[4]=de(()=>{},["stop"]))},[e("div",Us,[a(se,{size:"mini",class:"ml-btn-outline-primary",onClick:U=>v(l)},{icon:I(()=>[a(W,{name:"copy"})]),default:I(()=>[g[18]||(g[18]=R(" 复制 ",-1))]),_:1},8,["onClick"]),l.source==="user"?(t(),ee(se,{key:0,size:"mini",class:"ml-btn-outline-danger",onClick:U=>N(l)},{icon:I(()=>[a(W,{name:"delete"})]),default:I(()=>[g[19]||(g[19]=R(" 删除 ",-1))]),_:1},8,["onClick"])):o("v-if",true)])])],8,gs)}),128))])])])],2112))]),o(" 编辑/创建对话框 "),a(V,{modelValue:c.value,"onUpdate:modelValue":g[13]||(g[13]=l=>c.value=l),title:b.value?"编辑预设":"创建预设",width:"600px","close-on-click-modal":false},{footer:I(()=>[e("span",Ss,[a(se,{onClick:g[12]||(g[12]=l=>c.value=false)},{default:I(()=>[...g[27]||(g[27]=[R("取消",-1)])]),_:1}),a(se,{type:"primary",onClick:Q},{default:I(()=>[...g[28]||(g[28]=[R("保存",-1)])]),_:1})])]),default:I(()=>[c.value?(t(),ee(_,{key:0,ref:"formRef",model:m.value,"label-width":"100px"},{default:I(()=>[a($,{label:"名称",required:""},{default:I(()=>[a(P,{modelValue:m.value.name,"onUpdate:modelValue":g[5]||(g[5]=l=>m.value.name=l),disabled:b.value&&m.value.source==="api",placeholder:"如 二次元少女"},null,8,["modelValue","disabled"]),g[21]||(g[21]=e("div",{class:"form-tip"},"用于指令调用和展示,冲突时会自动添加后缀",-1))]),_:1}),a($,{label:"Prompt 模板",required:""},{default:I(()=>[a(P,{modelValue:m.value.promptTemplate,"onUpdate:modelValue":g[6]||(g[6]=l=>m.value.promptTemplate=l),type:"textarea",rows:4,placeholder:"输入提示词模板,支持变量如 {prompt}"},null,8,["modelValue"]),g[22]||(g[22]=e("div",{class:"form-tip"},"默认将用户输入附加在最后,也可使用 {prompt} 指定位置",-1))]),_:1}),m.value.source==="user"?(t(),ee($,{key:0,label:"缩略图"},{default:I(()=>[a(Te,{modelValue:y.value,"onUpdate:modelValue":g[7]||(g[7]=l=>y.value=l),"max-count":1},null,8,["modelValue"]),g[23]||(g[23]=e("div",{class:"form-tip"},"用于在卡片视图中展示预设的预览图",-1))]),_:1})):o("v-if",true),a($,{label:"参考图"},{default:I(()=>[a(Te,{modelValue:m.value.referenceImages,"onUpdate:modelValue":g[8]||(g[8]=l=>m.value.referenceImages=l),"max-count":5},null,8,["modelValue"]),g[24]||(g[24]=e("div",{class:"form-tip"},"生成时会自动附加这些参考图片",-1))]),_:1}),a(O,{"content-position":"left"},{default:I(()=>[...g[25]||(g[25]=[R("高级设置",-1)])]),_:1}),a($,{label:"标签"},{default:I(()=>[a(Ae,{modelValue:m.value.tags,"onUpdate:modelValue":g[9]||(g[9]=l=>m.value.tags=l),placeholder:"输入标签..."},null,8,["modelValue"]),g[26]||(g[26]=e("div",{class:"form-tip"},"与渠道标签匹配时会自动关联",-1))]),_:1}),a($,{label:"参数覆盖"},{default:I(()=>[a(ql,{modelValue:m.value.parameterOverrides,"onUpdate:modelValue":g[10]||(g[10]=l=>m.value.parameterOverrides=l),rows:3},null,8,["modelValue"])]),_:1}),a($,{label:"启用状态"},{default:I(()=>[a(re,{modelValue:m.value.enabled,"onUpdate:modelValue":g[11]||(g[11]=l=>m.value.enabled=l)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])):o("v-if",true)]),_:1},8,["modelValue","title"])])}}}),Ts=oe(Os,[["__scopeId","data-v-8eaa50b4"]]),Ds=ne({__name:"StatusBadge",props:{status:{}},setup(i){const C=i,p=ae(()=>{switch(C.status){case"pending":return"等待中";case"processing":return"处理中";case"success":return"成功";case"failed":return"失败";default:return C.status}});return(x,c)=>(t(),s("span",{class:Z(["status-badge",i.status])},u(p.value),3))}}),De=oe(Ds,[["__scopeId","data-v-0bc21896"]]),zs={class:"lightbox-container"},Fs={class:"lightbox-content"},Ps=["src"],Ls={key:2,class:"image-counter"},As={key:0,class:"lightbox-sidebar"},Ms={class:"sidebar-header"},Es={class:"sidebar-body"},qs={class:"info-block"},Ns={class:"block-header"},Rs={key:0,class:"info-block"},Bs={class:"info-value"},Hs={key:1,class:"info-block"},Gs={class:"info-value"},Js={class:"sidebar-footer"},js=ne({__name:"ImageLightbox",props:{visible:{type:Boolean},images:{},initialIndex:{default:0},prompt:{},createdAt:{},duration:{},showSidebar:{type:Boolean,default:true}},emits:["update:visible","close"],setup(i,{emit:C}){const p=i,x=C,c=h(p.initialIndex),b=ae(()=>p.images[c.value]||"");pe(()=>p.visible,v=>{v?(c.value=p.initialIndex,document.body.style.overflow="hidden"):document.body.style.overflow=""}),pe(()=>p.initialIndex,v=>{c.value=v});const D=()=>{x("update:visible",false),x("close")},T=()=>{c.value=(c.value-1+p.images.length)%p.images.length},f=()=>{c.value=(c.value+1)%p.images.length},m=()=>{p.prompt&&(navigator.clipboard.writeText(p.prompt),J.success("已复制提示词"))},y=()=>{window.open(b.value,"_blank")},H=()=>{const v=document.createElement("a");v.href=b.value,v.download=`image-${Date.now()}.png`,v.click()},z=v=>(typeof v=="string"?new Date(v):v).toLocaleString(),r=v=>v<1e3?`${v}ms`:`${(v/1e3).toFixed(1)}s`,k=v=>{p.visible&&(v.key==="Escape"?D():v.key==="ArrowLeft"?T():v.key==="ArrowRight"&&f())};return ve(()=>{window.addEventListener("keydown",k)}),Fe(()=>{window.removeEventListener("keydown",k),document.body.style.overflow=""}),(v,M)=>{const G=E("k-icon");return t(),ee(qe,{to:"body"},[a(Ne,{name:"lightbox-fade"},{default:I(()=>[i.visible?(t(),s("div",{key:0,class:"lightbox-overlay",onClick:de(D,["self"])},[e("div",zs,[e("div",Fs,[o(" 左侧图片区域 "),e("div",{class:"lightbox-image-area",onClick:de(D,["self"])},[o(" 关闭按钮 "),e("button",{class:"close-btn",onClick:D,title:"关闭 (Esc)"},[a(G,{name:"times"})]),o(" 多图时的导航 "),i.images.length>1?(t(),s("button",{key:0,class:"nav-btn prev",onClick:de(T,["stop"]),title:"上一张"},[a(G,{name:"chevron-left"})])):o("v-if",true),e("img",{src:b.value,class:"lightbox-image",alt:"Preview"},null,8,Ps),i.images.length>1?(t(),s("button",{key:1,class:"nav-btn next",onClick:de(f,["stop"]),title:"下一张"},[a(G,{name:"chevron-right"})])):o("v-if",true),o(" 图片计数器 "),i.images.length>1?(t(),s("div",Ls,u(c.value+1)+" / "+u(i.images.length),1)):o("v-if",true)]),o(" 右侧信息栏 "),i.showSidebar?(t(),s("div",As,[e("div",Ms,[M[0]||(M[0]=e("div",{class:"info-title"},"图片详情",-1)),e("button",{class:"header-close-btn",onClick:D,title:"关闭"},[a(G,{name:"times"})])]),e("div",Es,[o(" 提示词 "),e("div",qs,[e("div",Ns,[M[1]||(M[1]=e("span",null,"提示词",-1)),i.prompt?(t(),s("button",{key:0,class:"copy-btn",onClick:m}," 复制 ")):o("v-if",true)]),e("div",{class:Z(["prompt-content",{empty:!i.prompt}])},u(i.prompt||"无提示词"),3)]),o(" 创建时间 "),i.createdAt?(t(),s("div",Rs,[M[2]||(M[2]=e("div",{class:"block-header"},[e("span",null,"创建时间")],-1)),e("div",Bs,u(z(i.createdAt)),1)])):o("v-if",true),o(" 生成耗时 "),i.duration?(t(),s("div",Hs,[M[3]||(M[3]=e("div",{class:"block-header"},[e("span",null,"生成耗时")],-1)),e("div",Gs,u(r(i.duration)),1)])):o("v-if",true)]),e("div",Js,[e("button",{class:"action-btn primary",onClick:y},[a(G,{name:"external-link"}),M[4]||(M[4]=R(" 查看原图 ",-1))]),e("button",{class:"action-btn secondary",onClick:H},[a(G,{name:"download"}),M[5]||(M[5]=R(" 下载 ",-1))])])])):o("v-if",true)])])])):o("v-if",true)]),_:1})])}}}),Ie=oe(js,[["__scopeId","data-v-bd68872f"]]),Ws={class:"ml-view-container"},Ks={class:"ml-view-header"},Qs={class:"ml-header-left"},Xs={class:"view-mode-switch"},Ys={class:"ml-header-right"},Zs={key:0,class:"stats-grid"},ea={class:"stat-card"},ta={class:"stat-icon total"},la={class:"stat-content"},sa={class:"stat-value"},aa={class:"stat-card"},na={class:"stat-icon success"},oa={class:"stat-content"},ia={class:"stat-value success"},da={class:"stat-card"},ra={class:"stat-icon failed"},ca={class:"stat-content"},ua={class:"stat-value failed"},va={class:"stat-card"},ma={class:"stat-icon processing"},pa={class:"stat-content"},ga={class:"stat-value pending"},fa={class:"stat-card"},_a={class:"stat-icon rate"},ha={class:"stat-content"},ya={class:"stat-value"},ba={class:"filter-bar"},ka={class:"filter-group"},$a={key:0,class:"pagination-info"},wa={class:"ml-view-content"},Va={class:"mono-text"},Ca=["title"],xa={key:0},Ia={key:1,class:"text-muted"},Ua={key:0},Sa={key:1},Oa={class:"time-text"},Ta={key:0,class:"empty-gallery"},Da={key:1,class:"ml-masonry"},za=["onClick"],Fa={class:"gallery-image-wrapper"},Pa=["src"],La=["src"],Aa={class:"gallery-overlay"},Ma={class:"gallery-info"},Ea=["title"],qa={class:"gallery-meta"},Na={class:"gallery-time"},Ra={class:"pagination"},Ba={key:0,class:"task-detail"},Ha={class:"detail-section"},Ga={class:"detail-grid"},Ja={class:"detail-item"},ja={class:"detail-item"},Wa={class:"detail-item"},Ka={class:"detail-item"},Qa={class:"detail-item"},Xa={class:"detail-item"},Ya={class:"detail-section"},Za={class:"code-block"},en={key:0,class:"detail-section"},tn={class:"output-gallery"},ln=["src"],sn=["src"],an=["src"],nn={key:3,class:"text-asset"},on=["href"],dn={key:1,class:"detail-section"},rn={class:"code-block error"},cn={class:"cleanup-form"},un={class:"dialog-footer"},vn=ne({__name:"TasksView",setup(i){const C=h("list"),p=h(false),x=h([]),c=h(null),b=h(0),D=h(1),T=h(20),f=h({status:"",userId:void 0,channelId:void 0}),m=h(false),y=h(null);h(false);const H=h(null),z=h(false),r=h([]),k=h(0),v=h(""),M=h(),G=h(),Q=h(false),N=h(30),q=l=>{var n,U,j;return((U=(n=l.middlewareLogs)==null?void 0:n.preset)==null?void 0:U.transformedPrompt)||((j=l.requestSnapshot)==null?void 0:j.prompt)||""},g=ae(()=>{var n,U,j;const l=[];for(const te of x.value){if(te.status!=="success"||!te.responseSnapshot)continue;const w=((U=(n=te.middlewareLogs)==null?void 0:n.preset)==null?void 0:U.transformedPrompt)||((j=te.requestSnapshot)==null?void 0:j.prompt)||"";te.responseSnapshot.forEach((d,B)=>{(d.kind==="image"||d.kind==="video")&&d.url&&l.push({id:te.id,assetIndex:B,kind:d.kind,url:d.url,prompt:w,channelId:te.channelId,createdAt:te.startTime})})}return l}),W=async()=>{p.value=true;try{const l={limit:T.value,offset:(D.value-1)*T.value};f.value.status&&(l.status=f.value.status),f.value.userId&&(l.userId=Number(f.value.userId)),f.value.channelId&&(l.channelId=Number(f.value.channelId));const[n,U]=await Promise.all([_e.list(l),_e.stats()]);x.value=n.items,b.value=n.total,c.value=U}catch(l){console.error("Failed to fetch tasks:",l),J.error("加载数据失败")}finally{p.value=false}},se=l=>{y.value=l,m.value=true},re=l=>{r.value=[l.url],k.value=0,v.value=l.prompt,M.value=l.createdAt,G.value=void 0,z.value=true,H.value=l},P=()=>{Q.value=true},$=async()=>{try{const l=await _e.cleanup(N.value);J.success(`成功清理 ${l.deleted} 条任务`),Q.value=false,W()}catch{J.error("清理失败")}},O=l=>new Date(l).toLocaleString(),_=l=>l<1e3?`${l}ms`:`${(l/1e3).toFixed(2)}s`,V=l=>{const n=l.target;n.style.display="none"};return ve(()=>{W()}),(l,n)=>{const U=E("k-icon"),j=E("k-button"),te=E("el-option"),w=E("el-select"),d=E("el-input"),B=E("el-table-column"),le=E("el-table"),ce=E("el-pagination"),me=E("el-dialog"),he=E("el-input-number");return t(),s("div",Ws,[o(" 固定头部区域 "),e("div",Ks,[e("div",Qs,[o(" 视图切换 "),e("div",Xs,[e("button",{class:Z(["mode-btn",{active:C.value==="list"}]),onClick:n[0]||(n[0]=L=>C.value="list"),title:"列表视图"},[...n[14]||(n[14]=[e("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},[e("rect",{x:"3",y:"4",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"10.5",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"17",width:"18",height:"3",rx:"1"})],-1)])],2),e("button",{class:Z(["mode-btn",{active:C.value==="gallery"}]),onClick:n[1]||(n[1]=L=>C.value="gallery"),title:"画廊视图"},[...n[15]||(n[15]=[Ce('<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" data-v-898a70bb><rect x="3" y="3" width="8" height="8" rx="1" data-v-898a70bb></rect><rect x="13" y="3" width="8" height="8" rx="1" data-v-898a70bb></rect><rect x="3" y="13" width="8" height="8" rx="1" data-v-898a70bb></rect><rect x="13" y="13" width="8" height="8" rx="1" data-v-898a70bb></rect></svg>',1)])],2)])]),e("div",Ys,[a(j,{onClick:P},{icon:I(()=>[a(U,{name:"delete"})]),default:I(()=>[n[16]||(n[16]=R(" 清理记录 ",-1))]),_:1}),a(j,{onClick:W},{icon:I(()=>[a(U,{name:"refresh"})]),default:I(()=>[n[17]||(n[17]=R(" 刷新 ",-1))]),_:1})])]),o(" 统计信息 (固定) "),c.value?(t(),s("div",Zs,[e("div",ea,[e("div",ta,[a(U,{name:"clipboard-list"})]),e("div",la,[e("div",sa,u(c.value.total),1),n[18]||(n[18]=e("div",{class:"stat-label"},"总任务数",-1))])]),e("div",aa,[e("div",na,[a(U,{name:"check-circle"})]),e("div",oa,[e("div",ia,u(c.value.byStatus.success),1),n[19]||(n[19]=e("div",{class:"stat-label"},"成功",-1))])]),e("div",da,[e("div",ra,[a(U,{name:"exclamation-triangle"})]),e("div",ca,[e("div",ua,u(c.value.byStatus.failed),1),n[20]||(n[20]=e("div",{class:"stat-label"},"失败",-1))])]),e("div",va,[e("div",ma,[a(U,{name:"clock"})]),e("div",pa,[e("div",ga,u(c.value.byStatus.pending+c.value.byStatus.processing),1),n[21]||(n[21]=e("div",{class:"stat-label"},"进行中",-1))])]),e("div",fa,[e("div",_a,[a(U,{name:"chart-pie"})]),e("div",ha,[e("div",ya,u(c.value.successRate),1),n[22]||(n[22]=e("div",{class:"stat-label"},"成功率",-1))])])])):o("v-if",true),o(" 筛选栏 (固定) "),e("div",ba,[e("div",ka,[a(w,{modelValue:f.value.status,"onUpdate:modelValue":n[2]||(n[2]=L=>f.value.status=L),placeholder:"所有状态",clearable:"",onChange:W,style:{width:"140px"}},{default:I(()=>[a(te,{label:"等待中",value:"pending"}),a(te,{label:"处理中",value:"processing"}),a(te,{label:"成功",value:"success"}),a(te,{label:"失败",value:"failed"})]),_:1},8,["modelValue"]),a(d,{modelValue:f.value.channelId,"onUpdate:modelValue":n[3]||(n[3]=L=>f.value.channelId=L),placeholder:"渠道 ID",clearable:"",onChange:W,style:{width:"140px"}},null,8,["modelValue"]),a(d,{modelValue:f.value.userId,"onUpdate:modelValue":n[4]||(n[4]=L=>f.value.userId=L),placeholder:"用户 ID",clearable:"",onChange:W,style:{width:"140px"}},null,8,["modelValue"])]),b.value>0?(t(),s("div",$a," 共 "+u(b.value)+" 条记录 ",1)):o("v-if",true)]),o(" 可滚动的内容区域 "),e("div",wa,[o(" 列表视图 "),C.value==="list"?(t(),ee(le,{key:0,data:x.value,style:{width:"100%"},class:"task-table",onRowClick:se},{default:I(()=>[a(B,{prop:"id",label:"ID",width:"80",align:"center"},{default:I(({row:L})=>[e("span",Va,"#"+u(L.id),1)]),_:1}),a(B,{label:"状态",width:"100",align:"center"},{default:I(({row:L})=>[a(De,{status:L.status},null,8,["status"])]),_:1}),a(B,{prop:"channelId",label:"渠道",width:"100",align:"center"}),a(B,{label:"提示词","min-width":"300"},{default:I(({row:L})=>[e("div",{class:"prompt-cell",title:q(L)},u(q(L)),9,Ca)]),_:1}),a(B,{label:"输出",width:"120",align:"center"},{default:I(({row:L})=>[L.responseSnapshot&&L.responseSnapshot.length?(t(),s("span",xa,u(L.responseSnapshot.length)+" 个资产 ",1)):(t(),s("span",Ia,"-"))]),_:1}),a(B,{label:"耗时",width:"100",align:"right"},{default:I(({row:L})=>[L.duration?(t(),s("span",Ua,u(_(L.duration)),1)):(t(),s("span",Sa,"-"))]),_:1}),a(B,{label:"时间",width:"180",align:"right"},{default:I(({row:L})=>[e("span",Oa,u(O(L.startTime)),1)]),_:1})]),_:1},8,["data"])):C.value==="gallery"?(t(),s(S,{key:1},[o(" 画廊视图 (瀑布流) "),g.value.length===0?(t(),s("div",Ta,[a(U,{name:"image",class:"empty-icon"}),n[23]||(n[23]=e("p",null,"暂无成功生成的图片",-1))])):(t(),s("div",Da,[(t(true),s(S,null,K(g.value,L=>(t(),s("div",{key:L.id+"-"+L.assetIndex,class:"ml-masonry-item"},[e("div",{class:"gallery-item",onClick:ue=>re(L)},[e("div",Fa,[L.kind==="image"?(t(),s("img",{key:0,src:L.url,class:"gallery-image",loading:"lazy",onError:V},null,40,Pa)):L.kind==="video"?(t(),s("video",{key:1,src:L.url,class:"gallery-video",muted:"",loop:"",onMouseenter:n[5]||(n[5]=ue=>ue.target.play()),onMouseleave:n[6]||(n[6]=ue=>ue.target.pause())},null,40,La)):o("v-if",true),e("div",Aa,[a(U,{name:"zoom-in",class:"zoom-icon"})])]),e("div",Ma,[e("div",{class:"gallery-prompt",title:L.prompt},u(L.prompt),9,Ea),e("div",qa,[e("span",Na,u(O(L.createdAt)),1)])])],8,za)]))),128))]))],64)):o("v-if",true)]),o(" 分页 (固定在底部) "),e("div",Ra,[a(ce,{"current-page":D.value,"onUpdate:currentPage":n[7]||(n[7]=L=>D.value=L),"page-size":T.value,"onUpdate:pageSize":n[8]||(n[8]=L=>T.value=L),total:b.value,"page-sizes":[20,50,100],layout:"total, sizes, prev, pager, next",onCurrentChange:W,onSizeChange:W},null,8,["current-page","page-size","total"])]),o(" 任务详情对话框 "),a(me,{modelValue:m.value,"onUpdate:modelValue":n[9]||(n[9]=L=>m.value=L),title:"任务详情",width:"800px"},{default:I(()=>{var L,ue;return[y.value?(t(),s("div",Ba,[e("div",Ha,[n[31]||(n[31]=e("h3",null,"基本信息",-1)),e("div",Ga,[e("div",Ja,[n[24]||(n[24]=e("span",{class:"label"},"ID:",-1)),R(" "+u(y.value.id),1)]),e("div",ja,[n[25]||(n[25]=e("span",{class:"label"},"状态:",-1)),n[26]||(n[26]=R()),a(De,{status:y.value.status},null,8,["status"])]),e("div",Wa,[n[27]||(n[27]=e("span",{class:"label"},"渠道 ID:",-1)),R(" "+u(y.value.channelId),1)]),e("div",Ka,[n[28]||(n[28]=e("span",{class:"label"},"用户 ID:",-1)),R(" "+u(y.value.userId||"N/A"),1)]),e("div",Qa,[n[29]||(n[29]=e("span",{class:"label"},"创建时间:",-1)),R(" "+u(O(y.value.startTime)),1)]),e("div",Xa,[n[30]||(n[30]=e("span",{class:"label"},"耗时:",-1)),R(" "+u(_(y.value.duration||0)),1)])])]),e("div",Ya,[n[32]||(n[32]=e("h3",null,"Prompt",-1)),e("div",Za,u(q(y.value)),1)]),y.value.responseSnapshot&&y.value.responseSnapshot.length>0?(t(),s("div",en,[e("h3",null,"生成结果 ("+u(y.value.responseSnapshot.length)+" 个资产)",1),e("div",tn,[(t(true),s(S,null,K(y.value.responseSnapshot,(ie,F)=>{var X;return t(),s("div",{key:F,class:"output-item"},[ie.kind==="image"&&ie.url?(t(),s("img",{key:0,src:ie.url,class:"output-image"},null,8,ln)):ie.kind==="video"&&ie.url?(t(),s("video",{key:1,src:ie.url,class:"output-image",controls:""},null,8,sn)):ie.kind==="audio"&&ie.url?(t(),s("audio",{key:2,src:ie.url,controls:"",style:{width:"100%"}},null,8,an)):ie.kind==="text"&&ie.content?(t(),s("div",nn,u(ie.content),1)):ie.url?(t(),s("a",{key:4,href:ie.url,target:"_blank",class:"file-link"},[a(U,{name:"file"}),R(" "+u(((X=ie.meta)==null?void 0:X.filename)||ie.url),1)],8,on)):o("v-if",true)])}),128))])])):o("v-if",true),(ue=(L=y.value.middlewareLogs)==null?void 0:L.request)!=null&&ue.error?(t(),s("div",dn,[n[33]||(n[33]=e("h3",null,"错误信息",-1)),e("div",rn,u(y.value.middlewareLogs.request.error),1)])):o("v-if",true)])):o("v-if",true)]}),_:1},8,["modelValue"]),o(" 图片预览弹窗 "),a(Ie,{visible:z.value,"onUpdate:visible":n[10]||(n[10]=L=>z.value=L),images:r.value,"initial-index":k.value,prompt:v.value,"created-at":M.value,duration:G.value},null,8,["visible","images","initial-index","prompt","created-at","duration"]),o(" 清理对话框 "),a(me,{modelValue:Q.value,"onUpdate:modelValue":n[13]||(n[13]=L=>Q.value=L),title:"清理旧任务",width:"400px"},{footer:I(()=>[e("span",un,[a(j,{onClick:n[12]||(n[12]=L=>Q.value=false)},{default:I(()=>[...n[35]||(n[35]=[R("取消",-1)])]),_:1}),a(j,{type:"error",onClick:$},{default:I(()=>[...n[36]||(n[36]=[R("确认清理",-1)])]),_:1})])]),default:I(()=>[e("div",cn,[n[34]||(n[34]=e("p",null,"清理多少天前的任务?",-1)),a(he,{modelValue:N.value,"onUpdate:modelValue":n[11]||(n[11]=L=>N.value=L),min:1,max:365},null,8,["modelValue"])])]),_:1},8,["modelValue"])])}}}),mn=oe(vn,[["__scopeId","data-v-898a70bb"]]),pn={class:"gallery-content"},gn={class:"gallery-header"},fn={class:"header-left"},_n={key:0,class:"gallery-count"},hn={class:"header-actions"},yn={key:0,class:"gallery-empty"},bn={class:"gallery-empty"},kn=["onClick"],$n={key:0,class:"task-image-wrapper"},wn=["src"],Vn={key:0,class:"more-images"},Cn={class:"task-processing"},xn={class:"processing-text"},In={class:"task-failed"},Un={class:"task-info"},Sn=["title"],On={class:"task-meta"},Tn={class:"task-time"},Dn={key:0,class:"task-duration"},zn={key:0,class:"loading-more"},we=10,Fn=ne({__name:"HistoryGallery",emits:["select"],setup(i,{expose:C,emit:p}){const x=p,c=h(false),b=h(false),D=h(false),T=h([]),f=h(0),m=h(false),y=h(0),H=h();let z=null;const r=h(false),k=h([]),v=h(0),M=h(""),G=h(),Q=h(),N=async()=>{try{const V=await Je.me();return D.value=V.loggedIn,V.loggedIn}catch{return D.value=false,false}},q=V=>{var U,j,te;const l=[];if(V.responseSnapshot)for(const w of V.responseSnapshot)w.kind==="image"&&w.url&&l.push(w.url);const n=((j=(U=V.middlewareLogs)==null?void 0:U.preset)==null?void 0:j.transformedPrompt)||((te=V.requestSnapshot)==null?void 0:te.prompt)||"";return{id:V.id,status:V.status,prompt:n,images:l,createdAt:new Date(V.startTime),duration:V.duration||void 0}},g=async(V=false)=>{if(D.value){b.value=true;try{const l=await _e.my({limit:we,offset:V?y.value:0}),n=l.items.map(q);V?T.value=[...T.value,...n]:(T.value=n,y.value=0),f.value=l.total,m.value=l.items.length>=we,y.value+=we}catch(l){console.error("Failed to load tasks:",l)}finally{b.value=false}}},W=()=>{!b.value&&m.value&&g(true)},se=V=>{const l=V.target,{scrollTop:n,scrollHeight:U,clientHeight:j}=l;U-n-j<100&&W()},re=async()=>{await N(),await g()},P=V=>{V.status==="success"&&V.images.length>0&&(k.value=V.images,v.value=0,M.value=V.prompt,G.value=V.createdAt,Q.value=V.duration,r.value=true,x("select",V))},$=V=>{const n=new Date().getTime()-V.getTime();return n<6e4?"刚刚":n<36e5?`${Math.floor(n/6e4)}分钟前`:n<864e5?`${Math.floor(n/36e5)}小时前`:n<6048e5?`${Math.floor(n/864e5)}天前`:V.toLocaleDateString()},O=V=>V<1e3?`${V}ms`:`${(V/1e3).toFixed(1)}s`,_=()=>{z=setInterval(()=>{T.value.some(l=>l.status==="pending"||l.status==="processing")&&g()},3e3)};return C({refresh:re}),ve(async()=>{await N()&&(await g(),_())}),Fe(()=>{z&&clearInterval(z)}),(V,l)=>{const n=E("k-icon");return t(),s("div",{class:Z(["history-gallery",{collapsed:c.value}])},[o(" 折叠状态的侧边条 "),c.value?(t(),s("div",{key:0,class:"collapsed-bar",onClick:l[0]||(l[0]=U=>c.value=false)},[a(n,{name:"history"}),l[3]||(l[3]=e("span",{class:"collapsed-text"},"历史",-1))])):(t(),s(S,{key:1},[o(" 展开的内容 "),e("div",pn,[e("div",gn,[e("div",fn,[l[4]||(l[4]=e("span",{class:"gallery-title"},"历史记录",-1)),f.value>0?(t(),s("span",_n,u(f.value),1)):o("v-if",true)]),e("div",hn,[a(n,{name:"refresh",class:Z(["action-icon",{spinning:b.value}]),onClick:re,title:"刷新"},null,8,["class"]),a(n,{name:"chevron-right",class:"action-icon",onClick:l[1]||(l[1]=U=>c.value=true),title:"收起"})])]),o(" 未登录提示 "),D.value?b.value&&T.value.length===0?(t(),s(S,{key:1},[o(" 加载中 "),l[6]||(l[6]=e("div",{class:"gallery-loading"},[e("div",{class:"loader-small"})],-1))],2112)):T.value.length===0?(t(),s(S,{key:2},[o(" 空状态 "),e("div",bn,[a(n,{name:"image",class:"empty-icon"}),l[7]||(l[7]=e("p",null,"暂无记录",-1))])],2112)):(t(),s(S,{key:3},[o(" 任务列表 (瀑布流) "),e("div",{class:"gallery-list",ref_key:"listRef",ref:H,onScroll:se},[(t(true),s(S,null,K(T.value,U=>(t(),s("div",{key:U.id,class:Z(["task-card",{clickable:U.status==="success"}]),onClick:j=>P(U)},[o(" 图片区域 - 只显示第一张 "),U.images&&U.images.length>0?(t(),s("div",$n,[e("img",{src:U.images[0],class:"task-image",loading:"lazy"},null,8,wn),U.images.length>1?(t(),s("div",Vn," +"+u(U.images.length-1),1)):o("v-if",true)])):U.status==="processing"||U.status==="pending"?(t(),s(S,{key:1},[o(" 处理中动画 "),e("div",Cn,[l[8]||(l[8]=e("div",{class:"processing-animation"},[e("div",{class:"dot"}),e("div",{class:"dot"}),e("div",{class:"dot"})],-1)),e("span",xn,u(U.status==="pending"?"等待中":"生成中"),1)])],2112)):U.status==="failed"?(t(),s(S,{key:2},[o(" 失败状态 "),e("div",In,[a(n,{name:"exclamation-triangle",class:"failed-icon"}),l[9]||(l[9]=e("span",null,"失败",-1))])],2112)):o("v-if",true),o(" 任务信息 "),e("div",Un,[e("div",{class:"task-prompt",title:U.prompt},u(U.prompt||"(无提示词)"),9,Sn),e("div",On,[e("span",Tn,u($(U.createdAt)),1),U.duration?(t(),s("span",Dn,u(O(U.duration)),1)):o("v-if",true)])])],10,kn))),128)),o(" 加载更多 "),b.value&&T.value.length>0?(t(),s("div",zn,[...l[10]||(l[10]=[e("div",{class:"loader-small"},null,-1)])])):o("v-if",true)],544)],2112)):(t(),s("div",yn,[a(n,{name:"user",class:"empty-icon"}),l[5]||(l[5]=e("p",null,"请登录查看历史",-1))]))])],2112)),o(" 图片预览弹窗 "),a(Ie,{visible:r.value,"onUpdate:visible":l[2]||(l[2]=U=>r.value=U),images:k.value,"initial-index":v.value,prompt:M.value,"created-at":G.value,duration:Q.value},null,8,["visible","images","initial-index","prompt","created-at","duration"])],2)}}}),Pn=oe(Fn,[["__scopeId","data-v-6cba50e5"]]),Ln={class:"view-container"},An={class:"view-content"},Mn={class:"generate-layout"},En={class:"config-panel"},qn={class:"form-section"},Nn={class:"section-title"},Rn={class:"form-item"},Bn={class:"form-item"},Hn={class:"form-section flex-grow"},Gn={class:"section-title"},Jn={class:"form-section"},jn={class:"section-title"},Wn={class:"upload-area"},Kn={key:0,class:"upload-list"},Qn=["src"],Xn=["onClick"],Yn={class:"form-actions"},Zn={class:"preview-panel"},eo={key:0,class:"result-container"},to={key:0,class:"success-result"},lo={key:0,class:"output-grid"},so=["src","onClick"],ao={class:"output-actions"},no=["href"],oo=["src"],io=["src"],ro=["href"],co={class:"text-output"},uo=["href"],vo={class:"result-meta"},mo={key:0,class:"meta-item"},po={key:1,class:"meta-item"},go={key:1,class:"error-result"},fo={class:"error-msg"},_o={key:1,class:"generating-state"},ho={key:2,class:"empty-state"},yo=ne({__name:"GenerateView",setup(i){const C=h([]),p=h([]),x=h(false),c=h(null),b=h([]),D=h([]),T=h(),f=h();let m=0;const y=h({channel:void 0,prompt:"",parameters:{}}),H=h(void 0),z=h(false),r=h([]),k=h(0),v=h(""),M=O=>{var _;(_=c.value)!=null&&_.output&&(r.value=c.value.output.filter(V=>V.kind==="image"&&V.url).map(V=>V.url),k.value=O,z.value=true)},G=async()=>{try{const[O,_]=await Promise.all([fe.list(),ge.list()]);C.value=O,p.value=_}catch(O){console.error(O)}},Q=()=>{},N=O=>new Promise((_,V)=>{const l=new FileReader;l.onload=()=>{const U=l.result.split(",")[1];_(U)},l.onerror=V,l.readAsDataURL(O)}),q=()=>{var O;(O=T.value)==null||O.click()},g=async O=>{const _=O.target;!_.files||_.files.length===0||(await se(Array.from(_.files)),_.value="")},W=async O=>{var V;const _=(V=O.dataTransfer)==null?void 0:V.files;!_||_.length===0||await se(Array.from(_).filter(l=>l.type.startsWith("image/")))},se=async O=>{const _=4-b.value.length;if(_<=0){J.warning("最多上传 4 张图片");return}const V=O.slice(0,_);for(const l of V){const n=URL.createObjectURL(l);b.value.push({uid:++m,url:n,raw:l});try{const U=await N(l);D.value.push({type:"image",base64:U,mimeType:l.type,filename:l.name})}catch(U){console.error("Failed to read file:",l.name,U)}}},re=O=>{const _=b.value[O];_&&(URL.revokeObjectURL(_.url),b.value.splice(O,1),D.value.splice(O,1))},P=async()=>{var O,_,V,l;if(!y.value.channel){J.warning("请选择渠道");return}x.value=true,c.value=null;try{const n={channelId:y.value.channel,prompt:y.value.prompt||"",parameters:{...y.value.parameters}};if(D.value.length>0&&(n.files=D.value),H.value){const j=p.value.find(te=>te.id===H.value);j&&(n.parameters.preset=j.name)}const U=await je.generate(n);if(c.value=U,U.success)if((O=f.value)==null||O.refresh(),U.taskId)try{const j=await _e.get(U.taskId);v.value=((V=(_=j.middlewareLogs)==null?void 0:_.preset)==null?void 0:V.transformedPrompt)||((l=j.requestSnapshot)==null?void 0:l.prompt)||""}catch{v.value=y.value.prompt}else v.value=y.value.prompt}catch{c.value={success:false,error:"请求失败"}}finally{x.value=false}},$=O=>{O.prompt&&(y.value.prompt=O.prompt)};return ve(()=>{G()}),(O,_)=>{var w;const V=E("k-icon"),l=E("el-option"),n=E("el-select"),U=E("el-input"),j=E("k-button"),te=E("k-card");return t(),s("div",Ln,[e("div",An,[e("div",Mn,[o(" 左侧配置区 "),e("div",En,[a(te,{class:"config-card"},{default:I(()=>[e("div",qn,[e("div",Nn,[a(V,{name:"settings"}),_[5]||(_[5]=R(" 基础配置 ",-1))]),e("div",Rn,[_[6]||(_[6]=e("div",{class:"label"},"生成渠道",-1)),a(n,{modelValue:y.value.channel,"onUpdate:modelValue":_[0]||(_[0]=d=>y.value.channel=d),placeholder:"选择生成渠道",style:{width:"100%"}},{default:I(()=>[(t(true),s(S,null,K(C.value,d=>(t(),ee(l,{key:d.id,label:d.name,value:d.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Bn,[_[7]||(_[7]=e("div",{class:"label"},"预设模板",-1)),a(n,{modelValue:H.value,"onUpdate:modelValue":_[1]||(_[1]=d=>H.value=d),placeholder:"选择预设模板 (可选)",style:{width:"100%"},clearable:"",onChange:Q},{default:I(()=>[(t(true),s(S,null,K(p.value,d=>(t(),ee(l,{key:d.id,label:d.name,value:d.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),e("div",Hn,[e("div",Gn,[a(V,{name:"edit"}),_[8]||(_[8]=R(" 提示词 ",-1))]),a(U,{modelValue:y.value.prompt,"onUpdate:modelValue":_[2]||(_[2]=d=>y.value.prompt=d),type:"textarea",rows:8,placeholder:"输入提示词,支持自然语言描述...",resize:"none",class:"prompt-input"},null,8,["modelValue"])]),o(" 文件上传区域 "),e("div",Jn,[e("div",jn,[a(V,{name:"image"}),_[9]||(_[9]=R(" 参考图片 ",-1))]),e("div",Wn,[o(" 已上传的图片列表 "),b.value.length>0?(t(),s("div",Kn,[(t(true),s(S,null,K(b.value,(d,B)=>(t(),s("div",{key:d.uid,class:"upload-item"},[e("img",{src:d.url,class:"upload-thumb"},null,8,Qn),e("div",{class:"upload-overlay",onClick:le=>re(B)},[a(V,{name:"delete"})],8,Xn)]))),128))])):o("v-if",true),o(" 上传按钮 "),b.value.length<4?(t(),s("div",{key:1,class:"upload-trigger",onClick:q,onDragover:_[3]||(_[3]=de(()=>{},["prevent"])),onDrop:de(W,["prevent"])},[e("input",{ref_key:"fileInput",ref:T,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:g},null,544),a(V,{name:"add",class:"upload-icon"})],32)):o("v-if",true),_[10]||(_[10]=e("div",{class:"upload-tip"},"点击或拖拽上传,最多 4 张",-1))])]),e("div",Yn,[a(j,{solid:"",type:"primary",loading:x.value,onClick:P,class:"generate-btn"},{icon:I(()=>[a(V,{name:"magic"})]),default:I(()=>[_[11]||(_[11]=R(" 生成图片 ",-1))]),_:1},8,["loading"])])]),_:1})]),o(" 右侧预览区 "),e("div",Zn,[c.value?(t(),s("div",eo,[c.value.success?(t(),s("div",to,[c.value.output&&c.value.output.length?(t(),s("div",lo,[(t(true),s(S,null,K(c.value.output,(d,B)=>{var le;return t(),s("div",{key:B,class:"output-wrapper"},[o(" 图片 "),d.kind==="image"?(t(),s(S,{key:0},[e("img",{src:d.url,onClick:ce=>M(B),class:"clickable-image"},null,8,so),e("div",ao,[e("a",{href:d.url,target:"_blank",class:"action-btn",download:""},[a(V,{name:"download"})],8,no)])],64)):d.kind==="video"?(t(),s(S,{key:1},[o(" 视频 "),e("video",{src:d.url,controls:"",class:"output-video"},null,8,oo)],64)):d.kind==="audio"?(t(),s(S,{key:2},[o(" 音频 "),e("audio",{src:d.url,controls:"",class:"output-audio"},null,8,io)],64)):d.kind==="file"?(t(),s(S,{key:3},[o(" 其他文件 "),e("a",{href:d.url,target:"_blank",class:"file-link"},[a(V,{name:"file"}),R(" "+u(((le=d.meta)==null?void 0:le.filename)||"下载文件"),1)],8,ro)],64)):d.kind==="text"?(t(),s(S,{key:4},[o(" 文本 "),e("div",co,u(d.content),1)],64)):d.url?(t(),s(S,{key:5},[o(" 兜底:有 url 则显示链接 "),e("a",{href:d.url,target:"_blank"},u(d.url),9,uo)],64)):o("v-if",true)])}),128))])):o("v-if",true),e("div",vo,[c.value.duration?(t(),s("span",mo,[a(V,{name:"stopwatch"}),R(" 耗时: "+u((c.value.duration/1e3).toFixed(2))+"s ",1)])):o("v-if",true),c.value.taskId?(t(),s("span",po,[a(V,{name:"list-alt"}),R(" 任务 ID: "+u(c.value.taskId),1)])):o("v-if",true)])])):(t(),s("div",go,[a(V,{name:"warning",class:"error-icon"}),e("div",fo,u(c.value.error||"生成失败"),1)]))])):x.value?(t(),s("div",_o,[..._[12]||(_[12]=[e("div",{class:"loader"},null,-1),e("p",null,"正在生成中,请稍候...",-1)])])):(t(),s("div",ho,[a(V,{name:"image",class:"empty-icon"}),_[13]||(_[13]=e("p",null,"在左侧配置并点击生成",-1))]))]),o(" 右侧历史画廊 "),a(Pn,{ref_key:"historyGalleryRef",ref:f,onSelect:$},null,512)])]),o(" 图片预览弹窗 "),a(Ie,{visible:z.value,"onUpdate:visible":_[4]||(_[4]=d=>z.value=d),images:r.value,"initial-index":k.value,prompt:v.value,duration:(w=c.value)==null?void 0:w.duration},null,8,["visible","images","initial-index","prompt","duration"])])}}}),ze=oe(yo,[["__scopeId","data-v-cb54fefc"]]),bo={class:"pipeline-panel"},ko={class:"pipeline-flow"},$o={class:"phase-icon"},wo={class:"phase-info"},Vo={class:"phase-name"},Co={class:"phase-desc"},xo={class:"phase-badge"},Io={key:0,class:"phase-middlewares"},Uo={class:"mw-card"},So={class:"mw-content"},Oo={class:"mw-name"},To={class:"mw-desc"},Do=["title"],zo=["checked","onChange"],Fo={key:2,class:"phase-connector"},Po={class:"connector-arrow"},Lo=ne({__name:"MiddlewaresPanel",setup(i){const C=h([]),p=[{id:"lifecycle-prepare",label:"准备",description:"验证、权限检查、任务创建",icon:"clipboard-check",colorClass:"phase-prepare"},{id:"lifecycle-pre-request",label:"预处理",description:"预设应用、参数处理",icon:"settings",colorClass:"phase-pre"},{id:"lifecycle-request",label:"执行",description:"调用连接器生成",icon:"play",colorClass:"phase-request"},{id:"lifecycle-post-request",label:"后处理",description:"结果缓存、格式转换",icon:"package",colorClass:"phase-post"},{id:"lifecycle-finalize",label:"完成",description:"计费结算、记录保存",icon:"check-circle",colorClass:"phase-finalize"}],x={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},c=T=>C.value.filter(f=>f.phase===T),b=async()=>{try{C.value=await $e.list()}catch{J.error("加载中间件列表失败")}},D=async T=>{const f=!T.enabled;try{await $e.update(T.name,{enabled:f}),T.enabled=f,J.success(f?"已启用":"已禁用")}catch{J.error("操作失败")}};return ve(b),(T,f)=>{const m=E("k-icon");return t(),s("div",bo,[o(" 标题区 "),f[5]||(f[5]=e("div",{class:"panel-header"},[e("div",{class:"header-title"},[e("h3",null,"请求执行流程"),e("span",{class:"subtitle"},"每个生成请求按以下阶段依次处理")])],-1)),o(" 流程图 "),e("div",ko,[(t(),s(S,null,K(p,(y,H)=>e("div",{key:y.id,class:"phase-section"},[o(" 阶段标题 "),e("div",{class:Z(["phase-header",y.colorClass])},[e("div",$o,[a(m,{name:y.icon},null,8,["name"])]),e("div",wo,[e("span",Vo,u(y.label),1),e("span",Co,u(y.description),1)]),e("span",xo,u(c(y.id).length),1)],2),o(" 中间件列表 "),c(y.id).length>0?(t(),s("div",Io,[(t(true),s(S,null,K(c(y.id),(z,r)=>(t(),s("div",{key:z.name,class:Z(["mw-item",{disabled:!z.enabled}])},[e("div",Uo,[e("div",{class:Z(["mw-status",{active:z.enabled}])},null,2),e("div",So,[e("span",Oo,u(z.displayName),1),e("span",To,u(z.description||x[z.category]||z.category),1)]),e("label",{class:"toggle-switch",onClick:f[0]||(f[0]=de(()=>{},["stop"])),title:z.enabled?"点击禁用":"点击启用"},[e("input",{type:"checkbox",checked:z.enabled,onChange:k=>D(z)},null,40,zo),f[1]||(f[1]=e("span",{class:"slider"},null,-1))],8,Do)])],2))),128))])):(t(),s(S,{key:1},[o(" 空状态 "),f[2]||(f[2]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),o(" 阶段间连接箭头 "),H<p.length-1?(t(),s("div",Fo,[f[3]||(f[3]=e("div",{class:"connector-line"},null,-1)),e("div",Po,[a(m,{name:"chevron-down"})]),f[4]||(f[4]=e("div",{class:"connector-line"},null,-1))])):o("v-if",true)])),64))]),o(" 底部说明 "),f[6]||(f[6]=Ce('<div class="pipeline-footer" data-v-b4b0cf47><div class="footer-item" data-v-b4b0cf47><span class="dot active" data-v-b4b0cf47></span><span data-v-b4b0cf47>启用 - 中间件将在请求中执行</span></div><div class="footer-item" data-v-b4b0cf47><span class="dot" data-v-b4b0cf47></span><span data-v-b4b0cf47>禁用 - 中间件将被跳过</span></div><p class="footer-hint" data-v-b4b0cf47>同一阶段内的中间件可能并行执行。详细配置请前往「扩展插件」面板。</p></div>',1))])}}}),Ao=oe(Lo,[["__scopeId","data-v-b4b0cf47"]]),Mo={class:"plugins-panel"},Eo={key:0,class:"loading-state"},qo={class:"empty-state"},No={class:"plugins-list"},Ro=["onClick"],Bo={class:"plugin-info"},Ho={class:"plugin-header"},Go={class:"plugin-name"},Jo={key:0,class:"plugin-version"},jo={class:"plugin-description"},Wo={class:"plugin-status"},Ko={key:0,class:"plugin-badge connector"},Qo={key:1,class:"plugin-badge middleware"},Xo={key:0,class:"plugin-detail"},Yo={class:"detail-header"},Zo={class:"header-left"},ei={key:0,class:"version"},ti={class:"header-actions"},li={key:0,class:"connector-info"},si={class:"connector-meta"},ai={class:"connector-id"},ni={class:"connector-types"},oi={key:1,class:"middlewares-list"},ii={class:"middleware-tags"},di={class:"phase-badge"},ri={key:2,class:"config-section"},ci={class:"config-actions"},ui={class:"no-config"},vi={class:"no-selection"},mi=ne({__name:"PluginsPanel",setup(i){const C=h(true),p=h([]),x=h(null),c=h({}),b=h(false),D={"lifecycle-prepare":"准备","lifecycle-pre-request":"前置","lifecycle-request":"请求","lifecycle-post-request":"后置","lifecycle-finalize":"完成"},T=z=>D[z]||z,f=async()=>{try{C.value=true,p.value=await Ve.list()}catch(z){console.error("Failed to load plugins:",z),p.value=[]}finally{C.value=false}},m=z=>{x.value=z,c.value={...z.config};for(const r of z.configFields||[])c.value[r.key]===void 0&&r.default!==void 0&&(c.value[r.key]=r.default)},y=async()=>{if(x.value){b.value=true;try{await Ve.updateConfig(x.value.id,c.value),J.success("保存成功"),await f();const z=p.value.find(r=>{var k;return r.id===((k=x.value)==null?void 0:k.id)});z&&(x.value=z,c.value={...z.config})}catch{J.error("保存失败")}finally{b.value=false}}},H=async z=>{var r;try{const{send:k}=await import("@koishijs/client"),v=await k(z.apiEvent);if((v==null?void 0:v.success)===false)throw new Error(v.error||"操作失败");if(z.apiEvent==="media-luna/presets/sync"&&(v!=null&&v.data)){const{added:M,updated:G,removed:Q,notModified:N}=v.data;N?J.info("数据未变化,无需更新"):J.success(`同步完成:新增 ${M},更新 ${G},删除 ${Q}`)}else(r=v==null?void 0:v.data)!=null&&r.message?J.success(v.data.message):J.success(`${z.label} 完成`);await f()}catch(k){J.error(`${z.label} 失败: ${k instanceof Error?k.message:"未知错误"}`)}};return ve(f),(z,r)=>{var M,G,Q;const k=E("k-icon"),v=E("k-button");return t(),s("div",Mo,[o(" 加载状态 "),C.value?(t(),s("div",Eo,[a(k,{name:"sync",class:"spin"}),r[1]||(r[1]=e("span",null,"加载中...",-1))])):p.value.length===0?(t(),s(S,{key:1},[o(" 空状态 "),e("div",qo,[a(k,{name:"apps"}),r[2]||(r[2]=e("p",null,"暂无扩展插件",-1)),r[3]||(r[3]=e("p",{class:"hint"},[R("第三方扩展插件将在这里显示"),e("br"),R('内置功能请在"功能模块"中配置')],-1))])],2112)):(t(),s(S,{key:2},[o(" 插件列表 "),e("div",No,[(t(true),s(S,null,K(p.value,N=>{var q,g;return t(),s("div",{key:N.id,class:Z(["plugin-card",{active:((q=x.value)==null?void 0:q.id)===N.id,disabled:!N.enabled}]),onClick:W=>m(N)},[e("div",Bo,[e("div",Ho,[e("span",Go,u(N.name),1),N.version?(t(),s("span",Jo,"v"+u(N.version),1)):o("v-if",true)]),e("p",jo,u(N.description||"暂无描述"),1)]),e("div",Wo,[N.connector?(t(),s("span",Ko,"连接器")):o("v-if",true),(g=N.middlewares)!=null&&g.length?(t(),s("span",Qo,u(N.middlewares.length)+" 个中间件 ",1)):o("v-if",true),a(k,{name:N.enabled?"check-circle":"close-circle",class:Z(N.enabled?"enabled":"disabled")},null,8,["name","class"])])],10,Ro)}),128))]),o(" 插件详情 "),x.value?(t(),s("div",Xo,[e("header",Yo,[e("div",Zo,[e("h3",null,u(x.value.name),1),x.value.version?(t(),s("span",ei,"v"+u(x.value.version),1)):o("v-if",true)]),e("div",ti,[(t(true),s(S,null,K(x.value.actions,N=>(t(),ee(v,{key:N.name,type:N.type||"default",size:"small",onClick:q=>H(N)},Re({default:I(()=>[R(" "+u(N.label),1)]),_:2},[N.icon?{name:"icon",fn:I(()=>[a(k,{name:N.icon},null,8,["name"])]),key:"0"}:void 0]),1032,["type","onClick"]))),128))])]),o(" 连接器信息 "),x.value.connector?(t(),s("div",li,[r[4]||(r[4]=e("h4",null,"连接器",-1)),e("div",si,[e("span",ai,u(x.value.connector.id),1),e("span",ni," 支持: "+u(((M=x.value.connector.supportedTypes)==null?void 0:M.join(", "))||"无"),1)])])):o("v-if",true),o(" 中间件列表 "),(G=x.value.middlewares)!=null&&G.length?(t(),s("div",oi,[r[5]||(r[5]=e("h4",null,"中间件",-1)),e("div",ii,[(t(true),s(S,null,K(x.value.middlewares,N=>(t(),s("span",{key:N.name,class:Z(["middleware-tag",{enabled:N.enabled}])},[R(u(N.displayName||N.name)+" ",1),e("span",di,u(T(N.phase)),1)],2))),128))])])):o("v-if",true),o(" 配置表单 "),(Q=x.value.configFields)!=null&&Q.length?(t(),s("div",ri,[r[7]||(r[7]=e("h4",null,"配置",-1)),a(xe,{fields:x.value.configFields,modelValue:c.value,"onUpdate:modelValue":r[0]||(r[0]=N=>c.value=N)},null,8,["fields","modelValue"]),e("div",ci,[a(v,{type:"primary",onClick:y,loading:b.value},{icon:I(()=>[a(k,{name:"save"})]),default:I(()=>[r[6]||(r[6]=R(" 保存配置 ",-1))]),_:1},8,["loading"])])])):(t(),s(S,{key:3},[o(" 无配置提示 "),e("div",ui,[a(k,{name:"info-circle"}),r[8]||(r[8]=e("span",null,"该插件暂无可配置项",-1))])],2112))])):(t(),s(S,{key:1},[o(" 无选中提示 "),e("div",vi,[a(k,{name:"apps"}),r[9]||(r[9]=e("p",null,"请从左侧选择一个插件查看详情",-1))])],2112))],64))])}}}),pi=oe(mi,[["__scopeId","data-v-bfb4a81f"]]),gi={class:"settings-view"},fi={class:"sidebar"},_i={class:"nav-list"},hi=["onClick"],yi={class:"main-content"},bi={key:0,class:"loading"},ki={class:"panel-header"},$i={key:0},wi={class:"custom-panel"},Vi={class:"actions"},Ci=ne({__name:"SettingsView",setup(i){const C=h(true),p=h([]),x=h(""),c=h({}),b=ae(()=>p.value.find(m=>m.id===x.value)),D=async()=>{try{p.value=await Oe.panels(),p.value.length&&!x.value&&(x.value=p.value[0].id)}catch{J.error("加载设置面板失败")}},T=()=>{var m;if(((m=b.value)==null?void 0:m.type)==="custom"){c.value={...b.value.config||{}};for(const y of b.value.configFields||[])c.value[y.key]===void 0&&y.default!==void 0&&(c.value[y.key]=y.default)}},f=async()=>{if(b.value)try{await Oe.update(b.value.id,c.value),J.success("保存成功"),await D()}catch{J.error("保存失败")}};return pe(x,()=>{var m;((m=b.value)==null?void 0:m.type)==="custom"&&T()}),ve(async()=>{await D(),C.value=false}),(m,y)=>{const H=E("k-icon"),z=E("k-button");return t(),s("div",gi,[o(" 侧边栏导航 "),e("aside",fi,[e("nav",_i,[(t(true),s(S,null,K(p.value,r=>(t(),s("div",{key:r.id,class:Z(["nav-item",{active:x.value===r.id}]),onClick:k=>x.value=r.id},[a(H,{name:r.icon},null,8,["name"]),e("span",null,u(r.name),1)],10,hi))),128))])]),o(" 主内容区 "),e("main",yi,[C.value?(t(),s("div",bi,[a(H,{name:"sync",class:"spin"}),y[1]||(y[1]=R(" 加载中... ",-1))])):b.value?(t(),s(S,{key:1},[o(" 面板标题 "),e("header",ki,[e("h2",null,u(b.value.name),1),b.value.description?(t(),s("p",$i,u(b.value.description),1)):o("v-if",true)]),o(" 功能模块面板 "),b.value.component==="middlewares"?(t(),ee(Ao,{key:0})):b.value.component==="plugins"?(t(),s(S,{key:1},[o(" 扩展插件面板 "),a(pi)],64)):b.value.type==="custom"&&b.value.configFields?(t(),s(S,{key:2},[o(" 自定义面板 "),e("div",wi,[a(xe,{fields:b.value.configFields,modelValue:c.value,"onUpdate:modelValue":y[0]||(y[0]=r=>c.value=r)},null,8,["fields","modelValue"]),e("div",Vi,[a(z,{type:"primary",onClick:f},{icon:I(()=>[a(H,{name:"save"})]),default:I(()=>[y[2]||(y[2]=R(" 保存 ",-1))]),_:1})])])],64)):o("v-if",true)],64)):o("v-if",true)])])}}}),xi=oe(Ci,[["__scopeId","data-v-5fa778a6"]]),Ii={class:"top-nav"},Ui={class:"nav-container"},Si={class:"nav-tabs",role:"tablist"},Oi=["onClick","aria-selected"],Ti={class:"main-content"},Di=ne({__name:"index",setup(i){const C=h("generate"),p=ae(()=>{switch(C.value){case"generate":return ze;case"channels":return Ll;case"presets":return Ts;case"tasks":return mn;case"settings":return xi;default:return ze}}),x=f=>()=>Ue("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[Ue("path",{d:f})]),c=[{id:"generate",label:"生成",icon:x("M7.5 5.6L10 7 8.6 4.5 10 2 7.5 3.4 5 2 6.4 4.5 5 7zM19 2l-2.5 1.4L14 2l1.4 2.5L14 7l2.5-1.4L19 7l-1.4-2.5zm-5.6 5.4L9 12l4.4 4.6L17.8 12zM2 13l2.5 1.4L6 17l1.4-2.5L10 13 7.5 11.6 6 9l-1.4 2.5z")},{id:"channels",label:"渠道",icon:x("M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z")},{id:"presets",label:"预设",icon:x("M17 3H7c-1.1 0-2 .9-2 2v16l7-3 7 3V5c0-1.1-.9-2-2-2z")},{id:"tasks",label:"任务",icon:x("M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z")},{id:"settings",label:"设置",icon:x("M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.488.488 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.58 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z")}];let b="";function D(){const f=document.querySelector(".layout-header");f&&(b=f.style.display,f.style.display="none")}function T(){const f=document.querySelector(".layout-header");f&&(f.style.display=b||"")}return ve(D),Be(T),(f,m)=>{const y=E("k-layout");return t(),ee(y,{class:"app-layout media-luna-app"},{default:I(()=>[e("div",Ii,[e("div",Ui,[m[0]||(m[0]=e("div",{class:"logo-area"},[e("span",{class:"logo-text"},"MEDIA LUNA")],-1)),e("div",Si,[(t(),s(S,null,K(c,H=>e("div",{key:H.id,class:Z(["nav-tab",{active:C.value===H.id}]),onClick:z=>C.value=H.id,role:"tab","aria-selected":C.value===H.id},[(t(),ee(Se(H.icon),{class:"tab-icon"})),e("span",null,u(H.label),1)],10,Oi)),64))])])]),e("div",Ti,[(t(),ee(He,null,[(t(),ee(Se(p.value)))],1024))])]),_:1})}}}),zi=oe(Di,[["__scopeId","data-v-7e4d3d55"]]),Li=i=>{i.page({name:"Media Luna",path:"/media-luna",component:zi,order:500})};export{Li as default};
|
|
1
|
+
import{defineComponent as ce,computed as oe,ref as y,resolveComponent as E,createElementBlock as l,openBlock as t,createElementVNode as e,createCommentVNode as s,Fragment as I,renderList as Q,normalizeClass as ee,toDisplayString as v,createVNode as a,withKeys as Me,withCtx as w,createStaticVNode as Ce,createBlock as ie,watch as ge,withDirectives as ye,vShow as ke,withModifiers as ve,createTextVNode as M,onMounted as pe,onUnmounted as xe,Teleport as Ne,Transition as qe,createSlots as Re,onBeforeUnmount as Be,h as Te,resolveDynamicComponent as Oe,KeepAlive as He}from"vue";import{send as Ge,message as K}from"@koishijs/client";async function N(d,S){const g=await Ge(d,S);if(!g.success)throw new Error(g.error||"请求失败");return g.data}const _e={list:()=>N("media-luna/channels/list"),get:d=>N("media-luna/channels/get",{id:d}),create:d=>N("media-luna/channels/create",d),update:(d,S)=>N("media-luna/channels/update",{id:d,data:S}),delete:d=>N("media-luna/channels/delete",{id:d}),toggle:(d,S)=>N("media-luna/channels/toggle",{id:d,enabled:S}),tags:()=>N("media-luna/channels/tags"),getByTags:(d,S)=>N("media-luna/channels/by-tags",{tags:d,matchAll:S})},fe={list:d=>N("media-luna/presets/list",{enabledOnly:d}),get:d=>N("media-luna/presets/get",{id:d}),create:d=>N("media-luna/presets/create",d),update:(d,S)=>N("media-luna/presets/update",{id:d,data:S}),delete:d=>N("media-luna/presets/delete",{id:d}),toggle:(d,S)=>N("media-luna/presets/toggle",{id:d,enabled:S}),copy:d=>N("media-luna/presets/copy",{id:d}),matching:d=>N("media-luna/presets/matching",{channelId:d}),tags:()=>N("media-luna/presets/tags"),getByTags:(d,S)=>N("media-luna/presets/by-tags",{tags:d,matchAll:S})},he={list:d=>N("media-luna/tasks/list",d),get:d=>N("media-luna/tasks/get",{id:d}),delete:d=>N("media-luna/tasks/delete",{id:d}),stats:d=>N("media-luna/tasks/stats",{channelId:d}),cleanup:d=>N("media-luna/tasks/cleanup",{days:d}),recent:(d,S)=>N("media-luna/tasks/recent",{userId:d,limit:S}),my:d=>N("media-luna/tasks/my",d)},Je={me:()=>N("media-luna/auth/me")},$e={list:()=>N("media-luna/middlewares/list"),get:d=>N("media-luna/middlewares/get",{name:d}),update:(d,S)=>N("media-luna/middlewares/update",{name:d,data:S}),reset:d=>N("media-luna/middlewares/reset",{name:d}),executionOrder:()=>N("media-luna/middlewares/execution-order"),cardFields:()=>N("media-luna/middlewares/card-fields")},be={list:()=>N("media-luna/connectors/list"),get:d=>N("media-luna/connectors/get",{id:d}),fields:d=>N("media-luna/connectors/fields",{id:d}),schema:()=>N("media-luna/connectors/schema")},je={generate:d=>N("media-luna/generate",d),preview:d=>N("media-luna/generate/preview",d)},We={upload:(d,S,g)=>N("media-luna/cache/upload",{data:d,mime:S,filename:g}),cacheUrl:d=>N("media-luna/cache/cache-url",{url:d}),get:d=>N("media-luna/cache/get",{id:d}),read:d=>N("media-luna/cache/read",{id:d}),delete:d=>N("media-luna/cache/delete",{id:d}),stats:()=>N("media-luna/cache/stats"),clear:()=>N("media-luna/cache/clear")},De={panels:()=>N("media-luna/settings/panels"),get:d=>N("media-luna/settings/get",{id:d}),update:(d,S)=>N("media-luna/settings/update",{id:d,config:S}),syncRemotePresets:()=>N("media-luna/presets/sync")},Ve={list:()=>N("media-luna/plugins/list"),get:d=>N("media-luna/plugins/get",{id:d}),updateConfig:(d,S)=>N("media-luna/plugins/update-config",{pluginId:d,config:S}),enable:d=>N("media-luna/plugins/enable",{id:d}),disable:d=>N("media-luna/plugins/disable",{id:d}),externalList:()=>N("media-luna/plugins/external/list"),externalAdd:d=>N("media-luna/plugins/external/add",{moduleName:d}),externalRemove:d=>N("media-luna/plugins/external/remove",{moduleName:d})},Ke={class:"tag-filter"},Qe={class:"filter-tags"},Xe=["onClick"],Ye={key:0,class:"filter-input-wrapper"},Ze=ce({__name:"TagFilter",props:{modelValue:{default:()=>[]},allTags:{},presetTags:{default:()=>[]},showInput:{type:Boolean,default:true},maxDynamicTags:{default:20}},emits:["update:modelValue","change"],setup(d,{emit:S}){const g=d,x=S,u=oe({get:()=>g.modelValue,set:m=>{x("update:modelValue",m),x("change",m)}}),k=y(""),D=oe(()=>{const m=g.allTags.filter(C=>!g.presetTags.includes(C)).slice(0,g.maxDynamicTags);return[...g.presetTags,...m]}),T=m=>{const C=[...u.value],R=C.indexOf(m);R>=0?C.splice(R,1):C.push(m),u.value=C},f=()=>{const m=k.value.trim();m&&!u.value.includes(m)&&(u.value=[...u.value,m]),k.value=""};return(m,C)=>{const R=E("k-icon"),P=E("el-input");return t(),l("div",Ke,[e("div",Qe,[(t(true),l(I,null,Q(D.value,c=>(t(),l("span",{key:c,class:ee(["filter-tag",{active:u.value.includes(c)}]),onClick:h=>T(c)},v(c),11,Xe))),128))]),d.showInput?(t(),l("div",Ye,[a(P,{modelValue:k.value,"onUpdate:modelValue":C[0]||(C[0]=c=>k.value=c),placeholder:"输入标签筛选...",size:"small",clearable:"",onKeyup:Me(f,["enter"]),class:"filter-input"},{prefix:w(()=>[a(R,{name:"search"})]),_:1},8,["modelValue"])])):s("v-if",true)])}}}),ue=(d,S)=>{const g=d.__vccOpts||d;for(const[x,u]of S)g[x]=u;return g},Ie=ue(Ze,[["__scopeId","data-v-61b504c8"]]),et={class:"view-mode-switch"},tt=ce({__name:"ViewModeSwitch",props:{modelValue:{}},emits:["update:modelValue"],setup(d){return(S,g)=>(t(),l("div",et,[e("button",{class:ee(["mode-btn",{active:d.modelValue==="card"}]),onClick:g[0]||(g[0]=x=>S.$emit("update:modelValue","card")),title:"卡片视图"},[...g[2]||(g[2]=[Ce('<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" data-v-ae3ef498><rect x="3" y="3" width="8" height="8" rx="1" data-v-ae3ef498></rect><rect x="13" y="3" width="8" height="8" rx="1" data-v-ae3ef498></rect><rect x="3" y="13" width="8" height="8" rx="1" data-v-ae3ef498></rect><rect x="13" y="13" width="8" height="8" rx="1" data-v-ae3ef498></rect></svg>',1)])],2),e("button",{class:ee(["mode-btn",{active:d.modelValue==="list"}]),onClick:g[1]||(g[1]=x=>S.$emit("update:modelValue","list")),title:"列表视图"},[...g[3]||(g[3]=[e("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},[e("rect",{x:"3",y:"4",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"10.5",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"17",width:"18",height:"3",rx:"1"})],-1)])],2)]))}}),Le=ue(tt,[["__scopeId","data-v-ae3ef498"]]),lt={class:"tag-input"},st=ce({__name:"TagInput",props:{modelValue:{},suggestions:{},placeholder:{}},emits:["update:modelValue"],setup(d,{emit:S}){const g=d,x=S,u=oe({get:()=>g.modelValue,set:k=>x("update:modelValue",k)});return(k,D)=>{const T=E("el-option"),f=E("el-select");return t(),l("div",lt,[a(f,{modelValue:u.value,"onUpdate:modelValue":D[0]||(D[0]=m=>u.value=m),multiple:"",filterable:"","allow-create":"","default-first-option":"",placeholder:d.placeholder,class:"tag-select","tag-type":"primary"},{default:w(()=>[(t(true),l(I,null,Q(d.suggestions,m=>(t(),ie(T,{key:m,label:m,value:m},null,8,["label","value"]))),128))]),_:1},8,["modelValue","placeholder"])])}}}),Ae=ue(st,[["__scopeId","data-v-68388640"]]),at={class:"config-renderer"},nt={key:0,class:"form-row"},ot={class:"field-container"},it={key:6,class:"field-desc"},dt=ce({__name:"ConfigRenderer",props:{fields:{},modelValue:{},clearable:{type:Boolean,default:false}},emits:["update:modelValue"],setup(d,{emit:S}){const g=d,x=S,u=T=>g.modelValue[T],k=(T,f)=>{const m={...g.modelValue,[T]:f};x("update:modelValue",m)},D=T=>{if(!T.showWhen)return true;const{field:f,value:m}=T.showWhen;return g.modelValue[f]===m};return(T,f)=>{const m=E("el-switch"),C=E("el-option"),R=E("el-select"),P=E("el-input-number"),c=E("el-input");return t(),l("div",at,[(t(true),l(I,null,Q(d.fields,h=>(t(),l(I,{key:h.key},[D(h)?(t(),l("div",nt,[e("div",{class:ee(["form-label",{required:h.required}])},v(h.label),3),e("div",ot,[s(" Boolean 类型 "),h.type==="boolean"?(t(),ie(m,{key:0,"model-value":u(h.key),"onUpdate:modelValue":_=>k(h.key,_)},null,8,["model-value","onUpdate:modelValue"])):h.type==="select"?(t(),l(I,{key:1},[s(" Select 类型 "),a(R,{"model-value":u(h.key),"onUpdate:modelValue":_=>k(h.key,_),placeholder:h.placeholder||"请选择",clearable:d.clearable,style:{width:"100%"}},{default:w(()=>[(t(true),l(I,null,Q(h.options,_=>(t(),ie(C,{key:String(_.value),label:_.label,value:_.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)):h.type==="number"?(t(),l(I,{key:2},[s(" Number 类型 "),a(P,{"model-value":u(h.key),"onUpdate:modelValue":_=>k(h.key,_),placeholder:h.placeholder,controls:true},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):h.type==="textarea"?(t(),l(I,{key:3},[s(" Textarea 类型 "),a(c,{"model-value":u(h.key),"onUpdate:modelValue":_=>k(h.key,_),type:"textarea",rows:4,placeholder:h.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):h.type==="password"?(t(),l(I,{key:4},[s(" Password 类型 "),a(c,{"model-value":u(h.key),"onUpdate:modelValue":_=>k(h.key,_),type:"password","show-password":"",placeholder:h.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(t(),l(I,{key:5},[s(" Text/String 类型 (默认) "),a(c,{"model-value":u(h.key),"onUpdate:modelValue":_=>k(h.key,_),placeholder:h.placeholder,clearable:d.clearable},null,8,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)),s(" 字段描述 "),h.description?(t(),l("div",it,v(h.description),1)):s("v-if",true)])])):s("v-if",true)],64))),128))])}}}),Se=ue(dt,[["__scopeId","data-v-d82952a0"]]),rt={class:"dialog-layout"},ct={class:"tab-nav"},ut=["onClick"],vt={key:0,class:"tab-badge"},mt={class:"tab-content"},pt={class:"content-section"},gt={class:"form-group"},ft={class:"form-row"},_t={class:"form-group flex-1"},ht={class:"form-group"},yt={class:"switch-wrapper"},kt={class:"switch-label"},bt={class:"form-group"},$t={class:"section-divider"},wt={class:"content-section"},Vt={class:"override-hint-bar"},Ct={class:"pipeline-flow"},xt={class:"phase-icon"},It={class:"phase-info"},St={class:"phase-name"},Ut={class:"phase-desc"},Tt={class:"phase-badge"},Ot={key:0,class:"phase-middlewares"},Dt={class:"mw-card"},Pt={class:"mw-content"},zt={class:"mw-name"},Ft={class:"mw-desc"},Lt={key:2,class:"phase-connector"},At={class:"connector-arrow"},Et={class:"content-section"},Mt={class:"override-hint-bar"},Nt={key:0,class:"plugins-override-list"},qt=["onClick"],Rt={class:"plugin-info"},Bt={class:"plugin-name"},Ht={key:0,class:"override-badge"},Gt={class:"plugin-actions"},Jt={class:"plugin-config-fields"},jt={key:0,class:"override-field-row"},Wt={class:"field-label"},Kt={class:"field-input"},Qt={key:0,class:"field-hint"},Xt={key:1,class:"empty-hint"},Yt={class:"dialog-footer"},Zt=ce({__name:"ChannelConfigDialog",props:{modelValue:{type:Boolean},channel:{default:null}},emits:["update:modelValue","saved"],setup(d,{emit:S}){const g=d,x=S,u=oe({get:()=>g.modelValue,set:i=>x("update:modelValue",i)}),k=oe(()=>{var i;return!!((i=g.channel)!=null&&i.id)}),D=y("basic"),T=y(false),f=y(new Set),m=y([]),C=y({}),R=y([]),P=y([]),c=y({name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}),h=[{id:"basic",label:"基本信息",icon:"file-text"},{id:"middlewares",label:"中间件流程",icon:"git-branch"},{id:"plugins",label:"插件配置",icon:"puzzle"}],_=[{id:"lifecycle-prepare",label:"准备",description:"验证、权限检查",icon:"clipboard-check",colorClass:"phase-prepare"},{id:"lifecycle-pre-request",label:"预处理",description:"预设应用、参数处理",icon:"settings",colorClass:"phase-pre"},{id:"lifecycle-request",label:"执行",description:"调用连接器生成",icon:"play",colorClass:"phase-request"},{id:"lifecycle-post-request",label:"后处理",description:"结果缓存、格式转换",icon:"package",colorClass:"phase-post"},{id:"lifecycle-finalize",label:"完成",description:"计费结算、记录保存",icon:"check-circle",colorClass:"phase-finalize"}],A={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},W=oe(()=>c.value.connectorId?C.value[c.value.connectorId]||[]:[]),X=oe(()=>{const i=m.value.find(r=>r.id===c.value.connectorId);return(i==null?void 0:i.name)||"连接器"}),O=oe(()=>h.map(i=>{let r="";return i.id==="middlewares"&&(r=String(R.value.length)),i.id==="plugins"&&b.value.length>0&&(r=String(b.value.length)),{...i,badge:r}})),b=oe(()=>P.value.filter(i=>i.configFields&&i.configFields.length>0)),p=i=>R.value.filter(r=>r.phase===i),j=(i,r)=>{var F,le,Y;return(Y=(le=(F=c.value.pluginOverrides)==null?void 0:F[i])==null?void 0:le.middlewares)==null?void 0:Y[r]},de=(i,r,F)=>{c.value.pluginOverrides||(c.value.pluginOverrides={}),c.value.pluginOverrides[i]||(c.value.pluginOverrides[i]={}),c.value.pluginOverrides[i].middlewares||(c.value.pluginOverrides[i].middlewares={}),F==null?(delete c.value.pluginOverrides[i].middlewares[r],Object.keys(c.value.pluginOverrides[i].middlewares).length===0&&delete c.value.pluginOverrides[i].middlewares,Object.keys(c.value.pluginOverrides[i]).length===0&&delete c.value.pluginOverrides[i]):c.value.pluginOverrides[i].middlewares[r]=F},me=i=>{const r=j(i.configGroup||i.name,i.name);return r!==void 0?r?"active override":"override":i.enabled?"active":""},V=(i,r)=>{var F,le;return(le=(F=c.value.pluginOverrides)==null?void 0:F[i])==null?void 0:le[r]},$=(i,r,F)=>{c.value.pluginOverrides||(c.value.pluginOverrides={}),c.value.pluginOverrides[i]||(c.value.pluginOverrides[i]={}),F==null||F===""?(delete c.value.pluginOverrides[i][r],Object.keys(c.value.pluginOverrides[i]).length===0&&delete c.value.pluginOverrides[i]):c.value.pluginOverrides[i][r]=F},H=i=>{var F;const r=(F=c.value.pluginOverrides)==null?void 0:F[i];return r&&Object.keys(r).length>0},J=i=>{c.value.pluginOverrides&&delete c.value.pluginOverrides[i]},q=i=>{f.value.has(i)?f.value.delete(i):f.value.add(i)},n=(i,r)=>{var U,G;if(!r.showWhen)return true;const{field:F,value:le}=r.showWhen,Y=(G=(U=c.value.pluginOverrides)==null?void 0:U[i.id])==null?void 0:G[F],ae=i.config[F];return(Y!==void 0?Y:ae)===le},o=async i=>{if(c.value.connectorConfig={},i&&!C.value[i])try{const r=await be.fields(i);C.value[i]=r}catch(r){console.error("Failed to load connector fields:",r)}},z=async()=>{var i;if(!c.value.name){K.error("请输入渠道名称");return}if(!c.value.connectorId){K.error("请选择连接器");return}T.value=true;try{k.value&&((i=g.channel)!=null&&i.id)?(await _e.update(g.channel.id,c.value),K.success("保存成功")):(await _e.create(c.value),K.success("创建成功")),x("saved"),u.value=false}catch(r){K.error(r instanceof Error?r.message:"操作失败")}finally{T.value=false}},Z=()=>{D.value="basic",f.value.clear()},B=async()=>{try{const[i,r,F]=await Promise.all([be.list(),$e.list(),Ve.list()]);m.value=i,R.value=r,P.value=F.filter(le=>le.configFields&&le.configFields.length>0||le.middlewares&&le.middlewares.length>0)}catch(i){console.error("Failed to load data:",i)}};return ge(()=>g.modelValue,async i=>{if(i)if(await B(),g.channel){if(c.value=JSON.parse(JSON.stringify(g.channel)),c.value.pluginOverrides||(c.value.pluginOverrides={}),c.value.connectorConfig||(c.value.connectorConfig={}),c.value.connectorId&&!C.value[c.value.connectorId])try{const r=await be.fields(c.value.connectorId);C.value[c.value.connectorId]=r}catch(r){console.error("Failed to load connector fields:",r)}for(const r of Object.keys(c.value.pluginOverrides))f.value.add(r)}else c.value={name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}}),(i,r)=>{const F=E("k-icon"),le=E("el-input"),Y=E("el-option"),ae=E("el-select"),re=E("el-switch"),U=E("k-button"),G=E("el-input-number"),ne=E("el-dialog");return t(),ie(ne,{modelValue:u.value,"onUpdate:modelValue":r[6]||(r[6]=L=>u.value=L),title:k.value?"编辑渠道":"创建渠道",width:"800px","close-on-click-modal":false,class:"channel-config-dialog",onClosed:Z},{footer:w(()=>[e("div",Yt,[a(U,{onClick:r[5]||(r[5]=L=>u.value=false)},{default:w(()=>[...r[24]||(r[24]=[M("取消",-1)])]),_:1}),a(U,{type:"primary",onClick:z,loading:T.value},{default:w(()=>[M(v(k.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:w(()=>[e("div",rt,[s(" 左侧 Tab 导航 "),e("div",ct,[(t(true),l(I,null,Q(O.value,L=>(t(),l("div",{key:L.id,class:ee(["tab-item",{active:D.value===L.id}]),onClick:te=>D.value=L.id},[a(F,{name:L.icon},null,8,["name"]),e("span",null,v(L.label),1),L.badge?(t(),l("span",vt,v(L.badge),1)):s("v-if",true)],10,ut))),128))]),s(" 右侧内容区 "),e("div",mt,[s(" 基本信息 "),ye(e("div",pt,[r[13]||(r[13]=e("div",{class:"section-header"},[e("h4",null,"基本信息"),e("p",null,"设置渠道的名称、连接器和标签")],-1)),e("div",gt,[r[7]||(r[7]=e("label",{class:"form-label required"},"渠道名称",-1)),a(le,{modelValue:c.value.name,"onUpdate:modelValue":r[0]||(r[0]=L=>c.value.name=L),placeholder:"如 OpenAI DALL-E"},null,8,["modelValue"]),r[8]||(r[8]=e("div",{class:"form-hint"},"用户可见的渠道名称,冲突时会自动添加后缀",-1))]),e("div",ft,[e("div",_t,[r[9]||(r[9]=e("label",{class:"form-label required"},"连接器",-1)),a(ae,{modelValue:c.value.connectorId,"onUpdate:modelValue":r[1]||(r[1]=L=>c.value.connectorId=L),placeholder:"选择连接器",onChange:o,style:{width:"100%"}},{default:w(()=>[(t(true),l(I,null,Q(m.value,L=>(t(),ie(Y,{key:L.id,label:L.name,value:L.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",ht,[r[10]||(r[10]=e("label",{class:"form-label"},"启用状态",-1)),e("div",yt,[a(re,{modelValue:c.value.enabled,"onUpdate:modelValue":r[2]||(r[2]=L=>c.value.enabled=L)},null,8,["modelValue"]),e("span",kt,v(c.value.enabled?"启用":"禁用"),1)])])]),e("div",bt,[r[11]||(r[11]=e("label",{class:"form-label"},"标签",-1)),a(Ae,{modelValue:c.value.tags,"onUpdate:modelValue":r[3]||(r[3]=L=>c.value.tags=L),placeholder:"输入标签后按回车..."},null,8,["modelValue"]),r[12]||(r[12]=e("div",{class:"form-hint"},"用于分类和筛选渠道",-1))]),s(" 连接器配置(内嵌) "),W.value.length>0?(t(),l(I,{key:0},[e("div",$t,[e("span",null,v(X.value)+" 配置",1)]),a(Se,{fields:W.value,modelValue:c.value.connectorConfig,"onUpdate:modelValue":r[4]||(r[4]=L=>c.value.connectorConfig=L)},null,8,["fields","modelValue"])],64)):s("v-if",true)],512),[[ke,D.value==="basic"]]),s(" 中间件流程 "),ye(e("div",wt,[r[18]||(r[18]=e("div",{class:"section-header"},[e("h4",null,"中间件流程"),e("p",null,"控制此渠道的中间件启用状态")],-1)),e("div",Vt,[a(F,{name:"info-circle"}),r[14]||(r[14]=e("span",null,"留空表示跟随全局配置",-1))]),e("div",Ct,[(t(),l(I,null,Q(_,(L,te)=>e("div",{key:L.id,class:"phase-section"},[s(" 阶段标题 "),e("div",{class:ee(["phase-header",L.colorClass])},[e("div",xt,[a(F,{name:L.icon},null,8,["name"])]),e("div",It,[e("span",St,v(L.label),1),e("span",Ut,v(L.description),1)]),e("span",Tt,v(p(L.id).length),1)],2),s(" 中间件列表 "),p(L.id).length>0?(t(),l("div",Ot,[(t(true),l(I,null,Q(p(L.id),se=>(t(),l("div",{key:se.name,class:ee(["mw-item",{"has-override":j(se.configGroup||se.name,se.name)!==void 0}])},[e("div",Dt,[e("div",{class:ee(["mw-status",me(se)])},null,2),e("div",Pt,[e("span",zt,v(se.displayName),1),e("span",Ft,v(se.description||A[se.category]||se.category),1)]),a(ae,{"model-value":j(se.configGroup||se.name,se.name),"onUpdate:modelValue":Ee=>de(se.configGroup||se.name,se.name,Ee),placeholder:se.enabled?"全局: 启用":"全局: 禁用",clearable:"",size:"small",class:"mw-switch"},{default:w(()=>[a(Y,{label:"启用",value:true}),a(Y,{label:"禁用",value:false})]),_:1},8,["model-value","onUpdate:modelValue","placeholder"])])],2))),128))])):(t(),l(I,{key:1},[s(" 空状态 "),r[15]||(r[15]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),s(" 阶段间连接箭头 "),te<_.length-1?(t(),l("div",Lt,[r[16]||(r[16]=e("div",{class:"connector-line"},null,-1)),e("div",At,[a(F,{name:"chevron-down"})]),r[17]||(r[17]=e("div",{class:"connector-line"},null,-1))])):s("v-if",true)])),64))]),s(" 底部说明 "),r[19]||(r[19]=e("div",{class:"pipeline-footer"},[e("div",{class:"footer-item"},[e("span",{class:"dot active"}),e("span",null,"启用 - 中间件将在请求中执行")]),e("div",{class:"footer-item"},[e("span",{class:"dot"}),e("span",null,"禁用 - 中间件将被跳过")]),e("div",{class:"footer-item"},[e("span",{class:"dot override"}),e("span",null,"已覆盖 - 与全局配置不同")])],-1))],512),[[ke,D.value==="middlewares"]]),s(" 插件配置 "),ye(e("div",Et,[r[23]||(r[23]=e("div",{class:"section-header"},[e("h4",null,"插件配置覆盖"),e("p",null,"为此渠道单独配置插件参数")],-1)),e("div",Mt,[a(F,{name:"info-circle"}),r[20]||(r[20]=e("span",null,"留空使用全局配置,填写后将覆盖全局设置",-1))]),b.value.length>0?(t(),l("div",Nt,[(t(true),l(I,null,Q(b.value,L=>(t(),l("div",{key:L.id,class:ee(["plugin-override-card",{expanded:f.value.has(L.id)}])},[e("div",{class:"plugin-header",onClick:te=>q(L.id)},[e("div",Rt,[e("span",Bt,v(L.name),1),H(L.id)?(t(),l("span",Ht,"已覆盖")):s("v-if",true)]),e("div",Gt,[H(L.id)?(t(),ie(U,{key:0,size:"mini",onClick:ve(te=>J(L.id),["stop"])},{default:w(()=>[...r[21]||(r[21]=[M(" 清除 ",-1)])]),_:1},8,["onClick"])):s("v-if",true),a(F,{name:f.value.has(L.id)?"chevron-up":"chevron-down"},null,8,["name"])])],8,qt),ye(e("div",Jt,[(t(true),l(I,null,Q(L.configFields,te=>(t(),l(I,{key:te.key},[n(L,te)?(t(),l("div",jt,[e("label",Wt,v(te.label),1),e("div",Kt,[s(" Boolean 类型 "),te.type==="boolean"?(t(),ie(ae,{key:0,"model-value":V(L.id,te.key),"onUpdate:modelValue":se=>$(L.id,te.key,se),placeholder:"使用全局配置",clearable:""},{default:w(()=>[a(Y,{label:"是",value:true}),a(Y,{label:"否",value:false})]),_:1},8,["model-value","onUpdate:modelValue"])):te.type==="select"?(t(),l(I,{key:1},[s(" Select 类型 "),a(ae,{"model-value":V(L.id,te.key),"onUpdate:modelValue":se=>$(L.id,te.key,se),placeholder:`全局: ${L.config[te.key]??"未设置"}`,clearable:""},{default:w(()=>[(t(true),l(I,null,Q(te.options,se=>(t(),ie(Y,{key:String(se.value),label:se.label,value:se.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder"])],64)):te.type==="number"?(t(),l(I,{key:2},[s(" Number 类型 "),a(G,{"model-value":V(L.id,te.key),"onUpdate:modelValue":se=>$(L.id,te.key,se),placeholder:`全局: ${L.config[te.key]??""}`},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(t(),l(I,{key:3},[s(" Text/String 类型 (默认) "),a(le,{"model-value":V(L.id,te.key),"onUpdate:modelValue":se=>$(L.id,te.key,se),placeholder:`全局: ${L.config[te.key]??"未设置"}`,clearable:""},null,8,["model-value","onUpdate:modelValue","placeholder"])],64))]),te.description?(t(),l("div",Qt,v(te.description),1)):s("v-if",true)])):s("v-if",true)],64))),128))],512),[[ke,f.value.has(L.id)]])],2))),128))])):(t(),l("div",Xt,[a(F,{name:"apps"}),r[22]||(r[22]=e("span",null,"暂无可配置的插件",-1))]))],512),[[ke,D.value==="plugins"]])])])]),_:1},8,["modelValue","title"])}}}),el=ue(Zt,[["__scopeId","data-v-74bfe0c7"]]),tl={key:0},ll=ce({__name:"LoadingState",props:{text:{default:"加载中..."},icon:{default:"sync"},size:{default:"default"}},setup(d){const S=d,g=oe(()=>`size-${S.size}`);return(x,u)=>{const k=E("k-icon");return t(),l("div",{class:ee(["loading-state",g.value])},[a(k,{name:d.icon,class:"loading-icon"},null,8,["name"]),d.text?(t(),l("span",tl,v(d.text),1)):s("v-if",true)],2)}}}),sl=ue(ll,[["__scopeId","data-v-99cf565d"]]),al={class:"ml-view-container"},nl={class:"ml-view-header"},ol={class:"ml-header-left"},il={class:"ml-header-right"},dl={class:"ml-view-content"},rl={class:"ml-grid"},cl=["onClick"],ul={class:"card-header"},vl={class:"header-main"},ml={class:"channel-name"},pl={class:"header-meta"},gl={class:"connector-badge"},fl={key:0,class:"cost-badge"},_l={class:"card-body"},hl={key:0,class:"field-list"},yl={class:"field-label"},kl={class:"field-value"},bl={key:1,class:"tags-list"},$l={class:"ml-table-container"},wl={class:"ml-table"},Vl=["onClick"],Cl={class:"col-name"},xl={class:"name-text"},Il={class:"col-connector"},Sl={class:"connector-badge"},Ul={class:"col-tags"},Tl={class:"tags-wrapper"},Ol={key:0,class:"mini-tag more"},Dl={class:"col-cost"},Pl={key:0,class:"cost-value"},zl={class:"action-btns"},Fl=ce({__name:"ChannelsView",setup(d){const S=["text2img","img2img","NSFW"],g=y(false),x=y("card"),u=y([]),k=y([]),D=y([]),T=y({}),f=y(false),m=y(null),C=y([]),R=oe(()=>{const V=new Set;return u.value.forEach($=>{($.tags||[]).forEach(H=>V.add(H))}),Array.from(V).sort()}),P=oe(()=>C.value.length===0?u.value:u.value.filter(V=>C.value.every($=>(V.tags||[]).includes($)))),c=V=>{const $=k.value.find(H=>H.id===V);return $?$.name:V},h=V=>{var H;const $=k.value.find(J=>J.id===V.connectorId);return(H=$==null?void 0:$.cardFields)!=null&&H.length?$.cardFields.map(J=>{const q=$.fields.find(n=>n.key===J.key);return{key:J.key,label:J.label||(q==null?void 0:q.label)||J.key,format:J.format||"text"}}):[]},_=(V,$)=>{var J,q,n,o,z;const H=$.configGroup;switch($.source){case"channel":if(H){const Z=(q=(J=V.pluginOverrides)==null?void 0:J[H])==null?void 0:q[$.key];if(Z!==void 0)return Z}return V[$.key];case"connectorConfig":return(n=V.connectorConfig)==null?void 0:n[$.key];case"pluginOverride":return H?(z=(o=V.pluginOverrides)==null?void 0:o[H])==null?void 0:z[$.key]:void 0;default:return}},A=(V,$)=>{var n,o,z;const H=$.configGroup;if(!H)return $.suffix||"";const J=(o=(n=V.pluginOverrides)==null?void 0:n[H])==null?void 0:o.currencyLabel;if(J)return` ${J}${$.suffix||""}`;const q=(z=T.value[H])==null?void 0:z.currencyLabel;return q?` ${q}${$.suffix||""}`:` 积分${$.suffix||""}`},W=(V,$,H)=>{if(V==null||V==="")return"-";let J;switch($){case"password-mask":J="••••••";break;case"boolean":J=V?"是":"否";break;case"number":J=String(V);break;case"size":J=String(V);break;case"currency":J=V===0?"免费":String(V);break;default:J=String(V)}return H?`${J} ${H}`:J},X=async()=>{g.value=true;try{const[V,$,H]=await Promise.all([_e.list(),be.list(),$e.cardFields()]);u.value=V,k.value=$,D.value=H.fields,T.value=H.globalConfigs}catch{K.error("加载数据失败")}finally{g.value=false}},O=()=>{m.value=null,f.value=true},b=V=>{m.value=V,f.value=true},p=()=>{X()},j=async V=>{if(confirm(`确定要删除渠道 "${V.name}" 吗?`))try{await _e.delete(V.id),K.success("删除成功"),X()}catch{K.error("删除失败")}},de=async V=>{try{await _e.toggle(V.id,V.enabled)}catch{V.enabled=!V.enabled,K.error("操作失败")}},me=V=>{const $=JSON.parse(JSON.stringify(V));delete $.id,$.name=`${V.name} (副本)`,m.value=$,f.value=true};return pe(()=>{X()}),(V,$)=>{const H=E("k-icon"),J=E("k-button"),q=E("el-switch");return t(),l("div",al,[e("div",nl,[e("div",ol,[a(J,{solid:"",type:"primary",onClick:O},{icon:w(()=>[a(H,{name:"add"})]),default:w(()=>[$[7]||($[7]=M(" 新建渠道 ",-1))]),_:1}),a(Ie,{modelValue:C.value,"onUpdate:modelValue":$[0]||($[0]=n=>C.value=n),"all-tags":R.value,"preset-tags":S},null,8,["modelValue","all-tags"])]),e("div",il,[a(Le,{modelValue:x.value,"onUpdate:modelValue":$[1]||($[1]=n=>x.value=n)},null,8,["modelValue"])])]),e("div",dl,[g.value?(t(),ie(sl,{key:0})):x.value==="card"?(t(),l(I,{key:1},[s(" 卡片视图 "),e("div",rl,[(t(true),l(I,null,Q(P.value,n=>(t(),l("div",{key:n.id},[e("div",{class:"ml-card ml-card--clickable",onClick:o=>b(n)},[e("div",ul,[e("div",vl,[e("div",ml,v(n.name),1),a(q,{modelValue:n.enabled,"onUpdate:modelValue":o=>n.enabled=o,size:"small",onChange:o=>de(n),onClick:$[2]||($[2]=ve(()=>{},["stop"]))},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("div",pl,[e("span",gl,[a(H,{name:"link"}),M(" "+v(c(n.connectorId)),1)]),s(" 中间件字段(如费用)显示在标题旁 "),(t(true),l(I,null,Q(D.value,o=>(t(),l(I,{key:`mw-${o.key}`},[o.key==="cost"?(t(),l("span",fl,v(W(_(n,o),o.format,A(n,o))),1)):s("v-if",true)],64))),128))])]),e("div",_l,[s(" 配置字段列表 "),h(n).length?(t(),l("div",hl,[(t(true),l(I,null,Q(h(n),o=>(t(),l("div",{key:o.key,class:"field-item"},[e("span",yl,v(o.label),1),e("span",kl,v(W(n.connectorConfig[o.key],o.format)),1)]))),128))])):s("v-if",true),s(" 标签 "),n.tags&&n.tags.length?(t(),l("div",bl,[(t(true),l(I,null,Q(n.tags,o=>(t(),l("span",{key:o,class:"tag-pill"},v(o),1))),128))])):s("v-if",true)]),e("div",{class:"card-footer",onClick:$[3]||($[3]=ve(()=>{},["stop"]))},[a(J,{size:"mini",class:"ml-btn-outline-primary",onClick:o=>me(n)},{icon:w(()=>[a(H,{name:"copy"})]),default:w(()=>[$[8]||($[8]=M(" 复制 ",-1))]),_:1},8,["onClick"]),$[10]||($[10]=e("div",{class:"spacer"},null,-1)),a(J,{size:"mini",class:"ml-btn-outline-danger",onClick:o=>j(n)},{icon:w(()=>[a(H,{name:"delete"})]),default:w(()=>[$[9]||($[9]=M(" 删除 ",-1))]),_:1},8,["onClick"])])],8,cl)]))),128))])],2112)):(t(),l(I,{key:2},[s(" 列表视图 "),e("div",$l,[e("table",wl,[$[13]||($[13]=e("thead",null,[e("tr",null,[e("th",{class:"col-name"},"名称"),e("th",{class:"col-connector"},"连接器"),e("th",{class:"col-tags"},"标签"),e("th",{class:"col-cost"},"费用"),e("th",{class:"col-status"},"状态"),e("th",{class:"col-actions"},"操作")])],-1)),e("tbody",null,[(t(true),l(I,null,Q(P.value,n=>(t(),l("tr",{key:n.id,onClick:o=>b(n)},[e("td",Cl,[e("span",xl,v(n.name),1)]),e("td",Il,[e("span",Sl,v(c(n.connectorId)),1)]),e("td",Ul,[e("div",Tl,[(t(true),l(I,null,Q((n.tags||[]).slice(0,2),o=>(t(),l("span",{key:o,class:"mini-tag"},v(o),1))),128)),n.tags&&n.tags.length>2?(t(),l("span",Ol,"+"+v(n.tags.length-2),1)):s("v-if",true)])]),e("td",Dl,[(t(true),l(I,null,Q(D.value,o=>(t(),l(I,{key:`mw-${o.key}`},[o.key==="cost"?(t(),l("span",Pl,v(W(_(n,o),o.format,A(n,o))),1)):s("v-if",true)],64))),128))]),e("td",{class:"col-status",onClick:$[4]||($[4]=ve(()=>{},["stop"]))},[a(q,{modelValue:n.enabled,"onUpdate:modelValue":o=>n.enabled=o,size:"small",onChange:o=>de(n)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:$[5]||($[5]=ve(()=>{},["stop"]))},[e("div",zl,[a(J,{size:"mini",class:"ml-btn-outline-primary",onClick:o=>me(n)},{icon:w(()=>[a(H,{name:"copy"})]),default:w(()=>[$[11]||($[11]=M(" 复制 ",-1))]),_:1},8,["onClick"]),a(J,{size:"mini",class:"ml-btn-outline-danger",onClick:o=>j(n)},{icon:w(()=>[a(H,{name:"delete"})]),default:w(()=>[$[12]||($[12]=M(" 删除 ",-1))]),_:1},8,["onClick"])])])],8,Vl))),128))])])])],2112))]),s(" 编辑/创建对话框 "),a(el,{modelValue:f.value,"onUpdate:modelValue":$[6]||($[6]=n=>f.value=n),channel:m.value,onSaved:p},null,8,["modelValue","channel"])])}}}),Ll=ue(Fl,[["__scopeId","data-v-67a4b49d"]]),Al={class:"json-editor"},El={key:0,class:"error-msg"},Ml=ce({__name:"JsonEditor",props:{modelValue:{},rows:{}},emits:["update:modelValue"],setup(d,{emit:S}){const g=d,x=S,u=y(""),k=y("");ge(()=>g.modelValue,T=>{try{u.value=JSON.stringify(T,null,2)}catch{u.value=""}},{immediate:true});const D=()=>{try{const T=JSON.parse(u.value);k.value="",x("update:modelValue",T)}catch{k.value="Invalid JSON format"}};return(T,f)=>{const m=E("el-input");return t(),l("div",Al,[a(m,{modelValue:u.value,"onUpdate:modelValue":f[0]||(f[0]=C=>u.value=C),type:"textarea",rows:d.rows,class:"code-input",onBlur:D},null,8,["modelValue","rows"]),k.value?(t(),l("div",El,v(k.value),1)):s("v-if",true)])}}}),Nl=ue(Ml,[["__scopeId","data-v-4d47b7db"]]),ql={class:"image-upload"},Rl={key:0,class:"image-list"},Bl={class:"image-preview"},Hl=["src","alt"],Gl={class:"image-overlay"},Jl={class:"image-name"},jl={class:"upload-content"},Wl={key:1,class:"upload-loading"},Kl=ce({__name:"ImageUpload",props:{modelValue:{},maxCount:{}},emits:["update:modelValue"],setup(d,{emit:S}){const g=d,x=S,u=y(),k=y(false),D=y([]),T=async()=>{var _;const h=[];for(const A of g.modelValue)A&&h.push({url:A,filename:((_=A.split("/").pop())==null?void 0:_.split("?")[0])||"image",mime:"image/png",previewUrl:A});D.value=h};ge(()=>g.modelValue,()=>{T()},{immediate:true});const f=()=>{var h;(h=u.value)==null||h.click()},m=async h=>{const _=h.target;!_.files||_.files.length===0||(await R(Array.from(_.files)),_.value="")},C=async h=>{var A;const _=(A=h.dataTransfer)==null?void 0:A.files;!_||_.length===0||await R(Array.from(_).filter(W=>W.type.startsWith("image/")))},R=async h=>{if(h.length===0)return;const _=g.maxCount||10;D.value.length+h.length>_&&(K.warning(`最多上传 ${_} 张图片`),h=h.slice(0,_-D.value.length)),k.value=true;try{for(const A of h){const W=await P(A),X=await We.upload(W,A.type,A.name);if(!X.url){K.error("缓存服务未配置 selfUrl,无法获取图片 URL");continue}D.value.push({url:X.url,filename:X.filename,mime:X.mime,previewUrl:X.url})}x("update:modelValue",D.value.map(A=>A.url))}catch(A){K.error("上传失败"),console.error(A)}finally{k.value=false}},P=h=>new Promise((_,A)=>{const W=new FileReader;W.onload=()=>{const O=W.result.split(",")[1];_(O)},W.onerror=A,W.readAsDataURL(h)}),c=h=>{D.value.splice(h,1),x("update:modelValue",D.value.map(_=>_.url))};return pe(()=>{T()}),(h,_)=>{const A=E("k-icon"),W=E("k-button");return t(),l("div",ql,[s(" 已上传的图片列表 "),D.value.length>0?(t(),l("div",Rl,[(t(true),l(I,null,Q(D.value,(X,O)=>(t(),l("div",{key:X.url||O,class:"image-item"},[e("div",Bl,[e("img",{src:X.previewUrl,alt:X.filename},null,8,Hl),e("div",Gl,[a(W,{size:"mini",class:"remove-btn",onClick:b=>c(O)},{icon:w(()=>[a(A,{name:"delete"})]),_:1},8,["onClick"])])]),e("div",Jl,v(X.filename),1)]))),128))])):s("v-if",true),s(" 上传按钮 "),e("div",{class:"upload-area",onClick:f,onDragover:_[0]||(_[0]=ve(()=>{},["prevent"])),onDrop:ve(C,["prevent"])},[e("input",{ref_key:"fileInput",ref:u,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:m},null,544),e("div",jl,[a(A,{name:"add",class:"upload-icon"}),_[1]||(_[1]=e("span",{class:"upload-text"},"点击或拖拽上传图片",-1))])],32),s(" 加载状态 "),k.value?(t(),l("div",Wl,[a(A,{name:"sync",class:"loading-icon"}),_[2]||(_[2]=M(" 上传中... ",-1))])):s("v-if",true)])}}}),Pe=ue(Kl,[["__scopeId","data-v-47f2485e"]]),Ql={class:"ml-view-container"},Xl={class:"ml-view-header"},Yl={class:"ml-header-left"},Zl={class:"ml-header-right"},es={class:"ml-view-content"},ts={key:0,class:"loading-state"},ls={class:"ml-masonry"},ss=["onClick"],as={key:0,class:"card-thumbnail"},ns=["src","alt"],os={class:"thumbnail-overlay"},is={key:0,class:"ref-count"},ds={key:1,class:"card-thumbnail placeholder"},rs={class:"card-content"},cs={class:"card-title"},us={key:0,class:"card-tags"},vs={key:0,class:"mini-tag more"},ms={class:"ml-table-container"},ps={class:"ml-table"},gs=["onClick"],fs={class:"col-thumb"},_s={class:"thumb-wrapper"},hs=["src","alt"],ys={key:1,class:"thumb-placeholder"},ks={class:"col-name"},bs={class:"name-text"},$s={class:"col-template"},ws={class:"template-preview"},Vs={class:"col-refs"},Cs={key:0,class:"ref-badge"},xs={key:1,class:"no-data"},Is={class:"col-source"},Ss={class:"action-btns"},Us={class:"dialog-footer"},Ts=ce({__name:"PresetsView",setup(d){const S=["本地","远程","text2img","img2img","NSFW"],g=y(false),x=y([]),u=y(false),k=y(false),D=y([]),T=y("card"),f=oe(()=>{const b=new Set;return x.value.forEach(p=>{(p.tags||[]).forEach(j=>b.add(j))}),Array.from(b).sort()}),m=y({name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"}),C=y([]);ge(()=>m.value.thumbnail,b=>{C.value=b?[b]:[]},{immediate:true}),ge(C,b=>{m.value.thumbnail=b.length>0?b[0]:""});const R=oe(()=>D.value.length===0?x.value:x.value.filter(b=>D.value.every(p=>p==="本地"?b.source==="user":p==="远程"?b.source==="api":(b.tags||[]).includes(p)))),P=async()=>{g.value=true;try{x.value=await fe.list()}catch{K.error("加载数据失败")}finally{g.value=false}},c=()=>{k.value=false,m.value={name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"},u.value=true},h=b=>{k.value=true,m.value=JSON.parse(JSON.stringify(b)),u.value=true},_=b=>{k.value=false;const p=JSON.parse(JSON.stringify(b));delete p.id,p.name=`${b.name} (副本)`,p.source="user",m.value=p,u.value=true},A=async b=>{try{await fe.toggle(b.id,b.enabled)}catch{b.enabled=!b.enabled,K.error("操作失败")}},W=(b,p=50)=>{if(!b)return"-";const j=b.replace(/\s+/g," ").trim();return j.length<=p?j:j.slice(0,p)+"..."},X=async()=>{if(!m.value.name||!m.value.promptTemplate){K.warning("请填写必要信息");return}try{k.value&&m.value.id?(await fe.update(m.value.id,m.value),K.success("更新成功")):(await fe.create(m.value),K.success("创建成功")),u.value=false,P()}catch{K.error("操作失败")}},O=async b=>{if(confirm(`确定要删除预设 "${b.name}" 吗?`))try{await fe.delete(b.id),K.success("删除成功"),P()}catch{K.error("删除失败")}};return pe(()=>{P()}),(b,p)=>{const j=E("k-icon"),de=E("k-button"),me=E("el-switch"),V=E("el-input"),$=E("el-form-item"),H=E("el-divider"),J=E("el-form"),q=E("el-dialog");return t(),l("div",Ql,[e("div",Xl,[e("div",Yl,[a(de,{solid:"",type:"primary",onClick:c},{icon:w(()=>[a(j,{name:"add"})]),default:w(()=>[p[14]||(p[14]=M(" 新建预设 ",-1))]),_:1}),a(Ie,{modelValue:D.value,"onUpdate:modelValue":p[0]||(p[0]=n=>D.value=n),"all-tags":f.value,"preset-tags":S},null,8,["modelValue","all-tags"])]),e("div",Zl,[a(Le,{modelValue:T.value,"onUpdate:modelValue":p[1]||(p[1]=n=>T.value=n)},null,8,["modelValue"])])]),e("div",es,[g.value?(t(),l("div",ts,[a(j,{name:"sync",class:"ml-spin"}),p[15]||(p[15]=M(" 加载中... ",-1))])):T.value==="card"?(t(),l(I,{key:1},[s(" 卡片视图 (瀑布流) "),e("div",ls,[(t(true),l(I,null,Q(R.value,n=>{var o,z;return t(),l("div",{key:n.id,class:"ml-masonry-item"},[e("div",{class:"preset-card",onClick:Z=>h(n)},[s(" 缩略图 "),n.thumbnail?(t(),l("div",as,[e("img",{src:n.thumbnail,alt:n.name,loading:"lazy"},null,8,ns),e("div",os,[(o=n.referenceImages)!=null&&o.length?(t(),l("span",is,[a(j,{name:"image"}),M(" "+v(n.referenceImages.length),1)])):s("v-if",true)])])):(t(),l("div",ds,[a(j,{name:"image",class:"placeholder-icon"})])),s(" 内容 "),e("div",rs,[e("div",cs,v(n.name),1),(z=n.tags)!=null&&z.length?(t(),l("div",us,[(t(true),l(I,null,Q(n.tags.slice(0,4),Z=>(t(),l("span",{key:Z,class:"mini-tag"},v(Z),1))),128)),n.tags.length>4?(t(),l("span",vs,"+"+v(n.tags.length-4),1)):s("v-if",true)])):s("v-if",true)]),s(" 操作按钮 "),e("div",{class:"card-actions",onClick:p[2]||(p[2]=ve(()=>{},["stop"]))},[a(me,{modelValue:n.enabled,"onUpdate:modelValue":Z=>n.enabled=Z,size:"small",onChange:Z=>A(n)},null,8,["modelValue","onUpdate:modelValue","onChange"]),a(de,{size:"mini",class:"ml-btn-outline-primary",onClick:Z=>_(n)},{icon:w(()=>[a(j,{name:"copy"})]),default:w(()=>[p[16]||(p[16]=M(" 复制 ",-1))]),_:1},8,["onClick"]),n.source==="user"?(t(),ie(de,{key:0,size:"mini",class:"ml-btn-outline-danger",onClick:Z=>O(n)},{icon:w(()=>[a(j,{name:"delete"})]),default:w(()=>[p[17]||(p[17]=M(" 删除 ",-1))]),_:1},8,["onClick"])):s("v-if",true)]),s(" 来源标记 "),e("div",{class:ee(["source-indicator",n.source])},v(n.source==="api"?"远程":"本地"),3)],8,ss)])}),128))])],2112)):(t(),l(I,{key:2},[s(" 列表视图 "),e("div",ms,[e("table",ps,[p[20]||(p[20]=e("thead",null,[e("tr",null,[e("th",{class:"col-thumb"},"缩略图"),e("th",{class:"col-name"},"名称"),e("th",{class:"col-template"},"Prompt 模板"),e("th",{class:"col-refs"},"参考图"),e("th",{class:"col-source"},"来源"),e("th",{class:"col-status"},"状态"),e("th",{class:"col-actions"},"操作")])],-1)),e("tbody",null,[(t(true),l(I,null,Q(R.value,n=>{var o;return t(),l("tr",{key:n.id,onClick:z=>h(n)},[e("td",fs,[e("div",_s,[n.thumbnail?(t(),l("img",{key:0,src:n.thumbnail,alt:n.name},null,8,hs)):(t(),l("div",ys,[a(j,{name:"image"})]))])]),e("td",ks,[e("span",bs,v(n.name),1)]),e("td",$s,[e("span",ws,v(W(n.promptTemplate)),1)]),e("td",Vs,[(o=n.referenceImages)!=null&&o.length?(t(),l("span",Cs,[a(j,{name:"image"}),M(" "+v(n.referenceImages.length),1)])):(t(),l("span",xs,"-"))]),e("td",Is,[e("span",{class:ee(["source-badge",n.source])},v(n.source==="api"?"远程":"本地"),3)]),e("td",{class:"col-status",onClick:p[3]||(p[3]=ve(()=>{},["stop"]))},[a(me,{modelValue:n.enabled,"onUpdate:modelValue":z=>n.enabled=z,size:"small",onChange:z=>A(n)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:p[4]||(p[4]=ve(()=>{},["stop"]))},[e("div",Ss,[a(de,{size:"mini",class:"ml-btn-outline-primary",onClick:z=>_(n)},{icon:w(()=>[a(j,{name:"copy"})]),default:w(()=>[p[18]||(p[18]=M(" 复制 ",-1))]),_:1},8,["onClick"]),n.source==="user"?(t(),ie(de,{key:0,size:"mini",class:"ml-btn-outline-danger",onClick:z=>O(n)},{icon:w(()=>[a(j,{name:"delete"})]),default:w(()=>[p[19]||(p[19]=M(" 删除 ",-1))]),_:1},8,["onClick"])):s("v-if",true)])])],8,gs)}),128))])])])],2112))]),s(" 编辑/创建对话框 "),a(q,{modelValue:u.value,"onUpdate:modelValue":p[13]||(p[13]=n=>u.value=n),title:k.value?"编辑预设":"创建预设",width:"600px","close-on-click-modal":false},{footer:w(()=>[e("span",Us,[a(de,{onClick:p[12]||(p[12]=n=>u.value=false)},{default:w(()=>[...p[27]||(p[27]=[M("取消",-1)])]),_:1}),a(de,{type:"primary",onClick:X},{default:w(()=>[...p[28]||(p[28]=[M("保存",-1)])]),_:1})])]),default:w(()=>[u.value?(t(),ie(J,{key:0,ref:"formRef",model:m.value,"label-width":"100px"},{default:w(()=>[a($,{label:"名称",required:""},{default:w(()=>[a(V,{modelValue:m.value.name,"onUpdate:modelValue":p[5]||(p[5]=n=>m.value.name=n),disabled:k.value&&m.value.source==="api",placeholder:"如 二次元少女"},null,8,["modelValue","disabled"]),p[21]||(p[21]=e("div",{class:"form-tip"},"用于指令调用和展示,冲突时会自动添加后缀",-1))]),_:1}),a($,{label:"Prompt 模板",required:""},{default:w(()=>[a(V,{modelValue:m.value.promptTemplate,"onUpdate:modelValue":p[6]||(p[6]=n=>m.value.promptTemplate=n),type:"textarea",rows:4,placeholder:"输入提示词模板,支持变量如 {prompt}"},null,8,["modelValue"]),p[22]||(p[22]=e("div",{class:"form-tip"},"默认将用户输入附加在最后,也可使用 {prompt} 指定位置",-1))]),_:1}),m.value.source==="user"?(t(),ie($,{key:0,label:"缩略图"},{default:w(()=>[a(Pe,{modelValue:C.value,"onUpdate:modelValue":p[7]||(p[7]=n=>C.value=n),"max-count":1},null,8,["modelValue"]),p[23]||(p[23]=e("div",{class:"form-tip"},"用于在卡片视图中展示预设的预览图",-1))]),_:1})):s("v-if",true),a($,{label:"参考图"},{default:w(()=>[a(Pe,{modelValue:m.value.referenceImages,"onUpdate:modelValue":p[8]||(p[8]=n=>m.value.referenceImages=n),"max-count":5},null,8,["modelValue"]),p[24]||(p[24]=e("div",{class:"form-tip"},"生成时会自动附加这些参考图片",-1))]),_:1}),a(H,{"content-position":"left"},{default:w(()=>[...p[25]||(p[25]=[M("高级设置",-1)])]),_:1}),a($,{label:"标签"},{default:w(()=>[a(Ae,{modelValue:m.value.tags,"onUpdate:modelValue":p[9]||(p[9]=n=>m.value.tags=n),placeholder:"输入标签..."},null,8,["modelValue"]),p[26]||(p[26]=e("div",{class:"form-tip"},"与渠道标签匹配时会自动关联",-1))]),_:1}),a($,{label:"参数覆盖"},{default:w(()=>[a(Nl,{modelValue:m.value.parameterOverrides,"onUpdate:modelValue":p[10]||(p[10]=n=>m.value.parameterOverrides=n),rows:3},null,8,["modelValue"])]),_:1}),a($,{label:"启用状态"},{default:w(()=>[a(me,{modelValue:m.value.enabled,"onUpdate:modelValue":p[11]||(p[11]=n=>m.value.enabled=n)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])):s("v-if",true)]),_:1},8,["modelValue","title"])])}}}),Os=ue(Ts,[["__scopeId","data-v-8eaa50b4"]]),Ds=ce({__name:"StatusBadge",props:{status:{}},setup(d){const S=d,g=oe(()=>{switch(S.status){case"pending":return"等待中";case"processing":return"处理中";case"success":return"成功";case"failed":return"失败";default:return S.status}});return(x,u)=>(t(),l("span",{class:ee(["status-badge",d.status])},v(g.value),3))}}),ze=ue(Ds,[["__scopeId","data-v-0bc21896"]]),Ps={class:"lightbox-container"},zs={class:"lightbox-content"},Fs=["src"],Ls={key:2,class:"image-counter"},As={key:0,class:"lightbox-sidebar"},Es={class:"sidebar-header"},Ms={class:"sidebar-body"},Ns={class:"info-block"},qs={class:"block-header"},Rs={key:0,class:"info-block"},Bs={class:"info-value"},Hs={key:1,class:"info-block"},Gs={class:"info-value"},Js={class:"sidebar-footer"},js=ce({__name:"ImageLightbox",props:{visible:{type:Boolean},images:{},initialIndex:{default:0},prompt:{},createdAt:{},duration:{},showSidebar:{type:Boolean,default:true}},emits:["update:visible","close"],setup(d,{emit:S}){const g=d,x=S,u=y(g.initialIndex),k=oe(()=>g.images[u.value]||"");ge(()=>g.visible,_=>{_?(u.value=g.initialIndex,document.body.style.overflow="hidden"):document.body.style.overflow=""}),ge(()=>g.initialIndex,_=>{u.value=_});const D=()=>{x("update:visible",false),x("close")},T=()=>{u.value=(u.value-1+g.images.length)%g.images.length},f=()=>{u.value=(u.value+1)%g.images.length},m=()=>{g.prompt&&(navigator.clipboard.writeText(g.prompt),K.success("已复制提示词"))},C=()=>{window.open(k.value,"_blank")},R=()=>{const _=document.createElement("a");_.href=k.value,_.download=`image-${Date.now()}.png`,_.click()},P=_=>(typeof _=="string"?new Date(_):_).toLocaleString(),c=_=>_<1e3?`${_}ms`:`${(_/1e3).toFixed(1)}s`,h=_=>{g.visible&&(_.key==="Escape"?D():_.key==="ArrowLeft"?T():_.key==="ArrowRight"&&f())};return pe(()=>{window.addEventListener("keydown",h)}),xe(()=>{window.removeEventListener("keydown",h),document.body.style.overflow=""}),(_,A)=>{const W=E("k-icon");return t(),ie(Ne,{to:"body"},[a(qe,{name:"lightbox-fade"},{default:w(()=>[d.visible?(t(),l("div",{key:0,class:"lightbox-overlay",onClick:ve(D,["self"])},[e("div",Ps,[e("div",zs,[s(" 左侧图片区域 "),e("div",{class:"lightbox-image-area",onClick:ve(D,["self"])},[s(" 关闭按钮 "),e("button",{class:"close-btn",onClick:D,title:"关闭 (Esc)"},[a(W,{name:"times"})]),s(" 多图时的导航 "),d.images.length>1?(t(),l("button",{key:0,class:"nav-btn prev",onClick:ve(T,["stop"]),title:"上一张"},[a(W,{name:"chevron-left"})])):s("v-if",true),e("img",{src:k.value,class:"lightbox-image",alt:"Preview"},null,8,Fs),d.images.length>1?(t(),l("button",{key:1,class:"nav-btn next",onClick:ve(f,["stop"]),title:"下一张"},[a(W,{name:"chevron-right"})])):s("v-if",true),s(" 图片计数器 "),d.images.length>1?(t(),l("div",Ls,v(u.value+1)+" / "+v(d.images.length),1)):s("v-if",true)]),s(" 右侧信息栏 "),d.showSidebar?(t(),l("div",As,[e("div",Es,[A[0]||(A[0]=e("div",{class:"info-title"},"图片详情",-1)),e("button",{class:"header-close-btn",onClick:D,title:"关闭"},[a(W,{name:"times"})])]),e("div",Ms,[s(" 提示词 "),e("div",Ns,[e("div",qs,[A[1]||(A[1]=e("span",null,"提示词",-1)),d.prompt?(t(),l("button",{key:0,class:"copy-btn",onClick:m}," 复制 ")):s("v-if",true)]),e("div",{class:ee(["prompt-content",{empty:!d.prompt}])},v(d.prompt||"无提示词"),3)]),s(" 创建时间 "),d.createdAt?(t(),l("div",Rs,[A[2]||(A[2]=e("div",{class:"block-header"},[e("span",null,"创建时间")],-1)),e("div",Bs,v(P(d.createdAt)),1)])):s("v-if",true),s(" 生成耗时 "),d.duration?(t(),l("div",Hs,[A[3]||(A[3]=e("div",{class:"block-header"},[e("span",null,"生成耗时")],-1)),e("div",Gs,v(c(d.duration)),1)])):s("v-if",true)]),e("div",Js,[e("button",{class:"action-btn primary",onClick:C},[a(W,{name:"external-link"}),A[4]||(A[4]=M(" 查看原图 ",-1))]),e("button",{class:"action-btn secondary",onClick:R},[a(W,{name:"download"}),A[5]||(A[5]=M(" 下载 ",-1))])])])):s("v-if",true)])])])):s("v-if",true)]),_:1})])}}}),Ue=ue(js,[["__scopeId","data-v-bd68872f"]]),Ws={class:"ml-view-container"},Ks={class:"ml-view-header"},Qs={class:"ml-header-left"},Xs={class:"view-mode-switch"},Ys={class:"ml-header-right"},Zs={key:0,class:"stats-grid"},ea={class:"stat-card"},ta={class:"stat-icon total"},la={class:"stat-content"},sa={class:"stat-value"},aa={class:"stat-card"},na={class:"stat-icon success"},oa={class:"stat-content"},ia={class:"stat-value success"},da={class:"stat-card"},ra={class:"stat-icon failed"},ca={class:"stat-content"},ua={class:"stat-value failed"},va={class:"stat-card"},ma={class:"stat-icon processing"},pa={class:"stat-content"},ga={class:"stat-value pending"},fa={class:"stat-card"},_a={class:"stat-icon rate"},ha={class:"stat-content"},ya={class:"stat-value"},ka={class:"filter-bar"},ba={class:"filter-group"},$a={key:0,class:"pagination-info"},wa={class:"ml-view-content"},Va={class:"mono-text"},Ca=["title"],xa={key:0},Ia={key:1,class:"text-muted"},Sa={key:0},Ua={key:1},Ta={class:"time-text"},Oa={key:0,class:"empty-gallery"},Da={key:1,class:"ml-masonry"},Pa=["onClick"],za={class:"gallery-image-wrapper"},Fa=["src"],La=["src"],Aa={class:"gallery-overlay"},Ea={class:"gallery-info"},Ma=["title"],Na={class:"gallery-meta"},qa={class:"gallery-time"},Ra={class:"pagination"},Ba={key:0,class:"task-detail"},Ha={class:"detail-section"},Ga={class:"detail-grid"},Ja={class:"detail-item"},ja={class:"detail-item"},Wa={class:"detail-item"},Ka={class:"detail-item"},Qa={class:"detail-item"},Xa={class:"detail-item"},Ya={class:"detail-section"},Za={class:"code-block"},en={key:0,class:"detail-section"},tn={class:"output-gallery"},ln=["src"],sn=["src"],an=["src"],nn={key:3,class:"text-asset"},on=["href"],dn={key:1,class:"detail-section"},rn={class:"code-block error"},cn={class:"cleanup-form"},un={class:"dialog-footer"},vn=ce({__name:"TasksView",setup(d){const S=y("list"),g=y(false),x=y([]),u=y(null),k=y(0),D=y(1),T=y(20),f=y({status:"",userId:void 0,channelId:void 0}),m=y(false),C=y(null);y(false);const R=y(null),P=y(false),c=y([]),h=y(0),_=y(""),A=y(),W=y(),X=y(false),O=y(30),b=n=>{var o,z,Z;return((z=(o=n.middlewareLogs)==null?void 0:o.preset)==null?void 0:z.transformedPrompt)||((Z=n.requestSnapshot)==null?void 0:Z.prompt)||""},p=oe(()=>{var o,z,Z;const n=[];for(const B of x.value){if(B.status!=="success"||!B.responseSnapshot)continue;const i=((z=(o=B.middlewareLogs)==null?void 0:o.preset)==null?void 0:z.transformedPrompt)||((Z=B.requestSnapshot)==null?void 0:Z.prompt)||"";B.responseSnapshot.forEach((r,F)=>{(r.kind==="image"||r.kind==="video")&&r.url&&n.push({id:B.id,assetIndex:F,kind:r.kind,url:r.url,prompt:i,channelId:B.channelId,createdAt:B.startTime})})}return n}),j=async()=>{g.value=true;try{const n={limit:T.value,offset:(D.value-1)*T.value};f.value.status&&(n.status=f.value.status),f.value.userId&&(n.userId=Number(f.value.userId)),f.value.channelId&&(n.channelId=Number(f.value.channelId));const[o,z]=await Promise.all([he.list(n),he.stats()]);x.value=o.items,k.value=o.total,u.value=z}catch(n){console.error("Failed to fetch tasks:",n),K.error("加载数据失败")}finally{g.value=false}},de=n=>{C.value=n,m.value=true},me=n=>{c.value=[n.url],h.value=0,_.value=n.prompt,A.value=n.createdAt,W.value=void 0,P.value=true,R.value=n},V=()=>{X.value=true},$=async()=>{try{const n=await he.cleanup(O.value);K.success(`成功清理 ${n.deleted} 条任务`),X.value=false,j()}catch{K.error("清理失败")}},H=n=>new Date(n).toLocaleString(),J=n=>n<1e3?`${n}ms`:`${(n/1e3).toFixed(2)}s`,q=n=>{const o=n.target;o.style.display="none"};return pe(()=>{j()}),(n,o)=>{const z=E("k-icon"),Z=E("k-button"),B=E("el-option"),i=E("el-select"),r=E("el-input"),F=E("el-table-column"),le=E("el-table"),Y=E("el-pagination"),ae=E("el-dialog"),re=E("el-input-number");return t(),l("div",Ws,[s(" 固定头部区域 "),e("div",Ks,[e("div",Qs,[s(" 视图切换 "),e("div",Xs,[e("button",{class:ee(["mode-btn",{active:S.value==="list"}]),onClick:o[0]||(o[0]=U=>S.value="list"),title:"列表视图"},[...o[14]||(o[14]=[e("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},[e("rect",{x:"3",y:"4",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"10.5",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"17",width:"18",height:"3",rx:"1"})],-1)])],2),e("button",{class:ee(["mode-btn",{active:S.value==="gallery"}]),onClick:o[1]||(o[1]=U=>S.value="gallery"),title:"画廊视图"},[...o[15]||(o[15]=[Ce('<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" data-v-898a70bb><rect x="3" y="3" width="8" height="8" rx="1" data-v-898a70bb></rect><rect x="13" y="3" width="8" height="8" rx="1" data-v-898a70bb></rect><rect x="3" y="13" width="8" height="8" rx="1" data-v-898a70bb></rect><rect x="13" y="13" width="8" height="8" rx="1" data-v-898a70bb></rect></svg>',1)])],2)])]),e("div",Ys,[a(Z,{onClick:V},{icon:w(()=>[a(z,{name:"delete"})]),default:w(()=>[o[16]||(o[16]=M(" 清理记录 ",-1))]),_:1}),a(Z,{onClick:j},{icon:w(()=>[a(z,{name:"refresh"})]),default:w(()=>[o[17]||(o[17]=M(" 刷新 ",-1))]),_:1})])]),s(" 统计信息 (固定) "),u.value?(t(),l("div",Zs,[e("div",ea,[e("div",ta,[a(z,{name:"clipboard-list"})]),e("div",la,[e("div",sa,v(u.value.total),1),o[18]||(o[18]=e("div",{class:"stat-label"},"总任务数",-1))])]),e("div",aa,[e("div",na,[a(z,{name:"check-circle"})]),e("div",oa,[e("div",ia,v(u.value.byStatus.success),1),o[19]||(o[19]=e("div",{class:"stat-label"},"成功",-1))])]),e("div",da,[e("div",ra,[a(z,{name:"exclamation-triangle"})]),e("div",ca,[e("div",ua,v(u.value.byStatus.failed),1),o[20]||(o[20]=e("div",{class:"stat-label"},"失败",-1))])]),e("div",va,[e("div",ma,[a(z,{name:"clock"})]),e("div",pa,[e("div",ga,v(u.value.byStatus.pending+u.value.byStatus.processing),1),o[21]||(o[21]=e("div",{class:"stat-label"},"进行中",-1))])]),e("div",fa,[e("div",_a,[a(z,{name:"chart-pie"})]),e("div",ha,[e("div",ya,v(u.value.successRate),1),o[22]||(o[22]=e("div",{class:"stat-label"},"成功率",-1))])])])):s("v-if",true),s(" 筛选栏 (固定) "),e("div",ka,[e("div",ba,[a(i,{modelValue:f.value.status,"onUpdate:modelValue":o[2]||(o[2]=U=>f.value.status=U),placeholder:"所有状态",clearable:"",onChange:j,style:{width:"140px"}},{default:w(()=>[a(B,{label:"等待中",value:"pending"}),a(B,{label:"处理中",value:"processing"}),a(B,{label:"成功",value:"success"}),a(B,{label:"失败",value:"failed"})]),_:1},8,["modelValue"]),a(r,{modelValue:f.value.channelId,"onUpdate:modelValue":o[3]||(o[3]=U=>f.value.channelId=U),placeholder:"渠道 ID",clearable:"",onChange:j,style:{width:"140px"}},null,8,["modelValue"]),a(r,{modelValue:f.value.userId,"onUpdate:modelValue":o[4]||(o[4]=U=>f.value.userId=U),placeholder:"用户 ID",clearable:"",onChange:j,style:{width:"140px"}},null,8,["modelValue"])]),k.value>0?(t(),l("div",$a," 共 "+v(k.value)+" 条记录 ",1)):s("v-if",true)]),s(" 可滚动的内容区域 "),e("div",wa,[s(" 列表视图 "),S.value==="list"?(t(),ie(le,{key:0,data:x.value,style:{width:"100%"},class:"task-table",onRowClick:de},{default:w(()=>[a(F,{prop:"id",label:"ID",width:"80",align:"center"},{default:w(({row:U})=>[e("span",Va,"#"+v(U.id),1)]),_:1}),a(F,{label:"状态",width:"100",align:"center"},{default:w(({row:U})=>[a(ze,{status:U.status},null,8,["status"])]),_:1}),a(F,{prop:"channelId",label:"渠道",width:"100",align:"center"}),a(F,{label:"提示词","min-width":"300"},{default:w(({row:U})=>[e("div",{class:"prompt-cell",title:b(U)},v(b(U)),9,Ca)]),_:1}),a(F,{label:"输出",width:"120",align:"center"},{default:w(({row:U})=>[U.responseSnapshot&&U.responseSnapshot.length?(t(),l("span",xa,v(U.responseSnapshot.length)+" 个资产 ",1)):(t(),l("span",Ia,"-"))]),_:1}),a(F,{label:"耗时",width:"100",align:"right"},{default:w(({row:U})=>[U.duration?(t(),l("span",Sa,v(J(U.duration)),1)):(t(),l("span",Ua,"-"))]),_:1}),a(F,{label:"时间",width:"180",align:"right"},{default:w(({row:U})=>[e("span",Ta,v(H(U.startTime)),1)]),_:1})]),_:1},8,["data"])):S.value==="gallery"?(t(),l(I,{key:1},[s(" 画廊视图 (瀑布流) "),p.value.length===0?(t(),l("div",Oa,[a(z,{name:"image",class:"empty-icon"}),o[23]||(o[23]=e("p",null,"暂无成功生成的图片",-1))])):(t(),l("div",Da,[(t(true),l(I,null,Q(p.value,U=>(t(),l("div",{key:U.id+"-"+U.assetIndex,class:"ml-masonry-item"},[e("div",{class:"gallery-item",onClick:G=>me(U)},[e("div",za,[U.kind==="image"?(t(),l("img",{key:0,src:U.url,class:"gallery-image",loading:"lazy",onError:q},null,40,Fa)):U.kind==="video"?(t(),l("video",{key:1,src:U.url,class:"gallery-video",muted:"",loop:"",onMouseenter:o[5]||(o[5]=G=>G.target.play()),onMouseleave:o[6]||(o[6]=G=>G.target.pause())},null,40,La)):s("v-if",true),e("div",Aa,[a(z,{name:"zoom-in",class:"zoom-icon"})])]),e("div",Ea,[e("div",{class:"gallery-prompt",title:U.prompt},v(U.prompt),9,Ma),e("div",Na,[e("span",qa,v(H(U.createdAt)),1)])])],8,Pa)]))),128))]))],64)):s("v-if",true)]),s(" 分页 (固定在底部) "),e("div",Ra,[a(Y,{"current-page":D.value,"onUpdate:currentPage":o[7]||(o[7]=U=>D.value=U),"page-size":T.value,"onUpdate:pageSize":o[8]||(o[8]=U=>T.value=U),total:k.value,"page-sizes":[20,50,100],layout:"total, sizes, prev, pager, next",onCurrentChange:j,onSizeChange:j},null,8,["current-page","page-size","total"])]),s(" 任务详情对话框 "),a(ae,{modelValue:m.value,"onUpdate:modelValue":o[9]||(o[9]=U=>m.value=U),title:"任务详情",width:"800px"},{default:w(()=>{var U,G;return[C.value?(t(),l("div",Ba,[e("div",Ha,[o[31]||(o[31]=e("h3",null,"基本信息",-1)),e("div",Ga,[e("div",Ja,[o[24]||(o[24]=e("span",{class:"label"},"ID:",-1)),M(" "+v(C.value.id),1)]),e("div",ja,[o[25]||(o[25]=e("span",{class:"label"},"状态:",-1)),o[26]||(o[26]=M()),a(ze,{status:C.value.status},null,8,["status"])]),e("div",Wa,[o[27]||(o[27]=e("span",{class:"label"},"渠道 ID:",-1)),M(" "+v(C.value.channelId),1)]),e("div",Ka,[o[28]||(o[28]=e("span",{class:"label"},"用户 ID:",-1)),M(" "+v(C.value.userId||"N/A"),1)]),e("div",Qa,[o[29]||(o[29]=e("span",{class:"label"},"创建时间:",-1)),M(" "+v(H(C.value.startTime)),1)]),e("div",Xa,[o[30]||(o[30]=e("span",{class:"label"},"耗时:",-1)),M(" "+v(J(C.value.duration||0)),1)])])]),e("div",Ya,[o[32]||(o[32]=e("h3",null,"Prompt",-1)),e("div",Za,v(b(C.value)),1)]),C.value.responseSnapshot&&C.value.responseSnapshot.length>0?(t(),l("div",en,[e("h3",null,"生成结果 ("+v(C.value.responseSnapshot.length)+" 个资产)",1),e("div",tn,[(t(true),l(I,null,Q(C.value.responseSnapshot,(ne,L)=>{var te;return t(),l("div",{key:L,class:"output-item"},[ne.kind==="image"&&ne.url?(t(),l("img",{key:0,src:ne.url,class:"output-image"},null,8,ln)):ne.kind==="video"&&ne.url?(t(),l("video",{key:1,src:ne.url,class:"output-image",controls:""},null,8,sn)):ne.kind==="audio"&&ne.url?(t(),l("audio",{key:2,src:ne.url,controls:"",style:{width:"100%"}},null,8,an)):ne.kind==="text"&&ne.content?(t(),l("div",nn,v(ne.content),1)):ne.url?(t(),l("a",{key:4,href:ne.url,target:"_blank",class:"file-link"},[a(z,{name:"file"}),M(" "+v(((te=ne.meta)==null?void 0:te.filename)||ne.url),1)],8,on)):s("v-if",true)])}),128))])])):s("v-if",true),(G=(U=C.value.middlewareLogs)==null?void 0:U.request)!=null&&G.error?(t(),l("div",dn,[o[33]||(o[33]=e("h3",null,"错误信息",-1)),e("div",rn,v(C.value.middlewareLogs.request.error),1)])):s("v-if",true)])):s("v-if",true)]}),_:1},8,["modelValue"]),s(" 图片预览弹窗 "),a(Ue,{visible:P.value,"onUpdate:visible":o[10]||(o[10]=U=>P.value=U),images:c.value,"initial-index":h.value,prompt:_.value,"created-at":A.value,duration:W.value},null,8,["visible","images","initial-index","prompt","created-at","duration"]),s(" 清理对话框 "),a(ae,{modelValue:X.value,"onUpdate:modelValue":o[13]||(o[13]=U=>X.value=U),title:"清理旧任务",width:"400px"},{footer:w(()=>[e("span",un,[a(Z,{onClick:o[12]||(o[12]=U=>X.value=false)},{default:w(()=>[...o[35]||(o[35]=[M("取消",-1)])]),_:1}),a(Z,{type:"error",onClick:$},{default:w(()=>[...o[36]||(o[36]=[M("确认清理",-1)])]),_:1})])]),default:w(()=>[e("div",cn,[o[34]||(o[34]=e("p",null,"清理多少天前的任务?",-1)),a(re,{modelValue:O.value,"onUpdate:modelValue":o[11]||(o[11]=U=>O.value=U),min:1,max:365},null,8,["modelValue"])])]),_:1},8,["modelValue"])])}}}),mn=ue(vn,[["__scopeId","data-v-898a70bb"]]),pn={class:"gallery-content"},gn={class:"gallery-header"},fn={class:"header-left"},_n={key:0,class:"gallery-count"},hn={class:"header-actions"},yn={key:0,class:"gallery-empty"},kn={class:"gallery-empty"},bn=["onClick"],$n={key:0,class:"task-image-wrapper"},wn=["src"],Vn={key:0,class:"more-images"},Cn={class:"task-processing"},xn={class:"processing-text"},In={class:"task-failed"},Sn={class:"task-info"},Un=["title"],Tn={class:"task-meta"},On={class:"task-time"},Dn={key:0,class:"task-duration"},Pn={key:0,class:"loading-more"},we=10,zn=ce({__name:"HistoryGallery",emits:["select"],setup(d,{expose:S,emit:g}){const x=g,u=y(false),k=y(false),D=y(false),T=y([]),f=y(0),m=y(false),C=y(0),R=y();let P=null;const c=y(false),h=y([]),_=y(0),A=y(""),W=y(),X=y(),O=async()=>{try{const q=await Je.me();return D.value=q.loggedIn,q.loggedIn}catch{return D.value=false,false}},b=q=>{var z,Z,B;const n=[];if(q.responseSnapshot)for(const i of q.responseSnapshot)i.kind==="image"&&i.url&&n.push(i.url);const o=((Z=(z=q.middlewareLogs)==null?void 0:z.preset)==null?void 0:Z.transformedPrompt)||((B=q.requestSnapshot)==null?void 0:B.prompt)||"";return{id:q.id,status:q.status,prompt:o,images:n,createdAt:new Date(q.startTime),duration:q.duration||void 0}},p=async(q=false)=>{if(D.value){k.value=true;try{const n=await he.my({limit:we,offset:q?C.value:0}),o=n.items.map(b);q?T.value=[...T.value,...o]:(T.value=o,C.value=0),f.value=n.total,m.value=n.items.length>=we,C.value+=we}catch(n){console.error("Failed to load tasks:",n)}finally{k.value=false}}},j=()=>{!k.value&&m.value&&p(true)},de=q=>{const n=q.target,{scrollTop:o,scrollHeight:z,clientHeight:Z}=n;z-o-Z<100&&j()},me=async()=>{await O(),await p()},V=q=>{q.status==="success"&&q.images.length>0&&(h.value=q.images,_.value=0,A.value=q.prompt,W.value=q.createdAt,X.value=q.duration,c.value=true,x("select",q))},$=q=>{const o=new Date().getTime()-q.getTime();return o<6e4?"刚刚":o<36e5?`${Math.floor(o/6e4)}分钟前`:o<864e5?`${Math.floor(o/36e5)}小时前`:o<6048e5?`${Math.floor(o/864e5)}天前`:q.toLocaleDateString()},H=q=>q<1e3?`${q}ms`:`${(q/1e3).toFixed(1)}s`,J=()=>{P=setInterval(()=>{T.value.some(n=>n.status==="pending"||n.status==="processing")&&p()},3e3)};return S({refresh:me}),pe(async()=>{await O()&&(await p(),J())}),xe(()=>{P&&clearInterval(P)}),(q,n)=>{const o=E("k-icon");return t(),l("div",{class:ee(["history-gallery",{collapsed:u.value}])},[s(" 折叠状态的侧边条 "),u.value?(t(),l("div",{key:0,class:"collapsed-bar",onClick:n[0]||(n[0]=z=>u.value=false)},[a(o,{name:"history"}),n[3]||(n[3]=e("span",{class:"collapsed-text"},"历史",-1))])):(t(),l(I,{key:1},[s(" 展开的内容 "),e("div",pn,[e("div",gn,[e("div",fn,[n[4]||(n[4]=e("span",{class:"gallery-title"},"历史记录",-1)),f.value>0?(t(),l("span",_n,v(f.value),1)):s("v-if",true)]),e("div",hn,[a(o,{name:"refresh",class:ee(["action-icon",{spinning:k.value}]),onClick:me,title:"刷新"},null,8,["class"]),a(o,{name:"chevron-right",class:"action-icon",onClick:n[1]||(n[1]=z=>u.value=true),title:"收起"})])]),s(" 未登录提示 "),D.value?k.value&&T.value.length===0?(t(),l(I,{key:1},[s(" 加载中 "),n[6]||(n[6]=e("div",{class:"gallery-loading"},[e("div",{class:"loader-small"})],-1))],2112)):T.value.length===0?(t(),l(I,{key:2},[s(" 空状态 "),e("div",kn,[a(o,{name:"image",class:"empty-icon"}),n[7]||(n[7]=e("p",null,"暂无记录",-1))])],2112)):(t(),l(I,{key:3},[s(" 任务列表 (瀑布流) "),e("div",{class:"gallery-list",ref_key:"listRef",ref:R,onScroll:de},[(t(true),l(I,null,Q(T.value,z=>(t(),l("div",{key:z.id,class:ee(["task-card",{clickable:z.status==="success"}]),onClick:Z=>V(z)},[s(" 图片区域 - 只显示第一张 "),z.images&&z.images.length>0?(t(),l("div",$n,[e("img",{src:z.images[0],class:"task-image",loading:"lazy"},null,8,wn),z.images.length>1?(t(),l("div",Vn," +"+v(z.images.length-1),1)):s("v-if",true)])):z.status==="processing"||z.status==="pending"?(t(),l(I,{key:1},[s(" 处理中动画 "),e("div",Cn,[n[8]||(n[8]=e("div",{class:"processing-animation"},[e("div",{class:"dot"}),e("div",{class:"dot"}),e("div",{class:"dot"})],-1)),e("span",xn,v(z.status==="pending"?"等待中":"生成中"),1)])],2112)):z.status==="failed"?(t(),l(I,{key:2},[s(" 失败状态 "),e("div",In,[a(o,{name:"exclamation-triangle",class:"failed-icon"}),n[9]||(n[9]=e("span",null,"失败",-1))])],2112)):s("v-if",true),s(" 任务信息 "),e("div",Sn,[e("div",{class:"task-prompt",title:z.prompt},v(z.prompt||"(无提示词)"),9,Un),e("div",Tn,[e("span",On,v($(z.createdAt)),1),z.duration?(t(),l("span",Dn,v(H(z.duration)),1)):s("v-if",true)])])],10,bn))),128)),s(" 加载更多 "),k.value&&T.value.length>0?(t(),l("div",Pn,[...n[10]||(n[10]=[e("div",{class:"loader-small"},null,-1)])])):s("v-if",true)],544)],2112)):(t(),l("div",yn,[a(o,{name:"user",class:"empty-icon"}),n[5]||(n[5]=e("p",null,"请登录查看历史",-1))]))])],2112)),s(" 图片预览弹窗 "),a(Ue,{visible:c.value,"onUpdate:visible":n[2]||(n[2]=z=>c.value=z),images:h.value,"initial-index":_.value,prompt:A.value,"created-at":W.value,duration:X.value},null,8,["visible","images","initial-index","prompt","created-at","duration"])],2)}}}),Fn=ue(zn,[["__scopeId","data-v-6cba50e5"]]),Ln={class:"preset-picker"},An={key:0,class:"preset-info"},En=["src"],Mn={key:1,class:"preset-thumb placeholder"},Nn={class:"preset-details"},qn={class:"preset-name"},Rn={key:1,class:"placeholder-text"},Bn={class:"picker-header"},Hn={class:"preset-count"},Gn={class:"picker-content"},Jn={class:"ml-masonry"},jn=["onClick"],Wn={key:0,class:"card-thumbnail"},Kn=["src","alt"],Qn={class:"thumbnail-overlay"},Xn={key:0,class:"ref-count"},Yn={key:1,class:"card-thumbnail placeholder"},Zn={class:"card-content"},eo={class:"card-title"},to={key:0,class:"card-tags"},lo={key:0,class:"mini-tag more"},so={key:2,class:"selected-mark"},ao={key:0,class:"empty-state"},no={class:"dialog-footer"},oo={key:0,class:"preset-detail"},io={key:0,class:"detail-thumbnail"},ro=["src","alt"],co={class:"detail-section"},uo={class:"detail-row"},vo={key:0,class:"detail-row"},mo={class:"detail-tags"},po={class:"detail-section"},go={class:"prompt-preview"},fo={key:1,class:"detail-section"},_o={class:"detail-label"},ho={class:"reference-images"},yo=["src"],ko={key:2,class:"detail-section"},bo={class:"param-preview"},$o={class:"dialog-footer"},wo=ce({__name:"PresetPicker",props:{modelValue:{},presets:{}},emits:["update:modelValue"],setup(d,{emit:S}){const g=d,x=S,u=["本地","远程","text2img","img2img","NSFW"],k=y(false),D=y(false),T=y([]),f=y(g.modelValue),m=y(null),C=oe(()=>{const O=new Set;return g.presets.forEach(b=>{(b.tags||[]).forEach(p=>O.add(p))}),Array.from(O).sort()}),R=oe(()=>g.modelValue?g.presets.find(O=>O.id===g.modelValue):null),P=oe(()=>{let O=g.presets;return T.value.length===0?O:O.filter(b=>T.value.every(p=>p==="本地"?b.source==="user":p==="远程"?b.source==="api":(b.tags||[]).includes(p)))}),c=()=>{f.value=g.modelValue,T.value=[],k.value=true},h=O=>{f.value=O.id},_=()=>{x("update:modelValue",f.value),k.value=false},A=()=>{x("update:modelValue",void 0)},W=O=>{m.value=O,D.value=true},X=()=>{m.value&&(x("update:modelValue",m.value.id),D.value=false,k.value=false)};return ge(()=>g.modelValue,O=>{f.value=O}),(O,b)=>{var me;const p=E("k-icon"),j=E("k-button"),de=E("el-dialog");return t(),l("div",Ln,[s(" 当前选中的预设显示 "),e("div",{class:"selected-preset",onClick:c},[R.value?(t(),l("div",An,[R.value.thumbnail?(t(),l("img",{key:0,src:R.value.thumbnail,class:"preset-thumb"},null,8,En)):(t(),l("div",Mn,[a(p,{name:"image"})])),e("div",Nn,[e("span",qn,v(R.value.name),1),e("span",{class:ee(["preset-source",R.value.source])},v(R.value.source==="api"?"远程":"本地"),3)]),a(p,{name:"times",class:"clear-btn",onClick:ve(A,["stop"]),title:"清除选择"})])):(t(),l("div",Rn,[a(p,{name:"layer-group"}),b[6]||(b[6]=e("span",null,"选择预设模板 (可选)",-1))])),a(p,{name:"chevron-down",class:"dropdown-icon"})]),s(" 预设选择弹窗 - 复用 PresetsView 的布局 "),a(de,{modelValue:k.value,"onUpdate:modelValue":b[3]||(b[3]=V=>k.value=V),title:"选择预设",width:"80vw",top:"5vh","close-on-click-modal":true,class:"preset-picker-dialog"},{footer:w(()=>[e("div",no,[a(j,{onClick:b[2]||(b[2]=V=>k.value=false)},{default:w(()=>[...b[9]||(b[9]=[M("取消",-1)])]),_:1}),a(j,{type:"primary",onClick:_,disabled:!f.value},{default:w(()=>[...b[10]||(b[10]=[M(" 确认选择 ",-1)])]),_:1},8,["disabled"])])]),default:w(()=>[e("div",Bn,[a(Ie,{modelValue:T.value,"onUpdate:modelValue":b[0]||(b[0]=V=>T.value=V),"all-tags":C.value,"preset-tags":u},null,8,["modelValue","all-tags"]),e("span",Hn,"共 "+v(P.value.length)+" 个预设",1)]),e("div",Gn,[e("div",Jn,[(t(true),l(I,null,Q(P.value,V=>{var $,H;return t(),l("div",{key:V.id,class:"ml-masonry-item"},[e("div",{class:ee(["preset-card",{selected:f.value===V.id}]),onClick:J=>h(V)},[s(" 缩略图 "),V.thumbnail?(t(),l("div",Wn,[e("img",{src:V.thumbnail,alt:V.name,loading:"lazy"},null,8,Kn),e("div",Qn,[($=V.referenceImages)!=null&&$.length?(t(),l("span",Xn,[a(p,{name:"image"}),M(" "+v(V.referenceImages.length),1)])):s("v-if",true)])])):(t(),l("div",Yn,[a(p,{name:"image",class:"placeholder-icon"})])),s(" 内容 "),e("div",Zn,[e("div",eo,v(V.name),1),(H=V.tags)!=null&&H.length?(t(),l("div",to,[(t(true),l(I,null,Q(V.tags.slice(0,4),J=>(t(),l("span",{key:J,class:"mini-tag"},v(J),1))),128)),V.tags.length>4?(t(),l("span",lo,"+"+v(V.tags.length-4),1)):s("v-if",true)])):s("v-if",true)]),s(" 操作按钮区 "),e("div",{class:"card-actions",onClick:b[1]||(b[1]=ve(()=>{},["stop"]))},[a(j,{size:"mini",onClick:J=>W(V)},{icon:w(()=>[a(p,{name:"eye"})]),default:w(()=>[b[7]||(b[7]=M(" 详情 ",-1))]),_:1},8,["onClick"])]),s(" 来源标记 "),e("div",{class:ee(["source-indicator",V.source])},v(V.source==="api"?"远程":"本地"),3),s(" 选中标记 "),f.value===V.id?(t(),l("div",so,[a(p,{name:"check"})])):s("v-if",true)],10,jn)])}),128))]),s(" 空状态 "),P.value.length===0?(t(),l("div",ao,[a(p,{name:"search",class:"empty-icon"}),b[8]||(b[8]=e("p",null,"没有找到匹配的预设",-1))])):s("v-if",true)])]),_:1},8,["modelValue"]),s(" 预设详情弹窗 "),a(de,{modelValue:D.value,"onUpdate:modelValue":b[5]||(b[5]=V=>D.value=V),title:((me=m.value)==null?void 0:me.name)||"预设详情",width:"600px","close-on-click-modal":true,class:"preset-detail-dialog"},{footer:w(()=>[e("div",$o,[a(j,{onClick:b[4]||(b[4]=V=>D.value=false)},{default:w(()=>[...b[15]||(b[15]=[M("关闭",-1)])]),_:1}),a(j,{type:"primary",onClick:X},{icon:w(()=>[a(p,{name:"check"})]),default:w(()=>[b[16]||(b[16]=M(" 选择此预设 ",-1))]),_:1})])]),default:w(()=>{var V,$;return[m.value?(t(),l("div",oo,[s(" 缩略图 "),m.value.thumbnail?(t(),l("div",io,[e("img",{src:m.value.thumbnail,alt:m.value.name},null,8,ro)])):s("v-if",true),s(" 基本信息 "),e("div",co,[e("div",uo,[b[11]||(b[11]=e("span",{class:"detail-label"},"来源:",-1)),e("span",{class:ee(["source-badge",m.value.source])},v(m.value.source==="api"?"远程":"本地"),3)]),(V=m.value.tags)!=null&&V.length?(t(),l("div",vo,[b[12]||(b[12]=e("span",{class:"detail-label"},"标签:",-1)),e("div",mo,[(t(true),l(I,null,Q(m.value.tags,H=>(t(),l("span",{key:H,class:"mini-tag"},v(H),1))),128))])])):s("v-if",true)]),s(" Prompt 模板 "),e("div",po,[b[13]||(b[13]=e("div",{class:"detail-label"},"Prompt 模板:",-1)),e("div",go,v(m.value.promptTemplate),1)]),s(" 参考图 "),($=m.value.referenceImages)!=null&&$.length?(t(),l("div",fo,[e("div",_o,"参考图片 ("+v(m.value.referenceImages.length)+"):",1),e("div",ho,[(t(true),l(I,null,Q(m.value.referenceImages,(H,J)=>(t(),l("img",{key:J,src:H,class:"ref-image"},null,8,yo))),128))])])):s("v-if",true),s(" 参数覆盖 "),m.value.parameterOverrides&&Object.keys(m.value.parameterOverrides).length?(t(),l("div",ko,[b[14]||(b[14]=e("div",{class:"detail-label"},"参数覆盖:",-1)),e("div",bo,v(JSON.stringify(m.value.parameterOverrides,null,2)),1)])):s("v-if",true)])):s("v-if",true)]}),_:1},8,["modelValue","title"])])}}}),Vo=ue(wo,[["__scopeId","data-v-59115136"]]),Co={class:"view-container"},xo={class:"view-content"},Io={class:"generate-layout"},So={class:"config-panel"},Uo={class:"form-section"},To={class:"section-title"},Oo={class:"form-item"},Do={class:"form-item"},Po={class:"form-section flex-grow"},zo={class:"section-title"},Fo={class:"form-section"},Lo={class:"section-title"},Ao={class:"upload-area"},Eo={key:0,class:"upload-list"},Mo=["src"],No=["onClick"],qo={class:"form-actions"},Ro={class:"preview-panel"},Bo={key:0,class:"generating-state"},Ho={class:"generating-content"},Go={class:"generating-info"},Jo={class:"generating-timer"},jo={key:0,class:"generating-hint"},Wo={class:"result-container"},Ko={key:0,class:"success-result"},Qo={class:"output-grid"},Xo=["src","onClick"],Yo={class:"output-actions"},Zo=["href"],ei=["src"],ti=["src"],li=["href"],si={class:"text-output"},ai=["href"],ni={class:"result-meta"},oi={class:"meta-item success-badge"},ii={key:0,class:"meta-item"},di={key:1,class:"meta-item"},ri={class:"error-result"},ci={class:"error-content"},ui={class:"error-info"},vi={class:"error-msg"},mi={key:0,class:"error-meta"},pi={key:1,class:"error-meta"},gi={class:"empty-state"},fi=ce({__name:"GenerateView",setup(d){const S=y([]),g=y([]),x=y(false),u=y(null),k=y([]),D=y([]),T=y(),f=y();let m=0;const C=y(0),R=y(null);let P=null,c=0;const h=y({channel:void 0,prompt:"",parameters:{}}),_=y(void 0),A=y(false),W=y([]),X=y(0),O=y(""),b=B=>{if(B<1e3)return`${B}ms`;const i=B/1e3;if(i<60)return`${i.toFixed(1)}s`;const r=Math.floor(i/60),F=(i%60).toFixed(0);return`${r}m ${F}s`},p=()=>{c=Date.now(),C.value=0,P=setInterval(()=>{C.value=Date.now()-c},100)},j=()=>{P&&(clearInterval(P),P=null)},de=B=>{var i;(i=u.value)!=null&&i.output&&(W.value=u.value.output.filter(r=>r.kind==="image"&&r.url).map(r=>r.url),X.value=B,A.value=true)},me=async()=>{try{const[B,i]=await Promise.all([_e.list(),fe.list()]);S.value=B,g.value=i}catch(B){console.error(B)}},V=B=>new Promise((i,r)=>{const F=new FileReader;F.onload=()=>{const Y=F.result.split(",")[1];i(Y)},F.onerror=r,F.readAsDataURL(B)}),$=()=>{var B;(B=T.value)==null||B.click()},H=async B=>{const i=B.target;!i.files||i.files.length===0||(await q(Array.from(i.files)),i.value="")},J=async B=>{var r;const i=(r=B.dataTransfer)==null?void 0:r.files;!i||i.length===0||await q(Array.from(i).filter(F=>F.type.startsWith("image/")))},q=async B=>{const i=4-k.value.length;if(i<=0){K.warning("最多上传 4 张图片");return}const r=B.slice(0,i);for(const F of r){const le=URL.createObjectURL(F);k.value.push({uid:++m,url:le,raw:F});try{const Y=await V(F);D.value.push({type:"image",base64:Y,mimeType:F.type,filename:F.name})}catch(Y){console.error("Failed to read file:",F.name,Y)}}},n=B=>{const i=k.value[B];i&&(URL.revokeObjectURL(i.url),k.value.splice(B,1),D.value.splice(B,1))},o=async B=>{var i,r,F,le;try{const Y=await he.get(B);if(O.value=((r=(i=Y.middlewareLogs)==null?void 0:i.preset)==null?void 0:r.transformedPrompt)||((F=Y.requestSnapshot)==null?void 0:F.prompt)||"",Y.status==="success"&&Y.responseSnapshot&&Y.responseSnapshot.length>0)return{success:true,output:Y.responseSnapshot,taskId:Y.id,duration:Y.duration||void 0};if(Y.status==="failed"){const ae=(le=Y.middlewareLogs)==null?void 0:le._error;return{success:false,error:(ae==null?void 0:ae.message)||"生成失败",taskId:Y.id,duration:Y.duration||void 0}}return null}catch{return null}},z=async()=>{var B,i,r,F,le,Y;if(!h.value.channel){K.warning("请选择渠道");return}x.value=true,u.value=null,R.value=null,p();try{const ae={channelId:h.value.channel,prompt:h.value.prompt||"",parameters:{...h.value.parameters}};if(D.value.length>0&&(ae.files=D.value),_.value){const U=g.value.find(G=>G.id===_.value);U&&(ae.parameters.preset=U.name)}const re=await je.generate(ae);if(re.taskId&&(R.value=re.taskId),re.success)if(u.value=re,(B=f.value)==null||B.refresh(),re.taskId)try{const U=await he.get(re.taskId);O.value=((r=(i=U.middlewareLogs)==null?void 0:i.preset)==null?void 0:r.transformedPrompt)||((F=U.requestSnapshot)==null?void 0:F.prompt)||""}catch{O.value=h.value.prompt}else O.value=h.value.prompt;else if(re.taskId){await new Promise(G=>setTimeout(G,500));const U=await o(re.taskId);U&&U.success?(u.value=U,(le=f.value)==null||le.refresh()):u.value=re}else u.value=re}catch(ae){if(R.value){await new Promise(U=>setTimeout(U,500));const re=await o(R.value);re?(u.value=re,re.success&&((Y=f.value)==null||Y.refresh())):u.value={success:false,error:ae.message||"请求失败"}}else u.value={success:false,error:ae.message||"请求失败"}}finally{j(),x.value=false}},Z=B=>{B.prompt&&(h.value.prompt=B.prompt)};return pe(()=>{me()}),xe(()=>{j()}),(B,i)=>{var U;const r=E("k-icon"),F=E("el-option"),le=E("el-select"),Y=E("el-input"),ae=E("k-button"),re=E("k-card");return t(),l("div",Co,[e("div",xo,[e("div",Io,[s(" 左侧配置区 "),e("div",So,[a(re,{class:"config-card"},{default:w(()=>[e("div",Uo,[e("div",To,[a(r,{name:"settings"}),i[5]||(i[5]=M(" 基础配置 ",-1))]),e("div",Oo,[i[6]||(i[6]=e("div",{class:"label"},"生成渠道",-1)),a(le,{modelValue:h.value.channel,"onUpdate:modelValue":i[0]||(i[0]=G=>h.value.channel=G),placeholder:"选择生成渠道",style:{width:"100%"}},{default:w(()=>[(t(true),l(I,null,Q(S.value,G=>(t(),ie(F,{key:G.id,label:G.name,value:G.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Do,[i[7]||(i[7]=e("div",{class:"label"},"预设模板",-1)),a(Vo,{modelValue:_.value,"onUpdate:modelValue":i[1]||(i[1]=G=>_.value=G),presets:g.value},null,8,["modelValue","presets"])])]),e("div",Po,[e("div",zo,[a(r,{name:"edit"}),i[8]||(i[8]=M(" 提示词 ",-1))]),a(Y,{modelValue:h.value.prompt,"onUpdate:modelValue":i[2]||(i[2]=G=>h.value.prompt=G),type:"textarea",rows:8,placeholder:"输入提示词,支持自然语言描述...",resize:"none",class:"prompt-input"},null,8,["modelValue"])]),s(" 文件上传区域 "),e("div",Fo,[e("div",Lo,[a(r,{name:"image"}),i[9]||(i[9]=M(" 参考图片 ",-1))]),e("div",Ao,[s(" 已上传的图片列表 "),k.value.length>0?(t(),l("div",Eo,[(t(true),l(I,null,Q(k.value,(G,ne)=>(t(),l("div",{key:G.uid,class:"upload-item"},[e("img",{src:G.url,class:"upload-thumb"},null,8,Mo),e("div",{class:"upload-overlay",onClick:L=>n(ne)},[a(r,{name:"delete"})],8,No)]))),128))])):s("v-if",true),s(" 上传按钮 "),k.value.length<4?(t(),l("div",{key:1,class:"upload-trigger",onClick:$,onDragover:i[3]||(i[3]=ve(()=>{},["prevent"])),onDrop:ve(J,["prevent"])},[e("input",{ref_key:"fileInput",ref:T,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:H},null,544),a(r,{name:"add",class:"upload-icon"})],32)):s("v-if",true),i[10]||(i[10]=e("div",{class:"upload-tip"},"点击或拖拽上传,最多 4 张",-1))])]),e("div",qo,[a(ae,{solid:"",type:"primary",loading:x.value,onClick:z,class:"generate-btn"},{icon:w(()=>[a(r,{name:"magic"})]),default:w(()=>[i[11]||(i[11]=M(" 生成图片 ",-1))]),_:1},8,["loading"])])]),_:1})]),s(" 右侧预览区 "),e("div",Ro,[s(" 生成中状态 "),x.value?(t(),l("div",Bo,[e("div",Ho,[i[13]||(i[13]=e("div",{class:"loader"},null,-1)),e("div",Go,[i[12]||(i[12]=e("p",{class:"generating-title"},"正在生成中...",-1)),e("p",Jo,[a(r,{name:"stopwatch"}),M(" 已用时间: "+v(b(C.value)),1)]),R.value?(t(),l("p",jo,"任务 ID: "+v(R.value),1)):s("v-if",true)])])])):u.value?(t(),l(I,{key:1},[s(" 有结果 "),e("div",Wo,[s(" 成功状态 "),u.value.success&&u.value.output&&u.value.output.length?(t(),l("div",Ko,[e("div",Qo,[(t(true),l(I,null,Q(u.value.output,(G,ne)=>{var L;return t(),l("div",{key:ne,class:"output-wrapper"},[s(" 图片 "),G.kind==="image"?(t(),l(I,{key:0},[e("img",{src:G.url,onClick:te=>de(ne),class:"clickable-image"},null,8,Xo),e("div",Yo,[e("a",{href:G.url,target:"_blank",class:"action-btn",download:""},[a(r,{name:"download"})],8,Zo)])],64)):G.kind==="video"?(t(),l(I,{key:1},[s(" 视频 "),e("video",{src:G.url,controls:"",class:"output-video"},null,8,ei)],64)):G.kind==="audio"?(t(),l(I,{key:2},[s(" 音频 "),e("audio",{src:G.url,controls:"",class:"output-audio"},null,8,ti)],64)):G.kind==="file"?(t(),l(I,{key:3},[s(" 其他文件 "),e("a",{href:G.url,target:"_blank",class:"file-link"},[a(r,{name:"file"}),M(" "+v(((L=G.meta)==null?void 0:L.filename)||"下载文件"),1)],8,li)],64)):G.kind==="text"?(t(),l(I,{key:4},[s(" 文本 "),e("div",si,v(G.content),1)],64)):G.url?(t(),l(I,{key:5},[s(" 兜底:有 url 则显示链接 "),e("a",{href:G.url,target:"_blank"},v(G.url),9,ai)],64)):s("v-if",true)])}),128))]),e("div",ni,[e("span",oi,[a(r,{name:"check-circle"}),i[14]||(i[14]=M(" 生成成功 ",-1))]),u.value.duration?(t(),l("span",ii,[a(r,{name:"stopwatch"}),M(" 耗时: "+v(b(u.value.duration)),1)])):s("v-if",true),u.value.taskId?(t(),l("span",di,[a(r,{name:"list-alt"}),M(" 任务 ID: "+v(u.value.taskId),1)])):s("v-if",true)])])):(t(),l(I,{key:1},[s(" 失败状态 "),e("div",ri,[e("div",ci,[a(r,{name:"exclamation-triangle",class:"error-icon"}),e("div",ui,[i[15]||(i[15]=e("p",{class:"error-title"},"生成失败",-1)),e("p",vi,v(u.value.error||"未知错误"),1),u.value.taskId?(t(),l("p",mi,"任务 ID: "+v(u.value.taskId),1)):s("v-if",true),u.value.duration?(t(),l("p",pi,"耗时: "+v(b(u.value.duration)),1)):s("v-if",true)])]),a(ae,{class:"retry-btn",onClick:z},{icon:w(()=>[a(r,{name:"refresh"})]),default:w(()=>[i[16]||(i[16]=M(" 重新生成 ",-1))]),_:1})])],2112))])],2112)):(t(),l(I,{key:2},[s(" 空状态 "),e("div",gi,[a(r,{name:"image",class:"empty-icon"}),i[17]||(i[17]=e("p",null,"在左侧配置并点击生成",-1))])],2112))]),s(" 右侧历史画廊 "),a(Fn,{ref_key:"historyGalleryRef",ref:f,onSelect:Z},null,512)])]),s(" 图片预览弹窗 "),a(Ue,{visible:A.value,"onUpdate:visible":i[4]||(i[4]=G=>A.value=G),images:W.value,"initial-index":X.value,prompt:O.value,duration:(U=u.value)==null?void 0:U.duration},null,8,["visible","images","initial-index","prompt","duration"])])}}}),Fe=ue(fi,[["__scopeId","data-v-a3441aa4"]]),_i={class:"pipeline-panel"},hi={class:"pipeline-flow"},yi={class:"phase-icon"},ki={class:"phase-info"},bi={class:"phase-name"},$i={class:"phase-desc"},wi={class:"phase-badge"},Vi={key:0,class:"phase-middlewares"},Ci={class:"mw-card"},xi={class:"mw-content"},Ii={class:"mw-name"},Si={class:"mw-desc"},Ui=["title"],Ti=["checked","onChange"],Oi={key:2,class:"phase-connector"},Di={class:"connector-arrow"},Pi=ce({__name:"MiddlewaresPanel",setup(d){const S=y([]),g=[{id:"lifecycle-prepare",label:"准备",description:"验证、权限检查、任务创建",icon:"clipboard-check",colorClass:"phase-prepare"},{id:"lifecycle-pre-request",label:"预处理",description:"预设应用、参数处理",icon:"settings",colorClass:"phase-pre"},{id:"lifecycle-request",label:"执行",description:"调用连接器生成",icon:"play",colorClass:"phase-request"},{id:"lifecycle-post-request",label:"后处理",description:"结果缓存、格式转换",icon:"package",colorClass:"phase-post"},{id:"lifecycle-finalize",label:"完成",description:"计费结算、记录保存",icon:"check-circle",colorClass:"phase-finalize"}],x={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},u=T=>S.value.filter(f=>f.phase===T),k=async()=>{try{S.value=await $e.list()}catch{K.error("加载中间件列表失败")}},D=async T=>{const f=!T.enabled;try{await $e.update(T.name,{enabled:f}),T.enabled=f,K.success(f?"已启用":"已禁用")}catch{K.error("操作失败")}};return pe(k),(T,f)=>{const m=E("k-icon");return t(),l("div",_i,[s(" 标题区 "),f[5]||(f[5]=e("div",{class:"panel-header"},[e("div",{class:"header-title"},[e("h3",null,"请求执行流程"),e("span",{class:"subtitle"},"每个生成请求按以下阶段依次处理")])],-1)),s(" 流程图 "),e("div",hi,[(t(),l(I,null,Q(g,(C,R)=>e("div",{key:C.id,class:"phase-section"},[s(" 阶段标题 "),e("div",{class:ee(["phase-header",C.colorClass])},[e("div",yi,[a(m,{name:C.icon},null,8,["name"])]),e("div",ki,[e("span",bi,v(C.label),1),e("span",$i,v(C.description),1)]),e("span",wi,v(u(C.id).length),1)],2),s(" 中间件列表 "),u(C.id).length>0?(t(),l("div",Vi,[(t(true),l(I,null,Q(u(C.id),(P,c)=>(t(),l("div",{key:P.name,class:ee(["mw-item",{disabled:!P.enabled}])},[e("div",Ci,[e("div",{class:ee(["mw-status",{active:P.enabled}])},null,2),e("div",xi,[e("span",Ii,v(P.displayName),1),e("span",Si,v(P.description||x[P.category]||P.category),1)]),e("label",{class:"toggle-switch",onClick:f[0]||(f[0]=ve(()=>{},["stop"])),title:P.enabled?"点击禁用":"点击启用"},[e("input",{type:"checkbox",checked:P.enabled,onChange:h=>D(P)},null,40,Ti),f[1]||(f[1]=e("span",{class:"slider"},null,-1))],8,Ui)])],2))),128))])):(t(),l(I,{key:1},[s(" 空状态 "),f[2]||(f[2]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),s(" 阶段间连接箭头 "),R<g.length-1?(t(),l("div",Oi,[f[3]||(f[3]=e("div",{class:"connector-line"},null,-1)),e("div",Di,[a(m,{name:"chevron-down"})]),f[4]||(f[4]=e("div",{class:"connector-line"},null,-1))])):s("v-if",true)])),64))]),s(" 底部说明 "),f[6]||(f[6]=Ce('<div class="pipeline-footer" data-v-b4b0cf47><div class="footer-item" data-v-b4b0cf47><span class="dot active" data-v-b4b0cf47></span><span data-v-b4b0cf47>启用 - 中间件将在请求中执行</span></div><div class="footer-item" data-v-b4b0cf47><span class="dot" data-v-b4b0cf47></span><span data-v-b4b0cf47>禁用 - 中间件将被跳过</span></div><p class="footer-hint" data-v-b4b0cf47>同一阶段内的中间件可能并行执行。详细配置请前往「扩展插件」面板。</p></div>',1))])}}}),zi=ue(Pi,[["__scopeId","data-v-b4b0cf47"]]),Fi={class:"plugins-panel"},Li={key:0,class:"loading-state"},Ai={class:"empty-state"},Ei={class:"plugins-list"},Mi=["onClick"],Ni={class:"plugin-info"},qi={class:"plugin-header"},Ri={class:"plugin-name"},Bi={key:0,class:"plugin-version"},Hi={class:"plugin-description"},Gi={class:"plugin-status"},Ji={key:0,class:"plugin-badge connector"},ji={key:1,class:"plugin-badge middleware"},Wi={key:0,class:"plugin-detail"},Ki={class:"detail-header"},Qi={class:"header-left"},Xi={key:0,class:"version"},Yi={class:"header-actions"},Zi={key:0,class:"connector-info"},ed={class:"connector-meta"},td={class:"connector-id"},ld={class:"connector-types"},sd={key:1,class:"middlewares-list"},ad={class:"middleware-tags"},nd={class:"phase-badge"},od={key:2,class:"config-section"},id={class:"config-actions"},dd={class:"no-config"},rd={class:"no-selection"},cd=ce({__name:"PluginsPanel",setup(d){const S=y(true),g=y([]),x=y(null),u=y({}),k=y(false),D={"lifecycle-prepare":"准备","lifecycle-pre-request":"前置","lifecycle-request":"请求","lifecycle-post-request":"后置","lifecycle-finalize":"完成"},T=P=>D[P]||P,f=async()=>{try{S.value=true,g.value=await Ve.list()}catch(P){console.error("Failed to load plugins:",P),g.value=[]}finally{S.value=false}},m=P=>{x.value=P,u.value={...P.config};for(const c of P.configFields||[])u.value[c.key]===void 0&&c.default!==void 0&&(u.value[c.key]=c.default)},C=async()=>{if(x.value){k.value=true;try{await Ve.updateConfig(x.value.id,u.value),K.success("保存成功"),await f();const P=g.value.find(c=>{var h;return c.id===((h=x.value)==null?void 0:h.id)});P&&(x.value=P,u.value={...P.config})}catch{K.error("保存失败")}finally{k.value=false}}},R=async P=>{var c;try{const{send:h}=await import("@koishijs/client"),_=await h(P.apiEvent);if((_==null?void 0:_.success)===false)throw new Error(_.error||"操作失败");if(P.apiEvent==="media-luna/presets/sync"&&(_!=null&&_.data)){const{added:A,updated:W,removed:X,notModified:O}=_.data;O?K.info("数据未变化,无需更新"):K.success(`同步完成:新增 ${A},更新 ${W},删除 ${X}`)}else(c=_==null?void 0:_.data)!=null&&c.message?K.success(_.data.message):K.success(`${P.label} 完成`);await f()}catch(h){K.error(`${P.label} 失败: ${h instanceof Error?h.message:"未知错误"}`)}};return pe(f),(P,c)=>{var A,W,X;const h=E("k-icon"),_=E("k-button");return t(),l("div",Fi,[s(" 加载状态 "),S.value?(t(),l("div",Li,[a(h,{name:"sync",class:"spin"}),c[1]||(c[1]=e("span",null,"加载中...",-1))])):g.value.length===0?(t(),l(I,{key:1},[s(" 空状态 "),e("div",Ai,[a(h,{name:"apps"}),c[2]||(c[2]=e("p",null,"暂无扩展插件",-1)),c[3]||(c[3]=e("p",{class:"hint"},[M("第三方扩展插件将在这里显示"),e("br"),M('内置功能请在"功能模块"中配置')],-1))])],2112)):(t(),l(I,{key:2},[s(" 插件列表 "),e("div",Ei,[(t(true),l(I,null,Q(g.value,O=>{var b,p;return t(),l("div",{key:O.id,class:ee(["plugin-card",{active:((b=x.value)==null?void 0:b.id)===O.id,disabled:!O.enabled}]),onClick:j=>m(O)},[e("div",Ni,[e("div",qi,[e("span",Ri,v(O.name),1),O.version?(t(),l("span",Bi,"v"+v(O.version),1)):s("v-if",true)]),e("p",Hi,v(O.description||"暂无描述"),1)]),e("div",Gi,[O.connector?(t(),l("span",Ji,"连接器")):s("v-if",true),(p=O.middlewares)!=null&&p.length?(t(),l("span",ji,v(O.middlewares.length)+" 个中间件 ",1)):s("v-if",true),a(h,{name:O.enabled?"check-circle":"close-circle",class:ee(O.enabled?"enabled":"disabled")},null,8,["name","class"])])],10,Mi)}),128))]),s(" 插件详情 "),x.value?(t(),l("div",Wi,[e("header",Ki,[e("div",Qi,[e("h3",null,v(x.value.name),1),x.value.version?(t(),l("span",Xi,"v"+v(x.value.version),1)):s("v-if",true)]),e("div",Yi,[(t(true),l(I,null,Q(x.value.actions,O=>(t(),ie(_,{key:O.name,type:O.type||"default",size:"small",onClick:b=>R(O)},Re({default:w(()=>[M(" "+v(O.label),1)]),_:2},[O.icon?{name:"icon",fn:w(()=>[a(h,{name:O.icon},null,8,["name"])]),key:"0"}:void 0]),1032,["type","onClick"]))),128))])]),s(" 连接器信息 "),x.value.connector?(t(),l("div",Zi,[c[4]||(c[4]=e("h4",null,"连接器",-1)),e("div",ed,[e("span",td,v(x.value.connector.id),1),e("span",ld," 支持: "+v(((A=x.value.connector.supportedTypes)==null?void 0:A.join(", "))||"无"),1)])])):s("v-if",true),s(" 中间件列表 "),(W=x.value.middlewares)!=null&&W.length?(t(),l("div",sd,[c[5]||(c[5]=e("h4",null,"中间件",-1)),e("div",ad,[(t(true),l(I,null,Q(x.value.middlewares,O=>(t(),l("span",{key:O.name,class:ee(["middleware-tag",{enabled:O.enabled}])},[M(v(O.displayName||O.name)+" ",1),e("span",nd,v(T(O.phase)),1)],2))),128))])])):s("v-if",true),s(" 配置表单 "),(X=x.value.configFields)!=null&&X.length?(t(),l("div",od,[c[7]||(c[7]=e("h4",null,"配置",-1)),a(Se,{fields:x.value.configFields,modelValue:u.value,"onUpdate:modelValue":c[0]||(c[0]=O=>u.value=O)},null,8,["fields","modelValue"]),e("div",id,[a(_,{type:"primary",onClick:C,loading:k.value},{icon:w(()=>[a(h,{name:"save"})]),default:w(()=>[c[6]||(c[6]=M(" 保存配置 ",-1))]),_:1},8,["loading"])])])):(t(),l(I,{key:3},[s(" 无配置提示 "),e("div",dd,[a(h,{name:"info-circle"}),c[8]||(c[8]=e("span",null,"该插件暂无可配置项",-1))])],2112))])):(t(),l(I,{key:1},[s(" 无选中提示 "),e("div",rd,[a(h,{name:"apps"}),c[9]||(c[9]=e("p",null,"请从左侧选择一个插件查看详情",-1))])],2112))],64))])}}}),ud=ue(cd,[["__scopeId","data-v-bfb4a81f"]]),vd={class:"settings-view"},md={class:"sidebar"},pd={class:"nav-list"},gd=["onClick"],fd={class:"main-content"},_d={key:0,class:"loading"},hd={class:"panel-header"},yd={key:0},kd={class:"custom-panel"},bd={class:"actions"},$d=ce({__name:"SettingsView",setup(d){const S=y(true),g=y([]),x=y(""),u=y({}),k=oe(()=>g.value.find(m=>m.id===x.value)),D=async()=>{try{g.value=await De.panels(),g.value.length&&!x.value&&(x.value=g.value[0].id)}catch{K.error("加载设置面板失败")}},T=()=>{var m;if(((m=k.value)==null?void 0:m.type)==="custom"){u.value={...k.value.config||{}};for(const C of k.value.configFields||[])u.value[C.key]===void 0&&C.default!==void 0&&(u.value[C.key]=C.default)}},f=async()=>{if(k.value)try{await De.update(k.value.id,u.value),K.success("保存成功"),await D()}catch{K.error("保存失败")}};return ge(x,()=>{var m;((m=k.value)==null?void 0:m.type)==="custom"&&T()}),pe(async()=>{await D(),S.value=false}),(m,C)=>{const R=E("k-icon"),P=E("k-button");return t(),l("div",vd,[s(" 侧边栏导航 "),e("aside",md,[e("nav",pd,[(t(true),l(I,null,Q(g.value,c=>(t(),l("div",{key:c.id,class:ee(["nav-item",{active:x.value===c.id}]),onClick:h=>x.value=c.id},[a(R,{name:c.icon},null,8,["name"]),e("span",null,v(c.name),1)],10,gd))),128))])]),s(" 主内容区 "),e("main",fd,[S.value?(t(),l("div",_d,[a(R,{name:"sync",class:"spin"}),C[1]||(C[1]=M(" 加载中... ",-1))])):k.value?(t(),l(I,{key:1},[s(" 面板标题 "),e("header",hd,[e("h2",null,v(k.value.name),1),k.value.description?(t(),l("p",yd,v(k.value.description),1)):s("v-if",true)]),s(" 功能模块面板 "),k.value.component==="middlewares"?(t(),ie(zi,{key:0})):k.value.component==="plugins"?(t(),l(I,{key:1},[s(" 扩展插件面板 "),a(ud)],64)):k.value.type==="custom"&&k.value.configFields?(t(),l(I,{key:2},[s(" 自定义面板 "),e("div",kd,[a(Se,{fields:k.value.configFields,modelValue:u.value,"onUpdate:modelValue":C[0]||(C[0]=c=>u.value=c)},null,8,["fields","modelValue"]),e("div",bd,[a(P,{type:"primary",onClick:f},{icon:w(()=>[a(R,{name:"save"})]),default:w(()=>[C[2]||(C[2]=M(" 保存 ",-1))]),_:1})])])],64)):s("v-if",true)],64)):s("v-if",true)])])}}}),wd=ue($d,[["__scopeId","data-v-5fa778a6"]]),Vd={class:"top-nav"},Cd={class:"nav-container"},xd={class:"nav-tabs",role:"tablist"},Id=["onClick","aria-selected"],Sd={class:"main-content"},Ud=ce({__name:"index",setup(d){const S=y("generate"),g=oe(()=>{switch(S.value){case"generate":return Fe;case"channels":return Ll;case"presets":return Os;case"tasks":return mn;case"settings":return wd;default:return Fe}}),x=f=>()=>Te("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[Te("path",{d:f})]),u=[{id:"generate",label:"生成",icon:x("M7.5 5.6L10 7 8.6 4.5 10 2 7.5 3.4 5 2 6.4 4.5 5 7zM19 2l-2.5 1.4L14 2l1.4 2.5L14 7l2.5-1.4L19 7l-1.4-2.5zm-5.6 5.4L9 12l4.4 4.6L17.8 12zM2 13l2.5 1.4L6 17l1.4-2.5L10 13 7.5 11.6 6 9l-1.4 2.5z")},{id:"channels",label:"渠道",icon:x("M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z")},{id:"presets",label:"预设",icon:x("M17 3H7c-1.1 0-2 .9-2 2v16l7-3 7 3V5c0-1.1-.9-2-2-2z")},{id:"tasks",label:"任务",icon:x("M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z")},{id:"settings",label:"设置",icon:x("M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.488.488 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.58 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z")}];let k="";function D(){const f=document.querySelector(".layout-header");f&&(k=f.style.display,f.style.display="none")}function T(){const f=document.querySelector(".layout-header");f&&(f.style.display=k||"")}return pe(D),Be(T),(f,m)=>{const C=E("k-layout");return t(),ie(C,{class:"app-layout media-luna-app"},{default:w(()=>[e("div",Vd,[e("div",Cd,[m[0]||(m[0]=e("div",{class:"logo-area"},[e("span",{class:"logo-text"},"MEDIA LUNA")],-1)),e("div",xd,[(t(),l(I,null,Q(u,R=>e("div",{key:R.id,class:ee(["nav-tab",{active:S.value===R.id}]),onClick:P=>S.value=R.id,role:"tab","aria-selected":S.value===R.id},[(t(),ie(Oe(R.icon),{class:"tab-icon"})),e("span",null,v(R.label),1)],10,Id)),64))])])]),e("div",Sd,[(t(),ie(He,null,[(t(),ie(Oe(g.value)))],1024))])]),_:1})}}}),Td=ue(Ud,[["__scopeId","data-v-7e4d3d55"]]),Pd=d=>{d.page({name:"Media Luna",path:"/media-luna",component:Td,order:500})};export{Pd as default};
|