koishi-plugin-media-luna 0.0.13 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1,5 @@
1
- import{defineComponent as ie,computed as re,ref as h,resolveComponent as E,createElementBlock as l,openBlock as t,createElementVNode as e,createCommentVNode as s,Fragment as D,renderList as X,normalizeClass as ee,toDisplayString as g,createVNode as a,withKeys as qe,withCtx as C,createStaticVNode as Se,createBlock as ae,watch as ge,withDirectives as ke,vShow as be,withModifiers as ve,createTextVNode as R,onMounted as pe,onUnmounted as Ve,Teleport as Be,Transition as Ae,createSlots as He,onBeforeUnmount as Ge,h as De,resolveDynamicComponent as Oe,KeepAlive as Je}from"vue";import{send as Ee,message as G,receive as We}from"@koishijs/client";async function L(o,I){const f=await Ee(o,I);if(!f.success)throw new Error(f.error||"请求失败");return f.data}const he={list:()=>L("media-luna/channels/list"),get:o=>L("media-luna/channels/get",{id:o}),create:o=>L("media-luna/channels/create",o),update:(o,I)=>L("media-luna/channels/update",{id:o,data:I}),delete:o=>L("media-luna/channels/delete",{id:o}),toggle:(o,I)=>L("media-luna/channels/toggle",{id:o,enabled:I}),tags:()=>L("media-luna/channels/tags"),getByTags:(o,I)=>L("media-luna/channels/by-tags",{tags:o,matchAll:I})},_e={list:o=>L("media-luna/presets/list",{enabledOnly:o}),get:o=>L("media-luna/presets/get",{id:o}),create:o=>L("media-luna/presets/create",o),update:(o,I)=>L("media-luna/presets/update",{id:o,data:I}),delete:o=>L("media-luna/presets/delete",{id:o}),toggle:(o,I)=>L("media-luna/presets/toggle",{id:o,enabled:I}),copy:o=>L("media-luna/presets/copy",{id:o}),matching:o=>L("media-luna/presets/matching",{channelId:o}),tags:()=>L("media-luna/presets/tags"),getByTags:(o,I)=>L("media-luna/presets/by-tags",{tags:o,matchAll:I})},ye={list:o=>L("media-luna/tasks/list",o),get:o=>L("media-luna/tasks/get",{id:o}),delete:o=>L("media-luna/tasks/delete",{id:o}),stats:o=>L("media-luna/tasks/stats",{channelId:o}),cleanup:o=>L("media-luna/tasks/cleanup",{days:o}),recent:(o,I)=>L("media-luna/tasks/recent",{userId:o,limit:I}),my:o=>L("media-luna/tasks/my",o)},je={me:()=>L("media-luna/auth/me")},we={list:()=>L("media-luna/middlewares/list"),get:o=>L("media-luna/middlewares/get",{name:o}),update:(o,I)=>L("media-luna/middlewares/update",{name:o,data:I}),reset:o=>L("media-luna/middlewares/reset",{name:o}),executionOrder:()=>L("media-luna/middlewares/execution-order"),cardFields:()=>L("media-luna/middlewares/card-fields")},$e={list:()=>L("media-luna/connectors/list"),get:o=>L("media-luna/connectors/get",{id:o}),fields:o=>L("media-luna/connectors/fields",{id:o}),schema:()=>L("media-luna/connectors/schema")},Ke={generate:o=>L("media-luna/generate",o),preview:o=>L("media-luna/generate/preview",o)},Qe={upload:(o,I,f)=>L("media-luna/cache/upload",{data:o,mime:I,filename:f}),cacheUrl:o=>L("media-luna/cache/cache-url",{url:o}),get:o=>L("media-luna/cache/get",{id:o}),read:o=>L("media-luna/cache/read",{id:o}),delete:o=>L("media-luna/cache/delete",{id:o}),stats:()=>L("media-luna/cache/stats"),clear:()=>L("media-luna/cache/clear")},ze={panels:()=>L("media-luna/settings/panels"),get:o=>L("media-luna/settings/get",{id:o}),update:(o,I)=>L("media-luna/settings/update",{id:o,config:I}),syncRemotePresets:()=>L("media-luna/presets/sync")},fe={status:()=>L("media-luna/setup/status"),getStorageFields:()=>L("media-luna/setup/storage/fields"),getStorageConfig:()=>L("media-luna/setup/storage/get"),updateStorageConfig:o=>L("media-luna/setup/storage/update",o),generateVerifyCode:o=>L("media-luna/setup/verify-code/generate",{uid:o}),verifyCode:(o,I)=>L("media-luna/setup/verify-code/verify",{code:o,uid:I}),bindUid:o=>L("media-luna/setup/bind-uid",{uid:o}),getUsers:()=>L("media-luna/setup/users"),complete:()=>L("media-luna/setup/complete")},Ie={list:()=>L("media-luna/plugins/list"),get:o=>L("media-luna/plugins/get",{id:o}),updateConfig:(o,I)=>L("media-luna/plugins/update-config",{pluginId:o,config:I}),enable:o=>L("media-luna/plugins/enable",{id:o}),disable:o=>L("media-luna/plugins/disable",{id:o}),externalList:()=>L("media-luna/plugins/external/list"),externalAdd:o=>L("media-luna/plugins/external/add",{moduleName:o}),externalRemove:o=>L("media-luna/plugins/external/remove",{moduleName:o})},Xe={class:"tag-filter"},Ye={class:"filter-tags"},Ze=["onClick"],et={key:0,class:"filter-input-wrapper"},tt=ie({__name:"TagFilter",props:{modelValue:{default:()=>[]},allTags:{},presetTags:{default:()=>[]},showInput:{type:Boolean,default:true},maxDynamicTags:{default:20}},emits:["update:modelValue","change"],setup(o,{emit:I}){const f=o,w=I,r=re({get:()=>f.modelValue,set:v=>{w("update:modelValue",v),w("change",v)}}),y=h(""),S=re(()=>{const v=f.allTags.filter(k=>!f.presetTags.includes(k)).slice(0,f.maxDynamicTags);return[...f.presetTags,...v]}),O=v=>{const k=[...r.value],z=k.indexOf(v);z>=0?k.splice(z,1):k.push(v),r.value=k},b=()=>{const v=y.value.trim();v&&!r.value.includes(v)&&(r.value=[...r.value,v]),y.value=""};return(v,k)=>{const z=E("k-icon"),$=E("el-input");return t(),l("div",Xe,[e("div",Ye,[(t(true),l(D,null,X(S.value,c=>(t(),l("span",{key:c,class:ee(["filter-tag",{active:r.value.includes(c)}]),onClick:p=>O(c)},g(c),11,Ze))),128))]),o.showInput?(t(),l("div",et,[a($,{modelValue:y.value,"onUpdate:modelValue":k[0]||(k[0]=c=>y.value=c),placeholder:"输入标签筛选...",size:"small",clearable:"",onKeyup:qe(b,["enter"]),class:"filter-input"},{prefix:C(()=>[a(z,{name:"search"})]),_:1},8,["modelValue"])])):s("v-if",true)])}}}),de=(o,I)=>{const f=o.__vccOpts||o;for(const[w,r]of I)f[w]=r;return f},Ue=de(tt,[["__scopeId","data-v-61b504c8"]]),lt={class:"view-mode-switch"},st=ie({__name:"ViewModeSwitch",props:{modelValue:{}},emits:["update:modelValue"],setup(o){return(I,f)=>(t(),l("div",lt,[e("button",{class:ee(["mode-btn",{active:o.modelValue==="card"}]),onClick:f[0]||(f[0]=w=>I.$emit("update:modelValue","card")),title:"卡片视图"},[...f[2]||(f[2]=[Se('<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:o.modelValue==="list"}]),onClick:f[1]||(f[1]=w=>I.$emit("update:modelValue","list")),title:"列表视图"},[...f[3]||(f[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)]))}}),Me=de(st,[["__scopeId","data-v-ae3ef498"]]),at={class:"tag-input"},nt=ie({__name:"TagInput",props:{modelValue:{},suggestions:{},placeholder:{}},emits:["update:modelValue"],setup(o,{emit:I}){const f=o,w=I,r=re({get:()=>f.modelValue,set:y=>w("update:modelValue",y)});return(y,S)=>{const O=E("el-option"),b=E("el-select");return t(),l("div",at,[a(b,{modelValue:r.value,"onUpdate:modelValue":S[0]||(S[0]=v=>r.value=v),multiple:"",filterable:"","allow-create":"","default-first-option":"",placeholder:o.placeholder,class:"tag-select","tag-type":"primary"},{default:C(()=>[(t(true),l(D,null,X(o.suggestions,v=>(t(),ae(O,{key:v,label:v,value:v},null,8,["label","value"]))),128))]),_:1},8,["modelValue","placeholder"])])}}}),Re=de(nt,[["__scopeId","data-v-68388640"]]),ot={class:"config-renderer"},it={key:0,class:"form-row"},dt={class:"field-container"},rt={key:6,class:"field-desc"},ct=ie({__name:"ConfigRenderer",props:{fields:{},modelValue:{},clearable:{type:Boolean,default:false}},emits:["update:modelValue"],setup(o,{emit:I}){const f=o,w=I,r=O=>f.modelValue[O],y=(O,b)=>{const v={...f.modelValue,[O]:b};w("update:modelValue",v)},S=O=>{if(!O.showWhen)return true;const{field:b,value:v}=O.showWhen;return f.modelValue[b]===v};return(O,b)=>{const v=E("el-switch"),k=E("el-option"),z=E("el-select"),$=E("el-input-number"),c=E("el-input");return t(),l("div",ot,[(t(true),l(D,null,X(o.fields,p=>(t(),l(D,{key:p.key},[S(p)?(t(),l("div",it,[e("div",{class:ee(["form-label",{required:p.required}])},g(p.label),3),e("div",dt,[s(" Boolean 类型 "),p.type==="boolean"?(t(),ae(v,{key:0,"model-value":r(p.key),"onUpdate:modelValue":m=>y(p.key,m)},null,8,["model-value","onUpdate:modelValue"])):p.type==="select"?(t(),l(D,{key:1},[s(" Select 类型 "),a(z,{"model-value":r(p.key),"onUpdate:modelValue":m=>y(p.key,m),placeholder:p.placeholder||"请选择",clearable:o.clearable,style:{width:"100%"}},{default:C(()=>[(t(true),l(D,null,X(p.options,m=>(t(),ae(k,{key:String(m.value),label:m.label,value:m.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)):p.type==="number"?(t(),l(D,{key:2},[s(" Number 类型 "),a($,{"model-value":r(p.key),"onUpdate:modelValue":m=>y(p.key,m),placeholder:p.placeholder,controls:true},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):p.type==="textarea"?(t(),l(D,{key:3},[s(" Textarea 类型 "),a(c,{"model-value":r(p.key),"onUpdate:modelValue":m=>y(p.key,m),type:"textarea",rows:4,placeholder:p.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):p.type==="password"?(t(),l(D,{key:4},[s(" Password 类型 "),a(c,{"model-value":r(p.key),"onUpdate:modelValue":m=>y(p.key,m),type:"password","show-password":"",placeholder:p.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(t(),l(D,{key:5},[s(" Text/String 类型 (默认) "),a(c,{"model-value":r(p.key),"onUpdate:modelValue":m=>y(p.key,m),placeholder:p.placeholder,clearable:o.clearable},null,8,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)),s(" 字段描述 "),p.description?(t(),l("div",rt,g(p.description),1)):s("v-if",true)])])):s("v-if",true)],64))),128))])}}}),Ce=de(ct,[["__scopeId","data-v-d82952a0"]]),ut={class:"dialog-layout"},vt={class:"tab-nav"},mt=["onClick"],pt={key:0,class:"tab-badge"},gt={class:"tab-content"},ft={class:"content-section"},_t={class:"form-group"},ht={class:"form-row"},yt={class:"form-group flex-1"},kt={class:"form-group"},bt={class:"switch-wrapper"},$t={class:"switch-label"},wt={class:"form-group"},Vt={class:"section-divider"},Ct={class:"content-section"},xt={class:"override-hint-bar"},It={class:"pipeline-flow"},St={class:"phase-icon"},Ut={class:"phase-info"},Tt={class:"phase-name"},Dt={class:"phase-desc"},Ot={class:"phase-badge"},zt={key:0,class:"phase-middlewares"},Pt={class:"mw-card"},Ft={class:"mw-content"},Lt={class:"mw-name"},At={class:"mw-desc"},Et={key:2,class:"phase-connector"},Mt={class:"connector-arrow"},Rt={class:"content-section"},Nt={class:"override-hint-bar"},qt={key:0,class:"plugins-override-list"},Bt=["onClick"],Ht={class:"plugin-info"},Gt={class:"plugin-name"},Jt={key:0,class:"override-badge"},Wt={class:"plugin-actions"},jt={class:"plugin-config-fields"},Kt={key:0,class:"override-field-row"},Qt={class:"field-label"},Xt={class:"field-input"},Yt={key:0,class:"field-hint"},Zt={key:1,class:"empty-hint"},el={class:"dialog-footer"},tl=ie({__name:"ChannelConfigDialog",props:{modelValue:{type:Boolean},channel:{default:null}},emits:["update:modelValue","saved"],setup(o,{emit:I}){const f=o,w=I,r=re({get:()=>f.modelValue,set:d=>w("update:modelValue",d)}),y=re(()=>{var d;return!!((d=f.channel)!=null&&d.id)}),S=h("basic"),O=h(false),b=h(new Set),v=h([]),k=h({}),z=h([]),$=h([]),c=h({name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}),p=[{id:"basic",label:"基本信息",icon:"file-text"},{id:"middlewares",label:"中间件流程",icon:"git-branch"},{id:"plugins",label:"插件配置",icon:"puzzle"}],m=[{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"}],U={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},j=re(()=>c.value.connectorId?k.value[c.value.connectorId]||[]:[]),Q=re(()=>{const d=v.value.find(u=>u.id===c.value.connectorId);return(d==null?void 0:d.name)||"连接器"}),F=re(()=>p.map(d=>{let u="";return d.id==="middlewares"&&(u=String(z.value.length)),d.id==="plugins"&&V.value.length>0&&(u=String(V.value.length)),{...d,badge:u}})),V=re(()=>$.value.filter(d=>d.configFields&&d.configFields.length>0)),_=d=>z.value.filter(u=>u.phase===d),K=(d,u)=>{var M,le,Y;return(Y=(le=(M=c.value.pluginOverrides)==null?void 0:M[d])==null?void 0:le.middlewares)==null?void 0:Y[u]},ce=(d,u,M)=>{c.value.pluginOverrides||(c.value.pluginOverrides={}),c.value.pluginOverrides[d]||(c.value.pluginOverrides[d]={}),c.value.pluginOverrides[d].middlewares||(c.value.pluginOverrides[d].middlewares={}),M==null?(delete c.value.pluginOverrides[d].middlewares[u],Object.keys(c.value.pluginOverrides[d].middlewares).length===0&&delete c.value.pluginOverrides[d].middlewares,Object.keys(c.value.pluginOverrides[d]).length===0&&delete c.value.pluginOverrides[d]):c.value.pluginOverrides[d].middlewares[u]=M},me=d=>{const u=K(d.configGroup||d.name,d.name);return u!==void 0?u?"active override":"override":d.enabled?"active":""},T=(d,u)=>{var M,le;return(le=(M=c.value.pluginOverrides)==null?void 0:M[d])==null?void 0:le[u]},x=(d,u,M)=>{c.value.pluginOverrides||(c.value.pluginOverrides={}),c.value.pluginOverrides[d]||(c.value.pluginOverrides[d]={}),M==null||M===""?(delete c.value.pluginOverrides[d][u],Object.keys(c.value.pluginOverrides[d]).length===0&&delete c.value.pluginOverrides[d]):c.value.pluginOverrides[d][u]=M},H=d=>{var M;const u=(M=c.value.pluginOverrides)==null?void 0:M[d];return u&&Object.keys(u).length>0},W=d=>{c.value.pluginOverrides&&delete c.value.pluginOverrides[d]},q=d=>{b.value.has(d)?b.value.delete(d):b.value.add(d)},n=(d,u)=>{var P,J;if(!u.showWhen)return true;const{field:M,value:le}=u.showWhen,Y=(J=(P=c.value.pluginOverrides)==null?void 0:P[d.id])==null?void 0:J[M],ne=d.config[M];return(Y!==void 0?Y:ne)===le},i=async d=>{if(c.value.connectorConfig={},d&&!k.value[d])try{const u=await $e.fields(d);k.value[d]=u}catch(u){console.error("Failed to load connector fields:",u)}},A=async()=>{var d;if(!c.value.name){G.error("请输入渠道名称");return}if(!c.value.connectorId){G.error("请选择连接器");return}O.value=true;try{y.value&&((d=f.channel)!=null&&d.id)?(await he.update(f.channel.id,c.value),G.success("保存成功")):(await he.create(c.value),G.success("创建成功")),w("saved"),r.value=false}catch(u){G.error(u instanceof Error?u.message:"操作失败")}finally{O.value=false}},Z=()=>{S.value="basic",b.value.clear()},B=async()=>{try{const[d,u,M]=await Promise.all([$e.list(),we.list(),Ie.list()]);v.value=d,z.value=u,$.value=M.filter(le=>le.configFields&&le.configFields.length>0||le.middlewares&&le.middlewares.length>0)}catch(d){console.error("Failed to load data:",d)}};return ge(()=>f.modelValue,async d=>{if(d)if(await B(),f.channel){if(c.value=JSON.parse(JSON.stringify(f.channel)),c.value.pluginOverrides||(c.value.pluginOverrides={}),c.value.connectorConfig||(c.value.connectorConfig={}),c.value.connectorId&&!k.value[c.value.connectorId])try{const u=await $e.fields(c.value.connectorId);k.value[c.value.connectorId]=u}catch(u){console.error("Failed to load connector fields:",u)}for(const u of Object.keys(c.value.pluginOverrides))b.value.add(u)}else c.value={name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}}),(d,u)=>{const M=E("k-icon"),le=E("el-input"),Y=E("el-option"),ne=E("el-select"),ue=E("el-switch"),P=E("k-button"),J=E("el-input-number"),oe=E("el-dialog");return t(),ae(oe,{modelValue:r.value,"onUpdate:modelValue":u[6]||(u[6]=N=>r.value=N),title:y.value?"编辑渠道":"创建渠道",width:"800px","close-on-click-modal":false,class:"channel-config-dialog",onClosed:Z},{footer:C(()=>[e("div",el,[a(P,{onClick:u[5]||(u[5]=N=>r.value=false)},{default:C(()=>[...u[24]||(u[24]=[R("取消",-1)])]),_:1}),a(P,{type:"primary",onClick:A,loading:O.value},{default:C(()=>[R(g(y.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:C(()=>[e("div",ut,[s(" 左侧 Tab 导航 "),e("div",vt,[(t(true),l(D,null,X(F.value,N=>(t(),l("div",{key:N.id,class:ee(["tab-item",{active:S.value===N.id}]),onClick:te=>S.value=N.id},[a(M,{name:N.icon},null,8,["name"]),e("span",null,g(N.label),1),N.badge?(t(),l("span",pt,g(N.badge),1)):s("v-if",true)],10,mt))),128))]),s(" 右侧内容区 "),e("div",gt,[s(" 基本信息 "),ke(e("div",ft,[u[13]||(u[13]=e("div",{class:"section-header"},[e("h4",null,"基本信息"),e("p",null,"设置渠道的名称、连接器和标签")],-1)),e("div",_t,[u[7]||(u[7]=e("label",{class:"form-label required"},"渠道名称",-1)),a(le,{modelValue:c.value.name,"onUpdate:modelValue":u[0]||(u[0]=N=>c.value.name=N),placeholder:"如 OpenAI DALL-E"},null,8,["modelValue"]),u[8]||(u[8]=e("div",{class:"form-hint"},"用户可见的渠道名称,冲突时会自动添加后缀",-1))]),e("div",ht,[e("div",yt,[u[9]||(u[9]=e("label",{class:"form-label required"},"连接器",-1)),a(ne,{modelValue:c.value.connectorId,"onUpdate:modelValue":u[1]||(u[1]=N=>c.value.connectorId=N),placeholder:"选择连接器",onChange:i,style:{width:"100%"}},{default:C(()=>[(t(true),l(D,null,X(v.value,N=>(t(),ae(Y,{key:N.id,label:N.name,value:N.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",kt,[u[10]||(u[10]=e("label",{class:"form-label"},"启用状态",-1)),e("div",bt,[a(ue,{modelValue:c.value.enabled,"onUpdate:modelValue":u[2]||(u[2]=N=>c.value.enabled=N)},null,8,["modelValue"]),e("span",$t,g(c.value.enabled?"启用":"禁用"),1)])])]),e("div",wt,[u[11]||(u[11]=e("label",{class:"form-label"},"标签",-1)),a(Re,{modelValue:c.value.tags,"onUpdate:modelValue":u[3]||(u[3]=N=>c.value.tags=N),placeholder:"输入标签后按回车..."},null,8,["modelValue"]),u[12]||(u[12]=e("div",{class:"form-hint"},"用于分类和筛选渠道",-1))]),s(" 连接器配置(内嵌) "),j.value.length>0?(t(),l(D,{key:0},[e("div",Vt,[e("span",null,g(Q.value)+" 配置",1)]),a(Ce,{fields:j.value,modelValue:c.value.connectorConfig,"onUpdate:modelValue":u[4]||(u[4]=N=>c.value.connectorConfig=N)},null,8,["fields","modelValue"])],64)):s("v-if",true)],512),[[be,S.value==="basic"]]),s(" 中间件流程 "),ke(e("div",Ct,[u[18]||(u[18]=e("div",{class:"section-header"},[e("h4",null,"中间件流程"),e("p",null,"控制此渠道的中间件启用状态")],-1)),e("div",xt,[a(M,{name:"info-circle"}),u[14]||(u[14]=e("span",null,"留空表示跟随全局配置",-1))]),e("div",It,[(t(),l(D,null,X(m,(N,te)=>e("div",{key:N.id,class:"phase-section"},[s(" 阶段标题 "),e("div",{class:ee(["phase-header",N.colorClass])},[e("div",St,[a(M,{name:N.icon},null,8,["name"])]),e("div",Ut,[e("span",Tt,g(N.label),1),e("span",Dt,g(N.description),1)]),e("span",Ot,g(_(N.id).length),1)],2),s(" 中间件列表 "),_(N.id).length>0?(t(),l("div",zt,[(t(true),l(D,null,X(_(N.id),se=>(t(),l("div",{key:se.name,class:ee(["mw-item",{"has-override":K(se.configGroup||se.name,se.name)!==void 0}])},[e("div",Pt,[e("div",{class:ee(["mw-status",me(se)])},null,2),e("div",Ft,[e("span",Lt,g(se.displayName),1),e("span",At,g(se.description||U[se.category]||se.category),1)]),a(ne,{"model-value":K(se.configGroup||se.name,se.name),"onUpdate:modelValue":Ne=>ce(se.configGroup||se.name,se.name,Ne),placeholder:se.enabled?"全局: 启用":"全局: 禁用",clearable:"",size:"small",class:"mw-switch"},{default:C(()=>[a(Y,{label:"启用",value:true}),a(Y,{label:"禁用",value:false})]),_:1},8,["model-value","onUpdate:modelValue","placeholder"])])],2))),128))])):(t(),l(D,{key:1},[s(" 空状态 "),u[15]||(u[15]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),s(" 阶段间连接箭头 "),te<m.length-1?(t(),l("div",Et,[u[16]||(u[16]=e("div",{class:"connector-line"},null,-1)),e("div",Mt,[a(M,{name:"chevron-down"})]),u[17]||(u[17]=e("div",{class:"connector-line"},null,-1))])):s("v-if",true)])),64))]),s(" 底部说明 "),u[19]||(u[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,S.value==="middlewares"]]),s(" 插件配置 "),ke(e("div",Rt,[u[23]||(u[23]=e("div",{class:"section-header"},[e("h4",null,"插件配置覆盖"),e("p",null,"为此渠道单独配置插件参数")],-1)),e("div",Nt,[a(M,{name:"info-circle"}),u[20]||(u[20]=e("span",null,"留空使用全局配置,填写后将覆盖全局设置",-1))]),V.value.length>0?(t(),l("div",qt,[(t(true),l(D,null,X(V.value,N=>(t(),l("div",{key:N.id,class:ee(["plugin-override-card",{expanded:b.value.has(N.id)}])},[e("div",{class:"plugin-header",onClick:te=>q(N.id)},[e("div",Ht,[e("span",Gt,g(N.name),1),H(N.id)?(t(),l("span",Jt,"已覆盖")):s("v-if",true)]),e("div",Wt,[H(N.id)?(t(),ae(P,{key:0,size:"mini",onClick:ve(te=>W(N.id),["stop"])},{default:C(()=>[...u[21]||(u[21]=[R(" 清除 ",-1)])]),_:1},8,["onClick"])):s("v-if",true),a(M,{name:b.value.has(N.id)?"chevron-up":"chevron-down"},null,8,["name"])])],8,Bt),ke(e("div",jt,[(t(true),l(D,null,X(N.configFields,te=>(t(),l(D,{key:te.key},[n(N,te)?(t(),l("div",Kt,[e("label",Qt,g(te.label),1),e("div",Xt,[s(" Boolean 类型 "),te.type==="boolean"?(t(),ae(ne,{key:0,"model-value":T(N.id,te.key),"onUpdate:modelValue":se=>x(N.id,te.key,se),placeholder:"使用全局配置",clearable:""},{default:C(()=>[a(Y,{label:"是",value:true}),a(Y,{label:"否",value:false})]),_:1},8,["model-value","onUpdate:modelValue"])):te.type==="select"?(t(),l(D,{key:1},[s(" Select 类型 "),a(ne,{"model-value":T(N.id,te.key),"onUpdate:modelValue":se=>x(N.id,te.key,se),placeholder:`全局: ${N.config[te.key]??"未设置"}`,clearable:""},{default:C(()=>[(t(true),l(D,null,X(te.options,se=>(t(),ae(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(D,{key:2},[s(" Number 类型 "),a(J,{"model-value":T(N.id,te.key),"onUpdate:modelValue":se=>x(N.id,te.key,se),placeholder:`全局: ${N.config[te.key]??""}`},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(t(),l(D,{key:3},[s(" Text/String 类型 (默认) "),a(le,{"model-value":T(N.id,te.key),"onUpdate:modelValue":se=>x(N.id,te.key,se),placeholder:`全局: ${N.config[te.key]??"未设置"}`,clearable:""},null,8,["model-value","onUpdate:modelValue","placeholder"])],64))]),te.description?(t(),l("div",Yt,g(te.description),1)):s("v-if",true)])):s("v-if",true)],64))),128))],512),[[be,b.value.has(N.id)]])],2))),128))])):(t(),l("div",Zt,[a(M,{name:"apps"}),u[22]||(u[22]=e("span",null,"暂无可配置的插件",-1))]))],512),[[be,S.value==="plugins"]])])])]),_:1},8,["modelValue","title"])}}}),ll=de(tl,[["__scopeId","data-v-74bfe0c7"]]),sl={key:0},al=ie({__name:"LoadingState",props:{text:{default:"加载中..."},icon:{default:"sync"},size:{default:"default"}},setup(o){const I=o,f=re(()=>`size-${I.size}`);return(w,r)=>{const y=E("k-icon");return t(),l("div",{class:ee(["loading-state",f.value])},[a(y,{name:o.icon,class:"loading-icon"},null,8,["name"]),o.text?(t(),l("span",sl,g(o.text),1)):s("v-if",true)],2)}}}),nl=de(al,[["__scopeId","data-v-99cf565d"]]),ol={class:"ml-view-container"},il={class:"ml-view-header"},dl={class:"ml-header-left"},rl={class:"ml-header-right"},cl={class:"ml-view-content"},ul={class:"ml-grid"},vl=["onClick"],ml={class:"card-header"},pl={class:"header-main"},gl={class:"channel-name"},fl={class:"header-meta"},_l={class:"connector-badge"},hl={key:0,class:"cost-badge"},yl={class:"card-body"},kl={key:0,class:"field-list"},bl={class:"field-label"},$l={class:"field-value"},wl={key:1,class:"tags-list"},Vl={class:"ml-table-container"},Cl={class:"ml-table"},xl=["onClick"],Il={class:"col-name"},Sl={class:"name-text"},Ul={class:"col-connector"},Tl={class:"connector-badge"},Dl={class:"col-tags"},Ol={class:"tags-wrapper"},zl={key:0,class:"mini-tag more"},Pl={class:"col-cost"},Fl={key:0,class:"cost-value"},Ll={class:"action-btns"},Al=ie({__name:"ChannelsView",setup(o){const I=["text2img","img2img","NSFW"],f=h(false),w=h("card"),r=h([]),y=h([]),S=h([]),O=h({}),b=h(false),v=h(null),k=h([]),z=re(()=>{const T=new Set;return r.value.forEach(x=>{(x.tags||[]).forEach(H=>T.add(H))}),Array.from(T).sort()}),$=re(()=>k.value.length===0?r.value:r.value.filter(T=>k.value.every(x=>(T.tags||[]).includes(x)))),c=T=>{const x=y.value.find(H=>H.id===T);return x?x.name:T},p=T=>{var H;const x=y.value.find(W=>W.id===T.connectorId);return(H=x==null?void 0:x.cardFields)!=null&&H.length?x.cardFields.map(W=>{const q=x.fields.find(n=>n.key===W.key);return{key:W.key,label:W.label||(q==null?void 0:q.label)||W.key,format:W.format||"text"}}):[]},m=(T,x)=>{var W,q,n,i,A;const H=x.configGroup;switch(x.source){case"channel":if(H){const Z=(q=(W=T.pluginOverrides)==null?void 0:W[H])==null?void 0:q[x.key];if(Z!==void 0)return Z}return T[x.key];case"connectorConfig":return(n=T.connectorConfig)==null?void 0:n[x.key];case"pluginOverride":return H?(A=(i=T.pluginOverrides)==null?void 0:i[H])==null?void 0:A[x.key]:void 0;default:return}},U=(T,x)=>{var n,i,A;const H=x.configGroup;if(!H)return x.suffix||"";const W=(i=(n=T.pluginOverrides)==null?void 0:n[H])==null?void 0:i.currencyLabel;if(W)return` ${W}${x.suffix||""}`;const q=(A=O.value[H])==null?void 0:A.currencyLabel;return q?` ${q}${x.suffix||""}`:` 积分${x.suffix||""}`},j=(T,x,H)=>{if(T==null||T==="")return"-";let W;switch(x){case"password-mask":W="••••••";break;case"boolean":W=T?"是":"否";break;case"number":W=String(T);break;case"size":W=String(T);break;case"currency":W=T===0?"免费":String(T);break;default:W=String(T)}return H?`${W} ${H}`:W},Q=async()=>{f.value=true;try{const[T,x,H]=await Promise.all([he.list(),$e.list(),we.cardFields()]);r.value=T,y.value=x,S.value=H.fields,O.value=H.globalConfigs}catch{G.error("加载数据失败")}finally{f.value=false}},F=()=>{v.value=null,b.value=true},V=T=>{v.value=T,b.value=true},_=()=>{Q()},K=async T=>{if(confirm(`确定要删除渠道 "${T.name}" 吗?`))try{await he.delete(T.id),G.success("删除成功"),Q()}catch{G.error("删除失败")}},ce=async T=>{try{await he.toggle(T.id,T.enabled)}catch{T.enabled=!T.enabled,G.error("操作失败")}},me=T=>{const x=JSON.parse(JSON.stringify(T));delete x.id,x.name=`${T.name} (副本)`,v.value=x,b.value=true};return pe(()=>{Q()}),(T,x)=>{const H=E("k-icon"),W=E("k-button"),q=E("el-switch");return t(),l("div",ol,[e("div",il,[e("div",dl,[a(W,{solid:"",type:"primary",onClick:F},{icon:C(()=>[a(H,{name:"add"})]),default:C(()=>[x[7]||(x[7]=R(" 新建渠道 ",-1))]),_:1}),a(Ue,{modelValue:k.value,"onUpdate:modelValue":x[0]||(x[0]=n=>k.value=n),"all-tags":z.value,"preset-tags":I},null,8,["modelValue","all-tags"])]),e("div",rl,[a(Me,{modelValue:w.value,"onUpdate:modelValue":x[1]||(x[1]=n=>w.value=n)},null,8,["modelValue"])])]),e("div",cl,[f.value?(t(),ae(nl,{key:0})):w.value==="card"?(t(),l(D,{key:1},[s(" 卡片视图 "),e("div",ul,[(t(true),l(D,null,X($.value,n=>(t(),l("div",{key:n.id},[e("div",{class:"ml-card ml-card--clickable",onClick:i=>V(n)},[e("div",ml,[e("div",pl,[e("div",gl,g(n.name),1),a(q,{modelValue:n.enabled,"onUpdate:modelValue":i=>n.enabled=i,size:"small",onChange:i=>ce(n),onClick:x[2]||(x[2]=ve(()=>{},["stop"]))},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("div",fl,[e("span",_l,[a(H,{name:"link"}),R(" "+g(c(n.connectorId)),1)]),s(" 中间件字段(如费用)显示在标题旁 "),(t(true),l(D,null,X(S.value,i=>(t(),l(D,{key:`mw-${i.key}`},[i.key==="cost"?(t(),l("span",hl,g(j(m(n,i),i.format,U(n,i))),1)):s("v-if",true)],64))),128))])]),e("div",yl,[s(" 配置字段列表 "),p(n).length?(t(),l("div",kl,[(t(true),l(D,null,X(p(n),i=>(t(),l("div",{key:i.key,class:"field-item"},[e("span",bl,g(i.label),1),e("span",$l,g(j(n.connectorConfig[i.key],i.format)),1)]))),128))])):s("v-if",true),s(" 标签 "),n.tags&&n.tags.length?(t(),l("div",wl,[(t(true),l(D,null,X(n.tags,i=>(t(),l("span",{key:i,class:"tag-pill"},g(i),1))),128))])):s("v-if",true)]),e("div",{class:"card-footer",onClick:x[3]||(x[3]=ve(()=>{},["stop"]))},[a(W,{size:"mini",class:"ml-btn-outline-primary",onClick:i=>me(n)},{icon:C(()=>[a(H,{name:"copy"})]),default:C(()=>[x[8]||(x[8]=R(" 复制 ",-1))]),_:1},8,["onClick"]),x[10]||(x[10]=e("div",{class:"spacer"},null,-1)),a(W,{size:"mini",class:"ml-btn-outline-danger",onClick:i=>K(n)},{icon:C(()=>[a(H,{name:"delete"})]),default:C(()=>[x[9]||(x[9]=R(" 删除 ",-1))]),_:1},8,["onClick"])])],8,vl)]))),128))])],2112)):(t(),l(D,{key:2},[s(" 列表视图 "),e("div",Vl,[e("table",Cl,[x[13]||(x[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(D,null,X($.value,n=>(t(),l("tr",{key:n.id,onClick:i=>V(n)},[e("td",Il,[e("span",Sl,g(n.name),1)]),e("td",Ul,[e("span",Tl,g(c(n.connectorId)),1)]),e("td",Dl,[e("div",Ol,[(t(true),l(D,null,X((n.tags||[]).slice(0,2),i=>(t(),l("span",{key:i,class:"mini-tag"},g(i),1))),128)),n.tags&&n.tags.length>2?(t(),l("span",zl,"+"+g(n.tags.length-2),1)):s("v-if",true)])]),e("td",Pl,[(t(true),l(D,null,X(S.value,i=>(t(),l(D,{key:`mw-${i.key}`},[i.key==="cost"?(t(),l("span",Fl,g(j(m(n,i),i.format,U(n,i))),1)):s("v-if",true)],64))),128))]),e("td",{class:"col-status",onClick:x[4]||(x[4]=ve(()=>{},["stop"]))},[a(q,{modelValue:n.enabled,"onUpdate:modelValue":i=>n.enabled=i,size:"small",onChange:i=>ce(n)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:x[5]||(x[5]=ve(()=>{},["stop"]))},[e("div",Ll,[a(W,{size:"mini",class:"ml-btn-outline-primary",onClick:i=>me(n)},{icon:C(()=>[a(H,{name:"copy"})]),default:C(()=>[x[11]||(x[11]=R(" 复制 ",-1))]),_:1},8,["onClick"]),a(W,{size:"mini",class:"ml-btn-outline-danger",onClick:i=>K(n)},{icon:C(()=>[a(H,{name:"delete"})]),default:C(()=>[x[12]||(x[12]=R(" 删除 ",-1))]),_:1},8,["onClick"])])])],8,xl))),128))])])])],2112))]),s(" 编辑/创建对话框 "),a(ll,{modelValue:b.value,"onUpdate:modelValue":x[6]||(x[6]=n=>b.value=n),channel:v.value,onSaved:_},null,8,["modelValue","channel"])])}}}),El=de(Al,[["__scopeId","data-v-67a4b49d"]]),Ml={class:"json-editor"},Rl={key:0,class:"error-msg"},Nl=ie({__name:"JsonEditor",props:{modelValue:{},rows:{}},emits:["update:modelValue"],setup(o,{emit:I}){const f=o,w=I,r=h(""),y=h("");ge(()=>f.modelValue,O=>{try{r.value=JSON.stringify(O,null,2)}catch{r.value=""}},{immediate:true});const S=()=>{try{const O=JSON.parse(r.value);y.value="",w("update:modelValue",O)}catch{y.value="Invalid JSON format"}};return(O,b)=>{const v=E("el-input");return t(),l("div",Ml,[a(v,{modelValue:r.value,"onUpdate:modelValue":b[0]||(b[0]=k=>r.value=k),type:"textarea",rows:o.rows,class:"code-input",onBlur:S},null,8,["modelValue","rows"]),y.value?(t(),l("div",Rl,g(y.value),1)):s("v-if",true)])}}}),ql=de(Nl,[["__scopeId","data-v-4d47b7db"]]),Bl={class:"image-upload"},Hl={key:0,class:"image-list"},Gl={class:"image-preview"},Jl=["src","alt"],Wl={class:"image-overlay"},jl={class:"image-name"},Kl={class:"upload-content"},Ql={key:1,class:"upload-loading"},Xl=ie({__name:"ImageUpload",props:{modelValue:{},maxCount:{}},emits:["update:modelValue"],setup(o,{emit:I}){const f=o,w=I,r=h(),y=h(false),S=h([]),O=async()=>{var m;const p=[];for(const U of f.modelValue)U&&p.push({url:U,filename:((m=U.split("/").pop())==null?void 0:m.split("?")[0])||"image",mime:"image/png",previewUrl:U});S.value=p};ge(()=>f.modelValue,()=>{O()},{immediate:true});const b=()=>{var p;(p=r.value)==null||p.click()},v=async p=>{const m=p.target;!m.files||m.files.length===0||(await z(Array.from(m.files)),m.value="")},k=async p=>{var U;const m=(U=p.dataTransfer)==null?void 0:U.files;!m||m.length===0||await z(Array.from(m).filter(j=>j.type.startsWith("image/")))},z=async p=>{if(p.length===0)return;const m=f.maxCount||10;S.value.length+p.length>m&&(G.warning(`最多上传 ${m} 张图片`),p=p.slice(0,m-S.value.length)),y.value=true;try{for(const U of p){const j=await $(U),Q=await Qe.upload(j,U.type,U.name);if(!Q.url){G.error("缓存服务未配置 selfUrl,无法获取图片 URL");continue}S.value.push({url:Q.url,filename:Q.filename,mime:Q.mime,previewUrl:Q.url})}w("update:modelValue",S.value.map(U=>U.url))}catch(U){G.error("上传失败"),console.error(U)}finally{y.value=false}},$=p=>new Promise((m,U)=>{const j=new FileReader;j.onload=()=>{const F=j.result.split(",")[1];m(F)},j.onerror=U,j.readAsDataURL(p)}),c=p=>{S.value.splice(p,1),w("update:modelValue",S.value.map(m=>m.url))};return pe(()=>{O()}),(p,m)=>{const U=E("k-icon"),j=E("k-button");return t(),l("div",Bl,[s(" 已上传的图片列表 "),S.value.length>0?(t(),l("div",Hl,[(t(true),l(D,null,X(S.value,(Q,F)=>(t(),l("div",{key:Q.url||F,class:"image-item"},[e("div",Gl,[e("img",{src:Q.previewUrl,alt:Q.filename},null,8,Jl),e("div",Wl,[a(j,{size:"mini",class:"remove-btn",onClick:V=>c(F)},{icon:C(()=>[a(U,{name:"delete"})]),_:1},8,["onClick"])])]),e("div",jl,g(Q.filename),1)]))),128))])):s("v-if",true),s(" 上传按钮 "),e("div",{class:"upload-area",onClick:b,onDragover:m[0]||(m[0]=ve(()=>{},["prevent"])),onDrop:ve(k,["prevent"])},[e("input",{ref_key:"fileInput",ref:r,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:v},null,544),e("div",Kl,[a(U,{name:"add",class:"upload-icon"}),m[1]||(m[1]=e("span",{class:"upload-text"},"点击或拖拽上传图片",-1))])],32),s(" 加载状态 "),y.value?(t(),l("div",Ql,[a(U,{name:"sync",class:"loading-icon"}),m[2]||(m[2]=R(" 上传中... ",-1))])):s("v-if",true)])}}}),Pe=de(Xl,[["__scopeId","data-v-47f2485e"]]),Yl={class:"ml-view-container"},Zl={class:"ml-view-header"},es={class:"ml-header-left"},ts={class:"ml-header-right"},ls={class:"ml-view-content"},ss={key:0,class:"loading-state"},as={class:"ml-masonry"},ns=["onClick"],os={key:0,class:"card-thumbnail"},is=["src","alt"],ds={class:"thumbnail-overlay"},rs={key:0,class:"ref-count"},cs={key:1,class:"card-thumbnail placeholder"},us={class:"card-content"},vs={class:"card-title"},ms={key:0,class:"card-tags"},ps={key:0,class:"mini-tag more"},gs={class:"ml-table-container"},fs={class:"ml-table"},_s=["onClick"],hs={class:"col-thumb"},ys={class:"thumb-wrapper"},ks=["src","alt"],bs={key:1,class:"thumb-placeholder"},$s={class:"col-name"},ws={class:"name-text"},Vs={class:"col-template"},Cs={class:"template-preview"},xs={class:"col-refs"},Is={key:0,class:"ref-badge"},Ss={key:1,class:"no-data"},Us={class:"col-source"},Ts={class:"action-btns"},Ds={class:"dialog-footer"},Os=ie({__name:"PresetsView",setup(o){const I=["本地","远程","text2img","img2img","NSFW"],f=h(false),w=h([]),r=h(false),y=h(false),S=h([]),O=h("card"),b=re(()=>{const V=new Set;return w.value.forEach(_=>{(_.tags||[]).forEach(K=>V.add(K))}),Array.from(V).sort()}),v=h({name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"}),k=h([]);ge(()=>v.value.thumbnail,V=>{k.value=V?[V]:[]},{immediate:true}),ge(k,V=>{v.value.thumbnail=V.length>0?V[0]:""});const z=re(()=>S.value.length===0?w.value:w.value.filter(V=>S.value.every(_=>_==="本地"?V.source==="user":_==="远程"?V.source==="api":(V.tags||[]).includes(_)))),$=async()=>{f.value=true;try{w.value=await _e.list()}catch{G.error("加载数据失败")}finally{f.value=false}},c=()=>{y.value=false,v.value={name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"},r.value=true},p=V=>{y.value=true,v.value=JSON.parse(JSON.stringify(V)),r.value=true},m=V=>{y.value=false;const _=JSON.parse(JSON.stringify(V));delete _.id,_.name=`${V.name} (副本)`,_.source="user",v.value=_,r.value=true},U=async V=>{try{await _e.toggle(V.id,V.enabled)}catch{V.enabled=!V.enabled,G.error("操作失败")}},j=(V,_=50)=>{if(!V)return"-";const K=V.replace(/\s+/g," ").trim();return K.length<=_?K:K.slice(0,_)+"..."},Q=async()=>{if(!v.value.name||!v.value.promptTemplate){G.warning("请填写必要信息");return}try{y.value&&v.value.id?(await _e.update(v.value.id,v.value),G.success("更新成功")):(await _e.create(v.value),G.success("创建成功")),r.value=false,$()}catch{G.error("操作失败")}},F=async V=>{if(confirm(`确定要删除预设 "${V.name}" 吗?`))try{await _e.delete(V.id),G.success("删除成功"),$()}catch{G.error("删除失败")}};return pe(()=>{$()}),(V,_)=>{const K=E("k-icon"),ce=E("k-button"),me=E("el-switch"),T=E("el-input"),x=E("el-form-item"),H=E("el-divider"),W=E("el-form"),q=E("el-dialog");return t(),l("div",Yl,[e("div",Zl,[e("div",es,[a(ce,{solid:"",type:"primary",onClick:c},{icon:C(()=>[a(K,{name:"add"})]),default:C(()=>[_[14]||(_[14]=R(" 新建预设 ",-1))]),_:1}),a(Ue,{modelValue:S.value,"onUpdate:modelValue":_[0]||(_[0]=n=>S.value=n),"all-tags":b.value,"preset-tags":I},null,8,["modelValue","all-tags"])]),e("div",ts,[a(Me,{modelValue:O.value,"onUpdate:modelValue":_[1]||(_[1]=n=>O.value=n)},null,8,["modelValue"])])]),e("div",ls,[f.value?(t(),l("div",ss,[a(K,{name:"sync",class:"ml-spin"}),_[15]||(_[15]=R(" 加载中... ",-1))])):O.value==="card"?(t(),l(D,{key:1},[s(" 卡片视图 (瀑布流) "),e("div",as,[(t(true),l(D,null,X(z.value,n=>{var i,A;return t(),l("div",{key:n.id,class:"ml-masonry-item"},[e("div",{class:"preset-card",onClick:Z=>p(n)},[s(" 缩略图 "),n.thumbnail?(t(),l("div",os,[e("img",{src:n.thumbnail,alt:n.name,loading:"lazy"},null,8,is),e("div",ds,[(i=n.referenceImages)!=null&&i.length?(t(),l("span",rs,[a(K,{name:"image"}),R(" "+g(n.referenceImages.length),1)])):s("v-if",true)])])):(t(),l("div",cs,[a(K,{name:"image",class:"placeholder-icon"})])),s(" 内容 "),e("div",us,[e("div",vs,g(n.name),1),(A=n.tags)!=null&&A.length?(t(),l("div",ms,[(t(true),l(D,null,X(n.tags.slice(0,4),Z=>(t(),l("span",{key:Z,class:"mini-tag"},g(Z),1))),128)),n.tags.length>4?(t(),l("span",ps,"+"+g(n.tags.length-4),1)):s("v-if",true)])):s("v-if",true)]),s(" 操作按钮 "),e("div",{class:"card-actions",onClick:_[2]||(_[2]=ve(()=>{},["stop"]))},[a(me,{modelValue:n.enabled,"onUpdate:modelValue":Z=>n.enabled=Z,size:"small",onChange:Z=>U(n)},null,8,["modelValue","onUpdate:modelValue","onChange"]),a(ce,{size:"mini",class:"ml-btn-outline-primary",onClick:Z=>m(n)},{icon:C(()=>[a(K,{name:"copy"})]),default:C(()=>[_[16]||(_[16]=R(" 复制 ",-1))]),_:1},8,["onClick"]),n.source==="user"?(t(),ae(ce,{key:0,size:"mini",class:"ml-btn-outline-danger",onClick:Z=>F(n)},{icon:C(()=>[a(K,{name:"delete"})]),default:C(()=>[_[17]||(_[17]=R(" 删除 ",-1))]),_:1},8,["onClick"])):s("v-if",true)]),s(" 来源标记 "),e("div",{class:ee(["source-indicator",n.source])},g(n.source==="api"?"远程":"本地"),3)],8,ns)])}),128))])],2112)):(t(),l(D,{key:2},[s(" 列表视图 "),e("div",gs,[e("table",fs,[_[20]||(_[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(D,null,X(z.value,n=>{var i;return t(),l("tr",{key:n.id,onClick:A=>p(n)},[e("td",hs,[e("div",ys,[n.thumbnail?(t(),l("img",{key:0,src:n.thumbnail,alt:n.name},null,8,ks)):(t(),l("div",bs,[a(K,{name:"image"})]))])]),e("td",$s,[e("span",ws,g(n.name),1)]),e("td",Vs,[e("span",Cs,g(j(n.promptTemplate)),1)]),e("td",xs,[(i=n.referenceImages)!=null&&i.length?(t(),l("span",Is,[a(K,{name:"image"}),R(" "+g(n.referenceImages.length),1)])):(t(),l("span",Ss,"-"))]),e("td",Us,[e("span",{class:ee(["source-badge",n.source])},g(n.source==="api"?"远程":"本地"),3)]),e("td",{class:"col-status",onClick:_[3]||(_[3]=ve(()=>{},["stop"]))},[a(me,{modelValue:n.enabled,"onUpdate:modelValue":A=>n.enabled=A,size:"small",onChange:A=>U(n)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:_[4]||(_[4]=ve(()=>{},["stop"]))},[e("div",Ts,[a(ce,{size:"mini",class:"ml-btn-outline-primary",onClick:A=>m(n)},{icon:C(()=>[a(K,{name:"copy"})]),default:C(()=>[_[18]||(_[18]=R(" 复制 ",-1))]),_:1},8,["onClick"]),n.source==="user"?(t(),ae(ce,{key:0,size:"mini",class:"ml-btn-outline-danger",onClick:A=>F(n)},{icon:C(()=>[a(K,{name:"delete"})]),default:C(()=>[_[19]||(_[19]=R(" 删除 ",-1))]),_:1},8,["onClick"])):s("v-if",true)])])],8,_s)}),128))])])])],2112))]),s(" 编辑/创建对话框 "),a(q,{modelValue:r.value,"onUpdate:modelValue":_[13]||(_[13]=n=>r.value=n),title:y.value?"编辑预设":"创建预设",width:"600px","close-on-click-modal":false},{footer:C(()=>[e("span",Ds,[a(ce,{onClick:_[12]||(_[12]=n=>r.value=false)},{default:C(()=>[..._[27]||(_[27]=[R("取消",-1)])]),_:1}),a(ce,{type:"primary",onClick:Q},{default:C(()=>[..._[28]||(_[28]=[R("保存",-1)])]),_:1})])]),default:C(()=>[r.value?(t(),ae(W,{key:0,ref:"formRef",model:v.value,"label-width":"100px"},{default:C(()=>[a(x,{label:"名称",required:""},{default:C(()=>[a(T,{modelValue:v.value.name,"onUpdate:modelValue":_[5]||(_[5]=n=>v.value.name=n),disabled:y.value&&v.value.source==="api",placeholder:"如 二次元少女"},null,8,["modelValue","disabled"]),_[21]||(_[21]=e("div",{class:"form-tip"},"用于指令调用和展示,冲突时会自动添加后缀",-1))]),_:1}),a(x,{label:"Prompt 模板",required:""},{default:C(()=>[a(T,{modelValue:v.value.promptTemplate,"onUpdate:modelValue":_[6]||(_[6]=n=>v.value.promptTemplate=n),type:"textarea",rows:4,placeholder:"输入提示词模板,支持变量如 {prompt}"},null,8,["modelValue"]),_[22]||(_[22]=e("div",{class:"form-tip"},"默认将用户输入附加在最后,也可使用 {prompt} 指定位置",-1))]),_:1}),v.value.source==="user"?(t(),ae(x,{key:0,label:"缩略图"},{default:C(()=>[a(Pe,{modelValue:k.value,"onUpdate:modelValue":_[7]||(_[7]=n=>k.value=n),"max-count":1},null,8,["modelValue"]),_[23]||(_[23]=e("div",{class:"form-tip"},"用于在卡片视图中展示预设的预览图",-1))]),_:1})):s("v-if",true),a(x,{label:"参考图"},{default:C(()=>[a(Pe,{modelValue:v.value.referenceImages,"onUpdate:modelValue":_[8]||(_[8]=n=>v.value.referenceImages=n),"max-count":5},null,8,["modelValue"]),_[24]||(_[24]=e("div",{class:"form-tip"},"生成时会自动附加这些参考图片",-1))]),_:1}),a(H,{"content-position":"left"},{default:C(()=>[..._[25]||(_[25]=[R("高级设置",-1)])]),_:1}),a(x,{label:"标签"},{default:C(()=>[a(Re,{modelValue:v.value.tags,"onUpdate:modelValue":_[9]||(_[9]=n=>v.value.tags=n),placeholder:"输入标签..."},null,8,["modelValue"]),_[26]||(_[26]=e("div",{class:"form-tip"},"与渠道标签匹配时会自动关联",-1))]),_:1}),a(x,{label:"参数覆盖"},{default:C(()=>[a(ql,{modelValue:v.value.parameterOverrides,"onUpdate:modelValue":_[10]||(_[10]=n=>v.value.parameterOverrides=n),rows:3},null,8,["modelValue"])]),_:1}),a(x,{label:"启用状态"},{default:C(()=>[a(me,{modelValue:v.value.enabled,"onUpdate:modelValue":_[11]||(_[11]=n=>v.value.enabled=n)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])):s("v-if",true)]),_:1},8,["modelValue","title"])])}}}),zs=de(Os,[["__scopeId","data-v-8eaa50b4"]]),Ps=ie({__name:"StatusBadge",props:{status:{}},setup(o){const I=o,f=re(()=>{switch(I.status){case"pending":return"等待中";case"processing":return"处理中";case"success":return"成功";case"failed":return"失败";default:return I.status}});return(w,r)=>(t(),l("span",{class:ee(["status-badge",o.status])},g(f.value),3))}}),Fe=de(Ps,[["__scopeId","data-v-0bc21896"]]),Fs={class:"lightbox-container"},Ls={class:"lightbox-content"},As=["src"],Es={key:2,class:"image-counter"},Ms={key:0,class:"lightbox-sidebar"},Rs={class:"sidebar-header"},Ns={class:"sidebar-body"},qs={class:"info-block"},Bs={class:"block-header"},Hs={key:0,class:"info-block"},Gs={class:"info-value"},Js={key:1,class:"info-block"},Ws={class:"info-value"},js={class:"sidebar-footer"},Ks=ie({__name:"ImageLightbox",props:{visible:{type:Boolean},images:{},initialIndex:{default:0},prompt:{},createdAt:{},duration:{},showSidebar:{type:Boolean,default:true}},emits:["update:visible","close"],setup(o,{emit:I}){const f=o,w=I,r=h(f.initialIndex),y=re(()=>f.images[r.value]||"");ge(()=>f.visible,m=>{m?(r.value=f.initialIndex,document.body.style.overflow="hidden"):document.body.style.overflow=""}),ge(()=>f.initialIndex,m=>{r.value=m});const S=()=>{w("update:visible",false),w("close")},O=()=>{r.value=(r.value-1+f.images.length)%f.images.length},b=()=>{r.value=(r.value+1)%f.images.length},v=()=>{f.prompt&&(navigator.clipboard.writeText(f.prompt),G.success("已复制提示词"))},k=()=>{window.open(y.value,"_blank")},z=()=>{const m=document.createElement("a");m.href=y.value,m.download=`image-${Date.now()}.png`,m.click()},$=m=>(typeof m=="string"?new Date(m):m).toLocaleString(),c=m=>m<1e3?`${m}ms`:`${(m/1e3).toFixed(1)}s`,p=m=>{f.visible&&(m.key==="Escape"?S():m.key==="ArrowLeft"?O():m.key==="ArrowRight"&&b())};return pe(()=>{window.addEventListener("keydown",p)}),Ve(()=>{window.removeEventListener("keydown",p),document.body.style.overflow=""}),(m,U)=>{const j=E("k-icon");return t(),ae(Be,{to:"body"},[a(Ae,{name:"lightbox-fade"},{default:C(()=>[o.visible?(t(),l("div",{key:0,class:"lightbox-overlay",onClick:ve(S,["self"])},[e("div",Fs,[e("div",Ls,[s(" 左侧图片区域 "),e("div",{class:"lightbox-image-area",onClick:ve(S,["self"])},[s(" 关闭按钮 "),e("button",{class:"close-btn",onClick:S,title:"关闭 (Esc)"},[a(j,{name:"times"})]),s(" 多图时的导航 "),o.images.length>1?(t(),l("button",{key:0,class:"nav-btn prev",onClick:ve(O,["stop"]),title:"上一张"},[a(j,{name:"chevron-left"})])):s("v-if",true),e("img",{src:y.value,class:"lightbox-image",alt:"Preview"},null,8,As),o.images.length>1?(t(),l("button",{key:1,class:"nav-btn next",onClick:ve(b,["stop"]),title:"下一张"},[a(j,{name:"chevron-right"})])):s("v-if",true),s(" 图片计数器 "),o.images.length>1?(t(),l("div",Es,g(r.value+1)+" / "+g(o.images.length),1)):s("v-if",true)]),s(" 右侧信息栏 "),o.showSidebar?(t(),l("div",Ms,[e("div",Rs,[U[0]||(U[0]=e("div",{class:"info-title"},"图片详情",-1)),e("button",{class:"header-close-btn",onClick:S,title:"关闭"},[a(j,{name:"times"})])]),e("div",Ns,[s(" 提示词 "),e("div",qs,[e("div",Bs,[U[1]||(U[1]=e("span",null,"提示词",-1)),o.prompt?(t(),l("button",{key:0,class:"copy-btn",onClick:v}," 复制 ")):s("v-if",true)]),e("div",{class:ee(["prompt-content",{empty:!o.prompt}])},g(o.prompt||"无提示词"),3)]),s(" 创建时间 "),o.createdAt?(t(),l("div",Hs,[U[2]||(U[2]=e("div",{class:"block-header"},[e("span",null,"创建时间")],-1)),e("div",Gs,g($(o.createdAt)),1)])):s("v-if",true),s(" 生成耗时 "),o.duration?(t(),l("div",Js,[U[3]||(U[3]=e("div",{class:"block-header"},[e("span",null,"生成耗时")],-1)),e("div",Ws,g(c(o.duration)),1)])):s("v-if",true)]),e("div",js,[e("button",{class:"action-btn primary",onClick:k},[a(j,{name:"external-link"}),U[4]||(U[4]=R(" 查看原图 ",-1))]),e("button",{class:"action-btn secondary",onClick:z},[a(j,{name:"download"}),U[5]||(U[5]=R(" 下载 ",-1))])])])):s("v-if",true)])])])):s("v-if",true)]),_:1})])}}}),Te=de(Ks,[["__scopeId","data-v-bd68872f"]]),Qs={class:"ml-view-container"},Xs={class:"ml-view-header"},Ys={class:"ml-header-left"},Zs={class:"view-mode-switch"},ea={class:"ml-header-right"},ta={key:0,class:"stats-grid"},la={class:"stat-card"},sa={class:"stat-icon total"},aa={class:"stat-content"},na={class:"stat-value"},oa={class:"stat-card"},ia={class:"stat-icon success"},da={class:"stat-content"},ra={class:"stat-value success"},ca={class:"stat-card"},ua={class:"stat-icon failed"},va={class:"stat-content"},ma={class:"stat-value failed"},pa={class:"stat-card"},ga={class:"stat-icon processing"},fa={class:"stat-content"},_a={class:"stat-value pending"},ha={class:"stat-card"},ya={class:"stat-icon rate"},ka={class:"stat-content"},ba={class:"stat-value"},$a={class:"filter-bar"},wa={class:"filter-group"},Va={key:0,class:"pagination-info"},Ca={class:"ml-view-content"},xa={class:"mono-text"},Ia=["title"],Sa={key:0},Ua={key:1,class:"text-muted"},Ta={key:0},Da={key:1},Oa={class:"time-text"},za={key:0,class:"empty-gallery"},Pa={key:1,class:"ml-masonry"},Fa=["onClick"],La={class:"gallery-image-wrapper"},Aa=["src"],Ea=["src"],Ma={class:"gallery-overlay"},Ra={class:"gallery-info"},Na=["title"],qa={class:"gallery-meta"},Ba={class:"gallery-time"},Ha={class:"pagination"},Ga={key:0,class:"task-detail"},Ja={class:"detail-section"},Wa={class:"detail-grid"},ja={class:"detail-item"},Ka={class:"detail-item"},Qa={class:"detail-item"},Xa={class:"detail-item"},Ya={class:"detail-item"},Za={class:"detail-item"},en={class:"detail-section"},tn={class:"code-block"},ln={key:0,class:"detail-section"},sn={class:"output-gallery"},an=["src"],nn=["src"],on=["src"],dn={key:3,class:"text-asset"},rn=["href"],cn={key:1,class:"detail-section"},un={class:"code-block error"},vn={class:"cleanup-form"},mn={class:"dialog-footer"},pn=ie({__name:"TasksView",setup(o){const I=h("list"),f=h(false),w=h([]),r=h(null),y=h(0),S=h(1),O=h(20),b=h({status:"",userId:void 0,channelId:void 0}),v=h(false),k=h(null);h(false);const z=h(null),$=h(false),c=h([]),p=h(0),m=h(""),U=h(),j=h(),Q=h(false),F=h(30),V=n=>{var i,A,Z;return((A=(i=n.middlewareLogs)==null?void 0:i.preset)==null?void 0:A.transformedPrompt)||((Z=n.requestSnapshot)==null?void 0:Z.prompt)||""},_=re(()=>{var i,A,Z;const n=[];for(const B of w.value){if(B.status!=="success"||!B.responseSnapshot)continue;const d=((A=(i=B.middlewareLogs)==null?void 0:i.preset)==null?void 0:A.transformedPrompt)||((Z=B.requestSnapshot)==null?void 0:Z.prompt)||"";B.responseSnapshot.forEach((u,M)=>{(u.kind==="image"||u.kind==="video")&&u.url&&n.push({id:B.id,assetIndex:M,kind:u.kind,url:u.url,prompt:d,channelId:B.channelId,createdAt:B.startTime})})}return n}),K=async()=>{f.value=true;try{const n={limit:O.value,offset:(S.value-1)*O.value};b.value.status&&(n.status=b.value.status),b.value.userId&&(n.userId=Number(b.value.userId)),b.value.channelId&&(n.channelId=Number(b.value.channelId));const[i,A]=await Promise.all([ye.list(n),ye.stats()]);w.value=i.items,y.value=i.total,r.value=A}catch(n){console.error("Failed to fetch tasks:",n),G.error("加载数据失败")}finally{f.value=false}},ce=n=>{k.value=n,v.value=true},me=n=>{c.value=[n.url],p.value=0,m.value=n.prompt,U.value=n.createdAt,j.value=void 0,$.value=true,z.value=n},T=()=>{Q.value=true},x=async()=>{try{const n=await ye.cleanup(F.value);G.success(`成功清理 ${n.deleted} 条任务`),Q.value=false,K()}catch{G.error("清理失败")}},H=n=>new Date(n).toLocaleString(),W=n=>n<1e3?`${n}ms`:`${(n/1e3).toFixed(2)}s`,q=n=>{const i=n.target;i.style.display="none"};return pe(()=>{K()}),(n,i)=>{const A=E("k-icon"),Z=E("k-button"),B=E("el-option"),d=E("el-select"),u=E("el-input"),M=E("el-table-column"),le=E("el-table"),Y=E("el-pagination"),ne=E("el-dialog"),ue=E("el-input-number");return t(),l("div",Qs,[s(" 固定头部区域 "),e("div",Xs,[e("div",Ys,[s(" 视图切换 "),e("div",Zs,[e("button",{class:ee(["mode-btn",{active:I.value==="list"}]),onClick:i[0]||(i[0]=P=>I.value="list"),title:"列表视图"},[...i[14]||(i[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:I.value==="gallery"}]),onClick:i[1]||(i[1]=P=>I.value="gallery"),title:"画廊视图"},[...i[15]||(i[15]=[Se('<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",ea,[a(Z,{onClick:T},{icon:C(()=>[a(A,{name:"delete"})]),default:C(()=>[i[16]||(i[16]=R(" 清理记录 ",-1))]),_:1}),a(Z,{onClick:K},{icon:C(()=>[a(A,{name:"refresh"})]),default:C(()=>[i[17]||(i[17]=R(" 刷新 ",-1))]),_:1})])]),s(" 统计信息 (固定) "),r.value?(t(),l("div",ta,[e("div",la,[e("div",sa,[a(A,{name:"clipboard-list"})]),e("div",aa,[e("div",na,g(r.value.total),1),i[18]||(i[18]=e("div",{class:"stat-label"},"总任务数",-1))])]),e("div",oa,[e("div",ia,[a(A,{name:"check-circle"})]),e("div",da,[e("div",ra,g(r.value.byStatus.success),1),i[19]||(i[19]=e("div",{class:"stat-label"},"成功",-1))])]),e("div",ca,[e("div",ua,[a(A,{name:"exclamation-triangle"})]),e("div",va,[e("div",ma,g(r.value.byStatus.failed),1),i[20]||(i[20]=e("div",{class:"stat-label"},"失败",-1))])]),e("div",pa,[e("div",ga,[a(A,{name:"clock"})]),e("div",fa,[e("div",_a,g(r.value.byStatus.pending+r.value.byStatus.processing),1),i[21]||(i[21]=e("div",{class:"stat-label"},"进行中",-1))])]),e("div",ha,[e("div",ya,[a(A,{name:"chart-pie"})]),e("div",ka,[e("div",ba,g(r.value.successRate),1),i[22]||(i[22]=e("div",{class:"stat-label"},"成功率",-1))])])])):s("v-if",true),s(" 筛选栏 (固定) "),e("div",$a,[e("div",wa,[a(d,{modelValue:b.value.status,"onUpdate:modelValue":i[2]||(i[2]=P=>b.value.status=P),placeholder:"所有状态",clearable:"",onChange:K,style:{width:"140px"}},{default:C(()=>[a(B,{label:"等待中",value:"pending"}),a(B,{label:"处理中",value:"processing"}),a(B,{label:"成功",value:"success"}),a(B,{label:"失败",value:"failed"})]),_:1},8,["modelValue"]),a(u,{modelValue:b.value.channelId,"onUpdate:modelValue":i[3]||(i[3]=P=>b.value.channelId=P),placeholder:"渠道 ID",clearable:"",onChange:K,style:{width:"140px"}},null,8,["modelValue"]),a(u,{modelValue:b.value.userId,"onUpdate:modelValue":i[4]||(i[4]=P=>b.value.userId=P),placeholder:"用户 ID",clearable:"",onChange:K,style:{width:"140px"}},null,8,["modelValue"])]),y.value>0?(t(),l("div",Va," 共 "+g(y.value)+" 条记录 ",1)):s("v-if",true)]),s(" 可滚动的内容区域 "),e("div",Ca,[s(" 列表视图 "),I.value==="list"?(t(),ae(le,{key:0,data:w.value,style:{width:"100%"},class:"task-table",onRowClick:ce},{default:C(()=>[a(M,{prop:"id",label:"ID",width:"80",align:"center"},{default:C(({row:P})=>[e("span",xa,"#"+g(P.id),1)]),_:1}),a(M,{label:"状态",width:"100",align:"center"},{default:C(({row:P})=>[a(Fe,{status:P.status},null,8,["status"])]),_:1}),a(M,{prop:"channelId",label:"渠道",width:"100",align:"center"}),a(M,{label:"提示词","min-width":"300"},{default:C(({row:P})=>[e("div",{class:"prompt-cell",title:V(P)},g(V(P)),9,Ia)]),_:1}),a(M,{label:"输出",width:"120",align:"center"},{default:C(({row:P})=>[P.responseSnapshot&&P.responseSnapshot.length?(t(),l("span",Sa,g(P.responseSnapshot.length)+" 个资产 ",1)):(t(),l("span",Ua,"-"))]),_:1}),a(M,{label:"耗时",width:"100",align:"right"},{default:C(({row:P})=>[P.duration?(t(),l("span",Ta,g(W(P.duration)),1)):(t(),l("span",Da,"-"))]),_:1}),a(M,{label:"时间",width:"180",align:"right"},{default:C(({row:P})=>[e("span",Oa,g(H(P.startTime)),1)]),_:1})]),_:1},8,["data"])):I.value==="gallery"?(t(),l(D,{key:1},[s(" 画廊视图 (瀑布流) "),_.value.length===0?(t(),l("div",za,[a(A,{name:"image",class:"empty-icon"}),i[23]||(i[23]=e("p",null,"暂无成功生成的图片",-1))])):(t(),l("div",Pa,[(t(true),l(D,null,X(_.value,P=>(t(),l("div",{key:P.id+"-"+P.assetIndex,class:"ml-masonry-item"},[e("div",{class:"gallery-item",onClick:J=>me(P)},[e("div",La,[P.kind==="image"?(t(),l("img",{key:0,src:P.url,class:"gallery-image",loading:"lazy",onError:q},null,40,Aa)):P.kind==="video"?(t(),l("video",{key:1,src:P.url,class:"gallery-video",muted:"",loop:"",onMouseenter:i[5]||(i[5]=J=>J.target.play()),onMouseleave:i[6]||(i[6]=J=>J.target.pause())},null,40,Ea)):s("v-if",true),e("div",Ma,[a(A,{name:"zoom-in",class:"zoom-icon"})])]),e("div",Ra,[e("div",{class:"gallery-prompt",title:P.prompt},g(P.prompt),9,Na),e("div",qa,[e("span",Ba,g(H(P.createdAt)),1)])])],8,Fa)]))),128))]))],64)):s("v-if",true)]),s(" 分页 (固定在底部) "),e("div",Ha,[a(Y,{"current-page":S.value,"onUpdate:currentPage":i[7]||(i[7]=P=>S.value=P),"page-size":O.value,"onUpdate:pageSize":i[8]||(i[8]=P=>O.value=P),total:y.value,"page-sizes":[20,50,100],layout:"total, sizes, prev, pager, next",onCurrentChange:K,onSizeChange:K},null,8,["current-page","page-size","total"])]),s(" 任务详情对话框 "),a(ne,{modelValue:v.value,"onUpdate:modelValue":i[9]||(i[9]=P=>v.value=P),title:"任务详情",width:"800px"},{default:C(()=>{var P,J;return[k.value?(t(),l("div",Ga,[e("div",Ja,[i[31]||(i[31]=e("h3",null,"基本信息",-1)),e("div",Wa,[e("div",ja,[i[24]||(i[24]=e("span",{class:"label"},"ID:",-1)),R(" "+g(k.value.id),1)]),e("div",Ka,[i[25]||(i[25]=e("span",{class:"label"},"状态:",-1)),i[26]||(i[26]=R()),a(Fe,{status:k.value.status},null,8,["status"])]),e("div",Qa,[i[27]||(i[27]=e("span",{class:"label"},"渠道 ID:",-1)),R(" "+g(k.value.channelId),1)]),e("div",Xa,[i[28]||(i[28]=e("span",{class:"label"},"用户 ID:",-1)),R(" "+g(k.value.userId||"N/A"),1)]),e("div",Ya,[i[29]||(i[29]=e("span",{class:"label"},"创建时间:",-1)),R(" "+g(H(k.value.startTime)),1)]),e("div",Za,[i[30]||(i[30]=e("span",{class:"label"},"耗时:",-1)),R(" "+g(W(k.value.duration||0)),1)])])]),e("div",en,[i[32]||(i[32]=e("h3",null,"Prompt",-1)),e("div",tn,g(V(k.value)),1)]),k.value.responseSnapshot&&k.value.responseSnapshot.length>0?(t(),l("div",ln,[e("h3",null,"生成结果 ("+g(k.value.responseSnapshot.length)+" 个资产)",1),e("div",sn,[(t(true),l(D,null,X(k.value.responseSnapshot,(oe,N)=>{var te;return t(),l("div",{key:N,class:"output-item"},[oe.kind==="image"&&oe.url?(t(),l("img",{key:0,src:oe.url,class:"output-image"},null,8,an)):oe.kind==="video"&&oe.url?(t(),l("video",{key:1,src:oe.url,class:"output-image",controls:""},null,8,nn)):oe.kind==="audio"&&oe.url?(t(),l("audio",{key:2,src:oe.url,controls:"",style:{width:"100%"}},null,8,on)):oe.kind==="text"&&oe.content?(t(),l("div",dn,g(oe.content),1)):oe.url?(t(),l("a",{key:4,href:oe.url,target:"_blank",class:"file-link"},[a(A,{name:"file"}),R(" "+g(((te=oe.meta)==null?void 0:te.filename)||oe.url),1)],8,rn)):s("v-if",true)])}),128))])])):s("v-if",true),(J=(P=k.value.middlewareLogs)==null?void 0:P.request)!=null&&J.error?(t(),l("div",cn,[i[33]||(i[33]=e("h3",null,"错误信息",-1)),e("div",un,g(k.value.middlewareLogs.request.error),1)])):s("v-if",true)])):s("v-if",true)]}),_:1},8,["modelValue"]),s(" 图片预览弹窗 "),a(Te,{visible:$.value,"onUpdate:visible":i[10]||(i[10]=P=>$.value=P),images:c.value,"initial-index":p.value,prompt:m.value,"created-at":U.value,duration:j.value},null,8,["visible","images","initial-index","prompt","created-at","duration"]),s(" 清理对话框 "),a(ne,{modelValue:Q.value,"onUpdate:modelValue":i[13]||(i[13]=P=>Q.value=P),title:"清理旧任务",width:"400px"},{footer:C(()=>[e("span",mn,[a(Z,{onClick:i[12]||(i[12]=P=>Q.value=false)},{default:C(()=>[...i[35]||(i[35]=[R("取消",-1)])]),_:1}),a(Z,{type:"error",onClick:x},{default:C(()=>[...i[36]||(i[36]=[R("确认清理",-1)])]),_:1})])]),default:C(()=>[e("div",vn,[i[34]||(i[34]=e("p",null,"清理多少天前的任务?",-1)),a(ue,{modelValue:F.value,"onUpdate:modelValue":i[11]||(i[11]=P=>F.value=P),min:1,max:365},null,8,["modelValue"])])]),_:1},8,["modelValue"])])}}}),gn=de(pn,[["__scopeId","data-v-898a70bb"]]),fn={class:"gallery-content"},_n={class:"gallery-header"},hn={class:"header-left"},yn={key:0,class:"gallery-count"},kn={class:"header-actions"},bn={key:0,class:"gallery-empty"},$n={class:"gallery-empty"},wn=["onClick"],Vn={key:0,class:"task-image-wrapper"},Cn=["src"],xn={key:0,class:"more-images"},In={class:"task-processing"},Sn={class:"processing-text"},Un={class:"task-failed"},Tn={class:"task-info"},Dn=["title"],On={class:"task-meta"},zn={class:"task-time"},Pn={key:0,class:"task-duration"},Fn={key:0,class:"loading-more"},xe=10,Ln=ie({__name:"HistoryGallery",emits:["select"],setup(o,{expose:I,emit:f}){const w=f,r=h(false),y=h(false),S=h(false),O=h([]),b=h(0),v=h(false),k=h(0),z=h();let $=null;const c=h(false),p=h([]),m=h(0),U=h(""),j=h(),Q=h(),F=async()=>{try{const q=await je.me();return S.value=q.loggedIn,q.loggedIn}catch{return S.value=false,false}},V=q=>{var A,Z,B;const n=[];if(q.responseSnapshot)for(const d of q.responseSnapshot)d.kind==="image"&&d.url&&n.push(d.url);const i=((Z=(A=q.middlewareLogs)==null?void 0:A.preset)==null?void 0:Z.transformedPrompt)||((B=q.requestSnapshot)==null?void 0:B.prompt)||"";return{id:q.id,status:q.status,prompt:i,images:n,createdAt:new Date(q.startTime),duration:q.duration||void 0}},_=async(q=false)=>{if(S.value){y.value=true;try{const n=await ye.my({limit:xe,offset:q?k.value:0}),i=n.items.map(V);q?O.value=[...O.value,...i]:(O.value=i,k.value=0),b.value=n.total,v.value=n.items.length>=xe,k.value+=xe}catch(n){console.error("Failed to load tasks:",n)}finally{y.value=false}}},K=()=>{!y.value&&v.value&&_(true)},ce=q=>{const n=q.target,{scrollTop:i,scrollHeight:A,clientHeight:Z}=n;A-i-Z<100&&K()},me=async()=>{await F(),await _()},T=q=>{q.status==="success"&&q.images.length>0&&(p.value=q.images,m.value=0,U.value=q.prompt,j.value=q.createdAt,Q.value=q.duration,c.value=true,w("select",q))},x=q=>{const i=new Date().getTime()-q.getTime();return i<6e4?"刚刚":i<36e5?`${Math.floor(i/6e4)}分钟前`:i<864e5?`${Math.floor(i/36e5)}小时前`:i<6048e5?`${Math.floor(i/864e5)}天前`:q.toLocaleDateString()},H=q=>q<1e3?`${q}ms`:`${(q/1e3).toFixed(1)}s`,W=()=>{$=setInterval(()=>{O.value.some(n=>n.status==="pending"||n.status==="processing")&&_()},3e3)};return I({refresh:me}),pe(async()=>{await F()&&(await _(),W())}),Ve(()=>{$&&clearInterval($)}),(q,n)=>{const i=E("k-icon");return t(),l("div",{class:ee(["history-gallery",{collapsed:r.value}])},[s(" 折叠状态的侧边条 "),r.value?(t(),l("div",{key:0,class:"collapsed-bar",onClick:n[0]||(n[0]=A=>r.value=false)},[a(i,{name:"history"}),n[3]||(n[3]=e("span",{class:"collapsed-text"},"历史",-1))])):(t(),l(D,{key:1},[s(" 展开的内容 "),e("div",fn,[e("div",_n,[e("div",hn,[n[4]||(n[4]=e("span",{class:"gallery-title"},"历史记录",-1)),b.value>0?(t(),l("span",yn,g(b.value),1)):s("v-if",true)]),e("div",kn,[a(i,{name:"refresh",class:ee(["action-icon",{spinning:y.value}]),onClick:me,title:"刷新"},null,8,["class"]),a(i,{name:"chevron-right",class:"action-icon",onClick:n[1]||(n[1]=A=>r.value=true),title:"收起"})])]),s(" 未登录提示 "),S.value?y.value&&O.value.length===0?(t(),l(D,{key:1},[s(" 加载中 "),n[6]||(n[6]=e("div",{class:"gallery-loading"},[e("div",{class:"loader-small"})],-1))],2112)):O.value.length===0?(t(),l(D,{key:2},[s(" 空状态 "),e("div",$n,[a(i,{name:"image",class:"empty-icon"}),n[7]||(n[7]=e("p",null,"暂无记录",-1))])],2112)):(t(),l(D,{key:3},[s(" 任务列表 (瀑布流) "),e("div",{class:"gallery-list",ref_key:"listRef",ref:z,onScroll:ce},[(t(true),l(D,null,X(O.value,A=>(t(),l("div",{key:A.id,class:ee(["task-card",{clickable:A.status==="success"}]),onClick:Z=>T(A)},[s(" 图片区域 - 只显示第一张 "),A.images&&A.images.length>0?(t(),l("div",Vn,[e("img",{src:A.images[0],class:"task-image",loading:"lazy"},null,8,Cn),A.images.length>1?(t(),l("div",xn," +"+g(A.images.length-1),1)):s("v-if",true)])):A.status==="processing"||A.status==="pending"?(t(),l(D,{key:1},[s(" 处理中动画 "),e("div",In,[n[8]||(n[8]=e("div",{class:"processing-animation"},[e("div",{class:"dot"}),e("div",{class:"dot"}),e("div",{class:"dot"})],-1)),e("span",Sn,g(A.status==="pending"?"等待中":"生成中"),1)])],2112)):A.status==="failed"?(t(),l(D,{key:2},[s(" 失败状态 "),e("div",Un,[a(i,{name:"exclamation-triangle",class:"failed-icon"}),n[9]||(n[9]=e("span",null,"失败",-1))])],2112)):s("v-if",true),s(" 任务信息 "),e("div",Tn,[e("div",{class:"task-prompt",title:A.prompt},g(A.prompt||"(无提示词)"),9,Dn),e("div",On,[e("span",zn,g(x(A.createdAt)),1),A.duration?(t(),l("span",Pn,g(H(A.duration)),1)):s("v-if",true)])])],10,wn))),128)),s(" 加载更多 "),y.value&&O.value.length>0?(t(),l("div",Fn,[...n[10]||(n[10]=[e("div",{class:"loader-small"},null,-1)])])):s("v-if",true)],544)],2112)):(t(),l("div",bn,[a(i,{name:"user",class:"empty-icon"}),n[5]||(n[5]=e("p",null,"请登录查看历史",-1))]))])],2112)),s(" 图片预览弹窗 "),a(Te,{visible:c.value,"onUpdate:visible":n[2]||(n[2]=A=>c.value=A),images:p.value,"initial-index":m.value,prompt:U.value,"created-at":j.value,duration:Q.value},null,8,["visible","images","initial-index","prompt","created-at","duration"])],2)}}}),An=de(Ln,[["__scopeId","data-v-6cba50e5"]]),En={class:"preset-picker"},Mn={key:0,class:"preset-info"},Rn=["src"],Nn={key:1,class:"preset-thumb placeholder"},qn={class:"preset-details"},Bn={class:"preset-name"},Hn={key:1,class:"placeholder-text"},Gn={class:"picker-header"},Jn={class:"preset-count"},Wn={class:"picker-content"},jn={class:"ml-masonry"},Kn=["onClick"],Qn={key:0,class:"card-thumbnail"},Xn=["src","alt"],Yn={class:"thumbnail-overlay"},Zn={key:0,class:"ref-count"},eo={key:1,class:"card-thumbnail placeholder"},to={class:"card-content"},lo={class:"card-title"},so={key:0,class:"card-tags"},ao={key:0,class:"mini-tag more"},no={key:2,class:"selected-mark"},oo={key:0,class:"empty-state"},io={class:"dialog-footer"},ro={key:0,class:"preset-detail"},co={key:0,class:"detail-thumbnail"},uo=["src","alt"],vo={class:"detail-section"},mo={class:"detail-row"},po={key:0,class:"detail-row"},go={class:"detail-tags"},fo={class:"detail-section"},_o={class:"prompt-preview"},ho={key:1,class:"detail-section"},yo={class:"detail-label"},ko={class:"reference-images"},bo=["src"],$o={key:2,class:"detail-section"},wo={class:"param-preview"},Vo={class:"dialog-footer"},Co=ie({__name:"PresetPicker",props:{modelValue:{},presets:{}},emits:["update:modelValue"],setup(o,{emit:I}){const f=o,w=I,r=["本地","远程","text2img","img2img","NSFW"],y=h(false),S=h(false),O=h([]),b=h(f.modelValue),v=h(null),k=re(()=>{const F=new Set;return f.presets.forEach(V=>{(V.tags||[]).forEach(_=>F.add(_))}),Array.from(F).sort()}),z=re(()=>f.modelValue?f.presets.find(F=>F.id===f.modelValue):null),$=re(()=>{let F=f.presets;return O.value.length===0?F:F.filter(V=>O.value.every(_=>_==="本地"?V.source==="user":_==="远程"?V.source==="api":(V.tags||[]).includes(_)))}),c=()=>{b.value=f.modelValue,O.value=[],y.value=true},p=F=>{b.value=F.id},m=()=>{w("update:modelValue",b.value),y.value=false},U=()=>{w("update:modelValue",void 0)},j=F=>{v.value=F,S.value=true},Q=()=>{v.value&&(w("update:modelValue",v.value.id),S.value=false,y.value=false)};return ge(()=>f.modelValue,F=>{b.value=F}),(F,V)=>{var me;const _=E("k-icon"),K=E("k-button"),ce=E("el-dialog");return t(),l("div",En,[s(" 当前选中的预设显示 "),e("div",{class:"selected-preset",onClick:c},[z.value?(t(),l("div",Mn,[z.value.thumbnail?(t(),l("img",{key:0,src:z.value.thumbnail,class:"preset-thumb"},null,8,Rn)):(t(),l("div",Nn,[a(_,{name:"image"})])),e("div",qn,[e("span",Bn,g(z.value.name),1),e("span",{class:ee(["preset-source",z.value.source])},g(z.value.source==="api"?"远程":"本地"),3)]),a(_,{name:"times",class:"clear-btn",onClick:ve(U,["stop"]),title:"清除选择"})])):(t(),l("div",Hn,[a(_,{name:"layer-group"}),V[6]||(V[6]=e("span",null,"选择预设模板 (可选)",-1))])),a(_,{name:"chevron-down",class:"dropdown-icon"})]),s(" 预设选择弹窗 - 复用 PresetsView 的布局 "),a(ce,{modelValue:y.value,"onUpdate:modelValue":V[3]||(V[3]=T=>y.value=T),title:"选择预设",width:"80vw",top:"5vh","close-on-click-modal":true,class:"preset-picker-dialog"},{footer:C(()=>[e("div",io,[a(K,{onClick:V[2]||(V[2]=T=>y.value=false)},{default:C(()=>[...V[9]||(V[9]=[R("取消",-1)])]),_:1}),a(K,{type:"primary",onClick:m,disabled:!b.value},{default:C(()=>[...V[10]||(V[10]=[R(" 确认选择 ",-1)])]),_:1},8,["disabled"])])]),default:C(()=>[e("div",Gn,[a(Ue,{modelValue:O.value,"onUpdate:modelValue":V[0]||(V[0]=T=>O.value=T),"all-tags":k.value,"preset-tags":r},null,8,["modelValue","all-tags"]),e("span",Jn,"共 "+g($.value.length)+" 个预设",1)]),e("div",Wn,[e("div",jn,[(t(true),l(D,null,X($.value,T=>{var x,H;return t(),l("div",{key:T.id,class:"ml-masonry-item"},[e("div",{class:ee(["preset-card",{selected:b.value===T.id}]),onClick:W=>p(T)},[s(" 缩略图 "),T.thumbnail?(t(),l("div",Qn,[e("img",{src:T.thumbnail,alt:T.name,loading:"lazy"},null,8,Xn),e("div",Yn,[(x=T.referenceImages)!=null&&x.length?(t(),l("span",Zn,[a(_,{name:"image"}),R(" "+g(T.referenceImages.length),1)])):s("v-if",true)])])):(t(),l("div",eo,[a(_,{name:"image",class:"placeholder-icon"})])),s(" 内容 "),e("div",to,[e("div",lo,g(T.name),1),(H=T.tags)!=null&&H.length?(t(),l("div",so,[(t(true),l(D,null,X(T.tags.slice(0,4),W=>(t(),l("span",{key:W,class:"mini-tag"},g(W),1))),128)),T.tags.length>4?(t(),l("span",ao,"+"+g(T.tags.length-4),1)):s("v-if",true)])):s("v-if",true)]),s(" 操作按钮区 "),e("div",{class:"card-actions",onClick:V[1]||(V[1]=ve(()=>{},["stop"]))},[a(K,{size:"mini",onClick:W=>j(T)},{icon:C(()=>[a(_,{name:"eye"})]),default:C(()=>[V[7]||(V[7]=R(" 详情 ",-1))]),_:1},8,["onClick"])]),s(" 来源标记 "),e("div",{class:ee(["source-indicator",T.source])},g(T.source==="api"?"远程":"本地"),3),s(" 选中标记 "),b.value===T.id?(t(),l("div",no,[a(_,{name:"check"})])):s("v-if",true)],10,Kn)])}),128))]),s(" 空状态 "),$.value.length===0?(t(),l("div",oo,[a(_,{name:"search",class:"empty-icon"}),V[8]||(V[8]=e("p",null,"没有找到匹配的预设",-1))])):s("v-if",true)])]),_:1},8,["modelValue"]),s(" 预设详情弹窗 "),a(ce,{modelValue:S.value,"onUpdate:modelValue":V[5]||(V[5]=T=>S.value=T),title:((me=v.value)==null?void 0:me.name)||"预设详情",width:"600px","close-on-click-modal":true,class:"preset-detail-dialog"},{footer:C(()=>[e("div",Vo,[a(K,{onClick:V[4]||(V[4]=T=>S.value=false)},{default:C(()=>[...V[15]||(V[15]=[R("关闭",-1)])]),_:1}),a(K,{type:"primary",onClick:Q},{icon:C(()=>[a(_,{name:"check"})]),default:C(()=>[V[16]||(V[16]=R(" 选择此预设 ",-1))]),_:1})])]),default:C(()=>{var T,x;return[v.value?(t(),l("div",ro,[s(" 缩略图 "),v.value.thumbnail?(t(),l("div",co,[e("img",{src:v.value.thumbnail,alt:v.value.name},null,8,uo)])):s("v-if",true),s(" 基本信息 "),e("div",vo,[e("div",mo,[V[11]||(V[11]=e("span",{class:"detail-label"},"来源:",-1)),e("span",{class:ee(["source-badge",v.value.source])},g(v.value.source==="api"?"远程":"本地"),3)]),(T=v.value.tags)!=null&&T.length?(t(),l("div",po,[V[12]||(V[12]=e("span",{class:"detail-label"},"标签:",-1)),e("div",go,[(t(true),l(D,null,X(v.value.tags,H=>(t(),l("span",{key:H,class:"mini-tag"},g(H),1))),128))])])):s("v-if",true)]),s(" Prompt 模板 "),e("div",fo,[V[13]||(V[13]=e("div",{class:"detail-label"},"Prompt 模板:",-1)),e("div",_o,g(v.value.promptTemplate),1)]),s(" 参考图 "),(x=v.value.referenceImages)!=null&&x.length?(t(),l("div",ho,[e("div",yo,"参考图片 ("+g(v.value.referenceImages.length)+"):",1),e("div",ko,[(t(true),l(D,null,X(v.value.referenceImages,(H,W)=>(t(),l("img",{key:W,src:H,class:"ref-image"},null,8,bo))),128))])])):s("v-if",true),s(" 参数覆盖 "),v.value.parameterOverrides&&Object.keys(v.value.parameterOverrides).length?(t(),l("div",$o,[V[14]||(V[14]=e("div",{class:"detail-label"},"参数覆盖:",-1)),e("div",wo,g(JSON.stringify(v.value.parameterOverrides,null,2)),1)])):s("v-if",true)])):s("v-if",true)]}),_:1},8,["modelValue","title"])])}}}),xo=de(Co,[["__scopeId","data-v-59115136"]]),Io={class:"view-container"},So={class:"view-content"},Uo={class:"generate-layout"},To={class:"config-panel"},Do={class:"form-section"},Oo={class:"section-title"},zo={class:"form-item"},Po={class:"form-item"},Fo={class:"form-section flex-grow"},Lo={class:"section-title"},Ao={class:"form-section"},Eo={class:"section-title"},Mo={class:"upload-area"},Ro={key:0,class:"upload-list"},No=["src"],qo=["onClick"],Bo={class:"form-actions"},Ho={class:"preview-panel"},Go={key:0,class:"generating-state"},Jo={class:"generating-content"},Wo={class:"generating-info"},jo={class:"generating-timer"},Ko={key:0,class:"generating-hint"},Qo={class:"result-container"},Xo={key:0,class:"success-result"},Yo={class:"output-grid"},Zo=["src","onClick"],ei={class:"output-actions"},ti=["href"],li=["src"],si=["src"],ai=["href"],ni={class:"text-output"},oi=["href"],ii={class:"result-meta"},di={class:"meta-item success-badge"},ri={key:0,class:"meta-item"},ci={key:1,class:"meta-item"},ui={class:"error-result"},vi={class:"error-content"},mi={class:"error-info"},pi={class:"error-msg"},gi={key:0,class:"error-meta"},fi={key:1,class:"error-meta"},_i={class:"empty-state"},hi=ie({__name:"GenerateView",setup(o){const I=h([]),f=h([]),w=h(false),r=h(null),y=h([]),S=h([]),O=h(),b=h();let v=0;const k=h(0),z=h(null);let $=null,c=0;const p=h({channel:void 0,prompt:"",parameters:{}}),m=h(void 0),U=h(false),j=h([]),Q=h(0),F=h(""),V=B=>{if(B<1e3)return`${B}ms`;const d=B/1e3;if(d<60)return`${d.toFixed(1)}s`;const u=Math.floor(d/60),M=(d%60).toFixed(0);return`${u}m ${M}s`},_=()=>{c=Date.now(),k.value=0,$=setInterval(()=>{k.value=Date.now()-c},100)},K=()=>{$&&(clearInterval($),$=null)},ce=B=>{var d;(d=r.value)!=null&&d.output&&(j.value=r.value.output.filter(u=>u.kind==="image"&&u.url).map(u=>u.url),Q.value=B,U.value=true)},me=async()=>{try{const[B,d]=await Promise.all([he.list(),_e.list()]);I.value=B,f.value=d}catch(B){console.error(B)}},T=B=>new Promise((d,u)=>{const M=new FileReader;M.onload=()=>{const Y=M.result.split(",")[1];d(Y)},M.onerror=u,M.readAsDataURL(B)}),x=()=>{var B;(B=O.value)==null||B.click()},H=async B=>{const d=B.target;!d.files||d.files.length===0||(await q(Array.from(d.files)),d.value="")},W=async B=>{var u;const d=(u=B.dataTransfer)==null?void 0:u.files;!d||d.length===0||await q(Array.from(d).filter(M=>M.type.startsWith("image/")))},q=async B=>{const d=4-y.value.length;if(d<=0){G.warning("最多上传 4 张图片");return}const u=B.slice(0,d);for(const M of u){const le=URL.createObjectURL(M);y.value.push({uid:++v,url:le,raw:M});try{const Y=await T(M);S.value.push({type:"image",base64:Y,mimeType:M.type,filename:M.name})}catch(Y){console.error("Failed to read file:",M.name,Y)}}},n=B=>{const d=y.value[B];d&&(URL.revokeObjectURL(d.url),y.value.splice(B,1),S.value.splice(B,1))},i=async B=>{var d,u,M,le;try{const Y=await ye.get(B);if(F.value=((u=(d=Y.middlewareLogs)==null?void 0:d.preset)==null?void 0:u.transformedPrompt)||((M=Y.requestSnapshot)==null?void 0:M.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 ne=(le=Y.middlewareLogs)==null?void 0:le._error;return{success:false,error:(ne==null?void 0:ne.message)||"生成失败",taskId:Y.id,duration:Y.duration||void 0}}return null}catch{return null}},A=async()=>{var B,d,u,M,le,Y;if(!p.value.channel){G.warning("请选择渠道");return}w.value=true,r.value=null,z.value=null,_();try{const ne={channelId:p.value.channel,prompt:p.value.prompt||"",parameters:{...p.value.parameters}};if(S.value.length>0&&(ne.files=S.value),m.value){const P=f.value.find(J=>J.id===m.value);P&&(ne.parameters.preset=P.name)}const ue=await Ke.generate(ne);if(ue.taskId&&(z.value=ue.taskId),ue.success)if(r.value=ue,(B=b.value)==null||B.refresh(),ue.taskId)try{const P=await ye.get(ue.taskId);F.value=((u=(d=P.middlewareLogs)==null?void 0:d.preset)==null?void 0:u.transformedPrompt)||((M=P.requestSnapshot)==null?void 0:M.prompt)||""}catch{F.value=p.value.prompt}else F.value=p.value.prompt;else if(ue.taskId){await new Promise(J=>setTimeout(J,500));const P=await i(ue.taskId);P&&P.success?(r.value=P,(le=b.value)==null||le.refresh()):r.value=ue}else r.value=ue}catch(ne){if(z.value){await new Promise(P=>setTimeout(P,500));const ue=await i(z.value);ue?(r.value=ue,ue.success&&((Y=b.value)==null||Y.refresh())):r.value={success:false,error:ne.message||"请求失败"}}else r.value={success:false,error:ne.message||"请求失败"}}finally{K(),w.value=false}},Z=B=>{B.prompt&&(p.value.prompt=B.prompt)};return pe(()=>{me()}),Ve(()=>{K()}),(B,d)=>{var P;const u=E("k-icon"),M=E("el-option"),le=E("el-select"),Y=E("el-input"),ne=E("k-button"),ue=E("k-card");return t(),l("div",Io,[e("div",So,[e("div",Uo,[s(" 左侧配置区 "),e("div",To,[a(ue,{class:"config-card"},{default:C(()=>[e("div",Do,[e("div",Oo,[a(u,{name:"settings"}),d[5]||(d[5]=R(" 基础配置 ",-1))]),e("div",zo,[d[6]||(d[6]=e("div",{class:"label"},"生成渠道",-1)),a(le,{modelValue:p.value.channel,"onUpdate:modelValue":d[0]||(d[0]=J=>p.value.channel=J),placeholder:"选择生成渠道",style:{width:"100%"}},{default:C(()=>[(t(true),l(D,null,X(I.value,J=>(t(),ae(M,{key:J.id,label:J.name,value:J.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Po,[d[7]||(d[7]=e("div",{class:"label"},"预设模板",-1)),a(xo,{modelValue:m.value,"onUpdate:modelValue":d[1]||(d[1]=J=>m.value=J),presets:f.value},null,8,["modelValue","presets"])])]),e("div",Fo,[e("div",Lo,[a(u,{name:"edit"}),d[8]||(d[8]=R(" 提示词 ",-1))]),a(Y,{modelValue:p.value.prompt,"onUpdate:modelValue":d[2]||(d[2]=J=>p.value.prompt=J),type:"textarea",rows:8,placeholder:"输入提示词,支持自然语言描述...",resize:"none",class:"prompt-input"},null,8,["modelValue"])]),s(" 文件上传区域 "),e("div",Ao,[e("div",Eo,[a(u,{name:"image"}),d[9]||(d[9]=R(" 参考图片 ",-1))]),e("div",Mo,[s(" 已上传的图片列表 "),y.value.length>0?(t(),l("div",Ro,[(t(true),l(D,null,X(y.value,(J,oe)=>(t(),l("div",{key:J.uid,class:"upload-item"},[e("img",{src:J.url,class:"upload-thumb"},null,8,No),e("div",{class:"upload-overlay",onClick:N=>n(oe)},[a(u,{name:"delete"})],8,qo)]))),128))])):s("v-if",true),s(" 上传按钮 "),y.value.length<4?(t(),l("div",{key:1,class:"upload-trigger",onClick:x,onDragover:d[3]||(d[3]=ve(()=>{},["prevent"])),onDrop:ve(W,["prevent"])},[e("input",{ref_key:"fileInput",ref:O,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:H},null,544),a(u,{name:"add",class:"upload-icon"})],32)):s("v-if",true),d[10]||(d[10]=e("div",{class:"upload-tip"},"点击或拖拽上传,最多 4 张",-1))])]),e("div",Bo,[a(ne,{solid:"",type:"primary",loading:w.value,onClick:A,class:"generate-btn"},{icon:C(()=>[a(u,{name:"magic"})]),default:C(()=>[d[11]||(d[11]=R(" 生成图片 ",-1))]),_:1},8,["loading"])])]),_:1})]),s(" 右侧预览区 "),e("div",Ho,[s(" 生成中状态 "),w.value?(t(),l("div",Go,[e("div",Jo,[d[13]||(d[13]=e("div",{class:"loader"},null,-1)),e("div",Wo,[d[12]||(d[12]=e("p",{class:"generating-title"},"正在生成中...",-1)),e("p",jo,[a(u,{name:"stopwatch"}),R(" 已用时间: "+g(V(k.value)),1)]),z.value?(t(),l("p",Ko,"任务 ID: "+g(z.value),1)):s("v-if",true)])])])):r.value?(t(),l(D,{key:1},[s(" 有结果 "),e("div",Qo,[s(" 成功状态 "),r.value.success&&r.value.output&&r.value.output.length?(t(),l("div",Xo,[e("div",Yo,[(t(true),l(D,null,X(r.value.output,(J,oe)=>{var N;return t(),l("div",{key:oe,class:"output-wrapper"},[s(" 图片 "),J.kind==="image"?(t(),l(D,{key:0},[e("img",{src:J.url,onClick:te=>ce(oe),class:"clickable-image"},null,8,Zo),e("div",ei,[e("a",{href:J.url,target:"_blank",class:"action-btn",download:""},[a(u,{name:"download"})],8,ti)])],64)):J.kind==="video"?(t(),l(D,{key:1},[s(" 视频 "),e("video",{src:J.url,controls:"",class:"output-video"},null,8,li)],64)):J.kind==="audio"?(t(),l(D,{key:2},[s(" 音频 "),e("audio",{src:J.url,controls:"",class:"output-audio"},null,8,si)],64)):J.kind==="file"?(t(),l(D,{key:3},[s(" 其他文件 "),e("a",{href:J.url,target:"_blank",class:"file-link"},[a(u,{name:"file"}),R(" "+g(((N=J.meta)==null?void 0:N.filename)||"下载文件"),1)],8,ai)],64)):J.kind==="text"?(t(),l(D,{key:4},[s(" 文本 "),e("div",ni,g(J.content),1)],64)):J.url?(t(),l(D,{key:5},[s(" 兜底:有 url 则显示链接 "),e("a",{href:J.url,target:"_blank"},g(J.url),9,oi)],64)):s("v-if",true)])}),128))]),e("div",ii,[e("span",di,[a(u,{name:"check-circle"}),d[14]||(d[14]=R(" 生成成功 ",-1))]),r.value.duration?(t(),l("span",ri,[a(u,{name:"stopwatch"}),R(" 耗时: "+g(V(r.value.duration)),1)])):s("v-if",true),r.value.taskId?(t(),l("span",ci,[a(u,{name:"list-alt"}),R(" 任务 ID: "+g(r.value.taskId),1)])):s("v-if",true)])])):(t(),l(D,{key:1},[s(" 失败状态 "),e("div",ui,[e("div",vi,[a(u,{name:"exclamation-triangle",class:"error-icon"}),e("div",mi,[d[15]||(d[15]=e("p",{class:"error-title"},"生成失败",-1)),e("p",pi,g(r.value.error||"未知错误"),1),r.value.taskId?(t(),l("p",gi,"任务 ID: "+g(r.value.taskId),1)):s("v-if",true),r.value.duration?(t(),l("p",fi,"耗时: "+g(V(r.value.duration)),1)):s("v-if",true)])]),a(ne,{class:"retry-btn",onClick:A},{icon:C(()=>[a(u,{name:"refresh"})]),default:C(()=>[d[16]||(d[16]=R(" 重新生成 ",-1))]),_:1})])],2112))])],2112)):(t(),l(D,{key:2},[s(" 空状态 "),e("div",_i,[a(u,{name:"image",class:"empty-icon"}),d[17]||(d[17]=e("p",null,"在左侧配置并点击生成",-1))])],2112))]),s(" 右侧历史画廊 "),a(An,{ref_key:"historyGalleryRef",ref:b,onSelect:Z},null,512)])]),s(" 图片预览弹窗 "),a(Te,{visible:U.value,"onUpdate:visible":d[4]||(d[4]=J=>U.value=J),images:j.value,"initial-index":Q.value,prompt:F.value,duration:(P=r.value)==null?void 0:P.duration},null,8,["visible","images","initial-index","prompt","duration"])])}}}),Le=de(hi,[["__scopeId","data-v-a3441aa4"]]),yi={class:"pipeline-panel"},ki={class:"pipeline-flow"},bi={class:"phase-icon"},$i={class:"phase-info"},wi={class:"phase-name"},Vi={class:"phase-desc"},Ci={class:"phase-badge"},xi={key:0,class:"phase-middlewares"},Ii={class:"mw-card"},Si={class:"mw-content"},Ui={class:"mw-name"},Ti={class:"mw-desc"},Di=["title"],Oi=["checked","onChange"],zi={key:2,class:"phase-connector"},Pi={class:"connector-arrow"},Fi=ie({__name:"MiddlewaresPanel",setup(o){const I=h([]),f=[{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"}],w={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},r=O=>I.value.filter(b=>b.phase===O),y=async()=>{try{I.value=await we.list()}catch{G.error("加载中间件列表失败")}},S=async O=>{const b=!O.enabled;try{await we.update(O.name,{enabled:b}),O.enabled=b,G.success(b?"已启用":"已禁用")}catch{G.error("操作失败")}};return pe(y),(O,b)=>{const v=E("k-icon");return t(),l("div",yi,[s(" 标题区 "),b[5]||(b[5]=e("div",{class:"panel-header"},[e("div",{class:"header-title"},[e("h3",null,"请求执行流程"),e("span",{class:"subtitle"},"每个生成请求按以下阶段依次处理")])],-1)),s(" 流程图 "),e("div",ki,[(t(),l(D,null,X(f,(k,z)=>e("div",{key:k.id,class:"phase-section"},[s(" 阶段标题 "),e("div",{class:ee(["phase-header",k.colorClass])},[e("div",bi,[a(v,{name:k.icon},null,8,["name"])]),e("div",$i,[e("span",wi,g(k.label),1),e("span",Vi,g(k.description),1)]),e("span",Ci,g(r(k.id).length),1)],2),s(" 中间件列表 "),r(k.id).length>0?(t(),l("div",xi,[(t(true),l(D,null,X(r(k.id),($,c)=>(t(),l("div",{key:$.name,class:ee(["mw-item",{disabled:!$.enabled}])},[e("div",Ii,[e("div",{class:ee(["mw-status",{active:$.enabled}])},null,2),e("div",Si,[e("span",Ui,g($.displayName),1),e("span",Ti,g($.description||w[$.category]||$.category),1)]),e("label",{class:"toggle-switch",onClick:b[0]||(b[0]=ve(()=>{},["stop"])),title:$.enabled?"点击禁用":"点击启用"},[e("input",{type:"checkbox",checked:$.enabled,onChange:p=>S($)},null,40,Oi),b[1]||(b[1]=e("span",{class:"slider"},null,-1))],8,Di)])],2))),128))])):(t(),l(D,{key:1},[s(" 空状态 "),b[2]||(b[2]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),s(" 阶段间连接箭头 "),z<f.length-1?(t(),l("div",zi,[b[3]||(b[3]=e("div",{class:"connector-line"},null,-1)),e("div",Pi,[a(v,{name:"chevron-down"})]),b[4]||(b[4]=e("div",{class:"connector-line"},null,-1))])):s("v-if",true)])),64))]),s(" 底部说明 "),b[6]||(b[6]=Se('<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))])}}}),Li=de(Fi,[["__scopeId","data-v-b4b0cf47"]]),Ai={class:"plugins-panel"},Ei={key:0,class:"loading-state"},Mi={class:"empty-state"},Ri={class:"plugins-list"},Ni=["onClick"],qi={class:"plugin-info"},Bi={class:"plugin-header"},Hi={class:"plugin-name"},Gi={key:0,class:"plugin-version"},Ji={class:"plugin-description"},Wi={class:"plugin-status"},ji={key:0,class:"plugin-badge connector"},Ki={key:1,class:"plugin-badge middleware"},Qi={key:0,class:"plugin-detail"},Xi={class:"detail-header"},Yi={class:"header-left"},Zi={key:0,class:"version"},ed={class:"header-actions"},td={key:0,class:"connector-info"},ld={class:"connector-meta"},sd={class:"connector-id"},ad={class:"connector-types"},nd={key:1,class:"middlewares-list"},od={class:"middleware-tags"},id={class:"phase-badge"},dd={key:2,class:"config-section"},rd={class:"config-actions"},cd={class:"no-config"},ud={class:"no-selection"},vd=ie({__name:"PluginsPanel",setup(o){const I=h(true),f=h([]),w=h(null),r=h({}),y=h(false),S={"lifecycle-prepare":"准备","lifecycle-pre-request":"前置","lifecycle-request":"请求","lifecycle-post-request":"后置","lifecycle-finalize":"完成"},O=$=>S[$]||$,b=async()=>{try{I.value=true,f.value=await Ie.list()}catch($){console.error("Failed to load plugins:",$),f.value=[]}finally{I.value=false}},v=$=>{w.value=$,r.value={...$.config};for(const c of $.configFields||[])r.value[c.key]===void 0&&c.default!==void 0&&(r.value[c.key]=c.default)},k=async()=>{if(w.value){y.value=true;try{await Ie.updateConfig(w.value.id,r.value),G.success("保存成功"),await b();const $=f.value.find(c=>{var p;return c.id===((p=w.value)==null?void 0:p.id)});$&&(w.value=$,r.value={...$.config})}catch{G.error("保存失败")}finally{y.value=false}}},z=async $=>{var c;try{const p=await Ee($.apiEvent);if((p==null?void 0:p.success)===false)throw new Error(p.error||"操作失败");if($.apiEvent==="media-luna/presets/sync"&&(p!=null&&p.data)){const{added:m,updated:U,removed:j,notModified:Q}=p.data;Q?G.info("数据未变化,无需更新"):G.success(`同步完成:新增 ${m},更新 ${U},删除 ${j}`)}else(c=p==null?void 0:p.data)!=null&&c.message?G.success(p.data.message):G.success(`${$.label} 完成`);await b()}catch(p){G.error(`${$.label} 失败: ${p instanceof Error?p.message:"未知错误"}`)}};return pe(b),($,c)=>{var U,j,Q;const p=E("k-icon"),m=E("k-button");return t(),l("div",Ai,[s(" 加载状态 "),I.value?(t(),l("div",Ei,[a(p,{name:"sync",class:"spin"}),c[1]||(c[1]=e("span",null,"加载中...",-1))])):f.value.length===0?(t(),l(D,{key:1},[s(" 空状态 "),e("div",Mi,[a(p,{name:"apps"}),c[2]||(c[2]=e("p",null,"暂无扩展插件",-1)),c[3]||(c[3]=e("p",{class:"hint"},[R("第三方扩展插件将在这里显示"),e("br"),R('内置功能请在"功能模块"中配置')],-1))])],2112)):(t(),l(D,{key:2},[s(" 插件列表 "),e("div",Ri,[(t(true),l(D,null,X(f.value,F=>{var V,_;return t(),l("div",{key:F.id,class:ee(["plugin-card",{active:((V=w.value)==null?void 0:V.id)===F.id,disabled:!F.enabled}]),onClick:K=>v(F)},[e("div",qi,[e("div",Bi,[e("span",Hi,g(F.name),1),F.version?(t(),l("span",Gi,"v"+g(F.version),1)):s("v-if",true)]),e("p",Ji,g(F.description||"暂无描述"),1)]),e("div",Wi,[F.connector?(t(),l("span",ji,"连接器")):s("v-if",true),(_=F.middlewares)!=null&&_.length?(t(),l("span",Ki,g(F.middlewares.length)+" 个中间件 ",1)):s("v-if",true),a(p,{name:F.enabled?"check-circle":"close-circle",class:ee(F.enabled?"enabled":"disabled")},null,8,["name","class"])])],10,Ni)}),128))]),s(" 插件详情 "),w.value?(t(),l("div",Qi,[e("header",Xi,[e("div",Yi,[e("h3",null,g(w.value.name),1),w.value.version?(t(),l("span",Zi,"v"+g(w.value.version),1)):s("v-if",true)]),e("div",ed,[(t(true),l(D,null,X(w.value.actions,F=>(t(),ae(m,{key:F.name,type:F.type||"default",size:"small",onClick:V=>z(F)},He({default:C(()=>[R(" "+g(F.label),1)]),_:2},[F.icon?{name:"icon",fn:C(()=>[a(p,{name:F.icon},null,8,["name"])]),key:"0"}:void 0]),1032,["type","onClick"]))),128))])]),s(" 连接器信息 "),w.value.connector?(t(),l("div",td,[c[4]||(c[4]=e("h4",null,"连接器",-1)),e("div",ld,[e("span",sd,g(w.value.connector.id),1),e("span",ad," 支持: "+g(((U=w.value.connector.supportedTypes)==null?void 0:U.join(", "))||"无"),1)])])):s("v-if",true),s(" 中间件列表 "),(j=w.value.middlewares)!=null&&j.length?(t(),l("div",nd,[c[5]||(c[5]=e("h4",null,"中间件",-1)),e("div",od,[(t(true),l(D,null,X(w.value.middlewares,F=>(t(),l("span",{key:F.name,class:ee(["middleware-tag",{enabled:F.enabled}])},[R(g(F.displayName||F.name)+" ",1),e("span",id,g(O(F.phase)),1)],2))),128))])])):s("v-if",true),s(" 配置表单 "),(Q=w.value.configFields)!=null&&Q.length?(t(),l("div",dd,[c[7]||(c[7]=e("h4",null,"配置",-1)),a(Ce,{fields:w.value.configFields,modelValue:r.value,"onUpdate:modelValue":c[0]||(c[0]=F=>r.value=F)},null,8,["fields","modelValue"]),e("div",rd,[a(m,{type:"primary",onClick:k,loading:y.value},{icon:C(()=>[a(p,{name:"save"})]),default:C(()=>[c[6]||(c[6]=R(" 保存配置 ",-1))]),_:1},8,["loading"])])])):(t(),l(D,{key:3},[s(" 无配置提示 "),e("div",cd,[a(p,{name:"info-circle"}),c[8]||(c[8]=e("span",null,"该插件暂无可配置项",-1))])],2112))])):(t(),l(D,{key:1},[s(" 无选中提示 "),e("div",ud,[a(p,{name:"apps"}),c[9]||(c[9]=e("p",null,"请从左侧选择一个插件查看详情",-1))])],2112))],64))])}}}),md=de(vd,[["__scopeId","data-v-b8e1ebe1"]]),pd={class:"settings-view"},gd={class:"sidebar"},fd={class:"nav-list"},_d=["onClick"],hd={class:"main-content"},yd={key:0,class:"loading"},kd={class:"panel-header"},bd={key:0},$d={class:"custom-panel"},wd={class:"actions"},Vd=ie({__name:"SettingsView",setup(o){const I=h(true),f=h([]),w=h(""),r=h({}),y=re(()=>f.value.find(v=>v.id===w.value)),S=async()=>{try{f.value=await ze.panels(),f.value.length&&!w.value&&(w.value=f.value[0].id)}catch{G.error("加载设置面板失败")}},O=()=>{var v;if(((v=y.value)==null?void 0:v.type)==="custom"){r.value={...y.value.config||{}};for(const k of y.value.configFields||[])r.value[k.key]===void 0&&k.default!==void 0&&(r.value[k.key]=k.default)}},b=async()=>{if(y.value)try{await ze.update(y.value.id,r.value),G.success("保存成功"),await S()}catch{G.error("保存失败")}};return ge(w,()=>{var v;((v=y.value)==null?void 0:v.type)==="custom"&&O()}),pe(async()=>{await S(),I.value=false}),(v,k)=>{const z=E("k-icon"),$=E("k-button");return t(),l("div",pd,[s(" 侧边栏导航 "),e("aside",gd,[e("nav",fd,[(t(true),l(D,null,X(f.value,c=>(t(),l("div",{key:c.id,class:ee(["nav-item",{active:w.value===c.id}]),onClick:p=>w.value=c.id},[a(z,{name:c.icon},null,8,["name"]),e("span",null,g(c.name),1)],10,_d))),128))])]),s(" 主内容区 "),e("main",hd,[I.value?(t(),l("div",yd,[a(z,{name:"sync",class:"spin"}),k[1]||(k[1]=R(" 加载中... ",-1))])):y.value?(t(),l(D,{key:1},[s(" 面板标题 "),e("header",kd,[e("h2",null,g(y.value.name),1),y.value.description?(t(),l("p",bd,g(y.value.description),1)):s("v-if",true)]),s(" 功能模块面板 "),y.value.component==="middlewares"?(t(),ae(Li,{key:0})):y.value.component==="plugins"?(t(),l(D,{key:1},[s(" 扩展插件面板 "),a(md)],64)):y.value.type==="custom"&&y.value.configFields?(t(),l(D,{key:2},[s(" 自定义面板 "),e("div",$d,[a(Ce,{fields:y.value.configFields,modelValue:r.value,"onUpdate:modelValue":k[0]||(k[0]=c=>r.value=c)},null,8,["fields","modelValue"]),e("div",wd,[a($,{type:"primary",onClick:b},{icon:C(()=>[a(z,{name:"save"})]),default:C(()=>[k[2]||(k[2]=R(" 保存 ",-1))]),_:1})])])],64)):s("v-if",true)],64)):s("v-if",true)])])}}}),Cd=de(Vd,[["__scopeId","data-v-5fa778a6"]]),xd={class:"setup-storage"},Id={key:0,class:"loading-state"},Sd={key:0,class:"warning-box"},Ud={class:"step-actions"},Td=ie({__name:"SetupStorage",props:{modelValue:{},saving:{type:Boolean}},emits:["update:modelValue","next"],setup(o,{emit:I}){const f=o,w=I,r=h(true),y=h([]),S=h({});ge(S,v=>{w("update:modelValue",{...v})},{deep:true});const O=async()=>{try{r.value=true;const[v,k]=await Promise.all([fe.getStorageFields(),fe.getStorageConfig()]);y.value=v;const z={...f.modelValue};for(const $ of v)k[$.key]!==void 0?z[$.key]=k[$.key]:z[$.key]===void 0&&$.default!==void 0&&(z[$.key]=$.default);S.value=z}catch(v){console.error("Failed to load storage config:",v)}finally{r.value=false}},b=()=>{w("next")};return pe(O),(v,k)=>{const z=E("k-icon"),$=E("k-button");return t(),l("div",xd,[k[4]||(k[4]=e("h3",null,"存储配置",-1)),k[5]||(k[5]=e("p",{class:"step-desc"},"选择生成图片的存储方式。推荐使用本地存储或 S3 兼容存储。",-1)),r.value?(t(),l("div",Id,[a(z,{name:"sync",class:"spin"}),k[1]||(k[1]=e("span",null,"加载配置中...",-1))])):(t(),l(D,{key:1},[s(" 使用 ConfigRenderer 渲染配置字段 "),a(Ce,{fields:y.value,modelValue:S.value,"onUpdate:modelValue":k[0]||(k[0]=c=>S.value=c)},null,8,["fields","modelValue"]),s(" 警告提示(当选择不使用时) "),S.value.backend==="none"?(t(),l("div",Sd,[a(z,{name:"warning"}),k[2]||(k[2]=e("div",null,[e("strong",null,"注意"),e("p",null,'选择"不使用"将保留生成服务返回的原始 URL,这些 URL 可能会过期或无法访问。建议配置存储后端以确保图片长期可用。')],-1))])):s("v-if",true)],64)),s(" 操作按钮 "),e("div",Ud,[a($,{type:"primary",loading:o.saving,disabled:r.value,onClick:b},{default:C(()=>[...k[3]||(k[3]=[R(" 下一步 ",-1)])]),_:1},8,["loading","disabled"])])])}}}),Dd=de(Td,[["__scopeId","data-v-9aeaae19"]]),Od={class:"setup-auth"},zd={class:"config-panel"},Pd={class:"form-row"},Fd={class:"field-container"},Ld={class:"verify-section"},Ad={class:"verify-card"},Ed={class:"code-display"},Md={class:"code-value"},Rd={class:"code-meta"},Nd={class:"step-actions"},qd=ie({__name:"SetupAuth",props:{saving:{type:Boolean}},emits:["complete","skip"],setup(o,{emit:I}){const f=I,w=h(null),r=h(false),y=h(""),S=h(0),O=h(null);let b=null,v=null;const k=async()=>{try{const m=await fe.status();m.boundUid&&(w.value=m.boundUid,O.value=m.boundUid)}catch(m){console.error("Failed to load status:",m)}},z=async()=>{if($&&clearTimeout($),!!w.value)try{r.value=true;const m=await fe.generateVerifyCode(w.value);y.value=m.code,S.value=m.expiresIn,G.success("验证码已生成,请在聊天平台完成验证")}catch(m){G.error("生成验证码失败: "+(m instanceof Error?m.message:"未知错误"))}finally{r.value=false}};let $=null;const c=()=>{$&&clearTimeout($),y.value="",w.value&&($=window.setTimeout(z,1e3))},p=async()=>{if(!w.value){G.warning("请输入用户 ID");return}try{await fe.bindUid(w.value),G.success("配置已保存"),f("complete")}catch(m){G.error("保存失败: "+(m instanceof Error?m.message:"未知错误"))}};return pe(()=>{k(),b=We("media-luna/webui-auth/bind-request",m=>{m.uid&&(w.value=m.uid,m.code&&(y.value=m.code,S.value=m.expiresIn,G.info("收到绑定请求,请在聊天平台完成验证")))}),v=window.setInterval(async()=>{try{const m=await fe.status();if(m.boundUid){if(w.value&&m.boundUid!==w.value)return;m.boundUid!==O.value&&(w.value=m.boundUid,G.success("检测到绑定成功!"),f("complete"),v&&clearInterval(v))}}catch{}},3e3)}),Ve(()=>{b&&b(),v&&clearInterval(v)}),(m,U)=>{const j=E("el-input-number"),Q=E("k-button");return t(),l("div",Od,[U[8]||(U[8]=e("h3",null,"用户绑定",-1)),U[9]||(U[9]=e("p",{class:"step-desc"}," 将 WebUI 与 Koishi 用户绑定。你可以直接配置用户 ID,也可以通过验证码进行验证绑定。 ",-1)),e("div",zd,[s(" UID 输入 "),e("div",Pd,[U[3]||(U[3]=e("div",{class:"form-label"},"用户 ID (UID)",-1)),e("div",Fd,[a(j,{modelValue:w.value,"onUpdate:modelValue":U[0]||(U[0]=F=>w.value=F),min:1,controls:false,placeholder:"Koishi 用户 ID",class:"uid-input full-width",onInput:c},null,8,["modelValue"]),U[2]||(U[2]=e("div",{class:"field-desc"},[R(" 输入你的 Koishi "),e("code",null,"uid"),R(",不是原神的。 ")],-1))])]),s(" 验证码显示区域 "),e("div",Ld,[e("div",Ad,[e("div",Ed,[U[4]||(U[4]=e("div",{class:"code-label"},"验证码",-1)),e("div",Md,g(y.value),1),e("div",Rd,"有效期 "+g(S.value)+" 秒",1)]),U[5]||(U[5]=e("div",{class:"verify-guide"},[e("p",null,"请在聊天平台向机器人发送以下指令完成绑定:"),e("div",{class:"command-box"},[e("code",null,"bindui")]),e("p",{class:"small-hint"},"发送指令后,请根据提示输入左侧的验证码。")],-1))])])]),e("div",Nd,[a(Q,{onClick:U[1]||(U[1]=F=>m.$emit("skip"))},{default:C(()=>[...U[6]||(U[6]=[R("跳过",-1)])]),_:1}),a(Q,{type:"primary",loading:o.saving,onClick:p},{default:C(()=>[...U[7]||(U[7]=[R(" 保存 / 完成 ",-1)])]),_:1},8,["loading"])])])}}}),Bd=de(qd,[["__scopeId","data-v-59078dbb"]]),Hd={class:"setup-wizard"},Gd={class:"wizard-container"},Jd={class:"steps-indicator"},Wd={class:"step-number"},jd={key:1},Kd={class:"step-label"},Qd={class:"wizard-content"},Xd={key:"complete",class:"step-complete"},Yd={class:"complete-icon"},Zd=ie({__name:"SetupWizard",emits:["complete"],setup(o,{emit:I}){const f=I,w=[{id:"storage",label:"存储配置"},{id:"auth",label:"用户绑定"},{id:"complete",label:"完成"}],r=h(0),y=h(false),S=h({}),O=async()=>{y.value=true;try{await fe.updateStorageConfig(S.value),G.success("存储配置已保存"),r.value=1}catch(z){G.error("保存失败: "+(z instanceof Error?z.message:"未知错误"))}finally{y.value=false}},b=()=>{r.value=2},v=()=>{r.value=2},k=async()=>{try{await fe.complete(),f("complete")}catch{f("complete")}};return(z,$)=>{const c=E("k-icon"),p=E("k-button");return t(),l("div",Hd,[e("div",Gd,[s(" 头部 "),$[4]||($[4]=e("div",{class:"wizard-header"},[e("h1",null,"欢迎使用 Media Luna"),e("p",null,"在开始使用前,请完成以下基础配置")],-1)),s(" 步骤指示器 "),e("div",Jd,[(t(),l(D,null,X(w,(m,U)=>e("div",{key:m.id,class:ee(["step-item",{active:r.value===U,completed:r.value>U}])},[e("div",Wd,[r.value>U?(t(),ae(c,{key:0,name:"check"})):(t(),l("span",jd,g(U+1),1))]),e("span",Kd,g(m.label),1)],2)),64))]),s(" 步骤内容 "),e("div",Qd,[a(Ae,{name:"fade",mode:"out-in"},{default:C(()=>[r.value===0?(t(),ae(Dd,{key:"storage",modelValue:S.value,"onUpdate:modelValue":$[0]||($[0]=m=>S.value=m),saving:y.value,onNext:O},null,8,["modelValue","saving"])):r.value===1?(t(),ae(Bd,{key:"auth",saving:y.value,onComplete:b,onSkip:v},null,8,["saving"])):r.value===2?(t(),l("div",Xd,[e("div",Yd,[a(c,{name:"check-circle"})]),$[2]||($[2]=e("h2",null,"配置完成",-1)),$[3]||($[3]=e("p",null,"您已完成 Media Luna 的初始设置,现在可以开始使用了。",-1)),a(p,{type:"primary",size:"large",onClick:k},{default:C(()=>[...$[1]||($[1]=[R(" 开始使用 ",-1)])]),_:1})])):s("v-if",true)]),_:1})])])])}}}),er=de(Zd,[["__scopeId","data-v-3931ca56"]]),tr={class:"top-nav"},lr={class:"nav-container"},sr={class:"nav-tabs",role:"tablist"},ar=["onClick","aria-selected"],nr={class:"main-content"},or=ie({__name:"index",setup(o){const I=h("generate"),f=h(false),w=async()=>{try{const z=await fe.status();f.value=z.needsSetup}catch(z){console.error("Failed to check setup status:",z),f.value=false}},r=()=>{f.value=false},y=re(()=>{switch(I.value){case"generate":return Le;case"channels":return El;case"presets":return zs;case"tasks":return gn;case"settings":return Cd;default:return Le}}),S=z=>()=>De("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[De("path",{d:z})]),O=[{id:"generate",label:"生成",icon:S("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:S("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:S("M17 3H7c-1.1 0-2 .9-2 2v16l7-3 7 3V5c0-1.1-.9-2-2-2z")},{id:"tasks",label:"任务",icon:S("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:S("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 v(){const z=document.querySelector(".layout-header");z&&(b=z.style.display,z.style.display="none")}function k(){const z=document.querySelector(".layout-header");z&&(z.style.display=b||"")}return pe(()=>{v(),w()}),Ge(k),(z,$)=>{const c=E("k-layout");return t(),ae(c,{class:"app-layout media-luna-app"},{default:C(()=>[s(" 设置向导 "),f.value?(t(),ae(er,{key:0,onComplete:r})):(t(),l(D,{key:1},[s(" 主界面 "),e("div",tr,[e("div",lr,[$[0]||($[0]=e("div",{class:"logo-area"},[e("span",{class:"logo-text"},"MEDIA LUNA")],-1)),e("div",sr,[(t(),l(D,null,X(O,p=>e("div",{key:p.id,class:ee(["nav-tab",{active:I.value===p.id}]),onClick:m=>I.value=p.id,role:"tab","aria-selected":I.value===p.id},[(t(),ae(Oe(p.icon),{class:"tab-icon"})),e("span",null,g(p.label),1)],10,ar)),64))])])]),e("div",nr,[(t(),ae(Je,null,[(t(),ae(Oe(y.value)))],1024))])],64))]),_:1})}}}),ir=de(or,[["__scopeId","data-v-c4fa9f13"]]),cr=o=>{o.page({name:"Media Luna",path:"/media-luna",component:ir,order:500})};export{cr as default};
1
+ import{defineComponent as oe,computed as G,ref as w,resolveComponent as A,createElementBlock as n,openBlock as l,createElementVNode as e,createCommentVNode as o,Fragment as D,renderList as ee,normalizeClass as te,toDisplayString as $,createVNode as r,withKeys as as,withCtx as V,createStaticVNode as it,createBlock as se,warn as ns,watch as ye,unref as ae,inject as Ue,isRef as os,getCurrentInstance as Ae,provide as is,renderSlot as We,mergeProps as rs,Transition as Ze,withDirectives as Te,normalizeStyle as Nt,vShow as Oe,shallowReactive as ds,onMounted as he,resolveDynamicComponent as lt,withModifiers as fe,isVNode as Ft,render as _t,createTextVNode as E,onUnmounted as Ye,Teleport as us,createSlots as cs,onBeforeUnmount as vs,h as yt,KeepAlive as ps}from"vue";import{send as Lt,message as X,receive as ms}from"@koishijs/client";import{isClient as rt,useEventListener as fs,useResizeObserver as gs,useTimeoutFn as _s}from"@vueuse/core";async function R(t,a){const s=await Lt(t,a);if(!s.success)throw new Error(s.error||"请求失败");return s.data}const ze={list:()=>R("media-luna/channels/list"),get:t=>R("media-luna/channels/get",{id:t}),create:t=>R("media-luna/channels/create",t),update:(t,a)=>R("media-luna/channels/update",{id:t,data:a}),delete:t=>R("media-luna/channels/delete",{id:t}),toggle:(t,a)=>R("media-luna/channels/toggle",{id:t,enabled:a}),tags:()=>R("media-luna/channels/tags"),getByTags:(t,a)=>R("media-luna/channels/by-tags",{tags:t,matchAll:a})},Ie={list:t=>R("media-luna/presets/list",{enabledOnly:t}),get:t=>R("media-luna/presets/get",{id:t}),create:t=>R("media-luna/presets/create",t),update:(t,a)=>R("media-luna/presets/update",{id:t,data:a}),delete:t=>R("media-luna/presets/delete",{id:t}),toggle:(t,a)=>R("media-luna/presets/toggle",{id:t,enabled:a}),copy:t=>R("media-luna/presets/copy",{id:t}),matching:t=>R("media-luna/presets/matching",{channelId:t}),tags:()=>R("media-luna/presets/tags"),getByTags:(t,a)=>R("media-luna/presets/by-tags",{tags:t,matchAll:a})},Pe={list:t=>R("media-luna/tasks/list",t),get:t=>R("media-luna/tasks/get",{id:t}),delete:t=>R("media-luna/tasks/delete",{id:t}),stats:t=>R("media-luna/tasks/stats",{channelId:t}),cleanup:t=>R("media-luna/tasks/cleanup",{days:t}),recent:(t,a)=>R("media-luna/tasks/recent",{userId:t,limit:a}),my:t=>R("media-luna/tasks/my",t)},ys={me:()=>R("media-luna/auth/me")},He={list:()=>R("media-luna/middlewares/list"),get:t=>R("media-luna/middlewares/get",{name:t}),update:(t,a)=>R("media-luna/middlewares/update",{name:t,data:a}),reset:t=>R("media-luna/middlewares/reset",{name:t}),executionOrder:()=>R("media-luna/middlewares/execution-order"),cardFields:()=>R("media-luna/middlewares/card-fields")},Be={list:()=>R("media-luna/connectors/list"),get:t=>R("media-luna/connectors/get",{id:t}),fields:t=>R("media-luna/connectors/fields",{id:t}),schema:()=>R("media-luna/connectors/schema")},hs={generate:t=>R("media-luna/generate",t),preview:t=>R("media-luna/generate/preview",t)},bs={upload:(t,a,s)=>R("media-luna/cache/upload",{data:t,mime:a,filename:s}),cacheUrl:t=>R("media-luna/cache/cache-url",{url:t}),get:t=>R("media-luna/cache/get",{id:t}),read:t=>R("media-luna/cache/read",{id:t}),delete:t=>R("media-luna/cache/delete",{id:t}),stats:()=>R("media-luna/cache/stats"),clear:()=>R("media-luna/cache/clear")},ht={panels:()=>R("media-luna/settings/panels"),get:t=>R("media-luna/settings/get",{id:t}),update:(t,a)=>R("media-luna/settings/update",{id:t,config:a}),syncRemotePresets:()=>R("media-luna/presets/sync")},we={status:()=>R("media-luna/setup/status"),getStorageFields:()=>R("media-luna/setup/storage/fields"),getStorageConfig:()=>R("media-luna/setup/storage/get"),updateStorageConfig:t=>R("media-luna/setup/storage/update",t),generateVerifyCode:t=>R("media-luna/setup/verify-code/generate",{uid:t}),verifyCode:(t,a)=>R("media-luna/setup/verify-code/verify",{code:t,uid:a}),bindUid:t=>R("media-luna/setup/bind-uid",{uid:t}),getUsers:()=>R("media-luna/setup/users"),complete:()=>R("media-luna/setup/complete")},at={list:()=>R("media-luna/plugins/list"),get:t=>R("media-luna/plugins/get",{id:t}),updateConfig:(t,a)=>R("media-luna/plugins/update-config",{pluginId:t,config:a}),enable:t=>R("media-luna/plugins/enable",{id:t}),disable:t=>R("media-luna/plugins/disable",{id:t}),externalList:()=>R("media-luna/plugins/external/list"),externalAdd:t=>R("media-luna/plugins/external/add",{moduleName:t}),externalRemove:t=>R("media-luna/plugins/external/remove",{moduleName:t})},ks={class:"tag-filter"},$s={class:"filter-tags"},ws=["onClick"],Cs={key:0,class:"filter-input-wrapper"},Vs=oe({__name:"TagFilter",props:{modelValue:{default:()=>[]},allTags:{},presetTags:{default:()=>[]},showInput:{type:Boolean,default:true},maxDynamicTags:{default:20}},emits:["update:modelValue","change"],setup(t,{emit:a}){const s=t,u=a,i=G({get:()=>s.modelValue,set:p=>{u("update:modelValue",p),u("change",p)}}),v=w(""),b=G(()=>{const p=s.allTags.filter(k=>!s.presetTags.includes(k)).slice(0,s.maxDynamicTags);return[...s.presetTags,...p]}),S=p=>{const k=[...i.value],U=k.indexOf(p);U>=0?k.splice(U,1):k.push(p),i.value=k},C=()=>{const p=v.value.trim();p&&!i.value.includes(p)&&(i.value=[...i.value,p]),v.value=""};return(p,k)=>{const U=A("k-icon"),I=A("el-input");return l(),n("div",ks,[e("div",$s,[(l(true),n(D,null,ee(b.value,f=>(l(),n("span",{key:f,class:te(["filter-tag",{active:i.value.includes(f)}]),onClick:T=>S(f)},$(f),11,ws))),128))]),t.showInput?(l(),n("div",Cs,[r(I,{modelValue:v.value,"onUpdate:modelValue":k[0]||(k[0]=f=>v.value=f),placeholder:"输入标签筛选...",size:"small",clearable:"",onKeyup:as(C,["enter"]),class:"filter-input"},{prefix:V(()=>[r(U,{name:"search"})]),_:1},8,["modelValue"])])):o("v-if",true)])}}}),ce=(t,a)=>{const s=t.__vccOpts||t;for(const[u,i]of a)s[u]=i;return s},dt=ce(Vs,[["__scopeId","data-v-61b504c8"]]),xs={class:"view-mode-switch"},Ss=oe({__name:"ViewModeSwitch",props:{modelValue:{}},emits:["update:modelValue"],setup(t){return(a,s)=>(l(),n("div",xs,[e("button",{class:te(["mode-btn",{active:t.modelValue==="card"}]),onClick:s[0]||(s[0]=u=>a.$emit("update:modelValue","card")),title:"卡片视图"},[...s[2]||(s[2]=[it('<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:te(["mode-btn",{active:t.modelValue==="list"}]),onClick:s[1]||(s[1]=u=>a.$emit("update:modelValue","list")),title:"列表视图"},[...s[3]||(s[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)]))}}),Et=ce(Ss,[["__scopeId","data-v-ae3ef498"]]),Is={class:"tag-input"},Ts=oe({__name:"TagInput",props:{modelValue:{},suggestions:{},placeholder:{}},emits:["update:modelValue"],setup(t,{emit:a}){const s=t,u=a,i=G({get:()=>s.modelValue,set:v=>u("update:modelValue",v)});return(v,b)=>{const S=A("el-option"),C=A("el-select");return l(),n("div",Is,[r(C,{modelValue:i.value,"onUpdate:modelValue":b[0]||(b[0]=p=>i.value=p),multiple:"",filterable:"","allow-create":"","default-first-option":"",placeholder:t.placeholder,class:"tag-select","tag-type":"primary"},{default:V(()=>[(l(true),n(D,null,ee(t.suggestions,p=>(l(),se(S,{key:p,label:p,value:p},null,8,["label","value"]))),128))]),_:1},8,["modelValue","placeholder"])])}}}),At=ce(Ts,[["__scopeId","data-v-68388640"]]);/**
2
+ * @vue/shared v3.5.22
3
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
+ * @license MIT
5
+ **/const Os=Object.prototype.hasOwnProperty,bt=(t,a)=>Os.call(t,a),Je=t=>typeof t=="function",Ge=t=>typeof t=="string",Mt=t=>t!==null&&typeof t=="object";var Us=typeof global=="object"&&global&&global.Object===Object&&global,zs=typeof self=="object"&&self&&self.Object===Object&&self,ut=Us||zs||Function("return this")(),De=ut.Symbol,jt=Object.prototype,Ps=jt.hasOwnProperty,Ds=jt.toString,Ee=De?De.toStringTag:void 0;function Ns(t){var a=Ps.call(t,Ee),s=t[Ee];try{t[Ee]=void 0;var u=true}catch{}var i=Ds.call(t);return u&&(a?t[Ee]=s:delete t[Ee]),i}var Fs=Object.prototype,Ls=Fs.toString;function Es(t){return Ls.call(t)}var As="[object Null]",Ms="[object Undefined]",kt=De?De.toStringTag:void 0;function Rt(t){return t==null?t===void 0?Ms:As:kt&&kt in Object(t)?Ns(t):Es(t)}function js(t){return t!=null&&typeof t=="object"}var Rs="[object Symbol]";function ct(t){return typeof t=="symbol"||js(t)&&Rt(t)==Rs}function Bs(t,a){for(var s=-1,u=t==null?0:t.length,i=Array(u);++s<u;)i[s]=a(t[s],s,t);return i}var vt=Array.isArray,$t=De?De.prototype:void 0,wt=$t?$t.toString:void 0;function Bt(t){if(typeof t=="string")return t;if(vt(t))return Bs(t,Bt)+"";if(ct(t))return wt?wt.call(t):"";var a=t+"";return a=="0"&&1/t==-1/0?"-0":a}function qt(t){var a=typeof t;return t!=null&&(a=="object"||a=="function")}var qs="[object AsyncFunction]",Hs="[object Function]",Js="[object GeneratorFunction]",Gs="[object Proxy]";function Ks(t){if(!qt(t))return false;var a=Rt(t);return a==Hs||a==Js||a==qs||a==Gs}var tt=ut["__core-js_shared__"],Ct=function(){var t=/[^.]+$/.exec(tt&&tt.keys&&tt.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function Ws(t){return!!Ct&&Ct in t}var Zs=Function.prototype,Ys=Zs.toString;function Xs(t){if(t!=null){try{return Ys.call(t)}catch{}try{return t+""}catch{}}return""}var Qs=/[\\^$.*+?()[\]{}|]/g,el=/^\[object .+?Constructor\]$/,tl=Function.prototype,sl=Object.prototype,ll=tl.toString,al=sl.hasOwnProperty,nl=RegExp("^"+ll.call(al).replace(Qs,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ol(t){if(!qt(t)||Ws(t))return false;var a=Ks(t)?nl:el;return a.test(Xs(t))}function il(t,a){return t==null?void 0:t[a]}function Ht(t,a){var s=il(t,a);return ol(s)?s:void 0}function rl(t,a){return t===a||t!==t&&a!==a}var dl=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ul=/^\w*$/;function cl(t,a){if(vt(t))return false;var s=typeof t;return s=="number"||s=="symbol"||s=="boolean"||t==null||ct(t)?true:ul.test(t)||!dl.test(t)||a!=null&&t in Object(a)}var Me=Ht(Object,"create");function vl(){this.__data__=Me?Me(null):{},this.size=0}function pl(t){var a=this.has(t)&&delete this.__data__[t];return this.size-=a?1:0,a}var ml="__lodash_hash_undefined__",fl=Object.prototype,gl=fl.hasOwnProperty;function _l(t){var a=this.__data__;if(Me){var s=a[t];return s===ml?void 0:s}return gl.call(a,t)?a[t]:void 0}var yl=Object.prototype,hl=yl.hasOwnProperty;function bl(t){var a=this.__data__;return Me?a[t]!==void 0:hl.call(a,t)}var kl="__lodash_hash_undefined__";function $l(t,a){var s=this.__data__;return this.size+=this.has(t)?0:1,s[t]=Me&&a===void 0?kl:a,this}function Ve(t){var a=-1,s=t==null?0:t.length;for(this.clear();++a<s;){var u=t[a];this.set(u[0],u[1])}}Ve.prototype.clear=vl;Ve.prototype.delete=pl;Ve.prototype.get=_l;Ve.prototype.has=bl;Ve.prototype.set=$l;function wl(){this.__data__=[],this.size=0}function Xe(t,a){for(var s=t.length;s--;)if(rl(t[s][0],a))return s;return-1}var Cl=Array.prototype,Vl=Cl.splice;function xl(t){var a=this.__data__,s=Xe(a,t);if(s<0)return false;var u=a.length-1;return s==u?a.pop():Vl.call(a,s,1),--this.size,true}function Sl(t){var a=this.__data__,s=Xe(a,t);return s<0?void 0:a[s][1]}function Il(t){return Xe(this.__data__,t)>-1}function Tl(t,a){var s=this.__data__,u=Xe(s,t);return u<0?(++this.size,s.push([t,a])):s[u][1]=a,this}function Fe(t){var a=-1,s=t==null?0:t.length;for(this.clear();++a<s;){var u=t[a];this.set(u[0],u[1])}}Fe.prototype.clear=wl;Fe.prototype.delete=xl;Fe.prototype.get=Sl;Fe.prototype.has=Il;Fe.prototype.set=Tl;var Ol=Ht(ut,"Map");function Ul(){this.size=0,this.__data__={hash:new Ve,map:new(Ol||Fe),string:new Ve}}function zl(t){var a=typeof t;return a=="string"||a=="number"||a=="symbol"||a=="boolean"?t!=="__proto__":t===null}function Qe(t,a){var s=t.__data__;return zl(a)?s[typeof a=="string"?"string":"hash"]:s.map}function Pl(t){var a=Qe(this,t).delete(t);return this.size-=a?1:0,a}function Dl(t){return Qe(this,t).get(t)}function Nl(t){return Qe(this,t).has(t)}function Fl(t,a){var s=Qe(this,t),u=s.size;return s.set(t,a),this.size+=s.size==u?0:1,this}function xe(t){var a=-1,s=t==null?0:t.length;for(this.clear();++a<s;){var u=t[a];this.set(u[0],u[1])}}xe.prototype.clear=Ul;xe.prototype.delete=Pl;xe.prototype.get=Dl;xe.prototype.has=Nl;xe.prototype.set=Fl;var Ll="Expected a function";function pt(t,a){if(typeof t!="function"||a!=null&&typeof a!="function")throw new TypeError(Ll);var s=function(){var u=arguments,i=a?a.apply(this,u):u[0],v=s.cache;if(v.has(i))return v.get(i);var b=t.apply(this,u);return s.cache=v.set(i,b)||v,b};return s.cache=new(pt.Cache||xe),s}pt.Cache=xe;var El=500;function Al(t){var a=pt(t,function(u){return s.size===El&&s.clear(),u}),s=a.cache;return a}var Ml=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,jl=/\\(\\)?/g,Rl=Al(function(t){var a=[];return t.charCodeAt(0)===46&&a.push(""),t.replace(Ml,function(s,u,i,v){a.push(i?v.replace(jl,"$1"):u||s)}),a});function Bl(t){return t==null?"":Bt(t)}function ql(t,a){return vt(t)?t:cl(t,a)?[t]:Rl(Bl(t))}function Hl(t){if(typeof t=="string"||ct(t))return t;var a=t+"";return a=="0"&&1/t==-1/0?"-0":a}function Jl(t,a){a=ql(a,t);for(var s=0,u=a.length;t!=null&&s<u;)t=t[Hl(a[s++])];return s&&s==u?t:void 0}function Gl(t,a,s){var u=t==null?void 0:Jl(t,a);return u===void 0?s:u}function Kl(t){for(var a=-1,s=t==null?0:t.length,u={};++a<s;){var i=t[a];u[i[0]]=i[1]}return u}const Wl=t=>t===void 0,je=t=>typeof t=="number",Zl=t=>typeof Element>"u"?false:t instanceof Element,Yl=t=>Ge(t)?!Number.isNaN(Number(t)):false,Vt=t=>Object.keys(t);function nt(t,a="px"){if(!t)return"";if(je(t)||Yl(t))return`${t}${a}`;if(Ge(t))return t}/*! Element Plus Icons Vue v2.3.2 */var Xl=oe({name:"CircleCloseFilled",__name:"circle-close-filled",setup(t){return(a,s)=>(l(),n("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z"})]))}}),Ql=Xl,ea=oe({name:"Close",__name:"close",setup(t){return(a,s)=>(l(),n("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e("path",{fill:"currentColor",d:"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"})]))}}),ta=ea,sa=oe({name:"InfoFilled",__name:"info-filled",setup(t){return(a,s)=>(l(),n("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z"})]))}}),la=sa,aa=oe({name:"SuccessFilled",__name:"success-filled",setup(t){return(a,s)=>(l(),n("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),na=aa,oa=oe({name:"WarningFilled",__name:"warning-filled",setup(t){return(a,s)=>(l(),n("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4"})]))}}),ia=oa;const Jt="__epPropKey",ke=t=>t,ra=t=>Mt(t)&&!!t[Jt],Gt=(t,a)=>{if(!Mt(t)||ra(t))return t;const{values:s,required:u,default:i,type:v,validator:b}=t,C={type:v,required:!!u,validator:s||b?p=>{let k=false,U=[];if(s&&(U=Array.from(s),bt(t,"default")&&U.push(i),k||(k=U.includes(p))),b&&(k||(k=b(p))),!k&&U.length>0){const I=[...new Set(U)].map(f=>JSON.stringify(f)).join(", ");ns(`Invalid prop: validation failed${a?` for prop "${a}"`:""}. Expected one of [${I}], got value ${JSON.stringify(p)}.`)}return k}:void 0,[Jt]:true};return bt(t,"default")&&(C.default=i),C},Re=t=>Kl(Object.entries(t).map(([a,s])=>[a,Gt(s,a)])),da=ke([String,Object,Function]),ua={Close:ta},xt={success:na,warning:ia,error:Ql,info:la},Kt=(t,a)=>(t.install=s=>{for(const u of[t,...Object.values({})])s.component(u.name,u)},t),ca=(t,a)=>(t.install=s=>{t._context=s._context,s.config.globalProperties[a]=t},t),va={esc:"Escape"},pa=["","default","small","large"],ma=t=>t,St=({from:t,replacement:a,scope:s,version:u,ref:i,type:v="API"},b)=>{ye(()=>ae(b),S=>{},{immediate:true})};var fa={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color."},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",week:"week",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},tour:{next:"Next",previous:"Previous",finish:"Finish"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const ga=t=>(a,s)=>_a(a,s,ae(t)),_a=(t,a,s)=>Gl(s,t,t).replace(/\{(\w+)\}/g,(u,i)=>{var v;return`${(v=a==null?void 0:a[i])!=null?v:`{${i}}`}`}),ya=t=>{const a=G(()=>ae(t).name),s=os(t)?t:w(t);return{lang:a,locale:s,t:ga(t)}},Wt=Symbol("localeContextKey"),ha=t=>{const a=t||Ue(Wt,w());return ya(G(()=>a.value||fa))},qe="el",ba="is-",Ce=(t,a,s,u,i)=>{let v=`${t}-${a}`;return s&&(v+=`-${s}`),u&&(v+=`__${u}`),i&&(v+=`--${i}`),v},Zt=Symbol("namespaceContextKey"),ka=t=>{const a=t||(Ae()?Ue(Zt,w(qe)):w(qe));return G(()=>ae(a)||qe)},mt=(t,a)=>{const s=ka(a);return{namespace:s,b:(m="")=>Ce(s.value,t,m,"",""),e:m=>m?Ce(s.value,t,"",m,""):"",m:m=>m?Ce(s.value,t,"","",m):"",be:(m,g)=>m&&g?Ce(s.value,t,m,g,""):"",em:(m,g)=>m&&g?Ce(s.value,t,"",m,g):"",bm:(m,g)=>m&&g?Ce(s.value,t,m,"",g):"",bem:(m,g,B)=>m&&g&&B?Ce(s.value,t,m,g,B):"",is:(m,...g)=>{const B=g.length>=1?g[0]:true;return m&&B?`${ba}${m}`:""},cssVar:m=>{const g={};for(const B in m)m[B]&&(g[`--${s.value}-${B}`]=m[B]);return g},cssVarName:m=>`--${s.value}-${m}`,cssVarBlock:m=>{const g={};for(const B in m)m[B]&&(g[`--${s.value}-${t}-${B}`]=m[B]);return g},cssVarBlockName:m=>`--${s.value}-${t}-${m}`}},It={current:0},Tt=w(0),Yt=2e3,Ot=Symbol("elZIndexContextKey"),Xt=Symbol("zIndexContextKey"),$a=t=>{const a=Ae()?Ue(Ot,It):It,s=t||(Ae()?Ue(Xt,void 0):void 0),u=G(()=>{const b=ae(s);return je(b)?b:Yt}),i=G(()=>u.value+Tt.value),v=()=>(a.current++,Tt.value=a.current,i.value);return!rt&&Ue(Ot),{initialZIndex:u,currentZIndex:i,nextZIndex:v}},wa=Gt({type:String,values:pa,required:false}),Ca=Symbol("size"),Va=Symbol("emptyValuesContextKey"),xa=Re({emptyValues:Array,valueOnClear:{type:[String,Number,Boolean,Function],default:void 0,validator:t=>Je(t)?!t():!t}}),Qt=Symbol(),Ke=w();function es(t,a=void 0){return Ae()?Ue(Qt,Ke):Ke}function Sa(t,a){const s=es(),u=mt(t,G(()=>{var S;return((S=s.value)==null?void 0:S.namespace)||qe})),i=ha(G(()=>{var S;return(S=s.value)==null?void 0:S.locale})),v=$a(G(()=>{var S;return((S=s.value)==null?void 0:S.zIndex)||Yt})),b=G(()=>{var S;return ae(a)||((S=s.value)==null?void 0:S.size)||""});return ts(G(()=>ae(s)||{})),{ns:u,locale:i,zIndex:v,size:b}}const ts=(t,a,s=false)=>{var u;const i=!!Ae(),v=i?es():void 0,b=(u=void 0)!=null?u:i?is:void 0;if(!b)return;const S=G(()=>{const C=ae(t);return v!=null&&v.value?Ia(v.value,C):C});return b(Qt,S),b(Wt,G(()=>S.value.locale)),b(Zt,G(()=>S.value.namespace)),b(Xt,G(()=>S.value.zIndex)),b(Ca,{size:G(()=>S.value.size||"")}),b(Va,G(()=>({emptyValues:S.value.emptyValues,valueOnClear:S.value.valueOnClear}))),(s||!Ke.value)&&(Ke.value=S.value),S},Ia=(t,a)=>{const s=[...new Set([...Vt(t),...Vt(a)])],u={};for(const i of s)u[i]=a[i]!==void 0?a[i]:t[i];return u},Ta=Re({a11y:{type:Boolean,default:true},locale:{type:ke(Object)},size:wa,button:{type:ke(Object)},experimentalFeatures:{type:ke(Object)},keyboardNavigation:{type:Boolean,default:true},message:{type:ke(Object)},zIndex:Number,namespace:{type:String,default:"el"},...xa}),ot={};oe({name:"ElConfigProvider",props:Ta,setup(t,{slots:a}){ye(()=>t.message,u=>{Object.assign(ot,u??{})},{immediate:true,deep:true});const s=ts(t);return()=>We(a,"default",{config:s==null?void 0:s.value})}});var ft=(t,a)=>{const s=t.__vccOpts||t;for(const[u,i]of a)s[u]=i;return s};const Oa=Re({size:{type:ke([Number,String])},color:{type:String}}),Ua=oe({name:"ElIcon",inheritAttrs:false}),za=oe({...Ua,props:Oa,setup(t){const a=t,s=mt("icon"),u=G(()=>{const{size:i,color:v}=a;return!i&&!v?{}:{fontSize:Wl(i)?void 0:nt(i),"--color":v}});return(i,v)=>(l(),n("i",rs({class:ae(s).b(),style:ae(u)},i.$attrs),[We(i.$slots,"default")],16))}});var Pa=ft(za,[["__file","icon.vue"]]);const Ut=Kt(Pa),Da=Re({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:true},color:String,dotStyle:{type:ke([String,Object,Array])},badgeStyle:{type:ke([String,Object,Array])},offset:{type:ke(Array),default:[0,0]},dotClass:{type:String},badgeClass:{type:String}}),Na=["textContent"],Fa=oe({name:"ElBadge"}),La=oe({...Fa,props:Da,setup(t,{expose:a}){const s=t,u=mt("badge"),i=G(()=>s.isDot?"":je(s.value)&&je(s.max)?s.max<s.value?`${s.max}+`:s.value===0&&!s.showZero?"":`${s.value}`:`${s.value}`),v=G(()=>{var b,S,C,p,k,U;return[{backgroundColor:s.color,marginRight:nt(-((S=(b=s.offset)==null?void 0:b[0])!=null?S:0)),marginTop:nt((p=(C=s.offset)==null?void 0:C[1])!=null?p:0)},(k=s.dotStyle)!=null?k:{},(U=s.badgeStyle)!=null?U:{}]});return St({from:"dot-style",replacement:"badge-style",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},G(()=>!!s.dotStyle)),St({from:"dot-class",replacement:"badge-class",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},G(()=>!!s.dotClass)),a({content:i}),(b,S)=>(l(),n("div",{class:te(ae(u).b())},[We(b.$slots,"default"),r(Ze,{name:`${ae(u).namespace.value}-zoom-in-center`,persisted:""},{default:V(()=>[Te(e("sup",{class:te([ae(u).e("content"),ae(u).em("content",b.type),ae(u).is("fixed",!!b.$slots.default),ae(u).is("dot",b.isDot),b.dotClass,b.badgeClass]),style:Nt(ae(v)),textContent:$(ae(i))},null,14,Na),[[Oe,!b.hidden&&(ae(i)||b.isDot)]])]),_:1},8,["name"])],2))}});var Ea=ft(La,[["__file","badge.vue"]]);const Aa=Kt(Ea),ss=["success","info","warning","error"],ge=ma({customClass:"",center:false,dangerouslyUseHTMLString:false,duration:3e3,icon:void 0,id:"",message:"",onClose:void 0,showClose:false,type:"info",plain:false,offset:16,zIndex:0,grouping:false,repeatNum:1,appendTo:rt?document.body:void 0}),Ma=Re({customClass:{type:String,default:ge.customClass},center:{type:Boolean,default:ge.center},dangerouslyUseHTMLString:{type:Boolean,default:ge.dangerouslyUseHTMLString},duration:{type:Number,default:ge.duration},icon:{type:da,default:ge.icon},id:{type:String,default:ge.id},message:{type:ke([String,Object,Function]),default:ge.message},onClose:{type:ke(Function),default:ge.onClose},showClose:{type:Boolean,default:ge.showClose},type:{type:String,values:ss,default:ge.type},plain:{type:Boolean,default:ge.plain},offset:{type:Number,default:ge.offset},zIndex:{type:Number,default:ge.zIndex},grouping:{type:Boolean,default:ge.grouping},repeatNum:{type:Number,default:ge.repeatNum}}),ja={destroy:()=>true},$e=ds([]),Ra=t=>{const a=$e.findIndex(i=>i.id===t),s=$e[a];let u;return a>0&&(u=$e[a-1]),{current:s,prev:u}},Ba=t=>{const{prev:a}=Ra(t);return a?a.vm.exposed.bottom.value:0},qa=(t,a)=>$e.findIndex(u=>u.id===t)>0?16:a,Ha=["id"],Ja=["innerHTML"],Ga=oe({name:"ElMessage"}),Ka=oe({...Ga,props:Ma,emits:ja,setup(t,{expose:a}){const s=t,{Close:u}=ua,{ns:i,zIndex:v}=Sa("message"),{currentZIndex:b,nextZIndex:S}=v,C=w(),p=w(false),k=w(0);let U;const I=G(()=>s.type?s.type==="error"?"danger":s.type:"info"),f=G(()=>{const Q=s.type;return{[i.bm("icon",Q)]:Q&&xt[Q]}}),T=G(()=>s.icon||xt[s.type]||""),m=G(()=>Ba(s.id)),g=G(()=>qa(s.id,s.offset)+m.value),B=G(()=>k.value+g.value),J=G(()=>({top:`${g.value}px`,zIndex:b.value}));function F(){s.duration!==0&&({stop:U}=_s(()=>{x()},s.duration))}function O(){U==null||U()}function x(){p.value=false}function Y({code:Q}){Q===va.esc&&x()}return he(()=>{F(),S(),p.value=true}),ye(()=>s.repeatNum,()=>{O(),F()}),fs(document,"keydown",Y),gs(C,()=>{k.value=C.value.getBoundingClientRect().height}),a({visible:p,bottom:B,close:x}),(Q,ve)=>(l(),se(Ze,{name:ae(i).b("fade"),onBeforeLeave:Q.onClose,onAfterLeave:ve[0]||(ve[0]=N=>Q.$emit("destroy")),persisted:""},{default:V(()=>[Te(e("div",{id:Q.id,ref_key:"messageRef",ref:C,class:te([ae(i).b(),{[ae(i).m(Q.type)]:Q.type},ae(i).is("center",Q.center),ae(i).is("closable",Q.showClose),ae(i).is("plain",Q.plain),Q.customClass]),style:Nt(ae(J)),role:"alert",onMouseenter:O,onMouseleave:F},[Q.repeatNum>1?(l(),se(ae(Aa),{key:0,value:Q.repeatNum,type:ae(I),class:te(ae(i).e("badge"))},null,8,["value","type","class"])):o("v-if",true),ae(T)?(l(),se(ae(Ut),{key:1,class:te([ae(i).e("icon"),ae(f)])},{default:V(()=>[(l(),se(lt(ae(T))))]),_:1},8,["class"])):o("v-if",true),We(Q.$slots,"default",{},()=>[Q.dangerouslyUseHTMLString?(l(),n(D,{key:1},[o(" Caution here, message could've been compromised, never use user's input as message "),e("p",{class:te(ae(i).e("content")),innerHTML:Q.message},null,10,Ja)],2112)):(l(),n("p",{key:0,class:te(ae(i).e("content"))},$(Q.message),3))]),Q.showClose?(l(),se(ae(Ut),{key:2,class:te(ae(i).e("closeBtn")),onClick:fe(x,["stop"])},{default:V(()=>[r(ae(u))]),_:1},8,["class","onClick"])):o("v-if",true)],46,Ha),[[Oe,p.value]])]),_:3},8,["name","onBeforeLeave"]))}});var Wa=ft(Ka,[["__file","message.vue"]]);let Za=1;const ls=t=>{const a=!t||Ge(t)||Ft(t)||Je(t)?{message:t}:t,s={...ge,...a};if(!s.appendTo)s.appendTo=document.body;else if(Ge(s.appendTo)){let u=document.querySelector(s.appendTo);Zl(u)||(u=document.body),s.appendTo=u}return s},Ya=t=>{const a=$e.indexOf(t);if(a===-1)return;$e.splice(a,1);const{handler:s}=t;s.close()},Xa=({appendTo:t,...a},s)=>{const u=`message_${Za++}`,i=a.onClose,v=document.createElement("div"),b={...a,id:u,onClose:()=>{i==null||i(),Ya(k)},onDestroy:()=>{_t(null,v)}},S=r(Wa,b,Je(b.message)||Ft(b.message)?{default:Je(b.message)?b.message:()=>b.message}:null);S.appContext=s||Ne._context,_t(S,v),t.appendChild(v.firstElementChild);const C=S.component,k={id:u,vnode:S,vm:C,handler:{close:()=>{C.exposed.visible.value=false}},props:S.component.props};return k},Ne=(t={},a)=>{if(!rt)return{close:()=>{}};if(je(ot.max)&&$e.length>=ot.max)return{close:()=>{}};const s=ls(t);if(s.grouping&&$e.length){const i=$e.find(({vnode:v})=>{var b;return((b=v.props)==null?void 0:b.message)===s.message});if(i)return i.props.repeatNum+=1,i.props.type=s.type,i.handler}const u=Xa(s,a);return $e.push(u),u.handler};ss.forEach(t=>{Ne[t]=(a={},s)=>{const u=ls(a);return Ne({...u,type:t},s)}});function Qa(t){for(const a of $e)(!t||t===a.props.type)&&a.handler.close()}Ne.closeAll=Qa;Ne._context=null;const Se=ca(Ne,"$message"),en={class:"table-field-editor"},tn={class:"toolbar"},sn={class:"toolbar-left"},ln={class:"toolbar-right"},an={class:"table-wrapper"},nn={class:"data-table"},on={key:0,class:"col-check"},rn={key:0,class:"col-check"},dn={class:"col-op"},un=["colspan"],cn={class:"add-hint"},vn={key:0,class:"table-footer"},pn={class:"import-mode"},mn={class:"presets-header"},fn={class:"sel-count"},gn={class:"presets-list"},_n=["onClick"],yn={class:"p-alias"},hn={class:"p-desc"},bn=oe({__name:"TableFieldEditor",props:{columns:{},modelValue:{default:()=>[]},tableConfig:{},presets:{default:()=>[]}},emits:["update:modelValue"],setup(t,{emit:a}){const s=t,u=a,i=G({get:()=>s.modelValue||[],set:z=>u("update:modelValue",z)}),v=w([]),b=G(()=>i.value.length>0&&v.value.length===i.value.length),S=G(()=>v.value.length>0&&v.value.length<i.value.length),C=G(()=>{var y;let z=s.columns.length+1;return((y=s.tableConfig)==null?void 0:y.enableSelection)!==false&&z++,z}),p=w(false),k=w(""),U=w("append"),I=w(false),f=w([]),T=w(""),m=G(()=>{const z=new Set;for(const y of i.value)y.alias&&z.add(y.alias.toLowerCase());return z}),g=G(()=>{if(!T.value)return s.presets;const z=T.value.toLowerCase();return s.presets.filter(y=>{var d,c,L;return((d=y.alias)==null?void 0:d.toLowerCase().includes(z))||((c=y.description)==null?void 0:c.toLowerCase().includes(z))||((L=y.repoId)==null?void 0:L.toLowerCase().includes(z))})});function B(){const z={};for(const y of s.columns)z[y.key]=y.type==="boolean"?false:y.type==="number"?void 0:"";u("update:modelValue",[...i.value,z])}function J(z){const y=[...i.value];y.splice(z,1),u("update:modelValue",y),v.value=v.value.filter(d=>d!==z).map(d=>d>z?d-1:d)}function F(z,y,d){const c=[...i.value];c[z]={...c[z],[y]:d},u("update:modelValue",c)}function O(z){const y=v.value.indexOf(z);y>=0?v.value.splice(y,1):v.value.push(z)}function x(z){v.value=z?i.value.map((y,d)=>d):[]}function Y(){if(v.value.length===0)return;const z=new Set(v.value);u("update:modelValue",i.value.filter((y,d)=>!z.has(d))),Se.success(`已删除 ${z.size} 条`),v.value=[]}function Q(){const z=new Blob([JSON.stringify(i.value,null,2)],{type:"application/json"}),y=URL.createObjectURL(z),d=document.createElement("a");d.href=y,d.download="data.json",d.click(),URL.revokeObjectURL(y),Se.success("导出成功")}function ve(){try{const z=JSON.parse(k.value);if(!Array.isArray(z)){Se.error("需要 JSON 数组");return}const y=z.map(d=>{const c={};for(const L of s.columns)c[L.key]=d[L.key]??(L.key==="repoId"&&d.name?d.name:"");return c});u("update:modelValue",U.value==="replace"?y:[...i.value,...y]),Se.success(`已导入 ${y.length} 条`),p.value=false,k.value=""}catch{Se.error("JSON 解析失败")}}function N(){f.value=g.value.filter(z=>{var y;return!m.value.has((y=z.alias)==null?void 0:y.toLowerCase())}).map(z=>z.alias)}function P(z){if(m.value.has(z==null?void 0:z.toLowerCase()))return;const y=f.value.indexOf(z);y>=0?f.value.splice(y,1):f.value.push(z)}function W(){const y=s.presets.filter(d=>f.value.includes(d.alias)).map(d=>{const c={};for(const L of s.columns)c[L.key]=d[L.key]??"";return c});u("update:modelValue",[...i.value,...y]),Se.success(`已导入 ${y.length} 条`),I.value=false,f.value=[]}return ye(I,z=>{z&&(f.value=[],T.value="")}),(z,y)=>{var M,Z,ue,q,ie;const d=A("k-icon"),c=A("el-button"),L=A("el-checkbox"),ne=A("el-input"),K=A("el-input-number"),_=A("el-switch"),h=A("el-option"),j=A("el-select"),re=A("el-radio"),le=A("el-radio-group"),de=A("el-dialog"),pe=A("el-tag");return l(),n("div",en,[o(" 工具栏 "),e("div",tn,[e("div",sn,[r(c,{type:"primary",size:"small",onClick:B},{default:V(()=>[r(d,{name:"add"}),y[10]||(y[10]=E(" 添加 ",-1))]),_:1}),(M=t.tableConfig)!=null&&M.enableBatchDelete&&v.value.length>0?(l(),se(c,{key:0,type:"danger",size:"small",onClick:Y},{default:V(()=>[E(" 删除选中 ("+$(v.value.length)+") ",1)]),_:1})):o("v-if",true)]),e("div",ln,[((Z=t.presets)==null?void 0:Z.length)>0?(l(),se(c,{key:0,size:"small",onClick:y[0]||(y[0]=H=>I.value=true)},{default:V(()=>[...y[11]||(y[11]=[E(" 内置预设 ",-1)])]),_:1})):o("v-if",true),((ue=t.tableConfig)==null?void 0:ue.enableImport)!==false?(l(),se(c,{key:1,size:"small",onClick:y[1]||(y[1]=H=>p.value=true)},{default:V(()=>[...y[12]||(y[12]=[E(" 导入 ",-1)])]),_:1})):o("v-if",true),((q=t.tableConfig)==null?void 0:q.enableExport)!==false?(l(),se(c,{key:2,size:"small",onClick:Q},{default:V(()=>[...y[13]||(y[13]=[E(" 导出 ",-1)])]),_:1})):o("v-if",true)])]),o(" 数据表格 "),e("div",an,[e("table",nn,[e("thead",null,[e("tr",null,[((ie=t.tableConfig)==null?void 0:ie.enableSelection)!==false?(l(),n("th",on,[r(L,{"model-value":b.value,indeterminate:S.value,onChange:x,size:"small"},null,8,["model-value","indeterminate"])])):o("v-if",true),(l(true),n(D,null,ee(t.columns,H=>(l(),n("th",{key:H.key,class:te(["col-"+H.key,{required:H.required}])},$(H.label),3))),128)),y[14]||(y[14]=e("th",{class:"col-op"},"操作",-1))])]),e("tbody",null,[(l(true),n(D,null,ee(i.value,(H,_e)=>{var Le;return l(),n("tr",{key:_e,class:te({selected:v.value.includes(_e)})},[((Le=t.tableConfig)==null?void 0:Le.enableSelection)!==false?(l(),n("td",rn,[r(L,{"model-value":v.value.includes(_e),onChange:me=>O(_e),size:"small"},null,8,["model-value","onChange"])])):o("v-if",true),(l(true),n(D,null,ee(t.columns,me=>(l(),n("td",{key:me.key,class:te("col-"+me.key)},[me.type==="text"?(l(),se(ne,{key:0,"model-value":H[me.key],"onUpdate:modelValue":be=>F(_e,me.key,be),placeholder:me.placeholder,size:"small"},null,8,["model-value","onUpdate:modelValue","placeholder"])):me.type==="number"?(l(),se(K,{key:1,"model-value":H[me.key],"onUpdate:modelValue":be=>F(_e,me.key,be),size:"small",controls:false,class:"num-input"},null,8,["model-value","onUpdate:modelValue"])):me.type==="boolean"?(l(),se(_,{key:2,"model-value":H[me.key],"onUpdate:modelValue":be=>F(_e,me.key,be),size:"small"},null,8,["model-value","onUpdate:modelValue"])):me.type==="select"?(l(),se(j,{key:3,"model-value":H[me.key],"onUpdate:modelValue":be=>F(_e,me.key,be),placeholder:me.placeholder||"请选择",size:"small"},{default:V(()=>[(l(true),n(D,null,ee(me.options,be=>(l(),se(h,{key:String(be.value),label:be.label,value:be.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder"])):o("v-if",true)],2))),128)),e("td",dn,[r(c,{type:"danger",size:"small",link:"",onClick:me=>J(_e)},{default:V(()=>[...y[15]||(y[15]=[E(" 删除 ",-1)])]),_:1},8,["onClick"])])],2)}),128)),o(" 添加行 "),e("tr",{class:"add-row",onClick:B},[e("td",{colspan:C.value,class:"add-cell"},[e("span",cn,[r(d,{name:"add"}),y[16]||(y[16]=E(" 点击添加一行 ",-1))])],8,un)])])])]),o(" 底部统计 "),i.value.length>0?(l(),n("div",vn," 共 "+$(i.value.length)+" 条 ",1)):o("v-if",true),o(" 导入对话框 "),r(de,{modelValue:p.value,"onUpdate:modelValue":y[5]||(y[5]=H=>p.value=H),title:"导入数据",width:"550px","close-on-click-modal":false},{footer:V(()=>[r(c,{onClick:y[4]||(y[4]=H=>p.value=false)},{default:V(()=>[...y[19]||(y[19]=[E("取消",-1)])]),_:1}),r(c,{type:"primary",onClick:ve},{default:V(()=>[...y[20]||(y[20]=[E("导入",-1)])]),_:1})]),default:V(()=>[y[21]||(y[21]=e("p",{class:"dialog-tip"},"粘贴 JSON 数组格式数据:",-1)),r(ne,{modelValue:k.value,"onUpdate:modelValue":y[2]||(y[2]=H=>k.value=H),type:"textarea",rows:10,placeholder:'[{"alias": "xxx", "repoId": "xxx", ...}]'},null,8,["modelValue"]),e("div",pn,[r(le,{modelValue:U.value,"onUpdate:modelValue":y[3]||(y[3]=H=>U.value=H)},{default:V(()=>[r(re,{value:"append"},{default:V(()=>[...y[17]||(y[17]=[E("追加",-1)])]),_:1}),r(re,{value:"replace"},{default:V(()=>[...y[18]||(y[18]=[E("替换",-1)])]),_:1})]),_:1},8,["modelValue"])])]),_:1},8,["modelValue"]),o(" 预设对话框 "),r(de,{modelValue:I.value,"onUpdate:modelValue":y[9]||(y[9]=H=>I.value=H),title:"内置预设",width:"600px","close-on-click-modal":false},{footer:V(()=>[r(c,{onClick:y[8]||(y[8]=H=>I.value=false)},{default:V(()=>[...y[25]||(y[25]=[E("取消",-1)])]),_:1}),r(c,{type:"primary",onClick:W,disabled:f.value.length===0},{default:V(()=>[E(" 导入 ("+$(f.value.length)+") ",1)]),_:1},8,["disabled"])]),default:V(()=>[e("div",mn,[r(ne,{modelValue:T.value,"onUpdate:modelValue":y[6]||(y[6]=H=>T.value=H),placeholder:"搜索...",size:"small",clearable:"",class:"search-input"},null,8,["modelValue"]),r(c,{size:"small",onClick:N},{default:V(()=>[...y[22]||(y[22]=[E("全选",-1)])]),_:1}),r(c,{size:"small",onClick:y[7]||(y[7]=H=>f.value=[])},{default:V(()=>[...y[23]||(y[23]=[E("清空",-1)])]),_:1}),e("span",fn,"已选 "+$(f.value.length),1)]),e("div",gn,[(l(true),n(D,null,ee(g.value,H=>{var _e,Le,me;return l(),n("div",{key:H.alias,class:te(["preset-row",{selected:f.value.includes(H.alias),disabled:m.value.has((_e=H.alias)==null?void 0:_e.toLowerCase())}]),onClick:be=>P(H.alias)},[r(L,{"model-value":f.value.includes(H.alias),disabled:m.value.has((Le=H.alias)==null?void 0:Le.toLowerCase()),size:"small"},null,8,["model-value","disabled"]),e("span",yn,$(H.alias),1),e("span",hn,$(H.description||H.repoId),1),m.value.has((me=H.alias)==null?void 0:me.toLowerCase())?(l(),se(pe,{key:0,size:"small",type:"info"},{default:V(()=>[...y[24]||(y[24]=[E("已有",-1)])]),_:1})):o("v-if",true)],10,_n)}),128))])]),_:1},8,["modelValue"])])}}}),kn=ce(bn,[["__scopeId","data-v-3cee27e6"]]),$n={class:"config-renderer"},wn={key:0,class:"form-row"},Cn={class:"field-container"},Vn={key:7,class:"field-desc"},xn=oe({__name:"ConfigRenderer",props:{fields:{},modelValue:{},clearable:{type:Boolean,default:false},presetsMap:{default:()=>({})}},emits:["update:modelValue"],setup(t,{emit:a}){const s=t,u=a,i=p=>s.modelValue[p],v=(p,k)=>{const U={...s.modelValue,[p]:k};u("update:modelValue",U)},b=p=>{if(!p.showWhen)return true;const{field:k,value:U}=p.showWhen;return s.modelValue[k]===U},S=p=>{const k=s.modelValue[p];return Array.isArray(k)?k:[]},C=p=>{var k;return p?((k=s.presetsMap)==null?void 0:k[p])||[]:[]};return(p,k)=>{const U=A("el-switch"),I=A("el-option"),f=A("el-select"),T=A("el-input-number"),m=A("el-input");return l(),n("div",$n,[(l(true),n(D,null,ee(t.fields,g=>{var B;return l(),n(D,{key:g.key},[b(g)?(l(),n("div",wn,[e("div",{class:te(["form-label",{required:g.required}])},$(g.label),3),e("div",Cn,[o(" Boolean 类型 "),g.type==="boolean"?(l(),se(U,{key:0,"model-value":i(g.key),"onUpdate:modelValue":J=>v(g.key,J)},null,8,["model-value","onUpdate:modelValue"])):g.type==="select"?(l(),n(D,{key:1},[o(" Select 类型 "),r(f,{"model-value":i(g.key),"onUpdate:modelValue":J=>v(g.key,J),placeholder:g.placeholder||"请选择",clearable:t.clearable,style:{width:"100%"}},{default:V(()=>[(l(true),n(D,null,ee(g.options,J=>(l(),se(I,{key:String(J.value),label:J.label,value:J.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)):g.type==="number"?(l(),n(D,{key:2},[o(" Number 类型 "),r(T,{"model-value":i(g.key),"onUpdate:modelValue":J=>v(g.key,J),placeholder:g.placeholder,controls:true},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):g.type==="textarea"?(l(),n(D,{key:3},[o(" Textarea 类型 "),r(m,{"model-value":i(g.key),"onUpdate:modelValue":J=>v(g.key,J),type:"textarea",rows:4,placeholder:g.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):g.type==="table"&&g.columns?(l(),n(D,{key:4},[o(" Table 类型(数组对象编辑) "),r(kn,{columns:g.columns,"model-value":S(g.key),"onUpdate:modelValue":J=>v(g.key,J),"table-config":g.tableConfig,presets:C((B=g.tableConfig)==null?void 0:B.presetsSource)},null,8,["columns","model-value","onUpdate:modelValue","table-config","presets"])],64)):g.type==="password"?(l(),n(D,{key:5},[o(" Password 类型 "),r(m,{"model-value":i(g.key),"onUpdate:modelValue":J=>v(g.key,J),type:"password","show-password":"",placeholder:g.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(l(),n(D,{key:6},[o(" Text/String 类型 (默认) "),r(m,{"model-value":i(g.key),"onUpdate:modelValue":J=>v(g.key,J),placeholder:g.placeholder,clearable:t.clearable},null,8,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)),o(" 字段描述 "),g.description?(l(),n("div",Vn,$(g.description),1)):o("v-if",true)])])):o("v-if",true)],64)}),128))])}}}),et=ce(xn,[["__scopeId","data-v-e970d3f2"]]),Sn={class:"dialog-layout"},In={class:"tab-nav"},Tn=["onClick"],On={key:0,class:"tab-badge"},Un={class:"tab-content"},zn={class:"content-section"},Pn={class:"form-group"},Dn={class:"form-row"},Nn={class:"form-group flex-1"},Fn={class:"form-group"},Ln={class:"switch-wrapper"},En={class:"switch-label"},An={class:"form-group"},Mn={class:"section-divider"},jn={class:"content-section"},Rn={class:"override-hint-bar"},Bn={class:"pipeline-flow"},qn={class:"phase-icon"},Hn={class:"phase-info"},Jn={class:"phase-name"},Gn={class:"phase-desc"},Kn={class:"phase-badge"},Wn={key:0,class:"phase-middlewares"},Zn={class:"mw-card"},Yn={class:"mw-content"},Xn={class:"mw-name"},Qn={class:"mw-desc"},eo={key:2,class:"phase-connector"},to={class:"connector-arrow"},so={class:"content-section"},lo={class:"override-hint-bar"},ao={key:0,class:"plugins-override-list"},no=["onClick"],oo={class:"plugin-info"},io={class:"plugin-name"},ro={key:0,class:"override-badge"},uo={class:"plugin-actions"},co={class:"plugin-config-fields"},vo={key:0,class:"override-field-row"},po={class:"field-label"},mo={class:"field-input"},fo={key:0,class:"field-hint"},go={key:1,class:"empty-hint"},_o={class:"dialog-footer"},yo=oe({__name:"ChannelConfigDialog",props:{modelValue:{type:Boolean},channel:{default:null}},emits:["update:modelValue","saved"],setup(t,{emit:a}){const s=t,u=a,i=G({get:()=>s.modelValue,set:_=>u("update:modelValue",_)}),v=G(()=>{var _;return!!((_=s.channel)!=null&&_.id)}),b=w("basic"),S=w(false),C=w(new Set),p=w([]),k=w({}),U=w([]),I=w([]),f=w({name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}),T=[{id:"basic",label:"基本信息",icon:"file-text"},{id:"middlewares",label:"中间件流程",icon:"git-branch"},{id:"plugins",label:"插件配置",icon:"puzzle"}],m=[{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"}],g={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},B=G(()=>f.value.connectorId?k.value[f.value.connectorId]||[]:[]),J=G(()=>{const _=p.value.find(h=>h.id===f.value.connectorId);return(_==null?void 0:_.name)||"连接器"}),F=G(()=>T.map(_=>{let h="";return _.id==="middlewares"&&(h=String(U.value.length)),_.id==="plugins"&&O.value.length>0&&(h=String(O.value.length)),{..._,badge:h}})),O=G(()=>I.value.filter(_=>_.configFields&&_.configFields.length>0)),x=_=>U.value.filter(h=>h.phase===_),Y=(_,h)=>{var j,re,le;return(le=(re=(j=f.value.pluginOverrides)==null?void 0:j[_])==null?void 0:re.middlewares)==null?void 0:le[h]},Q=(_,h,j)=>{f.value.pluginOverrides||(f.value.pluginOverrides={}),f.value.pluginOverrides[_]||(f.value.pluginOverrides[_]={}),f.value.pluginOverrides[_].middlewares||(f.value.pluginOverrides[_].middlewares={}),j==null?(delete f.value.pluginOverrides[_].middlewares[h],Object.keys(f.value.pluginOverrides[_].middlewares).length===0&&delete f.value.pluginOverrides[_].middlewares,Object.keys(f.value.pluginOverrides[_]).length===0&&delete f.value.pluginOverrides[_]):f.value.pluginOverrides[_].middlewares[h]=j},ve=_=>{const h=Y(_.configGroup||_.name,_.name);return h!==void 0?h?"active override":"override":_.enabled?"active":""},N=(_,h)=>{var j,re;return(re=(j=f.value.pluginOverrides)==null?void 0:j[_])==null?void 0:re[h]},P=(_,h,j)=>{f.value.pluginOverrides||(f.value.pluginOverrides={}),f.value.pluginOverrides[_]||(f.value.pluginOverrides[_]={}),j==null||j===""?(delete f.value.pluginOverrides[_][h],Object.keys(f.value.pluginOverrides[_]).length===0&&delete f.value.pluginOverrides[_]):f.value.pluginOverrides[_][h]=j},W=_=>{var j;const h=(j=f.value.pluginOverrides)==null?void 0:j[_];return h&&Object.keys(h).length>0},z=_=>{f.value.pluginOverrides&&delete f.value.pluginOverrides[_]},y=_=>{C.value.has(_)?C.value.delete(_):C.value.add(_)},d=(_,h)=>{var M,Z;if(!h.showWhen)return true;const{field:j,value:re}=h.showWhen,le=(Z=(M=f.value.pluginOverrides)==null?void 0:M[_.id])==null?void 0:Z[j],de=_.config[j];return(le!==void 0?le:de)===re},c=async _=>{if(f.value.connectorConfig={},_&&!k.value[_])try{const h=await Be.fields(_);k.value[_]=h}catch(h){console.error("Failed to load connector fields:",h)}},L=async()=>{var _;if(!f.value.name){X.error("请输入渠道名称");return}if(!f.value.connectorId){X.error("请选择连接器");return}S.value=true;try{v.value&&((_=s.channel)!=null&&_.id)?(await ze.update(s.channel.id,f.value),X.success("保存成功")):(await ze.create(f.value),X.success("创建成功")),u("saved"),i.value=false}catch(h){X.error(h instanceof Error?h.message:"操作失败")}finally{S.value=false}},ne=()=>{b.value="basic",C.value.clear()},K=async()=>{try{const[_,h,j]=await Promise.all([Be.list(),He.list(),at.list()]);p.value=_,U.value=h,I.value=j.filter(re=>re.configFields&&re.configFields.length>0||re.middlewares&&re.middlewares.length>0)}catch(_){console.error("Failed to load data:",_)}};return ye(()=>s.modelValue,async _=>{if(_)if(await K(),s.channel){if(f.value=JSON.parse(JSON.stringify(s.channel)),f.value.pluginOverrides||(f.value.pluginOverrides={}),f.value.connectorConfig||(f.value.connectorConfig={}),f.value.connectorId&&!k.value[f.value.connectorId])try{const h=await Be.fields(f.value.connectorId);k.value[f.value.connectorId]=h}catch(h){console.error("Failed to load connector fields:",h)}for(const h of Object.keys(f.value.pluginOverrides))C.value.add(h)}else f.value={name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}}),(_,h)=>{const j=A("k-icon"),re=A("el-input"),le=A("el-option"),de=A("el-select"),pe=A("el-switch"),M=A("k-button"),Z=A("el-input-number"),ue=A("el-dialog");return l(),se(ue,{modelValue:i.value,"onUpdate:modelValue":h[6]||(h[6]=q=>i.value=q),title:v.value?"编辑渠道":"创建渠道",width:"800px","close-on-click-modal":false,class:"channel-config-dialog",onClosed:ne},{footer:V(()=>[e("div",_o,[r(M,{onClick:h[5]||(h[5]=q=>i.value=false)},{default:V(()=>[...h[24]||(h[24]=[E("取消",-1)])]),_:1}),r(M,{type:"primary",onClick:L,loading:S.value},{default:V(()=>[E($(v.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:V(()=>[e("div",Sn,[o(" 左侧 Tab 导航 "),e("div",In,[(l(true),n(D,null,ee(F.value,q=>(l(),n("div",{key:q.id,class:te(["tab-item",{active:b.value===q.id}]),onClick:ie=>b.value=q.id},[r(j,{name:q.icon},null,8,["name"]),e("span",null,$(q.label),1),q.badge?(l(),n("span",On,$(q.badge),1)):o("v-if",true)],10,Tn))),128))]),o(" 右侧内容区 "),e("div",Un,[o(" 基本信息 "),Te(e("div",zn,[h[13]||(h[13]=e("div",{class:"section-header"},[e("h4",null,"基本信息"),e("p",null,"设置渠道的名称、连接器和标签")],-1)),e("div",Pn,[h[7]||(h[7]=e("label",{class:"form-label required"},"渠道名称",-1)),r(re,{modelValue:f.value.name,"onUpdate:modelValue":h[0]||(h[0]=q=>f.value.name=q),placeholder:"如 OpenAI DALL-E"},null,8,["modelValue"]),h[8]||(h[8]=e("div",{class:"form-hint"},"用户可见的渠道名称,冲突时会自动添加后缀",-1))]),e("div",Dn,[e("div",Nn,[h[9]||(h[9]=e("label",{class:"form-label required"},"连接器",-1)),r(de,{modelValue:f.value.connectorId,"onUpdate:modelValue":h[1]||(h[1]=q=>f.value.connectorId=q),placeholder:"选择连接器",onChange:c,style:{width:"100%"}},{default:V(()=>[(l(true),n(D,null,ee(p.value,q=>(l(),se(le,{key:q.id,label:q.name,value:q.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Fn,[h[10]||(h[10]=e("label",{class:"form-label"},"启用状态",-1)),e("div",Ln,[r(pe,{modelValue:f.value.enabled,"onUpdate:modelValue":h[2]||(h[2]=q=>f.value.enabled=q)},null,8,["modelValue"]),e("span",En,$(f.value.enabled?"启用":"禁用"),1)])])]),e("div",An,[h[11]||(h[11]=e("label",{class:"form-label"},"标签",-1)),r(At,{modelValue:f.value.tags,"onUpdate:modelValue":h[3]||(h[3]=q=>f.value.tags=q),placeholder:"输入标签后按回车..."},null,8,["modelValue"]),h[12]||(h[12]=e("div",{class:"form-hint"},"用于分类和筛选渠道",-1))]),o(" 连接器配置(内嵌) "),B.value.length>0?(l(),n(D,{key:0},[e("div",Mn,[e("span",null,$(J.value)+" 配置",1)]),r(et,{fields:B.value,modelValue:f.value.connectorConfig,"onUpdate:modelValue":h[4]||(h[4]=q=>f.value.connectorConfig=q)},null,8,["fields","modelValue"])],64)):o("v-if",true)],512),[[Oe,b.value==="basic"]]),o(" 中间件流程 "),Te(e("div",jn,[h[18]||(h[18]=e("div",{class:"section-header"},[e("h4",null,"中间件流程"),e("p",null,"控制此渠道的中间件启用状态")],-1)),e("div",Rn,[r(j,{name:"info-circle"}),h[14]||(h[14]=e("span",null,"留空表示跟随全局配置",-1))]),e("div",Bn,[(l(),n(D,null,ee(m,(q,ie)=>e("div",{key:q.id,class:"phase-section"},[o(" 阶段标题 "),e("div",{class:te(["phase-header",q.colorClass])},[e("div",qn,[r(j,{name:q.icon},null,8,["name"])]),e("div",Hn,[e("span",Jn,$(q.label),1),e("span",Gn,$(q.description),1)]),e("span",Kn,$(x(q.id).length),1)],2),o(" 中间件列表 "),x(q.id).length>0?(l(),n("div",Wn,[(l(true),n(D,null,ee(x(q.id),H=>(l(),n("div",{key:H.name,class:te(["mw-item",{"has-override":Y(H.configGroup||H.name,H.name)!==void 0}])},[e("div",Zn,[e("div",{class:te(["mw-status",ve(H)])},null,2),e("div",Yn,[e("span",Xn,$(H.displayName),1),e("span",Qn,$(H.description||g[H.category]||H.category),1)]),r(de,{"model-value":Y(H.configGroup||H.name,H.name),"onUpdate:modelValue":_e=>Q(H.configGroup||H.name,H.name,_e),placeholder:H.enabled?"全局: 启用":"全局: 禁用",clearable:"",size:"small",class:"mw-switch"},{default:V(()=>[r(le,{label:"启用",value:true}),r(le,{label:"禁用",value:false})]),_:1},8,["model-value","onUpdate:modelValue","placeholder"])])],2))),128))])):(l(),n(D,{key:1},[o(" 空状态 "),h[15]||(h[15]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),o(" 阶段间连接箭头 "),ie<m.length-1?(l(),n("div",eo,[h[16]||(h[16]=e("div",{class:"connector-line"},null,-1)),e("div",to,[r(j,{name:"chevron-down"})]),h[17]||(h[17]=e("div",{class:"connector-line"},null,-1))])):o("v-if",true)])),64))]),o(" 底部说明 "),h[19]||(h[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),[[Oe,b.value==="middlewares"]]),o(" 插件配置 "),Te(e("div",so,[h[23]||(h[23]=e("div",{class:"section-header"},[e("h4",null,"插件配置覆盖"),e("p",null,"为此渠道单独配置插件参数")],-1)),e("div",lo,[r(j,{name:"info-circle"}),h[20]||(h[20]=e("span",null,"留空使用全局配置,填写后将覆盖全局设置",-1))]),O.value.length>0?(l(),n("div",ao,[(l(true),n(D,null,ee(O.value,q=>(l(),n("div",{key:q.id,class:te(["plugin-override-card",{expanded:C.value.has(q.id)}])},[e("div",{class:"plugin-header",onClick:ie=>y(q.id)},[e("div",oo,[e("span",io,$(q.name),1),W(q.id)?(l(),n("span",ro,"已覆盖")):o("v-if",true)]),e("div",uo,[W(q.id)?(l(),se(M,{key:0,size:"mini",onClick:fe(ie=>z(q.id),["stop"])},{default:V(()=>[...h[21]||(h[21]=[E(" 清除 ",-1)])]),_:1},8,["onClick"])):o("v-if",true),r(j,{name:C.value.has(q.id)?"chevron-up":"chevron-down"},null,8,["name"])])],8,no),Te(e("div",co,[(l(true),n(D,null,ee(q.configFields,ie=>(l(),n(D,{key:ie.key},[d(q,ie)?(l(),n("div",vo,[e("label",po,$(ie.label),1),e("div",mo,[o(" Boolean 类型 "),ie.type==="boolean"?(l(),se(de,{key:0,"model-value":N(q.id,ie.key),"onUpdate:modelValue":H=>P(q.id,ie.key,H),placeholder:"使用全局配置",clearable:""},{default:V(()=>[r(le,{label:"是",value:true}),r(le,{label:"否",value:false})]),_:1},8,["model-value","onUpdate:modelValue"])):ie.type==="select"?(l(),n(D,{key:1},[o(" Select 类型 "),r(de,{"model-value":N(q.id,ie.key),"onUpdate:modelValue":H=>P(q.id,ie.key,H),placeholder:`全局: ${q.config[ie.key]??"未设置"}`,clearable:""},{default:V(()=>[(l(true),n(D,null,ee(ie.options,H=>(l(),se(le,{key:String(H.value),label:H.label,value:H.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder"])],64)):ie.type==="number"?(l(),n(D,{key:2},[o(" Number 类型 "),r(Z,{"model-value":N(q.id,ie.key),"onUpdate:modelValue":H=>P(q.id,ie.key,H),placeholder:`全局: ${q.config[ie.key]??""}`},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(l(),n(D,{key:3},[o(" Text/String 类型 (默认) "),r(re,{"model-value":N(q.id,ie.key),"onUpdate:modelValue":H=>P(q.id,ie.key,H),placeholder:`全局: ${q.config[ie.key]??"未设置"}`,clearable:""},null,8,["model-value","onUpdate:modelValue","placeholder"])],64))]),ie.description?(l(),n("div",fo,$(ie.description),1)):o("v-if",true)])):o("v-if",true)],64))),128))],512),[[Oe,C.value.has(q.id)]])],2))),128))])):(l(),n("div",go,[r(j,{name:"apps"}),h[22]||(h[22]=e("span",null,"暂无可配置的插件",-1))]))],512),[[Oe,b.value==="plugins"]])])])]),_:1},8,["modelValue","title"])}}}),ho=ce(yo,[["__scopeId","data-v-74bfe0c7"]]),bo={key:0},ko=oe({__name:"LoadingState",props:{text:{default:"加载中..."},icon:{default:"sync"},size:{default:"default"}},setup(t){const a=t,s=G(()=>`size-${a.size}`);return(u,i)=>{const v=A("k-icon");return l(),n("div",{class:te(["loading-state",s.value])},[r(v,{name:t.icon,class:"loading-icon"},null,8,["name"]),t.text?(l(),n("span",bo,$(t.text),1)):o("v-if",true)],2)}}}),$o=ce(ko,[["__scopeId","data-v-99cf565d"]]),wo={class:"ml-view-container"},Co={class:"ml-view-header"},Vo={class:"ml-header-left"},xo={class:"ml-header-right"},So={class:"ml-view-content"},Io={class:"ml-grid"},To=["onClick"],Oo={class:"card-header"},Uo={class:"header-main"},zo={class:"channel-name"},Po={class:"header-meta"},Do={class:"connector-badge"},No={key:0,class:"cost-badge"},Fo={class:"card-body"},Lo={key:0,class:"field-list"},Eo={class:"field-label"},Ao={class:"field-value"},Mo={key:1,class:"tags-list"},jo={class:"ml-table-container"},Ro={class:"ml-table"},Bo=["onClick"],qo={class:"col-name"},Ho={class:"name-text"},Jo={class:"col-connector"},Go={class:"connector-badge"},Ko={class:"col-tags"},Wo={class:"tags-wrapper"},Zo={key:0,class:"mini-tag more"},Yo={class:"col-cost"},Xo={key:0,class:"cost-value"},Qo={class:"action-btns"},ei=oe({__name:"ChannelsView",setup(t){const a=["text2img","img2img","NSFW"],s=w(false),u=w("card"),i=w([]),v=w([]),b=w([]),S=w({}),C=w(false),p=w(null),k=w([]),U=G(()=>{const N=new Set;return i.value.forEach(P=>{(P.tags||[]).forEach(W=>N.add(W))}),Array.from(N).sort()}),I=G(()=>k.value.length===0?i.value:i.value.filter(N=>k.value.every(P=>(N.tags||[]).includes(P)))),f=N=>{const P=v.value.find(W=>W.id===N);return P?P.name:N},T=N=>{var W;const P=v.value.find(z=>z.id===N.connectorId);return(W=P==null?void 0:P.cardFields)!=null&&W.length?P.cardFields.map(z=>{const y=P.fields.find(d=>d.key===z.key);return{key:z.key,label:z.label||(y==null?void 0:y.label)||z.key,format:z.format||"text"}}):[]},m=(N,P)=>{var z,y,d,c,L;const W=P.configGroup;switch(P.source){case"channel":if(W){const ne=(y=(z=N.pluginOverrides)==null?void 0:z[W])==null?void 0:y[P.key];if(ne!==void 0)return ne}return N[P.key];case"connectorConfig":return(d=N.connectorConfig)==null?void 0:d[P.key];case"pluginOverride":return W?(L=(c=N.pluginOverrides)==null?void 0:c[W])==null?void 0:L[P.key]:void 0;default:return}},g=(N,P)=>{var d,c,L;const W=P.configGroup;if(!W)return P.suffix||"";const z=(c=(d=N.pluginOverrides)==null?void 0:d[W])==null?void 0:c.currencyLabel;if(z)return` ${z}${P.suffix||""}`;const y=(L=S.value[W])==null?void 0:L.currencyLabel;return y?` ${y}${P.suffix||""}`:` 积分${P.suffix||""}`},B=(N,P,W)=>{if(N==null||N==="")return"-";let z;switch(P){case"password-mask":z="••••••";break;case"boolean":z=N?"是":"否";break;case"number":z=String(N);break;case"size":z=String(N);break;case"currency":z=N===0?"免费":String(N);break;default:z=String(N)}return W?`${z} ${W}`:z},J=async()=>{s.value=true;try{const[N,P,W]=await Promise.all([ze.list(),Be.list(),He.cardFields()]);i.value=N,v.value=P,b.value=W.fields,S.value=W.globalConfigs}catch{X.error("加载数据失败")}finally{s.value=false}},F=()=>{p.value=null,C.value=true},O=N=>{p.value=N,C.value=true},x=()=>{J()},Y=async N=>{if(confirm(`确定要删除渠道 "${N.name}" 吗?`))try{await ze.delete(N.id),X.success("删除成功"),J()}catch{X.error("删除失败")}},Q=async N=>{try{await ze.toggle(N.id,N.enabled)}catch{N.enabled=!N.enabled,X.error("操作失败")}},ve=N=>{const P=JSON.parse(JSON.stringify(N));delete P.id,P.name=`${N.name} (副本)`,p.value=P,C.value=true};return he(()=>{J()}),(N,P)=>{const W=A("k-icon"),z=A("k-button"),y=A("el-switch");return l(),n("div",wo,[e("div",Co,[e("div",Vo,[r(z,{solid:"",type:"primary",onClick:F},{icon:V(()=>[r(W,{name:"add"})]),default:V(()=>[P[7]||(P[7]=E(" 新建渠道 ",-1))]),_:1}),r(dt,{modelValue:k.value,"onUpdate:modelValue":P[0]||(P[0]=d=>k.value=d),"all-tags":U.value,"preset-tags":a},null,8,["modelValue","all-tags"])]),e("div",xo,[r(Et,{modelValue:u.value,"onUpdate:modelValue":P[1]||(P[1]=d=>u.value=d)},null,8,["modelValue"])])]),e("div",So,[s.value?(l(),se($o,{key:0})):u.value==="card"?(l(),n(D,{key:1},[o(" 卡片视图 "),e("div",Io,[(l(true),n(D,null,ee(I.value,d=>(l(),n("div",{key:d.id},[e("div",{class:"ml-card ml-card--clickable",onClick:c=>O(d)},[e("div",Oo,[e("div",Uo,[e("div",zo,$(d.name),1),r(y,{modelValue:d.enabled,"onUpdate:modelValue":c=>d.enabled=c,size:"small",onChange:c=>Q(d),onClick:P[2]||(P[2]=fe(()=>{},["stop"]))},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("div",Po,[e("span",Do,[r(W,{name:"link"}),E(" "+$(f(d.connectorId)),1)]),o(" 中间件字段(如费用)显示在标题旁 "),(l(true),n(D,null,ee(b.value,c=>(l(),n(D,{key:`mw-${c.key}`},[c.key==="cost"?(l(),n("span",No,$(B(m(d,c),c.format,g(d,c))),1)):o("v-if",true)],64))),128))])]),e("div",Fo,[o(" 配置字段列表 "),T(d).length?(l(),n("div",Lo,[(l(true),n(D,null,ee(T(d),c=>(l(),n("div",{key:c.key,class:"field-item"},[e("span",Eo,$(c.label),1),e("span",Ao,$(B(d.connectorConfig[c.key],c.format)),1)]))),128))])):o("v-if",true),o(" 标签 "),d.tags&&d.tags.length?(l(),n("div",Mo,[(l(true),n(D,null,ee(d.tags,c=>(l(),n("span",{key:c,class:"tag-pill"},$(c),1))),128))])):o("v-if",true)]),e("div",{class:"card-footer",onClick:P[3]||(P[3]=fe(()=>{},["stop"]))},[r(z,{size:"mini",class:"ml-btn-outline-primary",onClick:c=>ve(d)},{icon:V(()=>[r(W,{name:"copy"})]),default:V(()=>[P[8]||(P[8]=E(" 复制 ",-1))]),_:1},8,["onClick"]),P[10]||(P[10]=e("div",{class:"spacer"},null,-1)),r(z,{size:"mini",class:"ml-btn-outline-danger",onClick:c=>Y(d)},{icon:V(()=>[r(W,{name:"delete"})]),default:V(()=>[P[9]||(P[9]=E(" 删除 ",-1))]),_:1},8,["onClick"])])],8,To)]))),128))])],2112)):(l(),n(D,{key:2},[o(" 列表视图 "),e("div",jo,[e("table",Ro,[P[13]||(P[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,[(l(true),n(D,null,ee(I.value,d=>(l(),n("tr",{key:d.id,onClick:c=>O(d)},[e("td",qo,[e("span",Ho,$(d.name),1)]),e("td",Jo,[e("span",Go,$(f(d.connectorId)),1)]),e("td",Ko,[e("div",Wo,[(l(true),n(D,null,ee((d.tags||[]).slice(0,2),c=>(l(),n("span",{key:c,class:"mini-tag"},$(c),1))),128)),d.tags&&d.tags.length>2?(l(),n("span",Zo,"+"+$(d.tags.length-2),1)):o("v-if",true)])]),e("td",Yo,[(l(true),n(D,null,ee(b.value,c=>(l(),n(D,{key:`mw-${c.key}`},[c.key==="cost"?(l(),n("span",Xo,$(B(m(d,c),c.format,g(d,c))),1)):o("v-if",true)],64))),128))]),e("td",{class:"col-status",onClick:P[4]||(P[4]=fe(()=>{},["stop"]))},[r(y,{modelValue:d.enabled,"onUpdate:modelValue":c=>d.enabled=c,size:"small",onChange:c=>Q(d)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:P[5]||(P[5]=fe(()=>{},["stop"]))},[e("div",Qo,[r(z,{size:"mini",class:"ml-btn-outline-primary",onClick:c=>ve(d)},{icon:V(()=>[r(W,{name:"copy"})]),default:V(()=>[P[11]||(P[11]=E(" 复制 ",-1))]),_:1},8,["onClick"]),r(z,{size:"mini",class:"ml-btn-outline-danger",onClick:c=>Y(d)},{icon:V(()=>[r(W,{name:"delete"})]),default:V(()=>[P[12]||(P[12]=E(" 删除 ",-1))]),_:1},8,["onClick"])])])],8,Bo))),128))])])])],2112))]),o(" 编辑/创建对话框 "),r(ho,{modelValue:C.value,"onUpdate:modelValue":P[6]||(P[6]=d=>C.value=d),channel:p.value,onSaved:x},null,8,["modelValue","channel"])])}}}),ti=ce(ei,[["__scopeId","data-v-67a4b49d"]]),si={class:"json-editor"},li={key:0,class:"error-msg"},ai=oe({__name:"JsonEditor",props:{modelValue:{},rows:{}},emits:["update:modelValue"],setup(t,{emit:a}){const s=t,u=a,i=w(""),v=w("");ye(()=>s.modelValue,S=>{try{i.value=JSON.stringify(S,null,2)}catch{i.value=""}},{immediate:true});const b=()=>{try{const S=JSON.parse(i.value);v.value="",u("update:modelValue",S)}catch{v.value="Invalid JSON format"}};return(S,C)=>{const p=A("el-input");return l(),n("div",si,[r(p,{modelValue:i.value,"onUpdate:modelValue":C[0]||(C[0]=k=>i.value=k),type:"textarea",rows:t.rows,class:"code-input",onBlur:b},null,8,["modelValue","rows"]),v.value?(l(),n("div",li,$(v.value),1)):o("v-if",true)])}}}),ni=ce(ai,[["__scopeId","data-v-4d47b7db"]]),oi={class:"image-upload"},ii={key:0,class:"image-list"},ri={class:"image-preview"},di=["src","alt"],ui={class:"image-overlay"},ci={class:"image-name"},vi={class:"upload-content"},pi={key:1,class:"upload-loading"},mi=oe({__name:"ImageUpload",props:{modelValue:{},maxCount:{}},emits:["update:modelValue"],setup(t,{emit:a}){const s=t,u=a,i=w(),v=w(false),b=w([]),S=async()=>{var m;const T=[];for(const g of s.modelValue)g&&T.push({url:g,filename:((m=g.split("/").pop())==null?void 0:m.split("?")[0])||"image",mime:"image/png",previewUrl:g});b.value=T};ye(()=>s.modelValue,()=>{S()},{immediate:true});const C=()=>{var T;(T=i.value)==null||T.click()},p=async T=>{const m=T.target;!m.files||m.files.length===0||(await U(Array.from(m.files)),m.value="")},k=async T=>{var g;const m=(g=T.dataTransfer)==null?void 0:g.files;!m||m.length===0||await U(Array.from(m).filter(B=>B.type.startsWith("image/")))},U=async T=>{if(T.length===0)return;const m=s.maxCount||10;b.value.length+T.length>m&&(X.warning(`最多上传 ${m} 张图片`),T=T.slice(0,m-b.value.length)),v.value=true;try{for(const g of T){const B=await I(g),J=await bs.upload(B,g.type,g.name);if(!J.url){X.error("缓存服务未配置 selfUrl,无法获取图片 URL");continue}b.value.push({url:J.url,filename:J.filename,mime:J.mime,previewUrl:J.url})}u("update:modelValue",b.value.map(g=>g.url))}catch(g){X.error("上传失败"),console.error(g)}finally{v.value=false}},I=T=>new Promise((m,g)=>{const B=new FileReader;B.onload=()=>{const F=B.result.split(",")[1];m(F)},B.onerror=g,B.readAsDataURL(T)}),f=T=>{b.value.splice(T,1),u("update:modelValue",b.value.map(m=>m.url))};return he(()=>{S()}),(T,m)=>{const g=A("k-icon"),B=A("k-button");return l(),n("div",oi,[o(" 已上传的图片列表 "),b.value.length>0?(l(),n("div",ii,[(l(true),n(D,null,ee(b.value,(J,F)=>(l(),n("div",{key:J.url||F,class:"image-item"},[e("div",ri,[e("img",{src:J.previewUrl,alt:J.filename},null,8,di),e("div",ui,[r(B,{size:"mini",class:"remove-btn",onClick:O=>f(F)},{icon:V(()=>[r(g,{name:"delete"})]),_:1},8,["onClick"])])]),e("div",ci,$(J.filename),1)]))),128))])):o("v-if",true),o(" 上传按钮 "),e("div",{class:"upload-area",onClick:C,onDragover:m[0]||(m[0]=fe(()=>{},["prevent"])),onDrop:fe(k,["prevent"])},[e("input",{ref_key:"fileInput",ref:i,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:p},null,544),e("div",vi,[r(g,{name:"add",class:"upload-icon"}),m[1]||(m[1]=e("span",{class:"upload-text"},"点击或拖拽上传图片",-1))])],32),o(" 加载状态 "),v.value?(l(),n("div",pi,[r(g,{name:"sync",class:"loading-icon"}),m[2]||(m[2]=E(" 上传中... ",-1))])):o("v-if",true)])}}}),zt=ce(mi,[["__scopeId","data-v-47f2485e"]]),fi={class:"ml-view-container"},gi={class:"ml-view-header"},_i={class:"ml-header-left"},yi={class:"ml-header-right"},hi={class:"ml-view-content"},bi={key:0,class:"loading-state"},ki={class:"ml-masonry"},$i=["onClick"],wi={key:0,class:"card-thumbnail"},Ci=["src","alt"],Vi={class:"thumbnail-overlay"},xi={key:0,class:"ref-count"},Si={key:1,class:"card-thumbnail placeholder"},Ii={class:"card-content"},Ti={class:"card-title"},Oi={key:0,class:"card-tags"},Ui={key:0,class:"mini-tag more"},zi={class:"ml-table-container"},Pi={class:"ml-table"},Di=["onClick"],Ni={class:"col-thumb"},Fi={class:"thumb-wrapper"},Li=["src","alt"],Ei={key:1,class:"thumb-placeholder"},Ai={class:"col-name"},Mi={class:"name-text"},ji={class:"col-template"},Ri={class:"template-preview"},Bi={class:"col-refs"},qi={key:0,class:"ref-badge"},Hi={key:1,class:"no-data"},Ji={class:"col-source"},Gi={class:"action-btns"},Ki={class:"dialog-footer"},Wi=oe({__name:"PresetsView",setup(t){const a=["本地","远程","text2img","img2img","NSFW"],s=w(false),u=w([]),i=w(false),v=w(false),b=w([]),S=w("card"),C=G(()=>{const O=new Set;return u.value.forEach(x=>{(x.tags||[]).forEach(Y=>O.add(Y))}),Array.from(O).sort()}),p=w({name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"}),k=w([]);ye(()=>p.value.thumbnail,O=>{k.value=O?[O]:[]},{immediate:true}),ye(k,O=>{p.value.thumbnail=O.length>0?O[0]:""});const U=G(()=>b.value.length===0?u.value:u.value.filter(O=>b.value.every(x=>x==="本地"?O.source==="user":x==="远程"?O.source==="api":(O.tags||[]).includes(x)))),I=async()=>{s.value=true;try{u.value=await Ie.list()}catch{X.error("加载数据失败")}finally{s.value=false}},f=()=>{v.value=false,p.value={name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"},i.value=true},T=O=>{v.value=true,p.value=JSON.parse(JSON.stringify(O)),i.value=true},m=O=>{v.value=false;const x=JSON.parse(JSON.stringify(O));delete x.id,x.name=`${O.name} (副本)`,x.source="user",p.value=x,i.value=true},g=async O=>{try{await Ie.toggle(O.id,O.enabled)}catch{O.enabled=!O.enabled,X.error("操作失败")}},B=(O,x=50)=>{if(!O)return"-";const Y=O.replace(/\s+/g," ").trim();return Y.length<=x?Y:Y.slice(0,x)+"..."},J=async()=>{if(!p.value.name||!p.value.promptTemplate){X.warning("请填写必要信息");return}try{v.value&&p.value.id?(await Ie.update(p.value.id,p.value),X.success("更新成功")):(await Ie.create(p.value),X.success("创建成功")),i.value=false,I()}catch{X.error("操作失败")}},F=async O=>{if(confirm(`确定要删除预设 "${O.name}" 吗?`))try{await Ie.delete(O.id),X.success("删除成功"),I()}catch{X.error("删除失败")}};return he(()=>{I()}),(O,x)=>{const Y=A("k-icon"),Q=A("k-button"),ve=A("el-switch"),N=A("el-input"),P=A("el-form-item"),W=A("el-divider"),z=A("el-form"),y=A("el-dialog");return l(),n("div",fi,[e("div",gi,[e("div",_i,[r(Q,{solid:"",type:"primary",onClick:f},{icon:V(()=>[r(Y,{name:"add"})]),default:V(()=>[x[14]||(x[14]=E(" 新建预设 ",-1))]),_:1}),r(dt,{modelValue:b.value,"onUpdate:modelValue":x[0]||(x[0]=d=>b.value=d),"all-tags":C.value,"preset-tags":a},null,8,["modelValue","all-tags"])]),e("div",yi,[r(Et,{modelValue:S.value,"onUpdate:modelValue":x[1]||(x[1]=d=>S.value=d)},null,8,["modelValue"])])]),e("div",hi,[s.value?(l(),n("div",bi,[r(Y,{name:"sync",class:"ml-spin"}),x[15]||(x[15]=E(" 加载中... ",-1))])):S.value==="card"?(l(),n(D,{key:1},[o(" 卡片视图 (瀑布流) "),e("div",ki,[(l(true),n(D,null,ee(U.value,d=>{var c,L;return l(),n("div",{key:d.id,class:"ml-masonry-item"},[e("div",{class:"preset-card",onClick:ne=>T(d)},[o(" 缩略图 "),d.thumbnail?(l(),n("div",wi,[e("img",{src:d.thumbnail,alt:d.name,loading:"lazy"},null,8,Ci),e("div",Vi,[(c=d.referenceImages)!=null&&c.length?(l(),n("span",xi,[r(Y,{name:"image"}),E(" "+$(d.referenceImages.length),1)])):o("v-if",true)])])):(l(),n("div",Si,[r(Y,{name:"image",class:"placeholder-icon"})])),o(" 内容 "),e("div",Ii,[e("div",Ti,$(d.name),1),(L=d.tags)!=null&&L.length?(l(),n("div",Oi,[(l(true),n(D,null,ee(d.tags.slice(0,4),ne=>(l(),n("span",{key:ne,class:"mini-tag"},$(ne),1))),128)),d.tags.length>4?(l(),n("span",Ui,"+"+$(d.tags.length-4),1)):o("v-if",true)])):o("v-if",true)]),o(" 操作按钮 "),e("div",{class:"card-actions",onClick:x[2]||(x[2]=fe(()=>{},["stop"]))},[r(ve,{modelValue:d.enabled,"onUpdate:modelValue":ne=>d.enabled=ne,size:"small",onChange:ne=>g(d)},null,8,["modelValue","onUpdate:modelValue","onChange"]),r(Q,{size:"mini",class:"ml-btn-outline-primary",onClick:ne=>m(d)},{icon:V(()=>[r(Y,{name:"copy"})]),default:V(()=>[x[16]||(x[16]=E(" 复制 ",-1))]),_:1},8,["onClick"]),d.source==="user"?(l(),se(Q,{key:0,size:"mini",class:"ml-btn-outline-danger",onClick:ne=>F(d)},{icon:V(()=>[r(Y,{name:"delete"})]),default:V(()=>[x[17]||(x[17]=E(" 删除 ",-1))]),_:1},8,["onClick"])):o("v-if",true)]),o(" 来源标记 "),e("div",{class:te(["source-indicator",d.source])},$(d.source==="api"?"远程":"本地"),3)],8,$i)])}),128))])],2112)):(l(),n(D,{key:2},[o(" 列表视图 "),e("div",zi,[e("table",Pi,[x[20]||(x[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,[(l(true),n(D,null,ee(U.value,d=>{var c;return l(),n("tr",{key:d.id,onClick:L=>T(d)},[e("td",Ni,[e("div",Fi,[d.thumbnail?(l(),n("img",{key:0,src:d.thumbnail,alt:d.name},null,8,Li)):(l(),n("div",Ei,[r(Y,{name:"image"})]))])]),e("td",Ai,[e("span",Mi,$(d.name),1)]),e("td",ji,[e("span",Ri,$(B(d.promptTemplate)),1)]),e("td",Bi,[(c=d.referenceImages)!=null&&c.length?(l(),n("span",qi,[r(Y,{name:"image"}),E(" "+$(d.referenceImages.length),1)])):(l(),n("span",Hi,"-"))]),e("td",Ji,[e("span",{class:te(["source-badge",d.source])},$(d.source==="api"?"远程":"本地"),3)]),e("td",{class:"col-status",onClick:x[3]||(x[3]=fe(()=>{},["stop"]))},[r(ve,{modelValue:d.enabled,"onUpdate:modelValue":L=>d.enabled=L,size:"small",onChange:L=>g(d)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:x[4]||(x[4]=fe(()=>{},["stop"]))},[e("div",Gi,[r(Q,{size:"mini",class:"ml-btn-outline-primary",onClick:L=>m(d)},{icon:V(()=>[r(Y,{name:"copy"})]),default:V(()=>[x[18]||(x[18]=E(" 复制 ",-1))]),_:1},8,["onClick"]),d.source==="user"?(l(),se(Q,{key:0,size:"mini",class:"ml-btn-outline-danger",onClick:L=>F(d)},{icon:V(()=>[r(Y,{name:"delete"})]),default:V(()=>[x[19]||(x[19]=E(" 删除 ",-1))]),_:1},8,["onClick"])):o("v-if",true)])])],8,Di)}),128))])])])],2112))]),o(" 编辑/创建对话框 "),r(y,{modelValue:i.value,"onUpdate:modelValue":x[13]||(x[13]=d=>i.value=d),title:v.value?"编辑预设":"创建预设",width:"600px","close-on-click-modal":false},{footer:V(()=>[e("span",Ki,[r(Q,{onClick:x[12]||(x[12]=d=>i.value=false)},{default:V(()=>[...x[27]||(x[27]=[E("取消",-1)])]),_:1}),r(Q,{type:"primary",onClick:J},{default:V(()=>[...x[28]||(x[28]=[E("保存",-1)])]),_:1})])]),default:V(()=>[i.value?(l(),se(z,{key:0,ref:"formRef",model:p.value,"label-width":"100px"},{default:V(()=>[r(P,{label:"名称",required:""},{default:V(()=>[r(N,{modelValue:p.value.name,"onUpdate:modelValue":x[5]||(x[5]=d=>p.value.name=d),disabled:v.value&&p.value.source==="api",placeholder:"如 二次元少女"},null,8,["modelValue","disabled"]),x[21]||(x[21]=e("div",{class:"form-tip"},"用于指令调用和展示,冲突时会自动添加后缀",-1))]),_:1}),r(P,{label:"Prompt 模板",required:""},{default:V(()=>[r(N,{modelValue:p.value.promptTemplate,"onUpdate:modelValue":x[6]||(x[6]=d=>p.value.promptTemplate=d),type:"textarea",rows:4,placeholder:"输入提示词模板,支持变量如 {prompt}"},null,8,["modelValue"]),x[22]||(x[22]=e("div",{class:"form-tip"},"默认将用户输入附加在最后,也可使用 {prompt} 指定位置",-1))]),_:1}),p.value.source==="user"?(l(),se(P,{key:0,label:"缩略图"},{default:V(()=>[r(zt,{modelValue:k.value,"onUpdate:modelValue":x[7]||(x[7]=d=>k.value=d),"max-count":1},null,8,["modelValue"]),x[23]||(x[23]=e("div",{class:"form-tip"},"用于在卡片视图中展示预设的预览图",-1))]),_:1})):o("v-if",true),r(P,{label:"参考图"},{default:V(()=>[r(zt,{modelValue:p.value.referenceImages,"onUpdate:modelValue":x[8]||(x[8]=d=>p.value.referenceImages=d),"max-count":5},null,8,["modelValue"]),x[24]||(x[24]=e("div",{class:"form-tip"},"生成时会自动附加这些参考图片",-1))]),_:1}),r(W,{"content-position":"left"},{default:V(()=>[...x[25]||(x[25]=[E("高级设置",-1)])]),_:1}),r(P,{label:"标签"},{default:V(()=>[r(At,{modelValue:p.value.tags,"onUpdate:modelValue":x[9]||(x[9]=d=>p.value.tags=d),placeholder:"输入标签..."},null,8,["modelValue"]),x[26]||(x[26]=e("div",{class:"form-tip"},"与渠道标签匹配时会自动关联",-1))]),_:1}),r(P,{label:"参数覆盖"},{default:V(()=>[r(ni,{modelValue:p.value.parameterOverrides,"onUpdate:modelValue":x[10]||(x[10]=d=>p.value.parameterOverrides=d),rows:3},null,8,["modelValue"])]),_:1}),r(P,{label:"启用状态"},{default:V(()=>[r(ve,{modelValue:p.value.enabled,"onUpdate:modelValue":x[11]||(x[11]=d=>p.value.enabled=d)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])):o("v-if",true)]),_:1},8,["modelValue","title"])])}}}),Zi=ce(Wi,[["__scopeId","data-v-8eaa50b4"]]),Yi=oe({__name:"StatusBadge",props:{status:{}},setup(t){const a=t,s=G(()=>{switch(a.status){case"pending":return"等待中";case"processing":return"处理中";case"success":return"成功";case"failed":return"失败";default:return a.status}});return(u,i)=>(l(),n("span",{class:te(["status-badge",t.status])},$(s.value),3))}}),Pt=ce(Yi,[["__scopeId","data-v-0bc21896"]]),Xi={class:"lightbox-container"},Qi={class:"lightbox-content"},er=["src"],tr={key:2,class:"image-counter"},sr={key:0,class:"lightbox-sidebar"},lr={class:"sidebar-header"},ar={class:"sidebar-body"},nr={class:"info-block"},or={class:"block-header"},ir={key:0,class:"info-block"},rr={class:"info-value"},dr={key:1,class:"info-block"},ur={class:"info-value"},cr={class:"sidebar-footer"},vr=oe({__name:"ImageLightbox",props:{visible:{type:Boolean},images:{},initialIndex:{default:0},prompt:{},createdAt:{},duration:{},showSidebar:{type:Boolean,default:true}},emits:["update:visible","close"],setup(t,{emit:a}){const s=t,u=a,i=w(s.initialIndex),v=G(()=>s.images[i.value]||"");ye(()=>s.visible,m=>{m?(i.value=s.initialIndex,document.body.style.overflow="hidden"):document.body.style.overflow=""}),ye(()=>s.initialIndex,m=>{i.value=m});const b=()=>{u("update:visible",false),u("close")},S=()=>{i.value=(i.value-1+s.images.length)%s.images.length},C=()=>{i.value=(i.value+1)%s.images.length},p=()=>{s.prompt&&(navigator.clipboard.writeText(s.prompt),X.success("已复制提示词"))},k=()=>{window.open(v.value,"_blank")},U=()=>{const m=document.createElement("a");m.href=v.value,m.download=`image-${Date.now()}.png`,m.click()},I=m=>(typeof m=="string"?new Date(m):m).toLocaleString(),f=m=>m<1e3?`${m}ms`:`${(m/1e3).toFixed(1)}s`,T=m=>{s.visible&&(m.key==="Escape"?b():m.key==="ArrowLeft"?S():m.key==="ArrowRight"&&C())};return he(()=>{window.addEventListener("keydown",T)}),Ye(()=>{window.removeEventListener("keydown",T),document.body.style.overflow=""}),(m,g)=>{const B=A("k-icon");return l(),se(us,{to:"body"},[r(Ze,{name:"lightbox-fade"},{default:V(()=>[t.visible?(l(),n("div",{key:0,class:"lightbox-overlay",onClick:fe(b,["self"])},[e("div",Xi,[e("div",Qi,[o(" 左侧图片区域 "),e("div",{class:"lightbox-image-area",onClick:fe(b,["self"])},[o(" 关闭按钮 "),e("button",{class:"close-btn",onClick:b,title:"关闭 (Esc)"},[r(B,{name:"times"})]),o(" 多图时的导航 "),t.images.length>1?(l(),n("button",{key:0,class:"nav-btn prev",onClick:fe(S,["stop"]),title:"上一张"},[r(B,{name:"chevron-left"})])):o("v-if",true),e("img",{src:v.value,class:"lightbox-image",alt:"Preview"},null,8,er),t.images.length>1?(l(),n("button",{key:1,class:"nav-btn next",onClick:fe(C,["stop"]),title:"下一张"},[r(B,{name:"chevron-right"})])):o("v-if",true),o(" 图片计数器 "),t.images.length>1?(l(),n("div",tr,$(i.value+1)+" / "+$(t.images.length),1)):o("v-if",true)]),o(" 右侧信息栏 "),t.showSidebar?(l(),n("div",sr,[e("div",lr,[g[0]||(g[0]=e("div",{class:"info-title"},"图片详情",-1)),e("button",{class:"header-close-btn",onClick:b,title:"关闭"},[r(B,{name:"times"})])]),e("div",ar,[o(" 提示词 "),e("div",nr,[e("div",or,[g[1]||(g[1]=e("span",null,"提示词",-1)),t.prompt?(l(),n("button",{key:0,class:"copy-btn",onClick:p}," 复制 ")):o("v-if",true)]),e("div",{class:te(["prompt-content",{empty:!t.prompt}])},$(t.prompt||"无提示词"),3)]),o(" 创建时间 "),t.createdAt?(l(),n("div",ir,[g[2]||(g[2]=e("div",{class:"block-header"},[e("span",null,"创建时间")],-1)),e("div",rr,$(I(t.createdAt)),1)])):o("v-if",true),o(" 生成耗时 "),t.duration?(l(),n("div",dr,[g[3]||(g[3]=e("div",{class:"block-header"},[e("span",null,"生成耗时")],-1)),e("div",ur,$(f(t.duration)),1)])):o("v-if",true)]),e("div",cr,[e("button",{class:"action-btn primary",onClick:k},[r(B,{name:"external-link"}),g[4]||(g[4]=E(" 查看原图 ",-1))]),e("button",{class:"action-btn secondary",onClick:U},[r(B,{name:"download"}),g[5]||(g[5]=E(" 下载 ",-1))])])])):o("v-if",true)])])])):o("v-if",true)]),_:1})])}}}),gt=ce(vr,[["__scopeId","data-v-bd68872f"]]),pr={class:"ml-view-container"},mr={class:"ml-view-header"},fr={class:"ml-header-left"},gr={class:"view-mode-switch"},_r={class:"ml-header-right"},yr={key:0,class:"stats-grid"},hr={class:"stat-card"},br={class:"stat-icon total"},kr={class:"stat-content"},$r={class:"stat-value"},wr={class:"stat-card"},Cr={class:"stat-icon success"},Vr={class:"stat-content"},xr={class:"stat-value success"},Sr={class:"stat-card"},Ir={class:"stat-icon failed"},Tr={class:"stat-content"},Or={class:"stat-value failed"},Ur={class:"stat-card"},zr={class:"stat-icon processing"},Pr={class:"stat-content"},Dr={class:"stat-value pending"},Nr={class:"stat-card"},Fr={class:"stat-icon rate"},Lr={class:"stat-content"},Er={class:"stat-value"},Ar={class:"filter-bar"},Mr={class:"filter-group"},jr={key:0,class:"pagination-info"},Rr={class:"ml-view-content"},Br={class:"mono-text"},qr=["title"],Hr={key:0},Jr={key:1,class:"text-muted"},Gr={key:0},Kr={key:1},Wr={class:"time-text"},Zr={key:0,class:"empty-gallery"},Yr={key:1,class:"ml-masonry"},Xr=["onClick"],Qr={class:"gallery-image-wrapper"},ed=["src"],td=["src"],sd={class:"gallery-overlay"},ld={class:"gallery-info"},ad=["title"],nd={class:"gallery-meta"},od={class:"gallery-time"},id={class:"pagination"},rd={key:0,class:"task-detail"},dd={class:"detail-section"},ud={class:"detail-grid"},cd={class:"detail-item"},vd={class:"detail-item"},pd={class:"detail-item"},md={class:"detail-item"},fd={class:"detail-item"},gd={class:"detail-item"},_d={class:"detail-section"},yd={class:"code-block"},hd={key:0,class:"detail-section"},bd={class:"output-gallery"},kd=["src"],$d=["src"],wd=["src"],Cd={key:3,class:"text-asset"},Vd=["href"],xd={key:1,class:"detail-section"},Sd={class:"code-block error"},Id={class:"cleanup-form"},Td={class:"dialog-footer"},Od=oe({__name:"TasksView",setup(t){const a=w("list"),s=w(false),u=w([]),i=w(null),v=w(0),b=w(1),S=w(20),C=w({status:"",userId:void 0,channelId:void 0}),p=w(false),k=w(null);w(false);const U=w(null),I=w(false),f=w([]),T=w(0),m=w(""),g=w(),B=w(),J=w(false),F=w(30),O=d=>{var c,L,ne;return((L=(c=d.middlewareLogs)==null?void 0:c.preset)==null?void 0:L.transformedPrompt)||((ne=d.requestSnapshot)==null?void 0:ne.prompt)||""},x=G(()=>{var c,L,ne;const d=[];for(const K of u.value){if(K.status!=="success"||!K.responseSnapshot)continue;const _=((L=(c=K.middlewareLogs)==null?void 0:c.preset)==null?void 0:L.transformedPrompt)||((ne=K.requestSnapshot)==null?void 0:ne.prompt)||"";K.responseSnapshot.forEach((h,j)=>{(h.kind==="image"||h.kind==="video")&&h.url&&d.push({id:K.id,assetIndex:j,kind:h.kind,url:h.url,prompt:_,channelId:K.channelId,createdAt:K.startTime})})}return d}),Y=async()=>{s.value=true;try{const d={limit:S.value,offset:(b.value-1)*S.value};C.value.status&&(d.status=C.value.status),C.value.userId&&(d.userId=Number(C.value.userId)),C.value.channelId&&(d.channelId=Number(C.value.channelId));const[c,L]=await Promise.all([Pe.list(d),Pe.stats()]);u.value=c.items,v.value=c.total,i.value=L}catch(d){console.error("Failed to fetch tasks:",d),X.error("加载数据失败")}finally{s.value=false}},Q=d=>{k.value=d,p.value=true},ve=d=>{f.value=[d.url],T.value=0,m.value=d.prompt,g.value=d.createdAt,B.value=void 0,I.value=true,U.value=d},N=()=>{J.value=true},P=async()=>{try{const d=await Pe.cleanup(F.value);X.success(`成功清理 ${d.deleted} 条任务`),J.value=false,Y()}catch{X.error("清理失败")}},W=d=>new Date(d).toLocaleString(),z=d=>d<1e3?`${d}ms`:`${(d/1e3).toFixed(2)}s`,y=d=>{const c=d.target;c.style.display="none"};return he(()=>{Y()}),(d,c)=>{const L=A("k-icon"),ne=A("k-button"),K=A("el-option"),_=A("el-select"),h=A("el-input"),j=A("el-table-column"),re=A("el-table"),le=A("el-pagination"),de=A("el-dialog"),pe=A("el-input-number");return l(),n("div",pr,[o(" 固定头部区域 "),e("div",mr,[e("div",fr,[o(" 视图切换 "),e("div",gr,[e("button",{class:te(["mode-btn",{active:a.value==="list"}]),onClick:c[0]||(c[0]=M=>a.value="list"),title:"列表视图"},[...c[14]||(c[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:te(["mode-btn",{active:a.value==="gallery"}]),onClick:c[1]||(c[1]=M=>a.value="gallery"),title:"画廊视图"},[...c[15]||(c[15]=[it('<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",_r,[r(ne,{onClick:N},{icon:V(()=>[r(L,{name:"delete"})]),default:V(()=>[c[16]||(c[16]=E(" 清理记录 ",-1))]),_:1}),r(ne,{onClick:Y},{icon:V(()=>[r(L,{name:"refresh"})]),default:V(()=>[c[17]||(c[17]=E(" 刷新 ",-1))]),_:1})])]),o(" 统计信息 (固定) "),i.value?(l(),n("div",yr,[e("div",hr,[e("div",br,[r(L,{name:"clipboard-list"})]),e("div",kr,[e("div",$r,$(i.value.total),1),c[18]||(c[18]=e("div",{class:"stat-label"},"总任务数",-1))])]),e("div",wr,[e("div",Cr,[r(L,{name:"check-circle"})]),e("div",Vr,[e("div",xr,$(i.value.byStatus.success),1),c[19]||(c[19]=e("div",{class:"stat-label"},"成功",-1))])]),e("div",Sr,[e("div",Ir,[r(L,{name:"exclamation-triangle"})]),e("div",Tr,[e("div",Or,$(i.value.byStatus.failed),1),c[20]||(c[20]=e("div",{class:"stat-label"},"失败",-1))])]),e("div",Ur,[e("div",zr,[r(L,{name:"clock"})]),e("div",Pr,[e("div",Dr,$(i.value.byStatus.pending+i.value.byStatus.processing),1),c[21]||(c[21]=e("div",{class:"stat-label"},"进行中",-1))])]),e("div",Nr,[e("div",Fr,[r(L,{name:"chart-pie"})]),e("div",Lr,[e("div",Er,$(i.value.successRate),1),c[22]||(c[22]=e("div",{class:"stat-label"},"成功率",-1))])])])):o("v-if",true),o(" 筛选栏 (固定) "),e("div",Ar,[e("div",Mr,[r(_,{modelValue:C.value.status,"onUpdate:modelValue":c[2]||(c[2]=M=>C.value.status=M),placeholder:"所有状态",clearable:"",onChange:Y,style:{width:"140px"}},{default:V(()=>[r(K,{label:"等待中",value:"pending"}),r(K,{label:"处理中",value:"processing"}),r(K,{label:"成功",value:"success"}),r(K,{label:"失败",value:"failed"})]),_:1},8,["modelValue"]),r(h,{modelValue:C.value.channelId,"onUpdate:modelValue":c[3]||(c[3]=M=>C.value.channelId=M),placeholder:"渠道 ID",clearable:"",onChange:Y,style:{width:"140px"}},null,8,["modelValue"]),r(h,{modelValue:C.value.userId,"onUpdate:modelValue":c[4]||(c[4]=M=>C.value.userId=M),placeholder:"用户 ID",clearable:"",onChange:Y,style:{width:"140px"}},null,8,["modelValue"])]),v.value>0?(l(),n("div",jr," 共 "+$(v.value)+" 条记录 ",1)):o("v-if",true)]),o(" 可滚动的内容区域 "),e("div",Rr,[o(" 列表视图 "),a.value==="list"?(l(),se(re,{key:0,data:u.value,style:{width:"100%"},class:"task-table",onRowClick:Q},{default:V(()=>[r(j,{prop:"id",label:"ID",width:"80",align:"center"},{default:V(({row:M})=>[e("span",Br,"#"+$(M.id),1)]),_:1}),r(j,{label:"状态",width:"100",align:"center"},{default:V(({row:M})=>[r(Pt,{status:M.status},null,8,["status"])]),_:1}),r(j,{prop:"channelId",label:"渠道",width:"100",align:"center"}),r(j,{label:"提示词","min-width":"300"},{default:V(({row:M})=>[e("div",{class:"prompt-cell",title:O(M)},$(O(M)),9,qr)]),_:1}),r(j,{label:"输出",width:"120",align:"center"},{default:V(({row:M})=>[M.responseSnapshot&&M.responseSnapshot.length?(l(),n("span",Hr,$(M.responseSnapshot.length)+" 个资产 ",1)):(l(),n("span",Jr,"-"))]),_:1}),r(j,{label:"耗时",width:"100",align:"right"},{default:V(({row:M})=>[M.duration?(l(),n("span",Gr,$(z(M.duration)),1)):(l(),n("span",Kr,"-"))]),_:1}),r(j,{label:"时间",width:"180",align:"right"},{default:V(({row:M})=>[e("span",Wr,$(W(M.startTime)),1)]),_:1})]),_:1},8,["data"])):a.value==="gallery"?(l(),n(D,{key:1},[o(" 画廊视图 (瀑布流) "),x.value.length===0?(l(),n("div",Zr,[r(L,{name:"image",class:"empty-icon"}),c[23]||(c[23]=e("p",null,"暂无成功生成的图片",-1))])):(l(),n("div",Yr,[(l(true),n(D,null,ee(x.value,M=>(l(),n("div",{key:M.id+"-"+M.assetIndex,class:"ml-masonry-item"},[e("div",{class:"gallery-item",onClick:Z=>ve(M)},[e("div",Qr,[M.kind==="image"?(l(),n("img",{key:0,src:M.url,class:"gallery-image",loading:"lazy",onError:y},null,40,ed)):M.kind==="video"?(l(),n("video",{key:1,src:M.url,class:"gallery-video",muted:"",loop:"",onMouseenter:c[5]||(c[5]=Z=>Z.target.play()),onMouseleave:c[6]||(c[6]=Z=>Z.target.pause())},null,40,td)):o("v-if",true),e("div",sd,[r(L,{name:"zoom-in",class:"zoom-icon"})])]),e("div",ld,[e("div",{class:"gallery-prompt",title:M.prompt},$(M.prompt),9,ad),e("div",nd,[e("span",od,$(W(M.createdAt)),1)])])],8,Xr)]))),128))]))],64)):o("v-if",true)]),o(" 分页 (固定在底部) "),e("div",id,[r(le,{"current-page":b.value,"onUpdate:currentPage":c[7]||(c[7]=M=>b.value=M),"page-size":S.value,"onUpdate:pageSize":c[8]||(c[8]=M=>S.value=M),total:v.value,"page-sizes":[20,50,100],layout:"total, sizes, prev, pager, next",onCurrentChange:Y,onSizeChange:Y},null,8,["current-page","page-size","total"])]),o(" 任务详情对话框 "),r(de,{modelValue:p.value,"onUpdate:modelValue":c[9]||(c[9]=M=>p.value=M),title:"任务详情",width:"800px"},{default:V(()=>{var M,Z;return[k.value?(l(),n("div",rd,[e("div",dd,[c[31]||(c[31]=e("h3",null,"基本信息",-1)),e("div",ud,[e("div",cd,[c[24]||(c[24]=e("span",{class:"label"},"ID:",-1)),E(" "+$(k.value.id),1)]),e("div",vd,[c[25]||(c[25]=e("span",{class:"label"},"状态:",-1)),c[26]||(c[26]=E()),r(Pt,{status:k.value.status},null,8,["status"])]),e("div",pd,[c[27]||(c[27]=e("span",{class:"label"},"渠道 ID:",-1)),E(" "+$(k.value.channelId),1)]),e("div",md,[c[28]||(c[28]=e("span",{class:"label"},"用户 ID:",-1)),E(" "+$(k.value.userId||"N/A"),1)]),e("div",fd,[c[29]||(c[29]=e("span",{class:"label"},"创建时间:",-1)),E(" "+$(W(k.value.startTime)),1)]),e("div",gd,[c[30]||(c[30]=e("span",{class:"label"},"耗时:",-1)),E(" "+$(z(k.value.duration||0)),1)])])]),e("div",_d,[c[32]||(c[32]=e("h3",null,"Prompt",-1)),e("div",yd,$(O(k.value)),1)]),k.value.responseSnapshot&&k.value.responseSnapshot.length>0?(l(),n("div",hd,[e("h3",null,"生成结果 ("+$(k.value.responseSnapshot.length)+" 个资产)",1),e("div",bd,[(l(true),n(D,null,ee(k.value.responseSnapshot,(ue,q)=>{var ie;return l(),n("div",{key:q,class:"output-item"},[ue.kind==="image"&&ue.url?(l(),n("img",{key:0,src:ue.url,class:"output-image"},null,8,kd)):ue.kind==="video"&&ue.url?(l(),n("video",{key:1,src:ue.url,class:"output-image",controls:""},null,8,$d)):ue.kind==="audio"&&ue.url?(l(),n("audio",{key:2,src:ue.url,controls:"",style:{width:"100%"}},null,8,wd)):ue.kind==="text"&&ue.content?(l(),n("div",Cd,$(ue.content),1)):ue.url?(l(),n("a",{key:4,href:ue.url,target:"_blank",class:"file-link"},[r(L,{name:"file"}),E(" "+$(((ie=ue.meta)==null?void 0:ie.filename)||ue.url),1)],8,Vd)):o("v-if",true)])}),128))])])):o("v-if",true),(Z=(M=k.value.middlewareLogs)==null?void 0:M.request)!=null&&Z.error?(l(),n("div",xd,[c[33]||(c[33]=e("h3",null,"错误信息",-1)),e("div",Sd,$(k.value.middlewareLogs.request.error),1)])):o("v-if",true)])):o("v-if",true)]}),_:1},8,["modelValue"]),o(" 图片预览弹窗 "),r(gt,{visible:I.value,"onUpdate:visible":c[10]||(c[10]=M=>I.value=M),images:f.value,"initial-index":T.value,prompt:m.value,"created-at":g.value,duration:B.value},null,8,["visible","images","initial-index","prompt","created-at","duration"]),o(" 清理对话框 "),r(de,{modelValue:J.value,"onUpdate:modelValue":c[13]||(c[13]=M=>J.value=M),title:"清理旧任务",width:"400px"},{footer:V(()=>[e("span",Td,[r(ne,{onClick:c[12]||(c[12]=M=>J.value=false)},{default:V(()=>[...c[35]||(c[35]=[E("取消",-1)])]),_:1}),r(ne,{type:"error",onClick:P},{default:V(()=>[...c[36]||(c[36]=[E("确认清理",-1)])]),_:1})])]),default:V(()=>[e("div",Id,[c[34]||(c[34]=e("p",null,"清理多少天前的任务?",-1)),r(pe,{modelValue:F.value,"onUpdate:modelValue":c[11]||(c[11]=M=>F.value=M),min:1,max:365},null,8,["modelValue"])])]),_:1},8,["modelValue"])])}}}),Ud=ce(Od,[["__scopeId","data-v-898a70bb"]]),zd={class:"gallery-content"},Pd={class:"gallery-header"},Dd={class:"header-left"},Nd={key:0,class:"gallery-count"},Fd={class:"header-actions"},Ld={key:0,class:"gallery-empty"},Ed={class:"gallery-empty"},Ad=["onClick"],Md={key:0,class:"task-image-wrapper"},jd=["src"],Rd={key:0,class:"more-images"},Bd={class:"task-processing"},qd={class:"processing-text"},Hd={class:"task-failed"},Jd={class:"task-info"},Gd=["title"],Kd={class:"task-meta"},Wd={class:"task-time"},Zd={key:0,class:"task-duration"},Yd={key:0,class:"loading-more"},st=10,Xd=oe({__name:"HistoryGallery",emits:["select"],setup(t,{expose:a,emit:s}){const u=s,i=w(false),v=w(false),b=w(false),S=w([]),C=w(0),p=w(false),k=w(0),U=w();let I=null;const f=w(false),T=w([]),m=w(0),g=w(""),B=w(),J=w(),F=async()=>{try{const y=await ys.me();return b.value=y.loggedIn,y.loggedIn}catch{return b.value=false,false}},O=y=>{var L,ne,K;const d=[];if(y.responseSnapshot)for(const _ of y.responseSnapshot)_.kind==="image"&&_.url&&d.push(_.url);const c=((ne=(L=y.middlewareLogs)==null?void 0:L.preset)==null?void 0:ne.transformedPrompt)||((K=y.requestSnapshot)==null?void 0:K.prompt)||"";return{id:y.id,status:y.status,prompt:c,images:d,createdAt:new Date(y.startTime),duration:y.duration||void 0}},x=async(y=false)=>{if(b.value){v.value=true;try{const d=await Pe.my({limit:st,offset:y?k.value:0}),c=d.items.map(O);y?S.value=[...S.value,...c]:(S.value=c,k.value=0),C.value=d.total,p.value=d.items.length>=st,k.value+=st}catch(d){console.error("Failed to load tasks:",d)}finally{v.value=false}}},Y=()=>{!v.value&&p.value&&x(true)},Q=y=>{const d=y.target,{scrollTop:c,scrollHeight:L,clientHeight:ne}=d;L-c-ne<100&&Y()},ve=async()=>{await F(),await x()},N=y=>{y.status==="success"&&y.images.length>0&&(T.value=y.images,m.value=0,g.value=y.prompt,B.value=y.createdAt,J.value=y.duration,f.value=true,u("select",y))},P=y=>{const c=new Date().getTime()-y.getTime();return c<6e4?"刚刚":c<36e5?`${Math.floor(c/6e4)}分钟前`:c<864e5?`${Math.floor(c/36e5)}小时前`:c<6048e5?`${Math.floor(c/864e5)}天前`:y.toLocaleDateString()},W=y=>y<1e3?`${y}ms`:`${(y/1e3).toFixed(1)}s`,z=()=>{I=setInterval(()=>{S.value.some(d=>d.status==="pending"||d.status==="processing")&&x()},3e3)};return a({refresh:ve}),he(async()=>{await F()&&(await x(),z())}),Ye(()=>{I&&clearInterval(I)}),(y,d)=>{const c=A("k-icon");return l(),n("div",{class:te(["history-gallery",{collapsed:i.value}])},[o(" 折叠状态的侧边条 "),i.value?(l(),n("div",{key:0,class:"collapsed-bar",onClick:d[0]||(d[0]=L=>i.value=false)},[r(c,{name:"history"}),d[3]||(d[3]=e("span",{class:"collapsed-text"},"历史",-1))])):(l(),n(D,{key:1},[o(" 展开的内容 "),e("div",zd,[e("div",Pd,[e("div",Dd,[d[4]||(d[4]=e("span",{class:"gallery-title"},"历史记录",-1)),C.value>0?(l(),n("span",Nd,$(C.value),1)):o("v-if",true)]),e("div",Fd,[r(c,{name:"refresh",class:te(["action-icon",{spinning:v.value}]),onClick:ve,title:"刷新"},null,8,["class"]),r(c,{name:"chevron-right",class:"action-icon",onClick:d[1]||(d[1]=L=>i.value=true),title:"收起"})])]),o(" 未登录提示 "),b.value?v.value&&S.value.length===0?(l(),n(D,{key:1},[o(" 加载中 "),d[6]||(d[6]=e("div",{class:"gallery-loading"},[e("div",{class:"loader-small"})],-1))],2112)):S.value.length===0?(l(),n(D,{key:2},[o(" 空状态 "),e("div",Ed,[r(c,{name:"image",class:"empty-icon"}),d[7]||(d[7]=e("p",null,"暂无记录",-1))])],2112)):(l(),n(D,{key:3},[o(" 任务列表 (瀑布流) "),e("div",{class:"gallery-list",ref_key:"listRef",ref:U,onScroll:Q},[(l(true),n(D,null,ee(S.value,L=>(l(),n("div",{key:L.id,class:te(["task-card",{clickable:L.status==="success"}]),onClick:ne=>N(L)},[o(" 图片区域 - 只显示第一张 "),L.images&&L.images.length>0?(l(),n("div",Md,[e("img",{src:L.images[0],class:"task-image",loading:"lazy"},null,8,jd),L.images.length>1?(l(),n("div",Rd," +"+$(L.images.length-1),1)):o("v-if",true)])):L.status==="processing"||L.status==="pending"?(l(),n(D,{key:1},[o(" 处理中动画 "),e("div",Bd,[d[8]||(d[8]=e("div",{class:"processing-animation"},[e("div",{class:"dot"}),e("div",{class:"dot"}),e("div",{class:"dot"})],-1)),e("span",qd,$(L.status==="pending"?"等待中":"生成中"),1)])],2112)):L.status==="failed"?(l(),n(D,{key:2},[o(" 失败状态 "),e("div",Hd,[r(c,{name:"exclamation-triangle",class:"failed-icon"}),d[9]||(d[9]=e("span",null,"失败",-1))])],2112)):o("v-if",true),o(" 任务信息 "),e("div",Jd,[e("div",{class:"task-prompt",title:L.prompt},$(L.prompt||"(无提示词)"),9,Gd),e("div",Kd,[e("span",Wd,$(P(L.createdAt)),1),L.duration?(l(),n("span",Zd,$(W(L.duration)),1)):o("v-if",true)])])],10,Ad))),128)),o(" 加载更多 "),v.value&&S.value.length>0?(l(),n("div",Yd,[...d[10]||(d[10]=[e("div",{class:"loader-small"},null,-1)])])):o("v-if",true)],544)],2112)):(l(),n("div",Ld,[r(c,{name:"user",class:"empty-icon"}),d[5]||(d[5]=e("p",null,"请登录查看历史",-1))]))])],2112)),o(" 图片预览弹窗 "),r(gt,{visible:f.value,"onUpdate:visible":d[2]||(d[2]=L=>f.value=L),images:T.value,"initial-index":m.value,prompt:g.value,"created-at":B.value,duration:J.value},null,8,["visible","images","initial-index","prompt","created-at","duration"])],2)}}}),Qd=ce(Xd,[["__scopeId","data-v-6cba50e5"]]),eu={class:"preset-picker"},tu={key:0,class:"preset-info"},su=["src"],lu={key:1,class:"preset-thumb placeholder"},au={class:"preset-details"},nu={class:"preset-name"},ou={key:1,class:"placeholder-text"},iu={class:"picker-header"},ru={class:"preset-count"},du={class:"picker-content"},uu={class:"ml-masonry"},cu=["onClick"],vu={key:0,class:"card-thumbnail"},pu=["src","alt"],mu={class:"thumbnail-overlay"},fu={key:0,class:"ref-count"},gu={key:1,class:"card-thumbnail placeholder"},_u={class:"card-content"},yu={class:"card-title"},hu={key:0,class:"card-tags"},bu={key:0,class:"mini-tag more"},ku={key:2,class:"selected-mark"},$u={key:0,class:"empty-state"},wu={class:"dialog-footer"},Cu={key:0,class:"preset-detail"},Vu={key:0,class:"detail-thumbnail"},xu=["src","alt"],Su={class:"detail-section"},Iu={class:"detail-row"},Tu={key:0,class:"detail-row"},Ou={class:"detail-tags"},Uu={class:"detail-section"},zu={class:"prompt-preview"},Pu={key:1,class:"detail-section"},Du={class:"detail-label"},Nu={class:"reference-images"},Fu=["src"],Lu={key:2,class:"detail-section"},Eu={class:"param-preview"},Au={class:"dialog-footer"},Mu=oe({__name:"PresetPicker",props:{modelValue:{},presets:{}},emits:["update:modelValue"],setup(t,{emit:a}){const s=t,u=a,i=["本地","远程","text2img","img2img","NSFW"],v=w(false),b=w(false),S=w([]),C=w(s.modelValue),p=w(null),k=G(()=>{const F=new Set;return s.presets.forEach(O=>{(O.tags||[]).forEach(x=>F.add(x))}),Array.from(F).sort()}),U=G(()=>s.modelValue?s.presets.find(F=>F.id===s.modelValue):null),I=G(()=>{let F=s.presets;return S.value.length===0?F:F.filter(O=>S.value.every(x=>x==="本地"?O.source==="user":x==="远程"?O.source==="api":(O.tags||[]).includes(x)))}),f=()=>{C.value=s.modelValue,S.value=[],v.value=true},T=F=>{C.value=F.id},m=()=>{u("update:modelValue",C.value),v.value=false},g=()=>{u("update:modelValue",void 0)},B=F=>{p.value=F,b.value=true},J=()=>{p.value&&(u("update:modelValue",p.value.id),b.value=false,v.value=false)};return ye(()=>s.modelValue,F=>{C.value=F}),(F,O)=>{var ve;const x=A("k-icon"),Y=A("k-button"),Q=A("el-dialog");return l(),n("div",eu,[o(" 当前选中的预设显示 "),e("div",{class:"selected-preset",onClick:f},[U.value?(l(),n("div",tu,[U.value.thumbnail?(l(),n("img",{key:0,src:U.value.thumbnail,class:"preset-thumb"},null,8,su)):(l(),n("div",lu,[r(x,{name:"image"})])),e("div",au,[e("span",nu,$(U.value.name),1),e("span",{class:te(["preset-source",U.value.source])},$(U.value.source==="api"?"远程":"本地"),3)]),r(x,{name:"times",class:"clear-btn",onClick:fe(g,["stop"]),title:"清除选择"})])):(l(),n("div",ou,[r(x,{name:"layer-group"}),O[6]||(O[6]=e("span",null,"选择预设模板 (可选)",-1))])),r(x,{name:"chevron-down",class:"dropdown-icon"})]),o(" 预设选择弹窗 - 复用 PresetsView 的布局 "),r(Q,{modelValue:v.value,"onUpdate:modelValue":O[3]||(O[3]=N=>v.value=N),title:"选择预设",width:"80vw",top:"5vh","close-on-click-modal":true,class:"preset-picker-dialog"},{footer:V(()=>[e("div",wu,[r(Y,{onClick:O[2]||(O[2]=N=>v.value=false)},{default:V(()=>[...O[9]||(O[9]=[E("取消",-1)])]),_:1}),r(Y,{type:"primary",onClick:m,disabled:!C.value},{default:V(()=>[...O[10]||(O[10]=[E(" 确认选择 ",-1)])]),_:1},8,["disabled"])])]),default:V(()=>[e("div",iu,[r(dt,{modelValue:S.value,"onUpdate:modelValue":O[0]||(O[0]=N=>S.value=N),"all-tags":k.value,"preset-tags":i},null,8,["modelValue","all-tags"]),e("span",ru,"共 "+$(I.value.length)+" 个预设",1)]),e("div",du,[e("div",uu,[(l(true),n(D,null,ee(I.value,N=>{var P,W;return l(),n("div",{key:N.id,class:"ml-masonry-item"},[e("div",{class:te(["preset-card",{selected:C.value===N.id}]),onClick:z=>T(N)},[o(" 缩略图 "),N.thumbnail?(l(),n("div",vu,[e("img",{src:N.thumbnail,alt:N.name,loading:"lazy"},null,8,pu),e("div",mu,[(P=N.referenceImages)!=null&&P.length?(l(),n("span",fu,[r(x,{name:"image"}),E(" "+$(N.referenceImages.length),1)])):o("v-if",true)])])):(l(),n("div",gu,[r(x,{name:"image",class:"placeholder-icon"})])),o(" 内容 "),e("div",_u,[e("div",yu,$(N.name),1),(W=N.tags)!=null&&W.length?(l(),n("div",hu,[(l(true),n(D,null,ee(N.tags.slice(0,4),z=>(l(),n("span",{key:z,class:"mini-tag"},$(z),1))),128)),N.tags.length>4?(l(),n("span",bu,"+"+$(N.tags.length-4),1)):o("v-if",true)])):o("v-if",true)]),o(" 操作按钮区 "),e("div",{class:"card-actions",onClick:O[1]||(O[1]=fe(()=>{},["stop"]))},[r(Y,{size:"mini",onClick:z=>B(N)},{icon:V(()=>[r(x,{name:"eye"})]),default:V(()=>[O[7]||(O[7]=E(" 详情 ",-1))]),_:1},8,["onClick"])]),o(" 来源标记 "),e("div",{class:te(["source-indicator",N.source])},$(N.source==="api"?"远程":"本地"),3),o(" 选中标记 "),C.value===N.id?(l(),n("div",ku,[r(x,{name:"check"})])):o("v-if",true)],10,cu)])}),128))]),o(" 空状态 "),I.value.length===0?(l(),n("div",$u,[r(x,{name:"search",class:"empty-icon"}),O[8]||(O[8]=e("p",null,"没有找到匹配的预设",-1))])):o("v-if",true)])]),_:1},8,["modelValue"]),o(" 预设详情弹窗 "),r(Q,{modelValue:b.value,"onUpdate:modelValue":O[5]||(O[5]=N=>b.value=N),title:((ve=p.value)==null?void 0:ve.name)||"预设详情",width:"600px","close-on-click-modal":true,class:"preset-detail-dialog"},{footer:V(()=>[e("div",Au,[r(Y,{onClick:O[4]||(O[4]=N=>b.value=false)},{default:V(()=>[...O[15]||(O[15]=[E("关闭",-1)])]),_:1}),r(Y,{type:"primary",onClick:J},{icon:V(()=>[r(x,{name:"check"})]),default:V(()=>[O[16]||(O[16]=E(" 选择此预设 ",-1))]),_:1})])]),default:V(()=>{var N,P;return[p.value?(l(),n("div",Cu,[o(" 缩略图 "),p.value.thumbnail?(l(),n("div",Vu,[e("img",{src:p.value.thumbnail,alt:p.value.name},null,8,xu)])):o("v-if",true),o(" 基本信息 "),e("div",Su,[e("div",Iu,[O[11]||(O[11]=e("span",{class:"detail-label"},"来源:",-1)),e("span",{class:te(["source-badge",p.value.source])},$(p.value.source==="api"?"远程":"本地"),3)]),(N=p.value.tags)!=null&&N.length?(l(),n("div",Tu,[O[12]||(O[12]=e("span",{class:"detail-label"},"标签:",-1)),e("div",Ou,[(l(true),n(D,null,ee(p.value.tags,W=>(l(),n("span",{key:W,class:"mini-tag"},$(W),1))),128))])])):o("v-if",true)]),o(" Prompt 模板 "),e("div",Uu,[O[13]||(O[13]=e("div",{class:"detail-label"},"Prompt 模板:",-1)),e("div",zu,$(p.value.promptTemplate),1)]),o(" 参考图 "),(P=p.value.referenceImages)!=null&&P.length?(l(),n("div",Pu,[e("div",Du,"参考图片 ("+$(p.value.referenceImages.length)+"):",1),e("div",Nu,[(l(true),n(D,null,ee(p.value.referenceImages,(W,z)=>(l(),n("img",{key:z,src:W,class:"ref-image"},null,8,Fu))),128))])])):o("v-if",true),o(" 参数覆盖 "),p.value.parameterOverrides&&Object.keys(p.value.parameterOverrides).length?(l(),n("div",Lu,[O[14]||(O[14]=e("div",{class:"detail-label"},"参数覆盖:",-1)),e("div",Eu,$(JSON.stringify(p.value.parameterOverrides,null,2)),1)])):o("v-if",true)])):o("v-if",true)]}),_:1},8,["modelValue","title"])])}}}),ju=ce(Mu,[["__scopeId","data-v-59115136"]]),Ru={class:"view-container"},Bu={class:"view-content"},qu={class:"generate-layout"},Hu={class:"config-panel"},Ju={class:"form-section"},Gu={class:"section-title"},Ku={class:"form-item"},Wu={class:"form-item"},Zu={class:"form-section flex-grow"},Yu={class:"section-title"},Xu={class:"form-section"},Qu={class:"section-title"},ec={class:"upload-area"},tc={key:0,class:"upload-list"},sc=["src"],lc=["onClick"],ac={class:"form-actions"},nc={class:"preview-panel"},oc={key:0,class:"generating-state"},ic={class:"generating-content"},rc={class:"generating-info"},dc={class:"generating-timer"},uc={key:0,class:"generating-hint"},cc={class:"result-container"},vc={key:0,class:"success-result"},pc={class:"output-grid"},mc=["src","onClick"],fc={class:"output-actions"},gc=["href"],_c=["src"],yc=["src"],hc=["href"],bc={class:"text-output"},kc=["href"],$c={class:"result-meta"},wc={class:"meta-item success-badge"},Cc={key:0,class:"meta-item"},Vc={key:1,class:"meta-item"},xc={class:"error-result"},Sc={class:"error-content"},Ic={class:"error-info"},Tc={class:"error-msg"},Oc={key:0,class:"error-meta"},Uc={key:1,class:"error-meta"},zc={class:"empty-state"},Pc=oe({__name:"GenerateView",setup(t){const a=w([]),s=w([]),u=w(false),i=w(null),v=w([]),b=w([]),S=w(),C=w();let p=0;const k=w(0),U=w(null);let I=null,f=0;const T=w({channel:void 0,prompt:"",parameters:{}}),m=w(void 0),g=w(false),B=w([]),J=w(0),F=w(""),O=K=>{if(K<1e3)return`${K}ms`;const _=K/1e3;if(_<60)return`${_.toFixed(1)}s`;const h=Math.floor(_/60),j=(_%60).toFixed(0);return`${h}m ${j}s`},x=()=>{f=Date.now(),k.value=0,I=setInterval(()=>{k.value=Date.now()-f},100)},Y=()=>{I&&(clearInterval(I),I=null)},Q=K=>{var _;(_=i.value)!=null&&_.output&&(B.value=i.value.output.filter(h=>h.kind==="image"&&h.url).map(h=>h.url),J.value=K,g.value=true)},ve=async()=>{try{const[K,_]=await Promise.all([ze.list(),Ie.list()]);a.value=K,s.value=_}catch(K){console.error(K)}},N=K=>new Promise((_,h)=>{const j=new FileReader;j.onload=()=>{const le=j.result.split(",")[1];_(le)},j.onerror=h,j.readAsDataURL(K)}),P=()=>{var K;(K=S.value)==null||K.click()},W=async K=>{const _=K.target;!_.files||_.files.length===0||(await y(Array.from(_.files)),_.value="")},z=async K=>{var h;const _=(h=K.dataTransfer)==null?void 0:h.files;!_||_.length===0||await y(Array.from(_).filter(j=>j.type.startsWith("image/")))},y=async K=>{const _=4-v.value.length;if(_<=0){X.warning("最多上传 4 张图片");return}const h=K.slice(0,_);for(const j of h){const re=URL.createObjectURL(j);v.value.push({uid:++p,url:re,raw:j});try{const le=await N(j);b.value.push({type:"image",base64:le,mimeType:j.type,filename:j.name})}catch(le){console.error("Failed to read file:",j.name,le)}}},d=K=>{const _=v.value[K];_&&(URL.revokeObjectURL(_.url),v.value.splice(K,1),b.value.splice(K,1))},c=async K=>{var _,h,j,re;try{const le=await Pe.get(K);if(F.value=((h=(_=le.middlewareLogs)==null?void 0:_.preset)==null?void 0:h.transformedPrompt)||((j=le.requestSnapshot)==null?void 0:j.prompt)||"",le.status==="success"&&le.responseSnapshot&&le.responseSnapshot.length>0)return{success:true,output:le.responseSnapshot,taskId:le.id,duration:le.duration||void 0};if(le.status==="failed"){const de=(re=le.middlewareLogs)==null?void 0:re._error;return{success:false,error:(de==null?void 0:de.message)||"生成失败",taskId:le.id,duration:le.duration||void 0}}return null}catch{return null}},L=async()=>{var K,_,h,j,re,le;if(!T.value.channel){X.warning("请选择渠道");return}u.value=true,i.value=null,U.value=null,x();try{const de={channelId:T.value.channel,prompt:T.value.prompt||"",parameters:{...T.value.parameters}};if(b.value.length>0&&(de.files=b.value),m.value){const M=s.value.find(Z=>Z.id===m.value);M&&(de.parameters.preset=M.name)}const pe=await hs.generate(de);if(pe.taskId&&(U.value=pe.taskId),pe.success)if(i.value=pe,(K=C.value)==null||K.refresh(),pe.taskId)try{const M=await Pe.get(pe.taskId);F.value=((h=(_=M.middlewareLogs)==null?void 0:_.preset)==null?void 0:h.transformedPrompt)||((j=M.requestSnapshot)==null?void 0:j.prompt)||""}catch{F.value=T.value.prompt}else F.value=T.value.prompt;else if(pe.taskId){await new Promise(Z=>setTimeout(Z,500));const M=await c(pe.taskId);M&&M.success?(i.value=M,(re=C.value)==null||re.refresh()):i.value=pe}else i.value=pe}catch(de){if(U.value){await new Promise(M=>setTimeout(M,500));const pe=await c(U.value);pe?(i.value=pe,pe.success&&((le=C.value)==null||le.refresh())):i.value={success:false,error:de.message||"请求失败"}}else i.value={success:false,error:de.message||"请求失败"}}finally{Y(),u.value=false}},ne=K=>{K.prompt&&(T.value.prompt=K.prompt)};return he(()=>{ve()}),Ye(()=>{Y()}),(K,_)=>{var M;const h=A("k-icon"),j=A("el-option"),re=A("el-select"),le=A("el-input"),de=A("k-button"),pe=A("k-card");return l(),n("div",Ru,[e("div",Bu,[e("div",qu,[o(" 左侧配置区 "),e("div",Hu,[r(pe,{class:"config-card"},{default:V(()=>[e("div",Ju,[e("div",Gu,[r(h,{name:"settings"}),_[5]||(_[5]=E(" 基础配置 ",-1))]),e("div",Ku,[_[6]||(_[6]=e("div",{class:"label"},"生成渠道",-1)),r(re,{modelValue:T.value.channel,"onUpdate:modelValue":_[0]||(_[0]=Z=>T.value.channel=Z),placeholder:"选择生成渠道",style:{width:"100%"}},{default:V(()=>[(l(true),n(D,null,ee(a.value,Z=>(l(),se(j,{key:Z.id,label:Z.name,value:Z.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Wu,[_[7]||(_[7]=e("div",{class:"label"},"预设模板",-1)),r(ju,{modelValue:m.value,"onUpdate:modelValue":_[1]||(_[1]=Z=>m.value=Z),presets:s.value},null,8,["modelValue","presets"])])]),e("div",Zu,[e("div",Yu,[r(h,{name:"edit"}),_[8]||(_[8]=E(" 提示词 ",-1))]),r(le,{modelValue:T.value.prompt,"onUpdate:modelValue":_[2]||(_[2]=Z=>T.value.prompt=Z),type:"textarea",rows:8,placeholder:"输入提示词,支持自然语言描述...",resize:"none",class:"prompt-input"},null,8,["modelValue"])]),o(" 文件上传区域 "),e("div",Xu,[e("div",Qu,[r(h,{name:"image"}),_[9]||(_[9]=E(" 参考图片 ",-1))]),e("div",ec,[o(" 已上传的图片列表 "),v.value.length>0?(l(),n("div",tc,[(l(true),n(D,null,ee(v.value,(Z,ue)=>(l(),n("div",{key:Z.uid,class:"upload-item"},[e("img",{src:Z.url,class:"upload-thumb"},null,8,sc),e("div",{class:"upload-overlay",onClick:q=>d(ue)},[r(h,{name:"delete"})],8,lc)]))),128))])):o("v-if",true),o(" 上传按钮 "),v.value.length<4?(l(),n("div",{key:1,class:"upload-trigger",onClick:P,onDragover:_[3]||(_[3]=fe(()=>{},["prevent"])),onDrop:fe(z,["prevent"])},[e("input",{ref_key:"fileInput",ref:S,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:W},null,544),r(h,{name:"add",class:"upload-icon"})],32)):o("v-if",true),_[10]||(_[10]=e("div",{class:"upload-tip"},"点击或拖拽上传,最多 4 张",-1))])]),e("div",ac,[r(de,{solid:"",type:"primary",loading:u.value,onClick:L,class:"generate-btn"},{icon:V(()=>[r(h,{name:"magic"})]),default:V(()=>[_[11]||(_[11]=E(" 生成图片 ",-1))]),_:1},8,["loading"])])]),_:1})]),o(" 右侧预览区 "),e("div",nc,[o(" 生成中状态 "),u.value?(l(),n("div",oc,[e("div",ic,[_[13]||(_[13]=e("div",{class:"loader"},null,-1)),e("div",rc,[_[12]||(_[12]=e("p",{class:"generating-title"},"正在生成中...",-1)),e("p",dc,[r(h,{name:"stopwatch"}),E(" 已用时间: "+$(O(k.value)),1)]),U.value?(l(),n("p",uc,"任务 ID: "+$(U.value),1)):o("v-if",true)])])])):i.value?(l(),n(D,{key:1},[o(" 有结果 "),e("div",cc,[o(" 成功状态 "),i.value.success&&i.value.output&&i.value.output.length?(l(),n("div",vc,[e("div",pc,[(l(true),n(D,null,ee(i.value.output,(Z,ue)=>{var q;return l(),n("div",{key:ue,class:"output-wrapper"},[o(" 图片 "),Z.kind==="image"?(l(),n(D,{key:0},[e("img",{src:Z.url,onClick:ie=>Q(ue),class:"clickable-image"},null,8,mc),e("div",fc,[e("a",{href:Z.url,target:"_blank",class:"action-btn",download:""},[r(h,{name:"download"})],8,gc)])],64)):Z.kind==="video"?(l(),n(D,{key:1},[o(" 视频 "),e("video",{src:Z.url,controls:"",class:"output-video"},null,8,_c)],64)):Z.kind==="audio"?(l(),n(D,{key:2},[o(" 音频 "),e("audio",{src:Z.url,controls:"",class:"output-audio"},null,8,yc)],64)):Z.kind==="file"?(l(),n(D,{key:3},[o(" 其他文件 "),e("a",{href:Z.url,target:"_blank",class:"file-link"},[r(h,{name:"file"}),E(" "+$(((q=Z.meta)==null?void 0:q.filename)||"下载文件"),1)],8,hc)],64)):Z.kind==="text"?(l(),n(D,{key:4},[o(" 文本 "),e("div",bc,$(Z.content),1)],64)):Z.url?(l(),n(D,{key:5},[o(" 兜底:有 url 则显示链接 "),e("a",{href:Z.url,target:"_blank"},$(Z.url),9,kc)],64)):o("v-if",true)])}),128))]),e("div",$c,[e("span",wc,[r(h,{name:"check-circle"}),_[14]||(_[14]=E(" 生成成功 ",-1))]),i.value.duration?(l(),n("span",Cc,[r(h,{name:"stopwatch"}),E(" 耗时: "+$(O(i.value.duration)),1)])):o("v-if",true),i.value.taskId?(l(),n("span",Vc,[r(h,{name:"list-alt"}),E(" 任务 ID: "+$(i.value.taskId),1)])):o("v-if",true)])])):(l(),n(D,{key:1},[o(" 失败状态 "),e("div",xc,[e("div",Sc,[r(h,{name:"exclamation-triangle",class:"error-icon"}),e("div",Ic,[_[15]||(_[15]=e("p",{class:"error-title"},"生成失败",-1)),e("p",Tc,$(i.value.error||"未知错误"),1),i.value.taskId?(l(),n("p",Oc,"任务 ID: "+$(i.value.taskId),1)):o("v-if",true),i.value.duration?(l(),n("p",Uc,"耗时: "+$(O(i.value.duration)),1)):o("v-if",true)])]),r(de,{class:"retry-btn",onClick:L},{icon:V(()=>[r(h,{name:"refresh"})]),default:V(()=>[_[16]||(_[16]=E(" 重新生成 ",-1))]),_:1})])],2112))])],2112)):(l(),n(D,{key:2},[o(" 空状态 "),e("div",zc,[r(h,{name:"image",class:"empty-icon"}),_[17]||(_[17]=e("p",null,"在左侧配置并点击生成",-1))])],2112))]),o(" 右侧历史画廊 "),r(Qd,{ref_key:"historyGalleryRef",ref:C,onSelect:ne},null,512)])]),o(" 图片预览弹窗 "),r(gt,{visible:g.value,"onUpdate:visible":_[4]||(_[4]=Z=>g.value=Z),images:B.value,"initial-index":J.value,prompt:F.value,duration:(M=i.value)==null?void 0:M.duration},null,8,["visible","images","initial-index","prompt","duration"])])}}}),Dt=ce(Pc,[["__scopeId","data-v-a3441aa4"]]),Dc={class:"pipeline-panel"},Nc={class:"pipeline-flow"},Fc={class:"phase-icon"},Lc={class:"phase-info"},Ec={class:"phase-name"},Ac={class:"phase-desc"},Mc={class:"phase-badge"},jc={key:0,class:"phase-middlewares"},Rc={class:"mw-card"},Bc={class:"mw-content"},qc={class:"mw-name"},Hc={class:"mw-desc"},Jc=["title"],Gc=["checked","onChange"],Kc={key:2,class:"phase-connector"},Wc={class:"connector-arrow"},Zc=oe({__name:"MiddlewaresPanel",setup(t){const a=w([]),s=[{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"}],u={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},i=S=>a.value.filter(C=>C.phase===S),v=async()=>{try{a.value=await He.list()}catch{X.error("加载中间件列表失败")}},b=async S=>{const C=!S.enabled;try{await He.update(S.name,{enabled:C}),S.enabled=C,X.success(C?"已启用":"已禁用")}catch{X.error("操作失败")}};return he(v),(S,C)=>{const p=A("k-icon");return l(),n("div",Dc,[o(" 标题区 "),C[5]||(C[5]=e("div",{class:"panel-header"},[e("div",{class:"header-title"},[e("h3",null,"请求执行流程"),e("span",{class:"subtitle"},"每个生成请求按以下阶段依次处理")])],-1)),o(" 流程图 "),e("div",Nc,[(l(),n(D,null,ee(s,(k,U)=>e("div",{key:k.id,class:"phase-section"},[o(" 阶段标题 "),e("div",{class:te(["phase-header",k.colorClass])},[e("div",Fc,[r(p,{name:k.icon},null,8,["name"])]),e("div",Lc,[e("span",Ec,$(k.label),1),e("span",Ac,$(k.description),1)]),e("span",Mc,$(i(k.id).length),1)],2),o(" 中间件列表 "),i(k.id).length>0?(l(),n("div",jc,[(l(true),n(D,null,ee(i(k.id),(I,f)=>(l(),n("div",{key:I.name,class:te(["mw-item",{disabled:!I.enabled}])},[e("div",Rc,[e("div",{class:te(["mw-status",{active:I.enabled}])},null,2),e("div",Bc,[e("span",qc,$(I.displayName),1),e("span",Hc,$(I.description||u[I.category]||I.category),1)]),e("label",{class:"toggle-switch",onClick:C[0]||(C[0]=fe(()=>{},["stop"])),title:I.enabled?"点击禁用":"点击启用"},[e("input",{type:"checkbox",checked:I.enabled,onChange:T=>b(I)},null,40,Gc),C[1]||(C[1]=e("span",{class:"slider"},null,-1))],8,Jc)])],2))),128))])):(l(),n(D,{key:1},[o(" 空状态 "),C[2]||(C[2]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),o(" 阶段间连接箭头 "),U<s.length-1?(l(),n("div",Kc,[C[3]||(C[3]=e("div",{class:"connector-line"},null,-1)),e("div",Wc,[r(p,{name:"chevron-down"})]),C[4]||(C[4]=e("div",{class:"connector-line"},null,-1))])):o("v-if",true)])),64))]),o(" 底部说明 "),C[6]||(C[6]=it('<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))])}}}),Yc=ce(Zc,[["__scopeId","data-v-b4b0cf47"]]),Xc={class:"plugins-panel"},Qc={key:0,class:"loading-state"},ev={class:"empty-state"},tv={class:"plugins-list"},sv=["onClick"],lv={class:"plugin-info"},av={class:"plugin-header"},nv={class:"plugin-name"},ov={key:0,class:"plugin-version"},iv={class:"plugin-description"},rv={class:"plugin-status"},dv={key:0,class:"plugin-badge connector"},uv={key:1,class:"plugin-badge middleware"},cv={key:0,class:"plugin-detail"},vv={class:"detail-header"},pv={class:"header-left"},mv={key:0,class:"version"},fv={class:"header-actions"},gv={key:0,class:"connector-info"},_v={class:"connector-meta"},yv={class:"connector-id"},hv={class:"connector-types"},bv={key:1,class:"middlewares-list"},kv={class:"middleware-tags"},$v={class:"phase-badge"},wv={key:2,class:"config-section"},Cv={class:"config-actions"},Vv={class:"no-config"},xv={class:"no-selection"},Sv=oe({__name:"PluginsPanel",setup(t){const a=w(true),s=w([]),u=w(null),i=w({}),v=w(false),b={"lifecycle-prepare":"准备","lifecycle-pre-request":"前置","lifecycle-request":"请求","lifecycle-post-request":"后置","lifecycle-finalize":"完成"},S=I=>b[I]||I,C=async()=>{try{a.value=true,s.value=await at.list()}catch(I){console.error("Failed to load plugins:",I),s.value=[]}finally{a.value=false}},p=I=>{u.value=I,i.value={...I.config};for(const f of I.configFields||[])i.value[f.key]===void 0&&f.default!==void 0&&(i.value[f.key]=f.default)},k=async()=>{if(u.value){v.value=true;try{await at.updateConfig(u.value.id,i.value),X.success("保存成功"),await C();const I=s.value.find(f=>{var T;return f.id===((T=u.value)==null?void 0:T.id)});I&&(u.value=I,i.value={...I.config})}catch{X.error("保存失败")}finally{v.value=false}}},U=async I=>{var f;try{const T=await Lt(I.apiEvent);if((T==null?void 0:T.success)===false)throw new Error(T.error||"操作失败");if(I.apiEvent==="media-luna/presets/sync"&&(T!=null&&T.data)){const{added:m,updated:g,removed:B,notModified:J}=T.data;J?X.info("数据未变化,无需更新"):X.success(`同步完成:新增 ${m},更新 ${g},删除 ${B}`)}else(f=T==null?void 0:T.data)!=null&&f.message?X.success(T.data.message):X.success(`${I.label} 完成`);await C()}catch(T){X.error(`${I.label} 失败: ${T instanceof Error?T.message:"未知错误"}`)}};return he(C),(I,f)=>{var g,B,J;const T=A("k-icon"),m=A("k-button");return l(),n("div",Xc,[o(" 加载状态 "),a.value?(l(),n("div",Qc,[r(T,{name:"sync",class:"spin"}),f[1]||(f[1]=e("span",null,"加载中...",-1))])):s.value.length===0?(l(),n(D,{key:1},[o(" 空状态 "),e("div",ev,[r(T,{name:"apps"}),f[2]||(f[2]=e("p",null,"暂无扩展插件",-1)),f[3]||(f[3]=e("p",{class:"hint"},[E("第三方扩展插件将在这里显示"),e("br"),E('内置功能请在"功能模块"中配置')],-1))])],2112)):(l(),n(D,{key:2},[o(" 插件列表 "),e("div",tv,[(l(true),n(D,null,ee(s.value,F=>{var O,x;return l(),n("div",{key:F.id,class:te(["plugin-card",{active:((O=u.value)==null?void 0:O.id)===F.id,disabled:!F.enabled}]),onClick:Y=>p(F)},[e("div",lv,[e("div",av,[e("span",nv,$(F.name),1),F.version?(l(),n("span",ov,"v"+$(F.version),1)):o("v-if",true)]),e("p",iv,$(F.description||"暂无描述"),1)]),e("div",rv,[F.connector?(l(),n("span",dv,"连接器")):o("v-if",true),(x=F.middlewares)!=null&&x.length?(l(),n("span",uv,$(F.middlewares.length)+" 个中间件 ",1)):o("v-if",true),r(T,{name:F.enabled?"check-circle":"close-circle",class:te(F.enabled?"enabled":"disabled")},null,8,["name","class"])])],10,sv)}),128))]),o(" 插件详情 "),u.value?(l(),n("div",cv,[e("header",vv,[e("div",pv,[e("h3",null,$(u.value.name),1),u.value.version?(l(),n("span",mv,"v"+$(u.value.version),1)):o("v-if",true)]),e("div",fv,[(l(true),n(D,null,ee(u.value.actions,F=>(l(),se(m,{key:F.name,type:F.type||"default",size:"small",onClick:O=>U(F)},cs({default:V(()=>[E(" "+$(F.label),1)]),_:2},[F.icon?{name:"icon",fn:V(()=>[r(T,{name:F.icon},null,8,["name"])]),key:"0"}:void 0]),1032,["type","onClick"]))),128))])]),o(" 连接器信息 "),u.value.connector?(l(),n("div",gv,[f[4]||(f[4]=e("h4",null,"连接器",-1)),e("div",_v,[e("span",yv,$(u.value.connector.id),1),e("span",hv," 支持: "+$(((g=u.value.connector.supportedTypes)==null?void 0:g.join(", "))||"无"),1)])])):o("v-if",true),o(" 中间件列表 "),(B=u.value.middlewares)!=null&&B.length?(l(),n("div",bv,[f[5]||(f[5]=e("h4",null,"中间件",-1)),e("div",kv,[(l(true),n(D,null,ee(u.value.middlewares,F=>(l(),n("span",{key:F.name,class:te(["middleware-tag",{enabled:F.enabled}])},[E($(F.displayName||F.name)+" ",1),e("span",$v,$(S(F.phase)),1)],2))),128))])])):o("v-if",true),o(" 配置表单 "),(J=u.value.configFields)!=null&&J.length?(l(),n("div",wv,[f[7]||(f[7]=e("h4",null,"配置",-1)),r(et,{fields:u.value.configFields,modelValue:i.value,"onUpdate:modelValue":f[0]||(f[0]=F=>i.value=F),"presets-map":u.value.presets},null,8,["fields","modelValue","presets-map"]),e("div",Cv,[r(m,{type:"primary",onClick:k,loading:v.value},{icon:V(()=>[r(T,{name:"save"})]),default:V(()=>[f[6]||(f[6]=E(" 保存配置 ",-1))]),_:1},8,["loading"])])])):(l(),n(D,{key:3},[o(" 无配置提示 "),e("div",Vv,[r(T,{name:"info-circle"}),f[8]||(f[8]=e("span",null,"该插件暂无可配置项",-1))])],2112))])):(l(),n(D,{key:1},[o(" 无选中提示 "),e("div",xv,[r(T,{name:"apps"}),f[9]||(f[9]=e("p",null,"请从左侧选择一个插件查看详情",-1))])],2112))],64))])}}}),Iv=ce(Sv,[["__scopeId","data-v-a53de4c8"]]),Tv={class:"settings-view"},Ov={class:"sidebar"},Uv={class:"nav-list"},zv=["onClick"],Pv={class:"main-content"},Dv={key:0,class:"loading"},Nv={class:"panel-header"},Fv={key:0},Lv={class:"custom-panel"},Ev={class:"actions"},Av=oe({__name:"SettingsView",setup(t){const a=w(true),s=w([]),u=w(""),i=w({}),v=G(()=>s.value.find(p=>p.id===u.value)),b=async()=>{try{s.value=await ht.panels(),s.value.length&&!u.value&&(u.value=s.value[0].id)}catch{X.error("加载设置面板失败")}},S=()=>{var p;if(((p=v.value)==null?void 0:p.type)==="custom"){i.value={...v.value.config||{}};for(const k of v.value.configFields||[])i.value[k.key]===void 0&&k.default!==void 0&&(i.value[k.key]=k.default)}},C=async()=>{if(v.value)try{await ht.update(v.value.id,i.value),X.success("保存成功"),await b()}catch{X.error("保存失败")}};return ye(u,()=>{var p;((p=v.value)==null?void 0:p.type)==="custom"&&S()}),he(async()=>{await b(),a.value=false}),(p,k)=>{const U=A("k-icon"),I=A("k-button");return l(),n("div",Tv,[o(" 侧边栏导航 "),e("aside",Ov,[e("nav",Uv,[(l(true),n(D,null,ee(s.value,f=>(l(),n("div",{key:f.id,class:te(["nav-item",{active:u.value===f.id}]),onClick:T=>u.value=f.id},[r(U,{name:f.icon},null,8,["name"]),e("span",null,$(f.name),1)],10,zv))),128))])]),o(" 主内容区 "),e("main",Pv,[a.value?(l(),n("div",Dv,[r(U,{name:"sync",class:"spin"}),k[1]||(k[1]=E(" 加载中... ",-1))])):v.value?(l(),n(D,{key:1},[o(" 面板标题 "),e("header",Nv,[e("h2",null,$(v.value.name),1),v.value.description?(l(),n("p",Fv,$(v.value.description),1)):o("v-if",true)]),o(" 功能模块面板 "),v.value.component==="middlewares"?(l(),se(Yc,{key:0})):v.value.component==="plugins"?(l(),n(D,{key:1},[o(" 扩展插件面板 "),r(Iv)],64)):v.value.type==="custom"&&v.value.configFields?(l(),n(D,{key:2},[o(" 自定义面板 "),e("div",Lv,[r(et,{fields:v.value.configFields,modelValue:i.value,"onUpdate:modelValue":k[0]||(k[0]=f=>i.value=f)},null,8,["fields","modelValue"]),e("div",Ev,[r(I,{type:"primary",onClick:C},{icon:V(()=>[r(U,{name:"save"})]),default:V(()=>[k[2]||(k[2]=E(" 保存 ",-1))]),_:1})])])],64)):o("v-if",true)],64)):o("v-if",true)])])}}}),Mv=ce(Av,[["__scopeId","data-v-5fa778a6"]]),jv={class:"setup-storage"},Rv={key:0,class:"loading-state"},Bv={key:0,class:"warning-box"},qv={class:"step-actions"},Hv=oe({__name:"SetupStorage",props:{modelValue:{},saving:{type:Boolean}},emits:["update:modelValue","next"],setup(t,{emit:a}){const s=t,u=a,i=w(true),v=w([]),b=w({});ye(b,p=>{u("update:modelValue",{...p})},{deep:true});const S=async()=>{try{i.value=true;const[p,k]=await Promise.all([we.getStorageFields(),we.getStorageConfig()]);v.value=p;const U={...s.modelValue};for(const I of p)k[I.key]!==void 0?U[I.key]=k[I.key]:U[I.key]===void 0&&I.default!==void 0&&(U[I.key]=I.default);b.value=U}catch(p){console.error("Failed to load storage config:",p)}finally{i.value=false}},C=()=>{u("next")};return he(S),(p,k)=>{const U=A("k-icon"),I=A("k-button");return l(),n("div",jv,[k[4]||(k[4]=e("h3",null,"存储配置",-1)),k[5]||(k[5]=e("p",{class:"step-desc"},"选择生成图片的存储方式。推荐使用本地存储或 S3 兼容存储。",-1)),i.value?(l(),n("div",Rv,[r(U,{name:"sync",class:"spin"}),k[1]||(k[1]=e("span",null,"加载配置中...",-1))])):(l(),n(D,{key:1},[o(" 使用 ConfigRenderer 渲染配置字段 "),r(et,{fields:v.value,modelValue:b.value,"onUpdate:modelValue":k[0]||(k[0]=f=>b.value=f)},null,8,["fields","modelValue"]),o(" 警告提示(当选择不使用时) "),b.value.backend==="none"?(l(),n("div",Bv,[r(U,{name:"warning"}),k[2]||(k[2]=e("div",null,[e("strong",null,"注意"),e("p",null,'选择"不使用"将保留生成服务返回的原始 URL,这些 URL 可能会过期或无法访问。建议配置存储后端以确保图片长期可用。')],-1))])):o("v-if",true)],64)),o(" 操作按钮 "),e("div",qv,[r(I,{type:"primary",loading:t.saving,disabled:i.value,onClick:C},{default:V(()=>[...k[3]||(k[3]=[E(" 下一步 ",-1)])]),_:1},8,["loading","disabled"])])])}}}),Jv=ce(Hv,[["__scopeId","data-v-9aeaae19"]]),Gv={class:"setup-auth"},Kv={class:"config-panel"},Wv={class:"form-row"},Zv={class:"field-container"},Yv={class:"verify-section"},Xv={class:"verify-card"},Qv={class:"code-display"},ep={class:"code-value"},tp={class:"code-meta"},sp={class:"step-actions"},lp=oe({__name:"SetupAuth",props:{saving:{type:Boolean}},emits:["complete","skip"],setup(t,{emit:a}){const s=a,u=w(null),i=w(false),v=w(""),b=w(0),S=w(null);let C=null,p=null;const k=async()=>{try{const m=await we.status();m.boundUid&&(u.value=m.boundUid,S.value=m.boundUid)}catch(m){console.error("Failed to load status:",m)}},U=async()=>{if(I&&clearTimeout(I),!!u.value)try{i.value=true;const m=await we.generateVerifyCode(u.value);v.value=m.code,b.value=m.expiresIn,X.success("验证码已生成,请在聊天平台完成验证")}catch(m){X.error("生成验证码失败: "+(m instanceof Error?m.message:"未知错误"))}finally{i.value=false}};let I=null;const f=()=>{I&&clearTimeout(I),v.value="",u.value&&(I=window.setTimeout(U,1e3))},T=async()=>{if(!u.value){X.warning("请输入用户 ID");return}try{await we.bindUid(u.value),X.success("配置已保存"),s("complete")}catch(m){X.error("保存失败: "+(m instanceof Error?m.message:"未知错误"))}};return he(()=>{k(),C=ms("media-luna/webui-auth/bind-request",m=>{m.uid&&(u.value=m.uid,m.code&&(v.value=m.code,b.value=m.expiresIn,X.info("收到绑定请求,请在聊天平台完成验证")))}),p=window.setInterval(async()=>{try{const m=await we.status();if(m.boundUid){if(u.value&&m.boundUid!==u.value)return;m.boundUid!==S.value&&(u.value=m.boundUid,X.success("检测到绑定成功!"),s("complete"),p&&clearInterval(p))}}catch{}},3e3)}),Ye(()=>{C&&C(),p&&clearInterval(p)}),(m,g)=>{const B=A("el-input-number"),J=A("k-button");return l(),n("div",Gv,[g[8]||(g[8]=e("h3",null,"用户绑定",-1)),g[9]||(g[9]=e("p",{class:"step-desc"}," 将 WebUI 与 Koishi 用户绑定。你可以直接配置用户 ID,也可以通过验证码进行验证绑定。 ",-1)),e("div",Kv,[o(" UID 输入 "),e("div",Wv,[g[3]||(g[3]=e("div",{class:"form-label"},"用户 ID (UID)",-1)),e("div",Zv,[r(B,{modelValue:u.value,"onUpdate:modelValue":g[0]||(g[0]=F=>u.value=F),min:1,controls:false,placeholder:"Koishi 用户 ID",class:"uid-input full-width",onInput:f},null,8,["modelValue"]),g[2]||(g[2]=e("div",{class:"field-desc"},[E(" 输入你的 Koishi "),e("code",null,"uid"),E(",不是原神的。 ")],-1))])]),o(" 验证码显示区域 "),e("div",Yv,[e("div",Xv,[e("div",Qv,[g[4]||(g[4]=e("div",{class:"code-label"},"验证码",-1)),e("div",ep,$(v.value),1),e("div",tp,"有效期 "+$(b.value)+" 秒",1)]),g[5]||(g[5]=e("div",{class:"verify-guide"},[e("p",null,"请在聊天平台向机器人发送以下指令完成绑定:"),e("div",{class:"command-box"},[e("code",null,"bindui")]),e("p",{class:"small-hint"},"发送指令后,请根据提示输入左侧的验证码。")],-1))])])]),e("div",sp,[r(J,{onClick:g[1]||(g[1]=F=>m.$emit("skip"))},{default:V(()=>[...g[6]||(g[6]=[E("跳过",-1)])]),_:1}),r(J,{type:"primary",loading:t.saving,onClick:T},{default:V(()=>[...g[7]||(g[7]=[E(" 保存 / 完成 ",-1)])]),_:1},8,["loading"])])])}}}),ap=ce(lp,[["__scopeId","data-v-59078dbb"]]),np={class:"setup-wizard"},op={class:"wizard-container"},ip={class:"steps-indicator"},rp={class:"step-number"},dp={key:1},up={class:"step-label"},cp={class:"wizard-content"},vp={key:"complete",class:"step-complete"},pp={class:"complete-icon"},mp=oe({__name:"SetupWizard",emits:["complete"],setup(t,{emit:a}){const s=a,u=[{id:"storage",label:"存储配置"},{id:"auth",label:"用户绑定"},{id:"complete",label:"完成"}],i=w(0),v=w(false),b=w({}),S=async()=>{v.value=true;try{await we.updateStorageConfig(b.value),X.success("存储配置已保存"),i.value=1}catch(U){X.error("保存失败: "+(U instanceof Error?U.message:"未知错误"))}finally{v.value=false}},C=()=>{i.value=2},p=()=>{i.value=2},k=async()=>{try{await we.complete(),s("complete")}catch{s("complete")}};return(U,I)=>{const f=A("k-icon"),T=A("k-button");return l(),n("div",np,[e("div",op,[o(" 头部 "),I[4]||(I[4]=e("div",{class:"wizard-header"},[e("h1",null,"欢迎使用 Media Luna"),e("p",null,"在开始使用前,请完成以下基础配置")],-1)),o(" 步骤指示器 "),e("div",ip,[(l(),n(D,null,ee(u,(m,g)=>e("div",{key:m.id,class:te(["step-item",{active:i.value===g,completed:i.value>g}])},[e("div",rp,[i.value>g?(l(),se(f,{key:0,name:"check"})):(l(),n("span",dp,$(g+1),1))]),e("span",up,$(m.label),1)],2)),64))]),o(" 步骤内容 "),e("div",cp,[r(Ze,{name:"fade",mode:"out-in"},{default:V(()=>[i.value===0?(l(),se(Jv,{key:"storage",modelValue:b.value,"onUpdate:modelValue":I[0]||(I[0]=m=>b.value=m),saving:v.value,onNext:S},null,8,["modelValue","saving"])):i.value===1?(l(),se(ap,{key:"auth",saving:v.value,onComplete:C,onSkip:p},null,8,["saving"])):i.value===2?(l(),n("div",vp,[e("div",pp,[r(f,{name:"check-circle"})]),I[2]||(I[2]=e("h2",null,"配置完成",-1)),I[3]||(I[3]=e("p",null,"您已完成 Media Luna 的初始设置,现在可以开始使用了。",-1)),r(T,{type:"primary",size:"large",onClick:k},{default:V(()=>[...I[1]||(I[1]=[E(" 开始使用 ",-1)])]),_:1})])):o("v-if",true)]),_:1})])])])}}}),fp=ce(mp,[["__scopeId","data-v-3931ca56"]]),gp={class:"top-nav"},_p={class:"nav-container"},yp={class:"nav-tabs",role:"tablist"},hp=["onClick","aria-selected"],bp={class:"main-content"},kp=oe({__name:"index",setup(t){const a=w("generate"),s=w(false),u=async()=>{try{const U=await we.status();s.value=U.needsSetup}catch(U){console.error("Failed to check setup status:",U),s.value=false}},i=()=>{s.value=false},v=G(()=>{switch(a.value){case"generate":return Dt;case"channels":return ti;case"presets":return Zi;case"tasks":return Ud;case"settings":return Mv;default:return Dt}}),b=U=>()=>yt("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[yt("path",{d:U})]),S=[{id:"generate",label:"生成",icon:b("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:b("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:b("M17 3H7c-1.1 0-2 .9-2 2v16l7-3 7 3V5c0-1.1-.9-2-2-2z")},{id:"tasks",label:"任务",icon:b("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:b("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 C="";function p(){const U=document.querySelector(".layout-header");U&&(C=U.style.display,U.style.display="none")}function k(){const U=document.querySelector(".layout-header");U&&(U.style.display=C||"")}return he(()=>{p(),u()}),vs(k),(U,I)=>{const f=A("k-layout");return l(),se(f,{class:"app-layout media-luna-app"},{default:V(()=>[o(" 设置向导 "),s.value?(l(),se(fp,{key:0,onComplete:i})):(l(),n(D,{key:1},[o(" 主界面 "),e("div",gp,[e("div",_p,[I[0]||(I[0]=e("div",{class:"logo-area"},[e("span",{class:"logo-text"},"MEDIA LUNA")],-1)),e("div",yp,[(l(),n(D,null,ee(S,T=>e("div",{key:T.id,class:te(["nav-tab",{active:a.value===T.id}]),onClick:m=>a.value=T.id,role:"tab","aria-selected":a.value===T.id},[(l(),se(lt(T.icon),{class:"tab-icon"})),e("span",null,$(T.label),1)],10,hp)),64))])])]),e("div",bp,[(l(),se(ps,null,[(l(),se(lt(v.value)))],1024))])],64))]),_:1})}}}),$p=ce(kp,[["__scopeId","data-v-c4fa9f13"]]),xp=t=>{t.page({name:"Media Luna",path:"/media-luna",component:$p,order:500})};export{xp as default};