coding-tool-x 3.3.5 → 3.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/web/assets/{Analytics-B6CWdkhx.js → Analytics-TtaduRqL.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-BW6LEgd8.js → ConfigTemplates-BP2lLBMN.js} +1 -1
- package/dist/web/assets/{Home-B2B2gS2-.js → Home-CbbyopS-.js} +1 -1
- package/dist/web/assets/{PluginManager-Bqc7ldY-.js → PluginManager-HmISlyMK.js} +1 -1
- package/dist/web/assets/{ProjectList-BFdZZm_8.js → ProjectList-DoN8Hjbu.js} +1 -1
- package/dist/web/assets/{SessionList-B_Tp37kM.js → SessionList-Da8BYzNi.js} +1 -1
- package/dist/web/assets/{SkillManager-ul2rcS3o.js → SkillManager-DqLAXh9o.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-Dp5Jvdtu.js → WorkspaceManager-B_TxOgPW.js} +1 -1
- package/dist/web/assets/{index-CSBDZxYn.js → index-By3mDEvx.js} +2 -2
- package/dist/web/assets/{index-DxRneGyu.css → index-CsWInMQV.css} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/src/commands/update.js +21 -6
- package/src/server/api/config-export.js +21 -2
- package/src/server/services/config-export-service.js +89 -22
- package/src/server/services/mcp-client.js +101 -14
- package/src/server/services/mcp-service.js +91 -4
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ProjectList-
|
|
2
|
-
import{U as e,V as a,r as l,c as t,o as n,a as s,W as o,s as i,X as r,Y as u,N as c,L as d,Z as p,_ as v,F as m,$ as f,a0 as g,p as y,G as h,h as b,f as w,a1 as k,k as _,w as x,K as C,a2 as U,y as S,a3 as z,R as I,a4 as T,v as P,a5 as M,x as $,t as j,a6 as O,i as A,J as L,a7 as E,a8 as D,b as N,M as F,a9 as R}from"./vue-vendor-DET08QYg.js";import{a as B,d as H}from"./vendors-DMjSfzlv.js";import{N as q,B as K,a as G,b as W,c as V,d as J,e as Z,f as Y,l as X,g as Q,h as ee,i as ae,j as le,k as te,m as ne,n as se,o as oe,p as ie,q as re,r as ue,s as ce,t as de,u as pe,v as ve,w as me,x as fe,y as ge,z as ye,A as he,C as be,D as we,E as ke,F as _e,G as xe,H as Ce,I as Ue,J as Se,K as ze,L as Ie,M as Te,O as Pe,P as Me,S as $e,Q as je,R as Oe,T as Ae,U as Le,V as Ee,W as De,X as Ne,Y as Fe}from"./naive-ui-CxpuzdjU.js";import{C as Re,S as Be,a as He,b as qe,c as Ke,O as Ge,A as We,d as Ve,T as Je,e as Ze,f as Ye,E as Xe,g as Qe,h as ea,P as aa,i as la,j as ta,G as na,k as sa,D as oa,l as ia,m as ra,n as ua,o as ca,p as da,q as pa,r as va,s as ma,I as fa,t as ga,u as ya,v as ha,w as ba,x as wa,N as ka,y as _a,z as xa,B as Ca,F as Ua,M as Sa,H as za,W as Ia,J as Ta,K as Pa,L as Ma,Q as $a,R as ja,U as Oa,V as Aa,X as La,Y as Ea,Z as Da,_ as Na,$ as Fa,a0 as Ra,a1 as Ba,a2 as Ha,a3 as qa,a4 as Ka,a5 as Ga,a6 as Wa,a7 as Va,a8 as Ja,a9 as Za,aa as Ya,ab as Xa,ac as Qa,ad as el,ae as al,af as ll,ag as tl,ah as nl,ai as sl,aj as ol,ak as il,al as rl,am as ul,an as cl,ao as dl,ap as pl,aq as vl}from"./icons-B29onFfZ.js";import{H as ml,j as fl,p as gl,b as yl,d as hl,t as bl,e as wl,x as kl,f as _l,M as xl}from"./markdown-C9MYpaSi.js";!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))a(e);new MutationObserver(e=>{for(const l of e)if("childList"===l.type)for(const e of l.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&a(e)}).observe(document,{childList:!0,subtree:!0})}function a(e){if(e.ep)return;e.ep=!0;const a=function(e){const a={};return e.integrity&&(a.integrity=e.integrity),e.referrerPolicy&&(a.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?a.credentials="include":"anonymous"===e.crossOrigin?a.credentials="omit":a.credentials="same-origin",a}(e);fetch(e.href,a)}}();const Cl={},Ul=function(e,a,l){let t=Promise.resolve();if(a&&a.length>0){document.getElementsByTagName("link");const e=document.querySelector("meta[property=csp-nonce]"),l=(null==e?void 0:e.nonce)||(null==e?void 0:e.getAttribute("nonce"));t=Promise.allSettled(a.map(e=>{if((e=function(e){return"/"+e}(e))in Cl)return;Cl[e]=!0;const a=e.endsWith(".css"),t=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${t}`))return;const n=document.createElement("link");return n.rel=a?"stylesheet":"modulepreload",a||(n.as="script"),n.crossOrigin="",n.href=e,l&&n.setAttribute("nonce",l),document.head.appendChild(n),a?new Promise((a,l)=>{n.addEventListener("load",a),n.addEventListener("error",()=>l(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function n(e){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=e,window.dispatchEvent(a),!a.defaultPrevented)throw e}return t.then(a=>{for(const e of a||[])"rejected"===e.status&&n(e.reason);return e().catch(n)})},Sl=()=>Ul(()=>import("./ProjectList-BFdZZm_8.js"),__vite__mapDeps([0,1,2,3,4,5,6,7])),zl=()=>Ul(()=>import("./SessionList-B_Tp37kM.js"),__vite__mapDeps([8,1,2,3,4,5,6,9])),Il=[{path:"/",name:"home",component:()=>Ul(()=>import("./Home-B2B2gS2-.js"),__vite__mapDeps([10,4,2,3,1,5,6,11]))},{path:"/claude",name:"claude-projects",component:Sl,meta:{channel:"claude"}},{path:"/claude/sessions/:projectName",name:"claude-sessions",component:zl,props:!0,meta:{channel:"claude"}},{path:"/codex",name:"codex-projects",component:Sl,meta:{channel:"codex"}},{path:"/codex/sessions/:projectName",name:"codex-sessions",component:zl,props:!0,meta:{channel:"codex"}},{path:"/gemini",name:"gemini-projects",component:Sl,meta:{channel:"gemini"}},{path:"/gemini/sessions/:projectName",name:"gemini-sessions",component:zl,props:!0,meta:{channel:"gemini"}},{path:"/opencode",name:"opencode-projects",component:Sl,meta:{channel:"opencode"}},{path:"/opencode/sessions/:projectName",name:"opencode-sessions",component:zl,props:!0,meta:{channel:"opencode"}},{path:"/workspaces",name:"workspaces",component:()=>Ul(()=>import("./WorkspaceManager-Dp5Jvdtu.js"),__vite__mapDeps([12,1,2,3,6,4,5,13]))},{path:"/config-templates",name:"config-templates",component:()=>Ul(()=>import("./ConfigTemplates-BW6LEgd8.js"),__vite__mapDeps([14,1,2,3,6,4,5,15]))},{path:"/skills",name:"skills",component:()=>Ul(()=>import("./SkillManager-ul2rcS3o.js"),__vite__mapDeps([16,1,2,3,6,4,5,17]))},{path:"/plugins",name:"plugins",component:()=>Ul(()=>import("./PluginManager-Bqc7ldY-.js"),__vite__mapDeps([18,1,2,3,6,4,5,19]))},{path:"/analytics",name:"analytics",component:()=>Ul(()=>import("./Analytics-B6CWdkhx.js"),__vite__mapDeps([20,1,2,3,6,5,4,21]))},{path:"/:pathMatch(.*)*",redirect:"/"}],Tl=e({history:a(),routes:Il}),Pl=(e,a)=>{const l=e.__vccOpts||e;for(const[t,n]of a)l[t]=n;return l},Ml={class:"channel-header"},$l={class:"channel-title"},jl={class:"channel-name"},Ol={class:"channel-actions"},Al={class:"test-result-header"},Ll={class:"test-result-status"},El={class:"test-result-info"},Dl={key:0,class:"latency"},Nl={key:1,class:"status-code"},Fl={key:0,class:"test-result-error"},Rl={class:"channel-info"},Bl={class:"info-main"},Hl={class:"info-footer"},ql={class:"channel-meta"},Kl={class:"meta-item"},Gl={class:"meta-value"},Wl={class:"meta-item"},Vl=Pl({__name:"ChannelCard",props:{channel:{type:Object,required:!0},collapsed:{type:Boolean,default:!1},headerTags:{type:Array,default:()=>[]},infoRows:{type:Array,default:()=>[]},meta:{type:Object,default:()=>({weight:1,concurrencyText:"不限",concurrencyActive:!1})},showApplyButton:{type:Boolean,default:!1},channelType:{type:String,default:"claude"},testFn:{type:Function,default:null},toggling:{type:Boolean,default:!1}},emits:["toggle-collapse","apply","edit","delete","toggle-enabled","open-website"],setup(e){const a=e,b=l(!1),w=l(null);async function k(){if(a.testFn){b.value=!0,w.value=null;try{const e=await a.testFn(a.channel.id,2e4);w.value=e}catch(e){w.value={success:!1,error:e.message||"测试失败",latency:null,statusCode:null}}finally{b.value=!1}}}return(a,l)=>{var _,x;return n(),t("div",{class:d(["channel-card",{collapsed:e.collapsed,disabled:!1===e.channel.enabled,"status-frozen":"frozen"===(null==(_=e.channel.health)?void 0:_.status),"status-checking":"checking"===(null==(x=e.channel.health)?void 0:x.status)}])},[s("div",Ml,[s("div",$l,[r(c(K),{text:"",size:"tiny",class:"collapse-btn",onClick:l[0]||(l[0]=p(e=>a.$emit("toggle-collapse"),["stop"]))},{default:u(()=>[r(c(q),{size:"16",class:d({collapsed:e.collapsed})},{default:u(()=>[r(c(Re))]),_:1},8,["class"])]),_:1}),s("span",jl,v(e.channel.name),1),(n(!0),t(m,null,f(e.headerTags,e=>(n(),g(c(G),{key:e.text,size:"tiny",type:e.type||"default",bordered:!1},{default:u(()=>[y(v(e.text),1)]),_:2},1032,["type"]))),128))]),s("div",Ol,[e.showApplyButton?(n(),g(c(K),{key:0,size:"tiny",type:"primary",class:"apply-btn",onClick:l[1]||(l[1]=e=>a.$emit("apply"))},{default:u(()=>[...l[7]||(l[7]=[y(" 写入配置 ",-1)])]),_:1})):o("",!0),r(c(K),{size:"tiny",loading:b.value,onClick:k},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Be))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 测速 ",-1))]),_:1},8,["loading"]),r(c(K),{size:"tiny",onClick:l[2]||(l[2]=e=>a.$emit("edit"))},{default:u(()=>[...l[9]||(l[9]=[y(" 编辑 ",-1)])]),_:1}),r(c(K),{size:"tiny",type:"error",onClick:l[3]||(l[3]=e=>a.$emit("delete"))},{default:u(()=>[...l[10]||(l[10]=[y(" 删除 ",-1)])]),_:1}),r(c(W),{size:"small",value:!1!==e.channel.enabled,loading:e.toggling,disabled:e.toggling,"onUpdate:value":l[4]||(l[4]=e=>a.$emit("toggle-enabled",e))},null,8,["value","loading","disabled"])])]),w.value?(n(),t("div",{key:0,class:d(["test-result",w.value.success?"success":"failed"])},[s("div",Al,[s("span",Ll,[w.value.success?(n(),g(c(q),{key:0,color:"#18a058"},{default:u(()=>[r(c(He))]),_:1})):(n(),g(c(q),{key:1,color:"#f56c6c"},{default:u(()=>[r(c(qe))]),_:1})),y(" "+v(w.value.success?"测试成功":"测试失败"),1)]),s("div",El,[w.value.latency?(n(),t("span",Dl,v(w.value.latency)+"ms",1)):o("",!0),w.value.statusCode?(n(),t("span",Nl,"HTTP "+v(w.value.statusCode),1)):o("",!0)]),r(c(K),{text:"",size:"tiny",onClick:l[5]||(l[5]=e=>w.value=null)},{default:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ke))]),_:1})]),_:1})]),w.value.error?(n(),t("div",Fl,v(w.value.error),1)):o("",!0)],2)):o("",!0),i(s("div",Rl,[s("div",Bl,[(n(!0),t(m,null,f(e.infoRows,e=>(n(),t("div",{key:e.label,class:"info-row"},[r(c(V),{depth:"3",class:"label"},{default:u(()=>[y(v(e.label)+":",1)]),_:2},1024),r(c(V),{depth:"2",class:d(["value",{mono:e.mono}])},{default:u(()=>[y(v(e.value||"—"),1)]),_:2},1032,["class"]),"function"==typeof e.action?(n(),g(c(K),{key:0,size:"tiny",text:"",type:"primary",onClick:a=>e.action()},{default:u(()=>[y(v(e.actionLabel||"操作"),1)]),_:2},1032,["onClick"])):o("",!0)]))),128))]),s("div",Hl,[e.channel.websiteUrl?(n(),g(c(K),{key:0,text:"",size:"tiny",onClick:l[6]||(l[6]=l=>a.$emit("open-website",e.channel.websiteUrl))},{icon:u(()=>[r(c(q),{size:"14"},{default:u(()=>[r(c(Ge))]),_:1})]),default:u(()=>[l[11]||(l[11]=y(" 前往官网 ",-1))]),_:1})):o("",!0),l[14]||(l[14]=s("div",{class:"footer-spacer"},null,-1)),s("div",ql,[s("span",Kl,[l[12]||(l[12]=y(" 权重: ",-1)),s("span",Gl,v(e.meta.weight),1)]),s("span",Wl,[l[13]||(l[13]=y(" 并发: ",-1)),s("span",{class:d(["meta-value",{"meta-active":e.meta.concurrencyActive}])},v(e.meta.concurrencyText),3)])])])],512),[[h,!e.collapsed]])],2)}}},[["__scopeId","data-v-f2dad3b2"]]),Jl=l(null),Zl=l(null),Yl=l(!1),Xl={claude:["claude-opus-4-6","claude-sonnet-4-6","claude-opus-4-5-20251101","claude-sonnet-4-5-20250929","claude-haiku-4-5-20251001"],codex:["gpt-5.3-codex","gpt-5.2-codex","gpt-5.1-codex-max","gpt-5.1-codex","gpt-5.1-codex-mini","gpt-5-codex","gpt-5.2","gpt-5.1","gpt-5"],gemini:["gemini-3.1-pro","gemini-3-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite"]};function Ql(e=[]){const a=new Set,l=[];return e.forEach(e=>{if("string"!=typeof e)return;const t=e.trim();if(!t)return;const n=t.toLowerCase();a.has(n)||(a.add(n),l.push(t))}),l}function et(e){const a=String(e||"").trim().toLowerCase();return a.startsWith("claude-")?"claude":a.startsWith("gemini-")?"gemini":a.startsWith("gpt-")||a.startsWith("o1")||a.startsWith("o3")||a.startsWith("o4")?"codex":""}let at=null;async function lt(e={}){const a=!0===e.forceRefresh;return!a&&Jl.value&&Zl.value?Jl.value:at||(Yl.value=!0,at=(async()=>{try{const l=new URLSearchParams;a&&l.set("forceRefresh","true");const t=l.toString(),n=t?`/api/config/default-models?${t}`:"/api/config/default-models",s=await fetch(n);if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);const o=await s.json();Jl.value=o.defaultModels;try{const e=await fetch("/api/settings/model-settings");if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);const a=function(e){const a={claude:[],codex:[],gemini:[]};for(const[l,t]of Object.entries(e||{})){if(!t||"object"!=typeof t||!t.limit||!t.pricing)continue;const e=et(l);e&&a[e].push(l)}return{claude:Ql(a.claude),codex:Ql(a.codex),gemini:Ql(a.gemini)}}((await e.json()).models||{});Zl.value={claude:a.claude.length>0?a.claude:[...Xl.claude],codex:a.codex.length>0?a.codex:[...Xl.codex],gemini:a.gemini.length>0?a.gemini:[...Xl.gemini]}}catch(e){Zl.value={claude:[...Xl.claude],codex:[...Xl.codex],gemini:[...Xl.gemini]}}}catch(l){Jl.value=Xl,Zl.value={claude:[...Xl.claude],codex:[...Xl.codex],gemini:[...Xl.gemini]}}finally{Yl.value=!1,at=null}return Jl.value})(),at)}function tt(e){var a;return(null==(a=Jl.value)?void 0:a[e])||Xl[e]||[]}function nt(e){var a;return(null==(a=Zl.value)?void 0:a[e])||Xl[e]||[]}function st(){return{defaultModels:Jl,allModels:Zl,loading:Yl,loadDefaultModels:lt,getDefaultModels:tt,getAllModelsByToolType:nt}}const ot={class:"model-redirect-editor"},it={class:"redirect-input"},rt={class:"redirect-arrow"},ut={class:"redirect-input"},ct=Pl({__name:"ModelRedirectEditor",props:{modelValue:{type:Array,default:()=>[]},availableModels:{type:Array,default:()=>[]},channelType:{type:String,default:"claude"}},emits:["update:modelValue"],setup(e,{emit:a}){const l=e,o=a,{getDefaultModels:i,loadDefaultModels:d}=st();b(async()=>{await d()});const p=w(()=>{if(l.availableModels&&l.availableModels.length>0)return l.availableModels;return i(l.channelType).map(e=>({label:e,value:e}))});function v(e){if(!e)return p.value;const a=e.toLowerCase();return p.value.filter(e=>(e.label||e.value||"").toLowerCase().includes(a))}function g(e,a,t){const n=[...l.modelValue];n[e]={...n[e],[a]:t},o("update:modelValue",n)}function h(){o("update:modelValue",[...l.modelValue,{from:"",to:""}])}return(a,i)=>(n(),t("div",ot,[(n(!0),t(m,null,f(e.modelValue,(e,a)=>(n(),t("div",{key:a,class:"redirect-row"},[s("div",it,[r(c(J),{value:e.from,options:v(e.from),placeholder:"源模型",clearable:"","get-show":()=>!0,"onUpdate:value":e=>g(a,"from",e)},null,8,["value","options","onUpdate:value"])]),s("div",rt,[r(c(q),{size:"16",color:"#999"},{default:u(()=>[r(c(We))]),_:1})]),s("div",ut,[r(c(J),{value:e.to,options:v(e.to),placeholder:"目标模型",clearable:"","get-show":()=>!0,"onUpdate:value":e=>g(a,"to",e)},null,8,["value","options","onUpdate:value"])]),r(c(K),{quaternary:"",circle:"",size:"small",onClick:e=>function(e){const a=l.modelValue.filter((a,l)=>l!==e);o("update:modelValue",a)}(a)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ke))]),_:1})]),_:1},8,["onClick"])]))),128)),r(c(K),{dashed:"",size:"small",onClick:h,class:"add-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[i[0]||(i[0]=y(" 添加重定向规则 ",-1))]),_:1})]))}},[["__scopeId","data-v-8ebdcad0"]]),dt=B.create({baseURL:"/api",timeout:3e4});function pt(e="claude"){return"codex"===e?"/codex":"gemini"===e?"/gemini":"opencode"===e?"/opencode":""}async function vt(){return(await dt.get("/channels")).data}async function mt(e,a,l,t,n={}){const s={name:e,baseUrl:a,apiKey:l,websiteUrl:t,...n};return(await dt.post("/channels",s)).data}async function ft(e,a){return(await dt.put(`/channels/${e}`,a)).data}async function gt(e){return(await dt.delete(`/channels/${e}`)).data}async function yt(e){return(await dt.post(`/channels/${e}/apply-to-settings`)).data}async function ht(e){return(await dt.post(`/channels/${e}/reset-health`)).data}async function bt(){return(await dt.get("/codex/channels")).data}async function wt(e,a,l,t,n,s={}){return(await dt.post("/codex/channels",{name:e,providerKey:a,baseUrl:l,apiKey:t,websiteUrl:n,...s})).data}async function kt(e,a){return(await dt.put(`/codex/channels/${e}`,a)).data}async function _t(e){return(await dt.delete(`/codex/channels/${e}`)).data}async function xt(e){return(await dt.post(`/codex/channels/${e}/apply-to-settings`)).data}async function Ct(e){return(await dt.post(`/codex/channels/${e}/reset-health`)).data}async function Ut(){return(await dt.get("/gemini/channels")).data}async function St(e,a,l,t,n,s={}){return(await dt.post("/gemini/channels",{name:e,baseUrl:a,apiKey:l,model:t,websiteUrl:n,...s})).data}async function zt(e,a){return(await dt.put(`/gemini/channels/${e}`,a)).data}async function It(e){return(await dt.delete(`/gemini/channels/${e}`)).data}async function Tt(e){return(await dt.post(`/gemini/channels/${e}/reset-health`)).data}async function Pt(e,a=2e4){return(await dt.post(`/channels/${e}/speed-test`,{timeout:a})).data}async function Mt(e,a="claude"){const l=a?{params:{type:a}}:void 0;return(await dt.get(`/channels/${e}/models`,l)).data}async function $t(e=2e4){return(await dt.post("/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function jt(e,a=2e4){return(await dt.post(`/codex/channels/${e}/speed-test`,{timeout:a})).data}async function Ot(e=2e4){return(await dt.post("/codex/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function At(e,a=2e4){return(await dt.post(`/gemini/channels/${e}/speed-test`,{timeout:a})).data}async function Lt(e=2e4){return(await dt.post("/gemini/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function Et(e){return(await dt.get(`/codex/channels/${e}/models`)).data}async function Dt(e){return(await dt.get(`/gemini/channels/${e}/models`)).data}async function Nt(){return(await dt.get("/opencode/channels")).data}async function Ft(e,a,l,t={}){return(await dt.post("/opencode/channels",{name:e,baseUrl:a,apiKey:l,wireApi:t.wireApi||"openai",gatewaySourceType:t.gatewaySourceType||"codex",enabled:!1!==t.enabled,weight:t.weight||1,maxConcurrency:t.maxConcurrency||null,model:t.model||null,modelRedirects:t.modelRedirects||[],speedTestModel:t.speedTestModel||null,presetId:t.presetId||null,websiteUrl:t.websiteUrl||""})).data}async function Rt(e,a){return(await dt.put(`/opencode/channels/${e}`,a)).data}async function Bt(e){return(await dt.delete(`/opencode/channels/${e}`)).data}async function Ht(e){return(await dt.post(`/opencode/channels/${e}/reset-health`)).data}async function qt(e,a=2e4){return(await dt.post(`/opencode/channels/${e}/speed-test`,{timeout:a})).data}async function Kt(e,{forceRefresh:a=!1}={}){return(await dt.get(`/opencode/channels/${e}/models`,{params:a?{forceRefresh:"true"}:{}})).data}async function Gt({baseUrl:e,apiKey:a,gatewaySourceType:l}){return(await dt.post("/opencode/channels/probe-models",{baseUrl:e,apiKey:a,gatewaySourceType:l})).data}dt.interceptors.response.use(e=>e,e=>{if(e.response&&e.response.data){const a=e.response.data,l=new Error(a.message||e.message);return l.response=e.response,l.status=e.response.status,l.data=a,Promise.reject(l)}return Promise.reject(e)});const Wt=Object.freeze(Object.defineProperty({__proto__:null,applyChannelToSettings:yt,applyCodexChannelToSettings:xt,createChannel:mt,createCodexChannel:wt,createGeminiChannel:St,createOpenCodeChannel:Ft,deleteChannel:gt,deleteCodexChannel:_t,deleteGeminiChannel:It,deleteOpenCodeChannel:Bt,fetchChannelModels:Mt,fetchCodexChannelModels:Et,fetchGeminiChannelModels:Dt,fetchOpenCodeChannelModels:Kt,getBestChannelForRestore:async function(){return(await dt.get("/channels/best-for-restore")).data},getChannelPoolStatus:async function(){return(await dt.get("/channels/pool/status")).data},getChannels:vt,getCodexChannels:bt,getCurrentChannel:async function(){return(await dt.get("/channels/current")).data},getEnabledCodexChannels:async function(){return(await dt.get("/codex/channels/enabled")).data},getEnabledGeminiChannels:async function(){return(await dt.get("/gemini/channels/enabled")).data},getEnabledOpenCodeChannels:async function(){return{channels:((await Nt()).channels||[]).filter(e=>!1!==e.enabled)}},getGeminiChannels:Ut,getOpenCodeChannels:Nt,getOpenCodeProxyStatus:async function(){return(await dt.get("/opencode/proxy/status")).data},probeOpenCodeChannelModels:Gt,resetChannelHealth:ht,resetCodexChannelHealth:Ct,resetGeminiChannelHealth:Tt,resetOpenCodeChannelHealth:Ht,saveChannelOrder:async function(e){return(await dt.post("/channels/order",{order:e})).data},saveCodexChannelOrder:async function(e){return(await dt.post("/codex/channels/order",{order:e})).data},saveGeminiChannelOrder:async function(e){return(await dt.post("/gemini/channels/order",{order:e})).data},saveOpenCodeChannelOrder:async function(e){return(await dt.post("/opencode/channels/order",{order:e})).data},startOpenCodeProxy:async function(){return(await dt.post("/opencode/proxy/start")).data},stopOpenCodeProxy:async function(){return(await dt.post("/opencode/proxy/stop")).data},testAllClaudeChannelsSpeed:$t,testAllCodexChannelsSpeed:Ot,testAllGeminiChannelsSpeed:Lt,testAllOpenCodeChannelsSpeed:async function(e=2e4){return(await dt.post("/opencode/channels/speed-test-all",{timeout:e},{timeout:12e4})).data},testClaudeChannelSpeed:Pt,testCodexChannelSpeed:jt,testGeminiChannelSpeed:At,testOpenCodeChannelSpeed:qt,updateChannel:ft,updateCodexChannel:kt,updateGeminiChannel:zt,updateOpenCodeChannel:Rt},Symbol.toStringTag,{value:"Module"})),Vt=[{id:"official",name:"Claude 官方",category:"official",websiteUrl:"https://www.anthropic.com",baseUrl:"https://api.anthropic.com",env:{}},{id:"deepseek",name:"DeepSeek",category:"cn_official",websiteUrl:"https://platform.deepseek.com",baseUrl:"https://api.deepseek.com/anthropic",env:{ANTHROPIC_MODEL:"DeepSeek-V3.2-Exp",ANTHROPIC_DEFAULT_HAIKU_MODEL:"DeepSeek-V3.2-Exp",ANTHROPIC_DEFAULT_SONNET_MODEL:"DeepSeek-V3.2-Exp",ANTHROPIC_DEFAULT_OPUS_MODEL:"DeepSeek-V3.2-Exp"}},{id:"zhipu",name:"智谱 GLM",category:"cn_official",websiteUrl:"https://open.bigmodel.cn",baseUrl:"https://open.bigmodel.cn/api/anthropic",env:{ANTHROPIC_MODEL:"glm-4.6",ANTHROPIC_DEFAULT_HAIKU_MODEL:"glm-4.5-air",ANTHROPIC_DEFAULT_SONNET_MODEL:"glm-4.6",ANTHROPIC_DEFAULT_OPUS_MODEL:"glm-4.6"}},{id:"kimi",name:"Kimi K2",category:"cn_official",websiteUrl:"https://platform.moonshot.cn",baseUrl:"https://api.moonshot.cn/anthropic",env:{ANTHROPIC_MODEL:"kimi-k2-thinking",ANTHROPIC_DEFAULT_HAIKU_MODEL:"kimi-k2-thinking",ANTHROPIC_DEFAULT_SONNET_MODEL:"kimi-k2-thinking",ANTHROPIC_DEFAULT_OPUS_MODEL:"kimi-k2-thinking"}},{id:"minimax",name:"MiniMax",category:"cn_official",websiteUrl:"https://platform.minimaxi.com",baseUrl:"https://api.minimaxi.com/anthropic",env:{ANTHROPIC_MODEL:"MiniMax-M2",ANTHROPIC_DEFAULT_HAIKU_MODEL:"MiniMax-M2",ANTHROPIC_DEFAULT_SONNET_MODEL:"MiniMax-M2",ANTHROPIC_DEFAULT_OPUS_MODEL:"MiniMax-M2"}},{id:"qwen",name:"通义千问",category:"cn_official",websiteUrl:"https://bailian.console.aliyun.com",baseUrl:"https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy",env:{ANTHROPIC_MODEL:"qwen3-max",ANTHROPIC_DEFAULT_HAIKU_MODEL:"qwen3-max",ANTHROPIC_DEFAULT_SONNET_MODEL:"qwen3-max",ANTHROPIC_DEFAULT_OPUS_MODEL:"qwen3-max"}},{id:"doubao",name:"豆包 Seed",category:"cn_official",websiteUrl:"https://www.volcengine.com/product/doubao",baseUrl:"https://ark.cn-beijing.volces.com/api/coding",env:{ANTHROPIC_MODEL:"doubao-seed-code-preview-latest",ANTHROPIC_DEFAULT_HAIKU_MODEL:"doubao-seed-code-preview-latest",ANTHROPIC_DEFAULT_SONNET_MODEL:"doubao-seed-code-preview-latest",ANTHROPIC_DEFAULT_OPUS_MODEL:"doubao-seed-code-preview-latest"}},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:"",env:{}}],Jt={official:"官方",cn_official:"国内官方",aggregator:"聚合服务",third_party:"第三方",custom:"自定义"};function Zt(e){return Vt.find(a=>a.id===e)}const Yt=[{id:"openai",name:"OpenAI",category:"official",websiteUrl:"https://platform.openai.com",baseUrl:"https://api.openai.com/v1",providerKey:"openai"},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:"",providerKey:""}],Xt={official:"官方",custom:"自定义"};function Qt(e){return Yt.find(a=>a.id===e)}const en=[{id:"google",name:"Google AI",category:"official",websiteUrl:"https://ai.google.dev",baseUrl:"https://generativelanguage.googleapis.com/v1beta"},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:""}],an={official:"官方",custom:"自定义"};function ln(e){return en.find(a=>a.id===e)}const tn=[{id:"openrouter",name:"OpenRouter",category:"apikey",description:"统一接口访问 200+ 模型",websiteUrl:"https://openrouter.ai",baseUrl:"https://openrouter.ai/api/v1",wireApi:"openai",models:["anthropic/claude-3.5-sonnet","openai/gpt-4o","meta-llama/llama-3.1-405b"]},{id:"openai_api",name:"OpenAI API",category:"apikey",description:"OpenAI 官方 API(需要 API Key)",websiteUrl:"https://platform.openai.com",baseUrl:"https://api.openai.com/v1",wireApi:"openai",models:["gpt-4o","gpt-4o-mini","o1","o1-mini","gpt-4-turbo"]},{id:"anthropic_api",name:"Anthropic API",category:"apikey",description:"Anthropic 官方 API(需要 API Key)",websiteUrl:"https://console.anthropic.com",baseUrl:"https://api.anthropic.com/v1",wireApi:"anthropic",models:["claude-3-5-sonnet","claude-3-opus","claude-3-haiku"]},{id:"deepseek",name:"DeepSeek",category:"apikey",description:"DeepSeek AI 模型",websiteUrl:"https://platform.deepseek.com",baseUrl:"https://api.deepseek.com/v1",wireApi:"openai",models:["deepseek-chat","deepseek-coder"]},{id:"groq",name:"Groq",category:"apikey",description:"超快推理速度",websiteUrl:"https://console.groq.com",baseUrl:"https://api.groq.com/openai/v1",wireApi:"openai",models:["llama-3.1-70b-versatile","llama-3.1-8b-instant","mixtral-8x7b-32768"]},{id:"together",name:"Together AI",category:"apikey",description:"开源模型托管",websiteUrl:"https://www.together.ai",baseUrl:"https://api.together.xyz/v1",wireApi:"openai",models:["meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo","mistralai/Mixtral-8x7B-Instruct-v0.1"]},{id:"entry_claude",name:"Claude Code 入口",category:"entry",description:"渠道按 Claude Code 请求入口管理",websiteUrl:"",baseUrl:"",wireApi:"openai",gatewaySourceType:"claude",models:[]},{id:"entry_codex",name:"Codex 入口",category:"entry",description:"渠道按 Codex 请求入口管理",websiteUrl:"",baseUrl:"",wireApi:"openai",gatewaySourceType:"codex",models:[]},{id:"entry_gemini",name:"Gemini 入口",category:"entry",description:"渠道按 Gemini 请求入口管理",websiteUrl:"",baseUrl:"",wireApi:"openai",gatewaySourceType:"gemini",models:[]},{id:"custom",name:"自定义",category:"custom",description:"自定义 OpenAI 兼容的 API 端点",websiteUrl:"",baseUrl:"",wireApi:"openai",models:[]}],nn={apikey:"API Key",entry:"转换入口",custom:"自定义"};function sn(e){return tn.find(a=>a.id===e)}const{getAllModelsByToolType:on,loadDefaultModels:rn}=st(),un=/^https?:\/\//i,cn=/^[a-z0-9_]+$/i;function dn(e){const a=Number(e);return!Number.isFinite(a)||a<=0?null:Math.round(a)}function pn(e){const a=Number(e);return!Number.isFinite(a)||a<1?1:Math.min(100,Math.round(a))}function vn(e,a,{required:l}={}){if(!a)return l?`${e}不能为空`:"";if(!un.test(a))return`${e}必须以 http:// 或 https:// 开头`;try{new URL(a)}catch(t){return`${e}不是合法的链接`}return""}function mn(e){return e?cn.test(e)?"":"只能包含字母、数字和下划线,例如 openai":"Provider Key 不能为空"}function fn(e){return{apiKey:e.apiKey||""}}function gn(e){return{...e}}function yn(e){const a=String(e||"").trim().toLowerCase();return"claude"===a?"Claude Code":"gemini"===a?"Gemini":"Codex"}function hn(e=[]){return e.map(e=>({label:e,value:e}))}function bn(...e){const a=new Set,l=[];for(const t of e)for(const e of t||[]){const t=String((null==e?void 0:e.value)||"").trim();if(!t)continue;const n=t.toLowerCase();a.has(n)||(a.add(n),l.push({label:(null==e?void 0:e.label)||t,value:t}))}return l}function wn(e){return hn(on(e))}const kn={schedule:[{key:"maxConcurrency",label:"最大并发",type:"number",placeholder:"留空表示不限",clearable:!0,validate:e=>{if(null==e||""===e)return"";const a=Number(e);return!Number.isFinite(a)||a<=0?"并发需为大于 0 的数字":a>100?"并发最多 100":""}},{key:"weight",label:"调度权重",type:"number",placeholder:"默认 1",min:1,max:100,validate:e=>{const a=Number(e);return!Number.isFinite(a)||a<1?"调度权重至少为 1":""}},{key:"enabled",label:"渠道状态",type:"switch",checkedText:"启用",uncheckedText:"停用"}]},_n={claude:()=>({type:"claude",displayName:"Claude",schedulerSource:"claude",storageKeys:{localCollapse:"claudeChannelCollapse",collapseConfigKey:"claude",orderConfigKey:"claude"},emptyDescription:"暂无渠道",showEmptyAction:!1,emptyActionText:"",modalWidth:520,formLabelWidth:95,showApplyButton:!0,presets:Vt,presetCategories:Jt,getPresetById:Zt,formSections:[{title:"供应商预设",fields:[{key:"presetId",label:"选择预设",type:"preset",placeholder:"选择供应商预设"}]},{title:"基本信息",fields:[{key:"name",label:"渠道名称",type:"text",required:!0,placeholder:"输入渠道名称"},{key:"baseUrl",label:"接口地址",type:"text",required:!0,placeholder:"https://api.example.com",validate:e=>vn("接口地址",e,{required:!0})},{key:"apiKey",label:"接口密钥",type:"password",required:!0,placeholder:"sk-..."},{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>vn("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则自动检测)",description:"指定用于速度测试的模型,留空则使用自动检测",options:wn("claude"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,showWhen:e=>"official"===e.presetId,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"模型配置",description:"代理关闭时:模型映射(写入 settings.json);代理开启时:模型重定向(如 opus → sonnet 节省 token)",collapsible:!0,showWhen:e=>e.presetId&&"official"!==e.presetId,fields:[{key:"modelConfig.model",label:"主模型",type:"autocomplete",placeholder:"如 glm-4.6"},{key:"modelConfig.haikuModel",label:"Haiku 模型",type:"autocomplete",placeholder:"如 glm-4.5-air"},{key:"modelConfig.sonnetModel",label:"Sonnet 模型",type:"autocomplete",placeholder:"如 glm-4.6"},{key:"modelConfig.opusModel",label:"Opus 模型",type:"autocomplete",placeholder:"如 glm-4.6"}]},{title:"调度配置",fields:kn.schedule},{title:"网络代理",description:"部分渠道可能需要代理才能访问",collapsible:!0,fields:[{key:"proxyUrl",label:"代理地址",type:"text",placeholder:"http://127.0.0.1:7890(选填)"}]}],getInitialForm:()=>({presetId:"official",name:"Claude 官方",baseUrl:"https://api.anthropic.com",apiKey:"",websiteUrl:"https://www.anthropic.com",speedTestModel:"",modelConfig:{model:"",haikuModel:"",sonnetModel:"",opusModel:""},modelRedirects:[],proxyUrl:"",gatewaySourceType:"claude",maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null}),mapChannelToForm:e=>{var a,l,t,n;return{presetId:e.presetId||"official",name:e.name||"",baseUrl:e.baseUrl||"",apiKey:e.apiKey||"",websiteUrl:e.websiteUrl||"",speedTestModel:e.speedTestModel||"",modelConfig:{model:(null==(a=e.modelConfig)?void 0:a.model)||"",haikuModel:(null==(l=e.modelConfig)?void 0:l.haikuModel)||"",sonnetModel:(null==(t=e.modelConfig)?void 0:t.sonnetModel)||"",opusModel:(null==(n=e.modelConfig)?void 0:n.opusModel)||""},modelRedirects:e.modelRedirects||[],proxyUrl:e.proxyUrl||"",gatewaySourceType:e.gatewaySourceType||"claude",maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null}},onPresetChange:(e,a)=>{const l=Zt(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"claude",l.env&&(t.modelConfig={model:l.env.ANTHROPIC_MODEL||"",haikuModel:l.env.ANTHROPIC_DEFAULT_HAIKU_MODEL||"",sonnetModel:l.env.ANTHROPIC_DEFAULT_SONNET_MODEL||"",opusModel:l.env.ANTHROPIC_DEFAULT_OPUS_MODEL||""}),gn(t)},fetchModelsForChannel:async(e,a)=>{var l;if(await rn(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=wn("claude"),void(a.modelsFetching=!1);try{const l=await Mt(e,a.gatewaySourceType||null);l.models&&l.models.length>0?(a.availableModels=bn(hn(l.models),wn("claude")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表(API 端点受保护)",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=wn("claude"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(t){a.availableModels=wn("claude");const e=null==(l=t.response)?void 0:l.data;e?(a.modelsFetchError=e.error||t.message||"获取模型列表失败",a.modelsFetchErrorHint=e.errorHint||"已使用默认模型列表"):(a.modelsFetchError=t.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表")}finally{a.modelsFetching=!1}},testFn:Pt,api:{fetch:async()=>(await vt()).channels||[],create:async e=>{const a=fn(e);await mt(e.name,e.baseUrl,a.apiKey,e.websiteUrl||void 0,{maxConcurrency:dn(e.maxConcurrency),weight:pn(e.weight),enabled:e.enabled,presetId:e.presetId,modelConfig:e.modelConfig,modelRedirects:e.modelRedirects||[],proxyUrl:e.proxyUrl||"",speedTestModel:e.speedTestModel||null,gatewaySourceType:e.gatewaySourceType||"claude"})},update:async(e,a)=>{const l=fn(a);await ft(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:dn(a.maxConcurrency),weight:pn(a.weight),enabled:a.enabled,presetId:a.presetId,modelConfig:a.modelConfig,modelRedirects:a.modelRedirects||[],proxyUrl:a.proxyUrl||"",speedTestModel:a.speedTestModel||null,gatewaySourceType:a.gatewaySourceType||"claude"})},toggle:async(e,a)=>{await ft(e.id,{enabled:a})},remove:gt,applyToSettings:async e=>yt(e.id),resetHealth:async e=>ht(e.id)},getHeaderTags:(e,a)=>{var l,t;const n=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?n.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&n.push({text:"检测中",type:"warning"}),!1===e.enabled&&n.push({text:"未启用",type:"default"}),n},buildInfoRows:(e,a)=>{var l;return[{label:"URL",value:e.baseUrl},{label:"Key",value:a.maskApiKey(e.apiKey),mono:!0,action:"healthy"!==(null==(l=e.health)?void 0:l.status)?()=>a.handleResetHealth(e):null,actionLabel:"重置状态"}]}}),codex:()=>({type:"codex",displayName:"Codex",schedulerSource:"codex",storageKeys:{localCollapse:"codexChannelCollapse",collapseConfigKey:"codex",orderConfigKey:"codex"},emptyDescription:"暂无渠道",showEmptyAction:!0,emptyActionText:"添加 Codex 渠道",modalWidth:600,formLabelWidth:90,showApplyButton:!0,presets:Yt,presetCategories:Xt,getPresetById:Qt,formSections:[{title:"供应商预设",fields:[{key:"presetId",label:"选择预设",type:"preset",placeholder:"选择供应商预设"}]},{title:"基本信息",fields:[{key:"name",label:"渠道名称",type:"text",required:!0,placeholder:"显示名称"},{key:"providerKey",label:"Provider Key",type:"text",required:!0,placeholder:"英文标识,如 openai",disabledOnEdit:!0,validate:mn},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://api.example.com",validate:e=>vn("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-..."},{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>vn("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用默认)",description:"指定用于速度测试的模型,留空则使用默认模型",options:wn("codex"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:kn.schedule}],getInitialForm:()=>({presetId:"openai",name:"OpenAI",providerKey:"openai",baseUrl:"https://api.openai.com/v1",apiKey:"",websiteUrl:"https://platform.openai.com",gatewaySourceType:"codex",speedTestModel:"",modelRedirects:[],maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),mapChannelToForm:e=>({presetId:e.presetId||"custom",name:e.name||"",providerKey:e.providerKey||"",baseUrl:e.baseUrl||"",apiKey:e.apiKey||"",websiteUrl:e.websiteUrl||"",gatewaySourceType:e.gatewaySourceType||"codex",speedTestModel:e.speedTestModel||"",modelRedirects:e.modelRedirects||[],maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),onPresetChange:(e,a)=>{const l=Qt(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.providerKey=l.providerKey||"",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"codex",gn(t)},fetchModelsForChannel:async(e,a)=>{if(await rn(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=wn("codex"),void(a.modelsFetching=!1);try{const l=await Et(e);l.models&&l.models.length>0?(a.availableModels=bn(hn(l.models),wn("codex")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=wn("codex"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(l){a.availableModels=wn("codex"),a.modelsFetchError=l.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表"}finally{a.modelsFetching=!1}},testFn:jt,api:{fetch:async()=>(await bt()).channels||[],create:async e=>{const a=fn(e);await wt(e.name,e.providerKey,e.baseUrl,a.apiKey,e.websiteUrl||"",{maxConcurrency:dn(e.maxConcurrency),weight:pn(e.weight),enabled:e.enabled,modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,gatewaySourceType:e.gatewaySourceType||"codex"})},update:async(e,a)=>{const l=fn(a);await kt(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:dn(a.maxConcurrency),weight:pn(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,gatewaySourceType:a.gatewaySourceType||"codex"})},toggle:async(e,a)=>kt(e.id,{enabled:a}),remove:_t,applyToSettings:async e=>xt(e.id),resetHealth:async e=>Ct(e.id)},getHeaderTags:(e,a)=>{var l,t;const n=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?n.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&n.push({text:"检测中",type:"warning"}),!1===e.enabled&&n.push({text:"已禁用",type:"default"}),n},buildInfoRows:(e,a)=>{var l;return[{label:"Provider",value:e.providerKey,mono:!0},{label:"URL",value:e.baseUrl},{label:"Key",value:a.maskApiKey(e.apiKey),mono:!0,action:"healthy"!==(null==(l=e.health)?void 0:l.status)?()=>a.handleResetHealth(e):null,actionLabel:"重置状态"}]}}),gemini:()=>({type:"gemini",displayName:"Gemini",schedulerSource:"gemini",storageKeys:{localCollapse:"geminiChannelCollapse",collapseConfigKey:"gemini",orderConfigKey:"gemini"},emptyDescription:"暂无渠道",showEmptyAction:!0,emptyActionText:"添加 Gemini 渠道",modalWidth:520,formLabelWidth:90,showApplyButton:!1,presets:en,presetCategories:an,getPresetById:ln,formSections:[{title:"供应商预设",fields:[{key:"presetId",label:"选择预设",type:"preset",placeholder:"选择供应商预设"}]},{title:"基本信息",fields:[{key:"name",label:"渠道名称",type:"text",required:!0,placeholder:"显示名称"},{key:"model",label:"Model",type:"text",required:!0,placeholder:"例如 gemini-2.5-pro"},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://generativelanguage.googleapis.com/v1beta",validate:e=>vn("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"AIza..."},{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>vn("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用 model 字段)",description:"指定用于速度测试的模型,留空则使用上方配置的 Model",options:wn("gemini"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:kn.schedule}],getInitialForm:()=>({presetId:"google",name:"Google AI",model:"gemini-2.5-pro",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiKey:"",websiteUrl:"https://ai.google.dev",gatewaySourceType:"gemini",speedTestModel:"",modelRedirects:[],maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),mapChannelToForm:e=>({presetId:e.presetId||"custom",name:e.name||"",model:e.model||"",baseUrl:e.baseUrl||"",apiKey:e.apiKey||"",websiteUrl:e.websiteUrl||"",gatewaySourceType:e.gatewaySourceType||"gemini",speedTestModel:e.speedTestModel||"",modelRedirects:e.modelRedirects||[],maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),onPresetChange:(e,a)=>{const l=ln(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"gemini",gn(t)},fetchModelsForChannel:async(e,a)=>{if(await rn(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=wn("gemini"),void(a.modelsFetching=!1);try{const l=await Dt(e);l.models&&l.models.length>0?(a.availableModels=bn(hn(l.models),wn("gemini")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=wn("gemini"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(l){a.availableModels=wn("gemini"),a.modelsFetchError=l.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表"}finally{a.modelsFetching=!1}},testFn:At,api:{fetch:async()=>(await Ut()).channels||[],create:async e=>{const a=fn(e);await St(e.name,e.baseUrl,a.apiKey,e.model,e.websiteUrl||"",{maxConcurrency:dn(e.maxConcurrency),weight:pn(e.weight),enabled:e.enabled,modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,gatewaySourceType:e.gatewaySourceType||"gemini"})},update:async(e,a)=>{const l=fn(a);await zt(e.id,{name:a.name,model:a.model,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:dn(a.maxConcurrency),weight:pn(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,gatewaySourceType:a.gatewaySourceType||"gemini"})},toggle:async(e,a)=>zt(e.id,{enabled:a}),remove:It,resetHealth:async e=>Tt(e.id)},getHeaderTags:(e,a)=>{var l,t;const n=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?n.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&n.push({text:"检测中",type:"warning"}),!1===e.enabled&&n.push({text:"已禁用",type:"default"}),n},buildInfoRows:(e,a)=>{var l;return[{label:"Model",value:e.model,mono:!0},{label:"URL",value:e.baseUrl},{label:"Key",value:a.maskApiKey(e.apiKey),mono:!0,action:"healthy"!==(null==(l=e.health)?void 0:l.status)?()=>a.handleResetHealth(e):null,actionLabel:"重置状态"}]}}),opencode:()=>({type:"opencode",displayName:"OpenCode",schedulerSource:"opencode",storageKeys:{localCollapse:"opencodeChannelCollapse",collapseConfigKey:"opencode",orderConfigKey:"opencode"},emptyDescription:"暂无渠道",showEmptyAction:!0,emptyActionText:"添加 OpenCode 渠道",modalWidth:600,formLabelWidth:95,showApplyButton:!1,presets:tn,presetCategories:nn,getPresetById:sn,formSections:[{title:"供应商预设",fields:[{key:"presetId",label:"选择预设",type:"preset",placeholder:"选择供应商预设"}]},{title:"基本信息",fields:[{key:"name",label:"渠道名称",type:"text",required:!0,placeholder:"显示名称"},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://api.example.com/v1",validate:e=>vn("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-..."},{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>vn("官网链接",e,{required:!1})},{key:"model",label:"默认模型",type:"select",placeholder:"选择或输入默认模型(留空则由调度器决定)",options:[],clearable:!0},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用默认模型)",description:"指定用于速度测试的模型,留空则自动检测",options:[],clearable:!0},{key:"allowedModels",label:"可用模型",type:"model-multi-select",placeholder:"选择注册到 OpenCode 的模型(留空则使用检测到的所有模型)",description:"选择哪些模型注册到 opencode.json 的 provider 配置中"}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:kn.schedule}],getInitialForm:()=>({presetId:"openrouter",name:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",wireApi:"openai",apiKey:"",websiteUrl:"https://openrouter.ai",model:"",gatewaySourceType:"codex",speedTestModel:"",modelRedirects:[],allowedModels:[],maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),mapChannelToForm:e=>({presetId:e.presetId||"custom",name:e.name||"",baseUrl:e.baseUrl||"",wireApi:e.wireApi||"openai",apiKey:e.apiKey||"",websiteUrl:e.websiteUrl||"",model:e.model||"",gatewaySourceType:e.gatewaySourceType||"codex",speedTestModel:e.speedTestModel||"",modelRedirects:e.modelRedirects||[],allowedModels:e.allowedModels||[],maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),onPresetChange:(e,a)=>{const l=sn(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.wireApi=l.wireApi||"openai",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"codex",gn(t)},fetchModelsForChannel:async(e,a,{forceRefresh:l=!1}={})=>{await rn(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null;const t=a.presetId||"";if(["entry_claude","entry_codex","entry_gemini"].includes(t)){const e=a.gatewaySourceType||"codex",l="claude"===e?"claude":"gemini"===e?"gemini":"codex";return a.availableModels=wn(l),void(a.modelsFetching=!1)}if(e)try{const t=await Kt(e,{forceRefresh:l});t.models&&t.models.length>0?(a.availableModels=hn(t.models),t.fallbackUsed&&(a.modelsFetchError=t.error||"无法自动获取模型列表",a.modelsFetchErrorHint=t.errorHint||"请手动填写模型名称")):(a.availableModels=[],t.error&&(a.modelsFetchError=t.error,a.modelsFetchErrorHint=t.errorHint||"请手动填写模型名称"))}catch(n){a.availableModels=[],a.modelsFetchError=n.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}else{if(!a.baseUrl)return a.availableModels=[],void(a.modelsFetching=!1);try{const e=await Gt({baseUrl:a.baseUrl,apiKey:a.apiKey||"",gatewaySourceType:a.gatewaySourceType||"codex"});a.availableModels=e.models&&e.models.length>0?hn(e.models):[],e.error&&(a.modelsFetchError=e.error,a.modelsFetchErrorHint=e.errorHint||"请手动填写模型名称")}catch(n){a.availableModels=[],a.modelsFetchError=n.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}}},testFn:qt,api:{fetch:async()=>(await Nt()).channels||[],create:async e=>{const a=fn(e);await Ft(e.name,e.baseUrl,a.apiKey,{wireApi:e.wireApi||"openai",maxConcurrency:dn(e.maxConcurrency),weight:pn(e.weight),enabled:e.enabled,model:e.model||null,gatewaySourceType:e.gatewaySourceType||"codex",modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,websiteUrl:e.websiteUrl||"",allowedModels:e.allowedModels||[]})},update:async(e,a)=>{const l=fn(a);await Rt(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,wireApi:a.wireApi||"openai",websiteUrl:a.websiteUrl,model:a.model||null,gatewaySourceType:a.gatewaySourceType||"codex",maxConcurrency:dn(a.maxConcurrency),weight:pn(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,allowedModels:a.allowedModels||[]})},toggle:async(e,a)=>Rt(e.id,{enabled:a}),remove:Bt,resetHealth:async e=>Ht(e.id)},getHeaderTags:(e,a)=>{var l,t;const n=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?n.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&n.push({text:"检测中",type:"warning"}),!1===e.enabled&&n.push({text:"已禁用",type:"default"}),n},buildInfoRows:(e,a)=>{var l;return[{label:"入口协议",value:yn(e.gatewaySourceType),mono:!0},{label:"Wire API",value:e.wireApi||"openai",mono:!0},{label:"Provider Key",value:e.providerKey||"(未设置)",mono:!0},{label:"Model",value:e.model||"(默认)",mono:!0},{label:"URL",value:e.baseUrl},{label:"Key",value:a.maskApiKey(e.apiKey),mono:!0,action:"healthy"!==(null==(l=e.health)?void 0:l.status)?()=>a.handleResetHealth(e):null,actionLabel:"重置状态"}]}})};function xn(){return Z(["message","dialog"],{configProviderProps:{theme:"dark"===document.documentElement.getAttribute("data-theme")?Y:X}})}let Cn=xn();new MutationObserver(()=>{Cn=xn()}).observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]});const Un={success:(...e)=>Cn.message.success(...e),error:(...e)=>Cn.message.error(...e),warning:(...e)=>Cn.message.warning(...e),info:(...e)=>Cn.message.info(...e),loading:(...e)=>Cn.message.loading(...e)},Sn={success:(...e)=>Cn.dialog.success(...e),error:(...e)=>Cn.dialog.error(...e),warning:(...e)=>Cn.dialog.warning(...e),info:(...e)=>Cn.dialog.info(...e),create:(...e)=>Cn.dialog.create(...e)};async function zn(){return(await dt.get("/ui-config")).data}async function In(e){return(await dt.post("/ui-config",{config:e})).data}async function Tn(e,a){return(await dt.put(`/ui-config/${e}`,{value:a})).data}async function Pn(e,a,l){return(await dt.put(`/ui-config/${e}/${a}`,{value:l})).data}const Mn=Object.freeze(Object.defineProperty({__proto__:null,getUIConfig:zn,saveUIConfig:In,updateNestedUIConfig:Pn,updateUIConfigKey:Tn},Symbol.toStringTag,{value:"Module"})),$n="__ccAdvancedConfigBound__";let jn=null,On=0,An=!1,Ln=null;const En=Object.create(null);function Dn(){const e=new Date;return e.setHours(0,0,0,0),{start:e.getTime(),end:e.getTime()+864e5}}const Nn=k("global",()=>{const e=l({running:!1,activeChannel:null,port:20088,runtime:null,startTime:null,defaultPort:20088}),a=l({running:!1,activeChannel:null,port:20089,runtime:null,startTime:null,defaultPort:20089}),t=l({running:!1,activeChannel:null,port:20090,runtime:null,startTime:null,defaultPort:20090}),n=l({running:!1,activeChannel:null,port:20091,runtime:null,startTime:null,defaultPort:20091}),s=l([]),o=l([]),i=l([]),r=l([]);function u(){Object.keys(En).forEach(e=>{delete En[e]}),s.value.forEach(e=>{(null==e?void 0:e.name)&&(En[e.name]="claude")}),o.value.forEach(e=>{(null==e?void 0:e.name)&&(En[e.name]="codex")}),i.value.forEach(e=>{(null==e?void 0:e.name)&&(En[e.name]="gemini")}),r.value.forEach(e=>{(null==e?void 0:e.name)&&(En[e.name]="opencode")})}const c=_({claude:{channels:[],pending:0},codex:{channels:[],pending:0},gemini:{channels:[],pending:0},opencode:{channels:[],pending:0}}),d=_({claude:[],codex:[],gemini:[],opencode:[]}),p=l(!1),v=l(100),m=l(30);let f=100,g=Dn();function y(e){return function(){const e=Date.now();(e<g.start||e>=g.end)&&(g=Dn(),C())}(),e>=g.start&&e<g.end}function h(e){for(;e.length>f;)e.pop()}function b(e){f=e,v.value=e,Object.values(d).forEach(h)}function k(e){const a=parseInt(e,10);if(Number.isNaN(a))return;const l=Math.min(Math.max(a,10),300);m.value!==l&&(m.value=l)}function x(e){const a=function(e){var a,l,t;if(e.source)return e.source;if("opencode"===e.toolType)return"opencode";if("codex"===e.toolType)return"codex";if("gemini"===e.toolType)return"gemini";if("claude"===e.toolType||"claude-code"===e.toolType)return"claude";if(e.model){const a=e.model.toLowerCase();if(a.includes("claude"))return"claude";if(a.includes("gpt")||a.includes("o1")||a.includes("o3"))return"codex";if(a.includes("gemini"))return"gemini";if(a.includes("opencode")||a.includes("deepseek")||a.includes("qwen"))return"opencode"}if(e.channel){const a=En[e.channel];if(a)return a}return(null==(a=e.action)?void 0:a.includes("opencode"))?"opencode":(null==(l=e.action)?void 0:l.includes("codex"))?"codex":(null==(t=e.action)?void 0:t.includes("gemini"))?"gemini":"claude"}(e),l=d[a];if(!l)return;const t=e.timestamp||Date.now();if(!y(t))return;const n=e.time||new Date(t).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}),s={id:e.id||`${Date.now()}-${Math.random()}`,source:a,type:e.type||(e.action?"action":"log"),action:e.action||null,channel:e.channel||e.channelName||"Unknown",model:e.model,message:e.message,timestamp:t,time:n,tokens:{input:e.inputTokens||0,output:e.outputTokens||0,cacheCreation:e.cacheCreation||0,cacheRead:e.cacheRead||0,cached:e.cachedTokens||0,reasoning:e.reasoningTokens||0,total:e.totalTokens||(e.inputTokens||0)+(e.outputTokens||0)},cost:e.cost||0,isHistory:An,isNew:!An};l.unshift(s),h(l),s.isNew&&setTimeout(()=>{s.isNew=!1},4500)}function C(){Object.keys(d).forEach(e=>{d[e].splice(0,d[e].length)})}function U(e,a={},l){e.value={...e.value,...a,activeChannel:l||e.value.activeChannel}}function S(l){const{source:c,proxy:d,activeChannel:p,channels:v}=l;"claude"===c?(U(e,d,p),v&&(s.value=v,u())):"codex"===c?(U(a,d,p),v&&(o.value=v,u())):"gemini"===c?(U(t,d,p),v&&(i.value=v,u())):"opencode"===c&&(U(n,d,p),v&&(r.value=v,u()))}async function z(){var l,s,o,i;try{const[r,u,c,d]=await Promise.all([B.get("/api/proxy/status").catch(()=>({})),B.get("/api/codex/proxy/status").catch(()=>({})),B.get("/api/gemini/proxy/status").catch(()=>({})),B.get("/api/opencode/proxy/status").catch(()=>({}))]);(null==(l=r.data)?void 0:l.proxy)&&U(e,r.data.proxy,r.data.activeChannel),(null==(s=u.data)?void 0:s.proxy)&&U(a,u.data.proxy,u.data.activeChannel),(null==(o=c.data)?void 0:o.proxy)&&U(t,c.data.proxy,c.data.activeChannel),(null==(i=d.data)?void 0:i.proxy)&&U(n,d.data.proxy,d.data.activeChannel)}catch(r){}}async function I(){var e,a,l,t;try{const[n,d,p,v,m,f,g,y]=await Promise.all([B.get("/api/channels").catch(()=>({data:{channels:[]}})),B.get("/api/codex/channels").catch(()=>({data:{channels:[]}})),B.get("/api/gemini/channels").catch(()=>({data:{channels:[]}})),B.get("/api/opencode/channels").catch(()=>({data:{channels:[]}})),B.get("/api/channels/pool/status?source=claude").catch(()=>({data:null})),B.get("/api/channels/pool/status?source=codex").catch(()=>({data:null})),B.get("/api/channels/pool/status?source=gemini").catch(()=>({data:null})),B.get("/api/channels/pool/status?source=opencode").catch(()=>({data:null}))]);s.value=n.data.channels||[],o.value=d.data.channels||[],i.value=p.data.channels||[],r.value=v.data.channels||[],u(),(null==(e=m.data)?void 0:e.scheduler)&&(c.claude=m.data.scheduler),(null==(a=f.data)?void 0:a.scheduler)&&(c.codex=f.data.scheduler),(null==(l=g.data)?void 0:l.scheduler)&&(c.gemini=g.data.scheduler),(null==(t=y.data)?void 0:t.scheduler)&&(c.opencode=y.data.scheduler)}catch(n){}}function T(l){return"codex"===l?a:"gemini"===l?t:"opencode"===l?n:e}return"undefined"==typeof window||window[$n]||(window.addEventListener("advanced-config-change",e=>{var a,l;(null==(a=e.detail)?void 0:a.maxLogs)&&b(e.detail.maxLogs),(null==(l=e.detail)?void 0:l.statsInterval)&&k(e.detail.statsInterval)}),window[$n]=!0),{claudeProxy:e,codexProxy:a,geminiProxy:t,opencodeProxy:n,claudeChannels:s,codexChannels:o,geminiChannels:i,opencodeChannels:r,schedulerState:c,connectWebSocket:function e(){if(jn&&jn.readyState===WebSocket.OPEN)return;const a=`${"https:"===window.location.protocol?"wss:":"ws:"}//${window.location.host}/ws`;try{jn=new WebSocket(a),jn.onopen=()=>{On=0,p.value=!0,An=!0,clearTimeout(Ln),Ln=setTimeout(()=>{An=!1},2e3),z()},jn.onmessage=e=>{try{const a=JSON.parse(e.data);"proxy-state"===a.type?S(a):"scheduler-state"===a.type?function(e){const{source:a,scheduler:l}=e;c[a]&&l&&(c[a]=l)}(a):x(a)}catch(a){}},jn.onclose=()=>{p.value=!1,jn=null,An=!1,clearTimeout(Ln);const a=Math.min(1e3*Math.pow(2,On),1e4);On+=1,setTimeout(e,a)},jn.onerror=e=>{p.value=!1}}catch(l){p.value=!1}},initializeState:z,loadChannels:I,getProxyState:T,getChannels:function(e){return"codex"===e?o:"gemini"===e?i:"opencode"===e?r:s},getSchedulerState:function(e){return c[e]||{channels:[],pending:0}},handleProxyStateUpdate:S,startProxy:async function(e){let a;a="codex"===e?"/api/codex/proxy/start":"gemini"===e?"/api/gemini/proxy/start":"opencode"===e?"/api/opencode/proxy/start":"/api/proxy/start";const l=await B.post(a);if(l.data.success){const a=T(e);a.value.running=!0,a.value.activeChannel=l.data.activeChannel,a.value.startTime=Date.now()}return l.data},stopProxy:async function(e,a={}){var l,t;let n;n="codex"===e?"/api/codex/proxy/stop":"gemini"===e?"/api/gemini/proxy/stop":"opencode"===e?"/api/opencode/proxy/stop":"/api/proxy/stop";const s=await B.post(n),o=T(e);return o.value.running=!1,o.value.activeChannel=null,o.value.startTime=null,o.value.runtime=null,!1!==(null==(l=s.data)?void 0:l.success)&&await I(),a.refreshChannelsDrawer&&!1!==(null==(t=s.data)?void 0:t.success)&&"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e,reason:"proxy-stop"}})),s.data},getLogs:function(e){return w(()=>d[e]||[])},wsConnected:p,clearLogsState:C,clearLogsForSource:function(e){d[e]&&d[e].splice(0,d[e].length)},logLimit:v,statsInterval:m,loadAdvancedConfig:async function(){try{const e=await fetch("/api/config/advanced");if(e.ok){const a=await e.json();b(a.maxLogs||100),a.statsInterval&&k(a.statsInterval)}}catch(e){}}}});let Fn=!1;function Rn(e){try{const a=localStorage.getItem(e);if(a)return JSON.parse(a)}catch(a){}return{}}function Bn(e,a){try{localStorage.setItem(e,JSON.stringify(a))}catch(l){}}function Hn(e,a){var l,t;return(null==(t=null==(l=null==e?void 0:e.response)?void 0:l.data)?void 0:t.error)?e.response.data.error:a||e.message||"操作失败"}function qn(e){const a=Nn(),l=_({channels:[],loading:!1,toggling:{},collapsed:Rn(e.storageKeys.localCollapse),showDialog:!1,editingChannel:null,formData:e.getInitialForm()}),t=_({});function n(){var t;const n=a.schedulerState[e.schedulerSource];(null==(t=null==n?void 0:n.channels)?void 0:t.length)&&l.channels.length&&l.channels.forEach(e=>{const a=n.channels.find(a=>a.id===e.id);(null==a?void 0:a.health)&&(e.health=a.health)})}const s=x(()=>{var l;return null==(l=a.schedulerState[e.schedulerSource])?void 0:l.channels},n);async function o(){l.loading=!0;try{const a=await e.api.fetch();l.channels=Array.isArray(a)?[...a]:[],await async function(){try{if(l.channels.length>0){const e=[...l.channels].sort((e,a)=>{const l=e.updatedAt||e.createdAt||0;return(a.updatedAt||a.createdAt||0)-l}),a=e.filter(e=>!1!==e.enabled),t=e.filter(e=>!1===e.enabled);t.forEach(e=>{l.collapsed[e.id]=!0}),l.channels=[...a,...t]}}catch(e){}}(),n()}catch(a){Un.error(Hn(a,`${e.displayName} 渠道加载失败`))}finally{l.loading=!1}}let i=null,r=0;async function u(){try{await Pn("channelCollapse",e.storageKeys.collapseConfigKey,l.collapsed)}catch(a){}}function c(){l.showDialog=!1,l.editingChannel=null,l.formData=e.getInitialForm(),d()}function d(){Object.keys(t).forEach(e=>{delete t[e]})}function p(){let a=!0;const n=e=>{const a=e.key.replace(/\./g,"_");delete t[e.key],delete t[a]};return e.formSections.forEach(e=>{const s=(e=>!e.showWhen||e.showWhen(l.formData))(e);e.fields.forEach(e=>{if(!s||!(e=>!e.showWhen||e.showWhen(l.formData))(e))return void n(e);const o=((e,a)=>{if(!a||"string"!=typeof a||!a.includes("."))return e[a];const l=a.split(".");let t=e;for(const n of l)t=null==t?void 0:t[n];return t})(l.formData,e.key);let i="";e.required&&(i=e.customRequiredMessage?null==o||""===o?e.customRequiredMessage:"":null==o||""===o?`${e.label}不能为空`:""),i||"function"!=typeof e.validate||(i=e.validate(o,l.formData)||""),i?(t[e.key]={status:"error",message:i},a=!1):n(e)})}),a}return Promise.all([o(),async function(){var a;try{const t=await async function(){const e=Date.now();if(i&&e-r<6e4)return i;try{const a=await zn();if(a.success&&a.config)return i=a.config,r=e,i}catch(a){}return null}();if(t){const n=(null==(a=t.channelCollapse)?void 0:a[e.storageKeys.collapseConfigKey])||{};l.collapsed=n,Bn(e.storageKeys.localCollapse,n)}}catch(t){}}()]),C(()=>{s()}),{state:l,validation:t,actions:{loadChannels:o,openAddDialog:function(){l.editingChannel=null,l.formData=e.getInitialForm(),d(),l.showDialog=!0},closeDialog:c,toggleCollapse:function(a){l.collapsed[a]=!l.collapsed[a],Bn(e.storageKeys.localCollapse,l.collapsed),u()},handleEdit:function(a){l.editingChannel=a,l.formData=e.mapChannelToForm(a),d(),l.showDialog=!0},handleSave:async function(){if(p())try{l.editingChannel?(await e.api.update(l.editingChannel,l.formData),Un.success(`${e.displayName} 渠道已更新`)):(await e.api.create(l.formData),Un.success(`${e.displayName} 渠道已添加`)),c(),await o()}catch(a){Un.error(Hn(a))}else Un.error("请检查表单填写是否完整")},handleDelete:function(a){Sn.warning({title:`删除 ${e.displayName} 渠道`,content:"确定要删除这个渠道吗?",positiveText:"确定",negativeText:"取消",onPositiveClick:async()=>{try{await e.api.remove(a),Un.success(`${e.displayName} 渠道已删除`),await o()}catch(l){Un.error(Hn(l))}}})},handleToggleEnabled:async function(a,t){if(a&&!l.toggling[a.id]){l.toggling[a.id]=!0;try{const n="boolean"==typeof t?t:!1===a.enabled;await e.api.toggle(a,n),Un.success(`${e.displayName} 渠道已${n?"启用":"禁用"}`),n||(l.collapsed[a.id]=!0,Bn(e.storageKeys.localCollapse,l.collapsed),u()),await o()}catch(n){Un.error(Hn(n))}finally{l.toggling[a.id]=!1}}},handleApplyToSettings:function(a){"function"==typeof e.api.applyToSettings&&Sn.warning({title:"写入配置",content:"写入配置后会关闭动态切换并默认使用该渠道,是否继续?",positiveText:"确定",negativeText:"取消",onPositiveClick:async()=>{try{await e.api.applyToSettings(a),Un.success("已将渠道写入配置文件"),await o()}catch(l){Un.error(Hn(l))}}})},handleResetHealth:async function(a){if("function"==typeof e.api.resetHealth)try{await e.api.resetHealth(a),Un.success("渠道健康状态已重置"),await o()}catch(l){Un.error(Hn(l))}},handleDragEnd:async function(a){if(a&&a.newIndex!==a.oldIndex){const n=l.channels[a.newIndex];if(n)try{await e.api.update(n.id,{...n,updatedAt:Date.now()}),await o()}catch(t){}}}}}}const Kn={key:0,class:"loading-container"},Gn={key:1},Wn={key:0,class:"empty-state"},Vn={class:"section-title"},Jn={key:0,class:"section-desc"},Zn={style:{padding:"8px",color:"#d03050","font-size":"12px"}},Yn={style:{"font-weight":"500","margin-bottom":"4px"}},Xn={key:0,style:{color:"#666","font-size":"11px","line-height":"1.4"}},Qn={style:{padding:"8px",color:"#d03050","font-size":"12px"}},es={style:{"font-weight":"500","margin-bottom":"4px"}},as={key:0,style:{color:"#666","font-size":"11px","line-height":"1.4"}},ls={class:"dialog-footer"},ts={__name:"BaseChannelPanel",props:{type:{type:String,required:!0}},emits:["open-website"],setup(e,{expose:a,emit:l}){const p=l,b=(_n[e.type]||_n.claude)(),{state:k,validation:_,actions:C}=qn(b),{getChannelInflight:T}=function(e="claude"){const a=Nn();return{getChannelInflight:function(l){var t;const n=null==(t=(a.schedulerState[e]||{channels:[]}).channels)?void 0:t.find(e=>e.id===l);return n?n.inflight:0}}}(b.schedulerSource),P={group:{name:`${b.type}-channels`,pull:!1,put:!1},forceFallback:!0,fallbackOnBody:!1,fallbackTolerance:4,scroll:!0};async function M(){b.fetchModelsForChannel&&await O({forceRefresh:!0})}x(()=>k.showDialog,async e=>{e&&b.fetchModelsForChannel&&await O()});const $=w(()=>{if(!b.presets)return[];const e={};return b.presets.forEach(a=>{var l;const t=a.category||"custom";e[t]||(e[t]={type:"group",label:(null==(l=b.presetCategories)?void 0:l[t])||t,key:t,children:[]}),e[t].children.push({label:a.name,value:a.id})}),Object.values(e)});async function j(e){if(b.onPresetChange){const a=b.onPresetChange(e,k.formData);Object.assign(k.formData,a)}else k.formData.presetId=e;await O()}async function O({forceRefresh:e=!1}={}){var a;b.fetchModelsForChannel&&await b.fetchModelsForChannel((null==(a=k.editingChannel)?void 0:a.id)||null,k.formData,{forceRefresh:e})}function A(e,a){if(!a.includes("."))return e[a];const l=a.split(".");let t=e;for(const n of l)t=null==t?void 0:t[n];return t}function L(e,a,l){if(!a.includes("."))return void(e[a]=l);const t=a.split(".");let n=e;for(let s=0;s<t.length-1;s++)n[t[s]]||(n[t[s]]={}),n=n[t[s]];n[t[t.length-1]]=l}function E(e){const a=k.formData.availableModels||[];if(!e||!a.length)return a;const l=e.toLowerCase();return a.filter(e=>(e.label||e.value||"").toLowerCase().includes(l))}function D(e,a){const l=[],t=new Set,n=e=>{for(const a of e||[]){const e=String((null==a?void 0:a.value)||"").trim();if(!e)continue;const n=e.toLowerCase();t.has(n)||(t.add(n),l.push({label:(null==a?void 0:a.label)||e,value:e}))}};n(k.formData.availableModels||[]),n(a||[]);const s=l;if(!e||!s.length)return s;const o=e.toLowerCase();return s.filter(e=>(e.label||e.value||"").toLowerCase().includes(o))}function N(e){var a,l;const t=e.replace(/\./g,"_");return(null==(a=_[t])?void 0:a.status)||(null==(l=_[e])?void 0:l.status)}function F(e){var a,l;const t=e.replace(/\./g,"_");return(null==(a=_[t])?void 0:a.message)||(null==(l=_[e])?void 0:l.message)}const R={getChannelInflight:T,formatFreeze:e=>`冻结 ${e||0}s`,maskApiKey:e=>e?e.length<=12?"******":`${e.slice(0,8)}******${e.slice(-4)}`:"(未设置)",handleResetHealth:e=>C.handleResetHealth(e),handleOpenWebsite:e=>p("open-website",e)};function B(e){const a=T(e.id),l=e.maxConcurrency?`${a}/${e.maxConcurrency}`:a>0?a:"不限";return{weight:e.weight||1,concurrencyText:l,concurrencyActive:a>0}}function G(e){switch(e.type){case"password":case"text":default:return re;case"number":return ue;case"switch":return W;case"radio-group":return ne}}function V(e){const a={placeholder:e.placeholder};return"password"===e.type&&(a.type="password",a["show-password-on"]="click"),"number"===e.type&&(a.min=e.min??1,a.max=e.max??100,a.step=e.step??1,a.clearable=e.clearable,a.style="width: 100%;"),e.disabledOnEdit&&k.editingChannel&&(a.disabled=!0),a}return a({openAddDialog:C.openAddDialog,refresh:C.loadChannels}),(e,a)=>(n(),t("div",null,[c(k).loading?(n(),t("div",Kn,[r(c(Q),{size:"small"})])):(n(),t("div",Gn,[0===c(k).channels.length?(n(),t("div",Wn,[r(c(ee),{description:c(b).emptyDescription},U({_:2},[c(b).showEmptyAction?{name:"extra",fn:u(()=>[r(c(K),{type:"primary",size:"small",onClick:c(C).openAddDialog},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[y(" "+v(c(b).emptyActionText),1)]),_:1},8,["onClick"])]),key:"0"}:void 0]),1032,["description"])])):(n(),g(c(H),S({key:1,modelValue:c(k).channels,"onUpdate:modelValue":a[1]||(a[1]=e=>c(k).channels=e),"item-key":"id",class:"channels-list"},P,{"ghost-class":"ghost","chosen-class":"chosen","drag-class":"drag",animation:"200",onEnd:c(C).handleDragEnd}),{item:u(({element:e})=>[(n(),g(Vl,{key:e.id,channel:e,collapsed:c(k).collapsed[e.id],"header-tags":c(b).getHeaderTags(e,R),"info-rows":c(b).buildInfoRows(e,R),meta:B(e),"show-apply-button":c(b).showApplyButton,"channel-type":c(b).type,"test-fn":c(b).testFn,toggling:!!c(k).toggling[e.id],onToggleCollapse:a=>c(C).toggleCollapse(e.id),onApply:a=>c(C).handleApplyToSettings(e),onEdit:a=>c(C).handleEdit(e),onDelete:a=>c(C).handleDelete(e.id),onToggleEnabled:a=>c(C).handleToggleEnabled(e,a),onOpenWebsite:a[0]||(a[0]=e=>p("open-website",e))},null,8,["channel","collapsed","header-tags","info-rows","meta","show-apply-button","channel-type","test-fn","toggling","onToggleCollapse","onApply","onEdit","onDelete","onToggleEnabled"]))]),_:1},16,["modelValue","onEnd"]))])),r(c(ie),{show:c(k).showDialog,"onUpdate:show":a[6]||(a[6]=e=>c(k).showDialog=e),preset:"card",title:c(k).editingChannel?c(b).editTitle:c(b).addTitle,class:"channel-dialog",style:I({width:c(b).modalWidth+"px",maxHeight:"80vh"}),"content-style":{maxHeight:"calc(80vh - 100px)",overflowY:"auto"}},{footer:u(()=>[s("div",ls,[r(c(K),{onClick:c(C).closeDialog},{default:u(()=>[...a[7]||(a[7]=[y("取消",-1)])]),_:1},8,["onClick"]),r(c(K),{type:"primary",onClick:c(C).handleSave},{default:u(()=>[y(v(c(k).editingChannel?"保存修改":"添加渠道"),1)]),_:1},8,["onClick"])])]),default:u(()=>[r(c(ae),{"label-placement":"left","label-width":c(b).formLabelWidth,class:"channel-form"},{default:u(()=>[(n(!0),t(m,null,f(c(b).formSections,e=>(n(),t(m,{key:e.title},[!e.showWhen||e.showWhen(c(k).formData)?(n(),t("div",{key:0,class:d(["form-section",{collapsible:e.collapsible}])},[s("div",Vn,[y(v(e.title)+" ",1),e.description?(n(),t("span",Jn,v(e.description),1)):o("",!0)]),(n(!0),t(m,null,f(e.fields,e=>i((n(),g(c(le),{key:e.key,label:e.label,"label-style":e.fullWidth?{display:"none"}:void 0,required:e.required,"validation-status":N(e.key),feedback:F(e.key)},{default:u(()=>["preset"===e.type?(n(),g(c(te),{key:0,value:c(k).formData.presetId,options:$.value,placeholder:e.placeholder,"onUpdate:value":j},null,8,["value","options","placeholder"])):"model-redirect"===e.type?(n(),g(ct,{key:1,modelValue:c(k).formData.modelRedirects,"onUpdate:modelValue":a[2]||(a[2]=e=>c(k).formData.modelRedirects=e),"available-models":c(k).formData.availableModels,"channel-type":c(b).type},null,8,["modelValue","available-models","channel-type"])):"model-multi-select"===e.type?(n(),g(c(te),{key:2,value:c(k).formData.allowedModels,"onUpdate:value":a[3]||(a[3]=e=>c(k).formData.allowedModels=e),options:c(k).formData.availableModels||[],placeholder:e.placeholder,loading:c(k).formData.modelsFetching,multiple:"",filterable:"",clearable:"",tag:"",onFocus:M},null,8,["value","options","placeholder","loading"])):"select"===e.type&&"speedTestModel"===e.key?(n(),g(c(J),{key:3,value:c(k).formData.speedTestModel,options:D(c(k).formData.speedTestModel,e.options),placeholder:e.placeholder,loading:c(k).formData.modelsFetching,"get-show":()=>!0,clearable:"",onFocus:M,"onUpdate:value":a[4]||(a[4]=e=>c(k).formData.speedTestModel=e)},U({_:2},[c(k).formData.modelsFetchError?{name:"empty",fn:u(()=>[s("div",Zn,[s("div",Yn,v(c(k).formData.modelsFetchError),1),c(k).formData.modelsFetchErrorHint?(n(),t("div",Xn,v(c(k).formData.modelsFetchErrorHint),1)):o("",!0)])]),key:"0"}:void 0]),1032,["value","options","placeholder","loading"])):"select"===e.type&&"model"===e.key?(n(),g(c(J),{key:4,value:c(k).formData.model,options:D(c(k).formData.model,e.options),placeholder:e.placeholder,loading:c(k).formData.modelsFetching,"get-show":()=>!0,clearable:"",onFocus:M,"onUpdate:value":a[5]||(a[5]=e=>c(k).formData.model=e)},U({_:2},[c(k).formData.modelsFetchError?{name:"empty",fn:u(()=>[s("div",Qn,[s("div",es,v(c(k).formData.modelsFetchError),1),c(k).formData.modelsFetchErrorHint?(n(),t("div",as,v(c(k).formData.modelsFetchErrorHint),1)):o("",!0)])]),key:"0"}:void 0]),1032,["value","options","placeholder","loading"])):"autocomplete"===e.type?(n(),g(c(J),{key:5,value:A(c(k).formData,e.key),options:E(A(c(k).formData,e.key)),placeholder:e.placeholder,"get-show":()=>!0,"onUpdate:value":a=>L(c(k).formData,e.key,a)},null,8,["value","options","placeholder","onUpdate:value"])):"radio-group"===e.type?(n(),g(c(ne),{key:6,value:A(c(k).formData,e.key),"onUpdate:value":a=>L(c(k).formData,e.key,a)},{default:u(()=>[r(c(se),null,{default:u(()=>[(n(!0),t(m,null,f(e.options,e=>(n(),g(c(oe),{key:e.value,value:e.value},{default:u(()=>[y(v(e.label),1)]),_:2},1032,["value"]))),128))]),_:2},1024)]),_:2},1032,["value","onUpdate:value"])):(n(),g(z(G(e)),S({key:7,value:A(c(k).formData,e.key)},{ref_for:!0},V(e),{"onUpdate:value":a=>L(c(k).formData,e.key,a)}),null,16,["value","onUpdate:value"]))]),_:2},1032,["label","label-style","required","validation-status","feedback"])),[[h,!e.showWhen||e.showWhen(c(k).formData)]])),128))],2)):o("",!0)],64))),128))]),_:1},8,["label-width"])]),_:1},8,["show","title","style"])]))}},ns={__name:"ClaudeChannelPanel",emits:["open-website"],setup(e,{expose:a,emit:t}){const s=t,o=l(null);return a({openAddDialog:()=>{var e;return null==(e=o.value)?void 0:e.openAddDialog()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(ts,{ref_key:"baseRef",ref:o,type:"claude",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},ss={__name:"CodexChannelPanel",emits:["open-website"],setup(e,{expose:a,emit:t}){const s=t,o=l(null);return a({openAddDialog:()=>{var e;return null==(e=o.value)?void 0:e.openAddDialog()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(ts,{ref_key:"baseRef",ref:o,type:"codex",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},os={__name:"GeminiChannelPanel",emits:["open-website"],setup(e,{expose:a,emit:t}){const s=t,o=l(null);return a({openAddDialog:()=>{var e;return null==(e=o.value)?void 0:e.openAddDialog()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(ts,{ref_key:"baseRef",ref:o,type:"gemini",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},is={__name:"OpenCodeChannelPanel",emits:["open-website"],setup(e,{expose:a,emit:t}){const s=t,o=l(null);return a({openAddDialog:()=>{var e;return null==(e=o.value)?void 0:e.openAddDialog()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(ts,{ref_key:"baseRef",ref:o,type:"opencode",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}};async function rs(){return(await dt.get("/statistics/today")).data}async function us(){return(await dt.get("/codex/statistics/today")).data}async function cs(){return(await dt.get("/gemini/statistics/today")).data}async function ds(){return(await dt.get("/opencode/statistics/today")).data}async function ps(e){return(await dt.get("/statistics/trend",{params:e})).data}async function vs(e){return(await dt.get("/statistics/filters",{params:e})).data}function ms(e){return`/api/statistics/trend/export?${new URLSearchParams(e).toString()}`}const fs=Object.freeze(Object.defineProperty({__proto__:null,getAvailableFilters:vs,getCodexTodayStatistics:us,getDailyStatistics:async function(e){return(await dt.get(`/statistics/daily/${e}`)).data},getGeminiTodayStatistics:cs,getModelStats:async function(){return(await dt.get("/statistics/models")).data},getModelStatsHistory:async function(e=7){return(await dt.get("/statistics/models/history",{params:{days:e}})).data},getOpenCodeTodayStatistics:ds,getRecentStatistics:async function(e=7){return(await dt.get("/statistics/recent",{params:{days:e}})).data},getStatistics:async function(){return(await dt.get("/statistics/summary")).data},getTodayStatistics:rs,getToolModelStats:async function(e){return(await dt.get(`/statistics/models/${e}`)).data},getTrendExportUrl:ms,getTrendStatistics:ps},Symbol.toStringTag,{value:"Module"}));async function gs(){return(await dt.post("/proxy/logs/clear")).data}const ys=Object.freeze(Object.defineProperty({__proto__:null,clearProxyLogs:gs,getCodexProxyStatus:async function(){return(await dt.get("/codex/proxy/status")).data},getGeminiProxyStatus:async function(){return(await dt.get("/gemini/proxy/status")).data},getProxyStatus:async function(){return(await dt.get("/proxy/status")).data},startCodexProxy:async function(){return(await dt.post("/codex/proxy/start")).data},startGeminiProxy:async function(){return(await dt.post("/gemini/proxy/start")).data},startProxy:async function(){return(await dt.post("/proxy/start")).data},stopCodexProxy:async function(){return(await dt.post("/codex/proxy/stop")).data},stopGeminiProxy:async function(){return(await dt.post("/gemini/proxy/stop")).data},stopProxy:async function(){return(await dt.post("/proxy/stop")).data}},Symbol.toStringTag,{value:"Module"}));function hs(){const e=Nn(),{claudeProxy:a,codexProxy:l,geminiProxy:t,opencodeProxy:n,claudeChannels:s,codexChannels:o,geminiChannels:i,opencodeChannels:r,wsConnected:u,logLimit:c,statsInterval:d}=T(e);return{claudeProxy:a,codexProxy:l,geminiProxy:t,opencodeProxy:n,claudeChannels:s,codexChannels:o,geminiChannels:i,opencodeChannels:r,schedulerState:e.schedulerState,connectWebSocket:e.connectWebSocket,initializeState:e.initializeState,loadChannels:e.loadChannels,getProxyState:e.getProxyState,getChannels:e.getChannels,getSchedulerState:e.getSchedulerState,handleProxyStateUpdate:e.handleProxyStateUpdate,startProxy:e.startProxy,stopProxy:e.stopProxy,getLogs:e.getLogs,wsConnected:u,clearLogsState:e.clearLogsState,clearLogsForSource:e.clearLogsForSource,logLimit:c,statsInterval:d,loadAdvancedConfig:e.loadAdvancedConfig}}const bs={class:"proxy-logs"},ws={class:"logs-header"},ks={class:"header-left"},_s={class:"today-stats"},xs={class:"logs-table"},Cs={key:0,class:"empty-state"},Us={class:"action-message"},Ss={class:"action-time"},zs=["title"],Is={key:0},Ts={style:{"font-family":"monospace","font-size":"12px"}},Ps={key:1},Ms={class:"logs-footer"},$s={class:"count"},js=Pl({__name:"ProxyLogs",props:{source:{type:String,default:"claude"}},setup(e){const a=e,{getLogs:i,wsConnected:p,clearLogsState:h,logLimit:k}=hs(),_={claude:i("claude"),codex:i("codex"),gemini:i("gemini"),opencode:i("opencode")},U=w(()=>((_[a.source]||_.claude).value||[]).slice(0,k.value));l(U.value.length);const S=l(null),I=l({requests:0,tokens:0});let T=null,M=null;async function $(){var e,l,t,n;try{if("opencode"===a.source){const a=await ds();return void(I.value={requests:(null==(e=null==a?void 0:a.summary)?void 0:e.requests)||0,tokens:(null==(l=null==a?void 0:a.summary)?void 0:l.tokens)||0})}const s=await rs();let o="claude-code";"codex"===a.source?o="codex":"gemini"===a.source&&(o="gemini");const i=null==(t=s.byToolType)?void 0:t[o];I.value=i?{requests:i.requests||0,tokens:(null==(n=i.tokens)?void 0:n.total)||0}:{requests:0,tokens:0}}catch(s){}}async function j(){try{await gs(),h(),Un.success("日志已清空")}catch(e){Un.error("清空失败: "+e.message)}}return x(U,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===M)return void(M=l);M=l;(!S.value||S.value.scrollTop<20)&&P(()=>{S.value&&(S.value.scrollTop=0)})}),x(()=>a.source,()=>{var e;$(),M=(null==(e=U.value[0])?void 0:e.id)||null}),b(()=>{$(),T=setInterval(()=>{$()},3e4)}),C(()=>{T&&(clearInterval(T),T=null)}),(a,l)=>(n(),t("div",bs,[s("div",ws,[s("div",ks,[l[0]||(l[0]=s("h3",{class:"title"},"实时日志",-1)),s("div",_s,[r(c(G),{size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(" 今日请求: "+v(I.value.requests),1)]),_:1}),r(c(G),{size:"tiny",bordered:!1,type:"success"},{default:u(()=>{return[y(" 今日Token: "+v((e=I.value.tokens,e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(1)+"K":e.toString())),1)];var e}),_:1})])]),r(c(K),{text:"",size:"small",onClick:j},{default:u(()=>[r(c(q),{size:"16"},{default:u(()=>[r(c(Je))]),_:1}),l[1]||(l[1]=y(" 清空 ",-1))]),_:1})]),s("div",xs,[s("div",{class:d(["table-header",`table-header-${e.source}`])},[s("div",{class:d(["col col-channel",`col-channel-${e.source}`])},"渠道",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"请求",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"回复",2),"claude"===e.source?(n(),t(m,{key:0},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},"写入",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"命中",2)],64)):"codex"===e.source?(n(),t(m,{key:1},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},"推理",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"缓存",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):"gemini"===e.source?(n(),t(m,{key:2},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},"缓存",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):"opencode"===e.source?(n(),t(m,{key:3},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},"推理",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"缓存",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):o("",!0),s("div",{class:d(["col col-time",`col-time-${e.source}`])},"时间",2)],2),s("div",{class:"table-body",ref_key:"tableBody",ref:S},[0===U.value.length?(n(),t("div",Cs," 暂无日志 ")):o("",!0),(n(!0),t(m,null,f(U.value,a=>(n(),t("div",{key:a.id,class:d(["action"===a.type?"action-row":"table-row",{"new-log":a.isNew}])},["action"===a.type?(n(),t(m,{key:0},[r(c(q),{size:"16",style:{color:"#18a058","margin-right":"8px"}},{default:u(()=>[r(c(Ze))]),_:1}),s("span",Us,v(a.message),1),s("span",Ss,v(a.time),1)],64)):(n(),g(c(ce),{key:1,placement:"top",style:{maxWidth:"300px"}},{trigger:u(()=>{var l,i,p,f,g,h,b,w,k,_,x,C;return[s("div",{class:d(["table-row-content",`table-row-content-${e.source}`])},[s("div",{class:d(["col col-channel",`col-channel-${e.source}`]),title:a.channel},[r(c(G),{size:"small",type:"success"},{default:u(()=>[y(v(a.channel),1)]),_:2},1024)],10,zs),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(l=a.tokens)?void 0:l.input)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(i=a.tokens)?void 0:i.output)||0),3),"claude"===e.source?(n(),t(m,{key:0},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(p=a.tokens)?void 0:p.cacheCreation)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(f=a.tokens)?void 0:f.cacheRead)||0),3)],64)):"codex"===e.source?(n(),t(m,{key:1},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(g=a.tokens)?void 0:g.reasoning)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(h=a.tokens)?void 0:h.cached)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(b=a.tokens)?void 0:b.total)||0),3)],64)):"gemini"===e.source?(n(),t(m,{key:2},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(w=a.tokens)?void 0:w.cached)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(k=a.tokens)?void 0:k.total)||0),3)],64)):"opencode"===e.source?(n(),t(m,{key:3},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(_=a.tokens)?void 0:_.reasoning)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(x=a.tokens)?void 0:x.cached)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(C=a.tokens)?void 0:C.total)||0),3)],64)):o("",!0),s("div",{class:d(["col col-time",`col-time-${e.source}`])},v(a.time),3)],2)]}),default:u(()=>[a.model?(n(),t("div",Is,[l[2]||(l[2]=s("div",{style:{"font-weight":"600","margin-bottom":"4px"}},"模型信息",-1)),s("div",Ts,v(a.model),1)])):(n(),t("div",Ps,"暂无模型信息"))]),_:2},1024))],2))),128))],512)]),s("div",Ms,[s("span",{class:d(["status",{connected:c(p)}])},[r(c(q),{size:"14"},{default:u(()=>[(n(),g(z(c(p)?c(Ze):c(Ye))))]),_:1}),y(" "+v(c(p)?"已连接":"未连接"),1)],2),s("span",$s,"共 "+v(U.value.length)+" 条",1)])]))}},[["__scopeId","data-v-a9fe4ab0"]]);async function Os(e=!1,a="claude"){return(await dt.get("/skills",{params:{refresh:e?"1":"",platform:a}})).data}async function As(e,a,l=null,t="claude"){return(await dt.post("/skills/install",{directory:e,repo:a,fullDirectory:l,platform:t})).data}async function Ls(e,a="claude"){return(await dt.post("/skills/uninstall",{directory:e,platform:a})).data}async function Es(e,a="claude"){return(await dt.post("/skills/repos",{...e,platform:a})).data}const Ds={class:"right-panel"},Ns={class:"toolbar-section"},Fs={class:"toolbar-left"},Rs={class:"toolbar-right"},Bs={class:"panel-header"},Hs={class:"header-title"},qs={class:"channels-scroll-area"},Ks=Pl({__name:"RightPanel",props:{showChannels:{type:Boolean,default:!0},showLogs:{type:Boolean,default:!0},proxyRunning:{type:Boolean,default:!1},proxyLoading:{type:Boolean,default:!1}},emits:["proxy-toggle","show-recent"],setup(e,{emit:a}){const i=M(),p=a,f=w(()=>i.meta.channel||"claude"),h=l(null),k=l(null),_=l(null),U=l(null),S=l(0);async function z(){if(["claude","codex","gemini","opencode"].includes(f.value))try{const e=await Os(!1,f.value);e.success&&e.skills&&(S.value=e.skills.filter(e=>e.installed).length)}catch(e){}else S.value=0}const I={claude:h,codex:k,gemini:_,opencode:U},T={claude:"Claude 渠道管理",codex:"Codex 渠道管理",gemini:"Gemini 渠道管理",opencode:"OpenCode 渠道管理"},P=w(()=>T[f.value]||"Claude 渠道管理");function $(e){window.open(e,"_blank")}function j(){var e,a,l;null==(l=null==(a=null==(e=I[f.value])?void 0:e.value)?void 0:a.openAddDialog)||l.call(a)}function O(e){var a;const l=null==(a=null==e?void 0:e.detail)?void 0:a.channel;l&&l!==f.value||function(e=f.value){var a,l,t;null==(t=null==(l=null==(a=I[e])?void 0:a.value)?void 0:l.refresh)||t.call(l)}()}function A(e){p("proxy-toggle",e)}function L(){p("show-recent")}function E(){window.dispatchEvent(new CustomEvent("open-skills-drawer"))}function D(){window.dispatchEvent(new CustomEvent("open-commands-drawer"))}function N(){window.dispatchEvent(new CustomEvent("open-agents-drawer"))}function F(){window.dispatchEvent(new CustomEvent("open-plugins-drawer"))}return b(()=>{z(),"undefined"!=typeof window&&window.addEventListener("channel-management-refresh",O)}),x(()=>f.value,z),C(()=>{"undefined"!=typeof window&&window.removeEventListener("channel-management-refresh",O)}),(a,l)=>(n(),t("div",Ds,[s("div",Ns,[s("div",Fs,[r(c(V),{depth:"3",class:"toolbar-label"},{default:u(()=>[...l[0]||(l[0]=[y("动态切换",-1)])]),_:1}),r(c(W),{value:e.proxyRunning,loading:e.proxyLoading,size:"small","onUpdate:value":A},null,8,["value","loading"]),("claude"===f.value||"codex"===f.value||"gemini"===f.value||"opencode"===f.value)&&S.value>0?(n(),g(c(G),{key:0,type:"success",size:"small",bordered:!1},{default:u(()=>[y(v(S.value)+" 技能 ",1)]),_:1})):o("",!0)]),s("div",Rs,["claude"===f.value||"codex"===f.value||"gemini"===f.value||"opencode"===f.value?(n(),g(c(ce),{key:0,trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:E},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(Xe))]),_:1})]),_:1})]),default:u(()=>[l[1]||(l[1]=y(" Skills 技能 ",-1))]),_:1})):o("",!0),"claude"===f.value||"opencode"===f.value?(n(),g(c(ce),{key:1,trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:F},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(Qe))]),_:1})]),_:1})]),default:u(()=>[l[2]||(l[2]=y(" Plugins 插件 ",-1))]),_:1})):o("",!0),"claude"===f.value||"codex"===f.value||"opencode"===f.value?(n(),t(m,{key:2},[r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:D},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(ea))]),_:1})]),_:1})]),default:u(()=>[l[3]||(l[3]=y(" Commands 命令 ",-1))]),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:N},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(aa))]),_:1})]),_:1})]),default:u(()=>[l[4]||(l[4]=y(" Agents 代理 ",-1))]),_:1})],64)):o("",!0),l[6]||(l[6]=s("div",{class:"toolbar-divider"},null,-1)),r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:L},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(la))]),_:1})]),_:1})]),default:u(()=>[l[5]||(l[5]=y(" 最新对话 ",-1))]),_:1})])]),e.showChannels?(n(),t("div",{key:0,class:d(["channels-section",{"full-height":!e.showLogs||!e.proxyRunning}])},[s("div",Bs,[s("div",Hs,[s("h3",null,v(P.value),1),r(c(V),{depth:"3",class:"header-hint"},{default:u(()=>[...l[7]||(l[7]=[y("拖拽调整顺序",-1)])]),_:1})]),r(c(K),{type:"primary",size:"small",onClick:j},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 添加 ",-1))]),_:1})]),s("div",qs,["claude"===f.value?(n(),g(ns,{key:0,ref_key:"claudePanelRef",ref:h,onOpenWebsite:$},null,512)):"codex"===f.value?(n(),g(ss,{key:1,ref_key:"codexPanelRef",ref:k,onOpenWebsite:$},null,512)):"gemini"===f.value?(n(),g(os,{key:2,ref_key:"geminiPanelRef",ref:_,onOpenWebsite:$},null,512)):"opencode"===f.value?(n(),g(is,{key:3,ref_key:"opencodePanelRef",ref:U,onOpenWebsite:$},null,512)):o("",!0)])],2)):o("",!0),e.showLogs?(n(),t("div",{key:1,class:d(["logs-section",{"full-height":!e.showChannels}])},[r(js,{source:f.value},null,8,["source"])],2)):o("",!0)]))}},[["__scopeId","data-v-e44bb18b"]]),Gs={class:"session-left"},Ws={class:"session-icon"},Vs={class:"session-info"},Js={class:"session-header"},Zs={class:"session-title-row"},Ys={class:"session-title"},Xs={class:"session-meta"},Qs={class:"meta-item"},eo={key:0,class:"session-message"},ao={key:1,class:"session-path"},lo={class:"session-actions"},to=Pl({__name:"SessionCard",props:{session:{type:Object,required:!0},channel:{type:String,default:"claude"},showProject:{type:Boolean,default:!1},hideFork:{type:Boolean,default:!1},hideDelete:{type:Boolean,default:!1}},emits:["set-alias","launch","fork","delete"],setup(e,{emit:a}){const i=e,d=l(!1),p=w(()=>i.session.alias?`${i.session.alias} (${i.session.sessionId.substring(0,8)})`:i.session.sessionId);function m(e){const a=new Date(e),l=new Date-a,t=Math.floor(l/6e4),n=Math.floor(l/36e5),s=Math.floor(l/864e5);return t<1?"刚刚":t<60?`${t}分钟前`:n<24?`${n}小时前`:s<7?`${s}天前`:a.toLocaleDateString("zh-CN")}function f(e){if(!e)return"0 B";const a=Math.floor(Math.log(e)/Math.log(1024));return Math.round(e/Math.pow(1024,a)*100)/100+" "+["B","KB","MB","GB"][a]}return(a,l)=>(n(),t("div",{class:"session-item",onMouseenter:l[4]||(l[4]=e=>d.value=!0),onMouseleave:l[5]||(l[5]=e=>d.value=!1)},[s("div",Gs,[s("div",Ws,[r(c(q),{size:"24",color:"#18a058"},{default:u(()=>[r(c(ta))]),_:1})]),s("div",Vs,[s("div",Js,[s("div",Zs,[e.showProject&&e.session.projectDisplayName?(n(),g(c(G),{key:0,size:"small",type:"info",bordered:!1,style:{"margin-right":"8px"}},{default:u(()=>[y(v(e.session.projectDisplayName),1)]),_:1})):o("",!0),s("span",Ys,v(p.value),1),e.session.forkedFrom?(n(),g(c(ce),{key:1,placement:"top"},{trigger:u(()=>[r(c(G),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[6]||(l[6]=y(" Fork ",-1))]),_:1})]),default:u(()=>[s("span",null,"Fork 自 "+v(e.session.forkedFrom),1)]),_:1})):o("",!0)]),s("div",Xs,[s("span",Qs,[r(c(q),{size:"14"},{default:u(()=>[r(c(sa))]),_:1}),y(" "+v(m(e.session.mtime)),1)]),r(c(G),{size:"small",bordered:!1,type:"info"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(oa))]),_:1})]),default:u(()=>[y(" "+v(f(e.session.size)),1)]),_:1}),e.session.gitBranch?(n(),g(c(G),{key:0,size:"small",bordered:!1,type:"success"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[y(" "+v(e.session.gitBranch),1)]),_:1})):o("",!0)])]),e.session.firstMessage?(n(),t("div",eo,v(e.session.firstMessage),1)):o("",!0),e.showProject&&e.session.projectFullPath?(n(),t("div",ao," 路径: "+v(e.session.projectFullPath),1)):o("",!0)])]),s("div",lo,[r(c(K),{size:"small",onClick:l[0]||(l[0]=l=>a.$emit("set-alias",e.session))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(ia))]),_:1})]),default:u(()=>[l[7]||(l[7]=y(" 别名 ",-1))]),_:1}),r(c(K),{type:"primary",size:"small",onClick:l[1]||(l[1]=l=>a.$emit("launch",e.session))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(ea))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 使用对话 ",-1))]),_:1}),e.hideFork?o("",!0):(n(),g(c(K),{key:0,size:"small",onClick:l[2]||(l[2]=l=>a.$emit("fork",e.session))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[9]||(l[9]=y(" Fork ",-1))]),_:1})),e.hideDelete?o("",!0):(n(),g(c(K),{key:1,size:"small",type:"error",onClick:l[3]||(l[3]=l=>a.$emit("delete",e.session))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),_:1})),$(a.$slots,"actions-extra",{},void 0,!0)])],32))}},[["__scopeId","data-v-32d1b310"]]);async function no(e,a={}){var l;const t=String(e||"");if(!t)throw new Error("没有可复制的内容");const{manualFallback:n=!0}=a;let s=null;if("undefined"!=typeof navigator&&(null==(l=navigator.clipboard)?void 0:l.writeText))try{return await navigator.clipboard.writeText(t),{copied:!0,method:"clipboard"}}catch(o){s=o}if(function(e){if("undefined"==typeof document)return!1;const a=document.createElement("textarea");a.value=e,a.setAttribute("readonly",""),a.style.position="fixed",a.style.top="-9999px",a.style.left="-9999px",a.style.opacity="0",document.body.appendChild(a),a.focus(),a.select(),a.setSelectionRange(0,e.length);let l=!1;try{l=document.execCommand("copy")}catch{l=!1}return document.body.removeChild(a),l}(t))return{copied:!0,method:"execCommand"};if(n&&function(e){return"undefined"!=typeof window&&"function"==typeof window.prompt&&(window.prompt("自动复制失败,请手动复制以下内容:",e),!0)}(t))return{copied:!1,method:"manual",error:s||null};throw s||new Error("当前环境不支持自动复制,请手动复制命令")}async function so(e,a="claude"){const l=pt(a);return(await dt.get(`${l}/sessions/${e}`)).data}async function oo(e,a){return(await dt.post("/aliases",{sessionId:e,alias:a})).data}async function io(e){return(await dt.delete(`/aliases/${e}`)).data}async function ro(e,a,l="claude"){const t=pt(l);return(await dt.delete(`${t}/sessions/${e}/${a}`)).data}async function uo(e,a,l="claude"){const t=pt(l);return(await dt.post(`${t}/sessions/${e}/${a}/fork`)).data}async function co(e,a="claude"){return(await dt.post(`/sessions/${e}/create`,{toolType:a})).data}async function po(e,a,l="claude"){const t=pt(l);return(await dt.post(`${t}/sessions/${e}/order`,{order:a})).data}async function vo(e,a,l=15,t="claude"){const n=pt(t);return(await dt.get(`${n}/sessions/${e}/search`,{params:{keyword:a,context:l}})).data}async function mo(e,a=35,l="claude"){const t=pt(l);return(await dt.get(`${t}/sessions/search/global`,{params:{keyword:e,context:a}})).data}async function fo(e,a,l="claude"){const t=pt(l);return(await dt.post(`${t}/sessions/${e}/${a}/launch`)).data}function go(e){if(!e||"object"!=typeof e)return"";if("string"==typeof e.copyCommand&&e.copyCommand.trim())return e.copyCommand;const a="string"==typeof e.command?e.command.trim():"";if(!a)return"";const l="string"==typeof e.cwd?e.cwd.trim():"";return l?`cd ${t=l,`"${String(t).replace(/"/g,'\\"')}"`} && ${a}`:a;var t}async function yo(e,a,l="claude"){const t=await fo(e,a,l),n=go(t);if(!n)throw new Error("未获取到可复制的启动命令");return{text:n,data:t,copyResult:await no(n)}}async function ho(e,a,l=1,t=20,n="desc",s="claude"){const o=pt(s);return(await dt.get(`${o}/sessions/${e}/${a}/messages`,{params:{page:l,limit:t,order:n}})).data}async function bo(e=5,a="claude"){const l=pt(a);return(await dt.get(`${l}/sessions/recent/list?limit=${e}`)).data}const wo=Object.freeze(Object.defineProperty({__proto__:null,copySessionLaunchCommand:yo,createSession:co,deleteAlias:io,deleteSession:ro,forkSession:uo,formatLaunchCommandForCopy:go,getRecentSessions:bo,getSessionLaunchCommand:fo,getSessionMessages:ho,getSessions:so,launchSession:async function(e,a,l=!1,t="claude"){const n=pt(t);return(await dt.post(`${n}/sessions/${e}/${a}/launch`,{fork:l})).data},saveSessionOrder:po,searchSessions:vo,searchSessionsGlobally:mo,setAlias:oo},Symbol.toStringTag,{value:"Module"}));function ko(e=520,a=null){const t=l("undefined"!=typeof window?window.innerWidth:1200),n=()=>{t.value=window.innerWidth};b(()=>{window.addEventListener("resize",n)}),C(()=>{window.removeEventListener("resize",n)});const s=w(()=>t.value<640),o=w(()=>t.value>=640&&t.value<1024);return{drawerWidth:w(()=>{if(t.value<640)return"100%";if(t.value<768)return Math.min(.95*t.value,e);if(t.value<1024){const l=a||e;return Math.min(.85*t.value,l)}return e}),isMobile:s,isTablet:o,windowWidth:t}}const _o={key:0,class:"loading-container"},xo={key:1,class:"sessions-list"},Co=Pl({__name:"RecentSessionsDrawer",props:{visible:{type:Boolean,default:!1},channel:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:s}=ko(800,700),o=e,i=a,d=l(!1),p=l([]),v=l(!1),h=w(()=>o.channel);async function b(){v.value=!0;try{const e=await bo(10,o.channel);p.value=e.sessions}catch(e){Un.error("加载失败: "+e.message)}finally{v.value=!1}}async function k(e){const a=e.alias||"";let l=a;const t=await new Promise(e=>{const t=Sn.create({title:"设置别名",content:()=>j(re,{defaultValue:a,placeholder:"请输入会话别名","onUpdate:value":e=>{l=e},onKeyup:a=>{"Enter"===a.key&&(t.destroy(),e(l.trim()))}}),positiveText:"确定",negativeText:"取消",onPositiveClick:()=>{e(l.trim())},onNegativeClick:()=>{e(null)}})});if(null!==t)try{t?(await oo(e.sessionId,t),Un.success("别名设置成功")):(await io(e.sessionId),Un.success("别名已删除")),await b()}catch(n){Un.error("操作失败: "+n.message)}}async function _(e){try{const{copyResult:a}=await yo(e.projectName,e.sessionId,o.channel);if("manual"===(null==a?void 0:a.method))return void Un.warning("自动复制失败,已弹出手动复制框");Un.success("启动命令已复制到剪贴板")}catch(a){Un.error("复制失败: "+a.message)}}return x(()=>o.visible,e=>{d.value=e,e&&b()}),x(d,e=>{i("update:visible",e)}),x(()=>o.channel,()=>{d.value&&b()}),(e,a)=>(n(),g(c(pe),{show:d.value,"onUpdate:show":a[0]||(a[0]=e=>d.value=e),width:c(s),placement:"right","show-close":!0},{default:u(()=>[r(c(de),{title:"claude"===o.channel?"Claude 最新对话":"codex"===o.channel?"Codex 最新对话":"gemini"===o.channel?"Gemini 最新对话":"opencode"===o.channel?"OpenCode 最新对话":"最新对话","native-scrollbar":!1,closable:""},{default:u(()=>[v.value?(n(),t("div",_o,[r(c(Q),{size:"medium"},{description:u(()=>[...a[1]||(a[1]=[y("加载中...",-1)])]),_:1})])):p.value.length>0?(n(),t("div",xo,[(n(!0),t(m,null,f(p.value,e=>(n(),g(to,{key:e.sessionId,session:e,channel:h.value,"show-project":!0,"hide-fork":!0,"hide-delete":!0,onSetAlias:k,onLaunch:_},null,8,["session","channel"]))),128))])):(n(),g(c(ee),{key:2,description:"暂无最近使用的会话",style:{"margin-top":"60px"}},{icon:u(()=>[r(c(q),{size:"48"},{default:u(()=>[r(c(la))]),_:1})]),_:1}))]),_:1},8,["title"])]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b0f0decf"]]);async function Uo(){return(await dt.get("/favorites")).data}async function So(e,a){return(await dt.post("/favorites",{channel:e,sessionData:a})).data}async function zo(e,a,l){return(await dt.delete(`/favorites/${e}/${encodeURIComponent(a)}/${l}`)).data}const Io=Object.freeze(Object.defineProperty({__proto__:null,addFavorite:So,checkFavorite:async function(e,a,l){return(await dt.get(`/favorites/check/${e}/${encodeURIComponent(a)}/${l}`)).data},getAllFavorites:Uo,getFavorites:async function(e){return(await dt.get(`/favorites/${e}`)).data},removeFavorite:zo},Symbol.toStringTag,{value:"Module"})),To=k("favorites",()=>{const e=l({claude:[],codex:[],gemini:[]}),a=l(!1),t=l(!1);let n=null;const s=w(()=>{var a,l,t;return((null==(a=e.value.claude)?void 0:a.length)||0)+((null==(l=e.value.codex)?void 0:l.length)||0)+((null==(t=e.value.gemini)?void 0:t.length)||0)});return{favorites:e,totalFavorites:s,isLoaded:a,loading:t,loadFavorites:async function(l=!1){if(a.value&&!l)return e.value;if(n&&!l)return n;let s=null;return s=(async()=>{t.value=!0;try{const l=await Uo();return l.success&&l.favorites&&(e.value={claude:l.favorites.claude||[],codex:l.favorites.codex||[],gemini:l.favorites.gemini||[]}),a.value=!0,e.value}catch(l){throw l}finally{t.value=!1,n===s&&(n=null)}})(),n=s,s},addFavorite:async function(a,l){try{const t=await So(a,l);if(t.success&&t.favorites)return e.value=t.favorites,!0}catch(t){}return!1},removeFavorite:async function(a,l,t){try{const n=await zo(a,l,t);if(n.success&&n.favorites)return e.value=n.favorites,!0}catch(n){}return!1},isFavorite:function(a,l,t){return!!e.value[a]&&e.value[a].some(e=>e.sessionId===t&&e.projectName===l)},getFavoritesByChannel:function(a){return e.value[a]||[]}}});function Po(){const e=To(),{favorites:a,totalFavorites:l}=T(e);return e.isLoaded||e.loadFavorites().catch(()=>{}),{favorites:a,addFavorite:e.addFavorite,removeFavorite:e.removeFavorite,isFavorite:e.isFavorite,getFavorites:function(a){return e.getFavoritesByChannel(a)},getAllFavorites:function(){return a.value},totalFavorites:l,loadFavorites:e.loadFavorites}}async function Mo(e="claude"){const a=pt(e);return(await dt.get(`${a}/projects`)).data}async function $o(e,a="claude"){const l=pt(a);return(await dt.post(`${l}/projects/order`,{order:e})).data}async function jo(e,a="claude"){const l=pt(a);return(await dt.delete(`${l}/projects/${e}`)).data}const Oo=Object.freeze(Object.defineProperty({__proto__:null,createProject:async function(e,a,l="claude"){const t=pt(l);return(await dt.post(`${t}/projects/create`,{projectName:e,projectPath:a})).data},deleteProject:jo,getProjects:Mo,saveProjectOrder:$o},Symbol.toStringTag,{value:"Module"})),Ao=new Map,Lo=new Map;function Eo(e,a){return`${e}:${a}`}function Do(e,a){Ao.set(e,{timestamp:Date.now(),payload:a})}function No(e,a,l){Lo.set(Eo(e,a),{timestamp:Date.now(),payload:l})}function Fo(e,a){a?Lo.delete(Eo(e,a)):Array.from(Lo.keys()).filter(a=>a.startsWith(`${e}:`)).forEach(e=>Lo.delete(e))}const Ro=k("sessions",()=>{const e=l([]),a=l(null),t=l(null),n=l([]),s=l({}),o=l(0),i=l(!1),r=l(null),u=l("claude"),c=w(()=>n.value.map(e=>({...e,alias:s.value[e.sessionId]||null})));async function d(e,{force:l=!1}={}){i.value=!0,r.value=null;try{if(!l){const l=function(e,a){const l=Eo(e,a),t=Lo.get(l);return t?Date.now()-t.timestamp>2e4?(Lo.delete(l),null):t.payload:null}(u.value,e);if(l)return n.value=l.sessions||[],s.value=l.aliases||{},o.value=l.totalSize||0,a.value=e,t.value=l.projectInfo||null,void(i.value=!1)}const r=await so(e,u.value);n.value=r.sessions,s.value=r.aliases,o.value=r.totalSize||0,a.value=e,t.value=r.projectInfo,No(u.value,e,{sessions:r.sessions,aliases:r.aliases,totalSize:r.totalSize,projectInfo:r.projectInfo})}catch(c){r.value=c.message}finally{i.value=!1}}return{projects:e,currentProject:a,currentProjectInfo:t,sessions:n,aliases:s,totalSize:o,loading:i,error:r,currentChannel:u,sessionsWithAlias:c,setChannel:function(e){u.value=e},fetchProjects:async function({force:l=!1}={}){var t,n;i.value=!0,r.value=null;try{if(!l){const l=function(e){const a=Ao.get(e);return a?Date.now()-a.timestamp>3e4?(Ao.delete(e),null):a.payload:null}(u.value);if(l)return e.value=l.projects||[],a.value=l.currentProject||(null==(n=null==(t=l.projects)?void 0:t[0])?void 0:n.name)||null,void(i.value=!1)}const s=await Mo(u.value);e.value=s.projects,a.value=s.currentProject,Do(u.value,{projects:s.projects,currentProject:s.currentProject}),Fo(u.value)}catch(s){r.value=s.message}finally{i.value=!1}},fetchSessions:d,setAlias:async function(e,a){try{await oo(e,a),s.value[e]=a}catch(l){throw r.value=l.message,l}},deleteAlias:async function(e){try{await io(e),delete s.value[e]}catch(a){throw r.value=a.message,a}},deleteSession:async function(e){try{await ro(a.value,e,u.value),n.value=n.value.filter(a=>a.sessionId!==e),s.value[e]&&delete s.value[e],No(u.value,a.value,{sessions:n.value,aliases:s.value,totalSize:o.value,projectInfo:t.value})}catch(l){throw r.value=l.message,l}},forkSession:async function(e){try{const l=await uo(a.value,e,u.value);return await d(a.value,{force:!0}),l.newSessionId}catch(l){throw r.value=l.message,l}},saveProjectOrder:async function(l){try{await $o(l,u.value);const t=l.map(a=>e.value.find(e=>e.name===a)).filter(Boolean),n=e.value.filter(e=>!l.includes(e.name));e.value=[...t,...n],Do(u.value,{projects:e.value,currentProject:a.value})}catch(t){throw r.value=t.message,t}},saveSessionOrder:async function(e){try{await po(a.value,e,u.value);const l=e.map(e=>n.value.find(a=>a.sessionId===e)).filter(Boolean),i=n.value.filter(a=>!e.includes(a.sessionId));n.value=[...l,...i],No(u.value,a.value,{sessions:n.value,aliases:s.value,totalSize:o.value,projectInfo:t.value})}catch(l){throw r.value=l.message,l}},deleteProject:async function(l){try{await jo(l,u.value),e.value=e.value.filter(e=>e.name!==l),a.value===l&&(a.value=null),(t=u.value)?Ao.delete(t):Ao.clear(),Fo(u.value,l)}catch(n){throw r.value=n.message,n}var t}}}),Bo={class:"favorites-container"},Ho={key:0,class:"favorites-section"},qo={class:"section-header claude-header"},Ko={class:"sessions-list"},Go={key:1,class:"favorites-section"},Wo={class:"section-header codex-header"},Vo={class:"sessions-list"},Jo={key:2,class:"favorites-section"},Zo={class:"section-header gemini-header"},Yo={class:"sessions-list"},Xo=Pl({__name:"FavoritesDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible","view-history"],setup(e,{emit:a}){const{drawerWidth:i}=ko(800,700),d=e,h=a,b=w({get:()=>d.visible,set:e=>h("update:visible",e)}),{getFavorites:k,removeFavorite:_,getAllFavorites:x}=Po(),C=Ro(),U=w(()=>k("claude")),S=w(()=>k("codex")),z=w(()=>k("gemini")),I=l(!1),T=l(null),P=l(""),M=l("");function $(e){let a="claude";S.value.some(a=>a.sessionId===e.sessionId&&a.projectName===e.projectName)?a="codex":z.value.some(a=>a.sessionId===e.sessionId&&a.projectName===e.projectName)&&(a="gemini"),T.value=e,P.value=e.alias||"",M.value=a,I.value=!0}async function j(){var e,a;if(T.value)try{C.setChannel(M.value);const l=T.value.sessionId;if(P.value){await C.setAlias(l,P.value),Un.success("别名设置成功");const a=null==(e=x()[M.value])?void 0:e.find(e=>e.sessionId===l&&e.projectName===T.value.projectName);a&&(a.alias=P.value)}else{await C.deleteAlias(l),Un.success("别名已删除");const e=null==(a=x()[M.value])?void 0:a.find(e=>e.sessionId===l&&e.projectName===T.value.projectName);e&&(e.alias="")}I.value=!1,T.value=null,P.value=""}catch(l){Un.error("操作失败: "+l.message)}}async function A(e,a){try{const{copyResult:l}=await yo(a.projectName,a.sessionId,e);if("manual"===(null==l?void 0:l.method))return void Un.warning("自动复制失败,已弹出手动复制框");Un.success("启动命令已复制到剪贴板")}catch(l){Un.error("复制失败: "+l.message)}}async function L(e,a){try{await _(e,a.projectName,a.sessionId),Un.success("已移除收藏")}catch(l){Un.error("移除失败: "+l.message)}}return(e,a)=>(n(),g(c(pe),{show:b.value,"onUpdate:show":a[3]||(a[3]=e=>b.value=e),width:c(i),placement:"right"},{default:u(()=>[r(c(de),{title:"我的收藏",closable:""},{default:u(()=>[s("div",Bo,[U.value.length>0?(n(),t("div",Ho,[s("div",qo,[r(c(q),{size:20},{default:u(()=>[r(c(ra))]),_:1}),a[4]||(a[4]=s("h3",{class:"section-title"},"Claude",-1)),r(c(G),{size:"small",bordered:!1,type:"success"},{default:u(()=>[y(v(U.value.length),1)]),_:1})]),s("div",Ko,[(n(!0),t(m,null,f(U.value,l=>(n(),g(to,{key:`claude-${l.projectName}-${l.sessionId}`,session:l,channel:"claude","show-project":!0,"hide-fork":"","hide-delete":"",class:"clickable-session",onClick:a=>e.$emit("view-history",{session:l,channel:"claude"}),onSetAlias:$,onLaunch:e=>A("claude",l)},{"actions-extra":u(()=>[r(c(K),{size:"small",type:"error",onClick:p(e=>L("claude",l),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),default:u(()=>[a[5]||(a[5]=y(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):o("",!0),S.value.length>0?(n(),t("div",Go,[s("div",Wo,[r(c(q),{size:20},{default:u(()=>[r(c(ua))]),_:1}),a[6]||(a[6]=s("h3",{class:"section-title"},"Codex",-1)),r(c(G),{size:"small",bordered:!1,type:"info"},{default:u(()=>[y(v(S.value.length),1)]),_:1})]),s("div",Vo,[(n(!0),t(m,null,f(S.value,l=>(n(),g(to,{key:`codex-${l.projectName}-${l.sessionId}`,session:l,channel:"codex","show-project":!0,"hide-fork":"","hide-delete":"",class:"clickable-session",onClick:a=>e.$emit("view-history",{session:l,channel:"codex"}),onSetAlias:$,onLaunch:e=>A("codex",l)},{"actions-extra":u(()=>[r(c(K),{size:"small",type:"error",onClick:p(e=>L("codex",l),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),default:u(()=>[a[7]||(a[7]=y(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):o("",!0),z.value.length>0?(n(),t("div",Jo,[s("div",Zo,[r(c(q),{size:20},{default:u(()=>[r(c(ca))]),_:1}),a[8]||(a[8]=s("h3",{class:"section-title"},"Gemini",-1)),r(c(G),{size:"small",bordered:!1,type:"warning"},{default:u(()=>[y(v(z.value.length),1)]),_:1})]),s("div",Yo,[(n(!0),t(m,null,f(z.value,l=>(n(),g(to,{key:`gemini-${l.projectName}-${l.sessionId}`,session:l,channel:"gemini","show-project":!0,"hide-fork":"","hide-delete":"",class:"clickable-session",onClick:a=>e.$emit("view-history",{session:l,channel:"gemini"}),onSetAlias:$,onLaunch:e=>A("gemini",l)},{"actions-extra":u(()=>[r(c(K),{size:"small",type:"error",onClick:p(e=>L("gemini",l),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),default:u(()=>[a[9]||(a[9]=y(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):o("",!0),0===e.totalCount?(n(),g(c(ee),{key:3,description:"暂无收藏",style:{"margin-top":"80px"}},{icon:u(()=>[r(c(q),{size:48},{default:u(()=>[r(c(da))]),_:1})]),extra:u(()=>[r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[10]||(a[10]=[y(' 在会话列表中点击"收藏"按钮添加收藏 ',-1)])]),_:1})]),_:1})):o("",!0)]),r(c(ie),{show:I.value,"onUpdate:show":a[2]||(a[2]=e=>I.value=e),preset:"dialog",title:"设置别名"},{action:u(()=>[r(c(se),null,{default:u(()=>[r(c(K),{onClick:a[1]||(a[1]=e=>I.value=!1)},{default:u(()=>[...a[11]||(a[11]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:j},{default:u(()=>[...a[12]||(a[12]=[y("确定",-1)])]),_:1})]),_:1})]),default:u(()=>[r(c(re),{value:P.value,"onUpdate:value":a[0]||(a[0]=e=>P.value=e),placeholder:"输入别名(留空删除)",onKeyup:O(j,["enter"])},null,8,["value"])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-6dbf6eee"]]),Qo=["id"],ei={class:"message-header"},ai={key:0,class:"message-model"},li={class:"message-time"},ti={class:"message-time"},ni={key:0,class:"user-content"},si={key:0},oi={key:1,class:"image-item"},ii=["src"],ri=["innerHTML"],ui=500,ci=Pl({__name:"ChatMessage",props:{message:{type:Object,required:!0},messageAnchorId:{type:String,default:""}},setup(e){ml.registerLanguage("javascript",fl),ml.registerLanguage("python",gl),ml.registerLanguage("bash",yl),ml.registerLanguage("json",hl),ml.registerLanguage("typescript",bl),ml.registerLanguage("css",wl),ml.registerLanguage("xml",kl),ml.registerLanguage("html",kl);const a=e,i=l(!1),u=w(()=>{const e=a.message.content;return"string"==typeof e&&e.length>ui}),p=w(()=>{const e=a.message.content;return"string"==typeof e&&e.length>ui?e.substring(0,ui)+"...":e});_l.setOptions({highlight:(e,a)=>{if(a&&ml.getLanguage(a))try{return ml.highlight(e,{language:a}).value}catch(l){}return ml.highlightAuto(e).value},breaks:!0,gfm:!0});const g=w(()=>{if("assistant"===a.message.type&&a.message.content)try{return _l.parse(a.message.content)}catch(e){return a.message.content}return""}),h=w(()=>{if("assistant"===a.message.type&&a.message.content)try{const e=a.message.content,l=e.length>ui?e.substring(0,ui)+"...":e;return _l.parse(l)}catch(e){return a.message.content.substring(0,ui)+"..."}return""});function b(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}async function k(){const e="string"==typeof a.message.content?a.message.content:JSON.stringify(a.message.content);try{await no(e,{manualFallback:!1})}catch{}}function _(e){var a,l,t,n;if(!e)return null;if("base64"===(null==(a=e.source)?void 0:a.type)&&(null==(l=e.source)?void 0:l.data)){return`data:${e.source.media_type||"image/png"};base64,${e.source.data}`}return"url"===(null==(t=e.source)?void 0:t.type)&&(null==(n=e.source)?void 0:n.url)?e.source.url:e.url?e.url:null}return(a,l)=>(n(),t("div",{id:e.messageAnchorId||void 0,class:d(["chat-message",[`message-${e.message.type}`]])},[s("div",ei,["assistant"===e.message.type?(n(),t(m,{key:0},[r(c(q),{size:16,component:c(pa),class:"role-icon"},null,8,["component"]),l[1]||(l[1]=s("span",{class:"message-role"},"AI",-1)),e.message.model?(n(),t("span",ai,v(e.message.model),1)):o("",!0),s("span",li,v(e.message.timestamp?b(e.message.timestamp):""),1),l[2]||(l[2]=s("span",{class:"spacer"},null,-1)),s("span",{class:"copy-btn",onClick:k,title:"复制"},[r(c(q),{size:14,component:c(va)},null,8,["component"])])],64)):(n(),t(m,{key:1},[s("span",{class:"copy-btn",onClick:k,title:"复制"},[r(c(q),{size:14,component:c(va)},null,8,["component"])]),l[3]||(l[3]=s("span",{class:"spacer"},null,-1)),s("span",ti,v(e.message.timestamp?b(e.message.timestamp):""),1),l[4]||(l[4]=s("span",{class:"message-role"},"用户",-1)),r(c(q),{size:16,component:c(ma),class:"role-icon"},null,8,["component"])],64))]),s("div",{class:d(["message-content",{collapsed:!i.value&&u.value}])},["user"===e.message.type?(n(),t("div",ni,["string"==typeof e.message.content?(n(),t(m,{key:0},[y(v(i.value?e.message.content:p.value),1)],64)):Array.isArray(e.message.content)?(n(!0),t(m,{key:1},f(e.message.content,(e,a)=>(n(),t("div",{key:a,class:"content-item"},["text"===e.type?(n(),t("div",si,v(e.text),1)):"image"===e.type?(n(),t("div",oi,[_(e)?(n(),t("img",{key:0,src:_(e),alt:"会话图片",loading:"lazy"},null,8,ii)):(n(),t(m,{key:1},[r(c(q),{size:20,component:c(fa)},null,8,["component"]),l[5]||(l[5]=s("span",null,"图片内容",-1))],64))])):o("",!0)]))),128)):o("",!0)])):"assistant"===e.message.type?(n(),t("div",{key:1,class:"assistant-content markdown-body",innerHTML:i.value?g.value:h.value},null,8,ri)):o("",!0)],2),u.value?(n(),t("div",{key:0,class:"expand-btn",onClick:l[0]||(l[0]=e=>i.value=!i.value)},v(i.value?"收起":"展开全部"),1)):o("",!0)],10,Qo))}},[["__scopeId","data-v-35aebdef"]]),di={class:"drawer-wrapper"},pi={class:"header-row"},vi={class:"session-name"},mi={key:0,class:"session-summary"},fi={class:"drawer-body"},gi={key:0,class:"loading-container"},yi={key:1,class:"empty-container"},hi={key:2,class:"history-layout"},bi={class:"mobile-toc-toggle"},wi={key:0,class:"toc-empty"},ki={key:1,class:"toc-list"},_i=["onClick"],xi={class:"toc-preview"},Ci={class:"toc-time"},Ui={class:"messages-pane"},Si={key:0,class:"load-more-top"},zi={class:"messages-list"},Ii=Pl({__name:"ChatHistoryDrawer",props:{show:{type:Boolean,default:!1},projectName:{type:String,required:!0},sessionId:{type:String,required:!0},sessionAlias:{type:String,default:""},channel:{type:String,default:"claude"}},emits:["update:show","error"],setup(e,{expose:a,emit:i}){const p=e,h=i,{drawerWidth:b}=ko(900,800),k=w({get:()=>p.show,set:e=>h("update:show",e)}),_=l(!1),C=l([]),U=l({}),S=l(1),z=l(0),I=l(!1),T=l(null),M=l(null),$=l(!1),j=l(""),O=l(!1),L=l(null),E=l(!1);let D=0,N=0;const F=w(()=>le(p.sessionId).slice(0,16)||"session"),R=w(()=>{const e=new Map;return C.value.map((a,l)=>{const t=function(e,a){const l=ae(e);if(l)return`msg-${F.value}-${le(l)}`;const t=(null==e?void 0:e.timestamp)?String(e.timestamp):"",n=(null==e?void 0:e.type)?String(e.type):"unknown",s=function(e){const a=null==e?void 0:e.content;if("string"==typeof a)return a.slice(0,240);if(Array.isArray(a))try{return JSON.stringify(a).slice(0,240)}catch{return String(a)}if(null==a)return"";return String(a).slice(0,240)}(e),o=function(e){let a=0;for(let l=0;l<e.length;l+=1)a=(a<<5)-a+e.charCodeAt(l),a|=0;return Math.abs(a).toString(36)}(`${n}|${t}|${s}`),i=t?le(t):`idx${a}`;return`msg-${F.value}-${n}-${i}-${o}`}(a,l),n=e.get(t)||0;return e.set(t,n+1),0===n?t:`${t}-${n+1}`})}),B=w(()=>C.value.map((e,a)=>({message:e,index:a,anchorId:R.value[a]})).filter(e=>"user"===e.message.type&&"tool_result"!==e.message.subtype).map(e=>({messageIndex:e.index,anchorId:e.anchorId,preview:oe(e.message),timestamp:e.message.timestamp})));async function H(e=1,a={}){var l,t;if(_.value)return;const{skipFirstPageScroll:n=!1}=a;try{_.value=!0;const a=await ho(p.projectName,p.sessionId,e,20,"desc",p.channel),{messages:l,metadata:t,pagination:s}=a;1===e?(C.value=l.reverse(),U.value=t):C.value=[...l.reverse(),...C.value],S.value=s.page,z.value=s.total,I.value=s.hasMore,1===e&&P(async()=>{L.value?await async function(e,a={}){if(!e)return!1;const{allowLoadMore:l=!1}=a;let t=0;for(;t<50;){t+=1;const a=X(e);if(a&&Y(a,!0))return j.value=a,L.value=null,!0;if(!l||!I.value||_.value)break;const n=S.value;if(await H(S.value+1),S.value===n)break}return L.value=null,Z(),!1}(L.value,{allowLoadMore:!0}):n||V(!1),Z()})}catch(s){const e="加载聊天记录失败: "+((null==(t=null==(l=s.response)?void 0:l.data)?void 0:t.error)||s.message);h("error",e)}finally{_.value=!1}}function W(){if(!I.value||_.value)return;const e=T.value,a=(null==e?void 0:e.scrollHeight)||0;H(S.value+1).then(()=>{P(()=>{if(e){const l=e.scrollHeight;e.scrollTop=l-a,Z()}})})}function V(e=!0){P(()=>{const a=T.value;a&&(a.scrollTo({top:a.scrollHeight,behavior:e?"smooth":"auto"}),Z())})}function J(e){const a=e.target;if(!a)return;const{scrollTop:l,scrollHeight:t,clientHeight:n}=a;$.value=t-l-n>200,l<100&&I.value&&!_.value&&W(),Z()}function Z(){D||(D=requestAnimationFrame(()=>{D=0,function(){const e=T.value;if(!e||0===B.value.length)return void(j.value="");const a=Math.max(0,e.scrollHeight-e.clientHeight);if(a>0&&a-e.scrollTop<=6)return void(j.value=B.value[B.value.length-1].anchorId);const l=e.scrollTop,t=l+e.clientHeight,n=l+se();let s=null,o=null;for(const r of B.value){const a=te(r.anchorId);if(!a)continue;const i=ne(a,e),u=i+a.offsetHeight;i<=n+1&&(o=r),!s&&u>l&&i<t&&(s=r)}const i=(null==o?void 0:o.anchorId)||(null==s?void 0:s.anchorId)||B.value[0].anchorId;i&&(j.value=i)}()}))}function Y(e,a=!0){const l=T.value;if(!l||!e)return!1;const t=te(e);if(!t)return!1;const n=ne(t,l),s=Math.max(0,l.scrollHeight-l.clientHeight),o=(i=n-se(),r=0,u=s,Math.min(Math.max(i,r),u));var i,r,u;return l.scrollTo({top:o,behavior:a?"smooth":"auto"}),Z(),!0}function X(e){if(e.anchorId&&"string"==typeof e.anchorId)return e.anchorId;if("number"==typeof e.messageIndex&&e.messageIndex>=0)return R.value[e.messageIndex]||"";if(e.messageId){const a=String(e.messageId),l=C.value.findIndex(e=>ae(e)===a);if(l>=0)return R.value[l]}return""}function ae(e){return e&&"object"==typeof e?String(e.messageId||e.id||e.uuid||e.turnId||""):""}function le(e){return String(e||"").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)}function te(e){const a=T.value;if(!a||!e)return null;const l=document.getElementById(e);return l&&a.contains(l)?l:null}function ne(e,a){const l=a.getBoundingClientRect(),t=e.getBoundingClientRect();return a.scrollTop+(t.top-l.top)}function se(){var e;return((null==(e=M.value)?void 0:e.offsetHeight)||0)+12}function oe(e){let a="";const l=null==e?void 0:e.content;"string"==typeof l?a=l:Array.isArray(l)?a=l.filter(e=>"text"===(null==e?void 0:e.type)&&(null==e?void 0:e.text)).map(e=>e.text).join(" "):null!=l&&(a=String(l));const t=a.split("\n").map(e=>e.trim()).find(Boolean)||"(空消息)";return t.length>42?`${t.slice(0,42)}...`:t}function ie(e){if(!e)return"";const a=new Date(e);return Number.isNaN(a.getTime())?"":a.toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}return x(B,()=>{B.value.length?(B.value.some(e=>e.anchorId===j.value)||(j.value=B.value[0].anchorId),Z()):j.value=""},{deep:!0}),x(k,e=>{e?P(()=>{Z()}):(N+=1,E.value=!1)}),A(()=>{D&&(cancelAnimationFrame(D),D=0),N+=1,E.value=!1}),a({open:function(e){N+=1;const a=N;L.value=function(e){if(!e||"object"!=typeof e)return null;const a=e.jumpTo&&"object"==typeof e.jumpTo?e.jumpTo:e,l={anchorId:"string"==typeof a.anchorId?a.anchorId:"",messageId:a.messageId||a.id||"",messageIndex:Number.isInteger(a.messageIndex)?a.messageIndex:null};return l.anchorId||l.messageId||null!==l.messageIndex?l:null}(e),O.value=!1,C.value=[],U.value={},S.value=1,z.value=0,I.value=!1,$.value=!1,j.value="",E.value=!1,H(1,{skipFirstPageScroll:Boolean(L.value)}).then(()=>async function(e){if(e!==N||E.value)return;if(!I.value)return;E.value=!0;let a=0;try{for(;e===N&&I.value&&(a+=1,!(a>120));){const e=S.value,a=T.value,l=(null==a?void 0:a.scrollHeight)||0,t=(null==a?void 0:a.scrollTop)||0;if(await H(e+1),await P(),a){const e=a.scrollHeight-l;e>0&&(a.scrollTop=t+e)}if(Z(),S.value===e){if(!I.value)break;await new Promise(e=>setTimeout(e,80))}}}finally{e===N&&(E.value=!1)}}(a)).catch(()=>{})}}),(a,l)=>(n(),g(c(pe),{show:k.value,"onUpdate:show":l[2]||(l[2]=e=>k.value=e),width:c(b),placement:"right","auto-focus":!1,"trap-focus":!1,"block-scroll":!1},{default:u(()=>[s("div",di,[s("div",{ref_key:"headerRef",ref:M,class:"drawer-header"},[s("div",pi,[r(c(q),{size:18,component:c(pa)},null,8,["component"]),s("span",vi,v(e.sessionAlias||e.sessionId.substring(0,8))+" ("+v(z.value)+")",1),U.value.gitBranch?(n(),g(c(G),{key:0,size:"small",type:"info"},{icon:u(()=>[r(c(q),{component:c(ga)},null,8,["component"])]),default:u(()=>[y(" "+v(U.value.gitBranch),1)]),_:1})):o("",!0),l[3]||(l[3]=s("span",{class:"spacer"},null,-1)),r(c(q),{size:20,component:c(ya),class:"close-btn",onClick:l[0]||(l[0]=e=>k.value=!1)},null,8,["component"])]),U.value.summary?(n(),t("div",mi,v(U.value.summary),1)):o("",!0)],512),s("div",fi,[_.value&&0===C.value.length?(n(),t("div",gi,[r(c(Q),{size:"medium"},{description:u(()=>[...l[4]||(l[4]=[y("加载聊天记录...",-1)])]),_:1})])):_.value||0!==C.value.length?(n(),t("div",hi,[s("div",bi,[r(c(K),{tertiary:"",size:"small",onClick:l[1]||(l[1]=e=>O.value=!O.value)},{default:u(()=>[y(v(O.value?"展开用户目录":"收起用户目录"),1)]),_:1})]),s("aside",{class:d(["toc-rail",{"mobile-collapsed":O.value}])},[l[5]||(l[5]=s("div",{class:"toc-header"},"用户目录",-1)),0===B.value.length?(n(),t("div",wi,"暂无用户消息")):(n(),t("div",ki,[(n(!0),t(m,null,f(B.value,e=>(n(),t("button",{key:e.anchorId,type:"button",class:d(["toc-item",{active:j.value===e.anchorId}]),onClick:a=>function(e){(null==e?void 0:e.anchorId)&&(j.value=e.anchorId,Y(e.anchorId,!0))}(e)},[s("span",xi,v(e.preview),1),s("span",Ci,v(ie(e.timestamp)),1)],10,_i))),128))]))],2),s("div",Ui,[s("div",{class:"messages-container",ref_key:"messagesContainer",ref:T,onScroll:J},[I.value?(n(),t("div",Si,[r(c(K),{loading:_.value,onClick:W,size:"small",secondary:""},{icon:u(()=>[r(c(q),{component:c(ha)},null,8,["component"])]),default:u(()=>[l[6]||(l[6]=y(" 加载更早的消息 ",-1))]),_:1},8,["loading"])])):o("",!0),s("div",zi,[(n(!0),t(m,null,f(C.value,(e,a)=>(n(),g(ci,{key:R.value[a]||a,message:e,"message-anchor-id":R.value[a]},null,8,["message","message-anchor-id"]))),128))])],544),$.value?(n(),t("div",{key:0,class:"scroll-btn",onClick:V},[r(c(q),{size:18,component:c(ba)},null,8,["component"])])):o("",!0)])])):(n(),t("div",yi,[r(c(ee),{description:"暂无聊天记录"})]))])])]),_:1},8,["show","width"]))}},[["__scopeId","data-v-4da27f38"]]);async function Ti(){return(await dt.get("/security")).data}async function Pi(e){return(await dt.post("/security/verify",{password:e})).data}async function Mi(e){return(await dt.post("/security/password",e)).data}const $i=Object.freeze(Object.defineProperty({__proto__:null,getSecurityStatus:Ti,setSecurityPassword:Mi,verifySecurityPassword:Pi},Symbol.toStringTag,{value:"Module"}));async function ji(){return(await dt.get("/pm2-autostart")).data}async function Oi(){return(await dt.post("/pm2-autostart",{action:"enable"})).data}async function Ai(){return(await dt.post("/pm2-autostart",{action:"disable"})).data}const Li=Object.freeze(Object.defineProperty({__proto__:null,disableAutoStart:Ai,enableAutoStart:Oi,getAutoStartStatus:ji},Symbol.toStringTag,{value:"Module"}));async function Ei(){return(await dt.get("/dashboard/init")).data}const Di=Object.freeze(Object.defineProperty({__proto__:null,getDashboardInit:Ei},Symbol.toStringTag,{value:"Module"}));const Ni={...Oo,...wo,...Wt,...ys,...fs,...Object.freeze(Object.defineProperty({__proto__:null,checkForUpdates:async function(){return(await dt.get("/version/check")).data},getAllChangelog:async function(){return(await dt.get("/version/changelog")).data},getChangelog:async function(e){return(await dt.get(`/version/changelog/${e}`)).data},getCurrentVersion:async function(){return(await dt.get("/version/current")).data},performUpdate:async function(){return(await dt.post("/version/update")).data}},Symbol.toStringTag,{value:"Module"})),...Io,...Mn,...$i,...Li,...Di},Fi=k("dashboard",()=>{const e=l({uiConfig:null,favorites:null,channels:{claude:[],codex:[],gemini:[],opencode:[]},proxyStatus:{claude:{},codex:{},gemini:{},opencode:{}},todayStats:{claude:{requests:0,tokens:0,cost:0,byModel:{}},codex:{requests:0,tokens:0,cost:0,byModel:{}},gemini:{requests:0,tokens:0,cost:0,byModel:{}},opencode:{requests:0,tokens:0,cost:0,byModel:{}}},counts:{claude:{projectCount:0,sessionCount:0},codex:{projectCount:0,sessionCount:0},gemini:{projectCount:0,sessionCount:0},opencode:{projectCount:0,sessionCount:0}}}),a=l(!1),t=l(!1);let n=null,s=null;async function o(l=!1){return t.value&&!l?e.value:(n&&!l||(a.value=!0,n=(async()=>{var l,s,o,i,r,u,c,d,p,v,m,f,g,y,h,b;try{const a=await Ei();if(!a||!1===a.success)throw new Error((null==a?void 0:a.message)||"Failed to load dashboard");const n=a.data||{},w=(e={})=>({requests:e.requests||0,tokens:e.tokens||0,cost:e.cost||0,byModel:e.byModel||{}});return e.value={uiConfig:n.uiConfig||null,favorites:n.favorites||null,channels:{claude:(null==(l=n.channels)?void 0:l.claude)||[],codex:(null==(s=n.channels)?void 0:s.codex)||[],gemini:(null==(o=n.channels)?void 0:o.gemini)||[],opencode:(null==(i=n.channels)?void 0:i.opencode)||[]},proxyStatus:{claude:(null==(r=n.proxyStatus)?void 0:r.claude)||{},codex:(null==(u=n.proxyStatus)?void 0:u.codex)||{},gemini:(null==(c=n.proxyStatus)?void 0:c.gemini)||{},opencode:(null==(d=n.proxyStatus)?void 0:d.opencode)||{}},todayStats:{claude:w(null==(p=n.todayStats)?void 0:p.claude),codex:w(null==(v=n.todayStats)?void 0:v.codex),gemini:w(null==(m=n.todayStats)?void 0:m.gemini),opencode:w(null==(f=n.todayStats)?void 0:f.opencode)},counts:{claude:(null==(g=n.counts)?void 0:g.claude)||{projectCount:0,sessionCount:0},codex:(null==(y=n.counts)?void 0:y.codex)||{projectCount:0,sessionCount:0},gemini:(null==(h=n.counts)?void 0:h.gemini)||{projectCount:0,sessionCount:0},opencode:(null==(b=n.counts)?void 0:b.opencode)||{projectCount:0,sessionCount:0}}},t.value=!0,e.value}finally{a.value=!1,n=null}})().catch(e=>{throw e})),n)}return{dashboardData:e,isLoading:a,isLoaded:t,loadDashboard:o,enableAutoRefresh:function(){s||(s=setInterval(()=>{o(!0).catch(()=>{})},3e5))},disableAutoRefresh:function(){s&&(clearInterval(s),s=null)},refreshChannels:async function(a){try{if("claude"===a){const a=await Ni.getChannels();a.success&&(e.value.channels.claude=a.channels)}else if("codex"===a){const a=await Ni.getCodexChannels();a.success&&(e.value.channels.codex=a.channels)}else if("gemini"===a){const a=await Ni.getGeminiChannels();a.success&&(e.value.channels.gemini=a.channels)}else if("opencode"===a){const a=await Ni.getOpenCodeChannels();a.success&&(e.value.channels.opencode=a.channels)}}catch(l){}},refreshProxyStatus:async function(a){try{if("claude"===a){const a=await Ni.getProxyStatus();a.success&&(e.value.proxyStatus.claude=a)}else if("codex"===a){const a=await Ni.getCodexProxyStatus();a.success&&(e.value.proxyStatus.codex=a)}else if("gemini"===a){const a=await Ni.getGeminiProxyStatus();a.success&&(e.value.proxyStatus.gemini=a)}else if("opencode"===a){const a=await Ni.getOpenCodeProxyStatus();a.success&&(e.value.proxyStatus.opencode=a)}}catch(l){}},refreshStats:async function(a){try{const l=(e={})=>{const a=e.summary||{};return{requests:a.requests||0,tokens:a.tokens||0,cost:a.cost||0,byModel:e.byModel||{}}};if("claude"===a){const a=await Ni.getTodayStatistics();e.value.todayStats.claude=l(a)}else if("codex"===a){const a=await Ni.getCodexTodayStatistics();e.value.todayStats.codex=l(a)}else if("gemini"===a){const a=await Ni.getGeminiTodayStatistics();e.value.todayStats.gemini=l(a)}else if("opencode"===a){const a=await Ni.getOpenCodeTodayStatistics();e.value.todayStats.opencode=l(a)}}catch(l){}}}}),Ri="cc-theme",Bi=l(!1);let Hi=!1,qi=null,Ki=null,Gi=!1;function Wi(){return qi||(qi=Fi(),Ki=T(qi).dashboardData),qi}function Vi(){Gi||Ki&&(x(()=>{var e,a;return null==(a=null==(e=Ki.value)?void 0:e.uiConfig)?void 0:a.theme},e=>{if(!e)return;const a="dark"===e;if(!Hi)return Hi=!0,Bi.value=a,void Zi(a);Bi.value!==a&&(Bi.value=a,Zi(a))}),Gi=!0)}async function Ji(){var e,a,l,t;if(Hi)return;const n="undefined"!=typeof window?null==(e=window.localStorage)?void 0:e.getItem(Ri):null;"dark"!==n&&"light"!==n||(Bi.value="dark"===n,Zi(Bi.value));try{const e=Wi();Vi();let s=null==(l=null==(a=null==Ki?void 0:Ki.value)?void 0:a.uiConfig)?void 0:l.theme;if(!s){const a=await e.loadDashboard().catch(()=>null);s=null==(t=null==a?void 0:a.uiConfig)?void 0:t.theme}s||n?s&&(Bi.value="dark"===s):Bi.value=window.matchMedia("(prefers-color-scheme: dark)").matches}catch(s){n||(Bi.value=window.matchMedia("(prefers-color-scheme: dark)").matches)}Zi(Bi.value),Hi=!0}function Zi(e){e?document.documentElement.setAttribute("data-theme","dark"):document.documentElement.removeAttribute("data-theme")}function Yi(){Bi.value=!Bi.value}function Xi(){return{isDark:Bi,toggleTheme:Yi,loadTheme:Ji}}x(Bi,async e=>{var a;Zi(e);try{null==(a=window.localStorage)||a.setItem(Ri,e?"dark":"light")}catch(l){}try{await Tn("theme",e?"dark":"light");Wi();Vi(),Ki.value&&(Ki.value={...Ki.value,uiConfig:{...Ki.value.uiConfig||{},theme:e?"dark":"light"}})}catch(l){}});const Qi={class:"settings-container"},er={class:"settings-sidebar"},ar={class:"sidebar-header"},lr={class:"settings-menu"},tr=["onClick"],nr={class:"menu-label"},sr={class:"settings-content"},or={class:"settings-panel"},ir={class:"panel-header"},rr={class:"panel-title-row"},ur={class:"panel-body"},cr={class:"setting-group"},dr={class:"setting-item"},pr={class:"setting-label"},vr={class:"visibility-options"},mr={class:"visibility-item"},fr={class:"visibility-info"},gr={class:"visibility-item"},yr={class:"visibility-info"},hr={class:"setting-item"},br={class:"setting-label"},wr={class:"simple-theme-options"},kr={class:"theme-text"},_r={key:0,class:"theme-check"},xr={class:"theme-text"},Cr={key:0,class:"theme-check"},Ur={class:"settings-panel"},Sr={class:"panel-header"},zr={class:"panel-title-row"},Ir={class:"panel-body"},Tr={class:"setting-group"},Pr={class:"setting-item"},Mr={class:"setting-label"},$r={class:"notification-options"},jr={class:"visibility-item"},Or={class:"visibility-info"},Ar={key:0,class:"notification-type-section"},Lr={class:"radio-content"},Er={class:"radio-content"},Dr={style:{"font-size":"13px"}},Nr={class:"setting-item"},Fr={class:"setting-label"},Rr={class:"notification-options"},Br={class:"visibility-item"},Hr={class:"visibility-info"},qr={key:0,class:"notification-type-section"},Kr={class:"setting-item"},Gr={class:"setting-label"},Wr={class:"panel-footer"},Vr={class:"settings-panel"},Jr={class:"panel-header"},Zr={class:"panel-title-row"},Yr={class:"panel-body"},Xr={class:"setting-group"},Qr={class:"setting-item"},eu={class:"setting-label"},au={class:"ports-grid"},lu={class:"port-field"},tu={class:"port-field"},nu={class:"port-field"},su={class:"port-field"},ou={class:"port-field"},iu={class:"setting-item"},ru={class:"setting-label"},uu={class:"advanced-options"},cu={class:"option-field"},du={class:"option-label"},pu={class:"setting-item"},vu={class:"setting-label"},mu={class:"advanced-options"},fu={class:"option-field"},gu={class:"option-label"},yu={class:"option-field"},hu={class:"option-label"},bu={class:"setting-item"},wu={class:"setting-label"},ku={style:{"margin-top":"16px"}},_u={style:{background:"var(--bg-secondary)",padding:"16px","border-radius":"8px","border-left":"3px solid var(--border-secondary)"}},xu={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},Cu={class:"panel-footer"},Uu={class:"settings-panel"},Su={class:"panel-header"},zu={class:"panel-title-row"},Iu={class:"panel-body"},Tu={key:0,class:"security-locked"},Pu={key:1,class:"setting-group"},Mu={class:"setting-item"},$u={class:"setting-label"},ju={class:"security-status"},Ou={class:"setting-item"},Au={class:"setting-label"},Lu={class:"security-form"},Eu={class:"panel-footer"},Du={class:"settings-panel"},Nu={class:"panel-header"},Fu={class:"panel-title-row"},Ru={class:"panel-body"},Bu={class:"setting-item",style:{"margin-bottom":"12px"}},Hu={class:"model-meta-section"},qu={class:"speed-test-defaults"},Ku={class:"speed-test-default-label"},Gu={class:"model-toolbar"},Wu={class:"model-filter-row"},Vu={key:0,class:"setting-item"},Ju={key:1,class:"model-list"},Zu=["onClick"],Yu={class:"model-card-id"},Xu={key:0,class:"model-card-body"},Qu={class:"model-meta-editor"},ec={class:"model-meta-section"},ac={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},lc={class:"model-meta-section",style:{"margin-top":"8px"}},tc={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},nc={class:"panel-footer"},sc={class:"security-auth"},oc={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},ic={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},rc={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},uc=Pl({__name:"SettingsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:k}=ko(680);async function _(e){return(await dt.post("/settings/model-settings",e)).data}async function C(e){return(await dt.delete(`/settings/model-settings/${encodeURIComponent(e)}`)).data}const U=e,S=a,I=w({get:()=>U.visible,set:e=>S("update:visible",e)}),T=l("appearance"),{isDark:P,toggleTheme:M}=Xi(),$=l(!0),j=l(!0),A=l({webUI:19999,proxy:20088,codexProxy:20089,geminiProxy:20090,opencodeProxy:20091}),E=l({webUI:19999,proxy:20088,codexProxy:20089,geminiProxy:20090,opencodeProxy:20091}),D=l(!1),N=l(!1),F=l(!1),R=w(()=>N.value?"✓ 已启用":"未启用"),B=w(()=>N.value?"重启电脑时 Coding-Tool 会自动启动。如需禁用,点击下方按钮":"启用后,重启电脑时 Coding-Tool 会自动启动"),H=l({maxLogs:100,statsInterval:30,enableSessionBinding:!0}),J=l({maxLogs:100,statsInterval:30,enableSessionBinding:!0}),Z=l({claude:{enabled:!1,type:"notification"},feishu:{enabled:!1,webhookUrl:""}}),Y=l({claude:{enabled:!1,type:"notification"},feishu:{enabled:!1,webhookUrl:""}}),X=l(!1),ae=l(""),le=l({hasPassword:!1}),ce=l(!1),ge=l(!1),ye=l(!1),he=l(!1),be=l(""),we=l(""),ke=l(!1),_e=l({currentPassword:"",newPassword:"",confirmPassword:""}),xe=l(!1);let Ce=null;const Ue=l(!1),Se=l(!1),ze=l({}),Ie=l({}),Te=l({}),Pe=l(""),Me=l("all"),$e=l(!1),je=l({modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0}),Oe=l(new Set),Ae=l({claude:"",codex:"",gemini:""}),Le=l({claude:"",codex:"",gemini:""}),Ee=[{key:"claude",label:"Claude Code"},{key:"codex",label:"Codex"},{key:"gemini",label:"Gemini CLI"}],De=l(new Set),Ne=w(()=>Object.keys(Te.value).length>0),Fe=w(()=>Ne.value||JSON.stringify(Ae.value)!==JSON.stringify(Le.value)),Re=w(()=>{const e=String(je.value.modelId||"").trim();if(!e)return"请输入模型 ID";const a=Object.keys(ze.value).find(a=>a.toLowerCase()===e.toLowerCase());return a?`模型已存在:${a}`:!Number.isFinite(je.value.context)||je.value.context<=0?"Context 窗口必须为正数":!Number.isFinite(je.value.output)||je.value.output<=0?"Max Output 必须为正数":je.value.inputPrice<0||je.value.outputPrice<0||je.value.cacheCreationPrice<0||je.value.cacheReadPrice<0?"价格不能为负数":""});function Be(){je.value={modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0},$e.value=!0}function qe(){$e.value=!1}function Ke(){if(Re.value)return;const e=String(je.value.modelId||"").trim(),a={limit:{context:je.value.context,output:je.value.output},pricing:{input:je.value.inputPrice,output:je.value.outputPrice,cacheCreation:je.value.cacheCreationPrice,cacheRead:je.value.cacheReadPrice}};ze.value[e]=a,Te.value[e]={limit:{...a.limit},pricing:{...a.pricing}},Pe.value=e,$e.value=!1,Un.success("模型已新增,请点击“保存设置”使其生效")}function Ge(e){return Oe.value.has(e)}function We(e){return!Ge(e)}const Je=w(()=>{const e=Object.keys(ze.value),a=Pe.value.trim().toLowerCase(),l=Me.value;return e.filter(e=>!(a&&!e.toLowerCase().includes(a))&&("claude"===l?e.startsWith("claude-"):"openai"===l?e.startsWith("gpt-")||e.startsWith("o1")||e.startsWith("o3")||e.startsWith("o4"):"gemini"===l?e.startsWith("gemini-"):"overrides"!==l||!!Ie.value[e]))});function Ze(e){const a=String(e||"").trim().toLowerCase();return a.startsWith("claude-")?"claude":a.startsWith("gemini-")?"gemini":a.startsWith("gpt-")||a.startsWith("o1")||a.startsWith("o3")||a.startsWith("o4")?"codex":""}const Ye=w(()=>{const e={claude:[],codex:[],gemini:[]};for(const[a,l]of Object.entries(ze.value||{})){if(!l||"object"!=typeof l||!l.limit||!l.pricing)continue;const t=Ze(a);t&&e[t]&&e[t].push({label:a,value:a})}for(const a of Object.keys(e))e[a].sort((e,a)=>e.label.localeCompare(a.label));return e});function Xe(e,a,l){var t,n,s,o;return void 0!==(null==(n=null==(t=Te.value[e])?void 0:t[a])?void 0:n[l])?Te.value[e][a][l]:(null==(o=null==(s=ze.value[e])?void 0:s[a])?void 0:o[l])??null}function Qe(e,a,l,t){if(!Te.value[e]){const a=ze.value[e]||{};Te.value[e]={limit:{...a.limit||{}},pricing:{...a.pricing||{}}}}Te.value[e][a]||(Te.value[e][a]={}),Te.value[e][a][l]=t}async function ea(){var e,a,l;Ue.value=!0;try{const t=await async function(){return(await dt.get("/settings/model-settings")).data}();ze.value=t.models||{},Ie.value=t.overrides||{},Oe.value=new Set(t.builtinModelIds||[]),Ae.value={claude:"string"==typeof(null==(e=t.defaultSpeedTestModels)?void 0:e.claude)?t.defaultSpeedTestModels.claude:"",codex:"string"==typeof(null==(a=t.defaultSpeedTestModels)?void 0:a.codex)?t.defaultSpeedTestModels.codex:"",gemini:"string"==typeof(null==(l=t.defaultSpeedTestModels)?void 0:l.gemini)?t.defaultSpeedTestModels.gemini:""},function(){const e={...Ae.value};let a=!1;for(const l of Ee){const t=Ye.value[l.key]||[];0!==t.length&&(new Set(t.map(e=>e.value)).has(e[l.key])||(e[l.key]=t[0].value,a=!0))}a&&(Ae.value=e)}(),Le.value={...Ae.value},Te.value={}}catch(t){}finally{Ue.value=!1}}async function aa(){Se.value=!0;try{const e={...Ie.value};for(const[a,l]of Object.entries(Te.value)){const t=e[a]||{};e[a]={limit:{...t.limit||{},...l.limit||{}},pricing:{...t.pricing||{},...l.pricing||{}}}}await _({overrides:e,defaultSpeedTestModels:Ae.value}),Ie.value=e,Le.value={...Ae.value},Te.value={},await ea(),Un.success("模型设置已保存")}catch(e){Un.error("保存失败:"+e.message)}finally{Se.value=!1}}async function la(){try{await _({overrides:{},defaultSpeedTestModels:Ae.value}),Ie.value={},Te.value={},await ea(),Un.success("全部模型设置已重置为内置默认值")}catch(e){Un.error("重置失败:"+e.message)}}const ta=w(()=>A.value.webUI!==E.value.webUI||A.value.proxy!==E.value.proxy||A.value.codexProxy!==E.value.codexProxy||A.value.geminiProxy!==E.value.geminiProxy||A.value.opencodeProxy!==E.value.opencodeProxy||H.value.maxLogs!==J.value.maxLogs||H.value.statsInterval!==J.value.statsInterval||H.value.enableSessionBinding!==J.value.enableSessionBinding),na=w(()=>le.value.hasPassword&&!ye.value),sa=w(()=>_e.value.newPassword&&_e.value.confirmPassword?_e.value.newPassword.length<4?"密码至少 4 位":_e.value.newPassword!==_e.value.confirmPassword?"两次输入的新密码不一致":"":""),oa=w(()=>!na.value&&(!(!_e.value.newPassword||!_e.value.confirmPassword)&&(!sa.value&&!(le.value.hasPassword&&!_e.value.currentPassword)))),ia=w(()=>[{key:"appearance",label:"外观设置",icon:L(wa)},{key:"notification",label:"通知设置",icon:L(ka)},{key:"advanced",label:"高级设置",icon:L(_a)},{key:"security",label:"安全设置",icon:L(xa)},{key:"model-settings",label:"模型设置",icon:L(ca)}]);async function ra(){var e,a;try{const l=await zn();l.success&&l.config&&($.value=!1!==(null==(e=l.config.panelVisibility)?void 0:e.showChannels),j.value=!1!==(null==(a=l.config.panelVisibility)?void 0:a.showLogs))}catch(l){}}async function ua(){try{await Pn("panelVisibility","showChannels",$.value),await Pn("panelVisibility","showLogs",j.value)}catch(e){}}function da(e){$.value=e,ua(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:e,showLogs:j.value}}))}function pa(e){j.value=e,ua(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:$.value,showLogs:e}}))}async function va(e){try{(await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:A.value,maxLogs:H.value.maxLogs,statsInterval:H.value.statsInterval,enableSessionBinding:e})})).ok?(J.value.enableSessionBinding=e,Un.success(e?"会话绑定已开启":"会话绑定已关闭")):(H.value.enableSessionBinding=!e,Un.error("保存失���"))}catch(a){H.value.enableSessionBinding=!e,Un.error("保存失败: "+a.message)}}async function ma(){X.value=!0;try{const e=await fetch("/api/claude/hooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stopHook:{enabled:Z.value.claude.enabled,type:Z.value.claude.type},feishu:{enabled:Z.value.feishu.enabled,webhookUrl:Z.value.feishu.webhookUrl}})});if(e.ok)Y.value=JSON.parse(JSON.stringify(Z.value)),Un.success("通知设置已保存");else{const a=await e.json();Un.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Un.error("保存失败:"+e.message)}finally{X.value=!1}}function fa(){_e.value={currentPassword:"",newPassword:"",confirmPassword:""}}function ga(){he.value=!1,be.value="",we.value="",ke.value=!1}async function ya(e=!1){return ge.value&&Ce?Ce:ce.value&&!e?Promise.resolve():(ge.value=!0,Ce=(async()=>{try{const e=await Ti();e.success&&(le.value={hasPassword:Boolean(e.hasPassword)},ce.value=!0)}catch(e){}finally{ge.value=!1,Ce=null}})(),Ce)}function ha(){le.value.hasPassword?(be.value="",we.value="",he.value=!0):ye.value=!0}function ba(){ga()}async function Pa(){var e,a;if(be.value){ke.value=!0,we.value="";try{const e=await Pi(be.value);e.success?(ye.value=!0,ga()):we.value=e.error||"密码错误"}catch(l){we.value=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.error)||"密码错误"}finally{ke.value=!1}}else we.value="请输入密码"}async function Ma(e=!1){await ya(e),le.value.hasPassword?(ye.value=!1,ha()):ye.value=!0}async function $a(){var e,a;if(!oa.value)return void Un.warning("请完善密码信息");const l=le.value.hasPassword;xe.value=!0;try{const e={newPassword:_e.value.newPassword};le.value.hasPassword&&(e.currentPassword=_e.value.currentPassword);const a=await Mi(e);a.success?(le.value.hasPassword=!0,ce.value=!0,fa(),Un.success(l?"密码已更新":"密码已设置")):Un.error(a.error||"保存失败")}catch(t){Un.error((null==(a=null==(e=t.response)?void 0:e.data)?void 0:a.error)||"保存失败")}finally{xe.value=!1}}async function ja(){D.value=!0;try{const e=await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:A.value,maxLogs:H.value.maxLogs,statsInterval:H.value.statsInterval,enableSessionBinding:H.value.enableSessionBinding})});if(e.ok)E.value={...A.value},J.value={...H.value},window.dispatchEvent(new CustomEvent("advanced-config-change",{detail:{maxLogs:H.value.maxLogs,statsInterval:H.value.statsInterval}})),Un.success("配置已保存,端口修改需要重启服务器生效");else{const a=await e.json();Un.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Un.error("保存失败:"+e.message)}finally{D.value=!1}}async function Oa(){F.value=!0;try{const e=await Oi();if(e.success)N.value=!0,Un.success("开机自启已启用");else{const a=e.message||"未知错误";a.includes("暂无运行中的进程")||a.includes("请先启动")?Un.warning(a):Un.error(a)}}catch(e){Un.error(e.message||"启用失败:未知错误")}finally{F.value=!1}}async function Aa(){F.value=!0;try{const e=await Ai();if(e.success)N.value=!1,Un.success("开机自启已禁用");else{const a=e.message||"未知错误";a.includes("未启用")||a.includes("不存在")?Un.warning(a):Un.error(a)}}catch(e){Un.error(e.message||"禁用失败:未知错误")}finally{F.value=!1}}return b(()=>{ra(),ya(),ea()}),x(I,e=>{e?(ra(),async function(){var e,a,l,t,n;try{const s=await fetch("/api/config/advanced");if(s.ok){const o=await s.json();A.value={webUI:(null==(e=o.ports)?void 0:e.webUI)||19999,proxy:(null==(a=o.ports)?void 0:a.proxy)||20088,codexProxy:(null==(l=o.ports)?void 0:l.codexProxy)||20089,geminiProxy:(null==(t=o.ports)?void 0:t.geminiProxy)||20090,opencodeProxy:(null==(n=o.ports)?void 0:n.opencodeProxy)||20091},E.value={...A.value},H.value={maxLogs:o.maxLogs||100,statsInterval:o.statsInterval||30,enableSessionBinding:!1!==o.enableSessionBinding},J.value={...H.value}}}catch(s){}}(),async function(){var e;try{const a=await ji();a&&a.success?N.value=(null==(e=a.data)?void 0:e.enabled)||!1:N.value=!1}catch(a){N.value=!1}}(),async function(){var e,a,l,t;try{const n=await fetch("/api/claude/hooks");if(n.ok){const s=await n.json();Z.value={claude:{enabled:(null==(e=s.stopHook)?void 0:e.enabled)||!1,type:(null==(a=s.stopHook)?void 0:a.type)||"notification"},feishu:{enabled:(null==(l=s.feishu)?void 0:l.enabled)||!1,webhookUrl:(null==(t=s.feishu)?void 0:t.webhookUrl)||""}},Y.value=JSON.parse(JSON.stringify(Z.value)),ae.value=s.platform||""}}catch(n){}}(),ea(),"security"===T.value?Ma(!0):ya(!0)):(ye.value=!1,ga(),fa())}),x(T,(e,a)=>{"security"===e&&Ma(),"security"===a&&"security"!==e&&(ye.value=!1,ga(),fa())}),(e,a)=>(n(),g(c(pe),{show:I.value,"onUpdate:show":a[33]||(a[33]=e=>I.value=e),width:c(k),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{"show-header":!1,closable:"","native-scrollbar":!1},{default:u(()=>[s("div",Qi,[s("div",er,[s("div",ar,[r(c(q),{size:"20",color:"var(--text-secondary)"},{default:u(()=>[r(c(Ca))]),_:1}),a[34]||(a[34]=s("span",{class:"sidebar-title"},"设置分类",-1))]),s("div",lr,[(n(!0),t(m,null,f(ia.value,e=>(n(),t("div",{key:e.key,class:d(["menu-item",{active:T.value===e.key}]),onClick:a=>T.value=e.key},[r(c(q),{size:18,class:"menu-icon"},{default:u(()=>[(n(),g(z(e.icon)))]),_:2},1024),s("span",nr,v(e.label),1),e.badge?(n(),g(c(ve),{key:0,value:e.badge,type:e.badgeType||"info","show-zero":!1},null,8,["value","type"])):o("",!0)],10,tr))),128))])]),s("div",sr,[i(s("div",or,[s("div",ir,[s("div",rr,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(wa))]),_:1}),s("div",null,[a[36]||(a[36]=s("h3",{class:"panel-title"},"外观设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[35]||(a[35]=[y("自定义界面外观和主题",-1)])]),_:1})])])]),s("div",ur,[s("div",cr,[s("div",dr,[s("div",pr,[r(c(V),{strong:""},{default:u(()=>[...a[37]||(a[37]=[y("面板显示",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[38]||(a[38]=[y(" 控制右侧面板中各个区域的显示 ",-1)])]),_:1})]),s("div",vr,[s("div",mr,[s("div",fr,[r(c(V),{strong:""},{default:u(()=>[...a[39]||(a[39]=[y("显示渠道列表",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[40]||(a[40]=[y(" 在右侧面板显示 API 渠道管理区域 ",-1)])]),_:1})]),r(c(W),{value:$.value,"onUpdate:value":da},null,8,["value"])]),s("div",gr,[s("div",yr,[r(c(V),{strong:""},{default:u(()=>[...a[41]||(a[41]=[y("显示实时日志",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[42]||(a[42]=[y(" 在 Dashboard 显示实时日志区域 ",-1)])]),_:1})]),r(c(W),{value:j.value,"onUpdate:value":pa},null,8,["value"])])])]),r(c(me)),s("div",hr,[s("div",br,[r(c(V),{strong:""},{default:u(()=>[...a[43]||(a[43]=[y("界面主题",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[44]||(a[44]=[y(" 选择你喜欢的界面主题风格 ",-1)])]),_:1})]),s("div",wr,[s("div",{class:d(["simple-theme-item",{active:!c(P)}]),onClick:a[0]||(a[0]=e=>c(P)&&c(M)())},[r(c(q),{size:20,class:"theme-icon"},{default:u(()=>[r(c(Ua))]),_:1}),s("div",kr,[r(c(V),{strong:""},{default:u(()=>[...a[45]||(a[45]=[y("亮色模式",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[46]||(a[46]=[y("经典的浅色主题",-1)])]),_:1})]),c(P)?o("",!0):(n(),t("div",_r,[r(c(q),{size:20,color:"#18a058"},{default:u(()=>[r(c(He))]),_:1})]))],2),s("div",{class:d(["simple-theme-item",{active:c(P)}]),onClick:a[1]||(a[1]=e=>!c(P)&&c(M)())},[r(c(q),{size:20,class:"theme-icon"},{default:u(()=>[r(c(Sa))]),_:1}),s("div",xr,[r(c(V),{strong:""},{default:u(()=>[...a[47]||(a[47]=[y("暗色模式",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[48]||(a[48]=[y("护眼的深色主题",-1)])]),_:1})]),c(P)?(n(),t("div",Cr,[r(c(q),{size:20,color:"#18a058"},{default:u(()=>[r(c(He))]),_:1})])):o("",!0)],2)])])])])],512),[[h,"appearance"===T.value]]),i(s("div",Ur,[s("div",Sr,[s("div",zr,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(ka))]),_:1}),s("div",null,[a[50]||(a[50]=s("h3",{class:"panel-title"},"通知设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[49]||(a[49]=[y("配置任务完成时的系统通知",-1)])]),_:1})])])]),s("div",Ir,[s("div",Tr,[s("div",Pr,[s("div",Mr,[r(c(V),{strong:""},{default:u(()=>[...a[51]||(a[51]=[y("Claude Code",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[52]||(a[52]=[y(" 当 Claude Code 任务完成或等待交互时发送系统通知 ",-1)])]),_:1})]),s("div",$r,[s("div",jr,[s("div",Or,[r(c(V),{strong:""},{default:u(()=>[...a[53]||(a[53]=[y("启用任务完成通知",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[54]||(a[54]=[y(" 通过 Claude Code 的 Stop Hook 在任务完成时发送通知 ",-1)])]),_:1})]),r(c(W),{value:Z.value.claude.enabled,"onUpdate:value":a[2]||(a[2]=e=>Z.value.claude.enabled=e)},null,8,["value"])]),Z.value.claude.enabled?(n(),t("div",Ar,[r(c(V),{depth:"2",style:{"font-size":"13px","margin-bottom":"12px",display:"block"}},{default:u(()=>[...a[55]||(a[55]=[y(" 选择通知方式 ",-1)])]),_:1}),r(c(ne),{value:Z.value.claude.type,"onUpdate:value":a[3]||(a[3]=e=>Z.value.claude.type=e)},{default:u(()=>[r(c(se),{vertical:""},{default:u(()=>[r(c(oe),{value:"notification"},{default:u(()=>[s("div",Lr,[r(c(V),{strong:""},{default:u(()=>[...a[56]||(a[56]=[y("右上角卡片通知",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[...a[57]||(a[57]=[y(" 轻量提醒,几秒后自动消失,带提示音(Windows 使用系统 Toast 风格提醒) ",-1)])]),_:1})])]),_:1}),r(c(oe),{value:"dialog"},{default:u(()=>[s("div",Er,[r(c(V),{strong:""},{default:u(()=>[...a[58]||(a[58]=[y("弹窗对话框",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[...a[59]||(a[59]=[y(" 强制提醒,需要手动点击确认才能关闭 ",-1)])]),_:1})])]),_:1})]),_:1})]),_:1},8,["value"]),"darwin"===ae.value?(n(),g(c(fe),{key:0,type:"info",bordered:!1,style:{"margin-top":"16px"},"show-icon":!1},{default:u(()=>[s("div",Dr,[r(c(V),{strong:""},{default:u(()=>[...a[60]||(a[60]=[y("💡 更好的通知体验",-1)])]),_:1}),r(c(V),{depth:"3",style:{display:"block","margin-top":"4px","font-size":"12px"}},{default:u(()=>[...a[61]||(a[61]=[y(" 安装 terminal-notifier 后,点击通知可自动打开终端 ",-1)])]),_:1}),r(c(V),{code:"",style:{display:"block","margin-top":"8px","font-size":"12px"}},{default:u(()=>[...a[62]||(a[62]=[y(" brew install terminal-notifier ",-1)])]),_:1})])]),_:1})):o("",!0)])):o("",!0)])]),r(c(me)),s("div",Nr,[s("div",Fr,[r(c(V),{strong:""},{default:u(()=>[...a[63]||(a[63]=[y("飞书机器人通知",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[64]||(a[64]=[y(" 任务完成时同时发送飞书机器人通知,适合需要远程提醒的场景 ",-1)])]),_:1})]),s("div",Rr,[s("div",Br,[s("div",Hr,[r(c(V),{strong:""},{default:u(()=>[...a[65]||(a[65]=[y("启用飞书通知",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[66]||(a[66]=[y(" 通过飞书机器人 Webhook 发送通知 ",-1)])]),_:1})]),r(c(W),{value:Z.value.feishu.enabled,"onUpdate:value":a[4]||(a[4]=e=>Z.value.feishu.enabled=e)},null,8,["value"])]),Z.value.feishu.enabled?(n(),t("div",qr,[r(c(V),{depth:"2",style:{"font-size":"13px","margin-bottom":"12px",display:"block"}},{default:u(()=>[...a[67]||(a[67]=[y(" 飞书机器人 Webhook URL ",-1)])]),_:1}),r(c(re),{value:Z.value.feishu.webhookUrl,"onUpdate:value":a[5]||(a[5]=e=>Z.value.feishu.webhookUrl=e),placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx",type:"text",clearable:""},null,8,["value"]),r(c(V),{depth:"3",style:{"font-size":"12px","margin-top":"8px",display:"block"}},{default:u(()=>[...a[68]||(a[68]=[y(" 在飞书群设置中添加自定义机器人,复制 Webhook 地址粘贴到这里 ",-1)])]),_:1})])):o("",!0)])]),r(c(me)),s("div",Kr,[s("div",Gr,[r(c(V),{strong:""},{default:u(()=>[...a[69]||(a[69]=[y("Codex CLI / Gemini CLI",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[70]||(a[70]=[y(" 暂不支持 - Codex 和 Gemini 目前没有 hooks 功能 ",-1)])]),_:1})]),r(c(fe),{type:"info",bordered:!1,style:{"margin-top":"12px"}},{default:u(()=>[...a[71]||(a[71]=[y(" Codex CLI 和 Gemini CLI 暂未提供 hooks 机制,未来如有支持将自动适配 ",-1)])]),_:1})])])]),s("div",Wr,[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{size:"large",onClick:a[6]||(a[6]=e=>I.value=!1)},{default:u(()=>[...a[72]||(a[72]=[y(" 取消 ",-1)])]),_:1}),r(c(K),{type:"primary",size:"large",loading:X.value,disabled:JSON.stringify(Z.value)===JSON.stringify(Y.value),onClick:ma},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(za))]),_:1})]),default:u(()=>[a[73]||(a[73]=y(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[h,"notification"===T.value]]),i(s("div",Vr,[s("div",Jr,[s("div",Zr,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(_a))]),_:1}),s("div",null,[a[75]||(a[75]=s("h3",{class:"panel-title"},"高级设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[74]||(a[74]=[y("端口配置和高级选项",-1)])]),_:1})])])]),s("div",Yr,[s("div",Xr,[s("div",Qr,[s("div",eu,[r(c(V),{strong:""},{default:u(()=>[...a[76]||(a[76]=[y("端口配置",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[77]||(a[77]=[y(" 修改后需要重启服务器才能生效 ",-1)])]),_:1})]),s("div",au,[s("div",lu,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[78]||(a[78]=[y("Web UI 端口",-1)])]),_:1}),r(c(ue),{value:A.value.webUI,"onUpdate:value":a[7]||(a[7]=e=>A.value.webUI=e),min:1024,max:65535,"show-button":!1,placeholder:"19999"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(He))]),_:1})]),_:1},8,["value"])]),s("div",tu,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[79]||(a[79]=[y("Claude 代理",-1)])]),_:1}),r(c(ue),{value:A.value.proxy,"onUpdate:value":a[8]||(a[8]=e=>A.value.proxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20088"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(_a))]),_:1})]),_:1},8,["value"])]),s("div",nu,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[80]||(a[80]=[y("Codex 代理",-1)])]),_:1}),r(c(ue),{value:A.value.codexProxy,"onUpdate:value":a[9]||(a[9]=e=>A.value.codexProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20089"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(_a))]),_:1})]),_:1},8,["value"])]),s("div",su,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[81]||(a[81]=[y("Gemini 代理",-1)])]),_:1}),r(c(ue),{value:A.value.geminiProxy,"onUpdate:value":a[10]||(a[10]=e=>A.value.geminiProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20090"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(_a))]),_:1})]),_:1},8,["value"])]),s("div",ou,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[82]||(a[82]=[y("OpenCode 代理",-1)])]),_:1}),r(c(ue),{value:A.value.opencodeProxy,"onUpdate:value":a[11]||(a[11]=e=>A.value.opencodeProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20091"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(_a))]),_:1})]),_:1},8,["value"])])])]),r(c(me)),s("div",iu,[s("div",ru,[r(c(V),{strong:""},{default:u(()=>[...a[83]||(a[83]=[y("负载均衡",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[84]||(a[84]=[y(" 多渠道负载均衡时的分配策略 ",-1)])]),_:1})]),s("div",uu,[s("div",cu,[s("div",du,[r(c(V),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[85]||(a[85]=[y("多渠道负载会话绑定",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[86]||(a[86]=[y("开启后同一对话始终使用同一渠道,保证上下文连续性",-1)])]),_:1})]),r(c(W),{value:H.value.enableSessionBinding,"onUpdate:value":[a[12]||(a[12]=e=>H.value.enableSessionBinding=e),va],size:"medium"},null,8,["value"])])])]),r(c(me)),s("div",pu,[s("div",vu,[r(c(V),{strong:""},{default:u(()=>[...a[87]||(a[87]=[y("日志和性能",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[88]||(a[88]=[y(" 控制日志显示和数据刷新行为 ",-1)])]),_:1})]),s("div",mu,[s("div",fu,[s("div",gu,[r(c(V),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[89]||(a[89]=[y("实时日志保留数量",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[90]||(a[90]=[y("超过此数量将自动清理旧日志",-1)])]),_:1})]),r(c(ue),{value:H.value.maxLogs,"onUpdate:value":a[13]||(a[13]=e=>H.value.maxLogs=e),min:50,max:500,step:10,style:{width:"140px"}},{suffix:u(()=>[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[91]||(a[91]=[y("条",-1)])]),_:1})]),_:1},8,["value"])]),s("div",yu,[s("div",hu,[r(c(V),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[92]||(a[92]=[y("统计数据刷新间隔",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[93]||(a[93]=[y("自动刷新今日统计的时间间隔",-1)])]),_:1})]),r(c(ue),{value:H.value.statsInterval,"onUpdate:value":a[14]||(a[14]=e=>H.value.statsInterval=e),min:10,max:300,step:5,style:{width:"140px"}},{suffix:u(()=>[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[94]||(a[94]=[y("秒",-1)])]),_:1})]),_:1},8,["value"])])])]),r(c(me)),s("div",bu,[s("div",wu,[r(c(V),{strong:""},{default:u(()=>[...a[95]||(a[95]=[y("开机自启",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[96]||(a[96]=[y(" 启用此选项后,重启电脑时 Coding-Tool 会自动启动 ",-1)])]),_:1})]),s("div",ku,[s("div",_u,[s("div",xu,[r(c(V),{strong:"",style:{flex:"1"}},{default:u(()=>[y(v(R.value),1)]),_:1}),N.value?(n(),g(c(K),{key:1,type:"warning",size:"small",loading:F.value,onClick:Aa},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ia))]),_:1})]),default:u(()=>[a[98]||(a[98]=y(" 禁用自启 ",-1))]),_:1},8,["loading"])):(n(),g(c(K),{key:0,type:"primary",size:"small",loading:F.value,onClick:Oa},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(He))]),_:1})]),default:u(()=>[a[97]||(a[97]=y(" 启用自启 ",-1))]),_:1},8,["loading"]))]),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[y(v(B.value),1)]),_:1})])])])])]),s("div",Cu,[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{size:"large",onClick:a[15]||(a[15]=e=>I.value=!1)},{default:u(()=>[...a[99]||(a[99]=[y(" 取消 ",-1)])]),_:1}),r(c(K),{type:"primary",size:"large",loading:D.value,disabled:!ta.value,onClick:ja},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(za))]),_:1})]),default:u(()=>[a[100]||(a[100]=y(" 保存端口配置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[h,"advanced"===T.value]]),i(s("div",Uu,[s("div",Su,[s("div",zu,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(xa))]),_:1}),s("div",null,[a[102]||(a[102]=s("h3",{class:"panel-title"},"安全设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[101]||(a[101]=[y("设置访问密码,保护关键配置",-1)])]),_:1})])])]),s("div",Iu,[na.value?(n(),t("div",Tu,[r(c(ee),{description:"请输入密码后访问安全设置"},{extra:u(()=>[r(c(K),{type:"primary",onClick:ha},{default:u(()=>[...a[103]||(a[103]=[y(" 输入密码 ",-1)])]),_:1})]),_:1})])):(n(),t("div",Pu,[s("div",Mu,[s("div",$u,[r(c(V),{strong:""},{default:u(()=>[...a[104]||(a[104]=[y("访问保护",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[105]||(a[105]=[y(" 每次进入安全设置都需要输入密码验证 ",-1)])]),_:1})]),s("div",ju,[le.value.hasPassword?(n(),g(c(G),{key:0,type:"success",bordered:!1},{default:u(()=>[...a[106]||(a[106]=[y(" 已启用 ",-1)])]),_:1})):(n(),g(c(G),{key:1,type:"warning",bordered:!1},{default:u(()=>[...a[107]||(a[107]=[y(" 未启用 ",-1)])]),_:1}))])]),r(c(me)),s("div",Ou,[s("div",Au,[r(c(V),{strong:""},{default:u(()=>[y(v(le.value.hasPassword?"修改密码":"设置密码"),1)]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[108]||(a[108]=[y(" 密码至少 4 位,建议包含数字与字母 ",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px","margin-top":"4px"}},{default:u(()=>[a[110]||(a[110]=y(" 忘记密码可在终端执行 ",-1)),r(c(V),{code:""},{default:u(()=>[...a[109]||(a[109]=[y("ctx security reset",-1)])]),_:1}),a[111]||(a[111]=y(" 关闭密码 ",-1))]),_:1})]),s("div",Lu,[le.value.hasPassword?(n(),g(c(re),{key:0,value:_e.value.currentPassword,"onUpdate:value":a[16]||(a[16]=e=>_e.value.currentPassword=e),type:"password",placeholder:"当前密码","show-password-on":"click"},null,8,["value"])):o("",!0),r(c(re),{value:_e.value.newPassword,"onUpdate:value":a[17]||(a[17]=e=>_e.value.newPassword=e),type:"password",placeholder:"新密码","show-password-on":"click"},null,8,["value"]),r(c(re),{value:_e.value.confirmPassword,"onUpdate:value":a[18]||(a[18]=e=>_e.value.confirmPassword=e),type:"password",placeholder:"确认新密码","show-password-on":"click"},null,8,["value"]),sa.value?(n(),g(c(V),{key:1,depth:"3",class:"security-error"},{default:u(()=>[y(v(sa.value),1)]),_:1})):o("",!0)])])]))]),s("div",Eu,[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{size:"large",onClick:a[19]||(a[19]=e=>I.value=!1)},{default:u(()=>[...a[112]||(a[112]=[y(" 取消 ",-1)])]),_:1}),na.value?o("",!0):(n(),g(c(K),{key:0,type:"primary",size:"large",loading:xe.value,disabled:!oa.value,onClick:$a},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(za))]),_:1})]),default:u(()=>[a[113]||(a[113]=y(" 保存密码 ",-1))]),_:1},8,["loading","disabled"]))]),_:1})])],512),[[h,"security"===T.value]]),i(s("div",Du,[s("div",Nu,[s("div",Fu,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(ca))]),_:1}),s("div",null,[a[115]||(a[115]=s("h3",{class:"panel-title"},"模型设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[114]||(a[114]=[y("管理默认测速模型、模型上下文窗口和定价信息",-1)])]),_:1})])])]),s("div",Ru,[r(c(Q),{show:Ue.value},{default:u(()=>[s("div",Bu,[s("div",Hu,[r(c(V),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[116]||(a[116]=[y("默认测速模型",-1)])]),_:1}),s("div",qu,[(n(),t(m,null,f(Ee,e=>s("div",{key:e.key,class:"speed-test-default-row"},[s("div",Ku,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[y(v(e.label),1)]),_:2},1024)]),r(c(te),{value:Ae.value[e.key],"onUpdate:value":a=>Ae.value[e.key]=a,options:Ye.value[e.key],placeholder:`选择${e.label}默认测速模型`,disabled:0===(Ye.value[e.key]||[]).length,size:"small",filterable:""},null,8,["value","onUpdate:value","options","placeholder","disabled"])])),64))])])]),s("div",Gu,[r(c(re),{value:Pe.value,"onUpdate:value":a[20]||(a[20]=e=>Pe.value=e),placeholder:"搜索模型 ID...",clearable:"",size:"small",style:{flex:"1","min-width":"0"}},null,8,["value"]),r(c(K),{size:"small",type:"primary",onClick:Be},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[a[117]||(a[117]=y(" 新增 ",-1))]),_:1})]),s("div",Wu,[r(c(ne),{value:Me.value,"onUpdate:value":a[21]||(a[21]=e=>Me.value=e),size:"small"},{default:u(()=>[r(c(oe),{value:"all"},{default:u(()=>[...a[118]||(a[118]=[y("全部",-1)])]),_:1}),r(c(oe),{value:"claude"},{default:u(()=>[...a[119]||(a[119]=[y("Claude",-1)])]),_:1}),r(c(oe),{value:"openai"},{default:u(()=>[...a[120]||(a[120]=[y("OpenAI",-1)])]),_:1}),r(c(oe),{value:"gemini"},{default:u(()=>[...a[121]||(a[121]=[y("Gemini",-1)])]),_:1}),r(c(oe),{value:"overrides"},{default:u(()=>[...a[122]||(a[122]=[y("自定义",-1)])]),_:1})]),_:1},8,["value"])]),0===Je.value.length?(n(),t("div",Vu,[r(c(ee),{description:"没有匹配的模型"})])):(n(),t("div",Ju,[(n(!0),t(m,null,f(Je.value,e=>(n(),t("div",{key:e,class:d(["model-card",{expanded:De.value.has(e)}])},[s("div",{class:"model-card-header",onClick:a=>(e=>{De.value.has(e)?De.value.delete(e):De.value.add(e),De.value=new Set(De.value)})(e)},[r(c(q),{size:"14",class:"expand-icon"},{default:u(()=>[r(c(Ta))]),_:1}),s("span",Yu,v(e),1),Ie.value[e]?(n(),g(c(G),{key:0,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[...a[123]||(a[123]=[y("自定义",-1)])]),_:1})):o("",!0),s("div",{class:"model-card-actions",onClick:a[22]||(a[22]=p(()=>{},["stop"]))},[Ie.value[e]&&Ge(e)?(n(),g(c(K),{key:0,size:"tiny",quaternary:"",type:"warning",onClick:a=>async function(e){try{await C(e),delete Ie.value[e],delete Te.value[e],await ea(),Un.success(`${e} 已重置为内置默认值`)}catch(a){Un.error("重置失败:"+a.message)}}(e)},{default:u(()=>[...a[124]||(a[124]=[y(" 重置 ",-1)])]),_:1},8,["onClick"])):o("",!0),We(e)?(n(),g(c(K),{key:1,size:"tiny",quaternary:"",type:"error",onClick:a=>async function(e){try{const a=!!Ie.value[e];a&&(await C(e),delete Ie.value[e]),delete Te.value[e],We(e)?delete ze.value[e]:a&&await ea(),Un.success(`已删除模型:${e}`)}catch(a){Un.error("删除失败:"+a.message)}}(e)},{default:u(()=>[...a[125]||(a[125]=[y(" 删除 ",-1)])]),_:1},8,["onClick"])):o("",!0)])],8,Zu),De.value.has(e)?(n(),t("div",Xu,[s("div",Qu,[s("div",ec,[r(c(V),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[126]||(a[126]=[y("上下文限制",-1)])]),_:1}),s("div",ac,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[127]||(a[127]=[y("Context 窗口 (tokens)",-1)])]),_:1}),r(c(ue),{value:Xe(e,"limit","context"),"onUpdate:value":a=>Qe(e,"limit","context",a),min:1e3,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[128]||(a[128]=[y("Max Output (tokens)",-1)])]),_:1}),r(c(ue),{value:Xe(e,"limit","output"),"onUpdate:value":a=>Qe(e,"limit","output",a),min:100,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])]),s("div",lc,[r(c(V),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[129]||(a[129]=[y("定价(USD / 百万 tokens)",-1)])]),_:1}),s("div",tc,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[130]||(a[130]=[y("输入价格",-1)])]),_:1}),r(c(ue),{value:Xe(e,"pricing","input"),"onUpdate:value":a=>Qe(e,"pricing","input",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[131]||(a[131]=[y("输出价格",-1)])]),_:1}),r(c(ue),{value:Xe(e,"pricing","output"),"onUpdate:value":a=>Qe(e,"pricing","output",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[132]||(a[132]=[y("缓存写入价格",-1)])]),_:1}),r(c(ue),{value:Xe(e,"pricing","cacheCreation"),"onUpdate:value":a=>Qe(e,"pricing","cacheCreation",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[133]||(a[133]=[y("缓存读取价格",-1)])]),_:1}),r(c(ue),{value:Xe(e,"pricing","cacheRead"),"onUpdate:value":a=>Qe(e,"pricing","cacheRead",a),min:0,step:.01,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])])])])):o("",!0)],2))),128))]))]),_:1},8,["show"])]),s("div",nc,[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{size:"large",onClick:la,disabled:0===Object.keys(Ie.value).length},{default:u(()=>[...a[134]||(a[134]=[y(" 重置全部 ",-1)])]),_:1},8,["disabled"]),r(c(K),{type:"primary",size:"large",loading:Se.value,disabled:!Fe.value,onClick:aa},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(za))]),_:1})]),default:u(()=>[a[135]||(a[135]=y(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[h,"model-settings"===T.value]])])]),r(c(ie),{show:he.value,"onUpdate:show":a[24]||(a[24]=e=>he.value=e),preset:"card",title:"验证访问密码","mask-closable":!1},{default:u(()=>[s("div",sc,[r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[136]||(a[136]=[y("请输入访问密码",-1)])]),_:1}),r(c(re),{value:be.value,"onUpdate:value":a[23]||(a[23]=e=>be.value=e),type:"password",placeholder:"访问密码","show-password-on":"click",onKeydown:O(Pa,["enter"])},null,8,["value"]),we.value?(n(),g(c(V),{key:0,depth:"3",class:"security-error"},{default:u(()=>[y(v(we.value),1)]),_:1})):o("",!0),r(c(se),{justify:"end",style:{"margin-top":"16px"}},{default:u(()=>[r(c(K),{onClick:ba},{default:u(()=>[...a[137]||(a[137]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:ke.value,onClick:Pa},{default:u(()=>[...a[138]||(a[138]=[y(" 验证 ",-1)])]),_:1},8,["loading"])]),_:1})])]),_:1},8,["show"]),r(c(ie),{show:$e.value,"onUpdate:show":a[32]||(a[32]=e=>$e.value=e),preset:"card",title:"新增模型设置",style:{width:"560px"},"mask-closable":!1},{default:u(()=>[r(c(se),{vertical:"",size:12},{default:u(()=>[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[139]||(a[139]=[y("模型 ID",-1)])]),_:1}),r(c(re),{value:je.value.modelId,"onUpdate:value":a[25]||(a[25]=e=>je.value.modelId=e),placeholder:"例如:gpt-4.1-mini",clearable:""},null,8,["value"])]),s("div",oc,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[140]||(a[140]=[y("Context 窗口",-1)])]),_:1}),r(c(ue),{value:je.value.context,"onUpdate:value":a[26]||(a[26]=e=>je.value.context=e),min:1e3,step:1e3,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[141]||(a[141]=[y("Max Output",-1)])]),_:1}),r(c(ue),{value:je.value.output,"onUpdate:value":a[27]||(a[27]=e=>je.value.output=e),min:100,step:100,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),s("div",ic,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[142]||(a[142]=[y("输入价格",-1)])]),_:1}),r(c(ue),{value:je.value.inputPrice,"onUpdate:value":a[28]||(a[28]=e=>je.value.inputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[143]||(a[143]=[y("输出价格",-1)])]),_:1}),r(c(ue),{value:je.value.outputPrice,"onUpdate:value":a[29]||(a[29]=e=>je.value.outputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),s("div",rc,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[144]||(a[144]=[y("缓存写入价格",-1)])]),_:1}),r(c(ue),{value:je.value.cacheCreationPrice,"onUpdate:value":a[30]||(a[30]=e=>je.value.cacheCreationPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[145]||(a[145]=[y("缓存读取价格",-1)])]),_:1}),r(c(ue),{value:je.value.cacheReadPrice,"onUpdate:value":a[31]||(a[31]=e=>je.value.cacheReadPrice=e),min:0,step:.01,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),Re.value?(n(),g(c(V),{key:0,depth:"3",class:"security-error"},{default:u(()=>[y(v(Re.value),1)]),_:1})):o("",!0),r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:qe},{default:u(()=>[...a[146]||(a[146]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",disabled:!!Re.value,onClick:Ke},{default:u(()=>[...a[147]||(a[147]=[y(" 新增 ",-1)])]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-79bf7da8"]]);async function cc(){return(await dt.get("/mcp/servers")).data}async function dc(e){return(await dt.post("/mcp/servers",e)).data}async function pc(e,a,l){return(await dt.post(`/mcp/servers/${e}/toggle`,{app:a,enabled:l})).data}const vc={class:"drawer-header"},mc={class:"header-title"},fc={class:"drawer-footer"},gc={class:"form-content"},yc={key:0,class:"form-group"},hc={class:"group-title"},bc={class:"preset-grid"},wc=["onClick"],kc={class:"form-group"},_c={class:"group-title"},xc={class:"field"},Cc={key:0,class:"field-error"},Uc={class:"field"},Sc={class:"form-group"},zc={class:"group-title"},Ic={class:"platform-toggles"},Tc={class:"platform-item"},Pc={class:"platform-item"},Mc={class:"platform-item"},$c={class:"platform-item"},jc={class:"form-group"},Oc={class:"group-title"},Ac={class:"field"},Lc={class:"field"},Ec={class:"field"},Dc={class:"field"},Nc={class:"kv-row"},Fc={class:"field"},Rc={class:"field"},Bc={class:"kv-row"},Hc={class:"collapse-header"},qc={class:"collapse-content"},Kc={class:"field"},Gc={class:"field"},Wc={class:"field-row"},Vc={class:"field"},Jc={class:"field"},Zc=Pl({__name:"McpFormDrawer",props:{visible:{type:Boolean,default:!1},editingServer:{type:Object,default:null},existingIds:{type:Array,default:()=>[]}},emits:["update:visible","saved"],setup(e,{emit:a}){const{drawerWidth:i}=ko(520),p=e,h=a,b=w({get:()=>p.visible,set:e=>h("update:visible",e)}),k=w(()=>!!p.editingServer),C=l([]),U=l(!1),S=l(-1),z=l(!1),I=_({id:"",name:"",description:"",homepage:"",docs:"",apps:{claude:!0,codex:!1,gemini:!1,opencode:!1},server:{type:"stdio",command:"",args:[],env:{},url:"",headers:{}}}),T=l("stdio"),P=l([]),M=l([]),$=l(""),j=w(()=>I.id.trim()&&!k.value&&p.existingIds.includes(I.id.trim())?"该 ID 已存在":"");function O(e){return p.existingIds.includes(e)}async function A(){U.value=!0;try{const e=await async function(){return(await dt.get("/mcp/presets")).data}();e.success&&(C.value=e.presets)}catch(e){}finally{U.value=!1}}function L(){S.value=-1,E()}function E(){I.id="",I.name="",I.description="",I.homepage="",I.docs="",I.apps={claude:!0,codex:!1,gemini:!1,opencode:!1},I.server={type:"stdio",command:"",args:[],env:{},url:"",headers:{}},T.value="stdio",P.value=[],M.value=[],$.value=""}async function D(){var e,a,l,t,n;if(!I.id.trim())return void Un.error("请输入服务器 ID");if(j.value)return void Un.error(j.value);if("stdio"===T.value&&!(null==(e=I.server.command)?void 0:e.trim()))return void Un.error("请输入命令");if(("http"===T.value||"sse"===T.value)&&!(null==(a=I.server.url)?void 0:a.trim()))return void Un.error("请输入 URL");const s={type:T.value};if("stdio"===T.value){s.command=I.server.command,(null==(l=I.server.args)?void 0:l.length)&&(s.args=I.server.args.filter(e=>e.trim()));const e={};P.value.forEach(a=>{a.key.trim()&&(e[a.key.trim()]=a.value)}),Object.keys(e).length>0&&(s.env=e)}else{s.url=I.server.url;const e={};M.value.forEach(a=>{a.key.trim()&&(e[a.key.trim()]=a.value)}),Object.keys(e).length>0&&(s.headers=e)}const o={id:I.id.trim(),name:I.name.trim()||I.id.trim(),server:s,apps:I.apps};I.description.trim()&&(o.description=I.description.trim()),I.homepage.trim()&&(o.homepage=I.homepage.trim()),I.docs.trim()&&(o.docs=I.docs.trim()),$.value.trim()&&(o.tags=$.value.split(",").map(e=>e.trim()).filter(e=>e)),z.value=!0;try{(await dc(o)).success&&(Un.success(k.value?"保存成功":"添加成功"),h("saved"),b.value=!1)}catch(i){Un.error((null==(n=null==(t=i.response)?void 0:t.data)?void 0:n.error)||"保存失败")}finally{z.value=!1}}return x(()=>p.visible,e=>{e&&(A(),p.editingServer?function(){const e=p.editingServer;e&&(I.id=e.id,I.name=e.name||"",I.description=e.description||"",I.homepage=e.homepage||"",I.docs=e.docs||"",I.apps={claude:!0,codex:!1,gemini:!1,opencode:!1,...e.apps},$.value=(e.tags||[]).join(", "),e.server&&(T.value=e.server.type||"stdio",I.server={...e.server},e.server.env?P.value=Object.entries(e.server.env).map(([e,a])=>({key:e,value:a})):P.value=[],e.server.headers?M.value=Object.entries(e.server.headers).map(([e,a])=>({key:e,value:a})):M.value=[]))}():(E(),S.value=-1))}),x(T,e=>{I.server.type=e}),(e,a)=>(n(),g(c(pe),{show:b.value,"onUpdate:show":a[18]||(a[18]=e=>b.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",vc,[r(c(K),{quaternary:"",size:"small",onClick:a[0]||(a[0]=e=>b.value=!1)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1}),s("span",mc,v(k.value?"编辑 MCP 服务器":"添加 MCP 服务器"),1)])]),footer:u(()=>[s("div",fc,[r(c(K),{onClick:a[1]||(a[1]=e=>b.value=!1)},{default:u(()=>[...a[19]||(a[19]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:z.value,onClick:D},{default:u(()=>[y(v(k.value?"保存":"添加"),1)]),_:1},8,["loading"])])]),default:u(()=>[r(c(Q),{show:U.value},{default:u(()=>[s("div",gc,[k.value?o("",!0):(n(),t("div",yc,[s("div",hc,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c(Pa))]),_:1}),a[20]||(a[20]=s("span",null,"快速选择",-1))]),s("div",bc,[s("div",{class:d(["preset-chip",{active:-1===S.value}]),onClick:L},[r(c(q),{size:14},{default:u(()=>[r(c(Ve))]),_:1}),a[21]||(a[21]=s("span",null,"自定义",-1))],2),(n(!0),t(m,null,f(C.value,(e,l)=>(n(),g(c(ce),{key:e.id,disabled:!O(e.id)},{trigger:u(()=>[s("div",{class:d(["preset-chip",{active:S.value===l,disabled:O(e.id)}]),onClick:a=>!O(e.id)&&function(e){S.value=e;const a=C.value[e];if(!a)return;let l=a.id,t=1;for(;p.existingIds.includes(l);)l=`${a.id}-${t}`,t++;I.id=l,I.name=a.name||a.id,I.description=a.description||"",I.homepage=a.homepage||"",I.docs=a.docs||"",$.value=(a.tags||[]).join(", "),a.server&&(T.value=a.server.type||"stdio",I.server={...a.server},a.server.env?P.value=Object.entries(a.server.env).map(([e,a])=>({key:e,value:a})):P.value=[],a.server.headers?M.value=Object.entries(a.server.headers).map(([e,a])=>({key:e,value:a})):M.value=[])}(l)},[y(v(e.id)+" ",1),O(e.id)?(n(),g(c(q),{key:0,size:12,class:"installed-icon"},{default:u(()=>[r(c(He))]),_:1})):o("",!0)],10,wc)]),default:u(()=>[a[22]||(a[22]=y(" 已安装 ",-1))]),_:2},1032,["disabled"]))),128))])])),s("div",kc,[s("div",_c,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c(Ma))]),_:1}),a[23]||(a[23]=s("span",null,"基本信息",-1))]),s("div",xc,[a[24]||(a[24]=s("label",{class:"field-label"},[y(" ID "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:I.id,"onUpdate:value":a[2]||(a[2]=e=>I.id=e),placeholder:"服务器唯一标识,如 fetch、memory",disabled:k.value,status:j.value?"error":void 0},null,8,["value","disabled","status"]),j.value?(n(),t("span",Cc,v(j.value),1)):o("",!0)]),s("div",Uc,[a[25]||(a[25]=s("label",{class:"field-label"},"显示名称",-1)),r(c(re),{value:I.name,"onUpdate:value":a[3]||(a[3]=e=>I.name=e),placeholder:"可选,用于展示的名称"},null,8,["value"])])]),s("div",Sc,[s("div",zc,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c($a))]),_:1}),a[26]||(a[26]=s("span",null,"启用平台",-1))]),s("div",Ic,[s("label",Tc,[r(c(W),{size:"small",value:I.apps.claude,"onUpdate:value":a[4]||(a[4]=e=>I.apps.claude=e)},null,8,["value"]),a[27]||(a[27]=s("span",{class:"platform-name"},"Claude",-1))]),s("label",Pc,[r(c(W),{size:"small",value:I.apps.codex,"onUpdate:value":a[5]||(a[5]=e=>I.apps.codex=e)},null,8,["value"]),a[28]||(a[28]=s("span",{class:"platform-name"},"Codex",-1))]),s("label",Mc,[r(c(W),{size:"small",value:I.apps.gemini,"onUpdate:value":a[6]||(a[6]=e=>I.apps.gemini=e)},null,8,["value"]),a[29]||(a[29]=s("span",{class:"platform-name"},"Gemini",-1))]),s("label",$c,[r(c(W),{size:"small",value:I.apps.opencode,"onUpdate:value":a[7]||(a[7]=e=>I.apps.opencode=e)},null,8,["value"]),a[30]||(a[30]=s("span",{class:"platform-name"},"OpenCode",-1))])])]),s("div",jc,[s("div",Oc,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c(ja))]),_:1}),a[31]||(a[31]=s("span",null,"服务器配置",-1))]),s("div",Ac,[a[35]||(a[35]=s("label",{class:"field-label"},"类型",-1)),r(c(ne),{value:T.value,"onUpdate:value":a[8]||(a[8]=e=>T.value=e),class:"type-radios"},{default:u(()=>[r(c(oe),{value:"stdio"},{default:u(()=>[...a[32]||(a[32]=[s("span",{class:"radio-label"},"stdio",-1),s("span",{class:"radio-desc"},"本地命令",-1)])]),_:1}),r(c(oe),{value:"http"},{default:u(()=>[...a[33]||(a[33]=[s("span",{class:"radio-label"},"http",-1)])]),_:1}),r(c(oe),{value:"sse"},{default:u(()=>[...a[34]||(a[34]=[s("span",{class:"radio-label"},"sse",-1)])]),_:1})]),_:1},8,["value"])]),"stdio"===T.value?(n(),t(m,{key:0},[s("div",Lc,[a[36]||(a[36]=s("label",{class:"field-label"},[y(" 命令 "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:I.server.command,"onUpdate:value":a[9]||(a[9]=e=>I.server.command=e),placeholder:"如 npx、uvx、node"},null,8,["value"])]),s("div",Ec,[a[37]||(a[37]=s("label",{class:"field-label"},"参数",-1)),r(c(ge),{value:I.server.args,"onUpdate:value":a[10]||(a[10]=e=>I.server.args=e),placeholder:"点击添加参数",min:0},null,8,["value"])]),s("div",Dc,[a[39]||(a[39]=s("label",{class:"field-label"},"环境变量",-1)),r(c(ge),{value:P.value,"onUpdate:value":a[11]||(a[11]=e=>P.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:u(({value:e})=>[s("div",Nc,[r(c(re),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"变量名",class:"kv-key"},null,8,["value","onUpdate:value"]),a[38]||(a[38]=s("span",{class:"kv-sep"},"=",-1)),r(c(re),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64)):(n(),t(m,{key:1},[s("div",Fc,[a[40]||(a[40]=s("label",{class:"field-label"},[y(" URL "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:I.server.url,"onUpdate:value":a[12]||(a[12]=e=>I.server.url=e),placeholder:"http://localhost:3000/mcp"},null,8,["value"])]),s("div",Rc,[a[42]||(a[42]=s("label",{class:"field-label"},"请求头",-1)),r(c(ge),{value:M.value,"onUpdate:value":a[13]||(a[13]=e=>M.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:u(({value:e})=>[s("div",Bc,[r(c(re),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"Header 名",class:"kv-key"},null,8,["value","onUpdate:value"]),a[41]||(a[41]=s("span",{class:"kv-sep"},":",-1)),r(c(re),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64))]),r(c(ye),{class:"extra-collapse"},{default:u(()=>[r(c(he),{name:"extra"},{header:u(()=>[s("div",Hc,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c(Oa))]),_:1}),a[43]||(a[43]=s("span",null,"附加信息",-1)),a[44]||(a[44]=s("span",{class:"collapse-hint"},"(可选)",-1))])]),default:u(()=>[s("div",qc,[s("div",Kc,[a[45]||(a[45]=s("label",{class:"field-label"},"描述",-1)),r(c(re),{value:I.description,"onUpdate:value":a[14]||(a[14]=e=>I.description=e),type:"textarea",placeholder:"服务器功能描述",rows:2},null,8,["value"])]),s("div",Gc,[a[46]||(a[46]=s("label",{class:"field-label"},"标签",-1)),r(c(re),{value:$.value,"onUpdate:value":a[15]||(a[15]=e=>$.value=e),placeholder:"用逗号分隔,如 http, web, fetch"},null,8,["value"])]),s("div",Wc,[s("div",Vc,[a[47]||(a[47]=s("label",{class:"field-label"},"主页",-1)),r(c(re),{value:I.homepage,"onUpdate:value":a[16]||(a[16]=e=>I.homepage=e),placeholder:"https://github.com/..."},null,8,["value"])]),s("div",Jc,[a[48]||(a[48]=s("label",{class:"field-label"},"文档",-1)),r(c(re),{value:I.docs,"onUpdate:value":a[17]||(a[17]=e=>I.docs=e),placeholder:"https://..."},null,8,["value"])])])])]),_:1})]),_:1})])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b964e886"]]),Yc={class:"tool-card"},Xc={class:"tool-header"},Qc={class:"tool-name"},ed={key:0,class:"tool-description"},ad={key:1,class:"tool-parameters"},ld={class:"params-header"},td={class:"params-list"},nd={class:"param-info"},sd={class:"param-name"},od={key:0,class:"param-description"},id={key:2,class:"no-parameters"},rd=Pl({__name:"McpToolCard",props:{tool:{type:Object,required:!0}},emits:["test"],setup(e){const a=e,l=w(()=>{var e;return(null==(e=a.tool.inputSchema)?void 0:e.properties)||{}}),i=w(()=>{var e;return(null==(e=a.tool.inputSchema)?void 0:e.required)||[]}),d=w(()=>Object.keys(l.value).length>0);function p(e){return i.value.includes(e)}return(a,i)=>(n(),t("div",Yc,[s("div",Xc,[s("h3",Qc,v(e.tool.name),1),r(c(K),{size:"small",type:"primary",quaternary:"",onClick:i[0]||(i[0]=e=>a.$emit("test"))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(La))]),_:1})]),default:u(()=>[i[1]||(i[1]=y(" 测试工具 ",-1))]),_:1})]),e.tool.description?(n(),t("p",ed,v(e.tool.description),1)):o("",!0),d.value?(n(),t("div",ad,[s("div",ld,[r(c(q),{size:14,class:"params-icon"},{default:u(()=>[r(c(Ca))]),_:1}),i[2]||(i[2]=s("span",{class:"params-label"},"参数列表",-1))]),s("div",td,[(n(!0),t(m,null,f(l.value,(e,a)=>(n(),t("div",{key:a,class:"param-item"},[s("div",nd,[s("span",sd,v(a),1),r(c(G),{type:p(a)?"error":"default",size:"tiny",bordered:!1},{default:u(()=>[y(v(p(a)?"必填":"可选"),1)]),_:2},1032,["type"]),e.type?(n(),g(c(G),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>{return[y(v((a=e.type,Array.isArray(a)?a.filter(e=>"null"!==e).join(" | "):a)),1)];var a}),_:2},1024)):o("",!0)]),e.description?(n(),t("p",od,v(e.description),1)):o("",!0)]))),128))])])):(n(),t("div",id,[r(c(V),{depth:"3"},{default:u(()=>[...i[3]||(i[3]=[y("无需参数",-1)])]),_:1})]))]))}},[["__scopeId","data-v-1fcd002c"]]),ud={class:"field-label"},cd={key:0,class:"required"},dd={key:0,class:"empty-schema"},pd=Pl({__name:"McpDynamicForm",props:{schema:{type:Object,default:()=>({})},modelValue:{type:Object,default:()=>({})},depth:{type:Number,default:0},maxDepth:{type:Number,default:3}},emits:["update:modelValue"],setup(e,{emit:a}){const l=e,i=a,p=w(()=>{var e;return(null==(e=l.schema)?void 0:e.properties)||{}}),h=w(()=>{var e;return(null==(e=l.schema)?void 0:e.required)||[]}),b=w(()=>Object.keys(p.value));function k(e){const a=p.value[e];if(!a)return"string";const l=a.type;if(!l)return a.enum?"string":a.properties?"object":"string";if(Array.isArray(l)){const e=l.filter(e=>"null"!==e);return e.length>0?e[0]:"string"}return l}function _(e){return h.value.includes(e)}function C(e){var a;return(null==(a=p.value[e])?void 0:a.description)||""}function U(e){const a=p.value[e];return Array.isArray(null==a?void 0:a.enum)&&a.enum.length>0}function S(e){const a=p.value[e];return Array.isArray(null==a?void 0:a.enum)?a.enum.map(e=>({label:String(e),value:e})):[]}function z(e){const a=p.value[e];return(null==a?void 0:a.description)?a.description:null!=(null==a?void 0:a.default)?`默认: ${a.default}`:`请输入 ${e}`}function I(e){const a=p.value[e];return a&&(a.properties||a.additionalProperties)?a:null}function T(e,a){i("update:modelValue",{...l.modelValue,[e]:a})}return x(()=>[l.schema,b.value],()=>{!function(){const e={};let a=!1;for(const t of b.value){const n=p.value[t];null!=(null==n?void 0:n.default)&&void 0===l.modelValue[t]&&(e[t]=n.default,a=!0)}a&&i("update:modelValue",{...l.modelValue,...e})}()},{immediate:!0,deep:!0}),(a,l)=>{const i=E("McpDynamicForm",!0);return n(),t("div",{class:d(["dynamic-form",{"nested-form":e.depth>0}])},[e.depth>=e.maxDepth?(n(),g(c(fe),{key:0,type:"warning",bordered:!1,class:"depth-warning"},{default:u(()=>[y(" 嵌套层级已达上限("+v(e.maxDepth)+" 层),无法继续展开 ",1)]),_:1})):(n(),t(m,{key:1},[(n(!0),t(m,null,f(b.value,a=>(n(),t("div",{key:a,class:"field"},[s("label",ud,[y(v(a)+" ",1),_(a)?(n(),t("span",cd,"*")):o("",!0),C(a)?(n(),g(c(ce),{key:1,trigger:"hover"},{trigger:u(()=>[r(c(q),{size:14,class:"field-tip-icon"},{default:u(()=>[r(c(Ma))]),_:1})]),default:u(()=>[y(" "+v(C(a)),1)]),_:2},1024)):o("",!0)]),"string"===k(a)&&U(a)?(n(),g(c(te),{key:0,value:e.modelValue[a],options:S(a),placeholder:z(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","options","placeholder","onUpdate:value"])):"string"===k(a)?(n(),g(c(re),{key:1,value:e.modelValue[a]??"",placeholder:z(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"])):"number"===k(a)||"integer"===k(a)?(n(),g(c(ue),{key:2,value:e.modelValue[a],placeholder:z(a),precision:"integer"===k(a)?0:void 0,clearable:"",style:{width:"100%"},"onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","precision","onUpdate:value"])):"boolean"===k(a)?(n(),g(c(W),{key:3,value:!!e.modelValue[a],"onUpdate:value":e=>T(a,e)},null,8,["value","onUpdate:value"])):"array"===k(a)?(n(),g(c(ge),{key:4,value:e.modelValue[a]||[],placeholder:z(a),min:0,"onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"])):"object"===k(a)&&I(a)?(n(),g(i,{key:5,schema:I(a),"model-value":e.modelValue[a]||{},depth:e.depth+1,"max-depth":e.maxDepth,"onUpdate:modelValue":e=>T(a,e)},null,8,["schema","model-value","depth","max-depth","onUpdate:modelValue"])):(n(),g(c(re),{key:6,value:null!=e.modelValue[a]?String(e.modelValue[a]):"",placeholder:z(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"]))]))),128)),0===b.value.length?(n(),t("div",dd,[r(c(V),{depth:"3"},{default:u(()=>[...l[0]||(l[0]=[y("无可配置属性",-1)])]),_:1})])):o("",!0)],64))],2)}}},[["__scopeId","data-v-b199234d"]]),vd={class:"modal-content"},md={key:0,class:"tool-info"},fd={key:1,class:"params-section"},gd={class:"section-header"},yd={key:2,class:"no-params"},hd={key:3,class:"result-section"},bd={class:"section-header"},wd={key:0,class:"result-duration"},kd={key:0,class:"result-display"},_d={key:1,class:"result-error"},xd={class:"modal-footer"},Cd=Pl({__name:"McpToolTestModal",props:{visible:{type:Boolean,default:!1},serverId:{type:String,default:""},tool:{type:Object,default:null}},emits:["update:visible"],setup(e,{emit:a}){const i=e,p=a,m=w({get:()=>i.visible,set:e=>p("update:visible",e)}),f=l({}),h=l(!1),b=l(null),k=w(()=>{var e,a;const l=null==(a=null==(e=i.tool)?void 0:e.inputSchema)?void 0:a.properties;return l&&Object.keys(l).length>0}),_=w(()=>null!==b.value);async function C(){var e,a;if(i.serverId&&i.tool){h.value=!0,b.value=null;try{const e=await async function(e,a,l={}){return(await dt.post(`/mcp/servers/${e}/tools/test`,{toolName:a,arguments:l})).data}(i.serverId,i.tool.name,f.value);e.success?(b.value={result:e.result,duration:e.duration,isError:e.isError||!1},e.isError?Un.error("工具执行失败"):Un.success(`工具执行成功 (${e.duration}ms)`)):(b.value={result:e.message||"执行失败",isError:!0},Un.error(e.message||"执行失败"))}catch(l){const t=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message||"执行失败";b.value={result:t,isError:!0},Un.error("执行失败: "+t)}finally{h.value=!1}}else Un.error("缺少必要参数")}function U(e){if(!e)return"null";if("string"==typeof e)return e;try{return JSON.stringify(e,null,2)}catch(a){return String(e)}}return x(()=>[i.visible,i.tool],([e,a])=>{e&&a&&(f.value={},b.value=null)}),(a,l)=>{var i;return n(),g(c(ie),{show:m.value,"onUpdate:show":l[2]||(l[2]=e=>m.value=e),preset:"card",title:(null==(i=e.tool)?void 0:i.name)||"测试工具",style:{width:"700px","max-width":"90vw"},segmented:{content:"soft",footer:"soft"}},{footer:u(()=>[s("div",xd,[r(c(K),{onClick:l[1]||(l[1]=e=>m.value=!1)},{default:u(()=>[...l[7]||(l[7]=[y("关闭",-1)])]),_:1}),r(c(K),{type:"primary",loading:h.value,disabled:!e.serverId||!e.tool,onClick:C},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ea))]),_:1})]),default:u(()=>[y(" "+v(h.value?"执行中...":"执行工具"),1)]),_:1},8,["loading","disabled"])])]),default:u(()=>{var a;return[s("div",vd,[(null==(a=e.tool)?void 0:a.description)?(n(),t("div",md,[r(c(fe),{type:"info",bordered:!1},{default:u(()=>[y(v(e.tool.description),1)]),_:1})])):o("",!0),k.value?(n(),t("div",fd,[s("div",gd,[r(c(q),{size:16,class:"section-icon"},{default:u(()=>[r(c(Ca))]),_:1}),l[3]||(l[3]=s("span",{class:"section-title"},"输入参数",-1))]),r(pd,{modelValue:f.value,"onUpdate:modelValue":l[0]||(l[0]=e=>f.value=e),schema:e.tool.inputSchema},null,8,["modelValue","schema"])])):(n(),t("div",yd,[r(c(V),{depth:"3"},{default:u(()=>[...l[4]||(l[4]=[y("此工具无需参数,可直接执行",-1)])]),_:1})])),_.value?(n(),t("div",hd,[s("div",bd,[r(c(q),{size:16,class:d(["section-icon",{error:b.value.isError}])},{default:u(()=>[b.value.isError?(n(),g(c(qe),{key:1})):(n(),g(c(He),{key:0}))]),_:1},8,["class"]),l[5]||(l[5]=s("span",{class:"section-title"},"执行结果",-1)),null!=b.value.duration?(n(),t("span",wd,v(b.value.duration)+"ms ",1)):o("",!0)]),b.value.isError?(n(),t("div",_d,[r(c(fe),{type:"error",bordered:!1},{header:u(()=>[...l[6]||(l[6]=[y("执行失败",-1)])]),default:u(()=>{var e;return[y(" "+v((null==(e=b.value.result)?void 0:e.message)||b.value.result||"未知错误"),1)]}),_:1})])):(n(),t("div",kd,[r(c(be),{code:U(b.value.result),language:"json","word-wrap":!0},null,8,["code"])]))])):o("",!0)])]}),_:1},8,["show","title"])}}},[["__scopeId","data-v-48377e28"]]),Ud={class:"drawer-header"},Sd={class:"server-info"},zd={class:"server-details"},Id={class:"server-name"},Td={class:"server-meta"},Pd={class:"drawer-body"},Md={key:0,class:"tools-container"},$d={class:"tools-stats"},jd={class:"stats-text"},Od={key:0,class:"stats-duration"},Ad={class:"collapse-header"},Ld={class:"tool-index"},Ed={class:"tool-title"},Dd={key:1,class:"empty-state"},Nd={key:2,class:"error-state"},Fd=Pl({__name:"McpServerDetailDrawer",props:{visible:{type:Boolean,default:!1},server:{type:Object,default:null}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(600),p=e,h=a,b=w({get:()=>p.visible,set:e=>h("update:visible",e)}),k=l(!1),_=l([]),C=l(""),U=l(0),S=l(!1),z=l(null);async function I(){var e,a,l;if(null==(e=p.server)?void 0:e.id){k.value=!0,C.value="",_.value=[],U.value=0;try{const e=await async function(e){return(await dt.get(`/mcp/servers/${e}/tools`)).data}(p.server.id);e.success?(_.value=e.tools||[],U.value=e.duration||0):C.value=e.message||"获取工具列表失败"}catch(t){C.value=(null==(l=null==(a=t.response)?void 0:a.data)?void 0:l.message)||t.message||"连接服务器失败",Un.error("获取工具列表失败: "+C.value)}finally{k.value=!1}}}return x(()=>p.visible,e=>{e&&p.server?I():(_.value=[],C.value="",U.value=0)}),(a,l)=>{var p;return n(),t(m,null,[r(c(pe),{show:b.value,"onUpdate:show":l[0]||(l[0]=e=>b.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>{var a,l,i,p,m;return[s("div",Ud,[s("div",Sd,[r(c(q),{size:20,class:"server-icon"},{default:u(()=>[r(c(Xe))]),_:1}),s("div",zd,[s("span",Id,v((null==(a=e.server)?void 0:a.name)||(null==(l=e.server)?void 0:l.id)),1),s("div",Td,[(null==(p=null==(i=e.server)?void 0:i.server)?void 0:p.type)?(n(),g(c(G),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(v(e.server.server.type),1)]),_:1})):o("",!0),(null==(m=e.server)?void 0:m.status)?(n(),t("span",{key:1,class:d(["status-dot",{online:"online"===e.server.status,error:"error"===e.server.status}])},null,2)):o("",!0)])])])])]}),default:u(()=>[s("div",Pd,[r(c(we),{type:"line",animated:""},{default:u(()=>[r(c(ke),{name:"tools",tab:"工具列表"},{default:u(()=>[r(c(Q),{show:k.value},{default:u(()=>[!k.value&&_.value.length>0?(n(),t("div",Md,[s("div",$d,[s("span",jd,"共 "+v(_.value.length)+" 个工具",1),U.value?(n(),t("span",Od," 耗时 "+v(U.value)+"ms ",1)):o("",!0)]),r(c(ye),{"arrow-placement":"right","default-expanded-names":[]},{default:u(()=>[(n(!0),t(m,null,f(_.value,(e,a)=>(n(),g(c(he),{key:e.name,name:a},{header:u(()=>[s("div",Ad,[s("span",Ld,v(a+1),1),s("span",Ed,v(e.name),1)])]),default:u(()=>[r(rd,{tool:e,onTest:a=>function(e){z.value=e,S.value=!0}(e)},null,8,["tool","onTest"])]),_:2},1032,["name"]))),128))]),_:1})])):k.value||0!==_.value.length?o("",!0):(n(),t("div",Dd,[r(c(q),{size:48,class:"empty-icon"},{default:u(()=>[r(c(Da))]),_:1}),l[2]||(l[2]=s("p",{class:"empty-title"},"该服务器未提供工具",-1)),l[3]||(l[3]=s("p",{class:"empty-desc"},"此 MCP 服务器没有注册任何可用工具",-1))])),C.value?(n(),t("div",Nd,[r(c(fe),{type:"error",bordered:!1},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Na))]),_:1})]),default:u(()=>[y(" "+v(C.value),1)]),_:1})])):o("",!0)]),_:1},8,["show"])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]),r(Cd,{visible:S.value,"onUpdate:visible":l[1]||(l[1]=e=>S.value=e),"server-id":null==(p=e.server)?void 0:p.id,tool:z.value},null,8,["visible","server-id","tool"])],64)}}},[["__scopeId","data-v-d1eb48b9"]]),Rd={class:"drawer-header"},Bd={class:"header-title"},Hd={class:"header-actions"},qd={class:"mcp-container"},Kd={class:"stats-bar"},Gd={class:"stats-text"},Wd={class:"server-list"},Vd={key:0,class:"empty-state"},Jd=["onClick","onDragstart","onDragover","onDrop"],Zd={class:"card-header"},Yd={class:"card-title"},Xd={class:"server-name"},Qd={class:"card-actions"},ep={key:0,class:"card-desc"},ap={key:1,class:"card-tags"},lp={class:"card-apps"},tp={class:"paste-modal-content"},np={key:0,class:"parse-error"},sp={class:"paste-modal-footer"},op={class:"batch-modal-content"},ip={class:"batch-actions"},rp={class:"batch-selected"},up={class:"batch-list"},cp={class:"batch-item-info"},dp={class:"batch-item-header"},pp={class:"batch-item-name"},vp={class:"batch-item-detail"},mp={key:0},fp={key:1,class:"batch-args"},gp={class:"batch-modal-footer"},yp={class:"export-modal-content"},hp={class:"export-info"},bp={class:"export-modal-footer"},wp=Pl({__name:"McpDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(560),h=e,b=a,k=w({get:()=>h.visible,set:e=>b("update:visible",e)}),C=l(!1),U=l({}),S=l(!1),z=l(null),I=_({}),T=l(null),P=l(null),M=l(!1),$=l(""),j=l(""),O=l(!1),A=l(!1),L=l([]),E=l([]),D=l(!1),N=l(!1),F=l({format:"",content:"",filename:""}),R=l(!1),B=l(null),H=w(()=>Object.values(U.value).sort((e,a)=>void 0!==e.order&&void 0!==a.order?e.order-a.order:void 0!==e.order?-1:void 0!==a.order?1:(a.updatedAt||0)-(e.updatedAt||0))),V=w(()=>H.value.length),J=w(()=>Object.keys(U.value)),Z=w(()=>{const e=H.value;return{claude:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.claude}).length,codex:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.codex}).length,gemini:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.gemini}).length,opencode:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.opencode}).length}}),Y=w({get:()=>{const e=L.value.filter(e=>!te(e.id)).map(e=>e.id);return e.length>0&&e.every(e=>E.value.includes(e))},set:()=>{}}),X=[{label:"同步 Claude 已有配置",key:"claude"},{label:"同步 Codex 已有配置",key:"codex"},{label:"同步 Gemini 已有配置",key:"gemini"},{label:"同步 OpenCode 已有配置",key:"opencode"}],ee=[{label:"导出为 JSON (通用)",key:"json"},{label:"导出为 Claude 格式",key:"claude"},{label:"导出为 Codex 格式 (TOML)",key:"codex"},{label:"导出为 OpenCode 格式",key:"opencode"},{label:"导出为 Gemini 格式",key:"gemini"}];function ae(e){return"online"===e.status?`在线 - ${le(e.lastChecked)}`:"error"===e.status?`异常 - ${le(e.lastChecked)}`:"testing"===e.status?"测试中...":"未测试"}function le(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN",{hour:"2-digit",minute:"2-digit"})}function te(e){return J.value.includes(e)}async function ne(){C.value=!0;try{const e=await cc();e.success&&(U.value=e.servers)}catch(e){Un.error("加载 MCP 服务器失败")}finally{C.value=!1}}async function se(e){I[e.id]=!0,U.value[e.id].status="testing";try{const a=await async function(e){return(await dt.post(`/mcp/servers/${e}/test`)).data}(e.id);if(a.success){const l=a.result;U.value[e.id].status=l.success?"online":"error",U.value[e.id].lastChecked=Date.now(),l.success?Un.success(`${e.name||e.id}: ${l.message} (${l.duration}ms)`):Un.error(`${e.name||e.id}: ${l.message}`)}}catch(a){U.value[e.id].status="error",Un.error("测试失败: "+a.message)}finally{I[e.id]=!1}}async function oe(e,a,l){try{const t=await pc(e,a,l);t.success&&(U.value[e]=t.server,Un.success(`已${l?"启用":"禁用"} ${a}`))}catch(t){Un.error("操作失败")}}function ue(e){Sn.warning({title:"删除确认",content:`确定要删除 MCP 服务器 "${e.name||e.id}" 吗?此操作将从所有平台配置中移除该服务器。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await dt.delete(`/mcp/servers/${e}`)).data}(e.id)).success&&(delete U.value[e.id],Un.success("删除成功"))}catch(a){Un.error("删除失败")}}})}async function ve(e){try{const a=await async function(e){return(await dt.post(`/mcp/import/${e}`)).data}(e);a.success&&(Un.success(a.message),await ne())}catch(a){Un.error("同步失败")}}async function me(e){try{const a=await async function(e="json"){return(await dt.get("/mcp/export",{params:{format:e}})).data}(e);a.success&&(F.value={format:a.format,content:a.content,filename:a.filename},N.value=!0)}catch(a){Un.error("导出失败")}}async function fe(){try{const e=await no(F.value.content);if("manual"===(null==e?void 0:e.method))return void Un.warning("自动复制失败,已弹出手动复制框");Un.success("已复制到剪贴板")}catch{Un.error("复制失败")}}function ge(){const e=new Blob([F.value.content],{type:"text/plain"}),a=URL.createObjectURL(e),l=document.createElement("a");l.href=a,l.download=F.value.filename,l.click(),URL.revokeObjectURL(a),Un.success("下载成功")}function ye(){T.value=null}async function he(e,a){e.preventDefault();const l=T.value;if(null===l||l===a)return void(T.value=null);const t=[...H.value],[n]=t.splice(l,1);t.splice(a,0,n);const s=t.map(e=>e.id);try{await async function(e){return(await dt.post("/mcp/servers/order",{serverIds:e})).data}(s),await ne()}catch(o){Un.error("排序保存失败")}T.value=null}function be(){z.value=null,S.value=!0}function we(){ne()}function ke(){j.value="",O.value=!0;try{let l,t=$.value.trim();if(!t)return j.value="请输入配置内容",void(O.value=!1);t.startsWith("{")||t.startsWith("[")||(t=t.replace(/^[\s,]+/,""),t=t.replace(/[\s,]+$/,""),t=`{${t}}`);try{l=JSON.parse(t)}catch(e){let n=t.replace(/\}\s*"/g,'}, "');try{l=JSON.parse(n)}catch(a){return j.value="JSON 格式错误:"+e.message,void(O.value=!1)}}const n=[];let s=null;if(l.mcpServers&&"object"==typeof l.mcpServers)s=l.mcpServers;else if(l.mcp_servers&&"object"==typeof l.mcp_servers)s=l.mcp_servers;else if(l.command||l.url)s={"new-server":l};else{const e=Object.keys(l);if(!e.some(e=>{const a=l[e];return a&&"object"==typeof a&&(a.command||a.url||a.args)}))return j.value="未找到有效的 MCP 服务器配置,请检查 JSON 格式",void(O.value=!1);s=l}for(const[e,a]of Object.entries(s)){if(!a||"object"!=typeof a)continue;if(!a.command&&!a.url&&!a.args)continue;const l={id:e,name:e,apps:{claude:!0,codex:!1,gemini:!1,opencode:!1},server:{type:a.type||"stdio"}};a.command&&(l.server.command=a.command,a.args&&(l.server.args=Array.isArray(a.args)?a.args:[a.args]),a.env&&"object"==typeof a.env&&(l.server.env=a.env)),a.url&&(l.server.type=a.type||"http",l.server.url=a.url,a.headers&&"object"==typeof a.headers&&(l.server.headers=a.headers)),n.push(l)}if(0===n.length)return j.value="未找到有效的 MCP 服务器配置",void(O.value=!1);1!==n.length||te(n[0].id)?(L.value=n,E.value=n.filter(e=>!te(e.id)).map(e=>e.id),A.value=!0,M.value=!1):(z.value=n[0],S.value=!0,M.value=!1,$.value="")}catch(l){j.value="解析失败:"+l.message}finally{O.value=!1}}function Ce(e){E.value=e?L.value.filter(e=>!te(e.id)).map(e=>e.id):[]}async function Ue(){if(0===E.value.length)return;D.value=!0;let e=0,a=0;try{for(const t of E.value){const n=L.value.find(e=>e.id===t);if(n)try{await dc(n),e++}catch(l){a++}}e>0?(Un.success(`成功导入 ${e} 个服务器${a>0?`,${a} 个失败`:""}`),await ne()):Un.error("导入失败"),A.value=!1,$.value="",L.value=[],E.value=[]}catch(l){Un.error("批量导入失败")}finally{D.value=!1}}return x(()=>h.visible,e=>{e&&ne()}),x(M,e=>{e||(j.value="")}),(e,a)=>(n(),t(m,null,[r(c(pe),{show:k.value,"onUpdate:show":a[5]||(a[5]=e=>k.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{title:"MCP 服务器管理",closable:"","native-scrollbar":!1},{header:u(()=>[s("div",Rd,[s("div",Bd,[r(c(q),{size:20,class:"header-icon"},{default:u(()=>[r(c(Xe))]),_:1}),a[16]||(a[16]=s("span",null,"MCP 服务器管理",-1))]),s("div",Hd,[r(c(_e),{trigger:"click",options:ee,onSelect:me},{default:u(()=>[r(c(K),{size:"small",quaternary:""},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ha))]),_:1})]),default:u(()=>[a[17]||(a[17]=y(" 导出 ",-1))]),_:1})]),_:1}),r(c(K),{size:"small",type:"primary",ghost:"",onClick:a[0]||(a[0]=e=>M.value=!0)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(ua))]),_:1})]),default:u(()=>[a[18]||(a[18]=y(" 粘贴解析 ",-1))]),_:1}),r(c(K),{size:"small",type:"primary",onClick:be},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Oa))]),_:1})]),default:u(()=>[a[19]||(a[19]=y(" 添加 ",-1))]),_:1})])])]),default:u(()=>[s("div",qd,[s("div",Kd,[s("span",Gd,[y(" 共 "+v(V.value)+" 个服务器 ",1),V.value>0?(n(),t(m,{key:0},[y(" · Claude: "+v(Z.value.claude)+" · Codex: "+v(Z.value.codex)+" · Gemini: "+v(Z.value.gemini)+" · OpenCode: "+v(Z.value.opencode),1)],64)):o("",!0)]),r(c(_e),{trigger:"click",options:X,onSelect:ve},{default:u(()=>[r(c(K),{size:"tiny",quaternary:""},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Fa))]),_:1})]),default:u(()=>[a[20]||(a[20]=y(" 同步 ",-1))]),_:1})]),_:1})]),s("div",Wd,[r(c(Q),{show:C.value},{default:u(()=>[0!==H.value.length||C.value?(n(),t("div",{key:1,class:"server-cards",ref_key:"serverCardsRef",ref:P},[(n(!0),t(m,null,f(H.value,(e,l)=>{var i,h,b,w,k,_;return n(),t("div",{key:e.id,class:d(["server-card",{dragging:T.value===l}]),draggable:"true",onClick:a=>function(e){B.value=e,R.value=!0}(e),onDragstart:e=>function(e,a){T.value=a,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",a)}(e,l),onDragend:ye,onDragover:e=>{return(a=e).preventDefault(),void(a.dataTransfer.dropEffect="move");var a},onDrop:e=>he(e,l)},[s("div",Zd,[s("div",Yd,[r(c(q),{class:"drag-handle",size:14},{default:u(()=>[r(c(Ra))]),_:1}),s("span",Xd,v(e.name||e.id),1),(null==(i=e.server)?void 0:i.type)?(n(),g(c(G),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(v(e.server.type),1)]),_:2},1024)):o("",!0),e.status?(n(),g(c(ce),{key:1},{trigger:u(()=>[s("span",{class:d(["status-dot",{online:"online"===e.status,error:"error"===e.status,testing:"testing"===e.status}])},null,2)]),default:u(()=>[y(" "+v(ae(e)),1)]),_:2},1024)):o("",!0)]),s("div",Qd,[r(c(ce),null,{trigger:u(()=>[r(c(K),{quaternary:"",size:"tiny",loading:I[e.id],onClick:p(a=>se(e),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ea))]),_:1})]),_:1},8,["loading","onClick"])]),default:u(()=>[a[23]||(a[23]=y(" 测试连接 ",-1))]),_:2},1024),r(c(K),{quaternary:"",size:"tiny",onClick:p(a=>function(e){z.value=e,S.value=!0}(e),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ba))]),_:1})]),_:1},8,["onClick"]),r(c(K),{quaternary:"",size:"tiny",onClick:p(a=>ue(e),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),_:1},8,["onClick"])])]),e.description?(n(),t("p",ep,v(e.description),1)):o("",!0),(null==(h=e.tags)?void 0:h.length)?(n(),t("div",ap,[(n(!0),t(m,null,f(e.tags.slice(0,3),e=>(n(),g(c(G),{key:e,size:"tiny",bordered:!1},{default:u(()=>[y(v(e),1)]),_:2},1024))),128))])):o("",!0),s("div",lp,[s("label",{class:"app-toggle",onClick:a[1]||(a[1]=p(()=>{},["stop"]))},[r(c(W),{size:"small",value:null==(b=e.apps)?void 0:b.claude,"onUpdate:value":a=>oe(e.id,"claude",a)},null,8,["value","onUpdate:value"]),a[24]||(a[24]=s("span",{class:"app-label"},"Claude",-1))]),s("label",{class:"app-toggle",onClick:a[2]||(a[2]=p(()=>{},["stop"]))},[r(c(W),{size:"small",value:null==(w=e.apps)?void 0:w.codex,"onUpdate:value":a=>oe(e.id,"codex",a)},null,8,["value","onUpdate:value"]),a[25]||(a[25]=s("span",{class:"app-label"},"Codex",-1))]),s("label",{class:"app-toggle",onClick:a[3]||(a[3]=p(()=>{},["stop"]))},[r(c(W),{size:"small",value:null==(k=e.apps)?void 0:k.gemini,"onUpdate:value":a=>oe(e.id,"gemini",a)},null,8,["value","onUpdate:value"]),a[26]||(a[26]=s("span",{class:"app-label"},"Gemini",-1))]),s("label",{class:"app-toggle",onClick:a[4]||(a[4]=p(()=>{},["stop"]))},[r(c(W),{size:"small",value:null==(_=e.apps)?void 0:_.opencode,"onUpdate:value":a=>oe(e.id,"opencode",a)},null,8,["value","onUpdate:value"]),a[27]||(a[27]=s("span",{class:"app-label"},"OpenCode",-1))])])],42,Jd)}),128))],512)):(n(),t("div",Vd,[r(c(q),{size:48,class:"empty-icon"},{default:u(()=>[r(c(Xe))]),_:1}),a[21]||(a[21]=s("p",{class:"empty-title"},"暂无 MCP 服务器",-1)),a[22]||(a[22]=s("p",{class:"empty-desc"},'点击上方"添加"按钮添加 MCP 服务器,或"粘贴解析"快速导入',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),r(Zc,{visible:S.value,"onUpdate:visible":a[6]||(a[6]=e=>S.value=e),"editing-server":z.value,"existing-ids":J.value,onSaved:we},null,8,["visible","editing-server","existing-ids"]),r(c(ie),{show:M.value,"onUpdate:show":a[9]||(a[9]=e=>M.value=e),preset:"card",title:"粘贴 MCP 配置",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[s("div",sp,[r(c(K),{onClick:a[8]||(a[8]=e=>M.value=!1)},{default:u(()=>[...a[30]||(a[30]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:ke,loading:O.value},{default:u(()=>[...a[31]||(a[31]=[y(" 解析配置 ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[s("div",tp,[a[28]||(a[28]=s("p",{class:"paste-hint"}," 粘贴 JSON 格式的 MCP 配置,支持单个或批量导入。格式示例: ",-1)),a[29]||(a[29]=s("pre",{class:"paste-example"},'{\n "mcpServers": {\n "服务器名称": {\n "command": "npx",\n "args": ["-y", "package-name"],\n "env": { "API_KEY": "xxx" }\n }\n }\n}',-1)),r(c(re),{value:$.value,"onUpdate:value":a[7]||(a[7]=e=>$.value=e),type:"textarea",placeholder:"在此粘贴 JSON 配置...",rows:8,status:j.value?"error":void 0},null,8,["value","status"]),j.value?(n(),t("p",np,v(j.value),1)):o("",!0)])]),_:1},8,["show"]),r(c(ie),{show:A.value,"onUpdate:show":a[12]||(a[12]=e=>A.value=e),preset:"card",title:"选择要导入的 MCP 服务器",style:{width:"650px","max-width":"90vw"}},{footer:u(()=>[s("div",gp,[r(c(K),{onClick:a[11]||(a[11]=e=>A.value=!1)},{default:u(()=>[...a[33]||(a[33]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",disabled:0===E.value.length,loading:D.value,onClick:Ue},{default:u(()=>[y(" 导入选中 ("+v(E.value.length)+") ",1)]),_:1},8,["disabled","loading"])])]),default:u(()=>[s("div",op,[s("div",ip,[r(c(xe),{checked:Y.value,"onUpdate:checked":[a[10]||(a[10]=e=>Y.value=e),Ce]},{default:u(()=>[y(" 全选 ("+v(L.value.length)+") ",1)]),_:1},8,["checked"]),s("span",rp,"已选择 "+v(E.value.length)+" 个",1)]),s("div",up,[(n(!0),t(m,null,f(L.value,e=>{var l,i,p,m;return n(),t("div",{key:e.id,class:d(["batch-item",{selected:E.value.includes(e.id),exists:te(e.id)}])},[r(c(xe),{checked:E.value.includes(e.id),disabled:te(e.id),"onUpdate:checked":a=>function(e,a){if(a)E.value.includes(e)||E.value.push(e);else{const a=E.value.indexOf(e);a>-1&&E.value.splice(a,1)}}(e.id,a)},null,8,["checked","disabled","onUpdate:checked"]),s("div",cp,[s("div",dp,[s("span",pp,v(e.id),1),te(e.id)?(n(),g(c(G),{key:0,size:"tiny",type:"warning"},{default:u(()=>[...a[32]||(a[32]=[y("已存在",-1)])]),_:1})):o("",!0),(null==(l=e.server)?void 0:l.type)?(n(),g(c(G),{key:1,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(v(e.server.type),1)]),_:2},1024)):o("",!0)]),s("div",vp,[(null==(i=e.server)?void 0:i.command)?(n(),t("span",mp,v(e.server.command),1)):o("",!0),(null==(m=null==(p=e.server)?void 0:p.args)?void 0:m.length)?(n(),t("span",fp,v(e.server.args.slice(0,3).join(" "))+v(e.server.args.length>3?"...":""),1)):o("",!0)])])],2)}),128))])])]),_:1},8,["show"]),r(c(ie),{show:N.value,"onUpdate:show":a[14]||(a[14]=e=>N.value=e),preset:"card",title:"导出 MCP 配置",style:{width:"650px","max-width":"90vw"}},{footer:u(()=>[s("div",bp,[r(c(K),{onClick:a[13]||(a[13]=e=>N.value=!1)},{default:u(()=>[...a[34]||(a[34]=[y("关闭",-1)])]),_:1}),r(c(K),{onClick:fe},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(qa))]),_:1})]),default:u(()=>[a[35]||(a[35]=y(" 复制 ",-1))]),_:1}),r(c(K),{type:"primary",onClick:ge},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ha))]),_:1})]),default:u(()=>[a[36]||(a[36]=y(" 下载 ",-1))]),_:1})])]),default:u(()=>[s("div",yp,[s("div",hp,[s("span",null,"格式: "+v(F.value.format),1),s("span",null,"文件名: "+v(F.value.filename),1)]),r(c(re),{value:F.value.content,type:"textarea",readonly:"",rows:12,class:"export-content"},null,8,["value"])])]),_:1},8,["show"]),r(Fd,{visible:R.value,"onUpdate:visible":a[15]||(a[15]=e=>R.value=e),server:B.value},null,8,["visible","server"])],64))}},[["__scopeId","data-v-2e0639fd"]]);const kp={key:0,class:"editor-container"},_p=["innerHTML"],xp={key:1,class:"placeholder-text"},Cp={class:"preview-hint"},Up=Pl({__name:"MarkdownEditor",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:"输入内容,支持 Markdown 格式..."},rows:{type:Number,default:10},minHeight:{type:Number,default:150},disabled:{type:Boolean,default:!1},defaultEditing:{type:Boolean,default:!1}},emits:["update:modelValue","edit","blur"],setup(e,{expose:a,emit:o}){const i=e,p=o,m=l(i.defaultEditing),f=l(null);function g(e,a){ml.getLanguage(e)||ml.registerLanguage(e,a)}g("javascript",fl),g("typescript",bl),g("json",hl),g("bash",yl),g("shell",yl),g("sh",yl),g("python",gl),g("css",wl),g("xml",kl),g("html",kl);const y=new xl({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&ml.getLanguage(a))try{return'<pre class="hljs"><code>'+ml.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(l){}return'<pre class="hljs"><code>'+y.utils.escapeHtml(e)+"</code></pre>"}}),h=w(()=>y.render(i.modelValue||""));function b(){i.disabled||(m.value=!0,p("edit"),P(()=>{var e;null==(e=f.value)||e.focus()}))}function k(){m.value=!1,p("blur")}function _(){setTimeout(()=>{k()},150)}function C(){k()}return x(()=>i.defaultEditing,e=>{e&&!m.value&&b()}),a({enterEditMode:b,exitEditMode:k,isEditing:m}),(a,l)=>(n(),t("div",{class:d(["markdown-editor",{"is-editing":m.value,"is-empty":!e.modelValue}])},[m.value?(n(),t("div",kp,[r(c(re),{ref_key:"inputRef",ref:f,value:e.modelValue,type:"textarea",rows:e.rows,placeholder:e.placeholder,disabled:e.disabled,"onUpdate:value":l[0]||(l[0]=e=>a.$emit("update:modelValue",e)),onBlur:_,onKeydown:O(C,["esc"])},null,8,["value","rows","placeholder","disabled"]),l[1]||(l[1]=s("div",{class:"editor-hint"},[s("span",null,"按 Esc 退出编辑 | 支持 Markdown 格式")],-1))])):(n(),t("div",{key:1,class:"preview-container",style:I({minHeight:e.minHeight+"px"}),onDblclick:b},[e.modelValue?(n(),t("div",{key:0,class:"markdown-content",innerHTML:h.value},null,8,_p)):(n(),t("div",xp,v(e.placeholder||"双击编辑..."),1)),s("div",Cp,[r(c(q),{size:"12"},{default:u(()=>[r(c(Ba))]),_:1}),l[2]||(l[2]=s("span",null,"双击编辑",-1))])],36))],2))}},[["__scopeId","data-v-224a81d1"]]),Sp={class:"form-header"},zp={class:"form-container"},Ip={class:"form-section"},Tp={class:"section-title"},Pp={class:"form-item"},Mp={key:0,class:"form-error"},$p={class:"form-item"},jp={class:"form-item"},Op={class:"form-section"},Ap={class:"section-title"},Lp={class:"apps-toggles"},Ep={class:"app-toggle"},Dp={class:"app-toggle"},Np={class:"app-toggle"},Fp={class:"app-toggle"},Rp={class:"form-section content-section"},Bp={class:"section-title"},Hp={class:"form-footer"},qp=Pl({__name:"PromptsFormDrawer",props:{visible:{type:Boolean,default:!1},editingPreset:{type:Object,default:null},existingIds:{type:Array,default:()=>[]}},emits:["update:visible","saved"],setup(e,{emit:a}){const{drawerWidth:i}=ko(600),d=e,p=a,m=w({get:()=>d.visible,set:e=>p("update:visible",e)}),f=w(()=>!!d.editingPreset),h=l(!1),b=l(""),k=_({id:"",name:"",description:"",content:"",apps:{claude:!0,codex:!0,gemini:!0,opencode:!0}});async function C(){var e;if(k.id.trim()?/^[a-zA-Z0-9_-]+$/.test(k.id)?!f.value&&d.existingIds.includes(k.id)?(b.value="该 ID 已被使用",0):(b.value="",1):(b.value="ID 只能包含字母、数字、下划线和连字符",0):(b.value="预设 ID 不能为空",0))if(k.name.trim()){h.value=!0;try{const a={id:k.id.trim(),name:k.name.trim(),description:k.description.trim(),content:k.content,apps:{...k.apps}};(null==(e=d.editingPreset)?void 0:e.isBuiltin)&&(a.isBuiltin=!0);const l=await async function(e){return(await dt.post("/prompts/presets",e)).data}(a);l.success&&(Un.success(f.value?"保存成功":"创建成功"),p("saved"),m.value=!1)}catch(a){Un.error("保存失败: "+a.message)}finally{h.value=!1}}else Un.error("预设名称不能为空")}function U(){m.value=!1}return x(()=>d.visible,e=>{var a,l,t,n;e&&(d.editingPreset?(k.id=d.editingPreset.id||"",k.name=d.editingPreset.name||"",k.description=d.editingPreset.description||"",k.content=d.editingPreset.content||"",k.apps={claude:(null==(a=d.editingPreset.apps)?void 0:a.claude)??!0,codex:(null==(l=d.editingPreset.apps)?void 0:l.codex)??!0,gemini:(null==(t=d.editingPreset.apps)?void 0:t.gemini)??!0,opencode:(null==(n=d.editingPreset.apps)?void 0:n.opencode)??!0}):(k.id="",k.name="",k.description="",k.content="",k.apps={claude:!0,codex:!0,gemini:!0,opencode:!0}),b.value="")}),(a,l)=>(n(),g(c(pe),{show:m.value,"onUpdate:show":l[8]||(l[8]=e=>m.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",Sp,[r(c(q),{size:18,class:"header-icon"},{default:u(()=>[r(c(Oa))]),_:1}),s("span",null,v(f.value?"编辑预设":"新建预设"),1)])]),footer:u(()=>[s("div",Hp,[r(c(K),{onClick:U},{default:u(()=>[...l[24]||(l[24]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:C,loading:h.value},{default:u(()=>[y(v(f.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>{var a;return[s("div",zp,[s("div",Ip,[s("div",Tp,[r(c(q),{size:16},{default:u(()=>[r(c(Ma))]),_:1}),l[9]||(l[9]=s("span",null,"基本信息",-1))]),s("div",Pp,[l[10]||(l[10]=s("label",{class:"form-label"},[y("预设 ID "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:k.id,"onUpdate:value":l[0]||(l[0]=e=>k.id=e),placeholder:"唯一标识符,如 my-preset",disabled:f.value&&(null==(a=e.editingPreset)?void 0:a.isBuiltin)},null,8,["value","disabled"]),b.value?(n(),t("p",Mp,v(b.value),1)):o("",!0)]),s("div",$p,[l[11]||(l[11]=s("label",{class:"form-label"},[y("名称 "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:k.name,"onUpdate:value":l[1]||(l[1]=e=>k.name=e),placeholder:"预设名称"},null,8,["value"])]),s("div",jp,[l[12]||(l[12]=s("label",{class:"form-label"},"描述",-1)),r(c(re),{value:k.description,"onUpdate:value":l[2]||(l[2]=e=>k.description=e),placeholder:"简短描述这个预设的用途"},null,8,["value"])])]),s("div",Op,[s("div",Ap,[r(c(q),{size:16},{default:u(()=>[r(c($a))]),_:1}),l[13]||(l[13]=s("span",null,"生效范围",-1))]),s("div",Lp,[s("label",Ep,[r(c(W),{value:k.apps.claude,"onUpdate:value":l[3]||(l[3]=e=>k.apps.claude=e)},null,8,["value"]),l[14]||(l[14]=s("span",{class:"app-name"},"Claude",-1)),l[15]||(l[15]=s("span",{class:"app-path"},"~/.claude/CLAUDE.md",-1))]),s("label",Dp,[r(c(W),{value:k.apps.codex,"onUpdate:value":l[4]||(l[4]=e=>k.apps.codex=e)},null,8,["value"]),l[16]||(l[16]=s("span",{class:"app-name"},"Codex",-1)),l[17]||(l[17]=s("span",{class:"app-path"},"~/.codex/AGENTS.md",-1))]),s("label",Np,[r(c(W),{value:k.apps.gemini,"onUpdate:value":l[5]||(l[5]=e=>k.apps.gemini=e)},null,8,["value"]),l[18]||(l[18]=s("span",{class:"app-name"},"Gemini",-1)),l[19]||(l[19]=s("span",{class:"app-path"},"~/.gemini/GEMINI.md",-1))]),s("label",Fp,[r(c(W),{value:k.apps.opencode,"onUpdate:value":l[6]||(l[6]=e=>k.apps.opencode=e)},null,8,["value"]),l[20]||(l[20]=s("span",{class:"app-name"},"OpenCode",-1)),l[21]||(l[21]=s("span",{class:"app-path"},"~/.config/opencode/AGENTS.md",-1))])])]),s("div",Rp,[s("div",Bp,[r(c(q),{size:16},{default:u(()=>[r(c(ua))]),_:1}),l[22]||(l[22]=s("span",null,"提示词内容",-1)),l[23]||(l[23]=s("span",{class:"content-hint"},"支持 Markdown 格式",-1))]),r(Up,{modelValue:k.content,"onUpdate:modelValue":l[7]||(l[7]=e=>k.content=e),rows:16,"min-height":300,placeholder:"# 系统提示词\n\n在这里编写你的系统提示词..."},null,8,["modelValue"])])])]}),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-41ac86b6"]]),Kp={class:"drawer-header"},Gp={class:"header-title"},Wp={class:"prompts-container"},Vp={class:"status-card"},Jp={class:"status-info"},Zp={class:"status-text"},Yp={class:"status-value"},Xp={class:"status-actions"},Qp={class:"stats-bar"},ev={class:"stats-text"},av={class:"preset-list"},lv={key:0,class:"empty-state"},tv={key:1,class:"preset-cards"},nv={class:"card-header"},sv={class:"card-title"},ov={class:"preset-name"},iv={class:"card-actions"},rv={key:0,class:"card-desc"},uv={class:"card-apps"},cv={class:"card-preview"},dv={class:"preview-content"},pv=Pl({__name:"PromptsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(680),p=e,h=a,b=w({get:()=>p.visible,set:e=>h("update:visible",e)}),k=l(!1),_=l({}),C=l(null),U=l(!1),S=l(null),z=l(null),I=l(!1),T=w(()=>{const e=Object.values(_.value),a=e.filter(e=>!e.isBuiltin),l=e.filter(e=>e.isBuiltin);return a.sort((e,a)=>e.id===C.value?-1:a.id===C.value?1:(a.updatedAt||0)-(e.updatedAt||0)),[...a,...l]}),P=w(()=>T.value.length),M=w(()=>Object.keys(_.value)),$=w(()=>C.value?_.value[C.value]:null),j=w(()=>{const e=T.value;return{builtin:e.filter(e=>e.isBuiltin).length,custom:e.filter(e=>!e.isBuiltin).length}}),O=[{label:"从 Claude 导入",key:"claude"},{label:"从 Codex 导入",key:"codex"},{label:"从 Gemini 导入",key:"gemini"},{label:"从 OpenCode 导入",key:"opencode"}];function A(e){if(!e)return"";let a=e.split("\n").slice(0,4).join("\n");return e.split("\n").length>4&&(a+="\n..."),a.substring(0,200)}async function L(){k.value=!0;try{const e=await async function(){return(await dt.get("/prompts/presets")).data}();e.success&&(_.value=e.presets,C.value=e.activePresetId)}catch(e){Un.error("加载预设失败")}finally{k.value=!1}}async function E(e){z.value=e.id;try{(await async function(e){return(await dt.post(`/prompts/presets/${e}/activate`)).data}(e.id)).success&&(C.value=e.id,Un.success(`已激活预设 "${e.name}"`))}catch(a){Un.error("激活失败: "+a.message)}finally{z.value=null}}async function D(){Sn.warning({title:"移除提示词",content:"确定要移除当前激活的提示词吗?这将删除各平台的提示词文件(CLAUDE.md、AGENTS.md、GEMINI.md、OpenCode AGENTS.md)。",positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{I.value=!0;try{(await async function(){return(await dt.post("/prompts/deactivate")).data}()).success&&(C.value=null,Un.success("已移除提示词"))}catch(e){Un.error("移除失败: "+e.message)}finally{I.value=!1}}})}function N(e){Sn.warning({title:"删除确认",content:`确定要删除预设 "${e.name}" 吗?此操作不可恢复。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await dt.delete(`/prompts/presets/${e}`)).data}(e.id)).success&&(delete _.value[e.id],Un.success("删除成功"))}catch(a){Un.error("删除失败: "+a.message)}}})}async function F(e){try{const a=await async function(e,a){return(await dt.post(`/prompts/import/${e}`,{name:a})).data}(e);a.success&&(_.value[a.preset.id]=a.preset,Un.success(a.message))}catch(a){Un.error("导入失败: "+a.message)}}function R(){S.value=null,U.value=!0}function B(){L()}return x(()=>p.visible,e=>{e&&L()}),(e,a)=>(n(),t(m,null,[r(c(pe),{show:b.value,"onUpdate:show":a[0]||(a[0]=e=>b.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{title:"Prompts 管理",closable:"","native-scrollbar":!1},{header:u(()=>[s("div",Kp,[s("div",Gp,[r(c(q),{size:20,class:"header-icon"},{default:u(()=>[r(c(Oa))]),_:1}),a[2]||(a[2]=s("span",null,"Prompts 管理",-1))])])]),default:u(()=>[s("div",Wp,[s("div",Vp,[s("div",Jp,[$.value?(n(),t(m,{key:0},[r(c(q),{class:"status-icon active",size:18},{default:u(()=>[r(c(He))]),_:1}),s("div",Zp,[a[3]||(a[3]=s("span",{class:"status-label"},"当前激活:",-1)),s("span",Yp,v($.value.name),1)])],64)):(n(),t(m,{key:1},[r(c(q),{class:"status-icon inactive",size:18},{default:u(()=>[r(c(Ka))]),_:1}),a[4]||(a[4]=s("div",{class:"status-text"},[s("span",{class:"status-label"},"未激活任何提示词")],-1))],64))]),s("div",Xp,[r(c(_e),{trigger:"click",options:O,onSelect:F},{default:u(()=>[r(c(K),{size:"small",tertiary:"",class:"action-btn"},{icon:u(()=>[r(c(q),{size:14},{default:u(()=>[r(c(Ha))]),_:1})]),default:u(()=>[a[5]||(a[5]=y(" 导入 ",-1))]),_:1})]),_:1}),r(c(K),{size:"small",tertiary:"",type:"primary",class:"action-btn",onClick:R},{icon:u(()=>[r(c(q),{size:14},{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[a[6]||(a[6]=y(" 新建 ",-1))]),_:1}),$.value?(n(),g(c(ce),{key:0,trigger:"hover"},{trigger:u(()=>[r(c(K),{size:"small",quaternary:"",class:"action-btn remove-btn",onClick:D,loading:I.value},{icon:u(()=>[r(c(q),{size:16},{default:u(()=>[r(c(Ke))]),_:1})]),default:u(()=>[a[7]||(a[7]=y(" 移除 ",-1))]),_:1},8,["loading"])]),default:u(()=>[a[8]||(a[8]=y(" 删除各平台的提示词文件 ",-1))]),_:1})):o("",!0)])]),s("div",Qp,[s("span",ev,[y(" 共 "+v(P.value)+" 个预设 ",1),P.value>0?(n(),t(m,{key:0},[y(" · 自定义: "+v(j.value.custom)+" · 内置模板: "+v(j.value.builtin),1)],64)):o("",!0)])]),s("div",av,[r(c(Q),{show:k.value},{default:u(()=>[0!==T.value.length||k.value?(n(),t("div",tv,[(n(!0),t(m,null,f(T.value,e=>(n(),t("div",{key:e.id,class:d(["preset-card",{active:e.id===C.value}])},[s("div",nv,[s("div",sv,[e.id===C.value?(n(),g(c(q),{key:0,class:"active-icon",size:16},{default:u(()=>[r(c(He))]),_:1})):o("",!0),s("span",ov,v(e.name),1),e.isBuiltin?(n(),g(c(G),{key:1,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[...a[11]||(a[11]=[y("模板",-1)])]),_:1})):o("",!0),e.isImported?(n(),g(c(G),{key:2,size:"tiny",bordered:!1,type:"warning"},{default:u(()=>[...a[12]||(a[12]=[y("已导入",-1)])]),_:1})):o("",!0)]),s("div",iv,[e.id!==C.value?(n(),g(c(K),{key:0,size:"tiny",type:"primary",onClick:a=>E(e),loading:z.value===e.id},{default:u(()=>[...a[13]||(a[13]=[y(" 激活 ",-1)])]),_:1},8,["onClick","loading"])):o("",!0),r(c(K),{quaternary:"",size:"tiny",onClick:a=>function(e){S.value=e,U.value=!0}(e)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ba))]),_:1})]),_:1},8,["onClick"]),e.isBuiltin?o("",!0):(n(),g(c(K),{key:1,quaternary:"",size:"tiny",onClick:a=>N(e)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),_:1},8,["onClick"]))])]),e.description?(n(),t("p",rv,v(e.description),1)):o("",!0),s("div",uv,[a[14]||(a[14]=s("span",{class:"apps-label"},"生效范围:",-1)),(n(),t(m,null,f(["claude","codex","gemini","opencode"],a=>{var l;return r(c(G),{key:a,type:(null==(l=e.apps)?void 0:l[a])?"success":"default",size:"tiny",bordered:!1},{default:u(()=>[y(v(a),1)]),_:2},1032,["type"])}),64))]),s("div",cv,[s("pre",dv,v(A(e.content)),1)])],2))),128))])):(n(),t("div",lv,[r(c(q),{size:48,class:"empty-icon"},{default:u(()=>[r(c(Oa))]),_:1}),a[9]||(a[9]=s("p",{class:"empty-title"},"暂无预设",-1)),a[10]||(a[10]=s("p",{class:"empty-desc"},'点击上方"新建"按钮创建系统提示词预设',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),r(qp,{visible:U.value,"onUpdate:visible":a[1]||(a[1]=e=>U.value=e),"editing-preset":S.value,"existing-ids":M.value,onSaved:B},null,8,["visible","editing-preset","existing-ids"])],64))}},[["__scopeId","data-v-98aafe0f"]]),vv={class:"drawer-header"},mv={class:"header-icon-wrapper"},fv={class:"speed-test-container"},gv={class:"test-controls"},yv={key:0,class:"test-summary"},hv={class:"summary-item"},bv={class:"summary-value"},wv={class:"summary-item success"},kv={class:"summary-value"},_v={class:"summary-item failed"},xv={class:"summary-value"},Cv={class:"summary-item avg"},Uv={class:"summary-value"},Sv={class:"results-list"},zv={key:0,class:"loading-state"},Iv={key:1,class:"empty-state"},Tv={class:"empty-icon-wrapper"},Pv={key:2,class:"result-cards"},Mv={class:"result-header"},$v={class:"channel-info"},jv={class:"channel-name"},Ov={class:"result-status"},Av={key:1,class:"status-badge failed"},Lv={key:0,class:"result-details"},Ev={class:"latency-bar"},Dv={key:1,class:"error-info"},Nv={class:"error-container"},Fv={class:"error-msg"},Rv={key:0,class:"error-latency"},Bv={key:1,class:"result-meta"},Hv={class:"meta-item status-indicator"},qv={class:"meta-item status-indicator"},Kv={key:0,class:"meta-item http-code"},Gv={key:1,class:"meta-item time"},Wv={key:1,class:"cache-hint"},Vv="speedTestResults",Jv="speedTestSummary",Zv="speedTestTime",Yv=Pl({__name:"SpeedTestDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(520),p=e,h=a,b=w({get:()=>p.visible,set:e=>h("update:visible",e)}),k=l(!1),_=l([]),C=l(null),U=l("all"),S=l(!1),z=[{label:"全部渠道",value:"all"},{label:"Claude",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"}];async function T(){k.value=!0,_.value=[],C.value=null,S.value=!1;const e=[];"all"!==U.value&&"claude"!==U.value||e.push({type:"claude",fn:$t}),"all"!==U.value&&"codex"!==U.value||e.push({type:"codex",fn:Ot}),"all"!==U.value&&"gemini"!==U.value||e.push({type:"gemini",fn:Lt});let a=[],l={total:0,success:0,failed:0,avgLatency:null},t=0,n=0;try{for(const{type:o,fn:i}of e)try{const e=await i(1e4);if(e.results){const s=e.results.map(e=>({...e,channelType:o,channelName:`[${o.toUpperCase()}] ${e.channelName}`,testedAt:Date.now()}));a=a.concat(s),_.value=[...a],e.summary&&(l.total+=e.summary.total||0,l.success+=e.summary.success||0,l.failed+=e.summary.failed||0,null!==e.summary.avgLatency&&void 0!==e.summary.avgLatency&&(e.summary.success||0)>0&&(t+=e.summary.avgLatency*(e.summary.success||0),n+=e.summary.success||0))}}catch(s){}l.avgLatency=n>0?Math.round(t/n):null,_.value=a.sort((e,a)=>{if(e.success&&!a.success)return-1;if(!e.success&&a.success)return 1;if(e.success&&a.success){return(null===e.latency||void 0===e.latency?1/0:e.latency)-(null===a.latency||void 0===a.latency?1/0:a.latency)}return 0}),C.value=l,function(){try{localStorage.setItem(Vv,JSON.stringify(_.value)),localStorage.setItem(Jv,JSON.stringify(C.value)),localStorage.setItem(Zv,Date.now().toString())}catch(e){}}(),0===l.total?Un.info("没有找到可测试的渠道"):Un.success(`测试完成: ${l.success}/${l.total} 成功`)}catch(s){Un.error("测试失败: "+s.message)}finally{k.value=!1}}function P(e){switch(e){case"excellent":return"优秀";case"good":return"良好";case"fair":return"一般";case"poor":return"较差";default:return"-"}}function M(e){if(!e)return"";return new Date(e).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function $(e){switch(e){case"claude":return"Claude";case"codex":return"Codex";case"gemini":return"Gemini";default:return(null==e?void 0:e.toUpperCase())||""}}function j(e){switch(e){case"claude":return"type-claude";case"codex":return"type-codex";case"gemini":return"type-gemini";default:return""}}return x(()=>p.visible,e=>{e&&function(){try{const e=localStorage.getItem(Zv);if(e&&Date.now()-parseInt(e)<3e5){const e=localStorage.getItem(Vv),a=localStorage.getItem(Jv);return e&&(_.value=JSON.parse(e),S.value=!0),a&&(C.value=JSON.parse(a)),!0}}catch(e){}}()}),(e,a)=>(n(),g(c(pe),{show:b.value,"onUpdate:show":a[1]||(a[1]=e=>b.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",vv,[s("div",mv,[r(c(q),{size:18},{default:u(()=>[r(c(Be))]),_:1})]),a[2]||(a[2]=s("span",null,"渠道速度测试",-1))])]),default:u(()=>[s("div",fv,[s("div",gv,[r(c(K),{type:"primary",loading:k.value,disabled:k.value,onClick:T,class:"test-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ea))]),_:1})]),default:u(()=>[y(" "+v(k.value?"测试中...":"开始全部测试"),1)]),_:1},8,["loading","disabled"]),r(c(te),{value:U.value,"onUpdate:value":a[0]||(a[0]=e=>U.value=e),options:z,placeholder:"选择渠道类型",style:{width:"140px"}},null,8,["value"])]),C.value?(n(),t("div",yv,[s("div",hv,[a[3]||(a[3]=s("span",{class:"summary-label"},"总计",-1)),s("span",bv,v(C.value.total),1)]),s("div",wv,[a[4]||(a[4]=s("span",{class:"summary-label"},"成功",-1)),s("span",kv,v(C.value.success),1)]),s("div",_v,[a[5]||(a[5]=s("span",{class:"summary-label"},"失败",-1)),s("span",xv,v(C.value.failed),1)]),s("div",Cv,[a[6]||(a[6]=s("span",{class:"summary-label"},"平均延迟",-1)),s("span",Uv,v(null!==C.value.avgLatency&&void 0!==C.value.avgLatency?C.value.avgLatency+"ms":"-"),1)])])):o("",!0),s("div",Sv,[k.value&&0===_.value.length?(n(),t("div",zv,[r(c(Q),{size:"large"}),a[7]||(a[7]=s("p",{class:"loading-text"},"正在测试渠道连接速度和 API 可用性...",-1))])):0!==_.value.length||k.value?(n(),t("div",Pv,[(n(!0),t(m,null,f(_.value,e=>{return n(),t("div",{key:e.channelId,class:d(["result-card",[e.success?"success":"failed",e.testing?"testing":""]])},[s("div",Mv,[s("div",$v,[s("span",{class:d(["channel-type-badge",j(e.channelType)])},v($(e.channelType)),3),s("span",jv,v((l=e.channelName,l?l.replace(/^\[(CLAUDE|CODEX|GEMINI)\]\s*/i,""):"")),1)]),s("div",Ov,[e.testing?(n(),g(c(Q),{key:0,size:14})):(n(),t(m,{key:1},[e.success?(n(),t("span",{key:0,class:d(["latency-badge",e.level])},v(e.latency)+"ms ",3)):(n(),t("span",Av,"失败"))],64))])]),e.testing?o("",!0):(n(),t("div",Lv,[e.success?(n(),t(m,{key:0},[s("div",Ev,[s("div",{class:d(["latency-fill",e.level]),style:I({width:(a=e.latency,(null==a?0:Math.min(a/3e3*100,100))+"%")})},null,6)]),s("span",{class:d(["latency-level",e.level])},v(P(e.level)),3)],64)):(n(),t("div",Dv,[s("div",Nv,[r(c(q),{size:14,class:"error-icon"},{default:u(()=>[r(c(Na))]),_:1}),s("span",Fv,v(e.error),1)]),null!==e.latency&&void 0!==e.latency?(n(),t("span",Rv," 响应 "+v(e.latency)+"ms ",1)):o("",!0)]))])),e.testing?o("",!0):(n(),t("div",Bv,[s("span",Hv,[s("span",{class:d(["status-dot",e.networkOk?"ok":"fail"])},null,2),y(" 网络"+v(e.networkOk?"正常":"异常"),1)]),s("span",qv,[s("span",{class:d(["status-dot",e.apiOk?"ok":"fail"])},null,2),y(" API"+v(e.apiOk?"可用":"不可用"),1)]),e.statusCode?(n(),t("span",Kv,"HTTP "+v(e.statusCode),1)):o("",!0),e.testedAt?(n(),t("span",Gv,v(M(e.testedAt)),1)):o("",!0)]))],2);var a,l}),128))])):(n(),t("div",Iv,[s("div",Tv,[r(c(q),{size:32},{default:u(()=>[r(c(Be))]),_:1})]),a[8]||(a[8]=s("p",{class:"empty-title"},"暂无测试结果",-1)),a[9]||(a[9]=s("p",{class:"empty-desc"},"点击上方按钮开始测试渠道连接速度",-1))]))]),S.value&&!k.value?(n(),t("div",Wv,[r(c(q),{size:14},{default:u(()=>[r(c(Ga))]),_:1}),a[10]||(a[10]=s("span",null,"显示的是缓存的测试结果,点击按钮重新测试",-1))])):o("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-bd919653"]]),Xv="http://localhost:19999";async function Qv(e){return(await B.post(`${Xv}/api/convert/opencode/claude`,e)).data}async function em(e){return(await B.post(`${Xv}/api/convert/opencode/codex`,e)).data}async function am(e){return(await B.post(`${Xv}/api/convert/opencode/gemini`,e)).data}const lm={class:"drawer-header"},tm={class:"header-icon-wrapper"},nm={class:"convert-container"},sm={class:"action-row"},om={key:1,class:"result-section"},im={class:"result-meta"},rm={class:"meta-row"},um={class:"meta-row"},cm={class:"meta-row"},dm={class:"warning-list"},pm={class:"action-row"},vm=Pl({__name:"GatewayConvertDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(620,520),d=e,p=a,h=w({get:()=>d.visible,set:e=>p("update:visible",e)}),b=l([{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"}]),k=l([{label:"Responses API (/v1/responses)",value:"responses"},{label:"Chat Completions (/v1/chat/completions)",value:"chat.completions"}]),_=l("claude"),C=l("responses"),U=l(""),S=l(!1),z=l(null),I=l(""),T=l(!1),P={claude:{model:"claude-sonnet-4-5",system:[{type:"text",text:"You are a concise assistant."}],messages:[{role:"user",content:[{type:"text",text:"请用三点总结这个需求。"}]}],max_tokens:256,stream:!1},codex:{model:"gpt-5-codex",instructions:"You are Codex.",input:[{type:"message",role:"user",content:[{type:"input_text",text:"ping"}]}],stream:!1,store:!1},gemini:{model:"gemini-2.5-pro",system_instruction:{parts:[{text:"You are a concise assistant."}]},contents:[{role:"user",parts:[{text:"请将以下文本转换为要点列表。"}]}],generationConfig:{maxOutputTokens:256,temperature:.2}}},M=w(()=>{var e;return(null==(e=z.value)?void 0:e.requestBody)?JSON.stringify(z.value.requestBody,null,2):""});function $(){const e=P[_.value]||P.claude;U.value=JSON.stringify(e,null,2)}async function j(){if(!T.value)try{const e=await async function(){return(await B.get(`${Xv}/api/convert/opencode/formats`)).data}();Array.isArray(e.sourceTypes)&&e.sourceTypes.length>0&&(b.value=e.sourceTypes.map(e=>({label:e.name||e.id,value:e.id}))),Array.isArray(e.targetApis)&&e.targetApis.length>0&&(k.value=e.targetApis.map(e=>"chat.completions"===e?{label:"Chat Completions (/v1/chat/completions)",value:e}:{label:"Responses API (/v1/responses)",value:e})),e.defaultTargetApi&&(C.value=e.defaultTargetApi),T.value=!0}catch(e){}}function O(){I.value="",z.value=null}async function A(){var e,a;let l;I.value="",z.value=null;try{l=JSON.parse(U.value||"{}")}catch(t){return void(I.value="原始请求 JSON 解析失败,请检查格式")}S.value=!0;try{const e={claude:Qv,codex:em,gemini:am}[_.value];if(!e)throw new Error(`Unsupported sourceType: ${_.value}`);const a=await e({payload:l,options:{targetApi:C.value}});if(!1===a.success)throw new Error(a.error||"转换失败");z.value=a,Un.success("转换完成")}catch(t){const l=(null==(a=null==(e=t.response)?void 0:e.data)?void 0:a.error)||t.message||"转换失败";I.value=l}finally{S.value=!1}}async function L(){if(!z.value)return;const e={endpoint:z.value.endpoint,requestBody:z.value.requestBody};try{await navigator.clipboard.writeText(JSON.stringify(e,null,2)),Un.success("已复制转换结果")}catch(a){Un.error("复制失败,请手动复制")}}return x(()=>_.value,()=>{$()}),x(()=>d.visible,async e=>{e&&(await j(),U.value||$())}),(e,a)=>(n(),g(c(pe),{show:h.value,"onUpdate:show":a[3]||(a[3]=e=>h.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",lm,[s("div",tm,[r(c(q),{size:18},{default:u(()=>[r(c(Wa))]),_:1})]),a[4]||(a[4]=s("span",null,"OpenCode 请求转换",-1))])]),default:u(()=>[s("div",nm,[r(c(ae),{"label-placement":"top"},{default:u(()=>[r(c(le),{label:"来源渠道"},{default:u(()=>[r(c(te),{value:_.value,"onUpdate:value":a[0]||(a[0]=e=>_.value=e),options:b.value,placeholder:"选择来源渠道"},null,8,["value","options"])]),_:1}),r(c(le),{label:"目标 API"},{default:u(()=>[r(c(te),{value:C.value,"onUpdate:value":a[1]||(a[1]=e=>C.value=e),options:k.value,placeholder:"选择目标 API"},null,8,["value","options"])]),_:1}),r(c(le),{label:"原始请求 JSON"},{default:u(()=>[r(c(re),{value:U.value,"onUpdate:value":a[2]||(a[2]=e=>U.value=e),type:"textarea",autosize:{minRows:10,maxRows:18},placeholder:"粘贴原始请求 JSON"},null,8,["value"])]),_:1})]),_:1}),s("div",sm,[r(c(K),{quaternary:"",onClick:$},{default:u(()=>[...a[5]||(a[5]=[y("填充示例",-1)])]),_:1}),r(c(se),null,{default:u(()=>[r(c(K),{onClick:O},{default:u(()=>[...a[6]||(a[6]=[y("清空结果",-1)])]),_:1}),r(c(K),{type:"primary",loading:S.value,onClick:A},{default:u(()=>[...a[7]||(a[7]=[y("开始转换",-1)])]),_:1},8,["loading"])]),_:1})]),I.value?(n(),g(c(fe),{key:0,type:"error","show-icon":!0,style:{"margin-top":"12px"}},{default:u(()=>[y(v(I.value),1)]),_:1})):o("",!0),z.value?(n(),t("div",om,[s("div",im,[s("div",rm,[a[8]||(a[8]=s("span",{class:"meta-label"},"转换端点",-1)),r(c(G),{type:"success",size:"small",bordered:!1},{default:u(()=>[y(v(z.value.endpoint),1)]),_:1})]),s("div",um,[a[9]||(a[9]=s("span",{class:"meta-label"},"目标协议",-1)),r(c(G),{type:"info",size:"small",bordered:!1},{default:u(()=>[y(v(z.value.targetApi),1)]),_:1})]),s("div",cm,[a[10]||(a[10]=s("span",{class:"meta-label"},"消息数量",-1)),r(c(G),{size:"small",bordered:!1},{default:u(()=>{var e;return[y(v((null==(e=z.value.meta)?void 0:e.messageCount)??0),1)]}),_:1})])]),Array.isArray(z.value.warnings)&&z.value.warnings.length>0?(n(),g(c(fe),{key:0,type:"warning","show-icon":!0,style:{"margin-top":"12px"}},{default:u(()=>[a[11]||(a[11]=s("div",{class:"warning-title"},"转换警告",-1)),s("ul",dm,[(n(!0),t(m,null,f(z.value.warnings,(e,a)=>(n(),t("li",{key:a},v(e),1))),128))])]),_:1})):o("",!0),r(c(le),{label:"转换后请求 JSON",style:{"margin-top":"12px"}},{default:u(()=>[r(c(re),{value:M.value,type:"textarea",readonly:"",autosize:{minRows:10,maxRows:18}},null,8,["value"])]),_:1}),s("div",pm,[a[13]||(a[13]=s("div",null,null,-1)),r(c(K),{size:"small",onClick:L},{default:u(()=>[...a[12]||(a[12]=[y("复制转换结果",-1)])]),_:1})])])):o("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-e6530b83"]]);async function mm(e){return(await dt.get(`/config-registry/${e}`)).data}async function fm(e){return(await dt.post(`/config-registry/${e}/import`)).data}async function gm(e,a,l){const t=encodeURIComponent(a);return(await dt.put(`/config-registry/${e}/${t}/toggle`,{enabled:l})).data}async function ym(e,a,l,t){const n=encodeURIComponent(a);return(await dt.put(`/config-registry/${e}/${n}/platform/${l}`,{enabled:t})).data}async function hm(e){return(await dt.post(`/config-registry/${e}/sync`)).data}const bm={class:"card-header"},wm={class:"card-title"},km={class:"name"},_m={class:"card-body"},xm={key:0,class:"description"},Cm={class:"meta"},Um={class:"meta-item"},Sm=["href"],zm={key:1,class:"managed-actions"},Im={class:"platform-icons"},Tm=Pl({__name:"SkillCard",props:{skill:{type:Object,required:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1},registryInfo:{type:Object,default:null},toggling:{type:Boolean,default:!1}},emits:["click","install","uninstall","toggle-enabled","toggle-platform"],setup:e=>(a,l)=>{return n(),t("div",{class:d(["skill-card",{installed:e.skill.installed,managed:!!e.registryInfo}]),onClick:l[10]||(l[10]=l=>a.$emit("click",e.skill))},[s("div",bm,[s("div",wm,[s("span",km,v(e.skill.name),1),e.skill.installed?(n(),g(c(G),{key:0,type:"info",size:"small"},{default:u(()=>[...l[11]||(l[11]=[y("已安装",-1)])]),_:1})):o("",!0),e.skill.repoOwner?(n(),g(c(G),{key:1,type:"info",size:"small"},{default:u(()=>[y(v(e.skill.repoOwner),1)]),_:1})):o("",!0)]),s("div",{class:"card-actions",onClick:l[2]||(l[2]=p(()=>{},["stop"]))},[e.skill.installed?(n(),g(c(K),{key:0,size:"small",type:"error",loading:e.uninstalling,focusable:!1,onClick:l[0]||(l[0]=l=>a.$emit("uninstall",e.skill))},{default:u(()=>[...l[12]||(l[12]=[y("卸载",-1)])]),_:1},8,["loading"])):(n(),g(c(K),{key:1,size:"small",type:"primary",loading:e.installing,disabled:(f=e.skill,!((null==f?void 0:f.repoOwner)||(null==f?void 0:f.installSource))),focusable:!1,onClick:l[1]||(l[1]=l=>a.$emit("install",e.skill))},{default:u(()=>[...l[13]||(l[13]=[y("安装",-1)])]),_:1},8,["loading","disabled"]))])]),s("div",_m,[e.skill.description?(n(),t("div",xm,v((i=e.skill.description,m=80,(null==i?void 0:i.length)>m?i.slice(0,m)+"...":i)),1)):o("",!0),s("div",Cm,[s("span",Um,v(e.skill.directory),1),e.skill.readmeUrl?(n(),t("a",{key:0,class:"meta-link",href:e.skill.readmeUrl,target:"_blank",onClick:l[3]||(l[3]=p(()=>{},["stop"]))},"GitHub",8,Sm)):o("",!0)]),e.registryInfo?(n(),t("div",zm,[r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(W),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":l[4]||(l[4]=l=>a.$emit("toggle-enabled",e.skill,l)),onClick:l[5]||(l[5]=p(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[y(" "+v(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),s("div",Im,[r(c(ce),{trigger:"hover"},{trigger:u(()=>{var t;return[s("span",{class:d(["platform-icon",{active:null==(t=e.registryInfo.platforms)?void 0:t.claude}]),onClick:l[6]||(l[6]=p(l=>{var t;return a.$emit("toggle-platform",e.skill,"claude",!(null==(t=e.registryInfo.platforms)?void 0:t.claude))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(Va))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Claude Code "+v((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var t;return[s("span",{class:d(["platform-icon",{active:null==(t=e.registryInfo.platforms)?void 0:t.codex}]),onClick:l[7]||(l[7]=p(l=>{var t;return a.$emit("toggle-platform",e.skill,"codex",!(null==(t=e.registryInfo.platforms)?void 0:t.codex))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ea))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Codex CLI "+v((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var t;return[s("span",{class:d(["platform-icon",{active:null==(t=e.registryInfo.platforms)?void 0:t.gemini}]),onClick:l[8]||(l[8]=p(l=>{var t;return a.$emit("toggle-platform",e.skill,"gemini",!(null==(t=e.registryInfo.platforms)?void 0:t.gemini))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(Ja))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Gemini CLI "+v((null==(a=e.registryInfo.platforms)?void 0:a.gemini)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var t;return[s("span",{class:d(["platform-icon",{active:null==(t=e.registryInfo.platforms)?void 0:t.opencode}]),onClick:l[9]||(l[9]=p(l=>{var t;return a.$emit("toggle-platform",e.skill,"opencode",!(null==(t=e.registryInfo.platforms)?void 0:t.opencode))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ua))]),_:1})],2)]}),default:u(()=>{var a;return[y(" OpenCode "+v((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1})])])):o("",!0)])],2);var i,m,f}},[["__scopeId","data-v-a38ff629"]]),Pm={class:"repo-manager"},Mm={class:"repo-list"},$m={class:"repo-main"},jm={class:"repo-info"},Om={class:"repo-name"},Am={class:"repo-branch"},Lm={key:0,class:"empty-hint"},Em={class:"add-repo"},Dm={class:"add-form"},Nm={class:"tips"},Fm={class:"recommended"},Rm={class:"recommended-list"},Bm=["onClick"],Hm={class:"rec-info"},qm={class:"rec-name"},Km={class:"rec-desc"},Gm=Pl({__name:"SkillRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const i=e,p=a,h=w({get:()=>i.visible,set:e=>p("update:visible",e)}),k=l([]),_=l(!1),C=l(!1),U=l({input:"",branch:"main"}),S=w(()=>"codex"===i.platform?[{owner:"openai",name:"skills",description:"Codex 官方技能库",branch:"main",directory:"skills/.curated"}]:"opencode"===i.platform?[{owner:"Shakudo-io",name:"opencode-skills",description:"OpenCode 官方技能库(46个技能)",branch:"main",directory:""}]:"gemini"===i.platform?[{owner:"google-gemini",name:"gemini-cli",description:"Gemini 官方技能库",branch:"main",directory:".gemini/skills"}]:[{owner:"anthropics",name:"skills",description:"官方技能库",branch:"main"},{owner:"ComposioHQ",name:"awesome-claude-skills",description:"社区精选",branch:"master"},{owner:"cexll",name:"myclaude",description:"多智能体工作流",branch:"master"}]),z=w(()=>{const e=U.value.input.trim();if(!e)return!1;if(e.includes("github.com"))return e.match(/github\.com\/([^\/]+)\/([^\/\.]+)/);const a=e.split("/");return 2===a.length&&a[0]&&a[1]});async function I(){_.value=!0;try{const e=await async function(e="claude"){return(await dt.get("/skills/repos",{params:{platform:e}})).data}(i.platform);e.success&&(k.value=e.repos||[])}catch(e){Un.error("加载仓库失败: "+e.message)}finally{_.value=!1}}async function T(){if(!z.value)return;const e=U.value.input.trim(),{owner:a,name:l}=function(e){let a="",l="";if(e.includes("github.com")){const t=e.match(/github\.com\/([^\/]+)\/([^\/\.]+)/);t&&(a=t[1],l=t[2])}else{const t=e.split("/");a=t[0],l=t[1]}return{owner:a,name:l}}(e);C.value=!0;try{const e=await Es({owner:a,name:l,branch:U.value.branch||"main",enabled:!0},i.platform);e.success&&(k.value=e.repos,U.value.input="",U.value.branch="main",Un.success("仓库添加成功"),p("updated"))}catch(t){Un.error("添加失败: "+t.message)}finally{C.value=!1}}async function P(e){try{const a=await async function(e,a,l="",t="claude"){return(await dt.delete(`/skills/repos/${e}/${a}`,{params:{directory:l,platform:t}})).data}(e.owner,e.name,e.directory||"",i.platform);a.success&&(k.value=a.repos,Un.success("仓库已删除"),p("updated"))}catch(a){Un.error("删除失败: "+a.message)}}async function M(e,a){try{const l=await async function(e,a,l,t="",n="claude"){return(await dt.put(`/skills/repos/${e}/${a}/toggle`,{enabled:l,directory:t,platform:n})).data}(e.owner,e.name,a,e.directory||"",i.platform);l.success&&(k.value=l.repos,p("updated"))}catch(l){Un.error("操作失败: "+l.message)}}function $(e){return k.value.some(a=>a.owner===e.owner&&a.name===e.name&&(a.directory||"")===(e.directory||""))}function j(){p("update:visible",!1)}return x(()=>i.visible,e=>{e&&I()}),x(()=>i.platform,()=>{i.visible&&I()}),b(()=>{i.visible&&I()}),(e,a)=>(n(),g(c(ie),{show:h.value,"onUpdate:show":a[2]||(a[2]=e=>h.value=e),preset:"card",title:"技能仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:j},{default:u(()=>[s("div",Pm,[s("div",Mm,[r(c(Q),{show:_.value},{default:u(()=>[(n(!0),t(m,null,f(k.value,e=>(n(),t("div",{key:`${e.owner}/${e.name}/${e.directory||""}`,class:"repo-item"},[s("div",$m,[r(c(W),{value:e.enabled,size:"small","onUpdate:value":a=>M(e,a)},null,8,["value","onUpdate:value"]),s("div",jm,[s("div",Om,v(e.owner)+"/"+v(e.name),1),s("div",Am,v(e.branch),1)])]),r(c(K),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>P(e)},{default:u(()=>[...a[3]||(a[3]=[y(" 删除 ",-1)])]),_:1},8,["onClick"])]))),128)),0===k.value.length?(n(),t("div",Lm," 暂无仓库,请添加 ")):o("",!0)]),_:1},8,["show"])]),s("div",Em,[a[5]||(a[5]=s("div",{class:"add-title"},"添加仓库",-1)),s("div",Dm,[r(c(re),{value:U.value.input,"onUpdate:value":a[0]||(a[0]=e=>U.value.input=e),placeholder:"owner/repo 或 GitHub URL",size:"small",class:"repo-input",onKeyup:O(T,["enter"])},null,8,["value"]),r(c(re),{value:U.value.branch,"onUpdate:value":a[1]||(a[1]=e=>U.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"]),r(c(K),{type:"primary",size:"small",disabled:!z.value,loading:C.value,focusable:!1,onClick:T},{default:u(()=>[...a[4]||(a[4]=[y(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[6]||(a[6]=s("div",{class:"add-hint"}," 格式: owner/repo 或完整 GitHub URL ",-1))]),s("div",Nm,[r(c(fe),{type:"info",bordered:!1,size:"small"},{default:u(()=>[...a[7]||(a[7]=[y(" 添加仓库后,系统会从 GitHub 获取技能列表。如果网络较慢,请耐心等待或使用代理。 ",-1)])]),_:1})]),s("div",Fm,[a[9]||(a[9]=s("div",{class:"recommended-title"},"推荐仓库",-1)),s("div",Rm,[(n(!0),t(m,null,f(S.value,e=>(n(),t("div",{key:`${e.owner}/${e.name}/${e.directory||""}`,class:d(["recommended-item",{added:$(e)}]),onClick:a=>!$(e)&&async function(e){C.value=!0;try{const a=await Es({owner:e.owner,name:e.name,branch:e.branch,directory:e.directory||"",enabled:!0},i.platform);a.success&&(k.value=a.repos,Un.success("仓库添加成功"),p("updated"))}catch(a){Un.error("添加失败: "+a.message)}finally{C.value=!1}}(e)},[s("div",Hm,[s("span",qm,v(e.owner)+"/"+v(e.name),1),s("span",Km,v(e.description),1)]),$(e)?(n(),g(c(G),{key:0,size:"tiny",type:"success",bordered:!1},{default:u(()=>[...a[8]||(a[8]=[y(" 已添加 ",-1)])]),_:1})):(n(),g(c(q),{key:1,class:"add-icon"},{default:u(()=>[r(c(Ve))]),_:1}))],10,Bm))),128))])])])]),_:1},8,["show"]))}},[["__scopeId","data-v-10656320"]]),Wm={style:{"margin-bottom":"12px"}},Vm={class:"file-list"},Jm={class:"file-item"},Zm={class:"file-info"},Ym={class:"file-path"},Xm={key:1,class:"file-size"},Qm={class:"file-actions"},ef={class:"modal-footer"},af=Pl({__name:"SkillCreateModal",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","created"],setup(e,{emit:a}){const i=e,p=a,h=w({get:()=>i.visible,set:e=>p("update:visible",e)}),b=l("simple"),k=l(null),_=l({directory:"",name:"",description:"",content:""}),C={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}],content:[{required:!0,message:"请输入技能内容",trigger:"blur"}]},U=l(null),S=l({directory:"",files:[]}),z={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}]},I=l(!1),T=l(!1),P=l(null),M=l(""),$=l(-1),j=l(!1),O=l(""),A=l(""),L=w(()=>S.value.files.some(e=>"SKILL.md"===e.path)),E=w(()=>"opencode"===i.platform),D=/^[a-z0-9]+(-[a-z0-9]+)*$/;function N(e){const a=e.toLowerCase().substring(e.lastIndexOf("."));return[".md",".txt",".json",".js",".ts",".py",".sh",".yaml",".yml",".toml",".xml",".html",".css"].includes(a)}function F({file:e}){return!0}async function R({file:e,onFinish:a,onError:l}){try{const t=new FileReader;t.onload=l=>{var t;const n=N(e.name);let s=e.name;if(null==(t=e.file)?void 0:t.webkitRelativePath){s=e.file.webkitRelativePath.split("/").slice(1).join("/")}S.value.files.push({path:s,content:n?l.target.result:btoa(l.target.result),isBase64:!n,size:e.file.size}),a()},t.onerror=l,N(e.name)?t.readAsText(e.file):t.readAsBinaryString(e.file)}catch(t){l()}}function B(){$.value>=0&&(S.value.files[$.value].content=M.value),T.value=!1,P.value=null,M.value="",$.value=-1}function H(){O.value.trim()?S.value.files.some(e=>e.path===O.value)?Un.warning("文件已存在"):(S.value.files.push({path:O.value,content:A.value,isBase64:!1,size:new Blob([A.value]).size}),j.value=!1,O.value="",A.value=""):Un.warning("请输入文件路径")}function W(){const e=E.value?`---\nname: ${S.value.directory||"my-skill"}\ndescription: "Skill description"\n---\n\n# Skill Instructions\n\nDescribe when this skill should be used and what it should do.\n`:`---\nname: "${S.value.directory||"我的技能"}"\ndescription: "技能描述"\n---\n\n# 技能指令\n\n在这里编写你的技能内容...\n`;S.value.files.unshift({path:"SKILL.md",content:e,isBase64:!1,size:new Blob([e]).size})}async function J(){"simple"===b.value?await async function(){var e,a,l,t,n;try{await(null==(e=k.value)?void 0:e.validate())}catch(s){return}if(E.value){const e=null==(a=_.value.directory)?void 0:a.trim();if(!D.test(e||""))return void Un.error("OpenCode skill 目录必须是小写字母/数字,可用单个 - 连接");if(!(null==(l=_.value.description)?void 0:l.trim()))return void Un.error("OpenCode skill 需要填写 description")}I.value=!0;try{const e=await async function(e,a="claude"){return(await dt.post("/skills/create",{...e,platform:a})).data}({name:E.value?_.value.directory:_.value.name||_.value.directory,directory:_.value.directory,description:_.value.description,content:_.value.content},i.platform);e.success?(Un.success("技能创建成功"),p("created"),Z()):Un.error(e.message||"创建失败")}catch(s){Un.error("创建失败: "+((null==(n=null==(t=s.response)?void 0:t.data)?void 0:n.message)||s.message))}finally{I.value=!1}}():await async function(){var e,a,l,t;try{await(null==(e=U.value)?void 0:e.validate())}catch(n){return}if(!L.value)return void Un.error("必须包含 SKILL.md 文件");if(E.value){const e=null==(a=S.value.directory)?void 0:a.trim();if(!D.test(e||""))return void Un.error("OpenCode skill 目录必须是小写字母/数字,可用单个 - 连接")}I.value=!0;try{const e=await async function(e,a="claude"){return(await dt.post("/skills/create-with-files",{...e,platform:a})).data}({directory:S.value.directory,files:S.value.files.map(e=>({path:e.path,content:e.content,isBase64:e.isBase64}))},i.platform);e.success?(Un.success(`技能创建成功,包含 ${e.fileCount} 个文件`),p("created"),Z()):Un.error(e.message||"创建失败")}catch(n){Un.error("创建失败: "+((null==(t=null==(l=n.response)?void 0:l.data)?void 0:t.message)||n.message))}finally{I.value=!1}}()}function Z(){p("update:visible",!1)}return x(()=>i.visible,e=>{e||(b.value="simple",_.value={directory:"",name:"",description:"",content:""},S.value={directory:"",files:[]},P.value=null,M.value="",$.value=-1,O.value="",A.value="")}),(e,a)=>(n(),g(c(ie),{show:h.value,"onUpdate:show":a[14]||(a[14]=e=>h.value=e),preset:"card",title:"创建自定义技能",bordered:!1,closable:!0,style:{width:"680px","max-width":"90vw"},onClose:Z},{footer:u(()=>[s("div",ef,[r(c(K),{onClick:Z},{default:u(()=>[...a[22]||(a[22]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:I.value,onClick:J},{default:u(()=>[...a[23]||(a[23]=[y(" 创建 ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[r(c(we),{value:b.value,"onUpdate:value":a[6]||(a[6]=e=>b.value=e),type:"line",animated:""},{default:u(()=>[r(c(ke),{name:"simple",tab:"简单模式"},{default:u(()=>[r(c(ae),{ref_key:"simpleFormRef",ref:k,model:_.value,rules:C,"label-placement":"top","label-width":"auto"},{default:u(()=>[r(c(le),{label:"目录名称",path:"directory"},{feedback:u(()=>[y(v(E.value?"OpenCode 要求小写字母/数字,可用单个 - 连接(如 my-skill)":"只能包含英文、数字、横杠和下划线"),1)]),default:u(()=>[r(c(re),{value:_.value.directory,"onUpdate:value":a[0]||(a[0]=e=>_.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),E.value?o("",!0):(n(),g(c(le),{key:0,label:"技能名称",path:"name"},{default:u(()=>[r(c(re),{value:_.value.name,"onUpdate:value":a[1]||(a[1]=e=>_.value.name=e),placeholder:"显示名称,可以是中文",maxlength:100},null,8,["value"])]),_:1})),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:_.value.description,"onUpdate:value":a[2]||(a[2]=e=>_.value.description=e),type:"textarea",placeholder:"简短描述这个技能的用途",rows:2,maxlength:200},null,8,["value"])]),_:1}),r(c(le),{label:"技能内容 (提示词,支持 Markdown)",path:"content"},{default:u(()=>[r(Up,{modelValue:_.value.content,"onUpdate:modelValue":a[3]||(a[3]=e=>_.value.content=e),rows:10,"min-height":200,placeholder:"输入技能的详细指令内容,支持 Markdown 格式..."},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1}),r(c(ke),{name:"advanced",tab:"高级模式 (多文件)"},{default:u(()=>[r(c(ae),{ref_key:"advancedFormRef",ref:U,model:S.value,rules:z,"label-placement":"top","label-width":"auto"},{default:u(()=>[r(c(le),{label:"目录名称",path:"directory"},{feedback:u(()=>[y(v(E.value?"OpenCode 要求小写字母/数字,可用单个 - 连接(如 my-skill)":"只能包含英文、数字、横杠和下划线"),1)]),default:u(()=>[r(c(re),{value:S.value.directory,"onUpdate:value":a[4]||(a[4]=e=>S.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),r(c(le),{label:"文件上传"},{default:u(()=>[r(c(Ce),{multiple:"","directory-dnd":"","show-file-list":!1,"custom-request":R,onBeforeUpload:F},{default:u(()=>[r(c(Ue),null,{default:u(()=>[s("div",Wm,[r(c(q),{size:"48",depth:3},{default:u(()=>[r(c(Za))]),_:1})]),r(c(V),{style:{"font-size":"16px"}},{default:u(()=>[...a[15]||(a[15]=[y(" 拖放文件或文件夹到此处,或点击选择 ",-1)])]),_:1}),r(c(Se),{depth:"3",style:{margin:"8px 0 0 0"}},{default:u(()=>[...a[16]||(a[16]=[y(" 必须包含 SKILL.md 文件 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),S.value.files.length>0?(n(),g(c(le),{key:0,label:"已添加的文件"},{default:u(()=>[s("div",Vm,[(n(!0),t(m,null,f(S.value.files,(e,l)=>(n(),g(c(ze),{key:e.path,size:"small",class:d({"skill-md":"SKILL.md"===e.path})},{default:u(()=>{return[s("div",Jm,[s("div",Zm,[r(c(q),{size:16,class:"file-icon"},{default:u(()=>[e.isDirectory?(n(),g(c(Ya),{key:1})):(n(),g(c(oa),{key:0}))]),_:2},1024),s("span",Ym,v(e.path),1),"SKILL.md"===e.path?(n(),g(c(G),{key:0,size:"small",type:"primary"},{default:u(()=>[...a[17]||(a[17]=[y("必需",-1)])]),_:1})):o("",!0),e.size?(n(),t("span",Xm,v((i=e.size,i<1024?i+" B":i<1048576?(i/1024).toFixed(1)+" KB":(i/1048576).toFixed(1)+" MB")),1)):o("",!0)]),s("div",Qm,[N(e.path)?(n(),g(c(K),{key:0,size:"small",text:"",onClick:e=>function(e){const a=S.value.files[e];P.value=a,M.value=a.content,$.value=e,T.value=!0}(l)},{default:u(()=>[...a[18]||(a[18]=[y(" 编辑 ",-1)])]),_:1},8,["onClick"])):o("",!0),"SKILL.md"!==e.path?(n(),g(c(K),{key:1,size:"small",text:"",type:"error",onClick:e=>function(e){S.value.files.splice(e,1)}(l)},{default:u(()=>[...a[19]||(a[19]=[y(" 删除 ",-1)])]),_:1},8,["onClick"])):o("",!0)])])];var i}),_:2},1032,["class"]))),128))])]),_:1})):o("",!0),r(c(le),null,{default:u(()=>[r(c(se),null,{default:u(()=>[r(c(K),{onClick:a[5]||(a[5]=e=>j.value=!0)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[a[20]||(a[20]=y(" 添加文件 ",-1))]),_:1}),L.value?o("",!0):(n(),g(c(K),{key:0,onClick:W},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Oa))]),_:1})]),default:u(()=>[a[21]||(a[21]=y(" 添加 SKILL.md 模板 ",-1))]),_:1}))]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["value"]),r(c(ie),{show:T.value,"onUpdate:show":a[9]||(a[9]=e=>T.value=e),preset:"card",title:"编辑文件",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:a[8]||(a[8]=e=>T.value=!1)},{default:u(()=>[...a[24]||(a[24]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:B},{default:u(()=>[...a[25]||(a[25]=[y("保存",-1)])]),_:1})]),_:1})]),default:u(()=>{var e;return[r(c(le),{label:(null==(e=P.value)?void 0:e.path)||"文件内容"},{default:u(()=>[r(c(re),{value:M.value,"onUpdate:value":a[7]||(a[7]=e=>M.value=e),type:"textarea",rows:15,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["label"])]}),_:1},8,["show"]),r(c(ie),{show:j.value,"onUpdate:show":a[13]||(a[13]=e=>j.value=e),preset:"card",title:"添加新文件",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:a[12]||(a[12]=e=>j.value=!1)},{default:u(()=>[...a[27]||(a[27]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:H},{default:u(()=>[...a[28]||(a[28]=[y("添加",-1)])]),_:1})]),_:1})]),default:u(()=>[r(c(ae),{"label-placement":"top"},{default:u(()=>[r(c(le),{label:"文件路径"},{feedback:u(()=>[...a[26]||(a[26]=[y(" 可以包含子目录,如 scripts/helper.sh ",-1)])]),default:u(()=>[r(c(re),{value:O.value,"onUpdate:value":a[10]||(a[10]=e=>O.value=e),placeholder:"例如: scripts/helper.sh 或 README.md"},null,8,["value"])]),_:1}),r(c(le),{label:"文件内容"},{default:u(()=>[r(c(re),{value:A.value,"onUpdate:value":a[11]||(a[11]=e=>A.value=e),type:"textarea",rows:10,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1},8,["show"]))}},[["__scopeId","data-v-511005e8"]]),lf={key:0,class:"loading-state"},tf={key:1,class:"error-state"},nf={key:2,class:"detail-content"},sf={class:"detail-meta"},of={class:"meta-row"},rf={class:"meta-source"},uf={key:0,class:"meta-desc"},cf={class:"meta-dir"},df={class:"content-wrapper"},pf={class:"content-header"},vf=["innerHTML"],mf={class:"modal-footer"},ff=Pl({__name:"SkillDetailModal",props:{visible:Boolean,skill:Object,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const i=e,d=a,p=w({get:()=>i.visible,set:e=>d("update:visible",e)}),m=l(!1),f=l(""),h=l(null),b=l(!1),k=l(!1),_=w(()=>{var e;if(!(null==(e=h.value)?void 0:e.content))return"";try{return _l(h.value.content,{breaks:!0,gfm:!0})}catch(a){return h.value.content}});async function C(){var e,a,l;if(null==(e=i.skill)?void 0:e.directory){m.value=!0,f.value="";try{const e=await async function(e,a="claude"){return(await dt.get(`/skills/detail/${e}`,{params:{platform:a}})).data}(i.skill.directory,i.platform);e.success?h.value=e:f.value=e.message||"加载失败"}catch(t){f.value=(null==(l=null==(a=t.response)?void 0:a.data)?void 0:l.message)||t.message||"加载失败"}finally{m.value=!1}}}async function U(){var e,a;if(i.skill){b.value=!0;try{(await As(i.skill.directory,{owner:i.skill.repoOwner,name:i.skill.repoName,branch:i.skill.repoBranch||"main"},i.skill.fullDirectory||null,i.platform)).success&&(Un.success("安装成功"),h.value&&(h.value.installed=!0),d("updated"))}catch(l){Un.error("安装失败: "+((null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message))}finally{b.value=!1}}}async function S(){var e,a;if(h.value){k.value=!0;try{(await Ls(h.value.directory,i.platform)).success&&(Un.success("卸载成功"),h.value&&(h.value.installed=!1),d("updated"))}catch(l){Un.error("卸载失败: "+((null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message))}finally{k.value=!1}}}async function z(){var e;if(null==(e=h.value)?void 0:e.content)try{const e=await no(h.value.content);if("manual"===(null==e?void 0:e.method))return void Un.warning("自动复制失败,已弹出手动复制框");Un.success("已复制到剪贴板")}catch{Un.error("复制失败")}}function I(){d("update:visible",!1)}return x(()=>i.visible,e=>{e&&i.skill?C():(h.value=null,f.value="")}),(a,l)=>{var i;return n(),g(c(ie),{show:p.value,"onUpdate:show":l[0]||(l[0]=e=>p.value=e),preset:"card",title:(null==(i=h.value)?void 0:i.name)||"技能详情",bordered:!1,closable:!0,style:{width:"700px","max-width":"90vw"},"content-style":"padding: 0; max-height: 60vh; overflow: hidden; display: flex; flex-direction: column;","footer-style":"padding: 16px 20px;",onClose:I},{footer:u(()=>{var a,t;return[s("div",mf,[r(c(K),{onClick:I},{default:u(()=>[...l[7]||(l[7]=[y("关闭",-1)])]),_:1}),h.value&&!h.value.installed&&(null==(a=e.skill)?void 0:a.repoOwner)?(n(),g(c(K),{key:0,type:"primary",loading:b.value,onClick:U},{default:u(()=>[...l[8]||(l[8]=[y(" 安装此技能 ",-1)])]),_:1},8,["loading"])):o("",!0),(null==(t=h.value)?void 0:t.installed)?(n(),g(c(K),{key:1,type:"error",tertiary:"",loading:k.value,onClick:S},{default:u(()=>[...l[9]||(l[9]=[y(" 卸载 ",-1)])]),_:1},8,["loading"])):o("",!0)])]}),default:u(()=>[m.value?(n(),t("div",lf,[r(c(Q),{size:"medium"}),l[1]||(l[1]=s("span",null,"加载中...",-1))])):f.value?(n(),t("div",tf,[r(c(q),{size:"48",color:"#d03050"},{default:u(()=>[r(c(Na))]),_:1}),s("span",null,v(f.value),1),r(c(K),{size:"small",onClick:C},{default:u(()=>[...l[2]||(l[2]=[y("重试",-1)])]),_:1})])):h.value?(n(),t("div",nf,[s("div",sf,[s("div",of,[h.value.installed?(n(),g(c(G),{key:0,type:"success",size:"small",bordered:!1},{default:u(()=>[...l[3]||(l[3]=[y(" 已安装 ",-1)])]),_:1})):(n(),g(c(G),{key:1,type:"default",size:"small",bordered:!1},{default:u(()=>[...l[4]||(l[4]=[y(" 未安装 ",-1)])]),_:1})),s("span",rf," 来源: "+v("local"===h.value.source?"本地":`${h.value.repoOwner}/${h.value.repoName}`),1)]),h.value.description?(n(),t("div",uf,v(h.value.description),1)):o("",!0),s("div",cf,[r(c(q),{size:"14"},{default:u(()=>[r(c(Ya))]),_:1}),s("code",null,v(h.value.directory),1)])]),s("div",df,[s("div",pf,[l[6]||(l[6]=s("span",{class:"content-title"},"技能内容",-1)),r(c(K),{text:"",size:"tiny",onClick:z},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(qa))]),_:1})]),default:u(()=>[l[5]||(l[5]=y(" 复制 ",-1))]),_:1})]),s("div",{class:"markdown-content",innerHTML:_.value},null,8,vf)])])):o("",!0)]),_:1},8,["show","title"])}}},[["__scopeId","data-v-f281a65d"]]),gf={key:0,class:"panel-header"},yf={class:"header-left"},hf={class:"header-right"},bf={key:1,class:"drawer-header-bar"},wf={class:"header-right"},kf={class:"stats-bar"},_f={class:"stats-text"},xf={class:"filter-bar"},Cf={class:"panel-content"},Uf={key:0,class:"empty-state"},Sf={key:1,class:"card-list"},zf={class:"panel-footer"},If=Pl({__name:"SkillsPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1},platform:{type:String,default:""}},emits:["back","updated"],setup(e){const a=e,i=M(),p=Ie(),h=l(!1),k=l([]),_=l(""),C=l("all"),U=l(!1),S=l(!1),z=l(!1),I=l(null),T=l({}),P=l({}),$=l({}),j=l({}),O=l(!1),A=l(0),L=w(()=>{if(a.platform&&["claude","codex","gemini","opencode"].includes(a.platform))return a.platform;const e=i.meta.channel;return"codex"===e||"gemini"===e||"opencode"===e?e:"claude"}),E=w(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[L.value]||"Claude Code")),D=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"},{label:"已托管",value:"managed"}],N=w(()=>k.value.filter(e=>e.installed).length),F=w(()=>Object.keys(j.value).length),R=w(()=>{let e=k.value;if("installed"===C.value?e=e.filter(e=>e.installed):"uninstalled"===C.value?e=e.filter(e=>!e.installed):"managed"===C.value&&(e=e.filter(e=>j.value[e.directory||e.name])),_.value.trim()){const a=_.value.toLowerCase();e=e.filter(e=>{var l,t;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))})}return[...e].sort((e,a)=>e.installed===a.installed?0:e.installed?-1:1)}),B=w(()=>_.value?"没有匹配的技能":"installed"===C.value?"暂无已安装的技能":"uninstalled"===C.value?"所有技能都已安装":"managed"===C.value?"暂无托管的技能":"暂无可用技能,请配置仓库源");async function H(e=!1){const a=++A.value,l=L.value;h.value=!0;try{const[t,n]=await Promise.all([Os(e,l),mm("skills")]);if(a!==A.value||l!==L.value)return;if(t.success&&(k.value=t.skills||[]),n.success){j.value={};for(const[e,a]of Object.entries(n.items||{}))j.value[e]=a}}catch(t){p.error("加载技能失败: "+t.message)}finally{a===A.value&&(h.value=!1)}}async function G(){if("claude"===L.value){O.value=!0;try{const e=await fm("skills");e.success?(p.success(`成功导入 ${e.imported} 个技能`),await H(!0)):p.error(e.message||"导入失败")}catch(e){p.error("导入失败: "+e.message)}finally{O.value=!1}}}async function W(e){if(!e.repoOwner)return p.error("缺少仓库信息");T.value[e.key]=!0;try{(await As(e.directory,{owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main"},e.fullDirectory||null,L.value)).success&&(p.success(`技能 "${e.name}" 安装成功`),await H(!0))}catch(a){p.error("安装失败: "+a.message)}finally{delete T.value[e.key]}}async function V(e){P.value[e.key]=!0;try{(await Ls(e.directory,L.value)).success&&(p.success(`技能 "${e.name}" 已卸载`),await H(!0))}catch(a){p.error("卸载失败: "+a.message)}finally{delete P.value[e.key]}}async function J(e,a){const l=e.directory||e.name;$.value[l]=!0;try{(await gm("skills",l,a)).success&&(p.success(a?"已启用":"已禁用"),await H(!0))}catch(t){p.error("切换失败: "+t.message)}finally{delete $.value[l]}}async function Z(e,a,l){const t=e.directory||e.name;$.value[t]=!0;try{(await ym("skills",t,a,l)).success&&(p.success(`${a} ${l?"已启用":"已禁用"}`),await H(!0))}catch(n){p.error("切换失败: "+n.message)}finally{delete $.value[t]}}function Y(e){I.value=e,z.value=!0}return b(()=>{a.inDrawer&&!a.drawerVisible||H()}),x(()=>a.drawerVisible,e=>{e&&H()}),x(()=>L.value,()=>{H()}),(a,l)=>(n(),t("div",{class:d(["skills-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?o("",!0):(n(),t("div",gf,[s("div",yf,[e.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[14]||(l[14]=s("span",{class:"panel-title"},"Skills 技能管理",-1))]),s("div",hf,[r(c(K),{text:"",focusable:!1,onClick:l[1]||(l[1]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[15]||(l[15]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:l[2]||(l[2]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[16]||(l[16]=y(" 仓库 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:G,loading:O.value,disabled:"claude"!==L.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Xa))]),_:1})]),default:u(()=>[l[17]||(l[17]=y(" 导入 ",-1))]),_:1},8,["loading","disabled"]),r(c(K),{text:"",focusable:!1,onClick:l[3]||(l[3]=e=>H(!0)),loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[18]||(l[18]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),t("div",bf,[s("div",wf,[r(c(K),{text:"",focusable:!1,onClick:l[4]||(l[4]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[19]||(l[19]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:l[5]||(l[5]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[20]||(l[20]=y(" 仓库 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:G,loading:O.value,disabled:"claude"!==L.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Xa))]),_:1})]),default:u(()=>[l[21]||(l[21]=y(" 导入 ",-1))]),_:1},8,["loading","disabled"]),r(c(K),{text:"",focusable:!1,onClick:l[6]||(l[6]=e=>H(!0)),loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[22]||(l[22]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",kf,[s("span",_f,[y(" 共 "+v(k.value.length)+" 个技能 ",1),k.value.length>0?(n(),t(m,{key:0},[y(" · 已安装: "+v(N.value)+" · 未安装: "+v(k.value.length-N.value)+" ",1),F.value>0?(n(),t(m,{key:0},[y(" · 托管: "+v(F.value),1)],64)):o("",!0)],64)):o("",!0)])]),s("div",xf,[r(c(re),{value:_.value,"onUpdate:value":l[7]||(l[7]=e=>_.value=e),placeholder:"搜索技能...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:C.value,"onUpdate:value":l[8]||(l[8]=e=>C.value=e),options:D,size:"small",class:"filter-select"},null,8,["value"])]),s("div",Cf,[r(c(Q),{show:h.value},{default:u(()=>[0!==R.value.length||h.value?(n(),t("div",Sf,[(n(!0),t(m,null,f(R.value,e=>(n(),g(Tm,{key:e.key,skill:e,installing:!!T.value[e.key],uninstalling:!!P.value[e.key],"registry-info":j.value[e.directory||e.name],toggling:!!$.value[e.directory||e.name],onInstall:W,onUninstall:V,onClick:Y,onToggleEnabled:J,onTogglePlatform:Z},null,8,["skill","installing","uninstalling","registry-info","toggling"]))),128))])):(n(),t("div",Uf,[r(c(ee),{description:B.value},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(Xe))]),_:1})]),extra:u(()=>[0===k.value.length?(n(),g(c(K),{key:0,size:"small",onClick:l[9]||(l[9]=e=>U.value=!0)},{default:u(()=>[...l[23]||(l[23]=[y("配置仓库源",-1)])]),_:1})):o("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),s("div",zf,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),s("span",null,"安装/卸载后需重启 "+v(E.value)+" 生效",1)]),r(Gm,{visible:U.value,"onUpdate:visible":l[10]||(l[10]=e=>U.value=e),platform:L.value,onUpdated:l[11]||(l[11]=e=>H(!0))},null,8,["visible","platform"]),r(af,{visible:S.value,"onUpdate:visible":l[12]||(l[12]=e=>S.value=e),platform:L.value,onCreated:H},null,8,["visible","platform"]),r(ff,{visible:z.value,"onUpdate:visible":l[13]||(l[13]=e=>z.value=e),skill:I.value,platform:L.value,onUpdated:H},null,8,["visible","skill","platform"])],2))}},[["__scopeId","data-v-bd5cfd0c"]]),Tf=Pl({__name:"SkillsDrawer",props:{visible:{type:Boolean,default:!1},platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(700,600),i=w({get:()=>l.visible,set:e=>t("update:visible",e)}),d={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1,"body-content-style":d},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},"技能管理",-1)])]),default:u(()=>[r(If,{"in-drawer":!0,"hide-back":!0,"drawer-visible":i.value,platform:l.platform,onBack:a[0]||(a[0]=e=>i.value=!1)},null,8,["drawer-visible","platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-c7c4ab18"]]);async function Pf(e=null,a="claude"){return(await dt.get("/commands",{params:e?{projectPath:e,platform:a}:{platform:a}})).data}const Mf={class:"card-main"},$f={class:"card-header"},jf={class:"command-name"},Of={class:"command-badges"},Af={key:0,class:"command-desc"},Lf={class:"command-meta"},Ef={key:0,class:"meta-item"},Df={key:1,class:"meta-item"},Nf={class:"card-actions"},Ff={class:"platform-icons"},Rf=Pl({__name:"CommandCard",props:{command:{type:Object,required:!0},deleting:{type:Boolean,default:!1},registryInfo:{type:Object,default:null},toggling:{type:Boolean,default:!1}},emits:["click","edit","delete","toggle-enabled","toggle-platform"],setup(e,{emit:a}){const l=e,i=a;return(a,f)=>{return n(),t("div",{class:d(["command-card",{"is-project":"project"===e.command.scope,managed:e.registryInfo}]),onClick:f[7]||(f[7]=a=>i("click",e.command))},[s("div",Mf,[s("div",$f,[s("div",jf,"/"+v(e.command.name),1),s("div",Of,[r(c(G),{type:"user"===e.command.scope?"info":"success",size:"tiny",bordered:!1},{default:u(()=>[y(v("user"===e.command.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),e.command.namespace?(n(),g(c(G),{key:0,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[y(v(e.command.namespace),1)]),_:1})):o("",!0)])]),e.command.description?(n(),t("div",Af,v((h=e.command.description,h?h.length>80?h.slice(0,80)+"...":h:"")),1)):o("",!0),s("div",Lf,[e.command.allowedTools?(n(),t("span",Ef,[r(c(q),{size:"12"},{default:u(()=>[r(c(al))]),_:1}),y(" "+v(e.command.allowedTools),1)])):o("",!0),e.command.argumentHint?(n(),t("span",Df,[r(c(q),{size:"12"},{default:u(()=>[r(c(ll))]),_:1}),y(" "+v(e.command.argumentHint),1)])):o("",!0)])]),s("div",Nf,[e.registryInfo?(n(),t(m,{key:0},[r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(W),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":f[0]||(f[0]=a=>i("toggle-enabled",e.command,a)),onClick:f[1]||(f[1]=p(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[y(" "+v(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),s("div",Ff,[r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.claude}]),onClick:f[2]||(f[2]=p(a=>{var l;return i("toggle-platform",e.command,"claude",!(null==(l=e.registryInfo.platforms)?void 0:l.claude))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(Va))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Claude Code "+v((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.codex}]),onClick:f[3]||(f[3]=p(a=>{var l;return i("toggle-platform",e.command,"codex",!(null==(l=e.registryInfo.platforms)?void 0:l.codex))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ea))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Codex CLI "+v((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.opencode}]),onClick:f[4]||(f[4]=p(a=>{var l;return i("toggle-platform",e.command,"opencode",!(null==(l=e.registryInfo.platforms)?void 0:l.opencode))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ua))]),_:1})],2)]}),default:u(()=>{var a;return[y(" OpenCode "+v((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1})])],64)):(n(),t(m,{key:1},[r(c(K),{size:"tiny",tertiary:"",onClick:f[5]||(f[5]=p(a=>i("edit",e.command),["stop"]))},{default:u(()=>[...f[8]||(f[8]=[y(" 编辑 ",-1)])]),_:1}),r(c(K),{size:"tiny",tertiary:"",type:"error",loading:l.deleting,onClick:f[6]||(f[6]=p(a=>i("delete",e.command),["stop"]))},{default:u(()=>[...f[9]||(f[9]=[y(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2);var h}}},[["__scopeId","data-v-781f3de3"]]),Bf={class:"modal-footer"},Hf=Pl({__name:"CommandFormModal",props:{visible:{type:Boolean,default:!1},command:{type:Object,default:null},projectPath:{type:String,default:null},platform:{type:String,default:"claude"}},emits:["update:visible","saved"],setup(e,{emit:a}){const t=e,i=a,d=w({get:()=>t.visible,set:e=>i("update:visible",e)}),p=w(()=>!!t.command),m=w(()=>"opencode"===t.platform?"用户级 (~/.config/opencode/commands/)":"用户级 (~/.claude/commands/)"),f=w(()=>"opencode"===t.platform?"项目级 (.opencode/commands/)":"项目级 (.claude/commands/)"),h=l(null),b=l(!1),k=l({name:"",scope:"user",namespace:"",description:"",allowedTools:"",argumentHint:"",body:""}),_={name:{required:!0,message:"请输入命令名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"}};function C(){k.value={name:"",scope:"user",namespace:"",description:"",allowedTools:"",argumentHint:"",body:""}}function U(){d.value=!1,C()}async function S(){var e;try{await(null==(e=h.value)?void 0:e.validate())}catch{return}b.value=!0;try{const e={...k.value,projectPath:t.projectPath};p.value?(await async function(e,a,l,t="claude"){return(await dt.put(`/commands/${a}/${e}`,{...l,platform:t})).data}(k.value.name,k.value.scope,e,t.platform),Un.success("命令更新成功")):(await async function(e,a="claude"){return(await dt.post("/commands",{...e,platform:a})).data}(e,t.platform),Un.success("命令创建成功")),i("saved"),d.value=!1,C()}catch(a){Un.error("操作失败: "+a.message)}finally{b.value=!1}}return x(()=>t.command,e=>{e?k.value={name:e.name||"",scope:e.scope||"user",namespace:e.namespace||"",description:e.description||"",allowedTools:e.allowedTools||"",argumentHint:e.argumentHint||"",body:e.body||""}:C()},{immediate:!0}),(e,a)=>(n(),g(c(ie),{show:d.value,"onUpdate:show":a[7]||(a[7]=e=>d.value=e),preset:"card",title:p.value?"编辑命令":"创建命令",style:{width:"600px","max-width":"95vw"},"mask-closable":!1},{footer:u(()=>[s("div",Bf,[r(c(K),{onClick:U},{default:u(()=>[...a[9]||(a[9]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:b.value,onClick:S},{default:u(()=>[y(v(p.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>[r(c(ae),{ref_key:"formRef",ref:h,model:k.value,rules:_,"label-placement":"left","label-width":"auto","require-mark-placement":"right-hanging"},{default:u(()=>[r(c(le),{label:"命令名",path:"name"},{default:u(()=>[r(c(re),{value:k.value.name,"onUpdate:value":a[0]||(a[0]=e=>k.value.name=e),disabled:p.value,placeholder:"如: deploy, test, build"},{prefix:u(()=>[...a[8]||(a[8]=[y("/",-1)])]),_:1},8,["value","disabled"])]),_:1}),r(c(le),{label:"作用域",path:"scope"},{default:u(()=>[r(c(ne),{value:k.value.scope,"onUpdate:value":a[1]||(a[1]=e=>k.value.scope=e),disabled:p.value},{default:u(()=>[r(c(oe),{value:"user"},{default:u(()=>[y(v(m.value),1)]),_:1}),r(c(oe),{value:"project"},{default:u(()=>[y(v(f.value),1)]),_:1})]),_:1},8,["value","disabled"])]),_:1}),r(c(le),{label:"命名空间",path:"namespace"},{default:u(()=>[r(c(re),{value:k.value.namespace,"onUpdate:value":a[2]||(a[2]=e=>k.value.namespace=e),disabled:p.value,placeholder:"可选,如: frontend, backend"},null,8,["value","disabled"])]),_:1}),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:k.value.description,"onUpdate:value":a[3]||(a[3]=e=>k.value.description=e),placeholder:"命令功能描述"},null,8,["value"])]),_:1}),"opencode"!==t.platform?(n(),g(c(le),{key:0,label:"允许的工具",path:"allowedTools"},{default:u(()=>[r(c(re),{value:k.value.allowedTools,"onUpdate:value":a[4]||(a[4]=e=>k.value.allowedTools=e),placeholder:"如: Bash, Edit, Read (逗号分隔)"},null,8,["value"])]),_:1})):o("",!0),"opencode"!==t.platform?(n(),g(c(le),{key:1,label:"参数提示",path:"argumentHint"},{default:u(()=>[r(c(re),{value:k.value.argumentHint,"onUpdate:value":a[5]||(a[5]=e=>k.value.argumentHint=e),placeholder:"如: add [id] | remove [id]"},null,8,["value"])]),_:1})):o("",!0),r(c(le),{label:"命令内容",path:"body"},{default:u(()=>[r(Up,{modelValue:k.value.body,"onUpdate:modelValue":a[6]||(a[6]=e=>k.value.body=e),rows:8,"min-height":180,placeholder:"命令的提示词内容,可使用 $ARGUMENTS、$1、$2 等变量\n\n示例:\n请执行以下操作: $ARGUMENTS\n\n! 开头的行会作为 bash 命令执行\n@ 开头的行会引用指定文件"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-6a32f36a"]]),qf={key:0,class:"panel-header"},Kf={class:"header-left"},Gf={class:"header-right"},Wf={key:1,class:"drawer-header-bar"},Vf={class:"header-right"},Jf={class:"stats-bar"},Zf={class:"stats-text"},Yf={class:"filter-bar"},Xf={class:"commands-content"},Qf={key:0,class:"empty-state"},eg={key:1,class:"commands-grid"},ag={class:"panel-footer"},lg={class:"detail-section"},tg=Pl({__name:"CommandsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null}},emits:["back","updated"],setup(e,{emit:a}){const i=e,p=a,h=M(),k=l([]),_=l(!1),C=l(""),U=l("all"),S=l(!1),z=l(!1),I=l(null),T=l(null),P=l({}),$=l({}),j=l({}),O=w(()=>{const e=h.meta.channel;return"codex"===e?"codex":"opencode"===e?"opencode":"claude"}),A=w(()=>"opencode"===O.value?"使用 /命令名 在 OpenCode 中调用":"使用 /命令名 在 Claude Code 中调用"),L=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],E=w(()=>k.value.filter(e=>"user"===e.scope).length),D=w(()=>k.value.filter(e=>"project"===e.scope).length),N=w(()=>Object.keys($.value).length),F=w(()=>{let e=k.value;if("user"===U.value?e=e.filter(e=>"user"===e.scope):"project"===U.value?e=e.filter(e=>"project"===e.scope):"managed"===U.value&&(e=e.filter(e=>$.value[e.name])),C.value.trim()){const a=C.value.toLowerCase();e=e.filter(e=>{var l,t,n;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))||(null==(n=e.namespace)?void 0:n.toLowerCase().includes(a))})}return e}),R=w(()=>C.value?"没有匹配的命令":"user"===U.value?"暂无用户级命令":"project"===U.value?"暂无项目级命令":"managed"===U.value?"暂无托管的命令":"暂无自定义命令");async function B(){_.value=!0;try{const[e,a]=await Promise.all([Pf(i.projectPath,O.value),mm("commands")]);if(e.success&&(k.value=e.commands||[]),a.success){$.value={};for(const[e,l]of Object.entries(a.items||{}))$.value[e]=l}}catch(e){Un.error("加载命令列表失败: "+e.message)}finally{_.value=!1}}async function H(e,a){j.value[e.name]=!0;try{(await gm("commands",e.name,a)).success&&(Un.success(a?"已启用":"已禁用"),await B())}catch(l){Un.error("切换失败: "+l.message)}finally{delete j.value[e.name]}}async function G(e,a,l){j.value[e.name]=!0;try{(await ym("commands",e.name,a,l)).success&&(Un.success(`${a} ${l?"已启用":"已禁用"}`),await B())}catch(t){Un.error("切换失败: "+t.message)}finally{delete j.value[e.name]}}async function W(){_.value=!0;try{const e=await hm("commands");(null==e?void 0:e.success)||Un.warning((null==e?void 0:e.message)||"同步失败,已继续刷新列表")}catch(e){Un.warning("同步失败,已继续刷新列表: "+e.message)}await B()}function V(e){T.value=e,S.value=!0}async function J(e){P.value[e.path]=!0;try{(await async function(e,a,l=null,t=null,n="claude"){const s={};return n&&(s.platform=n),l&&(s.projectPath=l),t&&(s.namespace=t),(await dt.delete(`/commands/${a}/${e}`,{params:s})).data}(e.name,e.scope,i.projectPath,e.namespace,O.value)).success&&(Un.success("命令已删除"),await B(),p("updated"))}catch(a){Un.error("删除失败: "+a.message)}finally{delete P.value[e.path]}}function Z(e){I.value=e,z.value=!0}function Y(){T.value=null,B(),p("updated")}function X(){p("back")}return b(()=>{B()}),x(O,()=>{B()}),(a,l)=>(n(),t("div",{class:d(["commands-panel",{"in-drawer":i.inDrawer}])},[i.inDrawer?o("",!0):(n(),t("div",qf,[s("div",Kf,[i.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:X,class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[7]||(l[7]=s("span",{class:"panel-title"},"Custom Commands",-1))]),s("div",Gf,[r(c(K),{text:"",onClick:l[0]||(l[0]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:W,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[9]||(l[9]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),i.inDrawer?(n(),t("div",Wf,[s("div",Vf,[r(c(K),{text:"",onClick:l[1]||(l[1]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[10]||(l[10]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:W,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[11]||(l[11]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Jf,[s("span",Zf,[y(" 共 "+v(k.value.length)+" 个命令 ",1),k.value.length>0?(n(),t(m,{key:0},[y(" · 用户级: "+v(E.value)+" · 项目级: "+v(D.value)+" ",1),N.value>0?(n(),t(m,{key:0},[y(" · 托管: "+v(N.value),1)],64)):o("",!0)],64)):o("",!0)])]),s("div",Yf,[r(c(re),{value:C.value,"onUpdate:value":l[2]||(l[2]=e=>C.value=e),placeholder:"搜索命令...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:U.value,"onUpdate:value":l[3]||(l[3]=e=>U.value=e),options:L,size:"small",class:"filter-select"},null,8,["value"])]),s("div",Xf,[r(c(Q),{show:_.value},{default:u(()=>[0!==F.value.length||_.value?(n(),t("div",eg,[(n(!0),t(m,null,f(F.value,e=>(n(),g(Rf,{key:e.path,command:e,deleting:!!P.value[e.path],"registry-info":$.value[e.name],toggling:!!j.value[e.name],onEdit:V,onDelete:J,onClick:Z,onToggleEnabled:H,onTogglePlatform:G},null,8,["command","deleting","registry-info","toggling"]))),128))])):(n(),t("div",Qf,[r(c(ee),{description:R.value},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(ea))]),_:1})]),extra:u(()=>[r(c(K),{size:"small",onClick:l[4]||(l[4]=e=>S.value=!0)},{default:u(()=>[...l[12]||(l[12]=[y(" 创建第一个命令 ",-1)])]),_:1})]),_:1},8,["description"])]))]),_:1},8,["show"])]),s("div",ag,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),s("span",null,v(A.value),1)]),r(Hf,{visible:S.value,"onUpdate:visible":l[5]||(l[5]=e=>S.value=e),command:T.value,"project-path":e.projectPath,platform:O.value,onSaved:Y},null,8,["visible","command","project-path","platform"]),r(c(pe),{show:z.value,"onUpdate:show":l[6]||(l[6]=e=>z.value=e),width:500},{default:u(()=>{var e;return[r(c(de),{title:(null==(e=I.value)?void 0:e.name)?"/"+I.value.name:"命令详情"},{default:u(()=>[I.value?(n(),t(m,{key:0},[r(c(Te),{bordered:"",column:1},{default:u(()=>[r(c(Pe),{label:"作用域"},{default:u(()=>[y(v("user"===I.value.scope?"用户级":"项目级"),1)]),_:1}),I.value.namespace?(n(),g(c(Pe),{key:0,label:"命名空间"},{default:u(()=>[y(v(I.value.namespace),1)]),_:1})):o("",!0),I.value.description?(n(),g(c(Pe),{key:1,label:"描述"},{default:u(()=>[y(v(I.value.description),1)]),_:1})):o("",!0),I.value.allowedTools?(n(),g(c(Pe),{key:2,label:"允许的工具"},{default:u(()=>[y(v(I.value.allowedTools),1)]),_:1})):o("",!0),I.value.argumentHint?(n(),g(c(Pe),{key:3,label:"参数提示"},{default:u(()=>[y(v(I.value.argumentHint),1)]),_:1})):o("",!0)]),_:1}),s("div",lg,[l[13]||(l[13]=s("h4",null,"命令内容",-1)),r(c(be),{code:I.value.body||"(无内容)",language:"markdown","word-wrap":""},null,8,["code"])])],64)):o("",!0)]),_:1},8,["title"])]}),_:1},8,["show"])],2))}},[["__scopeId","data-v-ab0f3567"]]),ng=Pl({__name:"CommandsDrawer",props:{visible:Boolean},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(520),i=w({get:()=>l.visible,set:e=>t("update:visible",e)});return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:""},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},[s("span",null,"Custom Commands")],-1)])]),default:u(()=>[r(tg,{onBack:a[0]||(a[0]=e=>i.value=!1),"hide-back":!0,"in-drawer":!0})]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-d2a0745d"]]);async function sg(e=null,a="claude"){return(await dt.get("/agents",{params:e?{projectPath:e,platform:a}:{platform:a}})).data}const og={class:"card-main"},ig={class:"card-header"},rg={class:"agent-name"},ug={class:"agent-badges"},cg={key:0,class:"agent-desc"},dg={class:"agent-meta"},pg={key:0,class:"meta-item"},vg={key:1,class:"meta-item"},mg={class:"card-actions"},fg={class:"platform-icons"},gg=Pl({__name:"AgentCard",props:{agent:{type:Object,required:!0},deleting:{type:Boolean,default:!1},registryInfo:{type:Object,default:null},toggling:{type:Boolean,default:!1}},emits:["click","edit","delete","toggle-enabled","toggle-platform"],setup(e,{emit:a}){const l=e,i=a;return(a,f)=>{return n(),t("div",{class:d(["agent-card",{"is-project":"project"===e.agent.scope,managed:e.registryInfo}]),onClick:f[7]||(f[7]=a=>i("click",e.agent))},[s("div",og,[s("div",ig,[s("div",rg,v(e.agent.name),1),s("div",ug,[r(c(G),{type:"user"===e.agent.scope?"info":"success",size:"tiny",bordered:!1},{default:u(()=>[y(v("user"===e.agent.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),e.agent.model?(n(),g(c(G),{key:0,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[y(v(e.agent.model),1)]),_:1})):o("",!0)])]),e.agent.description?(n(),t("div",cg,v((b=e.agent.description,b?b.length>80?b.slice(0,80)+"...":b:"")),1)):o("",!0),s("div",dg,[e.agent.tools?(n(),t("span",pg,[r(c(q),{size:"12"},{default:u(()=>[r(c(al))]),_:1}),y(" "+v((h=e.agent.tools,h?h.length>30?h.slice(0,30)+"...":h:"")),1)])):o("",!0),e.agent.permissionMode?(n(),t("span",vg,[r(c(q),{size:"12"},{default:u(()=>[r(c(tl))]),_:1}),y(" "+v(e.agent.permissionMode),1)])):o("",!0)])]),s("div",mg,[e.registryInfo?(n(),t(m,{key:0},[r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(W),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":f[0]||(f[0]=a=>i("toggle-enabled",e.agent,a)),onClick:f[1]||(f[1]=p(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[y(" "+v(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),s("div",fg,[r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.claude}]),onClick:f[2]||(f[2]=p(a=>{var l;return i("toggle-platform",e.agent,"claude",!(null==(l=e.registryInfo.platforms)?void 0:l.claude))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(Va))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Claude Code "+v((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.codex}]),onClick:f[3]||(f[3]=p(a=>{var l;return i("toggle-platform",e.agent,"codex",!(null==(l=e.registryInfo.platforms)?void 0:l.codex))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ea))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Codex CLI "+v((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.opencode}]),onClick:f[4]||(f[4]=p(a=>{var l;return i("toggle-platform",e.agent,"opencode",!(null==(l=e.registryInfo.platforms)?void 0:l.opencode))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ua))]),_:1})],2)]}),default:u(()=>{var a;return[y(" OpenCode "+v((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1})])],64)):(n(),t(m,{key:1},[r(c(K),{size:"tiny",tertiary:"",onClick:f[5]||(f[5]=p(a=>i("edit",e.agent),["stop"]))},{default:u(()=>[...f[8]||(f[8]=[y(" 编辑 ",-1)])]),_:1}),r(c(K),{size:"tiny",tertiary:"",type:"error",loading:l.deleting,onClick:f[6]||(f[6]=p(a=>i("delete",e.agent),["stop"]))},{default:u(()=>[...f[9]||(f[9]=[y(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2);var h,b}}},[["__scopeId","data-v-617694f2"]]),yg={class:"modal-footer"},hg=Pl({__name:"AgentFormModal",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},projectPath:{type:String,default:null},platform:{type:String,default:"claude"}},emits:["update:visible","saved"],setup(e,{emit:a}){const t=e,i=a,d=w({get:()=>t.visible,set:e=>i("update:visible",e)}),p=w(()=>!!t.agent),m=w(()=>"codex"===t.platform),f=w(()=>"claude"===t.platform),h=w(()=>"codex"===t.platform||"opencode"===t.platform),b=w(()=>"codex"===t.platform?"用户级 (~/.codex/config.toml)":"opencode"===t.platform?"用户级 (~/.config/opencode/agents/)":"用户级 (~/.claude/agents/)"),k=w(()=>"opencode"===t.platform?"项目级 (.opencode/agents/)":"项目级 (.claude/agents/)"),_=l(null),C=l(!1),U=[{label:"Sonnet",value:"sonnet"},{label:"Opus",value:"opus"},{label:"Haiku",value:"haiku"},{label:"继承 (inherit)",value:"inherit"}],S=[{label:"默认 (default)",value:"default"},{label:"宽松 (permissive)",value:"permissive"},{label:"严格 (strict)",value:"strict"}],z=[{label:"无配置 (none)",value:"none"},{label:"托管配置 (managed)",value:"managed"},{label:"自定义路径 (custom)",value:"custom"}],I=l({fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}),T=w(()=>{const e={fileName:{required:!0,message:"请输入文件名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"},description:{required:!0,message:"请输入代理描述",trigger:"blur"}};return f.value&&(e.name={required:!0,message:"请输入代理名称",trigger:"blur"}),m.value&&(e.configMode={required:!0,message:"请选择配置模式",trigger:"change"},e.configFile={required:"custom"===I.value.configMode,message:"请输入自定义配置文件路径",trigger:"blur"}),e});function P(){I.value={fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}}function M(){d.value=!1,P()}async function $(){var e;try{await(null==(e=_.value)?void 0:e.validate())}catch{return}C.value=!0;try{const e={...I.value,projectPath:t.projectPath};m.value?("custom"===I.value.configMode?e.configFile=I.value.configFile:delete e.configFile,"managed"===I.value.configMode||"custom"===I.value.configMode?e.configContent=I.value.configContent||"":delete e.configContent):(delete e.configMode,delete e.configFile,delete e.configContent),p.value?(await async function(e,a,l,t="claude"){return(await dt.put(`/agents/${a}/${e}`,{...l,platform:t})).data}(I.value.fileName,I.value.scope,e,t.platform),Un.success("代理更新成功")):(await async function(e,a="claude"){return(await dt.post("/agents",{...e,platform:a})).data}(e,t.platform),Un.success("代理创建成功")),i("saved"),d.value=!1,P()}catch(a){Un.error("操作失败: "+a.message)}finally{C.value=!1}}return x(()=>t.agent,e=>{if(e){const a=e.configMode||(e.configFile?String(e.configFile).includes("/.codex/agents/")?"managed":"custom":"none");I.value={fileName:e.fileName||"",scope:e.scope||"user",name:e.name||"",description:e.description||"",configMode:a,configFile:e.configFile||"",configContent:e.fullContent||"",tools:e.tools||"",model:e.model||"",permissionMode:e.permissionMode||"",skills:e.skills||"",systemPrompt:e.systemPrompt||""}}else P()},{immediate:!0}),x(()=>t.platform,e=>{"codex"===e&&(I.value.scope="user",I.value.configMode||(I.value.configMode="none"))},{immediate:!0}),(e,a)=>(n(),g(c(ie),{show:d.value,"onUpdate:show":a[13]||(a[13]=e=>d.value=e),preset:"card",title:p.value?"编辑代理":"创建代理",style:{width:"650px","max-width":"95vw"},"mask-closable":!1},{footer:u(()=>[s("div",yg,[r(c(K),{onClick:M},{default:u(()=>[...a[14]||(a[14]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:C.value,onClick:$},{default:u(()=>[y(v(p.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>[r(c(ae),{ref_key:"formRef",ref:_,model:I.value,rules:T.value,"label-placement":"left","label-width":"auto","require-mark-placement":"right-hanging"},{default:u(()=>[r(c(le),{label:"文件名",path:"fileName"},{default:u(()=>[r(c(re),{value:I.value.fileName,"onUpdate:value":a[0]||(a[0]=e=>I.value.fileName=e),disabled:p.value,placeholder:"如: code-reviewer, deploy-helper"},null,8,["value","disabled"])]),_:1}),r(c(le),{label:"作用域",path:"scope"},{default:u(()=>[r(c(ne),{value:I.value.scope,"onUpdate:value":a[1]||(a[1]=e=>I.value.scope=e),disabled:p.value},{default:u(()=>[r(c(oe),{value:"user"},{default:u(()=>[y(v(b.value),1)]),_:1}),m.value?o("",!0):(n(),g(c(oe),{key:0,value:"project"},{default:u(()=>[y(v(k.value),1)]),_:1}))]),_:1},8,["value","disabled"])]),_:1}),f.value?(n(),g(c(le),{key:0,label:"代理名称",path:"name"},{default:u(()=>[r(c(re),{value:I.value.name,"onUpdate:value":a[2]||(a[2]=e=>I.value.name=e),placeholder:"代理的显示名称"},null,8,["value"])]),_:1})):o("",!0),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:I.value.description,"onUpdate:value":a[3]||(a[3]=e=>I.value.description=e),type:"textarea",rows:2,placeholder:"代理用途描述(必填)"},null,8,["value"])]),_:1}),m.value?(n(),g(c(le),{key:1,label:"配置模式",path:"configMode"},{default:u(()=>[r(c(te),{value:I.value.configMode,"onUpdate:value":a[4]||(a[4]=e=>I.value.configMode=e),options:z,placeholder:"选择配置模式"},null,8,["value"])]),_:1})):o("",!0),m.value&&"custom"===I.value.configMode?(n(),g(c(le),{key:2,label:"配置文件路径",path:"configFile"},{default:u(()=>[r(c(re),{value:I.value.configFile,"onUpdate:value":a[5]||(a[5]=e=>I.value.configFile=e),placeholder:"如: ~/.omx/agents/my-agent.toml"},null,8,["value"])]),_:1})):o("",!0),!m.value||"managed"!==I.value.configMode&&"custom"!==I.value.configMode?o("",!0):(n(),g(c(le),{key:3,label:"Agent Config (TOML)",path:"configContent"},{default:u(()=>[r(c(re),{value:I.value.configContent,"onUpdate:value":a[6]||(a[6]=e=>I.value.configContent=e),type:"textarea",rows:10,placeholder:'如: model = "gpt-5.3-codex"'},null,8,["value"])]),_:1})),m.value?o("",!0):(n(),g(c(le),{key:4,label:"可用工具",path:"tools"},{default:u(()=>[r(c(re),{value:I.value.tools,"onUpdate:value":a[7]||(a[7]=e=>I.value.tools=e),placeholder:"如: Read, Edit, Bash (逗号分隔)"},null,8,["value"])]),_:1})),m.value?o("",!0):(n(),g(c(le),{key:5,label:"模型",path:"model"},{default:u(()=>[h.value?(n(),g(c(re),{key:0,value:I.value.model,"onUpdate:value":a[8]||(a[8]=e=>I.value.model=e),placeholder:"如: gpt-5、claude-sonnet-4、openrouter/model"},null,8,["value"])):(n(),g(c(te),{key:1,value:I.value.model,"onUpdate:value":a[9]||(a[9]=e=>I.value.model=e),options:U,placeholder:"选择模型",clearable:""},null,8,["value"]))]),_:1})),"opencode"===t.platform||m.value?o("",!0):(n(),g(c(le),{key:6,label:"权限模式",path:"permissionMode"},{default:u(()=>[r(c(te),{value:I.value.permissionMode,"onUpdate:value":a[10]||(a[10]=e=>I.value.permissionMode=e),options:S,placeholder:"选择权限模式",clearable:""},null,8,["value"])]),_:1})),"opencode"===t.platform||m.value?o("",!0):(n(),g(c(le),{key:7,label:"技能",path:"skills"},{default:u(()=>[r(c(re),{value:I.value.skills,"onUpdate:value":a[11]||(a[11]=e=>I.value.skills=e),placeholder:"自动加载的技能 (逗号分隔)"},null,8,["value"])]),_:1})),m.value?o("",!0):(n(),g(c(le),{key:8,label:"系统提示词",path:"systemPrompt"},{default:u(()=>[r(Up,{modelValue:I.value.systemPrompt,"onUpdate:modelValue":a[12]||(a[12]=e=>I.value.systemPrompt=e),rows:8,"min-height":180,placeholder:"代理的系统提示词,定义代理的行为和能力"},null,8,["modelValue"])]),_:1}))]),_:1},8,["model","rules"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-8ce8fb85"]]),bg={key:0,class:"panel-header"},wg={class:"header-left"},kg={class:"header-right"},_g={key:1,class:"drawer-header-bar"},xg={class:"header-right"},Cg={class:"stats-bar"},Ug={class:"stats-text"},Sg={class:"filter-bar"},zg={class:"agents-content"},Ig={key:0,class:"empty-state"},Tg={key:1,class:"agents-grid"},Pg={class:"panel-footer"},Mg={class:"detail-section"},$g=Pl({__name:"AgentsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null}},emits:["back","updated"],setup(e,{emit:a}){const i=e,p=a,h=M(),k=l([]),_=l(!1),C=l(""),U=l("all"),S=l(!1),z=l(!1),I=l(null),T=l(!1),P=l(null),$=l({}),j=l({}),O=l({}),A=w(()=>{const e=h.meta.channel;return"codex"===e?"codex":"opencode"===e?"opencode":"claude"}),L=w(()=>"opencode"===A.value?"使用 @agent 或 Task 在 OpenCode 中调用":"使用 Task tool 调用自定义代理"),E=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],D=w(()=>k.value.filter(e=>"user"===e.scope).length),N=w(()=>k.value.filter(e=>"project"===e.scope).length),F=w(()=>Object.keys(j.value).length);function R(e){if(!e)return"";const a="string"==typeof e.scope&&e.scope.trim()?e.scope.trim():"unknown",l="string"==typeof e.path&&e.path.trim()?e.path.trim():"",t="string"==typeof e.fileName&&e.fileName.trim()?e.fileName.trim():"";return`${a}:${l||t}`}function B(e){if(!e)return"";const a=[];if("string"==typeof e.path&&e.path.trim()&&a.push(e.path.trim()),"string"==typeof e.fileName&&e.fileName.trim()){const l=e.fileName.trim();a.push(`${l}.md`,l)}"string"==typeof e.name&&e.name.trim()&&a.push(e.name.trim());for(const l of a)if(j.value[l])return l;return a[0]||""}const H=w(()=>{let e=k.value;if("user"===U.value?e=e.filter(e=>"user"===e.scope):"project"===U.value?e=e.filter(e=>"project"===e.scope):"managed"===U.value&&(e=e.filter(e=>j.value[B(e)])),C.value.trim()){const a=C.value.toLowerCase();e=e.filter(e=>{var l,t,n;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))||(null==(n=e.fileName)?void 0:n.toLowerCase().includes(a))})}return e}),G=w(()=>C.value?"没有匹配的代理":"user"===U.value?"暂无用户级代理":"project"===U.value?"暂无项目级代理":"managed"===U.value?"暂无托管的代理":"暂无自定义代理");async function W(){_.value=!0;try{const[e,a]=await Promise.all([sg(i.projectPath,A.value),mm("agents")]);if(e.success&&(k.value=e.agents||[]),a.success){j.value={};for(const[e,l]of Object.entries(a.items||{}))j.value[e]=l}}catch(e){Un.error("加载代理列表失败: "+e.message)}finally{_.value=!1}}async function V(e,a){const l=B(e);if(l){O.value[l]=!0;try{(await gm("agents",l,a)).success&&(Un.success(a?"已启用":"已禁用"),await W())}catch(t){Un.error("切换失败: "+t.message)}finally{delete O.value[l]}}else Un.error("未找到代理对应的托管配置键")}async function J(e,a,l){const t=B(e);if(t){O.value[t]=!0;try{(await ym("agents",t,a,l)).success&&(Un.success(`${a} ${l?"已启用":"已禁用"}`),await W())}catch(n){Un.error("切换失败: "+n.message)}finally{delete O.value[t]}}else Un.error("未找到代理对应的托管配置键")}async function Z(){_.value=!0;try{const e=await hm("agents");(null==e?void 0:e.success)||Un.warning((null==e?void 0:e.message)||"同步失败,已继续刷新列表")}catch(e){Un.warning("同步失败,已继续刷新列表: "+e.message)}await W()}function Y(){P.value=null,S.value=!0}function X(e){S.value=e,e||(P.value=null)}function ae(e){ne(e,!0)}async function le(e){const a=R(e);$.value[a]=!0;try{(await async function(e,a,l=null,t="claude"){const n={};return t&&(n.platform=t),l&&(n.projectPath=l),(await dt.delete(`/agents/${a}/${e}`,{params:n})).data}(e.fileName,e.scope,i.projectPath,A.value)).success&&(Un.success("代理已删除"),await W(),p("updated"))}catch(l){Un.error("删除失败: "+l.message)}finally{delete $.value[a]}}async function ne(e,a=!1){if(e){if("codex"!==A.value)return a?(P.value=e,void(S.value=!0)):(I.value=e,void(z.value=!0));T.value=!0,a||(I.value=null,z.value=!0);try{const l=await async function(e,a,l=null,t="claude"){const n={};return t&&(n.platform=t),l&&(n.projectPath=l),(await dt.get(`/agents/${a}/${e}`,{params:n})).data}(e.fileName,e.scope,i.projectPath,A.value),t=(null==l?void 0:l.agent)||e;a?(P.value=t,S.value=!0):I.value=t}catch(l){Un.error("加载代理详情失败: "+l.message),a?(P.value=e,S.value=!0):I.value=e}finally{T.value=!1}}}function se(e){ne(e,!1)}function oe(){P.value=null,W(),p("updated")}function ie(){p("back")}return b(()=>{W()}),x(A,()=>{W()}),(a,l)=>(n(),t("div",{class:d(["agents-panel",{"in-drawer":i.inDrawer}])},[i.inDrawer?o("",!0):(n(),t("div",bg,[s("div",wg,[i.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:ie,class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[3]||(l[3]=s("span",{class:"panel-title"},"Custom Agents",-1))]),s("div",kg,[r(c(K),{text:"",onClick:Y,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[4]||(l[4]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:Z,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[5]||(l[5]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),i.inDrawer?(n(),t("div",_g,[s("div",xg,[r(c(K),{text:"",onClick:Y,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[6]||(l[6]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:Z,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[7]||(l[7]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Cg,[s("span",Ug,[y(" 共 "+v(k.value.length)+" 个代理 ",1),k.value.length>0?(n(),t(m,{key:0},[y(" · 用户级: "+v(D.value)+" · 项目级: "+v(N.value)+" ",1),F.value>0?(n(),t(m,{key:0},[y(" · 托管: "+v(F.value),1)],64)):o("",!0)],64)):o("",!0)])]),s("div",Sg,[r(c(re),{value:C.value,"onUpdate:value":l[0]||(l[0]=e=>C.value=e),placeholder:"搜索代理...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:U.value,"onUpdate:value":l[1]||(l[1]=e=>U.value=e),options:E,size:"small",class:"filter-select"},null,8,["value"])]),s("div",zg,[r(c(Q),{show:_.value},{default:u(()=>[0!==H.value.length||_.value?(n(),t("div",Tg,[(n(!0),t(m,null,f(H.value,e=>(n(),g(gg,{key:R(e),agent:e,deleting:!!$.value[R(e)],"registry-info":j.value[B(e)],toggling:!!O.value[B(e)],onEdit:ae,onDelete:le,onClick:se,onToggleEnabled:V,onTogglePlatform:J},null,8,["agent","deleting","registry-info","toggling"]))),128))])):(n(),t("div",Ig,[r(c(ee),{description:G.value},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(aa))]),_:1})]),extra:u(()=>[r(c(K),{size:"small",onClick:Y},{default:u(()=>[...l[8]||(l[8]=[y(" 创建第一个代理 ",-1)])]),_:1})]),_:1},8,["description"])]))]),_:1},8,["show"])]),s("div",Pg,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),s("span",null,v(L.value),1)]),r(hg,{visible:S.value,"onUpdate:visible":X,agent:P.value,"project-path":e.projectPath,platform:A.value,onSaved:oe},null,8,["visible","agent","project-path","platform"]),r(c(pe),{show:z.value,"onUpdate:show":l[2]||(l[2]=e=>z.value=e),width:550},{default:u(()=>{var e;return[r(c(de),{title:(null==(e=I.value)?void 0:e.name)||"代理详情"},{default:u(()=>[I.value?(n(),t(m,{key:0},["codex"===A.value&&I.value.configReadError?(n(),g(c(fe),{key:0,type:"warning",bordered:!1,style:{"margin-bottom":"12px"}},{default:u(()=>[y(v(I.value.configReadError),1)]),_:1})):o("",!0),r(c(Te),{bordered:"",column:1},{default:u(()=>[r(c(Pe),{label:"作用域"},{default:u(()=>[y(v("user"===I.value.scope?"用户级":"项目级"),1)]),_:1}),r(c(Pe),{label:"文件名"},{default:u(()=>[y(v("codex"===A.value?`[agents.${I.value.fileName}]`:`${I.value.fileName}.md`),1)]),_:1}),"codex"===A.value&&I.value.configFile?(n(),g(c(Pe),{key:0,label:"config_file"},{default:u(()=>[y(v(I.value.configFile),1)]),_:1})):o("",!0),I.value.description?(n(),g(c(Pe),{key:1,label:"描述"},{default:u(()=>[y(v(I.value.description),1)]),_:1})):o("",!0),I.value.tools?(n(),g(c(Pe),{key:2,label:"可用工具"},{default:u(()=>[y(v(I.value.tools),1)]),_:1})):o("",!0),I.value.model?(n(),g(c(Pe),{key:3,label:"模型"},{default:u(()=>[y(v(I.value.model),1)]),_:1})):o("",!0),I.value.permissionMode?(n(),g(c(Pe),{key:4,label:"权限模式"},{default:u(()=>[y(v(I.value.permissionMode),1)]),_:1})):o("",!0),I.value.skills?(n(),g(c(Pe),{key:5,label:"技能"},{default:u(()=>[y(v(I.value.skills),1)]),_:1})):o("",!0)]),_:1}),s("div",Mg,[s("h4",null,v("codex"===A.value?"Agent Config (TOML)":"系统提示词"),1),r(c(be),{code:"codex"===A.value?I.value.fullContent||"(无内容)":I.value.systemPrompt||"(无内容)",language:"codex"===A.value?"toml":"markdown","word-wrap":""},null,8,["code","language"])])],64)):T.value?(n(),g(c(Q),{key:1,show:!0,size:"small"})):o("",!0)]),_:1},8,["title"])]}),_:1},8,["show"])],2))}},[["__scopeId","data-v-8222e230"]]),jg=Pl({__name:"AgentsDrawer",props:{visible:Boolean},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(520),i=w({get:()=>l.visible,set:e=>t("update:visible",e)});return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:""},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},[s("span",null,"Custom Agents")],-1)])]),default:u(()=>[r($g,{onBack:a[0]||(a[0]=e=>i.value=!1),"hide-back":!0,"in-drawer":!0})]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-deb60bdb"]]);async function Og(e,a,l="claude",t=""){const n={platform:l};t?n.source=t:(n.directory=e,n.repo=a);return(await dt.post("/plugins/install",n)).data}async function Ag(e,a="claude"){return(await dt.post("/plugins/repos",{...e,platform:a})).data}async function Lg(e="claude"){return(await dt.post("/plugins/repos/sync",{platform:e})).data}const Eg={class:"card-header"},Dg={class:"card-title"},Ng={class:"name"},Fg={class:"card-body"},Rg={key:0,class:"description"},Bg={class:"meta"},Hg={class:"meta-item"},qg=["href"],Kg=Pl({__name:"PluginCard",props:{plugin:{type:Object,required:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1}},emits:["click","install","uninstall"],setup:e=>(a,l)=>{return n(),t("div",{class:d(["plugin-card",{installed:e.plugin.installed}]),onClick:l[4]||(l[4]=l=>a.$emit("click",e.plugin))},[s("div",Eg,[s("div",Dg,[s("span",Ng,v(e.plugin.name),1),e.plugin.installed?(n(),g(c(G),{key:0,type:"info",size:"small"},{default:u(()=>[...l[5]||(l[5]=[y("已安装",-1)])]),_:1})):o("",!0),e.plugin.repoOwner?(n(),g(c(G),{key:1,type:"info",size:"small"},{default:u(()=>[y(v(e.plugin.repoOwner),1)]),_:1})):o("",!0)]),s("div",{class:"card-actions",onClick:l[2]||(l[2]=p(()=>{},["stop"]))},[e.plugin.installed?(n(),g(c(K),{key:0,size:"small",type:"error",loading:e.uninstalling,focusable:!1,onClick:l[0]||(l[0]=l=>a.$emit("uninstall",e.plugin))},{default:u(()=>[...l[6]||(l[6]=[y("卸载",-1)])]),_:1},8,["loading"])):(n(),g(c(K),{key:1,size:"small",type:"primary",loading:e.installing,disabled:(m=e.plugin,!((null==m?void 0:m.installSource)||(null==m?void 0:m.repoOwner))),focusable:!1,onClick:l[1]||(l[1]=l=>a.$emit("install",e.plugin))},{default:u(()=>[...l[7]||(l[7]=[y("安装",-1)])]),_:1},8,["loading","disabled"]))])]),s("div",Fg,[e.plugin.description?(n(),t("div",Rg,v((i=e.plugin.description,r=80,(null==i?void 0:i.length)>r?i.slice(0,r)+"...":i)),1)):o("",!0),s("div",Bg,[s("span",Hg,v(e.plugin.directory),1),e.plugin.readmeUrl?(n(),t("a",{key:0,class:"meta-link",href:e.plugin.readmeUrl,target:"_blank",onClick:l[3]||(l[3]=p(()=>{},["stop"]))},"GitHub",8,qg)):o("",!0)])])],2);var i,r,m}},[["__scopeId","data-v-ab48155d"]]),Gg={class:"repo-manager"},Wg={class:"repo-list"},Vg={class:"repo-main"},Jg={class:"repo-info"},Zg={class:"repo-name"},Yg={class:"repo-branch"},Xg={key:0,class:"empty-hint"},Qg={class:"add-repo"},ey={class:"add-form"},ay={class:"tips"},ly={class:"recommended"},ty={class:"recommended-list"},ny=["onClick"],sy={class:"rec-info"},oy={class:"rec-name"},iy={class:"rec-desc"},ry=Pl({__name:"PluginRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const i=e,p=a,h=w({get:()=>i.visible,set:e=>p("update:visible",e)}),k=l([]),_=l(!1),C=l(!1),U=l(!1),S=l({input:"",branch:"main"}),z=w(()=>"opencode"===i.platform?[{owner:"awesome-opencode",name:"awesome-opencode",url:"https://github.com/awesome-opencode/awesome-opencode",description:"OpenCode 生态聚合",branch:"main"},{owner:"sst",name:"opencode",url:"https://github.com/sst/opencode",description:"OpenCode 官方仓库",branch:"dev"}]:[{owner:"anthropics",name:"claude-plugins-official",url:"https://github.com/anthropics/claude-plugins-official",description:"官方插件库",branch:"main"}]),I=w(()=>{const e=S.value.input.trim();if(!e)return!1;if(e.includes("github.com"))return e.match(/github\.com\/([^\/]+)\/([^\/\.]+)/);const a=e.split("/");return 2===a.length&&a[0]&&a[1]});async function T(){_.value=!0;try{const e=await async function(e="claude"){return(await dt.get("/plugins/repos",{params:{platform:e}})).data}(i.platform);e.success&&(k.value=e.repos||[])}catch(e){Un.error("加载仓库失败: "+e.message)}finally{_.value=!1}}async function P(){U.value=!0;try{(await Lg(i.platform)).success&&(Un.success("仓库同步成功"),p("updated"))}catch(e){Un.error("同步失败: "+e.message)}finally{U.value=!1}}async function M(){if(!I.value)return;const e=S.value.input.trim();let a,l,t;if(e.includes("github.com")){const n=e.match(/github\.com\/([^\/]+)\/([^\/\.]+)/);n&&(a=n[1],l=n[2],t=e)}else{const n=e.split("/");a=n[0],l=n[1],t=`https://github.com/${a}/${l}`}C.value=!0;try{const e=await Ag({owner:a,name:l,url:t,branch:S.value.branch||"main",enabled:!0},i.platform);e.success&&(k.value=e.repos,S.value.input="",S.value.branch="main",Un.success("仓库添加成功"),p("updated"))}catch(n){Un.error("添加失败: "+n.message)}finally{C.value=!1}}async function $(e){try{const a=await async function(e,a,l="claude"){return(await dt.delete(`/plugins/repos/${encodeURIComponent(e)}/${encodeURIComponent(a)}`,{params:{platform:l}})).data}(e.owner,e.name,i.platform);a.success&&(k.value=a.repos,Un.success("仓库已删除"),p("updated"))}catch(a){Un.error("删除失败: "+a.message)}}async function j(e,a){try{const l=await async function(e,a,l,t="claude"){return(await dt.put(`/plugins/repos/${encodeURIComponent(e)}/${encodeURIComponent(a)}/toggle`,{enabled:l,platform:t})).data}(e.owner,e.name,a,i.platform);l.success&&(k.value=l.repos,p("updated"))}catch(l){Un.error("操作失败: "+l.message)}}function A(e){return k.value.some(a=>a.owner===e.owner&&a.name===e.name)}function L(){p("update:visible",!1)}return x(()=>i.visible,e=>{e&&T()}),x(()=>i.platform,()=>{i.visible&&T()}),b(()=>{i.visible&&T()}),(e,a)=>(n(),g(c(ie),{show:h.value,"onUpdate:show":a[2]||(a[2]=e=>h.value=e),preset:"card",title:"插件仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:L},{"header-extra":u(()=>[r(c(K),{type:"primary",size:"small",loading:U.value,focusable:!1,onClick:P},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Fa))]),_:1})]),default:u(()=>[a[3]||(a[3]=y(" 同步 ",-1))]),_:1},8,["loading"])]),default:u(()=>[s("div",Gg,[s("div",Wg,[r(c(Q),{show:_.value},{default:u(()=>[(n(!0),t(m,null,f(k.value,e=>(n(),t("div",{key:`${e.owner}/${e.name}`,class:"repo-item"},[s("div",Vg,[r(c(W),{value:e.enabled,size:"small","onUpdate:value":a=>j(e,a)},null,8,["value","onUpdate:value"]),s("div",Jg,[s("div",Zg,v(e.owner)+"/"+v(e.name),1),s("div",Yg,v(e.branch),1)])]),r(c(K),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>$(e)},{default:u(()=>[...a[4]||(a[4]=[y(" 删除 ",-1)])]),_:1},8,["onClick"])]))),128)),0===k.value.length?(n(),t("div",Xg," 暂无仓库,请添加 ")):o("",!0)]),_:1},8,["show"])]),s("div",Qg,[a[6]||(a[6]=s("div",{class:"add-title"},"添加仓库",-1)),s("div",ey,[r(c(re),{value:S.value.input,"onUpdate:value":a[0]||(a[0]=e=>S.value.input=e),placeholder:"owner/repo 或 GitHub URL",size:"small",class:"repo-input",onKeyup:O(M,["enter"])},null,8,["value"]),r(c(re),{value:S.value.branch,"onUpdate:value":a[1]||(a[1]=e=>S.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"]),r(c(K),{type:"primary",size:"small",disabled:!I.value,loading:C.value,focusable:!1,onClick:M},{default:u(()=>[...a[5]||(a[5]=[y(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[7]||(a[7]=s("div",{class:"add-hint"}," 格式: owner/repo 或完整 GitHub URL ",-1))]),s("div",ay,[r(c(fe),{type:"info",bordered:!1,size:"small"},{default:u(()=>[...a[8]||(a[8]=[y(" 添加仓库后,系统会从 GitHub 获取插件列表。如果网络较慢,请耐心等待或使用代理。 ",-1)])]),_:1})]),s("div",ly,[a[10]||(a[10]=s("div",{class:"recommended-title"},"推荐仓库",-1)),s("div",ty,[(n(!0),t(m,null,f(z.value,e=>(n(),t("div",{key:`${e.owner}/${e.name}`,class:d(["recommended-item",{added:A(e)}]),onClick:a=>!A(e)&&async function(e){C.value=!0;try{const a=await Ag({owner:e.owner,name:e.name,url:e.url,branch:e.branch,enabled:!0},i.platform);a.success&&(k.value=a.repos,Un.success("仓库添加成功"),p("updated"))}catch(a){Un.error("添加失败: "+a.message)}finally{C.value=!1}}(e)},[s("div",sy,[s("span",oy,v(e.owner)+"/"+v(e.name),1),s("span",iy,v(e.description),1)]),A(e)?(n(),g(c(G),{key:0,size:"tiny",type:"success",bordered:!1},{default:u(()=>[...a[9]||(a[9]=[y(" 已添加 ",-1)])]),_:1})):(n(),g(c(q),{key:1,class:"add-icon"},{default:u(()=>[r(c(Ve))]),_:1}))],10,ny))),128))])])])]),_:1},8,["show"]))}},[["__scopeId","data-v-bed4d4d3"]]),uy={class:"drawer-header"},cy={class:"plugin-info"},dy={class:"plugin-details"},py={class:"plugin-name"},vy={class:"plugin-meta"},my={key:1,class:"author-text"},fy={class:"drawer-body"},gy={class:"overview-container"},yy={class:"info-section"},hy={class:"description-text"},by={key:0,class:"info-section"},wy={class:"repo-link"},ky=["href"],_y={key:1,class:"info-section"},xy={class:"path-info"},Cy={class:"readme-container"},Uy={key:0,class:"loading-state"},Sy=["innerHTML"],zy={key:2,class:"empty-state"},Iy=Pl({__name:"PluginDetailDrawer",props:{visible:{type:Boolean,default:!1},plugin:{type:Object,default:null},platform:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){_l.setOptions({breaks:!0,gfm:!0});const{drawerWidth:i}=ko(600),d=e,p=a,m=w({get:()=>d.visible,set:e=>p("update:visible",e)}),f=l(""),h=l(!1);x(()=>d.visible,async e=>{if(e&&d.plugin){h.value=!0;try{const e={repoOwner:d.plugin.repoOwner,repoName:d.plugin.repoName,repoBranch:d.plugin.repoBranch,directory:d.plugin.directory,source:d.plugin.source,repoUrl:d.plugin.repoUrl},a=await async function(e,a={},l="claude"){const t=new URLSearchParams;return l&&t.append("platform",l),a.repoOwner&&t.append("repoOwner",a.repoOwner),a.repoName&&t.append("repoName",a.repoName),a.repoBranch&&t.append("repoBranch",a.repoBranch),a.directory&&t.append("directory",a.directory),a.source&&t.append("source",a.source),a.repoUrl&&t.append("repoUrl",a.repoUrl),(await dt.get(`/plugins/${encodeURIComponent(e)}/readme?${t.toString()}`)).data}(d.plugin.name,e,d.platform);f.value=a.readme||""}catch(a){f.value=""}finally{h.value=!1}}});const b=w(()=>f.value?_l(f.value):"");return(a,l)=>(n(),g(c(pe),{show:m.value,"onUpdate:show":l[0]||(l[0]=e=>m.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>{var a,l,i;return[s("div",uy,[s("div",cy,[r(c(q),{size:20,class:"plugin-icon"},{default:u(()=>[r(c(Xe))]),_:1}),s("div",dy,[s("span",py,v(null==(a=e.plugin)?void 0:a.name),1),s("div",vy,[(null==(l=e.plugin)?void 0:l.version)?(n(),g(c(G),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(" v"+v(e.plugin.version),1)]),_:1})):o("",!0),(null==(i=e.plugin)?void 0:i.author)?(n(),t("span",my,[r(c(q),{size:12},{default:u(()=>[r(c(aa))]),_:1}),y(" "+v(e.plugin.author),1)])):o("",!0)])])])])]}),default:u(()=>[s("div",fy,[r(c(we),{type:"line",animated:""},{default:u(()=>[r(c(ke),{name:"overview",tab:"概览"},{default:u(()=>{var a,i,d,p,m;return[s("div",gy,[s("div",yy,[l[1]||(l[1]=s("h3",{class:"section-title"},"描述",-1)),s("p",hy,v((null==(a=e.plugin)?void 0:a.description)||"暂无描述"),1)]),(null==(i=e.plugin)?void 0:i.repoUrl)||(null==(d=e.plugin)?void 0:d.gitUrl)?(n(),t("div",by,[l[2]||(l[2]=s("h3",{class:"section-title"},"仓库地址",-1)),s("div",wy,[r(c(q),{size:16},{default:u(()=>[r(c(nl))]),_:1}),s("a",{href:e.plugin.repoUrl||e.plugin.gitUrl,target:"_blank",rel:"noopener noreferrer"},v(e.plugin.repoUrl||e.plugin.gitUrl),9,ky)])])):o("",!0),(null==(p=e.plugin)?void 0:p.directory)||(null==(m=e.plugin)?void 0:m.installPath)?(n(),t("div",_y,[l[3]||(l[3]=s("h3",{class:"section-title"},"安装路径",-1)),s("div",xy,[s("code",null,v(e.plugin.installPath||e.plugin.directory),1)])])):o("",!0)])]}),_:1}),r(c(ke),{name:"readme",tab:"README"},{default:u(()=>[s("div",Cy,[h.value?(n(),t("div",Uy,[r(c(Q),{size:"medium"}),l[4]||(l[4]=s("p",{class:"loading-text"},"加载 README 中...",-1))])):f.value?(n(),t("div",{key:1,class:"readme-content",innerHTML:b.value},null,8,Sy)):(n(),t("div",zy,[r(c(q),{size:48,class:"empty-icon"},{default:u(()=>[r(c(Oa))]),_:1}),l[5]||(l[5]=s("p",{class:"empty-text"},"暂无 README 文档",-1))]))])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-f63f8ef3"]]),Ty={key:0,class:"panel-header"},Py={class:"header-left"},My={class:"header-right"},$y={key:1,class:"drawer-header-bar"},jy={class:"header-right"},Oy={class:"stats-bar"},Ay={class:"stats-text"},Ly={class:"filter-bar"},Ey={class:"panel-content"},Dy={key:0,class:"empty-state"},Ny={key:1,class:"card-list"},Fy={class:"panel-footer"},Ry=Pl({__name:"PluginsPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1}},emits:["back","updated"],setup(e){const a=e,i=M(),p=Ie(),h=l(!1),k=l([]),_=l(""),C=l("all"),U=l(!1),S=l(!1),z=l(null),I=l({}),T=l({}),P=l(!1),$=l(0),j=w(()=>"opencode"===i.meta.channel?"opencode":"claude"),O=w(()=>"opencode"===j.value?"OpenCode":"Claude Code"),A=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"}],L=w(()=>k.value.filter(e=>e.installed).length),E=w(()=>{let e=k.value;if("installed"===C.value?e=e.filter(e=>e.installed):"uninstalled"===C.value&&(e=e.filter(e=>!e.installed)),_.value.trim()){const a=_.value.toLowerCase();e=e.filter(e=>{var l,t;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))})}return[...e].sort((e,a)=>e.installed===a.installed?0:e.installed?-1:1)}),D=w(()=>_.value?"没有匹配的插件":"installed"===C.value?"暂无已安装的插件":"uninstalled"===C.value?"所有插件都已安装":"暂无可用插件,请配置仓库源");async function N(e=!1){const a=++$.value,l=j.value;h.value=!0;try{e&&await Lg(l).catch(()=>{});const t=await async function(e="claude"){return(await dt.get("/plugins",{params:{platform:e}})).data}(l),n=t.success?t.plugins:[];let s=[];const o=(e,a)=>{const l={};for(const s of a)l[s.name]=s;const t=e.map(e=>{const a=l[e.name]||{};return{...a,...e,installed:!0,key:`installed-${e.name}`,description:e.description||a.description||"",repoOwner:e.repoOwner||a.repoOwner||"",repoName:e.repoName||a.repoName||"",repoBranch:e.repoBranch||a.repoBranch||"main",directory:e.directory||a.directory||e.installPath||""}}),n=new Set(e.map(e=>e.name));return[...t,...a.filter(e=>!n.has(e.name)).map(e=>({...e,installed:!1,key:`market-${e.repoOwner||"repo"}-${e.repoName||"name"}-${e.directory||e.name}`}))]};k.value=o(n,s),async function(e="claude"){return(await dt.get("/plugins/market",{params:{platform:e}})).data}(l).catch(()=>({success:!0,plugins:[]})).then(e=>{a===$.value&&l===j.value&&(s=e.success?e.plugins:[],k.value=o(n,s))})}catch(t){p.error("加载插件失败: "+t.message)}finally{a===$.value&&(h.value=!1)}}async function F(){if("claude"===j.value){P.value=!0;try{const e=await fm("plugins");e.success?(p.success(`成功导入 ${e.imported} 个插件`),await N(!0)):p.error(e.message||"导入失败")}catch(e){p.error("导入失败: "+e.message)}finally{P.value=!1}}}async function R(e){if(!e.installSource&&!e.repoOwner)return p.error("缺少可安装来源");I.value[e.key]=!0;try{const a=e.installSource?await Og("",null,j.value,e.installSource):await Og(e.directory,{owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main"},j.value);a.success?(p.success(`插件 "${e.name}" 安装成功`),await N(!0)):p.error(a.message||"安装失败")}catch(a){p.error("安装失败: "+a.message)}finally{delete I.value[e.key]}}async function B(e){T.value[e.key]=!0;try{const a=await async function(e,a="claude"){return(await dt.delete(`/plugins/${encodeURIComponent(e)}`,{params:{platform:a}})).data}(e.name,j.value);a.success?(p.success(`插件 "${e.name}" 已卸载`),await N(!0)):p.error(a.message||a.error||"卸载失败")}catch(a){p.error("卸载失败: "+a.message)}finally{delete T.value[e.key]}}function H(e){z.value=e,S.value=!0}return b(()=>{a.inDrawer&&!a.drawerVisible||N()}),x(()=>a.drawerVisible,e=>{e&&N()}),x(()=>j.value,()=>{N()}),(a,l)=>(n(),t("div",{class:d(["plugins-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?o("",!0):(n(),t("div",Ty,[s("div",Py,[e.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[10]||(l[10]=s("span",{class:"panel-title"},"Plugins 插件管理",-1))]),s("div",My,[r(c(K),{text:"",focusable:!1,onClick:l[1]||(l[1]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[11]||(l[11]=y(" 仓库 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:F,loading:P.value,disabled:"claude"!==j.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Xa))]),_:1})]),default:u(()=>[l[12]||(l[12]=y(" 导入 ",-1))]),_:1},8,["loading","disabled"]),r(c(K),{text:"",focusable:!1,onClick:l[2]||(l[2]=e=>N(!0)),loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[13]||(l[13]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),t("div",$y,[s("div",jy,[r(c(K),{text:"",focusable:!1,onClick:l[3]||(l[3]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[14]||(l[14]=y(" 仓库 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:F,loading:P.value,disabled:"claude"!==j.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Xa))]),_:1})]),default:u(()=>[l[15]||(l[15]=y(" 导入 ",-1))]),_:1},8,["loading","disabled"]),r(c(K),{text:"",focusable:!1,onClick:l[4]||(l[4]=e=>N(!0)),loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[16]||(l[16]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Oy,[s("span",Ay,[y(" 共 "+v(k.value.length)+" 个插件 ",1),k.value.length>0?(n(),t(m,{key:0},[y(" · 已安装: "+v(L.value)+" · 未安装: "+v(k.value.length-L.value),1)],64)):o("",!0)])]),s("div",Ly,[r(c(re),{value:_.value,"onUpdate:value":l[5]||(l[5]=e=>_.value=e),placeholder:"搜索插件...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:C.value,"onUpdate:value":l[6]||(l[6]=e=>C.value=e),options:A,size:"small",class:"filter-select"},null,8,["value"])]),s("div",Ey,[r(c(Q),{show:h.value},{default:u(()=>[0!==E.value.length||h.value?(n(),t("div",Ny,[(n(!0),t(m,null,f(E.value,e=>(n(),g(Kg,{key:e.key,plugin:e,installing:!!I.value[e.key],uninstalling:!!T.value[e.key],onInstall:R,onUninstall:B,onClick:H},null,8,["plugin","installing","uninstalling"]))),128))])):(n(),t("div",Dy,[r(c(ee),{description:D.value},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(Xe))]),_:1})]),extra:u(()=>[0===k.value.length?(n(),g(c(K),{key:0,size:"small",onClick:l[7]||(l[7]=e=>U.value=!0)},{default:u(()=>[...l[17]||(l[17]=[y("配置仓库源",-1)])]),_:1})):o("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),s("div",Fy,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),s("span",null,"安装/卸载后需重启 "+v(O.value)+" 生效",1)]),r(ry,{visible:U.value,"onUpdate:visible":l[8]||(l[8]=e=>U.value=e),platform:j.value,onUpdated:N},null,8,["visible","platform"]),r(Iy,{visible:S.value,"onUpdate:visible":l[9]||(l[9]=e=>S.value=e),plugin:z.value,platform:j.value,onUpdated:N},null,8,["visible","plugin","platform"])],2))}},[["__scopeId","data-v-af303661"]]),By=Pl({__name:"PluginsDrawer",props:{visible:Boolean},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(600),i=w({get:()=>l.visible,set:e=>t("update:visible",e)});return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:""},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},[s("span",null,"Plugins")],-1)])]),default:u(()=>[r(Ry,{onBack:a[0]||(a[0]=e=>i.value=!1),"hide-back":!0,"in-drawer":!0,"drawer-visible":i.value},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-5d79a115"]]),Hy="/workspaces";async function qy(){return(await dt.get(`${Hy}/available-projects`)).data}const Ky={class:"card-header"},Gy={class:"card-title"},Wy={class:"name"},Vy={class:"card-body"},Jy={key:0,class:"info-row"},Zy={class:"value"},Yy={class:"info-row"},Xy={class:"value"},Qy={class:"info-row"},eh={class:"value path"},ah={key:1,class:"info-row"},lh={class:"value"},th=Pl({__name:"WorkspaceCard",props:{workspace:{type:Object,required:!0}},emits:["click","view","delete"],setup:e=>(a,l)=>{return n(),t("div",{class:"workspace-card",onClick:l[3]||(l[3]=l=>a.$emit("click",e.workspace))},[s("div",Ky,[s("div",Gy,[s("span",Wy,v(e.workspace.name),1),r(c(G),{type:e.workspace.exists?"success":"error",size:"small"},{default:u(()=>[y(v(e.workspace.exists?"存在":"不存在"),1)]),_:1},8,["type"])]),s("div",{class:"card-actions",onClick:l[2]||(l[2]=p(()=>{},["stop"]))},[r(c(K),{text:"",size:"small",onClick:l[0]||(l[0]=l=>a.$emit("view",e.workspace))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(sl))]),_:1})]),_:1}),r(c(K),{text:"",size:"small",type:"error",onClick:l[1]||(l[1]=l=>a.$emit("delete",e.workspace))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),_:1})])]),s("div",Vy,[e.workspace.description?(n(),t("div",Jy,[l[4]||(l[4]=s("span",{class:"label"},"描述",-1)),s("span",Zy,v(e.workspace.description),1)])):o("",!0),s("div",Yy,[l[5]||(l[5]=s("span",{class:"label"},"项目数",-1)),s("span",Xy,v(e.workspace.projectCount||0),1)]),s("div",Qy,[l[6]||(l[6]=s("span",{class:"label"},"路径",-1)),s("span",eh,v(e.workspace.path),1)]),e.workspace.lastUsed?(n(),t("div",ah,[l[7]||(l[7]=s("span",{class:"label"},"最后使用",-1)),s("span",lh,v((i=e.workspace.lastUsed,i?new Date(i).toLocaleString("zh-CN"):"-")),1)])):o("",!0)])]);var i}},[["__scopeId","data-v-74e07bc9"]]),nh="/config-templates";async function sh(){return(await dt.get(nh)).data}async function oh(){return(await dt.get(`${nh}/available-configs`)).data}const ih={class:"project-item"},rh={class:"item-header"},uh={class:"item-title"},ch={class:"item-body"},dh={key:2,class:"git-options"},ph={key:0,class:"branch-inputs"},vh=Pl({__name:"ProjectItem",props:{project:{type:Object,required:!0},index:{type:Number,required:!0},existingOptions:{type:Array,default:()=>[]}},emits:["remove","select-existing"],setup(e){const a=e;async function l(){if(a.project.sourcePath)try{const e=await async function(e){const a=encodeURIComponent(e);return(await dt.get(`${Hy}/check-git/${a}`)).data}(a.project.sourcePath);e.success&&(a.project.isGitRepo=e.data.isGitRepo,e.data.isGitRepo&&!a.project.createWorktree&&(a.project.createWorktree=!0))}catch(e){}}return(a,i)=>(n(),t("div",ih,[s("div",rh,[s("span",uh,"项目 "+v(e.index+1),1),r(c(K),{text:"",size:"tiny",type:"error",onClick:i[0]||(i[0]=e=>a.$emit("remove"))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ke))]),_:1})]),_:1})]),s("div",ch,[e.project.fromExisting?(n(),t(m,{key:0},[r(c(te),{value:e.project.selectedKey,"onUpdate:value":[i[1]||(i[1]=a=>e.project.selectedKey=a),i[2]||(i[2]=l=>a.$emit("select-existing",e.index,l))],options:e.existingOptions,placeholder:"选择已有项目",filterable:"",size:"small"},null,8,["value","options"]),r(c(re),{value:e.project.sourcePath,placeholder:"项目路径",disabled:"",size:"small"},null,8,["value"])],64)):(n(),t(m,{key:1},[r(c(re),{value:e.project.sourcePath,"onUpdate:value":i[3]||(i[3]=a=>e.project.sourcePath=a),placeholder:"项目源路径",size:"small",onBlur:l},null,8,["value"]),r(c(re),{value:e.project.name,"onUpdate:value":i[4]||(i[4]=a=>e.project.name=a),placeholder:"软链接名称(可选)",size:"small"},null,8,["value"])],64)),e.project.isGitRepo?(n(),t("div",dh,[r(c(xe),{checked:e.project.createWorktree,"onUpdate:checked":i[5]||(i[5]=a=>e.project.createWorktree=a),size:"small"},{default:u(()=>[...i[8]||(i[8]=[y(" 创建 Git Worktree ",-1)])]),_:1},8,["checked"]),e.project.createWorktree?(n(),t("div",ph,[r(c(re),{value:e.project.branch,"onUpdate:value":i[6]||(i[6]=a=>e.project.branch=a),placeholder:"分支名(留空使用当前分支)",size:"small",style:{flex:"1"}},null,8,["value"]),r(c(re),{value:e.project.baseBranch,"onUpdate:value":i[7]||(i[7]=a=>e.project.baseBranch=a),placeholder:"基于分支(可选,如 main)",size:"small",style:{flex:"1"}},null,8,["value"])])):o("",!0),e.project.createWorktree&&e.project.branch?(n(),g(c(V),{key:1,depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:u(()=>[e.project.baseBranch?(n(),t(m,{key:0},[y(' ℹ️ 如果分支 "'+v(e.project.branch)+'" 不存在,将基于 "'+v(e.project.baseBranch)+'" 创建 ',1)],64)):(n(),t(m,{key:1},[y(' ℹ️ 如果分支 "'+v(e.project.branch)+'" 不存在,将基于源仓库当前分支创建 ',1)],64))]),_:1})):o("",!0)])):o("",!0),e.project.isGitRepo?(n(),g(c(V),{key:3,depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...i[9]||(i[9]=[y("✓ Git 仓库",-1)])]),_:1})):o("",!0)])]))}},[["__scopeId","data-v-659e4dc9"]]),mh={class:"projects-section"},fh={class:"projects-actions"},gh={key:0,class:"projects-list"},yh=Pl({__name:"WorkspaceFormModal",props:{show:{type:Boolean,default:!1}},emits:["update:show","success"],setup(e,{emit:a}){const o=e,i=a,d=Ie(),v=l(null),h=l(!1),b=l([]),k=l([]),_=w({get:()=>o.show,set:e=>i("update:show",e)}),C=l({name:"",description:"",baseDir:"",configTemplateId:null,projects:[]}),U={name:[{required:!0,message:"请输入工作区名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_\-\u4e00-\u9fa5]+$/,message:"名称只能包含字母、数字、下划线、中划线和中文",trigger:"blur"}],projects:[{type:"array",required:!0,min:1,message:"至少需要添加一个项目",trigger:"blur"}]},S=w(()=>b.value.map(e=>({label:e.name,value:e.id}))),z=w(()=>k.value.map(e=>({label:`${e.displayName||e.name} (${e.channel})${e.isGitRepo?" [Git]":""}`,value:`${e.channel}::${e.name}`,path:e.fullPath||e.name,isGitRepo:e.isGitRepo})));function I(e){C.value.projects.push({sourcePath:"",name:"",createWorktree:!1,branch:"",baseBranch:"",isGitRepo:!1,fromExisting:e,selectedKey:""})}function T(e,a){const l=z.value.find(e=>e.value===a);if(!l)return;const t=C.value.projects[e];t.sourcePath=l.path,t.name=l.path.split("/").pop(),t.isGitRepo=l.isGitRepo,t.createWorktree=l.isGitRepo}async function P(){var e;try{await(null==(e=v.value)?void 0:e.validate());for(const e of C.value.projects)if(!e.sourcePath)return void d.error("请填写项目路径");h.value=!0;const a=await async function(e){return(await dt.post(Hy,e)).data}(C.value);a.success?(d.success("工作区创建成功"),C.value={name:"",description:"",baseDir:"",configTemplateId:null,projects:[]},i("success")):d.error(a.message||"创建失败")}catch(a){const e=a.message||"创建失败";e.includes("\n")?d.warning(e,{duration:8e3}):d.error(e),a.errors}finally{h.value=!1}}return x(_,e=>{e&&async function(){try{const[e,a]=await Promise.all([sh(),qy()]);e.success&&(b.value=e.data||[]),a.success&&(k.value=Array.isArray(a.data)?a.data:[])}catch(e){}}()}),(e,a)=>(n(),g(c(ie),{show:_.value,"onUpdate:show":a[8]||(a[8]=e=>_.value=e),preset:"card",title:"创建工作区",style:{width:"650px"},"mask-closable":!1},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:a[7]||(a[7]=e=>_.value=!1)},{default:u(()=>[...a[12]||(a[12]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:P,loading:h.value},{default:u(()=>[...a[13]||(a[13]=[y("创建",-1)])]),_:1},8,["loading"])]),_:1})]),default:u(()=>[r(c(ae),{ref_key:"formRef",ref:v,model:C.value,rules:U,"label-placement":"left","label-width":"100"},{default:u(()=>[r(c(le),{label:"工作区名称",path:"name"},{default:u(()=>[r(c(re),{value:C.value.name,"onUpdate:value":a[0]||(a[0]=e=>C.value.name=e),placeholder:"输入工作区名称",onKeydown:a[1]||(a[1]=O(p(()=>{},["prevent"]),["enter"]))},null,8,["value"])]),_:1}),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:C.value.description,"onUpdate:value":a[2]||(a[2]=e=>C.value.description=e),placeholder:"可选描述",type:"textarea",rows:2},null,8,["value"])]),_:1}),r(c(le),{label:"基础目录",path:"baseDir"},{default:u(()=>[r(c(re),{value:C.value.baseDir,"onUpdate:value":a[3]||(a[3]=e=>C.value.baseDir=e),placeholder:"留空则使用第一个项目的父目录"},null,8,["value"])]),_:1}),r(c(le),{label:"配置模板",path:"configTemplateId"},{default:u(()=>[r(c(te),{value:C.value.configTemplateId,"onUpdate:value":a[4]||(a[4]=e=>C.value.configTemplateId=e),options:S.value,placeholder:"选择配置模板",clearable:""},null,8,["value","options"])]),_:1}),r(c(le),{label:"项目列表",path:"projects"},{default:u(()=>[s("div",mh,[s("div",fh,[r(c(K),{size:"small",dashed:"",onClick:a[5]||(a[5]=e=>I(!1))},{default:u(()=>[...a[9]||(a[9]=[y("添加项目",-1)])]),_:1}),r(c(K),{size:"small",dashed:"",onClick:a[6]||(a[6]=e=>I(!0))},{default:u(()=>[...a[10]||(a[10]=[y("添加已有项目",-1)])]),_:1})]),C.value.projects.length>0?(n(),t("div",gh,[(n(!0),t(m,null,f(C.value.projects,(e,a)=>(n(),g(vh,{key:a,project:e,index:a,"existing-options":z.value,onRemove:e=>function(e){C.value.projects.splice(e,1)}(a),onSelectExisting:T},null,8,["project","index","existing-options","onRemove"]))),128))])):(n(),g(c(V),{key:1,depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[11]||(a[11]=[y("请添加至少一个项目",-1)])]),_:1}))])]),_:1})]),_:1},8,["model"])]),_:1},8,["show"]))}},[["__scopeId","data-v-7ba95e40"]]),hh={class:"section-title"},bh={key:0,class:"projects-list"},wh={class:"proj-name"},kh={class:"proj-path"},_h=Pl({__name:"WorkspaceDetailModal",props:{show:{type:Boolean,default:!1},workspace:{type:Object,default:null}},emits:["update:show","deleted"],setup(e,{emit:a}){const i=e,d=a,p=Ie(),h=w({get:()=>i.show,set:e=>d("update:show",e)}),b=l(null);function k(e){return e?new Date(e).toLocaleString("zh-CN"):"-"}async function _(){var e;if(null==(e=i.workspace)?void 0:e.id)try{const e=await async function(e){return(await dt.get(`${Hy}/${e}`)).data}(i.workspace.id);e.success&&(b.value=e.data)}catch(a){}}async function C(e){var a;if(null==(a=i.workspace)?void 0:a.id)try{const a=await async function(e,a,l=null){return(await dt.post(`${Hy}/${e}/launch`,{tool:a,projectName:l})).data}(i.workspace.id,e);if(a.success){const e=`cd "${a.data.cwd}" && ${a.data.command}`,l=await no(e);if("manual"===(null==l?void 0:l.method))return void p.warning("自动复制失败,已弹出手动复制框");p.success("启动命令已复制到剪贴板")}else p.error(a.message||"获取命令失败")}catch(l){p.error("获取命令失败: "+l.message)}}return x(h,e=>{e&&i.workspace&&_()}),(a,l)=>(n(),g(c(ie),{show:h.value,"onUpdate:show":l[3]||(l[3]=e=>h.value=e),preset:"card",title:"工作区详情",style:{width:"700px"}},{default:u(()=>{var a,i,d,p;return[e.workspace?(n(),t(m,{key:0},[r(c(Te),{column:1,bordered:"",size:"small"},{default:u(()=>[r(c(Pe),{label:"名称"},{default:u(()=>[y(v(e.workspace.name),1)]),_:1}),r(c(Pe),{label:"描述"},{default:u(()=>[y(v(e.workspace.description||"-"),1)]),_:1}),r(c(Pe),{label:"路径"},{default:u(()=>[y(v(e.workspace.path),1)]),_:1}),r(c(Pe),{label:"状态"},{default:u(()=>[r(c(G),{type:e.workspace.exists?"success":"error",size:"small"},{default:u(()=>[y(v(e.workspace.exists?"存在":"不存在"),1)]),_:1},8,["type"])]),_:1}),r(c(Pe),{label:"创建时间"},{default:u(()=>[y(v(k(e.workspace.createdAt)),1)]),_:1}),r(c(Pe),{label:"最后使用"},{default:u(()=>[y(v(k(e.workspace.lastUsed)),1)]),_:1})]),_:1}),r(c(me)),l[8]||(l[8]=s("div",{class:"section-title"},"启动 CLI 工具",-1)),r(c(se),null,{default:u(()=>[r(c(K),{type:"primary",size:"small",onClick:l[0]||(l[0]=e=>C("claude")),disabled:!e.workspace.exists},{default:u(()=>[...l[4]||(l[4]=[y(" Claude Code ",-1)])]),_:1},8,["disabled"]),r(c(K),{type:"info",size:"small",onClick:l[1]||(l[1]=e=>C("codex")),disabled:!e.workspace.exists},{default:u(()=>[...l[5]||(l[5]=[y(" Codex ",-1)])]),_:1},8,["disabled"]),r(c(K),{type:"success",size:"small",onClick:l[2]||(l[2]=e=>C("gemini")),disabled:!e.workspace.exists},{default:u(()=>[...l[6]||(l[6]=[y(" Gemini CLI ",-1)])]),_:1},8,["disabled"])]),_:1}),r(c(V),{depth:"3",style:{display:"block","margin-top":"6px","font-size":"11px"}},{default:u(()=>[...l[7]||(l[7]=[y(" 点击按钮将复制启动命令到剪贴板 ",-1)])]),_:1}),r(c(me)),s("div",hh,"包含项目 ("+v((null==(i=null==(a=b.value)?void 0:a.projects)?void 0:i.length)||0)+")",1),(null==(p=null==(d=b.value)?void 0:d.projects)?void 0:p.length)?(n(),t("div",bh,[(n(!0),t(m,null,f(b.value.projects,(e,a)=>(n(),t("div",{class:"project-row",key:a},[r(c(G),{type:e.sourceExists?"success":"error",size:"small"},{default:u(()=>[y(v(e.sourceExists?"✓":"✗"),1)]),_:2},1032,["type"]),s("span",wh,v(e.name),1),s("span",kh,v(e.sourcePath),1)]))),128))])):(n(),g(c(ee),{key:1,description:"暂无项目",size:"small"}))],64)):o("",!0)]}),_:1},8,["show"]))}},[["__scopeId","data-v-bbe7f5de"]]),xh={key:0,class:"panel-header"},Ch={class:"header-left"},Uh={class:"header-right"},Sh={key:1,class:"drawer-header-bar"},zh={class:"header-right"},Ih={class:"stats-bar"},Th={class:"stats-text"},Ph={class:"filter-bar"},Mh={class:"panel-content"},$h={key:0,class:"empty-state"},jh={key:1,class:"card-list"},Oh={class:"panel-footer"},Ah=Pl({__name:"WorkspacePanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1}},emits:["back","updated"],setup(e,{emit:a}){const i=e,p=a,h=Ie(),k=Me(),_=l(!1),C=l([]),U=l(""),S=l(!1),z=l(!1),I=l(null),T=w(()=>{if(!U.value.trim())return C.value;const e=U.value.toLowerCase();return C.value.filter(a=>{var l,t,n;return(null==(l=a.name)?void 0:l.toLowerCase().includes(e))||(null==(t=a.description)?void 0:t.toLowerCase().includes(e))||(null==(n=a.path)?void 0:n.toLowerCase().includes(e))})});async function P(){_.value=!0;try{const e=await async function(){return(await dt.get(Hy)).data}();e.success&&(C.value=e.data||[])}catch(e){h.error("加载工作区失败: "+e.message)}finally{_.value=!1}}function M(e){I.value=e,z.value=!0}function $(e){k.warning({title:"确认删除",content:`确定要删除工作区"${e.name}"吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{const a=await async function(e,a=!1){return(await dt.delete(`${Hy}/${e}`,{params:{removeFiles:a}})).data}(e.id,!1);a.success?(h.success("删除成功"),P(),p("updated")):h.error(a.message||"删除失败")}catch(a){h.error("删除失败: "+a.message)}}})}function j(){S.value=!1,P(),p("updated")}return b(()=>P()),x(()=>i.drawerVisible,e=>{e&&P()}),(a,l)=>(n(),t("div",{class:d(["workspace-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?o("",!0):(n(),t("div",xh,[s("div",Ch,[e.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[7]||(l[7]=s("span",{class:"panel-title"},"工作区管理",-1))]),s("div",Uh,[r(c(K),{text:"",onClick:l[1]||(l[1]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:P,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[9]||(l[9]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),t("div",Sh,[s("div",zh,[r(c(K),{text:"",onClick:l[2]||(l[2]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[10]||(l[10]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:P,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[11]||(l[11]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Ih,[s("span",Th," 共 "+v(C.value.length)+" 个工作区 ",1)]),s("div",Ph,[r(c(re),{value:U.value,"onUpdate:value":l[3]||(l[3]=e=>U.value=e),placeholder:"搜索工作区...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"])]),s("div",Mh,[r(c(Q),{show:_.value},{default:u(()=>[0!==T.value.length||_.value?(n(),t("div",jh,[(n(!0),t(m,null,f(T.value,e=>(n(),g(th,{key:e.id,workspace:e,onClick:M,onView:M,onDelete:$},null,8,["workspace"]))),128))])):(n(),t("div",$h,[r(c(ee),{description:"暂无工作区"},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(Za))]),_:1})]),extra:u(()=>[r(c(K),{size:"small",onClick:l[4]||(l[4]=e=>S.value=!0)},{default:u(()=>[...l[12]||(l[12]=[y("创建第一个工作区",-1)])]),_:1})]),_:1})]))]),_:1},8,["show"])]),s("div",Oh,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),l[13]||(l[13]=s("span",null,"工作区用于管理多个项目的统一开发环境",-1))]),r(yh,{show:S.value,"onUpdate:show":l[5]||(l[5]=e=>S.value=e),onSuccess:j},null,8,["show"]),r(_h,{show:z.value,"onUpdate:show":l[6]||(l[6]=e=>z.value=e),workspace:I.value,onDeleted:P},null,8,["show","workspace"])],2))}},[["__scopeId","data-v-17320bd7"]]),Lh=Pl({__name:"WorkspaceDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(700,600),i=w({get:()=>l.visible,set:e=>t("update:visible",e)}),d={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1,"body-content-style":d},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},"工作区管理",-1)])]),default:u(()=>[r(Ah,{"in-drawer":!0,"hide-back":!0,"drawer-visible":i.value,onBack:a[0]||(a[0]=e=>i.value=!1)},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b05f985c"]]),Eh={class:"card-header"},Dh={class:"card-title"},Nh={class:"name"},Fh={class:"card-body"},Rh={key:0,class:"description"},Bh={class:"stats"},Hh={key:0},qh={key:1},Kh={key:2},Gh={key:3},Wh={key:4},Vh=Pl({__name:"ConfigTemplateCard",props:{template:{type:Object,required:!0},deleting:{type:Boolean,default:!1}},emits:["click","apply","preview","edit","delete"],setup(e){const a=e;const l={claude:{label:"Claude",color:"#cc785c",textColor:"#fff",borderColor:"#cc785c"},codex:{label:"Codex",color:"#10a37f",textColor:"#fff",borderColor:"#10a37f"},gemini:{label:"Gemini",color:"#4285f4",textColor:"#fff",borderColor:"#4285f4"},opencode:{label:"OpenCode",color:"#ff6b35",textColor:"#fff",borderColor:"#ff6b35"}},i={claude:"CLAUDE.md",codex:"AGENTS.md",gemini:"GEMINI.md",opencode:".opencode/AGENTS.md"};function d(e){var a;return(null==(a=l[e])?void 0:a.label)||e}function m(e){const a=l[e];return a?{color:a.color,textColor:a.textColor,borderColor:a.borderColor}:{}}const f=w(()=>{var e,l;const t=a.template,n=null==t?void 0:t.cliType;if(!n||"all"===n)return null;const s=null==(e=null==t?void 0:t.aiConfigs)?void 0:e[n];return(null==s?void 0:s.enabled)?i[n]||null:"claude"===n&&(null==(l=null==t?void 0:t.claudeMd)?void 0:l.enabled)?"CLAUDE.md":null});return(a,l)=>{var i,h,b,w,k,_;return n(),t("div",{class:"template-card",onClick:l[5]||(l[5]=l=>a.$emit("click",e.template))},[s("div",Eh,[s("div",Dh,[s("span",Nh,v(e.template.name),1),e.template.cliType?(n(),g(c(G),{key:0,size:"small",color:m(e.template.cliType),round:""},{default:u(()=>[y(v(d(e.template.cliType)),1)]),_:1},8,["color"])):o("",!0)]),s("div",{class:"card-actions",onClick:l[4]||(l[4]=p(()=>{},["stop"]))},[r(c(K),{size:"small",type:"primary",onClick:l[0]||(l[0]=l=>a.$emit("apply",e.template))},{default:u(()=>[...l[6]||(l[6]=[y("应用",-1)])]),_:1}),r(c(K),{size:"small",onClick:l[1]||(l[1]=l=>a.$emit("preview",e.template))},{default:u(()=>[...l[7]||(l[7]=[y("预览",-1)])]),_:1}),r(c(K),{size:"small",onClick:l[2]||(l[2]=l=>a.$emit("edit",e.template))},{default:u(()=>[...l[8]||(l[8]=[y("编辑",-1)])]),_:1}),r(c(K),{size:"small",type:"error",loading:e.deleting,onClick:l[3]||(l[3]=l=>a.$emit("delete",e.template))},{default:u(()=>[...l[9]||(l[9]=[y("删除",-1)])]),_:1},8,["loading"])])]),s("div",Fh,[e.template.description?(n(),t("div",Rh,v((k=e.template.description,_=80,(null==k?void 0:k.length)>_?k.slice(0,_)+"...":k)),1)):o("",!0),s("div",Bh,[f.value?(n(),t("span",Hh,v(f.value),1)):o("",!0),(null==(i=e.template.skills)?void 0:i.length)?(n(),t("span",qh,v(e.template.skills.length)+" Skills",1)):o("",!0),(null==(h=e.template.agents)?void 0:h.length)?(n(),t("span",Kh,v(e.template.agents.length)+" Agents",1)):o("",!0),(null==(b=e.template.commands)?void 0:b.length)?(n(),t("span",Gh,v(e.template.commands.length)+" Commands",1)):o("",!0),(null==(w=e.template.mcpServers)?void 0:w.length)?(n(),t("span",Wh,v(e.template.mcpServers.length)+" MCP",1)):o("",!0)])])])}}},[["__scopeId","data-v-02393d07"]]),Jh=["innerHTML"],Zh=Pl({__name:"MarkdownViewer",props:{content:{type:String,default:""}},setup(e){const a=e;function l(e,a){ml.getLanguage(e)||ml.registerLanguage(e,a)}l("javascript",fl),l("typescript",bl),l("json",hl),l("bash",yl),l("shell",yl),l("sh",yl),l("python",gl),l("css",wl),l("xml",kl),l("html",kl);const s=new xl({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&ml.getLanguage(a))try{return'<pre class="hljs"><code>'+ml.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(l){}return'<pre class="hljs"><code>'+s.utils.escapeHtml(e)+"</code></pre>"}}),o=w(()=>s.render(a.content||""));return(e,a)=>(n(),t("div",{class:"markdown-viewer",innerHTML:o.value},null,8,Jh))}},[["__scopeId","data-v-9e29f753"]]),Yh={class:"ai-config-header"},Xh={key:0,class:"prompt-preview"},Qh={class:"ai-config-header"},eb={class:"ai-config-header"},ab={class:"ai-config-header"},lb=Pl({__name:"ConfigTemplateFormModal",props:{show:Boolean,template:Object,availableConfigs:{type:Object,default:()=>({})}},emits:["update:show","success"],setup(e,{emit:a}){const i=e,d=a,p=Ie(),f=l(null),h=l(!1),b=[{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"}],k={claude:{skills:!0,agents:!0,commands:!0},codex:{skills:!0,agents:!0,commands:!0},gemini:{skills:!0,agents:!1,commands:!1},opencode:{skills:!0,agents:!0,commands:!0}},_=w(()=>{var e;return!!(null==(e=i.template)?void 0:e.id)}),C=l({name:"",description:"",cliType:"",aiConfigs:{claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""}},claudeMd:{enabled:!1,content:""},skills:[],agents:[],commands:[],mcpServers:[]});const U={name:{required:!0,message:"请输入模版名称",trigger:"blur"},cliType:{required:!0,message:"请选择 CLI 工具类型",trigger:"change"}},S=w(()=>{var e;const a=C.value.cliType,l=(null==(e=i.availableConfigs)?void 0:e.skillsByPlatform)||{};return(a&&l[a]?l[a]:[]).map(e=>({value:e.directory,label:e.name?`${e.name} (${e.directory})`:e.directory,disabled:!1}))}),z=w(()=>{var e;return((null==(e=i.availableConfigs)?void 0:e.agents)||[]).map(e=>({value:e.fileName,label:e.name||e.fileName,disabled:!1}))}),I=w(()=>{var e;return((null==(e=i.availableConfigs)?void 0:e.commands)||[]).map(e=>({value:e.namespace?`${e.namespace}/${e.name}`:e.name,label:e.namespace?`${e.namespace}/${e.name}`:e.name,disabled:!1}))}),T=w(()=>{var e,a;const l=(null==(e=i.availableConfigs)?void 0:e.mcpServers)||[],t=(null==(a=i.availableConfigs)?void 0:a.mcpPresets)||[],n=[...l.map(e=>({value:e.id,label:e.name||e.id})),...t.map(e=>({value:e.id,label:`${e.name} (预设)`}))],s=new Set;return n.filter(e=>!s.has(e.value)&&(s.add(e.value),!0))}),P=l(null),M=w(()=>{var e;return((null==(e=i.availableConfigs)?void 0:e.prompts)||[]).map(e=>({value:e.id,label:e.isBuiltin?`[内置] ${e.name}`:e.name,description:e.description}))}),$=w({get:()=>C.value.skills.map(e=>e.directory),set:e=>{var a;const l=C.value.cliType,t=(null==(a=i.availableConfigs)?void 0:a.skillsByPlatform)||{},n=l&&t[l]?t[l]:[];C.value.skills=e.map(e=>{const a=n.find(a=>a.directory===e);return a?{...a}:{directory:e,name:e}})}}),j=w({get:()=>C.value.agents.map(e=>e.fileName),set:e=>{var a;const l=(null==(a=i.availableConfigs)?void 0:a.agents)||[];C.value.agents=e.map(e=>{const a=l.find(a=>a.fileName===e);return a?{...a}:{fileName:e}})}}),O=w({get:()=>C.value.commands.map(e=>e.namespace?`${e.namespace}/${e.name}`:e.name),set:e=>{var a;const l=(null==(a=i.availableConfigs)?void 0:a.commands)||[];C.value.commands=e.map(e=>{const a=l.find(a=>(a.namespace?`${a.namespace}/${a.name}`:a.name)===e);return a?{...a}:{name:e}})}});function A(e){var a;if(!e)return void(C.value.aiConfigs.claude.content="");const l=((null==(a=i.availableConfigs)?void 0:a.prompts)||[]).find(a=>a.id===e);l&&(C.value.aiConfigs.claude.enabled=!0,C.value.aiConfigs.claude.content=l.content)}async function L(){var e;try{await(null==(e=f.value)?void 0:e.validate())}catch{return}h.value=!0;try{const e={...C.value};let a;a=_.value?await async function(e,a){return(await dt.put(`${nh}/${e}`,a)).data}(i.template.id,e):await async function(e){return(await dt.post(nh,e)).data}(e),a.success?(p.success(_.value?"保存成功":"创建成功"),d("success")):p.error(a.message||"操作失败")}catch(a){p.error("操作失败: "+a.message)}finally{h.value=!1}}return x(()=>i.show,e=>{if(e)if(P.value=null,i.template){let e={claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""}};if(i.template.aiConfigs)for(const a of["claude","codex","gemini","opencode"])i.template.aiConfigs[a]&&(e[a]={...i.template.aiConfigs[a]});else i.template.claudeMd&&(e.claude={...i.template.claudeMd});C.value={name:i.template.name||"",description:i.template.description||"",cliType:i.template.cliType||"",aiConfigs:e,claudeMd:i.template.claudeMd?{...i.template.claudeMd}:{enabled:!1,content:""},skills:i.template.skills?[...i.template.skills]:[],agents:i.template.agents?[...i.template.agents]:[],commands:i.template.commands?[...i.template.commands]:[],mcpServers:i.template.mcpServers?[...i.template.mcpServers]:[]}}else C.value={name:"",description:"",cliType:"",aiConfigs:{claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""}},claudeMd:{enabled:!1,content:""},skills:[],agents:[],commands:[],mcpServers:[]}}),x(()=>C.value.cliType,e=>{const a=k[e];a&&(a.skills||(C.value.skills=[]),a.agents||(C.value.agents=[]),a.commands||(C.value.commands=[]))}),(a,l)=>(n(),g(c(ie),{show:e.show,preset:"card",title:_.value?"编辑配置模版":"创建配置模版",style:{width:"850px","max-height":"90vh"},"mask-closable":!1,"onUpdate:show":l[26]||(l[26]=e=>d("update:show",e))},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:l[25]||(l[25]=e=>d("update:show",!1))},{default:u(()=>[...l[31]||(l[31]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:h.value,onClick:L},{default:u(()=>[y(v(_.value?"保存":"创建"),1)]),_:1},8,["loading"])]),_:1})]),default:u(()=>[r(c($e),{style:{"max-height":"calc(90vh - 140px)"}},{default:u(()=>[r(c(ae),{ref_key:"formRef",ref:f,model:C.value,rules:U,"label-placement":"left","label-width":"100"},{default:u(()=>[r(c(ze),{title:"基本信息",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[r(c(le),{label:"模版名称",path:"name"},{default:u(()=>[r(c(re),{value:C.value.name,"onUpdate:value":l[0]||(l[0]=e=>C.value.name=e),placeholder:"输入模版名称"},null,8,["value"])]),_:1}),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:C.value.description,"onUpdate:value":l[1]||(l[1]=e=>C.value.description=e),type:"textarea",rows:2,placeholder:"输入模版描述"},null,8,["value"])]),_:1}),r(c(le),{label:"CLI 工具",path:"cliType"},{default:u(()=>[r(c(te),{value:C.value.cliType,"onUpdate:value":l[2]||(l[2]=e=>C.value.cliType=e),options:b,placeholder:"选择 CLI 工具类型"},null,8,["value"])]),_:1})]),_:1}),C.value.cliType?o("",!0):(n(),g(c(ze),{key:0,size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[r(c(ee),{description:"请先选择 CLI 工具类型以显示配置项"})]),_:1})),"claude"===C.value.cliType?(n(),t(m,{key:1},[r(c(ze),{title:"CLAUDE.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[s("div",Yh,[r(c(se),{align:"center"},{default:u(()=>[r(c(W),{value:C.value.aiConfigs.claude.enabled,"onUpdate:value":l[3]||(l[3]=e=>C.value.aiConfigs.claude.enabled=e)},null,8,["value"]),r(c(V),{depth:C.value.aiConfigs.claude.enabled?1:3},{default:u(()=>[...l[27]||(l[27]=[y("启用 CLAUDE.md",-1)])]),_:1},8,["depth"])]),_:1})]),r(c(je),{show:C.value.aiConfigs.claude.enabled},{default:u(()=>[r(c(te),{value:P.value,"onUpdate:value":[l[4]||(l[4]=e=>P.value=e),A],options:M.value,placeholder:"选择 Prompt 预设作为 CLAUDE.md 内容",clearable:"",style:{"margin-bottom":"10px"}},null,8,["value","options"]),C.value.aiConfigs.claude.content?(n(),t("div",Xh,[r(Zh,{content:C.value.aiConfigs.claude.content},null,8,["content"])])):(n(),g(c(ee),{key:1,description:"可选择 Prompt 预设,或留空",style:{padding:"24px 0"}}))]),_:1},8,["show"])]),_:1}),r(c(ze),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.skills.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:$.value,"onUpdate:value":l[5]||(l[5]=e=>$.value=e),options:S.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.agents.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:j.value,"onUpdate:value":l[6]||(l[6]=e=>j.value=e),options:z.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.commands.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:O.value,"onUpdate:value":l[7]||(l[7]=e=>O.value=e),options:I.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:C.value.mcpServers,"onUpdate:value":l[8]||(l[8]=e=>C.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):o("",!0),"codex"===C.value.cliType?(n(),t(m,{key:2},[r(c(ze),{title:"AGENTS.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[s("div",Qh,[r(c(se),{align:"center"},{default:u(()=>[r(c(W),{value:C.value.aiConfigs.codex.enabled,"onUpdate:value":l[9]||(l[9]=e=>C.value.aiConfigs.codex.enabled=e)},null,8,["value"]),r(c(V),{depth:C.value.aiConfigs.codex.enabled?1:3},{default:u(()=>[...l[28]||(l[28]=[y("启用 AGENTS.md",-1)])]),_:1},8,["depth"])]),_:1})]),r(c(je),{show:C.value.aiConfigs.codex.enabled},{default:u(()=>[r(Up,{modelValue:C.value.aiConfigs.codex.content,"onUpdate:modelValue":l[10]||(l[10]=e=>C.value.aiConfigs.codex.content=e),rows:10,"min-height":220,placeholder:"输入 AGENTS.md 内容"},null,8,["modelValue"])]),_:1},8,["show"])]),_:1}),r(c(ze),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.skills.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:$.value,"onUpdate:value":l[11]||(l[11]=e=>$.value=e),options:S.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.agents.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:j.value,"onUpdate:value":l[12]||(l[12]=e=>j.value=e),options:z.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.commands.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:O.value,"onUpdate:value":l[13]||(l[13]=e=>O.value=e),options:I.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:C.value.mcpServers,"onUpdate:value":l[14]||(l[14]=e=>C.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):o("",!0),"gemini"===C.value.cliType?(n(),t(m,{key:3},[r(c(ze),{title:"GEMINI.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[s("div",eb,[r(c(se),{align:"center"},{default:u(()=>[r(c(W),{value:C.value.aiConfigs.gemini.enabled,"onUpdate:value":l[15]||(l[15]=e=>C.value.aiConfigs.gemini.enabled=e)},null,8,["value"]),r(c(V),{depth:C.value.aiConfigs.gemini.enabled?1:3},{default:u(()=>[...l[29]||(l[29]=[y("启用 GEMINI.md",-1)])]),_:1},8,["depth"])]),_:1})]),r(c(je),{show:C.value.aiConfigs.gemini.enabled},{default:u(()=>[r(Up,{modelValue:C.value.aiConfigs.gemini.content,"onUpdate:modelValue":l[16]||(l[16]=e=>C.value.aiConfigs.gemini.content=e),rows:10,"min-height":220,placeholder:"输入 GEMINI.md 内容"},null,8,["modelValue"])]),_:1},8,["show"])]),_:1}),r(c(ze),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.skills.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:$.value,"onUpdate:value":l[17]||(l[17]=e=>$.value=e),options:S.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:C.value.mcpServers,"onUpdate:value":l[18]||(l[18]=e=>C.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):o("",!0),"opencode"===C.value.cliType?(n(),t(m,{key:4},[r(c(ze),{title:".opencode/AGENTS.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[s("div",ab,[r(c(se),{align:"center"},{default:u(()=>[r(c(W),{value:C.value.aiConfigs.opencode.enabled,"onUpdate:value":l[19]||(l[19]=e=>C.value.aiConfigs.opencode.enabled=e)},null,8,["value"]),r(c(V),{depth:C.value.aiConfigs.opencode.enabled?1:3},{default:u(()=>[...l[30]||(l[30]=[y("启用 .opencode/AGENTS.md",-1)])]),_:1},8,["depth"])]),_:1})]),r(c(je),{show:C.value.aiConfigs.opencode.enabled},{default:u(()=>[r(Up,{modelValue:C.value.aiConfigs.opencode.content,"onUpdate:modelValue":l[20]||(l[20]=e=>C.value.aiConfigs.opencode.content=e),rows:10,"min-height":220,placeholder:"输入 .opencode/AGENTS.md 内容"},null,8,["modelValue"])]),_:1},8,["show"])]),_:1}),r(c(ze),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.skills.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:$.value,"onUpdate:value":l[21]||(l[21]=e=>$.value=e),options:S.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.agents.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:j.value,"onUpdate:value":l[22]||(l[22]=e=>j.value=e),options:z.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.commands.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:O.value,"onUpdate:value":l[23]||(l[23]=e=>O.value=e),options:I.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:C.value.mcpServers,"onUpdate:value":l[24]||(l[24]=e=>C.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):o("",!0)]),_:1},8,["model"])]),_:1})]),_:1},8,["show","title"]))}},[["__scopeId","data-v-2aaf6671"]]),tb={key:0},nb={key:1},sb={key:2},ob={key:4},ib={__name:"ConfigApplyModal",props:{show:Boolean,template:Object},emits:["update:show","success"],setup(e,{emit:a}){const i=e,d=a,p=Ie(),h=l(null),b=l(!1),k=l(!1),_=l(null),C=l(!1),U=l([]),S=l(null),z={claude:{key:"claude",name:"Claude",fileName:"CLAUDE.md",color:"#cc785c"},codex:{key:"codex",name:"Codex",fileName:"AGENTS.md",color:"#10a37f"},gemini:{key:"gemini",name:"Gemini",fileName:"GEMINI.md",color:"#4285f4"},opencode:{key:"opencode",name:"OpenCode",fileName:".opencode/AGENTS.md",color:"#ff6b35"}},I=w(()=>{var e,a;const l=null==(e=i.template)?void 0:e.aiConfigs;if(!l)return[];const t=Object.entries(l).filter(([,e])=>(null==e?void 0:e.enabled)&&(null==e?void 0:e.content)).map(([e])=>z[e]).filter(Boolean),n=null==(a=i.template)?void 0:a.cliType;if(n&&"all"!==n){const e=l[n];if((null==e?void 0:e.enabled)&&(null==e?void 0:e.content)&&z[n])return[z[n]]}return t});function T(){return I.value.map(e=>e.key)}const P=l({targetPath:"",aiConfigTypes:[]}),M={targetPath:{required:!0,message:"请输入目标路径",trigger:"blur"}},$=w(()=>{const e=new Set,a=[];for(const l of U.value){const t=l.fullPath||l.path||l.name;t&&!e.has(t)&&(e.add(t),a.push({label:`${l.displayName||l.name} (${l.channel})`,value:t}))}return a});function j(e){e&&(P.value.targetPath=e)}async function O(){if(P.value.targetPath&&i.template&&0!==P.value.aiConfigTypes.length){b.value=!0;try{const e=await async function(e,a,l=["claude"]){const t=Array.isArray(l)?l:[l];return(await dt.post(`${nh}/${e}/preview`,{targetPath:a,aiConfigTypes:t})).data}(i.template.id,P.value.targetPath,P.value.aiConfigTypes);e.success?_.value=e.data:p.error(e.message||"预览失败")}catch(e){p.error("预览失败: "+e.message)}finally{b.value=!1}}}async function A(){var e,a,l;try{await(null==(e=h.value)?void 0:e.validate())}catch{return}if(i.template&&0!==P.value.aiConfigTypes.length){k.value=!0;try{const e=await async function(e,a,l=["claude"]){const t=Array.isArray(l)?l:[l];return(await dt.post(`${nh}/${e}/apply`,{targetPath:a,aiConfigTypes:t})).data}(i.template.id,P.value.targetPath,P.value.aiConfigTypes);if(e.success){const t=(null==(l=null==(a=e.data)?void 0:a.results)?void 0:l.skipped)||[];t.length>0?p.warning(`模版已部分应用,${t.length} 项已跳过`):p.success("模版应用成功"),d("success",e.data||null)}else p.error(e.message||"应用失败")}catch(t){p.error("应用失败: "+t.message)}finally{k.value=!1}}}return x(()=>i.show,e=>{e&&(P.value.targetPath="",P.value.aiConfigTypes=T(),_.value=null,S.value=null,async function(){C.value=!0;try{const e=await qy();e.success?U.value=Array.isArray(e.data)?e.data:[]:U.value=[]}catch(e){U.value=[]}finally{C.value=!1}}())}),x(()=>i.template,()=>{P.value.aiConfigTypes=T()}),(a,l)=>{var i;return n(),g(c(ie),{show:e.show,preset:"card",title:`应用模版: ${(null==(i=e.template)?void 0:i.name)||""}`,style:{width:"650px"},"mask-closable":!1,"onUpdate:show":l[4]||(l[4]=e=>d("update:show",e))},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:l[3]||(l[3]=e=>d("update:show",!1))},{default:u(()=>[...l[14]||(l[14]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:k.value,disabled:!P.value.targetPath||0===P.value.aiConfigTypes.length,onClick:A},{default:u(()=>[...l[15]||(l[15]=[y(" 确认应用 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:u(()=>[r(c(ae),{ref_key:"formRef",ref:h,model:P.value,rules:M},{default:u(()=>[r(c(le),{label:"选择已有项目"},{default:u(()=>[r(c(te),{value:S.value,"onUpdate:value":[l[0]||(l[0]=e=>S.value=e),j],options:$.value,loading:C.value,placeholder:"选择已有项目路径",filterable:"",clearable:""},null,8,["value","options","loading"])]),_:1}),r(c(le),{label:"目标项目路径",path:"targetPath"},{default:u(()=>[r(c(re),{value:P.value.targetPath,"onUpdate:value":l[1]||(l[1]=e=>P.value.targetPath=e),placeholder:"输入项目目录路径,如 /path/to/project"},null,8,["value"])]),_:1}),I.value.length>0?(n(),g(c(le),{key:0,label:"生成配置文件"},{default:u(()=>[r(c(Ae),{value:P.value.aiConfigTypes,"onUpdate:value":l[2]||(l[2]=e=>P.value.aiConfigTypes=e)},{default:u(()=>[r(c(se),null,{default:u(()=>[(n(!0),t(m,null,f(I.value,e=>(n(),g(c(xe),{key:e.key,value:e.key},{default:u(()=>[r(c(se),{align:"center",size:4},{default:u(()=>[r(c(q),{size:16,color:e.color},{default:u(()=>[r(c(Oa))]),_:1},8,["color"]),s("span",null,v(e.name),1),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[y("("+v(e.fileName)+")",1)]),_:2},1024)]),_:2},1024)]),_:2},1032,["value"]))),128))]),_:1})]),_:1},8,["value"]),r(c(V),{depth:"3",style:{"font-size":"12px","margin-top":"4px",display:"block"}},{default:u(()=>[...l[5]||(l[5]=[y(" 可同时选择多个 CLI 配置文件 ",-1)])]),_:1})]),_:1})):o("",!0)]),_:1},8,["model"]),r(c(se),{style:{"margin-bottom":"16px"}},{default:u(()=>[r(c(K),{onClick:O,loading:b.value,disabled:!P.value.targetPath||0===P.value.aiConfigTypes.length},{default:u(()=>[...l[6]||(l[6]=[y(" 预览应用效果 ",-1)])]),_:1},8,["loading","disabled"])]),_:1}),_.value?(n(),g(c(ze),{key:0,size:"small",title:"应用预览"},{default:u(()=>[r(c(se),{vertical:""},{default:u(()=>{var e,a,s,i,d;return[_.value.summary?(n(),t("div",tb,[r(c(V),{depth:"3"},{default:u(()=>[...l[7]||(l[7]=[y("将应用:",-1)])]),_:1}),r(c(se),{style:{"margin-top":"8px"},wrap:""},{default:u(()=>[(n(!0),t(m,null,f(_.value.summary.aiConfigs,e=>{return n(),g(c(G),{key:e.type,type:(a=e.type,{claude:"warning",codex:"success",gemini:"info",opencode:"error"}[a]||"default"),size:"small"},{default:u(()=>[y(v(e.fileName),1)]),_:2},1032,["type"]);var a}),128)),_.value.summary.skills?(n(),g(c(G),{key:0,type:"info",size:"small"},{default:u(()=>[y(v(_.value.summary.skills)+" Skills",1)]),_:1})):o("",!0),_.value.summary.agents?(n(),g(c(G),{key:1,type:"info",size:"small"},{default:u(()=>[y(v(_.value.summary.agents)+" Agents",1)]),_:1})):o("",!0),_.value.summary.commands?(n(),g(c(G),{key:2,type:"info",size:"small"},{default:u(()=>[y(v(_.value.summary.commands)+" Commands",1)]),_:1})):o("",!0),_.value.summary.plugins?(n(),g(c(G),{key:3,type:"warning",size:"small"},{default:u(()=>[y(v(_.value.summary.plugins)+" Plugins",1)]),_:1})):o("",!0),_.value.summary.mcpServers?(n(),g(c(G),{key:4,type:"warning",size:"small"},{default:u(()=>[y(v(_.value.summary.mcpServers)+" MCP",1)]),_:1})):o("",!0),_.value.summary.skipped?(n(),g(c(G),{key:5,type:"error",size:"small"},{default:u(()=>[y(v(_.value.summary.skipped)+" Skipped",1)]),_:1})):o("",!0)]),_:1})])):o("",!0),r(c(me),{style:{margin:"12px 0"}}),(null==(e=_.value.willCreate)?void 0:e.length)?(n(),t("div",nb,[r(c(V),{type:"success"},{default:u(()=>[...l[8]||(l[8]=[y("将创建:",-1)])]),_:1}),r(c(Le),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),t(m,null,f(_.value.willCreate,e=>(n(),g(c(Ee),{key:e},{default:u(()=>[r(c(V),{code:""},{default:u(()=>[y(v(e),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):o("",!0),(null==(a=_.value.willOverwrite)?void 0:a.length)?(n(),t("div",sb,[r(c(V),{type:"warning"},{default:u(()=>[...l[9]||(l[9]=[y("将覆盖:",-1)])]),_:1}),r(c(Le),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),t(m,null,f(_.value.willOverwrite,e=>(n(),g(c(Ee),{key:e},{default:u(()=>[r(c(V),{code:""},{default:u(()=>[y(v(e),1)]),_:2},1024),r(c(G),{type:"warning",size:"tiny",style:{"margin-left":"8px"}},{default:u(()=>[...l[10]||(l[10]=[y("已存在",-1)])]),_:1})]),_:2},1024))),128))]),_:1})])):o("",!0),(null==(s=_.value.willOverwrite)?void 0:s.length)?(n(),g(c(fe),{key:3,type:"warning",style:{"margin-top":"8px"}},{default:u(()=>[...l[11]||(l[11]=[y(" 以上文件将被覆盖,请确认后再应用 ",-1)])]),_:1})):o("",!0),(null==(i=_.value.skipped)?void 0:i.length)?(n(),t("div",ob,[r(c(V),{type:"error"},{default:u(()=>[...l[12]||(l[12]=[y("将跳过:",-1)])]),_:1}),r(c(Le),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),t(m,null,f(_.value.skipped,(e,a)=>(n(),g(c(Ee),{key:`${e.type}-${e.item}-${a}`},{default:u(()=>[r(c(V),null,{default:u(()=>[y(v(e.type)+": ",1)]),_:2},1024),r(c(V),{code:""},{default:u(()=>[y(v(e.item),1)]),_:2},1024),r(c(V),{depth:"3"},{default:u(()=>[y(" - "+v(e.reason),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):o("",!0),(null==(d=_.value.skipped)?void 0:d.length)?(n(),g(c(fe),{key:5,type:"info",style:{"margin-top":"8px"}},{default:u(()=>[...l[13]||(l[13]=[y(" 本次将进行部分应用,以上项会被跳过。 ",-1)])]),_:1})):o("",!0)]}),_:1})]),_:1})):o("",!0)]),_:1},8,["show","title"])}}},rb={key:0,class:"preview-content"},ub={class:"info-section"},cb={class:"info-row"},db={class:"value"},pb={key:0,class:"info-row"},vb={class:"value"},mb={key:1,class:"info-row"},fb={class:"stats-section"},gb={class:"stats-grid"},yb={key:1,class:"stat-item"},hb={key:2,class:"stat-item"},bb={key:3,class:"stat-item"},wb={key:4,class:"stat-item"},kb={key:5,class:"stat-item"},_b={class:"markdown-content"},xb={class:"markdown-content"},Cb={class:"list-items"},Ub={class:"list-items"},Sb={class:"list-items"},zb={class:"list-items"},Ib=Pl({__name:"ConfigPreviewModal",props:{show:Boolean,template:Object},emits:["update:show","apply"],setup(e,{emit:a}){const l=e,i=a,d={claude:{key:"claude",name:"Claude",fileName:"CLAUDE.md",color:"#cc785c"},codex:{key:"codex",name:"Codex",fileName:"AGENTS.md",color:"#10a37f"},gemini:{key:"gemini",name:"Gemini",fileName:"GEMINI.md",color:"#4285f4"},opencode:{key:"opencode",name:"OpenCode",fileName:".opencode/AGENTS.md",color:"#ff6b35"}},p=w(()=>{var e,a;const t=null==(e=l.template)?void 0:e.aiConfigs;if(!t)return[];const n=Object.entries(t).filter(([,e])=>(null==e?void 0:e.enabled)&&(null==e?void 0:e.content)).map(([e,a])=>({...d[e],content:a.content})).filter(e=>e.key),s=null==(a=l.template)?void 0:a.cliType;if(s&&"all"!==s){const e=t[s];if((null==e?void 0:e.enabled)&&(null==e?void 0:e.content)&&d[s])return[{...d[s],content:e.content}]}return n}),h=w(()=>p.value.length>0),b=w(()=>{var e,a,t,n,s;const o=l.template;return!!o&&(h.value||(null==(e=o.claudeMd)?void 0:e.content)||(null==(a=o.skills)?void 0:a.length)||(null==(t=o.agents)?void 0:t.length)||(null==(n=o.commands)?void 0:n.length)||(null==(s=o.mcpServers)?void 0:s.length))}),k={claude:{label:"Claude",color:"#cc785c",textColor:"#fff",borderColor:"#cc785c"},codex:{label:"Codex",color:"#10a37f",textColor:"#fff",borderColor:"#10a37f"},gemini:{label:"Gemini",color:"#4285f4",textColor:"#fff",borderColor:"#4285f4"},opencode:{label:"OpenCode",color:"#ff6b35",textColor:"#fff",borderColor:"#ff6b35"}};function _(e){var a;return(null==(a=k[e])?void 0:a.label)||e}function x(e){const a=k[e];return a?{color:a.color,textColor:a.textColor,borderColor:a.borderColor}:{}}function C(){i("apply",l.template)}return(a,l)=>{var d;return n(),g(c(ie),{show:e.show,preset:"card",title:`模版预览: ${(null==(d=e.template)?void 0:d.name)||""}`,style:{width:"750px","max-height":"80vh"},"mask-closable":!0,"onUpdate:show":l[1]||(l[1]=e=>i("update:show",e))},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:l[0]||(l[0]=e=>i("update:show",!1))},{default:u(()=>[...l[7]||(l[7]=[y("关闭",-1)])]),_:1}),r(c(K),{type:"primary",onClick:C},{default:u(()=>[...l[8]||(l[8]=[y("应用此模版",-1)])]),_:1})]),_:1})]),default:u(()=>{var a,i,d,w,k;return[e.template?(n(),t("div",rb,[s("div",ub,[s("div",cb,[l[2]||(l[2]=s("span",{class:"label"},"名称:",-1)),s("span",db,v(e.template.name),1)]),e.template.description?(n(),t("div",pb,[l[3]||(l[3]=s("span",{class:"label"},"描述:",-1)),s("span",vb,v(e.template.description),1)])):o("",!0),e.template.cliType?(n(),t("div",mb,[l[4]||(l[4]=s("span",{class:"label"},"CLI 工具:",-1)),r(c(G),{size:"small",color:x(e.template.cliType),round:""},{default:u(()=>[y(v(_(e.template.cliType)),1)]),_:1},8,["color"])])):o("",!0)]),s("div",fb,[l[6]||(l[6]=s("div",{class:"section-title"},"包含配置",-1)),s("div",gb,[h.value?(n(!0),t(m,{key:0},f(p.value,e=>(n(),t("div",{class:"stat-item",key:e.key},[r(c(q),{size:"20",color:e.color},{default:u(()=>[r(c(Oa))]),_:1},8,["color"]),s("span",null,v(e.fileName),1)]))),128)):(null==(a=e.template.claudeMd)?void 0:a.enabled)?(n(),t("div",yb,[r(c(q),{size:"20"},{default:u(()=>[r(c(Oa))]),_:1}),l[5]||(l[5]=s("span",null,"CLAUDE.md",-1))])):o("",!0),(null==(i=e.template.skills)?void 0:i.length)?(n(),t("div",hb,[r(c(q),{size:"20"},{default:u(()=>[r(c(Xe))]),_:1}),s("span",null,v(e.template.skills.length)+" Skills",1)])):o("",!0),(null==(d=e.template.agents)?void 0:d.length)?(n(),t("div",bb,[r(c(q),{size:"20"},{default:u(()=>[r(c(ol))]),_:1}),s("span",null,v(e.template.agents.length)+" Agents",1)])):o("",!0),(null==(w=e.template.commands)?void 0:w.length)?(n(),t("div",wb,[r(c(q),{size:"20"},{default:u(()=>[r(c(ea))]),_:1}),s("span",null,v(e.template.commands.length)+" Commands",1)])):o("",!0),(null==(k=e.template.mcpServers)?void 0:k.length)?(n(),t("div",kb,[r(c(q),{size:"20"},{default:u(()=>[r(c(ja))]),_:1}),s("span",null,v(e.template.mcpServers.length)+" MCP Servers",1)])):o("",!0)])]),b.value?(n(),g(c(ye),{key:0,class:"details-section"},{default:u(()=>{var a,l,i,d,y;return[(n(!0),t(m,null,f(p.value,e=>(n(),g(c(he),{key:e.key,title:`${e.name} 配置 (${e.fileName})`,name:e.key},{default:u(()=>[s("div",_b,[r(Zh,{content:e.content},null,8,["content"])])]),_:2},1032,["title","name"]))),128)),!h.value&&(null==(a=e.template.claudeMd)?void 0:a.content)?(n(),g(c(he),{key:0,title:"CLAUDE.md 内容",name:"claudeMd"},{default:u(()=>[s("div",xb,[r(Zh,{content:e.template.claudeMd.content},null,8,["content"])])]),_:1})):o("",!0),(null==(l=e.template.skills)?void 0:l.length)?(n(),g(c(he),{key:1,title:"Skills 列表",name:"skills"},{default:u(()=>[s("div",Cb,[(n(!0),t(m,null,f(e.template.skills,(e,a)=>(n(),t("div",{key:a,class:"list-item"},v(e.name||e),1))),128))])]),_:1})):o("",!0),(null==(i=e.template.agents)?void 0:i.length)?(n(),g(c(he),{key:2,title:"Agents 列表",name:"agents"},{default:u(()=>[s("div",Ub,[(n(!0),t(m,null,f(e.template.agents,(e,a)=>(n(),t("div",{key:a,class:"list-item"},v(e.name||e),1))),128))])]),_:1})):o("",!0),(null==(d=e.template.commands)?void 0:d.length)?(n(),g(c(he),{key:3,title:"Commands 列表",name:"commands"},{default:u(()=>[s("div",Sb,[(n(!0),t(m,null,f(e.template.commands,(e,a)=>(n(),t("div",{key:a,class:"list-item"},v(e.name||e),1))),128))])]),_:1})):o("",!0),(null==(y=e.template.mcpServers)?void 0:y.length)?(n(),g(c(he),{key:4,title:"MCP Servers",name:"mcpServers"},{default:u(()=>[s("div",zb,[(n(!0),t(m,null,f(e.template.mcpServers,(e,a)=>(n(),t("div",{key:a,class:"list-item"},v(e.name||e),1))),128))])]),_:1})):o("",!0)]}),_:1})):o("",!0)])):o("",!0)]}),_:1},8,["show","title"])}}},[["__scopeId","data-v-dfaac83b"]]),Tb={key:0,class:"panel-header"},Pb={class:"header-left"},Mb={class:"header-right"},$b={key:1,class:"drawer-header-bar"},jb={class:"header-right"},Ob={class:"stats-bar"},Ab={class:"stats-text"},Lb={class:"filter-bar"},Eb={class:"panel-content"},Db={key:0,class:"empty-state"},Nb={key:1,class:"card-list"},Fb={class:"panel-footer"},Rb=Pl({__name:"ConfigTemplatesPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1}},emits:["back","updated"],setup(e){const a=e,i=Ie(),p=Me(),h=l(!1),k=l([]),_=l({}),C=l(""),U=l(""),S=[{label:"全部 CLI",value:""},{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"}],z=l(null),I=l(!1),T=l(!1),P=l(!1),M=l(null),$=l(null),j=l(null),O=w(()=>{let e=k.value;if(U.value&&(e=e.filter(e=>e.cliType===U.value)),C.value.trim()){const a=C.value.toLowerCase();e=e.filter(e=>{var l,t;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))})}return e});async function A(){h.value=!0;try{const[e,a]=await Promise.all([sh(),oh()]);e.success&&(k.value=e.data||[]),a.success&&(_.value=a.data||{})}catch(e){i.error("加载数据失败: "+e.message)}finally{h.value=!1}}function L(){M.value=null,I.value=!0}function E(e){M.value={...e},I.value=!0}function D(e){j.value=e,P.value=!0}function N(e){$.value=e,P.value=!1,T.value=!0}function F(e){p.warning({title:"确认删除",content:`确定要删除模版 "${e.name}" 吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{z.value=e.id;try{const a=await async function(e){return(await dt.delete(`${nh}/${e}`)).data}(e.id);a.success?(i.success("删除成功"),A()):i.error(a.message||"删除失败")}catch(a){i.error("删除失败: "+a.message)}finally{z.value=null}}})}function R(){I.value=!1,A()}function B(){T.value=!1,A()}return b(()=>A()),x(()=>a.drawerVisible,e=>{e&&A()}),(a,l)=>(n(),t("div",{class:d(["templates-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?o("",!0):(n(),t("div",Tb,[s("div",Pb,[e.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[6]||(l[6]=s("span",{class:"panel-title"},"配置模版管理",-1))]),s("div",Mb,[r(c(K),{text:"",onClick:L,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[7]||(l[7]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:A,loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),t("div",$b,[s("div",jb,[r(c(K),{text:"",onClick:L,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[9]||(l[9]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:A,loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[10]||(l[10]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Ob,[s("span",Ab," 共 "+v(k.value.length)+" 个模版 ",1)]),s("div",Lb,[r(c(re),{value:C.value,"onUpdate:value":l[1]||(l[1]=e=>C.value=e),placeholder:"搜索模版...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:U.value,"onUpdate:value":l[2]||(l[2]=e=>U.value=e),options:S,size:"small",class:"filter-select"},null,8,["value"])]),s("div",Eb,[r(c(Q),{show:h.value},{default:u(()=>[0!==O.value.length||h.value?(n(),t("div",Nb,[(n(!0),t(m,null,f(O.value,e=>(n(),g(Vh,{key:e.id,template:e,deleting:z.value===e.id,onClick:D,onPreview:D,onEdit:E,onDelete:F,onApply:N},null,8,["template","deleting"]))),128))])):(n(),t("div",Db,[r(c(ee),{description:"暂无配置模版"},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(oa))]),_:1})]),extra:u(()=>[r(c(K),{size:"small",onClick:L},{default:u(()=>[...l[11]||(l[11]=[y("创建第一个模版",-1)])]),_:1})]),_:1})]))]),_:1},8,["show"])]),s("div",Fb,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),l[12]||(l[12]=s("span",null,"配置模版可快速应用到工作区",-1))]),r(lb,{show:I.value,"onUpdate:show":l[3]||(l[3]=e=>I.value=e),template:M.value,"available-configs":_.value,onSuccess:R},null,8,["show","template","available-configs"]),r(ib,{show:T.value,"onUpdate:show":l[4]||(l[4]=e=>T.value=e),template:$.value,onSuccess:B},null,8,["show","template"]),r(Ib,{show:P.value,"onUpdate:show":l[5]||(l[5]=e=>P.value=e),template:j.value,onApply:N},null,8,["show","template"])],2))}},[["__scopeId","data-v-d262cd02"]]),Bb=Pl({__name:"ConfigTemplatesDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(700,600),i=w({get:()=>l.visible,set:e=>t("update:visible",e)}),d={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1,"body-content-style":d},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},"配置模版管理",-1)])]),default:u(()=>[r(Rb,{"in-drawer":!0,"hide-back":!0,"drawer-visible":i.value,onBack:a[0]||(a[0]=e=>i.value=!1)},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-4111b3a0"]]);const Hb={class:"drawer-header"},qb={class:"export-import-container"},Kb={class:"section"},Gb={class:"section-header"},Wb={class:"section"},Vb={class:"section-header"},Jb={key:0,class:"import-preview"},Zb={class:"preview-stats"},Yb={class:"stat-item"},Xb={class:"stat-item"},Qb={class:"stat-item"},ew=Pl({__name:"ConfigExportDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const i=e,d=a,{drawerWidth:p}=ko(520,480),m=w({get:()=>i.visible,set:e=>d("update:visible",e)}),f=l(!1),h=l(!1),b=l(null),k=l(null),_=l(null),x=l(null),C=l(!1);async function U(){f.value=!0;try{const e=await async function(e="zip"){return(await dt.get(`/config-export?format=${e}`,{responseType:"blob"})).data}("zip"),a=window.URL.createObjectURL(e),l=document.createElement("a");l.href=a,l.download=`ctx-config-${(new Date).toISOString().split("T")[0]}.zip`,document.body.appendChild(l),l.click(),document.body.removeChild(l),window.URL.revokeObjectURL(a),Un.success("配置导出成功")}catch(e){Un.error("导出失败: "+e.message)}finally{f.value=!1}}async function S({file:e}){try{b.value=null,k.value=null,_.value=null,x.value=null;const a=e.file.name||"";if(a.toLowerCase().endsWith(".zip")){const a=await async function(e){const a=await e.arrayBuffer();return(await dt.post("/config-export/preview-zip",a,{headers:{"Content-Type":"application/zip"}})).data}(e.file);return void(a.success?(b.value=a.data,_.value=e.file,k.value=null,x.value="zip",Un.success("ZIP 配置解析成功")):Un.error("ZIP 配置格式错误: "+a.message))}const l=await e.file.text(),t=JSON.parse(l),n=await async function(e){return(await dt.post("/config-export/preview",{data:e})).data}(t);n.success?(b.value=n.data,k.value=t,_.value=null,x.value="json",Un.success("配置文件解析成功")):Un.error("配置文件格式错误: "+n.message)}catch(a){Un.error("文件解析失败: "+a.message)}}async function z(){if(k.value||_.value){h.value=!0;try{const e="zip"===x.value?await async function(e,a=!1){const l=await e.arrayBuffer();return(await dt.post(`/config-export/import-zip?overwrite=${a}`,l,{headers:{"Content-Type":"application/zip"}})).data}(_.value,C.value):await async function(e,a=!1){return(await dt.post("/config-export/import",{data:e,overwrite:a})).data}(k.value,C.value);e.success?(Un.success("配置导入成功: "+e.message),I()):Un.error("配置导入失败: "+e.message)}catch(e){Un.error("导入失败: "+e.message)}finally{h.value=!1}}}function I(){b.value=null,k.value=null,_.value=null,x.value=null,C.value=!1}return(e,a)=>(n(),g(c(pe),{show:m.value,"onUpdate:show":a[1]||(a[1]=e=>m.value=e),width:c(p),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",Hb,[r(c(q),{size:20,color:"#18a058"},{default:u(()=>[r(c(Xa))]),_:1}),a[2]||(a[2]=s("span",null,"配置导出/导入",-1))])]),default:u(()=>[s("div",qb,[s("div",Kb,[s("div",Gb,[r(c(V),{strong:""},{default:u(()=>[...a[3]||(a[3]=[y("导出配置",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[4]||(a[4]=[y(" 导出所有前端配置为 ZIP(含 UI/终端/Prompts/安全等) ",-1)])]),_:1})]),r(c(K),{type:"primary",loading:f.value,onClick:U},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ha))]),_:1})]),default:u(()=>[a[5]||(a[5]=y(" 导出配置 ",-1))]),_:1},8,["loading"])]),r(c(me)),s("div",Wb,[s("div",Vb,[r(c(V),{strong:""},{default:u(()=>[...a[6]||(a[6]=[y("导入配置",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[7]||(a[7]=[y(" 从 JSON 或 ZIP 文件导入配置(支持覆盖已有配置) ",-1)])]),_:1})]),r(c(Ce),{"custom-request":S,"show-file-list":!1,accept:".json,.zip"},{default:u(()=>[r(c(K),null,{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(il))]),_:1})]),default:u(()=>[a[8]||(a[8]=y(" 选择配置文件 ",-1))]),_:1})]),_:1}),b.value?(n(),t("div",Jb,[r(c(V),{strong:"",style:{"font-size":"14px"}},{default:u(()=>[...a[9]||(a[9]=[y("导入预览",-1)])]),_:1}),s("div",Zb,[s("div",Yb,[r(c(V),{depth:"3"},{default:u(()=>[...a[10]||(a[10]=[y("配置模板:",-1)])]),_:1}),r(c(V),null,{default:u(()=>[y(v(b.value.counts.configTemplates),1)]),_:1})]),s("div",Xb,[r(c(V),{depth:"3"},{default:u(()=>[...a[11]||(a[11]=[y("频道:",-1)])]),_:1}),r(c(V),null,{default:u(()=>[y(v(b.value.counts.channels),1)]),_:1})]),s("div",Qb,[r(c(V),{depth:"3"},{default:u(()=>[...a[12]||(a[12]=[y("插件:",-1)])]),_:1}),r(c(V),null,{default:u(()=>[y(v(b.value.counts.plugins||0),1)]),_:1})])]),r(c(xe),{checked:C.value,"onUpdate:checked":a[0]||(a[0]=e=>C.value=e),style:{"margin-top":"12px"}},{default:u(()=>[...a[13]||(a[13]=[y(" 覆盖已有配置 ",-1)])]),_:1},8,["checked"]),r(c(se),{style:{"margin-top":"16px"}},{default:u(()=>[r(c(K),{type:"primary",loading:h.value,onClick:z},{default:u(()=>[...a[14]||(a[14]=[y(" 确认导入 ",-1)])]),_:1},8,["loading"]),r(c(K),{onClick:I},{default:u(()=>[...a[15]||(a[15]=[y("取消",-1)])]),_:1})]),_:1})])):o("",!0)])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-291ce9d6"]]),aw=["disabled"],lw=Pl({__name:"HeaderButton",props:{icon:{type:Object,required:!0},tooltip:{type:String,default:""},tooltipPlacement:{type:String,default:"bottom"},iconSize:{type:Number,default:18},active:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:["click"],setup(e,{emit:a}){const l=e,t=a,o=w(()=>l.disabled?"#6b7280":l.active?"#18a058":void 0);function i(){l.disabled||t("click")}return(a,l)=>(n(),g(c(ce),{placement:e.tooltipPlacement},{trigger:u(()=>[s("button",{class:d(["header-button",{active:e.active,disabled:e.disabled}]),disabled:e.disabled,onClick:i},[r(c(q),{size:e.iconSize,color:o.value},{default:u(()=>[(n(),g(z(e.icon)))]),_:1},8,["size","color"])],10,aw)]),default:u(()=>[$(a.$slots,"default",{},()=>[y(v(e.tooltip),1)],!0)]),_:3},8,["placement"]))}},[["__scopeId","data-v-f467fc1a"]]);async function tw(e=null){const a=e?{platform:e}:{};return(await dt.get("/env/check",{params:a})).data}const nw={class:"modal-header"},sw={class:"modal-content"},ow={class:"desc-text"},iw={class:"conflict-list"},rw={class:"list-header"},uw={key:0,class:"selected-hint"},cw={class:"conflict-items"},dw=["onClick"],pw={class:"item-content"},vw={class:"item-header"},mw={class:"var-name"},fw={class:"var-value"},gw={class:"var-source"},yw={class:"modal-footer"},hw=Pl({__name:"EnvConflictModal",props:{visible:{type:Boolean,default:!1},conflicts:{type:Array,default:()=>[]}},emits:["update:visible","deleted","close","ignore","never-remind"],setup(e,{emit:a}){const i=e,h=a,b=w({get:()=>i.visible,set:e=>h("update:visible",e)}),k=l(new Set),_=l(!1),x=w(()=>k.value.size),C=w(()=>i.conflicts.length>0&&k.value.size===i.conflicts.length),U=w(()=>k.value.size>0&&k.value.size<i.conflicts.length),S=w(()=>i.conflicts.length>0&&i.conflicts.every(e=>"process"===e.sourceType));function z(e){return`${e.varName}:${e.sourcePath}`}function I(e){return"process"===e.sourceType?"进程环境变量":e.sourcePath}function T(e){k.value=e?new Set(i.conflicts.map(z)):new Set}function P(){h("close")}function M(){h("ignore")}function $(){h("never-remind")}async function j(){const e=i.conflicts.filter(e=>k.value.has(z(e)));e.every(e=>"process"===e.sourceType)?Un.warning("进程环境变量无法直接删除,请手动从 shell 配置文件中移除"):Sn.warning({title:"确认删除",content:`确定要删除选中的 ${e.length} 个环境变量吗?删除前会自动备份。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{_.value=!0;try{(await async function(e){return(await dt.post("/env/delete",{conflicts:e})).data}(e)).success&&(Un.success("删除成功,备份已保存"),k.value=new Set,h("deleted"))}catch(a){Un.error("删除失败: "+a.message)}finally{_.value=!1}}})}return(a,l)=>(n(),g(c(ie),{show:b.value,"onUpdate:show":l[1]||(l[1]=e=>b.value=e),preset:"card",title:null,bordered:!1,closable:!0,"mask-closable":!1,style:{width:"560px","max-width":"90vw"},onClose:P},{header:u(()=>[s("div",nw,[r(c(q),{class:"warning-icon",size:22},{default:u(()=>[r(c(Ia))]),_:1}),l[2]||(l[2]=s("span",{class:"header-title"},"检测到环境变量冲突",-1))])]),footer:u(()=>[s("div",yw,[r(c(K),{tertiary:"",onClick:M},{default:u(()=>[...l[8]||(l[8]=[y(" 暂时忽略 ",-1)])]),_:1}),r(c(K),{tertiary:"",onClick:$},{default:u(()=>[...l[9]||(l[9]=[y(" 不再提醒 ",-1)])]),_:1}),S.value?o("",!0):(n(),g(c(K),{key:0,type:"error",disabled:0===x.value,loading:_.value,onClick:j},{default:u(()=>[y(" 删除选中 ("+v(x.value)+") ",1)]),_:1},8,["disabled","loading"]))])]),default:u(()=>[s("div",sw,[s("p",ow,[l[3]||(l[3]=y(" 发现 ",-1)),s("strong",null,v(e.conflicts.length),1),l[4]||(l[4]=y(" 个环境变量可能影响代理配置,建议清理后再使用代理功能。 ",-1))]),S.value?(n(),g(c(fe),{key:0,type:"info",bordered:!1,class:"process-env-alert"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ma))]),_:1})]),default:u(()=>[l[5]||(l[5]=s("div",{class:"alert-content"},[s("p",{class:"alert-title"},"这些环境变量来自当前进程,请按以下步骤处理:"),s("ol",{class:"alert-list"},[s("li",null,"检查对应 shell 配置文件(如 ~/.zshrc、~/.bashrc 或 PowerShell Profile)中是否有这些变量"),s("li",null,"如果有,删除或注释掉相关行"),s("li",null,[s("strong",null,"重启终端"),y(",然后重新运行 "),s("code",null,"ct")])]),s("p",{class:"alert-hint"},"如果配置文件中没有,可能是终端临时设置的,直接重启终端即可")],-1))]),_:1})):o("",!0),s("div",iw,[s("div",rw,[r(c(xe),{checked:C.value,indeterminate:U.value,"onUpdate:checked":T},{default:u(()=>[...l[6]||(l[6]=[y(" 全选 ",-1)])]),_:1},8,["checked","indeterminate"]),x.value>0?(n(),t("span",uw," 已选 "+v(x.value)+" 项 ",1)):o("",!0)]),r(c($e),{style:{"max-height":"280px"}},{default:u(()=>[s("div",cw,[(n(!0),t(m,null,f(e.conflicts,e=>{return n(),t("div",{key:z(e),class:d(["conflict-item",{selected:k.value.has(z(e))}]),onClick:a=>function(e){const a=z(e);k.value.has(a)?k.value.delete(a):k.value.add(a),k.value=new Set(k.value)}(e)},[r(c(xe),{checked:k.value.has(z(e)),onClick:l[0]||(l[0]=p(()=>{},["stop"])),"onUpdate:checked":a=>function(e,a){const l=z(e);a?k.value.add(l):k.value.delete(l),k.value=new Set(k.value)}(e,a)},null,8,["checked","onUpdate:checked"]),s("div",pw,[s("div",vw,[s("code",mw,v(e.varName),1),r(c(G),{type:(a=e.platform,{claude:"warning",codex:"success",gemini:"info"}[a]||"default"),size:"tiny",bordered:!1},{default:u(()=>[y(v(e.platform),1)]),_:2},1032,["type"])]),s("div",fw,v(e.varValue),1),s("div",gw,[l[7]||(l[7]=s("span",{class:"source-label"},"来源:",-1)),y(" "+v(I(e)),1)])])],10,dw);var a}),128))])]),_:1})])])]),_:1},8,["show"]))}},[["__scopeId","data-v-7ea71ef7"]]);function bw(){const e=Fi(),{dashboardData:a,isLoading:l,isLoaded:t}=T(e);return{dashboardData:a,isLoading:l,isLoaded:t,loadDashboard:e.loadDashboard,enableAutoRefresh:e.enableAutoRefresh,disableAutoRefresh:e.disableAutoRefresh,refreshChannels:e.refreshChannels,refreshProxyStatus:e.refreshProxyStatus,refreshStats:e.refreshStats}}const ww={class:"layout"},kw={class:"header"},_w={class:"nav-tabs"},xw={class:"header-actions"},Cw={class:"env-warning-count"},Uw={class:"favorites-button-wrapper"},Sw={key:0,class:"favorites-badge"},zw={class:"main-container"},Iw={key:0,class:"global-loading-overlay"},Tw={class:"left-content"},Pw=Pl({__name:"Layout",setup(e){const{isDark:a,toggleTheme:i}=Xi(),{claudeProxy:p,codexProxy:m,geminiProxy:f,opencodeProxy:h,startProxy:k,stopProxy:_}=hs(),{totalFavorites:U}=Po(),{loadDashboard:S}=bw(),I=D(),T=M(),$=w(()=>T.name),j=w(()=>T.meta.channel||null),O=w(()=>T.path),A=w(()=>j.value&&(ye.value||he.value&&fe.value)),L=l(!1),F=l(!1),R=l(!1),B=l(!1),H=l(!1),K=l(!1),G=l(!1),W=l(!1),V=l(!1),J=l(!1),Z=l(!1),Y=l(!1),X=l(""),ee=l(!1),ae=l(!1),le=l(!1),te=l(!1),ne=l(null),se=l(null),oe=l(null),re=l([]),ue=l(!1);async function de(){try{const e=await tw();e.success&&(re.value=e.conflicts||[],0===re.value.length&&(ue.value=!1))}catch(e){}}function pe(){ue.value=!1}function ve(){ue.value=!1,localStorage.setItem("envConflictNeverRemind","true")}const me=l(!1),fe=w(()=>"codex"===j.value?m.value.running:"gemini"===j.value?f.value.running:"opencode"===j.value?h.value.running:p.value.running),ge=w(()=>"codex"===j.value?m.value.loading:"gemini"===j.value?f.value.loading:"opencode"===j.value?h.value.loading:p.value.loading),ye=l(!0),he=l(!0);function be(){I.push({name:"home"})}function we(){window.open("https://github.com/ZeaoZhang/coding-tool","_blank")}async function ke(e){var a,l;const t=j.value||"claude";try{let a;a=e?await k(t):await _(t,{refreshChannelsDrawer:!0}),!1!==a.success?(Un.success(e?"代理已启动":"代理已停止"),e&&(he.value=!0),async function(){try{await Pn("panelVisibility","showChannels",ye.value),await Pn("panelVisibility","showLogs",he.value)}catch(e){}}()):Un.error(a.error||"操作失败")}catch(n){Un.error((null==(l=null==(a=n.response)?void 0:a.data)?void 0:l.error)||n.message||"操作失败")}}function _e(e){const{showChannels:a,showLogs:l}=e.detail;ye.value=a,he.value=l}function xe(e){var a;X.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",Y.value=!0}function Ce(){ee.value=!0}function Ue(){ae.value=!0}function Se(){le.value=!0}function ze(){"opencode"===j.value&&(G.value=!0)}function Ie({session:e,channel:a}){ne.value=e,se.value=a,te.value=!0,P(()=>{var e;null==(e=oe.value)||e.open()})}return b(()=>{!async function(){var e,a;try{const l=await S();l&&l.uiConfig&&(ye.value=!1!==(null==(e=l.uiConfig.panelVisibility)?void 0:e.showChannels),he.value=!1!==(null==(a=l.uiConfig.panelVisibility)?void 0:a.showLogs))}catch(l){}}(),window.addEventListener("panel-visibility-change",_e),window.addEventListener("open-skills-drawer",xe),window.addEventListener("open-commands-drawer",Ce),window.addEventListener("open-agents-drawer",Ue),window.addEventListener("open-plugins-drawer",Se),window.addEventListener("open-gateway-convert-drawer",ze),async function(){var e;try{const a=await tw();a.success&&(null==(e=a.conflicts)?void 0:e.length)>0&&(re.value=a.conflicts,"true"!==localStorage.getItem("envConflictNeverRemind")&&(ue.value=!0))}catch(a){}}()}),C(()=>{window.removeEventListener("panel-visibility-change",_e),window.removeEventListener("open-skills-drawer",xe),window.removeEventListener("open-commands-drawer",Ce),window.removeEventListener("open-agents-drawer",Ue),window.removeEventListener("open-plugins-drawer",Se),window.removeEventListener("open-gateway-convert-drawer",ze)}),x(()=>j.value,e=>{"opencode"!==e&&G.value&&(G.value=!1)}),(e,l)=>{const p=E("router-view");return n(),t("div",ww,[r(hw,{visible:ue.value,"onUpdate:visible":l[0]||(l[0]=e=>ue.value=e),conflicts:re.value,onDeleted:de,onClose:l[1]||(l[1]=e=>ue.value=!1),onIgnore:pe,onNeverRemind:ve},null,8,["visible","conflicts"]),s("header",kw,[s("div",{class:"logo-section",onClick:be},[...l[35]||(l[35]=[N('<div class="logo-wrapper" data-v-fb6cb2bf><img src="/logo.png" alt="Coding Tool Logo" class="logo-image" data-v-fb6cb2bf></div><div class="title-group" data-v-fb6cb2bf><h1 class="title-main" data-v-fb6cb2bf>Coding-Tool</h1><span class="title-sub" data-v-fb6cb2bf>Vibe Coding增强工作助手</span></div>',2)])]),s("div",_w,[s("div",{class:d(["nav-tab",{active:"home"===$.value}]),onClick:l[2]||(l[2]=e=>c(I).push({name:"home"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(rl))]),_:1}),l[36]||(l[36]=s("span",{class:"nav-label"},"Home",-1))],2),s("div",{class:d(["nav-tab",{active:"claude"===j.value}]),onClick:l[3]||(l[3]=e=>c(I).push({name:"claude-projects"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(ra))]),_:1}),l[37]||(l[37]=s("span",{class:"nav-label"},"Claude",-1))],2),s("div",{class:d(["nav-tab",{active:"codex"===j.value}]),onClick:l[4]||(l[4]=e=>c(I).push({name:"codex-projects"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(ua))]),_:1}),l[38]||(l[38]=s("span",{class:"nav-label"},"Codex",-1))],2),s("div",{class:d(["nav-tab",{active:"gemini"===j.value}]),onClick:l[5]||(l[5]=e=>c(I).push({name:"gemini-projects"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(ca))]),_:1}),l[39]||(l[39]=s("span",{class:"nav-label"},"Gemini",-1))],2),s("div",{class:d(["nav-tab",{active:"opencode"===j.value}]),onClick:l[6]||(l[6]=e=>c(I).push({name:"opencode-projects"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(Xe))]),_:1}),l[40]||(l[40]=s("span",{class:"nav-label"},"OpenCode",-1))],2),s("div",{class:d(["nav-tab",{active:"analytics"===$.value}]),onClick:l[7]||(l[7]=e=>c(I).push({name:"analytics"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(ul))]),_:1}),l[41]||(l[41]=s("span",{class:"nav-label"},"Analytics",-1))],2)]),s("div",xw,[re.value.length>0?(n(),g(c(ce),{key:0,trigger:"hover"},{trigger:u(()=>[s("div",{class:"env-warning-btn",onClick:l[8]||(l[8]=e=>ue.value=!0)},[r(c(q),{size:18,class:"env-warning-icon"},{default:u(()=>[r(c(Ia))]),_:1}),s("span",Cw,v(re.value.length),1)])]),default:u(()=>[y(" 检测到 "+v(re.value.length)+" 个环境变量冲突,点击查看 ",1)]),_:1})):o("",!0),r(lw,{icon:c(a)?c(Ua):c(Sa),tooltip:c(a)?"切换到亮色主题":"切换到暗色主题",onClick:c(i)},null,8,["icon","tooltip","onClick"]),l[42]||(l[42]=s("div",{class:"header-divider"},null,-1)),s("div",Uw,[r(lw,{icon:c(cl),tooltip:`我的收藏 (${c(U)})`,onClick:l[9]||(l[9]=e=>F.value=!0)},null,8,["icon","tooltip"]),c(U)>0?(n(),t("div",Sw,v(c(U)),1)):o("",!0)]),r(lw,{icon:c(Za),tooltip:"工作区管理",onClick:l[10]||(l[10]=e=>V.value=!0)},null,8,["icon"]),r(lw,{icon:c(dl),tooltip:"Prompts 管理",onClick:l[11]||(l[11]=e=>H.value=!0)},null,8,["icon"]),r(lw,{icon:c(ja),tooltip:"MCP 服务器管理",onClick:l[12]||(l[12]=e=>B.value=!0)},null,8,["icon"]),r(lw,{icon:c(pl),tooltip:"配置模版管理",onClick:l[13]||(l[13]=e=>J.value=!0)},null,8,["icon"]),r(lw,{icon:c(Xa),tooltip:"配置导出/导入",onClick:l[14]||(l[14]=e=>Z.value=!0)},null,8,["icon"]),l[43]||(l[43]=s("div",{class:"header-divider"},null,-1)),r(lw,{icon:c(Be),tooltip:"渠道速度测试",onClick:l[15]||(l[15]=e=>K.value=!0)},null,8,["icon"]),r(lw,{icon:c(Ca),tooltip:"设置",onClick:l[16]||(l[16]=e=>R.value=!0)},null,8,["icon"]),r(lw,{icon:c(vl),tooltip:"使用帮助",onClick:l[17]||(l[17]=e=>W.value=!0)},null,8,["icon"]),r(lw,{icon:c(nl),tooltip:"访问 GitHub 仓库",onClick:we},null,8,["icon"])])]),s("div",zw,[me.value?(n(),t("div",Iw,[r(c(Q),{size:"large"},{description:u(()=>[...l[44]||(l[44]=[y(" 加载配置中... ",-1)])]),_:1})])):o("",!0),s("div",Tw,[r(p,null,{default:u(({Component:e})=>[(n(),g(z(e),{key:O.value}))]),_:1})]),A.value?(n(),g(Ks,{key:1,"show-channels":ye.value,"show-logs":he.value,"proxy-running":fe.value,"proxy-loading":ge.value,onProxyToggle:ke,onShowRecent:l[18]||(l[18]=e=>L.value=!0)},null,8,["show-channels","show-logs","proxy-running","proxy-loading"])):o("",!0)]),r(Co,{visible:L.value,"onUpdate:visible":l[19]||(l[19]=e=>L.value=e),channel:j.value},null,8,["visible","channel"]),r(Xo,{visible:F.value,"onUpdate:visible":l[20]||(l[20]=e=>F.value=e),onViewHistory:Ie},null,8,["visible"]),ne.value?(n(),g(Ii,{key:0,ref_key:"chatHistoryRef",ref:oe,show:te.value,"onUpdate:show":l[21]||(l[21]=e=>te.value=e),"project-name":ne.value.projectName,"session-id":ne.value.sessionId,"session-alias":ne.value.alias,channel:se.value},null,8,["show","project-name","session-id","session-alias","channel"])):o("",!0),r(uc,{visible:R.value,"onUpdate:visible":l[22]||(l[22]=e=>R.value=e)},null,8,["visible"]),r(wp,{visible:B.value,"onUpdate:visible":l[23]||(l[23]=e=>B.value=e)},null,8,["visible"]),r(pv,{visible:H.value,"onUpdate:visible":l[24]||(l[24]=e=>H.value=e)},null,8,["visible"]),r(Yv,{visible:K.value,"onUpdate:visible":l[25]||(l[25]=e=>K.value=e)},null,8,["visible"]),"opencode"===j.value?(n(),g(vm,{key:1,visible:G.value,"onUpdate:visible":l[26]||(l[26]=e=>G.value=e)},null,8,["visible"])):o("",!0),r(Lh,{visible:V.value,"onUpdate:visible":l[27]||(l[27]=e=>V.value=e)},null,8,["visible"]),r(Bb,{visible:J.value,"onUpdate:visible":l[28]||(l[28]=e=>J.value=e)},null,8,["visible"]),r(ew,{visible:Z.value,"onUpdate:visible":l[29]||(l[29]=e=>Z.value=e)},null,8,["visible"]),r(Tf,{visible:Y.value,"onUpdate:visible":l[30]||(l[30]=e=>Y.value=e),platform:X.value},null,8,["visible","platform"]),r(ng,{visible:ee.value,"onUpdate:visible":l[31]||(l[31]=e=>ee.value=e)},null,8,["visible"]),r(jg,{visible:ae.value,"onUpdate:visible":l[32]||(l[32]=e=>ae.value=e)},null,8,["visible"]),r(By,{visible:le.value,"onUpdate:visible":l[33]||(l[33]=e=>le.value=e)},null,8,["visible"]),r(c(ie),{show:W.value,"onUpdate:show":l[34]||(l[34]=e=>W.value=e),preset:"card",title:"CODING-TOOL 使用帮助",style:{width:"800px","max-width":"90vw"}},{default:u(()=>[...l[45]||(l[45]=[s("div",{class:"help-content"},[s("div",{class:"help-section"},[s("h4",null,"🚀 快速开始"),s("p",null,"CODING-TOOL 是 AI 编程工具的增强管理助手,支持 Claude Code、Codex 和 Gemini 三种 AI 工具,提供智能会话管理、动态渠道切换、全局搜索和实时监控功能。"),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"⭐ 最简单的启动方式:"),s("div",{style:{background:"var(--bg-primary)",padding:"12px","border-radius":"6px",margin:"8px 0","border-left":"3px solid #18a058"}},[s("p",{style:{margin:"0","font-family":"'Courier New', monospace","font-size":"13px","font-weight":"600",color:"var(--primary-color)"}},"ctx start"),s("p",{style:{margin:"4px 0 0 0","font-size":"12px",color:"var(--text-secondary)"}},[y("• 后台启动所有服务"),s("br"),y("• 可以关闭终端窗口"),s("br"),y("• 代理服务保持运行")])]),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"📋 日常工作流:"),s("div",{style:{"font-size":"12px","line-height":"1.8",color:"var(--text-secondary)"}},[s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx start"),y(" 启动服务"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx status"),y(" 查看状态"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx logs"),y(" 查看日志"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx stop"),y(" 停止服务 ")])]),s("div",{class:"help-section"},[s("h4",null,"🤖 支持的 AI 工具"),s("ul",null,[s("li",null,[s("strong",null,"Claude Code"),y(":Anthropic 官方命令行工具,支持 Claude 系列模型")]),s("li",null,[s("strong",null,"Codex"),y(":支持 OpenAI GPT 系列和 Claude 模型(通过 OpenAI 兼容格式)")]),s("li",null,[s("strong",null,"Gemini"),y(":支持 Google Gemini 系列模型")])])]),s("div",{class:"help-section"},[s("h4",null,"📋 命令行用法"),s("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"🚀 服务管理"),s("div",{class:"command-list"},[s("div",{class:"command-item"},[s("code",null,"ctx start"),s("span",null,"后台启动所有服务(推荐)")]),s("div",{class:"command-item"},[s("code",null,"ctx stop"),s("span",null,"停止所有服务")]),s("div",{class:"command-item"},[s("code",null,"ctx restart"),s("span",null,"重启所有服务")]),s("div",{class:"command-item"},[s("code",null,"ctx status"),s("span",null,"查看服务状态")])]),s("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"🔌 代理管理"),s("div",{class:"command-list"},[s("div",{class:"command-item"},[s("code",null,"ctx claude start"),s("span",null,"启动 Claude 代理")]),s("div",{class:"command-item"},[s("code",null,"ctx codex start"),s("span",null,"启动 Codex 代理")]),s("div",{class:"command-item"},[s("code",null,"ctx gemini start"),s("span",null,"启动 Gemini 代理")]),s("div",{class:"command-item"},[s("code",null,"ctx claude stop"),s("span",null,"停止指定代理(支持 stop/restart/status)")])]),s("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"📋 日志管理"),s("div",{class:"command-list"},[s("div",{class:"command-item"},[s("code",null,"ctx logs"),s("span",null,"查看所有日志")]),s("div",{class:"command-item"},[s("code",null,"ctx logs claude"),s("span",null,"查看 Claude 日志(支持 ui/codex/gemini)")]),s("div",{class:"command-item"},[s("code",null,"ctx logs --follow"),s("span",null,"实时跟踪日志")]),s("div",{class:"command-item"},[s("code",null,"ctx logs --clear"),s("span",null,"清空日志")])]),s("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"📊 其他命令"),s("div",{class:"command-list"},[s("div",{class:"command-item"},[s("code",null,"ctx stats"),s("span",null,"查看统计信息")]),s("div",{class:"command-item"},[s("code",null,"ctx doctor"),s("span",null,"系统诊断")]),s("div",{class:"command-item"},[s("code",null,"ctx -h"),s("span",null,"完整帮助")])])]),s("div",{class:"help-section"},[s("h4",null,"🎯 Web UI 功能"),s("ul",null,[s("li",null,[s("strong",null,"多类型支持"),y(":统一管理 Claude Code、Codex、Gemini 三种工具的项目和会话")]),s("li",null,[s("strong",null,"项目管理"),y(":查看所有项目,支持拖拽排序、搜索过滤、删除项目")]),s("li",null,[s("strong",null,"会话管理"),y(":查看项目会话列表,支持搜索、Fork、删除、重命名")]),s("li",null,[s("strong",null,"快速启动"),y(":点击会话可直接复制对应 AI 工具启动命令")]),s("li",null,[s("strong",null,"动态切换"),y(":每种工具独立的渠道管理,可在右侧面板快速切换 API 渠道")]),s("li",null,[s("strong",null,"实时日志"),y(":查看各类型代理的实时请求日志、token 消耗和成本统计")]),s("li",null,[s("strong",null,"全局搜索"),y(":使用 "),s("kbd",null,"⌘/Ctrl"),y(" + "),s("kbd",null,"K"),y(" 在所有项目中搜索对话内容")])])]),s("div",{class:"help-section"},[s("h4",null,"⚡ 代理服务与渠道管理"),s("p",null,"每种 AI 工具都有独立的代理服务和渠道配置:"),s("ul",null,[s("li",null,[s("strong",null,"Claude 代理"),y(":端口 20088,支持 Anthropic API 格式")]),s("li",null,[s("strong",null,"Codex 代理"),y(":端口 20089,支持 OpenAI API 格式(兼容 Claude)")]),s("li",null,[s("strong",null,"Gemini 代理"),y(":端口 20090,支持 Gemini API 格式")])]),s("p",null,"在 Dashboard 或各工具详情页,可以添加多个渠道并快速切换,无需修改配置文件或重启工具。")]),s("div",{class:"help-section"},[s("h4",null,"⭐ 后台启动与开机自启"),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"后台启动服务"),s("p",{style:{"font-size":"12px","line-height":"1.8"}},[y("使用 "),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx start"),y(" 命令后台启动所有服务,可以安全关闭终端窗口而不影响代理服务的运行。")]),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"配置开机自启(可选)"),s("p",{style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px 0"}},"第一次启用开机自启只需三个步骤:"),s("div",{style:{background:"var(--bg-primary)",padding:"12px","border-radius":"6px",margin:"8px 0","border-left":"3px solid #18a058","font-family":"'Courier New', monospace","font-size":"11px","line-height":"1.8",color:"var(--text-secondary)"}},[y(" # 第 1 步:启用 PM2 开机自启"),s("br"),s("span",{style:{color:"var(--primary-color)"}},"pm2 startup"),s("br"),s("br"),y(" # 第 2 步:保存配置"),s("br"),s("span",{style:{color:"var(--primary-color)"}},"pm2 save"),s("br"),s("br"),y(" # 第 3 步:重启电脑,服务自动启动 ✓ ")]),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"相关命令"),s("div",{style:{"font-size":"12px",color:"var(--text-secondary)","line-height":"1.8"}},[s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx start"),y(" 后台启动"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx status"),y(" 查看状态"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx logs"),y(" 查看日志"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"pm2 list"),y(" 查看所有后台进程"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"pm2 unstartup"),y(" 禁用开机自启 ")]),s("p",{style:{color:"#18a058","font-size":"12px","margin-top":"8px"}},"💡 提示:配置开机自启后,重启电脑时 Coding-Tool 会自动启动,无需手动运行命令。")]),s("div",{class:"help-section"},[s("h4",null,"🔗 相关链接"),s("div",{class:"link-list"},[s("a",{href:"https://github.com/ZeaoZhang/coding-tool",target:"_blank"},"GitHub 仓库"),s("a",{href:"https://github.com/ZeaoZhang/coding-tool/issues",target:"_blank"},"问题反馈")])])],-1)])]),_:1},8,["show"])])}}},[["__scopeId","data-v-fb6cb2bf"]]),Mw=F({__name:"App",setup(e){const{isDark:a,loadTheme:l}=Xi(),t=w(()=>a.value?Y:null),s=w(()=>a.value?{common:{primaryColor:"#18a058",primaryColorHover:"#36ad6a",primaryColorPressed:"#0c7a43",bodyColor:"#0f1419",cardColor:"#1a1f2e",modalColor:"#1a1f2e",popoverColor:"#1a1f2e",tableColor:"#1a1f2e",inputColor:"#232835",codeColor:"#232835",tabColor:"#1a1f2e",actionColor:"#232835",tableHeaderColor:"#232835",hoverColor:"rgba(255, 255, 255, 0.09)",pressedColor:"rgba(255, 255, 255, 0.13)",borderColor:"#2d3748",dividerColor:"#2d3748"},Drawer:{color:"#1a1f2e",headerColor:"#1a1f2e",footerColor:"#1a1f2e"},Modal:{color:"#1a1f2e",boxShadow:"0 0 0 1px rgba(0, 0, 0, 0.6), 0 8px 32px rgba(0, 0, 0, 0.6)"},Card:{color:"#1a1f2e",borderColor:"#2d3748"},Popover:{color:"#1a1f2e",boxShadow:"0 4px 16px rgba(0, 0, 0, 0.5)"},Dialog:{color:"#1a1f2e"}}:{common:{primaryColor:"#18a058",primaryColorHover:"#36ad6a",primaryColorPressed:"#0c7a43"}});return b(()=>{l()}),(e,a)=>(n(),g(c(Fe),{theme:t.value,"theme-overrides":s.value},{default:u(()=>[r(c(De),null,{default:u(()=>[r(c(Ne),null,{default:u(()=>[r(Pw)]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"]))}}),$w=R();Mw.use($w),Mw.use(Tl),Mw.mount("#app"),function(){if(Fn)return;const e=Nn();e.connectWebSocket(),queueMicrotask(()=>{const a=()=>{e.loadChannels(),e.loadAdvancedConfig()};"undefined"==typeof window||"function"!=typeof window.requestIdleCallback?setTimeout(a,0):window.requestIdleCallback(a,{timeout:1e3})}),Fn=!0}();export{co as A,Rb as B,Ii as C,vs as D,ps as E,ms as F,Ry as P,Co as R,If as S,Ah as W,Pl as _,bw as a,us as b,cs as c,ds as d,Os as e,zn as f,rs as g,Ls as h,ft as i,kt as j,zt as k,Rt as l,cc as m,Pn as n,Tn as o,Ro as p,no as q,Un as r,In as s,pc as t,hs as u,Sn as v,mo as w,yo as x,Po as y,vo as z};
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ProjectList-DoN8Hjbu.js","assets/vue-vendor-DET08QYg.js","assets/markdown-C9MYpaSi.js","assets/markdown-BfC0goYb.css","assets/vendors-DMjSfzlv.js","assets/icons-B29onFfZ.js","assets/naive-ui-CxpuzdjU.js","assets/ProjectList-oJIyIRkP.css","assets/SessionList-Da8BYzNi.js","assets/SessionList-C55tjV7i.css","assets/Home-CbbyopS-.js","assets/Home-BsSioaaB.css","assets/WorkspaceManager-B_TxOgPW.js","assets/WorkspaceManager-CrwgQgmP.css","assets/ConfigTemplates-BP2lLBMN.js","assets/ConfigTemplates-Bidwfdf2.css","assets/SkillManager-DqLAXh9o.js","assets/SkillManager-D7pd-d_P.css","assets/PluginManager-HmISlyMK.js","assets/PluginManager-ROyoZ-6m.css","assets/Analytics-TtaduRqL.js","assets/Analytics-DuYvId7u.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{U as e,V as a,r as l,c as t,o as n,a as s,W as o,s as i,X as r,Y as u,N as c,L as d,Z as p,_ as v,F as m,$ as f,a0 as g,p as y,G as h,h as b,f as w,a1 as k,k as _,w as x,K as C,a2 as U,y as S,a3 as z,R as I,a4 as T,v as P,a5 as M,x as $,t as j,a6 as O,i as A,J as L,a7 as E,a8 as D,b as N,M as F,a9 as R}from"./vue-vendor-DET08QYg.js";import{a as B,d as H}from"./vendors-DMjSfzlv.js";import{N as q,B as K,a as G,b as W,c as V,d as J,e as Z,f as Y,l as X,g as Q,h as ee,i as ae,j as le,k as te,m as ne,n as se,o as oe,p as ie,q as re,r as ue,s as ce,t as de,u as pe,v as ve,w as me,x as fe,y as ge,z as ye,A as he,C as be,D as we,E as ke,F as _e,G as xe,H as Ce,I as Ue,J as Se,K as ze,L as Ie,M as Te,O as Pe,P as Me,S as $e,Q as je,R as Oe,T as Ae,U as Le,V as Ee,W as De,X as Ne,Y as Fe}from"./naive-ui-CxpuzdjU.js";import{C as Re,S as Be,a as He,b as qe,c as Ke,O as Ge,A as We,d as Ve,T as Je,e as Ze,f as Ye,E as Xe,g as Qe,h as ea,P as aa,i as la,j as ta,G as na,k as sa,D as oa,l as ia,m as ra,n as ua,o as ca,p as da,q as pa,r as va,s as ma,I as fa,t as ga,u as ya,v as ha,w as ba,x as wa,N as ka,y as _a,z as xa,B as Ca,F as Ua,M as Sa,H as za,W as Ia,J as Ta,K as Pa,L as Ma,Q as $a,R as ja,U as Oa,V as Aa,X as La,Y as Ea,Z as Da,_ as Na,$ as Fa,a0 as Ra,a1 as Ba,a2 as Ha,a3 as qa,a4 as Ka,a5 as Ga,a6 as Wa,a7 as Va,a8 as Ja,a9 as Za,aa as Ya,ab as Xa,ac as Qa,ad as el,ae as al,af as ll,ag as tl,ah as nl,ai as sl,aj as ol,ak as il,al as rl,am as ul,an as cl,ao as dl,ap as pl,aq as vl}from"./icons-B29onFfZ.js";import{H as ml,j as fl,p as gl,b as yl,d as hl,t as bl,e as wl,x as kl,f as _l,M as xl}from"./markdown-C9MYpaSi.js";!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))a(e);new MutationObserver(e=>{for(const l of e)if("childList"===l.type)for(const e of l.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&a(e)}).observe(document,{childList:!0,subtree:!0})}function a(e){if(e.ep)return;e.ep=!0;const a=function(e){const a={};return e.integrity&&(a.integrity=e.integrity),e.referrerPolicy&&(a.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?a.credentials="include":"anonymous"===e.crossOrigin?a.credentials="omit":a.credentials="same-origin",a}(e);fetch(e.href,a)}}();const Cl={},Ul=function(e,a,l){let t=Promise.resolve();if(a&&a.length>0){document.getElementsByTagName("link");const e=document.querySelector("meta[property=csp-nonce]"),l=(null==e?void 0:e.nonce)||(null==e?void 0:e.getAttribute("nonce"));t=Promise.allSettled(a.map(e=>{if((e=function(e){return"/"+e}(e))in Cl)return;Cl[e]=!0;const a=e.endsWith(".css"),t=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${t}`))return;const n=document.createElement("link");return n.rel=a?"stylesheet":"modulepreload",a||(n.as="script"),n.crossOrigin="",n.href=e,l&&n.setAttribute("nonce",l),document.head.appendChild(n),a?new Promise((a,l)=>{n.addEventListener("load",a),n.addEventListener("error",()=>l(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function n(e){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=e,window.dispatchEvent(a),!a.defaultPrevented)throw e}return t.then(a=>{for(const e of a||[])"rejected"===e.status&&n(e.reason);return e().catch(n)})},Sl=()=>Ul(()=>import("./ProjectList-DoN8Hjbu.js"),__vite__mapDeps([0,1,2,3,4,5,6,7])),zl=()=>Ul(()=>import("./SessionList-Da8BYzNi.js"),__vite__mapDeps([8,1,2,3,4,5,6,9])),Il=[{path:"/",name:"home",component:()=>Ul(()=>import("./Home-CbbyopS-.js"),__vite__mapDeps([10,4,2,3,1,5,6,11]))},{path:"/claude",name:"claude-projects",component:Sl,meta:{channel:"claude"}},{path:"/claude/sessions/:projectName",name:"claude-sessions",component:zl,props:!0,meta:{channel:"claude"}},{path:"/codex",name:"codex-projects",component:Sl,meta:{channel:"codex"}},{path:"/codex/sessions/:projectName",name:"codex-sessions",component:zl,props:!0,meta:{channel:"codex"}},{path:"/gemini",name:"gemini-projects",component:Sl,meta:{channel:"gemini"}},{path:"/gemini/sessions/:projectName",name:"gemini-sessions",component:zl,props:!0,meta:{channel:"gemini"}},{path:"/opencode",name:"opencode-projects",component:Sl,meta:{channel:"opencode"}},{path:"/opencode/sessions/:projectName",name:"opencode-sessions",component:zl,props:!0,meta:{channel:"opencode"}},{path:"/workspaces",name:"workspaces",component:()=>Ul(()=>import("./WorkspaceManager-B_TxOgPW.js"),__vite__mapDeps([12,1,2,3,6,4,5,13]))},{path:"/config-templates",name:"config-templates",component:()=>Ul(()=>import("./ConfigTemplates-BP2lLBMN.js"),__vite__mapDeps([14,1,2,3,6,4,5,15]))},{path:"/skills",name:"skills",component:()=>Ul(()=>import("./SkillManager-DqLAXh9o.js"),__vite__mapDeps([16,1,2,3,6,4,5,17]))},{path:"/plugins",name:"plugins",component:()=>Ul(()=>import("./PluginManager-HmISlyMK.js"),__vite__mapDeps([18,1,2,3,6,4,5,19]))},{path:"/analytics",name:"analytics",component:()=>Ul(()=>import("./Analytics-TtaduRqL.js"),__vite__mapDeps([20,1,2,3,6,5,4,21]))},{path:"/:pathMatch(.*)*",redirect:"/"}],Tl=e({history:a(),routes:Il}),Pl=(e,a)=>{const l=e.__vccOpts||e;for(const[t,n]of a)l[t]=n;return l},Ml={class:"channel-header"},$l={class:"channel-title"},jl={class:"channel-name"},Ol={class:"channel-actions"},Al={class:"test-result-header"},Ll={class:"test-result-status"},El={class:"test-result-info"},Dl={key:0,class:"latency"},Nl={key:1,class:"status-code"},Fl={key:0,class:"test-result-error"},Rl={class:"channel-info"},Bl={class:"info-main"},Hl={class:"info-footer"},ql={class:"channel-meta"},Kl={class:"meta-item"},Gl={class:"meta-value"},Wl={class:"meta-item"},Vl=Pl({__name:"ChannelCard",props:{channel:{type:Object,required:!0},collapsed:{type:Boolean,default:!1},headerTags:{type:Array,default:()=>[]},infoRows:{type:Array,default:()=>[]},meta:{type:Object,default:()=>({weight:1,concurrencyText:"不限",concurrencyActive:!1})},showApplyButton:{type:Boolean,default:!1},channelType:{type:String,default:"claude"},testFn:{type:Function,default:null},toggling:{type:Boolean,default:!1}},emits:["toggle-collapse","apply","edit","delete","toggle-enabled","open-website"],setup(e){const a=e,b=l(!1),w=l(null);async function k(){if(a.testFn){b.value=!0,w.value=null;try{const e=await a.testFn(a.channel.id,2e4);w.value=e}catch(e){w.value={success:!1,error:e.message||"测试失败",latency:null,statusCode:null}}finally{b.value=!1}}}return(a,l)=>{var _,x;return n(),t("div",{class:d(["channel-card",{collapsed:e.collapsed,disabled:!1===e.channel.enabled,"status-frozen":"frozen"===(null==(_=e.channel.health)?void 0:_.status),"status-checking":"checking"===(null==(x=e.channel.health)?void 0:x.status)}])},[s("div",Ml,[s("div",$l,[r(c(K),{text:"",size:"tiny",class:"collapse-btn",onClick:l[0]||(l[0]=p(e=>a.$emit("toggle-collapse"),["stop"]))},{default:u(()=>[r(c(q),{size:"16",class:d({collapsed:e.collapsed})},{default:u(()=>[r(c(Re))]),_:1},8,["class"])]),_:1}),s("span",jl,v(e.channel.name),1),(n(!0),t(m,null,f(e.headerTags,e=>(n(),g(c(G),{key:e.text,size:"tiny",type:e.type||"default",bordered:!1},{default:u(()=>[y(v(e.text),1)]),_:2},1032,["type"]))),128))]),s("div",Ol,[e.showApplyButton?(n(),g(c(K),{key:0,size:"tiny",type:"primary",class:"apply-btn",onClick:l[1]||(l[1]=e=>a.$emit("apply"))},{default:u(()=>[...l[7]||(l[7]=[y(" 写入配置 ",-1)])]),_:1})):o("",!0),r(c(K),{size:"tiny",loading:b.value,onClick:k},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Be))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 测速 ",-1))]),_:1},8,["loading"]),r(c(K),{size:"tiny",onClick:l[2]||(l[2]=e=>a.$emit("edit"))},{default:u(()=>[...l[9]||(l[9]=[y(" 编辑 ",-1)])]),_:1}),r(c(K),{size:"tiny",type:"error",onClick:l[3]||(l[3]=e=>a.$emit("delete"))},{default:u(()=>[...l[10]||(l[10]=[y(" 删除 ",-1)])]),_:1}),r(c(W),{size:"small",value:!1!==e.channel.enabled,loading:e.toggling,disabled:e.toggling,"onUpdate:value":l[4]||(l[4]=e=>a.$emit("toggle-enabled",e))},null,8,["value","loading","disabled"])])]),w.value?(n(),t("div",{key:0,class:d(["test-result",w.value.success?"success":"failed"])},[s("div",Al,[s("span",Ll,[w.value.success?(n(),g(c(q),{key:0,color:"#18a058"},{default:u(()=>[r(c(He))]),_:1})):(n(),g(c(q),{key:1,color:"#f56c6c"},{default:u(()=>[r(c(qe))]),_:1})),y(" "+v(w.value.success?"测试成功":"测试失败"),1)]),s("div",El,[w.value.latency?(n(),t("span",Dl,v(w.value.latency)+"ms",1)):o("",!0),w.value.statusCode?(n(),t("span",Nl,"HTTP "+v(w.value.statusCode),1)):o("",!0)]),r(c(K),{text:"",size:"tiny",onClick:l[5]||(l[5]=e=>w.value=null)},{default:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ke))]),_:1})]),_:1})]),w.value.error?(n(),t("div",Fl,v(w.value.error),1)):o("",!0)],2)):o("",!0),i(s("div",Rl,[s("div",Bl,[(n(!0),t(m,null,f(e.infoRows,e=>(n(),t("div",{key:e.label,class:"info-row"},[r(c(V),{depth:"3",class:"label"},{default:u(()=>[y(v(e.label)+":",1)]),_:2},1024),r(c(V),{depth:"2",class:d(["value",{mono:e.mono}])},{default:u(()=>[y(v(e.value||"—"),1)]),_:2},1032,["class"]),"function"==typeof e.action?(n(),g(c(K),{key:0,size:"tiny",text:"",type:"primary",onClick:a=>e.action()},{default:u(()=>[y(v(e.actionLabel||"操作"),1)]),_:2},1032,["onClick"])):o("",!0)]))),128))]),s("div",Hl,[e.channel.websiteUrl?(n(),g(c(K),{key:0,text:"",size:"tiny",onClick:l[6]||(l[6]=l=>a.$emit("open-website",e.channel.websiteUrl))},{icon:u(()=>[r(c(q),{size:"14"},{default:u(()=>[r(c(Ge))]),_:1})]),default:u(()=>[l[11]||(l[11]=y(" 前往官网 ",-1))]),_:1})):o("",!0),l[14]||(l[14]=s("div",{class:"footer-spacer"},null,-1)),s("div",ql,[s("span",Kl,[l[12]||(l[12]=y(" 权重: ",-1)),s("span",Gl,v(e.meta.weight),1)]),s("span",Wl,[l[13]||(l[13]=y(" 并发: ",-1)),s("span",{class:d(["meta-value",{"meta-active":e.meta.concurrencyActive}])},v(e.meta.concurrencyText),3)])])])],512),[[h,!e.collapsed]])],2)}}},[["__scopeId","data-v-f2dad3b2"]]),Jl=l(null),Zl=l(null),Yl=l(!1),Xl={claude:["claude-opus-4-6","claude-sonnet-4-6","claude-opus-4-5-20251101","claude-sonnet-4-5-20250929","claude-haiku-4-5-20251001"],codex:["gpt-5.3-codex","gpt-5.2-codex","gpt-5.1-codex-max","gpt-5.1-codex","gpt-5.1-codex-mini","gpt-5-codex","gpt-5.2","gpt-5.1","gpt-5"],gemini:["gemini-3.1-pro","gemini-3-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite"]};function Ql(e=[]){const a=new Set,l=[];return e.forEach(e=>{if("string"!=typeof e)return;const t=e.trim();if(!t)return;const n=t.toLowerCase();a.has(n)||(a.add(n),l.push(t))}),l}function et(e){const a=String(e||"").trim().toLowerCase();return a.startsWith("claude-")?"claude":a.startsWith("gemini-")?"gemini":a.startsWith("gpt-")||a.startsWith("o1")||a.startsWith("o3")||a.startsWith("o4")?"codex":""}let at=null;async function lt(e={}){const a=!0===e.forceRefresh;return!a&&Jl.value&&Zl.value?Jl.value:at||(Yl.value=!0,at=(async()=>{try{const l=new URLSearchParams;a&&l.set("forceRefresh","true");const t=l.toString(),n=t?`/api/config/default-models?${t}`:"/api/config/default-models",s=await fetch(n);if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);const o=await s.json();Jl.value=o.defaultModels;try{const e=await fetch("/api/settings/model-settings");if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);const a=function(e){const a={claude:[],codex:[],gemini:[]};for(const[l,t]of Object.entries(e||{})){if(!t||"object"!=typeof t||!t.limit||!t.pricing)continue;const e=et(l);e&&a[e].push(l)}return{claude:Ql(a.claude),codex:Ql(a.codex),gemini:Ql(a.gemini)}}((await e.json()).models||{});Zl.value={claude:a.claude.length>0?a.claude:[...Xl.claude],codex:a.codex.length>0?a.codex:[...Xl.codex],gemini:a.gemini.length>0?a.gemini:[...Xl.gemini]}}catch(e){Zl.value={claude:[...Xl.claude],codex:[...Xl.codex],gemini:[...Xl.gemini]}}}catch(l){Jl.value=Xl,Zl.value={claude:[...Xl.claude],codex:[...Xl.codex],gemini:[...Xl.gemini]}}finally{Yl.value=!1,at=null}return Jl.value})(),at)}function tt(e){var a;return(null==(a=Jl.value)?void 0:a[e])||Xl[e]||[]}function nt(e){var a;return(null==(a=Zl.value)?void 0:a[e])||Xl[e]||[]}function st(){return{defaultModels:Jl,allModels:Zl,loading:Yl,loadDefaultModels:lt,getDefaultModels:tt,getAllModelsByToolType:nt}}const ot={class:"model-redirect-editor"},it={class:"redirect-input"},rt={class:"redirect-arrow"},ut={class:"redirect-input"},ct=Pl({__name:"ModelRedirectEditor",props:{modelValue:{type:Array,default:()=>[]},availableModels:{type:Array,default:()=>[]},channelType:{type:String,default:"claude"}},emits:["update:modelValue"],setup(e,{emit:a}){const l=e,o=a,{getDefaultModels:i,loadDefaultModels:d}=st();b(async()=>{await d()});const p=w(()=>{if(l.availableModels&&l.availableModels.length>0)return l.availableModels;return i(l.channelType).map(e=>({label:e,value:e}))});function v(e){if(!e)return p.value;const a=e.toLowerCase();return p.value.filter(e=>(e.label||e.value||"").toLowerCase().includes(a))}function g(e,a,t){const n=[...l.modelValue];n[e]={...n[e],[a]:t},o("update:modelValue",n)}function h(){o("update:modelValue",[...l.modelValue,{from:"",to:""}])}return(a,i)=>(n(),t("div",ot,[(n(!0),t(m,null,f(e.modelValue,(e,a)=>(n(),t("div",{key:a,class:"redirect-row"},[s("div",it,[r(c(J),{value:e.from,options:v(e.from),placeholder:"源模型",clearable:"","get-show":()=>!0,"onUpdate:value":e=>g(a,"from",e)},null,8,["value","options","onUpdate:value"])]),s("div",rt,[r(c(q),{size:"16",color:"#999"},{default:u(()=>[r(c(We))]),_:1})]),s("div",ut,[r(c(J),{value:e.to,options:v(e.to),placeholder:"目标模型",clearable:"","get-show":()=>!0,"onUpdate:value":e=>g(a,"to",e)},null,8,["value","options","onUpdate:value"])]),r(c(K),{quaternary:"",circle:"",size:"small",onClick:e=>function(e){const a=l.modelValue.filter((a,l)=>l!==e);o("update:modelValue",a)}(a)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ke))]),_:1})]),_:1},8,["onClick"])]))),128)),r(c(K),{dashed:"",size:"small",onClick:h,class:"add-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[i[0]||(i[0]=y(" 添加重定向规则 ",-1))]),_:1})]))}},[["__scopeId","data-v-8ebdcad0"]]),dt=B.create({baseURL:"/api",timeout:3e4});function pt(e="claude"){return"codex"===e?"/codex":"gemini"===e?"/gemini":"opencode"===e?"/opencode":""}async function vt(){return(await dt.get("/channels")).data}async function mt(e,a,l,t,n={}){const s={name:e,baseUrl:a,apiKey:l,websiteUrl:t,...n};return(await dt.post("/channels",s)).data}async function ft(e,a){return(await dt.put(`/channels/${e}`,a)).data}async function gt(e){return(await dt.delete(`/channels/${e}`)).data}async function yt(e){return(await dt.post(`/channels/${e}/apply-to-settings`)).data}async function ht(e){return(await dt.post(`/channels/${e}/reset-health`)).data}async function bt(){return(await dt.get("/codex/channels")).data}async function wt(e,a,l,t,n,s={}){return(await dt.post("/codex/channels",{name:e,providerKey:a,baseUrl:l,apiKey:t,websiteUrl:n,...s})).data}async function kt(e,a){return(await dt.put(`/codex/channels/${e}`,a)).data}async function _t(e){return(await dt.delete(`/codex/channels/${e}`)).data}async function xt(e){return(await dt.post(`/codex/channels/${e}/apply-to-settings`)).data}async function Ct(e){return(await dt.post(`/codex/channels/${e}/reset-health`)).data}async function Ut(){return(await dt.get("/gemini/channels")).data}async function St(e,a,l,t,n,s={}){return(await dt.post("/gemini/channels",{name:e,baseUrl:a,apiKey:l,model:t,websiteUrl:n,...s})).data}async function zt(e,a){return(await dt.put(`/gemini/channels/${e}`,a)).data}async function It(e){return(await dt.delete(`/gemini/channels/${e}`)).data}async function Tt(e){return(await dt.post(`/gemini/channels/${e}/reset-health`)).data}async function Pt(e,a=2e4){return(await dt.post(`/channels/${e}/speed-test`,{timeout:a})).data}async function Mt(e,a="claude"){const l=a?{params:{type:a}}:void 0;return(await dt.get(`/channels/${e}/models`,l)).data}async function $t(e=2e4){return(await dt.post("/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function jt(e,a=2e4){return(await dt.post(`/codex/channels/${e}/speed-test`,{timeout:a})).data}async function Ot(e=2e4){return(await dt.post("/codex/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function At(e,a=2e4){return(await dt.post(`/gemini/channels/${e}/speed-test`,{timeout:a})).data}async function Lt(e=2e4){return(await dt.post("/gemini/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function Et(e){return(await dt.get(`/codex/channels/${e}/models`)).data}async function Dt(e){return(await dt.get(`/gemini/channels/${e}/models`)).data}async function Nt(){return(await dt.get("/opencode/channels")).data}async function Ft(e,a,l,t={}){return(await dt.post("/opencode/channels",{name:e,baseUrl:a,apiKey:l,wireApi:t.wireApi||"openai",gatewaySourceType:t.gatewaySourceType||"codex",enabled:!1!==t.enabled,weight:t.weight||1,maxConcurrency:t.maxConcurrency||null,model:t.model||null,modelRedirects:t.modelRedirects||[],speedTestModel:t.speedTestModel||null,presetId:t.presetId||null,websiteUrl:t.websiteUrl||""})).data}async function Rt(e,a){return(await dt.put(`/opencode/channels/${e}`,a)).data}async function Bt(e){return(await dt.delete(`/opencode/channels/${e}`)).data}async function Ht(e){return(await dt.post(`/opencode/channels/${e}/reset-health`)).data}async function qt(e,a=2e4){return(await dt.post(`/opencode/channels/${e}/speed-test`,{timeout:a})).data}async function Kt(e,{forceRefresh:a=!1}={}){return(await dt.get(`/opencode/channels/${e}/models`,{params:a?{forceRefresh:"true"}:{}})).data}async function Gt({baseUrl:e,apiKey:a,gatewaySourceType:l}){return(await dt.post("/opencode/channels/probe-models",{baseUrl:e,apiKey:a,gatewaySourceType:l})).data}dt.interceptors.response.use(e=>e,e=>{if(e.response&&e.response.data){const a=e.response.data,l=new Error(a.message||e.message);return l.response=e.response,l.status=e.response.status,l.data=a,Promise.reject(l)}return Promise.reject(e)});const Wt=Object.freeze(Object.defineProperty({__proto__:null,applyChannelToSettings:yt,applyCodexChannelToSettings:xt,createChannel:mt,createCodexChannel:wt,createGeminiChannel:St,createOpenCodeChannel:Ft,deleteChannel:gt,deleteCodexChannel:_t,deleteGeminiChannel:It,deleteOpenCodeChannel:Bt,fetchChannelModels:Mt,fetchCodexChannelModels:Et,fetchGeminiChannelModels:Dt,fetchOpenCodeChannelModels:Kt,getBestChannelForRestore:async function(){return(await dt.get("/channels/best-for-restore")).data},getChannelPoolStatus:async function(){return(await dt.get("/channels/pool/status")).data},getChannels:vt,getCodexChannels:bt,getCurrentChannel:async function(){return(await dt.get("/channels/current")).data},getEnabledCodexChannels:async function(){return(await dt.get("/codex/channels/enabled")).data},getEnabledGeminiChannels:async function(){return(await dt.get("/gemini/channels/enabled")).data},getEnabledOpenCodeChannels:async function(){return{channels:((await Nt()).channels||[]).filter(e=>!1!==e.enabled)}},getGeminiChannels:Ut,getOpenCodeChannels:Nt,getOpenCodeProxyStatus:async function(){return(await dt.get("/opencode/proxy/status")).data},probeOpenCodeChannelModels:Gt,resetChannelHealth:ht,resetCodexChannelHealth:Ct,resetGeminiChannelHealth:Tt,resetOpenCodeChannelHealth:Ht,saveChannelOrder:async function(e){return(await dt.post("/channels/order",{order:e})).data},saveCodexChannelOrder:async function(e){return(await dt.post("/codex/channels/order",{order:e})).data},saveGeminiChannelOrder:async function(e){return(await dt.post("/gemini/channels/order",{order:e})).data},saveOpenCodeChannelOrder:async function(e){return(await dt.post("/opencode/channels/order",{order:e})).data},startOpenCodeProxy:async function(){return(await dt.post("/opencode/proxy/start")).data},stopOpenCodeProxy:async function(){return(await dt.post("/opencode/proxy/stop")).data},testAllClaudeChannelsSpeed:$t,testAllCodexChannelsSpeed:Ot,testAllGeminiChannelsSpeed:Lt,testAllOpenCodeChannelsSpeed:async function(e=2e4){return(await dt.post("/opencode/channels/speed-test-all",{timeout:e},{timeout:12e4})).data},testClaudeChannelSpeed:Pt,testCodexChannelSpeed:jt,testGeminiChannelSpeed:At,testOpenCodeChannelSpeed:qt,updateChannel:ft,updateCodexChannel:kt,updateGeminiChannel:zt,updateOpenCodeChannel:Rt},Symbol.toStringTag,{value:"Module"})),Vt=[{id:"official",name:"Claude 官方",category:"official",websiteUrl:"https://www.anthropic.com",baseUrl:"https://api.anthropic.com",env:{}},{id:"deepseek",name:"DeepSeek",category:"cn_official",websiteUrl:"https://platform.deepseek.com",baseUrl:"https://api.deepseek.com/anthropic",env:{ANTHROPIC_MODEL:"DeepSeek-V3.2-Exp",ANTHROPIC_DEFAULT_HAIKU_MODEL:"DeepSeek-V3.2-Exp",ANTHROPIC_DEFAULT_SONNET_MODEL:"DeepSeek-V3.2-Exp",ANTHROPIC_DEFAULT_OPUS_MODEL:"DeepSeek-V3.2-Exp"}},{id:"zhipu",name:"智谱 GLM",category:"cn_official",websiteUrl:"https://open.bigmodel.cn",baseUrl:"https://open.bigmodel.cn/api/anthropic",env:{ANTHROPIC_MODEL:"glm-4.6",ANTHROPIC_DEFAULT_HAIKU_MODEL:"glm-4.5-air",ANTHROPIC_DEFAULT_SONNET_MODEL:"glm-4.6",ANTHROPIC_DEFAULT_OPUS_MODEL:"glm-4.6"}},{id:"kimi",name:"Kimi K2",category:"cn_official",websiteUrl:"https://platform.moonshot.cn",baseUrl:"https://api.moonshot.cn/anthropic",env:{ANTHROPIC_MODEL:"kimi-k2-thinking",ANTHROPIC_DEFAULT_HAIKU_MODEL:"kimi-k2-thinking",ANTHROPIC_DEFAULT_SONNET_MODEL:"kimi-k2-thinking",ANTHROPIC_DEFAULT_OPUS_MODEL:"kimi-k2-thinking"}},{id:"minimax",name:"MiniMax",category:"cn_official",websiteUrl:"https://platform.minimaxi.com",baseUrl:"https://api.minimaxi.com/anthropic",env:{ANTHROPIC_MODEL:"MiniMax-M2",ANTHROPIC_DEFAULT_HAIKU_MODEL:"MiniMax-M2",ANTHROPIC_DEFAULT_SONNET_MODEL:"MiniMax-M2",ANTHROPIC_DEFAULT_OPUS_MODEL:"MiniMax-M2"}},{id:"qwen",name:"通义千问",category:"cn_official",websiteUrl:"https://bailian.console.aliyun.com",baseUrl:"https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy",env:{ANTHROPIC_MODEL:"qwen3-max",ANTHROPIC_DEFAULT_HAIKU_MODEL:"qwen3-max",ANTHROPIC_DEFAULT_SONNET_MODEL:"qwen3-max",ANTHROPIC_DEFAULT_OPUS_MODEL:"qwen3-max"}},{id:"doubao",name:"豆包 Seed",category:"cn_official",websiteUrl:"https://www.volcengine.com/product/doubao",baseUrl:"https://ark.cn-beijing.volces.com/api/coding",env:{ANTHROPIC_MODEL:"doubao-seed-code-preview-latest",ANTHROPIC_DEFAULT_HAIKU_MODEL:"doubao-seed-code-preview-latest",ANTHROPIC_DEFAULT_SONNET_MODEL:"doubao-seed-code-preview-latest",ANTHROPIC_DEFAULT_OPUS_MODEL:"doubao-seed-code-preview-latest"}},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:"",env:{}}],Jt={official:"官方",cn_official:"国内官方",aggregator:"聚合服务",third_party:"第三方",custom:"自定义"};function Zt(e){return Vt.find(a=>a.id===e)}const Yt=[{id:"openai",name:"OpenAI",category:"official",websiteUrl:"https://platform.openai.com",baseUrl:"https://api.openai.com/v1",providerKey:"openai"},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:"",providerKey:""}],Xt={official:"官方",custom:"自定义"};function Qt(e){return Yt.find(a=>a.id===e)}const en=[{id:"google",name:"Google AI",category:"official",websiteUrl:"https://ai.google.dev",baseUrl:"https://generativelanguage.googleapis.com/v1beta"},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:""}],an={official:"官方",custom:"自定义"};function ln(e){return en.find(a=>a.id===e)}const tn=[{id:"openrouter",name:"OpenRouter",category:"apikey",description:"统一接口访问 200+ 模型",websiteUrl:"https://openrouter.ai",baseUrl:"https://openrouter.ai/api/v1",wireApi:"openai",models:["anthropic/claude-3.5-sonnet","openai/gpt-4o","meta-llama/llama-3.1-405b"]},{id:"openai_api",name:"OpenAI API",category:"apikey",description:"OpenAI 官方 API(需要 API Key)",websiteUrl:"https://platform.openai.com",baseUrl:"https://api.openai.com/v1",wireApi:"openai",models:["gpt-4o","gpt-4o-mini","o1","o1-mini","gpt-4-turbo"]},{id:"anthropic_api",name:"Anthropic API",category:"apikey",description:"Anthropic 官方 API(需要 API Key)",websiteUrl:"https://console.anthropic.com",baseUrl:"https://api.anthropic.com/v1",wireApi:"anthropic",models:["claude-3-5-sonnet","claude-3-opus","claude-3-haiku"]},{id:"deepseek",name:"DeepSeek",category:"apikey",description:"DeepSeek AI 模型",websiteUrl:"https://platform.deepseek.com",baseUrl:"https://api.deepseek.com/v1",wireApi:"openai",models:["deepseek-chat","deepseek-coder"]},{id:"groq",name:"Groq",category:"apikey",description:"超快推理速度",websiteUrl:"https://console.groq.com",baseUrl:"https://api.groq.com/openai/v1",wireApi:"openai",models:["llama-3.1-70b-versatile","llama-3.1-8b-instant","mixtral-8x7b-32768"]},{id:"together",name:"Together AI",category:"apikey",description:"开源模型托管",websiteUrl:"https://www.together.ai",baseUrl:"https://api.together.xyz/v1",wireApi:"openai",models:["meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo","mistralai/Mixtral-8x7B-Instruct-v0.1"]},{id:"entry_claude",name:"Claude Code 入口",category:"entry",description:"渠道按 Claude Code 请求入口管理",websiteUrl:"",baseUrl:"",wireApi:"openai",gatewaySourceType:"claude",models:[]},{id:"entry_codex",name:"Codex 入口",category:"entry",description:"渠道按 Codex 请求入口管理",websiteUrl:"",baseUrl:"",wireApi:"openai",gatewaySourceType:"codex",models:[]},{id:"entry_gemini",name:"Gemini 入口",category:"entry",description:"渠道按 Gemini 请求入口管理",websiteUrl:"",baseUrl:"",wireApi:"openai",gatewaySourceType:"gemini",models:[]},{id:"custom",name:"自定义",category:"custom",description:"自定义 OpenAI 兼容的 API 端点",websiteUrl:"",baseUrl:"",wireApi:"openai",models:[]}],nn={apikey:"API Key",entry:"转换入口",custom:"自定义"};function sn(e){return tn.find(a=>a.id===e)}const{getAllModelsByToolType:on,loadDefaultModels:rn}=st(),un=/^https?:\/\//i,cn=/^[a-z0-9_]+$/i;function dn(e){const a=Number(e);return!Number.isFinite(a)||a<=0?null:Math.round(a)}function pn(e){const a=Number(e);return!Number.isFinite(a)||a<1?1:Math.min(100,Math.round(a))}function vn(e,a,{required:l}={}){if(!a)return l?`${e}不能为空`:"";if(!un.test(a))return`${e}必须以 http:// 或 https:// 开头`;try{new URL(a)}catch(t){return`${e}不是合法的链接`}return""}function mn(e){return e?cn.test(e)?"":"只能包含字母、数字和下划线,例如 openai":"Provider Key 不能为空"}function fn(e){return{apiKey:e.apiKey||""}}function gn(e){return{...e}}function yn(e){const a=String(e||"").trim().toLowerCase();return"claude"===a?"Claude Code":"gemini"===a?"Gemini":"Codex"}function hn(e=[]){return e.map(e=>({label:e,value:e}))}function bn(...e){const a=new Set,l=[];for(const t of e)for(const e of t||[]){const t=String((null==e?void 0:e.value)||"").trim();if(!t)continue;const n=t.toLowerCase();a.has(n)||(a.add(n),l.push({label:(null==e?void 0:e.label)||t,value:t}))}return l}function wn(e){return hn(on(e))}const kn={schedule:[{key:"maxConcurrency",label:"最大并发",type:"number",placeholder:"留空表示不限",clearable:!0,validate:e=>{if(null==e||""===e)return"";const a=Number(e);return!Number.isFinite(a)||a<=0?"并发需为大于 0 的数字":a>100?"并发最多 100":""}},{key:"weight",label:"调度权重",type:"number",placeholder:"默认 1",min:1,max:100,validate:e=>{const a=Number(e);return!Number.isFinite(a)||a<1?"调度权重至少为 1":""}},{key:"enabled",label:"渠道状态",type:"switch",checkedText:"启用",uncheckedText:"停用"}]},_n={claude:()=>({type:"claude",displayName:"Claude",schedulerSource:"claude",storageKeys:{localCollapse:"claudeChannelCollapse",collapseConfigKey:"claude",orderConfigKey:"claude"},emptyDescription:"暂无渠道",showEmptyAction:!1,emptyActionText:"",modalWidth:520,formLabelWidth:95,showApplyButton:!0,presets:Vt,presetCategories:Jt,getPresetById:Zt,formSections:[{title:"供应商预设",fields:[{key:"presetId",label:"选择预设",type:"preset",placeholder:"选择供应商预设"}]},{title:"基本信息",fields:[{key:"name",label:"渠道名称",type:"text",required:!0,placeholder:"输入渠道名称"},{key:"baseUrl",label:"接口地址",type:"text",required:!0,placeholder:"https://api.example.com",validate:e=>vn("接口地址",e,{required:!0})},{key:"apiKey",label:"接口密钥",type:"password",required:!0,placeholder:"sk-..."},{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>vn("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则自动检测)",description:"指定用于速度测试的模型,留空则使用自动检测",options:wn("claude"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,showWhen:e=>"official"===e.presetId,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"模型配置",description:"代理关闭时:模型映射(写入 settings.json);代理开启时:模型重定向(如 opus → sonnet 节省 token)",collapsible:!0,showWhen:e=>e.presetId&&"official"!==e.presetId,fields:[{key:"modelConfig.model",label:"主模型",type:"autocomplete",placeholder:"如 glm-4.6"},{key:"modelConfig.haikuModel",label:"Haiku 模型",type:"autocomplete",placeholder:"如 glm-4.5-air"},{key:"modelConfig.sonnetModel",label:"Sonnet 模型",type:"autocomplete",placeholder:"如 glm-4.6"},{key:"modelConfig.opusModel",label:"Opus 模型",type:"autocomplete",placeholder:"如 glm-4.6"}]},{title:"调度配置",fields:kn.schedule},{title:"网络代理",description:"部分渠道可能需要代理才能访问",collapsible:!0,fields:[{key:"proxyUrl",label:"代理地址",type:"text",placeholder:"http://127.0.0.1:7890(选填)"}]}],getInitialForm:()=>({presetId:"official",name:"Claude 官方",baseUrl:"https://api.anthropic.com",apiKey:"",websiteUrl:"https://www.anthropic.com",speedTestModel:"",modelConfig:{model:"",haikuModel:"",sonnetModel:"",opusModel:""},modelRedirects:[],proxyUrl:"",gatewaySourceType:"claude",maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null}),mapChannelToForm:e=>{var a,l,t,n;return{presetId:e.presetId||"official",name:e.name||"",baseUrl:e.baseUrl||"",apiKey:e.apiKey||"",websiteUrl:e.websiteUrl||"",speedTestModel:e.speedTestModel||"",modelConfig:{model:(null==(a=e.modelConfig)?void 0:a.model)||"",haikuModel:(null==(l=e.modelConfig)?void 0:l.haikuModel)||"",sonnetModel:(null==(t=e.modelConfig)?void 0:t.sonnetModel)||"",opusModel:(null==(n=e.modelConfig)?void 0:n.opusModel)||""},modelRedirects:e.modelRedirects||[],proxyUrl:e.proxyUrl||"",gatewaySourceType:e.gatewaySourceType||"claude",maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null}},onPresetChange:(e,a)=>{const l=Zt(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"claude",l.env&&(t.modelConfig={model:l.env.ANTHROPIC_MODEL||"",haikuModel:l.env.ANTHROPIC_DEFAULT_HAIKU_MODEL||"",sonnetModel:l.env.ANTHROPIC_DEFAULT_SONNET_MODEL||"",opusModel:l.env.ANTHROPIC_DEFAULT_OPUS_MODEL||""}),gn(t)},fetchModelsForChannel:async(e,a)=>{var l;if(await rn(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=wn("claude"),void(a.modelsFetching=!1);try{const l=await Mt(e,a.gatewaySourceType||null);l.models&&l.models.length>0?(a.availableModels=bn(hn(l.models),wn("claude")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表(API 端点受保护)",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=wn("claude"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(t){a.availableModels=wn("claude");const e=null==(l=t.response)?void 0:l.data;e?(a.modelsFetchError=e.error||t.message||"获取模型列表失败",a.modelsFetchErrorHint=e.errorHint||"已使用默认模型列表"):(a.modelsFetchError=t.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表")}finally{a.modelsFetching=!1}},testFn:Pt,api:{fetch:async()=>(await vt()).channels||[],create:async e=>{const a=fn(e);await mt(e.name,e.baseUrl,a.apiKey,e.websiteUrl||void 0,{maxConcurrency:dn(e.maxConcurrency),weight:pn(e.weight),enabled:e.enabled,presetId:e.presetId,modelConfig:e.modelConfig,modelRedirects:e.modelRedirects||[],proxyUrl:e.proxyUrl||"",speedTestModel:e.speedTestModel||null,gatewaySourceType:e.gatewaySourceType||"claude"})},update:async(e,a)=>{const l=fn(a);await ft(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:dn(a.maxConcurrency),weight:pn(a.weight),enabled:a.enabled,presetId:a.presetId,modelConfig:a.modelConfig,modelRedirects:a.modelRedirects||[],proxyUrl:a.proxyUrl||"",speedTestModel:a.speedTestModel||null,gatewaySourceType:a.gatewaySourceType||"claude"})},toggle:async(e,a)=>{await ft(e.id,{enabled:a})},remove:gt,applyToSettings:async e=>yt(e.id),resetHealth:async e=>ht(e.id)},getHeaderTags:(e,a)=>{var l,t;const n=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?n.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&n.push({text:"检测中",type:"warning"}),!1===e.enabled&&n.push({text:"未启用",type:"default"}),n},buildInfoRows:(e,a)=>{var l;return[{label:"URL",value:e.baseUrl},{label:"Key",value:a.maskApiKey(e.apiKey),mono:!0,action:"healthy"!==(null==(l=e.health)?void 0:l.status)?()=>a.handleResetHealth(e):null,actionLabel:"重置状态"}]}}),codex:()=>({type:"codex",displayName:"Codex",schedulerSource:"codex",storageKeys:{localCollapse:"codexChannelCollapse",collapseConfigKey:"codex",orderConfigKey:"codex"},emptyDescription:"暂无渠道",showEmptyAction:!0,emptyActionText:"添加 Codex 渠道",modalWidth:600,formLabelWidth:90,showApplyButton:!0,presets:Yt,presetCategories:Xt,getPresetById:Qt,formSections:[{title:"供应商预设",fields:[{key:"presetId",label:"选择预设",type:"preset",placeholder:"选择供应商预设"}]},{title:"基本信息",fields:[{key:"name",label:"渠道名称",type:"text",required:!0,placeholder:"显示名称"},{key:"providerKey",label:"Provider Key",type:"text",required:!0,placeholder:"英文标识,如 openai",disabledOnEdit:!0,validate:mn},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://api.example.com",validate:e=>vn("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-..."},{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>vn("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用默认)",description:"指定用于速度测试的模型,留空则使用默认模型",options:wn("codex"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:kn.schedule}],getInitialForm:()=>({presetId:"openai",name:"OpenAI",providerKey:"openai",baseUrl:"https://api.openai.com/v1",apiKey:"",websiteUrl:"https://platform.openai.com",gatewaySourceType:"codex",speedTestModel:"",modelRedirects:[],maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),mapChannelToForm:e=>({presetId:e.presetId||"custom",name:e.name||"",providerKey:e.providerKey||"",baseUrl:e.baseUrl||"",apiKey:e.apiKey||"",websiteUrl:e.websiteUrl||"",gatewaySourceType:e.gatewaySourceType||"codex",speedTestModel:e.speedTestModel||"",modelRedirects:e.modelRedirects||[],maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),onPresetChange:(e,a)=>{const l=Qt(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.providerKey=l.providerKey||"",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"codex",gn(t)},fetchModelsForChannel:async(e,a)=>{if(await rn(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=wn("codex"),void(a.modelsFetching=!1);try{const l=await Et(e);l.models&&l.models.length>0?(a.availableModels=bn(hn(l.models),wn("codex")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=wn("codex"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(l){a.availableModels=wn("codex"),a.modelsFetchError=l.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表"}finally{a.modelsFetching=!1}},testFn:jt,api:{fetch:async()=>(await bt()).channels||[],create:async e=>{const a=fn(e);await wt(e.name,e.providerKey,e.baseUrl,a.apiKey,e.websiteUrl||"",{maxConcurrency:dn(e.maxConcurrency),weight:pn(e.weight),enabled:e.enabled,modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,gatewaySourceType:e.gatewaySourceType||"codex"})},update:async(e,a)=>{const l=fn(a);await kt(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:dn(a.maxConcurrency),weight:pn(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,gatewaySourceType:a.gatewaySourceType||"codex"})},toggle:async(e,a)=>kt(e.id,{enabled:a}),remove:_t,applyToSettings:async e=>xt(e.id),resetHealth:async e=>Ct(e.id)},getHeaderTags:(e,a)=>{var l,t;const n=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?n.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&n.push({text:"检测中",type:"warning"}),!1===e.enabled&&n.push({text:"已禁用",type:"default"}),n},buildInfoRows:(e,a)=>{var l;return[{label:"Provider",value:e.providerKey,mono:!0},{label:"URL",value:e.baseUrl},{label:"Key",value:a.maskApiKey(e.apiKey),mono:!0,action:"healthy"!==(null==(l=e.health)?void 0:l.status)?()=>a.handleResetHealth(e):null,actionLabel:"重置状态"}]}}),gemini:()=>({type:"gemini",displayName:"Gemini",schedulerSource:"gemini",storageKeys:{localCollapse:"geminiChannelCollapse",collapseConfigKey:"gemini",orderConfigKey:"gemini"},emptyDescription:"暂无渠道",showEmptyAction:!0,emptyActionText:"添加 Gemini 渠道",modalWidth:520,formLabelWidth:90,showApplyButton:!1,presets:en,presetCategories:an,getPresetById:ln,formSections:[{title:"供应商预设",fields:[{key:"presetId",label:"选择预设",type:"preset",placeholder:"选择供应商预设"}]},{title:"基本信息",fields:[{key:"name",label:"渠道名称",type:"text",required:!0,placeholder:"显示名称"},{key:"model",label:"Model",type:"text",required:!0,placeholder:"例如 gemini-2.5-pro"},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://generativelanguage.googleapis.com/v1beta",validate:e=>vn("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"AIza..."},{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>vn("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用 model 字段)",description:"指定用于速度测试的模型,留空则使用上方配置的 Model",options:wn("gemini"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:kn.schedule}],getInitialForm:()=>({presetId:"google",name:"Google AI",model:"gemini-2.5-pro",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiKey:"",websiteUrl:"https://ai.google.dev",gatewaySourceType:"gemini",speedTestModel:"",modelRedirects:[],maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),mapChannelToForm:e=>({presetId:e.presetId||"custom",name:e.name||"",model:e.model||"",baseUrl:e.baseUrl||"",apiKey:e.apiKey||"",websiteUrl:e.websiteUrl||"",gatewaySourceType:e.gatewaySourceType||"gemini",speedTestModel:e.speedTestModel||"",modelRedirects:e.modelRedirects||[],maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),onPresetChange:(e,a)=>{const l=ln(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"gemini",gn(t)},fetchModelsForChannel:async(e,a)=>{if(await rn(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=wn("gemini"),void(a.modelsFetching=!1);try{const l=await Dt(e);l.models&&l.models.length>0?(a.availableModels=bn(hn(l.models),wn("gemini")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=wn("gemini"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(l){a.availableModels=wn("gemini"),a.modelsFetchError=l.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表"}finally{a.modelsFetching=!1}},testFn:At,api:{fetch:async()=>(await Ut()).channels||[],create:async e=>{const a=fn(e);await St(e.name,e.baseUrl,a.apiKey,e.model,e.websiteUrl||"",{maxConcurrency:dn(e.maxConcurrency),weight:pn(e.weight),enabled:e.enabled,modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,gatewaySourceType:e.gatewaySourceType||"gemini"})},update:async(e,a)=>{const l=fn(a);await zt(e.id,{name:a.name,model:a.model,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:dn(a.maxConcurrency),weight:pn(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,gatewaySourceType:a.gatewaySourceType||"gemini"})},toggle:async(e,a)=>zt(e.id,{enabled:a}),remove:It,resetHealth:async e=>Tt(e.id)},getHeaderTags:(e,a)=>{var l,t;const n=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?n.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&n.push({text:"检测中",type:"warning"}),!1===e.enabled&&n.push({text:"已禁用",type:"default"}),n},buildInfoRows:(e,a)=>{var l;return[{label:"Model",value:e.model,mono:!0},{label:"URL",value:e.baseUrl},{label:"Key",value:a.maskApiKey(e.apiKey),mono:!0,action:"healthy"!==(null==(l=e.health)?void 0:l.status)?()=>a.handleResetHealth(e):null,actionLabel:"重置状态"}]}}),opencode:()=>({type:"opencode",displayName:"OpenCode",schedulerSource:"opencode",storageKeys:{localCollapse:"opencodeChannelCollapse",collapseConfigKey:"opencode",orderConfigKey:"opencode"},emptyDescription:"暂无渠道",showEmptyAction:!0,emptyActionText:"添加 OpenCode 渠道",modalWidth:600,formLabelWidth:95,showApplyButton:!1,presets:tn,presetCategories:nn,getPresetById:sn,formSections:[{title:"供应商预设",fields:[{key:"presetId",label:"选择预设",type:"preset",placeholder:"选择供应商预设"}]},{title:"基本信息",fields:[{key:"name",label:"渠道名称",type:"text",required:!0,placeholder:"显示名称"},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://api.example.com/v1",validate:e=>vn("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-..."},{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>vn("官网链接",e,{required:!1})},{key:"model",label:"默认模型",type:"select",placeholder:"选择或输入默认模型(留空则由调度器决定)",options:[],clearable:!0},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用默认模型)",description:"指定用于速度测试的模型,留空则自动检测",options:[],clearable:!0},{key:"allowedModels",label:"可用模型",type:"model-multi-select",placeholder:"选择注册到 OpenCode 的模型(留空则使用检测到的所有模型)",description:"选择哪些模型注册到 opencode.json 的 provider 配置中"}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:kn.schedule}],getInitialForm:()=>({presetId:"openrouter",name:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",wireApi:"openai",apiKey:"",websiteUrl:"https://openrouter.ai",model:"",gatewaySourceType:"codex",speedTestModel:"",modelRedirects:[],allowedModels:[],maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),mapChannelToForm:e=>({presetId:e.presetId||"custom",name:e.name||"",baseUrl:e.baseUrl||"",wireApi:e.wireApi||"openai",apiKey:e.apiKey||"",websiteUrl:e.websiteUrl||"",model:e.model||"",gatewaySourceType:e.gatewaySourceType||"codex",speedTestModel:e.speedTestModel||"",modelRedirects:e.modelRedirects||[],allowedModels:e.allowedModels||[],maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null,modelsFetchErrorHint:null}),onPresetChange:(e,a)=>{const l=sn(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.wireApi=l.wireApi||"openai",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"codex",gn(t)},fetchModelsForChannel:async(e,a,{forceRefresh:l=!1}={})=>{await rn(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null;const t=a.presetId||"";if(["entry_claude","entry_codex","entry_gemini"].includes(t)){const e=a.gatewaySourceType||"codex",l="claude"===e?"claude":"gemini"===e?"gemini":"codex";return a.availableModels=wn(l),void(a.modelsFetching=!1)}if(e)try{const t=await Kt(e,{forceRefresh:l});t.models&&t.models.length>0?(a.availableModels=hn(t.models),t.fallbackUsed&&(a.modelsFetchError=t.error||"无法自动获取模型列表",a.modelsFetchErrorHint=t.errorHint||"请手动填写模型名称")):(a.availableModels=[],t.error&&(a.modelsFetchError=t.error,a.modelsFetchErrorHint=t.errorHint||"请手动填写模型名称"))}catch(n){a.availableModels=[],a.modelsFetchError=n.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}else{if(!a.baseUrl)return a.availableModels=[],void(a.modelsFetching=!1);try{const e=await Gt({baseUrl:a.baseUrl,apiKey:a.apiKey||"",gatewaySourceType:a.gatewaySourceType||"codex"});a.availableModels=e.models&&e.models.length>0?hn(e.models):[],e.error&&(a.modelsFetchError=e.error,a.modelsFetchErrorHint=e.errorHint||"请手动填写模型名称")}catch(n){a.availableModels=[],a.modelsFetchError=n.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}}},testFn:qt,api:{fetch:async()=>(await Nt()).channels||[],create:async e=>{const a=fn(e);await Ft(e.name,e.baseUrl,a.apiKey,{wireApi:e.wireApi||"openai",maxConcurrency:dn(e.maxConcurrency),weight:pn(e.weight),enabled:e.enabled,model:e.model||null,gatewaySourceType:e.gatewaySourceType||"codex",modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,websiteUrl:e.websiteUrl||"",allowedModels:e.allowedModels||[]})},update:async(e,a)=>{const l=fn(a);await Rt(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,wireApi:a.wireApi||"openai",websiteUrl:a.websiteUrl,model:a.model||null,gatewaySourceType:a.gatewaySourceType||"codex",maxConcurrency:dn(a.maxConcurrency),weight:pn(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,allowedModels:a.allowedModels||[]})},toggle:async(e,a)=>Rt(e.id,{enabled:a}),remove:Bt,resetHealth:async e=>Ht(e.id)},getHeaderTags:(e,a)=>{var l,t;const n=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?n.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&n.push({text:"检测中",type:"warning"}),!1===e.enabled&&n.push({text:"已禁用",type:"default"}),n},buildInfoRows:(e,a)=>{var l;return[{label:"入口协议",value:yn(e.gatewaySourceType),mono:!0},{label:"Wire API",value:e.wireApi||"openai",mono:!0},{label:"Provider Key",value:e.providerKey||"(未设置)",mono:!0},{label:"Model",value:e.model||"(默认)",mono:!0},{label:"URL",value:e.baseUrl},{label:"Key",value:a.maskApiKey(e.apiKey),mono:!0,action:"healthy"!==(null==(l=e.health)?void 0:l.status)?()=>a.handleResetHealth(e):null,actionLabel:"重置状态"}]}})};function xn(){return Z(["message","dialog"],{configProviderProps:{theme:"dark"===document.documentElement.getAttribute("data-theme")?Y:X}})}let Cn=xn();new MutationObserver(()=>{Cn=xn()}).observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]});const Un={success:(...e)=>Cn.message.success(...e),error:(...e)=>Cn.message.error(...e),warning:(...e)=>Cn.message.warning(...e),info:(...e)=>Cn.message.info(...e),loading:(...e)=>Cn.message.loading(...e)},Sn={success:(...e)=>Cn.dialog.success(...e),error:(...e)=>Cn.dialog.error(...e),warning:(...e)=>Cn.dialog.warning(...e),info:(...e)=>Cn.dialog.info(...e),create:(...e)=>Cn.dialog.create(...e)};async function zn(){return(await dt.get("/ui-config")).data}async function In(e){return(await dt.post("/ui-config",{config:e})).data}async function Tn(e,a){return(await dt.put(`/ui-config/${e}`,{value:a})).data}async function Pn(e,a,l){return(await dt.put(`/ui-config/${e}/${a}`,{value:l})).data}const Mn=Object.freeze(Object.defineProperty({__proto__:null,getUIConfig:zn,saveUIConfig:In,updateNestedUIConfig:Pn,updateUIConfigKey:Tn},Symbol.toStringTag,{value:"Module"})),$n="__ccAdvancedConfigBound__";let jn=null,On=0,An=!1,Ln=null;const En=Object.create(null);function Dn(){const e=new Date;return e.setHours(0,0,0,0),{start:e.getTime(),end:e.getTime()+864e5}}const Nn=k("global",()=>{const e=l({running:!1,activeChannel:null,port:20088,runtime:null,startTime:null,defaultPort:20088}),a=l({running:!1,activeChannel:null,port:20089,runtime:null,startTime:null,defaultPort:20089}),t=l({running:!1,activeChannel:null,port:20090,runtime:null,startTime:null,defaultPort:20090}),n=l({running:!1,activeChannel:null,port:20091,runtime:null,startTime:null,defaultPort:20091}),s=l([]),o=l([]),i=l([]),r=l([]);function u(){Object.keys(En).forEach(e=>{delete En[e]}),s.value.forEach(e=>{(null==e?void 0:e.name)&&(En[e.name]="claude")}),o.value.forEach(e=>{(null==e?void 0:e.name)&&(En[e.name]="codex")}),i.value.forEach(e=>{(null==e?void 0:e.name)&&(En[e.name]="gemini")}),r.value.forEach(e=>{(null==e?void 0:e.name)&&(En[e.name]="opencode")})}const c=_({claude:{channels:[],pending:0},codex:{channels:[],pending:0},gemini:{channels:[],pending:0},opencode:{channels:[],pending:0}}),d=_({claude:[],codex:[],gemini:[],opencode:[]}),p=l(!1),v=l(100),m=l(30);let f=100,g=Dn();function y(e){return function(){const e=Date.now();(e<g.start||e>=g.end)&&(g=Dn(),C())}(),e>=g.start&&e<g.end}function h(e){for(;e.length>f;)e.pop()}function b(e){f=e,v.value=e,Object.values(d).forEach(h)}function k(e){const a=parseInt(e,10);if(Number.isNaN(a))return;const l=Math.min(Math.max(a,10),300);m.value!==l&&(m.value=l)}function x(e){const a=function(e){var a,l,t;if(e.source)return e.source;if("opencode"===e.toolType)return"opencode";if("codex"===e.toolType)return"codex";if("gemini"===e.toolType)return"gemini";if("claude"===e.toolType||"claude-code"===e.toolType)return"claude";if(e.model){const a=e.model.toLowerCase();if(a.includes("claude"))return"claude";if(a.includes("gpt")||a.includes("o1")||a.includes("o3"))return"codex";if(a.includes("gemini"))return"gemini";if(a.includes("opencode")||a.includes("deepseek")||a.includes("qwen"))return"opencode"}if(e.channel){const a=En[e.channel];if(a)return a}return(null==(a=e.action)?void 0:a.includes("opencode"))?"opencode":(null==(l=e.action)?void 0:l.includes("codex"))?"codex":(null==(t=e.action)?void 0:t.includes("gemini"))?"gemini":"claude"}(e),l=d[a];if(!l)return;const t=e.timestamp||Date.now();if(!y(t))return;const n=e.time||new Date(t).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}),s={id:e.id||`${Date.now()}-${Math.random()}`,source:a,type:e.type||(e.action?"action":"log"),action:e.action||null,channel:e.channel||e.channelName||"Unknown",model:e.model,message:e.message,timestamp:t,time:n,tokens:{input:e.inputTokens||0,output:e.outputTokens||0,cacheCreation:e.cacheCreation||0,cacheRead:e.cacheRead||0,cached:e.cachedTokens||0,reasoning:e.reasoningTokens||0,total:e.totalTokens||(e.inputTokens||0)+(e.outputTokens||0)},cost:e.cost||0,isHistory:An,isNew:!An};l.unshift(s),h(l),s.isNew&&setTimeout(()=>{s.isNew=!1},4500)}function C(){Object.keys(d).forEach(e=>{d[e].splice(0,d[e].length)})}function U(e,a={},l){e.value={...e.value,...a,activeChannel:l||e.value.activeChannel}}function S(l){const{source:c,proxy:d,activeChannel:p,channels:v}=l;"claude"===c?(U(e,d,p),v&&(s.value=v,u())):"codex"===c?(U(a,d,p),v&&(o.value=v,u())):"gemini"===c?(U(t,d,p),v&&(i.value=v,u())):"opencode"===c&&(U(n,d,p),v&&(r.value=v,u()))}async function z(){var l,s,o,i;try{const[r,u,c,d]=await Promise.all([B.get("/api/proxy/status").catch(()=>({})),B.get("/api/codex/proxy/status").catch(()=>({})),B.get("/api/gemini/proxy/status").catch(()=>({})),B.get("/api/opencode/proxy/status").catch(()=>({}))]);(null==(l=r.data)?void 0:l.proxy)&&U(e,r.data.proxy,r.data.activeChannel),(null==(s=u.data)?void 0:s.proxy)&&U(a,u.data.proxy,u.data.activeChannel),(null==(o=c.data)?void 0:o.proxy)&&U(t,c.data.proxy,c.data.activeChannel),(null==(i=d.data)?void 0:i.proxy)&&U(n,d.data.proxy,d.data.activeChannel)}catch(r){}}async function I(){var e,a,l,t;try{const[n,d,p,v,m,f,g,y]=await Promise.all([B.get("/api/channels").catch(()=>({data:{channels:[]}})),B.get("/api/codex/channels").catch(()=>({data:{channels:[]}})),B.get("/api/gemini/channels").catch(()=>({data:{channels:[]}})),B.get("/api/opencode/channels").catch(()=>({data:{channels:[]}})),B.get("/api/channels/pool/status?source=claude").catch(()=>({data:null})),B.get("/api/channels/pool/status?source=codex").catch(()=>({data:null})),B.get("/api/channels/pool/status?source=gemini").catch(()=>({data:null})),B.get("/api/channels/pool/status?source=opencode").catch(()=>({data:null}))]);s.value=n.data.channels||[],o.value=d.data.channels||[],i.value=p.data.channels||[],r.value=v.data.channels||[],u(),(null==(e=m.data)?void 0:e.scheduler)&&(c.claude=m.data.scheduler),(null==(a=f.data)?void 0:a.scheduler)&&(c.codex=f.data.scheduler),(null==(l=g.data)?void 0:l.scheduler)&&(c.gemini=g.data.scheduler),(null==(t=y.data)?void 0:t.scheduler)&&(c.opencode=y.data.scheduler)}catch(n){}}function T(l){return"codex"===l?a:"gemini"===l?t:"opencode"===l?n:e}return"undefined"==typeof window||window[$n]||(window.addEventListener("advanced-config-change",e=>{var a,l;(null==(a=e.detail)?void 0:a.maxLogs)&&b(e.detail.maxLogs),(null==(l=e.detail)?void 0:l.statsInterval)&&k(e.detail.statsInterval)}),window[$n]=!0),{claudeProxy:e,codexProxy:a,geminiProxy:t,opencodeProxy:n,claudeChannels:s,codexChannels:o,geminiChannels:i,opencodeChannels:r,schedulerState:c,connectWebSocket:function e(){if(jn&&jn.readyState===WebSocket.OPEN)return;const a=`${"https:"===window.location.protocol?"wss:":"ws:"}//${window.location.host}/ws`;try{jn=new WebSocket(a),jn.onopen=()=>{On=0,p.value=!0,An=!0,clearTimeout(Ln),Ln=setTimeout(()=>{An=!1},2e3),z()},jn.onmessage=e=>{try{const a=JSON.parse(e.data);"proxy-state"===a.type?S(a):"scheduler-state"===a.type?function(e){const{source:a,scheduler:l}=e;c[a]&&l&&(c[a]=l)}(a):x(a)}catch(a){}},jn.onclose=()=>{p.value=!1,jn=null,An=!1,clearTimeout(Ln);const a=Math.min(1e3*Math.pow(2,On),1e4);On+=1,setTimeout(e,a)},jn.onerror=e=>{p.value=!1}}catch(l){p.value=!1}},initializeState:z,loadChannels:I,getProxyState:T,getChannels:function(e){return"codex"===e?o:"gemini"===e?i:"opencode"===e?r:s},getSchedulerState:function(e){return c[e]||{channels:[],pending:0}},handleProxyStateUpdate:S,startProxy:async function(e){let a;a="codex"===e?"/api/codex/proxy/start":"gemini"===e?"/api/gemini/proxy/start":"opencode"===e?"/api/opencode/proxy/start":"/api/proxy/start";const l=await B.post(a);if(l.data.success){const a=T(e);a.value.running=!0,a.value.activeChannel=l.data.activeChannel,a.value.startTime=Date.now()}return l.data},stopProxy:async function(e,a={}){var l,t;let n;n="codex"===e?"/api/codex/proxy/stop":"gemini"===e?"/api/gemini/proxy/stop":"opencode"===e?"/api/opencode/proxy/stop":"/api/proxy/stop";const s=await B.post(n),o=T(e);return o.value.running=!1,o.value.activeChannel=null,o.value.startTime=null,o.value.runtime=null,!1!==(null==(l=s.data)?void 0:l.success)&&await I(),a.refreshChannelsDrawer&&!1!==(null==(t=s.data)?void 0:t.success)&&"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e,reason:"proxy-stop"}})),s.data},getLogs:function(e){return w(()=>d[e]||[])},wsConnected:p,clearLogsState:C,clearLogsForSource:function(e){d[e]&&d[e].splice(0,d[e].length)},logLimit:v,statsInterval:m,loadAdvancedConfig:async function(){try{const e=await fetch("/api/config/advanced");if(e.ok){const a=await e.json();b(a.maxLogs||100),a.statsInterval&&k(a.statsInterval)}}catch(e){}}}});let Fn=!1;function Rn(e){try{const a=localStorage.getItem(e);if(a)return JSON.parse(a)}catch(a){}return{}}function Bn(e,a){try{localStorage.setItem(e,JSON.stringify(a))}catch(l){}}function Hn(e,a){var l,t;return(null==(t=null==(l=null==e?void 0:e.response)?void 0:l.data)?void 0:t.error)?e.response.data.error:a||e.message||"操作失败"}function qn(e){const a=Nn(),l=_({channels:[],loading:!1,toggling:{},collapsed:Rn(e.storageKeys.localCollapse),showDialog:!1,editingChannel:null,formData:e.getInitialForm()}),t=_({});function n(){var t;const n=a.schedulerState[e.schedulerSource];(null==(t=null==n?void 0:n.channels)?void 0:t.length)&&l.channels.length&&l.channels.forEach(e=>{const a=n.channels.find(a=>a.id===e.id);(null==a?void 0:a.health)&&(e.health=a.health)})}const s=x(()=>{var l;return null==(l=a.schedulerState[e.schedulerSource])?void 0:l.channels},n);async function o(){l.loading=!0;try{const a=await e.api.fetch();l.channels=Array.isArray(a)?[...a]:[],await async function(){try{if(l.channels.length>0){const e=[...l.channels].sort((e,a)=>{const l=e.updatedAt||e.createdAt||0;return(a.updatedAt||a.createdAt||0)-l}),a=e.filter(e=>!1!==e.enabled),t=e.filter(e=>!1===e.enabled);t.forEach(e=>{l.collapsed[e.id]=!0}),l.channels=[...a,...t]}}catch(e){}}(),n()}catch(a){Un.error(Hn(a,`${e.displayName} 渠道加载失败`))}finally{l.loading=!1}}let i=null,r=0;async function u(){try{await Pn("channelCollapse",e.storageKeys.collapseConfigKey,l.collapsed)}catch(a){}}function c(){l.showDialog=!1,l.editingChannel=null,l.formData=e.getInitialForm(),d()}function d(){Object.keys(t).forEach(e=>{delete t[e]})}function p(){let a=!0;const n=e=>{const a=e.key.replace(/\./g,"_");delete t[e.key],delete t[a]};return e.formSections.forEach(e=>{const s=(e=>!e.showWhen||e.showWhen(l.formData))(e);e.fields.forEach(e=>{if(!s||!(e=>!e.showWhen||e.showWhen(l.formData))(e))return void n(e);const o=((e,a)=>{if(!a||"string"!=typeof a||!a.includes("."))return e[a];const l=a.split(".");let t=e;for(const n of l)t=null==t?void 0:t[n];return t})(l.formData,e.key);let i="";e.required&&(i=e.customRequiredMessage?null==o||""===o?e.customRequiredMessage:"":null==o||""===o?`${e.label}不能为空`:""),i||"function"!=typeof e.validate||(i=e.validate(o,l.formData)||""),i?(t[e.key]={status:"error",message:i},a=!1):n(e)})}),a}return Promise.all([o(),async function(){var a;try{const t=await async function(){const e=Date.now();if(i&&e-r<6e4)return i;try{const a=await zn();if(a.success&&a.config)return i=a.config,r=e,i}catch(a){}return null}();if(t){const n=(null==(a=t.channelCollapse)?void 0:a[e.storageKeys.collapseConfigKey])||{};l.collapsed=n,Bn(e.storageKeys.localCollapse,n)}}catch(t){}}()]),C(()=>{s()}),{state:l,validation:t,actions:{loadChannels:o,openAddDialog:function(){l.editingChannel=null,l.formData=e.getInitialForm(),d(),l.showDialog=!0},closeDialog:c,toggleCollapse:function(a){l.collapsed[a]=!l.collapsed[a],Bn(e.storageKeys.localCollapse,l.collapsed),u()},handleEdit:function(a){l.editingChannel=a,l.formData=e.mapChannelToForm(a),d(),l.showDialog=!0},handleSave:async function(){if(p())try{l.editingChannel?(await e.api.update(l.editingChannel,l.formData),Un.success(`${e.displayName} 渠道已更新`)):(await e.api.create(l.formData),Un.success(`${e.displayName} 渠道已添加`)),c(),await o()}catch(a){Un.error(Hn(a))}else Un.error("请检查表单填写是否完整")},handleDelete:function(a){Sn.warning({title:`删除 ${e.displayName} 渠道`,content:"确定要删除这个渠道吗?",positiveText:"确定",negativeText:"取消",onPositiveClick:async()=>{try{await e.api.remove(a),Un.success(`${e.displayName} 渠道已删除`),await o()}catch(l){Un.error(Hn(l))}}})},handleToggleEnabled:async function(a,t){if(a&&!l.toggling[a.id]){l.toggling[a.id]=!0;try{const n="boolean"==typeof t?t:!1===a.enabled;await e.api.toggle(a,n),Un.success(`${e.displayName} 渠道已${n?"启用":"禁用"}`),n||(l.collapsed[a.id]=!0,Bn(e.storageKeys.localCollapse,l.collapsed),u()),await o()}catch(n){Un.error(Hn(n))}finally{l.toggling[a.id]=!1}}},handleApplyToSettings:function(a){"function"==typeof e.api.applyToSettings&&Sn.warning({title:"写入配置",content:"写入配置后会关闭动态切换并默认使用该渠道,是否继续?",positiveText:"确定",negativeText:"取消",onPositiveClick:async()=>{try{await e.api.applyToSettings(a),Un.success("已将渠道写入配置文件"),await o()}catch(l){Un.error(Hn(l))}}})},handleResetHealth:async function(a){if("function"==typeof e.api.resetHealth)try{await e.api.resetHealth(a),Un.success("渠道健康状态已重置"),await o()}catch(l){Un.error(Hn(l))}},handleDragEnd:async function(a){if(a&&a.newIndex!==a.oldIndex){const n=l.channels[a.newIndex];if(n)try{await e.api.update(n.id,{...n,updatedAt:Date.now()}),await o()}catch(t){}}}}}}const Kn={key:0,class:"loading-container"},Gn={key:1},Wn={key:0,class:"empty-state"},Vn={class:"section-title"},Jn={key:0,class:"section-desc"},Zn={style:{padding:"8px",color:"#d03050","font-size":"12px"}},Yn={style:{"font-weight":"500","margin-bottom":"4px"}},Xn={key:0,style:{color:"#666","font-size":"11px","line-height":"1.4"}},Qn={style:{padding:"8px",color:"#d03050","font-size":"12px"}},es={style:{"font-weight":"500","margin-bottom":"4px"}},as={key:0,style:{color:"#666","font-size":"11px","line-height":"1.4"}},ls={class:"dialog-footer"},ts={__name:"BaseChannelPanel",props:{type:{type:String,required:!0}},emits:["open-website"],setup(e,{expose:a,emit:l}){const p=l,b=(_n[e.type]||_n.claude)(),{state:k,validation:_,actions:C}=qn(b),{getChannelInflight:T}=function(e="claude"){const a=Nn();return{getChannelInflight:function(l){var t;const n=null==(t=(a.schedulerState[e]||{channels:[]}).channels)?void 0:t.find(e=>e.id===l);return n?n.inflight:0}}}(b.schedulerSource),P={group:{name:`${b.type}-channels`,pull:!1,put:!1},forceFallback:!0,fallbackOnBody:!1,fallbackTolerance:4,scroll:!0};async function M(){b.fetchModelsForChannel&&await O({forceRefresh:!0})}x(()=>k.showDialog,async e=>{e&&b.fetchModelsForChannel&&await O()});const $=w(()=>{if(!b.presets)return[];const e={};return b.presets.forEach(a=>{var l;const t=a.category||"custom";e[t]||(e[t]={type:"group",label:(null==(l=b.presetCategories)?void 0:l[t])||t,key:t,children:[]}),e[t].children.push({label:a.name,value:a.id})}),Object.values(e)});async function j(e){if(b.onPresetChange){const a=b.onPresetChange(e,k.formData);Object.assign(k.formData,a)}else k.formData.presetId=e;await O()}async function O({forceRefresh:e=!1}={}){var a;b.fetchModelsForChannel&&await b.fetchModelsForChannel((null==(a=k.editingChannel)?void 0:a.id)||null,k.formData,{forceRefresh:e})}function A(e,a){if(!a.includes("."))return e[a];const l=a.split(".");let t=e;for(const n of l)t=null==t?void 0:t[n];return t}function L(e,a,l){if(!a.includes("."))return void(e[a]=l);const t=a.split(".");let n=e;for(let s=0;s<t.length-1;s++)n[t[s]]||(n[t[s]]={}),n=n[t[s]];n[t[t.length-1]]=l}function E(e){const a=k.formData.availableModels||[];if(!e||!a.length)return a;const l=e.toLowerCase();return a.filter(e=>(e.label||e.value||"").toLowerCase().includes(l))}function D(e,a){const l=[],t=new Set,n=e=>{for(const a of e||[]){const e=String((null==a?void 0:a.value)||"").trim();if(!e)continue;const n=e.toLowerCase();t.has(n)||(t.add(n),l.push({label:(null==a?void 0:a.label)||e,value:e}))}};n(k.formData.availableModels||[]),n(a||[]);const s=l;if(!e||!s.length)return s;const o=e.toLowerCase();return s.filter(e=>(e.label||e.value||"").toLowerCase().includes(o))}function N(e){var a,l;const t=e.replace(/\./g,"_");return(null==(a=_[t])?void 0:a.status)||(null==(l=_[e])?void 0:l.status)}function F(e){var a,l;const t=e.replace(/\./g,"_");return(null==(a=_[t])?void 0:a.message)||(null==(l=_[e])?void 0:l.message)}const R={getChannelInflight:T,formatFreeze:e=>`冻结 ${e||0}s`,maskApiKey:e=>e?e.length<=12?"******":`${e.slice(0,8)}******${e.slice(-4)}`:"(未设置)",handleResetHealth:e=>C.handleResetHealth(e),handleOpenWebsite:e=>p("open-website",e)};function B(e){const a=T(e.id),l=e.maxConcurrency?`${a}/${e.maxConcurrency}`:a>0?a:"不限";return{weight:e.weight||1,concurrencyText:l,concurrencyActive:a>0}}function G(e){switch(e.type){case"password":case"text":default:return re;case"number":return ue;case"switch":return W;case"radio-group":return ne}}function V(e){const a={placeholder:e.placeholder};return"password"===e.type&&(a.type="password",a["show-password-on"]="click"),"number"===e.type&&(a.min=e.min??1,a.max=e.max??100,a.step=e.step??1,a.clearable=e.clearable,a.style="width: 100%;"),e.disabledOnEdit&&k.editingChannel&&(a.disabled=!0),a}return a({openAddDialog:C.openAddDialog,refresh:C.loadChannels}),(e,a)=>(n(),t("div",null,[c(k).loading?(n(),t("div",Kn,[r(c(Q),{size:"small"})])):(n(),t("div",Gn,[0===c(k).channels.length?(n(),t("div",Wn,[r(c(ee),{description:c(b).emptyDescription},U({_:2},[c(b).showEmptyAction?{name:"extra",fn:u(()=>[r(c(K),{type:"primary",size:"small",onClick:c(C).openAddDialog},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[y(" "+v(c(b).emptyActionText),1)]),_:1},8,["onClick"])]),key:"0"}:void 0]),1032,["description"])])):(n(),g(c(H),S({key:1,modelValue:c(k).channels,"onUpdate:modelValue":a[1]||(a[1]=e=>c(k).channels=e),"item-key":"id",class:"channels-list"},P,{"ghost-class":"ghost","chosen-class":"chosen","drag-class":"drag",animation:"200",onEnd:c(C).handleDragEnd}),{item:u(({element:e})=>[(n(),g(Vl,{key:e.id,channel:e,collapsed:c(k).collapsed[e.id],"header-tags":c(b).getHeaderTags(e,R),"info-rows":c(b).buildInfoRows(e,R),meta:B(e),"show-apply-button":c(b).showApplyButton,"channel-type":c(b).type,"test-fn":c(b).testFn,toggling:!!c(k).toggling[e.id],onToggleCollapse:a=>c(C).toggleCollapse(e.id),onApply:a=>c(C).handleApplyToSettings(e),onEdit:a=>c(C).handleEdit(e),onDelete:a=>c(C).handleDelete(e.id),onToggleEnabled:a=>c(C).handleToggleEnabled(e,a),onOpenWebsite:a[0]||(a[0]=e=>p("open-website",e))},null,8,["channel","collapsed","header-tags","info-rows","meta","show-apply-button","channel-type","test-fn","toggling","onToggleCollapse","onApply","onEdit","onDelete","onToggleEnabled"]))]),_:1},16,["modelValue","onEnd"]))])),r(c(ie),{show:c(k).showDialog,"onUpdate:show":a[6]||(a[6]=e=>c(k).showDialog=e),preset:"card",title:c(k).editingChannel?c(b).editTitle:c(b).addTitle,class:"channel-dialog",style:I({width:c(b).modalWidth+"px",maxHeight:"80vh"}),"content-style":{maxHeight:"calc(80vh - 100px)",overflowY:"auto"}},{footer:u(()=>[s("div",ls,[r(c(K),{onClick:c(C).closeDialog},{default:u(()=>[...a[7]||(a[7]=[y("取消",-1)])]),_:1},8,["onClick"]),r(c(K),{type:"primary",onClick:c(C).handleSave},{default:u(()=>[y(v(c(k).editingChannel?"保存修改":"添加渠道"),1)]),_:1},8,["onClick"])])]),default:u(()=>[r(c(ae),{"label-placement":"left","label-width":c(b).formLabelWidth,class:"channel-form"},{default:u(()=>[(n(!0),t(m,null,f(c(b).formSections,e=>(n(),t(m,{key:e.title},[!e.showWhen||e.showWhen(c(k).formData)?(n(),t("div",{key:0,class:d(["form-section",{collapsible:e.collapsible}])},[s("div",Vn,[y(v(e.title)+" ",1),e.description?(n(),t("span",Jn,v(e.description),1)):o("",!0)]),(n(!0),t(m,null,f(e.fields,e=>i((n(),g(c(le),{key:e.key,label:e.label,"label-style":e.fullWidth?{display:"none"}:void 0,required:e.required,"validation-status":N(e.key),feedback:F(e.key)},{default:u(()=>["preset"===e.type?(n(),g(c(te),{key:0,value:c(k).formData.presetId,options:$.value,placeholder:e.placeholder,"onUpdate:value":j},null,8,["value","options","placeholder"])):"model-redirect"===e.type?(n(),g(ct,{key:1,modelValue:c(k).formData.modelRedirects,"onUpdate:modelValue":a[2]||(a[2]=e=>c(k).formData.modelRedirects=e),"available-models":c(k).formData.availableModels,"channel-type":c(b).type},null,8,["modelValue","available-models","channel-type"])):"model-multi-select"===e.type?(n(),g(c(te),{key:2,value:c(k).formData.allowedModels,"onUpdate:value":a[3]||(a[3]=e=>c(k).formData.allowedModels=e),options:c(k).formData.availableModels||[],placeholder:e.placeholder,loading:c(k).formData.modelsFetching,multiple:"",filterable:"",clearable:"",tag:"",onFocus:M},null,8,["value","options","placeholder","loading"])):"select"===e.type&&"speedTestModel"===e.key?(n(),g(c(J),{key:3,value:c(k).formData.speedTestModel,options:D(c(k).formData.speedTestModel,e.options),placeholder:e.placeholder,loading:c(k).formData.modelsFetching,"get-show":()=>!0,clearable:"",onFocus:M,"onUpdate:value":a[4]||(a[4]=e=>c(k).formData.speedTestModel=e)},U({_:2},[c(k).formData.modelsFetchError?{name:"empty",fn:u(()=>[s("div",Zn,[s("div",Yn,v(c(k).formData.modelsFetchError),1),c(k).formData.modelsFetchErrorHint?(n(),t("div",Xn,v(c(k).formData.modelsFetchErrorHint),1)):o("",!0)])]),key:"0"}:void 0]),1032,["value","options","placeholder","loading"])):"select"===e.type&&"model"===e.key?(n(),g(c(J),{key:4,value:c(k).formData.model,options:D(c(k).formData.model,e.options),placeholder:e.placeholder,loading:c(k).formData.modelsFetching,"get-show":()=>!0,clearable:"",onFocus:M,"onUpdate:value":a[5]||(a[5]=e=>c(k).formData.model=e)},U({_:2},[c(k).formData.modelsFetchError?{name:"empty",fn:u(()=>[s("div",Qn,[s("div",es,v(c(k).formData.modelsFetchError),1),c(k).formData.modelsFetchErrorHint?(n(),t("div",as,v(c(k).formData.modelsFetchErrorHint),1)):o("",!0)])]),key:"0"}:void 0]),1032,["value","options","placeholder","loading"])):"autocomplete"===e.type?(n(),g(c(J),{key:5,value:A(c(k).formData,e.key),options:E(A(c(k).formData,e.key)),placeholder:e.placeholder,"get-show":()=>!0,"onUpdate:value":a=>L(c(k).formData,e.key,a)},null,8,["value","options","placeholder","onUpdate:value"])):"radio-group"===e.type?(n(),g(c(ne),{key:6,value:A(c(k).formData,e.key),"onUpdate:value":a=>L(c(k).formData,e.key,a)},{default:u(()=>[r(c(se),null,{default:u(()=>[(n(!0),t(m,null,f(e.options,e=>(n(),g(c(oe),{key:e.value,value:e.value},{default:u(()=>[y(v(e.label),1)]),_:2},1032,["value"]))),128))]),_:2},1024)]),_:2},1032,["value","onUpdate:value"])):(n(),g(z(G(e)),S({key:7,value:A(c(k).formData,e.key)},{ref_for:!0},V(e),{"onUpdate:value":a=>L(c(k).formData,e.key,a)}),null,16,["value","onUpdate:value"]))]),_:2},1032,["label","label-style","required","validation-status","feedback"])),[[h,!e.showWhen||e.showWhen(c(k).formData)]])),128))],2)):o("",!0)],64))),128))]),_:1},8,["label-width"])]),_:1},8,["show","title","style"])]))}},ns={__name:"ClaudeChannelPanel",emits:["open-website"],setup(e,{expose:a,emit:t}){const s=t,o=l(null);return a({openAddDialog:()=>{var e;return null==(e=o.value)?void 0:e.openAddDialog()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(ts,{ref_key:"baseRef",ref:o,type:"claude",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},ss={__name:"CodexChannelPanel",emits:["open-website"],setup(e,{expose:a,emit:t}){const s=t,o=l(null);return a({openAddDialog:()=>{var e;return null==(e=o.value)?void 0:e.openAddDialog()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(ts,{ref_key:"baseRef",ref:o,type:"codex",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},os={__name:"GeminiChannelPanel",emits:["open-website"],setup(e,{expose:a,emit:t}){const s=t,o=l(null);return a({openAddDialog:()=>{var e;return null==(e=o.value)?void 0:e.openAddDialog()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(ts,{ref_key:"baseRef",ref:o,type:"gemini",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},is={__name:"OpenCodeChannelPanel",emits:["open-website"],setup(e,{expose:a,emit:t}){const s=t,o=l(null);return a({openAddDialog:()=>{var e;return null==(e=o.value)?void 0:e.openAddDialog()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(ts,{ref_key:"baseRef",ref:o,type:"opencode",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}};async function rs(){return(await dt.get("/statistics/today")).data}async function us(){return(await dt.get("/codex/statistics/today")).data}async function cs(){return(await dt.get("/gemini/statistics/today")).data}async function ds(){return(await dt.get("/opencode/statistics/today")).data}async function ps(e){return(await dt.get("/statistics/trend",{params:e})).data}async function vs(e){return(await dt.get("/statistics/filters",{params:e})).data}function ms(e){return`/api/statistics/trend/export?${new URLSearchParams(e).toString()}`}const fs=Object.freeze(Object.defineProperty({__proto__:null,getAvailableFilters:vs,getCodexTodayStatistics:us,getDailyStatistics:async function(e){return(await dt.get(`/statistics/daily/${e}`)).data},getGeminiTodayStatistics:cs,getModelStats:async function(){return(await dt.get("/statistics/models")).data},getModelStatsHistory:async function(e=7){return(await dt.get("/statistics/models/history",{params:{days:e}})).data},getOpenCodeTodayStatistics:ds,getRecentStatistics:async function(e=7){return(await dt.get("/statistics/recent",{params:{days:e}})).data},getStatistics:async function(){return(await dt.get("/statistics/summary")).data},getTodayStatistics:rs,getToolModelStats:async function(e){return(await dt.get(`/statistics/models/${e}`)).data},getTrendExportUrl:ms,getTrendStatistics:ps},Symbol.toStringTag,{value:"Module"}));async function gs(){return(await dt.post("/proxy/logs/clear")).data}const ys=Object.freeze(Object.defineProperty({__proto__:null,clearProxyLogs:gs,getCodexProxyStatus:async function(){return(await dt.get("/codex/proxy/status")).data},getGeminiProxyStatus:async function(){return(await dt.get("/gemini/proxy/status")).data},getProxyStatus:async function(){return(await dt.get("/proxy/status")).data},startCodexProxy:async function(){return(await dt.post("/codex/proxy/start")).data},startGeminiProxy:async function(){return(await dt.post("/gemini/proxy/start")).data},startProxy:async function(){return(await dt.post("/proxy/start")).data},stopCodexProxy:async function(){return(await dt.post("/codex/proxy/stop")).data},stopGeminiProxy:async function(){return(await dt.post("/gemini/proxy/stop")).data},stopProxy:async function(){return(await dt.post("/proxy/stop")).data}},Symbol.toStringTag,{value:"Module"}));function hs(){const e=Nn(),{claudeProxy:a,codexProxy:l,geminiProxy:t,opencodeProxy:n,claudeChannels:s,codexChannels:o,geminiChannels:i,opencodeChannels:r,wsConnected:u,logLimit:c,statsInterval:d}=T(e);return{claudeProxy:a,codexProxy:l,geminiProxy:t,opencodeProxy:n,claudeChannels:s,codexChannels:o,geminiChannels:i,opencodeChannels:r,schedulerState:e.schedulerState,connectWebSocket:e.connectWebSocket,initializeState:e.initializeState,loadChannels:e.loadChannels,getProxyState:e.getProxyState,getChannels:e.getChannels,getSchedulerState:e.getSchedulerState,handleProxyStateUpdate:e.handleProxyStateUpdate,startProxy:e.startProxy,stopProxy:e.stopProxy,getLogs:e.getLogs,wsConnected:u,clearLogsState:e.clearLogsState,clearLogsForSource:e.clearLogsForSource,logLimit:c,statsInterval:d,loadAdvancedConfig:e.loadAdvancedConfig}}const bs={class:"proxy-logs"},ws={class:"logs-header"},ks={class:"header-left"},_s={class:"today-stats"},xs={class:"logs-table"},Cs={key:0,class:"empty-state"},Us={class:"action-message"},Ss={class:"action-time"},zs=["title"],Is={key:0},Ts={style:{"font-family":"monospace","font-size":"12px"}},Ps={key:1},Ms={class:"logs-footer"},$s={class:"count"},js=Pl({__name:"ProxyLogs",props:{source:{type:String,default:"claude"}},setup(e){const a=e,{getLogs:i,wsConnected:p,clearLogsState:h,logLimit:k}=hs(),_={claude:i("claude"),codex:i("codex"),gemini:i("gemini"),opencode:i("opencode")},U=w(()=>((_[a.source]||_.claude).value||[]).slice(0,k.value));l(U.value.length);const S=l(null),I=l({requests:0,tokens:0});let T=null,M=null;async function $(){var e,l,t,n;try{if("opencode"===a.source){const a=await ds();return void(I.value={requests:(null==(e=null==a?void 0:a.summary)?void 0:e.requests)||0,tokens:(null==(l=null==a?void 0:a.summary)?void 0:l.tokens)||0})}const s=await rs();let o="claude-code";"codex"===a.source?o="codex":"gemini"===a.source&&(o="gemini");const i=null==(t=s.byToolType)?void 0:t[o];I.value=i?{requests:i.requests||0,tokens:(null==(n=i.tokens)?void 0:n.total)||0}:{requests:0,tokens:0}}catch(s){}}async function j(){try{await gs(),h(),Un.success("日志已清空")}catch(e){Un.error("清空失败: "+e.message)}}return x(U,e=>{var a;const l=(null==(a=e[0])?void 0:a.id)||null;if(!l||l===M)return void(M=l);M=l;(!S.value||S.value.scrollTop<20)&&P(()=>{S.value&&(S.value.scrollTop=0)})}),x(()=>a.source,()=>{var e;$(),M=(null==(e=U.value[0])?void 0:e.id)||null}),b(()=>{$(),T=setInterval(()=>{$()},3e4)}),C(()=>{T&&(clearInterval(T),T=null)}),(a,l)=>(n(),t("div",bs,[s("div",ws,[s("div",ks,[l[0]||(l[0]=s("h3",{class:"title"},"实时日志",-1)),s("div",_s,[r(c(G),{size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(" 今日请求: "+v(I.value.requests),1)]),_:1}),r(c(G),{size:"tiny",bordered:!1,type:"success"},{default:u(()=>{return[y(" 今日Token: "+v((e=I.value.tokens,e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(1)+"K":e.toString())),1)];var e}),_:1})])]),r(c(K),{text:"",size:"small",onClick:j},{default:u(()=>[r(c(q),{size:"16"},{default:u(()=>[r(c(Je))]),_:1}),l[1]||(l[1]=y(" 清空 ",-1))]),_:1})]),s("div",xs,[s("div",{class:d(["table-header",`table-header-${e.source}`])},[s("div",{class:d(["col col-channel",`col-channel-${e.source}`])},"渠道",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"请求",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"回复",2),"claude"===e.source?(n(),t(m,{key:0},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},"写入",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"命中",2)],64)):"codex"===e.source?(n(),t(m,{key:1},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},"推理",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"缓存",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):"gemini"===e.source?(n(),t(m,{key:2},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},"缓存",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):"opencode"===e.source?(n(),t(m,{key:3},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},"推理",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"缓存",2),s("div",{class:d(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):o("",!0),s("div",{class:d(["col col-time",`col-time-${e.source}`])},"时间",2)],2),s("div",{class:"table-body",ref_key:"tableBody",ref:S},[0===U.value.length?(n(),t("div",Cs," 暂无日志 ")):o("",!0),(n(!0),t(m,null,f(U.value,a=>(n(),t("div",{key:a.id,class:d(["action"===a.type?"action-row":"table-row",{"new-log":a.isNew}])},["action"===a.type?(n(),t(m,{key:0},[r(c(q),{size:"16",style:{color:"#18a058","margin-right":"8px"}},{default:u(()=>[r(c(Ze))]),_:1}),s("span",Us,v(a.message),1),s("span",Ss,v(a.time),1)],64)):(n(),g(c(ce),{key:1,placement:"top",style:{maxWidth:"300px"}},{trigger:u(()=>{var l,i,p,f,g,h,b,w,k,_,x,C;return[s("div",{class:d(["table-row-content",`table-row-content-${e.source}`])},[s("div",{class:d(["col col-channel",`col-channel-${e.source}`]),title:a.channel},[r(c(G),{size:"small",type:"success"},{default:u(()=>[y(v(a.channel),1)]),_:2},1024)],10,zs),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(l=a.tokens)?void 0:l.input)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(i=a.tokens)?void 0:i.output)||0),3),"claude"===e.source?(n(),t(m,{key:0},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(p=a.tokens)?void 0:p.cacheCreation)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(f=a.tokens)?void 0:f.cacheRead)||0),3)],64)):"codex"===e.source?(n(),t(m,{key:1},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(g=a.tokens)?void 0:g.reasoning)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(h=a.tokens)?void 0:h.cached)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(b=a.tokens)?void 0:b.total)||0),3)],64)):"gemini"===e.source?(n(),t(m,{key:2},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(w=a.tokens)?void 0:w.cached)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(k=a.tokens)?void 0:k.total)||0),3)],64)):"opencode"===e.source?(n(),t(m,{key:3},[s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(_=a.tokens)?void 0:_.reasoning)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(x=a.tokens)?void 0:x.cached)||0),3),s("div",{class:d(["col col-token",`col-token-${e.source}`])},v((null==(C=a.tokens)?void 0:C.total)||0),3)],64)):o("",!0),s("div",{class:d(["col col-time",`col-time-${e.source}`])},v(a.time),3)],2)]}),default:u(()=>[a.model?(n(),t("div",Is,[l[2]||(l[2]=s("div",{style:{"font-weight":"600","margin-bottom":"4px"}},"模型信息",-1)),s("div",Ts,v(a.model),1)])):(n(),t("div",Ps,"暂无模型信息"))]),_:2},1024))],2))),128))],512)]),s("div",Ms,[s("span",{class:d(["status",{connected:c(p)}])},[r(c(q),{size:"14"},{default:u(()=>[(n(),g(z(c(p)?c(Ze):c(Ye))))]),_:1}),y(" "+v(c(p)?"已连接":"未连接"),1)],2),s("span",$s,"共 "+v(U.value.length)+" 条",1)])]))}},[["__scopeId","data-v-a9fe4ab0"]]);async function Os(e=!1,a="claude"){return(await dt.get("/skills",{params:{refresh:e?"1":"",platform:a}})).data}async function As(e,a,l=null,t="claude"){return(await dt.post("/skills/install",{directory:e,repo:a,fullDirectory:l,platform:t})).data}async function Ls(e,a="claude"){return(await dt.post("/skills/uninstall",{directory:e,platform:a})).data}async function Es(e,a="claude"){return(await dt.post("/skills/repos",{...e,platform:a})).data}const Ds={class:"right-panel"},Ns={class:"toolbar-section"},Fs={class:"toolbar-left"},Rs={class:"toolbar-right"},Bs={class:"panel-header"},Hs={class:"header-title"},qs={class:"channels-scroll-area"},Ks=Pl({__name:"RightPanel",props:{showChannels:{type:Boolean,default:!0},showLogs:{type:Boolean,default:!0},proxyRunning:{type:Boolean,default:!1},proxyLoading:{type:Boolean,default:!1}},emits:["proxy-toggle","show-recent"],setup(e,{emit:a}){const i=M(),p=a,f=w(()=>i.meta.channel||"claude"),h=l(null),k=l(null),_=l(null),U=l(null),S=l(0);async function z(){if(["claude","codex","gemini","opencode"].includes(f.value))try{const e=await Os(!1,f.value);e.success&&e.skills&&(S.value=e.skills.filter(e=>e.installed).length)}catch(e){}else S.value=0}const I={claude:h,codex:k,gemini:_,opencode:U},T={claude:"Claude 渠道管理",codex:"Codex 渠道管理",gemini:"Gemini 渠道管理",opencode:"OpenCode 渠道管理"},P=w(()=>T[f.value]||"Claude 渠道管理");function $(e){window.open(e,"_blank")}function j(){var e,a,l;null==(l=null==(a=null==(e=I[f.value])?void 0:e.value)?void 0:a.openAddDialog)||l.call(a)}function O(e){var a;const l=null==(a=null==e?void 0:e.detail)?void 0:a.channel;l&&l!==f.value||function(e=f.value){var a,l,t;null==(t=null==(l=null==(a=I[e])?void 0:a.value)?void 0:l.refresh)||t.call(l)}()}function A(e){p("proxy-toggle",e)}function L(){p("show-recent")}function E(){window.dispatchEvent(new CustomEvent("open-skills-drawer"))}function D(){window.dispatchEvent(new CustomEvent("open-commands-drawer"))}function N(){window.dispatchEvent(new CustomEvent("open-agents-drawer"))}function F(){window.dispatchEvent(new CustomEvent("open-plugins-drawer"))}return b(()=>{z(),"undefined"!=typeof window&&window.addEventListener("channel-management-refresh",O)}),x(()=>f.value,z),C(()=>{"undefined"!=typeof window&&window.removeEventListener("channel-management-refresh",O)}),(a,l)=>(n(),t("div",Ds,[s("div",Ns,[s("div",Fs,[r(c(V),{depth:"3",class:"toolbar-label"},{default:u(()=>[...l[0]||(l[0]=[y("动态切换",-1)])]),_:1}),r(c(W),{value:e.proxyRunning,loading:e.proxyLoading,size:"small","onUpdate:value":A},null,8,["value","loading"]),("claude"===f.value||"codex"===f.value||"gemini"===f.value||"opencode"===f.value)&&S.value>0?(n(),g(c(G),{key:0,type:"success",size:"small",bordered:!1},{default:u(()=>[y(v(S.value)+" 技能 ",1)]),_:1})):o("",!0)]),s("div",Rs,["claude"===f.value||"codex"===f.value||"gemini"===f.value||"opencode"===f.value?(n(),g(c(ce),{key:0,trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:E},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(Xe))]),_:1})]),_:1})]),default:u(()=>[l[1]||(l[1]=y(" Skills 技能 ",-1))]),_:1})):o("",!0),"claude"===f.value||"opencode"===f.value?(n(),g(c(ce),{key:1,trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:F},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(Qe))]),_:1})]),_:1})]),default:u(()=>[l[2]||(l[2]=y(" Plugins 插件 ",-1))]),_:1})):o("",!0),"claude"===f.value||"codex"===f.value||"opencode"===f.value?(n(),t(m,{key:2},[r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:D},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(ea))]),_:1})]),_:1})]),default:u(()=>[l[3]||(l[3]=y(" Commands 命令 ",-1))]),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:N},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(aa))]),_:1})]),_:1})]),default:u(()=>[l[4]||(l[4]=y(" Agents 代理 ",-1))]),_:1})],64)):o("",!0),l[6]||(l[6]=s("div",{class:"toolbar-divider"},null,-1)),r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(K),{text:"",size:"small",class:"toolbar-btn",onClick:L},{icon:u(()=>[r(c(q),{size:18},{default:u(()=>[r(c(la))]),_:1})]),_:1})]),default:u(()=>[l[5]||(l[5]=y(" 最新对话 ",-1))]),_:1})])]),e.showChannels?(n(),t("div",{key:0,class:d(["channels-section",{"full-height":!e.showLogs||!e.proxyRunning}])},[s("div",Bs,[s("div",Hs,[s("h3",null,v(P.value),1),r(c(V),{depth:"3",class:"header-hint"},{default:u(()=>[...l[7]||(l[7]=[y("拖拽调整顺序",-1)])]),_:1})]),r(c(K),{type:"primary",size:"small",onClick:j},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 添加 ",-1))]),_:1})]),s("div",qs,["claude"===f.value?(n(),g(ns,{key:0,ref_key:"claudePanelRef",ref:h,onOpenWebsite:$},null,512)):"codex"===f.value?(n(),g(ss,{key:1,ref_key:"codexPanelRef",ref:k,onOpenWebsite:$},null,512)):"gemini"===f.value?(n(),g(os,{key:2,ref_key:"geminiPanelRef",ref:_,onOpenWebsite:$},null,512)):"opencode"===f.value?(n(),g(is,{key:3,ref_key:"opencodePanelRef",ref:U,onOpenWebsite:$},null,512)):o("",!0)])],2)):o("",!0),e.showLogs?(n(),t("div",{key:1,class:d(["logs-section",{"full-height":!e.showChannels}])},[r(js,{source:f.value},null,8,["source"])],2)):o("",!0)]))}},[["__scopeId","data-v-e44bb18b"]]),Gs={class:"session-left"},Ws={class:"session-icon"},Vs={class:"session-info"},Js={class:"session-header"},Zs={class:"session-title-row"},Ys={class:"session-title"},Xs={class:"session-meta"},Qs={class:"meta-item"},eo={key:0,class:"session-message"},ao={key:1,class:"session-path"},lo={class:"session-actions"},to=Pl({__name:"SessionCard",props:{session:{type:Object,required:!0},channel:{type:String,default:"claude"},showProject:{type:Boolean,default:!1},hideFork:{type:Boolean,default:!1},hideDelete:{type:Boolean,default:!1}},emits:["set-alias","launch","fork","delete"],setup(e,{emit:a}){const i=e,d=l(!1),p=w(()=>i.session.alias?`${i.session.alias} (${i.session.sessionId.substring(0,8)})`:i.session.sessionId);function m(e){const a=new Date(e),l=new Date-a,t=Math.floor(l/6e4),n=Math.floor(l/36e5),s=Math.floor(l/864e5);return t<1?"刚刚":t<60?`${t}分钟前`:n<24?`${n}小时前`:s<7?`${s}天前`:a.toLocaleDateString("zh-CN")}function f(e){if(!e)return"0 B";const a=Math.floor(Math.log(e)/Math.log(1024));return Math.round(e/Math.pow(1024,a)*100)/100+" "+["B","KB","MB","GB"][a]}return(a,l)=>(n(),t("div",{class:"session-item",onMouseenter:l[4]||(l[4]=e=>d.value=!0),onMouseleave:l[5]||(l[5]=e=>d.value=!1)},[s("div",Gs,[s("div",Ws,[r(c(q),{size:"24",color:"#18a058"},{default:u(()=>[r(c(ta))]),_:1})]),s("div",Vs,[s("div",Js,[s("div",Zs,[e.showProject&&e.session.projectDisplayName?(n(),g(c(G),{key:0,size:"small",type:"info",bordered:!1,style:{"margin-right":"8px"}},{default:u(()=>[y(v(e.session.projectDisplayName),1)]),_:1})):o("",!0),s("span",Ys,v(p.value),1),e.session.forkedFrom?(n(),g(c(ce),{key:1,placement:"top"},{trigger:u(()=>[r(c(G),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[6]||(l[6]=y(" Fork ",-1))]),_:1})]),default:u(()=>[s("span",null,"Fork 自 "+v(e.session.forkedFrom),1)]),_:1})):o("",!0)]),s("div",Xs,[s("span",Qs,[r(c(q),{size:"14"},{default:u(()=>[r(c(sa))]),_:1}),y(" "+v(m(e.session.mtime)),1)]),r(c(G),{size:"small",bordered:!1,type:"info"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(oa))]),_:1})]),default:u(()=>[y(" "+v(f(e.session.size)),1)]),_:1}),e.session.gitBranch?(n(),g(c(G),{key:0,size:"small",bordered:!1,type:"success"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[y(" "+v(e.session.gitBranch),1)]),_:1})):o("",!0)])]),e.session.firstMessage?(n(),t("div",eo,v(e.session.firstMessage),1)):o("",!0),e.showProject&&e.session.projectFullPath?(n(),t("div",ao," 路径: "+v(e.session.projectFullPath),1)):o("",!0)])]),s("div",lo,[r(c(K),{size:"small",onClick:l[0]||(l[0]=l=>a.$emit("set-alias",e.session))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(ia))]),_:1})]),default:u(()=>[l[7]||(l[7]=y(" 别名 ",-1))]),_:1}),r(c(K),{type:"primary",size:"small",onClick:l[1]||(l[1]=l=>a.$emit("launch",e.session))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(ea))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 使用对话 ",-1))]),_:1}),e.hideFork?o("",!0):(n(),g(c(K),{key:0,size:"small",onClick:l[2]||(l[2]=l=>a.$emit("fork",e.session))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[9]||(l[9]=y(" Fork ",-1))]),_:1})),e.hideDelete?o("",!0):(n(),g(c(K),{key:1,size:"small",type:"error",onClick:l[3]||(l[3]=l=>a.$emit("delete",e.session))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),_:1})),$(a.$slots,"actions-extra",{},void 0,!0)])],32))}},[["__scopeId","data-v-32d1b310"]]);async function no(e,a={}){var l;const t=String(e||"");if(!t)throw new Error("没有可复制的内容");const{manualFallback:n=!0}=a;let s=null;if("undefined"!=typeof navigator&&(null==(l=navigator.clipboard)?void 0:l.writeText))try{return await navigator.clipboard.writeText(t),{copied:!0,method:"clipboard"}}catch(o){s=o}if(function(e){if("undefined"==typeof document)return!1;const a=document.createElement("textarea");a.value=e,a.setAttribute("readonly",""),a.style.position="fixed",a.style.top="-9999px",a.style.left="-9999px",a.style.opacity="0",document.body.appendChild(a),a.focus(),a.select(),a.setSelectionRange(0,e.length);let l=!1;try{l=document.execCommand("copy")}catch{l=!1}return document.body.removeChild(a),l}(t))return{copied:!0,method:"execCommand"};if(n&&function(e){return"undefined"!=typeof window&&"function"==typeof window.prompt&&(window.prompt("自动复制失败,请手动复制以下内容:",e),!0)}(t))return{copied:!1,method:"manual",error:s||null};throw s||new Error("当前环境不支持自动复制,请手动复制命令")}async function so(e,a="claude"){const l=pt(a);return(await dt.get(`${l}/sessions/${e}`)).data}async function oo(e,a){return(await dt.post("/aliases",{sessionId:e,alias:a})).data}async function io(e){return(await dt.delete(`/aliases/${e}`)).data}async function ro(e,a,l="claude"){const t=pt(l);return(await dt.delete(`${t}/sessions/${e}/${a}`)).data}async function uo(e,a,l="claude"){const t=pt(l);return(await dt.post(`${t}/sessions/${e}/${a}/fork`)).data}async function co(e,a="claude"){return(await dt.post(`/sessions/${e}/create`,{toolType:a})).data}async function po(e,a,l="claude"){const t=pt(l);return(await dt.post(`${t}/sessions/${e}/order`,{order:a})).data}async function vo(e,a,l=15,t="claude"){const n=pt(t);return(await dt.get(`${n}/sessions/${e}/search`,{params:{keyword:a,context:l}})).data}async function mo(e,a=35,l="claude"){const t=pt(l);return(await dt.get(`${t}/sessions/search/global`,{params:{keyword:e,context:a}})).data}async function fo(e,a,l="claude"){const t=pt(l);return(await dt.post(`${t}/sessions/${e}/${a}/launch`)).data}function go(e){if(!e||"object"!=typeof e)return"";if("string"==typeof e.copyCommand&&e.copyCommand.trim())return e.copyCommand;const a="string"==typeof e.command?e.command.trim():"";if(!a)return"";const l="string"==typeof e.cwd?e.cwd.trim():"";return l?`cd ${t=l,`"${String(t).replace(/"/g,'\\"')}"`} && ${a}`:a;var t}async function yo(e,a,l="claude"){const t=await fo(e,a,l),n=go(t);if(!n)throw new Error("未获取到可复制的启动命令");return{text:n,data:t,copyResult:await no(n)}}async function ho(e,a,l=1,t=20,n="desc",s="claude"){const o=pt(s);return(await dt.get(`${o}/sessions/${e}/${a}/messages`,{params:{page:l,limit:t,order:n}})).data}async function bo(e=5,a="claude"){const l=pt(a);return(await dt.get(`${l}/sessions/recent/list?limit=${e}`)).data}const wo=Object.freeze(Object.defineProperty({__proto__:null,copySessionLaunchCommand:yo,createSession:co,deleteAlias:io,deleteSession:ro,forkSession:uo,formatLaunchCommandForCopy:go,getRecentSessions:bo,getSessionLaunchCommand:fo,getSessionMessages:ho,getSessions:so,launchSession:async function(e,a,l=!1,t="claude"){const n=pt(t);return(await dt.post(`${n}/sessions/${e}/${a}/launch`,{fork:l})).data},saveSessionOrder:po,searchSessions:vo,searchSessionsGlobally:mo,setAlias:oo},Symbol.toStringTag,{value:"Module"}));function ko(e=520,a=null){const t=l("undefined"!=typeof window?window.innerWidth:1200),n=()=>{t.value=window.innerWidth};b(()=>{window.addEventListener("resize",n)}),C(()=>{window.removeEventListener("resize",n)});const s=w(()=>t.value<640),o=w(()=>t.value>=640&&t.value<1024);return{drawerWidth:w(()=>{if(t.value<640)return"100%";if(t.value<768)return Math.min(.95*t.value,e);if(t.value<1024){const l=a||e;return Math.min(.85*t.value,l)}return e}),isMobile:s,isTablet:o,windowWidth:t}}const _o={key:0,class:"loading-container"},xo={key:1,class:"sessions-list"},Co=Pl({__name:"RecentSessionsDrawer",props:{visible:{type:Boolean,default:!1},channel:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:s}=ko(800,700),o=e,i=a,d=l(!1),p=l([]),v=l(!1),h=w(()=>o.channel);async function b(){v.value=!0;try{const e=await bo(10,o.channel);p.value=e.sessions}catch(e){Un.error("加载失败: "+e.message)}finally{v.value=!1}}async function k(e){const a=e.alias||"";let l=a;const t=await new Promise(e=>{const t=Sn.create({title:"设置别名",content:()=>j(re,{defaultValue:a,placeholder:"请输入会话别名","onUpdate:value":e=>{l=e},onKeyup:a=>{"Enter"===a.key&&(t.destroy(),e(l.trim()))}}),positiveText:"确定",negativeText:"取消",onPositiveClick:()=>{e(l.trim())},onNegativeClick:()=>{e(null)}})});if(null!==t)try{t?(await oo(e.sessionId,t),Un.success("别名设置成功")):(await io(e.sessionId),Un.success("别名已删除")),await b()}catch(n){Un.error("操作失败: "+n.message)}}async function _(e){try{const{copyResult:a}=await yo(e.projectName,e.sessionId,o.channel);if("manual"===(null==a?void 0:a.method))return void Un.warning("自动复制失败,已弹出手动复制框");Un.success("启动命令已复制到剪贴板")}catch(a){Un.error("复制失败: "+a.message)}}return x(()=>o.visible,e=>{d.value=e,e&&b()}),x(d,e=>{i("update:visible",e)}),x(()=>o.channel,()=>{d.value&&b()}),(e,a)=>(n(),g(c(pe),{show:d.value,"onUpdate:show":a[0]||(a[0]=e=>d.value=e),width:c(s),placement:"right","show-close":!0},{default:u(()=>[r(c(de),{title:"claude"===o.channel?"Claude 最新对话":"codex"===o.channel?"Codex 最新对话":"gemini"===o.channel?"Gemini 最新对话":"opencode"===o.channel?"OpenCode 最新对话":"最新对话","native-scrollbar":!1,closable:""},{default:u(()=>[v.value?(n(),t("div",_o,[r(c(Q),{size:"medium"},{description:u(()=>[...a[1]||(a[1]=[y("加载中...",-1)])]),_:1})])):p.value.length>0?(n(),t("div",xo,[(n(!0),t(m,null,f(p.value,e=>(n(),g(to,{key:e.sessionId,session:e,channel:h.value,"show-project":!0,"hide-fork":!0,"hide-delete":!0,onSetAlias:k,onLaunch:_},null,8,["session","channel"]))),128))])):(n(),g(c(ee),{key:2,description:"暂无最近使用的会话",style:{"margin-top":"60px"}},{icon:u(()=>[r(c(q),{size:"48"},{default:u(()=>[r(c(la))]),_:1})]),_:1}))]),_:1},8,["title"])]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b0f0decf"]]);async function Uo(){return(await dt.get("/favorites")).data}async function So(e,a){return(await dt.post("/favorites",{channel:e,sessionData:a})).data}async function zo(e,a,l){return(await dt.delete(`/favorites/${e}/${encodeURIComponent(a)}/${l}`)).data}const Io=Object.freeze(Object.defineProperty({__proto__:null,addFavorite:So,checkFavorite:async function(e,a,l){return(await dt.get(`/favorites/check/${e}/${encodeURIComponent(a)}/${l}`)).data},getAllFavorites:Uo,getFavorites:async function(e){return(await dt.get(`/favorites/${e}`)).data},removeFavorite:zo},Symbol.toStringTag,{value:"Module"})),To=k("favorites",()=>{const e=l({claude:[],codex:[],gemini:[]}),a=l(!1),t=l(!1);let n=null;const s=w(()=>{var a,l,t;return((null==(a=e.value.claude)?void 0:a.length)||0)+((null==(l=e.value.codex)?void 0:l.length)||0)+((null==(t=e.value.gemini)?void 0:t.length)||0)});return{favorites:e,totalFavorites:s,isLoaded:a,loading:t,loadFavorites:async function(l=!1){if(a.value&&!l)return e.value;if(n&&!l)return n;let s=null;return s=(async()=>{t.value=!0;try{const l=await Uo();return l.success&&l.favorites&&(e.value={claude:l.favorites.claude||[],codex:l.favorites.codex||[],gemini:l.favorites.gemini||[]}),a.value=!0,e.value}catch(l){throw l}finally{t.value=!1,n===s&&(n=null)}})(),n=s,s},addFavorite:async function(a,l){try{const t=await So(a,l);if(t.success&&t.favorites)return e.value=t.favorites,!0}catch(t){}return!1},removeFavorite:async function(a,l,t){try{const n=await zo(a,l,t);if(n.success&&n.favorites)return e.value=n.favorites,!0}catch(n){}return!1},isFavorite:function(a,l,t){return!!e.value[a]&&e.value[a].some(e=>e.sessionId===t&&e.projectName===l)},getFavoritesByChannel:function(a){return e.value[a]||[]}}});function Po(){const e=To(),{favorites:a,totalFavorites:l}=T(e);return e.isLoaded||e.loadFavorites().catch(()=>{}),{favorites:a,addFavorite:e.addFavorite,removeFavorite:e.removeFavorite,isFavorite:e.isFavorite,getFavorites:function(a){return e.getFavoritesByChannel(a)},getAllFavorites:function(){return a.value},totalFavorites:l,loadFavorites:e.loadFavorites}}async function Mo(e="claude"){const a=pt(e);return(await dt.get(`${a}/projects`)).data}async function $o(e,a="claude"){const l=pt(a);return(await dt.post(`${l}/projects/order`,{order:e})).data}async function jo(e,a="claude"){const l=pt(a);return(await dt.delete(`${l}/projects/${e}`)).data}const Oo=Object.freeze(Object.defineProperty({__proto__:null,createProject:async function(e,a,l="claude"){const t=pt(l);return(await dt.post(`${t}/projects/create`,{projectName:e,projectPath:a})).data},deleteProject:jo,getProjects:Mo,saveProjectOrder:$o},Symbol.toStringTag,{value:"Module"})),Ao=new Map,Lo=new Map;function Eo(e,a){return`${e}:${a}`}function Do(e,a){Ao.set(e,{timestamp:Date.now(),payload:a})}function No(e,a,l){Lo.set(Eo(e,a),{timestamp:Date.now(),payload:l})}function Fo(e,a){a?Lo.delete(Eo(e,a)):Array.from(Lo.keys()).filter(a=>a.startsWith(`${e}:`)).forEach(e=>Lo.delete(e))}const Ro=k("sessions",()=>{const e=l([]),a=l(null),t=l(null),n=l([]),s=l({}),o=l(0),i=l(!1),r=l(null),u=l("claude"),c=w(()=>n.value.map(e=>({...e,alias:s.value[e.sessionId]||null})));async function d(e,{force:l=!1}={}){i.value=!0,r.value=null;try{if(!l){const l=function(e,a){const l=Eo(e,a),t=Lo.get(l);return t?Date.now()-t.timestamp>2e4?(Lo.delete(l),null):t.payload:null}(u.value,e);if(l)return n.value=l.sessions||[],s.value=l.aliases||{},o.value=l.totalSize||0,a.value=e,t.value=l.projectInfo||null,void(i.value=!1)}const r=await so(e,u.value);n.value=r.sessions,s.value=r.aliases,o.value=r.totalSize||0,a.value=e,t.value=r.projectInfo,No(u.value,e,{sessions:r.sessions,aliases:r.aliases,totalSize:r.totalSize,projectInfo:r.projectInfo})}catch(c){r.value=c.message}finally{i.value=!1}}return{projects:e,currentProject:a,currentProjectInfo:t,sessions:n,aliases:s,totalSize:o,loading:i,error:r,currentChannel:u,sessionsWithAlias:c,setChannel:function(e){u.value=e},fetchProjects:async function({force:l=!1}={}){var t,n;i.value=!0,r.value=null;try{if(!l){const l=function(e){const a=Ao.get(e);return a?Date.now()-a.timestamp>3e4?(Ao.delete(e),null):a.payload:null}(u.value);if(l)return e.value=l.projects||[],a.value=l.currentProject||(null==(n=null==(t=l.projects)?void 0:t[0])?void 0:n.name)||null,void(i.value=!1)}const s=await Mo(u.value);e.value=s.projects,a.value=s.currentProject,Do(u.value,{projects:s.projects,currentProject:s.currentProject}),Fo(u.value)}catch(s){r.value=s.message}finally{i.value=!1}},fetchSessions:d,setAlias:async function(e,a){try{await oo(e,a),s.value[e]=a}catch(l){throw r.value=l.message,l}},deleteAlias:async function(e){try{await io(e),delete s.value[e]}catch(a){throw r.value=a.message,a}},deleteSession:async function(e){try{await ro(a.value,e,u.value),n.value=n.value.filter(a=>a.sessionId!==e),s.value[e]&&delete s.value[e],No(u.value,a.value,{sessions:n.value,aliases:s.value,totalSize:o.value,projectInfo:t.value})}catch(l){throw r.value=l.message,l}},forkSession:async function(e){try{const l=await uo(a.value,e,u.value);return await d(a.value,{force:!0}),l.newSessionId}catch(l){throw r.value=l.message,l}},saveProjectOrder:async function(l){try{await $o(l,u.value);const t=l.map(a=>e.value.find(e=>e.name===a)).filter(Boolean),n=e.value.filter(e=>!l.includes(e.name));e.value=[...t,...n],Do(u.value,{projects:e.value,currentProject:a.value})}catch(t){throw r.value=t.message,t}},saveSessionOrder:async function(e){try{await po(a.value,e,u.value);const l=e.map(e=>n.value.find(a=>a.sessionId===e)).filter(Boolean),i=n.value.filter(a=>!e.includes(a.sessionId));n.value=[...l,...i],No(u.value,a.value,{sessions:n.value,aliases:s.value,totalSize:o.value,projectInfo:t.value})}catch(l){throw r.value=l.message,l}},deleteProject:async function(l){try{await jo(l,u.value),e.value=e.value.filter(e=>e.name!==l),a.value===l&&(a.value=null),(t=u.value)?Ao.delete(t):Ao.clear(),Fo(u.value,l)}catch(n){throw r.value=n.message,n}var t}}}),Bo={class:"favorites-container"},Ho={key:0,class:"favorites-section"},qo={class:"section-header claude-header"},Ko={class:"sessions-list"},Go={key:1,class:"favorites-section"},Wo={class:"section-header codex-header"},Vo={class:"sessions-list"},Jo={key:2,class:"favorites-section"},Zo={class:"section-header gemini-header"},Yo={class:"sessions-list"},Xo=Pl({__name:"FavoritesDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible","view-history"],setup(e,{emit:a}){const{drawerWidth:i}=ko(800,700),d=e,h=a,b=w({get:()=>d.visible,set:e=>h("update:visible",e)}),{getFavorites:k,removeFavorite:_,getAllFavorites:x}=Po(),C=Ro(),U=w(()=>k("claude")),S=w(()=>k("codex")),z=w(()=>k("gemini")),I=l(!1),T=l(null),P=l(""),M=l("");function $(e){let a="claude";S.value.some(a=>a.sessionId===e.sessionId&&a.projectName===e.projectName)?a="codex":z.value.some(a=>a.sessionId===e.sessionId&&a.projectName===e.projectName)&&(a="gemini"),T.value=e,P.value=e.alias||"",M.value=a,I.value=!0}async function j(){var e,a;if(T.value)try{C.setChannel(M.value);const l=T.value.sessionId;if(P.value){await C.setAlias(l,P.value),Un.success("别名设置成功");const a=null==(e=x()[M.value])?void 0:e.find(e=>e.sessionId===l&&e.projectName===T.value.projectName);a&&(a.alias=P.value)}else{await C.deleteAlias(l),Un.success("别名已删除");const e=null==(a=x()[M.value])?void 0:a.find(e=>e.sessionId===l&&e.projectName===T.value.projectName);e&&(e.alias="")}I.value=!1,T.value=null,P.value=""}catch(l){Un.error("操作失败: "+l.message)}}async function A(e,a){try{const{copyResult:l}=await yo(a.projectName,a.sessionId,e);if("manual"===(null==l?void 0:l.method))return void Un.warning("自动复制失败,已弹出手动复制框");Un.success("启动命令已复制到剪贴板")}catch(l){Un.error("复制失败: "+l.message)}}async function L(e,a){try{await _(e,a.projectName,a.sessionId),Un.success("已移除收藏")}catch(l){Un.error("移除失败: "+l.message)}}return(e,a)=>(n(),g(c(pe),{show:b.value,"onUpdate:show":a[3]||(a[3]=e=>b.value=e),width:c(i),placement:"right"},{default:u(()=>[r(c(de),{title:"我的收藏",closable:""},{default:u(()=>[s("div",Bo,[U.value.length>0?(n(),t("div",Ho,[s("div",qo,[r(c(q),{size:20},{default:u(()=>[r(c(ra))]),_:1}),a[4]||(a[4]=s("h3",{class:"section-title"},"Claude",-1)),r(c(G),{size:"small",bordered:!1,type:"success"},{default:u(()=>[y(v(U.value.length),1)]),_:1})]),s("div",Ko,[(n(!0),t(m,null,f(U.value,l=>(n(),g(to,{key:`claude-${l.projectName}-${l.sessionId}`,session:l,channel:"claude","show-project":!0,"hide-fork":"","hide-delete":"",class:"clickable-session",onClick:a=>e.$emit("view-history",{session:l,channel:"claude"}),onSetAlias:$,onLaunch:e=>A("claude",l)},{"actions-extra":u(()=>[r(c(K),{size:"small",type:"error",onClick:p(e=>L("claude",l),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),default:u(()=>[a[5]||(a[5]=y(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):o("",!0),S.value.length>0?(n(),t("div",Go,[s("div",Wo,[r(c(q),{size:20},{default:u(()=>[r(c(ua))]),_:1}),a[6]||(a[6]=s("h3",{class:"section-title"},"Codex",-1)),r(c(G),{size:"small",bordered:!1,type:"info"},{default:u(()=>[y(v(S.value.length),1)]),_:1})]),s("div",Vo,[(n(!0),t(m,null,f(S.value,l=>(n(),g(to,{key:`codex-${l.projectName}-${l.sessionId}`,session:l,channel:"codex","show-project":!0,"hide-fork":"","hide-delete":"",class:"clickable-session",onClick:a=>e.$emit("view-history",{session:l,channel:"codex"}),onSetAlias:$,onLaunch:e=>A("codex",l)},{"actions-extra":u(()=>[r(c(K),{size:"small",type:"error",onClick:p(e=>L("codex",l),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),default:u(()=>[a[7]||(a[7]=y(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):o("",!0),z.value.length>0?(n(),t("div",Jo,[s("div",Zo,[r(c(q),{size:20},{default:u(()=>[r(c(ca))]),_:1}),a[8]||(a[8]=s("h3",{class:"section-title"},"Gemini",-1)),r(c(G),{size:"small",bordered:!1,type:"warning"},{default:u(()=>[y(v(z.value.length),1)]),_:1})]),s("div",Yo,[(n(!0),t(m,null,f(z.value,l=>(n(),g(to,{key:`gemini-${l.projectName}-${l.sessionId}`,session:l,channel:"gemini","show-project":!0,"hide-fork":"","hide-delete":"",class:"clickable-session",onClick:a=>e.$emit("view-history",{session:l,channel:"gemini"}),onSetAlias:$,onLaunch:e=>A("gemini",l)},{"actions-extra":u(()=>[r(c(K),{size:"small",type:"error",onClick:p(e=>L("gemini",l),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),default:u(()=>[a[9]||(a[9]=y(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):o("",!0),0===e.totalCount?(n(),g(c(ee),{key:3,description:"暂无收藏",style:{"margin-top":"80px"}},{icon:u(()=>[r(c(q),{size:48},{default:u(()=>[r(c(da))]),_:1})]),extra:u(()=>[r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[10]||(a[10]=[y(' 在会话列表中点击"收藏"按钮添加收藏 ',-1)])]),_:1})]),_:1})):o("",!0)]),r(c(ie),{show:I.value,"onUpdate:show":a[2]||(a[2]=e=>I.value=e),preset:"dialog",title:"设置别名"},{action:u(()=>[r(c(se),null,{default:u(()=>[r(c(K),{onClick:a[1]||(a[1]=e=>I.value=!1)},{default:u(()=>[...a[11]||(a[11]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:j},{default:u(()=>[...a[12]||(a[12]=[y("确定",-1)])]),_:1})]),_:1})]),default:u(()=>[r(c(re),{value:P.value,"onUpdate:value":a[0]||(a[0]=e=>P.value=e),placeholder:"输入别名(留空删除)",onKeyup:O(j,["enter"])},null,8,["value"])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-6dbf6eee"]]),Qo=["id"],ei={class:"message-header"},ai={key:0,class:"message-model"},li={class:"message-time"},ti={class:"message-time"},ni={key:0,class:"user-content"},si={key:0},oi={key:1,class:"image-item"},ii=["src"],ri=["innerHTML"],ui=500,ci=Pl({__name:"ChatMessage",props:{message:{type:Object,required:!0},messageAnchorId:{type:String,default:""}},setup(e){ml.registerLanguage("javascript",fl),ml.registerLanguage("python",gl),ml.registerLanguage("bash",yl),ml.registerLanguage("json",hl),ml.registerLanguage("typescript",bl),ml.registerLanguage("css",wl),ml.registerLanguage("xml",kl),ml.registerLanguage("html",kl);const a=e,i=l(!1),u=w(()=>{const e=a.message.content;return"string"==typeof e&&e.length>ui}),p=w(()=>{const e=a.message.content;return"string"==typeof e&&e.length>ui?e.substring(0,ui)+"...":e});_l.setOptions({highlight:(e,a)=>{if(a&&ml.getLanguage(a))try{return ml.highlight(e,{language:a}).value}catch(l){}return ml.highlightAuto(e).value},breaks:!0,gfm:!0});const g=w(()=>{if("assistant"===a.message.type&&a.message.content)try{return _l.parse(a.message.content)}catch(e){return a.message.content}return""}),h=w(()=>{if("assistant"===a.message.type&&a.message.content)try{const e=a.message.content,l=e.length>ui?e.substring(0,ui)+"...":e;return _l.parse(l)}catch(e){return a.message.content.substring(0,ui)+"..."}return""});function b(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}async function k(){const e="string"==typeof a.message.content?a.message.content:JSON.stringify(a.message.content);try{await no(e,{manualFallback:!1})}catch{}}function _(e){var a,l,t,n;if(!e)return null;if("base64"===(null==(a=e.source)?void 0:a.type)&&(null==(l=e.source)?void 0:l.data)){return`data:${e.source.media_type||"image/png"};base64,${e.source.data}`}return"url"===(null==(t=e.source)?void 0:t.type)&&(null==(n=e.source)?void 0:n.url)?e.source.url:e.url?e.url:null}return(a,l)=>(n(),t("div",{id:e.messageAnchorId||void 0,class:d(["chat-message",[`message-${e.message.type}`]])},[s("div",ei,["assistant"===e.message.type?(n(),t(m,{key:0},[r(c(q),{size:16,component:c(pa),class:"role-icon"},null,8,["component"]),l[1]||(l[1]=s("span",{class:"message-role"},"AI",-1)),e.message.model?(n(),t("span",ai,v(e.message.model),1)):o("",!0),s("span",li,v(e.message.timestamp?b(e.message.timestamp):""),1),l[2]||(l[2]=s("span",{class:"spacer"},null,-1)),s("span",{class:"copy-btn",onClick:k,title:"复制"},[r(c(q),{size:14,component:c(va)},null,8,["component"])])],64)):(n(),t(m,{key:1},[s("span",{class:"copy-btn",onClick:k,title:"复制"},[r(c(q),{size:14,component:c(va)},null,8,["component"])]),l[3]||(l[3]=s("span",{class:"spacer"},null,-1)),s("span",ti,v(e.message.timestamp?b(e.message.timestamp):""),1),l[4]||(l[4]=s("span",{class:"message-role"},"用户",-1)),r(c(q),{size:16,component:c(ma),class:"role-icon"},null,8,["component"])],64))]),s("div",{class:d(["message-content",{collapsed:!i.value&&u.value}])},["user"===e.message.type?(n(),t("div",ni,["string"==typeof e.message.content?(n(),t(m,{key:0},[y(v(i.value?e.message.content:p.value),1)],64)):Array.isArray(e.message.content)?(n(!0),t(m,{key:1},f(e.message.content,(e,a)=>(n(),t("div",{key:a,class:"content-item"},["text"===e.type?(n(),t("div",si,v(e.text),1)):"image"===e.type?(n(),t("div",oi,[_(e)?(n(),t("img",{key:0,src:_(e),alt:"会话图片",loading:"lazy"},null,8,ii)):(n(),t(m,{key:1},[r(c(q),{size:20,component:c(fa)},null,8,["component"]),l[5]||(l[5]=s("span",null,"图片内容",-1))],64))])):o("",!0)]))),128)):o("",!0)])):"assistant"===e.message.type?(n(),t("div",{key:1,class:"assistant-content markdown-body",innerHTML:i.value?g.value:h.value},null,8,ri)):o("",!0)],2),u.value?(n(),t("div",{key:0,class:"expand-btn",onClick:l[0]||(l[0]=e=>i.value=!i.value)},v(i.value?"收起":"展开全部"),1)):o("",!0)],10,Qo))}},[["__scopeId","data-v-35aebdef"]]),di={class:"drawer-wrapper"},pi={class:"header-row"},vi={class:"session-name"},mi={key:0,class:"session-summary"},fi={class:"drawer-body"},gi={key:0,class:"loading-container"},yi={key:1,class:"empty-container"},hi={key:2,class:"history-layout"},bi={class:"mobile-toc-toggle"},wi={key:0,class:"toc-empty"},ki={key:1,class:"toc-list"},_i=["onClick"],xi={class:"toc-preview"},Ci={class:"toc-time"},Ui={class:"messages-pane"},Si={key:0,class:"load-more-top"},zi={class:"messages-list"},Ii=Pl({__name:"ChatHistoryDrawer",props:{show:{type:Boolean,default:!1},projectName:{type:String,required:!0},sessionId:{type:String,required:!0},sessionAlias:{type:String,default:""},channel:{type:String,default:"claude"}},emits:["update:show","error"],setup(e,{expose:a,emit:i}){const p=e,h=i,{drawerWidth:b}=ko(900,800),k=w({get:()=>p.show,set:e=>h("update:show",e)}),_=l(!1),C=l([]),U=l({}),S=l(1),z=l(0),I=l(!1),T=l(null),M=l(null),$=l(!1),j=l(""),O=l(!1),L=l(null),E=l(!1);let D=0,N=0;const F=w(()=>le(p.sessionId).slice(0,16)||"session"),R=w(()=>{const e=new Map;return C.value.map((a,l)=>{const t=function(e,a){const l=ae(e);if(l)return`msg-${F.value}-${le(l)}`;const t=(null==e?void 0:e.timestamp)?String(e.timestamp):"",n=(null==e?void 0:e.type)?String(e.type):"unknown",s=function(e){const a=null==e?void 0:e.content;if("string"==typeof a)return a.slice(0,240);if(Array.isArray(a))try{return JSON.stringify(a).slice(0,240)}catch{return String(a)}if(null==a)return"";return String(a).slice(0,240)}(e),o=function(e){let a=0;for(let l=0;l<e.length;l+=1)a=(a<<5)-a+e.charCodeAt(l),a|=0;return Math.abs(a).toString(36)}(`${n}|${t}|${s}`),i=t?le(t):`idx${a}`;return`msg-${F.value}-${n}-${i}-${o}`}(a,l),n=e.get(t)||0;return e.set(t,n+1),0===n?t:`${t}-${n+1}`})}),B=w(()=>C.value.map((e,a)=>({message:e,index:a,anchorId:R.value[a]})).filter(e=>"user"===e.message.type&&"tool_result"!==e.message.subtype).map(e=>({messageIndex:e.index,anchorId:e.anchorId,preview:oe(e.message),timestamp:e.message.timestamp})));async function H(e=1,a={}){var l,t;if(_.value)return;const{skipFirstPageScroll:n=!1}=a;try{_.value=!0;const a=await ho(p.projectName,p.sessionId,e,20,"desc",p.channel),{messages:l,metadata:t,pagination:s}=a;1===e?(C.value=l.reverse(),U.value=t):C.value=[...l.reverse(),...C.value],S.value=s.page,z.value=s.total,I.value=s.hasMore,1===e&&P(async()=>{L.value?await async function(e,a={}){if(!e)return!1;const{allowLoadMore:l=!1}=a;let t=0;for(;t<50;){t+=1;const a=X(e);if(a&&Y(a,!0))return j.value=a,L.value=null,!0;if(!l||!I.value||_.value)break;const n=S.value;if(await H(S.value+1),S.value===n)break}return L.value=null,Z(),!1}(L.value,{allowLoadMore:!0}):n||V(!1),Z()})}catch(s){const e="加载聊天记录失败: "+((null==(t=null==(l=s.response)?void 0:l.data)?void 0:t.error)||s.message);h("error",e)}finally{_.value=!1}}function W(){if(!I.value||_.value)return;const e=T.value,a=(null==e?void 0:e.scrollHeight)||0;H(S.value+1).then(()=>{P(()=>{if(e){const l=e.scrollHeight;e.scrollTop=l-a,Z()}})})}function V(e=!0){P(()=>{const a=T.value;a&&(a.scrollTo({top:a.scrollHeight,behavior:e?"smooth":"auto"}),Z())})}function J(e){const a=e.target;if(!a)return;const{scrollTop:l,scrollHeight:t,clientHeight:n}=a;$.value=t-l-n>200,l<100&&I.value&&!_.value&&W(),Z()}function Z(){D||(D=requestAnimationFrame(()=>{D=0,function(){const e=T.value;if(!e||0===B.value.length)return void(j.value="");const a=Math.max(0,e.scrollHeight-e.clientHeight);if(a>0&&a-e.scrollTop<=6)return void(j.value=B.value[B.value.length-1].anchorId);const l=e.scrollTop,t=l+e.clientHeight,n=l+se();let s=null,o=null;for(const r of B.value){const a=te(r.anchorId);if(!a)continue;const i=ne(a,e),u=i+a.offsetHeight;i<=n+1&&(o=r),!s&&u>l&&i<t&&(s=r)}const i=(null==o?void 0:o.anchorId)||(null==s?void 0:s.anchorId)||B.value[0].anchorId;i&&(j.value=i)}()}))}function Y(e,a=!0){const l=T.value;if(!l||!e)return!1;const t=te(e);if(!t)return!1;const n=ne(t,l),s=Math.max(0,l.scrollHeight-l.clientHeight),o=(i=n-se(),r=0,u=s,Math.min(Math.max(i,r),u));var i,r,u;return l.scrollTo({top:o,behavior:a?"smooth":"auto"}),Z(),!0}function X(e){if(e.anchorId&&"string"==typeof e.anchorId)return e.anchorId;if("number"==typeof e.messageIndex&&e.messageIndex>=0)return R.value[e.messageIndex]||"";if(e.messageId){const a=String(e.messageId),l=C.value.findIndex(e=>ae(e)===a);if(l>=0)return R.value[l]}return""}function ae(e){return e&&"object"==typeof e?String(e.messageId||e.id||e.uuid||e.turnId||""):""}function le(e){return String(e||"").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)}function te(e){const a=T.value;if(!a||!e)return null;const l=document.getElementById(e);return l&&a.contains(l)?l:null}function ne(e,a){const l=a.getBoundingClientRect(),t=e.getBoundingClientRect();return a.scrollTop+(t.top-l.top)}function se(){var e;return((null==(e=M.value)?void 0:e.offsetHeight)||0)+12}function oe(e){let a="";const l=null==e?void 0:e.content;"string"==typeof l?a=l:Array.isArray(l)?a=l.filter(e=>"text"===(null==e?void 0:e.type)&&(null==e?void 0:e.text)).map(e=>e.text).join(" "):null!=l&&(a=String(l));const t=a.split("\n").map(e=>e.trim()).find(Boolean)||"(空消息)";return t.length>42?`${t.slice(0,42)}...`:t}function ie(e){if(!e)return"";const a=new Date(e);return Number.isNaN(a.getTime())?"":a.toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}return x(B,()=>{B.value.length?(B.value.some(e=>e.anchorId===j.value)||(j.value=B.value[0].anchorId),Z()):j.value=""},{deep:!0}),x(k,e=>{e?P(()=>{Z()}):(N+=1,E.value=!1)}),A(()=>{D&&(cancelAnimationFrame(D),D=0),N+=1,E.value=!1}),a({open:function(e){N+=1;const a=N;L.value=function(e){if(!e||"object"!=typeof e)return null;const a=e.jumpTo&&"object"==typeof e.jumpTo?e.jumpTo:e,l={anchorId:"string"==typeof a.anchorId?a.anchorId:"",messageId:a.messageId||a.id||"",messageIndex:Number.isInteger(a.messageIndex)?a.messageIndex:null};return l.anchorId||l.messageId||null!==l.messageIndex?l:null}(e),O.value=!1,C.value=[],U.value={},S.value=1,z.value=0,I.value=!1,$.value=!1,j.value="",E.value=!1,H(1,{skipFirstPageScroll:Boolean(L.value)}).then(()=>async function(e){if(e!==N||E.value)return;if(!I.value)return;E.value=!0;let a=0;try{for(;e===N&&I.value&&(a+=1,!(a>120));){const e=S.value,a=T.value,l=(null==a?void 0:a.scrollHeight)||0,t=(null==a?void 0:a.scrollTop)||0;if(await H(e+1),await P(),a){const e=a.scrollHeight-l;e>0&&(a.scrollTop=t+e)}if(Z(),S.value===e){if(!I.value)break;await new Promise(e=>setTimeout(e,80))}}}finally{e===N&&(E.value=!1)}}(a)).catch(()=>{})}}),(a,l)=>(n(),g(c(pe),{show:k.value,"onUpdate:show":l[2]||(l[2]=e=>k.value=e),width:c(b),placement:"right","auto-focus":!1,"trap-focus":!1,"block-scroll":!1},{default:u(()=>[s("div",di,[s("div",{ref_key:"headerRef",ref:M,class:"drawer-header"},[s("div",pi,[r(c(q),{size:18,component:c(pa)},null,8,["component"]),s("span",vi,v(e.sessionAlias||e.sessionId.substring(0,8))+" ("+v(z.value)+")",1),U.value.gitBranch?(n(),g(c(G),{key:0,size:"small",type:"info"},{icon:u(()=>[r(c(q),{component:c(ga)},null,8,["component"])]),default:u(()=>[y(" "+v(U.value.gitBranch),1)]),_:1})):o("",!0),l[3]||(l[3]=s("span",{class:"spacer"},null,-1)),r(c(q),{size:20,component:c(ya),class:"close-btn",onClick:l[0]||(l[0]=e=>k.value=!1)},null,8,["component"])]),U.value.summary?(n(),t("div",mi,v(U.value.summary),1)):o("",!0)],512),s("div",fi,[_.value&&0===C.value.length?(n(),t("div",gi,[r(c(Q),{size:"medium"},{description:u(()=>[...l[4]||(l[4]=[y("加载聊天记录...",-1)])]),_:1})])):_.value||0!==C.value.length?(n(),t("div",hi,[s("div",bi,[r(c(K),{tertiary:"",size:"small",onClick:l[1]||(l[1]=e=>O.value=!O.value)},{default:u(()=>[y(v(O.value?"展开用户目录":"收起用户目录"),1)]),_:1})]),s("aside",{class:d(["toc-rail",{"mobile-collapsed":O.value}])},[l[5]||(l[5]=s("div",{class:"toc-header"},"用户目录",-1)),0===B.value.length?(n(),t("div",wi,"暂无用户消息")):(n(),t("div",ki,[(n(!0),t(m,null,f(B.value,e=>(n(),t("button",{key:e.anchorId,type:"button",class:d(["toc-item",{active:j.value===e.anchorId}]),onClick:a=>function(e){(null==e?void 0:e.anchorId)&&(j.value=e.anchorId,Y(e.anchorId,!0))}(e)},[s("span",xi,v(e.preview),1),s("span",Ci,v(ie(e.timestamp)),1)],10,_i))),128))]))],2),s("div",Ui,[s("div",{class:"messages-container",ref_key:"messagesContainer",ref:T,onScroll:J},[I.value?(n(),t("div",Si,[r(c(K),{loading:_.value,onClick:W,size:"small",secondary:""},{icon:u(()=>[r(c(q),{component:c(ha)},null,8,["component"])]),default:u(()=>[l[6]||(l[6]=y(" 加载更早的消息 ",-1))]),_:1},8,["loading"])])):o("",!0),s("div",zi,[(n(!0),t(m,null,f(C.value,(e,a)=>(n(),g(ci,{key:R.value[a]||a,message:e,"message-anchor-id":R.value[a]},null,8,["message","message-anchor-id"]))),128))])],544),$.value?(n(),t("div",{key:0,class:"scroll-btn",onClick:V},[r(c(q),{size:18,component:c(ba)},null,8,["component"])])):o("",!0)])])):(n(),t("div",yi,[r(c(ee),{description:"暂无聊天记录"})]))])])]),_:1},8,["show","width"]))}},[["__scopeId","data-v-4da27f38"]]);async function Ti(){return(await dt.get("/security")).data}async function Pi(e){return(await dt.post("/security/verify",{password:e})).data}async function Mi(e){return(await dt.post("/security/password",e)).data}const $i=Object.freeze(Object.defineProperty({__proto__:null,getSecurityStatus:Ti,setSecurityPassword:Mi,verifySecurityPassword:Pi},Symbol.toStringTag,{value:"Module"}));async function ji(){return(await dt.get("/pm2-autostart")).data}async function Oi(){return(await dt.post("/pm2-autostart",{action:"enable"})).data}async function Ai(){return(await dt.post("/pm2-autostart",{action:"disable"})).data}const Li=Object.freeze(Object.defineProperty({__proto__:null,disableAutoStart:Ai,enableAutoStart:Oi,getAutoStartStatus:ji},Symbol.toStringTag,{value:"Module"}));async function Ei(){return(await dt.get("/dashboard/init")).data}const Di=Object.freeze(Object.defineProperty({__proto__:null,getDashboardInit:Ei},Symbol.toStringTag,{value:"Module"}));const Ni={...Oo,...wo,...Wt,...ys,...fs,...Object.freeze(Object.defineProperty({__proto__:null,checkForUpdates:async function(){return(await dt.get("/version/check")).data},getAllChangelog:async function(){return(await dt.get("/version/changelog")).data},getChangelog:async function(e){return(await dt.get(`/version/changelog/${e}`)).data},getCurrentVersion:async function(){return(await dt.get("/version/current")).data},performUpdate:async function(){return(await dt.post("/version/update")).data}},Symbol.toStringTag,{value:"Module"})),...Io,...Mn,...$i,...Li,...Di},Fi=k("dashboard",()=>{const e=l({uiConfig:null,favorites:null,channels:{claude:[],codex:[],gemini:[],opencode:[]},proxyStatus:{claude:{},codex:{},gemini:{},opencode:{}},todayStats:{claude:{requests:0,tokens:0,cost:0,byModel:{}},codex:{requests:0,tokens:0,cost:0,byModel:{}},gemini:{requests:0,tokens:0,cost:0,byModel:{}},opencode:{requests:0,tokens:0,cost:0,byModel:{}}},counts:{claude:{projectCount:0,sessionCount:0},codex:{projectCount:0,sessionCount:0},gemini:{projectCount:0,sessionCount:0},opencode:{projectCount:0,sessionCount:0}}}),a=l(!1),t=l(!1);let n=null,s=null;async function o(l=!1){return t.value&&!l?e.value:(n&&!l||(a.value=!0,n=(async()=>{var l,s,o,i,r,u,c,d,p,v,m,f,g,y,h,b;try{const a=await Ei();if(!a||!1===a.success)throw new Error((null==a?void 0:a.message)||"Failed to load dashboard");const n=a.data||{},w=(e={})=>({requests:e.requests||0,tokens:e.tokens||0,cost:e.cost||0,byModel:e.byModel||{}});return e.value={uiConfig:n.uiConfig||null,favorites:n.favorites||null,channels:{claude:(null==(l=n.channels)?void 0:l.claude)||[],codex:(null==(s=n.channels)?void 0:s.codex)||[],gemini:(null==(o=n.channels)?void 0:o.gemini)||[],opencode:(null==(i=n.channels)?void 0:i.opencode)||[]},proxyStatus:{claude:(null==(r=n.proxyStatus)?void 0:r.claude)||{},codex:(null==(u=n.proxyStatus)?void 0:u.codex)||{},gemini:(null==(c=n.proxyStatus)?void 0:c.gemini)||{},opencode:(null==(d=n.proxyStatus)?void 0:d.opencode)||{}},todayStats:{claude:w(null==(p=n.todayStats)?void 0:p.claude),codex:w(null==(v=n.todayStats)?void 0:v.codex),gemini:w(null==(m=n.todayStats)?void 0:m.gemini),opencode:w(null==(f=n.todayStats)?void 0:f.opencode)},counts:{claude:(null==(g=n.counts)?void 0:g.claude)||{projectCount:0,sessionCount:0},codex:(null==(y=n.counts)?void 0:y.codex)||{projectCount:0,sessionCount:0},gemini:(null==(h=n.counts)?void 0:h.gemini)||{projectCount:0,sessionCount:0},opencode:(null==(b=n.counts)?void 0:b.opencode)||{projectCount:0,sessionCount:0}}},t.value=!0,e.value}finally{a.value=!1,n=null}})().catch(e=>{throw e})),n)}return{dashboardData:e,isLoading:a,isLoaded:t,loadDashboard:o,enableAutoRefresh:function(){s||(s=setInterval(()=>{o(!0).catch(()=>{})},3e5))},disableAutoRefresh:function(){s&&(clearInterval(s),s=null)},refreshChannels:async function(a){try{if("claude"===a){const a=await Ni.getChannels();a.success&&(e.value.channels.claude=a.channels)}else if("codex"===a){const a=await Ni.getCodexChannels();a.success&&(e.value.channels.codex=a.channels)}else if("gemini"===a){const a=await Ni.getGeminiChannels();a.success&&(e.value.channels.gemini=a.channels)}else if("opencode"===a){const a=await Ni.getOpenCodeChannels();a.success&&(e.value.channels.opencode=a.channels)}}catch(l){}},refreshProxyStatus:async function(a){try{if("claude"===a){const a=await Ni.getProxyStatus();a.success&&(e.value.proxyStatus.claude=a)}else if("codex"===a){const a=await Ni.getCodexProxyStatus();a.success&&(e.value.proxyStatus.codex=a)}else if("gemini"===a){const a=await Ni.getGeminiProxyStatus();a.success&&(e.value.proxyStatus.gemini=a)}else if("opencode"===a){const a=await Ni.getOpenCodeProxyStatus();a.success&&(e.value.proxyStatus.opencode=a)}}catch(l){}},refreshStats:async function(a){try{const l=(e={})=>{const a=e.summary||{};return{requests:a.requests||0,tokens:a.tokens||0,cost:a.cost||0,byModel:e.byModel||{}}};if("claude"===a){const a=await Ni.getTodayStatistics();e.value.todayStats.claude=l(a)}else if("codex"===a){const a=await Ni.getCodexTodayStatistics();e.value.todayStats.codex=l(a)}else if("gemini"===a){const a=await Ni.getGeminiTodayStatistics();e.value.todayStats.gemini=l(a)}else if("opencode"===a){const a=await Ni.getOpenCodeTodayStatistics();e.value.todayStats.opencode=l(a)}}catch(l){}}}}),Ri="cc-theme",Bi=l(!1);let Hi=!1,qi=null,Ki=null,Gi=!1;function Wi(){return qi||(qi=Fi(),Ki=T(qi).dashboardData),qi}function Vi(){Gi||Ki&&(x(()=>{var e,a;return null==(a=null==(e=Ki.value)?void 0:e.uiConfig)?void 0:a.theme},e=>{if(!e)return;const a="dark"===e;if(!Hi)return Hi=!0,Bi.value=a,void Zi(a);Bi.value!==a&&(Bi.value=a,Zi(a))}),Gi=!0)}async function Ji(){var e,a,l,t;if(Hi)return;const n="undefined"!=typeof window?null==(e=window.localStorage)?void 0:e.getItem(Ri):null;"dark"!==n&&"light"!==n||(Bi.value="dark"===n,Zi(Bi.value));try{const e=Wi();Vi();let s=null==(l=null==(a=null==Ki?void 0:Ki.value)?void 0:a.uiConfig)?void 0:l.theme;if(!s){const a=await e.loadDashboard().catch(()=>null);s=null==(t=null==a?void 0:a.uiConfig)?void 0:t.theme}s||n?s&&(Bi.value="dark"===s):Bi.value=window.matchMedia("(prefers-color-scheme: dark)").matches}catch(s){n||(Bi.value=window.matchMedia("(prefers-color-scheme: dark)").matches)}Zi(Bi.value),Hi=!0}function Zi(e){e?document.documentElement.setAttribute("data-theme","dark"):document.documentElement.removeAttribute("data-theme")}function Yi(){Bi.value=!Bi.value}function Xi(){return{isDark:Bi,toggleTheme:Yi,loadTheme:Ji}}x(Bi,async e=>{var a;Zi(e);try{null==(a=window.localStorage)||a.setItem(Ri,e?"dark":"light")}catch(l){}try{await Tn("theme",e?"dark":"light");Wi();Vi(),Ki.value&&(Ki.value={...Ki.value,uiConfig:{...Ki.value.uiConfig||{},theme:e?"dark":"light"}})}catch(l){}});const Qi={class:"settings-container"},er={class:"settings-sidebar"},ar={class:"sidebar-header"},lr={class:"settings-menu"},tr=["onClick"],nr={class:"menu-label"},sr={class:"settings-content"},or={class:"settings-panel"},ir={class:"panel-header"},rr={class:"panel-title-row"},ur={class:"panel-body"},cr={class:"setting-group"},dr={class:"setting-item"},pr={class:"setting-label"},vr={class:"visibility-options"},mr={class:"visibility-item"},fr={class:"visibility-info"},gr={class:"visibility-item"},yr={class:"visibility-info"},hr={class:"setting-item"},br={class:"setting-label"},wr={class:"simple-theme-options"},kr={class:"theme-text"},_r={key:0,class:"theme-check"},xr={class:"theme-text"},Cr={key:0,class:"theme-check"},Ur={class:"settings-panel"},Sr={class:"panel-header"},zr={class:"panel-title-row"},Ir={class:"panel-body"},Tr={class:"setting-group"},Pr={class:"setting-item"},Mr={class:"setting-label"},$r={class:"notification-options"},jr={class:"visibility-item"},Or={class:"visibility-info"},Ar={key:0,class:"notification-type-section"},Lr={class:"radio-content"},Er={class:"radio-content"},Dr={style:{"font-size":"13px"}},Nr={class:"setting-item"},Fr={class:"setting-label"},Rr={class:"notification-options"},Br={class:"visibility-item"},Hr={class:"visibility-info"},qr={key:0,class:"notification-type-section"},Kr={class:"setting-item"},Gr={class:"setting-label"},Wr={class:"panel-footer"},Vr={class:"settings-panel"},Jr={class:"panel-header"},Zr={class:"panel-title-row"},Yr={class:"panel-body"},Xr={class:"setting-group"},Qr={class:"setting-item"},eu={class:"setting-label"},au={class:"ports-grid"},lu={class:"port-field"},tu={class:"port-field"},nu={class:"port-field"},su={class:"port-field"},ou={class:"port-field"},iu={class:"setting-item"},ru={class:"setting-label"},uu={class:"advanced-options"},cu={class:"option-field"},du={class:"option-label"},pu={class:"setting-item"},vu={class:"setting-label"},mu={class:"advanced-options"},fu={class:"option-field"},gu={class:"option-label"},yu={class:"option-field"},hu={class:"option-label"},bu={class:"setting-item"},wu={class:"setting-label"},ku={style:{"margin-top":"16px"}},_u={style:{background:"var(--bg-secondary)",padding:"16px","border-radius":"8px","border-left":"3px solid var(--border-secondary)"}},xu={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},Cu={class:"panel-footer"},Uu={class:"settings-panel"},Su={class:"panel-header"},zu={class:"panel-title-row"},Iu={class:"panel-body"},Tu={key:0,class:"security-locked"},Pu={key:1,class:"setting-group"},Mu={class:"setting-item"},$u={class:"setting-label"},ju={class:"security-status"},Ou={class:"setting-item"},Au={class:"setting-label"},Lu={class:"security-form"},Eu={class:"panel-footer"},Du={class:"settings-panel"},Nu={class:"panel-header"},Fu={class:"panel-title-row"},Ru={class:"panel-body"},Bu={class:"setting-item",style:{"margin-bottom":"12px"}},Hu={class:"model-meta-section"},qu={class:"speed-test-defaults"},Ku={class:"speed-test-default-label"},Gu={class:"model-toolbar"},Wu={class:"model-filter-row"},Vu={key:0,class:"setting-item"},Ju={key:1,class:"model-list"},Zu=["onClick"],Yu={class:"model-card-id"},Xu={key:0,class:"model-card-body"},Qu={class:"model-meta-editor"},ec={class:"model-meta-section"},ac={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},lc={class:"model-meta-section",style:{"margin-top":"8px"}},tc={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},nc={class:"panel-footer"},sc={class:"security-auth"},oc={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},ic={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},rc={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},uc=Pl({__name:"SettingsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:k}=ko(680);async function _(e){return(await dt.post("/settings/model-settings",e)).data}async function C(e){return(await dt.delete(`/settings/model-settings/${encodeURIComponent(e)}`)).data}const U=e,S=a,I=w({get:()=>U.visible,set:e=>S("update:visible",e)}),T=l("appearance"),{isDark:P,toggleTheme:M}=Xi(),$=l(!0),j=l(!0),A=l({webUI:19999,proxy:20088,codexProxy:20089,geminiProxy:20090,opencodeProxy:20091}),E=l({webUI:19999,proxy:20088,codexProxy:20089,geminiProxy:20090,opencodeProxy:20091}),D=l(!1),N=l(!1),F=l(!1),R=w(()=>N.value?"✓ 已启用":"未启用"),B=w(()=>N.value?"重启电脑时 Coding-Tool 会自动启动。如需禁用,点击下方按钮":"启用后,重启电脑时 Coding-Tool 会自动启动"),H=l({maxLogs:100,statsInterval:30,enableSessionBinding:!0}),J=l({maxLogs:100,statsInterval:30,enableSessionBinding:!0}),Z=l({claude:{enabled:!1,type:"notification"},feishu:{enabled:!1,webhookUrl:""}}),Y=l({claude:{enabled:!1,type:"notification"},feishu:{enabled:!1,webhookUrl:""}}),X=l(!1),ae=l(""),le=l({hasPassword:!1}),ce=l(!1),ge=l(!1),ye=l(!1),he=l(!1),be=l(""),we=l(""),ke=l(!1),_e=l({currentPassword:"",newPassword:"",confirmPassword:""}),xe=l(!1);let Ce=null;const Ue=l(!1),Se=l(!1),ze=l({}),Ie=l({}),Te=l({}),Pe=l(""),Me=l("all"),$e=l(!1),je=l({modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0}),Oe=l(new Set),Ae=l({claude:"",codex:"",gemini:""}),Le=l({claude:"",codex:"",gemini:""}),Ee=[{key:"claude",label:"Claude Code"},{key:"codex",label:"Codex"},{key:"gemini",label:"Gemini CLI"}],De=l(new Set),Ne=w(()=>Object.keys(Te.value).length>0),Fe=w(()=>Ne.value||JSON.stringify(Ae.value)!==JSON.stringify(Le.value)),Re=w(()=>{const e=String(je.value.modelId||"").trim();if(!e)return"请输入模型 ID";const a=Object.keys(ze.value).find(a=>a.toLowerCase()===e.toLowerCase());return a?`模型已存在:${a}`:!Number.isFinite(je.value.context)||je.value.context<=0?"Context 窗口必须为正数":!Number.isFinite(je.value.output)||je.value.output<=0?"Max Output 必须为正数":je.value.inputPrice<0||je.value.outputPrice<0||je.value.cacheCreationPrice<0||je.value.cacheReadPrice<0?"价格不能为负数":""});function Be(){je.value={modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0},$e.value=!0}function qe(){$e.value=!1}function Ke(){if(Re.value)return;const e=String(je.value.modelId||"").trim(),a={limit:{context:je.value.context,output:je.value.output},pricing:{input:je.value.inputPrice,output:je.value.outputPrice,cacheCreation:je.value.cacheCreationPrice,cacheRead:je.value.cacheReadPrice}};ze.value[e]=a,Te.value[e]={limit:{...a.limit},pricing:{...a.pricing}},Pe.value=e,$e.value=!1,Un.success("模型已新增,请点击“保存设置”使其生效")}function Ge(e){return Oe.value.has(e)}function We(e){return!Ge(e)}const Je=w(()=>{const e=Object.keys(ze.value),a=Pe.value.trim().toLowerCase(),l=Me.value;return e.filter(e=>!(a&&!e.toLowerCase().includes(a))&&("claude"===l?e.startsWith("claude-"):"openai"===l?e.startsWith("gpt-")||e.startsWith("o1")||e.startsWith("o3")||e.startsWith("o4"):"gemini"===l?e.startsWith("gemini-"):"overrides"!==l||!!Ie.value[e]))});function Ze(e){const a=String(e||"").trim().toLowerCase();return a.startsWith("claude-")?"claude":a.startsWith("gemini-")?"gemini":a.startsWith("gpt-")||a.startsWith("o1")||a.startsWith("o3")||a.startsWith("o4")?"codex":""}const Ye=w(()=>{const e={claude:[],codex:[],gemini:[]};for(const[a,l]of Object.entries(ze.value||{})){if(!l||"object"!=typeof l||!l.limit||!l.pricing)continue;const t=Ze(a);t&&e[t]&&e[t].push({label:a,value:a})}for(const a of Object.keys(e))e[a].sort((e,a)=>e.label.localeCompare(a.label));return e});function Xe(e,a,l){var t,n,s,o;return void 0!==(null==(n=null==(t=Te.value[e])?void 0:t[a])?void 0:n[l])?Te.value[e][a][l]:(null==(o=null==(s=ze.value[e])?void 0:s[a])?void 0:o[l])??null}function Qe(e,a,l,t){if(!Te.value[e]){const a=ze.value[e]||{};Te.value[e]={limit:{...a.limit||{}},pricing:{...a.pricing||{}}}}Te.value[e][a]||(Te.value[e][a]={}),Te.value[e][a][l]=t}async function ea(){var e,a,l;Ue.value=!0;try{const t=await async function(){return(await dt.get("/settings/model-settings")).data}();ze.value=t.models||{},Ie.value=t.overrides||{},Oe.value=new Set(t.builtinModelIds||[]),Ae.value={claude:"string"==typeof(null==(e=t.defaultSpeedTestModels)?void 0:e.claude)?t.defaultSpeedTestModels.claude:"",codex:"string"==typeof(null==(a=t.defaultSpeedTestModels)?void 0:a.codex)?t.defaultSpeedTestModels.codex:"",gemini:"string"==typeof(null==(l=t.defaultSpeedTestModels)?void 0:l.gemini)?t.defaultSpeedTestModels.gemini:""},function(){const e={...Ae.value};let a=!1;for(const l of Ee){const t=Ye.value[l.key]||[];0!==t.length&&(new Set(t.map(e=>e.value)).has(e[l.key])||(e[l.key]=t[0].value,a=!0))}a&&(Ae.value=e)}(),Le.value={...Ae.value},Te.value={}}catch(t){}finally{Ue.value=!1}}async function aa(){Se.value=!0;try{const e={...Ie.value};for(const[a,l]of Object.entries(Te.value)){const t=e[a]||{};e[a]={limit:{...t.limit||{},...l.limit||{}},pricing:{...t.pricing||{},...l.pricing||{}}}}await _({overrides:e,defaultSpeedTestModels:Ae.value}),Ie.value=e,Le.value={...Ae.value},Te.value={},await ea(),Un.success("模型设置已保存")}catch(e){Un.error("保存失败:"+e.message)}finally{Se.value=!1}}async function la(){try{await _({overrides:{},defaultSpeedTestModels:Ae.value}),Ie.value={},Te.value={},await ea(),Un.success("全部模型设置已重置为内置默认值")}catch(e){Un.error("重置失败:"+e.message)}}const ta=w(()=>A.value.webUI!==E.value.webUI||A.value.proxy!==E.value.proxy||A.value.codexProxy!==E.value.codexProxy||A.value.geminiProxy!==E.value.geminiProxy||A.value.opencodeProxy!==E.value.opencodeProxy||H.value.maxLogs!==J.value.maxLogs||H.value.statsInterval!==J.value.statsInterval||H.value.enableSessionBinding!==J.value.enableSessionBinding),na=w(()=>le.value.hasPassword&&!ye.value),sa=w(()=>_e.value.newPassword&&_e.value.confirmPassword?_e.value.newPassword.length<4?"密码至少 4 位":_e.value.newPassword!==_e.value.confirmPassword?"两次输入的新密码不一致":"":""),oa=w(()=>!na.value&&(!(!_e.value.newPassword||!_e.value.confirmPassword)&&(!sa.value&&!(le.value.hasPassword&&!_e.value.currentPassword)))),ia=w(()=>[{key:"appearance",label:"外观设置",icon:L(wa)},{key:"notification",label:"通知设置",icon:L(ka)},{key:"advanced",label:"高级设置",icon:L(_a)},{key:"security",label:"安全设置",icon:L(xa)},{key:"model-settings",label:"模型设置",icon:L(ca)}]);async function ra(){var e,a;try{const l=await zn();l.success&&l.config&&($.value=!1!==(null==(e=l.config.panelVisibility)?void 0:e.showChannels),j.value=!1!==(null==(a=l.config.panelVisibility)?void 0:a.showLogs))}catch(l){}}async function ua(){try{await Pn("panelVisibility","showChannels",$.value),await Pn("panelVisibility","showLogs",j.value)}catch(e){}}function da(e){$.value=e,ua(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:e,showLogs:j.value}}))}function pa(e){j.value=e,ua(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:$.value,showLogs:e}}))}async function va(e){try{(await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:A.value,maxLogs:H.value.maxLogs,statsInterval:H.value.statsInterval,enableSessionBinding:e})})).ok?(J.value.enableSessionBinding=e,Un.success(e?"会话绑定已开启":"会话绑定已关闭")):(H.value.enableSessionBinding=!e,Un.error("保存失���"))}catch(a){H.value.enableSessionBinding=!e,Un.error("保存失败: "+a.message)}}async function ma(){X.value=!0;try{const e=await fetch("/api/claude/hooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stopHook:{enabled:Z.value.claude.enabled,type:Z.value.claude.type},feishu:{enabled:Z.value.feishu.enabled,webhookUrl:Z.value.feishu.webhookUrl}})});if(e.ok)Y.value=JSON.parse(JSON.stringify(Z.value)),Un.success("通知设置已保存");else{const a=await e.json();Un.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Un.error("保存失败:"+e.message)}finally{X.value=!1}}function fa(){_e.value={currentPassword:"",newPassword:"",confirmPassword:""}}function ga(){he.value=!1,be.value="",we.value="",ke.value=!1}async function ya(e=!1){return ge.value&&Ce?Ce:ce.value&&!e?Promise.resolve():(ge.value=!0,Ce=(async()=>{try{const e=await Ti();e.success&&(le.value={hasPassword:Boolean(e.hasPassword)},ce.value=!0)}catch(e){}finally{ge.value=!1,Ce=null}})(),Ce)}function ha(){le.value.hasPassword?(be.value="",we.value="",he.value=!0):ye.value=!0}function ba(){ga()}async function Pa(){var e,a;if(be.value){ke.value=!0,we.value="";try{const e=await Pi(be.value);e.success?(ye.value=!0,ga()):we.value=e.error||"密码错误"}catch(l){we.value=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.error)||"密码错误"}finally{ke.value=!1}}else we.value="请输入密码"}async function Ma(e=!1){await ya(e),le.value.hasPassword?(ye.value=!1,ha()):ye.value=!0}async function $a(){var e,a;if(!oa.value)return void Un.warning("请完善密码信息");const l=le.value.hasPassword;xe.value=!0;try{const e={newPassword:_e.value.newPassword};le.value.hasPassword&&(e.currentPassword=_e.value.currentPassword);const a=await Mi(e);a.success?(le.value.hasPassword=!0,ce.value=!0,fa(),Un.success(l?"密码已更新":"密码已设置")):Un.error(a.error||"保存失败")}catch(t){Un.error((null==(a=null==(e=t.response)?void 0:e.data)?void 0:a.error)||"保存失败")}finally{xe.value=!1}}async function ja(){D.value=!0;try{const e=await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:A.value,maxLogs:H.value.maxLogs,statsInterval:H.value.statsInterval,enableSessionBinding:H.value.enableSessionBinding})});if(e.ok)E.value={...A.value},J.value={...H.value},window.dispatchEvent(new CustomEvent("advanced-config-change",{detail:{maxLogs:H.value.maxLogs,statsInterval:H.value.statsInterval}})),Un.success("配置已保存,端口修改需要重启服务器生效");else{const a=await e.json();Un.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Un.error("保存失败:"+e.message)}finally{D.value=!1}}async function Oa(){F.value=!0;try{const e=await Oi();if(e.success)N.value=!0,Un.success("开机自启已启用");else{const a=e.message||"未知错误";a.includes("暂无运行中的进程")||a.includes("请先启动")?Un.warning(a):Un.error(a)}}catch(e){Un.error(e.message||"启用失败:未知错误")}finally{F.value=!1}}async function Aa(){F.value=!0;try{const e=await Ai();if(e.success)N.value=!1,Un.success("开机自启已禁用");else{const a=e.message||"未知错误";a.includes("未启用")||a.includes("不存在")?Un.warning(a):Un.error(a)}}catch(e){Un.error(e.message||"禁用失败:未知错误")}finally{F.value=!1}}return b(()=>{ra(),ya(),ea()}),x(I,e=>{e?(ra(),async function(){var e,a,l,t,n;try{const s=await fetch("/api/config/advanced");if(s.ok){const o=await s.json();A.value={webUI:(null==(e=o.ports)?void 0:e.webUI)||19999,proxy:(null==(a=o.ports)?void 0:a.proxy)||20088,codexProxy:(null==(l=o.ports)?void 0:l.codexProxy)||20089,geminiProxy:(null==(t=o.ports)?void 0:t.geminiProxy)||20090,opencodeProxy:(null==(n=o.ports)?void 0:n.opencodeProxy)||20091},E.value={...A.value},H.value={maxLogs:o.maxLogs||100,statsInterval:o.statsInterval||30,enableSessionBinding:!1!==o.enableSessionBinding},J.value={...H.value}}}catch(s){}}(),async function(){var e;try{const a=await ji();a&&a.success?N.value=(null==(e=a.data)?void 0:e.enabled)||!1:N.value=!1}catch(a){N.value=!1}}(),async function(){var e,a,l,t;try{const n=await fetch("/api/claude/hooks");if(n.ok){const s=await n.json();Z.value={claude:{enabled:(null==(e=s.stopHook)?void 0:e.enabled)||!1,type:(null==(a=s.stopHook)?void 0:a.type)||"notification"},feishu:{enabled:(null==(l=s.feishu)?void 0:l.enabled)||!1,webhookUrl:(null==(t=s.feishu)?void 0:t.webhookUrl)||""}},Y.value=JSON.parse(JSON.stringify(Z.value)),ae.value=s.platform||""}}catch(n){}}(),ea(),"security"===T.value?Ma(!0):ya(!0)):(ye.value=!1,ga(),fa())}),x(T,(e,a)=>{"security"===e&&Ma(),"security"===a&&"security"!==e&&(ye.value=!1,ga(),fa())}),(e,a)=>(n(),g(c(pe),{show:I.value,"onUpdate:show":a[33]||(a[33]=e=>I.value=e),width:c(k),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{"show-header":!1,closable:"","native-scrollbar":!1},{default:u(()=>[s("div",Qi,[s("div",er,[s("div",ar,[r(c(q),{size:"20",color:"var(--text-secondary)"},{default:u(()=>[r(c(Ca))]),_:1}),a[34]||(a[34]=s("span",{class:"sidebar-title"},"设置分类",-1))]),s("div",lr,[(n(!0),t(m,null,f(ia.value,e=>(n(),t("div",{key:e.key,class:d(["menu-item",{active:T.value===e.key}]),onClick:a=>T.value=e.key},[r(c(q),{size:18,class:"menu-icon"},{default:u(()=>[(n(),g(z(e.icon)))]),_:2},1024),s("span",nr,v(e.label),1),e.badge?(n(),g(c(ve),{key:0,value:e.badge,type:e.badgeType||"info","show-zero":!1},null,8,["value","type"])):o("",!0)],10,tr))),128))])]),s("div",sr,[i(s("div",or,[s("div",ir,[s("div",rr,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(wa))]),_:1}),s("div",null,[a[36]||(a[36]=s("h3",{class:"panel-title"},"外观设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[35]||(a[35]=[y("自定义界面外观和主题",-1)])]),_:1})])])]),s("div",ur,[s("div",cr,[s("div",dr,[s("div",pr,[r(c(V),{strong:""},{default:u(()=>[...a[37]||(a[37]=[y("面板显示",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[38]||(a[38]=[y(" 控制右侧面板中各个区域的显示 ",-1)])]),_:1})]),s("div",vr,[s("div",mr,[s("div",fr,[r(c(V),{strong:""},{default:u(()=>[...a[39]||(a[39]=[y("显示渠道列表",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[40]||(a[40]=[y(" 在右侧面板显示 API 渠道管理区域 ",-1)])]),_:1})]),r(c(W),{value:$.value,"onUpdate:value":da},null,8,["value"])]),s("div",gr,[s("div",yr,[r(c(V),{strong:""},{default:u(()=>[...a[41]||(a[41]=[y("显示实时日志",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[42]||(a[42]=[y(" 在 Dashboard 显示实时日志区域 ",-1)])]),_:1})]),r(c(W),{value:j.value,"onUpdate:value":pa},null,8,["value"])])])]),r(c(me)),s("div",hr,[s("div",br,[r(c(V),{strong:""},{default:u(()=>[...a[43]||(a[43]=[y("界面主题",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[44]||(a[44]=[y(" 选择你喜欢的界面主题风格 ",-1)])]),_:1})]),s("div",wr,[s("div",{class:d(["simple-theme-item",{active:!c(P)}]),onClick:a[0]||(a[0]=e=>c(P)&&c(M)())},[r(c(q),{size:20,class:"theme-icon"},{default:u(()=>[r(c(Ua))]),_:1}),s("div",kr,[r(c(V),{strong:""},{default:u(()=>[...a[45]||(a[45]=[y("亮色模式",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[46]||(a[46]=[y("经典的浅色主题",-1)])]),_:1})]),c(P)?o("",!0):(n(),t("div",_r,[r(c(q),{size:20,color:"#18a058"},{default:u(()=>[r(c(He))]),_:1})]))],2),s("div",{class:d(["simple-theme-item",{active:c(P)}]),onClick:a[1]||(a[1]=e=>!c(P)&&c(M)())},[r(c(q),{size:20,class:"theme-icon"},{default:u(()=>[r(c(Sa))]),_:1}),s("div",xr,[r(c(V),{strong:""},{default:u(()=>[...a[47]||(a[47]=[y("暗色模式",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[48]||(a[48]=[y("护眼的深色主题",-1)])]),_:1})]),c(P)?(n(),t("div",Cr,[r(c(q),{size:20,color:"#18a058"},{default:u(()=>[r(c(He))]),_:1})])):o("",!0)],2)])])])])],512),[[h,"appearance"===T.value]]),i(s("div",Ur,[s("div",Sr,[s("div",zr,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(ka))]),_:1}),s("div",null,[a[50]||(a[50]=s("h3",{class:"panel-title"},"通知设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[49]||(a[49]=[y("配置任务完成时的系统通知",-1)])]),_:1})])])]),s("div",Ir,[s("div",Tr,[s("div",Pr,[s("div",Mr,[r(c(V),{strong:""},{default:u(()=>[...a[51]||(a[51]=[y("Claude Code",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[52]||(a[52]=[y(" 当 Claude Code 任务完成或等待交互时发送系统通知 ",-1)])]),_:1})]),s("div",$r,[s("div",jr,[s("div",Or,[r(c(V),{strong:""},{default:u(()=>[...a[53]||(a[53]=[y("启用任务完成通知",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[54]||(a[54]=[y(" 通过 Claude Code 的 Stop Hook 在任务完成时发送通知 ",-1)])]),_:1})]),r(c(W),{value:Z.value.claude.enabled,"onUpdate:value":a[2]||(a[2]=e=>Z.value.claude.enabled=e)},null,8,["value"])]),Z.value.claude.enabled?(n(),t("div",Ar,[r(c(V),{depth:"2",style:{"font-size":"13px","margin-bottom":"12px",display:"block"}},{default:u(()=>[...a[55]||(a[55]=[y(" 选择通知方式 ",-1)])]),_:1}),r(c(ne),{value:Z.value.claude.type,"onUpdate:value":a[3]||(a[3]=e=>Z.value.claude.type=e)},{default:u(()=>[r(c(se),{vertical:""},{default:u(()=>[r(c(oe),{value:"notification"},{default:u(()=>[s("div",Lr,[r(c(V),{strong:""},{default:u(()=>[...a[56]||(a[56]=[y("右上角卡片通知",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[...a[57]||(a[57]=[y(" 轻量提醒,几秒后自动消失,带提示音(Windows 使用系统 Toast 风格提醒) ",-1)])]),_:1})])]),_:1}),r(c(oe),{value:"dialog"},{default:u(()=>[s("div",Er,[r(c(V),{strong:""},{default:u(()=>[...a[58]||(a[58]=[y("弹窗对话框",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[...a[59]||(a[59]=[y(" 强制提醒,需要手动点击确认才能关闭 ",-1)])]),_:1})])]),_:1})]),_:1})]),_:1},8,["value"]),"darwin"===ae.value?(n(),g(c(fe),{key:0,type:"info",bordered:!1,style:{"margin-top":"16px"},"show-icon":!1},{default:u(()=>[s("div",Dr,[r(c(V),{strong:""},{default:u(()=>[...a[60]||(a[60]=[y("💡 更好的通知体验",-1)])]),_:1}),r(c(V),{depth:"3",style:{display:"block","margin-top":"4px","font-size":"12px"}},{default:u(()=>[...a[61]||(a[61]=[y(" 安装 terminal-notifier 后,点击通知可自动打开终端 ",-1)])]),_:1}),r(c(V),{code:"",style:{display:"block","margin-top":"8px","font-size":"12px"}},{default:u(()=>[...a[62]||(a[62]=[y(" brew install terminal-notifier ",-1)])]),_:1})])]),_:1})):o("",!0)])):o("",!0)])]),r(c(me)),s("div",Nr,[s("div",Fr,[r(c(V),{strong:""},{default:u(()=>[...a[63]||(a[63]=[y("飞书机器人通知",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[64]||(a[64]=[y(" 任务完成时同时发送飞书机器人通知,适合需要远程提醒的场景 ",-1)])]),_:1})]),s("div",Rr,[s("div",Br,[s("div",Hr,[r(c(V),{strong:""},{default:u(()=>[...a[65]||(a[65]=[y("启用飞书通知",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[66]||(a[66]=[y(" 通过飞书机器人 Webhook 发送通知 ",-1)])]),_:1})]),r(c(W),{value:Z.value.feishu.enabled,"onUpdate:value":a[4]||(a[4]=e=>Z.value.feishu.enabled=e)},null,8,["value"])]),Z.value.feishu.enabled?(n(),t("div",qr,[r(c(V),{depth:"2",style:{"font-size":"13px","margin-bottom":"12px",display:"block"}},{default:u(()=>[...a[67]||(a[67]=[y(" 飞书机器人 Webhook URL ",-1)])]),_:1}),r(c(re),{value:Z.value.feishu.webhookUrl,"onUpdate:value":a[5]||(a[5]=e=>Z.value.feishu.webhookUrl=e),placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx",type:"text",clearable:""},null,8,["value"]),r(c(V),{depth:"3",style:{"font-size":"12px","margin-top":"8px",display:"block"}},{default:u(()=>[...a[68]||(a[68]=[y(" 在飞书群设置中添加自定义机器人,复制 Webhook 地址粘贴到这里 ",-1)])]),_:1})])):o("",!0)])]),r(c(me)),s("div",Kr,[s("div",Gr,[r(c(V),{strong:""},{default:u(()=>[...a[69]||(a[69]=[y("Codex CLI / Gemini CLI",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[70]||(a[70]=[y(" 暂不支持 - Codex 和 Gemini 目前没有 hooks 功能 ",-1)])]),_:1})]),r(c(fe),{type:"info",bordered:!1,style:{"margin-top":"12px"}},{default:u(()=>[...a[71]||(a[71]=[y(" Codex CLI 和 Gemini CLI 暂未提供 hooks 机制,未来如有支持将自动适配 ",-1)])]),_:1})])])]),s("div",Wr,[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{size:"large",onClick:a[6]||(a[6]=e=>I.value=!1)},{default:u(()=>[...a[72]||(a[72]=[y(" 取消 ",-1)])]),_:1}),r(c(K),{type:"primary",size:"large",loading:X.value,disabled:JSON.stringify(Z.value)===JSON.stringify(Y.value),onClick:ma},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(za))]),_:1})]),default:u(()=>[a[73]||(a[73]=y(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[h,"notification"===T.value]]),i(s("div",Vr,[s("div",Jr,[s("div",Zr,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(_a))]),_:1}),s("div",null,[a[75]||(a[75]=s("h3",{class:"panel-title"},"高级设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[74]||(a[74]=[y("端口配置和高级选项",-1)])]),_:1})])])]),s("div",Yr,[s("div",Xr,[s("div",Qr,[s("div",eu,[r(c(V),{strong:""},{default:u(()=>[...a[76]||(a[76]=[y("端口配置",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[77]||(a[77]=[y(" 修改后需要重启服务器才能生效 ",-1)])]),_:1})]),s("div",au,[s("div",lu,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[78]||(a[78]=[y("Web UI 端口",-1)])]),_:1}),r(c(ue),{value:A.value.webUI,"onUpdate:value":a[7]||(a[7]=e=>A.value.webUI=e),min:1024,max:65535,"show-button":!1,placeholder:"19999"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(He))]),_:1})]),_:1},8,["value"])]),s("div",tu,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[79]||(a[79]=[y("Claude 代理",-1)])]),_:1}),r(c(ue),{value:A.value.proxy,"onUpdate:value":a[8]||(a[8]=e=>A.value.proxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20088"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(_a))]),_:1})]),_:1},8,["value"])]),s("div",nu,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[80]||(a[80]=[y("Codex 代理",-1)])]),_:1}),r(c(ue),{value:A.value.codexProxy,"onUpdate:value":a[9]||(a[9]=e=>A.value.codexProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20089"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(_a))]),_:1})]),_:1},8,["value"])]),s("div",su,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[81]||(a[81]=[y("Gemini 代理",-1)])]),_:1}),r(c(ue),{value:A.value.geminiProxy,"onUpdate:value":a[10]||(a[10]=e=>A.value.geminiProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20090"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(_a))]),_:1})]),_:1},8,["value"])]),s("div",ou,[r(c(V),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[82]||(a[82]=[y("OpenCode 代理",-1)])]),_:1}),r(c(ue),{value:A.value.opencodeProxy,"onUpdate:value":a[11]||(a[11]=e=>A.value.opencodeProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20091"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(_a))]),_:1})]),_:1},8,["value"])])])]),r(c(me)),s("div",iu,[s("div",ru,[r(c(V),{strong:""},{default:u(()=>[...a[83]||(a[83]=[y("负载均衡",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[84]||(a[84]=[y(" 多渠道负载均衡时的分配策略 ",-1)])]),_:1})]),s("div",uu,[s("div",cu,[s("div",du,[r(c(V),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[85]||(a[85]=[y("多渠道负载会话绑定",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[86]||(a[86]=[y("开启后同一对话始终使用同一渠道,保证上下文连续性",-1)])]),_:1})]),r(c(W),{value:H.value.enableSessionBinding,"onUpdate:value":[a[12]||(a[12]=e=>H.value.enableSessionBinding=e),va],size:"medium"},null,8,["value"])])])]),r(c(me)),s("div",pu,[s("div",vu,[r(c(V),{strong:""},{default:u(()=>[...a[87]||(a[87]=[y("日志和性能",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[88]||(a[88]=[y(" 控制日志显示和数据刷新行为 ",-1)])]),_:1})]),s("div",mu,[s("div",fu,[s("div",gu,[r(c(V),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[89]||(a[89]=[y("实时日志保留数量",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[90]||(a[90]=[y("超过此数量将自动清理旧日志",-1)])]),_:1})]),r(c(ue),{value:H.value.maxLogs,"onUpdate:value":a[13]||(a[13]=e=>H.value.maxLogs=e),min:50,max:500,step:10,style:{width:"140px"}},{suffix:u(()=>[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[91]||(a[91]=[y("条",-1)])]),_:1})]),_:1},8,["value"])]),s("div",yu,[s("div",hu,[r(c(V),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[92]||(a[92]=[y("统计数据刷新间隔",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[93]||(a[93]=[y("自动刷新今日统计的时间间隔",-1)])]),_:1})]),r(c(ue),{value:H.value.statsInterval,"onUpdate:value":a[14]||(a[14]=e=>H.value.statsInterval=e),min:10,max:300,step:5,style:{width:"140px"}},{suffix:u(()=>[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[94]||(a[94]=[y("秒",-1)])]),_:1})]),_:1},8,["value"])])])]),r(c(me)),s("div",bu,[s("div",wu,[r(c(V),{strong:""},{default:u(()=>[...a[95]||(a[95]=[y("开机自启",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[96]||(a[96]=[y(" 启用此选项后,重启电脑时 Coding-Tool 会自动启动 ",-1)])]),_:1})]),s("div",ku,[s("div",_u,[s("div",xu,[r(c(V),{strong:"",style:{flex:"1"}},{default:u(()=>[y(v(R.value),1)]),_:1}),N.value?(n(),g(c(K),{key:1,type:"warning",size:"small",loading:F.value,onClick:Aa},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ia))]),_:1})]),default:u(()=>[a[98]||(a[98]=y(" 禁用自启 ",-1))]),_:1},8,["loading"])):(n(),g(c(K),{key:0,type:"primary",size:"small",loading:F.value,onClick:Oa},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(He))]),_:1})]),default:u(()=>[a[97]||(a[97]=y(" 启用自启 ",-1))]),_:1},8,["loading"]))]),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[y(v(B.value),1)]),_:1})])])])])]),s("div",Cu,[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{size:"large",onClick:a[15]||(a[15]=e=>I.value=!1)},{default:u(()=>[...a[99]||(a[99]=[y(" 取消 ",-1)])]),_:1}),r(c(K),{type:"primary",size:"large",loading:D.value,disabled:!ta.value,onClick:ja},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(za))]),_:1})]),default:u(()=>[a[100]||(a[100]=y(" 保存端口配置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[h,"advanced"===T.value]]),i(s("div",Uu,[s("div",Su,[s("div",zu,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(xa))]),_:1}),s("div",null,[a[102]||(a[102]=s("h3",{class:"panel-title"},"安全设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[101]||(a[101]=[y("设置访问密码,保护关键配置",-1)])]),_:1})])])]),s("div",Iu,[na.value?(n(),t("div",Tu,[r(c(ee),{description:"请输入密码后访问安全设置"},{extra:u(()=>[r(c(K),{type:"primary",onClick:ha},{default:u(()=>[...a[103]||(a[103]=[y(" 输入密码 ",-1)])]),_:1})]),_:1})])):(n(),t("div",Pu,[s("div",Mu,[s("div",$u,[r(c(V),{strong:""},{default:u(()=>[...a[104]||(a[104]=[y("访问保护",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[105]||(a[105]=[y(" 每次进入安全设置都需要输入密码验证 ",-1)])]),_:1})]),s("div",ju,[le.value.hasPassword?(n(),g(c(G),{key:0,type:"success",bordered:!1},{default:u(()=>[...a[106]||(a[106]=[y(" 已启用 ",-1)])]),_:1})):(n(),g(c(G),{key:1,type:"warning",bordered:!1},{default:u(()=>[...a[107]||(a[107]=[y(" 未启用 ",-1)])]),_:1}))])]),r(c(me)),s("div",Ou,[s("div",Au,[r(c(V),{strong:""},{default:u(()=>[y(v(le.value.hasPassword?"修改密码":"设置密码"),1)]),_:1}),r(c(V),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[108]||(a[108]=[y(" 密码至少 4 位,建议包含数字与字母 ",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px","margin-top":"4px"}},{default:u(()=>[a[110]||(a[110]=y(" 忘记密码可在终端执行 ",-1)),r(c(V),{code:""},{default:u(()=>[...a[109]||(a[109]=[y("ctx security reset",-1)])]),_:1}),a[111]||(a[111]=y(" 关闭密码 ",-1))]),_:1})]),s("div",Lu,[le.value.hasPassword?(n(),g(c(re),{key:0,value:_e.value.currentPassword,"onUpdate:value":a[16]||(a[16]=e=>_e.value.currentPassword=e),type:"password",placeholder:"当前密码","show-password-on":"click"},null,8,["value"])):o("",!0),r(c(re),{value:_e.value.newPassword,"onUpdate:value":a[17]||(a[17]=e=>_e.value.newPassword=e),type:"password",placeholder:"新密码","show-password-on":"click"},null,8,["value"]),r(c(re),{value:_e.value.confirmPassword,"onUpdate:value":a[18]||(a[18]=e=>_e.value.confirmPassword=e),type:"password",placeholder:"确认新密码","show-password-on":"click"},null,8,["value"]),sa.value?(n(),g(c(V),{key:1,depth:"3",class:"security-error"},{default:u(()=>[y(v(sa.value),1)]),_:1})):o("",!0)])])]))]),s("div",Eu,[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{size:"large",onClick:a[19]||(a[19]=e=>I.value=!1)},{default:u(()=>[...a[112]||(a[112]=[y(" 取消 ",-1)])]),_:1}),na.value?o("",!0):(n(),g(c(K),{key:0,type:"primary",size:"large",loading:xe.value,disabled:!oa.value,onClick:$a},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(za))]),_:1})]),default:u(()=>[a[113]||(a[113]=y(" 保存密码 ",-1))]),_:1},8,["loading","disabled"]))]),_:1})])],512),[[h,"security"===T.value]]),i(s("div",Du,[s("div",Nu,[s("div",Fu,[r(c(q),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[r(c(ca))]),_:1}),s("div",null,[a[115]||(a[115]=s("h3",{class:"panel-title"},"模型设置",-1)),r(c(V),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[114]||(a[114]=[y("管理默认测速模型、模型上下文窗口和定价信息",-1)])]),_:1})])])]),s("div",Ru,[r(c(Q),{show:Ue.value},{default:u(()=>[s("div",Bu,[s("div",Hu,[r(c(V),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[116]||(a[116]=[y("默认测速模型",-1)])]),_:1}),s("div",qu,[(n(),t(m,null,f(Ee,e=>s("div",{key:e.key,class:"speed-test-default-row"},[s("div",Ku,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[y(v(e.label),1)]),_:2},1024)]),r(c(te),{value:Ae.value[e.key],"onUpdate:value":a=>Ae.value[e.key]=a,options:Ye.value[e.key],placeholder:`选择${e.label}默认测速模型`,disabled:0===(Ye.value[e.key]||[]).length,size:"small",filterable:""},null,8,["value","onUpdate:value","options","placeholder","disabled"])])),64))])])]),s("div",Gu,[r(c(re),{value:Pe.value,"onUpdate:value":a[20]||(a[20]=e=>Pe.value=e),placeholder:"搜索模型 ID...",clearable:"",size:"small",style:{flex:"1","min-width":"0"}},null,8,["value"]),r(c(K),{size:"small",type:"primary",onClick:Be},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[a[117]||(a[117]=y(" 新增 ",-1))]),_:1})]),s("div",Wu,[r(c(ne),{value:Me.value,"onUpdate:value":a[21]||(a[21]=e=>Me.value=e),size:"small"},{default:u(()=>[r(c(oe),{value:"all"},{default:u(()=>[...a[118]||(a[118]=[y("全部",-1)])]),_:1}),r(c(oe),{value:"claude"},{default:u(()=>[...a[119]||(a[119]=[y("Claude",-1)])]),_:1}),r(c(oe),{value:"openai"},{default:u(()=>[...a[120]||(a[120]=[y("OpenAI",-1)])]),_:1}),r(c(oe),{value:"gemini"},{default:u(()=>[...a[121]||(a[121]=[y("Gemini",-1)])]),_:1}),r(c(oe),{value:"overrides"},{default:u(()=>[...a[122]||(a[122]=[y("自定义",-1)])]),_:1})]),_:1},8,["value"])]),0===Je.value.length?(n(),t("div",Vu,[r(c(ee),{description:"没有匹配的模型"})])):(n(),t("div",Ju,[(n(!0),t(m,null,f(Je.value,e=>(n(),t("div",{key:e,class:d(["model-card",{expanded:De.value.has(e)}])},[s("div",{class:"model-card-header",onClick:a=>(e=>{De.value.has(e)?De.value.delete(e):De.value.add(e),De.value=new Set(De.value)})(e)},[r(c(q),{size:"14",class:"expand-icon"},{default:u(()=>[r(c(Ta))]),_:1}),s("span",Yu,v(e),1),Ie.value[e]?(n(),g(c(G),{key:0,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[...a[123]||(a[123]=[y("自定义",-1)])]),_:1})):o("",!0),s("div",{class:"model-card-actions",onClick:a[22]||(a[22]=p(()=>{},["stop"]))},[Ie.value[e]&&Ge(e)?(n(),g(c(K),{key:0,size:"tiny",quaternary:"",type:"warning",onClick:a=>async function(e){try{await C(e),delete Ie.value[e],delete Te.value[e],await ea(),Un.success(`${e} 已重置为内置默认值`)}catch(a){Un.error("重置失败:"+a.message)}}(e)},{default:u(()=>[...a[124]||(a[124]=[y(" 重置 ",-1)])]),_:1},8,["onClick"])):o("",!0),We(e)?(n(),g(c(K),{key:1,size:"tiny",quaternary:"",type:"error",onClick:a=>async function(e){try{const a=!!Ie.value[e];a&&(await C(e),delete Ie.value[e]),delete Te.value[e],We(e)?delete ze.value[e]:a&&await ea(),Un.success(`已删除模型:${e}`)}catch(a){Un.error("删除失败:"+a.message)}}(e)},{default:u(()=>[...a[125]||(a[125]=[y(" 删除 ",-1)])]),_:1},8,["onClick"])):o("",!0)])],8,Zu),De.value.has(e)?(n(),t("div",Xu,[s("div",Qu,[s("div",ec,[r(c(V),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[126]||(a[126]=[y("上下文限制",-1)])]),_:1}),s("div",ac,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[127]||(a[127]=[y("Context 窗口 (tokens)",-1)])]),_:1}),r(c(ue),{value:Xe(e,"limit","context"),"onUpdate:value":a=>Qe(e,"limit","context",a),min:1e3,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[128]||(a[128]=[y("Max Output (tokens)",-1)])]),_:1}),r(c(ue),{value:Xe(e,"limit","output"),"onUpdate:value":a=>Qe(e,"limit","output",a),min:100,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])]),s("div",lc,[r(c(V),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[129]||(a[129]=[y("定价(USD / 百万 tokens)",-1)])]),_:1}),s("div",tc,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[130]||(a[130]=[y("输入价格",-1)])]),_:1}),r(c(ue),{value:Xe(e,"pricing","input"),"onUpdate:value":a=>Qe(e,"pricing","input",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[131]||(a[131]=[y("输出价格",-1)])]),_:1}),r(c(ue),{value:Xe(e,"pricing","output"),"onUpdate:value":a=>Qe(e,"pricing","output",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[132]||(a[132]=[y("缓存写入价格",-1)])]),_:1}),r(c(ue),{value:Xe(e,"pricing","cacheCreation"),"onUpdate:value":a=>Qe(e,"pricing","cacheCreation",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[133]||(a[133]=[y("缓存读取价格",-1)])]),_:1}),r(c(ue),{value:Xe(e,"pricing","cacheRead"),"onUpdate:value":a=>Qe(e,"pricing","cacheRead",a),min:0,step:.01,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])])])])):o("",!0)],2))),128))]))]),_:1},8,["show"])]),s("div",nc,[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{size:"large",onClick:la,disabled:0===Object.keys(Ie.value).length},{default:u(()=>[...a[134]||(a[134]=[y(" 重置全部 ",-1)])]),_:1},8,["disabled"]),r(c(K),{type:"primary",size:"large",loading:Se.value,disabled:!Fe.value,onClick:aa},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(za))]),_:1})]),default:u(()=>[a[135]||(a[135]=y(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[h,"model-settings"===T.value]])])]),r(c(ie),{show:he.value,"onUpdate:show":a[24]||(a[24]=e=>he.value=e),preset:"card",title:"验证访问密码","mask-closable":!1},{default:u(()=>[s("div",sc,[r(c(V),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[136]||(a[136]=[y("请输入访问密码",-1)])]),_:1}),r(c(re),{value:be.value,"onUpdate:value":a[23]||(a[23]=e=>be.value=e),type:"password",placeholder:"访问密码","show-password-on":"click",onKeydown:O(Pa,["enter"])},null,8,["value"]),we.value?(n(),g(c(V),{key:0,depth:"3",class:"security-error"},{default:u(()=>[y(v(we.value),1)]),_:1})):o("",!0),r(c(se),{justify:"end",style:{"margin-top":"16px"}},{default:u(()=>[r(c(K),{onClick:ba},{default:u(()=>[...a[137]||(a[137]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:ke.value,onClick:Pa},{default:u(()=>[...a[138]||(a[138]=[y(" 验证 ",-1)])]),_:1},8,["loading"])]),_:1})])]),_:1},8,["show"]),r(c(ie),{show:$e.value,"onUpdate:show":a[32]||(a[32]=e=>$e.value=e),preset:"card",title:"新增模型设置",style:{width:"560px"},"mask-closable":!1},{default:u(()=>[r(c(se),{vertical:"",size:12},{default:u(()=>[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[139]||(a[139]=[y("模型 ID",-1)])]),_:1}),r(c(re),{value:je.value.modelId,"onUpdate:value":a[25]||(a[25]=e=>je.value.modelId=e),placeholder:"例如:gpt-4.1-mini",clearable:""},null,8,["value"])]),s("div",oc,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[140]||(a[140]=[y("Context 窗口",-1)])]),_:1}),r(c(ue),{value:je.value.context,"onUpdate:value":a[26]||(a[26]=e=>je.value.context=e),min:1e3,step:1e3,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[141]||(a[141]=[y("Max Output",-1)])]),_:1}),r(c(ue),{value:je.value.output,"onUpdate:value":a[27]||(a[27]=e=>je.value.output=e),min:100,step:100,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),s("div",ic,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[142]||(a[142]=[y("输入价格",-1)])]),_:1}),r(c(ue),{value:je.value.inputPrice,"onUpdate:value":a[28]||(a[28]=e=>je.value.inputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[143]||(a[143]=[y("输出价格",-1)])]),_:1}),r(c(ue),{value:je.value.outputPrice,"onUpdate:value":a[29]||(a[29]=e=>je.value.outputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),s("div",rc,[s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[144]||(a[144]=[y("缓存写入价格",-1)])]),_:1}),r(c(ue),{value:je.value.cacheCreationPrice,"onUpdate:value":a[30]||(a[30]=e=>je.value.cacheCreationPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),s("div",null,[r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[145]||(a[145]=[y("缓存读取价格",-1)])]),_:1}),r(c(ue),{value:je.value.cacheReadPrice,"onUpdate:value":a[31]||(a[31]=e=>je.value.cacheReadPrice=e),min:0,step:.01,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),Re.value?(n(),g(c(V),{key:0,depth:"3",class:"security-error"},{default:u(()=>[y(v(Re.value),1)]),_:1})):o("",!0),r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:qe},{default:u(()=>[...a[146]||(a[146]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",disabled:!!Re.value,onClick:Ke},{default:u(()=>[...a[147]||(a[147]=[y(" 新增 ",-1)])]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-79bf7da8"]]);async function cc(){return(await dt.get("/mcp/servers")).data}async function dc(e){return(await dt.post("/mcp/servers",e)).data}async function pc(e,a,l){return(await dt.post(`/mcp/servers/${e}/toggle`,{app:a,enabled:l})).data}const vc={class:"drawer-header"},mc={class:"header-title"},fc={class:"drawer-footer"},gc={class:"form-content"},yc={key:0,class:"form-group"},hc={class:"group-title"},bc={class:"preset-grid"},wc=["onClick"],kc={class:"form-group"},_c={class:"group-title"},xc={class:"field"},Cc={key:0,class:"field-error"},Uc={class:"field"},Sc={class:"form-group"},zc={class:"group-title"},Ic={class:"platform-toggles"},Tc={class:"platform-item"},Pc={class:"platform-item"},Mc={class:"platform-item"},$c={class:"platform-item"},jc={class:"form-group"},Oc={class:"group-title"},Ac={class:"field"},Lc={class:"field"},Ec={class:"field"},Dc={class:"field"},Nc={class:"kv-row"},Fc={class:"field"},Rc={class:"field"},Bc={class:"kv-row"},Hc={class:"collapse-header"},qc={class:"collapse-content"},Kc={class:"field"},Gc={class:"field"},Wc={class:"field-row"},Vc={class:"field"},Jc={class:"field"},Zc=Pl({__name:"McpFormDrawer",props:{visible:{type:Boolean,default:!1},editingServer:{type:Object,default:null},existingIds:{type:Array,default:()=>[]}},emits:["update:visible","saved"],setup(e,{emit:a}){const{drawerWidth:i}=ko(520),p=e,h=a,b=w({get:()=>p.visible,set:e=>h("update:visible",e)}),k=w(()=>!!p.editingServer),C=l([]),U=l(!1),S=l(-1),z=l(!1),I=_({id:"",name:"",description:"",homepage:"",docs:"",apps:{claude:!0,codex:!1,gemini:!1,opencode:!1},server:{type:"stdio",command:"",args:[],env:{},url:"",headers:{}}}),T=l("stdio"),P=l([]),M=l([]),$=l(""),j=w(()=>I.id.trim()&&!k.value&&p.existingIds.includes(I.id.trim())?"该 ID 已存在":"");function O(e){return p.existingIds.includes(e)}async function A(){U.value=!0;try{const e=await async function(){return(await dt.get("/mcp/presets")).data}();e.success&&(C.value=e.presets)}catch(e){}finally{U.value=!1}}function L(){S.value=-1,E()}function E(){I.id="",I.name="",I.description="",I.homepage="",I.docs="",I.apps={claude:!0,codex:!1,gemini:!1,opencode:!1},I.server={type:"stdio",command:"",args:[],env:{},url:"",headers:{}},T.value="stdio",P.value=[],M.value=[],$.value=""}async function D(){var e,a,l,t,n;if(!I.id.trim())return void Un.error("请输入服务器 ID");if(j.value)return void Un.error(j.value);if("stdio"===T.value&&!(null==(e=I.server.command)?void 0:e.trim()))return void Un.error("请输入命令");if(("http"===T.value||"sse"===T.value)&&!(null==(a=I.server.url)?void 0:a.trim()))return void Un.error("请输入 URL");const s={type:T.value};if("stdio"===T.value){s.command=I.server.command,(null==(l=I.server.args)?void 0:l.length)&&(s.args=I.server.args.filter(e=>e.trim()));const e={};P.value.forEach(a=>{a.key.trim()&&(e[a.key.trim()]=a.value)}),Object.keys(e).length>0&&(s.env=e)}else{s.url=I.server.url;const e={};M.value.forEach(a=>{a.key.trim()&&(e[a.key.trim()]=a.value)}),Object.keys(e).length>0&&(s.headers=e)}const o={id:I.id.trim(),name:I.name.trim()||I.id.trim(),server:s,apps:I.apps};I.description.trim()&&(o.description=I.description.trim()),I.homepage.trim()&&(o.homepage=I.homepage.trim()),I.docs.trim()&&(o.docs=I.docs.trim()),$.value.trim()&&(o.tags=$.value.split(",").map(e=>e.trim()).filter(e=>e)),z.value=!0;try{(await dc(o)).success&&(Un.success(k.value?"保存成功":"添加成功"),h("saved"),b.value=!1)}catch(i){Un.error((null==(n=null==(t=i.response)?void 0:t.data)?void 0:n.error)||"保存失败")}finally{z.value=!1}}return x(()=>p.visible,e=>{e&&(A(),p.editingServer?function(){const e=p.editingServer;e&&(I.id=e.id,I.name=e.name||"",I.description=e.description||"",I.homepage=e.homepage||"",I.docs=e.docs||"",I.apps={claude:!0,codex:!1,gemini:!1,opencode:!1,...e.apps},$.value=(e.tags||[]).join(", "),e.server&&(T.value=e.server.type||"stdio",I.server={...e.server},e.server.env?P.value=Object.entries(e.server.env).map(([e,a])=>({key:e,value:a})):P.value=[],e.server.headers?M.value=Object.entries(e.server.headers).map(([e,a])=>({key:e,value:a})):M.value=[]))}():(E(),S.value=-1))}),x(T,e=>{I.server.type=e}),(e,a)=>(n(),g(c(pe),{show:b.value,"onUpdate:show":a[18]||(a[18]=e=>b.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",vc,[r(c(K),{quaternary:"",size:"small",onClick:a[0]||(a[0]=e=>b.value=!1)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1}),s("span",mc,v(k.value?"编辑 MCP 服务器":"添加 MCP 服务器"),1)])]),footer:u(()=>[s("div",fc,[r(c(K),{onClick:a[1]||(a[1]=e=>b.value=!1)},{default:u(()=>[...a[19]||(a[19]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:z.value,onClick:D},{default:u(()=>[y(v(k.value?"保存":"添加"),1)]),_:1},8,["loading"])])]),default:u(()=>[r(c(Q),{show:U.value},{default:u(()=>[s("div",gc,[k.value?o("",!0):(n(),t("div",yc,[s("div",hc,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c(Pa))]),_:1}),a[20]||(a[20]=s("span",null,"快速选择",-1))]),s("div",bc,[s("div",{class:d(["preset-chip",{active:-1===S.value}]),onClick:L},[r(c(q),{size:14},{default:u(()=>[r(c(Ve))]),_:1}),a[21]||(a[21]=s("span",null,"自定义",-1))],2),(n(!0),t(m,null,f(C.value,(e,l)=>(n(),g(c(ce),{key:e.id,disabled:!O(e.id)},{trigger:u(()=>[s("div",{class:d(["preset-chip",{active:S.value===l,disabled:O(e.id)}]),onClick:a=>!O(e.id)&&function(e){S.value=e;const a=C.value[e];if(!a)return;let l=a.id,t=1;for(;p.existingIds.includes(l);)l=`${a.id}-${t}`,t++;I.id=l,I.name=a.name||a.id,I.description=a.description||"",I.homepage=a.homepage||"",I.docs=a.docs||"",$.value=(a.tags||[]).join(", "),a.server&&(T.value=a.server.type||"stdio",I.server={...a.server},a.server.env?P.value=Object.entries(a.server.env).map(([e,a])=>({key:e,value:a})):P.value=[],a.server.headers?M.value=Object.entries(a.server.headers).map(([e,a])=>({key:e,value:a})):M.value=[])}(l)},[y(v(e.id)+" ",1),O(e.id)?(n(),g(c(q),{key:0,size:12,class:"installed-icon"},{default:u(()=>[r(c(He))]),_:1})):o("",!0)],10,wc)]),default:u(()=>[a[22]||(a[22]=y(" 已安装 ",-1))]),_:2},1032,["disabled"]))),128))])])),s("div",kc,[s("div",_c,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c(Ma))]),_:1}),a[23]||(a[23]=s("span",null,"基本信息",-1))]),s("div",xc,[a[24]||(a[24]=s("label",{class:"field-label"},[y(" ID "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:I.id,"onUpdate:value":a[2]||(a[2]=e=>I.id=e),placeholder:"服务器唯一标识,如 fetch、memory",disabled:k.value,status:j.value?"error":void 0},null,8,["value","disabled","status"]),j.value?(n(),t("span",Cc,v(j.value),1)):o("",!0)]),s("div",Uc,[a[25]||(a[25]=s("label",{class:"field-label"},"显示名称",-1)),r(c(re),{value:I.name,"onUpdate:value":a[3]||(a[3]=e=>I.name=e),placeholder:"可选,用于展示的名称"},null,8,["value"])])]),s("div",Sc,[s("div",zc,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c($a))]),_:1}),a[26]||(a[26]=s("span",null,"启用平台",-1))]),s("div",Ic,[s("label",Tc,[r(c(W),{size:"small",value:I.apps.claude,"onUpdate:value":a[4]||(a[4]=e=>I.apps.claude=e)},null,8,["value"]),a[27]||(a[27]=s("span",{class:"platform-name"},"Claude",-1))]),s("label",Pc,[r(c(W),{size:"small",value:I.apps.codex,"onUpdate:value":a[5]||(a[5]=e=>I.apps.codex=e)},null,8,["value"]),a[28]||(a[28]=s("span",{class:"platform-name"},"Codex",-1))]),s("label",Mc,[r(c(W),{size:"small",value:I.apps.gemini,"onUpdate:value":a[6]||(a[6]=e=>I.apps.gemini=e)},null,8,["value"]),a[29]||(a[29]=s("span",{class:"platform-name"},"Gemini",-1))]),s("label",$c,[r(c(W),{size:"small",value:I.apps.opencode,"onUpdate:value":a[7]||(a[7]=e=>I.apps.opencode=e)},null,8,["value"]),a[30]||(a[30]=s("span",{class:"platform-name"},"OpenCode",-1))])])]),s("div",jc,[s("div",Oc,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c(ja))]),_:1}),a[31]||(a[31]=s("span",null,"服务器配置",-1))]),s("div",Ac,[a[35]||(a[35]=s("label",{class:"field-label"},"类型",-1)),r(c(ne),{value:T.value,"onUpdate:value":a[8]||(a[8]=e=>T.value=e),class:"type-radios"},{default:u(()=>[r(c(oe),{value:"stdio"},{default:u(()=>[...a[32]||(a[32]=[s("span",{class:"radio-label"},"stdio",-1),s("span",{class:"radio-desc"},"本地命令",-1)])]),_:1}),r(c(oe),{value:"http"},{default:u(()=>[...a[33]||(a[33]=[s("span",{class:"radio-label"},"http",-1)])]),_:1}),r(c(oe),{value:"sse"},{default:u(()=>[...a[34]||(a[34]=[s("span",{class:"radio-label"},"sse",-1)])]),_:1})]),_:1},8,["value"])]),"stdio"===T.value?(n(),t(m,{key:0},[s("div",Lc,[a[36]||(a[36]=s("label",{class:"field-label"},[y(" 命令 "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:I.server.command,"onUpdate:value":a[9]||(a[9]=e=>I.server.command=e),placeholder:"如 npx、uvx、node"},null,8,["value"])]),s("div",Ec,[a[37]||(a[37]=s("label",{class:"field-label"},"参数",-1)),r(c(ge),{value:I.server.args,"onUpdate:value":a[10]||(a[10]=e=>I.server.args=e),placeholder:"点击添加参数",min:0},null,8,["value"])]),s("div",Dc,[a[39]||(a[39]=s("label",{class:"field-label"},"环境变量",-1)),r(c(ge),{value:P.value,"onUpdate:value":a[11]||(a[11]=e=>P.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:u(({value:e})=>[s("div",Nc,[r(c(re),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"变量名",class:"kv-key"},null,8,["value","onUpdate:value"]),a[38]||(a[38]=s("span",{class:"kv-sep"},"=",-1)),r(c(re),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64)):(n(),t(m,{key:1},[s("div",Fc,[a[40]||(a[40]=s("label",{class:"field-label"},[y(" URL "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:I.server.url,"onUpdate:value":a[12]||(a[12]=e=>I.server.url=e),placeholder:"http://localhost:3000/mcp"},null,8,["value"])]),s("div",Rc,[a[42]||(a[42]=s("label",{class:"field-label"},"请求头",-1)),r(c(ge),{value:M.value,"onUpdate:value":a[13]||(a[13]=e=>M.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:u(({value:e})=>[s("div",Bc,[r(c(re),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"Header 名",class:"kv-key"},null,8,["value","onUpdate:value"]),a[41]||(a[41]=s("span",{class:"kv-sep"},":",-1)),r(c(re),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64))]),r(c(ye),{class:"extra-collapse"},{default:u(()=>[r(c(he),{name:"extra"},{header:u(()=>[s("div",Hc,[r(c(q),{size:16,class:"group-icon"},{default:u(()=>[r(c(Oa))]),_:1}),a[43]||(a[43]=s("span",null,"附加信息",-1)),a[44]||(a[44]=s("span",{class:"collapse-hint"},"(可选)",-1))])]),default:u(()=>[s("div",qc,[s("div",Kc,[a[45]||(a[45]=s("label",{class:"field-label"},"描述",-1)),r(c(re),{value:I.description,"onUpdate:value":a[14]||(a[14]=e=>I.description=e),type:"textarea",placeholder:"服务器功能描述",rows:2},null,8,["value"])]),s("div",Gc,[a[46]||(a[46]=s("label",{class:"field-label"},"标签",-1)),r(c(re),{value:$.value,"onUpdate:value":a[15]||(a[15]=e=>$.value=e),placeholder:"用逗号分隔,如 http, web, fetch"},null,8,["value"])]),s("div",Wc,[s("div",Vc,[a[47]||(a[47]=s("label",{class:"field-label"},"主页",-1)),r(c(re),{value:I.homepage,"onUpdate:value":a[16]||(a[16]=e=>I.homepage=e),placeholder:"https://github.com/..."},null,8,["value"])]),s("div",Jc,[a[48]||(a[48]=s("label",{class:"field-label"},"文档",-1)),r(c(re),{value:I.docs,"onUpdate:value":a[17]||(a[17]=e=>I.docs=e),placeholder:"https://..."},null,8,["value"])])])])]),_:1})]),_:1})])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b964e886"]]),Yc={class:"tool-card"},Xc={class:"tool-header"},Qc={class:"tool-name"},ed={key:0,class:"tool-description"},ad={key:1,class:"tool-parameters"},ld={class:"params-header"},td={class:"params-list"},nd={class:"param-info"},sd={class:"param-name"},od={key:0,class:"param-description"},id={key:2,class:"no-parameters"},rd=Pl({__name:"McpToolCard",props:{tool:{type:Object,required:!0}},emits:["test"],setup(e){const a=e,l=w(()=>{var e;return(null==(e=a.tool.inputSchema)?void 0:e.properties)||{}}),i=w(()=>{var e;return(null==(e=a.tool.inputSchema)?void 0:e.required)||[]}),d=w(()=>Object.keys(l.value).length>0);function p(e){return i.value.includes(e)}return(a,i)=>(n(),t("div",Yc,[s("div",Xc,[s("h3",Qc,v(e.tool.name),1),r(c(K),{size:"small",type:"primary",quaternary:"",onClick:i[0]||(i[0]=e=>a.$emit("test"))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(La))]),_:1})]),default:u(()=>[i[1]||(i[1]=y(" 测试工具 ",-1))]),_:1})]),e.tool.description?(n(),t("p",ed,v(e.tool.description),1)):o("",!0),d.value?(n(),t("div",ad,[s("div",ld,[r(c(q),{size:14,class:"params-icon"},{default:u(()=>[r(c(Ca))]),_:1}),i[2]||(i[2]=s("span",{class:"params-label"},"参数列表",-1))]),s("div",td,[(n(!0),t(m,null,f(l.value,(e,a)=>(n(),t("div",{key:a,class:"param-item"},[s("div",nd,[s("span",sd,v(a),1),r(c(G),{type:p(a)?"error":"default",size:"tiny",bordered:!1},{default:u(()=>[y(v(p(a)?"必填":"可选"),1)]),_:2},1032,["type"]),e.type?(n(),g(c(G),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>{return[y(v((a=e.type,Array.isArray(a)?a.filter(e=>"null"!==e).join(" | "):a)),1)];var a}),_:2},1024)):o("",!0)]),e.description?(n(),t("p",od,v(e.description),1)):o("",!0)]))),128))])])):(n(),t("div",id,[r(c(V),{depth:"3"},{default:u(()=>[...i[3]||(i[3]=[y("无需参数",-1)])]),_:1})]))]))}},[["__scopeId","data-v-1fcd002c"]]),ud={class:"field-label"},cd={key:0,class:"required"},dd={key:0,class:"empty-schema"},pd=Pl({__name:"McpDynamicForm",props:{schema:{type:Object,default:()=>({})},modelValue:{type:Object,default:()=>({})},depth:{type:Number,default:0},maxDepth:{type:Number,default:3}},emits:["update:modelValue"],setup(e,{emit:a}){const l=e,i=a,p=w(()=>{var e;return(null==(e=l.schema)?void 0:e.properties)||{}}),h=w(()=>{var e;return(null==(e=l.schema)?void 0:e.required)||[]}),b=w(()=>Object.keys(p.value));function k(e){const a=p.value[e];if(!a)return"string";const l=a.type;if(!l)return a.enum?"string":a.properties?"object":"string";if(Array.isArray(l)){const e=l.filter(e=>"null"!==e);return e.length>0?e[0]:"string"}return l}function _(e){return h.value.includes(e)}function C(e){var a;return(null==(a=p.value[e])?void 0:a.description)||""}function U(e){const a=p.value[e];return Array.isArray(null==a?void 0:a.enum)&&a.enum.length>0}function S(e){const a=p.value[e];return Array.isArray(null==a?void 0:a.enum)?a.enum.map(e=>({label:String(e),value:e})):[]}function z(e){const a=p.value[e];return(null==a?void 0:a.description)?a.description:null!=(null==a?void 0:a.default)?`默认: ${a.default}`:`请输入 ${e}`}function I(e){const a=p.value[e];return a&&(a.properties||a.additionalProperties)?a:null}function T(e,a){i("update:modelValue",{...l.modelValue,[e]:a})}return x(()=>[l.schema,b.value],()=>{!function(){const e={};let a=!1;for(const t of b.value){const n=p.value[t];null!=(null==n?void 0:n.default)&&void 0===l.modelValue[t]&&(e[t]=n.default,a=!0)}a&&i("update:modelValue",{...l.modelValue,...e})}()},{immediate:!0,deep:!0}),(a,l)=>{const i=E("McpDynamicForm",!0);return n(),t("div",{class:d(["dynamic-form",{"nested-form":e.depth>0}])},[e.depth>=e.maxDepth?(n(),g(c(fe),{key:0,type:"warning",bordered:!1,class:"depth-warning"},{default:u(()=>[y(" 嵌套层级已达上限("+v(e.maxDepth)+" 层),无法继续展开 ",1)]),_:1})):(n(),t(m,{key:1},[(n(!0),t(m,null,f(b.value,a=>(n(),t("div",{key:a,class:"field"},[s("label",ud,[y(v(a)+" ",1),_(a)?(n(),t("span",cd,"*")):o("",!0),C(a)?(n(),g(c(ce),{key:1,trigger:"hover"},{trigger:u(()=>[r(c(q),{size:14,class:"field-tip-icon"},{default:u(()=>[r(c(Ma))]),_:1})]),default:u(()=>[y(" "+v(C(a)),1)]),_:2},1024)):o("",!0)]),"string"===k(a)&&U(a)?(n(),g(c(te),{key:0,value:e.modelValue[a],options:S(a),placeholder:z(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","options","placeholder","onUpdate:value"])):"string"===k(a)?(n(),g(c(re),{key:1,value:e.modelValue[a]??"",placeholder:z(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"])):"number"===k(a)||"integer"===k(a)?(n(),g(c(ue),{key:2,value:e.modelValue[a],placeholder:z(a),precision:"integer"===k(a)?0:void 0,clearable:"",style:{width:"100%"},"onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","precision","onUpdate:value"])):"boolean"===k(a)?(n(),g(c(W),{key:3,value:!!e.modelValue[a],"onUpdate:value":e=>T(a,e)},null,8,["value","onUpdate:value"])):"array"===k(a)?(n(),g(c(ge),{key:4,value:e.modelValue[a]||[],placeholder:z(a),min:0,"onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"])):"object"===k(a)&&I(a)?(n(),g(i,{key:5,schema:I(a),"model-value":e.modelValue[a]||{},depth:e.depth+1,"max-depth":e.maxDepth,"onUpdate:modelValue":e=>T(a,e)},null,8,["schema","model-value","depth","max-depth","onUpdate:modelValue"])):(n(),g(c(re),{key:6,value:null!=e.modelValue[a]?String(e.modelValue[a]):"",placeholder:z(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"]))]))),128)),0===b.value.length?(n(),t("div",dd,[r(c(V),{depth:"3"},{default:u(()=>[...l[0]||(l[0]=[y("无可配置属性",-1)])]),_:1})])):o("",!0)],64))],2)}}},[["__scopeId","data-v-b199234d"]]),vd={class:"modal-content"},md={key:0,class:"tool-info"},fd={key:1,class:"params-section"},gd={class:"section-header"},yd={key:2,class:"no-params"},hd={key:3,class:"result-section"},bd={class:"section-header"},wd={key:0,class:"result-duration"},kd={key:0,class:"result-display"},_d={key:1,class:"result-error"},xd={class:"modal-footer"},Cd=Pl({__name:"McpToolTestModal",props:{visible:{type:Boolean,default:!1},serverId:{type:String,default:""},tool:{type:Object,default:null}},emits:["update:visible"],setup(e,{emit:a}){const i=e,p=a,m=w({get:()=>i.visible,set:e=>p("update:visible",e)}),f=l({}),h=l(!1),b=l(null),k=w(()=>{var e,a;const l=null==(a=null==(e=i.tool)?void 0:e.inputSchema)?void 0:a.properties;return l&&Object.keys(l).length>0}),_=w(()=>null!==b.value);async function C(){var e,a;if(i.serverId&&i.tool){h.value=!0,b.value=null;try{const e=await async function(e,a,l={}){return(await dt.post(`/mcp/servers/${e}/tools/test`,{toolName:a,arguments:l})).data}(i.serverId,i.tool.name,f.value);e.success?(b.value={result:e.result,duration:e.duration,isError:e.isError||!1},e.isError?Un.error("工具执行失败"):Un.success(`工具执行成功 (${e.duration}ms)`)):(b.value={result:e.message||"执行失败",isError:!0},Un.error(e.message||"执行失败"))}catch(l){const t=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message||"执行失败";b.value={result:t,isError:!0},Un.error("执行失败: "+t)}finally{h.value=!1}}else Un.error("缺少必要参数")}function U(e){if(!e)return"null";if("string"==typeof e)return e;try{return JSON.stringify(e,null,2)}catch(a){return String(e)}}return x(()=>[i.visible,i.tool],([e,a])=>{e&&a&&(f.value={},b.value=null)}),(a,l)=>{var i;return n(),g(c(ie),{show:m.value,"onUpdate:show":l[2]||(l[2]=e=>m.value=e),preset:"card",title:(null==(i=e.tool)?void 0:i.name)||"测试工具",style:{width:"700px","max-width":"90vw"},segmented:{content:"soft",footer:"soft"}},{footer:u(()=>[s("div",xd,[r(c(K),{onClick:l[1]||(l[1]=e=>m.value=!1)},{default:u(()=>[...l[7]||(l[7]=[y("关闭",-1)])]),_:1}),r(c(K),{type:"primary",loading:h.value,disabled:!e.serverId||!e.tool,onClick:C},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ea))]),_:1})]),default:u(()=>[y(" "+v(h.value?"执行中...":"执行工具"),1)]),_:1},8,["loading","disabled"])])]),default:u(()=>{var a;return[s("div",vd,[(null==(a=e.tool)?void 0:a.description)?(n(),t("div",md,[r(c(fe),{type:"info",bordered:!1},{default:u(()=>[y(v(e.tool.description),1)]),_:1})])):o("",!0),k.value?(n(),t("div",fd,[s("div",gd,[r(c(q),{size:16,class:"section-icon"},{default:u(()=>[r(c(Ca))]),_:1}),l[3]||(l[3]=s("span",{class:"section-title"},"输入参数",-1))]),r(pd,{modelValue:f.value,"onUpdate:modelValue":l[0]||(l[0]=e=>f.value=e),schema:e.tool.inputSchema},null,8,["modelValue","schema"])])):(n(),t("div",yd,[r(c(V),{depth:"3"},{default:u(()=>[...l[4]||(l[4]=[y("此工具无需参数,可直接执行",-1)])]),_:1})])),_.value?(n(),t("div",hd,[s("div",bd,[r(c(q),{size:16,class:d(["section-icon",{error:b.value.isError}])},{default:u(()=>[b.value.isError?(n(),g(c(qe),{key:1})):(n(),g(c(He),{key:0}))]),_:1},8,["class"]),l[5]||(l[5]=s("span",{class:"section-title"},"执行结果",-1)),null!=b.value.duration?(n(),t("span",wd,v(b.value.duration)+"ms ",1)):o("",!0)]),b.value.isError?(n(),t("div",_d,[r(c(fe),{type:"error",bordered:!1},{header:u(()=>[...l[6]||(l[6]=[y("执行失败",-1)])]),default:u(()=>{var e;return[y(" "+v((null==(e=b.value.result)?void 0:e.message)||b.value.result||"未知错误"),1)]}),_:1})])):(n(),t("div",kd,[r(c(be),{code:U(b.value.result),language:"json","word-wrap":!0},null,8,["code"])]))])):o("",!0)])]}),_:1},8,["show","title"])}}},[["__scopeId","data-v-48377e28"]]),Ud={class:"drawer-header"},Sd={class:"server-info"},zd={class:"server-details"},Id={class:"server-name"},Td={class:"server-meta"},Pd={class:"drawer-body"},Md={key:0,class:"tools-container"},$d={class:"tools-stats"},jd={class:"stats-text"},Od={key:0,class:"stats-duration"},Ad={class:"collapse-header"},Ld={class:"tool-index"},Ed={class:"tool-title"},Dd={key:1,class:"empty-state"},Nd={key:2,class:"error-state"},Fd=Pl({__name:"McpServerDetailDrawer",props:{visible:{type:Boolean,default:!1},server:{type:Object,default:null}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(600),p=e,h=a,b=w({get:()=>p.visible,set:e=>h("update:visible",e)}),k=l(!1),_=l([]),C=l(""),U=l(0),S=l(!1),z=l(null);async function I(){var e,a,l;if(null==(e=p.server)?void 0:e.id){k.value=!0,C.value="",_.value=[],U.value=0;try{const e=await async function(e){return(await dt.get(`/mcp/servers/${e}/tools`)).data}(p.server.id);e.success?(_.value=e.tools||[],U.value=e.duration||0):C.value=e.message||"获取工具列表失败"}catch(t){C.value=(null==(l=null==(a=t.response)?void 0:a.data)?void 0:l.message)||t.message||"连接服务器失败",Un.error("获取工具列表失败: "+C.value)}finally{k.value=!1}}}return x(()=>p.visible,e=>{e&&p.server?I():(_.value=[],C.value="",U.value=0)}),(a,l)=>{var p;return n(),t(m,null,[r(c(pe),{show:b.value,"onUpdate:show":l[0]||(l[0]=e=>b.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>{var a,l,i,p,m;return[s("div",Ud,[s("div",Sd,[r(c(q),{size:20,class:"server-icon"},{default:u(()=>[r(c(Xe))]),_:1}),s("div",zd,[s("span",Id,v((null==(a=e.server)?void 0:a.name)||(null==(l=e.server)?void 0:l.id)),1),s("div",Td,[(null==(p=null==(i=e.server)?void 0:i.server)?void 0:p.type)?(n(),g(c(G),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(v(e.server.server.type),1)]),_:1})):o("",!0),(null==(m=e.server)?void 0:m.status)?(n(),t("span",{key:1,class:d(["status-dot",{online:"online"===e.server.status,error:"error"===e.server.status}])},null,2)):o("",!0)])])])])]}),default:u(()=>[s("div",Pd,[r(c(we),{type:"line",animated:""},{default:u(()=>[r(c(ke),{name:"tools",tab:"工具列表"},{default:u(()=>[r(c(Q),{show:k.value},{default:u(()=>[!k.value&&_.value.length>0?(n(),t("div",Md,[s("div",$d,[s("span",jd,"共 "+v(_.value.length)+" 个工具",1),U.value?(n(),t("span",Od," 耗时 "+v(U.value)+"ms ",1)):o("",!0)]),r(c(ye),{"arrow-placement":"right","default-expanded-names":[]},{default:u(()=>[(n(!0),t(m,null,f(_.value,(e,a)=>(n(),g(c(he),{key:e.name,name:a},{header:u(()=>[s("div",Ad,[s("span",Ld,v(a+1),1),s("span",Ed,v(e.name),1)])]),default:u(()=>[r(rd,{tool:e,onTest:a=>function(e){z.value=e,S.value=!0}(e)},null,8,["tool","onTest"])]),_:2},1032,["name"]))),128))]),_:1})])):k.value||0!==_.value.length?o("",!0):(n(),t("div",Dd,[r(c(q),{size:48,class:"empty-icon"},{default:u(()=>[r(c(Da))]),_:1}),l[2]||(l[2]=s("p",{class:"empty-title"},"该服务器未提供工具",-1)),l[3]||(l[3]=s("p",{class:"empty-desc"},"此 MCP 服务器没有注册任何可用工具",-1))])),C.value?(n(),t("div",Nd,[r(c(fe),{type:"error",bordered:!1},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Na))]),_:1})]),default:u(()=>[y(" "+v(C.value),1)]),_:1})])):o("",!0)]),_:1},8,["show"])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]),r(Cd,{visible:S.value,"onUpdate:visible":l[1]||(l[1]=e=>S.value=e),"server-id":null==(p=e.server)?void 0:p.id,tool:z.value},null,8,["visible","server-id","tool"])],64)}}},[["__scopeId","data-v-d1eb48b9"]]),Rd={class:"drawer-header"},Bd={class:"header-title"},Hd={class:"header-actions"},qd={class:"mcp-container"},Kd={class:"stats-bar"},Gd={class:"stats-text"},Wd={class:"server-list"},Vd={key:0,class:"empty-state"},Jd=["onClick","onDragstart","onDragover","onDrop"],Zd={class:"card-header"},Yd={class:"card-title"},Xd={class:"server-name"},Qd={class:"card-actions"},ep={key:0,class:"card-desc"},ap={key:1,class:"card-tags"},lp={class:"card-apps"},tp={class:"paste-modal-content"},np={key:0,class:"parse-error"},sp={class:"paste-modal-footer"},op={class:"batch-modal-content"},ip={class:"batch-actions"},rp={class:"batch-selected"},up={class:"batch-list"},cp={class:"batch-item-info"},dp={class:"batch-item-header"},pp={class:"batch-item-name"},vp={class:"batch-item-detail"},mp={key:0},fp={key:1,class:"batch-args"},gp={class:"batch-modal-footer"},yp={class:"export-modal-content"},hp={class:"export-info"},bp={class:"export-modal-footer"},wp=Pl({__name:"McpDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(560),h=e,b=a,k=w({get:()=>h.visible,set:e=>b("update:visible",e)}),C=l(!1),U=l({}),S=l(!1),z=l(null),I=_({}),T=l(null),P=l(null),M=l(!1),$=l(""),j=l(""),O=l(!1),A=l(!1),L=l([]),E=l([]),D=l(!1),N=l(!1),F=l({format:"",content:"",filename:""}),R=l(!1),B=l(null),H=w(()=>Object.values(U.value).sort((e,a)=>void 0!==e.order&&void 0!==a.order?e.order-a.order:void 0!==e.order?-1:void 0!==a.order?1:(a.updatedAt||0)-(e.updatedAt||0))),V=w(()=>H.value.length),J=w(()=>Object.keys(U.value)),Z=w(()=>{const e=H.value;return{claude:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.claude}).length,codex:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.codex}).length,gemini:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.gemini}).length,opencode:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.opencode}).length}}),Y=w({get:()=>{const e=L.value.filter(e=>!te(e.id)).map(e=>e.id);return e.length>0&&e.every(e=>E.value.includes(e))},set:()=>{}}),X=[{label:"同步 Claude 已有配置",key:"claude"},{label:"同步 Codex 已有配置",key:"codex"},{label:"同步 Gemini 已有配置",key:"gemini"},{label:"同步 OpenCode 已有配置",key:"opencode"}],ee=[{label:"导出为 JSON (通用)",key:"json"},{label:"导出为 Claude 格式",key:"claude"},{label:"导出为 Codex 格式 (TOML)",key:"codex"},{label:"导出为 OpenCode 格式",key:"opencode"},{label:"导出为 Gemini 格式",key:"gemini"}];function ae(e){return"online"===e.status?`在线 - ${le(e.lastChecked)}`:"error"===e.status?`异常 - ${le(e.lastChecked)}`:"testing"===e.status?"测试中...":"未测试"}function le(e){if(!e)return"";return new Date(e).toLocaleString("zh-CN",{hour:"2-digit",minute:"2-digit"})}function te(e){return J.value.includes(e)}async function ne(){C.value=!0;try{const e=await cc();e.success&&(U.value=e.servers)}catch(e){Un.error("加载 MCP 服务器失败")}finally{C.value=!1}}async function se(e){I[e.id]=!0,U.value[e.id].status="testing";try{const a=await async function(e){return(await dt.post(`/mcp/servers/${e}/test`)).data}(e.id);if(a.success){const l=a.result;U.value[e.id].status=l.success?"online":"error",U.value[e.id].lastChecked=Date.now(),l.success?Un.success(`${e.name||e.id}: ${l.message} (${l.duration}ms)`):Un.error(`${e.name||e.id}: ${l.message}`)}}catch(a){U.value[e.id].status="error",Un.error("测试失败: "+a.message)}finally{I[e.id]=!1}}async function oe(e,a,l){try{const t=await pc(e,a,l);t.success&&(U.value[e]=t.server,Un.success(`已${l?"启用":"禁用"} ${a}`))}catch(t){Un.error("操作失败")}}function ue(e){Sn.warning({title:"删除确认",content:`确定要删除 MCP 服务器 "${e.name||e.id}" 吗?此操作将从所有平台配置中移除该服务器。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await dt.delete(`/mcp/servers/${e}`)).data}(e.id)).success&&(delete U.value[e.id],Un.success("删除成功"))}catch(a){Un.error("删除失败")}}})}async function ve(e){try{const a=await async function(e){return(await dt.post(`/mcp/import/${e}`)).data}(e);a.success&&(Un.success(a.message),await ne())}catch(a){Un.error("同步失败")}}async function me(e){try{const a=await async function(e="json"){return(await dt.get("/mcp/export",{params:{format:e}})).data}(e);a.success&&(F.value={format:a.format,content:a.content,filename:a.filename},N.value=!0)}catch(a){Un.error("导出失败")}}async function fe(){try{const e=await no(F.value.content);if("manual"===(null==e?void 0:e.method))return void Un.warning("自动复制失败,已弹出手动复制框");Un.success("已复制到剪贴板")}catch{Un.error("复制失败")}}function ge(){const e=new Blob([F.value.content],{type:"text/plain"}),a=URL.createObjectURL(e),l=document.createElement("a");l.href=a,l.download=F.value.filename,l.click(),URL.revokeObjectURL(a),Un.success("下载成功")}function ye(){T.value=null}async function he(e,a){e.preventDefault();const l=T.value;if(null===l||l===a)return void(T.value=null);const t=[...H.value],[n]=t.splice(l,1);t.splice(a,0,n);const s=t.map(e=>e.id);try{await async function(e){return(await dt.post("/mcp/servers/order",{serverIds:e})).data}(s),await ne()}catch(o){Un.error("排序保存失败")}T.value=null}function be(){z.value=null,S.value=!0}function we(){ne()}function ke(){j.value="",O.value=!0;try{let l,t=$.value.trim();if(!t)return j.value="请输入配置内容",void(O.value=!1);t.startsWith("{")||t.startsWith("[")||(t=t.replace(/^[\s,]+/,""),t=t.replace(/[\s,]+$/,""),t=`{${t}}`);try{l=JSON.parse(t)}catch(e){let n=t.replace(/\}\s*"/g,'}, "');try{l=JSON.parse(n)}catch(a){return j.value="JSON 格式错误:"+e.message,void(O.value=!1)}}const n=[];let s=null;if(l.mcpServers&&"object"==typeof l.mcpServers)s=l.mcpServers;else if(l.mcp_servers&&"object"==typeof l.mcp_servers)s=l.mcp_servers;else if(l.command||l.url)s={"new-server":l};else{const e=Object.keys(l);if(!e.some(e=>{const a=l[e];return a&&"object"==typeof a&&(a.command||a.url||a.args)}))return j.value="未找到有效的 MCP 服务器配置,请检查 JSON 格式",void(O.value=!1);s=l}for(const[e,a]of Object.entries(s)){if(!a||"object"!=typeof a)continue;if(!a.command&&!a.url&&!a.args)continue;const l={id:e,name:e,apps:{claude:!0,codex:!1,gemini:!1,opencode:!1},server:{type:a.type||"stdio"}};a.command&&(l.server.command=a.command,a.args&&(l.server.args=Array.isArray(a.args)?a.args:[a.args]),a.env&&"object"==typeof a.env&&(l.server.env=a.env)),a.url&&(l.server.type=a.type||"http",l.server.url=a.url,a.headers&&"object"==typeof a.headers&&(l.server.headers=a.headers)),n.push(l)}if(0===n.length)return j.value="未找到有效的 MCP 服务器配置",void(O.value=!1);1!==n.length||te(n[0].id)?(L.value=n,E.value=n.filter(e=>!te(e.id)).map(e=>e.id),A.value=!0,M.value=!1):(z.value=n[0],S.value=!0,M.value=!1,$.value="")}catch(l){j.value="解析失败:"+l.message}finally{O.value=!1}}function Ce(e){E.value=e?L.value.filter(e=>!te(e.id)).map(e=>e.id):[]}async function Ue(){if(0===E.value.length)return;D.value=!0;let e=0,a=0;try{for(const t of E.value){const n=L.value.find(e=>e.id===t);if(n)try{await dc(n),e++}catch(l){a++}}e>0?(Un.success(`成功导入 ${e} 个服务器${a>0?`,${a} 个失败`:""}`),await ne()):Un.error("导入失败"),A.value=!1,$.value="",L.value=[],E.value=[]}catch(l){Un.error("批量导入失败")}finally{D.value=!1}}return x(()=>h.visible,e=>{e&&ne()}),x(M,e=>{e||(j.value="")}),(e,a)=>(n(),t(m,null,[r(c(pe),{show:k.value,"onUpdate:show":a[5]||(a[5]=e=>k.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{title:"MCP 服务器管理",closable:"","native-scrollbar":!1},{header:u(()=>[s("div",Rd,[s("div",Bd,[r(c(q),{size:20,class:"header-icon"},{default:u(()=>[r(c(Xe))]),_:1}),a[16]||(a[16]=s("span",null,"MCP 服务器管理",-1))]),s("div",Hd,[r(c(_e),{trigger:"click",options:ee,onSelect:me},{default:u(()=>[r(c(K),{size:"small",quaternary:""},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ha))]),_:1})]),default:u(()=>[a[17]||(a[17]=y(" 导出 ",-1))]),_:1})]),_:1}),r(c(K),{size:"small",type:"primary",ghost:"",onClick:a[0]||(a[0]=e=>M.value=!0)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(ua))]),_:1})]),default:u(()=>[a[18]||(a[18]=y(" 粘贴解析 ",-1))]),_:1}),r(c(K),{size:"small",type:"primary",onClick:be},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Oa))]),_:1})]),default:u(()=>[a[19]||(a[19]=y(" 添加 ",-1))]),_:1})])])]),default:u(()=>[s("div",qd,[s("div",Kd,[s("span",Gd,[y(" 共 "+v(V.value)+" 个服务器 ",1),V.value>0?(n(),t(m,{key:0},[y(" · Claude: "+v(Z.value.claude)+" · Codex: "+v(Z.value.codex)+" · Gemini: "+v(Z.value.gemini)+" · OpenCode: "+v(Z.value.opencode),1)],64)):o("",!0)]),r(c(_e),{trigger:"click",options:X,onSelect:ve},{default:u(()=>[r(c(K),{size:"tiny",quaternary:""},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Fa))]),_:1})]),default:u(()=>[a[20]||(a[20]=y(" 同步 ",-1))]),_:1})]),_:1})]),s("div",Wd,[r(c(Q),{show:C.value},{default:u(()=>[0!==H.value.length||C.value?(n(),t("div",{key:1,class:"server-cards",ref_key:"serverCardsRef",ref:P},[(n(!0),t(m,null,f(H.value,(e,l)=>{var i,h,b,w,k,_;return n(),t("div",{key:e.id,class:d(["server-card",{dragging:T.value===l}]),draggable:"true",onClick:a=>function(e){B.value=e,R.value=!0}(e),onDragstart:e=>function(e,a){T.value=a,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",a)}(e,l),onDragend:ye,onDragover:e=>{return(a=e).preventDefault(),void(a.dataTransfer.dropEffect="move");var a},onDrop:e=>he(e,l)},[s("div",Zd,[s("div",Yd,[r(c(q),{class:"drag-handle",size:14},{default:u(()=>[r(c(Ra))]),_:1}),s("span",Xd,v(e.name||e.id),1),(null==(i=e.server)?void 0:i.type)?(n(),g(c(G),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(v(e.server.type),1)]),_:2},1024)):o("",!0),e.status?(n(),g(c(ce),{key:1},{trigger:u(()=>[s("span",{class:d(["status-dot",{online:"online"===e.status,error:"error"===e.status,testing:"testing"===e.status}])},null,2)]),default:u(()=>[y(" "+v(ae(e)),1)]),_:2},1024)):o("",!0)]),s("div",Qd,[r(c(ce),null,{trigger:u(()=>[r(c(K),{quaternary:"",size:"tiny",loading:I[e.id],onClick:p(a=>se(e),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ea))]),_:1})]),_:1},8,["loading","onClick"])]),default:u(()=>[a[23]||(a[23]=y(" 测试连接 ",-1))]),_:2},1024),r(c(K),{quaternary:"",size:"tiny",onClick:p(a=>function(e){z.value=e,S.value=!0}(e),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ba))]),_:1})]),_:1},8,["onClick"]),r(c(K),{quaternary:"",size:"tiny",onClick:p(a=>ue(e),["stop"])},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),_:1},8,["onClick"])])]),e.description?(n(),t("p",ep,v(e.description),1)):o("",!0),(null==(h=e.tags)?void 0:h.length)?(n(),t("div",ap,[(n(!0),t(m,null,f(e.tags.slice(0,3),e=>(n(),g(c(G),{key:e,size:"tiny",bordered:!1},{default:u(()=>[y(v(e),1)]),_:2},1024))),128))])):o("",!0),s("div",lp,[s("label",{class:"app-toggle",onClick:a[1]||(a[1]=p(()=>{},["stop"]))},[r(c(W),{size:"small",value:null==(b=e.apps)?void 0:b.claude,"onUpdate:value":a=>oe(e.id,"claude",a)},null,8,["value","onUpdate:value"]),a[24]||(a[24]=s("span",{class:"app-label"},"Claude",-1))]),s("label",{class:"app-toggle",onClick:a[2]||(a[2]=p(()=>{},["stop"]))},[r(c(W),{size:"small",value:null==(w=e.apps)?void 0:w.codex,"onUpdate:value":a=>oe(e.id,"codex",a)},null,8,["value","onUpdate:value"]),a[25]||(a[25]=s("span",{class:"app-label"},"Codex",-1))]),s("label",{class:"app-toggle",onClick:a[3]||(a[3]=p(()=>{},["stop"]))},[r(c(W),{size:"small",value:null==(k=e.apps)?void 0:k.gemini,"onUpdate:value":a=>oe(e.id,"gemini",a)},null,8,["value","onUpdate:value"]),a[26]||(a[26]=s("span",{class:"app-label"},"Gemini",-1))]),s("label",{class:"app-toggle",onClick:a[4]||(a[4]=p(()=>{},["stop"]))},[r(c(W),{size:"small",value:null==(_=e.apps)?void 0:_.opencode,"onUpdate:value":a=>oe(e.id,"opencode",a)},null,8,["value","onUpdate:value"]),a[27]||(a[27]=s("span",{class:"app-label"},"OpenCode",-1))])])],42,Jd)}),128))],512)):(n(),t("div",Vd,[r(c(q),{size:48,class:"empty-icon"},{default:u(()=>[r(c(Xe))]),_:1}),a[21]||(a[21]=s("p",{class:"empty-title"},"暂无 MCP 服务器",-1)),a[22]||(a[22]=s("p",{class:"empty-desc"},'点击上方"添加"按钮添加 MCP 服务器,或"粘贴解析"快速导入',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),r(Zc,{visible:S.value,"onUpdate:visible":a[6]||(a[6]=e=>S.value=e),"editing-server":z.value,"existing-ids":J.value,onSaved:we},null,8,["visible","editing-server","existing-ids"]),r(c(ie),{show:M.value,"onUpdate:show":a[9]||(a[9]=e=>M.value=e),preset:"card",title:"粘贴 MCP 配置",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[s("div",sp,[r(c(K),{onClick:a[8]||(a[8]=e=>M.value=!1)},{default:u(()=>[...a[30]||(a[30]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:ke,loading:O.value},{default:u(()=>[...a[31]||(a[31]=[y(" 解析配置 ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[s("div",tp,[a[28]||(a[28]=s("p",{class:"paste-hint"}," 粘贴 JSON 格式的 MCP 配置,支持单个或批量导入。格式示例: ",-1)),a[29]||(a[29]=s("pre",{class:"paste-example"},'{\n "mcpServers": {\n "服务器名称": {\n "command": "npx",\n "args": ["-y", "package-name"],\n "env": { "API_KEY": "xxx" }\n }\n }\n}',-1)),r(c(re),{value:$.value,"onUpdate:value":a[7]||(a[7]=e=>$.value=e),type:"textarea",placeholder:"在此粘贴 JSON 配置...",rows:8,status:j.value?"error":void 0},null,8,["value","status"]),j.value?(n(),t("p",np,v(j.value),1)):o("",!0)])]),_:1},8,["show"]),r(c(ie),{show:A.value,"onUpdate:show":a[12]||(a[12]=e=>A.value=e),preset:"card",title:"选择要导入的 MCP 服务器",style:{width:"650px","max-width":"90vw"}},{footer:u(()=>[s("div",gp,[r(c(K),{onClick:a[11]||(a[11]=e=>A.value=!1)},{default:u(()=>[...a[33]||(a[33]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",disabled:0===E.value.length,loading:D.value,onClick:Ue},{default:u(()=>[y(" 导入选中 ("+v(E.value.length)+") ",1)]),_:1},8,["disabled","loading"])])]),default:u(()=>[s("div",op,[s("div",ip,[r(c(xe),{checked:Y.value,"onUpdate:checked":[a[10]||(a[10]=e=>Y.value=e),Ce]},{default:u(()=>[y(" 全选 ("+v(L.value.length)+") ",1)]),_:1},8,["checked"]),s("span",rp,"已选择 "+v(E.value.length)+" 个",1)]),s("div",up,[(n(!0),t(m,null,f(L.value,e=>{var l,i,p,m;return n(),t("div",{key:e.id,class:d(["batch-item",{selected:E.value.includes(e.id),exists:te(e.id)}])},[r(c(xe),{checked:E.value.includes(e.id),disabled:te(e.id),"onUpdate:checked":a=>function(e,a){if(a)E.value.includes(e)||E.value.push(e);else{const a=E.value.indexOf(e);a>-1&&E.value.splice(a,1)}}(e.id,a)},null,8,["checked","disabled","onUpdate:checked"]),s("div",cp,[s("div",dp,[s("span",pp,v(e.id),1),te(e.id)?(n(),g(c(G),{key:0,size:"tiny",type:"warning"},{default:u(()=>[...a[32]||(a[32]=[y("已存在",-1)])]),_:1})):o("",!0),(null==(l=e.server)?void 0:l.type)?(n(),g(c(G),{key:1,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(v(e.server.type),1)]),_:2},1024)):o("",!0)]),s("div",vp,[(null==(i=e.server)?void 0:i.command)?(n(),t("span",mp,v(e.server.command),1)):o("",!0),(null==(m=null==(p=e.server)?void 0:p.args)?void 0:m.length)?(n(),t("span",fp,v(e.server.args.slice(0,3).join(" "))+v(e.server.args.length>3?"...":""),1)):o("",!0)])])],2)}),128))])])]),_:1},8,["show"]),r(c(ie),{show:N.value,"onUpdate:show":a[14]||(a[14]=e=>N.value=e),preset:"card",title:"导出 MCP 配置",style:{width:"650px","max-width":"90vw"}},{footer:u(()=>[s("div",bp,[r(c(K),{onClick:a[13]||(a[13]=e=>N.value=!1)},{default:u(()=>[...a[34]||(a[34]=[y("关闭",-1)])]),_:1}),r(c(K),{onClick:fe},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(qa))]),_:1})]),default:u(()=>[a[35]||(a[35]=y(" 复制 ",-1))]),_:1}),r(c(K),{type:"primary",onClick:ge},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ha))]),_:1})]),default:u(()=>[a[36]||(a[36]=y(" 下载 ",-1))]),_:1})])]),default:u(()=>[s("div",yp,[s("div",hp,[s("span",null,"格式: "+v(F.value.format),1),s("span",null,"文件名: "+v(F.value.filename),1)]),r(c(re),{value:F.value.content,type:"textarea",readonly:"",rows:12,class:"export-content"},null,8,["value"])])]),_:1},8,["show"]),r(Fd,{visible:R.value,"onUpdate:visible":a[15]||(a[15]=e=>R.value=e),server:B.value},null,8,["visible","server"])],64))}},[["__scopeId","data-v-2e0639fd"]]);const kp={key:0,class:"editor-container"},_p=["innerHTML"],xp={key:1,class:"placeholder-text"},Cp={class:"preview-hint"},Up=Pl({__name:"MarkdownEditor",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:"输入内容,支持 Markdown 格式..."},rows:{type:Number,default:10},minHeight:{type:Number,default:150},disabled:{type:Boolean,default:!1},defaultEditing:{type:Boolean,default:!1}},emits:["update:modelValue","edit","blur"],setup(e,{expose:a,emit:o}){const i=e,p=o,m=l(i.defaultEditing),f=l(null);function g(e,a){ml.getLanguage(e)||ml.registerLanguage(e,a)}g("javascript",fl),g("typescript",bl),g("json",hl),g("bash",yl),g("shell",yl),g("sh",yl),g("python",gl),g("css",wl),g("xml",kl),g("html",kl);const y=new xl({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&ml.getLanguage(a))try{return'<pre class="hljs"><code>'+ml.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(l){}return'<pre class="hljs"><code>'+y.utils.escapeHtml(e)+"</code></pre>"}}),h=w(()=>y.render(i.modelValue||""));function b(){i.disabled||(m.value=!0,p("edit"),P(()=>{var e;null==(e=f.value)||e.focus()}))}function k(){m.value=!1,p("blur")}function _(){setTimeout(()=>{k()},150)}function C(){k()}return x(()=>i.defaultEditing,e=>{e&&!m.value&&b()}),a({enterEditMode:b,exitEditMode:k,isEditing:m}),(a,l)=>(n(),t("div",{class:d(["markdown-editor",{"is-editing":m.value,"is-empty":!e.modelValue}])},[m.value?(n(),t("div",kp,[r(c(re),{ref_key:"inputRef",ref:f,value:e.modelValue,type:"textarea",rows:e.rows,placeholder:e.placeholder,disabled:e.disabled,"onUpdate:value":l[0]||(l[0]=e=>a.$emit("update:modelValue",e)),onBlur:_,onKeydown:O(C,["esc"])},null,8,["value","rows","placeholder","disabled"]),l[1]||(l[1]=s("div",{class:"editor-hint"},[s("span",null,"按 Esc 退出编辑 | 支持 Markdown 格式")],-1))])):(n(),t("div",{key:1,class:"preview-container",style:I({minHeight:e.minHeight+"px"}),onDblclick:b},[e.modelValue?(n(),t("div",{key:0,class:"markdown-content",innerHTML:h.value},null,8,_p)):(n(),t("div",xp,v(e.placeholder||"双击编辑..."),1)),s("div",Cp,[r(c(q),{size:"12"},{default:u(()=>[r(c(Ba))]),_:1}),l[2]||(l[2]=s("span",null,"双击编辑",-1))])],36))],2))}},[["__scopeId","data-v-224a81d1"]]),Sp={class:"form-header"},zp={class:"form-container"},Ip={class:"form-section"},Tp={class:"section-title"},Pp={class:"form-item"},Mp={key:0,class:"form-error"},$p={class:"form-item"},jp={class:"form-item"},Op={class:"form-section"},Ap={class:"section-title"},Lp={class:"apps-toggles"},Ep={class:"app-toggle"},Dp={class:"app-toggle"},Np={class:"app-toggle"},Fp={class:"app-toggle"},Rp={class:"form-section content-section"},Bp={class:"section-title"},Hp={class:"form-footer"},qp=Pl({__name:"PromptsFormDrawer",props:{visible:{type:Boolean,default:!1},editingPreset:{type:Object,default:null},existingIds:{type:Array,default:()=>[]}},emits:["update:visible","saved"],setup(e,{emit:a}){const{drawerWidth:i}=ko(600),d=e,p=a,m=w({get:()=>d.visible,set:e=>p("update:visible",e)}),f=w(()=>!!d.editingPreset),h=l(!1),b=l(""),k=_({id:"",name:"",description:"",content:"",apps:{claude:!0,codex:!0,gemini:!0,opencode:!0}});async function C(){var e;if(k.id.trim()?/^[a-zA-Z0-9_-]+$/.test(k.id)?!f.value&&d.existingIds.includes(k.id)?(b.value="该 ID 已被使用",0):(b.value="",1):(b.value="ID 只能包含字母、数字、下划线和连字符",0):(b.value="预设 ID 不能为空",0))if(k.name.trim()){h.value=!0;try{const a={id:k.id.trim(),name:k.name.trim(),description:k.description.trim(),content:k.content,apps:{...k.apps}};(null==(e=d.editingPreset)?void 0:e.isBuiltin)&&(a.isBuiltin=!0);const l=await async function(e){return(await dt.post("/prompts/presets",e)).data}(a);l.success&&(Un.success(f.value?"保存成功":"创建成功"),p("saved"),m.value=!1)}catch(a){Un.error("保存失败: "+a.message)}finally{h.value=!1}}else Un.error("预设名称不能为空")}function U(){m.value=!1}return x(()=>d.visible,e=>{var a,l,t,n;e&&(d.editingPreset?(k.id=d.editingPreset.id||"",k.name=d.editingPreset.name||"",k.description=d.editingPreset.description||"",k.content=d.editingPreset.content||"",k.apps={claude:(null==(a=d.editingPreset.apps)?void 0:a.claude)??!0,codex:(null==(l=d.editingPreset.apps)?void 0:l.codex)??!0,gemini:(null==(t=d.editingPreset.apps)?void 0:t.gemini)??!0,opencode:(null==(n=d.editingPreset.apps)?void 0:n.opencode)??!0}):(k.id="",k.name="",k.description="",k.content="",k.apps={claude:!0,codex:!0,gemini:!0,opencode:!0}),b.value="")}),(a,l)=>(n(),g(c(pe),{show:m.value,"onUpdate:show":l[8]||(l[8]=e=>m.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",Sp,[r(c(q),{size:18,class:"header-icon"},{default:u(()=>[r(c(Oa))]),_:1}),s("span",null,v(f.value?"编辑预设":"新建预设"),1)])]),footer:u(()=>[s("div",Hp,[r(c(K),{onClick:U},{default:u(()=>[...l[24]||(l[24]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:C,loading:h.value},{default:u(()=>[y(v(f.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>{var a;return[s("div",zp,[s("div",Ip,[s("div",Tp,[r(c(q),{size:16},{default:u(()=>[r(c(Ma))]),_:1}),l[9]||(l[9]=s("span",null,"基本信息",-1))]),s("div",Pp,[l[10]||(l[10]=s("label",{class:"form-label"},[y("预设 ID "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:k.id,"onUpdate:value":l[0]||(l[0]=e=>k.id=e),placeholder:"唯一标识符,如 my-preset",disabled:f.value&&(null==(a=e.editingPreset)?void 0:a.isBuiltin)},null,8,["value","disabled"]),b.value?(n(),t("p",Mp,v(b.value),1)):o("",!0)]),s("div",$p,[l[11]||(l[11]=s("label",{class:"form-label"},[y("名称 "),s("span",{class:"required"},"*")],-1)),r(c(re),{value:k.name,"onUpdate:value":l[1]||(l[1]=e=>k.name=e),placeholder:"预设名称"},null,8,["value"])]),s("div",jp,[l[12]||(l[12]=s("label",{class:"form-label"},"描述",-1)),r(c(re),{value:k.description,"onUpdate:value":l[2]||(l[2]=e=>k.description=e),placeholder:"简短描述这个预设的用途"},null,8,["value"])])]),s("div",Op,[s("div",Ap,[r(c(q),{size:16},{default:u(()=>[r(c($a))]),_:1}),l[13]||(l[13]=s("span",null,"生效范围",-1))]),s("div",Lp,[s("label",Ep,[r(c(W),{value:k.apps.claude,"onUpdate:value":l[3]||(l[3]=e=>k.apps.claude=e)},null,8,["value"]),l[14]||(l[14]=s("span",{class:"app-name"},"Claude",-1)),l[15]||(l[15]=s("span",{class:"app-path"},"~/.claude/CLAUDE.md",-1))]),s("label",Dp,[r(c(W),{value:k.apps.codex,"onUpdate:value":l[4]||(l[4]=e=>k.apps.codex=e)},null,8,["value"]),l[16]||(l[16]=s("span",{class:"app-name"},"Codex",-1)),l[17]||(l[17]=s("span",{class:"app-path"},"~/.codex/AGENTS.md",-1))]),s("label",Np,[r(c(W),{value:k.apps.gemini,"onUpdate:value":l[5]||(l[5]=e=>k.apps.gemini=e)},null,8,["value"]),l[18]||(l[18]=s("span",{class:"app-name"},"Gemini",-1)),l[19]||(l[19]=s("span",{class:"app-path"},"~/.gemini/GEMINI.md",-1))]),s("label",Fp,[r(c(W),{value:k.apps.opencode,"onUpdate:value":l[6]||(l[6]=e=>k.apps.opencode=e)},null,8,["value"]),l[20]||(l[20]=s("span",{class:"app-name"},"OpenCode",-1)),l[21]||(l[21]=s("span",{class:"app-path"},"~/.config/opencode/AGENTS.md",-1))])])]),s("div",Rp,[s("div",Bp,[r(c(q),{size:16},{default:u(()=>[r(c(ua))]),_:1}),l[22]||(l[22]=s("span",null,"提示词内容",-1)),l[23]||(l[23]=s("span",{class:"content-hint"},"支持 Markdown 格式",-1))]),r(Up,{modelValue:k.content,"onUpdate:modelValue":l[7]||(l[7]=e=>k.content=e),rows:16,"min-height":300,placeholder:"# 系统提示词\n\n在这里编写你的系统提示词..."},null,8,["modelValue"])])])]}),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-41ac86b6"]]),Kp={class:"drawer-header"},Gp={class:"header-title"},Wp={class:"prompts-container"},Vp={class:"status-card"},Jp={class:"status-info"},Zp={class:"status-text"},Yp={class:"status-value"},Xp={class:"status-actions"},Qp={class:"stats-bar"},ev={class:"stats-text"},av={class:"preset-list"},lv={key:0,class:"empty-state"},tv={key:1,class:"preset-cards"},nv={class:"card-header"},sv={class:"card-title"},ov={class:"preset-name"},iv={class:"card-actions"},rv={key:0,class:"card-desc"},uv={class:"card-apps"},cv={class:"card-preview"},dv={class:"preview-content"},pv=Pl({__name:"PromptsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(680),p=e,h=a,b=w({get:()=>p.visible,set:e=>h("update:visible",e)}),k=l(!1),_=l({}),C=l(null),U=l(!1),S=l(null),z=l(null),I=l(!1),T=w(()=>{const e=Object.values(_.value),a=e.filter(e=>!e.isBuiltin),l=e.filter(e=>e.isBuiltin);return a.sort((e,a)=>e.id===C.value?-1:a.id===C.value?1:(a.updatedAt||0)-(e.updatedAt||0)),[...a,...l]}),P=w(()=>T.value.length),M=w(()=>Object.keys(_.value)),$=w(()=>C.value?_.value[C.value]:null),j=w(()=>{const e=T.value;return{builtin:e.filter(e=>e.isBuiltin).length,custom:e.filter(e=>!e.isBuiltin).length}}),O=[{label:"从 Claude 导入",key:"claude"},{label:"从 Codex 导入",key:"codex"},{label:"从 Gemini 导入",key:"gemini"},{label:"从 OpenCode 导入",key:"opencode"}];function A(e){if(!e)return"";let a=e.split("\n").slice(0,4).join("\n");return e.split("\n").length>4&&(a+="\n..."),a.substring(0,200)}async function L(){k.value=!0;try{const e=await async function(){return(await dt.get("/prompts/presets")).data}();e.success&&(_.value=e.presets,C.value=e.activePresetId)}catch(e){Un.error("加载预设失败")}finally{k.value=!1}}async function E(e){z.value=e.id;try{(await async function(e){return(await dt.post(`/prompts/presets/${e}/activate`)).data}(e.id)).success&&(C.value=e.id,Un.success(`已激活预设 "${e.name}"`))}catch(a){Un.error("激活失败: "+a.message)}finally{z.value=null}}async function D(){Sn.warning({title:"移除提示词",content:"确定要移除当前激活的提示词吗?这将删除各平台的提示词文件(CLAUDE.md、AGENTS.md、GEMINI.md、OpenCode AGENTS.md)。",positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{I.value=!0;try{(await async function(){return(await dt.post("/prompts/deactivate")).data}()).success&&(C.value=null,Un.success("已移除提示词"))}catch(e){Un.error("移除失败: "+e.message)}finally{I.value=!1}}})}function N(e){Sn.warning({title:"删除确认",content:`确定要删除预设 "${e.name}" 吗?此操作不可恢复。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await dt.delete(`/prompts/presets/${e}`)).data}(e.id)).success&&(delete _.value[e.id],Un.success("删除成功"))}catch(a){Un.error("删除失败: "+a.message)}}})}async function F(e){try{const a=await async function(e,a){return(await dt.post(`/prompts/import/${e}`,{name:a})).data}(e);a.success&&(_.value[a.preset.id]=a.preset,Un.success(a.message))}catch(a){Un.error("导入失败: "+a.message)}}function R(){S.value=null,U.value=!0}function B(){L()}return x(()=>p.visible,e=>{e&&L()}),(e,a)=>(n(),t(m,null,[r(c(pe),{show:b.value,"onUpdate:show":a[0]||(a[0]=e=>b.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{title:"Prompts 管理",closable:"","native-scrollbar":!1},{header:u(()=>[s("div",Kp,[s("div",Gp,[r(c(q),{size:20,class:"header-icon"},{default:u(()=>[r(c(Oa))]),_:1}),a[2]||(a[2]=s("span",null,"Prompts 管理",-1))])])]),default:u(()=>[s("div",Wp,[s("div",Vp,[s("div",Jp,[$.value?(n(),t(m,{key:0},[r(c(q),{class:"status-icon active",size:18},{default:u(()=>[r(c(He))]),_:1}),s("div",Zp,[a[3]||(a[3]=s("span",{class:"status-label"},"当前激活:",-1)),s("span",Yp,v($.value.name),1)])],64)):(n(),t(m,{key:1},[r(c(q),{class:"status-icon inactive",size:18},{default:u(()=>[r(c(Ka))]),_:1}),a[4]||(a[4]=s("div",{class:"status-text"},[s("span",{class:"status-label"},"未激活任何提示词")],-1))],64))]),s("div",Xp,[r(c(_e),{trigger:"click",options:O,onSelect:F},{default:u(()=>[r(c(K),{size:"small",tertiary:"",class:"action-btn"},{icon:u(()=>[r(c(q),{size:14},{default:u(()=>[r(c(Ha))]),_:1})]),default:u(()=>[a[5]||(a[5]=y(" 导入 ",-1))]),_:1})]),_:1}),r(c(K),{size:"small",tertiary:"",type:"primary",class:"action-btn",onClick:R},{icon:u(()=>[r(c(q),{size:14},{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[a[6]||(a[6]=y(" 新建 ",-1))]),_:1}),$.value?(n(),g(c(ce),{key:0,trigger:"hover"},{trigger:u(()=>[r(c(K),{size:"small",quaternary:"",class:"action-btn remove-btn",onClick:D,loading:I.value},{icon:u(()=>[r(c(q),{size:16},{default:u(()=>[r(c(Ke))]),_:1})]),default:u(()=>[a[7]||(a[7]=y(" 移除 ",-1))]),_:1},8,["loading"])]),default:u(()=>[a[8]||(a[8]=y(" 删除各平台的提示词文件 ",-1))]),_:1})):o("",!0)])]),s("div",Qp,[s("span",ev,[y(" 共 "+v(P.value)+" 个预设 ",1),P.value>0?(n(),t(m,{key:0},[y(" · 自定义: "+v(j.value.custom)+" · 内置模板: "+v(j.value.builtin),1)],64)):o("",!0)])]),s("div",av,[r(c(Q),{show:k.value},{default:u(()=>[0!==T.value.length||k.value?(n(),t("div",tv,[(n(!0),t(m,null,f(T.value,e=>(n(),t("div",{key:e.id,class:d(["preset-card",{active:e.id===C.value}])},[s("div",nv,[s("div",sv,[e.id===C.value?(n(),g(c(q),{key:0,class:"active-icon",size:16},{default:u(()=>[r(c(He))]),_:1})):o("",!0),s("span",ov,v(e.name),1),e.isBuiltin?(n(),g(c(G),{key:1,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[...a[11]||(a[11]=[y("模板",-1)])]),_:1})):o("",!0),e.isImported?(n(),g(c(G),{key:2,size:"tiny",bordered:!1,type:"warning"},{default:u(()=>[...a[12]||(a[12]=[y("已导入",-1)])]),_:1})):o("",!0)]),s("div",iv,[e.id!==C.value?(n(),g(c(K),{key:0,size:"tiny",type:"primary",onClick:a=>E(e),loading:z.value===e.id},{default:u(()=>[...a[13]||(a[13]=[y(" 激活 ",-1)])]),_:1},8,["onClick","loading"])):o("",!0),r(c(K),{quaternary:"",size:"tiny",onClick:a=>function(e){S.value=e,U.value=!0}(e)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ba))]),_:1})]),_:1},8,["onClick"]),e.isBuiltin?o("",!0):(n(),g(c(K),{key:1,quaternary:"",size:"tiny",onClick:a=>N(e)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),_:1},8,["onClick"]))])]),e.description?(n(),t("p",rv,v(e.description),1)):o("",!0),s("div",uv,[a[14]||(a[14]=s("span",{class:"apps-label"},"生效范围:",-1)),(n(),t(m,null,f(["claude","codex","gemini","opencode"],a=>{var l;return r(c(G),{key:a,type:(null==(l=e.apps)?void 0:l[a])?"success":"default",size:"tiny",bordered:!1},{default:u(()=>[y(v(a),1)]),_:2},1032,["type"])}),64))]),s("div",cv,[s("pre",dv,v(A(e.content)),1)])],2))),128))])):(n(),t("div",lv,[r(c(q),{size:48,class:"empty-icon"},{default:u(()=>[r(c(Oa))]),_:1}),a[9]||(a[9]=s("p",{class:"empty-title"},"暂无预设",-1)),a[10]||(a[10]=s("p",{class:"empty-desc"},'点击上方"新建"按钮创建系统提示词预设',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),r(qp,{visible:U.value,"onUpdate:visible":a[1]||(a[1]=e=>U.value=e),"editing-preset":S.value,"existing-ids":M.value,onSaved:B},null,8,["visible","editing-preset","existing-ids"])],64))}},[["__scopeId","data-v-98aafe0f"]]),vv={class:"drawer-header"},mv={class:"header-icon-wrapper"},fv={class:"speed-test-container"},gv={class:"test-controls"},yv={key:0,class:"test-summary"},hv={class:"summary-item"},bv={class:"summary-value"},wv={class:"summary-item success"},kv={class:"summary-value"},_v={class:"summary-item failed"},xv={class:"summary-value"},Cv={class:"summary-item avg"},Uv={class:"summary-value"},Sv={class:"results-list"},zv={key:0,class:"loading-state"},Iv={key:1,class:"empty-state"},Tv={class:"empty-icon-wrapper"},Pv={key:2,class:"result-cards"},Mv={class:"result-header"},$v={class:"channel-info"},jv={class:"channel-name"},Ov={class:"result-status"},Av={key:1,class:"status-badge failed"},Lv={key:0,class:"result-details"},Ev={class:"latency-bar"},Dv={key:1,class:"error-info"},Nv={class:"error-container"},Fv={class:"error-msg"},Rv={key:0,class:"error-latency"},Bv={key:1,class:"result-meta"},Hv={class:"meta-item status-indicator"},qv={class:"meta-item status-indicator"},Kv={key:0,class:"meta-item http-code"},Gv={key:1,class:"meta-item time"},Wv={key:1,class:"cache-hint"},Vv="speedTestResults",Jv="speedTestSummary",Zv="speedTestTime",Yv=Pl({__name:"SpeedTestDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(520),p=e,h=a,b=w({get:()=>p.visible,set:e=>h("update:visible",e)}),k=l(!1),_=l([]),C=l(null),U=l("all"),S=l(!1),z=[{label:"全部渠道",value:"all"},{label:"Claude",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"}];async function T(){k.value=!0,_.value=[],C.value=null,S.value=!1;const e=[];"all"!==U.value&&"claude"!==U.value||e.push({type:"claude",fn:$t}),"all"!==U.value&&"codex"!==U.value||e.push({type:"codex",fn:Ot}),"all"!==U.value&&"gemini"!==U.value||e.push({type:"gemini",fn:Lt});let a=[],l={total:0,success:0,failed:0,avgLatency:null},t=0,n=0;try{for(const{type:o,fn:i}of e)try{const e=await i(1e4);if(e.results){const s=e.results.map(e=>({...e,channelType:o,channelName:`[${o.toUpperCase()}] ${e.channelName}`,testedAt:Date.now()}));a=a.concat(s),_.value=[...a],e.summary&&(l.total+=e.summary.total||0,l.success+=e.summary.success||0,l.failed+=e.summary.failed||0,null!==e.summary.avgLatency&&void 0!==e.summary.avgLatency&&(e.summary.success||0)>0&&(t+=e.summary.avgLatency*(e.summary.success||0),n+=e.summary.success||0))}}catch(s){}l.avgLatency=n>0?Math.round(t/n):null,_.value=a.sort((e,a)=>{if(e.success&&!a.success)return-1;if(!e.success&&a.success)return 1;if(e.success&&a.success){return(null===e.latency||void 0===e.latency?1/0:e.latency)-(null===a.latency||void 0===a.latency?1/0:a.latency)}return 0}),C.value=l,function(){try{localStorage.setItem(Vv,JSON.stringify(_.value)),localStorage.setItem(Jv,JSON.stringify(C.value)),localStorage.setItem(Zv,Date.now().toString())}catch(e){}}(),0===l.total?Un.info("没有找到可测试的渠道"):Un.success(`测试完成: ${l.success}/${l.total} 成功`)}catch(s){Un.error("测试失败: "+s.message)}finally{k.value=!1}}function P(e){switch(e){case"excellent":return"优秀";case"good":return"良好";case"fair":return"一般";case"poor":return"较差";default:return"-"}}function M(e){if(!e)return"";return new Date(e).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function $(e){switch(e){case"claude":return"Claude";case"codex":return"Codex";case"gemini":return"Gemini";default:return(null==e?void 0:e.toUpperCase())||""}}function j(e){switch(e){case"claude":return"type-claude";case"codex":return"type-codex";case"gemini":return"type-gemini";default:return""}}return x(()=>p.visible,e=>{e&&function(){try{const e=localStorage.getItem(Zv);if(e&&Date.now()-parseInt(e)<3e5){const e=localStorage.getItem(Vv),a=localStorage.getItem(Jv);return e&&(_.value=JSON.parse(e),S.value=!0),a&&(C.value=JSON.parse(a)),!0}}catch(e){}}()}),(e,a)=>(n(),g(c(pe),{show:b.value,"onUpdate:show":a[1]||(a[1]=e=>b.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",vv,[s("div",mv,[r(c(q),{size:18},{default:u(()=>[r(c(Be))]),_:1})]),a[2]||(a[2]=s("span",null,"渠道速度测试",-1))])]),default:u(()=>[s("div",fv,[s("div",gv,[r(c(K),{type:"primary",loading:k.value,disabled:k.value,onClick:T,class:"test-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ea))]),_:1})]),default:u(()=>[y(" "+v(k.value?"测试中...":"开始全部测试"),1)]),_:1},8,["loading","disabled"]),r(c(te),{value:U.value,"onUpdate:value":a[0]||(a[0]=e=>U.value=e),options:z,placeholder:"选择渠道类型",style:{width:"140px"}},null,8,["value"])]),C.value?(n(),t("div",yv,[s("div",hv,[a[3]||(a[3]=s("span",{class:"summary-label"},"总计",-1)),s("span",bv,v(C.value.total),1)]),s("div",wv,[a[4]||(a[4]=s("span",{class:"summary-label"},"成功",-1)),s("span",kv,v(C.value.success),1)]),s("div",_v,[a[5]||(a[5]=s("span",{class:"summary-label"},"失败",-1)),s("span",xv,v(C.value.failed),1)]),s("div",Cv,[a[6]||(a[6]=s("span",{class:"summary-label"},"平均延迟",-1)),s("span",Uv,v(null!==C.value.avgLatency&&void 0!==C.value.avgLatency?C.value.avgLatency+"ms":"-"),1)])])):o("",!0),s("div",Sv,[k.value&&0===_.value.length?(n(),t("div",zv,[r(c(Q),{size:"large"}),a[7]||(a[7]=s("p",{class:"loading-text"},"正在测试渠道连接速度和 API 可用性...",-1))])):0!==_.value.length||k.value?(n(),t("div",Pv,[(n(!0),t(m,null,f(_.value,e=>{return n(),t("div",{key:e.channelId,class:d(["result-card",[e.success?"success":"failed",e.testing?"testing":""]])},[s("div",Mv,[s("div",$v,[s("span",{class:d(["channel-type-badge",j(e.channelType)])},v($(e.channelType)),3),s("span",jv,v((l=e.channelName,l?l.replace(/^\[(CLAUDE|CODEX|GEMINI)\]\s*/i,""):"")),1)]),s("div",Ov,[e.testing?(n(),g(c(Q),{key:0,size:14})):(n(),t(m,{key:1},[e.success?(n(),t("span",{key:0,class:d(["latency-badge",e.level])},v(e.latency)+"ms ",3)):(n(),t("span",Av,"失败"))],64))])]),e.testing?o("",!0):(n(),t("div",Lv,[e.success?(n(),t(m,{key:0},[s("div",Ev,[s("div",{class:d(["latency-fill",e.level]),style:I({width:(a=e.latency,(null==a?0:Math.min(a/3e3*100,100))+"%")})},null,6)]),s("span",{class:d(["latency-level",e.level])},v(P(e.level)),3)],64)):(n(),t("div",Dv,[s("div",Nv,[r(c(q),{size:14,class:"error-icon"},{default:u(()=>[r(c(Na))]),_:1}),s("span",Fv,v(e.error),1)]),null!==e.latency&&void 0!==e.latency?(n(),t("span",Rv," 响应 "+v(e.latency)+"ms ",1)):o("",!0)]))])),e.testing?o("",!0):(n(),t("div",Bv,[s("span",Hv,[s("span",{class:d(["status-dot",e.networkOk?"ok":"fail"])},null,2),y(" 网络"+v(e.networkOk?"正常":"异常"),1)]),s("span",qv,[s("span",{class:d(["status-dot",e.apiOk?"ok":"fail"])},null,2),y(" API"+v(e.apiOk?"可用":"不可用"),1)]),e.statusCode?(n(),t("span",Kv,"HTTP "+v(e.statusCode),1)):o("",!0),e.testedAt?(n(),t("span",Gv,v(M(e.testedAt)),1)):o("",!0)]))],2);var a,l}),128))])):(n(),t("div",Iv,[s("div",Tv,[r(c(q),{size:32},{default:u(()=>[r(c(Be))]),_:1})]),a[8]||(a[8]=s("p",{class:"empty-title"},"暂无测试结果",-1)),a[9]||(a[9]=s("p",{class:"empty-desc"},"点击上方按钮开始测试渠道连接速度",-1))]))]),S.value&&!k.value?(n(),t("div",Wv,[r(c(q),{size:14},{default:u(()=>[r(c(Ga))]),_:1}),a[10]||(a[10]=s("span",null,"显示的是缓存的测试结果,点击按钮重新测试",-1))])):o("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-bd919653"]]),Xv="http://localhost:19999";async function Qv(e){return(await B.post(`${Xv}/api/convert/opencode/claude`,e)).data}async function em(e){return(await B.post(`${Xv}/api/convert/opencode/codex`,e)).data}async function am(e){return(await B.post(`${Xv}/api/convert/opencode/gemini`,e)).data}const lm={class:"drawer-header"},tm={class:"header-icon-wrapper"},nm={class:"convert-container"},sm={class:"action-row"},om={key:1,class:"result-section"},im={class:"result-meta"},rm={class:"meta-row"},um={class:"meta-row"},cm={class:"meta-row"},dm={class:"warning-list"},pm={class:"action-row"},vm=Pl({__name:"GatewayConvertDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:i}=ko(620,520),d=e,p=a,h=w({get:()=>d.visible,set:e=>p("update:visible",e)}),b=l([{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"}]),k=l([{label:"Responses API (/v1/responses)",value:"responses"},{label:"Chat Completions (/v1/chat/completions)",value:"chat.completions"}]),_=l("claude"),C=l("responses"),U=l(""),S=l(!1),z=l(null),I=l(""),T=l(!1),P={claude:{model:"claude-sonnet-4-5",system:[{type:"text",text:"You are a concise assistant."}],messages:[{role:"user",content:[{type:"text",text:"请用三点总结这个需求。"}]}],max_tokens:256,stream:!1},codex:{model:"gpt-5-codex",instructions:"You are Codex.",input:[{type:"message",role:"user",content:[{type:"input_text",text:"ping"}]}],stream:!1,store:!1},gemini:{model:"gemini-2.5-pro",system_instruction:{parts:[{text:"You are a concise assistant."}]},contents:[{role:"user",parts:[{text:"请将以下文本转换为要点列表。"}]}],generationConfig:{maxOutputTokens:256,temperature:.2}}},M=w(()=>{var e;return(null==(e=z.value)?void 0:e.requestBody)?JSON.stringify(z.value.requestBody,null,2):""});function $(){const e=P[_.value]||P.claude;U.value=JSON.stringify(e,null,2)}async function j(){if(!T.value)try{const e=await async function(){return(await B.get(`${Xv}/api/convert/opencode/formats`)).data}();Array.isArray(e.sourceTypes)&&e.sourceTypes.length>0&&(b.value=e.sourceTypes.map(e=>({label:e.name||e.id,value:e.id}))),Array.isArray(e.targetApis)&&e.targetApis.length>0&&(k.value=e.targetApis.map(e=>"chat.completions"===e?{label:"Chat Completions (/v1/chat/completions)",value:e}:{label:"Responses API (/v1/responses)",value:e})),e.defaultTargetApi&&(C.value=e.defaultTargetApi),T.value=!0}catch(e){}}function O(){I.value="",z.value=null}async function A(){var e,a;let l;I.value="",z.value=null;try{l=JSON.parse(U.value||"{}")}catch(t){return void(I.value="原始请求 JSON 解析失败,请检查格式")}S.value=!0;try{const e={claude:Qv,codex:em,gemini:am}[_.value];if(!e)throw new Error(`Unsupported sourceType: ${_.value}`);const a=await e({payload:l,options:{targetApi:C.value}});if(!1===a.success)throw new Error(a.error||"转换失败");z.value=a,Un.success("转换完成")}catch(t){const l=(null==(a=null==(e=t.response)?void 0:e.data)?void 0:a.error)||t.message||"转换失败";I.value=l}finally{S.value=!1}}async function L(){if(!z.value)return;const e={endpoint:z.value.endpoint,requestBody:z.value.requestBody};try{await navigator.clipboard.writeText(JSON.stringify(e,null,2)),Un.success("已复制转换结果")}catch(a){Un.error("复制失败,请手动复制")}}return x(()=>_.value,()=>{$()}),x(()=>d.visible,async e=>{e&&(await j(),U.value||$())}),(e,a)=>(n(),g(c(pe),{show:h.value,"onUpdate:show":a[3]||(a[3]=e=>h.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",lm,[s("div",tm,[r(c(q),{size:18},{default:u(()=>[r(c(Wa))]),_:1})]),a[4]||(a[4]=s("span",null,"OpenCode 请求转换",-1))])]),default:u(()=>[s("div",nm,[r(c(ae),{"label-placement":"top"},{default:u(()=>[r(c(le),{label:"来源渠道"},{default:u(()=>[r(c(te),{value:_.value,"onUpdate:value":a[0]||(a[0]=e=>_.value=e),options:b.value,placeholder:"选择来源渠道"},null,8,["value","options"])]),_:1}),r(c(le),{label:"目标 API"},{default:u(()=>[r(c(te),{value:C.value,"onUpdate:value":a[1]||(a[1]=e=>C.value=e),options:k.value,placeholder:"选择目标 API"},null,8,["value","options"])]),_:1}),r(c(le),{label:"原始请求 JSON"},{default:u(()=>[r(c(re),{value:U.value,"onUpdate:value":a[2]||(a[2]=e=>U.value=e),type:"textarea",autosize:{minRows:10,maxRows:18},placeholder:"粘贴原始请求 JSON"},null,8,["value"])]),_:1})]),_:1}),s("div",sm,[r(c(K),{quaternary:"",onClick:$},{default:u(()=>[...a[5]||(a[5]=[y("填充示例",-1)])]),_:1}),r(c(se),null,{default:u(()=>[r(c(K),{onClick:O},{default:u(()=>[...a[6]||(a[6]=[y("清空结果",-1)])]),_:1}),r(c(K),{type:"primary",loading:S.value,onClick:A},{default:u(()=>[...a[7]||(a[7]=[y("开始转换",-1)])]),_:1},8,["loading"])]),_:1})]),I.value?(n(),g(c(fe),{key:0,type:"error","show-icon":!0,style:{"margin-top":"12px"}},{default:u(()=>[y(v(I.value),1)]),_:1})):o("",!0),z.value?(n(),t("div",om,[s("div",im,[s("div",rm,[a[8]||(a[8]=s("span",{class:"meta-label"},"转换端点",-1)),r(c(G),{type:"success",size:"small",bordered:!1},{default:u(()=>[y(v(z.value.endpoint),1)]),_:1})]),s("div",um,[a[9]||(a[9]=s("span",{class:"meta-label"},"目标协议",-1)),r(c(G),{type:"info",size:"small",bordered:!1},{default:u(()=>[y(v(z.value.targetApi),1)]),_:1})]),s("div",cm,[a[10]||(a[10]=s("span",{class:"meta-label"},"消息数量",-1)),r(c(G),{size:"small",bordered:!1},{default:u(()=>{var e;return[y(v((null==(e=z.value.meta)?void 0:e.messageCount)??0),1)]}),_:1})])]),Array.isArray(z.value.warnings)&&z.value.warnings.length>0?(n(),g(c(fe),{key:0,type:"warning","show-icon":!0,style:{"margin-top":"12px"}},{default:u(()=>[a[11]||(a[11]=s("div",{class:"warning-title"},"转换警告",-1)),s("ul",dm,[(n(!0),t(m,null,f(z.value.warnings,(e,a)=>(n(),t("li",{key:a},v(e),1))),128))])]),_:1})):o("",!0),r(c(le),{label:"转换后请求 JSON",style:{"margin-top":"12px"}},{default:u(()=>[r(c(re),{value:M.value,type:"textarea",readonly:"",autosize:{minRows:10,maxRows:18}},null,8,["value"])]),_:1}),s("div",pm,[a[13]||(a[13]=s("div",null,null,-1)),r(c(K),{size:"small",onClick:L},{default:u(()=>[...a[12]||(a[12]=[y("复制转换结果",-1)])]),_:1})])])):o("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-e6530b83"]]);async function mm(e){return(await dt.get(`/config-registry/${e}`)).data}async function fm(e){return(await dt.post(`/config-registry/${e}/import`)).data}async function gm(e,a,l){const t=encodeURIComponent(a);return(await dt.put(`/config-registry/${e}/${t}/toggle`,{enabled:l})).data}async function ym(e,a,l,t){const n=encodeURIComponent(a);return(await dt.put(`/config-registry/${e}/${n}/platform/${l}`,{enabled:t})).data}async function hm(e){return(await dt.post(`/config-registry/${e}/sync`)).data}const bm={class:"card-header"},wm={class:"card-title"},km={class:"name"},_m={class:"card-body"},xm={key:0,class:"description"},Cm={class:"meta"},Um={class:"meta-item"},Sm=["href"],zm={key:1,class:"managed-actions"},Im={class:"platform-icons"},Tm=Pl({__name:"SkillCard",props:{skill:{type:Object,required:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1},registryInfo:{type:Object,default:null},toggling:{type:Boolean,default:!1}},emits:["click","install","uninstall","toggle-enabled","toggle-platform"],setup:e=>(a,l)=>{return n(),t("div",{class:d(["skill-card",{installed:e.skill.installed,managed:!!e.registryInfo}]),onClick:l[10]||(l[10]=l=>a.$emit("click",e.skill))},[s("div",bm,[s("div",wm,[s("span",km,v(e.skill.name),1),e.skill.installed?(n(),g(c(G),{key:0,type:"info",size:"small"},{default:u(()=>[...l[11]||(l[11]=[y("已安装",-1)])]),_:1})):o("",!0),e.skill.repoOwner?(n(),g(c(G),{key:1,type:"info",size:"small"},{default:u(()=>[y(v(e.skill.repoOwner),1)]),_:1})):o("",!0)]),s("div",{class:"card-actions",onClick:l[2]||(l[2]=p(()=>{},["stop"]))},[e.skill.installed?(n(),g(c(K),{key:0,size:"small",type:"error",loading:e.uninstalling,focusable:!1,onClick:l[0]||(l[0]=l=>a.$emit("uninstall",e.skill))},{default:u(()=>[...l[12]||(l[12]=[y("卸载",-1)])]),_:1},8,["loading"])):(n(),g(c(K),{key:1,size:"small",type:"primary",loading:e.installing,disabled:(f=e.skill,!((null==f?void 0:f.repoOwner)||(null==f?void 0:f.installSource))),focusable:!1,onClick:l[1]||(l[1]=l=>a.$emit("install",e.skill))},{default:u(()=>[...l[13]||(l[13]=[y("安装",-1)])]),_:1},8,["loading","disabled"]))])]),s("div",_m,[e.skill.description?(n(),t("div",xm,v((i=e.skill.description,m=80,(null==i?void 0:i.length)>m?i.slice(0,m)+"...":i)),1)):o("",!0),s("div",Cm,[s("span",Um,v(e.skill.directory),1),e.skill.readmeUrl?(n(),t("a",{key:0,class:"meta-link",href:e.skill.readmeUrl,target:"_blank",onClick:l[3]||(l[3]=p(()=>{},["stop"]))},"GitHub",8,Sm)):o("",!0)]),e.registryInfo?(n(),t("div",zm,[r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(W),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":l[4]||(l[4]=l=>a.$emit("toggle-enabled",e.skill,l)),onClick:l[5]||(l[5]=p(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[y(" "+v(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),s("div",Im,[r(c(ce),{trigger:"hover"},{trigger:u(()=>{var t;return[s("span",{class:d(["platform-icon",{active:null==(t=e.registryInfo.platforms)?void 0:t.claude}]),onClick:l[6]||(l[6]=p(l=>{var t;return a.$emit("toggle-platform",e.skill,"claude",!(null==(t=e.registryInfo.platforms)?void 0:t.claude))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(Va))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Claude Code "+v((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var t;return[s("span",{class:d(["platform-icon",{active:null==(t=e.registryInfo.platforms)?void 0:t.codex}]),onClick:l[7]||(l[7]=p(l=>{var t;return a.$emit("toggle-platform",e.skill,"codex",!(null==(t=e.registryInfo.platforms)?void 0:t.codex))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ea))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Codex CLI "+v((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var t;return[s("span",{class:d(["platform-icon",{active:null==(t=e.registryInfo.platforms)?void 0:t.gemini}]),onClick:l[8]||(l[8]=p(l=>{var t;return a.$emit("toggle-platform",e.skill,"gemini",!(null==(t=e.registryInfo.platforms)?void 0:t.gemini))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(Ja))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Gemini CLI "+v((null==(a=e.registryInfo.platforms)?void 0:a.gemini)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var t;return[s("span",{class:d(["platform-icon",{active:null==(t=e.registryInfo.platforms)?void 0:t.opencode}]),onClick:l[9]||(l[9]=p(l=>{var t;return a.$emit("toggle-platform",e.skill,"opencode",!(null==(t=e.registryInfo.platforms)?void 0:t.opencode))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ua))]),_:1})],2)]}),default:u(()=>{var a;return[y(" OpenCode "+v((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1})])])):o("",!0)])],2);var i,m,f}},[["__scopeId","data-v-a38ff629"]]),Pm={class:"repo-manager"},Mm={class:"repo-list"},$m={class:"repo-main"},jm={class:"repo-info"},Om={class:"repo-name"},Am={class:"repo-branch"},Lm={key:0,class:"empty-hint"},Em={class:"add-repo"},Dm={class:"add-form"},Nm={class:"tips"},Fm={class:"recommended"},Rm={class:"recommended-list"},Bm=["onClick"],Hm={class:"rec-info"},qm={class:"rec-name"},Km={class:"rec-desc"},Gm=Pl({__name:"SkillRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const i=e,p=a,h=w({get:()=>i.visible,set:e=>p("update:visible",e)}),k=l([]),_=l(!1),C=l(!1),U=l({input:"",branch:"main"}),S=w(()=>"codex"===i.platform?[{owner:"openai",name:"skills",description:"Codex 官方技能库",branch:"main",directory:"skills/.curated"}]:"opencode"===i.platform?[{owner:"Shakudo-io",name:"opencode-skills",description:"OpenCode 官方技能库(46个技能)",branch:"main",directory:""}]:"gemini"===i.platform?[{owner:"google-gemini",name:"gemini-cli",description:"Gemini 官方技能库",branch:"main",directory:".gemini/skills"}]:[{owner:"anthropics",name:"skills",description:"官方技能库",branch:"main"},{owner:"ComposioHQ",name:"awesome-claude-skills",description:"社区精选",branch:"master"},{owner:"cexll",name:"myclaude",description:"多智能体工作流",branch:"master"}]),z=w(()=>{const e=U.value.input.trim();if(!e)return!1;if(e.includes("github.com"))return e.match(/github\.com\/([^\/]+)\/([^\/\.]+)/);const a=e.split("/");return 2===a.length&&a[0]&&a[1]});async function I(){_.value=!0;try{const e=await async function(e="claude"){return(await dt.get("/skills/repos",{params:{platform:e}})).data}(i.platform);e.success&&(k.value=e.repos||[])}catch(e){Un.error("加载仓库失败: "+e.message)}finally{_.value=!1}}async function T(){if(!z.value)return;const e=U.value.input.trim(),{owner:a,name:l}=function(e){let a="",l="";if(e.includes("github.com")){const t=e.match(/github\.com\/([^\/]+)\/([^\/\.]+)/);t&&(a=t[1],l=t[2])}else{const t=e.split("/");a=t[0],l=t[1]}return{owner:a,name:l}}(e);C.value=!0;try{const e=await Es({owner:a,name:l,branch:U.value.branch||"main",enabled:!0},i.platform);e.success&&(k.value=e.repos,U.value.input="",U.value.branch="main",Un.success("仓库添加成功"),p("updated"))}catch(t){Un.error("添加失败: "+t.message)}finally{C.value=!1}}async function P(e){try{const a=await async function(e,a,l="",t="claude"){return(await dt.delete(`/skills/repos/${e}/${a}`,{params:{directory:l,platform:t}})).data}(e.owner,e.name,e.directory||"",i.platform);a.success&&(k.value=a.repos,Un.success("仓库已删除"),p("updated"))}catch(a){Un.error("删除失败: "+a.message)}}async function M(e,a){try{const l=await async function(e,a,l,t="",n="claude"){return(await dt.put(`/skills/repos/${e}/${a}/toggle`,{enabled:l,directory:t,platform:n})).data}(e.owner,e.name,a,e.directory||"",i.platform);l.success&&(k.value=l.repos,p("updated"))}catch(l){Un.error("操作失败: "+l.message)}}function $(e){return k.value.some(a=>a.owner===e.owner&&a.name===e.name&&(a.directory||"")===(e.directory||""))}function j(){p("update:visible",!1)}return x(()=>i.visible,e=>{e&&I()}),x(()=>i.platform,()=>{i.visible&&I()}),b(()=>{i.visible&&I()}),(e,a)=>(n(),g(c(ie),{show:h.value,"onUpdate:show":a[2]||(a[2]=e=>h.value=e),preset:"card",title:"技能仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:j},{default:u(()=>[s("div",Pm,[s("div",Mm,[r(c(Q),{show:_.value},{default:u(()=>[(n(!0),t(m,null,f(k.value,e=>(n(),t("div",{key:`${e.owner}/${e.name}/${e.directory||""}`,class:"repo-item"},[s("div",$m,[r(c(W),{value:e.enabled,size:"small","onUpdate:value":a=>M(e,a)},null,8,["value","onUpdate:value"]),s("div",jm,[s("div",Om,v(e.owner)+"/"+v(e.name),1),s("div",Am,v(e.branch),1)])]),r(c(K),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>P(e)},{default:u(()=>[...a[3]||(a[3]=[y(" 删除 ",-1)])]),_:1},8,["onClick"])]))),128)),0===k.value.length?(n(),t("div",Lm," 暂无仓库,请添加 ")):o("",!0)]),_:1},8,["show"])]),s("div",Em,[a[5]||(a[5]=s("div",{class:"add-title"},"添加仓库",-1)),s("div",Dm,[r(c(re),{value:U.value.input,"onUpdate:value":a[0]||(a[0]=e=>U.value.input=e),placeholder:"owner/repo 或 GitHub URL",size:"small",class:"repo-input",onKeyup:O(T,["enter"])},null,8,["value"]),r(c(re),{value:U.value.branch,"onUpdate:value":a[1]||(a[1]=e=>U.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"]),r(c(K),{type:"primary",size:"small",disabled:!z.value,loading:C.value,focusable:!1,onClick:T},{default:u(()=>[...a[4]||(a[4]=[y(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[6]||(a[6]=s("div",{class:"add-hint"}," 格式: owner/repo 或完整 GitHub URL ",-1))]),s("div",Nm,[r(c(fe),{type:"info",bordered:!1,size:"small"},{default:u(()=>[...a[7]||(a[7]=[y(" 添加仓库后,系统会从 GitHub 获取技能列表。如果网络较慢,请耐心等待或使用代理。 ",-1)])]),_:1})]),s("div",Fm,[a[9]||(a[9]=s("div",{class:"recommended-title"},"推荐仓库",-1)),s("div",Rm,[(n(!0),t(m,null,f(S.value,e=>(n(),t("div",{key:`${e.owner}/${e.name}/${e.directory||""}`,class:d(["recommended-item",{added:$(e)}]),onClick:a=>!$(e)&&async function(e){C.value=!0;try{const a=await Es({owner:e.owner,name:e.name,branch:e.branch,directory:e.directory||"",enabled:!0},i.platform);a.success&&(k.value=a.repos,Un.success("仓库添加成功"),p("updated"))}catch(a){Un.error("添加失败: "+a.message)}finally{C.value=!1}}(e)},[s("div",Hm,[s("span",qm,v(e.owner)+"/"+v(e.name),1),s("span",Km,v(e.description),1)]),$(e)?(n(),g(c(G),{key:0,size:"tiny",type:"success",bordered:!1},{default:u(()=>[...a[8]||(a[8]=[y(" 已添加 ",-1)])]),_:1})):(n(),g(c(q),{key:1,class:"add-icon"},{default:u(()=>[r(c(Ve))]),_:1}))],10,Bm))),128))])])])]),_:1},8,["show"]))}},[["__scopeId","data-v-10656320"]]),Wm={style:{"margin-bottom":"12px"}},Vm={class:"file-list"},Jm={class:"file-item"},Zm={class:"file-info"},Ym={class:"file-path"},Xm={key:1,class:"file-size"},Qm={class:"file-actions"},ef={class:"modal-footer"},af=Pl({__name:"SkillCreateModal",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","created"],setup(e,{emit:a}){const i=e,p=a,h=w({get:()=>i.visible,set:e=>p("update:visible",e)}),b=l("simple"),k=l(null),_=l({directory:"",name:"",description:"",content:""}),C={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}],content:[{required:!0,message:"请输入技能内容",trigger:"blur"}]},U=l(null),S=l({directory:"",files:[]}),z={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}]},I=l(!1),T=l(!1),P=l(null),M=l(""),$=l(-1),j=l(!1),O=l(""),A=l(""),L=w(()=>S.value.files.some(e=>"SKILL.md"===e.path)),E=w(()=>"opencode"===i.platform),D=/^[a-z0-9]+(-[a-z0-9]+)*$/;function N(e){const a=e.toLowerCase().substring(e.lastIndexOf("."));return[".md",".txt",".json",".js",".ts",".py",".sh",".yaml",".yml",".toml",".xml",".html",".css"].includes(a)}function F({file:e}){return!0}async function R({file:e,onFinish:a,onError:l}){try{const t=new FileReader;t.onload=l=>{var t;const n=N(e.name);let s=e.name;if(null==(t=e.file)?void 0:t.webkitRelativePath){s=e.file.webkitRelativePath.split("/").slice(1).join("/")}S.value.files.push({path:s,content:n?l.target.result:btoa(l.target.result),isBase64:!n,size:e.file.size}),a()},t.onerror=l,N(e.name)?t.readAsText(e.file):t.readAsBinaryString(e.file)}catch(t){l()}}function B(){$.value>=0&&(S.value.files[$.value].content=M.value),T.value=!1,P.value=null,M.value="",$.value=-1}function H(){O.value.trim()?S.value.files.some(e=>e.path===O.value)?Un.warning("文件已存在"):(S.value.files.push({path:O.value,content:A.value,isBase64:!1,size:new Blob([A.value]).size}),j.value=!1,O.value="",A.value=""):Un.warning("请输入文件路径")}function W(){const e=E.value?`---\nname: ${S.value.directory||"my-skill"}\ndescription: "Skill description"\n---\n\n# Skill Instructions\n\nDescribe when this skill should be used and what it should do.\n`:`---\nname: "${S.value.directory||"我的技能"}"\ndescription: "技能描述"\n---\n\n# 技能指令\n\n在这里编写你的技能内容...\n`;S.value.files.unshift({path:"SKILL.md",content:e,isBase64:!1,size:new Blob([e]).size})}async function J(){"simple"===b.value?await async function(){var e,a,l,t,n;try{await(null==(e=k.value)?void 0:e.validate())}catch(s){return}if(E.value){const e=null==(a=_.value.directory)?void 0:a.trim();if(!D.test(e||""))return void Un.error("OpenCode skill 目录必须是小写字母/数字,可用单个 - 连接");if(!(null==(l=_.value.description)?void 0:l.trim()))return void Un.error("OpenCode skill 需要填写 description")}I.value=!0;try{const e=await async function(e,a="claude"){return(await dt.post("/skills/create",{...e,platform:a})).data}({name:E.value?_.value.directory:_.value.name||_.value.directory,directory:_.value.directory,description:_.value.description,content:_.value.content},i.platform);e.success?(Un.success("技能创建成功"),p("created"),Z()):Un.error(e.message||"创建失败")}catch(s){Un.error("创建失败: "+((null==(n=null==(t=s.response)?void 0:t.data)?void 0:n.message)||s.message))}finally{I.value=!1}}():await async function(){var e,a,l,t;try{await(null==(e=U.value)?void 0:e.validate())}catch(n){return}if(!L.value)return void Un.error("必须包含 SKILL.md 文件");if(E.value){const e=null==(a=S.value.directory)?void 0:a.trim();if(!D.test(e||""))return void Un.error("OpenCode skill 目录必须是小写字母/数字,可用单个 - 连接")}I.value=!0;try{const e=await async function(e,a="claude"){return(await dt.post("/skills/create-with-files",{...e,platform:a})).data}({directory:S.value.directory,files:S.value.files.map(e=>({path:e.path,content:e.content,isBase64:e.isBase64}))},i.platform);e.success?(Un.success(`技能创建成功,包含 ${e.fileCount} 个文件`),p("created"),Z()):Un.error(e.message||"创建失败")}catch(n){Un.error("创建失败: "+((null==(t=null==(l=n.response)?void 0:l.data)?void 0:t.message)||n.message))}finally{I.value=!1}}()}function Z(){p("update:visible",!1)}return x(()=>i.visible,e=>{e||(b.value="simple",_.value={directory:"",name:"",description:"",content:""},S.value={directory:"",files:[]},P.value=null,M.value="",$.value=-1,O.value="",A.value="")}),(e,a)=>(n(),g(c(ie),{show:h.value,"onUpdate:show":a[14]||(a[14]=e=>h.value=e),preset:"card",title:"创建自定义技能",bordered:!1,closable:!0,style:{width:"680px","max-width":"90vw"},onClose:Z},{footer:u(()=>[s("div",ef,[r(c(K),{onClick:Z},{default:u(()=>[...a[22]||(a[22]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:I.value,onClick:J},{default:u(()=>[...a[23]||(a[23]=[y(" 创建 ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[r(c(we),{value:b.value,"onUpdate:value":a[6]||(a[6]=e=>b.value=e),type:"line",animated:""},{default:u(()=>[r(c(ke),{name:"simple",tab:"简单模式"},{default:u(()=>[r(c(ae),{ref_key:"simpleFormRef",ref:k,model:_.value,rules:C,"label-placement":"top","label-width":"auto"},{default:u(()=>[r(c(le),{label:"目录名称",path:"directory"},{feedback:u(()=>[y(v(E.value?"OpenCode 要求小写字母/数字,可用单个 - 连接(如 my-skill)":"只能包含英文、数字、横杠和下划线"),1)]),default:u(()=>[r(c(re),{value:_.value.directory,"onUpdate:value":a[0]||(a[0]=e=>_.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),E.value?o("",!0):(n(),g(c(le),{key:0,label:"技能名称",path:"name"},{default:u(()=>[r(c(re),{value:_.value.name,"onUpdate:value":a[1]||(a[1]=e=>_.value.name=e),placeholder:"显示名称,可以是中文",maxlength:100},null,8,["value"])]),_:1})),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:_.value.description,"onUpdate:value":a[2]||(a[2]=e=>_.value.description=e),type:"textarea",placeholder:"简短描述这个技能的用途",rows:2,maxlength:200},null,8,["value"])]),_:1}),r(c(le),{label:"技能内容 (提示词,支持 Markdown)",path:"content"},{default:u(()=>[r(Up,{modelValue:_.value.content,"onUpdate:modelValue":a[3]||(a[3]=e=>_.value.content=e),rows:10,"min-height":200,placeholder:"输入技能的详细指令内容,支持 Markdown 格式..."},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1}),r(c(ke),{name:"advanced",tab:"高级模式 (多文件)"},{default:u(()=>[r(c(ae),{ref_key:"advancedFormRef",ref:U,model:S.value,rules:z,"label-placement":"top","label-width":"auto"},{default:u(()=>[r(c(le),{label:"目录名称",path:"directory"},{feedback:u(()=>[y(v(E.value?"OpenCode 要求小写字母/数字,可用单个 - 连接(如 my-skill)":"只能包含英文、数字、横杠和下划线"),1)]),default:u(()=>[r(c(re),{value:S.value.directory,"onUpdate:value":a[4]||(a[4]=e=>S.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),r(c(le),{label:"文件上传"},{default:u(()=>[r(c(Ce),{multiple:"","directory-dnd":"","show-file-list":!1,"custom-request":R,onBeforeUpload:F},{default:u(()=>[r(c(Ue),null,{default:u(()=>[s("div",Wm,[r(c(q),{size:"48",depth:3},{default:u(()=>[r(c(Za))]),_:1})]),r(c(V),{style:{"font-size":"16px"}},{default:u(()=>[...a[15]||(a[15]=[y(" 拖放文件或文件夹到此处,或点击选择 ",-1)])]),_:1}),r(c(Se),{depth:"3",style:{margin:"8px 0 0 0"}},{default:u(()=>[...a[16]||(a[16]=[y(" 必须包含 SKILL.md 文件 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),S.value.files.length>0?(n(),g(c(le),{key:0,label:"已添加的文件"},{default:u(()=>[s("div",Vm,[(n(!0),t(m,null,f(S.value.files,(e,l)=>(n(),g(c(ze),{key:e.path,size:"small",class:d({"skill-md":"SKILL.md"===e.path})},{default:u(()=>{return[s("div",Jm,[s("div",Zm,[r(c(q),{size:16,class:"file-icon"},{default:u(()=>[e.isDirectory?(n(),g(c(Ya),{key:1})):(n(),g(c(oa),{key:0}))]),_:2},1024),s("span",Ym,v(e.path),1),"SKILL.md"===e.path?(n(),g(c(G),{key:0,size:"small",type:"primary"},{default:u(()=>[...a[17]||(a[17]=[y("必需",-1)])]),_:1})):o("",!0),e.size?(n(),t("span",Xm,v((i=e.size,i<1024?i+" B":i<1048576?(i/1024).toFixed(1)+" KB":(i/1048576).toFixed(1)+" MB")),1)):o("",!0)]),s("div",Qm,[N(e.path)?(n(),g(c(K),{key:0,size:"small",text:"",onClick:e=>function(e){const a=S.value.files[e];P.value=a,M.value=a.content,$.value=e,T.value=!0}(l)},{default:u(()=>[...a[18]||(a[18]=[y(" 编辑 ",-1)])]),_:1},8,["onClick"])):o("",!0),"SKILL.md"!==e.path?(n(),g(c(K),{key:1,size:"small",text:"",type:"error",onClick:e=>function(e){S.value.files.splice(e,1)}(l)},{default:u(()=>[...a[19]||(a[19]=[y(" 删除 ",-1)])]),_:1},8,["onClick"])):o("",!0)])])];var i}),_:2},1032,["class"]))),128))])]),_:1})):o("",!0),r(c(le),null,{default:u(()=>[r(c(se),null,{default:u(()=>[r(c(K),{onClick:a[5]||(a[5]=e=>j.value=!0)},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[a[20]||(a[20]=y(" 添加文件 ",-1))]),_:1}),L.value?o("",!0):(n(),g(c(K),{key:0,onClick:W},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Oa))]),_:1})]),default:u(()=>[a[21]||(a[21]=y(" 添加 SKILL.md 模板 ",-1))]),_:1}))]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["value"]),r(c(ie),{show:T.value,"onUpdate:show":a[9]||(a[9]=e=>T.value=e),preset:"card",title:"编辑文件",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:a[8]||(a[8]=e=>T.value=!1)},{default:u(()=>[...a[24]||(a[24]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:B},{default:u(()=>[...a[25]||(a[25]=[y("保存",-1)])]),_:1})]),_:1})]),default:u(()=>{var e;return[r(c(le),{label:(null==(e=P.value)?void 0:e.path)||"文件内容"},{default:u(()=>[r(c(re),{value:M.value,"onUpdate:value":a[7]||(a[7]=e=>M.value=e),type:"textarea",rows:15,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["label"])]}),_:1},8,["show"]),r(c(ie),{show:j.value,"onUpdate:show":a[13]||(a[13]=e=>j.value=e),preset:"card",title:"添加新文件",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:a[12]||(a[12]=e=>j.value=!1)},{default:u(()=>[...a[27]||(a[27]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:H},{default:u(()=>[...a[28]||(a[28]=[y("添加",-1)])]),_:1})]),_:1})]),default:u(()=>[r(c(ae),{"label-placement":"top"},{default:u(()=>[r(c(le),{label:"文件路径"},{feedback:u(()=>[...a[26]||(a[26]=[y(" 可以包含子目录,如 scripts/helper.sh ",-1)])]),default:u(()=>[r(c(re),{value:O.value,"onUpdate:value":a[10]||(a[10]=e=>O.value=e),placeholder:"例如: scripts/helper.sh 或 README.md"},null,8,["value"])]),_:1}),r(c(le),{label:"文件内容"},{default:u(()=>[r(c(re),{value:A.value,"onUpdate:value":a[11]||(a[11]=e=>A.value=e),type:"textarea",rows:10,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1},8,["show"]))}},[["__scopeId","data-v-511005e8"]]),lf={key:0,class:"loading-state"},tf={key:1,class:"error-state"},nf={key:2,class:"detail-content"},sf={class:"detail-meta"},of={class:"meta-row"},rf={class:"meta-source"},uf={key:0,class:"meta-desc"},cf={class:"meta-dir"},df={class:"content-wrapper"},pf={class:"content-header"},vf=["innerHTML"],mf={class:"modal-footer"},ff=Pl({__name:"SkillDetailModal",props:{visible:Boolean,skill:Object,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const i=e,d=a,p=w({get:()=>i.visible,set:e=>d("update:visible",e)}),m=l(!1),f=l(""),h=l(null),b=l(!1),k=l(!1),_=w(()=>{var e;if(!(null==(e=h.value)?void 0:e.content))return"";try{return _l(h.value.content,{breaks:!0,gfm:!0})}catch(a){return h.value.content}});async function C(){var e,a,l;if(null==(e=i.skill)?void 0:e.directory){m.value=!0,f.value="";try{const e=await async function(e,a="claude"){return(await dt.get(`/skills/detail/${e}`,{params:{platform:a}})).data}(i.skill.directory,i.platform);e.success?h.value=e:f.value=e.message||"加载失败"}catch(t){f.value=(null==(l=null==(a=t.response)?void 0:a.data)?void 0:l.message)||t.message||"加载失败"}finally{m.value=!1}}}async function U(){var e,a;if(i.skill){b.value=!0;try{(await As(i.skill.directory,{owner:i.skill.repoOwner,name:i.skill.repoName,branch:i.skill.repoBranch||"main"},i.skill.fullDirectory||null,i.platform)).success&&(Un.success("安装成功"),h.value&&(h.value.installed=!0),d("updated"))}catch(l){Un.error("安装失败: "+((null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message))}finally{b.value=!1}}}async function S(){var e,a;if(h.value){k.value=!0;try{(await Ls(h.value.directory,i.platform)).success&&(Un.success("卸载成功"),h.value&&(h.value.installed=!1),d("updated"))}catch(l){Un.error("卸载失败: "+((null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message))}finally{k.value=!1}}}async function z(){var e;if(null==(e=h.value)?void 0:e.content)try{const e=await no(h.value.content);if("manual"===(null==e?void 0:e.method))return void Un.warning("自动复制失败,已弹出手动复制框");Un.success("已复制到剪贴板")}catch{Un.error("复制失败")}}function I(){d("update:visible",!1)}return x(()=>i.visible,e=>{e&&i.skill?C():(h.value=null,f.value="")}),(a,l)=>{var i;return n(),g(c(ie),{show:p.value,"onUpdate:show":l[0]||(l[0]=e=>p.value=e),preset:"card",title:(null==(i=h.value)?void 0:i.name)||"技能详情",bordered:!1,closable:!0,style:{width:"700px","max-width":"90vw"},"content-style":"padding: 0; max-height: 60vh; overflow: hidden; display: flex; flex-direction: column;","footer-style":"padding: 16px 20px;",onClose:I},{footer:u(()=>{var a,t;return[s("div",mf,[r(c(K),{onClick:I},{default:u(()=>[...l[7]||(l[7]=[y("关闭",-1)])]),_:1}),h.value&&!h.value.installed&&(null==(a=e.skill)?void 0:a.repoOwner)?(n(),g(c(K),{key:0,type:"primary",loading:b.value,onClick:U},{default:u(()=>[...l[8]||(l[8]=[y(" 安装此技能 ",-1)])]),_:1},8,["loading"])):o("",!0),(null==(t=h.value)?void 0:t.installed)?(n(),g(c(K),{key:1,type:"error",tertiary:"",loading:k.value,onClick:S},{default:u(()=>[...l[9]||(l[9]=[y(" 卸载 ",-1)])]),_:1},8,["loading"])):o("",!0)])]}),default:u(()=>[m.value?(n(),t("div",lf,[r(c(Q),{size:"medium"}),l[1]||(l[1]=s("span",null,"加载中...",-1))])):f.value?(n(),t("div",tf,[r(c(q),{size:"48",color:"#d03050"},{default:u(()=>[r(c(Na))]),_:1}),s("span",null,v(f.value),1),r(c(K),{size:"small",onClick:C},{default:u(()=>[...l[2]||(l[2]=[y("重试",-1)])]),_:1})])):h.value?(n(),t("div",nf,[s("div",sf,[s("div",of,[h.value.installed?(n(),g(c(G),{key:0,type:"success",size:"small",bordered:!1},{default:u(()=>[...l[3]||(l[3]=[y(" 已安装 ",-1)])]),_:1})):(n(),g(c(G),{key:1,type:"default",size:"small",bordered:!1},{default:u(()=>[...l[4]||(l[4]=[y(" 未安装 ",-1)])]),_:1})),s("span",rf," 来源: "+v("local"===h.value.source?"本地":`${h.value.repoOwner}/${h.value.repoName}`),1)]),h.value.description?(n(),t("div",uf,v(h.value.description),1)):o("",!0),s("div",cf,[r(c(q),{size:"14"},{default:u(()=>[r(c(Ya))]),_:1}),s("code",null,v(h.value.directory),1)])]),s("div",df,[s("div",pf,[l[6]||(l[6]=s("span",{class:"content-title"},"技能内容",-1)),r(c(K),{text:"",size:"tiny",onClick:z},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(qa))]),_:1})]),default:u(()=>[l[5]||(l[5]=y(" 复制 ",-1))]),_:1})]),s("div",{class:"markdown-content",innerHTML:_.value},null,8,vf)])])):o("",!0)]),_:1},8,["show","title"])}}},[["__scopeId","data-v-f281a65d"]]),gf={key:0,class:"panel-header"},yf={class:"header-left"},hf={class:"header-right"},bf={key:1,class:"drawer-header-bar"},wf={class:"header-right"},kf={class:"stats-bar"},_f={class:"stats-text"},xf={class:"filter-bar"},Cf={class:"panel-content"},Uf={key:0,class:"empty-state"},Sf={key:1,class:"card-list"},zf={class:"panel-footer"},If=Pl({__name:"SkillsPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1},platform:{type:String,default:""}},emits:["back","updated"],setup(e){const a=e,i=M(),p=Ie(),h=l(!1),k=l([]),_=l(""),C=l("all"),U=l(!1),S=l(!1),z=l(!1),I=l(null),T=l({}),P=l({}),$=l({}),j=l({}),O=l(!1),A=l(0),L=w(()=>{if(a.platform&&["claude","codex","gemini","opencode"].includes(a.platform))return a.platform;const e=i.meta.channel;return"codex"===e||"gemini"===e||"opencode"===e?e:"claude"}),E=w(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[L.value]||"Claude Code")),D=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"},{label:"已托管",value:"managed"}],N=w(()=>k.value.filter(e=>e.installed).length),F=w(()=>Object.keys(j.value).length),R=w(()=>{let e=k.value;if("installed"===C.value?e=e.filter(e=>e.installed):"uninstalled"===C.value?e=e.filter(e=>!e.installed):"managed"===C.value&&(e=e.filter(e=>j.value[e.directory||e.name])),_.value.trim()){const a=_.value.toLowerCase();e=e.filter(e=>{var l,t;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))})}return[...e].sort((e,a)=>e.installed===a.installed?0:e.installed?-1:1)}),B=w(()=>_.value?"没有匹配的技能":"installed"===C.value?"暂无已安装的技能":"uninstalled"===C.value?"所有技能都已安装":"managed"===C.value?"暂无托管的技能":"暂无可用技能,请配置仓库源");async function H(e=!1){const a=++A.value,l=L.value;h.value=!0;try{const[t,n]=await Promise.all([Os(e,l),mm("skills")]);if(a!==A.value||l!==L.value)return;if(t.success&&(k.value=t.skills||[]),n.success){j.value={};for(const[e,a]of Object.entries(n.items||{}))j.value[e]=a}}catch(t){p.error("加载技能失败: "+t.message)}finally{a===A.value&&(h.value=!1)}}async function G(){if("claude"===L.value){O.value=!0;try{const e=await fm("skills");e.success?(p.success(`成功导入 ${e.imported} 个技能`),await H(!0)):p.error(e.message||"导入失败")}catch(e){p.error("导入失败: "+e.message)}finally{O.value=!1}}}async function W(e){if(!e.repoOwner)return p.error("缺少仓库信息");T.value[e.key]=!0;try{(await As(e.directory,{owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main"},e.fullDirectory||null,L.value)).success&&(p.success(`技能 "${e.name}" 安装成功`),await H(!0))}catch(a){p.error("安装失败: "+a.message)}finally{delete T.value[e.key]}}async function V(e){P.value[e.key]=!0;try{(await Ls(e.directory,L.value)).success&&(p.success(`技能 "${e.name}" 已卸载`),await H(!0))}catch(a){p.error("卸载失败: "+a.message)}finally{delete P.value[e.key]}}async function J(e,a){const l=e.directory||e.name;$.value[l]=!0;try{(await gm("skills",l,a)).success&&(p.success(a?"已启用":"已禁用"),await H(!0))}catch(t){p.error("切换失败: "+t.message)}finally{delete $.value[l]}}async function Z(e,a,l){const t=e.directory||e.name;$.value[t]=!0;try{(await ym("skills",t,a,l)).success&&(p.success(`${a} ${l?"已启用":"已禁用"}`),await H(!0))}catch(n){p.error("切换失败: "+n.message)}finally{delete $.value[t]}}function Y(e){I.value=e,z.value=!0}return b(()=>{a.inDrawer&&!a.drawerVisible||H()}),x(()=>a.drawerVisible,e=>{e&&H()}),x(()=>L.value,()=>{H()}),(a,l)=>(n(),t("div",{class:d(["skills-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?o("",!0):(n(),t("div",gf,[s("div",yf,[e.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[14]||(l[14]=s("span",{class:"panel-title"},"Skills 技能管理",-1))]),s("div",hf,[r(c(K),{text:"",focusable:!1,onClick:l[1]||(l[1]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[15]||(l[15]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:l[2]||(l[2]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[16]||(l[16]=y(" 仓库 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:G,loading:O.value,disabled:"claude"!==L.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Xa))]),_:1})]),default:u(()=>[l[17]||(l[17]=y(" 导入 ",-1))]),_:1},8,["loading","disabled"]),r(c(K),{text:"",focusable:!1,onClick:l[3]||(l[3]=e=>H(!0)),loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[18]||(l[18]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),t("div",bf,[s("div",wf,[r(c(K),{text:"",focusable:!1,onClick:l[4]||(l[4]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[19]||(l[19]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:l[5]||(l[5]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[20]||(l[20]=y(" 仓库 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:G,loading:O.value,disabled:"claude"!==L.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Xa))]),_:1})]),default:u(()=>[l[21]||(l[21]=y(" 导入 ",-1))]),_:1},8,["loading","disabled"]),r(c(K),{text:"",focusable:!1,onClick:l[6]||(l[6]=e=>H(!0)),loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[22]||(l[22]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",kf,[s("span",_f,[y(" 共 "+v(k.value.length)+" 个技能 ",1),k.value.length>0?(n(),t(m,{key:0},[y(" · 已安装: "+v(N.value)+" · 未安装: "+v(k.value.length-N.value)+" ",1),F.value>0?(n(),t(m,{key:0},[y(" · 托管: "+v(F.value),1)],64)):o("",!0)],64)):o("",!0)])]),s("div",xf,[r(c(re),{value:_.value,"onUpdate:value":l[7]||(l[7]=e=>_.value=e),placeholder:"搜索技能...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:C.value,"onUpdate:value":l[8]||(l[8]=e=>C.value=e),options:D,size:"small",class:"filter-select"},null,8,["value"])]),s("div",Cf,[r(c(Q),{show:h.value},{default:u(()=>[0!==R.value.length||h.value?(n(),t("div",Sf,[(n(!0),t(m,null,f(R.value,e=>(n(),g(Tm,{key:e.key,skill:e,installing:!!T.value[e.key],uninstalling:!!P.value[e.key],"registry-info":j.value[e.directory||e.name],toggling:!!$.value[e.directory||e.name],onInstall:W,onUninstall:V,onClick:Y,onToggleEnabled:J,onTogglePlatform:Z},null,8,["skill","installing","uninstalling","registry-info","toggling"]))),128))])):(n(),t("div",Uf,[r(c(ee),{description:B.value},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(Xe))]),_:1})]),extra:u(()=>[0===k.value.length?(n(),g(c(K),{key:0,size:"small",onClick:l[9]||(l[9]=e=>U.value=!0)},{default:u(()=>[...l[23]||(l[23]=[y("配置仓库源",-1)])]),_:1})):o("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),s("div",zf,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),s("span",null,"安装/卸载后需重启 "+v(E.value)+" 生效",1)]),r(Gm,{visible:U.value,"onUpdate:visible":l[10]||(l[10]=e=>U.value=e),platform:L.value,onUpdated:l[11]||(l[11]=e=>H(!0))},null,8,["visible","platform"]),r(af,{visible:S.value,"onUpdate:visible":l[12]||(l[12]=e=>S.value=e),platform:L.value,onCreated:H},null,8,["visible","platform"]),r(ff,{visible:z.value,"onUpdate:visible":l[13]||(l[13]=e=>z.value=e),skill:I.value,platform:L.value,onUpdated:H},null,8,["visible","skill","platform"])],2))}},[["__scopeId","data-v-bd5cfd0c"]]),Tf=Pl({__name:"SkillsDrawer",props:{visible:{type:Boolean,default:!1},platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(700,600),i=w({get:()=>l.visible,set:e=>t("update:visible",e)}),d={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1,"body-content-style":d},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},"技能管理",-1)])]),default:u(()=>[r(If,{"in-drawer":!0,"hide-back":!0,"drawer-visible":i.value,platform:l.platform,onBack:a[0]||(a[0]=e=>i.value=!1)},null,8,["drawer-visible","platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-c7c4ab18"]]);async function Pf(e=null,a="claude"){return(await dt.get("/commands",{params:e?{projectPath:e,platform:a}:{platform:a}})).data}const Mf={class:"card-main"},$f={class:"card-header"},jf={class:"command-name"},Of={class:"command-badges"},Af={key:0,class:"command-desc"},Lf={class:"command-meta"},Ef={key:0,class:"meta-item"},Df={key:1,class:"meta-item"},Nf={class:"card-actions"},Ff={class:"platform-icons"},Rf=Pl({__name:"CommandCard",props:{command:{type:Object,required:!0},deleting:{type:Boolean,default:!1},registryInfo:{type:Object,default:null},toggling:{type:Boolean,default:!1}},emits:["click","edit","delete","toggle-enabled","toggle-platform"],setup(e,{emit:a}){const l=e,i=a;return(a,f)=>{return n(),t("div",{class:d(["command-card",{"is-project":"project"===e.command.scope,managed:e.registryInfo}]),onClick:f[7]||(f[7]=a=>i("click",e.command))},[s("div",Mf,[s("div",$f,[s("div",jf,"/"+v(e.command.name),1),s("div",Of,[r(c(G),{type:"user"===e.command.scope?"info":"success",size:"tiny",bordered:!1},{default:u(()=>[y(v("user"===e.command.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),e.command.namespace?(n(),g(c(G),{key:0,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[y(v(e.command.namespace),1)]),_:1})):o("",!0)])]),e.command.description?(n(),t("div",Af,v((h=e.command.description,h?h.length>80?h.slice(0,80)+"...":h:"")),1)):o("",!0),s("div",Lf,[e.command.allowedTools?(n(),t("span",Ef,[r(c(q),{size:"12"},{default:u(()=>[r(c(al))]),_:1}),y(" "+v(e.command.allowedTools),1)])):o("",!0),e.command.argumentHint?(n(),t("span",Df,[r(c(q),{size:"12"},{default:u(()=>[r(c(ll))]),_:1}),y(" "+v(e.command.argumentHint),1)])):o("",!0)])]),s("div",Nf,[e.registryInfo?(n(),t(m,{key:0},[r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(W),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":f[0]||(f[0]=a=>i("toggle-enabled",e.command,a)),onClick:f[1]||(f[1]=p(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[y(" "+v(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),s("div",Ff,[r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.claude}]),onClick:f[2]||(f[2]=p(a=>{var l;return i("toggle-platform",e.command,"claude",!(null==(l=e.registryInfo.platforms)?void 0:l.claude))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(Va))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Claude Code "+v((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.codex}]),onClick:f[3]||(f[3]=p(a=>{var l;return i("toggle-platform",e.command,"codex",!(null==(l=e.registryInfo.platforms)?void 0:l.codex))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ea))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Codex CLI "+v((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.opencode}]),onClick:f[4]||(f[4]=p(a=>{var l;return i("toggle-platform",e.command,"opencode",!(null==(l=e.registryInfo.platforms)?void 0:l.opencode))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ua))]),_:1})],2)]}),default:u(()=>{var a;return[y(" OpenCode "+v((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1})])],64)):(n(),t(m,{key:1},[r(c(K),{size:"tiny",tertiary:"",onClick:f[5]||(f[5]=p(a=>i("edit",e.command),["stop"]))},{default:u(()=>[...f[8]||(f[8]=[y(" 编辑 ",-1)])]),_:1}),r(c(K),{size:"tiny",tertiary:"",type:"error",loading:l.deleting,onClick:f[6]||(f[6]=p(a=>i("delete",e.command),["stop"]))},{default:u(()=>[...f[9]||(f[9]=[y(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2);var h}}},[["__scopeId","data-v-781f3de3"]]),Bf={class:"modal-footer"},Hf=Pl({__name:"CommandFormModal",props:{visible:{type:Boolean,default:!1},command:{type:Object,default:null},projectPath:{type:String,default:null},platform:{type:String,default:"claude"}},emits:["update:visible","saved"],setup(e,{emit:a}){const t=e,i=a,d=w({get:()=>t.visible,set:e=>i("update:visible",e)}),p=w(()=>!!t.command),m=w(()=>"opencode"===t.platform?"用户级 (~/.config/opencode/commands/)":"用户级 (~/.claude/commands/)"),f=w(()=>"opencode"===t.platform?"项目级 (.opencode/commands/)":"项目级 (.claude/commands/)"),h=l(null),b=l(!1),k=l({name:"",scope:"user",namespace:"",description:"",allowedTools:"",argumentHint:"",body:""}),_={name:{required:!0,message:"请输入命令名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"}};function C(){k.value={name:"",scope:"user",namespace:"",description:"",allowedTools:"",argumentHint:"",body:""}}function U(){d.value=!1,C()}async function S(){var e;try{await(null==(e=h.value)?void 0:e.validate())}catch{return}b.value=!0;try{const e={...k.value,projectPath:t.projectPath};p.value?(await async function(e,a,l,t="claude"){return(await dt.put(`/commands/${a}/${e}`,{...l,platform:t})).data}(k.value.name,k.value.scope,e,t.platform),Un.success("命令更新成功")):(await async function(e,a="claude"){return(await dt.post("/commands",{...e,platform:a})).data}(e,t.platform),Un.success("命令创建成功")),i("saved"),d.value=!1,C()}catch(a){Un.error("操作失败: "+a.message)}finally{b.value=!1}}return x(()=>t.command,e=>{e?k.value={name:e.name||"",scope:e.scope||"user",namespace:e.namespace||"",description:e.description||"",allowedTools:e.allowedTools||"",argumentHint:e.argumentHint||"",body:e.body||""}:C()},{immediate:!0}),(e,a)=>(n(),g(c(ie),{show:d.value,"onUpdate:show":a[7]||(a[7]=e=>d.value=e),preset:"card",title:p.value?"编辑命令":"创建命令",style:{width:"600px","max-width":"95vw"},"mask-closable":!1},{footer:u(()=>[s("div",Bf,[r(c(K),{onClick:U},{default:u(()=>[...a[9]||(a[9]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:b.value,onClick:S},{default:u(()=>[y(v(p.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>[r(c(ae),{ref_key:"formRef",ref:h,model:k.value,rules:_,"label-placement":"left","label-width":"auto","require-mark-placement":"right-hanging"},{default:u(()=>[r(c(le),{label:"命令名",path:"name"},{default:u(()=>[r(c(re),{value:k.value.name,"onUpdate:value":a[0]||(a[0]=e=>k.value.name=e),disabled:p.value,placeholder:"如: deploy, test, build"},{prefix:u(()=>[...a[8]||(a[8]=[y("/",-1)])]),_:1},8,["value","disabled"])]),_:1}),r(c(le),{label:"作用域",path:"scope"},{default:u(()=>[r(c(ne),{value:k.value.scope,"onUpdate:value":a[1]||(a[1]=e=>k.value.scope=e),disabled:p.value},{default:u(()=>[r(c(oe),{value:"user"},{default:u(()=>[y(v(m.value),1)]),_:1}),r(c(oe),{value:"project"},{default:u(()=>[y(v(f.value),1)]),_:1})]),_:1},8,["value","disabled"])]),_:1}),r(c(le),{label:"命名空间",path:"namespace"},{default:u(()=>[r(c(re),{value:k.value.namespace,"onUpdate:value":a[2]||(a[2]=e=>k.value.namespace=e),disabled:p.value,placeholder:"可选,如: frontend, backend"},null,8,["value","disabled"])]),_:1}),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:k.value.description,"onUpdate:value":a[3]||(a[3]=e=>k.value.description=e),placeholder:"命令功能描述"},null,8,["value"])]),_:1}),"opencode"!==t.platform?(n(),g(c(le),{key:0,label:"允许的工具",path:"allowedTools"},{default:u(()=>[r(c(re),{value:k.value.allowedTools,"onUpdate:value":a[4]||(a[4]=e=>k.value.allowedTools=e),placeholder:"如: Bash, Edit, Read (逗号分隔)"},null,8,["value"])]),_:1})):o("",!0),"opencode"!==t.platform?(n(),g(c(le),{key:1,label:"参数提示",path:"argumentHint"},{default:u(()=>[r(c(re),{value:k.value.argumentHint,"onUpdate:value":a[5]||(a[5]=e=>k.value.argumentHint=e),placeholder:"如: add [id] | remove [id]"},null,8,["value"])]),_:1})):o("",!0),r(c(le),{label:"命令内容",path:"body"},{default:u(()=>[r(Up,{modelValue:k.value.body,"onUpdate:modelValue":a[6]||(a[6]=e=>k.value.body=e),rows:8,"min-height":180,placeholder:"命令的提示词内容,可使用 $ARGUMENTS、$1、$2 等变量\n\n示例:\n请执行以下操作: $ARGUMENTS\n\n! 开头的行会作为 bash 命令执行\n@ 开头的行会引用指定文件"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-6a32f36a"]]),qf={key:0,class:"panel-header"},Kf={class:"header-left"},Gf={class:"header-right"},Wf={key:1,class:"drawer-header-bar"},Vf={class:"header-right"},Jf={class:"stats-bar"},Zf={class:"stats-text"},Yf={class:"filter-bar"},Xf={class:"commands-content"},Qf={key:0,class:"empty-state"},eg={key:1,class:"commands-grid"},ag={class:"panel-footer"},lg={class:"detail-section"},tg=Pl({__name:"CommandsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null}},emits:["back","updated"],setup(e,{emit:a}){const i=e,p=a,h=M(),k=l([]),_=l(!1),C=l(""),U=l("all"),S=l(!1),z=l(!1),I=l(null),T=l(null),P=l({}),$=l({}),j=l({}),O=w(()=>{const e=h.meta.channel;return"codex"===e?"codex":"opencode"===e?"opencode":"claude"}),A=w(()=>"opencode"===O.value?"使用 /命令名 在 OpenCode 中调用":"使用 /命令名 在 Claude Code 中调用"),L=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],E=w(()=>k.value.filter(e=>"user"===e.scope).length),D=w(()=>k.value.filter(e=>"project"===e.scope).length),N=w(()=>Object.keys($.value).length),F=w(()=>{let e=k.value;if("user"===U.value?e=e.filter(e=>"user"===e.scope):"project"===U.value?e=e.filter(e=>"project"===e.scope):"managed"===U.value&&(e=e.filter(e=>$.value[e.name])),C.value.trim()){const a=C.value.toLowerCase();e=e.filter(e=>{var l,t,n;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))||(null==(n=e.namespace)?void 0:n.toLowerCase().includes(a))})}return e}),R=w(()=>C.value?"没有匹配的命令":"user"===U.value?"暂无用户级命令":"project"===U.value?"暂无项目级命令":"managed"===U.value?"暂无托管的命令":"暂无自定义命令");async function B(){_.value=!0;try{const[e,a]=await Promise.all([Pf(i.projectPath,O.value),mm("commands")]);if(e.success&&(k.value=e.commands||[]),a.success){$.value={};for(const[e,l]of Object.entries(a.items||{}))$.value[e]=l}}catch(e){Un.error("加载命令列表失败: "+e.message)}finally{_.value=!1}}async function H(e,a){j.value[e.name]=!0;try{(await gm("commands",e.name,a)).success&&(Un.success(a?"已启用":"已禁用"),await B())}catch(l){Un.error("切换失败: "+l.message)}finally{delete j.value[e.name]}}async function G(e,a,l){j.value[e.name]=!0;try{(await ym("commands",e.name,a,l)).success&&(Un.success(`${a} ${l?"已启用":"已禁用"}`),await B())}catch(t){Un.error("切换失败: "+t.message)}finally{delete j.value[e.name]}}async function W(){_.value=!0;try{const e=await hm("commands");(null==e?void 0:e.success)||Un.warning((null==e?void 0:e.message)||"同步失败,已继续刷新列表")}catch(e){Un.warning("同步失败,已继续刷新列表: "+e.message)}await B()}function V(e){T.value=e,S.value=!0}async function J(e){P.value[e.path]=!0;try{(await async function(e,a,l=null,t=null,n="claude"){const s={};return n&&(s.platform=n),l&&(s.projectPath=l),t&&(s.namespace=t),(await dt.delete(`/commands/${a}/${e}`,{params:s})).data}(e.name,e.scope,i.projectPath,e.namespace,O.value)).success&&(Un.success("命令已删除"),await B(),p("updated"))}catch(a){Un.error("删除失败: "+a.message)}finally{delete P.value[e.path]}}function Z(e){I.value=e,z.value=!0}function Y(){T.value=null,B(),p("updated")}function X(){p("back")}return b(()=>{B()}),x(O,()=>{B()}),(a,l)=>(n(),t("div",{class:d(["commands-panel",{"in-drawer":i.inDrawer}])},[i.inDrawer?o("",!0):(n(),t("div",qf,[s("div",Kf,[i.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:X,class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[7]||(l[7]=s("span",{class:"panel-title"},"Custom Commands",-1))]),s("div",Gf,[r(c(K),{text:"",onClick:l[0]||(l[0]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:W,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[9]||(l[9]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),i.inDrawer?(n(),t("div",Wf,[s("div",Vf,[r(c(K),{text:"",onClick:l[1]||(l[1]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[10]||(l[10]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:W,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[11]||(l[11]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Jf,[s("span",Zf,[y(" 共 "+v(k.value.length)+" 个命令 ",1),k.value.length>0?(n(),t(m,{key:0},[y(" · 用户级: "+v(E.value)+" · 项目级: "+v(D.value)+" ",1),N.value>0?(n(),t(m,{key:0},[y(" · 托管: "+v(N.value),1)],64)):o("",!0)],64)):o("",!0)])]),s("div",Yf,[r(c(re),{value:C.value,"onUpdate:value":l[2]||(l[2]=e=>C.value=e),placeholder:"搜索命令...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:U.value,"onUpdate:value":l[3]||(l[3]=e=>U.value=e),options:L,size:"small",class:"filter-select"},null,8,["value"])]),s("div",Xf,[r(c(Q),{show:_.value},{default:u(()=>[0!==F.value.length||_.value?(n(),t("div",eg,[(n(!0),t(m,null,f(F.value,e=>(n(),g(Rf,{key:e.path,command:e,deleting:!!P.value[e.path],"registry-info":$.value[e.name],toggling:!!j.value[e.name],onEdit:V,onDelete:J,onClick:Z,onToggleEnabled:H,onTogglePlatform:G},null,8,["command","deleting","registry-info","toggling"]))),128))])):(n(),t("div",Qf,[r(c(ee),{description:R.value},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(ea))]),_:1})]),extra:u(()=>[r(c(K),{size:"small",onClick:l[4]||(l[4]=e=>S.value=!0)},{default:u(()=>[...l[12]||(l[12]=[y(" 创建第一个命令 ",-1)])]),_:1})]),_:1},8,["description"])]))]),_:1},8,["show"])]),s("div",ag,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),s("span",null,v(A.value),1)]),r(Hf,{visible:S.value,"onUpdate:visible":l[5]||(l[5]=e=>S.value=e),command:T.value,"project-path":e.projectPath,platform:O.value,onSaved:Y},null,8,["visible","command","project-path","platform"]),r(c(pe),{show:z.value,"onUpdate:show":l[6]||(l[6]=e=>z.value=e),width:500},{default:u(()=>{var e;return[r(c(de),{title:(null==(e=I.value)?void 0:e.name)?"/"+I.value.name:"命令详情"},{default:u(()=>[I.value?(n(),t(m,{key:0},[r(c(Te),{bordered:"",column:1},{default:u(()=>[r(c(Pe),{label:"作用域"},{default:u(()=>[y(v("user"===I.value.scope?"用户级":"项目级"),1)]),_:1}),I.value.namespace?(n(),g(c(Pe),{key:0,label:"命名空间"},{default:u(()=>[y(v(I.value.namespace),1)]),_:1})):o("",!0),I.value.description?(n(),g(c(Pe),{key:1,label:"描述"},{default:u(()=>[y(v(I.value.description),1)]),_:1})):o("",!0),I.value.allowedTools?(n(),g(c(Pe),{key:2,label:"允许的工具"},{default:u(()=>[y(v(I.value.allowedTools),1)]),_:1})):o("",!0),I.value.argumentHint?(n(),g(c(Pe),{key:3,label:"参数提示"},{default:u(()=>[y(v(I.value.argumentHint),1)]),_:1})):o("",!0)]),_:1}),s("div",lg,[l[13]||(l[13]=s("h4",null,"命令内容",-1)),r(c(be),{code:I.value.body||"(无内容)",language:"markdown","word-wrap":""},null,8,["code"])])],64)):o("",!0)]),_:1},8,["title"])]}),_:1},8,["show"])],2))}},[["__scopeId","data-v-ab0f3567"]]),ng=Pl({__name:"CommandsDrawer",props:{visible:Boolean},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(520),i=w({get:()=>l.visible,set:e=>t("update:visible",e)});return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:""},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},[s("span",null,"Custom Commands")],-1)])]),default:u(()=>[r(tg,{onBack:a[0]||(a[0]=e=>i.value=!1),"hide-back":!0,"in-drawer":!0})]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-d2a0745d"]]);async function sg(e=null,a="claude"){return(await dt.get("/agents",{params:e?{projectPath:e,platform:a}:{platform:a}})).data}const og={class:"card-main"},ig={class:"card-header"},rg={class:"agent-name"},ug={class:"agent-badges"},cg={key:0,class:"agent-desc"},dg={class:"agent-meta"},pg={key:0,class:"meta-item"},vg={key:1,class:"meta-item"},mg={class:"card-actions"},fg={class:"platform-icons"},gg=Pl({__name:"AgentCard",props:{agent:{type:Object,required:!0},deleting:{type:Boolean,default:!1},registryInfo:{type:Object,default:null},toggling:{type:Boolean,default:!1}},emits:["click","edit","delete","toggle-enabled","toggle-platform"],setup(e,{emit:a}){const l=e,i=a;return(a,f)=>{return n(),t("div",{class:d(["agent-card",{"is-project":"project"===e.agent.scope,managed:e.registryInfo}]),onClick:f[7]||(f[7]=a=>i("click",e.agent))},[s("div",og,[s("div",ig,[s("div",rg,v(e.agent.name),1),s("div",ug,[r(c(G),{type:"user"===e.agent.scope?"info":"success",size:"tiny",bordered:!1},{default:u(()=>[y(v("user"===e.agent.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),e.agent.model?(n(),g(c(G),{key:0,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[y(v(e.agent.model),1)]),_:1})):o("",!0)])]),e.agent.description?(n(),t("div",cg,v((b=e.agent.description,b?b.length>80?b.slice(0,80)+"...":b:"")),1)):o("",!0),s("div",dg,[e.agent.tools?(n(),t("span",pg,[r(c(q),{size:"12"},{default:u(()=>[r(c(al))]),_:1}),y(" "+v((h=e.agent.tools,h?h.length>30?h.slice(0,30)+"...":h:"")),1)])):o("",!0),e.agent.permissionMode?(n(),t("span",vg,[r(c(q),{size:"12"},{default:u(()=>[r(c(tl))]),_:1}),y(" "+v(e.agent.permissionMode),1)])):o("",!0)])]),s("div",mg,[e.registryInfo?(n(),t(m,{key:0},[r(c(ce),{trigger:"hover"},{trigger:u(()=>[r(c(W),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":f[0]||(f[0]=a=>i("toggle-enabled",e.agent,a)),onClick:f[1]||(f[1]=p(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[y(" "+v(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),s("div",fg,[r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.claude}]),onClick:f[2]||(f[2]=p(a=>{var l;return i("toggle-platform",e.agent,"claude",!(null==(l=e.registryInfo.platforms)?void 0:l.claude))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(Va))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Claude Code "+v((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.codex}]),onClick:f[3]||(f[3]=p(a=>{var l;return i("toggle-platform",e.agent,"codex",!(null==(l=e.registryInfo.platforms)?void 0:l.codex))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ea))]),_:1})],2)]}),default:u(()=>{var a;return[y(" Codex CLI "+v((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),r(c(ce),{trigger:"hover"},{trigger:u(()=>{var a;return[s("span",{class:d(["platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.opencode}]),onClick:f[4]||(f[4]=p(a=>{var l;return i("toggle-platform",e.agent,"opencode",!(null==(l=e.registryInfo.platforms)?void 0:l.opencode))},["stop"]))},[r(c(q),{size:"14"},{default:u(()=>[r(c(ua))]),_:1})],2)]}),default:u(()=>{var a;return[y(" OpenCode "+v((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1})])],64)):(n(),t(m,{key:1},[r(c(K),{size:"tiny",tertiary:"",onClick:f[5]||(f[5]=p(a=>i("edit",e.agent),["stop"]))},{default:u(()=>[...f[8]||(f[8]=[y(" 编辑 ",-1)])]),_:1}),r(c(K),{size:"tiny",tertiary:"",type:"error",loading:l.deleting,onClick:f[6]||(f[6]=p(a=>i("delete",e.agent),["stop"]))},{default:u(()=>[...f[9]||(f[9]=[y(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2);var h,b}}},[["__scopeId","data-v-617694f2"]]),yg={class:"modal-footer"},hg=Pl({__name:"AgentFormModal",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},projectPath:{type:String,default:null},platform:{type:String,default:"claude"}},emits:["update:visible","saved"],setup(e,{emit:a}){const t=e,i=a,d=w({get:()=>t.visible,set:e=>i("update:visible",e)}),p=w(()=>!!t.agent),m=w(()=>"codex"===t.platform),f=w(()=>"claude"===t.platform),h=w(()=>"codex"===t.platform||"opencode"===t.platform),b=w(()=>"codex"===t.platform?"用户级 (~/.codex/config.toml)":"opencode"===t.platform?"用户级 (~/.config/opencode/agents/)":"用户级 (~/.claude/agents/)"),k=w(()=>"opencode"===t.platform?"项目级 (.opencode/agents/)":"项目级 (.claude/agents/)"),_=l(null),C=l(!1),U=[{label:"Sonnet",value:"sonnet"},{label:"Opus",value:"opus"},{label:"Haiku",value:"haiku"},{label:"继承 (inherit)",value:"inherit"}],S=[{label:"默认 (default)",value:"default"},{label:"宽松 (permissive)",value:"permissive"},{label:"严格 (strict)",value:"strict"}],z=[{label:"无配置 (none)",value:"none"},{label:"托管配置 (managed)",value:"managed"},{label:"自定义路径 (custom)",value:"custom"}],I=l({fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}),T=w(()=>{const e={fileName:{required:!0,message:"请输入文件名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"},description:{required:!0,message:"请输入代理描述",trigger:"blur"}};return f.value&&(e.name={required:!0,message:"请输入代理名称",trigger:"blur"}),m.value&&(e.configMode={required:!0,message:"请选择配置模式",trigger:"change"},e.configFile={required:"custom"===I.value.configMode,message:"请输入自定义配置文件路径",trigger:"blur"}),e});function P(){I.value={fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}}function M(){d.value=!1,P()}async function $(){var e;try{await(null==(e=_.value)?void 0:e.validate())}catch{return}C.value=!0;try{const e={...I.value,projectPath:t.projectPath};m.value?("custom"===I.value.configMode?e.configFile=I.value.configFile:delete e.configFile,"managed"===I.value.configMode||"custom"===I.value.configMode?e.configContent=I.value.configContent||"":delete e.configContent):(delete e.configMode,delete e.configFile,delete e.configContent),p.value?(await async function(e,a,l,t="claude"){return(await dt.put(`/agents/${a}/${e}`,{...l,platform:t})).data}(I.value.fileName,I.value.scope,e,t.platform),Un.success("代理更新成功")):(await async function(e,a="claude"){return(await dt.post("/agents",{...e,platform:a})).data}(e,t.platform),Un.success("代理创建成功")),i("saved"),d.value=!1,P()}catch(a){Un.error("操作失败: "+a.message)}finally{C.value=!1}}return x(()=>t.agent,e=>{if(e){const a=e.configMode||(e.configFile?String(e.configFile).includes("/.codex/agents/")?"managed":"custom":"none");I.value={fileName:e.fileName||"",scope:e.scope||"user",name:e.name||"",description:e.description||"",configMode:a,configFile:e.configFile||"",configContent:e.fullContent||"",tools:e.tools||"",model:e.model||"",permissionMode:e.permissionMode||"",skills:e.skills||"",systemPrompt:e.systemPrompt||""}}else P()},{immediate:!0}),x(()=>t.platform,e=>{"codex"===e&&(I.value.scope="user",I.value.configMode||(I.value.configMode="none"))},{immediate:!0}),(e,a)=>(n(),g(c(ie),{show:d.value,"onUpdate:show":a[13]||(a[13]=e=>d.value=e),preset:"card",title:p.value?"编辑代理":"创建代理",style:{width:"650px","max-width":"95vw"},"mask-closable":!1},{footer:u(()=>[s("div",yg,[r(c(K),{onClick:M},{default:u(()=>[...a[14]||(a[14]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:C.value,onClick:$},{default:u(()=>[y(v(p.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>[r(c(ae),{ref_key:"formRef",ref:_,model:I.value,rules:T.value,"label-placement":"left","label-width":"auto","require-mark-placement":"right-hanging"},{default:u(()=>[r(c(le),{label:"文件名",path:"fileName"},{default:u(()=>[r(c(re),{value:I.value.fileName,"onUpdate:value":a[0]||(a[0]=e=>I.value.fileName=e),disabled:p.value,placeholder:"如: code-reviewer, deploy-helper"},null,8,["value","disabled"])]),_:1}),r(c(le),{label:"作用域",path:"scope"},{default:u(()=>[r(c(ne),{value:I.value.scope,"onUpdate:value":a[1]||(a[1]=e=>I.value.scope=e),disabled:p.value},{default:u(()=>[r(c(oe),{value:"user"},{default:u(()=>[y(v(b.value),1)]),_:1}),m.value?o("",!0):(n(),g(c(oe),{key:0,value:"project"},{default:u(()=>[y(v(k.value),1)]),_:1}))]),_:1},8,["value","disabled"])]),_:1}),f.value?(n(),g(c(le),{key:0,label:"代理名称",path:"name"},{default:u(()=>[r(c(re),{value:I.value.name,"onUpdate:value":a[2]||(a[2]=e=>I.value.name=e),placeholder:"代理的显示名称"},null,8,["value"])]),_:1})):o("",!0),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:I.value.description,"onUpdate:value":a[3]||(a[3]=e=>I.value.description=e),type:"textarea",rows:2,placeholder:"代理用途描述(必填)"},null,8,["value"])]),_:1}),m.value?(n(),g(c(le),{key:1,label:"配置模式",path:"configMode"},{default:u(()=>[r(c(te),{value:I.value.configMode,"onUpdate:value":a[4]||(a[4]=e=>I.value.configMode=e),options:z,placeholder:"选择配置模式"},null,8,["value"])]),_:1})):o("",!0),m.value&&"custom"===I.value.configMode?(n(),g(c(le),{key:2,label:"配置文件路径",path:"configFile"},{default:u(()=>[r(c(re),{value:I.value.configFile,"onUpdate:value":a[5]||(a[5]=e=>I.value.configFile=e),placeholder:"如: ~/.omx/agents/my-agent.toml"},null,8,["value"])]),_:1})):o("",!0),!m.value||"managed"!==I.value.configMode&&"custom"!==I.value.configMode?o("",!0):(n(),g(c(le),{key:3,label:"Agent Config (TOML)",path:"configContent"},{default:u(()=>[r(c(re),{value:I.value.configContent,"onUpdate:value":a[6]||(a[6]=e=>I.value.configContent=e),type:"textarea",rows:10,placeholder:'如: model = "gpt-5.3-codex"'},null,8,["value"])]),_:1})),m.value?o("",!0):(n(),g(c(le),{key:4,label:"可用工具",path:"tools"},{default:u(()=>[r(c(re),{value:I.value.tools,"onUpdate:value":a[7]||(a[7]=e=>I.value.tools=e),placeholder:"如: Read, Edit, Bash (逗号分隔)"},null,8,["value"])]),_:1})),m.value?o("",!0):(n(),g(c(le),{key:5,label:"模型",path:"model"},{default:u(()=>[h.value?(n(),g(c(re),{key:0,value:I.value.model,"onUpdate:value":a[8]||(a[8]=e=>I.value.model=e),placeholder:"如: gpt-5、claude-sonnet-4、openrouter/model"},null,8,["value"])):(n(),g(c(te),{key:1,value:I.value.model,"onUpdate:value":a[9]||(a[9]=e=>I.value.model=e),options:U,placeholder:"选择模型",clearable:""},null,8,["value"]))]),_:1})),"opencode"===t.platform||m.value?o("",!0):(n(),g(c(le),{key:6,label:"权限模式",path:"permissionMode"},{default:u(()=>[r(c(te),{value:I.value.permissionMode,"onUpdate:value":a[10]||(a[10]=e=>I.value.permissionMode=e),options:S,placeholder:"选择权限模式",clearable:""},null,8,["value"])]),_:1})),"opencode"===t.platform||m.value?o("",!0):(n(),g(c(le),{key:7,label:"技能",path:"skills"},{default:u(()=>[r(c(re),{value:I.value.skills,"onUpdate:value":a[11]||(a[11]=e=>I.value.skills=e),placeholder:"自动加载的技能 (逗号分隔)"},null,8,["value"])]),_:1})),m.value?o("",!0):(n(),g(c(le),{key:8,label:"系统提示词",path:"systemPrompt"},{default:u(()=>[r(Up,{modelValue:I.value.systemPrompt,"onUpdate:modelValue":a[12]||(a[12]=e=>I.value.systemPrompt=e),rows:8,"min-height":180,placeholder:"代理的系统提示词,定义代理的行为和能力"},null,8,["modelValue"])]),_:1}))]),_:1},8,["model","rules"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-8ce8fb85"]]),bg={key:0,class:"panel-header"},wg={class:"header-left"},kg={class:"header-right"},_g={key:1,class:"drawer-header-bar"},xg={class:"header-right"},Cg={class:"stats-bar"},Ug={class:"stats-text"},Sg={class:"filter-bar"},zg={class:"agents-content"},Ig={key:0,class:"empty-state"},Tg={key:1,class:"agents-grid"},Pg={class:"panel-footer"},Mg={class:"detail-section"},$g=Pl({__name:"AgentsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null}},emits:["back","updated"],setup(e,{emit:a}){const i=e,p=a,h=M(),k=l([]),_=l(!1),C=l(""),U=l("all"),S=l(!1),z=l(!1),I=l(null),T=l(!1),P=l(null),$=l({}),j=l({}),O=l({}),A=w(()=>{const e=h.meta.channel;return"codex"===e?"codex":"opencode"===e?"opencode":"claude"}),L=w(()=>"opencode"===A.value?"使用 @agent 或 Task 在 OpenCode 中调用":"使用 Task tool 调用自定义代理"),E=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],D=w(()=>k.value.filter(e=>"user"===e.scope).length),N=w(()=>k.value.filter(e=>"project"===e.scope).length),F=w(()=>Object.keys(j.value).length);function R(e){if(!e)return"";const a="string"==typeof e.scope&&e.scope.trim()?e.scope.trim():"unknown",l="string"==typeof e.path&&e.path.trim()?e.path.trim():"",t="string"==typeof e.fileName&&e.fileName.trim()?e.fileName.trim():"";return`${a}:${l||t}`}function B(e){if(!e)return"";const a=[];if("string"==typeof e.path&&e.path.trim()&&a.push(e.path.trim()),"string"==typeof e.fileName&&e.fileName.trim()){const l=e.fileName.trim();a.push(`${l}.md`,l)}"string"==typeof e.name&&e.name.trim()&&a.push(e.name.trim());for(const l of a)if(j.value[l])return l;return a[0]||""}const H=w(()=>{let e=k.value;if("user"===U.value?e=e.filter(e=>"user"===e.scope):"project"===U.value?e=e.filter(e=>"project"===e.scope):"managed"===U.value&&(e=e.filter(e=>j.value[B(e)])),C.value.trim()){const a=C.value.toLowerCase();e=e.filter(e=>{var l,t,n;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))||(null==(n=e.fileName)?void 0:n.toLowerCase().includes(a))})}return e}),G=w(()=>C.value?"没有匹配的代理":"user"===U.value?"暂无用户级代理":"project"===U.value?"暂无项目级代理":"managed"===U.value?"暂无托管的代理":"暂无自定义代理");async function W(){_.value=!0;try{const[e,a]=await Promise.all([sg(i.projectPath,A.value),mm("agents")]);if(e.success&&(k.value=e.agents||[]),a.success){j.value={};for(const[e,l]of Object.entries(a.items||{}))j.value[e]=l}}catch(e){Un.error("加载代理列表失败: "+e.message)}finally{_.value=!1}}async function V(e,a){const l=B(e);if(l){O.value[l]=!0;try{(await gm("agents",l,a)).success&&(Un.success(a?"已启用":"已禁用"),await W())}catch(t){Un.error("切换失败: "+t.message)}finally{delete O.value[l]}}else Un.error("未找到代理对应的托管配置键")}async function J(e,a,l){const t=B(e);if(t){O.value[t]=!0;try{(await ym("agents",t,a,l)).success&&(Un.success(`${a} ${l?"已启用":"已禁用"}`),await W())}catch(n){Un.error("切换失败: "+n.message)}finally{delete O.value[t]}}else Un.error("未找到代理对应的托管配置键")}async function Z(){_.value=!0;try{const e=await hm("agents");(null==e?void 0:e.success)||Un.warning((null==e?void 0:e.message)||"同步失败,已继续刷新列表")}catch(e){Un.warning("同步失败,已继续刷新列表: "+e.message)}await W()}function Y(){P.value=null,S.value=!0}function X(e){S.value=e,e||(P.value=null)}function ae(e){ne(e,!0)}async function le(e){const a=R(e);$.value[a]=!0;try{(await async function(e,a,l=null,t="claude"){const n={};return t&&(n.platform=t),l&&(n.projectPath=l),(await dt.delete(`/agents/${a}/${e}`,{params:n})).data}(e.fileName,e.scope,i.projectPath,A.value)).success&&(Un.success("代理已删除"),await W(),p("updated"))}catch(l){Un.error("删除失败: "+l.message)}finally{delete $.value[a]}}async function ne(e,a=!1){if(e){if("codex"!==A.value)return a?(P.value=e,void(S.value=!0)):(I.value=e,void(z.value=!0));T.value=!0,a||(I.value=null,z.value=!0);try{const l=await async function(e,a,l=null,t="claude"){const n={};return t&&(n.platform=t),l&&(n.projectPath=l),(await dt.get(`/agents/${a}/${e}`,{params:n})).data}(e.fileName,e.scope,i.projectPath,A.value),t=(null==l?void 0:l.agent)||e;a?(P.value=t,S.value=!0):I.value=t}catch(l){Un.error("加载代理详情失败: "+l.message),a?(P.value=e,S.value=!0):I.value=e}finally{T.value=!1}}}function se(e){ne(e,!1)}function oe(){P.value=null,W(),p("updated")}function ie(){p("back")}return b(()=>{W()}),x(A,()=>{W()}),(a,l)=>(n(),t("div",{class:d(["agents-panel",{"in-drawer":i.inDrawer}])},[i.inDrawer?o("",!0):(n(),t("div",bg,[s("div",wg,[i.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:ie,class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[3]||(l[3]=s("span",{class:"panel-title"},"Custom Agents",-1))]),s("div",kg,[r(c(K),{text:"",onClick:Y,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[4]||(l[4]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:Z,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[5]||(l[5]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),i.inDrawer?(n(),t("div",_g,[s("div",xg,[r(c(K),{text:"",onClick:Y,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[6]||(l[6]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:Z,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[7]||(l[7]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Cg,[s("span",Ug,[y(" 共 "+v(k.value.length)+" 个代理 ",1),k.value.length>0?(n(),t(m,{key:0},[y(" · 用户级: "+v(D.value)+" · 项目级: "+v(N.value)+" ",1),F.value>0?(n(),t(m,{key:0},[y(" · 托管: "+v(F.value),1)],64)):o("",!0)],64)):o("",!0)])]),s("div",Sg,[r(c(re),{value:C.value,"onUpdate:value":l[0]||(l[0]=e=>C.value=e),placeholder:"搜索代理...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:U.value,"onUpdate:value":l[1]||(l[1]=e=>U.value=e),options:E,size:"small",class:"filter-select"},null,8,["value"])]),s("div",zg,[r(c(Q),{show:_.value},{default:u(()=>[0!==H.value.length||_.value?(n(),t("div",Tg,[(n(!0),t(m,null,f(H.value,e=>(n(),g(gg,{key:R(e),agent:e,deleting:!!$.value[R(e)],"registry-info":j.value[B(e)],toggling:!!O.value[B(e)],onEdit:ae,onDelete:le,onClick:se,onToggleEnabled:V,onTogglePlatform:J},null,8,["agent","deleting","registry-info","toggling"]))),128))])):(n(),t("div",Ig,[r(c(ee),{description:G.value},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(aa))]),_:1})]),extra:u(()=>[r(c(K),{size:"small",onClick:Y},{default:u(()=>[...l[8]||(l[8]=[y(" 创建第一个代理 ",-1)])]),_:1})]),_:1},8,["description"])]))]),_:1},8,["show"])]),s("div",Pg,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),s("span",null,v(L.value),1)]),r(hg,{visible:S.value,"onUpdate:visible":X,agent:P.value,"project-path":e.projectPath,platform:A.value,onSaved:oe},null,8,["visible","agent","project-path","platform"]),r(c(pe),{show:z.value,"onUpdate:show":l[2]||(l[2]=e=>z.value=e),width:550},{default:u(()=>{var e;return[r(c(de),{title:(null==(e=I.value)?void 0:e.name)||"代理详情"},{default:u(()=>[I.value?(n(),t(m,{key:0},["codex"===A.value&&I.value.configReadError?(n(),g(c(fe),{key:0,type:"warning",bordered:!1,style:{"margin-bottom":"12px"}},{default:u(()=>[y(v(I.value.configReadError),1)]),_:1})):o("",!0),r(c(Te),{bordered:"",column:1},{default:u(()=>[r(c(Pe),{label:"作用域"},{default:u(()=>[y(v("user"===I.value.scope?"用户级":"项目级"),1)]),_:1}),r(c(Pe),{label:"文件名"},{default:u(()=>[y(v("codex"===A.value?`[agents.${I.value.fileName}]`:`${I.value.fileName}.md`),1)]),_:1}),"codex"===A.value&&I.value.configFile?(n(),g(c(Pe),{key:0,label:"config_file"},{default:u(()=>[y(v(I.value.configFile),1)]),_:1})):o("",!0),I.value.description?(n(),g(c(Pe),{key:1,label:"描述"},{default:u(()=>[y(v(I.value.description),1)]),_:1})):o("",!0),I.value.tools?(n(),g(c(Pe),{key:2,label:"可用工具"},{default:u(()=>[y(v(I.value.tools),1)]),_:1})):o("",!0),I.value.model?(n(),g(c(Pe),{key:3,label:"模型"},{default:u(()=>[y(v(I.value.model),1)]),_:1})):o("",!0),I.value.permissionMode?(n(),g(c(Pe),{key:4,label:"权限模式"},{default:u(()=>[y(v(I.value.permissionMode),1)]),_:1})):o("",!0),I.value.skills?(n(),g(c(Pe),{key:5,label:"技能"},{default:u(()=>[y(v(I.value.skills),1)]),_:1})):o("",!0)]),_:1}),s("div",Mg,[s("h4",null,v("codex"===A.value?"Agent Config (TOML)":"系统提示词"),1),r(c(be),{code:"codex"===A.value?I.value.fullContent||"(无内容)":I.value.systemPrompt||"(无内容)",language:"codex"===A.value?"toml":"markdown","word-wrap":""},null,8,["code","language"])])],64)):T.value?(n(),g(c(Q),{key:1,show:!0,size:"small"})):o("",!0)]),_:1},8,["title"])]}),_:1},8,["show"])],2))}},[["__scopeId","data-v-8222e230"]]),jg=Pl({__name:"AgentsDrawer",props:{visible:Boolean},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(520),i=w({get:()=>l.visible,set:e=>t("update:visible",e)});return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:""},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},[s("span",null,"Custom Agents")],-1)])]),default:u(()=>[r($g,{onBack:a[0]||(a[0]=e=>i.value=!1),"hide-back":!0,"in-drawer":!0})]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-deb60bdb"]]);async function Og(e,a,l="claude",t=""){const n={platform:l};t?n.source=t:(n.directory=e,n.repo=a);return(await dt.post("/plugins/install",n)).data}async function Ag(e,a="claude"){return(await dt.post("/plugins/repos",{...e,platform:a})).data}async function Lg(e="claude"){return(await dt.post("/plugins/repos/sync",{platform:e})).data}const Eg={class:"card-header"},Dg={class:"card-title"},Ng={class:"name"},Fg={class:"card-body"},Rg={key:0,class:"description"},Bg={class:"meta"},Hg={class:"meta-item"},qg=["href"],Kg=Pl({__name:"PluginCard",props:{plugin:{type:Object,required:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1}},emits:["click","install","uninstall"],setup:e=>(a,l)=>{return n(),t("div",{class:d(["plugin-card",{installed:e.plugin.installed}]),onClick:l[4]||(l[4]=l=>a.$emit("click",e.plugin))},[s("div",Eg,[s("div",Dg,[s("span",Ng,v(e.plugin.name),1),e.plugin.installed?(n(),g(c(G),{key:0,type:"info",size:"small"},{default:u(()=>[...l[5]||(l[5]=[y("已安装",-1)])]),_:1})):o("",!0),e.plugin.repoOwner?(n(),g(c(G),{key:1,type:"info",size:"small"},{default:u(()=>[y(v(e.plugin.repoOwner),1)]),_:1})):o("",!0)]),s("div",{class:"card-actions",onClick:l[2]||(l[2]=p(()=>{},["stop"]))},[e.plugin.installed?(n(),g(c(K),{key:0,size:"small",type:"error",loading:e.uninstalling,focusable:!1,onClick:l[0]||(l[0]=l=>a.$emit("uninstall",e.plugin))},{default:u(()=>[...l[6]||(l[6]=[y("卸载",-1)])]),_:1},8,["loading"])):(n(),g(c(K),{key:1,size:"small",type:"primary",loading:e.installing,disabled:(m=e.plugin,!((null==m?void 0:m.installSource)||(null==m?void 0:m.repoOwner))),focusable:!1,onClick:l[1]||(l[1]=l=>a.$emit("install",e.plugin))},{default:u(()=>[...l[7]||(l[7]=[y("安装",-1)])]),_:1},8,["loading","disabled"]))])]),s("div",Fg,[e.plugin.description?(n(),t("div",Rg,v((i=e.plugin.description,r=80,(null==i?void 0:i.length)>r?i.slice(0,r)+"...":i)),1)):o("",!0),s("div",Bg,[s("span",Hg,v(e.plugin.directory),1),e.plugin.readmeUrl?(n(),t("a",{key:0,class:"meta-link",href:e.plugin.readmeUrl,target:"_blank",onClick:l[3]||(l[3]=p(()=>{},["stop"]))},"GitHub",8,qg)):o("",!0)])])],2);var i,r,m}},[["__scopeId","data-v-ab48155d"]]),Gg={class:"repo-manager"},Wg={class:"repo-list"},Vg={class:"repo-main"},Jg={class:"repo-info"},Zg={class:"repo-name"},Yg={class:"repo-branch"},Xg={key:0,class:"empty-hint"},Qg={class:"add-repo"},ey={class:"add-form"},ay={class:"tips"},ly={class:"recommended"},ty={class:"recommended-list"},ny=["onClick"],sy={class:"rec-info"},oy={class:"rec-name"},iy={class:"rec-desc"},ry=Pl({__name:"PluginRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const i=e,p=a,h=w({get:()=>i.visible,set:e=>p("update:visible",e)}),k=l([]),_=l(!1),C=l(!1),U=l(!1),S=l({input:"",branch:"main"}),z=w(()=>"opencode"===i.platform?[{owner:"awesome-opencode",name:"awesome-opencode",url:"https://github.com/awesome-opencode/awesome-opencode",description:"OpenCode 生态聚合",branch:"main"},{owner:"sst",name:"opencode",url:"https://github.com/sst/opencode",description:"OpenCode 官方仓库",branch:"dev"}]:[{owner:"anthropics",name:"claude-plugins-official",url:"https://github.com/anthropics/claude-plugins-official",description:"官方插件库",branch:"main"}]),I=w(()=>{const e=S.value.input.trim();if(!e)return!1;if(e.includes("github.com"))return e.match(/github\.com\/([^\/]+)\/([^\/\.]+)/);const a=e.split("/");return 2===a.length&&a[0]&&a[1]});async function T(){_.value=!0;try{const e=await async function(e="claude"){return(await dt.get("/plugins/repos",{params:{platform:e}})).data}(i.platform);e.success&&(k.value=e.repos||[])}catch(e){Un.error("加载仓库失败: "+e.message)}finally{_.value=!1}}async function P(){U.value=!0;try{(await Lg(i.platform)).success&&(Un.success("仓库同步成功"),p("updated"))}catch(e){Un.error("同步失败: "+e.message)}finally{U.value=!1}}async function M(){if(!I.value)return;const e=S.value.input.trim();let a,l,t;if(e.includes("github.com")){const n=e.match(/github\.com\/([^\/]+)\/([^\/\.]+)/);n&&(a=n[1],l=n[2],t=e)}else{const n=e.split("/");a=n[0],l=n[1],t=`https://github.com/${a}/${l}`}C.value=!0;try{const e=await Ag({owner:a,name:l,url:t,branch:S.value.branch||"main",enabled:!0},i.platform);e.success&&(k.value=e.repos,S.value.input="",S.value.branch="main",Un.success("仓库添加成功"),p("updated"))}catch(n){Un.error("添加失败: "+n.message)}finally{C.value=!1}}async function $(e){try{const a=await async function(e,a,l="claude"){return(await dt.delete(`/plugins/repos/${encodeURIComponent(e)}/${encodeURIComponent(a)}`,{params:{platform:l}})).data}(e.owner,e.name,i.platform);a.success&&(k.value=a.repos,Un.success("仓库已删除"),p("updated"))}catch(a){Un.error("删除失败: "+a.message)}}async function j(e,a){try{const l=await async function(e,a,l,t="claude"){return(await dt.put(`/plugins/repos/${encodeURIComponent(e)}/${encodeURIComponent(a)}/toggle`,{enabled:l,platform:t})).data}(e.owner,e.name,a,i.platform);l.success&&(k.value=l.repos,p("updated"))}catch(l){Un.error("操作失败: "+l.message)}}function A(e){return k.value.some(a=>a.owner===e.owner&&a.name===e.name)}function L(){p("update:visible",!1)}return x(()=>i.visible,e=>{e&&T()}),x(()=>i.platform,()=>{i.visible&&T()}),b(()=>{i.visible&&T()}),(e,a)=>(n(),g(c(ie),{show:h.value,"onUpdate:show":a[2]||(a[2]=e=>h.value=e),preset:"card",title:"插件仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:L},{"header-extra":u(()=>[r(c(K),{type:"primary",size:"small",loading:U.value,focusable:!1,onClick:P},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Fa))]),_:1})]),default:u(()=>[a[3]||(a[3]=y(" 同步 ",-1))]),_:1},8,["loading"])]),default:u(()=>[s("div",Gg,[s("div",Wg,[r(c(Q),{show:_.value},{default:u(()=>[(n(!0),t(m,null,f(k.value,e=>(n(),t("div",{key:`${e.owner}/${e.name}`,class:"repo-item"},[s("div",Vg,[r(c(W),{value:e.enabled,size:"small","onUpdate:value":a=>j(e,a)},null,8,["value","onUpdate:value"]),s("div",Jg,[s("div",Zg,v(e.owner)+"/"+v(e.name),1),s("div",Yg,v(e.branch),1)])]),r(c(K),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>$(e)},{default:u(()=>[...a[4]||(a[4]=[y(" 删除 ",-1)])]),_:1},8,["onClick"])]))),128)),0===k.value.length?(n(),t("div",Xg," 暂无仓库,请添加 ")):o("",!0)]),_:1},8,["show"])]),s("div",Qg,[a[6]||(a[6]=s("div",{class:"add-title"},"添加仓库",-1)),s("div",ey,[r(c(re),{value:S.value.input,"onUpdate:value":a[0]||(a[0]=e=>S.value.input=e),placeholder:"owner/repo 或 GitHub URL",size:"small",class:"repo-input",onKeyup:O(M,["enter"])},null,8,["value"]),r(c(re),{value:S.value.branch,"onUpdate:value":a[1]||(a[1]=e=>S.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"]),r(c(K),{type:"primary",size:"small",disabled:!I.value,loading:C.value,focusable:!1,onClick:M},{default:u(()=>[...a[5]||(a[5]=[y(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[7]||(a[7]=s("div",{class:"add-hint"}," 格式: owner/repo 或完整 GitHub URL ",-1))]),s("div",ay,[r(c(fe),{type:"info",bordered:!1,size:"small"},{default:u(()=>[...a[8]||(a[8]=[y(" 添加仓库后,系统会从 GitHub 获取插件列表。如果网络较慢,请耐心等待或使用代理。 ",-1)])]),_:1})]),s("div",ly,[a[10]||(a[10]=s("div",{class:"recommended-title"},"推荐仓库",-1)),s("div",ty,[(n(!0),t(m,null,f(z.value,e=>(n(),t("div",{key:`${e.owner}/${e.name}`,class:d(["recommended-item",{added:A(e)}]),onClick:a=>!A(e)&&async function(e){C.value=!0;try{const a=await Ag({owner:e.owner,name:e.name,url:e.url,branch:e.branch,enabled:!0},i.platform);a.success&&(k.value=a.repos,Un.success("仓库添加成功"),p("updated"))}catch(a){Un.error("添加失败: "+a.message)}finally{C.value=!1}}(e)},[s("div",sy,[s("span",oy,v(e.owner)+"/"+v(e.name),1),s("span",iy,v(e.description),1)]),A(e)?(n(),g(c(G),{key:0,size:"tiny",type:"success",bordered:!1},{default:u(()=>[...a[9]||(a[9]=[y(" 已添加 ",-1)])]),_:1})):(n(),g(c(q),{key:1,class:"add-icon"},{default:u(()=>[r(c(Ve))]),_:1}))],10,ny))),128))])])])]),_:1},8,["show"]))}},[["__scopeId","data-v-bed4d4d3"]]),uy={class:"drawer-header"},cy={class:"plugin-info"},dy={class:"plugin-details"},py={class:"plugin-name"},vy={class:"plugin-meta"},my={key:1,class:"author-text"},fy={class:"drawer-body"},gy={class:"overview-container"},yy={class:"info-section"},hy={class:"description-text"},by={key:0,class:"info-section"},wy={class:"repo-link"},ky=["href"],_y={key:1,class:"info-section"},xy={class:"path-info"},Cy={class:"readme-container"},Uy={key:0,class:"loading-state"},Sy=["innerHTML"],zy={key:2,class:"empty-state"},Iy=Pl({__name:"PluginDetailDrawer",props:{visible:{type:Boolean,default:!1},plugin:{type:Object,default:null},platform:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){_l.setOptions({breaks:!0,gfm:!0});const{drawerWidth:i}=ko(600),d=e,p=a,m=w({get:()=>d.visible,set:e=>p("update:visible",e)}),f=l(""),h=l(!1);x(()=>d.visible,async e=>{if(e&&d.plugin){h.value=!0;try{const e={repoOwner:d.plugin.repoOwner,repoName:d.plugin.repoName,repoBranch:d.plugin.repoBranch,directory:d.plugin.directory,source:d.plugin.source,repoUrl:d.plugin.repoUrl},a=await async function(e,a={},l="claude"){const t=new URLSearchParams;return l&&t.append("platform",l),a.repoOwner&&t.append("repoOwner",a.repoOwner),a.repoName&&t.append("repoName",a.repoName),a.repoBranch&&t.append("repoBranch",a.repoBranch),a.directory&&t.append("directory",a.directory),a.source&&t.append("source",a.source),a.repoUrl&&t.append("repoUrl",a.repoUrl),(await dt.get(`/plugins/${encodeURIComponent(e)}/readme?${t.toString()}`)).data}(d.plugin.name,e,d.platform);f.value=a.readme||""}catch(a){f.value=""}finally{h.value=!1}}});const b=w(()=>f.value?_l(f.value):"");return(a,l)=>(n(),g(c(pe),{show:m.value,"onUpdate:show":l[0]||(l[0]=e=>m.value=e),width:c(i),placement:"right","show-mask":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>{var a,l,i;return[s("div",uy,[s("div",cy,[r(c(q),{size:20,class:"plugin-icon"},{default:u(()=>[r(c(Xe))]),_:1}),s("div",dy,[s("span",py,v(null==(a=e.plugin)?void 0:a.name),1),s("div",vy,[(null==(l=e.plugin)?void 0:l.version)?(n(),g(c(G),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[y(" v"+v(e.plugin.version),1)]),_:1})):o("",!0),(null==(i=e.plugin)?void 0:i.author)?(n(),t("span",my,[r(c(q),{size:12},{default:u(()=>[r(c(aa))]),_:1}),y(" "+v(e.plugin.author),1)])):o("",!0)])])])])]}),default:u(()=>[s("div",fy,[r(c(we),{type:"line",animated:""},{default:u(()=>[r(c(ke),{name:"overview",tab:"概览"},{default:u(()=>{var a,i,d,p,m;return[s("div",gy,[s("div",yy,[l[1]||(l[1]=s("h3",{class:"section-title"},"描述",-1)),s("p",hy,v((null==(a=e.plugin)?void 0:a.description)||"暂无描述"),1)]),(null==(i=e.plugin)?void 0:i.repoUrl)||(null==(d=e.plugin)?void 0:d.gitUrl)?(n(),t("div",by,[l[2]||(l[2]=s("h3",{class:"section-title"},"仓库地址",-1)),s("div",wy,[r(c(q),{size:16},{default:u(()=>[r(c(nl))]),_:1}),s("a",{href:e.plugin.repoUrl||e.plugin.gitUrl,target:"_blank",rel:"noopener noreferrer"},v(e.plugin.repoUrl||e.plugin.gitUrl),9,ky)])])):o("",!0),(null==(p=e.plugin)?void 0:p.directory)||(null==(m=e.plugin)?void 0:m.installPath)?(n(),t("div",_y,[l[3]||(l[3]=s("h3",{class:"section-title"},"安装路径",-1)),s("div",xy,[s("code",null,v(e.plugin.installPath||e.plugin.directory),1)])])):o("",!0)])]}),_:1}),r(c(ke),{name:"readme",tab:"README"},{default:u(()=>[s("div",Cy,[h.value?(n(),t("div",Uy,[r(c(Q),{size:"medium"}),l[4]||(l[4]=s("p",{class:"loading-text"},"加载 README 中...",-1))])):f.value?(n(),t("div",{key:1,class:"readme-content",innerHTML:b.value},null,8,Sy)):(n(),t("div",zy,[r(c(q),{size:48,class:"empty-icon"},{default:u(()=>[r(c(Oa))]),_:1}),l[5]||(l[5]=s("p",{class:"empty-text"},"暂无 README 文档",-1))]))])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-f63f8ef3"]]),Ty={key:0,class:"panel-header"},Py={class:"header-left"},My={class:"header-right"},$y={key:1,class:"drawer-header-bar"},jy={class:"header-right"},Oy={class:"stats-bar"},Ay={class:"stats-text"},Ly={class:"filter-bar"},Ey={class:"panel-content"},Dy={key:0,class:"empty-state"},Ny={key:1,class:"card-list"},Fy={class:"panel-footer"},Ry=Pl({__name:"PluginsPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1}},emits:["back","updated"],setup(e){const a=e,i=M(),p=Ie(),h=l(!1),k=l([]),_=l(""),C=l("all"),U=l(!1),S=l(!1),z=l(null),I=l({}),T=l({}),P=l(!1),$=l(0),j=w(()=>"opencode"===i.meta.channel?"opencode":"claude"),O=w(()=>"opencode"===j.value?"OpenCode":"Claude Code"),A=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"}],L=w(()=>k.value.filter(e=>e.installed).length),E=w(()=>{let e=k.value;if("installed"===C.value?e=e.filter(e=>e.installed):"uninstalled"===C.value&&(e=e.filter(e=>!e.installed)),_.value.trim()){const a=_.value.toLowerCase();e=e.filter(e=>{var l,t;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))})}return[...e].sort((e,a)=>e.installed===a.installed?0:e.installed?-1:1)}),D=w(()=>_.value?"没有匹配的插件":"installed"===C.value?"暂无已安装的插件":"uninstalled"===C.value?"所有插件都已安装":"暂无可用插件,请配置仓库源");async function N(e=!1){const a=++$.value,l=j.value;h.value=!0;try{e&&await Lg(l).catch(()=>{});const t=await async function(e="claude"){return(await dt.get("/plugins",{params:{platform:e}})).data}(l),n=t.success?t.plugins:[];let s=[];const o=(e,a)=>{const l={};for(const s of a)l[s.name]=s;const t=e.map(e=>{const a=l[e.name]||{};return{...a,...e,installed:!0,key:`installed-${e.name}`,description:e.description||a.description||"",repoOwner:e.repoOwner||a.repoOwner||"",repoName:e.repoName||a.repoName||"",repoBranch:e.repoBranch||a.repoBranch||"main",directory:e.directory||a.directory||e.installPath||""}}),n=new Set(e.map(e=>e.name));return[...t,...a.filter(e=>!n.has(e.name)).map(e=>({...e,installed:!1,key:`market-${e.repoOwner||"repo"}-${e.repoName||"name"}-${e.directory||e.name}`}))]};k.value=o(n,s),async function(e="claude"){return(await dt.get("/plugins/market",{params:{platform:e}})).data}(l).catch(()=>({success:!0,plugins:[]})).then(e=>{a===$.value&&l===j.value&&(s=e.success?e.plugins:[],k.value=o(n,s))})}catch(t){p.error("加载插件失败: "+t.message)}finally{a===$.value&&(h.value=!1)}}async function F(){if("claude"===j.value){P.value=!0;try{const e=await fm("plugins");e.success?(p.success(`成功导入 ${e.imported} 个插件`),await N(!0)):p.error(e.message||"导入失败")}catch(e){p.error("导入失败: "+e.message)}finally{P.value=!1}}}async function R(e){if(!e.installSource&&!e.repoOwner)return p.error("缺少可安装来源");I.value[e.key]=!0;try{const a=e.installSource?await Og("",null,j.value,e.installSource):await Og(e.directory,{owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main"},j.value);a.success?(p.success(`插件 "${e.name}" 安装成功`),await N(!0)):p.error(a.message||"安装失败")}catch(a){p.error("安装失败: "+a.message)}finally{delete I.value[e.key]}}async function B(e){T.value[e.key]=!0;try{const a=await async function(e,a="claude"){return(await dt.delete(`/plugins/${encodeURIComponent(e)}`,{params:{platform:a}})).data}(e.name,j.value);a.success?(p.success(`插件 "${e.name}" 已卸载`),await N(!0)):p.error(a.message||a.error||"卸载失败")}catch(a){p.error("卸载失败: "+a.message)}finally{delete T.value[e.key]}}function H(e){z.value=e,S.value=!0}return b(()=>{a.inDrawer&&!a.drawerVisible||N()}),x(()=>a.drawerVisible,e=>{e&&N()}),x(()=>j.value,()=>{N()}),(a,l)=>(n(),t("div",{class:d(["plugins-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?o("",!0):(n(),t("div",Ty,[s("div",Py,[e.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[10]||(l[10]=s("span",{class:"panel-title"},"Plugins 插件管理",-1))]),s("div",My,[r(c(K),{text:"",focusable:!1,onClick:l[1]||(l[1]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[11]||(l[11]=y(" 仓库 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:F,loading:P.value,disabled:"claude"!==j.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Xa))]),_:1})]),default:u(()=>[l[12]||(l[12]=y(" 导入 ",-1))]),_:1},8,["loading","disabled"]),r(c(K),{text:"",focusable:!1,onClick:l[2]||(l[2]=e=>N(!0)),loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[13]||(l[13]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),t("div",$y,[s("div",jy,[r(c(K),{text:"",focusable:!1,onClick:l[3]||(l[3]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(na))]),_:1})]),default:u(()=>[l[14]||(l[14]=y(" 仓库 ",-1))]),_:1}),r(c(K),{text:"",focusable:!1,onClick:F,loading:P.value,disabled:"claude"!==j.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Xa))]),_:1})]),default:u(()=>[l[15]||(l[15]=y(" 导入 ",-1))]),_:1},8,["loading","disabled"]),r(c(K),{text:"",focusable:!1,onClick:l[4]||(l[4]=e=>N(!0)),loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[16]||(l[16]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Oy,[s("span",Ay,[y(" 共 "+v(k.value.length)+" 个插件 ",1),k.value.length>0?(n(),t(m,{key:0},[y(" · 已安装: "+v(L.value)+" · 未安装: "+v(k.value.length-L.value),1)],64)):o("",!0)])]),s("div",Ly,[r(c(re),{value:_.value,"onUpdate:value":l[5]||(l[5]=e=>_.value=e),placeholder:"搜索插件...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:C.value,"onUpdate:value":l[6]||(l[6]=e=>C.value=e),options:A,size:"small",class:"filter-select"},null,8,["value"])]),s("div",Ey,[r(c(Q),{show:h.value},{default:u(()=>[0!==E.value.length||h.value?(n(),t("div",Ny,[(n(!0),t(m,null,f(E.value,e=>(n(),g(Kg,{key:e.key,plugin:e,installing:!!I.value[e.key],uninstalling:!!T.value[e.key],onInstall:R,onUninstall:B,onClick:H},null,8,["plugin","installing","uninstalling"]))),128))])):(n(),t("div",Dy,[r(c(ee),{description:D.value},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(Xe))]),_:1})]),extra:u(()=>[0===k.value.length?(n(),g(c(K),{key:0,size:"small",onClick:l[7]||(l[7]=e=>U.value=!0)},{default:u(()=>[...l[17]||(l[17]=[y("配置仓库源",-1)])]),_:1})):o("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),s("div",Fy,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),s("span",null,"安装/卸载后需重启 "+v(O.value)+" 生效",1)]),r(ry,{visible:U.value,"onUpdate:visible":l[8]||(l[8]=e=>U.value=e),platform:j.value,onUpdated:N},null,8,["visible","platform"]),r(Iy,{visible:S.value,"onUpdate:visible":l[9]||(l[9]=e=>S.value=e),plugin:z.value,platform:j.value,onUpdated:N},null,8,["visible","plugin","platform"])],2))}},[["__scopeId","data-v-af303661"]]),By=Pl({__name:"PluginsDrawer",props:{visible:Boolean},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(600),i=w({get:()=>l.visible,set:e=>t("update:visible",e)});return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:""},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},[s("span",null,"Plugins")],-1)])]),default:u(()=>[r(Ry,{onBack:a[0]||(a[0]=e=>i.value=!1),"hide-back":!0,"in-drawer":!0,"drawer-visible":i.value},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-5d79a115"]]),Hy="/workspaces";async function qy(){return(await dt.get(`${Hy}/available-projects`)).data}const Ky={class:"card-header"},Gy={class:"card-title"},Wy={class:"name"},Vy={class:"card-body"},Jy={key:0,class:"info-row"},Zy={class:"value"},Yy={class:"info-row"},Xy={class:"value"},Qy={class:"info-row"},eh={class:"value path"},ah={key:1,class:"info-row"},lh={class:"value"},th=Pl({__name:"WorkspaceCard",props:{workspace:{type:Object,required:!0}},emits:["click","view","delete"],setup:e=>(a,l)=>{return n(),t("div",{class:"workspace-card",onClick:l[3]||(l[3]=l=>a.$emit("click",e.workspace))},[s("div",Ky,[s("div",Gy,[s("span",Wy,v(e.workspace.name),1),r(c(G),{type:e.workspace.exists?"success":"error",size:"small"},{default:u(()=>[y(v(e.workspace.exists?"存在":"不存在"),1)]),_:1},8,["type"])]),s("div",{class:"card-actions",onClick:l[2]||(l[2]=p(()=>{},["stop"]))},[r(c(K),{text:"",size:"small",onClick:l[0]||(l[0]=l=>a.$emit("view",e.workspace))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(sl))]),_:1})]),_:1}),r(c(K),{text:"",size:"small",type:"error",onClick:l[1]||(l[1]=l=>a.$emit("delete",e.workspace))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Je))]),_:1})]),_:1})])]),s("div",Vy,[e.workspace.description?(n(),t("div",Jy,[l[4]||(l[4]=s("span",{class:"label"},"描述",-1)),s("span",Zy,v(e.workspace.description),1)])):o("",!0),s("div",Yy,[l[5]||(l[5]=s("span",{class:"label"},"项目数",-1)),s("span",Xy,v(e.workspace.projectCount||0),1)]),s("div",Qy,[l[6]||(l[6]=s("span",{class:"label"},"路径",-1)),s("span",eh,v(e.workspace.path),1)]),e.workspace.lastUsed?(n(),t("div",ah,[l[7]||(l[7]=s("span",{class:"label"},"最后使用",-1)),s("span",lh,v((i=e.workspace.lastUsed,i?new Date(i).toLocaleString("zh-CN"):"-")),1)])):o("",!0)])]);var i}},[["__scopeId","data-v-74e07bc9"]]),nh="/config-templates";async function sh(){return(await dt.get(nh)).data}async function oh(){return(await dt.get(`${nh}/available-configs`)).data}const ih={class:"project-item"},rh={class:"item-header"},uh={class:"item-title"},ch={class:"item-body"},dh={key:2,class:"git-options"},ph={key:0,class:"branch-inputs"},vh=Pl({__name:"ProjectItem",props:{project:{type:Object,required:!0},index:{type:Number,required:!0},existingOptions:{type:Array,default:()=>[]}},emits:["remove","select-existing"],setup(e){const a=e;async function l(){if(a.project.sourcePath)try{const e=await async function(e){const a=encodeURIComponent(e);return(await dt.get(`${Hy}/check-git/${a}`)).data}(a.project.sourcePath);e.success&&(a.project.isGitRepo=e.data.isGitRepo,e.data.isGitRepo&&!a.project.createWorktree&&(a.project.createWorktree=!0))}catch(e){}}return(a,i)=>(n(),t("div",ih,[s("div",rh,[s("span",uh,"项目 "+v(e.index+1),1),r(c(K),{text:"",size:"tiny",type:"error",onClick:i[0]||(i[0]=e=>a.$emit("remove"))},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ke))]),_:1})]),_:1})]),s("div",ch,[e.project.fromExisting?(n(),t(m,{key:0},[r(c(te),{value:e.project.selectedKey,"onUpdate:value":[i[1]||(i[1]=a=>e.project.selectedKey=a),i[2]||(i[2]=l=>a.$emit("select-existing",e.index,l))],options:e.existingOptions,placeholder:"选择已有项目",filterable:"",size:"small"},null,8,["value","options"]),r(c(re),{value:e.project.sourcePath,placeholder:"项目路径",disabled:"",size:"small"},null,8,["value"])],64)):(n(),t(m,{key:1},[r(c(re),{value:e.project.sourcePath,"onUpdate:value":i[3]||(i[3]=a=>e.project.sourcePath=a),placeholder:"项目源路径",size:"small",onBlur:l},null,8,["value"]),r(c(re),{value:e.project.name,"onUpdate:value":i[4]||(i[4]=a=>e.project.name=a),placeholder:"软链接名称(可选)",size:"small"},null,8,["value"])],64)),e.project.isGitRepo?(n(),t("div",dh,[r(c(xe),{checked:e.project.createWorktree,"onUpdate:checked":i[5]||(i[5]=a=>e.project.createWorktree=a),size:"small"},{default:u(()=>[...i[8]||(i[8]=[y(" 创建 Git Worktree ",-1)])]),_:1},8,["checked"]),e.project.createWorktree?(n(),t("div",ph,[r(c(re),{value:e.project.branch,"onUpdate:value":i[6]||(i[6]=a=>e.project.branch=a),placeholder:"分支名(留空使用当前分支)",size:"small",style:{flex:"1"}},null,8,["value"]),r(c(re),{value:e.project.baseBranch,"onUpdate:value":i[7]||(i[7]=a=>e.project.baseBranch=a),placeholder:"基于分支(可选,如 main)",size:"small",style:{flex:"1"}},null,8,["value"])])):o("",!0),e.project.createWorktree&&e.project.branch?(n(),g(c(V),{key:1,depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:u(()=>[e.project.baseBranch?(n(),t(m,{key:0},[y(' ℹ️ 如果分支 "'+v(e.project.branch)+'" 不存在,将基于 "'+v(e.project.baseBranch)+'" 创建 ',1)],64)):(n(),t(m,{key:1},[y(' ℹ️ 如果分支 "'+v(e.project.branch)+'" 不存在,将基于源仓库当前分支创建 ',1)],64))]),_:1})):o("",!0)])):o("",!0),e.project.isGitRepo?(n(),g(c(V),{key:3,depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...i[9]||(i[9]=[y("✓ Git 仓库",-1)])]),_:1})):o("",!0)])]))}},[["__scopeId","data-v-659e4dc9"]]),mh={class:"projects-section"},fh={class:"projects-actions"},gh={key:0,class:"projects-list"},yh=Pl({__name:"WorkspaceFormModal",props:{show:{type:Boolean,default:!1}},emits:["update:show","success"],setup(e,{emit:a}){const o=e,i=a,d=Ie(),v=l(null),h=l(!1),b=l([]),k=l([]),_=w({get:()=>o.show,set:e=>i("update:show",e)}),C=l({name:"",description:"",baseDir:"",configTemplateId:null,projects:[]}),U={name:[{required:!0,message:"请输入工作区名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_\-\u4e00-\u9fa5]+$/,message:"名称只能包含字母、数字、下划线、中划线和中文",trigger:"blur"}],projects:[{type:"array",required:!0,min:1,message:"至少需要添加一个项目",trigger:"blur"}]},S=w(()=>b.value.map(e=>({label:e.name,value:e.id}))),z=w(()=>k.value.map(e=>({label:`${e.displayName||e.name} (${e.channel})${e.isGitRepo?" [Git]":""}`,value:`${e.channel}::${e.name}`,path:e.fullPath||e.name,isGitRepo:e.isGitRepo})));function I(e){C.value.projects.push({sourcePath:"",name:"",createWorktree:!1,branch:"",baseBranch:"",isGitRepo:!1,fromExisting:e,selectedKey:""})}function T(e,a){const l=z.value.find(e=>e.value===a);if(!l)return;const t=C.value.projects[e];t.sourcePath=l.path,t.name=l.path.split("/").pop(),t.isGitRepo=l.isGitRepo,t.createWorktree=l.isGitRepo}async function P(){var e;try{await(null==(e=v.value)?void 0:e.validate());for(const e of C.value.projects)if(!e.sourcePath)return void d.error("请填写项目路径");h.value=!0;const a=await async function(e){return(await dt.post(Hy,e)).data}(C.value);a.success?(d.success("工作区创建成功"),C.value={name:"",description:"",baseDir:"",configTemplateId:null,projects:[]},i("success")):d.error(a.message||"创建失败")}catch(a){const e=a.message||"创建失败";e.includes("\n")?d.warning(e,{duration:8e3}):d.error(e),a.errors}finally{h.value=!1}}return x(_,e=>{e&&async function(){try{const[e,a]=await Promise.all([sh(),qy()]);e.success&&(b.value=e.data||[]),a.success&&(k.value=Array.isArray(a.data)?a.data:[])}catch(e){}}()}),(e,a)=>(n(),g(c(ie),{show:_.value,"onUpdate:show":a[8]||(a[8]=e=>_.value=e),preset:"card",title:"创建工作区",style:{width:"650px"},"mask-closable":!1},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:a[7]||(a[7]=e=>_.value=!1)},{default:u(()=>[...a[12]||(a[12]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",onClick:P,loading:h.value},{default:u(()=>[...a[13]||(a[13]=[y("创建",-1)])]),_:1},8,["loading"])]),_:1})]),default:u(()=>[r(c(ae),{ref_key:"formRef",ref:v,model:C.value,rules:U,"label-placement":"left","label-width":"100"},{default:u(()=>[r(c(le),{label:"工作区名称",path:"name"},{default:u(()=>[r(c(re),{value:C.value.name,"onUpdate:value":a[0]||(a[0]=e=>C.value.name=e),placeholder:"输入工作区名称",onKeydown:a[1]||(a[1]=O(p(()=>{},["prevent"]),["enter"]))},null,8,["value"])]),_:1}),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:C.value.description,"onUpdate:value":a[2]||(a[2]=e=>C.value.description=e),placeholder:"可选描述",type:"textarea",rows:2},null,8,["value"])]),_:1}),r(c(le),{label:"基础目录",path:"baseDir"},{default:u(()=>[r(c(re),{value:C.value.baseDir,"onUpdate:value":a[3]||(a[3]=e=>C.value.baseDir=e),placeholder:"留空则使用第一个项目的父目录"},null,8,["value"])]),_:1}),r(c(le),{label:"配置模板",path:"configTemplateId"},{default:u(()=>[r(c(te),{value:C.value.configTemplateId,"onUpdate:value":a[4]||(a[4]=e=>C.value.configTemplateId=e),options:S.value,placeholder:"选择配置模板",clearable:""},null,8,["value","options"])]),_:1}),r(c(le),{label:"项目列表",path:"projects"},{default:u(()=>[s("div",mh,[s("div",fh,[r(c(K),{size:"small",dashed:"",onClick:a[5]||(a[5]=e=>I(!1))},{default:u(()=>[...a[9]||(a[9]=[y("添加项目",-1)])]),_:1}),r(c(K),{size:"small",dashed:"",onClick:a[6]||(a[6]=e=>I(!0))},{default:u(()=>[...a[10]||(a[10]=[y("添加已有项目",-1)])]),_:1})]),C.value.projects.length>0?(n(),t("div",gh,[(n(!0),t(m,null,f(C.value.projects,(e,a)=>(n(),g(vh,{key:a,project:e,index:a,"existing-options":z.value,onRemove:e=>function(e){C.value.projects.splice(e,1)}(a),onSelectExisting:T},null,8,["project","index","existing-options","onRemove"]))),128))])):(n(),g(c(V),{key:1,depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[11]||(a[11]=[y("请添加至少一个项目",-1)])]),_:1}))])]),_:1})]),_:1},8,["model"])]),_:1},8,["show"]))}},[["__scopeId","data-v-7ba95e40"]]),hh={class:"section-title"},bh={key:0,class:"projects-list"},wh={class:"proj-name"},kh={class:"proj-path"},_h=Pl({__name:"WorkspaceDetailModal",props:{show:{type:Boolean,default:!1},workspace:{type:Object,default:null}},emits:["update:show","deleted"],setup(e,{emit:a}){const i=e,d=a,p=Ie(),h=w({get:()=>i.show,set:e=>d("update:show",e)}),b=l(null);function k(e){return e?new Date(e).toLocaleString("zh-CN"):"-"}async function _(){var e;if(null==(e=i.workspace)?void 0:e.id)try{const e=await async function(e){return(await dt.get(`${Hy}/${e}`)).data}(i.workspace.id);e.success&&(b.value=e.data)}catch(a){}}async function C(e){var a;if(null==(a=i.workspace)?void 0:a.id)try{const a=await async function(e,a,l=null){return(await dt.post(`${Hy}/${e}/launch`,{tool:a,projectName:l})).data}(i.workspace.id,e);if(a.success){const e=`cd "${a.data.cwd}" && ${a.data.command}`,l=await no(e);if("manual"===(null==l?void 0:l.method))return void p.warning("自动复制失败,已弹出手动复制框");p.success("启动命令已复制到剪贴板")}else p.error(a.message||"获取命令失败")}catch(l){p.error("获取命令失败: "+l.message)}}return x(h,e=>{e&&i.workspace&&_()}),(a,l)=>(n(),g(c(ie),{show:h.value,"onUpdate:show":l[3]||(l[3]=e=>h.value=e),preset:"card",title:"工作区详情",style:{width:"700px"}},{default:u(()=>{var a,i,d,p;return[e.workspace?(n(),t(m,{key:0},[r(c(Te),{column:1,bordered:"",size:"small"},{default:u(()=>[r(c(Pe),{label:"名称"},{default:u(()=>[y(v(e.workspace.name),1)]),_:1}),r(c(Pe),{label:"描述"},{default:u(()=>[y(v(e.workspace.description||"-"),1)]),_:1}),r(c(Pe),{label:"路径"},{default:u(()=>[y(v(e.workspace.path),1)]),_:1}),r(c(Pe),{label:"状态"},{default:u(()=>[r(c(G),{type:e.workspace.exists?"success":"error",size:"small"},{default:u(()=>[y(v(e.workspace.exists?"存在":"不存在"),1)]),_:1},8,["type"])]),_:1}),r(c(Pe),{label:"创建时间"},{default:u(()=>[y(v(k(e.workspace.createdAt)),1)]),_:1}),r(c(Pe),{label:"最后使用"},{default:u(()=>[y(v(k(e.workspace.lastUsed)),1)]),_:1})]),_:1}),r(c(me)),l[8]||(l[8]=s("div",{class:"section-title"},"启动 CLI 工具",-1)),r(c(se),null,{default:u(()=>[r(c(K),{type:"primary",size:"small",onClick:l[0]||(l[0]=e=>C("claude")),disabled:!e.workspace.exists},{default:u(()=>[...l[4]||(l[4]=[y(" Claude Code ",-1)])]),_:1},8,["disabled"]),r(c(K),{type:"info",size:"small",onClick:l[1]||(l[1]=e=>C("codex")),disabled:!e.workspace.exists},{default:u(()=>[...l[5]||(l[5]=[y(" Codex ",-1)])]),_:1},8,["disabled"]),r(c(K),{type:"success",size:"small",onClick:l[2]||(l[2]=e=>C("gemini")),disabled:!e.workspace.exists},{default:u(()=>[...l[6]||(l[6]=[y(" Gemini CLI ",-1)])]),_:1},8,["disabled"])]),_:1}),r(c(V),{depth:"3",style:{display:"block","margin-top":"6px","font-size":"11px"}},{default:u(()=>[...l[7]||(l[7]=[y(" 点击按钮将复制启动命令到剪贴板 ",-1)])]),_:1}),r(c(me)),s("div",hh,"包含项目 ("+v((null==(i=null==(a=b.value)?void 0:a.projects)?void 0:i.length)||0)+")",1),(null==(p=null==(d=b.value)?void 0:d.projects)?void 0:p.length)?(n(),t("div",bh,[(n(!0),t(m,null,f(b.value.projects,(e,a)=>(n(),t("div",{class:"project-row",key:a},[r(c(G),{type:e.sourceExists?"success":"error",size:"small"},{default:u(()=>[y(v(e.sourceExists?"✓":"✗"),1)]),_:2},1032,["type"]),s("span",wh,v(e.name),1),s("span",kh,v(e.sourcePath),1)]))),128))])):(n(),g(c(ee),{key:1,description:"暂无项目",size:"small"}))],64)):o("",!0)]}),_:1},8,["show"]))}},[["__scopeId","data-v-bbe7f5de"]]),xh={key:0,class:"panel-header"},Ch={class:"header-left"},Uh={class:"header-right"},Sh={key:1,class:"drawer-header-bar"},zh={class:"header-right"},Ih={class:"stats-bar"},Th={class:"stats-text"},Ph={class:"filter-bar"},Mh={class:"panel-content"},$h={key:0,class:"empty-state"},jh={key:1,class:"card-list"},Oh={class:"panel-footer"},Ah=Pl({__name:"WorkspacePanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1}},emits:["back","updated"],setup(e,{emit:a}){const i=e,p=a,h=Ie(),k=Me(),_=l(!1),C=l([]),U=l(""),S=l(!1),z=l(!1),I=l(null),T=w(()=>{if(!U.value.trim())return C.value;const e=U.value.toLowerCase();return C.value.filter(a=>{var l,t,n;return(null==(l=a.name)?void 0:l.toLowerCase().includes(e))||(null==(t=a.description)?void 0:t.toLowerCase().includes(e))||(null==(n=a.path)?void 0:n.toLowerCase().includes(e))})});async function P(){_.value=!0;try{const e=await async function(){return(await dt.get(Hy)).data}();e.success&&(C.value=e.data||[])}catch(e){h.error("加载工作区失败: "+e.message)}finally{_.value=!1}}function M(e){I.value=e,z.value=!0}function $(e){k.warning({title:"确认删除",content:`确定要删除工作区"${e.name}"吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{const a=await async function(e,a=!1){return(await dt.delete(`${Hy}/${e}`,{params:{removeFiles:a}})).data}(e.id,!1);a.success?(h.success("删除成功"),P(),p("updated")):h.error(a.message||"删除失败")}catch(a){h.error("删除失败: "+a.message)}}})}function j(){S.value=!1,P(),p("updated")}return b(()=>P()),x(()=>i.drawerVisible,e=>{e&&P()}),(a,l)=>(n(),t("div",{class:d(["workspace-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?o("",!0):(n(),t("div",xh,[s("div",Ch,[e.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[7]||(l[7]=s("span",{class:"panel-title"},"工作区管理",-1))]),s("div",Uh,[r(c(K),{text:"",onClick:l[1]||(l[1]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:P,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[9]||(l[9]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),t("div",Sh,[s("div",zh,[r(c(K),{text:"",onClick:l[2]||(l[2]=e=>S.value=!0),class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[10]||(l[10]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:P,loading:_.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[11]||(l[11]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Ih,[s("span",Th," 共 "+v(C.value.length)+" 个工作区 ",1)]),s("div",Ph,[r(c(re),{value:U.value,"onUpdate:value":l[3]||(l[3]=e=>U.value=e),placeholder:"搜索工作区...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"])]),s("div",Mh,[r(c(Q),{show:_.value},{default:u(()=>[0!==T.value.length||_.value?(n(),t("div",jh,[(n(!0),t(m,null,f(T.value,e=>(n(),g(th,{key:e.id,workspace:e,onClick:M,onView:M,onDelete:$},null,8,["workspace"]))),128))])):(n(),t("div",$h,[r(c(ee),{description:"暂无工作区"},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(Za))]),_:1})]),extra:u(()=>[r(c(K),{size:"small",onClick:l[4]||(l[4]=e=>S.value=!0)},{default:u(()=>[...l[12]||(l[12]=[y("创建第一个工作区",-1)])]),_:1})]),_:1})]))]),_:1},8,["show"])]),s("div",Oh,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),l[13]||(l[13]=s("span",null,"工作区用于管理多个项目的统一开发环境",-1))]),r(yh,{show:S.value,"onUpdate:show":l[5]||(l[5]=e=>S.value=e),onSuccess:j},null,8,["show"]),r(_h,{show:z.value,"onUpdate:show":l[6]||(l[6]=e=>z.value=e),workspace:I.value,onDeleted:P},null,8,["show","workspace"])],2))}},[["__scopeId","data-v-17320bd7"]]),Lh=Pl({__name:"WorkspaceDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(700,600),i=w({get:()=>l.visible,set:e=>t("update:visible",e)}),d={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1,"body-content-style":d},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},"工作区管理",-1)])]),default:u(()=>[r(Ah,{"in-drawer":!0,"hide-back":!0,"drawer-visible":i.value,onBack:a[0]||(a[0]=e=>i.value=!1)},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b05f985c"]]),Eh={class:"card-header"},Dh={class:"card-title"},Nh={class:"name"},Fh={class:"card-body"},Rh={key:0,class:"description"},Bh={class:"stats"},Hh={key:0},qh={key:1},Kh={key:2},Gh={key:3},Wh={key:4},Vh=Pl({__name:"ConfigTemplateCard",props:{template:{type:Object,required:!0},deleting:{type:Boolean,default:!1}},emits:["click","apply","preview","edit","delete"],setup(e){const a=e;const l={claude:{label:"Claude",color:"#cc785c",textColor:"#fff",borderColor:"#cc785c"},codex:{label:"Codex",color:"#10a37f",textColor:"#fff",borderColor:"#10a37f"},gemini:{label:"Gemini",color:"#4285f4",textColor:"#fff",borderColor:"#4285f4"},opencode:{label:"OpenCode",color:"#ff6b35",textColor:"#fff",borderColor:"#ff6b35"}},i={claude:"CLAUDE.md",codex:"AGENTS.md",gemini:"GEMINI.md",opencode:".opencode/AGENTS.md"};function d(e){var a;return(null==(a=l[e])?void 0:a.label)||e}function m(e){const a=l[e];return a?{color:a.color,textColor:a.textColor,borderColor:a.borderColor}:{}}const f=w(()=>{var e,l;const t=a.template,n=null==t?void 0:t.cliType;if(!n||"all"===n)return null;const s=null==(e=null==t?void 0:t.aiConfigs)?void 0:e[n];return(null==s?void 0:s.enabled)?i[n]||null:"claude"===n&&(null==(l=null==t?void 0:t.claudeMd)?void 0:l.enabled)?"CLAUDE.md":null});return(a,l)=>{var i,h,b,w,k,_;return n(),t("div",{class:"template-card",onClick:l[5]||(l[5]=l=>a.$emit("click",e.template))},[s("div",Eh,[s("div",Dh,[s("span",Nh,v(e.template.name),1),e.template.cliType?(n(),g(c(G),{key:0,size:"small",color:m(e.template.cliType),round:""},{default:u(()=>[y(v(d(e.template.cliType)),1)]),_:1},8,["color"])):o("",!0)]),s("div",{class:"card-actions",onClick:l[4]||(l[4]=p(()=>{},["stop"]))},[r(c(K),{size:"small",type:"primary",onClick:l[0]||(l[0]=l=>a.$emit("apply",e.template))},{default:u(()=>[...l[6]||(l[6]=[y("应用",-1)])]),_:1}),r(c(K),{size:"small",onClick:l[1]||(l[1]=l=>a.$emit("preview",e.template))},{default:u(()=>[...l[7]||(l[7]=[y("预览",-1)])]),_:1}),r(c(K),{size:"small",onClick:l[2]||(l[2]=l=>a.$emit("edit",e.template))},{default:u(()=>[...l[8]||(l[8]=[y("编辑",-1)])]),_:1}),r(c(K),{size:"small",type:"error",loading:e.deleting,onClick:l[3]||(l[3]=l=>a.$emit("delete",e.template))},{default:u(()=>[...l[9]||(l[9]=[y("删除",-1)])]),_:1},8,["loading"])])]),s("div",Fh,[e.template.description?(n(),t("div",Rh,v((k=e.template.description,_=80,(null==k?void 0:k.length)>_?k.slice(0,_)+"...":k)),1)):o("",!0),s("div",Bh,[f.value?(n(),t("span",Hh,v(f.value),1)):o("",!0),(null==(i=e.template.skills)?void 0:i.length)?(n(),t("span",qh,v(e.template.skills.length)+" Skills",1)):o("",!0),(null==(h=e.template.agents)?void 0:h.length)?(n(),t("span",Kh,v(e.template.agents.length)+" Agents",1)):o("",!0),(null==(b=e.template.commands)?void 0:b.length)?(n(),t("span",Gh,v(e.template.commands.length)+" Commands",1)):o("",!0),(null==(w=e.template.mcpServers)?void 0:w.length)?(n(),t("span",Wh,v(e.template.mcpServers.length)+" MCP",1)):o("",!0)])])])}}},[["__scopeId","data-v-02393d07"]]),Jh=["innerHTML"],Zh=Pl({__name:"MarkdownViewer",props:{content:{type:String,default:""}},setup(e){const a=e;function l(e,a){ml.getLanguage(e)||ml.registerLanguage(e,a)}l("javascript",fl),l("typescript",bl),l("json",hl),l("bash",yl),l("shell",yl),l("sh",yl),l("python",gl),l("css",wl),l("xml",kl),l("html",kl);const s=new xl({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&ml.getLanguage(a))try{return'<pre class="hljs"><code>'+ml.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(l){}return'<pre class="hljs"><code>'+s.utils.escapeHtml(e)+"</code></pre>"}}),o=w(()=>s.render(a.content||""));return(e,a)=>(n(),t("div",{class:"markdown-viewer",innerHTML:o.value},null,8,Jh))}},[["__scopeId","data-v-9e29f753"]]),Yh={class:"ai-config-header"},Xh={key:0,class:"prompt-preview"},Qh={class:"ai-config-header"},eb={class:"ai-config-header"},ab={class:"ai-config-header"},lb=Pl({__name:"ConfigTemplateFormModal",props:{show:Boolean,template:Object,availableConfigs:{type:Object,default:()=>({})}},emits:["update:show","success"],setup(e,{emit:a}){const i=e,d=a,p=Ie(),f=l(null),h=l(!1),b=[{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"}],k={claude:{skills:!0,agents:!0,commands:!0},codex:{skills:!0,agents:!0,commands:!0},gemini:{skills:!0,agents:!1,commands:!1},opencode:{skills:!0,agents:!0,commands:!0}},_=w(()=>{var e;return!!(null==(e=i.template)?void 0:e.id)}),C=l({name:"",description:"",cliType:"",aiConfigs:{claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""}},claudeMd:{enabled:!1,content:""},skills:[],agents:[],commands:[],mcpServers:[]});const U={name:{required:!0,message:"请输入模版名称",trigger:"blur"},cliType:{required:!0,message:"请选择 CLI 工具类型",trigger:"change"}},S=w(()=>{var e;const a=C.value.cliType,l=(null==(e=i.availableConfigs)?void 0:e.skillsByPlatform)||{};return(a&&l[a]?l[a]:[]).map(e=>({value:e.directory,label:e.name?`${e.name} (${e.directory})`:e.directory,disabled:!1}))}),z=w(()=>{var e;return((null==(e=i.availableConfigs)?void 0:e.agents)||[]).map(e=>({value:e.fileName,label:e.name||e.fileName,disabled:!1}))}),I=w(()=>{var e;return((null==(e=i.availableConfigs)?void 0:e.commands)||[]).map(e=>({value:e.namespace?`${e.namespace}/${e.name}`:e.name,label:e.namespace?`${e.namespace}/${e.name}`:e.name,disabled:!1}))}),T=w(()=>{var e,a;const l=(null==(e=i.availableConfigs)?void 0:e.mcpServers)||[],t=(null==(a=i.availableConfigs)?void 0:a.mcpPresets)||[],n=[...l.map(e=>({value:e.id,label:e.name||e.id})),...t.map(e=>({value:e.id,label:`${e.name} (预设)`}))],s=new Set;return n.filter(e=>!s.has(e.value)&&(s.add(e.value),!0))}),P=l(null),M=w(()=>{var e;return((null==(e=i.availableConfigs)?void 0:e.prompts)||[]).map(e=>({value:e.id,label:e.isBuiltin?`[内置] ${e.name}`:e.name,description:e.description}))}),$=w({get:()=>C.value.skills.map(e=>e.directory),set:e=>{var a;const l=C.value.cliType,t=(null==(a=i.availableConfigs)?void 0:a.skillsByPlatform)||{},n=l&&t[l]?t[l]:[];C.value.skills=e.map(e=>{const a=n.find(a=>a.directory===e);return a?{...a}:{directory:e,name:e}})}}),j=w({get:()=>C.value.agents.map(e=>e.fileName),set:e=>{var a;const l=(null==(a=i.availableConfigs)?void 0:a.agents)||[];C.value.agents=e.map(e=>{const a=l.find(a=>a.fileName===e);return a?{...a}:{fileName:e}})}}),O=w({get:()=>C.value.commands.map(e=>e.namespace?`${e.namespace}/${e.name}`:e.name),set:e=>{var a;const l=(null==(a=i.availableConfigs)?void 0:a.commands)||[];C.value.commands=e.map(e=>{const a=l.find(a=>(a.namespace?`${a.namespace}/${a.name}`:a.name)===e);return a?{...a}:{name:e}})}});function A(e){var a;if(!e)return void(C.value.aiConfigs.claude.content="");const l=((null==(a=i.availableConfigs)?void 0:a.prompts)||[]).find(a=>a.id===e);l&&(C.value.aiConfigs.claude.enabled=!0,C.value.aiConfigs.claude.content=l.content)}async function L(){var e;try{await(null==(e=f.value)?void 0:e.validate())}catch{return}h.value=!0;try{const e={...C.value};let a;a=_.value?await async function(e,a){return(await dt.put(`${nh}/${e}`,a)).data}(i.template.id,e):await async function(e){return(await dt.post(nh,e)).data}(e),a.success?(p.success(_.value?"保存成功":"创建成功"),d("success")):p.error(a.message||"操作失败")}catch(a){p.error("操作失败: "+a.message)}finally{h.value=!1}}return x(()=>i.show,e=>{if(e)if(P.value=null,i.template){let e={claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""}};if(i.template.aiConfigs)for(const a of["claude","codex","gemini","opencode"])i.template.aiConfigs[a]&&(e[a]={...i.template.aiConfigs[a]});else i.template.claudeMd&&(e.claude={...i.template.claudeMd});C.value={name:i.template.name||"",description:i.template.description||"",cliType:i.template.cliType||"",aiConfigs:e,claudeMd:i.template.claudeMd?{...i.template.claudeMd}:{enabled:!1,content:""},skills:i.template.skills?[...i.template.skills]:[],agents:i.template.agents?[...i.template.agents]:[],commands:i.template.commands?[...i.template.commands]:[],mcpServers:i.template.mcpServers?[...i.template.mcpServers]:[]}}else C.value={name:"",description:"",cliType:"",aiConfigs:{claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""}},claudeMd:{enabled:!1,content:""},skills:[],agents:[],commands:[],mcpServers:[]}}),x(()=>C.value.cliType,e=>{const a=k[e];a&&(a.skills||(C.value.skills=[]),a.agents||(C.value.agents=[]),a.commands||(C.value.commands=[]))}),(a,l)=>(n(),g(c(ie),{show:e.show,preset:"card",title:_.value?"编辑配置模版":"创建配置模版",style:{width:"850px","max-height":"90vh"},"mask-closable":!1,"onUpdate:show":l[26]||(l[26]=e=>d("update:show",e))},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:l[25]||(l[25]=e=>d("update:show",!1))},{default:u(()=>[...l[31]||(l[31]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:h.value,onClick:L},{default:u(()=>[y(v(_.value?"保存":"创建"),1)]),_:1},8,["loading"])]),_:1})]),default:u(()=>[r(c($e),{style:{"max-height":"calc(90vh - 140px)"}},{default:u(()=>[r(c(ae),{ref_key:"formRef",ref:f,model:C.value,rules:U,"label-placement":"left","label-width":"100"},{default:u(()=>[r(c(ze),{title:"基本信息",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[r(c(le),{label:"模版名称",path:"name"},{default:u(()=>[r(c(re),{value:C.value.name,"onUpdate:value":l[0]||(l[0]=e=>C.value.name=e),placeholder:"输入模版名称"},null,8,["value"])]),_:1}),r(c(le),{label:"描述",path:"description"},{default:u(()=>[r(c(re),{value:C.value.description,"onUpdate:value":l[1]||(l[1]=e=>C.value.description=e),type:"textarea",rows:2,placeholder:"输入模版描述"},null,8,["value"])]),_:1}),r(c(le),{label:"CLI 工具",path:"cliType"},{default:u(()=>[r(c(te),{value:C.value.cliType,"onUpdate:value":l[2]||(l[2]=e=>C.value.cliType=e),options:b,placeholder:"选择 CLI 工具类型"},null,8,["value"])]),_:1})]),_:1}),C.value.cliType?o("",!0):(n(),g(c(ze),{key:0,size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[r(c(ee),{description:"请先选择 CLI 工具类型以显示配置项"})]),_:1})),"claude"===C.value.cliType?(n(),t(m,{key:1},[r(c(ze),{title:"CLAUDE.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[s("div",Yh,[r(c(se),{align:"center"},{default:u(()=>[r(c(W),{value:C.value.aiConfigs.claude.enabled,"onUpdate:value":l[3]||(l[3]=e=>C.value.aiConfigs.claude.enabled=e)},null,8,["value"]),r(c(V),{depth:C.value.aiConfigs.claude.enabled?1:3},{default:u(()=>[...l[27]||(l[27]=[y("启用 CLAUDE.md",-1)])]),_:1},8,["depth"])]),_:1})]),r(c(je),{show:C.value.aiConfigs.claude.enabled},{default:u(()=>[r(c(te),{value:P.value,"onUpdate:value":[l[4]||(l[4]=e=>P.value=e),A],options:M.value,placeholder:"选择 Prompt 预设作为 CLAUDE.md 内容",clearable:"",style:{"margin-bottom":"10px"}},null,8,["value","options"]),C.value.aiConfigs.claude.content?(n(),t("div",Xh,[r(Zh,{content:C.value.aiConfigs.claude.content},null,8,["content"])])):(n(),g(c(ee),{key:1,description:"可选择 Prompt 预设,或留空",style:{padding:"24px 0"}}))]),_:1},8,["show"])]),_:1}),r(c(ze),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.skills.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:$.value,"onUpdate:value":l[5]||(l[5]=e=>$.value=e),options:S.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.agents.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:j.value,"onUpdate:value":l[6]||(l[6]=e=>j.value=e),options:z.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.commands.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:O.value,"onUpdate:value":l[7]||(l[7]=e=>O.value=e),options:I.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:C.value.mcpServers,"onUpdate:value":l[8]||(l[8]=e=>C.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):o("",!0),"codex"===C.value.cliType?(n(),t(m,{key:2},[r(c(ze),{title:"AGENTS.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[s("div",Qh,[r(c(se),{align:"center"},{default:u(()=>[r(c(W),{value:C.value.aiConfigs.codex.enabled,"onUpdate:value":l[9]||(l[9]=e=>C.value.aiConfigs.codex.enabled=e)},null,8,["value"]),r(c(V),{depth:C.value.aiConfigs.codex.enabled?1:3},{default:u(()=>[...l[28]||(l[28]=[y("启用 AGENTS.md",-1)])]),_:1},8,["depth"])]),_:1})]),r(c(je),{show:C.value.aiConfigs.codex.enabled},{default:u(()=>[r(Up,{modelValue:C.value.aiConfigs.codex.content,"onUpdate:modelValue":l[10]||(l[10]=e=>C.value.aiConfigs.codex.content=e),rows:10,"min-height":220,placeholder:"输入 AGENTS.md 内容"},null,8,["modelValue"])]),_:1},8,["show"])]),_:1}),r(c(ze),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.skills.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:$.value,"onUpdate:value":l[11]||(l[11]=e=>$.value=e),options:S.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.agents.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:j.value,"onUpdate:value":l[12]||(l[12]=e=>j.value=e),options:z.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.commands.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:O.value,"onUpdate:value":l[13]||(l[13]=e=>O.value=e),options:I.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:C.value.mcpServers,"onUpdate:value":l[14]||(l[14]=e=>C.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):o("",!0),"gemini"===C.value.cliType?(n(),t(m,{key:3},[r(c(ze),{title:"GEMINI.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[s("div",eb,[r(c(se),{align:"center"},{default:u(()=>[r(c(W),{value:C.value.aiConfigs.gemini.enabled,"onUpdate:value":l[15]||(l[15]=e=>C.value.aiConfigs.gemini.enabled=e)},null,8,["value"]),r(c(V),{depth:C.value.aiConfigs.gemini.enabled?1:3},{default:u(()=>[...l[29]||(l[29]=[y("启用 GEMINI.md",-1)])]),_:1},8,["depth"])]),_:1})]),r(c(je),{show:C.value.aiConfigs.gemini.enabled},{default:u(()=>[r(Up,{modelValue:C.value.aiConfigs.gemini.content,"onUpdate:modelValue":l[16]||(l[16]=e=>C.value.aiConfigs.gemini.content=e),rows:10,"min-height":220,placeholder:"输入 GEMINI.md 内容"},null,8,["modelValue"])]),_:1},8,["show"])]),_:1}),r(c(ze),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.skills.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:$.value,"onUpdate:value":l[17]||(l[17]=e=>$.value=e),options:S.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:C.value.mcpServers,"onUpdate:value":l[18]||(l[18]=e=>C.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):o("",!0),"opencode"===C.value.cliType?(n(),t(m,{key:4},[r(c(ze),{title:".opencode/AGENTS.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[s("div",ab,[r(c(se),{align:"center"},{default:u(()=>[r(c(W),{value:C.value.aiConfigs.opencode.enabled,"onUpdate:value":l[19]||(l[19]=e=>C.value.aiConfigs.opencode.enabled=e)},null,8,["value"]),r(c(V),{depth:C.value.aiConfigs.opencode.enabled?1:3},{default:u(()=>[...l[30]||(l[30]=[y("启用 .opencode/AGENTS.md",-1)])]),_:1},8,["depth"])]),_:1})]),r(c(je),{show:C.value.aiConfigs.opencode.enabled},{default:u(()=>[r(Up,{modelValue:C.value.aiConfigs.opencode.content,"onUpdate:modelValue":l[20]||(l[20]=e=>C.value.aiConfigs.opencode.content=e),rows:10,"min-height":220,placeholder:"输入 .opencode/AGENTS.md 内容"},null,8,["modelValue"])]),_:1},8,["show"])]),_:1}),r(c(ze),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.skills.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:$.value,"onUpdate:value":l[21]||(l[21]=e=>$.value=e),options:S.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.agents.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:j.value,"onUpdate:value":l[22]||(l[22]=e=>j.value=e),options:z.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.commands.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:O.value,"onUpdate:value":l[23]||(l[23]=e=>O.value=e),options:I.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),r(c(ze),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[r(c(G),{size:"small"},{default:u(()=>[y("已选 "+v(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[r(c(Oe),{value:C.value.mcpServers,"onUpdate:value":l[24]||(l[24]=e=>C.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):o("",!0)]),_:1},8,["model"])]),_:1})]),_:1},8,["show","title"]))}},[["__scopeId","data-v-2aaf6671"]]),tb={key:0},nb={key:1},sb={key:2},ob={key:4},ib={__name:"ConfigApplyModal",props:{show:Boolean,template:Object},emits:["update:show","success"],setup(e,{emit:a}){const i=e,d=a,p=Ie(),h=l(null),b=l(!1),k=l(!1),_=l(null),C=l(!1),U=l([]),S=l(null),z={claude:{key:"claude",name:"Claude",fileName:"CLAUDE.md",color:"#cc785c"},codex:{key:"codex",name:"Codex",fileName:"AGENTS.md",color:"#10a37f"},gemini:{key:"gemini",name:"Gemini",fileName:"GEMINI.md",color:"#4285f4"},opencode:{key:"opencode",name:"OpenCode",fileName:".opencode/AGENTS.md",color:"#ff6b35"}},I=w(()=>{var e,a;const l=null==(e=i.template)?void 0:e.aiConfigs;if(!l)return[];const t=Object.entries(l).filter(([,e])=>(null==e?void 0:e.enabled)&&(null==e?void 0:e.content)).map(([e])=>z[e]).filter(Boolean),n=null==(a=i.template)?void 0:a.cliType;if(n&&"all"!==n){const e=l[n];if((null==e?void 0:e.enabled)&&(null==e?void 0:e.content)&&z[n])return[z[n]]}return t});function T(){return I.value.map(e=>e.key)}const P=l({targetPath:"",aiConfigTypes:[]}),M={targetPath:{required:!0,message:"请输入目标路径",trigger:"blur"}},$=w(()=>{const e=new Set,a=[];for(const l of U.value){const t=l.fullPath||l.path||l.name;t&&!e.has(t)&&(e.add(t),a.push({label:`${l.displayName||l.name} (${l.channel})`,value:t}))}return a});function j(e){e&&(P.value.targetPath=e)}async function O(){if(P.value.targetPath&&i.template&&0!==P.value.aiConfigTypes.length){b.value=!0;try{const e=await async function(e,a,l=["claude"]){const t=Array.isArray(l)?l:[l];return(await dt.post(`${nh}/${e}/preview`,{targetPath:a,aiConfigTypes:t})).data}(i.template.id,P.value.targetPath,P.value.aiConfigTypes);e.success?_.value=e.data:p.error(e.message||"预览失败")}catch(e){p.error("预览失败: "+e.message)}finally{b.value=!1}}}async function A(){var e,a,l;try{await(null==(e=h.value)?void 0:e.validate())}catch{return}if(i.template&&0!==P.value.aiConfigTypes.length){k.value=!0;try{const e=await async function(e,a,l=["claude"]){const t=Array.isArray(l)?l:[l];return(await dt.post(`${nh}/${e}/apply`,{targetPath:a,aiConfigTypes:t})).data}(i.template.id,P.value.targetPath,P.value.aiConfigTypes);if(e.success){const t=(null==(l=null==(a=e.data)?void 0:a.results)?void 0:l.skipped)||[];t.length>0?p.warning(`模版已部分应用,${t.length} 项已跳过`):p.success("模版应用成功"),d("success",e.data||null)}else p.error(e.message||"应用失败")}catch(t){p.error("应用失败: "+t.message)}finally{k.value=!1}}}return x(()=>i.show,e=>{e&&(P.value.targetPath="",P.value.aiConfigTypes=T(),_.value=null,S.value=null,async function(){C.value=!0;try{const e=await qy();e.success?U.value=Array.isArray(e.data)?e.data:[]:U.value=[]}catch(e){U.value=[]}finally{C.value=!1}}())}),x(()=>i.template,()=>{P.value.aiConfigTypes=T()}),(a,l)=>{var i;return n(),g(c(ie),{show:e.show,preset:"card",title:`应用模版: ${(null==(i=e.template)?void 0:i.name)||""}`,style:{width:"650px"},"mask-closable":!1,"onUpdate:show":l[4]||(l[4]=e=>d("update:show",e))},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:l[3]||(l[3]=e=>d("update:show",!1))},{default:u(()=>[...l[14]||(l[14]=[y("取消",-1)])]),_:1}),r(c(K),{type:"primary",loading:k.value,disabled:!P.value.targetPath||0===P.value.aiConfigTypes.length,onClick:A},{default:u(()=>[...l[15]||(l[15]=[y(" 确认应用 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:u(()=>[r(c(ae),{ref_key:"formRef",ref:h,model:P.value,rules:M},{default:u(()=>[r(c(le),{label:"选择已有项目"},{default:u(()=>[r(c(te),{value:S.value,"onUpdate:value":[l[0]||(l[0]=e=>S.value=e),j],options:$.value,loading:C.value,placeholder:"选择已有项目路径",filterable:"",clearable:""},null,8,["value","options","loading"])]),_:1}),r(c(le),{label:"目标项目路径",path:"targetPath"},{default:u(()=>[r(c(re),{value:P.value.targetPath,"onUpdate:value":l[1]||(l[1]=e=>P.value.targetPath=e),placeholder:"输入项目目录路径,如 /path/to/project"},null,8,["value"])]),_:1}),I.value.length>0?(n(),g(c(le),{key:0,label:"生成配置文件"},{default:u(()=>[r(c(Ae),{value:P.value.aiConfigTypes,"onUpdate:value":l[2]||(l[2]=e=>P.value.aiConfigTypes=e)},{default:u(()=>[r(c(se),null,{default:u(()=>[(n(!0),t(m,null,f(I.value,e=>(n(),g(c(xe),{key:e.key,value:e.key},{default:u(()=>[r(c(se),{align:"center",size:4},{default:u(()=>[r(c(q),{size:16,color:e.color},{default:u(()=>[r(c(Oa))]),_:1},8,["color"]),s("span",null,v(e.name),1),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[y("("+v(e.fileName)+")",1)]),_:2},1024)]),_:2},1024)]),_:2},1032,["value"]))),128))]),_:1})]),_:1},8,["value"]),r(c(V),{depth:"3",style:{"font-size":"12px","margin-top":"4px",display:"block"}},{default:u(()=>[...l[5]||(l[5]=[y(" 可同时选择多个 CLI 配置文件 ",-1)])]),_:1})]),_:1})):o("",!0)]),_:1},8,["model"]),r(c(se),{style:{"margin-bottom":"16px"}},{default:u(()=>[r(c(K),{onClick:O,loading:b.value,disabled:!P.value.targetPath||0===P.value.aiConfigTypes.length},{default:u(()=>[...l[6]||(l[6]=[y(" 预览应用效果 ",-1)])]),_:1},8,["loading","disabled"])]),_:1}),_.value?(n(),g(c(ze),{key:0,size:"small",title:"应用预览"},{default:u(()=>[r(c(se),{vertical:""},{default:u(()=>{var e,a,s,i,d;return[_.value.summary?(n(),t("div",tb,[r(c(V),{depth:"3"},{default:u(()=>[...l[7]||(l[7]=[y("将应用:",-1)])]),_:1}),r(c(se),{style:{"margin-top":"8px"},wrap:""},{default:u(()=>[(n(!0),t(m,null,f(_.value.summary.aiConfigs,e=>{return n(),g(c(G),{key:e.type,type:(a=e.type,{claude:"warning",codex:"success",gemini:"info",opencode:"error"}[a]||"default"),size:"small"},{default:u(()=>[y(v(e.fileName),1)]),_:2},1032,["type"]);var a}),128)),_.value.summary.skills?(n(),g(c(G),{key:0,type:"info",size:"small"},{default:u(()=>[y(v(_.value.summary.skills)+" Skills",1)]),_:1})):o("",!0),_.value.summary.agents?(n(),g(c(G),{key:1,type:"info",size:"small"},{default:u(()=>[y(v(_.value.summary.agents)+" Agents",1)]),_:1})):o("",!0),_.value.summary.commands?(n(),g(c(G),{key:2,type:"info",size:"small"},{default:u(()=>[y(v(_.value.summary.commands)+" Commands",1)]),_:1})):o("",!0),_.value.summary.plugins?(n(),g(c(G),{key:3,type:"warning",size:"small"},{default:u(()=>[y(v(_.value.summary.plugins)+" Plugins",1)]),_:1})):o("",!0),_.value.summary.mcpServers?(n(),g(c(G),{key:4,type:"warning",size:"small"},{default:u(()=>[y(v(_.value.summary.mcpServers)+" MCP",1)]),_:1})):o("",!0),_.value.summary.skipped?(n(),g(c(G),{key:5,type:"error",size:"small"},{default:u(()=>[y(v(_.value.summary.skipped)+" Skipped",1)]),_:1})):o("",!0)]),_:1})])):o("",!0),r(c(me),{style:{margin:"12px 0"}}),(null==(e=_.value.willCreate)?void 0:e.length)?(n(),t("div",nb,[r(c(V),{type:"success"},{default:u(()=>[...l[8]||(l[8]=[y("将创建:",-1)])]),_:1}),r(c(Le),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),t(m,null,f(_.value.willCreate,e=>(n(),g(c(Ee),{key:e},{default:u(()=>[r(c(V),{code:""},{default:u(()=>[y(v(e),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):o("",!0),(null==(a=_.value.willOverwrite)?void 0:a.length)?(n(),t("div",sb,[r(c(V),{type:"warning"},{default:u(()=>[...l[9]||(l[9]=[y("将覆盖:",-1)])]),_:1}),r(c(Le),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),t(m,null,f(_.value.willOverwrite,e=>(n(),g(c(Ee),{key:e},{default:u(()=>[r(c(V),{code:""},{default:u(()=>[y(v(e),1)]),_:2},1024),r(c(G),{type:"warning",size:"tiny",style:{"margin-left":"8px"}},{default:u(()=>[...l[10]||(l[10]=[y("已存在",-1)])]),_:1})]),_:2},1024))),128))]),_:1})])):o("",!0),(null==(s=_.value.willOverwrite)?void 0:s.length)?(n(),g(c(fe),{key:3,type:"warning",style:{"margin-top":"8px"}},{default:u(()=>[...l[11]||(l[11]=[y(" 以上文件将被覆盖,请确认后再应用 ",-1)])]),_:1})):o("",!0),(null==(i=_.value.skipped)?void 0:i.length)?(n(),t("div",ob,[r(c(V),{type:"error"},{default:u(()=>[...l[12]||(l[12]=[y("将跳过:",-1)])]),_:1}),r(c(Le),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),t(m,null,f(_.value.skipped,(e,a)=>(n(),g(c(Ee),{key:`${e.type}-${e.item}-${a}`},{default:u(()=>[r(c(V),null,{default:u(()=>[y(v(e.type)+": ",1)]),_:2},1024),r(c(V),{code:""},{default:u(()=>[y(v(e.item),1)]),_:2},1024),r(c(V),{depth:"3"},{default:u(()=>[y(" - "+v(e.reason),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):o("",!0),(null==(d=_.value.skipped)?void 0:d.length)?(n(),g(c(fe),{key:5,type:"info",style:{"margin-top":"8px"}},{default:u(()=>[...l[13]||(l[13]=[y(" 本次将进行部分应用,以上项会被跳过。 ",-1)])]),_:1})):o("",!0)]}),_:1})]),_:1})):o("",!0)]),_:1},8,["show","title"])}}},rb={key:0,class:"preview-content"},ub={class:"info-section"},cb={class:"info-row"},db={class:"value"},pb={key:0,class:"info-row"},vb={class:"value"},mb={key:1,class:"info-row"},fb={class:"stats-section"},gb={class:"stats-grid"},yb={key:1,class:"stat-item"},hb={key:2,class:"stat-item"},bb={key:3,class:"stat-item"},wb={key:4,class:"stat-item"},kb={key:5,class:"stat-item"},_b={class:"markdown-content"},xb={class:"markdown-content"},Cb={class:"list-items"},Ub={class:"list-items"},Sb={class:"list-items"},zb={class:"list-items"},Ib=Pl({__name:"ConfigPreviewModal",props:{show:Boolean,template:Object},emits:["update:show","apply"],setup(e,{emit:a}){const l=e,i=a,d={claude:{key:"claude",name:"Claude",fileName:"CLAUDE.md",color:"#cc785c"},codex:{key:"codex",name:"Codex",fileName:"AGENTS.md",color:"#10a37f"},gemini:{key:"gemini",name:"Gemini",fileName:"GEMINI.md",color:"#4285f4"},opencode:{key:"opencode",name:"OpenCode",fileName:".opencode/AGENTS.md",color:"#ff6b35"}},p=w(()=>{var e,a;const t=null==(e=l.template)?void 0:e.aiConfigs;if(!t)return[];const n=Object.entries(t).filter(([,e])=>(null==e?void 0:e.enabled)&&(null==e?void 0:e.content)).map(([e,a])=>({...d[e],content:a.content})).filter(e=>e.key),s=null==(a=l.template)?void 0:a.cliType;if(s&&"all"!==s){const e=t[s];if((null==e?void 0:e.enabled)&&(null==e?void 0:e.content)&&d[s])return[{...d[s],content:e.content}]}return n}),h=w(()=>p.value.length>0),b=w(()=>{var e,a,t,n,s;const o=l.template;return!!o&&(h.value||(null==(e=o.claudeMd)?void 0:e.content)||(null==(a=o.skills)?void 0:a.length)||(null==(t=o.agents)?void 0:t.length)||(null==(n=o.commands)?void 0:n.length)||(null==(s=o.mcpServers)?void 0:s.length))}),k={claude:{label:"Claude",color:"#cc785c",textColor:"#fff",borderColor:"#cc785c"},codex:{label:"Codex",color:"#10a37f",textColor:"#fff",borderColor:"#10a37f"},gemini:{label:"Gemini",color:"#4285f4",textColor:"#fff",borderColor:"#4285f4"},opencode:{label:"OpenCode",color:"#ff6b35",textColor:"#fff",borderColor:"#ff6b35"}};function _(e){var a;return(null==(a=k[e])?void 0:a.label)||e}function x(e){const a=k[e];return a?{color:a.color,textColor:a.textColor,borderColor:a.borderColor}:{}}function C(){i("apply",l.template)}return(a,l)=>{var d;return n(),g(c(ie),{show:e.show,preset:"card",title:`模版预览: ${(null==(d=e.template)?void 0:d.name)||""}`,style:{width:"750px","max-height":"80vh"},"mask-closable":!0,"onUpdate:show":l[1]||(l[1]=e=>i("update:show",e))},{footer:u(()=>[r(c(se),{justify:"end"},{default:u(()=>[r(c(K),{onClick:l[0]||(l[0]=e=>i("update:show",!1))},{default:u(()=>[...l[7]||(l[7]=[y("关闭",-1)])]),_:1}),r(c(K),{type:"primary",onClick:C},{default:u(()=>[...l[8]||(l[8]=[y("应用此模版",-1)])]),_:1})]),_:1})]),default:u(()=>{var a,i,d,w,k;return[e.template?(n(),t("div",rb,[s("div",ub,[s("div",cb,[l[2]||(l[2]=s("span",{class:"label"},"名称:",-1)),s("span",db,v(e.template.name),1)]),e.template.description?(n(),t("div",pb,[l[3]||(l[3]=s("span",{class:"label"},"描述:",-1)),s("span",vb,v(e.template.description),1)])):o("",!0),e.template.cliType?(n(),t("div",mb,[l[4]||(l[4]=s("span",{class:"label"},"CLI 工具:",-1)),r(c(G),{size:"small",color:x(e.template.cliType),round:""},{default:u(()=>[y(v(_(e.template.cliType)),1)]),_:1},8,["color"])])):o("",!0)]),s("div",fb,[l[6]||(l[6]=s("div",{class:"section-title"},"包含配置",-1)),s("div",gb,[h.value?(n(!0),t(m,{key:0},f(p.value,e=>(n(),t("div",{class:"stat-item",key:e.key},[r(c(q),{size:"20",color:e.color},{default:u(()=>[r(c(Oa))]),_:1},8,["color"]),s("span",null,v(e.fileName),1)]))),128)):(null==(a=e.template.claudeMd)?void 0:a.enabled)?(n(),t("div",yb,[r(c(q),{size:"20"},{default:u(()=>[r(c(Oa))]),_:1}),l[5]||(l[5]=s("span",null,"CLAUDE.md",-1))])):o("",!0),(null==(i=e.template.skills)?void 0:i.length)?(n(),t("div",hb,[r(c(q),{size:"20"},{default:u(()=>[r(c(Xe))]),_:1}),s("span",null,v(e.template.skills.length)+" Skills",1)])):o("",!0),(null==(d=e.template.agents)?void 0:d.length)?(n(),t("div",bb,[r(c(q),{size:"20"},{default:u(()=>[r(c(ol))]),_:1}),s("span",null,v(e.template.agents.length)+" Agents",1)])):o("",!0),(null==(w=e.template.commands)?void 0:w.length)?(n(),t("div",wb,[r(c(q),{size:"20"},{default:u(()=>[r(c(ea))]),_:1}),s("span",null,v(e.template.commands.length)+" Commands",1)])):o("",!0),(null==(k=e.template.mcpServers)?void 0:k.length)?(n(),t("div",kb,[r(c(q),{size:"20"},{default:u(()=>[r(c(ja))]),_:1}),s("span",null,v(e.template.mcpServers.length)+" MCP Servers",1)])):o("",!0)])]),b.value?(n(),g(c(ye),{key:0,class:"details-section"},{default:u(()=>{var a,l,i,d,y;return[(n(!0),t(m,null,f(p.value,e=>(n(),g(c(he),{key:e.key,title:`${e.name} 配置 (${e.fileName})`,name:e.key},{default:u(()=>[s("div",_b,[r(Zh,{content:e.content},null,8,["content"])])]),_:2},1032,["title","name"]))),128)),!h.value&&(null==(a=e.template.claudeMd)?void 0:a.content)?(n(),g(c(he),{key:0,title:"CLAUDE.md 内容",name:"claudeMd"},{default:u(()=>[s("div",xb,[r(Zh,{content:e.template.claudeMd.content},null,8,["content"])])]),_:1})):o("",!0),(null==(l=e.template.skills)?void 0:l.length)?(n(),g(c(he),{key:1,title:"Skills 列表",name:"skills"},{default:u(()=>[s("div",Cb,[(n(!0),t(m,null,f(e.template.skills,(e,a)=>(n(),t("div",{key:a,class:"list-item"},v(e.name||e),1))),128))])]),_:1})):o("",!0),(null==(i=e.template.agents)?void 0:i.length)?(n(),g(c(he),{key:2,title:"Agents 列表",name:"agents"},{default:u(()=>[s("div",Ub,[(n(!0),t(m,null,f(e.template.agents,(e,a)=>(n(),t("div",{key:a,class:"list-item"},v(e.name||e),1))),128))])]),_:1})):o("",!0),(null==(d=e.template.commands)?void 0:d.length)?(n(),g(c(he),{key:3,title:"Commands 列表",name:"commands"},{default:u(()=>[s("div",Sb,[(n(!0),t(m,null,f(e.template.commands,(e,a)=>(n(),t("div",{key:a,class:"list-item"},v(e.name||e),1))),128))])]),_:1})):o("",!0),(null==(y=e.template.mcpServers)?void 0:y.length)?(n(),g(c(he),{key:4,title:"MCP Servers",name:"mcpServers"},{default:u(()=>[s("div",zb,[(n(!0),t(m,null,f(e.template.mcpServers,(e,a)=>(n(),t("div",{key:a,class:"list-item"},v(e.name||e),1))),128))])]),_:1})):o("",!0)]}),_:1})):o("",!0)])):o("",!0)]}),_:1},8,["show","title"])}}},[["__scopeId","data-v-dfaac83b"]]),Tb={key:0,class:"panel-header"},Pb={class:"header-left"},Mb={class:"header-right"},$b={key:1,class:"drawer-header-bar"},jb={class:"header-right"},Ob={class:"stats-bar"},Ab={class:"stats-text"},Lb={class:"filter-bar"},Eb={class:"panel-content"},Db={key:0,class:"empty-state"},Nb={key:1,class:"card-list"},Fb={class:"panel-footer"},Rb=Pl({__name:"ConfigTemplatesPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1}},emits:["back","updated"],setup(e){const a=e,i=Ie(),p=Me(),h=l(!1),k=l([]),_=l({}),C=l(""),U=l(""),S=[{label:"全部 CLI",value:""},{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"}],z=l(null),I=l(!1),T=l(!1),P=l(!1),M=l(null),$=l(null),j=l(null),O=w(()=>{let e=k.value;if(U.value&&(e=e.filter(e=>e.cliType===U.value)),C.value.trim()){const a=C.value.toLowerCase();e=e.filter(e=>{var l,t;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))})}return e});async function A(){h.value=!0;try{const[e,a]=await Promise.all([sh(),oh()]);e.success&&(k.value=e.data||[]),a.success&&(_.value=a.data||{})}catch(e){i.error("加载数据失败: "+e.message)}finally{h.value=!1}}function L(){M.value=null,I.value=!0}function E(e){M.value={...e},I.value=!0}function D(e){j.value=e,P.value=!0}function N(e){$.value=e,P.value=!1,T.value=!0}function F(e){p.warning({title:"确认删除",content:`确定要删除模版 "${e.name}" 吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{z.value=e.id;try{const a=await async function(e){return(await dt.delete(`${nh}/${e}`)).data}(e.id);a.success?(i.success("删除成功"),A()):i.error(a.message||"删除失败")}catch(a){i.error("删除失败: "+a.message)}finally{z.value=null}}})}function R(){I.value=!1,A()}function B(){T.value=!1,A()}return b(()=>A()),x(()=>a.drawerVisible,e=>{e&&A()}),(a,l)=>(n(),t("div",{class:d(["templates-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?o("",!0):(n(),t("div",Tb,[s("div",Pb,[e.hideBack?o("",!0):(n(),g(c(K),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Aa))]),_:1})]),_:1})),l[6]||(l[6]=s("span",{class:"panel-title"},"配置模版管理",-1))]),s("div",Mb,[r(c(K),{text:"",onClick:L,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[7]||(l[7]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:A,loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[8]||(l[8]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),t("div",$b,[s("div",jb,[r(c(K),{text:"",onClick:L,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ve))]),_:1})]),default:u(()=>[l[9]||(l[9]=y(" 创建 ",-1))]),_:1}),r(c(K),{text:"",onClick:A,loading:h.value,class:"action-btn"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Qa))]),_:1})]),default:u(()=>[l[10]||(l[10]=y(" 刷新 ",-1))]),_:1},8,["loading"])])])):o("",!0),s("div",Ob,[s("span",Ab," 共 "+v(k.value.length)+" 个模版 ",1)]),s("div",Lb,[r(c(re),{value:C.value,"onUpdate:value":l[1]||(l[1]=e=>C.value=e),placeholder:"搜索模版...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[r(c(q),null,{default:u(()=>[r(c(el))]),_:1})]),_:1},8,["value"]),r(c(te),{value:U.value,"onUpdate:value":l[2]||(l[2]=e=>U.value=e),options:S,size:"small",class:"filter-select"},null,8,["value"])]),s("div",Eb,[r(c(Q),{show:h.value},{default:u(()=>[0!==O.value.length||h.value?(n(),t("div",Nb,[(n(!0),t(m,null,f(O.value,e=>(n(),g(Vh,{key:e.id,template:e,deleting:z.value===e.id,onClick:D,onPreview:D,onEdit:E,onDelete:F,onApply:N},null,8,["template","deleting"]))),128))])):(n(),t("div",Db,[r(c(ee),{description:"暂无配置模版"},{icon:u(()=>[r(c(q),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[r(c(oa))]),_:1})]),extra:u(()=>[r(c(K),{size:"small",onClick:L},{default:u(()=>[...l[11]||(l[11]=[y("创建第一个模版",-1)])]),_:1})]),_:1})]))]),_:1},8,["show"])]),s("div",Fb,[r(c(q),{size:"14",class:"info-icon"},{default:u(()=>[r(c(Ma))]),_:1}),l[12]||(l[12]=s("span",null,"配置模版可快速应用到工作区",-1))]),r(lb,{show:I.value,"onUpdate:show":l[3]||(l[3]=e=>I.value=e),template:M.value,"available-configs":_.value,onSuccess:R},null,8,["show","template","available-configs"]),r(ib,{show:T.value,"onUpdate:show":l[4]||(l[4]=e=>T.value=e),template:$.value,onSuccess:B},null,8,["show","template"]),r(Ib,{show:P.value,"onUpdate:show":l[5]||(l[5]=e=>P.value=e),template:j.value,onApply:N},null,8,["show","template"])],2))}},[["__scopeId","data-v-d262cd02"]]),Bb=Pl({__name:"ConfigTemplatesDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:o}=ko(700,600),i=w({get:()=>l.visible,set:e=>t("update:visible",e)}),d={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(c(pe),{show:i.value,"onUpdate:show":a[1]||(a[1]=e=>i.value=e),width:c(o),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1,"body-content-style":d},{header:u(()=>[...a[2]||(a[2]=[s("div",{class:"drawer-header"},"配置模版管理",-1)])]),default:u(()=>[r(Rb,{"in-drawer":!0,"hide-back":!0,"drawer-visible":i.value,onBack:a[0]||(a[0]=e=>i.value=!1)},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-4111b3a0"]]);const Hb={class:"drawer-header"},qb={class:"export-import-container"},Kb={class:"section"},Gb={class:"section-header"},Wb={class:"section"},Vb={class:"section-header"},Jb={key:0,class:"import-preview"},Zb={class:"preview-stats"},Yb={class:"stat-item"},Xb={class:"stat-item"},Qb={class:"stat-item"},ew=Pl({__name:"ConfigExportDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const i=e,d=a,{drawerWidth:p}=ko(520,480),m=w({get:()=>i.visible,set:e=>d("update:visible",e)}),f=l(!1),h=l(!1),b=l(null),k=l(null),_=l(null),x=l(null),C=l(!1);async function U(){f.value=!0;try{const e=await async function(e="zip"){return(await dt.get(`/config-export?format=${e}`,{responseType:"blob"})).data}("zip"),a=window.URL.createObjectURL(e),l=document.createElement("a");l.href=a,l.download=`ctx-config-${(new Date).toISOString().split("T")[0]}.zip`,document.body.appendChild(l),l.click(),document.body.removeChild(l),window.URL.revokeObjectURL(a),Un.success("配置导出成功")}catch(e){Un.error("导出失败: "+e.message)}finally{f.value=!1}}async function S({file:e}){try{b.value=null,k.value=null,_.value=null,x.value=null;const a=e.file.name||"";if(a.toLowerCase().endsWith(".zip")){const a=await async function(e){const a=await e.arrayBuffer();return(await dt.post("/config-export/preview-zip",a,{headers:{"Content-Type":"application/zip"}})).data}(e.file);return void(a.success?(b.value=a.data,_.value=e.file,k.value=null,x.value="zip",Un.success("ZIP 配置解析成功")):Un.error("ZIP 配置格式错误: "+a.message))}const l=await e.file.text(),t=JSON.parse(l),n=await async function(e){return(await dt.post("/config-export/preview",{data:e})).data}(t);n.success?(b.value=n.data,k.value=t,_.value=null,x.value="json",Un.success("配置文件解析成功")):Un.error("配置文件格式错误: "+n.message)}catch(a){Un.error("文件解析失败: "+a.message)}}async function z(){if(k.value||_.value){h.value=!0;try{const e="zip"===x.value?await async function(e,a=!1){const l=await e.arrayBuffer();return(await dt.post(`/config-export/import-zip?overwrite=${a}`,l,{headers:{"Content-Type":"application/zip"}})).data}(_.value,C.value):await async function(e,a=!1){return(await dt.post("/config-export/import",{data:e,overwrite:a})).data}(k.value,C.value);e.success?(Un.success("配置导入成功: "+e.message),I()):Un.error("配置导入失败: "+e.message)}catch(e){Un.error("导入失败: "+e.message)}finally{h.value=!1}}}function I(){b.value=null,k.value=null,_.value=null,x.value=null,C.value=!1}return(e,a)=>(n(),g(c(pe),{show:m.value,"onUpdate:show":a[1]||(a[1]=e=>m.value=e),width:c(p),placement:"right","mask-closable":!0},{default:u(()=>[r(c(de),{closable:"","native-scrollbar":!1},{header:u(()=>[s("div",Hb,[r(c(q),{size:20,color:"#18a058"},{default:u(()=>[r(c(Xa))]),_:1}),a[2]||(a[2]=s("span",null,"配置导出/导入",-1))])]),default:u(()=>[s("div",qb,[s("div",Kb,[s("div",Gb,[r(c(V),{strong:""},{default:u(()=>[...a[3]||(a[3]=[y("导出配置",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[4]||(a[4]=[y(" 导出所有前端配置为 ZIP(含 UI/终端/Prompts/安全等) ",-1)])]),_:1})]),r(c(K),{type:"primary",loading:f.value,onClick:U},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ha))]),_:1})]),default:u(()=>[a[5]||(a[5]=y(" 导出配置 ",-1))]),_:1},8,["loading"])]),r(c(me)),s("div",Wb,[s("div",Vb,[r(c(V),{strong:""},{default:u(()=>[...a[6]||(a[6]=[y("导入配置",-1)])]),_:1}),r(c(V),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[7]||(a[7]=[y(" 从 JSON 或 ZIP 文件导入配置(支持覆盖已有配置) ",-1)])]),_:1})]),r(c(Ce),{"custom-request":S,"show-file-list":!1,accept:".json,.zip"},{default:u(()=>[r(c(K),null,{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(il))]),_:1})]),default:u(()=>[a[8]||(a[8]=y(" 选择配置文件 ",-1))]),_:1})]),_:1}),b.value?(n(),t("div",Jb,[r(c(V),{strong:"",style:{"font-size":"14px"}},{default:u(()=>[...a[9]||(a[9]=[y("导入预览",-1)])]),_:1}),s("div",Zb,[s("div",Yb,[r(c(V),{depth:"3"},{default:u(()=>[...a[10]||(a[10]=[y("配置模板:",-1)])]),_:1}),r(c(V),null,{default:u(()=>[y(v(b.value.counts.configTemplates),1)]),_:1})]),s("div",Xb,[r(c(V),{depth:"3"},{default:u(()=>[...a[11]||(a[11]=[y("渠道总数:",-1)])]),_:1}),r(c(V),null,{default:u(()=>[y(v(b.value.counts.channels),1)]),_:1})]),s("div",Qb,[r(c(V),{depth:"3"},{default:u(()=>[...a[12]||(a[12]=[y("插件:",-1)])]),_:1}),r(c(V),null,{default:u(()=>[y(v(b.value.counts.plugins||0),1)]),_:1})])]),r(c(xe),{checked:C.value,"onUpdate:checked":a[0]||(a[0]=e=>C.value=e),style:{"margin-top":"12px"}},{default:u(()=>[...a[13]||(a[13]=[y(" 覆盖已有配置 ",-1)])]),_:1},8,["checked"]),r(c(se),{style:{"margin-top":"16px"}},{default:u(()=>[r(c(K),{type:"primary",loading:h.value,onClick:z},{default:u(()=>[...a[14]||(a[14]=[y(" 确认导入 ",-1)])]),_:1},8,["loading"]),r(c(K),{onClick:I},{default:u(()=>[...a[15]||(a[15]=[y("取消",-1)])]),_:1})]),_:1})])):o("",!0)])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-f0ce0a36"]]),aw=["disabled"],lw=Pl({__name:"HeaderButton",props:{icon:{type:Object,required:!0},tooltip:{type:String,default:""},tooltipPlacement:{type:String,default:"bottom"},iconSize:{type:Number,default:18},active:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:["click"],setup(e,{emit:a}){const l=e,t=a,o=w(()=>l.disabled?"#6b7280":l.active?"#18a058":void 0);function i(){l.disabled||t("click")}return(a,l)=>(n(),g(c(ce),{placement:e.tooltipPlacement},{trigger:u(()=>[s("button",{class:d(["header-button",{active:e.active,disabled:e.disabled}]),disabled:e.disabled,onClick:i},[r(c(q),{size:e.iconSize,color:o.value},{default:u(()=>[(n(),g(z(e.icon)))]),_:1},8,["size","color"])],10,aw)]),default:u(()=>[$(a.$slots,"default",{},()=>[y(v(e.tooltip),1)],!0)]),_:3},8,["placement"]))}},[["__scopeId","data-v-f467fc1a"]]);async function tw(e=null){const a=e?{platform:e}:{};return(await dt.get("/env/check",{params:a})).data}const nw={class:"modal-header"},sw={class:"modal-content"},ow={class:"desc-text"},iw={class:"conflict-list"},rw={class:"list-header"},uw={key:0,class:"selected-hint"},cw={class:"conflict-items"},dw=["onClick"],pw={class:"item-content"},vw={class:"item-header"},mw={class:"var-name"},fw={class:"var-value"},gw={class:"var-source"},yw={class:"modal-footer"},hw=Pl({__name:"EnvConflictModal",props:{visible:{type:Boolean,default:!1},conflicts:{type:Array,default:()=>[]}},emits:["update:visible","deleted","close","ignore","never-remind"],setup(e,{emit:a}){const i=e,h=a,b=w({get:()=>i.visible,set:e=>h("update:visible",e)}),k=l(new Set),_=l(!1),x=w(()=>k.value.size),C=w(()=>i.conflicts.length>0&&k.value.size===i.conflicts.length),U=w(()=>k.value.size>0&&k.value.size<i.conflicts.length),S=w(()=>i.conflicts.length>0&&i.conflicts.every(e=>"process"===e.sourceType));function z(e){return`${e.varName}:${e.sourcePath}`}function I(e){return"process"===e.sourceType?"进程环境变量":e.sourcePath}function T(e){k.value=e?new Set(i.conflicts.map(z)):new Set}function P(){h("close")}function M(){h("ignore")}function $(){h("never-remind")}async function j(){const e=i.conflicts.filter(e=>k.value.has(z(e)));e.every(e=>"process"===e.sourceType)?Un.warning("进程环境变量无法直接删除,请手动从 shell 配置文件中移除"):Sn.warning({title:"确认删除",content:`确定要删除选中的 ${e.length} 个环境变量吗?删除前会自动备份。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{_.value=!0;try{(await async function(e){return(await dt.post("/env/delete",{conflicts:e})).data}(e)).success&&(Un.success("删除成功,备份已保存"),k.value=new Set,h("deleted"))}catch(a){Un.error("删除失败: "+a.message)}finally{_.value=!1}}})}return(a,l)=>(n(),g(c(ie),{show:b.value,"onUpdate:show":l[1]||(l[1]=e=>b.value=e),preset:"card",title:null,bordered:!1,closable:!0,"mask-closable":!1,style:{width:"560px","max-width":"90vw"},onClose:P},{header:u(()=>[s("div",nw,[r(c(q),{class:"warning-icon",size:22},{default:u(()=>[r(c(Ia))]),_:1}),l[2]||(l[2]=s("span",{class:"header-title"},"检测到环境变量冲突",-1))])]),footer:u(()=>[s("div",yw,[r(c(K),{tertiary:"",onClick:M},{default:u(()=>[...l[8]||(l[8]=[y(" 暂时忽略 ",-1)])]),_:1}),r(c(K),{tertiary:"",onClick:$},{default:u(()=>[...l[9]||(l[9]=[y(" 不再提醒 ",-1)])]),_:1}),S.value?o("",!0):(n(),g(c(K),{key:0,type:"error",disabled:0===x.value,loading:_.value,onClick:j},{default:u(()=>[y(" 删除选中 ("+v(x.value)+") ",1)]),_:1},8,["disabled","loading"]))])]),default:u(()=>[s("div",sw,[s("p",ow,[l[3]||(l[3]=y(" 发现 ",-1)),s("strong",null,v(e.conflicts.length),1),l[4]||(l[4]=y(" 个环境变量可能影响代理配置,建议清理后再使用代理功能。 ",-1))]),S.value?(n(),g(c(fe),{key:0,type:"info",bordered:!1,class:"process-env-alert"},{icon:u(()=>[r(c(q),null,{default:u(()=>[r(c(Ma))]),_:1})]),default:u(()=>[l[5]||(l[5]=s("div",{class:"alert-content"},[s("p",{class:"alert-title"},"这些环境变量来自当前进程,请按以下步骤处理:"),s("ol",{class:"alert-list"},[s("li",null,"检查对应 shell 配置文件(如 ~/.zshrc、~/.bashrc 或 PowerShell Profile)中是否有这些变量"),s("li",null,"如果有,删除或注释掉相关行"),s("li",null,[s("strong",null,"重启终端"),y(",然后重新运行 "),s("code",null,"ct")])]),s("p",{class:"alert-hint"},"如果配置文件中没有,可能是终端临时设置的,直接重启终端即可")],-1))]),_:1})):o("",!0),s("div",iw,[s("div",rw,[r(c(xe),{checked:C.value,indeterminate:U.value,"onUpdate:checked":T},{default:u(()=>[...l[6]||(l[6]=[y(" 全选 ",-1)])]),_:1},8,["checked","indeterminate"]),x.value>0?(n(),t("span",uw," 已选 "+v(x.value)+" 项 ",1)):o("",!0)]),r(c($e),{style:{"max-height":"280px"}},{default:u(()=>[s("div",cw,[(n(!0),t(m,null,f(e.conflicts,e=>{return n(),t("div",{key:z(e),class:d(["conflict-item",{selected:k.value.has(z(e))}]),onClick:a=>function(e){const a=z(e);k.value.has(a)?k.value.delete(a):k.value.add(a),k.value=new Set(k.value)}(e)},[r(c(xe),{checked:k.value.has(z(e)),onClick:l[0]||(l[0]=p(()=>{},["stop"])),"onUpdate:checked":a=>function(e,a){const l=z(e);a?k.value.add(l):k.value.delete(l),k.value=new Set(k.value)}(e,a)},null,8,["checked","onUpdate:checked"]),s("div",pw,[s("div",vw,[s("code",mw,v(e.varName),1),r(c(G),{type:(a=e.platform,{claude:"warning",codex:"success",gemini:"info"}[a]||"default"),size:"tiny",bordered:!1},{default:u(()=>[y(v(e.platform),1)]),_:2},1032,["type"])]),s("div",fw,v(e.varValue),1),s("div",gw,[l[7]||(l[7]=s("span",{class:"source-label"},"来源:",-1)),y(" "+v(I(e)),1)])])],10,dw);var a}),128))])]),_:1})])])]),_:1},8,["show"]))}},[["__scopeId","data-v-7ea71ef7"]]);function bw(){const e=Fi(),{dashboardData:a,isLoading:l,isLoaded:t}=T(e);return{dashboardData:a,isLoading:l,isLoaded:t,loadDashboard:e.loadDashboard,enableAutoRefresh:e.enableAutoRefresh,disableAutoRefresh:e.disableAutoRefresh,refreshChannels:e.refreshChannels,refreshProxyStatus:e.refreshProxyStatus,refreshStats:e.refreshStats}}const ww={class:"layout"},kw={class:"header"},_w={class:"nav-tabs"},xw={class:"header-actions"},Cw={class:"env-warning-count"},Uw={class:"favorites-button-wrapper"},Sw={key:0,class:"favorites-badge"},zw={class:"main-container"},Iw={key:0,class:"global-loading-overlay"},Tw={class:"left-content"},Pw=Pl({__name:"Layout",setup(e){const{isDark:a,toggleTheme:i}=Xi(),{claudeProxy:p,codexProxy:m,geminiProxy:f,opencodeProxy:h,startProxy:k,stopProxy:_}=hs(),{totalFavorites:U}=Po(),{loadDashboard:S}=bw(),I=D(),T=M(),$=w(()=>T.name),j=w(()=>T.meta.channel||null),O=w(()=>T.path),A=w(()=>j.value&&(ye.value||he.value&&fe.value)),L=l(!1),F=l(!1),R=l(!1),B=l(!1),H=l(!1),K=l(!1),G=l(!1),W=l(!1),V=l(!1),J=l(!1),Z=l(!1),Y=l(!1),X=l(""),ee=l(!1),ae=l(!1),le=l(!1),te=l(!1),ne=l(null),se=l(null),oe=l(null),re=l([]),ue=l(!1);async function de(){try{const e=await tw();e.success&&(re.value=e.conflicts||[],0===re.value.length&&(ue.value=!1))}catch(e){}}function pe(){ue.value=!1}function ve(){ue.value=!1,localStorage.setItem("envConflictNeverRemind","true")}const me=l(!1),fe=w(()=>"codex"===j.value?m.value.running:"gemini"===j.value?f.value.running:"opencode"===j.value?h.value.running:p.value.running),ge=w(()=>"codex"===j.value?m.value.loading:"gemini"===j.value?f.value.loading:"opencode"===j.value?h.value.loading:p.value.loading),ye=l(!0),he=l(!0);function be(){I.push({name:"home"})}function we(){window.open("https://github.com/ZeaoZhang/coding-tool","_blank")}async function ke(e){var a,l;const t=j.value||"claude";try{let a;a=e?await k(t):await _(t,{refreshChannelsDrawer:!0}),!1!==a.success?(Un.success(e?"代理已启动":"代理已停止"),e&&(he.value=!0),async function(){try{await Pn("panelVisibility","showChannels",ye.value),await Pn("panelVisibility","showLogs",he.value)}catch(e){}}()):Un.error(a.error||"操作失败")}catch(n){Un.error((null==(l=null==(a=n.response)?void 0:a.data)?void 0:l.error)||n.message||"操作失败")}}function _e(e){const{showChannels:a,showLogs:l}=e.detail;ye.value=a,he.value=l}function xe(e){var a;X.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",Y.value=!0}function Ce(){ee.value=!0}function Ue(){ae.value=!0}function Se(){le.value=!0}function ze(){"opencode"===j.value&&(G.value=!0)}function Ie({session:e,channel:a}){ne.value=e,se.value=a,te.value=!0,P(()=>{var e;null==(e=oe.value)||e.open()})}return b(()=>{!async function(){var e,a;try{const l=await S();l&&l.uiConfig&&(ye.value=!1!==(null==(e=l.uiConfig.panelVisibility)?void 0:e.showChannels),he.value=!1!==(null==(a=l.uiConfig.panelVisibility)?void 0:a.showLogs))}catch(l){}}(),window.addEventListener("panel-visibility-change",_e),window.addEventListener("open-skills-drawer",xe),window.addEventListener("open-commands-drawer",Ce),window.addEventListener("open-agents-drawer",Ue),window.addEventListener("open-plugins-drawer",Se),window.addEventListener("open-gateway-convert-drawer",ze),async function(){var e;try{const a=await tw();a.success&&(null==(e=a.conflicts)?void 0:e.length)>0&&(re.value=a.conflicts,"true"!==localStorage.getItem("envConflictNeverRemind")&&(ue.value=!0))}catch(a){}}()}),C(()=>{window.removeEventListener("panel-visibility-change",_e),window.removeEventListener("open-skills-drawer",xe),window.removeEventListener("open-commands-drawer",Ce),window.removeEventListener("open-agents-drawer",Ue),window.removeEventListener("open-plugins-drawer",Se),window.removeEventListener("open-gateway-convert-drawer",ze)}),x(()=>j.value,e=>{"opencode"!==e&&G.value&&(G.value=!1)}),(e,l)=>{const p=E("router-view");return n(),t("div",ww,[r(hw,{visible:ue.value,"onUpdate:visible":l[0]||(l[0]=e=>ue.value=e),conflicts:re.value,onDeleted:de,onClose:l[1]||(l[1]=e=>ue.value=!1),onIgnore:pe,onNeverRemind:ve},null,8,["visible","conflicts"]),s("header",kw,[s("div",{class:"logo-section",onClick:be},[...l[35]||(l[35]=[N('<div class="logo-wrapper" data-v-fb6cb2bf><img src="/logo.png" alt="Coding Tool Logo" class="logo-image" data-v-fb6cb2bf></div><div class="title-group" data-v-fb6cb2bf><h1 class="title-main" data-v-fb6cb2bf>Coding-Tool</h1><span class="title-sub" data-v-fb6cb2bf>Vibe Coding增强工作助手</span></div>',2)])]),s("div",_w,[s("div",{class:d(["nav-tab",{active:"home"===$.value}]),onClick:l[2]||(l[2]=e=>c(I).push({name:"home"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(rl))]),_:1}),l[36]||(l[36]=s("span",{class:"nav-label"},"Home",-1))],2),s("div",{class:d(["nav-tab",{active:"claude"===j.value}]),onClick:l[3]||(l[3]=e=>c(I).push({name:"claude-projects"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(ra))]),_:1}),l[37]||(l[37]=s("span",{class:"nav-label"},"Claude",-1))],2),s("div",{class:d(["nav-tab",{active:"codex"===j.value}]),onClick:l[4]||(l[4]=e=>c(I).push({name:"codex-projects"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(ua))]),_:1}),l[38]||(l[38]=s("span",{class:"nav-label"},"Codex",-1))],2),s("div",{class:d(["nav-tab",{active:"gemini"===j.value}]),onClick:l[5]||(l[5]=e=>c(I).push({name:"gemini-projects"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(ca))]),_:1}),l[39]||(l[39]=s("span",{class:"nav-label"},"Gemini",-1))],2),s("div",{class:d(["nav-tab",{active:"opencode"===j.value}]),onClick:l[6]||(l[6]=e=>c(I).push({name:"opencode-projects"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(Xe))]),_:1}),l[40]||(l[40]=s("span",{class:"nav-label"},"OpenCode",-1))],2),s("div",{class:d(["nav-tab",{active:"analytics"===$.value}]),onClick:l[7]||(l[7]=e=>c(I).push({name:"analytics"}))},[r(c(q),{size:18,class:"nav-icon"},{default:u(()=>[r(c(ul))]),_:1}),l[41]||(l[41]=s("span",{class:"nav-label"},"Analytics",-1))],2)]),s("div",xw,[re.value.length>0?(n(),g(c(ce),{key:0,trigger:"hover"},{trigger:u(()=>[s("div",{class:"env-warning-btn",onClick:l[8]||(l[8]=e=>ue.value=!0)},[r(c(q),{size:18,class:"env-warning-icon"},{default:u(()=>[r(c(Ia))]),_:1}),s("span",Cw,v(re.value.length),1)])]),default:u(()=>[y(" 检测到 "+v(re.value.length)+" 个环境变量冲突,点击查看 ",1)]),_:1})):o("",!0),r(lw,{icon:c(a)?c(Ua):c(Sa),tooltip:c(a)?"切换到亮色主题":"切换到暗色主题",onClick:c(i)},null,8,["icon","tooltip","onClick"]),l[42]||(l[42]=s("div",{class:"header-divider"},null,-1)),s("div",Uw,[r(lw,{icon:c(cl),tooltip:`我的收藏 (${c(U)})`,onClick:l[9]||(l[9]=e=>F.value=!0)},null,8,["icon","tooltip"]),c(U)>0?(n(),t("div",Sw,v(c(U)),1)):o("",!0)]),r(lw,{icon:c(Za),tooltip:"工作区管理",onClick:l[10]||(l[10]=e=>V.value=!0)},null,8,["icon"]),r(lw,{icon:c(dl),tooltip:"Prompts 管理",onClick:l[11]||(l[11]=e=>H.value=!0)},null,8,["icon"]),r(lw,{icon:c(ja),tooltip:"MCP 服务器管理",onClick:l[12]||(l[12]=e=>B.value=!0)},null,8,["icon"]),r(lw,{icon:c(pl),tooltip:"配置模版管理",onClick:l[13]||(l[13]=e=>J.value=!0)},null,8,["icon"]),r(lw,{icon:c(Xa),tooltip:"配置导出/导入",onClick:l[14]||(l[14]=e=>Z.value=!0)},null,8,["icon"]),l[43]||(l[43]=s("div",{class:"header-divider"},null,-1)),r(lw,{icon:c(Be),tooltip:"渠道速度测试",onClick:l[15]||(l[15]=e=>K.value=!0)},null,8,["icon"]),r(lw,{icon:c(Ca),tooltip:"设置",onClick:l[16]||(l[16]=e=>R.value=!0)},null,8,["icon"]),r(lw,{icon:c(vl),tooltip:"使用帮助",onClick:l[17]||(l[17]=e=>W.value=!0)},null,8,["icon"]),r(lw,{icon:c(nl),tooltip:"访问 GitHub 仓库",onClick:we},null,8,["icon"])])]),s("div",zw,[me.value?(n(),t("div",Iw,[r(c(Q),{size:"large"},{description:u(()=>[...l[44]||(l[44]=[y(" 加载配置中... ",-1)])]),_:1})])):o("",!0),s("div",Tw,[r(p,null,{default:u(({Component:e})=>[(n(),g(z(e),{key:O.value}))]),_:1})]),A.value?(n(),g(Ks,{key:1,"show-channels":ye.value,"show-logs":he.value,"proxy-running":fe.value,"proxy-loading":ge.value,onProxyToggle:ke,onShowRecent:l[18]||(l[18]=e=>L.value=!0)},null,8,["show-channels","show-logs","proxy-running","proxy-loading"])):o("",!0)]),r(Co,{visible:L.value,"onUpdate:visible":l[19]||(l[19]=e=>L.value=e),channel:j.value},null,8,["visible","channel"]),r(Xo,{visible:F.value,"onUpdate:visible":l[20]||(l[20]=e=>F.value=e),onViewHistory:Ie},null,8,["visible"]),ne.value?(n(),g(Ii,{key:0,ref_key:"chatHistoryRef",ref:oe,show:te.value,"onUpdate:show":l[21]||(l[21]=e=>te.value=e),"project-name":ne.value.projectName,"session-id":ne.value.sessionId,"session-alias":ne.value.alias,channel:se.value},null,8,["show","project-name","session-id","session-alias","channel"])):o("",!0),r(uc,{visible:R.value,"onUpdate:visible":l[22]||(l[22]=e=>R.value=e)},null,8,["visible"]),r(wp,{visible:B.value,"onUpdate:visible":l[23]||(l[23]=e=>B.value=e)},null,8,["visible"]),r(pv,{visible:H.value,"onUpdate:visible":l[24]||(l[24]=e=>H.value=e)},null,8,["visible"]),r(Yv,{visible:K.value,"onUpdate:visible":l[25]||(l[25]=e=>K.value=e)},null,8,["visible"]),"opencode"===j.value?(n(),g(vm,{key:1,visible:G.value,"onUpdate:visible":l[26]||(l[26]=e=>G.value=e)},null,8,["visible"])):o("",!0),r(Lh,{visible:V.value,"onUpdate:visible":l[27]||(l[27]=e=>V.value=e)},null,8,["visible"]),r(Bb,{visible:J.value,"onUpdate:visible":l[28]||(l[28]=e=>J.value=e)},null,8,["visible"]),r(ew,{visible:Z.value,"onUpdate:visible":l[29]||(l[29]=e=>Z.value=e)},null,8,["visible"]),r(Tf,{visible:Y.value,"onUpdate:visible":l[30]||(l[30]=e=>Y.value=e),platform:X.value},null,8,["visible","platform"]),r(ng,{visible:ee.value,"onUpdate:visible":l[31]||(l[31]=e=>ee.value=e)},null,8,["visible"]),r(jg,{visible:ae.value,"onUpdate:visible":l[32]||(l[32]=e=>ae.value=e)},null,8,["visible"]),r(By,{visible:le.value,"onUpdate:visible":l[33]||(l[33]=e=>le.value=e)},null,8,["visible"]),r(c(ie),{show:W.value,"onUpdate:show":l[34]||(l[34]=e=>W.value=e),preset:"card",title:"CODING-TOOL 使用帮助",style:{width:"800px","max-width":"90vw"}},{default:u(()=>[...l[45]||(l[45]=[s("div",{class:"help-content"},[s("div",{class:"help-section"},[s("h4",null,"🚀 快速开始"),s("p",null,"CODING-TOOL 是 AI 编程工具的增强管理助手,支持 Claude Code、Codex 和 Gemini 三种 AI 工具,提供智能会话管理、动态渠道切换、全局搜索和实时监控功能。"),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"⭐ 最简单的启动方式:"),s("div",{style:{background:"var(--bg-primary)",padding:"12px","border-radius":"6px",margin:"8px 0","border-left":"3px solid #18a058"}},[s("p",{style:{margin:"0","font-family":"'Courier New', monospace","font-size":"13px","font-weight":"600",color:"var(--primary-color)"}},"ctx start"),s("p",{style:{margin:"4px 0 0 0","font-size":"12px",color:"var(--text-secondary)"}},[y("• 后台启动所有服务"),s("br"),y("• 可以关闭终端窗口"),s("br"),y("• 代理服务保持运行")])]),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"📋 日常工作流:"),s("div",{style:{"font-size":"12px","line-height":"1.8",color:"var(--text-secondary)"}},[s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx start"),y(" 启动服务"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx status"),y(" 查看状态"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx logs"),y(" 查看日志"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx stop"),y(" 停止服务 ")])]),s("div",{class:"help-section"},[s("h4",null,"🤖 支持的 AI 工具"),s("ul",null,[s("li",null,[s("strong",null,"Claude Code"),y(":Anthropic 官方命令行工具,支持 Claude 系列模型")]),s("li",null,[s("strong",null,"Codex"),y(":支持 OpenAI GPT 系列和 Claude 模型(通过 OpenAI 兼容格式)")]),s("li",null,[s("strong",null,"Gemini"),y(":支持 Google Gemini 系列模型")])])]),s("div",{class:"help-section"},[s("h4",null,"📋 命令行用法"),s("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"🚀 服务管理"),s("div",{class:"command-list"},[s("div",{class:"command-item"},[s("code",null,"ctx start"),s("span",null,"后台启动所有服务(推荐)")]),s("div",{class:"command-item"},[s("code",null,"ctx stop"),s("span",null,"停止所有服务")]),s("div",{class:"command-item"},[s("code",null,"ctx restart"),s("span",null,"重启所有服务")]),s("div",{class:"command-item"},[s("code",null,"ctx status"),s("span",null,"查看服务状态")])]),s("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"🔌 代理管理"),s("div",{class:"command-list"},[s("div",{class:"command-item"},[s("code",null,"ctx claude start"),s("span",null,"启动 Claude 代理")]),s("div",{class:"command-item"},[s("code",null,"ctx codex start"),s("span",null,"启动 Codex 代理")]),s("div",{class:"command-item"},[s("code",null,"ctx gemini start"),s("span",null,"启动 Gemini 代理")]),s("div",{class:"command-item"},[s("code",null,"ctx claude stop"),s("span",null,"停止指定代理(支持 stop/restart/status)")])]),s("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"📋 日志管理"),s("div",{class:"command-list"},[s("div",{class:"command-item"},[s("code",null,"ctx logs"),s("span",null,"查看所有日志")]),s("div",{class:"command-item"},[s("code",null,"ctx logs claude"),s("span",null,"查看 Claude 日志(支持 ui/codex/gemini)")]),s("div",{class:"command-item"},[s("code",null,"ctx logs --follow"),s("span",null,"实时跟踪日志")]),s("div",{class:"command-item"},[s("code",null,"ctx logs --clear"),s("span",null,"清空日志")])]),s("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"📊 其他命令"),s("div",{class:"command-list"},[s("div",{class:"command-item"},[s("code",null,"ctx stats"),s("span",null,"查看统计信息")]),s("div",{class:"command-item"},[s("code",null,"ctx doctor"),s("span",null,"系统诊断")]),s("div",{class:"command-item"},[s("code",null,"ctx -h"),s("span",null,"完整帮助")])])]),s("div",{class:"help-section"},[s("h4",null,"🎯 Web UI 功能"),s("ul",null,[s("li",null,[s("strong",null,"多类型支持"),y(":统一管理 Claude Code、Codex、Gemini 三种工具的项目和会话")]),s("li",null,[s("strong",null,"项目管理"),y(":查看所有项目,支持拖拽排序、搜索过滤、删除项目")]),s("li",null,[s("strong",null,"会话管理"),y(":查看项目会话列表,支持搜索、Fork、删除、重命名")]),s("li",null,[s("strong",null,"快速启动"),y(":点击会话可直接复制对应 AI 工具启动命令")]),s("li",null,[s("strong",null,"动态切换"),y(":每种工具独立的渠道管理,可在右侧面板快速切换 API 渠道")]),s("li",null,[s("strong",null,"实时日志"),y(":查看各类型代理的实时请求日志、token 消耗和成本统计")]),s("li",null,[s("strong",null,"全局搜索"),y(":使用 "),s("kbd",null,"⌘/Ctrl"),y(" + "),s("kbd",null,"K"),y(" 在所有项目中搜索对话内容")])])]),s("div",{class:"help-section"},[s("h4",null,"⚡ 代理服务与渠道管理"),s("p",null,"每种 AI 工具都有独立的代理服务和渠道配置:"),s("ul",null,[s("li",null,[s("strong",null,"Claude 代理"),y(":端口 20088,支持 Anthropic API 格式")]),s("li",null,[s("strong",null,"Codex 代理"),y(":端口 20089,支持 OpenAI API 格式(兼容 Claude)")]),s("li",null,[s("strong",null,"Gemini 代理"),y(":端口 20090,支持 Gemini API 格式")])]),s("p",null,"在 Dashboard 或各工具详情页,可以添加多个渠道并快速切换,无需修改配置文件或重启工具。")]),s("div",{class:"help-section"},[s("h4",null,"⭐ 后台启动与开机自启"),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"后台启动服务"),s("p",{style:{"font-size":"12px","line-height":"1.8"}},[y("使用 "),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx start"),y(" 命令后台启动所有服务,可以安全关闭终端窗口而不影响代理服务的运行。")]),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"配置开机自启(可选)"),s("p",{style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px 0"}},"第一次启用开机自启只需三个步骤:"),s("div",{style:{background:"var(--bg-primary)",padding:"12px","border-radius":"6px",margin:"8px 0","border-left":"3px solid #18a058","font-family":"'Courier New', monospace","font-size":"11px","line-height":"1.8",color:"var(--text-secondary)"}},[y(" # 第 1 步:启用 PM2 开机自启"),s("br"),s("span",{style:{color:"var(--primary-color)"}},"pm2 startup"),s("br"),s("br"),y(" # 第 2 步:保存配置"),s("br"),s("span",{style:{color:"var(--primary-color)"}},"pm2 save"),s("br"),s("br"),y(" # 第 3 步:重启电脑,服务自动启动 ✓ ")]),s("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"相关命令"),s("div",{style:{"font-size":"12px",color:"var(--text-secondary)","line-height":"1.8"}},[s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx start"),y(" 后台启动"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx status"),y(" 查看状态"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx logs"),y(" 查看日志"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"pm2 list"),y(" 查看所有后台进程"),s("br"),s("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"pm2 unstartup"),y(" 禁用开机自启 ")]),s("p",{style:{color:"#18a058","font-size":"12px","margin-top":"8px"}},"💡 提示:配置开机自启后,重启电脑时 Coding-Tool 会自动启动,无需手动运行命令。")]),s("div",{class:"help-section"},[s("h4",null,"🔗 相关链接"),s("div",{class:"link-list"},[s("a",{href:"https://github.com/ZeaoZhang/coding-tool",target:"_blank"},"GitHub 仓库"),s("a",{href:"https://github.com/ZeaoZhang/coding-tool/issues",target:"_blank"},"问题反馈")])])],-1)])]),_:1},8,["show"])])}}},[["__scopeId","data-v-fb6cb2bf"]]),Mw=F({__name:"App",setup(e){const{isDark:a,loadTheme:l}=Xi(),t=w(()=>a.value?Y:null),s=w(()=>a.value?{common:{primaryColor:"#18a058",primaryColorHover:"#36ad6a",primaryColorPressed:"#0c7a43",bodyColor:"#0f1419",cardColor:"#1a1f2e",modalColor:"#1a1f2e",popoverColor:"#1a1f2e",tableColor:"#1a1f2e",inputColor:"#232835",codeColor:"#232835",tabColor:"#1a1f2e",actionColor:"#232835",tableHeaderColor:"#232835",hoverColor:"rgba(255, 255, 255, 0.09)",pressedColor:"rgba(255, 255, 255, 0.13)",borderColor:"#2d3748",dividerColor:"#2d3748"},Drawer:{color:"#1a1f2e",headerColor:"#1a1f2e",footerColor:"#1a1f2e"},Modal:{color:"#1a1f2e",boxShadow:"0 0 0 1px rgba(0, 0, 0, 0.6), 0 8px 32px rgba(0, 0, 0, 0.6)"},Card:{color:"#1a1f2e",borderColor:"#2d3748"},Popover:{color:"#1a1f2e",boxShadow:"0 4px 16px rgba(0, 0, 0, 0.5)"},Dialog:{color:"#1a1f2e"}}:{common:{primaryColor:"#18a058",primaryColorHover:"#36ad6a",primaryColorPressed:"#0c7a43"}});return b(()=>{l()}),(e,a)=>(n(),g(c(Fe),{theme:t.value,"theme-overrides":s.value},{default:u(()=>[r(c(De),null,{default:u(()=>[r(c(Ne),null,{default:u(()=>[r(Pw)]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"]))}}),$w=R();Mw.use($w),Mw.use(Tl),Mw.mount("#app"),function(){if(Fn)return;const e=Nn();e.connectWebSocket(),queueMicrotask(()=>{const a=()=>{e.loadChannels(),e.loadAdvancedConfig()};"undefined"==typeof window||"function"!=typeof window.requestIdleCallback?setTimeout(a,0):window.requestIdleCallback(a,{timeout:1e3})}),Fn=!0}();export{co as A,Rb as B,Ii as C,vs as D,ps as E,ms as F,Ry as P,Co as R,If as S,Ah as W,Pl as _,bw as a,us as b,cs as c,ds as d,Os as e,zn as f,rs as g,Ls as h,ft as i,kt as j,zt as k,Rt as l,cc as m,Pn as n,Tn as o,Ro as p,no as q,Un as r,In as s,pc as t,hs as u,Sn as v,mo as w,yo as x,Po as y,vo as z};
|