koishi-plugin-media-luna 0.0.4 → 0.0.6

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