koishi-plugin-media-luna 0.0.4 → 0.0.5

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