coding-tool-x 3.7.2 → 3.7.3
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-D5kLOhUo.js → Analytics-BqDjJUJl.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-D_-16blp.js → ConfigTemplates-DV2KFuC4.js} +1 -1
- package/dist/web/assets/{Home-DM_56Fyr.js → Home-D7hovkk9.js} +1 -1
- package/dist/web/assets/{PluginManager-Cv_rv8Dh.js → PluginManager-Bd3hhc5A.js} +1 -1
- package/dist/web/assets/{ProjectList-H_m4Tx4E.js → ProjectList-BB4Whns8.js} +1 -1
- package/dist/web/assets/{SessionList-DcUQvsbR.js → SessionList-CvurKSRK.js} +1 -1
- package/dist/web/assets/{SkillManager-CRav3m2a.js → SkillManager-DQjRXOFg.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-B3f8R4EF.js → WorkspaceManager-CZeXnxu1.js} +1 -1
- package/dist/web/assets/{icons-Dop5j7Bf.js → icons-nGdSKQn2.js} +1 -1
- package/dist/web/assets/{index-Bnni1zPN.js → index-BovYCFsd.js} +2 -2
- package/dist/web/assets/index-kQCC5dlu.css +1 -0
- package/dist/web/index.html +3 -3
- package/package.json +1 -1
- package/src/server/api/channels.js +14 -1
- package/src/server/api/codex-channels.js +21 -1
- package/src/server/api/gemini-channels.js +21 -1
- package/src/server/api/omp-channels.js +17 -1
- package/src/server/api/opencode-channels.js +21 -1
- package/src/server/services/channel-sync-utils.js +368 -0
- package/src/server/services/channels.js +119 -0
- package/src/server/services/codex-channels.js +125 -0
- package/src/server/services/gemini-channels.js +123 -0
- package/src/server/services/omp-channels.js +299 -2
- package/src/server/services/omp-settings-manager.js +2 -0
- package/src/server/services/opencode-channels.js +172 -4
- package/dist/web/assets/index-CfMuHG8u.css +0 -1
|
@@ -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,f as t,c as s,o as n,a as o,W as i,s as r,X as c,Y as u,N as d,L as p,Z as v,_ as m,F as f,$ as y,a0 as g,p as h,G as b,h as w,a1 as k,k as _,w as x,K as C,a2 as U,a3 as P,y as S,R as z,a4 as T,v as I,a5 as M,x as A,t as O,a6 as $,i as j,J as L,a7 as E,a8 as D,M as N,a9 as B}from"./vue-vendor-B5RqjEjQ.js";import{N as R,B as F,a as H,b as G,c as K,d as q,e as W,f as V,l as J,g as Z,h as Q,i as Y,j as X,k as ee,m as ae,n as le,o as te,p as se,q as ne,r as oe,s as ie,t as re,u as ce,v as ue,w as de,x as pe,y as ve,z as me,A as fe,C as ye,D as ge,E as he,F as be,G as we,H as ke,I as _e,J as xe,K as Ce,L as Ue,M as Pe,O as Se,P as ze,S as Te,Q as Ie,R as Me,T as Ae,U as Oe,V as $e,W as je,X as Le,Y as Ee}from"./naive-ui-CVyvdmg1.js";import{C as De,S as Ne,a as Be,b as Re,c as Fe,O as He,A as Ge,d as Ke,T as qe,e as We,f as Ve,E as Je,g as Ze,h as Qe,P as Ye,i as Xe,K as ea,j as aa,G as la,k as ta,D as sa,l as na,m as oa,n as ia,o as ra,p as ca,q as ua,r as da,s as pa,I as va,t as ma,u as fa,v as ya,w as ga,x as ha,y as ba,N as wa,z as ka,B as _a,F as xa,H as Ca,M as Ua,J as Pa,W as Sa,L as za,Q as Ta,R as Ia,U as Ma,V as Aa,X as Oa,Y as $a,Z as ja,_ as La,$ as Ea,a0 as Da,a1 as Na,a2 as Ba,a3 as Ra,a4 as Fa,a5 as Ha,a6 as Ga,a7 as Ka,a8 as qa,a9 as Wa,aa as Va,ab as Ja,ac as Za,ad as Qa,ae as Ya,af as Xa,ag as el,ah as al,ai as ll,aj as tl,ak as sl,al as nl,am as ol,an as il,ao as rl,ap as cl,aq as ul}from"./icons-Dop5j7Bf.js";import{a as dl}from"./vendors-DQA4Hw9v.js";import{H as pl,j as vl,p as ml,b as fl,d as yl,t as gl,e as hl,x as bl,f as wl,M as kl}from"./markdown-BNJfEgCA.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 _l={},xl=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 _l)return;_l[e]=!0;const a=e.endsWith(".css"),t=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${t}`))return;const s=document.createElement("link");return s.rel=a?"stylesheet":"modulepreload",a||(s.as="script"),s.crossOrigin="",s.href=e,l&&s.setAttribute("nonce",l),document.head.appendChild(s),a?new Promise((a,l)=>{s.addEventListener("load",a),s.addEventListener("error",()=>l(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function s(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&&s(e.reason);return e().catch(s)})},Cl=()=>xl(()=>import("./ProjectList-H_m4Tx4E.js"),__vite__mapDeps([0,1,2,3,4,5,6,7])),Ul=()=>xl(()=>import("./SessionList-DcUQvsbR.js"),__vite__mapDeps([8,1,2,3,4,5,6,9])),Pl=[{path:"/",name:"home",component:()=>xl(()=>import("./Home-DM_56Fyr.js"),__vite__mapDeps([10,4,2,3,1,5,6,11]))},{path:"/claude",name:"claude-projects",component:Cl,meta:{channel:"claude"}},{path:"/claude/sessions/:projectName",name:"claude-sessions",component:Ul,props:!0,meta:{channel:"claude"}},{path:"/codex",name:"codex-projects",component:Cl,meta:{channel:"codex"}},{path:"/codex/sessions/:projectName",name:"codex-sessions",component:Ul,props:!0,meta:{channel:"codex"}},{path:"/gemini",name:"gemini-projects",component:Cl,meta:{channel:"gemini"}},{path:"/gemini/sessions/:projectName",name:"gemini-sessions",component:Ul,props:!0,meta:{channel:"gemini"}},{path:"/opencode",name:"opencode-projects",component:Cl,meta:{channel:"opencode"}},{path:"/opencode/sessions/:projectName",name:"opencode-sessions",component:Ul,props:!0,meta:{channel:"opencode"}},{path:"/omp",name:"omp-projects",component:Cl,meta:{channel:"omp"}},{path:"/omp/sessions/:projectName",name:"omp-sessions",component:Ul,props:!0,meta:{channel:"omp"}},{path:"/workspaces",name:"workspaces",component:()=>xl(()=>import("./WorkspaceManager-B3f8R4EF.js"),__vite__mapDeps([12,1,2,3,6,5,4,13]))},{path:"/config-templates",name:"config-templates",component:()=>xl(()=>import("./ConfigTemplates-D_-16blp.js"),__vite__mapDeps([14,1,2,3,6,5,4,15]))},{path:"/skills",name:"skills",component:()=>xl(()=>import("./SkillManager-CRav3m2a.js"),__vite__mapDeps([16,1,2,3,6,5,4,17]))},{path:"/plugins",name:"plugins",component:()=>xl(()=>import("./PluginManager-Cv_rv8Dh.js"),__vite__mapDeps([18,1,2,3,6,5,4,19]))},{path:"/analytics",name:"analytics",component:()=>xl(()=>import("./Analytics-D5kLOhUo.js"),__vite__mapDeps([20,1,2,3,6,5,4,21]))},{path:"/:pathMatch(.*)*",redirect:"/"}],Sl=e({history:a(),routes:Pl}),zl=(e,a)=>{const l=e.__vccOpts||e;for(const[t,s]of a)l[t]=s;return l},Tl={class:"channel-header"},Il={class:"channel-title"},Ml=["title"],Al={class:"channel-actions"},Ol={class:"test-result-header"},$l={class:"test-result-status"},jl={class:"test-result-info"},Ll={key:0,class:"latency"},El={key:1,class:"status-code"},Dl={key:0,class:"test-result-error"},Nl={class:"channel-info"},Bl={class:"info-main"},Rl={class:"info-footer"},Fl={class:"channel-meta"},Hl={class:"meta-item"},Gl={class:"meta-value"},Kl={class:"meta-item"},ql=zl({__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})},balance:{type:Object,default:null},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","refresh-balance"],setup(e,{emit:a}){const w=e,k=a,_=l(!1),x=l(null),C=t(()=>{var e;if(!(null==(e=w.balance)?void 0:e.visible))return"";const a=[];if(w.balance.platform&&a.push(w.balance.platform),w.balance.stale&&a.push("缓存"),w.balance.updatedAt)try{a.push(new Date(w.balance.updatedAt).toLocaleString())}catch{}return a.join(" · ")});async function U(){if(w.testFn){_.value=!0,x.value=null;try{const e=await w.testFn(w.channel.id,2e4);x.value=e}catch(e){x.value={success:!1,error:e.message||"测试失败",latency:null,statusCode:null}}finally{_.value=!1}}}return(a,l)=>{var t,w,P;return n(),s("div",{class:p(["channel-card",{collapsed:e.collapsed,disabled:!1===e.channel.enabled,"status-frozen":"frozen"===(null==(t=e.channel.health)?void 0:t.status),"status-checking":"checking"===(null==(w=e.channel.health)?void 0:w.status)}])},[o("div",Tl,[o("div",Il,[c(d(F),{text:"",size:"tiny",class:"collapse-btn",onClick:l[0]||(l[0]=v(e=>a.$emit("toggle-collapse"),["stop"]))},{default:u(()=>[c(d(R),{size:"16",class:p({collapsed:e.collapsed})},{default:u(()=>[c(d(De))]),_:1},8,["class"])]),_:1}),o("span",{class:"channel-name",title:e.channel.name},m(e.channel.name),9,Ml),(n(!0),s(f,null,y(e.headerTags,e=>(n(),g(d(H),{key:e.text,size:"tiny",type:e.type||"default",bordered:!1},{default:u(()=>[h(m(e.text),1)]),_:2},1032,["type"]))),128))]),o("div",Al,[e.showApplyButton?(n(),g(d(F),{key:0,size:"tiny",type:"primary",class:"apply-btn",onClick:l[1]||(l[1]=e=>a.$emit("apply"))},{default:u(()=>[...l[8]||(l[8]=[h(" 写入配置 ",-1)])]),_:1})):i("",!0),c(d(F),{size:"tiny",loading:_.value,onClick:U},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ne))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 测速 ",-1))]),_:1},8,["loading"]),c(d(F),{size:"tiny",onClick:l[2]||(l[2]=e=>a.$emit("edit"))},{default:u(()=>[...l[10]||(l[10]=[h(" 编辑 ",-1)])]),_:1}),c(d(F),{size:"tiny",type:"error",onClick:l[3]||(l[3]=e=>a.$emit("delete"))},{default:u(()=>[...l[11]||(l[11]=[h(" 删除 ",-1)])]),_:1}),c(d(G),{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"])])]),x.value?(n(),s("div",{key:0,class:p(["test-result",x.value.success?"success":"failed"])},[o("div",Ol,[o("span",$l,[x.value.success?(n(),g(d(R),{key:0,color:"#18a058"},{default:u(()=>[c(d(Be))]),_:1})):(n(),g(d(R),{key:1,color:"#f56c6c"},{default:u(()=>[c(d(Re))]),_:1})),h(" "+m(x.value.success?"测试成功":"测试失败"),1)]),o("div",jl,[x.value.latency?(n(),s("span",Ll,m(x.value.latency)+"ms",1)):i("",!0),x.value.statusCode?(n(),s("span",El,"HTTP "+m(x.value.statusCode),1)):i("",!0)]),c(d(F),{text:"",size:"tiny",onClick:l[5]||(l[5]=e=>x.value=null)},{default:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fe))]),_:1})]),_:1})]),x.value.error?(n(),s("div",Dl,m(x.value.error),1)):i("",!0)],2)):i("",!0),r(o("div",Nl,[o("div",Bl,[(n(!0),s(f,null,y(e.infoRows,e=>(n(),s("div",{key:e.label,class:"info-row"},[c(d(K),{depth:"3",class:"label"},{default:u(()=>[h(m(e.label)+":",1)]),_:2},1024),c(d(K),{depth:"2",class:p(["value",{mono:e.mono}])},{default:u(()=>[h(m(e.value||"—"),1)]),_:2},1032,["class"]),"function"==typeof e.action?(n(),g(d(F),{key:0,size:"tiny",text:"",type:"primary",onClick:a=>e.action()},{default:u(()=>[h(m(e.actionLabel||"操作"),1)]),_:2},1032,["onClick"])):i("",!0)]))),128))]),o("div",Rl,[e.channel.websiteUrl?(n(),g(d(F),{key:0,text:"",size:"tiny",onClick:l[6]||(l[6]=l=>a.$emit("open-website",e.channel.websiteUrl))},{icon:u(()=>[c(d(R),{size:"14"},{default:u(()=>[c(d(He))]),_:1})]),default:u(()=>[l[12]||(l[12]=h(" 前往官网 ",-1))]),_:1})):i("",!0),l[15]||(l[15]=o("div",{class:"footer-spacer"},null,-1)),o("div",Fl,[(null==(P=e.balance)?void 0:P.visible)&&e.balance.label?(n(),g(d(H),{key:0,size:"tiny",type:"success",bordered:!1,class:"balance-meta-tag",title:C.value,onClick:l[7]||(l[7]=v(e=>k("refresh-balance"),["stop"]))},{default:u(()=>[h(m(e.balance.label),1)]),_:1},8,["title"])):i("",!0),o("span",Hl,[l[13]||(l[13]=h(" 权重: ",-1)),o("span",Gl,m(e.meta.weight),1)]),o("span",Kl,[l[14]||(l[14]=h(" 并发: ",-1)),o("span",{class:p(["meta-value",{"meta-active":e.meta.concurrencyActive}])},m(e.meta.concurrencyText),3)])])])],512),[[b,!e.collapsed]])],2)}}},[["__scopeId","data-v-51007f34"]]),Wl=l(null),Vl=l(null),Jl=l(!1),Zl={claude:["claude-opus-4-7","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.5","gpt-5.4","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark","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-preview","gemini-3.1-flash-preview","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 s=t.toLowerCase();a.has(s)||(a.add(s),l.push(t))}),l}function Yl(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 Xl=null;async function et(e={}){const a=!0===e.forceRefresh;return!a&&Wl.value&&Vl.value?Wl.value:Xl||(Jl.value=!0,Xl=(async()=>{try{const l=new URLSearchParams;a&&l.set("forceRefresh","true");const t=l.toString(),s=t?`/api/config/default-models?${t}`:"/api/config/default-models",n=await fetch(s);if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);const o=await n.json();Wl.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=Yl(l);e&&a[e].push(l)}return{claude:Ql(a.claude),codex:Ql(a.codex),gemini:Ql(a.gemini)}}((await e.json()).models||{});Vl.value={claude:a.claude.length>0?a.claude:[...Zl.claude],codex:a.codex.length>0?a.codex:[...Zl.codex],gemini:a.gemini.length>0?a.gemini:[...Zl.gemini]}}catch(e){Vl.value={claude:[...Zl.claude],codex:[...Zl.codex],gemini:[...Zl.gemini]}}}catch(l){Wl.value=Zl,Vl.value={claude:[...Zl.claude],codex:[...Zl.codex],gemini:[...Zl.gemini]}}finally{Jl.value=!1,Xl=null}return Wl.value})(),Xl)}function at(e){var a;return(null==(a=Wl.value)?void 0:a[e])||Zl[e]||[]}function lt(e){var a;return(null==(a=Vl.value)?void 0:a[e])||Zl[e]||[]}function tt(){return{defaultModels:Wl,allModels:Vl,loading:Jl,loadDefaultModels:et,getDefaultModels:at,getAllModelsByToolType:lt}}const st={class:"model-redirect-editor"},nt={class:"redirect-input"},ot={class:"redirect-arrow"},it={class:"redirect-input"},rt=zl({__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,i=a,{getDefaultModels:r,loadDefaultModels:p}=tt();w(async()=>{await p()});const v=t(()=>{if(l.availableModels&&l.availableModels.length>0)return l.availableModels;return r(l.channelType).map(e=>({label:e,value:e}))});function m(e){if(!e)return v.value;const a=e.toLowerCase();return v.value.filter(e=>(e.label||e.value||"").toLowerCase().includes(a))}function g(e,a,t){const s=[...l.modelValue];s[e]={...s[e],[a]:t},i("update:modelValue",s)}function b(){i("update:modelValue",[...l.modelValue,{from:"",to:""}])}return(a,t)=>(n(),s("div",st,[(n(!0),s(f,null,y(e.modelValue,(e,a)=>(n(),s("div",{key:a,class:"redirect-row"},[o("div",nt,[c(d(q),{value:e.from,options:m(e.from),placeholder:"源模型",clearable:"","get-show":()=>!0,"onUpdate:value":e=>g(a,"from",e)},null,8,["value","options","onUpdate:value"])]),o("div",ot,[c(d(R),{size:"16",color:"#999"},{default:u(()=>[c(d(Ge))]),_:1})]),o("div",it,[c(d(q),{value:e.to,options:m(e.to),placeholder:"目标模型",clearable:"","get-show":()=>!0,"onUpdate:value":e=>g(a,"to",e)},null,8,["value","options","onUpdate:value"])]),c(d(F),{quaternary:"",circle:"",size:"small",onClick:e=>function(e){const a=l.modelValue.filter((a,l)=>l!==e);i("update:modelValue",a)}(a)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fe))]),_:1})]),_:1},8,["onClick"])]))),128)),c(d(F),{dashed:"",size:"small",onClick:b,class:"add-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[t[0]||(t[0]=h(" 添加重定向规则 ",-1))]),_:1})]))}},[["__scopeId","data-v-8ebdcad0"]]),ct=dl.create({baseURL:"/api",timeout:3e4});function ut(e="claude"){return"codex"===e?"/codex":"gemini"===e?"/gemini":"opencode"===e?"/opencode":"omp"===e?"/omp":""}async function dt(){return(await ct.get("/channels")).data}async function pt(e,a,l,t,s={}){const n={name:e,baseUrl:a,apiKey:l,websiteUrl:t,...s};return(await ct.post("/channels",n)).data}async function vt(e,a){return(await ct.put(`/channels/${e}`,a)).data}async function mt(e){return(await ct.delete(`/channels/${e}`)).data}async function ft(e){return(await ct.post(`/channels/${e}/apply-to-settings`)).data}async function yt(e){return(await ct.post(`/channels/${e}/reset-health`)).data}async function gt(e){return(await ct.get("/channel-balances",{params:{source:e}})).data}async function ht(e,a){return(await ct.post(`/channel-balances/${e}/${a}/refresh`)).data}async function bt(){return(await ct.get("/codex/channels")).data}async function wt(e,a,l,t,s,n={}){return(await ct.post("/codex/channels",{name:e,providerKey:a,baseUrl:l,apiKey:t,websiteUrl:s,...n})).data}async function kt(e,a){return(await ct.put(`/codex/channels/${e}`,a)).data}async function _t(e){return(await ct.delete(`/codex/channels/${e}`)).data}async function xt(e){return(await ct.post(`/codex/channels/${e}/apply-to-settings`)).data}async function Ct(e){return(await ct.post(`/codex/channels/${e}/reset-health`)).data}async function Ut(){return(await ct.get("/gemini/channels")).data}async function Pt(e,a,l,t,s,n={}){return(await ct.post("/gemini/channels",{name:e,baseUrl:a,apiKey:l,model:t,websiteUrl:s,...n})).data}async function St(e,a){return(await ct.put(`/gemini/channels/${e}`,a)).data}async function zt(e){return(await ct.delete(`/gemini/channels/${e}`)).data}async function Tt(e){return(await ct.post(`/gemini/channels/${e}/reset-health`)).data}async function It(e,a=2e4){return(await ct.post(`/channels/${e}/speed-test`,{timeout:a})).data}async function Mt(e,a="claude"){const l=a?{params:{type:a}}:void 0;return(await ct.get(`/channels/${e}/models`,l)).data}async function At(e=2e4){return(await ct.post("/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function Ot(e,a=2e4){return(await ct.post(`/codex/channels/${e}/speed-test`,{timeout:a})).data}async function $t(e=2e4){return(await ct.post("/codex/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function jt(e,a=2e4){return(await ct.post(`/gemini/channels/${e}/speed-test`,{timeout:a})).data}async function Lt(e=2e4){return(await ct.post("/gemini/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function Et(e){return(await ct.get(`/codex/channels/${e}/models`)).data}async function Dt(e){return(await ct.get(`/gemini/channels/${e}/models`)).data}async function Nt(){return(await ct.get("/opencode/channels")).data}async function Bt(e,a,l,t={}){return(await ct.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 ct.put(`/opencode/channels/${e}`,a)).data}async function Ft(e){return(await ct.delete(`/opencode/channels/${e}`)).data}async function Ht(e){return(await ct.post(`/opencode/channels/${e}/reset-health`)).data}async function Gt(e,a=2e4){return(await ct.post(`/opencode/channels/${e}/speed-test`,{timeout:a})).data}async function Kt(e=2e4){return(await ct.post("/opencode/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function qt(e,{forceRefresh:a=!1}={}){return(await ct.get(`/opencode/channels/${e}/models`,{params:a?{forceRefresh:"true"}:{}})).data}async function Wt({baseUrl:e,apiKey:a,gatewaySourceType:l}){return(await ct.post("/opencode/channels/probe-models",{baseUrl:e,apiKey:a,gatewaySourceType:l})).data}async function Vt(){return(await ct.get("/omp/channels")).data}async function Jt(e,a,l,t={}){return(await ct.post("/omp/channels",{name:e,baseUrl:a,apiKey:l,wireApi:t.wireApi||"openai",providerApi:t.providerApi||t.wireApi||"openai-completions",providerKey:t.providerKey||"",authMode:t.authMode||"api_key",oauthProviderId:t.oauthProviderId||"",gatewaySourceType:t.gatewaySourceType||"openai_compatible",enabled:!1!==t.enabled,weight:t.weight||1,maxConcurrency:t.maxConcurrency||null,model:t.model||null,modelRedirects:t.modelRedirects||[],allowedModels:t.allowedModels||[],speedTestModel:t.speedTestModel||null,presetId:t.presetId||null,websiteUrl:t.websiteUrl||"",balanceToken:t.balanceToken||"",balanceUserId:t.balanceUserId||null})).data}async function Zt(e,a){return(await ct.put(`/omp/channels/${e}`,a)).data}async function Qt(e){return(await ct.delete(`/omp/channels/${e}`)).data}async function Yt(e){return(await ct.post(`/omp/channels/${e}/reset-health`)).data}async function Xt(e,a=2e4){return(await ct.post(`/omp/channels/${e}/speed-test`,{timeout:a})).data}async function es(e,{forceRefresh:a=!1}={}){return(await ct.get(`/omp/channels/${e}/models`,{params:a?{forceRefresh:"true"}:{}})).data}async function as(e){return(await ct.post("/omp/channels/probe-models",e)).data}ct.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 ls=Object.freeze(Object.defineProperty({__proto__:null,applyChannelToSettings:ft,applyCodexChannelToSettings:xt,createChannel:pt,createCodexChannel:wt,createGeminiChannel:Pt,createOmpChannel:Jt,createOpenCodeChannel:Bt,deleteChannel:mt,deleteCodexChannel:_t,deleteGeminiChannel:zt,deleteOmpChannel:Qt,deleteOpenCodeChannel:Ft,fetchChannelModels:Mt,fetchCodexChannelModels:Et,fetchGeminiChannelModels:Dt,fetchOmpChannelModels:es,fetchOpenCodeChannelModels:qt,getBestChannelForRestore:async function(){return(await ct.get("/channels/best-for-restore")).data},getChannelBalances:gt,getChannelPoolStatus:async function(){return(await ct.get("/channels/pool/status")).data},getChannels:dt,getCodexChannels:bt,getCurrentChannel:async function(){return(await ct.get("/channels/current")).data},getEnabledCodexChannels:async function(){return(await ct.get("/codex/channels/enabled")).data},getEnabledGeminiChannels:async function(){return(await ct.get("/gemini/channels/enabled")).data},getEnabledOmpChannels:async function(){return{channels:((await Vt()).channels||[]).filter(e=>!1!==e.enabled)}},getEnabledOpenCodeChannels:async function(){return{channels:((await Nt()).channels||[]).filter(e=>!1!==e.enabled)}},getGeminiChannels:Ut,getOmpAuthProviders:async function({forceRefresh:e=!1}={}){return(await ct.get("/omp/config/auth-providers",{params:e?{forceRefresh:"true"}:{}})).data},getOmpChannels:Vt,getOmpProxyStatus:async function(){return(await ct.get("/omp/proxy/status")).data},getOpenCodeChannels:Nt,getOpenCodeProxyStatus:async function(){return(await ct.get("/opencode/proxy/status")).data},probeOmpChannelModels:as,probeOpenCodeChannelModels:Wt,refreshChannelBalance:ht,resetChannelHealth:yt,resetCodexChannelHealth:Ct,resetGeminiChannelHealth:Tt,resetOmpChannelHealth:Yt,resetOpenCodeChannelHealth:Ht,saveChannelOrder:async function(e){return(await ct.post("/channels/order",{order:e})).data},saveCodexChannelOrder:async function(e){return(await ct.post("/codex/channels/order",{order:e})).data},saveGeminiChannelOrder:async function(e){return(await ct.post("/gemini/channels/order",{order:e})).data},saveOmpChannelOrder:async function(e){return(await ct.post("/omp/channels/order",{order:e})).data},saveOpenCodeChannelOrder:async function(e){return(await ct.post("/opencode/channels/order",{order:e})).data},startOmpProxy:async function(){return(await ct.post("/omp/proxy/start")).data},startOpenCodeProxy:async function(){return(await ct.post("/opencode/proxy/start")).data},stopOmpProxy:async function(){return(await ct.post("/omp/proxy/stop")).data},stopOpenCodeProxy:async function(){return(await ct.post("/opencode/proxy/stop")).data},testAllClaudeChannelsSpeed:At,testAllCodexChannelsSpeed:$t,testAllGeminiChannelsSpeed:Lt,testAllOmpChannelsSpeed:async function(e=2e4){return(await ct.post("/omp/channels/speed-test-all",{timeout:e},{timeout:12e4})).data},testAllOpenCodeChannelsSpeed:Kt,testClaudeChannelSpeed:It,testCodexChannelSpeed:Ot,testGeminiChannelSpeed:jt,testOmpChannelSpeed:Xt,testOpenCodeChannelSpeed:Gt,updateChannel:vt,updateCodexChannel:kt,updateGeminiChannel:St,updateOmpChannel:Zt,updateOpenCodeChannel:Rt},Symbol.toStringTag,{value:"Module"})),ts=[{id:"official",name:"Claude 官方",category:"official",websiteUrl:"https://www.anthropic.com",baseUrl:"https://api.anthropic.com",env:{}},{id:"openai",name:"OpenAI",category:"third_party",websiteUrl:"https://platform.openai.com",baseUrl:"https://api.openai.com/v1",gatewaySourceType:"openai_compatible",targetApi:"responses",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:{}}],ss={official:"官方",cn_official:"国内官方",aggregator:"聚合服务",third_party:"第三方",custom:"自定义"};function ns(e){return ts.find(a=>a.id===e)}const os=[{id:"openai",name:"OpenAI",category:"official",websiteUrl:"https://platform.openai.com",baseUrl:"https://api.openai.com/v1",providerKey:"openai-official"},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:"",providerKey:""}],is={official:"官方",custom:"自定义"};function rs(e){return os.find(a=>a.id===e)}const cs=[{id:"google",name:"Google AI",category:"official",websiteUrl:"https://ai.google.dev",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiFormat:"gemini_api"},{id:"vertex_ai_v1",name:"Vertex AI v1",category:"official",websiteUrl:"https://cloud.google.com/vertex-ai/generative-ai/docs",baseUrl:"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google",apiFormat:"vertex_ai_v1"},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:"",apiFormat:"gemini_api"}],us={official:"官方",custom:"自定义"};function ds(e){return cs.find(a=>a.id===e)}const ps=[{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:[]}],vs={apikey:"API Key",entry:"转换入口",custom:"自定义"};function ms(e){return ps.find(a=>a.id===e)}const{getAllModelsByToolType:fs,loadDefaultModels:ys}=tt(),gs=/^https?:\/\//i,hs=/^[a-z0-9_-]+$/i,bs=new Set(["anyrouter","newcli"]);function ws(e){const a=Number(e);return!Number.isFinite(a)||a<=0?null:Math.round(a)}function ks(e){const a=Number(e);return!Number.isFinite(a)||a<1?1:Math.min(100,Math.round(a))}function _s(e,a,{required:l}={}){if(!a)return l?`${e}不能为空`:"";if(!gs.test(a))return`${e}必须以 http:// 或 https:// 开头`;try{new URL(a)}catch(t){return`${e}不是合法的链接`}return""}function xs(e){const a=String(e||"").trim();return a?hs.test(a)?"openai"===a.toLowerCase()?"Provider Key 不能使用保留值 openai,请改成 openai-official 之类的自定义标识":"":"只能包含字母、数字、下划线和中划线,例如 openai-official":"Provider Key 不能为空"}function Cs(e){const a=!0!==e._showChannelBalance||Us(e);return{apiKey:e.apiKey||"",authMode:"oauth"===e.authMode?"oauth":"api_key",oauthProviderId:e.oauthProviderId||e.providerKey||"",balanceToken:a&&e.balanceToken||"",balanceUserId:a&&e.balanceUserId||null}}function Us(e={}){return!0===e._showChannelBalance&&bs.has(function(e={}){const a=[e.presetId,e.providerKey,e.name,e.websiteUrl,e.baseUrl].map(e=>String(e||"").trim().toLowerCase()).join(" ");return a.includes("anyrouter")?"anyrouter":a.includes("code.newcli.com")||a.includes("newcli")||a.includes("new-cli")?"newcli":null}(e))}function Ps(e="余额凭据"){return{key:"balanceToken",label:e,type:"password",showWhen:Us,placeholder:"选填:余额接口需要的会话 Token / Cookie(NewCLI 可填完整 Cookie)"}}function Ss(){return{key:"balanceUserId",label:"余额用户 ID",type:"number",min:1,clearable:!0,showWhen:Us,placeholder:"选填:New API / AnyRouter 需要 New-Api-User 时填写"}}function zs(e){return{...e}}function Ts(e={}){const a=Array.isArray(e.allowedModels)?e.allowedModels.map(e=>String(e||"").trim()).filter(Boolean):[];return 0===a.length?"(默认/测速模型)":a.length<=3?a.join(", "):`${a.slice(0,3).join(", ")} +${a.length-3}`}function Is(e){const a=String(e||"").trim().toLowerCase();return"claude"===a?"Claude Code":"gemini"===a?"Gemini":"Codex"}function Ms(e=[]){return e.map(e=>({label:e,value:e}))}function As(...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 s=t.toLowerCase();a.has(s)||(a.add(s),l.push({label:(null==e?void 0:e.label)||t,value:t}))}return l}function Os(e){return Ms(fs(e))}const $s={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:"停用"}]},js={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:ts,presetCategories:ss,getPresetById:ns,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=>_s("接口地址",e,{required:!0})},{key:"apiKey",label:"接口密钥",type:"password",required:!0,placeholder:"sk-..."},Ps(),Ss(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>_s("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则自动检测)",description:"指定用于速度测试的模型,留空则使用自动检测",options:Os("claude"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,showWhen:e=>"official"===e.presetId||"openai_compatible"===e.gatewaySourceType,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"OpenAI 网关",description:"OpenAI 格式渠道需要通过 Claude 代理使用;优先选择 Responses API,不兼容时再切到 Chat Completions",showWhen:e=>"openai_compatible"===e.gatewaySourceType,fields:[{key:"targetApi",label:"上游接口",type:"radio-group",options:[{label:"Responses API",value:"responses"},{label:"Chat Completions",value:"chat.completions"}]}]},{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:$s.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:"",balanceToken:"",balanceUserId:null,websiteUrl:"https://www.anthropic.com",speedTestModel:"",modelConfig:{model:"",haikuModel:"",sonnetModel:"",opusModel:""},modelRedirects:[],proxyUrl:"",gatewaySourceType:"claude",targetApi:"responses",maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null}),mapChannelToForm:e=>{var a,l,t,s;return{presetId:e.presetId||"official",name:e.name||"",baseUrl:e.baseUrl||"",apiKey:e.apiKey||"",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,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==(s=e.modelConfig)?void 0:s.opusModel)||""},modelRedirects:e.modelRedirects||[],proxyUrl:e.proxyUrl||"",gatewaySourceType:e.gatewaySourceType||"claude",targetApi:e.targetApi||"responses",maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null}},onPresetChange:(e,a)=>{const l=ns(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",t.targetApi=l.targetApi||t.targetApi||"responses",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||""}),zs(t)},fetchModelsForChannel:async(e,a)=>{var l;await ys();var t;const s=Os((t=a.gatewaySourceType,"openai_compatible"===String(t||"").trim().toLowerCase()?"codex":"claude"));if(a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=s,void(a.modelsFetching=!1);try{const l=await Mt(e,a.gatewaySourceType||null);l.models&&l.models.length>0?(a.availableModels=As(Ms(l.models),s),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表(API 端点受保护)",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=s,a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(n){a.availableModels=s;const e=null==(l=n.response)?void 0:l.data;e?(a.modelsFetchError=e.error||n.message||"获取模型列表失败",a.modelsFetchErrorHint=e.errorHint||"已使用默认模型列表"):(a.modelsFetchError=n.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表")}finally{a.modelsFetching=!1}},testFn:It,api:{fetch:async()=>(await dt()).channels||[],create:async e=>{const a=Cs(e);await pt(e.name,e.baseUrl,a.apiKey,e.websiteUrl||void 0,{maxConcurrency:ws(e.maxConcurrency),weight:ks(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",targetApi:e.targetApi||"responses",balanceToken:a.balanceToken,balanceUserId:a.balanceUserId})},update:async(e,a)=>{const l=Cs(a);await vt(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:ws(a.maxConcurrency),weight:ks(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",targetApi:a.targetApi||"responses",balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},toggle:async(e,a)=>{await vt(e.id,{enabled:a})},remove:mt,applyToSettings:async e=>ft(e.id),resetHealth:async e=>yt(e.id)},getHeaderTags:(e,a)=>{var l,t;const s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},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:os,presetCategories:is,getPresetById:rs,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-official",disabledOnEdit:!0,validate:xs},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://api.example.com",validate:e=>_s("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-..."},Ps(),Ss(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>_s("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用默认)",description:"指定用于速度测试的模型,留空则使用默认模型",options:Os("codex"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:$s.schedule}],getInitialForm:()=>({presetId:"openai",name:"OpenAI",providerKey:"openai-official",baseUrl:"https://api.openai.com/v1",apiKey:"",balanceToken:"",balanceUserId:null,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||"",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,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=rs(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",zs(t)},fetchModelsForChannel:async(e,a)=>{if(await ys(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=Os("codex"),void(a.modelsFetching=!1);try{const l=await Et(e);l.models&&l.models.length>0?(a.availableModels=As(Ms(l.models),Os("codex")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=Os("codex"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(l){a.availableModels=Os("codex"),a.modelsFetchError=l.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表"}finally{a.modelsFetching=!1}},testFn:Ot,api:{fetch:async()=>(await bt()).channels||[],create:async e=>{const a=Cs(e);await wt(e.name,e.providerKey,e.baseUrl,a.apiKey,e.websiteUrl||"",{maxConcurrency:ws(e.maxConcurrency),weight:ks(e.weight),enabled:e.enabled,modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,gatewaySourceType:e.gatewaySourceType||"codex",balanceToken:a.balanceToken,balanceUserId:a.balanceUserId})},update:async(e,a)=>{const l=Cs(a);await kt(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:ws(a.maxConcurrency),weight:ks(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,gatewaySourceType:a.gatewaySourceType||"codex",balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},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 s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},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:cs,presetCategories:us,getPresetById:ds,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=>_s("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"AIza..."},Ps(),Ss(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>_s("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用 model 字段)",description:"指定用于速度测试的模型,留空则使用上方配置的 Model",options:Os("gemini"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:$s.schedule}],getInitialForm:()=>({presetId:"google",name:"Google AI",model:"gemini-2.5-pro",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiKey:"",apiFormat:"gemini_api",balanceToken:"",balanceUserId:null,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||"",apiFormat:e.apiFormat||"gemini_api",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,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=ds(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.apiFormat=l.apiFormat||"gemini_api",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"gemini",zs(t)},fetchModelsForChannel:async(e,a)=>{if(await ys(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=Os("gemini"),void(a.modelsFetching=!1);try{const l=await Dt(e);l.models&&l.models.length>0?(a.availableModels=As(Ms(l.models),Os("gemini")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=Os("gemini"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(l){a.availableModels=Os("gemini"),a.modelsFetchError=l.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表"}finally{a.modelsFetching=!1}},testFn:jt,api:{fetch:async()=>(await Ut()).channels||[],create:async e=>{const a=Cs(e);await Pt(e.name,e.baseUrl,a.apiKey,e.model,e.websiteUrl||"",{maxConcurrency:ws(e.maxConcurrency),weight:ks(e.weight),enabled:e.enabled,modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,apiFormat:e.apiFormat||"gemini_api",gatewaySourceType:e.gatewaySourceType||"gemini",balanceToken:a.balanceToken,balanceUserId:a.balanceUserId})},update:async(e,a)=>{const l=Cs(a);await St(e.id,{name:a.name,model:a.model,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:ws(a.maxConcurrency),weight:ks(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,apiFormat:a.apiFormat||"gemini_api",gatewaySourceType:a.gatewaySourceType||"gemini",balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},toggle:async(e,a)=>St(e.id,{enabled:a}),remove:zt,resetHealth:async e=>Tt(e.id)},getHeaderTags:(e,a)=>{var l,t;const s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},buildInfoRows:(e,a)=>{var l,t;return[{label:"Model",value:e.model,mono:!0},{label:"API",value:(t=e.apiFormat,"vertex_ai_v1"===String(t||"").trim().toLowerCase()?"Vertex AI v1":"Gemini API")},{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:ps,presetCategories:vs,getPresetById:ms,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=>_s("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-..."},Ps(),Ss(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>_s("官网链接",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:$s.schedule}],getInitialForm:()=>({presetId:"openrouter",name:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",wireApi:"openai",apiKey:"",balanceToken:"",balanceUserId:null,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||"",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,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=ms(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",zs(t)},fetchModelsForChannel:async(e,a,{forceRefresh:l=!1}={})=>{await ys(),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=Os(l),void(a.modelsFetching=!1)}if(e)try{const t=await qt(e,{forceRefresh:l});t.models&&t.models.length>0?(a.availableModels=Ms(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(s){a.availableModels=[],a.modelsFetchError=s.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}else{if(!a.baseUrl)return a.availableModels=[],void(a.modelsFetching=!1);try{const e=await Wt({baseUrl:a.baseUrl,apiKey:a.apiKey||"",gatewaySourceType:a.gatewaySourceType||"codex"});a.availableModels=e.models&&e.models.length>0?Ms(e.models):[],e.error&&(a.modelsFetchError=e.error,a.modelsFetchErrorHint=e.errorHint||"请手动填写模型名称")}catch(s){a.availableModels=[],a.modelsFetchError=s.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}}},testFn:Gt,api:{fetch:async()=>(await Nt()).channels||[],create:async e=>{const a=Cs(e);await Bt(e.name,e.baseUrl,a.apiKey,{wireApi:e.wireApi||"openai",maxConcurrency:ws(e.maxConcurrency),weight:ks(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=Cs(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:ws(a.maxConcurrency),weight:ks(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,allowedModels:a.allowedModels||[],balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},toggle:async(e,a)=>Rt(e.id,{enabled:a}),remove:Ft,resetHealth:async e=>Ht(e.id)},getHeaderTags:(e,a)=>{var l,t;const s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},buildInfoRows:(e,a)=>{var l;return[{label:"入口协议",value:Is(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:"重置状态"}]}}),omp:()=>({type:"omp",displayName:"OMP",schedulerSource:"omp",storageKeys:{localCollapse:"ompChannelCollapse",collapseConfigKey:"omp",orderConfigKey:"omp"},emptyDescription:"暂无 OMP 渠道",showEmptyAction:!0,emptyActionText:"添加 OMP 渠道",modalWidth:600,formLabelWidth:95,showApplyButton:!1,presets:ps,presetCategories:vs,getPresetById:ms,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-official",validate:xs},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://api.example.com/v1",validate:e=>_s("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-...",validate:e=>function(e,a){if(null==a||""===a)return`${e}不能为空`}("API Key",e)},Ps(),Ss(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>_s("官网链接",e,{required:!1})},{key:"model",label:"默认模型",type:"select",placeholder:"选择或输入默认模型(留空则由 OMP 决定)",options:[],clearable:!0},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用默认模型)",options:[],clearable:!0},{key:"allowedModels",label:"可用模型",type:"model-multi-select",placeholder:"选择注册到 OMP models.yml 的模型",description:"仅选中的模型会暴露给 OMP;留空时仅使用默认模型/测速模型,不回退到 provider 全量目录"}]},{title:"模型重定向",description:"仅在 coding-tool-x 托管 OMP models.yml provider 启用时用于模型选择提示",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:$s.schedule}],getInitialForm:()=>({presetId:"openrouter",name:"OpenRouter",providerKey:"openrouter",baseUrl:"https://openrouter.ai/api/v1",wireApi:"openai",providerApi:"openai-completions",apiKey:"",balanceToken:"",balanceUserId:null,websiteUrl:"https://openrouter.ai",model:"",gatewaySourceType:"openai_compatible",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||"",providerKey:e.providerKey||e.provider||e.name||"",baseUrl:e.baseUrl||"",wireApi:e.wireApi||"openai",providerApi:e.providerApi||e.api||"openai-completions",apiKey:e.apiKey||"",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,websiteUrl:e.websiteUrl||"",model:e.model||"",gatewaySourceType:e.gatewaySourceType||"openai_compatible",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=ms(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.providerKey=(l.id||l.name||"provider").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-|-$/g,""),t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.wireApi=l.wireApi||"openai",t.providerApi="openai-completions",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"openai_compatible",zs(t)},fetchModelsForChannel:async(e,a,{forceRefresh:l=!1}={})=>{if(await ys(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,e)try{const t=await es(e,{forceRefresh:l});a.availableModels=t.models&&t.models.length>0?Ms(t.models):[],t.error&&(a.modelsFetchError=t.error,a.modelsFetchErrorHint=t.errorHint||"请手动填写模型名称")}catch(t){a.availableModels=[],a.modelsFetchError=t.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}else{if(!a.baseUrl)return a.availableModels=[],void(a.modelsFetching=!1);try{const e=await as({baseUrl:a.baseUrl,apiKey:a.apiKey||"",gatewaySourceType:a.gatewaySourceType||"openai_compatible",authMode:"api_key",oauthProviderId:"",model:a.model||null,speedTestModel:a.speedTestModel||null,allowedModels:Array.isArray(a.allowedModels)?a.allowedModels:[],modelRedirects:Array.isArray(a.modelRedirects)?a.modelRedirects:[]});a.availableModels=e.models&&e.models.length>0?Ms(e.models):[],e.error&&(a.modelsFetchError=e.error,a.modelsFetchErrorHint=e.errorHint||"请手动填写模型名称")}catch(t){a.availableModels=[],a.modelsFetchError=t.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}}},testFn:Xt,api:{fetch:async()=>(await Vt()).channels||[],create:async e=>{const a=Cs(e);await Jt(e.name,e.baseUrl,a.apiKey,{wireApi:e.wireApi||"openai",providerApi:e.providerApi||"openai-completions",providerKey:e.providerKey,authMode:"api_key",oauthProviderId:"",maxConcurrency:ws(e.maxConcurrency),weight:ks(e.weight),enabled:e.enabled,model:e.model||null,gatewaySourceType:e.gatewaySourceType||"openai_compatible",modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,websiteUrl:e.websiteUrl||"",allowedModels:e.allowedModels||[],balanceToken:a.balanceToken,balanceUserId:a.balanceUserId})},update:async(e,a)=>{const l=Cs(a);await Zt(e.id,{name:a.name,providerKey:a.providerKey,baseUrl:a.baseUrl,apiKey:l.apiKey,wireApi:a.wireApi||"openai",providerApi:a.providerApi||"openai-completions",authMode:"api_key",oauthProviderId:"",websiteUrl:a.websiteUrl,model:a.model||null,gatewaySourceType:a.gatewaySourceType||"openai_compatible",maxConcurrency:ws(a.maxConcurrency),weight:ks(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,allowedModels:a.allowedModels||[],balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},toggle:async(e,a)=>Zt(e.id,{enabled:a}),remove:Qt,resetHealth:async e=>Yt(e.id)},getHeaderTags:(e,a)=>{var l,t;const s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},buildInfoRows:(e,a)=>{var l;const t=e.ompAuthProvider,s=[{label:"Provider",value:e.providerKey||e.provider||"(未设置)",mono:!0},{label:"API",value:e.providerApi||e.api||"openai-completions",mono:!0},{label:"Model",value:e.model||"(默认)",mono:!0},{label:"Allowed",value:Ts(e),mono:!0}];return t&&s.push({label:"Login",value:t.loggedIn?`${t.name||t.id} (${t.accountCount||0})`:`${t.name||t.id} (未登录)`}),s.push({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:"重置状态"}),s}})};function Ls(){return W(["message","dialog"],{configProviderProps:{theme:"dark"===document.documentElement.getAttribute("data-theme")?V:J}})}let Es=Ls();new MutationObserver(()=>{Es=Ls()}).observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]});const Ds={success:(...e)=>Es.message.success(...e),error:(...e)=>Es.message.error(...e),warning:(...e)=>Es.message.warning(...e),info:(...e)=>Es.message.info(...e),loading:(...e)=>Es.message.loading(...e)},Ns={success:(...e)=>Es.dialog.success(...e),error:(...e)=>Es.dialog.error(...e),warning:(...e)=>Es.dialog.warning(...e),info:(...e)=>Es.dialog.info(...e),create:(...e)=>Es.dialog.create(...e)};async function Bs(){return(await ct.get("/ui-config")).data}async function Rs(e){return(await ct.post("/ui-config",{config:e})).data}async function Fs(e,a){return(await ct.put(`/ui-config/${e}`,{value:a})).data}async function Hs(e,a,l){return(await ct.put(`/ui-config/${e}/${a}`,{value:l})).data}const Gs=Object.freeze(Object.defineProperty({__proto__:null,getUIConfig:Bs,saveUIConfig:Rs,updateNestedUIConfig:Hs,updateUIConfigKey:Fs},Symbol.toStringTag,{value:"Module"})),Ks="__ccAdvancedConfigBound__";let qs=null,Ws=0,Vs=!1,Js=null;const Zs=Object.create(null),Qs=new Set;function Ys(){const e=new Date;return e.setHours(0,0,0,0),{start:e.getTime(),end:e.getTime()+864e5}}function Xs(e,a){if(a.usageMissing)return null;if(void 0!==a.totalTokens&&null!==a.totalTokens)return Number(a.totalTokens)||0;const l=Number(a.inputTokens)||0,t=Number(a.outputTokens)||0,s=Number(a.cacheCreation)||0,n=Number(a.cacheRead)||0;return"claude"===e?l+t+s+n:l+t}function en(e={}){const a=[e.model,e.redirectedModel,e.modelFromUrl,e.originalModel];for(const l of a)if("string"==typeof l&&l.trim())return l.trim();return""}const an=k("global",()=>{const e=l({running:!1,loading:!1,activeChannel:null,port:20088,runtime:null,startTime:null,defaultPort:20088}),a=l({running:!1,loading:!1,activeChannel:null,port:20089,runtime:null,startTime:null,defaultPort:20089}),s=l({running:!1,loading:!1,activeChannel:null,port:20090,runtime:null,startTime:null,defaultPort:20090}),n=l({running:!1,loading:!1,activeChannel:null,port:20091,runtime:null,startTime:null,defaultPort:20091}),o=l({running:!1,loading:!1,activeChannel:null,port:20092,runtime:null,startTime:null,defaultPort:20092}),i=l([]),r=l([]),c=l([]),u=l([]),d=l([]);function p(){Object.keys(Zs).forEach(e=>{delete Zs[e]}),i.value.forEach(e=>{(null==e?void 0:e.name)&&(Zs[e.name]="claude")}),r.value.forEach(e=>{(null==e?void 0:e.name)&&(Zs[e.name]="codex")}),c.value.forEach(e=>{(null==e?void 0:e.name)&&(Zs[e.name]="gemini")}),u.value.forEach(e=>{(null==e?void 0:e.name)&&(Zs[e.name]="opencode")}),d.value.forEach(e=>{(null==e?void 0:e.name)&&(Zs[e.name]="omp")})}const v=_({claude:{channels:[],pending:0},codex:{channels:[],pending:0},gemini:{channels:[],pending:0},opencode:{channels:[],pending:0},omp:{channels:[],pending:0}}),m=_({claude:[],codex:[],gemini:[],opencode:[],omp:[]}),f=l(!1),y=l(100),g=l(30);let h=100,b=Ys();function w(e){return function(){const e=Date.now();(e<b.start||e>=b.end)&&(b=Ys(),P())}(),e>=b.start&&e<b.end}function k(e){for(;e.length>h;)e.pop()}function x(e){h=e,y.value=e,Object.values(m).forEach(k)}function C(e){const a=parseInt(e,10);if(Number.isNaN(a))return;const l=Math.min(Math.max(a,10),300);g.value!==l&&(g.value=l)}function U(e){const a=function(e){var a,l,t,s;if(e.source)return e.source;if("opencode"===e.toolType)return"opencode";if("omp"===e.toolType)return"omp";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(a.includes("omp"))return"omp"}if(e.channel){const a=Zs[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("omp"))?"omp":(null==(t=e.action)?void 0:t.includes("codex"))?"codex":(null==(s=e.action)?void 0:s.includes("gemini"))?"gemini":"claude"}(e),l=m[a];if(!l)return;const t=e.timestamp||Date.now();if(!w(t))return;const s=e.time||new Date(t).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}),n={id:e.id||`${Date.now()}-${Math.random()}`,source:a,type:e.type||(e.action?"action":"log"),status:e.status||(e.error?"error":"success"),action:e.action||null,channel:e.channel||e.channelName||"Unknown",model:en(e),originalModel:e.originalModel||null,redirectedModel:e.redirectedModel||null,message:e.message,error:e.error||null,statusCode:e.statusCode||null,stage:e.stage||null,usageMissing:Boolean(e.usageMissing),timestamp:t,time:s,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:Xs(a,e)},cost:e.cost||0,isHistory:Vs,isNew:!Vs};l.unshift(n),k(l),n.isNew&&setTimeout(()=>{n.isNew=!1},4500)}function P(){Object.keys(m).forEach(e=>{m[e].splice(0,m[e].length)})}function S(e,a={},l){e.value={...e.value,...a,activeChannel:l||e.value.activeChannel}}function z(e=[],a=[]){if(!Array.isArray(a))return e;const l=new Map(e.filter(e=>null==e?void 0:e.id).map(e=>[e.id,e]));return a.map(e=>{const a=l.get(null==e?void 0:e.id);return a?!Object.prototype.hasOwnProperty.call(e,"apiKey")&&a.apiKey?{...a,...e,apiKey:a.apiKey}:{...a,...e}:e})}function T(l){const{source:t,proxy:v,activeChannel:m,channels:f}=l;"claude"===t?(S(e,v,m),f&&(i.value=z(i.value,f),p())):"codex"===t?(S(a,v,m),f&&(r.value=z(r.value,f),p())):"gemini"===t?(S(s,v,m),f&&(c.value=z(c.value,f),p())):"opencode"===t?(S(n,v,m),f&&(u.value=z(u.value,f),p())):"omp"===t&&(S(o,v,m),f&&(d.value=z(d.value,f),p()))}async function I(){var l,t,i,r,c;try{const[u,d,p,v,m]=await Promise.all([dl.get("/api/proxy/status").catch(()=>({})),dl.get("/api/codex/proxy/status").catch(()=>({})),dl.get("/api/gemini/proxy/status").catch(()=>({})),dl.get("/api/opencode/proxy/status").catch(()=>({})),dl.get("/api/omp/proxy/status").catch(()=>({}))]);(null==(l=u.data)?void 0:l.proxy)&&S(e,u.data.proxy,u.data.activeChannel),(null==(t=d.data)?void 0:t.proxy)&&S(a,d.data.proxy,d.data.activeChannel),(null==(i=p.data)?void 0:i.proxy)&&S(s,p.data.proxy,p.data.activeChannel),(null==(r=v.data)?void 0:r.proxy)&&S(n,v.data.proxy,v.data.activeChannel),(null==(c=m.data)?void 0:c.proxy)&&S(o,m.data.proxy,m.data.activeChannel)}catch(u){}}async function M(){var e,a,l,t,s;try{const[n,o,m,f,y,g,h,b,w,k]=await Promise.all([dl.get("/api/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/codex/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/gemini/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/opencode/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/omp/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/channels/pool/status?source=claude").catch(()=>({data:null})),dl.get("/api/channels/pool/status?source=codex").catch(()=>({data:null})),dl.get("/api/channels/pool/status?source=gemini").catch(()=>({data:null})),dl.get("/api/channels/pool/status?source=opencode").catch(()=>({data:null})),dl.get("/api/channels/pool/status?source=omp").catch(()=>({data:null}))]);i.value=n.data.channels||[],r.value=o.data.channels||[],c.value=m.data.channels||[],u.value=f.data.channels||[],d.value=y.data.channels||[],p(),(null==(e=g.data)?void 0:e.scheduler)&&(v.claude=g.data.scheduler),(null==(a=h.data)?void 0:a.scheduler)&&(v.codex=h.data.scheduler),(null==(l=b.data)?void 0:l.scheduler)&&(v.gemini=b.data.scheduler),(null==(t=w.data)?void 0:t.scheduler)&&(v.opencode=w.data.scheduler),(null==(s=k.data)?void 0:s.scheduler)&&(v.omp=k.data.scheduler)}catch(n){}}function A(l){return"codex"===l?a:"gemini"===l?s:"opencode"===l?n:"omp"===l?o:e}return"undefined"==typeof window||window[Ks]||(window.addEventListener("advanced-config-change",e=>{var a,l;(null==(a=e.detail)?void 0:a.maxLogs)&&x(e.detail.maxLogs),(null==(l=e.detail)?void 0:l.statsInterval)&&C(e.detail.statsInterval)}),window[Ks]=!0),{claudeProxy:e,codexProxy:a,geminiProxy:s,opencodeProxy:n,ompProxy:o,claudeChannels:i,codexChannels:r,geminiChannels:c,opencodeChannels:u,ompChannels:d,schedulerState:v,connectWebSocket:function e(){if(qs&&qs.readyState===WebSocket.OPEN)return;const a=`${"https:"===window.location.protocol?"wss:":"ws:"}//${window.location.host}/ws`;try{qs=new WebSocket(a),qs.onopen=()=>{Ws=0,f.value=!0,Vs=!0,clearTimeout(Js),Js=setTimeout(()=>{Vs=!1},2e3),I()},qs.onmessage=e=>{try{const a=JSON.parse(e.data);"proxy-state"===a.type?T(a):"scheduler-state"===a.type?function(e){const{source:a,scheduler:l}=e;v[a]&&l&&(v[a]=l)}(a):"browser-notification"===a.type?function(e){if("undefined"==typeof window||"undefined"==typeof Notification)return;if("granted"!==Notification.permission)return;const a=e.id||`${e.source||"claude"}-${e.timestamp||Date.now()}`;if(Qs.has(a))return;Qs.add(a),new Notification(e.title||"coding-tool-x",{body:e.message||"任务已完成",tag:a,icon:"/logo.png"}).onclick=()=>{try{window.focus(),e.url&&window.location.assign(e.url)}catch(a){}}}(a):U(a)}catch(a){}},qs.onclose=()=>{f.value=!1,qs=null,Vs=!1,clearTimeout(Js);const a=Math.min(1e3*Math.pow(2,Ws),1e4);Ws+=1,setTimeout(e,a)},qs.onerror=e=>{f.value=!1}}catch(l){f.value=!1}},initializeState:I,loadChannels:M,getProxyState:A,getChannels:function(e){return"codex"===e?r:"gemini"===e?c:"opencode"===e?u:"omp"===e?d:i},getSchedulerState:function(e){return v[e]||{channels:[],pending:0}},handleProxyStateUpdate:T,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":"omp"===e?"/api/omp/proxy/start":"/api/proxy/start";const l=await dl.post(a);if(l.data.success){const a=A(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 s;s="codex"===e?"/api/codex/proxy/stop":"gemini"===e?"/api/gemini/proxy/stop":"opencode"===e?"/api/opencode/proxy/stop":"omp"===e?"/api/omp/proxy/stop":"/api/proxy/stop";const n=await dl.post(s),o=A(e);return o.value.running=!1,o.value.activeChannel=null,o.value.startTime=null,o.value.runtime=null,!1!==(null==(l=n.data)?void 0:l.success)&&await M(),a.refreshChannelsDrawer&&!1!==(null==(t=n.data)?void 0:t.success)&&"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e,reason:"proxy-stop"}})),n.data},getLogs:function(e){return t(()=>m[e]||[])},wsConnected:f,clearLogsState:P,clearLogsForSource:function(e){m[e]&&m[e].splice(0,m[e].length)},logLimit:y,statsInterval:g,loadAdvancedConfig:async function(){try{const e=await fetch("/api/config/advanced");if(e.ok){const a=await e.json();x(a.maxLogs||100),a.statsInterval&&C(a.statsInterval)}}catch(e){}}}});let ln=!1;function tn(e){try{const a=localStorage.getItem(e);if(a)return JSON.parse(a)}catch(a){}return{}}function sn(e,a){try{localStorage.setItem(e,JSON.stringify(a))}catch(l){}}function nn(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 on(e){const a=an();let l=null;const t=_({channels:[],balances:{},loading:!1,toggling:{},collapsed:tn(e.storageKeys.localCollapse),showDialog:!1,editingChannel:null,showChannelBalance:!1,formData:e.getInitialForm()}),s=_({});function n(){var l;const s=a.schedulerState[e.schedulerSource];(null==(l=null==s?void 0:s.channels)?void 0:l.length)&&t.channels.length&&(t.channels.forEach(e=>{const a=s.channels.find(a=>a.id===e.id);(null==a?void 0:a.health)&&(e.health=a.health)}),u())}const o=x(()=>{var l;return null==(l=a.schedulerState[e.schedulerSource])?void 0:l.channels},n);async function i(){t.loading=!0;try{const a=await e.api.fetch();t.channels=Array.isArray(a)?[...a]:[],await async function(){try{if(t.channels.length>0){const e=[...t.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),l=e.filter(e=>!1===e.enabled);l.forEach(e=>{t.collapsed[e.id]=!0}),t.channels=[...a,...l]}}catch(e){}}(),await r(),n(),u()}catch(a){Ds.error(nn(a,`${e.displayName} 渠道加载失败`))}finally{t.loading=!1}}async function r(){var a;try{const l=await m();if(!0!==(null==(a=null==l?void 0:l.channelBalance)?void 0:a.showRemaining))return t.showChannelBalance=!1,t.formData._showChannelBalance=!1,void(t.balances={});t.showChannelBalance=!0,t.formData._showChannelBalance=!0;const s=await gt(e.type);t.balances=(null==s?void 0:s.enabled)&&s.balances?s.balances:{}}catch(l){t.balances={}}}function c(){l&&(clearTimeout(l),l=null)}function u(){c();const e=t.channels.filter(e=>{var a,l;return"frozen"===(null==(a=e.health)?void 0:a.status)&&Number(null==(l=e.health)?void 0:l.freezeRemaining)>0}).sort((e,a)=>{var l,t;return Number((null==(l=e.health)?void 0:l.freezeRemaining)||0)-Number((null==(t=a.health)?void 0:t.freezeRemaining)||0)})[0];if(!e)return;const a=Math.max(1e3,1e3*Number(e.health.freezeRemaining||0));l=setTimeout(()=>{l=null,i()},a+250)}let d=null,p=0;const v=6e4;async function m(){const e=Date.now();if(d&&e-p<v)return d;try{const a=await Bs();if(a.success&&a.config)return d=a.config,p=e,d}catch(a){}return null}async function f(){try{await Hs("channelCollapse",e.storageKeys.collapseConfigKey,t.collapsed)}catch(a){}}function y(){t.showDialog=!1,t.editingChannel=null,t.formData=e.getInitialForm(),t.formData._showChannelBalance=t.showChannelBalance,g()}function g(){Object.keys(s).forEach(e=>{delete s[e]})}function h(){let a=!0;const l=e=>{const a=e.key.replace(/\./g,"_");delete s[e.key],delete s[a]};return e.formSections.forEach(e=>{const n=(e=>!e.showWhen||e.showWhen(t.formData))(e);e.fields.forEach(e=>{if(!n||!(e=>!e.showWhen||e.showWhen(t.formData))(e))return void l(e);if(e.disabledOnEdit&&t.editingChannel)return void l(e);const o=((e,a)=>{if(!a||"string"!=typeof a||!a.includes("."))return e[a];const l=a.split(".");let t=e;for(const s of l)t=null==t?void 0:t[s];return t})(t.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,t.formData)||""),i?(s[e.key]={status:"error",message:i},a=!1):l(e)})}),a}async function b(){d=null,p=0,await r(),t.formData._showChannelBalance=t.showChannelBalance}return"undefined"!=typeof window&&window.addEventListener("channel-balance-visibility-change",b),Promise.all([i(),async function(){var a;try{const l=await m();if(l){const s=(null==(a=l.channelCollapse)?void 0:a[e.storageKeys.collapseConfigKey])||{};t.collapsed=s,sn(e.storageKeys.localCollapse,s)}}catch(l){}}()]),C(()=>{c(),o(),"undefined"!=typeof window&&window.removeEventListener("channel-balance-visibility-change",b)}),{state:t,validation:s,actions:{loadChannels:i,openAddDialog:function(){t.editingChannel=null,t.formData=e.getInitialForm(),t.formData._showChannelBalance=t.showChannelBalance,g(),t.showDialog=!0},closeDialog:y,toggleCollapse:function(a){t.collapsed[a]=!t.collapsed[a],sn(e.storageKeys.localCollapse,t.collapsed),f()},handleEdit:function(a){t.editingChannel=a,t.formData=e.mapChannelToForm(a),t.formData._showChannelBalance=t.showChannelBalance,g(),t.showDialog=!0},handleSave:async function(){if(h())try{t.editingChannel?(await e.api.update(t.editingChannel,t.formData),Ds.success(`${e.displayName} 渠道已更新`)):(await e.api.create(t.formData),Ds.success(`${e.displayName} 渠道已添加`)),y(),await i()}catch(a){Ds.error(nn(a))}else Ds.error("请检查表单填写是否完整")},handleDelete:function(a){Ns.warning({title:`删除 ${e.displayName} 渠道`,content:"确定要删除这个渠道吗?",positiveText:"确定",negativeText:"取消",onPositiveClick:async()=>{try{await e.api.remove(a),Ds.success(`${e.displayName} 渠道已删除`),await i()}catch(l){Ds.error(nn(l))}}})},handleToggleEnabled:async function(a,l){if(a&&!t.toggling[a.id]){t.toggling[a.id]=!0;try{const s="boolean"==typeof l?l:!1===a.enabled;await e.api.toggle(a,s),Ds.success(`${e.displayName} 渠道已${s?"启用":"禁用"}`),s?(delete t.collapsed[a.id],sn(e.storageKeys.localCollapse,t.collapsed),f()):(t.collapsed[a.id]=!0,sn(e.storageKeys.localCollapse,t.collapsed),f()),await i(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e.type}}))}catch(s){Ds.error(nn(s))}finally{t.toggling[a.id]=!1}}},handleApplyToSettings:function(a){"function"==typeof e.api.applyToSettings&&Ns.warning({title:"写入配置",content:"写入配置后会关闭动态切换并默认使用该渠道,是否继续?",positiveText:"确定",negativeText:"取消",onPositiveClick:async()=>{try{await e.api.applyToSettings(a),Ds.success("已将渠道写入配置文件"),await i(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e.type}}))}catch(l){Ds.error(nn(l))}}})},handleResetHealth:async function(a){if("function"==typeof e.api.resetHealth)try{await e.api.resetHealth(a),Ds.success("渠道健康状态已重置"),await i()}catch(l){Ds.error(nn(l))}},handleRefreshBalance:async function(a){if(null==a?void 0:a.id)try{const l=await ht(e.type,a.id);(null==l?void 0:l.enabled)&&l.balance&&(t.balances[a.id]=l.balance)}catch(l){}}}}}const rn={key:0,class:"loading-container"},cn={key:1},un={key:0,class:"empty-state"},dn={key:1,class:"channels-list"},pn={class:"section-title"},vn={key:0,class:"section-desc"},mn={key:2,class:"auth-provider-status"},fn={style:{padding:"8px",color:"#d03050","font-size":"12px"}},yn={style:{"font-weight":"500","margin-bottom":"4px"}},gn={key:0,style:{color:"#666","font-size":"11px","line-height":"1.4"}},hn={style:{padding:"8px",color:"#d03050","font-size":"12px"}},bn={style:{"font-weight":"500","margin-bottom":"4px"}},wn={key:0,style:{color:"#666","font-size":"11px","line-height":"1.4"}},kn={class:"dialog-footer"},_n={__name:"BaseChannelPanel",props:{type:{type:String,required:!0}},emits:["open-website"],setup(e,{expose:a,emit:l}){const v=l,w=(js[e.type]||js.claude)(),{state:k,validation:_,actions:C}=on(w),{getChannelInflight:T}=function(e="claude"){const a=an();return{getChannelInflight:function(l){var t;const s=null==(t=(a.schedulerState[e]||{channels:[]}).channels)?void 0:t.find(e=>e.id===l);return s?s.inflight:0}}}(w.schedulerSource);async function I(){w.fetchModelsForChannel&&await O({forceRefresh:!0})}x(()=>k.showDialog,async e=>{e&&w.fetchModelsForChannel&&await O()});const M=t(()=>{if(!w.presets)return[];const e={};return w.presets.forEach(a=>{var l;const t=a.category||"custom";e[t]||(e[t]={type:"group",label:(null==(l=w.presetCategories)?void 0:l[t])||t,key:t,children:[]}),e[t].children.push({label:a.name,value:a.id})}),Object.values(e)});async function A(e){if(w.onPresetChange){const a=w.onPresetChange(e,k.formData);Object.assign(k.formData,a)}else k.formData.presetId=e;await O()}async function O({forceRefresh:e=!1}={}){var a;w.fetchModelsForChannel&&await w.fetchModelsForChannel((null==(a=k.editingChannel)?void 0:a.id)||null,k.formData,{forceRefresh:e})}function $(e,a){if(!a.includes("."))return e[a];const l=a.split(".");let t=e;for(const s of l)t=null==t?void 0:t[s];return t}function j(e,a,l){if(!a.includes("."))return void(e[a]=l);const t=a.split(".");let s=e;for(let n=0;n<t.length-1;n++)s[t[n]]||(s[t[n]]={}),s=s[t[n]];s[t[t.length-1]]=l}function L(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 E(e,a){const l=[],t=new Set,s=e=>{for(const a of e||[]){const e=String((null==a?void 0:a.value)||"").trim();if(!e)continue;const s=e.toLowerCase();t.has(s)||(t.add(s),l.push({label:(null==a?void 0:a.label)||e,value:e}))}};s(k.formData.availableModels||[]),s(a||[]);const n=l;if(!e||!n.length)return n;const o=e.toLowerCase();return n.filter(e=>(e.label||e.value||"").toLowerCase().includes(o))}function D(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 N(e){var a,l;const t=e.replace(/\./g,"_");return(null==(a=_[t])?void 0:a.message)||(null==(l=_[e])?void 0:l.message)}function B(e){if("function"!=typeof e.getStatus)return{tags:[],message:""};const a=e.getStatus(k.formData)||{};return{tags:Array.isArray(a.tags)?a.tags:[],message:a.message||"",warning:!0===a.warning}}const K={getChannelInflight:T,getChannelBalance:e=>k.balances[e.id]||null,formatFreeze:e=>`冻结 ${e||0}s`,maskApiKey:e=>void 0===e?"已隐藏":e?e.length<=12?"******":`${e.slice(0,8)}******${e.slice(-4)}`:"(未设置)",handleResetHealth:e=>C.handleResetHealth(e),handleRefreshBalance:e=>C.handleRefreshBalance(e),handleOpenWebsite:e=>v("open-website",e)};function W(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 V(e){switch(e.type){case"password":case"text":default:return ne;case"number":return oe;case"switch":return G;case"radio-group":return le}}function J(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(),s("div",null,[d(k).loading?(n(),s("div",rn,[c(d(Z),{size:"small"})])):(n(),s("div",cn,[0===d(k).channels.length?(n(),s("div",un,[c(d(Q),{description:d(w).emptyDescription},U({_:2},[d(w).showEmptyAction?{name:"extra",fn:u(()=>[c(d(F),{type:"primary",size:"small",onClick:d(C).openAddDialog},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[h(" "+m(d(w).emptyActionText),1)]),_:1},8,["onClick"])]),key:"0"}:void 0]),1032,["description"])])):(n(),s("div",dn,[(n(!0),s(f,null,y(d(k).channels,e=>(n(),g(ql,{key:e.id,channel:e,collapsed:d(k).collapsed[e.id],"header-tags":d(w).getHeaderTags(e,K),balance:K.getChannelBalance(e),"info-rows":d(w).buildInfoRows(e,K),meta:W(e),"show-apply-button":d(w).showApplyButton,"channel-type":d(w).type,"test-fn":d(w).testFn,toggling:!!d(k).toggling[e.id],onToggleCollapse:a=>d(C).toggleCollapse(e.id),onApply:a=>d(C).handleApplyToSettings(e),onEdit:a=>d(C).handleEdit(e),onDelete:a=>d(C).handleDelete(e.id),onToggleEnabled:a=>d(C).handleToggleEnabled(e,a),onRefreshBalance:a=>d(C).handleRefreshBalance(e),onOpenWebsite:a[0]||(a[0]=e=>v("open-website",e))},null,8,["channel","collapsed","header-tags","balance","info-rows","meta","show-apply-button","channel-type","test-fn","toggling","onToggleCollapse","onApply","onEdit","onDelete","onToggleEnabled","onRefreshBalance"]))),128))]))])),c(d(se),{show:d(k).showDialog,"onUpdate:show":a[5]||(a[5]=e=>d(k).showDialog=e),preset:"card",title:d(k).editingChannel?d(w).editTitle:d(w).addTitle,class:"channel-dialog",style:z({width:d(w).modalWidth+"px",maxHeight:"80vh"}),"content-style":{maxHeight:"calc(80vh - 100px)",overflowY:"auto"}},{footer:u(()=>[o("div",kn,[c(d(F),{onClick:d(C).closeDialog},{default:u(()=>[...a[6]||(a[6]=[h("取消",-1)])]),_:1},8,["onClick"]),c(d(F),{type:"primary",onClick:d(C).handleSave},{default:u(()=>[h(m(d(k).editingChannel?"保存修改":"添加渠道"),1)]),_:1},8,["onClick"])])]),default:u(()=>[c(d(Y),{"label-placement":"left","label-width":d(w).formLabelWidth,class:"channel-form"},{default:u(()=>[(n(!0),s(f,null,y(d(w).formSections,e=>(n(),s(f,{key:e.title},[!e.showWhen||e.showWhen(d(k).formData)?(n(),s("div",{key:0,class:p(["form-section",{collapsible:e.collapsible}])},[o("div",pn,[h(m(e.title)+" ",1),e.description?(n(),s("span",vn,m(e.description),1)):i("",!0)]),(n(!0),s(f,null,y(e.fields,e=>r((n(),g(d(X),{key:e.key,label:e.label,"label-style":e.fullWidth?{display:"none"}:void 0,required:e.required,"validation-status":D(e.key),feedback:N(e.key)},{default:u(()=>["preset"===e.type?(n(),g(d(ee),{key:0,value:d(k).formData.presetId,options:M.value,placeholder:e.placeholder,"onUpdate:value":A},null,8,["value","options","placeholder"])):"model-redirect"===e.type?(n(),g(rt,{key:1,modelValue:d(k).formData.modelRedirects,"onUpdate:modelValue":a[1]||(a[1]=e=>d(k).formData.modelRedirects=e),"available-models":d(k).formData.availableModels,"channel-type":d(w).type},null,8,["modelValue","available-models","channel-type"])):"auth-provider-status"===e.type?(n(),s("div",mn,[B(e).tags.length>0?(n(),g(d(ae),{key:0,size:"small",class:"auth-provider-tags"},{default:u(()=>[(n(!0),s(f,null,y(B(e).tags,e=>(n(),g(d(H),{key:e.text,size:"small",type:e.type||"default",bordered:!1},{default:u(()=>[h(m(e.text),1)]),_:2},1032,["type"]))),128))]),_:2},1024)):i("",!0),B(e).message?(n(),s("div",{key:1,class:p(["auth-provider-message",{warning:B(e).warning}])},m(B(e).message),3)):i("",!0)])):"model-multi-select"===e.type?(n(),g(d(ee),{key:3,value:d(k).formData.allowedModels,"onUpdate:value":a[2]||(a[2]=e=>d(k).formData.allowedModels=e),options:d(k).formData.availableModels||[],placeholder:e.placeholder,loading:d(k).formData.modelsFetching,multiple:"",filterable:"",clearable:"",tag:"",onFocus:I},null,8,["value","options","placeholder","loading"])):"select"===e.type&&"speedTestModel"===e.key?(n(),g(d(q),{key:4,value:d(k).formData.speedTestModel,options:E(d(k).formData.speedTestModel,e.options),placeholder:e.placeholder,loading:d(k).formData.modelsFetching,"get-show":()=>!0,clearable:"",onFocus:I,"onUpdate:value":a[3]||(a[3]=e=>d(k).formData.speedTestModel=e)},U({_:2},[d(k).formData.modelsFetchError?{name:"empty",fn:u(()=>[o("div",fn,[o("div",yn,m(d(k).formData.modelsFetchError),1),d(k).formData.modelsFetchErrorHint?(n(),s("div",gn,m(d(k).formData.modelsFetchErrorHint),1)):i("",!0)])]),key:"0"}:void 0]),1032,["value","options","placeholder","loading"])):"select"===e.type&&"model"===e.key?(n(),g(d(q),{key:5,value:d(k).formData.model,options:E(d(k).formData.model,e.options),placeholder:e.placeholder,loading:d(k).formData.modelsFetching,"get-show":()=>!0,clearable:"",onFocus:I,"onUpdate:value":a[4]||(a[4]=e=>d(k).formData.model=e)},U({_:2},[d(k).formData.modelsFetchError?{name:"empty",fn:u(()=>[o("div",hn,[o("div",bn,m(d(k).formData.modelsFetchError),1),d(k).formData.modelsFetchErrorHint?(n(),s("div",wn,m(d(k).formData.modelsFetchErrorHint),1)):i("",!0)])]),key:"0"}:void 0]),1032,["value","options","placeholder","loading"])):"autocomplete"===e.type?(n(),g(d(q),{key:6,value:$(d(k).formData,e.key),options:L($(d(k).formData,e.key)),placeholder:e.placeholder,"get-show":()=>!0,"onUpdate:value":a=>j(d(k).formData,e.key,a)},null,8,["value","options","placeholder","onUpdate:value"])):"radio-group"===e.type?(n(),g(d(le),{key:7,value:$(d(k).formData,e.key),"onUpdate:value":a=>j(d(k).formData,e.key,a)},{default:u(()=>[c(d(ae),null,{default:u(()=>[(n(!0),s(f,null,y(e.options,e=>(n(),g(d(te),{key:e.value,value:e.value},{default:u(()=>[h(m(e.label),1)]),_:2},1032,["value"]))),128))]),_:2},1024)]),_:2},1032,["value","onUpdate:value"])):(n(),g(P(V(e)),S({key:8,value:$(d(k).formData,e.key)},{ref_for:!0},J(e),{"onUpdate:value":a=>j(d(k).formData,e.key,a)}),null,16,["value","onUpdate:value"]))]),_:2},1032,["label","label-style","required","validation-status","feedback"])),[[b,!e.showWhen||e.showWhen(d(k).formData)]])),128))],2)):i("",!0)],64))),128))]),_:1},8,["label-width"])]),_:1},8,["show","title","style"])]))}},xn={__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(_n,{ref_key:"baseRef",ref:o,type:"claude",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},Cn={__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(_n,{ref_key:"baseRef",ref:o,type:"codex",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},Un={__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(_n,{ref_key:"baseRef",ref:o,type:"gemini",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},Pn={__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(_n,{ref_key:"baseRef",ref:o,type:"opencode",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},Sn={__name:"OmpChannelPanel",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(_n,{ref_key:"baseRef",ref:o,type:"omp",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}};async function zn(){return(await ct.get("/statistics/today")).data}async function Tn(){return(await ct.get("/claude/statistics/today")).data}async function In(){return(await ct.get("/codex/statistics/today")).data}async function Mn(){return(await ct.get("/gemini/statistics/today")).data}async function An(){return(await ct.get("/opencode/statistics/today")).data}async function On(){return(await ct.get("/omp/statistics/today")).data}async function $n(e){return(await ct.get("/statistics/trend",{params:e})).data}async function jn(e){return(await ct.get("/statistics/filters",{params:e})).data}function Ln(e){return`/api/statistics/trend/export?${new URLSearchParams(e).toString()}`}const En=Object.freeze(Object.defineProperty({__proto__:null,getAvailableFilters:jn,getClaudeTodayStatistics:Tn,getCodexTodayStatistics:In,getDailyStatistics:async function(e){return(await ct.get(`/statistics/daily/${e}`)).data},getGeminiTodayStatistics:Mn,getModelStats:async function(){return(await ct.get("/statistics/models")).data},getModelStatsHistory:async function(e=7){return(await ct.get("/statistics/models/history",{params:{days:e}})).data},getOmpTodayStatistics:On,getOpenCodeTodayStatistics:An,getRecentStatistics:async function(e=7){return(await ct.get("/statistics/recent",{params:{days:e}})).data},getStatistics:async function(){return(await ct.get("/statistics/summary")).data},getTodayStatistics:zn,getToolModelStats:async function(e){return(await ct.get(`/statistics/models/${e}`)).data},getTrendExportUrl:Ln,getTrendStatistics:$n},Symbol.toStringTag,{value:"Module"}));async function Dn(){return(await ct.post("/proxy/logs/clear")).data}const Nn=Object.freeze(Object.defineProperty({__proto__:null,clearProxyLogs:Dn,getCodexProxyStatus:async function(){return(await ct.get("/codex/proxy/status")).data},getGeminiProxyStatus:async function(){return(await ct.get("/gemini/proxy/status")).data},getProxyStatus:async function(){return(await ct.get("/proxy/status")).data},startCodexProxy:async function(){return(await ct.post("/codex/proxy/start")).data},startGeminiProxy:async function(){return(await ct.post("/gemini/proxy/start")).data},startProxy:async function(){return(await ct.post("/proxy/start")).data},stopCodexProxy:async function(){return(await ct.post("/codex/proxy/stop")).data},stopGeminiProxy:async function(){return(await ct.post("/gemini/proxy/stop")).data},stopProxy:async function(){return(await ct.post("/proxy/stop")).data}},Symbol.toStringTag,{value:"Module"}));function Bn(){const e=an(),{claudeProxy:a,codexProxy:l,geminiProxy:t,opencodeProxy:s,ompProxy:n,claudeChannels:o,codexChannels:i,geminiChannels:r,opencodeChannels:c,ompChannels:u,wsConnected:d,logLimit:p,statsInterval:v}=T(e);return{claudeProxy:a,codexProxy:l,geminiProxy:t,opencodeProxy:s,ompProxy:n,claudeChannels:o,codexChannels:i,geminiChannels:r,opencodeChannels:c,ompChannels:u,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:d,clearLogsState:e.clearLogsState,clearLogsForSource:e.clearLogsForSource,logLimit:p,statsInterval:v,loadAdvancedConfig:e.loadAdvancedConfig}}const Rn={class:"proxy-logs"},Fn={class:"logs-header"},Hn={class:"header-left"},Gn={class:"today-stats"},Kn={class:"logs-table"},qn={key:0,class:"empty-state"},Wn={class:"action-message"},Vn={class:"action-time"},Jn={class:"action-message"},Zn={class:"action-time"},Qn=["title"],Yn={key:0},Xn={style:{"font-family":"monospace","font-size":"12px"}},eo={key:0,style:{"margin-top":"4px"}},ao={style:{"font-family":"monospace","font-size":"12px"}},lo={key:1,style:{"margin-top":"6px",color:"#d97706","font-size":"12px"}},to={key:1},so={class:"logs-footer"},no={class:"count"},oo=zl({__name:"ProxyLogs",props:{source:{type:String,default:"claude"}},setup(e){const a=e,{getLogs:r,wsConnected:v,clearLogsState:b,logLimit:k}=Bn(),_={claude:r("claude"),codex:r("codex"),gemini:r("gemini"),opencode:r("opencode")},U=t(()=>((_[a.source]||_.claude).value||[]).slice(0,k.value));l(U.value.length);const S=l(null),z=l({requests:0,tokens:0});let T=null,M=null;function A(e,a){var l;return e.usageMissing?"--":(null==(l=e.tokens)?void 0:l[a])||0}async function O(){var e,l,t,s,n,o;try{if("opencode"===a.source){const a=await An();return void(z.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})}if("claude"===a.source){const e=await Tn();return void(z.value={requests:(null==(t=null==e?void 0:e.summary)?void 0:t.requests)||0,tokens:(null==(s=null==e?void 0:e.summary)?void 0:s.tokens)||0})}const i=await zn(),r="gemini"===a.source?"gemini":"codex",c=null==(n=i.byToolType)?void 0:n[r];z.value=c?{requests:c.requests||0,tokens:(null==(o=c.tokens)?void 0:o.total)||0}:{requests:0,tokens:0}}catch(i){}}async function $(){try{await Dn(),b(),Ds.success("日志已清空")}catch(e){Ds.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)&&I(()=>{S.value&&(S.value.scrollTop=0)})}),x(()=>a.source,()=>{var e;O(),M=(null==(e=U.value[0])?void 0:e.id)||null}),w(()=>{O(),T=setInterval(()=>{O()},3e4)}),C(()=>{T&&(clearInterval(T),T=null)}),(a,l)=>(n(),s("div",Rn,[o("div",Fn,[o("div",Hn,[l[0]||(l[0]=o("h3",{class:"title"},"实时日志",-1)),o("div",Gn,[c(d(H),{size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(" 今日请求: "+m(z.value.requests),1)]),_:1}),c(d(H),{size:"tiny",bordered:!1,type:"success"},{default:u(()=>{return[h(" 今日Token: "+m((e=z.value.tokens,e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(1)+"K":e.toString())),1)];var e}),_:1})])]),c(d(F),{text:"",size:"small",onClick:$},{default:u(()=>[c(d(R),{size:"16"},{default:u(()=>[c(d(qe))]),_:1}),l[1]||(l[1]=h(" 清空 ",-1))]),_:1})]),o("div",Kn,[o("div",{class:p(["table-header",`table-header-${e.source}`])},[o("div",{class:p(["col col-channel",`col-channel-${e.source}`])},"渠道",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"请求",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"回复",2),"claude"===e.source?(n(),s(f,{key:0},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},"写入",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"命中",2)],64)):"codex"===e.source?(n(),s(f,{key:1},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},"推理",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"缓存",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):"gemini"===e.source?(n(),s(f,{key:2},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},"缓存",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):"opencode"===e.source?(n(),s(f,{key:3},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},"推理",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"缓存",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):i("",!0),o("div",{class:p(["col col-time",`col-time-${e.source}`])},"时间",2)],2),o("div",{class:"table-body",ref_key:"tableBody",ref:S},[0===U.value.length?(n(),s("div",qn," 暂无日志 ")):i("",!0),(n(!0),s(f,null,y(U.value,a=>(n(),s("div",{key:a.id,class:p(["action"===a.type?"action-row":"error"===a.status?"error-row":"table-row",{"new-log":a.isNew}])},["action"===a.type?(n(),s(f,{key:0},[c(d(R),{size:"16",style:{color:"#18a058","margin-right":"8px"}},{default:u(()=>[c(d(We))]),_:1}),o("span",Wn,m(a.message),1),o("span",Vn,m(a.time),1)],64)):"error"===a.status?(n(),s(f,{key:1},[c(d(R),{size:"16",style:{color:"#d03050","margin-right":"8px"}},{default:u(()=>[c(d(Ve))]),_:1}),o("span",Jn,m(a.channel)+": "+m(a.error||a.message||"请求失败"),1),o("span",Zn,m(a.time),1)],64)):(n(),g(d(ie),{key:2,placement:"top",style:{maxWidth:"300px"}},{trigger:u(()=>[o("div",{class:p(["table-row-content",`table-row-content-${e.source}`])},[o("div",{class:p(["col col-channel",`col-channel-${e.source}`]),title:a.channel},[c(d(H),{size:"small",type:"success"},{default:u(()=>[h(m(a.channel),1)]),_:2},1024)],10,Qn),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"input")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"output")),3),"claude"===e.source?(n(),s(f,{key:0},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cacheCreation")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cacheRead")),3)],64)):"codex"===e.source?(n(),s(f,{key:1},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"reasoning")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cached")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"total")),3)],64)):"gemini"===e.source?(n(),s(f,{key:2},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cached")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"total")),3)],64)):"opencode"===e.source?(n(),s(f,{key:3},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"reasoning")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cached")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"total")),3)],64)):i("",!0),o("div",{class:p(["col col-time",`col-time-${e.source}`])},m(a.time),3)],2)]),default:u(()=>[a.model?(n(),s("div",Yn,[l[3]||(l[3]=o("div",{style:{"font-weight":"600","margin-bottom":"4px"}},"模型信息",-1)),o("div",Xn,m(a.model),1),a.originalModel&&a.originalModel!==a.model?(n(),s("div",eo,[l[2]||(l[2]=o("div",{style:{"font-weight":"600","margin-bottom":"4px"}},"模型重定向",-1)),o("div",ao,m(a.originalModel)+" → "+m(a.model),1)])):i("",!0),a.usageMissing?(n(),s("div",lo," 上游响应未返回 usage,当前仅确认实际模型,无法计算 token。 ")):i("",!0)])):(n(),s("div",to,"暂无模型信息"))]),_:2},1024))],2))),128))],512)]),o("div",so,[o("span",{class:p(["status",{connected:d(v)}])},[c(d(R),{size:"14"},{default:u(()=>[(n(),g(P(d(v)?d(We):d(Ve))))]),_:1}),h(" "+m(d(v)?"已连接":"未连接"),1)],2),o("span",no,"共 "+m(U.value.length)+" 条",1)])]))}},[["__scopeId","data-v-deb41f23"]]);async function io(e=!1,a="claude"){return(await ct.get("/skills",{params:{refresh:e?"1":"",platform:a}})).data}async function ro(e,a,l=null,t="claude"){return(await ct.post("/skills/install",{directory:e,repo:a,fullDirectory:l,platform:t})).data}async function co(e,a="claude"){return(await ct.post("/skills/uninstall",{directory:e,platform:a})).data}async function uo(e,a="claude"){return(await ct.post("/skills/repos",{...e,platform:a})).data}async function po(e,a={},l="claude"){return(await ct.put("/skills/repos/auth",{id:e.id||"",owner:e.owner||"",name:e.name||"",directory:e.directory||"",token:a.token||"",clearToken:!!a.clearToken,platform:l})).data}async function vo(){return(await ct.get("/oauth-credentials")).data}async function mo(e,a){return(await ct.post(`/oauth-credentials/${e}/${a}/disable-native`)).data}const fo={class:"right-panel"},yo={class:"toolbar-section"},go={class:"toolbar-left"},ho={class:"toolbar-right"},bo={key:0,class:"oauth-banner"},wo={class:"panel-header"},ko={class:"header-title"},_o={class:"channels-scroll-area"},xo=zl({__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 r=M(),v=e,y=a,b=t(()=>r.meta.channel||"claude"),k=l(null),_=l(null),U=l(null),P=l(null),S=l(null),z=l(0),T=l({}),I=["claude","codex","gemini","opencode","omp"],A=["claude","codex","opencode","omp"],O=["claude","codex","gemini","opencode"],$=t(()=>I.includes(b.value)),j=$,L=$,E=t(()=>A.includes(b.value)),D=t(()=>O.includes(b.value)),N=t(()=>{var e,a;const l=b.value,t=null==(a=null==(e=T.value)?void 0:e[l])?void 0:a.nativeState;return!(!(null==t?void 0:t.oauthPresent)||"oauth"!==(null==t?void 0:t.mode))}),B=t(()=>"opencode"===b.value?"检测到 OAuth 凭证。OpenCode 支持保留 OAuth 与 API providers 并存。":"当前由 OAuth 控制。写入渠道或开启动态切换时,会自动退出 OAuth 控制。");async function q(){try{const e=await vo();T.value=e.tools||{}}catch{}}function W(){window.dispatchEvent(new CustomEvent("open-oauth-credentials-drawer"))}async function V(){if($.value)try{const e=await io(!1,b.value);e.success&&e.skills&&(z.value=e.skills.filter(e=>e.installed).length)}catch(e){}else z.value=0}const J={claude:k,codex:_,gemini:U,opencode:P,omp:S},Z={claude:"Claude 渠道管理",codex:"Codex 渠道管理",gemini:"Gemini 渠道管理",opencode:"OpenCode 渠道管理",omp:"OMP 渠道管理"},Q=t(()=>Z[b.value]||"Claude 渠道管理");function Y(e){window.open(e,"_blank")}function X(){var e,a,l;null==(l=null==(a=null==(e=J[b.value])?void 0:e.value)?void 0:a.openAddDialog)||l.call(a)}function ee(e){var a;const l=null==(a=null==e?void 0:e.detail)?void 0:a.channel;l&&l!==b.value||function(e=b.value){var a,l,t;null==(t=null==(l=null==(a=J[e])?void 0:a.value)?void 0:l.refresh)||t.call(l)}(),q()}function ae(e){y("proxy-toggle",e)}function le(){y("show-recent")}function te(e){var a,l;null==(l=null==(a=null==e?void 0:e.currentTarget)?void 0:a.blur)||l.call(a)}function se(e){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:b.value}})),te(e)}function ne(e){window.dispatchEvent(new CustomEvent("open-commands-drawer",{detail:{platform:b.value}})),te(e)}function oe(e){window.dispatchEvent(new CustomEvent("open-agents-drawer",{detail:{platform:b.value}})),te(e)}function re(e){window.dispatchEvent(new CustomEvent("open-plugins-drawer",{detail:{platform:b.value}})),te(e)}return w(()=>{V(),q(),"undefined"!=typeof window&&window.addEventListener("channel-management-refresh",ee)}),x(()=>b.value,()=>{V(),q()}),x(()=>v.proxyRunning,()=>{q()}),C(()=>{"undefined"!=typeof window&&window.removeEventListener("channel-management-refresh",ee)}),(a,l)=>(n(),s("div",fo,[o("div",yo,[o("div",go,[c(d(K),{depth:"3",class:"toolbar-label"},{default:u(()=>[...l[0]||(l[0]=[h("动态切换",-1)])]),_:1}),c(d(G),{value:e.proxyRunning,loading:e.proxyLoading,disabled:e.proxyLoading,size:"small","onUpdate:value":ae},null,8,["value","loading","disabled"]),$.value&&z.value>0?(n(),g(d(H),{key:0,type:"success",size:"small",bordered:!1},{default:u(()=>[h(m(z.value)+" 技能 ",1)]),_:1})):i("",!0)]),o("div",ho,[d(j)?(n(),g(d(ie),{key:0,trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:se},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Je))]),_:1})]),_:1})]),default:u(()=>[l[1]||(l[1]=h(" Skills 技能 ",-1))]),_:1})):i("",!0),E.value?(n(),g(d(ie),{key:1,trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:re},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Ze))]),_:1})]),_:1})]),default:u(()=>[l[2]||(l[2]=h(" Plugins 插件 ",-1))]),_:1})):i("",!0),d(L)||D.value?(n(),s(f,{key:2},[d(L)?(n(),g(d(ie),{key:0,trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:ne},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Qe))]),_:1})]),_:1})]),default:u(()=>[l[3]||(l[3]=h(" Commands 命令 ",-1))]),_:1})):i("",!0),D.value?(n(),g(d(ie),{key:1,trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:oe},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Ye))]),_:1})]),_:1})]),default:u(()=>[l[4]||(l[4]=h(" Agents 代理 ",-1))]),_:1})):i("",!0)],64)):i("",!0),l[6]||(l[6]=o("div",{class:"toolbar-divider"},null,-1)),c(d(ie),{trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:le},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Xe))]),_:1})]),_:1})]),default:u(()=>[l[5]||(l[5]=h(" 最新对话 ",-1))]),_:1})])]),N.value?(n(),s("div",bo,[c(d(R),{size:14,color:"#2080f0"},{default:u(()=>[c(d(ea))]),_:1}),o("span",null,m(B.value),1),c(d(F),{text:"",size:"small",type:"primary",onClick:W},{default:u(()=>[...l[7]||(l[7]=[h(" 凭证管理 → ",-1)])]),_:1})])):i("",!0),e.showChannels?(n(),s("div",{key:1,class:p(["channels-section",{"full-height":!e.showLogs||!e.proxyRunning}])},[o("div",wo,[o("div",ko,[o("h3",null,m(Q.value),1),c(d(K),{depth:"3",class:"header-hint"},{default:u(()=>[...l[8]||(l[8]=[h("启用渠道优先显示",-1)])]),_:1})]),c(d(F),{type:"primary",size:"small",onClick:X},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 添加 ",-1))]),_:1})]),o("div",_o,["claude"===b.value?(n(),g(xn,{key:0,ref_key:"claudePanelRef",ref:k,onOpenWebsite:Y},null,512)):"codex"===b.value?(n(),g(Cn,{key:1,ref_key:"codexPanelRef",ref:_,onOpenWebsite:Y},null,512)):"gemini"===b.value?(n(),g(Un,{key:2,ref_key:"geminiPanelRef",ref:U,onOpenWebsite:Y},null,512)):"opencode"===b.value?(n(),g(Pn,{key:3,ref_key:"opencodePanelRef",ref:P,onOpenWebsite:Y},null,512)):"omp"===b.value?(n(),g(Sn,{key:4,ref_key:"ompPanelRef",ref:S,onOpenWebsite:Y},null,512)):i("",!0)])],2)):i("",!0),e.showLogs?(n(),s("div",{key:2,class:p(["logs-section",{"full-height":!e.showChannels}])},[c(oo,{source:b.value},null,8,["source"])],2)):i("",!0)]))}},[["__scopeId","data-v-63740e5d"]]),Co={class:"session-left"},Uo={class:"session-icon"},Po={class:"session-info"},So={class:"session-header"},zo={class:"session-title-row"},To={class:"session-title"},Io={class:"session-meta"},Mo={class:"meta-item"},Ao={key:0,class:"session-message"},Oo={key:1,class:"session-path"},$o={class:"session-actions"},jo=zl({__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 r=e,p=l(!1),v=t(()=>r.session.alias?`${r.session.alias} (${r.session.sessionId.substring(0,8)})`:r.session.sessionId);function f(e){const a=new Date(e),l=new Date-a,t=Math.floor(l/6e4),s=Math.floor(l/36e5),n=Math.floor(l/864e5);return t<1?"刚刚":t<60?`${t}分钟前`:s<24?`${s}小时前`:n<7?`${n}天前`:a.toLocaleDateString("zh-CN")}function y(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(),s("div",{class:"session-item",onMouseenter:l[4]||(l[4]=e=>p.value=!0),onMouseleave:l[5]||(l[5]=e=>p.value=!1)},[o("div",Co,[o("div",Uo,[c(d(R),{size:"24",color:"#18a058"},{default:u(()=>[c(d(aa))]),_:1})]),o("div",Po,[o("div",So,[o("div",zo,[e.showProject&&e.session.projectDisplayName?(n(),g(d(H),{key:0,size:"small",type:"info",bordered:!1,style:{"margin-right":"8px"}},{default:u(()=>[h(m(e.session.projectDisplayName),1)]),_:1})):i("",!0),o("span",To,m(v.value),1),e.session.forkedFrom?(n(),g(d(ie),{key:1,placement:"top"},{trigger:u(()=>[c(d(H),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(la))]),_:1})]),default:u(()=>[l[6]||(l[6]=h(" Fork ",-1))]),_:1})]),default:u(()=>[o("span",null,"Fork 自 "+m(e.session.forkedFrom),1)]),_:1})):i("",!0)]),o("div",Io,[o("span",Mo,[c(d(R),{size:"14"},{default:u(()=>[c(d(ta))]),_:1}),h(" "+m(f(e.session.mtime)),1)]),c(d(H),{size:"small",bordered:!1,type:"info"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(sa))]),_:1})]),default:u(()=>[h(" "+m(y(e.session.size)),1)]),_:1}),e.session.gitBranch?(n(),g(d(H),{key:0,size:"small",bordered:!1,type:"success"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(la))]),_:1})]),default:u(()=>[h(" "+m(e.session.gitBranch),1)]),_:1})):i("",!0)])]),e.session.firstMessage?(n(),s("div",Ao,m(e.session.firstMessage),1)):i("",!0),e.showProject&&e.session.projectFullPath?(n(),s("div",Oo," 路径: "+m(e.session.projectFullPath),1)):i("",!0)])]),o("div",$o,[c(d(F),{size:"small",onClick:l[0]||(l[0]=l=>a.$emit("set-alias",e.session))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(na))]),_:1})]),default:u(()=>[l[7]||(l[7]=h(" 别名 ",-1))]),_:1}),c(d(F),{type:"primary",size:"small",onClick:l[1]||(l[1]=l=>a.$emit("launch",e.session))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qe))]),_:1})]),default:u(()=>[l[8]||(l[8]=h(" 使用对话 ",-1))]),_:1}),e.hideFork?i("",!0):(n(),g(d(F),{key:0,size:"small",onClick:l[2]||(l[2]=l=>a.$emit("fork",e.session))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(la))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" Fork ",-1))]),_:1})),e.hideDelete?i("",!0):(n(),g(d(F),{key:1,size:"small",type:"error",onClick:l[3]||(l[3]=l=>a.$emit("delete",e.session))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1})),A(a.$slots,"actions-extra",{},void 0,!0)])],32))}},[["__scopeId","data-v-32d1b310"]]);async function Lo(e,a={}){var l;const t=String(e||"");if(!t)throw new Error("没有可复制的内容");const{manualFallback:s=!0}=a;let n=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){n=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(s&&function(e){return"undefined"!=typeof window&&"function"==typeof window.prompt&&(window.prompt("自动复制失败,请手动复制以下内容:",e),!0)}(t))return{copied:!1,method:"manual",error:n||null};throw n||new Error("当前环境不支持自动复制,请手动复制命令")}async function Eo(e,a="claude"){const l=ut(a);return(await ct.get(`${l}/sessions/${e}`)).data}async function Do(e,a){return(await ct.post("/aliases",{sessionId:e,alias:a})).data}async function No(e){return(await ct.delete(`/aliases/${e}`)).data}async function Bo(e,a,l="claude"){const t=ut(l);return(await ct.delete(`${t}/sessions/${e}/${a}`)).data}async function Ro(e,a,l="claude"){const t=ut(l);return(await ct.post(`${t}/sessions/${e}/batch-delete`,{sessionIds:a})).data}async function Fo(e,a,l="claude",t={}){const s=ut(l);return(await ct.post(`${s}/sessions/${e}/${a}/fork`,t)).data}async function Ho(e,a,l="claude"){const t=ut(l);return(await ct.post(`${t}/sessions/${e}/order`,{order:a})).data}async function Go(e,a,l=15,t="claude"){const s=ut(t);return(await ct.get(`${s}/sessions/${e}/search`,{params:{keyword:a,context:l}})).data}async function Ko(e,a=35,l="claude"){const t=ut(l);return(await ct.get(`${t}/sessions/search/global`,{params:{keyword:e,context:a}})).data}async function qo(e,a,l="claude"){const t=ut(l);return(await ct.post(`${t}/sessions/${e}/${a}/launch`)).data}function Wo(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 Vo(e,a,l="claude"){const t=await qo(e,a,l),s=Wo(t);if(!s)throw new Error("未获取到可复制的启动命令");return{text:s,data:t,copyResult:await Lo(s)}}async function Jo(e,a,l=1,t=20,s="desc",n="claude"){const o=ut(n);return(await ct.get(`${o}/sessions/${e}/${a}/messages`,{params:{page:l,limit:t,order:s}})).data}async function Zo(e,a,l="claude"){const t=ut(l);return(await ct.get(`${t}/sessions/${e}/${a}/outline`)).data}async function Qo(e,a,l="claude"){const t=ut(l);return(await ct.get(`${t}/sessions/${e}/${a}/status`)).data}async function Yo(e=5,a="claude"){const l=ut(a);return(await ct.get(`${l}/sessions/recent/list?limit=${e}`)).data}const Xo=Object.freeze(Object.defineProperty({__proto__:null,copySessionLaunchCommand:Vo,createSession:async function(e,a="claude"){return(await ct.post(`/sessions/${e}/create`,{toolType:a})).data},deleteAlias:No,deleteSession:Bo,deleteSessions:Ro,forkSession:Fo,formatLaunchCommandForCopy:Wo,getRecentSessions:Yo,getSessionLaunchCommand:qo,getSessionMessages:Jo,getSessionOutline:Zo,getSessionStatus:Qo,getSessions:Eo,launchSession:async function(e,a,l=!1,t="claude"){const s=ut(t);return(await ct.post(`${s}/sessions/${e}/${a}/launch`,{fork:l})).data},saveSessionOrder:Ho,searchSessions:Go,searchSessionsGlobally:Ko,setAlias:Do},Symbol.toStringTag,{value:"Module"}));function ei(e=520,a=null){const s=l("undefined"!=typeof window?window.innerWidth:1200),n=()=>{s.value=window.innerWidth};w(()=>{window.addEventListener("resize",n)}),C(()=>{window.removeEventListener("resize",n)});const o=t(()=>s.value<640),i=t(()=>s.value>=640&&s.value<1024);return{drawerWidth:t(()=>{if(s.value<640)return"100%";if(s.value<768)return Math.min(.95*s.value,e);if(s.value<1024){const l=a||e;return Math.min(.85*s.value,l)}return e}),isMobile:o,isTablet:i,windowWidth:s}}const ai={key:0,class:"loading-container"},li={key:1,class:"sessions-list"},ti=zl({__name:"RecentSessionsDrawer",props:{visible:{type:Boolean,default:!1},channel:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:o}=ei(720),i=e,r=a,p=l(!1),v=l([]),m=l(!1),b=t(()=>i.channel);async function w(){m.value=!0;try{const e=await Yo(10,i.channel);v.value=e.sessions}catch(e){Ds.error("加载失败: "+e.message)}finally{m.value=!1}}async function k(e){const a=e.alias||"";let l=a;const t=await new Promise(e=>{const t=Ns.create({title:"设置别名",content:()=>O(ne,{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 Do(e.sessionId,t),Ds.success("别名设置成功")):(await No(e.sessionId),Ds.success("别名已删除")),await w()}catch(s){Ds.error("操作失败: "+s.message)}}async function _(e){try{const{copyResult:a}=await Vo(e.projectName,e.sessionId,i.channel);if("manual"===(null==a?void 0:a.method))return void Ds.warning("自动复制失败,已弹出手动复制框");Ds.success("启动命令已复制到剪贴板")}catch(a){Ds.error("复制失败: "+a.message)}}return x(()=>i.visible,e=>{p.value=e,e&&w()}),x(p,e=>{r("update:visible",e)}),x(()=>i.channel,()=>{p.value&&w()}),(e,a)=>(n(),g(d(ce),{show:p.value,"onUpdate:show":a[0]||(a[0]=e=>p.value=e),width:d(o),placement:"right","show-close":!0},{default:u(()=>[c(d(re),{title:"claude"===i.channel?"Claude 最新对话":"codex"===i.channel?"Codex 最新对话":"gemini"===i.channel?"Gemini 最新对话":"opencode"===i.channel?"OpenCode 最新对话":"omp"===i.channel?"OMP 最新对话":"最新对话","native-scrollbar":!1,closable:""},{default:u(()=>[m.value?(n(),s("div",ai,[c(d(Z),{size:"medium"},{description:u(()=>[...a[1]||(a[1]=[h("加载中...",-1)])]),_:1})])):v.value.length>0?(n(),s("div",li,[(n(!0),s(f,null,y(v.value,e=>(n(),g(jo,{key:e.sessionId,session:e,channel:b.value,"show-project":!0,"hide-fork":!0,"hide-delete":!0,onSetAlias:k,onLaunch:_},null,8,["session","channel"]))),128))])):(n(),g(d(Q),{key:2,description:"暂无最近使用的会话",style:{"margin-top":"60px"}},{icon:u(()=>[c(d(R),{size:"48"},{default:u(()=>[c(d(Xe))]),_:1})]),_:1}))]),_:1},8,["title"])]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b7e63ff8"]]);async function si(){return(await ct.get("/favorites")).data}async function ni(e,a){return(await ct.post("/favorites",{channel:e,sessionData:a})).data}async function oi(e,a,l){return(await ct.delete(`/favorites/${e}/${encodeURIComponent(a)}/${l}`)).data}const ii=Object.freeze(Object.defineProperty({__proto__:null,addFavorite:ni,checkFavorite:async function(e,a,l){return(await ct.get(`/favorites/check/${e}/${encodeURIComponent(a)}/${l}`)).data},getAllFavorites:si,getFavorites:async function(e){return(await ct.get(`/favorites/${e}`)).data},removeFavorite:oi},Symbol.toStringTag,{value:"Module"})),ri=k("favorites",()=>{const e=l({claude:[],codex:[],gemini:[]}),a=l(!1),s=l(!1);let n=null;const o=t(()=>{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:o,isLoaded:a,loading:s,loadFavorites:async function(l=!1){if(a.value&&!l)return e.value;if(n&&!l)return n;let t=null;return t=(async()=>{s.value=!0;try{const l=await si();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{s.value=!1,n===t&&(n=null)}})(),n=t,t},addFavorite:async function(a,l){try{const t=await ni(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 s=await oi(a,l,t);if(s.success&&s.favorites)return e.value=s.favorites,!0}catch(s){}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 ci(){const e=ri(),{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 ui(e="claude"){const a=ut(e);return(await ct.get(`${a}/projects`)).data}async function di(e,a="claude"){const l=ut(a);return(await ct.post(`${l}/projects/order`,{order:e})).data}async function pi(e,a="claude"){const l=ut(a);return(await ct.delete(`${l}/projects/${e}`)).data}const vi=Object.freeze(Object.defineProperty({__proto__:null,createProject:async function(e,a,l="claude"){const t=ut(l);return(await ct.post(`${t}/projects/create`,{projectName:e,projectPath:a})).data},deleteProject:pi,getProjects:ui,saveProjectOrder:di},Symbol.toStringTag,{value:"Module"})),mi=new Map,fi=new Map;function yi(e,a){return`${e}:${a}`}function gi(e,a){mi.set(e,{timestamp:Date.now(),payload:a})}function hi(e,a,l){fi.set(yi(e,a),{timestamp:Date.now(),payload:l})}function bi(e,a){a?fi.delete(yi(e,a)):Array.from(fi.keys()).filter(a=>a.startsWith(`${e}:`)).forEach(e=>fi.delete(e))}const wi=k("sessions",()=>{const e=l([]),a=l(null),s=l(null),n=l([]),o=l({}),i=l(0),r=l(!1),c=l(null),u=l("claude"),d=t(()=>n.value.map(e=>({...e,alias:o.value[e.sessionId]||null})));function p(){a.value&&(i.value=n.value.reduce((e,a)=>e+(Number(a.size)||0),0),hi(u.value,a.value,{sessions:n.value,aliases:o.value,totalSize:i.value,projectInfo:s.value}))}async function v(e,{force:l=!1}={}){r.value=!0,c.value=null;try{if(!l){const l=function(e,a){const l=yi(e,a),t=fi.get(l);return t?Date.now()-t.timestamp>2e4?(fi.delete(l),null):t.payload:null}(u.value,e);if(l)return n.value=l.sessions||[],o.value=l.aliases||{},i.value=l.totalSize||0,a.value=e,s.value=l.projectInfo||null,void(r.value=!1)}const t=await Eo(e,u.value);n.value=t.sessions,o.value=t.aliases,i.value=t.totalSize||0,a.value=e,s.value=t.projectInfo,hi(u.value,e,{sessions:t.sessions,aliases:t.aliases,totalSize:t.totalSize,projectInfo:t.projectInfo})}catch(t){c.value=t.message}finally{r.value=!1}}return{projects:e,currentProject:a,currentProjectInfo:s,sessions:n,aliases:o,totalSize:i,loading:r,error:c,currentChannel:u,sessionsWithAlias:d,setChannel:function(e){u.value=e},fetchProjects:async function({force:l=!1}={}){var t,s;r.value=!0,c.value=null;try{if(!l){const l=function(e){const a=mi.get(e);return a?Date.now()-a.timestamp>3e4?(mi.delete(e),null):a.payload:null}(u.value);if(l)return e.value=l.projects||[],a.value=l.currentProject||(null==(s=null==(t=l.projects)?void 0:t[0])?void 0:s.name)||null,void(r.value=!1)}const n=await ui(u.value);e.value=n.projects,a.value=n.currentProject,gi(u.value,{projects:n.projects,currentProject:n.currentProject}),bi(u.value)}catch(n){c.value=n.message}finally{r.value=!1}},fetchSessions:v,setAlias:async function(e,a){try{await Do(e,a),o.value[e]=a}catch(l){throw c.value=l.message,l}},deleteAlias:async function(e){try{await No(e),delete o.value[e]}catch(a){throw c.value=a.message,a}},deleteSession:async function(e){try{await Bo(a.value,e,u.value),n.value=n.value.filter(a=>a.sessionId!==e),o.value[e]&&delete o.value[e],p()}catch(l){throw c.value=l.message,l}},deleteSessions:async function(e=[]){const l=Array.from(new Set((e||[]).filter(Boolean)));if(0===l.length)return{deletedSessionIds:[],failed:[]};let t=[],s=[];try{const e=await Ro(a.value,l,u.value);t=Array.isArray(null==e?void 0:e.deletedSessionIds)?e.deletedSessionIds:[],s=Array.isArray(null==e?void 0:e.failed)?e.failed.map(e=>({sessionId:e.sessionId,error:new Error(e.error||"删除失败")})):[]}catch(i){throw c.value=i.message,i}if(t.length>0){const e=new Set(t);n.value=n.value.filter(a=>!e.has(a.sessionId)),Object.keys(o.value).forEach(a=>{e.has(a)&&delete o.value[a]}),p()}return s.length>0&&0===t.length&&(c.value=s[0].error.message),{deletedSessionIds:t,failed:s}},forkSession:async function(e,l={}){try{const t=await Fo(a.value,e,u.value,l);return await v(a.value,{force:!0}),t.newSessionId}catch(t){throw c.value=t.message,t}},saveProjectOrder:async function(l){try{await di(l,u.value);const t=l.map(a=>e.value.find(e=>e.name===a)).filter(Boolean),s=e.value.filter(e=>!l.includes(e.name));e.value=[...t,...s],gi(u.value,{projects:e.value,currentProject:a.value})}catch(t){throw c.value=t.message,t}},saveSessionOrder:async function(e){try{await Ho(a.value,e,u.value);const l=e.map(e=>n.value.find(a=>a.sessionId===e)).filter(Boolean),t=n.value.filter(a=>!e.includes(a.sessionId));n.value=[...l,...t],hi(u.value,a.value,{sessions:n.value,aliases:o.value,totalSize:i.value,projectInfo:s.value})}catch(l){throw c.value=l.message,l}},deleteProject:async function(l){try{await pi(l,u.value),e.value=e.value.filter(e=>e.name!==l),a.value===l&&(a.value=null),(t=u.value)?mi.delete(t):mi.clear(),bi(u.value,l)}catch(s){throw c.value=s.message,s}var t}}}),ki={class:"favorites-container"},_i={key:0,class:"favorites-section"},xi={class:"section-header claude-header"},Ci={class:"sessions-list"},Ui={key:1,class:"favorites-section"},Pi={class:"section-header codex-header"},Si={class:"sessions-list"},zi={key:2,class:"favorites-section"},Ti={class:"section-header gemini-header"},Ii={class:"sessions-list"},Mi=zl({__name:"FavoritesDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible","view-history"],setup(e,{emit:a}){const{drawerWidth:r}=ei(720),p=e,b=a,w=t({get:()=>p.visible,set:e=>b("update:visible",e)}),{getFavorites:k,removeFavorite:_,getAllFavorites:x}=ci(),C=wi(),U=t(()=>k("claude")),P=t(()=>k("codex")),S=t(()=>k("gemini")),z=l(!1),T=l(null),I=l(""),M=l("");function A(e){let a="claude";P.value.some(a=>a.sessionId===e.sessionId&&a.projectName===e.projectName)?a="codex":S.value.some(a=>a.sessionId===e.sessionId&&a.projectName===e.projectName)&&(a="gemini"),T.value=e,I.value=e.alias||"",M.value=a,z.value=!0}async function O(){var e,a;if(T.value)try{C.setChannel(M.value);const l=T.value.sessionId;if(I.value){await C.setAlias(l,I.value),Ds.success("别名设置成功");const a=null==(e=x()[M.value])?void 0:e.find(e=>e.sessionId===l&&e.projectName===T.value.projectName);a&&(a.alias=I.value)}else{await C.deleteAlias(l),Ds.success("别名已删除");const e=null==(a=x()[M.value])?void 0:a.find(e=>e.sessionId===l&&e.projectName===T.value.projectName);e&&(e.alias="")}z.value=!1,T.value=null,I.value=""}catch(l){Ds.error("操作失败: "+l.message)}}async function j(e,a){try{const{copyResult:l}=await Vo(a.projectName,a.sessionId,e);if("manual"===(null==l?void 0:l.method))return void Ds.warning("自动复制失败,已弹出手动复制框");Ds.success("启动命令已复制到剪贴板")}catch(l){Ds.error("复制失败: "+l.message)}}async function L(e,a){try{await _(e,a.projectName,a.sessionId),Ds.success("已移除收藏")}catch(l){Ds.error("移除失败: "+l.message)}}return(e,a)=>(n(),g(d(ce),{show:w.value,"onUpdate:show":a[3]||(a[3]=e=>w.value=e),width:d(r),placement:"right"},{default:u(()=>[c(d(re),{title:"我的收藏",closable:""},{default:u(()=>[o("div",ki,[U.value.length>0?(n(),s("div",_i,[o("div",xi,[c(d(R),{size:20},{default:u(()=>[c(d(oa))]),_:1}),a[4]||(a[4]=o("h3",{class:"section-title"},"Claude",-1)),c(d(H),{size:"small",bordered:!1,type:"success"},{default:u(()=>[h(m(U.value.length),1)]),_:1})]),o("div",Ci,[(n(!0),s(f,null,y(U.value,l=>(n(),g(jo,{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:A,onLaunch:e=>j("claude",l)},{"actions-extra":u(()=>[c(d(F),{size:"small",type:"error",onClick:v(e=>L("claude",l),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),default:u(()=>[a[5]||(a[5]=h(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):i("",!0),P.value.length>0?(n(),s("div",Ui,[o("div",Pi,[c(d(R),{size:20},{default:u(()=>[c(d(ia))]),_:1}),a[6]||(a[6]=o("h3",{class:"section-title"},"Codex",-1)),c(d(H),{size:"small",bordered:!1,type:"info"},{default:u(()=>[h(m(P.value.length),1)]),_:1})]),o("div",Si,[(n(!0),s(f,null,y(P.value,l=>(n(),g(jo,{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:A,onLaunch:e=>j("codex",l)},{"actions-extra":u(()=>[c(d(F),{size:"small",type:"error",onClick:v(e=>L("codex",l),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),default:u(()=>[a[7]||(a[7]=h(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):i("",!0),S.value.length>0?(n(),s("div",zi,[o("div",Ti,[c(d(R),{size:20},{default:u(()=>[c(d(ra))]),_:1}),a[8]||(a[8]=o("h3",{class:"section-title"},"Gemini",-1)),c(d(H),{size:"small",bordered:!1,type:"warning"},{default:u(()=>[h(m(S.value.length),1)]),_:1})]),o("div",Ii,[(n(!0),s(f,null,y(S.value,l=>(n(),g(jo,{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:A,onLaunch:e=>j("gemini",l)},{"actions-extra":u(()=>[c(d(F),{size:"small",type:"error",onClick:v(e=>L("gemini",l),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),default:u(()=>[a[9]||(a[9]=h(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):i("",!0),0===e.totalCount?(n(),g(d(Q),{key:3,description:"暂无收藏",style:{"margin-top":"80px"}},{icon:u(()=>[c(d(R),{size:48},{default:u(()=>[c(d(ca))]),_:1})]),extra:u(()=>[c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[10]||(a[10]=[h(' 在会话列表中点击"收藏"按钮添加收藏 ',-1)])]),_:1})]),_:1})):i("",!0)]),c(d(se),{show:z.value,"onUpdate:show":a[2]||(a[2]=e=>z.value=e),preset:"dialog",title:"设置别名"},{action:u(()=>[c(d(ae),null,{default:u(()=>[c(d(F),{onClick:a[1]||(a[1]=e=>z.value=!1)},{default:u(()=>[...a[11]||(a[11]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:O},{default:u(()=>[...a[12]||(a[12]=[h("确定",-1)])]),_:1})]),_:1})]),default:u(()=>[c(d(ne),{value:I.value,"onUpdate:value":a[0]||(a[0]=e=>I.value=e),placeholder:"输入别名(留空删除)",onKeyup:$(O,["enter"])},null,8,["value"])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-56e896bc"]]),Ai=["id"],Oi={class:"message-header"},$i={key:0,class:"message-model"},ji={class:"message-time"},Li={class:"message-time"},Ei={key:0,class:"user-content"},Di={key:0},Ni={key:1,class:"image-item"},Bi=["src"],Ri=["innerHTML"],Fi=500,Hi=zl({__name:"ChatMessage",props:{message:{type:Object,required:!0},messageAnchorId:{type:String,default:""}},setup(e){pl.registerLanguage("javascript",vl),pl.registerLanguage("python",ml),pl.registerLanguage("bash",fl),pl.registerLanguage("json",yl),pl.registerLanguage("typescript",gl),pl.registerLanguage("css",hl),pl.registerLanguage("xml",bl),pl.registerLanguage("html",bl);const a=e,r=l(!1),u=t(()=>{const e=a.message.content;return"string"==typeof e&&e.length>Fi}),v=t(()=>{const e=a.message.content;return"string"==typeof e&&e.length>Fi?e.substring(0,Fi)+"...":e});wl.setOptions({highlight:(e,a)=>{if(a&&pl.getLanguage(a))try{return pl.highlight(e,{language:a}).value}catch(l){}return pl.highlightAuto(e).value},breaks:!0,gfm:!0});const g=t(()=>{if("assistant"===a.message.type&&a.message.content)try{return wl.parse(a.message.content)}catch(e){return a.message.content}return""}),b=t(()=>{if("assistant"===a.message.type&&a.message.content)try{const e=a.message.content,l=e.length>Fi?e.substring(0,Fi)+"...":e;return wl.parse(l)}catch(e){return a.message.content.substring(0,Fi)+"..."}return""});function w(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 Lo(e,{manualFallback:!1})}catch{}}function _(e){var a,l,t,s;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==(s=e.source)?void 0:s.url)?e.source.url:e.url?e.url:null}return(a,l)=>(n(),s("div",{id:e.messageAnchorId||void 0,class:p(["chat-message",[`message-${e.message.type}`]])},[o("div",Oi,["assistant"===e.message.type?(n(),s(f,{key:0},[c(d(R),{size:16,component:d(ua),class:"role-icon"},null,8,["component"]),l[1]||(l[1]=o("span",{class:"message-role"},"AI",-1)),e.message.model?(n(),s("span",$i,m(e.message.model),1)):i("",!0),o("span",ji,m(e.message.timestamp?w(e.message.timestamp):""),1),l[2]||(l[2]=o("span",{class:"spacer"},null,-1)),o("span",{class:"copy-btn",onClick:k,title:"复制"},[c(d(R),{size:14,component:d(da)},null,8,["component"])])],64)):(n(),s(f,{key:1},[o("span",{class:"copy-btn",onClick:k,title:"复制"},[c(d(R),{size:14,component:d(da)},null,8,["component"])]),l[3]||(l[3]=o("span",{class:"spacer"},null,-1)),o("span",Li,m(e.message.timestamp?w(e.message.timestamp):""),1),l[4]||(l[4]=o("span",{class:"message-role"},"用户",-1)),c(d(R),{size:16,component:d(pa),class:"role-icon"},null,8,["component"])],64))]),o("div",{class:p(["message-content",{collapsed:!r.value&&u.value}])},["user"===e.message.type?(n(),s("div",Ei,["string"==typeof e.message.content?(n(),s(f,{key:0},[h(m(r.value?e.message.content:v.value),1)],64)):Array.isArray(e.message.content)?(n(!0),s(f,{key:1},y(e.message.content,(e,a)=>(n(),s("div",{key:a,class:"content-item"},["text"===e.type?(n(),s("div",Di,m(e.text),1)):"image"===e.type?(n(),s("div",Ni,[_(e)?(n(),s("img",{key:0,src:_(e),alt:"会话图片",loading:"lazy"},null,8,Bi)):(n(),s(f,{key:1},[c(d(R),{size:20,component:d(va)},null,8,["component"]),l[5]||(l[5]=o("span",null,"图片内容",-1))],64))])):i("",!0)]))),128)):i("",!0)])):"assistant"===e.message.type?(n(),s("div",{key:1,class:"assistant-content markdown-body",innerHTML:r.value?g.value:b.value},null,8,Ri)):i("",!0)],2),u.value?(n(),s("div",{key:0,class:"expand-btn",onClick:l[0]||(l[0]=e=>r.value=!r.value)},m(r.value?"收起":"展开全部"),1)):i("",!0)],10,Ai))}},[["__scopeId","data-v-35aebdef"]]),Gi={class:"drawer-wrapper"},Ki={class:"header-row"},qi={class:"session-name"},Wi={key:0,class:"session-summary"},Vi={class:"drawer-body"},Ji={key:0,class:"loading-container"},Zi={key:1,class:"empty-container"},Qi={key:2,class:"history-layout"},Yi={class:"mobile-toc-toggle"},Xi={class:"toc-header"},er={key:0,class:"toc-header-hint"},ar={key:0,class:"toc-empty"},lr={key:1,class:"toc-empty"},tr={key:2,class:"toc-list"},sr=["onClick"],nr={class:"toc-order"},or={class:"toc-preview"},ir={class:"toc-time"},rr={class:"messages-pane"},cr={key:0,class:"load-more-top"},ur={class:"messages-list"},dr=20,pr=zl({__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:r}){const v=e,b=r,{drawerWidth:w}=ei(960,840),k=t({get:()=>v.show,set:e=>b("update:show",e)}),_=l(!1),C=l(!1),U=l([]),P=l([]),S=l({}),z=l(1),T=l(0),M=l(!1),A=l(null),O=l(null),$=l(!1),L=l(null),E=l(!1),D=l(null);let N=0,B=null,G="";const K=t(()=>me(v.sessionId).slice(0,16)||"session"),q=t(()=>{const e=new Map;return U.value.map((a,l)=>{const t=function(e,a){const l=ve(e);if(l)return`msg-${K.value}-${me(l)}`;const t=(null==e?void 0:e.timestamp)?String(e.timestamp):"",s=(null==e?void 0:e.type)?String(e.type):"unknown",n=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)}(`${s}|${t}|${n}`),i=t?me(t):`idx${a}`;return`msg-${K.value}-${s}-${i}-${o}`}(a,l),s=e.get(t)||0;return e.set(t,s+1),0===s?t:`${t}-${s+1}`})}),W=t(()=>{const e=new Map;return U.value.forEach((a,l)=>{!a.anchorOnly&&"user"===a.type&&a.userMessageNumber&&e.set(a.userMessageNumber,q.value[l])}),e}),V=t(()=>U.value.map((e,a)=>({message:e,index:a})).filter(({message:e})=>!e.anchorOnly)),J=t(()=>P.value);function Y(e={}){return[e.lastModified||"",e.size||0].join(":")}async function X(){try{C.value=!0;const e=await Zo(v.projectName,v.sessionId,v.channel);P.value=Array.isArray(null==e?void 0:e.items)?e.items:[]}catch(e){}finally{C.value=!1}}async function ee(){const e=await Qo(v.projectName,v.sessionId,v.channel);return G=Y(e),e}async function ae(e=1,a={}){var l,t;if(_.value)return;const{skipFirstPageScroll:s=!1,limitOverride:n=dr}=a;try{_.value=!0;const a=await Jo(v.projectName,v.sessionId,e,n,"desc",v.channel),{messages:l,metadata:t,pagination:o}=a;1===e?(U.value=l.reverse(),S.value=t):U.value=[...l.reverse(),...U.value],z.value=o.page,T.value=o.total,M.value=o.hasMore,1===e&&I(async()=>{D.value?await ie(D.value,{allowLoadMore:!0}):s||te(!1),ne()})}catch(o){const e="加载聊天记录失败: "+((null==(t=null==(l=o.response)?void 0:l.data)?void 0:t.error)||o.message);b("error",e)}finally{_.value=!1}}function le(){if(!M.value||_.value)return;const e=A.value,a=(null==e?void 0:e.scrollHeight)||0;ae(z.value+1).then(()=>{I(()=>{if(e){const l=e.scrollHeight;e.scrollTop=l-a,ne()}})})}function te(e=!0){I(()=>{const a=A.value;a&&(a.scrollTo({top:a.scrollHeight,behavior:e?"smooth":"auto"}),ne())})}function se(e){const a=e.target;if(!a)return;const{scrollTop:l,scrollHeight:t,clientHeight:s}=a;$.value=t-l-s>200,l<100&&M.value&&!_.value&&le(),ne()}function ne(){N||(N=requestAnimationFrame(()=>{N=0,function(){var e;const a=A.value;if(!a||0===J.value.length)return void(L.value=null);const l=Array.from(W.value.keys()).sort((e,a)=>e-a);if(!l.length)return void(L.value=(null==(e=J.value[J.value.length-1])?void 0:e.userMessageNumber)||null);const t=Math.max(0,a.scrollHeight-a.clientHeight);if(t>0&&t-a.scrollTop<=6)return void(L.value=l[l.length-1]);const s=a.scrollTop,n=s+a.clientHeight,o=s+ge();let i=null,r=null;for(const u of J.value){const e=fe(W.value.get(u.userMessageNumber));if(!e)continue;const l=ye(e,a),t=l+e.offsetHeight;l<=o+1&&(r=u),!i&&t>s&&l<n&&(i=u)}const c=(null==r?void 0:r.userMessageNumber)||(null==i?void 0:i.userMessageNumber)||l[0]||J.value[0].userMessageNumber;c&&(L.value=c)}()}))}function oe(e,a=!0){const l=A.value;if(!l||!e)return!1;const t=fe(e);if(!t)return!1;const s=ye(t,l),n=Math.max(0,l.scrollHeight-l.clientHeight),o=be(s-ge(),0,n);return l.scrollTo({top:o,behavior:a?"smooth":"auto"}),ne(),!0}async function ie(e,a={}){if(!e)return!1;const{allowLoadMore:l=!1}=a;let t=0;for(;t<50;){t+=1;const a=re(e);if(a&&oe(a,!0))return Number.isInteger(e.userMessageNumber)&&(L.value=e.userMessageNumber),D.value=null,!0;if(!l||!M.value||_.value)break;const s=z.value;if(await ae(z.value+1),z.value===s)break}return D.value=null,ne(),!1}function re(e){if(e.anchorId&&"string"==typeof e.anchorId)return e.anchorId;if(Number.isInteger(e.userMessageNumber))return W.value.get(e.userMessageNumber)||"";if("number"==typeof e.messageIndex&&e.messageIndex>=0)return q.value[e.messageIndex]||"";if(e.messageId){const a=String(e.messageId),l=U.value.findIndex(e=>ve(e)===a);if(l>=0)return q.value[l]}return""}async function ue(){var e,a,l;if(_.value)return;const t=A.value,s=!t||t.scrollHeight-t.scrollTop-t.clientHeight<=40,n=(null==t?void 0:t.scrollTop)||0,o=Math.max(z.value,1);try{_.value=!0;const t=[];for(let e=1;e<=o;e+=1)t.push(await Jo(v.projectName,v.sessionId,e,dr,"desc",v.channel));const s=[];for(let e=t.length-1;e>=0;e-=1){const a=t[e],l=Array.isArray(null==a?void 0:a.messages)?a.messages:[];s.push(...l.slice().reverse())}U.value=s,S.value=(null==(e=t[0])?void 0:e.metadata)||S.value,T.value=(null==(l=null==(a=t[0])?void 0:a.pagination)?void 0:l.total)||s.length,z.value=o,M.value=o*dr<T.value}finally{_.value=!1}if(await I(),t)if(s)te(!1);else{const e=Math.max(0,t.scrollHeight-t.clientHeight);t.scrollTop=be(n,0,e),ne()}}function de(){B&&(clearInterval(B),B=null)}function pe(){de(),B=setInterval(()=>{k.value&&async function(){try{const e=Y(await Qo(v.projectName,v.sessionId,v.channel));if(!e)return;if(G&&e!==G)return G=e,void(await Promise.all([X(),ue()]));G=e}catch(e){}}()},3e3)}function ve(e){return e&&"object"==typeof e?String(e.messageId||e.id||e.uuid||e.turnId||""):""}function me(e){return String(e||"").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)}function fe(e){const a=A.value;if(!a||!e)return null;const l=document.getElementById(e);return l&&a.contains(l)?l:null}function ye(e,a){const l=a.getBoundingClientRect(),t=e.getBoundingClientRect();return a.scrollTop+(t.top-l.top)}function ge(){var e;return((null==(e=O.value)?void 0:e.offsetHeight)||0)+12}function he(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"})}function be(e,a,l){return Math.min(Math.max(e,a),l)}return x(J,()=>{J.value.length?(J.value.some(e=>e.userMessageNumber===L.value)||(L.value=J.value[0].userMessageNumber),ne()):L.value=null},{deep:!0}),x(k,e=>{e?I(()=>{ne()}):de()}),j(()=>{N&&(cancelAnimationFrame(N),N=0),de()}),a({open:function(e){de(),D.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,userMessageNumber:Number.isInteger(a.userMessageNumber)?a.userMessageNumber:null};return l.anchorId||l.messageId||null!==l.messageIndex||null!==l.userMessageNumber?l:null}(e),E.value=!1,U.value=[],P.value=[],S.value={},z.value=1,T.value=0,M.value=!1,$.value=!1,L.value=null,G="",Promise.all([X(),ae(1,{skipFirstPageScroll:Boolean(D.value)}),ee()]).then(()=>{k.value&&pe()}).catch(()=>{})}}),(a,l)=>(n(),g(d(ce),{show:k.value,"onUpdate:show":l[2]||(l[2]=e=>k.value=e),width:d(w),placement:"right","auto-focus":!1,"trap-focus":!1,"block-scroll":!1},{default:u(()=>[o("div",Gi,[o("div",{ref_key:"headerRef",ref:O,class:"drawer-header"},[o("div",Ki,[c(d(R),{size:18,component:d(ua)},null,8,["component"]),o("span",qi,m(e.sessionAlias||e.sessionId.substring(0,8))+" ("+m(T.value)+")",1),S.value.gitBranch?(n(),g(d(H),{key:0,size:"small",type:"info"},{icon:u(()=>[c(d(R),{component:d(ma)},null,8,["component"])]),default:u(()=>[h(" "+m(S.value.gitBranch),1)]),_:1})):i("",!0),l[3]||(l[3]=o("span",{class:"spacer"},null,-1)),c(d(R),{size:20,component:d(fa),class:"close-btn",onClick:l[0]||(l[0]=e=>k.value=!1)},null,8,["component"])]),S.value.summary?(n(),s("div",Wi,m(S.value.summary),1)):i("",!0)],512),o("div",Vi,[_.value&&0===U.value.length?(n(),s("div",Ji,[c(d(Z),{size:"medium"},{description:u(()=>[...l[4]||(l[4]=[h("加载聊天记录...",-1)])]),_:1})])):_.value||0!==U.value.length?(n(),s("div",Qi,[o("div",Yi,[c(d(F),{tertiary:"",size:"small",onClick:l[1]||(l[1]=e=>E.value=!E.value)},{default:u(()=>[h(m(E.value?"展开用户目录":"收起用户目录"),1)]),_:1})]),o("aside",{class:p(["toc-rail",{"mobile-collapsed":E.value}])},[o("div",Xi,[l[5]||(l[5]=h(" 用户目录 ",-1)),C.value?(n(),s("span",er,"加载中...")):i("",!0)]),C.value&&0===J.value.length?(n(),s("div",ar,"目录加载中...")):0===J.value.length?(n(),s("div",lr,"暂无用户消息")):(n(),s("div",tr,[(n(!0),s(f,null,y(J.value,e=>(n(),s("button",{key:e.userMessageNumber,type:"button",class:p(["toc-item",{active:L.value===e.userMessageNumber}]),onClick:a=>function(e){(null==e?void 0:e.userMessageNumber)&&(L.value=e.userMessageNumber,ie({userMessageNumber:e.userMessageNumber},{allowLoadMore:!0}))}(e)},[o("span",nr,"#"+m(e.userMessageNumber),1),o("span",or,m(e.preview),1),o("span",ir,m(he(e.timestamp)),1)],10,sr))),128))]))],2),o("div",rr,[o("div",{class:"messages-container",ref_key:"messagesContainer",ref:A,onScroll:se},[M.value?(n(),s("div",cr,[c(d(F),{loading:_.value,onClick:le,size:"small",secondary:""},{icon:u(()=>[c(d(R),{component:d(ya)},null,8,["component"])]),default:u(()=>[l[6]||(l[6]=h(" 加载更早的消息 ",-1))]),_:1},8,["loading"])])):i("",!0),o("div",ur,[(n(!0),s(f,null,y(V.value,({message:e,index:a})=>(n(),g(Hi,{key:q.value[a]||a,message:e,"message-anchor-id":q.value[a]},null,8,["message","message-anchor-id"]))),128))])],544),$.value?(n(),s("div",{key:0,class:"scroll-btn",onClick:te},[c(d(R),{size:18,component:d(ga)},null,8,["component"])])):i("",!0)])])):(n(),s("div",Zi,[c(d(Q),{description:"暂无聊天记录"})]))])])]),_:1},8,["show","width"]))}},[["__scopeId","data-v-a3f56791"]]),vr=[{key:"claude",title:"ClaudeCode",label:"Claude Code",command:"claude",icon:oa,color:"#18a058",defaultVisible:!0,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!0,supportsAgents:!0},{key:"codex",title:"Codex-CLI",label:"Codex",command:"codex",icon:ia,color:"#3b82f6",defaultVisible:!0,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!0,supportsAgents:!0},{key:"gemini",title:"Gemini-CLI",label:"Gemini",command:"gemini",icon:ra,color:"#a855f7",defaultVisible:!0,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!1,supportsAgents:!0},{key:"opencode",title:"OpenCode",label:"OpenCode",command:"opencode",icon:Je,color:"#ea580c",defaultVisible:!0,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!0,supportsAgents:!0},{key:"omp",title:"OMP",label:"OMP",command:"omp",icon:ha,color:"#0f9f9a",defaultVisible:!1,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!0,supportsAgents:!1}],mr=["claude","codex","gemini","opencode"];function fr(e=[]){const a=[],l=new Set;return Array.isArray(e)?(e.forEach(e=>{const t=function(e={}){const a=String(e.key||"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");if(!a||vr.some(e=>e.key===a))return null;const l=String(e.name||e.title||a).trim()||a,t=String(e.command||a).trim()||a;return{key:a,name:l,title:String(e.title||l).trim()||l,command:t,configDir:String(e.configDir||"").trim(),icon:String(e.icon||"").trim(),color:String(e.color||"").trim(),enabled:!1!==e.enabled,custom:!0,supportsManagedConfig:!1,supportsProxy:!1,supportsProjects:!1,supportsSessions:!1,supportsSkills:!1,supportsCommands:!1,supportsPlugins:!1,supportsAgents:!1}}(e);t&&!l.has(t.key)&&(l.add(t.key),a.push(t))}),a):a}function yr(e=[]){return[...vr,...fr(e).filter(e=>!1!==e.enabled)]}function gr(e,a=[]){return yr(a).find(a=>a.key===e)||{key:e,title:e,label:e,command:e,icon:Qe,custom:!0,supportsManagedConfig:!1,supportsProxy:!1,supportsProjects:!1,supportsSessions:!1,supportsSkills:!1,supportsCommands:!1,supportsPlugins:!1,supportsAgents:!1}}function hr(e=[],a=[]){const l=new Set(yr(a).map(e=>e.key)),t=[];return Array.isArray(e)&&e.forEach(e=>{const a=String(e||"").trim().toLowerCase();a&&!t.includes(a)&&l.has(a)&&t.push(a)}),mr.forEach(e=>{t.length<4&&!t.includes(e)&&t.push(e)}),t.slice(0,4)}async function br(){return(await ct.get("/security")).data}async function wr(e){return(await ct.post("/security/verify",{password:e})).data}async function kr(e){return(await ct.post("/security/password",e)).data}const _r=Object.freeze(Object.defineProperty({__proto__:null,getSecurityStatus:br,setSecurityPassword:kr,verifySecurityPassword:wr},Symbol.toStringTag,{value:"Module"}));async function xr(){return(await ct.get("/pm2-autostart")).data}async function Cr(){return(await ct.post("/pm2-autostart",{action:"enable"})).data}async function Ur(){return(await ct.post("/pm2-autostart",{action:"disable"})).data}const Pr=Object.freeze(Object.defineProperty({__proto__:null,disableAutoStart:Ur,enableAutoStart:Cr,getAutoStartStatus:xr},Symbol.toStringTag,{value:"Module"}));async function Sr(){return(await ct.get("/dashboard/init")).data}const zr=Object.freeze(Object.defineProperty({__proto__:null,getDashboardInit:Sr},Symbol.toStringTag,{value:"Module"}));const Tr={...vi,...Xo,...ls,...Nn,...En,...Object.freeze(Object.defineProperty({__proto__:null,checkForUpdates:async function(){return(await ct.get("/version/check")).data},getAllChangelog:async function(){return(await ct.get("/version/changelog")).data},getChangelog:async function(e){return(await ct.get(`/version/changelog/${e}`)).data},getCurrentVersion:async function(){return(await ct.get("/version/current")).data},performUpdate:async function(){return(await ct.post("/version/update")).data}},Symbol.toStringTag,{value:"Module"})),...ii,...Gs,..._r,...Pr,...zr},Ir=k("dashboard",()=>{const e=l({uiConfig:null,favorites:null,channels:{claude:[],codex:[],gemini:[],opencode:[],omp:[]},proxyStatus:{claude:{},codex:{},gemini:{},opencode:{},omp:{}},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:{}},omp:{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},omp:{projectCount:0,sessionCount:0}}}),a=l(!1),t=l(!1);let s=null,n=null;async function o(l=!1){return t.value&&!l?e.value:(s&&!l||(a.value=!0,s=(async()=>{var l,n,o,i,r,c,u,d,p,v,m,f,y,g,h,b,w,k,_,x;try{const a=await Sr();if(!a||!1===a.success)throw new Error((null==a?void 0:a.message)||"Failed to load dashboard");const s=a.data||{},C=(e={})=>({requests:e.requests||0,tokens:e.tokens||0,cost:e.cost||0,byModel:e.byModel||{}});return e.value={uiConfig:s.uiConfig||null,favorites:s.favorites||null,channels:{claude:(null==(l=s.channels)?void 0:l.claude)||[],codex:(null==(n=s.channels)?void 0:n.codex)||[],gemini:(null==(o=s.channels)?void 0:o.gemini)||[],opencode:(null==(i=s.channels)?void 0:i.opencode)||[],omp:(null==(r=s.channels)?void 0:r.omp)||[]},proxyStatus:{claude:(null==(c=s.proxyStatus)?void 0:c.claude)||{},codex:(null==(u=s.proxyStatus)?void 0:u.codex)||{},gemini:(null==(d=s.proxyStatus)?void 0:d.gemini)||{},opencode:(null==(p=s.proxyStatus)?void 0:p.opencode)||{},omp:(null==(v=s.proxyStatus)?void 0:v.omp)||{}},todayStats:{claude:C(null==(m=s.todayStats)?void 0:m.claude),codex:C(null==(f=s.todayStats)?void 0:f.codex),gemini:C(null==(y=s.todayStats)?void 0:y.gemini),opencode:C(null==(g=s.todayStats)?void 0:g.opencode),omp:C(null==(h=s.todayStats)?void 0:h.omp)},counts:{claude:(null==(b=s.counts)?void 0:b.claude)||{projectCount:0,sessionCount:0},codex:(null==(w=s.counts)?void 0:w.codex)||{projectCount:0,sessionCount:0},gemini:(null==(k=s.counts)?void 0:k.gemini)||{projectCount:0,sessionCount:0},opencode:(null==(_=s.counts)?void 0:_.opencode)||{projectCount:0,sessionCount:0},omp:(null==(x=s.counts)?void 0:x.omp)||{projectCount:0,sessionCount:0}}},t.value=!0,e.value}finally{a.value=!1,s=null}})().catch(e=>{throw e})),s)}return{dashboardData:e,isLoading:a,isLoaded:t,loadDashboard:o,enableAutoRefresh:function(){n||(n=setInterval(()=>{o(!0).catch(()=>{})},3e5))},disableAutoRefresh:function(){n&&(clearInterval(n),n=null)},refreshChannels:async function(a){try{if("claude"===a){const a=await Tr.getChannels();a.success&&(e.value.channels.claude=a.channels)}else if("codex"===a){const a=await Tr.getCodexChannels();a.success&&(e.value.channels.codex=a.channels)}else if("gemini"===a){const a=await Tr.getGeminiChannels();a.success&&(e.value.channels.gemini=a.channels)}else if("opencode"===a){const a=await Tr.getOpenCodeChannels();a.success&&(e.value.channels.opencode=a.channels)}else if("omp"===a){const a=await Tr.getOmpChannels();a.success&&(e.value.channels.omp=a.channels)}}catch(l){}},refreshProxyStatus:async function(a){try{if("claude"===a){const a=await Tr.getProxyStatus();a.success&&(e.value.proxyStatus.claude=a)}else if("codex"===a){const a=await Tr.getCodexProxyStatus();a.success&&(e.value.proxyStatus.codex=a)}else if("gemini"===a){const a=await Tr.getGeminiProxyStatus();a.success&&(e.value.proxyStatus.gemini=a)}else if("opencode"===a){const a=await Tr.getOpenCodeProxyStatus();a.success&&(e.value.proxyStatus.opencode=a)}else if("omp"===a){const a=await Tr.getOmpProxyStatus();a.success&&(e.value.proxyStatus.omp=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 Tr.getClaudeTodayStatistics();e.value.todayStats.claude=l(a)}else if("codex"===a){const a=await Tr.getCodexTodayStatistics();e.value.todayStats.codex=l(a)}else if("gemini"===a){const a=await Tr.getGeminiTodayStatistics();e.value.todayStats.gemini=l(a)}else if("opencode"===a){const a=await Tr.getOpenCodeTodayStatistics();e.value.todayStats.opencode=l(a)}else if("omp"===a){const a=await Tr.getOmpTodayStatistics();e.value.todayStats.omp=l(a)}}catch(l){}}}}),Mr="cc-theme",Ar=l(!1);let Or=!1,$r=null,jr=null,Lr=!1;function Er(){return $r||($r=Ir(),jr=T($r).dashboardData),$r}function Dr(){Lr||jr&&(x(()=>{var e,a;return null==(a=null==(e=jr.value)?void 0:e.uiConfig)?void 0:a.theme},e=>{if(!e)return;const a="dark"===e;if(!Or)return Or=!0,Ar.value=a,void Br(a);Ar.value!==a&&(Ar.value=a,Br(a))}),Lr=!0)}async function Nr(){var e,a,l,t;if(Or)return;const s="undefined"!=typeof window?null==(e=window.localStorage)?void 0:e.getItem(Mr):null;"dark"!==s&&"light"!==s||(Ar.value="dark"===s,Br(Ar.value));try{const e=Er();Dr();let n=null==(l=null==(a=null==jr?void 0:jr.value)?void 0:a.uiConfig)?void 0:l.theme;if(!n){const a=await e.loadDashboard().catch(()=>null);n=null==(t=null==a?void 0:a.uiConfig)?void 0:t.theme}n||s?n&&(Ar.value="dark"===n):Ar.value=window.matchMedia("(prefers-color-scheme: dark)").matches}catch(n){s||(Ar.value=window.matchMedia("(prefers-color-scheme: dark)").matches)}Br(Ar.value),Or=!0}function Br(e){e?document.documentElement.setAttribute("data-theme","dark"):document.documentElement.removeAttribute("data-theme")}function Rr(){Ar.value=!Ar.value}function Fr(){return{isDark:Ar,toggleTheme:Rr,loadTheme:Nr}}x(Ar,async e=>{var a;Br(e);try{null==(a=window.localStorage)||a.setItem(Mr,e?"dark":"light")}catch(l){}try{await Fs("theme",e?"dark":"light");Er();Dr(),jr.value&&(jr.value={...jr.value,uiConfig:{...jr.value.uiConfig||{},theme:e?"dark":"light"}})}catch(l){}});const Hr={class:"settings-container"},Gr={class:"settings-sidebar"},Kr={class:"sidebar-header"},qr={class:"settings-menu"},Wr=["onClick"],Vr={class:"menu-label"},Jr={class:"settings-content"},Zr={class:"settings-panel"},Qr={class:"panel-header"},Yr={class:"panel-title-row"},Xr={class:"panel-body"},ec={class:"setting-group"},ac={class:"setting-item"},lc={class:"setting-label"},tc={class:"visibility-options"},sc={class:"visibility-item"},nc={class:"visibility-info"},oc={class:"visibility-item"},ic={class:"visibility-info"},rc={class:"visibility-item"},cc={class:"visibility-info"},uc={class:"setting-item"},dc={class:"setting-label"},pc={class:"home-cli-settings"},vc={class:"home-cli-slots"},mc={class:"custom-cli-list"},fc={class:"custom-cli-grid"},yc={class:"custom-cli-actions"},gc={class:"home-cli-actions"},hc={class:"setting-item"},bc={class:"setting-label"},wc={class:"simple-theme-options"},kc={class:"theme-text"},_c={key:0,class:"theme-check"},xc={class:"theme-text"},Cc={key:0,class:"theme-check"},Uc={class:"settings-panel"},Pc={class:"panel-header"},Sc={class:"panel-title-row"},zc={class:"panel-body"},Tc={class:"setting-group"},Ic={class:"setting-item"},Mc={class:"setting-label"},Ac={class:"notification-options"},Oc={class:"visibility-item"},$c={class:"visibility-info"},jc={key:1,class:"notification-type-section"},Lc={class:"radio-content"},Ec={class:"radio-content"},Dc={class:"radio-content"},Nc={style:{"font-size":"13px"}},Bc={class:"setting-item"},Rc={class:"setting-label"},Fc={class:"notification-options"},Hc={class:"remote-provider-toolbar"},Gc={class:"remote-provider-header"},Kc={class:"remote-provider-title-row"},qc={class:"remote-provider-avatar"},Wc={class:"remote-provider-title"},Vc={class:"remote-provider-name-row"},Jc={class:"remote-provider-fields"},Zc={class:"remote-field"},Qc={class:"remote-field remote-field-wide"},Yc={class:"remote-field"},Xc={class:"remote-field"},eu={class:"remote-field"},au={class:"remote-field remote-field-wide"},lu={class:"remote-field"},tu={class:"remote-field"},su={class:"remote-field"},nu={key:2,class:"remote-field remote-field-wide"},ou={key:3,class:"remote-field remote-field-wide"},iu={class:"remote-field"},ru={class:"remote-field"},cu={class:"remote-field"},uu={class:"remote-field"},du={class:"remote-field"},pu={key:1,class:"remote-field remote-field-wide"},vu={class:"remote-field"},mu={class:"remote-field"},fu={class:"remote-field remote-field-wide"},yu={class:"remote-provider-actions"},gu={class:"panel-footer"},hu={class:"settings-panel"},bu={class:"panel-header"},wu={class:"panel-title-row"},ku={class:"panel-body"},_u={class:"setting-group"},xu={class:"setting-item"},Cu={class:"setting-label"},Uu={class:"ports-grid"},Pu={class:"port-field"},Su={class:"port-field"},zu={class:"port-field"},Tu={class:"port-field"},Iu={class:"port-field"},Mu={class:"port-field"},Au={class:"setting-item"},Ou={class:"setting-label"},$u={class:"advanced-options"},ju={class:"option-field"},Lu={class:"option-label"},Eu={class:"setting-item"},Du={class:"setting-label"},Nu={class:"advanced-options"},Bu={class:"option-field"},Ru={class:"option-label"},Fu={class:"option-field"},Hu={class:"option-label"},Gu={class:"setting-item"},Ku={class:"setting-label"},qu={style:{"margin-top":"16px"}},Wu={style:{background:"var(--bg-secondary)",padding:"16px","border-radius":"8px","border-left":"3px solid var(--border-secondary)"}},Vu={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},Ju={class:"panel-footer"},Zu={class:"settings-panel"},Qu={class:"panel-header"},Yu={class:"panel-title-row"},Xu={class:"panel-body"},ed={class:"setting-group"},ad={class:"setting-item"},ld={class:"setting-label"},td={class:"security-status"},sd={class:"setting-item"},nd={class:"setting-label"},od={class:"security-form"},id={class:"panel-footer"},rd={class:"settings-panel"},cd={class:"panel-header"},ud={class:"panel-title-row"},dd={class:"panel-body"},pd={class:"setting-item",style:{"margin-bottom":"12px"}},vd={class:"model-meta-section"},md={class:"speed-test-defaults"},fd={class:"speed-test-default-label"},yd={class:"model-toolbar"},gd={class:"model-filter-row"},hd={key:0,class:"setting-item"},bd={key:1,class:"model-list"},wd=["onClick"],kd={class:"model-card-id"},_d={key:0,class:"model-card-body"},xd={class:"model-meta-editor"},Cd={class:"model-meta-section"},Ud={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},Pd={class:"model-meta-section",style:{"margin-top":"8px"}},Sd={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},zd={class:"panel-footer"},Td={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},Id={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},Md={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},Ad=zl({__name:"SettingsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:k}=ei(720);async function _(e){return(await ct.post("/settings/model-settings",e)).data}async function C(e){return(await ct.delete(`/settings/model-settings/${encodeURIComponent(e)}`)).data}const U=e,S=a,z=t({get:()=>U.visible,set:e=>S("update:visible",e)}),T=l("appearance"),{isDark:I,toggleTheme:M}=Fr(),A=l(!0),O=l(!0),$=l(!1),j=l({webUI:19999,proxy:20088,codexProxy:20089,geminiProxy:20090,opencodeProxy:20091,ompProxy:20092}),E=l({webUI:19999,proxy:20088,codexProxy:20089,geminiProxy:20090,opencodeProxy:20091,ompProxy:20092}),D=l(!1),N=l([...mr]),B=l([]),q=l({homeCliColumns:[...mr],customCliPlatforms:[]}),W=l(!1),V=l(!1),J=l(!1),Y=t(()=>V.value?"[v] 已启用":"未启用"),X=t(()=>V.value?"重启电脑时 coding-tool-x 会自动启动。如需禁用,点击下方按钮":"启用后,重启电脑时 coding-tool-x 会自动启动"),ie=l({maxLogs:100,statsInterval:30,enableSessionBinding:!0}),ve=l({maxLogs:100,statsInterval:30,enableSessionBinding:!0}),me=[{key:"claude",label:"Claude Code",description:"当 Claude Code 任务完成或等待交互时发送系统通知",implementation:"通过 Claude Code 的 Stop Hook 在任务完成时发送通知",externalMessage:"检测到已有非 Coding Tool 的 Stop Hook。本界面只管理 Coding Tool 写入的通知配置。"},{key:"codex",label:"Codex CLI",description:"当 Codex CLI 当前回合完成并等待下一步交互时发送系统通知",implementation:"通过 Codex CLI 的 notify 命令在回合完成后发送通知",externalMessage:"检测到现有 notify 配置。启用 Coding Tool 托管通知会替换当前 notify 命令;关闭时只会移除 Coding Tool 写入的 notify。"},{key:"gemini",label:"Gemini CLI",description:"当 Gemini CLI 回合完成或等待下一步交互时发送系统通知",implementation:"通过 Gemini CLI 的 AfterAgent Hook 在任务完成时发送通知",externalMessage:"检测到已有非 Coding Tool 的 Gemini Hook。本界面只管理 Coding Tool 写入的通知配置。"},{key:"opencode",label:"OpenCode",description:"当 OpenCode 会话空闲或发生错误时发送系统通知",implementation:"通过 OpenCode 插件事件(session.idle / session.error)发送通知",externalMessage:"检测到其他 OpenCode 通知配置时,本界面只管理 Coding Tool 生成的插件文件。"},{key:"omp",label:"OMP",description:"当 OMP 回合完成或等待下一步交互时发送系统通知",implementation:"通过 OMP 托管 Extension 事件发送通知",externalMessage:"检测到其他 OMP 通知扩展时,本界面只管理 Coding Tool 生成的扩展文件。"}];function fe(e={}){return{enabled:!0===e.enabled,type:"dialog"===e.type||"browser"===e.type?e.type:"notification",external:!0===e.external}}const ye={wechatBot:{label:"微信",description:"使用个人微信 iLink token 发送通知",hint:"首次 token 可由 GA 微信扫码生成;也可以直接填写 token。"},qqBot:{label:"QQ",description:"通过 OneBot / NapCat / go-cqhttp 兼容 HTTP 接口发送通知",hint:"GA 当前构建已移除 QQ 前端,这里按 OneBot 兼容桥接入。"},feishuBot:{label:"飞书",description:"通过飞书自定义机器人 Webhook 发送通知",hint:"填写飞书自定义机器人 Webhook URL。"},wecomBot:{label:"企业微信",description:"通过企业微信群机器人 Webhook 发送通知",hint:"当前通知发送使用企业微信群机器人 Webhook;GA 的 bot_id / secret 长连接模式不适合单向通知。"},dingtalkBot:{label:"钉钉",description:"支持钉钉自定义机器人 Webhook 和 GA 同款 App 模式",hint:"App 模式需要 App Key / App Secret,并填写用户 ID 或群会话 ID。"},telegramBot:{label:"Telegram",description:"通过 Telegram Bot API sendMessage 发送通知",hint:"需要 Token 和 Chat ID。"}},ge={wechatBot:"微",qqBot:"Q",feishuBot:"飞",wecomBot:"企",dingtalkBot:"钉",telegramBot:"T"},he={wechatBot:"微信 Bot",qqBot:"QQ Bot",feishuBot:"飞书 Bot",wecomBot:"企业微信 Bot",dingtalkBot:"钉钉 Bot",telegramBot:"Telegram Bot"},be=Object.entries(ye).map(([e,a])=>({label:a.label,value:e})),we=[{label:"私聊",value:"private"},{label:"群聊",value:"group"}],ke=[{label:"Webhook",value:"webhook"},{label:"GA App 模式",value:"app"}],_e=[{label:"群会话",value:"group"},{label:"用户",value:"user"}];function xe(e){switch(e){case"wechatBot":return{tokenFile:"~/.wxbot/token.json",botToken:"",targetUserId:"",contextToken:""};case"qqBot":return{endpoint:"http://127.0.0.1:3000",accessToken:"",targetType:"private",targetId:""};case"feishuBot":case"wecomBot":return{webhookUrl:""};case"dingtalkBot":return{mode:"webhook",webhookUrl:"",clientId:"",clientSecret:"",targetType:"group",targetId:""};case"telegramBot":return{botToken:"",chatId:"",proxy:""};default:return{}}}function Ce(e={}){const a=ye[e.type]?e.type:"telegramBot",l=he[a],t=e.name&&e.name!==l?e.name:Ue(a);return{id:e.id||`${a}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:a,name:t,enabled:!0===e.enabled,config:{...xe(a),...e.config||{}}}}function Ue(e){var a;return(null==(a=ye[e])?void 0:a.label)||"远程通知"}function Pe(e){var a;return(null==(a=ye[e])?void 0:a.description)||""}function Se(e){var a;return(null==(a=ye[e])?void 0:a.hint)||""}function ze(e={}){var a,l,t,s,n,o,i,r,c;const u={enabled:null==(a=null==e?void 0:e.stopHook)?void 0:a.enabled,type:null==(l=null==e?void 0:e.stopHook)?void 0:l.type},d=Array.isArray(null==(t=null==e?void 0:e.remoteNotifications)?void 0:t.providers)?e.remoteNotifications.providers.map(Ce):[];return{claude:fe((null==(s=null==e?void 0:e.platforms)?void 0:s.claude)||u),codex:fe(null==(n=null==e?void 0:e.platforms)?void 0:n.codex),gemini:fe(null==(o=null==e?void 0:e.platforms)?void 0:o.gemini),opencode:fe(null==(i=null==e?void 0:e.platforms)?void 0:i.opencode),omp:fe((null==(r=null==e?void 0:e.platforms)?void 0:r.omp)||(null==(c=null==e?void 0:e.platforms)?void 0:c.omp)),remoteNotifications:{providers:d}}}const Te=l(ze()),Ie=l(ze()),Me=l(!1),Ae=l(""),Oe=l("telegramBot"),$e=l(""),je=l("default"),Le=t(()=>"undefined"!=typeof window&&"undefined"!=typeof Notification&&(!!window.isSecureContext||["localhost","127.0.0.1","::1"].includes(window.location.hostname))),Ee=t(()=>Le.value?"granted"===je.value?"已授权":"denied"===je.value?"已被浏览器拒绝,请在浏览器站点设置里重新开启":"尚未授权,保存时会请求浏览器权限":"当前环境不支持浏览器通知,请使用 localhost 或 HTTPS 页面");function De(e="notification"){if("browser"===e)return"浏览器通知";if("dialog"===e)return"确认式弹窗";switch($e.value){case"win32":return"右上角悬浮卡片";case"darwin":return"角落横幅通知";case"linux":return"桌面环境通知";default:return"轻提醒卡片"}}function Ne(e="notification"){return"browser"===e?Le.value?"granted"===je.value?"通过当前打开的 Web 页面显示浏览器原生通知":"denied"===je.value?"浏览器通知权限已被拒绝,需要先在浏览器中重新授权":"通过当前打开的 Web 页面显示原生通知,保存时会请求权限":"当前页面环境不支持浏览器通知":"dialog"===e?"强制提醒,需要手动点击确认才能关闭":"win32"===$e.value?"轻量提醒,几秒后自动消失,带提示音(Windows 使用系统 Toast 风格提醒)":"轻量提醒,几秒后自动消失,带提示音"}function Re(){"undefined"!=typeof Notification?je.value=Notification.permission:je.value="unsupported"}function Fe(){Te.value.remoteNotifications.providers.push(function(e="telegramBot"){return{id:`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:e,name:Ue(e),enabled:!1,config:xe(e)}}(Oe.value))}const He=l({hasPassword:!1}),Ge=l(!1),We=l(!1),Ve=l({currentPassword:"",newPassword:"",confirmPassword:""}),Je=l(!1);let Ze=null;const Qe=l(!1),Ye=l(!1),Xe=l({}),ea=l({}),aa=l({}),la=l(""),ta=l("all"),sa=l(!1),na=l({modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0}),oa=l(new Set),ia=l({claude:"",codex:"",gemini:""}),ca=l({claude:"",codex:"",gemini:""}),ua=[{key:"claude",label:"Claude Code"},{key:"codex",label:"Codex"},{key:"gemini",label:"Gemini CLI"}],da=l(new Set),pa=t(()=>Object.keys(aa.value).length>0),va=t(()=>pa.value||JSON.stringify(ia.value)!==JSON.stringify(ca.value)),ma=t(()=>{const e=String(na.value.modelId||"").trim();if(!e)return"请输入模型 ID";const a=Object.keys(Xe.value).find(a=>a.toLowerCase()===e.toLowerCase());return a?`模型已存在:${a}`:!Number.isFinite(na.value.context)||na.value.context<=0?"Context 窗口必须为正数":!Number.isFinite(na.value.output)||na.value.output<=0?"Max Output 必须为正数":na.value.inputPrice<0||na.value.outputPrice<0||na.value.cacheCreationPrice<0||na.value.cacheReadPrice<0?"价格不能为负数":""});function fa(){na.value={modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0},sa.value=!0}function ya(){sa.value=!1}function ga(){if(ma.value)return;const e=String(na.value.modelId||"").trim(),a={limit:{context:na.value.context,output:na.value.output},pricing:{input:na.value.inputPrice,output:na.value.outputPrice,cacheCreation:na.value.cacheCreationPrice,cacheRead:na.value.cacheReadPrice}};Xe.value[e]=a,aa.value[e]={limit:{...a.limit},pricing:{...a.pricing}},la.value=e,sa.value=!1,Ds.success("模型已新增,请点击“保存设置”使其生效")}function ha(e){return oa.value.has(e)}function Ta(e){return!ha(e)}const Ia=t(()=>{const e=Object.keys(Xe.value),a=la.value.trim().toLowerCase(),l=ta.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||!!ea.value[e]))});function Ma(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 Aa=t(()=>{const e={claude:[],codex:[],gemini:[]};for(const[a,l]of Object.entries(Xe.value||{})){if(!l||"object"!=typeof l||!l.limit||!l.pricing)continue;const t=Ma(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 Oa(e,a,l){var t,s,n,o;return void 0!==(null==(s=null==(t=aa.value[e])?void 0:t[a])?void 0:s[l])?aa.value[e][a][l]:(null==(o=null==(n=Xe.value[e])?void 0:n[a])?void 0:o[l])??null}function $a(e,a,l,t){if(!aa.value[e]){const a=Xe.value[e]||{};aa.value[e]={limit:{...a.limit||{}},pricing:{...a.pricing||{}}}}aa.value[e][a]||(aa.value[e][a]={}),aa.value[e][a][l]=t}async function ja(){var e,a,l;Qe.value=!0;try{const t=await async function(){return(await ct.get("/settings/model-settings")).data}();Xe.value=t.models||{},ea.value=t.overrides||{},oa.value=new Set(t.builtinModelIds||[]),ia.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={...ia.value};let a=!1;for(const l of ua){const t=Aa.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&&(ia.value=e)}(),ca.value={...ia.value},aa.value={}}catch(t){}finally{Qe.value=!1}}async function La(){Ye.value=!0;try{const e={...ea.value};for(const[a,l]of Object.entries(aa.value)){const t=e[a]||{};e[a]={limit:{...t.limit||{},...l.limit||{}},pricing:{...t.pricing||{},...l.pricing||{}}}}await _({overrides:e,defaultSpeedTestModels:ia.value}),ea.value=e,ca.value={...ia.value},aa.value={},await ja(),Ds.success("模型设置已保存")}catch(e){Ds.error("保存失败:"+e.message)}finally{Ye.value=!1}}async function Ea(){try{await _({overrides:{},defaultSpeedTestModels:ia.value}),ea.value={},aa.value={},await ja(),Ds.success("全部模型设置已重置为内置默认值")}catch(e){Ds.error("重置失败:"+e.message)}}const Da=t(()=>j.value.webUI!==E.value.webUI||j.value.proxy!==E.value.proxy||j.value.codexProxy!==E.value.codexProxy||j.value.geminiProxy!==E.value.geminiProxy||j.value.opencodeProxy!==E.value.opencodeProxy||j.value.ompProxy!==E.value.ompProxy||ie.value.maxLogs!==ve.value.maxLogs||ie.value.statsInterval!==ve.value.statsInterval||ie.value.enableSessionBinding!==ve.value.enableSessionBinding),Na=t(()=>function(e=[]){return yr(e).map(e=>({label:e.label||e.title||e.key,value:e.key}))}(B.value)),Ba=t(()=>JSON.stringify(N.value)!==JSON.stringify(q.value.homeCliColumns)||JSON.stringify(fr(B.value))!==JSON.stringify(q.value.customCliPlatforms)),Ra=t(()=>Ve.value.newPassword&&Ve.value.confirmPassword?Ve.value.newPassword.length<4?"密码至少 4 位":Ve.value.newPassword!==Ve.value.confirmPassword?"两次输入的新密码不一致":"":""),Fa=t(()=>!(!Ve.value.newPassword||!Ve.value.confirmPassword)&&(!Ra.value&&!(He.value.hasPassword&&!Ve.value.currentPassword))),Ha=t(()=>[{key:"appearance",label:"外观设置",icon:L(ba)},{key:"notification",label:"通知设置",icon:L(wa)},{key:"advanced",label:"高级设置",icon:L(ka)},{key:"security",label:"安全设置",icon:L(_a)},{key:"model-settings",label:"模型设置",icon:L(ra)}]);async function Ga(){var e,a,l;try{const t=await Bs();if(t.success&&t.config){A.value=!1!==(null==(e=t.config.panelVisibility)?void 0:e.showChannels),O.value=!1!==(null==(a=t.config.panelVisibility)?void 0:a.showLogs),$.value=!0===(null==(l=t.config.channelBalance)?void 0:l.showRemaining);const s=fr(t.config.customCliPlatforms||[]),n=hr(t.config.homeCliColumns||t.config.dashboardChannelOrder,s);B.value=s.map(e=>({...e})),N.value=n,q.value={homeCliColumns:[...n],customCliPlatforms:s.map(e=>({...e}))}}}catch(t){}}function Ka(){B.value=fr(B.value),N.value=hr(N.value,B.value)}function qa(){const e=B.value.length+1;B.value.push({key:`custom-cli-${e}`,name:`Custom CLI ${e}`,command:"",configDir:"",icon:"",color:"",enabled:!0}),Ka()}function Wa(){N.value=[...mr]}async function Va(){W.value=!0;try{Ka();const e=fr(B.value),a=hr(N.value,e),l=await Bs(),t=l.success&&l.config?l.config:{},s=await Rs({...t,customCliPlatforms:e,homeCliColumns:a,dashboardChannelOrder:a});if(!s.success)throw new Error(s.message||"保存失败");B.value=e.map(e=>({...e})),N.value=a,q.value={homeCliColumns:[...a],customCliPlatforms:e.map(e=>({...e}))};try{localStorage.setItem("dashboardChannelOrder",JSON.stringify(a))}catch{}window.dispatchEvent(new CustomEvent("home-cli-columns-change",{detail:{homeCliColumns:a,customCliPlatforms:e}})),Ds.success("首页 CLI 显示已保存")}catch(e){Ds.error("保存失败: "+e.message)}finally{W.value=!1}}async function Ja(){try{await Hs("panelVisibility","showChannels",A.value),await Hs("panelVisibility","showLogs",O.value),await Hs("channelBalance","showRemaining",$.value)}catch(e){}}function Za(e){A.value=e,Ja(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:e,showLogs:O.value}}))}function Qa(e){O.value=e,Ja(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:A.value,showLogs:e}}))}function Ya(e){$.value=e,Ja(),window.dispatchEvent(new CustomEvent("channel-balance-visibility-change",{detail:{showRemaining:e}}))}async function Xa(e){try{(await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:j.value,maxLogs:ie.value.maxLogs,statsInterval:ie.value.statsInterval,enableSessionBinding:e})})).ok?(ve.value.enableSessionBinding=e,Ds.success(e?"会话绑定已开启":"会话绑定已关闭")):(ie.value.enableSessionBinding=!e,Ds.error("保存失���"))}catch(a){ie.value.enableSessionBinding=!e,Ds.error("保存失败: "+a.message)}}async function el(){Me.value=!0;try{me.some(e=>{const a=Te.value[e.key];return a.enabled&&"browser"===a.type})&&await async function(){if(!Le.value)throw new Error("当前页面环境不支持浏览器通知,请改用 HTTPS 或 localhost 页面");if(Re(),"granted"===je.value)return;const e=await Notification.requestPermission();if(je.value=e,"granted"!==e)throw new Error("浏览器通知权限未授予")}();const e=await fetch("/api/hooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({platforms:Object.fromEntries(me.map(e=>[e.key,{enabled:Te.value[e.key].enabled,type:Te.value[e.key].type}])),remoteNotifications:{providers:Te.value.remoteNotifications.providers}})});if(e.ok){const a=await e.json(),l=ze(a);Te.value=l,Ie.value=JSON.parse(JSON.stringify(l)),$e.value=a.platform||$e.value,Ds.success("通知设置已保存")}else{const a=await e.json();Ds.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Ds.error("保存失败:"+e.message)}finally{Me.value=!1}}function al(){Ve.value={currentPassword:"",newPassword:"",confirmPassword:""}}async function ll(e=!1){return We.value&&Ze?Ze:Ge.value&&!e?Promise.resolve():(We.value=!0,Ze=(async()=>{try{const e=await br();e.success&&(He.value={hasPassword:Boolean(e.hasPassword)},Ge.value=!0)}catch(e){}finally{We.value=!1,Ze=null}})(),Ze)}async function tl(){var e,a;if(!Fa.value)return void Ds.warning("请完善密码信息");const l=He.value.hasPassword;Je.value=!0;try{const e={newPassword:Ve.value.newPassword};He.value.hasPassword&&(e.currentPassword=Ve.value.currentPassword);const a=await kr(e);a.success?(He.value.hasPassword=!0,Ge.value=!0,al(),Ds.success(l?"密码已更新":"密码已设置")):Ds.error(a.error||"保存失败")}catch(t){Ds.error((null==(a=null==(e=t.response)?void 0:e.data)?void 0:a.error)||"保存失败")}finally{Je.value=!1}}async function sl(){D.value=!0;try{const e=await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:j.value,maxLogs:ie.value.maxLogs,statsInterval:ie.value.statsInterval,enableSessionBinding:ie.value.enableSessionBinding})});if(e.ok)E.value={...j.value},ve.value={...ie.value},window.dispatchEvent(new CustomEvent("advanced-config-change",{detail:{maxLogs:ie.value.maxLogs,statsInterval:ie.value.statsInterval}})),Ds.success("配置已保存,端口修改需要重启服务器生效");else{const a=await e.json();Ds.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Ds.error("保存失败:"+e.message)}finally{D.value=!1}}async function nl(){J.value=!0;try{const e=await Cr();if(e.success)V.value=!0,Ds.success("开机自启已启用");else{const a=e.message||"未知错误";a.includes("暂无运行中的进程")||a.includes("请先启动")?Ds.warning(a):Ds.error(a)}}catch(e){Ds.error(e.message||"启用失败:未知错误")}finally{J.value=!1}}async function ol(){J.value=!0;try{const e=await Ur();if(e.success)V.value=!1,Ds.success("开机自启已禁用");else{const a=e.message||"未知错误";a.includes("未启用")||a.includes("不存在")?Ds.warning(a):Ds.error(a)}}catch(e){Ds.error(e.message||"禁用失败:未知错误")}finally{J.value=!1}}return w(()=>{Re(),Ga(),ll(),ja()}),x(z,e=>{e?(Ga(),async function(){var e,a,l,t,s,n;try{const o=await fetch("/api/config/advanced");if(o.ok){const i=await o.json();j.value={webUI:(null==(e=i.ports)?void 0:e.webUI)||19999,proxy:(null==(a=i.ports)?void 0:a.proxy)||20088,codexProxy:(null==(l=i.ports)?void 0:l.codexProxy)||20089,geminiProxy:(null==(t=i.ports)?void 0:t.geminiProxy)||20090,opencodeProxy:(null==(s=i.ports)?void 0:s.opencodeProxy)||20091,ompProxy:(null==(n=i.ports)?void 0:n.ompProxy)||20092},E.value={...j.value},ie.value={maxLogs:i.maxLogs||100,statsInterval:i.statsInterval||30,enableSessionBinding:!1!==i.enableSessionBinding},ve.value={...ie.value}}}catch(o){}}(),async function(){var e;try{const a=await xr();a&&a.success?V.value=(null==(e=a.data)?void 0:e.enabled)||!1:V.value=!1}catch(a){V.value=!1}}(),async function(){try{const e=await fetch("/api/hooks");if(e.ok){const a=await e.json(),l=ze(a);Te.value=l,Ie.value=JSON.parse(JSON.stringify(l)),$e.value=a.platform||"",Re()}}catch(e){}}(),ja(),ll(!0)):al()}),x(T,(e,a)=>{"security"===e&&ll(),"security"===a&&"security"!==e&&al()}),(e,a)=>(n(),g(d(ce),{show:z.value,"onUpdate:show":a[29]||(a[29]=e=>z.value=e),width:d(k),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{"show-header":!1,closable:"","native-scrollbar":!1},{default:u(()=>[o("div",Hr,[o("div",Gr,[o("div",Kr,[c(d(R),{size:"20",color:"var(--text-secondary)"},{default:u(()=>[c(d(xa))]),_:1}),a[30]||(a[30]=o("span",{class:"sidebar-title"},"设置分类",-1))]),o("div",qr,[(n(!0),s(f,null,y(Ha.value,e=>(n(),s("div",{key:e.key,class:p(["menu-item",{active:T.value===e.key}]),onClick:a=>T.value=e.key},[c(d(R),{size:18,class:"menu-icon"},{default:u(()=>[(n(),g(P(e.icon)))]),_:2},1024),o("span",Vr,m(e.label),1),e.badge?(n(),g(d(ue),{key:0,value:e.badge,type:e.badgeType||"info","show-zero":!1},null,8,["value","type"])):i("",!0)],10,Wr))),128))])]),o("div",Jr,[r(o("div",Zr,[o("div",Qr,[o("div",Yr,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(ba))]),_:1}),o("div",null,[a[32]||(a[32]=o("h3",{class:"panel-title"},"外观设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[31]||(a[31]=[h("自定义界面外观和主题",-1)])]),_:1})])])]),o("div",Xr,[o("div",ec,[o("div",ac,[o("div",lc,[c(d(K),{strong:""},{default:u(()=>[...a[33]||(a[33]=[h("面板显示",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[34]||(a[34]=[h(" 控制右侧面板中各个区域的显示 ",-1)])]),_:1})]),o("div",tc,[o("div",sc,[o("div",nc,[c(d(K),{strong:""},{default:u(()=>[...a[35]||(a[35]=[h("显示渠道列表",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[36]||(a[36]=[h(" 在右侧面板显示 API 渠道管理区域 ",-1)])]),_:1})]),c(d(G),{value:A.value,"onUpdate:value":Za},null,8,["value"])]),o("div",oc,[o("div",ic,[c(d(K),{strong:""},{default:u(()=>[...a[37]||(a[37]=[h("显示实时日志",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[38]||(a[38]=[h(" 在 Dashboard 显示实时日志区域 ",-1)])]),_:1})]),c(d(G),{value:O.value,"onUpdate:value":Qa},null,8,["value"])]),o("div",rc,[o("div",cc,[c(d(K),{strong:""},{default:u(()=>[...a[39]||(a[39]=[h("显示剩余金额",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[40]||(a[40]=[h(" 在渠道卡片显示可识别 API 网关的余额 ",-1)])]),_:1})]),c(d(G),{value:$.value,"onUpdate:value":Ya},null,8,["value"])])])]),c(d(de)),o("div",uc,[o("div",dc,[c(d(K),{strong:""},{default:u(()=>[...a[41]||(a[41]=[h("首页 CLI 显示",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[42]||(a[42]=[h(" 固定四个槽位,默认是 Claude Code / Codex / Gemini / OpenCode;OMP 和自定义 CLI 可替换任一列 ",-1)])]),_:1})]),o("div",pc,[o("div",vc,[(n(!0),s(f,null,y(N.value,(e,a)=>(n(),s("div",{key:a,class:"home-cli-slot"},[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h("第 "+m(a+1)+" 列",1)]),_:2},1024),c(d(ee),{value:N.value[a],options:Na.value,size:"small","onUpdate:value":e=>function(e,a){const l=[...N.value],t=l.findIndex((l,t)=>l===a&&t!==e);l[e]=a,t>=0&&(l[t]=N.value[e]),N.value=hr(l,B.value)}(a,e)},null,8,["value","options","onUpdate:value"])]))),128))]),o("div",mc,[(n(!0),s(f,null,y(B.value,(e,l)=>(n(),s("div",{key:e.key||l,class:"custom-cli-item"},[o("div",fc,[c(d(ne),{value:e.key,"onUpdate:value":a=>e.key=a,size:"small",placeholder:"key,如 aider",onBlur:Ka},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.name,"onUpdate:value":a=>e.name=a,size:"small",placeholder:"名称"},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.command,"onUpdate:value":a=>e.command=a,size:"small",placeholder:"启动命令"},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.configDir,"onUpdate:value":a=>e.configDir=a,size:"small",placeholder:"配置目录(可选)"},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.icon,"onUpdate:value":a=>e.icon=a,size:"small",placeholder:"图标名(可选)"},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.color,"onUpdate:value":a=>e.color=a,size:"small",placeholder:"颜色(可选)"},null,8,["value","onUpdate:value"])]),o("div",yc,[c(d(G),{value:e.enabled,"onUpdate:value":a=>e.enabled=a,size:"small"},null,8,["value","onUpdate:value"]),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[43]||(a[43]=[h("可作为首页列",-1)])]),_:1}),c(d(F),{text:"",size:"small",type:"error",onClick:e=>function(e){B.value.splice(e,1),Ka()}(l)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1},8,["onClick"])])]))),128))]),o("div",gc,[c(d(F),{size:"small",onClick:qa},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[44]||(a[44]=h(" 新增自定义 CLI ",-1))]),_:1}),c(d(F),{size:"small",onClick:Wa},{default:u(()=>[...a[45]||(a[45]=[h("恢复默认四列",-1)])]),_:1}),c(d(F),{type:"primary",size:"small",loading:W.value,disabled:!Ba.value,onClick:Va},{default:u(()=>[...a[46]||(a[46]=[h(" 保存首页显示 ",-1)])]),_:1},8,["loading","disabled"])])])]),c(d(de)),o("div",hc,[o("div",bc,[c(d(K),{strong:""},{default:u(()=>[...a[47]||(a[47]=[h("界面主题",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[48]||(a[48]=[h(" 选择你喜欢的界面主题风格 ",-1)])]),_:1})]),o("div",wc,[o("div",{class:p(["simple-theme-item",{active:!d(I)}]),onClick:a[0]||(a[0]=e=>d(I)&&d(M)())},[c(d(R),{size:20,class:"theme-icon"},{default:u(()=>[c(d(Ca))]),_:1}),o("div",kc,[c(d(K),{strong:""},{default:u(()=>[...a[49]||(a[49]=[h("亮色模式",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[50]||(a[50]=[h("经典的浅色主题",-1)])]),_:1})]),d(I)?i("",!0):(n(),s("div",_c,[c(d(R),{size:20,color:"#18a058"},{default:u(()=>[c(d(Be))]),_:1})]))],2),o("div",{class:p(["simple-theme-item",{active:d(I)}]),onClick:a[1]||(a[1]=e=>!d(I)&&d(M)())},[c(d(R),{size:20,class:"theme-icon"},{default:u(()=>[c(d(Ua))]),_:1}),o("div",xc,[c(d(K),{strong:""},{default:u(()=>[...a[51]||(a[51]=[h("暗色模式",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[52]||(a[52]=[h("护眼的深色主题",-1)])]),_:1})]),d(I)?(n(),s("div",Cc,[c(d(R),{size:20,color:"#18a058"},{default:u(()=>[c(d(Be))]),_:1})])):i("",!0)],2)])])])])],512),[[b,"appearance"===T.value]]),r(o("div",Uc,[o("div",Pc,[o("div",Sc,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(wa))]),_:1}),o("div",null,[a[54]||(a[54]=o("h3",{class:"panel-title"},"通知设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[53]||(a[53]=[h("配置任务完成时的系统通知",-1)])]),_:1})])])]),o("div",zc,[o("div",Tc,[(n(),s(f,null,y(me,(e,l)=>(n(),s(f,{key:e.key},[o("div",Ic,[o("div",Mc,[c(d(K),{strong:""},{default:u(()=>[h(m(e.label),1)]),_:2},1024),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[h(m(e.description),1)]),_:2},1024)]),o("div",Ac,[o("div",Oc,[o("div",$c,[c(d(K),{strong:""},{default:u(()=>[...a[55]||(a[55]=[h("启用任务完成通知",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[h(m(e.implementation),1)]),_:2},1024)]),c(d(G),{value:Te.value[e.key].enabled,"onUpdate:value":a=>Te.value[e.key].enabled=a},null,8,["value","onUpdate:value"])]),Te.value[e.key].external?(n(),g(d(pe),{key:0,type:"warning",bordered:!1,style:{"margin-top":"16px"}},{default:u(()=>[h(m(e.externalMessage),1)]),_:2},1024)):i("",!0),Te.value[e.key].enabled?(n(),s("div",jc,[c(d(K),{depth:"2",style:{"font-size":"13px","margin-bottom":"12px",display:"block"}},{default:u(()=>[...a[56]||(a[56]=[h(" 选择通知方式 ",-1)])]),_:1}),c(d(le),{value:Te.value[e.key].type,"onUpdate:value":a=>Te.value[e.key].type=a},{default:u(()=>[c(d(ae),{vertical:""},{default:u(()=>[c(d(te),{value:"notification"},{default:u(()=>[o("div",Lc,[c(d(K),{strong:""},{default:u(()=>[h(m(De("notification")),1)]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[h(m(Ne("notification")),1)]),_:1})])]),_:1}),c(d(te),{value:"browser",disabled:!Le.value},{default:u(()=>[o("div",Ec,[c(d(K),{strong:""},{default:u(()=>[h(m(De("browser")),1)]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[h(m(Ne("browser")),1)]),_:1})])]),_:1},8,["disabled"]),c(d(te),{value:"dialog"},{default:u(()=>[o("div",Dc,[c(d(K),{strong:""},{default:u(()=>[h(m(De("dialog")),1)]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[h(m(Ne("dialog")),1)]),_:1})])]),_:1})]),_:1})]),_:1},8,["value","onUpdate:value"]),"claude"===e.key&&"darwin"===$e.value?(n(),g(d(pe),{key:0,type:"info",bordered:!1,style:{"margin-top":"16px"},"show-icon":!1},{default:u(()=>[o("div",Nc,[c(d(K),{strong:""},{default:u(()=>[...a[57]||(a[57]=[h("[TIP] 更好的通知体验",-1)])]),_:1}),c(d(K),{depth:"3",style:{display:"block","margin-top":"4px","font-size":"12px"}},{default:u(()=>[...a[58]||(a[58]=[h(" 安装 terminal-notifier 后,点击通知可自动打开终端 ",-1)])]),_:1}),c(d(K),{code:"",style:{display:"block","margin-top":"8px","font-size":"12px"}},{default:u(()=>[...a[59]||(a[59]=[h(" brew install terminal-notifier ",-1)])]),_:1})])]),_:1})):i("",!0),"browser"===Te.value[e.key].type?(n(),g(d(pe),{key:1,type:"info",bordered:!1,style:{"margin-top":"16px"}},{default:u(()=>[h(" 当前权限状态:"+m(Ee.value),1)]),_:1})):i("",!0)])):i("",!0)])]),l<me.length-1?(n(),g(d(de),{key:0})):i("",!0)],64))),64)),c(d(de)),o("div",Bc,[o("div",Rc,[c(d(K),{strong:""},{default:u(()=>[...a[60]||(a[60]=[h("远程通知渠道",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[61]||(a[61]=[h(" 支持微信、QQ、飞书、企业微信、钉钉、Telegram ",-1)])]),_:1})]),o("div",Fc,[o("div",Hc,[c(d(ee),{value:Oe.value,"onUpdate:value":a[2]||(a[2]=e=>Oe.value=e),options:d(be),size:"small",style:{"max-width":"220px"}},null,8,["value","options"]),c(d(F),{size:"small",secondary:"",type:"primary",onClick:Fe},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[62]||(a[62]=h(" 添加渠道 ",-1))]),_:1})]),0===Te.value.remoteNotifications.providers.length?(n(),g(d(Q),{key:0,description:"还没有远程通知渠道",style:{padding:"20px 0"}})):i("",!0),(n(!0),s(f,null,y(Te.value.remoteNotifications.providers,e=>{return n(),s("div",{key:e.id,class:"remote-provider-card"},[o("div",Gc,[o("div",Kc,[o("div",qc,m((l=e.type,ge[l]||"通")),1),o("div",Wc,[o("div",Vc,[c(d(K),{strong:""},{default:u(()=>[h(m(e.name||Ue(e.type)),1)]),_:2},1024),c(d(H),{size:"tiny",bordered:!1,type:e.enabled?"success":"default"},{default:u(()=>[h(m(e.enabled?"已启用":"未启用"),1)]),_:2},1032,["type"])]),c(d(K),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[h(m(Pe(e.type)),1)]),_:2},1024)])]),c(d(ae),{size:"small",align:"center"},{default:u(()=>[c(d(G),{value:e.enabled,"onUpdate:value":a=>e.enabled=a,size:"small"},null,8,["value","onUpdate:value"]),c(d(F),{size:"small",quaternary:"",circle:"",type:"error",onClick:a=>{return l=e.id,void(Te.value.remoteNotifications.providers=Te.value.remoteNotifications.providers.filter(e=>e.id!==l));var l}},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1},8,["onClick"])]),_:2},1024)]),o("div",Jc,[o("div",Zc,[a[63]||(a[63]=o("span",{class:"remote-field-label"},"渠道名称",-1)),c(d(ne),{value:e.name,"onUpdate:value":a=>e.name=a,size:"small",placeholder:"例如:我的飞书"},null,8,["value","onUpdate:value"])]),"wechatBot"===e.type?(n(),s(f,{key:0},[o("div",Qc,[a[64]||(a[64]=o("span",{class:"remote-field-label"},"token.json 路径",-1)),c(d(ne),{value:e.config.tokenFile,"onUpdate:value":a=>e.config.tokenFile=a,size:"small",placeholder:"~/.wxbot/token.json"},null,8,["value","onUpdate:value"])]),o("div",Yc,[a[65]||(a[65]=o("span",{class:"remote-field-label"},"Token",-1)),c(d(ne),{value:e.config.botToken,"onUpdate:value":a=>e.config.botToken=a,size:"small",type:"password","show-password-on":"click",placeholder:"可直接填写 token"},null,8,["value","onUpdate:value"])]),o("div",Xc,[a[66]||(a[66]=o("span",{class:"remote-field-label"},"接收用户 ID",-1)),c(d(ne),{value:e.config.targetUserId,"onUpdate:value":a=>e.config.targetUserId=a,size:"small",placeholder:"user id"},null,8,["value","onUpdate:value"])]),o("div",eu,[a[67]||(a[67]=o("span",{class:"remote-field-label"},"Context Token",-1)),c(d(ne),{value:e.config.contextToken,"onUpdate:value":a=>e.config.contextToken=a,size:"small",placeholder:"可选"},null,8,["value","onUpdate:value"])])],64)):"qqBot"===e.type?(n(),s(f,{key:1},[o("div",au,[a[68]||(a[68]=o("span",{class:"remote-field-label"},"OneBot HTTP 地址",-1)),c(d(ne),{value:e.config.endpoint,"onUpdate:value":a=>e.config.endpoint=a,size:"small",placeholder:"http://127.0.0.1:3000"},null,8,["value","onUpdate:value"])]),o("div",lu,[a[69]||(a[69]=o("span",{class:"remote-field-label"},"Access Token",-1)),c(d(ne),{value:e.config.accessToken,"onUpdate:value":a=>e.config.accessToken=a,size:"small",type:"password","show-password-on":"click",placeholder:"可选"},null,8,["value","onUpdate:value"])]),o("div",tu,[a[70]||(a[70]=o("span",{class:"remote-field-label"},"接收类型",-1)),c(d(ee),{value:e.config.targetType,"onUpdate:value":a=>e.config.targetType=a,size:"small",options:we},null,8,["value","onUpdate:value"])]),o("div",su,[a[71]||(a[71]=o("span",{class:"remote-field-label"},"用户号或群号",-1)),c(d(ne),{value:e.config.targetId,"onUpdate:value":a=>e.config.targetId=a,size:"small",placeholder:"QQ ID"},null,8,["value","onUpdate:value"])])],64)):"feishuBot"===e.type?(n(),s("div",nu,[a[72]||(a[72]=o("span",{class:"remote-field-label"},"Webhook URL",-1)),c(d(ne),{value:e.config.webhookUrl,"onUpdate:value":a=>e.config.webhookUrl=a,size:"small",placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/..."},null,8,["value","onUpdate:value"])])):"wecomBot"===e.type?(n(),s("div",ou,[a[73]||(a[73]=o("span",{class:"remote-field-label"},"Webhook URL",-1)),c(d(ne),{value:e.config.webhookUrl,"onUpdate:value":a=>e.config.webhookUrl=a,size:"small",placeholder:"企业微信群机器人 Webhook URL"},null,8,["value","onUpdate:value"])])):"dingtalkBot"===e.type?(n(),s(f,{key:4},[o("div",iu,[a[74]||(a[74]=o("span",{class:"remote-field-label"},"接入模式",-1)),c(d(ee),{value:e.config.mode,"onUpdate:value":a=>e.config.mode=a,size:"small",options:ke},null,8,["value","onUpdate:value"])]),"app"===e.config.mode?(n(),s(f,{key:0},[o("div",ru,[a[75]||(a[75]=o("span",{class:"remote-field-label"},"App Key",-1)),c(d(ne),{value:e.config.clientId,"onUpdate:value":a=>e.config.clientId=a,size:"small",placeholder:"Client ID"},null,8,["value","onUpdate:value"])]),o("div",cu,[a[76]||(a[76]=o("span",{class:"remote-field-label"},"App Secret",-1)),c(d(ne),{value:e.config.clientSecret,"onUpdate:value":a=>e.config.clientSecret=a,size:"small",type:"password","show-password-on":"click",placeholder:"Secret"},null,8,["value","onUpdate:value"])]),o("div",uu,[a[77]||(a[77]=o("span",{class:"remote-field-label"},"接收类型",-1)),c(d(ee),{value:e.config.targetType,"onUpdate:value":a=>e.config.targetType=a,size:"small",options:_e},null,8,["value","onUpdate:value"])]),o("div",du,[a[78]||(a[78]=o("span",{class:"remote-field-label"},"接收对象 ID",-1)),c(d(ne),{value:e.config.targetId,"onUpdate:value":a=>e.config.targetId=a,size:"small",placeholder:"用户 ID 或群会话 ID"},null,8,["value","onUpdate:value"])])],64)):(n(),s("div",pu,[a[79]||(a[79]=o("span",{class:"remote-field-label"},"Webhook URL",-1)),c(d(ne),{value:e.config.webhookUrl,"onUpdate:value":a=>e.config.webhookUrl=a,size:"small",placeholder:"钉钉自定义机器人 Webhook URL"},null,8,["value","onUpdate:value"])]))],64)):"telegramBot"===e.type?(n(),s(f,{key:5},[o("div",vu,[a[80]||(a[80]=o("span",{class:"remote-field-label"},"Token",-1)),c(d(ne),{value:e.config.botToken,"onUpdate:value":a=>e.config.botToken=a,size:"small",type:"password","show-password-on":"click",placeholder:"Telegram token"},null,8,["value","onUpdate:value"])]),o("div",mu,[a[81]||(a[81]=o("span",{class:"remote-field-label"},"Chat ID",-1)),c(d(ne),{value:e.config.chatId,"onUpdate:value":a=>e.config.chatId=a,size:"small",placeholder:"Chat ID"},null,8,["value","onUpdate:value"])]),o("div",fu,[a[82]||(a[82]=o("span",{class:"remote-field-label"},"Proxy",-1)),c(d(ne),{value:e.config.proxy,"onUpdate:value":a=>e.config.proxy=a,size:"small",placeholder:"可选,例如 http://127.0.0.1:2082"},null,8,["value","onUpdate:value"])])],64)):i("",!0)]),o("div",yu,[c(d(F),{size:"small",secondary:"",loading:Ae.value===e.id,onClick:a=>async function(e){Ae.value=e.id;try{const a=await fetch("/api/hooks/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e})}),l=await a.json().catch(()=>({}));if(!a.ok)throw new Error(l.error||"测试通知发送失败");Ds.success(l.message||"测试通知已发送")}catch(a){Ds.error("测试失败:"+a.message)}finally{Ae.value=""}}(e)},{default:u(()=>[...a[83]||(a[83]=[h(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h(m(Se(e.type)),1)]),_:2},1024)])]);var l}),128))])])])]),o("div",gu,[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{size:"large",onClick:a[3]||(a[3]=e=>z.value=!1)},{default:u(()=>[...a[84]||(a[84]=[h(" 取消 ",-1)])]),_:1}),c(d(F),{type:"primary",size:"large",loading:Me.value,disabled:JSON.stringify(Te.value)===JSON.stringify(Ie.value),onClick:el},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Pa))]),_:1})]),default:u(()=>[a[85]||(a[85]=h(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[b,"notification"===T.value]]),r(o("div",hu,[o("div",bu,[o("div",wu,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(ka))]),_:1}),o("div",null,[a[87]||(a[87]=o("h3",{class:"panel-title"},"高级设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[86]||(a[86]=[h("端口配置和高级选项",-1)])]),_:1})])])]),o("div",ku,[o("div",_u,[o("div",xu,[o("div",Cu,[c(d(K),{strong:""},{default:u(()=>[...a[88]||(a[88]=[h("端口配置",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[89]||(a[89]=[h(" 修改后需要重启服务器才能生效 ",-1)])]),_:1})]),o("div",Uu,[o("div",Pu,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[90]||(a[90]=[h("Web UI 端口",-1)])]),_:1}),c(d(oe),{value:j.value.webUI,"onUpdate:value":a[4]||(a[4]=e=>j.value.webUI=e),min:1024,max:65535,"show-button":!1,placeholder:"19999"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Be))]),_:1})]),_:1},8,["value"])]),o("div",Su,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[91]||(a[91]=[h("Claude 代理",-1)])]),_:1}),c(d(oe),{value:j.value.proxy,"onUpdate:value":a[5]||(a[5]=e=>j.value.proxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20088"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(ka))]),_:1})]),_:1},8,["value"])]),o("div",zu,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[92]||(a[92]=[h("Codex 代理",-1)])]),_:1}),c(d(oe),{value:j.value.codexProxy,"onUpdate:value":a[6]||(a[6]=e=>j.value.codexProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20089"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(ka))]),_:1})]),_:1},8,["value"])]),o("div",Tu,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[93]||(a[93]=[h("Gemini 代理",-1)])]),_:1}),c(d(oe),{value:j.value.geminiProxy,"onUpdate:value":a[7]||(a[7]=e=>j.value.geminiProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20090"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(ka))]),_:1})]),_:1},8,["value"])]),o("div",Iu,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[94]||(a[94]=[h("OpenCode 代理",-1)])]),_:1}),c(d(oe),{value:j.value.opencodeProxy,"onUpdate:value":a[8]||(a[8]=e=>j.value.opencodeProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20091"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(ka))]),_:1})]),_:1},8,["value"])]),o("div",Mu,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[95]||(a[95]=[h("OMP 托管端口",-1)])]),_:1}),c(d(oe),{value:j.value.ompProxy,"onUpdate:value":a[9]||(a[9]=e=>j.value.ompProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20092"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(ka))]),_:1})]),_:1},8,["value"])])])]),c(d(de)),o("div",Au,[o("div",Ou,[c(d(K),{strong:""},{default:u(()=>[...a[96]||(a[96]=[h("负载均衡",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[97]||(a[97]=[h(" 多渠道负载均衡时的分配策略 ",-1)])]),_:1})]),o("div",$u,[o("div",ju,[o("div",Lu,[c(d(K),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[98]||(a[98]=[h("多渠道负载会话绑定",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[99]||(a[99]=[h("开启后同一对话始终使用同一渠道,保证上下文连续性",-1)])]),_:1})]),c(d(G),{value:ie.value.enableSessionBinding,"onUpdate:value":[a[10]||(a[10]=e=>ie.value.enableSessionBinding=e),Xa],size:"medium"},null,8,["value"])])])]),c(d(de)),o("div",Eu,[o("div",Du,[c(d(K),{strong:""},{default:u(()=>[...a[100]||(a[100]=[h("日志和性能",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[101]||(a[101]=[h(" 控制日志显示和数据刷新行为 ",-1)])]),_:1})]),o("div",Nu,[o("div",Bu,[o("div",Ru,[c(d(K),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[102]||(a[102]=[h("实时日志保留数量",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[103]||(a[103]=[h("超过此数量将自动清理旧日志",-1)])]),_:1})]),c(d(oe),{value:ie.value.maxLogs,"onUpdate:value":a[11]||(a[11]=e=>ie.value.maxLogs=e),min:50,max:500,step:10,style:{width:"140px"}},{suffix:u(()=>[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[104]||(a[104]=[h("条",-1)])]),_:1})]),_:1},8,["value"])]),o("div",Fu,[o("div",Hu,[c(d(K),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[105]||(a[105]=[h("统计数据刷新间隔",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[106]||(a[106]=[h("自动刷新今日统计的时间间隔",-1)])]),_:1})]),c(d(oe),{value:ie.value.statsInterval,"onUpdate:value":a[12]||(a[12]=e=>ie.value.statsInterval=e),min:10,max:300,step:5,style:{width:"140px"}},{suffix:u(()=>[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[107]||(a[107]=[h("秒",-1)])]),_:1})]),_:1},8,["value"])])])]),c(d(de)),o("div",Gu,[o("div",Ku,[c(d(K),{strong:""},{default:u(()=>[...a[108]||(a[108]=[h("开机自启",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[109]||(a[109]=[h(" 启用此选项后,重启电脑时 coding-tool-x 会自动启动 ",-1)])]),_:1})]),o("div",qu,[o("div",Wu,[o("div",Vu,[c(d(K),{strong:"",style:{flex:"1"}},{default:u(()=>[h(m(Y.value),1)]),_:1}),V.value?(n(),g(d(F),{key:1,type:"warning",size:"small",loading:J.value,onClick:ol},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Sa))]),_:1})]),default:u(()=>[a[111]||(a[111]=h(" 禁用自启 ",-1))]),_:1},8,["loading"])):(n(),g(d(F),{key:0,type:"primary",size:"small",loading:J.value,onClick:nl},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Be))]),_:1})]),default:u(()=>[a[110]||(a[110]=h(" 启用自启 ",-1))]),_:1},8,["loading"]))]),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h(m(X.value),1)]),_:1})])])])])]),o("div",Ju,[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{size:"large",onClick:a[13]||(a[13]=e=>z.value=!1)},{default:u(()=>[...a[112]||(a[112]=[h(" 取消 ",-1)])]),_:1}),c(d(F),{type:"primary",size:"large",loading:D.value,disabled:!Da.value,onClick:sl},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Pa))]),_:1})]),default:u(()=>[a[113]||(a[113]=h(" 保存端口配置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[b,"advanced"===T.value]]),r(o("div",Zu,[o("div",Qu,[o("div",Yu,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(_a))]),_:1}),o("div",null,[a[115]||(a[115]=o("h3",{class:"panel-title"},"安全设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[114]||(a[114]=[h("设置访问密码,保护面板访问",-1)])]),_:1})])])]),o("div",Xu,[o("div",ed,[o("div",ad,[o("div",ld,[c(d(K),{strong:""},{default:u(()=>[...a[116]||(a[116]=[h("访问保护",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[117]||(a[117]=[h(" 启用后,重新打开面板时需要先输入访问密码 ",-1)])]),_:1})]),o("div",td,[He.value.hasPassword?(n(),g(d(H),{key:0,type:"success",bordered:!1},{default:u(()=>[...a[118]||(a[118]=[h(" 已启用 ",-1)])]),_:1})):(n(),g(d(H),{key:1,type:"warning",bordered:!1},{default:u(()=>[...a[119]||(a[119]=[h(" 未启用 ",-1)])]),_:1}))])]),c(d(de)),o("div",sd,[o("div",nd,[c(d(K),{strong:""},{default:u(()=>[h(m(He.value.hasPassword?"修改密码":"设置密码"),1)]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[120]||(a[120]=[h(" 密码至少 4 位,建议包含数字与字母 ",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px","margin-top":"4px"}},{default:u(()=>[a[122]||(a[122]=h(" 忘记密码可在终端执行 ",-1)),c(d(K),{code:""},{default:u(()=>[...a[121]||(a[121]=[h("ctx security reset",-1)])]),_:1}),a[123]||(a[123]=h(" 关闭密码 ",-1))]),_:1})]),o("div",od,[He.value.hasPassword?(n(),g(d(ne),{key:0,value:Ve.value.currentPassword,"onUpdate:value":a[14]||(a[14]=e=>Ve.value.currentPassword=e),type:"password",placeholder:"当前密码","show-password-on":"click"},null,8,["value"])):i("",!0),c(d(ne),{value:Ve.value.newPassword,"onUpdate:value":a[15]||(a[15]=e=>Ve.value.newPassword=e),type:"password",placeholder:"新密码","show-password-on":"click"},null,8,["value"]),c(d(ne),{value:Ve.value.confirmPassword,"onUpdate:value":a[16]||(a[16]=e=>Ve.value.confirmPassword=e),type:"password",placeholder:"确认新密码","show-password-on":"click"},null,8,["value"]),Ra.value?(n(),g(d(K),{key:1,depth:"3",class:"security-error"},{default:u(()=>[h(m(Ra.value),1)]),_:1})):i("",!0)])])])]),o("div",id,[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{size:"large",onClick:a[17]||(a[17]=e=>z.value=!1)},{default:u(()=>[...a[124]||(a[124]=[h(" 取消 ",-1)])]),_:1}),c(d(F),{type:"primary",size:"large",loading:Je.value,disabled:!Fa.value,onClick:tl},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Pa))]),_:1})]),default:u(()=>[a[125]||(a[125]=h(" 保存密码 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[b,"security"===T.value]]),r(o("div",rd,[o("div",cd,[o("div",ud,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(ra))]),_:1}),o("div",null,[a[127]||(a[127]=o("h3",{class:"panel-title"},"模型设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[126]||(a[126]=[h("管理默认测速模型、模型上下文窗口和定价信息",-1)])]),_:1})])])]),o("div",dd,[c(d(Z),{show:Qe.value},{default:u(()=>[o("div",pd,[o("div",vd,[c(d(K),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[128]||(a[128]=[h("默认测速模型",-1)])]),_:1}),o("div",md,[(n(),s(f,null,y(ua,e=>o("div",{key:e.key,class:"speed-test-default-row"},[o("div",fd,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h(m(e.label),1)]),_:2},1024)]),c(d(ee),{value:ia.value[e.key],"onUpdate:value":a=>ia.value[e.key]=a,options:Aa.value[e.key],placeholder:`选择${e.label}默认测速模型`,disabled:0===(Aa.value[e.key]||[]).length,size:"small",filterable:""},null,8,["value","onUpdate:value","options","placeholder","disabled"])])),64))])])]),o("div",yd,[c(d(ne),{value:la.value,"onUpdate:value":a[18]||(a[18]=e=>la.value=e),placeholder:"搜索模型 ID...",clearable:"",size:"small",style:{flex:"1","min-width":"0"}},null,8,["value"]),c(d(F),{size:"small",type:"primary",onClick:fa},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[129]||(a[129]=h(" 新增 ",-1))]),_:1})]),o("div",gd,[c(d(le),{value:ta.value,"onUpdate:value":a[19]||(a[19]=e=>ta.value=e),size:"small"},{default:u(()=>[c(d(te),{value:"all"},{default:u(()=>[...a[130]||(a[130]=[h("全部",-1)])]),_:1}),c(d(te),{value:"claude"},{default:u(()=>[...a[131]||(a[131]=[h("Claude",-1)])]),_:1}),c(d(te),{value:"openai"},{default:u(()=>[...a[132]||(a[132]=[h("OpenAI",-1)])]),_:1}),c(d(te),{value:"gemini"},{default:u(()=>[...a[133]||(a[133]=[h("Gemini",-1)])]),_:1}),c(d(te),{value:"overrides"},{default:u(()=>[...a[134]||(a[134]=[h("自定义",-1)])]),_:1})]),_:1},8,["value"])]),0===Ia.value.length?(n(),s("div",hd,[c(d(Q),{description:"没有匹配的模型"})])):(n(),s("div",bd,[(n(!0),s(f,null,y(Ia.value,e=>(n(),s("div",{key:e,class:p(["model-card",{expanded:da.value.has(e)}])},[o("div",{class:"model-card-header",onClick:a=>(e=>{da.value.has(e)?da.value.delete(e):da.value.add(e),da.value=new Set(da.value)})(e)},[c(d(R),{size:"14",class:"expand-icon"},{default:u(()=>[c(d(za))]),_:1}),o("span",kd,m(e),1),ea.value[e]?(n(),g(d(H),{key:0,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[...a[135]||(a[135]=[h("自定义",-1)])]),_:1})):i("",!0),o("div",{class:"model-card-actions",onClick:a[20]||(a[20]=v(()=>{},["stop"]))},[ea.value[e]&&ha(e)?(n(),g(d(F),{key:0,size:"tiny",quaternary:"",type:"warning",onClick:a=>async function(e){try{await C(e),delete ea.value[e],delete aa.value[e],await ja(),Ds.success(`${e} 已重置为内置默认值`)}catch(a){Ds.error("重置失败:"+a.message)}}(e)},{default:u(()=>[...a[136]||(a[136]=[h(" 重置 ",-1)])]),_:1},8,["onClick"])):i("",!0),Ta(e)?(n(),g(d(F),{key:1,size:"tiny",quaternary:"",type:"error",onClick:a=>async function(e){try{const a=!!ea.value[e];a&&(await C(e),delete ea.value[e]),delete aa.value[e],Ta(e)?delete Xe.value[e]:a&&await ja(),Ds.success(`已删除模型:${e}`)}catch(a){Ds.error("删除失败:"+a.message)}}(e)},{default:u(()=>[...a[137]||(a[137]=[h(" 删除 ",-1)])]),_:1},8,["onClick"])):i("",!0)])],8,wd),da.value.has(e)?(n(),s("div",_d,[o("div",xd,[o("div",Cd,[c(d(K),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[138]||(a[138]=[h("上下文限制",-1)])]),_:1}),o("div",Ud,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[139]||(a[139]=[h("Context 窗口 (tokens)",-1)])]),_:1}),c(d(oe),{value:Oa(e,"limit","context"),"onUpdate:value":a=>$a(e,"limit","context",a),min:1e3,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[140]||(a[140]=[h("Max Output (tokens)",-1)])]),_:1}),c(d(oe),{value:Oa(e,"limit","output"),"onUpdate:value":a=>$a(e,"limit","output",a),min:100,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])]),o("div",Pd,[c(d(K),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[141]||(a[141]=[h("定价(USD / 百万 tokens)",-1)])]),_:1}),o("div",Sd,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[142]||(a[142]=[h("输入价格",-1)])]),_:1}),c(d(oe),{value:Oa(e,"pricing","input"),"onUpdate:value":a=>$a(e,"pricing","input",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[143]||(a[143]=[h("输出价格",-1)])]),_:1}),c(d(oe),{value:Oa(e,"pricing","output"),"onUpdate:value":a=>$a(e,"pricing","output",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[144]||(a[144]=[h("缓存写入价格",-1)])]),_:1}),c(d(oe),{value:Oa(e,"pricing","cacheCreation"),"onUpdate:value":a=>$a(e,"pricing","cacheCreation",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[145]||(a[145]=[h("缓存读取价格",-1)])]),_:1}),c(d(oe),{value:Oa(e,"pricing","cacheRead"),"onUpdate:value":a=>$a(e,"pricing","cacheRead",a),min:0,step:.01,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])])])])):i("",!0)],2))),128))]))]),_:1},8,["show"])]),o("div",zd,[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{size:"large",onClick:Ea,disabled:0===Object.keys(ea.value).length},{default:u(()=>[...a[146]||(a[146]=[h(" 重置全部 ",-1)])]),_:1},8,["disabled"]),c(d(F),{type:"primary",size:"large",loading:Ye.value,disabled:!va.value,onClick:La},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Pa))]),_:1})]),default:u(()=>[a[147]||(a[147]=h(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[b,"model-settings"===T.value]])])]),c(d(se),{show:sa.value,"onUpdate:show":a[28]||(a[28]=e=>sa.value=e),preset:"card",title:"新增模型设置",style:{width:"560px"},"mask-closable":!1},{default:u(()=>[c(d(ae),{vertical:"",size:12},{default:u(()=>[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[148]||(a[148]=[h("模型 ID",-1)])]),_:1}),c(d(ne),{value:na.value.modelId,"onUpdate:value":a[21]||(a[21]=e=>na.value.modelId=e),placeholder:"例如:gpt-4.1-mini",clearable:""},null,8,["value"])]),o("div",Td,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[149]||(a[149]=[h("Context 窗口",-1)])]),_:1}),c(d(oe),{value:na.value.context,"onUpdate:value":a[22]||(a[22]=e=>na.value.context=e),min:1e3,step:1e3,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[150]||(a[150]=[h("Max Output",-1)])]),_:1}),c(d(oe),{value:na.value.output,"onUpdate:value":a[23]||(a[23]=e=>na.value.output=e),min:100,step:100,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),o("div",Id,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[151]||(a[151]=[h("输入价格",-1)])]),_:1}),c(d(oe),{value:na.value.inputPrice,"onUpdate:value":a[24]||(a[24]=e=>na.value.inputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[152]||(a[152]=[h("输出价格",-1)])]),_:1}),c(d(oe),{value:na.value.outputPrice,"onUpdate:value":a[25]||(a[25]=e=>na.value.outputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),o("div",Md,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[153]||(a[153]=[h("缓存写入价格",-1)])]),_:1}),c(d(oe),{value:na.value.cacheCreationPrice,"onUpdate:value":a[26]||(a[26]=e=>na.value.cacheCreationPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[154]||(a[154]=[h("缓存读取价格",-1)])]),_:1}),c(d(oe),{value:na.value.cacheReadPrice,"onUpdate:value":a[27]||(a[27]=e=>na.value.cacheReadPrice=e),min:0,step:.01,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),ma.value?(n(),g(d(K),{key:0,depth:"3",class:"security-error"},{default:u(()=>[h(m(ma.value),1)]),_:1})):i("",!0),c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:ya},{default:u(()=>[...a[155]||(a[155]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",disabled:!!ma.value,onClick:ga},{default:u(()=>[...a[156]||(a[156]=[h(" 新增 ",-1)])]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-9c23d322"]]);async function Od(e){return(await ct.post("/mcp/servers",e)).data}function $d(e,a="操作失败"){const l=String(function(e){var a,l,t,s,n,o,i,r,c,u,d,p,v,m;return e?"string"==typeof e?e:e.message||e.error||(null==(a=e.result)?void 0:a.message)||(null==(l=e.result)?void 0:l.error)||(null==(s=null==(t=e.response)?void 0:t.data)?void 0:s.message)||(null==(o=null==(n=e.response)?void 0:n.data)?void 0:o.error)||(null==(c=null==(r=null==(i=e.response)?void 0:i.data)?void 0:r.result)?void 0:c.message)||(null==(p=null==(d=null==(u=e.response)?void 0:u.data)?void 0:d.result)?void 0:p.error)||(null==(v=e.data)?void 0:v.message)||(null==(m=e.data)?void 0:m.error)||"":""}(e)||"").trim();return l||a}function jd(e,a,l="操作失败",t=""){const s=$d(a,l),n=function(e){var a,l,t,s,n,o,i,r,c,u,d,p,v;return(null==e?void 0:e.hint)||(null==(a=null==e?void 0:e.data)?void 0:a.hint)||(null==(l=null==e?void 0:e.result)?void 0:l.hint)||(null==(s=null==(t=null==e?void 0:e.result)?void 0:t.data)?void 0:s.hint)||(null==(o=null==(n=null==e?void 0:e.response)?void 0:n.data)?void 0:o.hint)||(null==(c=null==(r=null==(i=null==e?void 0:e.response)?void 0:i.data)?void 0:r.result)?void 0:c.hint)||(null==(v=null==(p=null==(d=null==(u=null==e?void 0:e.response)?void 0:u.data)?void 0:d.result)?void 0:p.data)?void 0:v.hint)||null}(a),o=s.split(/\r?\n/).map(e=>e.trim()).filter(Boolean),i=[null==n?void 0:n.title,...Array.isArray(null==n?void 0:n.details)?n.details:[]].map(e=>String(e||"").trim()).filter(Boolean).filter(e=>!o.includes(e)),r=[...o,...i],c=r[0]||l,u=r.slice(1),d=t?`${t}${c}`:c;return e.error(d,{duration:u.length>0?8e3:5e3}),u.length>0&&e.warning(u.join("\n"),{duration:12e3,closable:!0}),s}const Ld={class:"drawer-header"},Ed={class:"header-title"},Dd={class:"drawer-footer"},Nd={class:"form-content"},Bd={key:0,class:"form-group"},Rd={class:"group-title"},Fd={class:"preset-grid"},Hd=["onClick"],Gd={class:"form-group"},Kd={class:"group-title"},qd={class:"field"},Wd={key:0,class:"field-error"},Vd={class:"field"},Jd={class:"form-group"},Zd={class:"group-title"},Qd={class:"platform-toggles"},Yd={class:"platform-item"},Xd={class:"platform-item"},ep={class:"platform-item"},ap={class:"platform-item"},lp={class:"platform-item"},tp={class:"form-group"},sp={class:"group-title"},np={class:"field"},op={class:"field"},ip={class:"field"},rp={class:"field"},cp={class:"kv-row"},up={class:"field"},dp={class:"field"},pp={class:"kv-row"},vp={class:"collapse-header"},mp={class:"collapse-content"},fp={class:"field"},yp={class:"field"},gp={class:"field-row"},hp={class:"field"},bp={class:"field"},wp=zl({__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:r}=ei(520),v=e,b=a,w=t({get:()=>v.visible,set:e=>b("update:visible",e)}),k=t(()=>!!v.editingServer),C=l([]),U=l(!1),P=l(-1),S=l(!1),z=_({id:"",name:"",description:"",homepage:"",docs:"",apps:{claude:!0,codex:!1,gemini:!1,opencode:!1,omp:!1},server:{type:"stdio",command:"",args:[],env:{},url:"",headers:{}}}),T=l("stdio"),I=l([]),M=l([]),A=l(""),O=t(()=>z.id.trim()&&!k.value&&v.existingIds.includes(z.id.trim())?"该 ID 已存在":"");function $(e){return v.existingIds.includes(e)}async function j(){U.value=!0;try{const e=await async function(){return(await ct.get("/mcp/presets")).data}();e.success&&(C.value=e.presets)}catch(e){}finally{U.value=!1}}function L(){P.value=-1,E()}function E(){z.id="",z.name="",z.description="",z.homepage="",z.docs="",z.apps={claude:!0,codex:!1,gemini:!1,opencode:!1,omp:!1},z.server={type:"stdio",command:"",args:[],env:{},url:"",headers:{}},T.value="stdio",I.value=[],M.value=[],A.value=""}async function D(){var e,a,l,t,s;if(!z.id.trim())return void Ds.error("请输入服务器 ID");if(O.value)return void Ds.error(O.value);if("stdio"===T.value&&!(null==(e=z.server.command)?void 0:e.trim()))return void Ds.error("请输入命令");if(("streamable_http"===T.value||"sse"===T.value)&&!(null==(a=z.server.url)?void 0:a.trim()))return void Ds.error("请输入 URL");const n={type:T.value};if("stdio"===T.value){n.command=z.server.command,(null==(l=z.server.args)?void 0:l.length)&&(n.args=z.server.args.filter(e=>e.trim()));const e={};I.value.forEach(a=>{a.key.trim()&&(e[a.key.trim()]=a.value)}),Object.keys(e).length>0&&(n.env=e)}else{n.url=z.server.url;const e={};M.value.forEach(a=>{a.key.trim()&&(e[a.key.trim()]=a.value)}),Object.keys(e).length>0&&(n.headers=e)}const o={id:z.id.trim(),name:z.name.trim()||z.id.trim(),server:n,apps:z.apps};z.description.trim()&&(o.description=z.description.trim()),z.homepage.trim()&&(o.homepage=z.homepage.trim()),z.docs.trim()&&(o.docs=z.docs.trim()),A.value.trim()&&(o.tags=A.value.split(",").map(e=>e.trim()).filter(e=>e)),S.value=!0;try{(await Od(o)).success&&(Ds.success(k.value?"保存成功":"添加成功"),b("saved"),w.value=!1)}catch(i){Ds.error((null==(s=null==(t=i.response)?void 0:t.data)?void 0:s.error)||"保存失败")}finally{S.value=!1}}return x(()=>v.visible,e=>{e&&(j(),v.editingServer?function(){const e=v.editingServer;e&&(z.id=e.id,z.name=e.name||"",z.description=e.description||"",z.homepage=e.homepage||"",z.docs=e.docs||"",z.apps={claude:!0,codex:!1,gemini:!1,opencode:!1,omp:!1,...e.apps},A.value=(e.tags||[]).join(", "),e.server&&(T.value=e.server.type||"stdio",z.server={...e.server},z.server.type=T.value,e.server.env?I.value=Object.entries(e.server.env).map(([e,a])=>({key:e,value:a})):I.value=[],e.server.headers?M.value=Object.entries(e.server.headers).map(([e,a])=>({key:e,value:a})):M.value=[]))}():(E(),P.value=-1))}),x(T,e=>{z.server.type=e}),(e,a)=>(n(),g(d(ce),{show:w.value,"onUpdate:show":a[19]||(a[19]=e=>w.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",Ld,[c(d(F),{quaternary:"",size:"small",onClick:a[0]||(a[0]=e=>w.value=!1)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d($a))]),_:1})]),_:1}),o("span",Ed,m(k.value?"编辑 MCP 服务器":"添加 MCP 服务器"),1)])]),footer:u(()=>[o("div",Dd,[c(d(F),{onClick:a[1]||(a[1]=e=>w.value=!1)},{default:u(()=>[...a[20]||(a[20]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:S.value,onClick:D},{default:u(()=>[h(m(k.value?"保存":"添加"),1)]),_:1},8,["loading"])])]),default:u(()=>[c(d(Z),{show:U.value},{default:u(()=>[o("div",Nd,[k.value?i("",!0):(n(),s("div",Bd,[o("div",Rd,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d(Ta))]),_:1}),a[21]||(a[21]=o("span",null,"快速选择",-1))]),o("div",Fd,[o("div",{class:p(["preset-chip",{active:-1===P.value}]),onClick:L},[c(d(R),{size:14},{default:u(()=>[c(d(Ke))]),_:1}),a[22]||(a[22]=o("span",null,"自定义",-1))],2),(n(!0),s(f,null,y(C.value,(e,l)=>(n(),g(d(ie),{key:e.id,disabled:!$(e.id)},{trigger:u(()=>[o("div",{class:p(["preset-chip",{active:P.value===l,disabled:$(e.id)}]),onClick:a=>!$(e.id)&&function(e){P.value=e;const a=C.value[e];if(!a)return;let l=a.id,t=1;for(;v.existingIds.includes(l);)l=`${a.id}-${t}`,t++;z.id=l,z.name=a.name||a.id,z.description=a.description||"",z.homepage=a.homepage||"",z.docs=a.docs||"",A.value=(a.tags||[]).join(", "),a.server&&(T.value=a.server.type||"stdio",z.server={...a.server},z.server.type=T.value,a.server.env?I.value=Object.entries(a.server.env).map(([e,a])=>({key:e,value:a})):I.value=[],a.server.headers?M.value=Object.entries(a.server.headers).map(([e,a])=>({key:e,value:a})):M.value=[])}(l)},[h(m(e.id)+" ",1),$(e.id)?(n(),g(d(R),{key:0,size:12,class:"installed-icon"},{default:u(()=>[c(d(Be))]),_:1})):i("",!0)],10,Hd)]),default:u(()=>[a[23]||(a[23]=h(" 已安装 ",-1))]),_:2},1032,["disabled"]))),128))])])),o("div",Gd,[o("div",Kd,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d(Ia))]),_:1}),a[24]||(a[24]=o("span",null,"基本信息",-1))]),o("div",qd,[a[25]||(a[25]=o("label",{class:"field-label"},[h(" ID "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:z.id,"onUpdate:value":a[2]||(a[2]=e=>z.id=e),placeholder:"服务器唯一标识,如 fetch、memory",disabled:k.value,status:O.value?"error":void 0},null,8,["value","disabled","status"]),O.value?(n(),s("span",Wd,m(O.value),1)):i("",!0)]),o("div",Vd,[a[26]||(a[26]=o("label",{class:"field-label"},"显示名称",-1)),c(d(ne),{value:z.name,"onUpdate:value":a[3]||(a[3]=e=>z.name=e),placeholder:"可选,用于展示的名称"},null,8,["value"])])]),o("div",Jd,[o("div",Zd,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d(Ma))]),_:1}),a[27]||(a[27]=o("span",null,"启用平台",-1))]),o("div",Qd,[o("label",Yd,[c(d(G),{size:"small",value:z.apps.claude,"onUpdate:value":a[4]||(a[4]=e=>z.apps.claude=e)},null,8,["value"]),a[28]||(a[28]=o("span",{class:"platform-name"},"Claude",-1))]),o("label",Xd,[c(d(G),{size:"small",value:z.apps.codex,"onUpdate:value":a[5]||(a[5]=e=>z.apps.codex=e)},null,8,["value"]),a[29]||(a[29]=o("span",{class:"platform-name"},"Codex",-1))]),o("label",ep,[c(d(G),{size:"small",value:z.apps.gemini,"onUpdate:value":a[6]||(a[6]=e=>z.apps.gemini=e)},null,8,["value"]),a[30]||(a[30]=o("span",{class:"platform-name"},"Gemini",-1))]),o("label",ap,[c(d(G),{size:"small",value:z.apps.opencode,"onUpdate:value":a[7]||(a[7]=e=>z.apps.opencode=e)},null,8,["value"]),a[31]||(a[31]=o("span",{class:"platform-name"},"OpenCode",-1))]),o("label",lp,[c(d(G),{size:"small",value:z.apps.omp,"onUpdate:value":a[8]||(a[8]=e=>z.apps.omp=e)},null,8,["value"]),a[32]||(a[32]=o("span",{class:"platform-name"},"OMP",-1))])])]),o("div",tp,[o("div",sp,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d(Aa))]),_:1}),a[33]||(a[33]=o("span",null,"服务器配置",-1))]),o("div",np,[a[37]||(a[37]=o("label",{class:"field-label"},"类型",-1)),c(d(le),{value:T.value,"onUpdate:value":a[9]||(a[9]=e=>T.value=e),class:"type-radios"},{default:u(()=>[c(d(te),{value:"stdio"},{default:u(()=>[...a[34]||(a[34]=[o("span",{class:"radio-label"},"stdio",-1),o("span",{class:"radio-desc"},"本地命令",-1)])]),_:1}),c(d(te),{value:"streamable_http"},{default:u(()=>[...a[35]||(a[35]=[o("span",{class:"radio-label"},"streamable_http",-1)])]),_:1}),c(d(te),{value:"sse"},{default:u(()=>[...a[36]||(a[36]=[o("span",{class:"radio-label"},"sse",-1)])]),_:1})]),_:1},8,["value"])]),"stdio"===T.value?(n(),s(f,{key:0},[o("div",op,[a[38]||(a[38]=o("label",{class:"field-label"},[h(" 命令 "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:z.server.command,"onUpdate:value":a[10]||(a[10]=e=>z.server.command=e),placeholder:"如 npx、uvx、node"},null,8,["value"])]),o("div",ip,[a[39]||(a[39]=o("label",{class:"field-label"},"参数",-1)),c(d(ve),{value:z.server.args,"onUpdate:value":a[11]||(a[11]=e=>z.server.args=e),placeholder:"点击添加参数",min:0},null,8,["value"])]),o("div",rp,[a[41]||(a[41]=o("label",{class:"field-label"},"环境变量",-1)),c(d(ve),{value:I.value,"onUpdate:value":a[12]||(a[12]=e=>I.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:u(({value:e})=>[o("div",cp,[c(d(ne),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"变量名",class:"kv-key"},null,8,["value","onUpdate:value"]),a[40]||(a[40]=o("span",{class:"kv-sep"},"=",-1)),c(d(ne),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64)):(n(),s(f,{key:1},[o("div",up,[a[42]||(a[42]=o("label",{class:"field-label"},[h(" URL "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:z.server.url,"onUpdate:value":a[13]||(a[13]=e=>z.server.url=e),placeholder:"http://localhost:3000/mcp"},null,8,["value"])]),o("div",dp,[a[44]||(a[44]=o("label",{class:"field-label"},"请求头",-1)),c(d(ve),{value:M.value,"onUpdate:value":a[14]||(a[14]=e=>M.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:u(({value:e})=>[o("div",pp,[c(d(ne),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"Header 名",class:"kv-key"},null,8,["value","onUpdate:value"]),a[43]||(a[43]=o("span",{class:"kv-sep"},":",-1)),c(d(ne),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64))]),c(d(me),{class:"extra-collapse"},{default:u(()=>[c(d(fe),{name:"extra"},{header:u(()=>[o("div",vp,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d(Oa))]),_:1}),a[45]||(a[45]=o("span",null,"附加信息",-1)),a[46]||(a[46]=o("span",{class:"collapse-hint"},"(可选)",-1))])]),default:u(()=>[o("div",mp,[o("div",fp,[a[47]||(a[47]=o("label",{class:"field-label"},"描述",-1)),c(d(ne),{value:z.description,"onUpdate:value":a[15]||(a[15]=e=>z.description=e),type:"textarea",placeholder:"服务器功能描述",rows:2},null,8,["value"])]),o("div",yp,[a[48]||(a[48]=o("label",{class:"field-label"},"标签",-1)),c(d(ne),{value:A.value,"onUpdate:value":a[16]||(a[16]=e=>A.value=e),placeholder:"用逗号分隔,如 http, web, fetch"},null,8,["value"])]),o("div",gp,[o("div",hp,[a[49]||(a[49]=o("label",{class:"field-label"},"主页",-1)),c(d(ne),{value:z.homepage,"onUpdate:value":a[17]||(a[17]=e=>z.homepage=e),placeholder:"https://github.com/..."},null,8,["value"])]),o("div",bp,[a[50]||(a[50]=o("label",{class:"field-label"},"文档",-1)),c(d(ne),{value:z.docs,"onUpdate:value":a[18]||(a[18]=e=>z.docs=e),placeholder:"https://..."},null,8,["value"])])])])]),_:1})]),_:1})])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-3a372956"]]),kp={class:"tool-card"},_p={class:"tool-header"},xp={class:"tool-name"},Cp={key:0,class:"tool-description"},Up={key:1,class:"tool-parameters"},Pp={class:"params-header"},Sp={class:"params-list"},zp={class:"param-info"},Tp={class:"param-name"},Ip={key:0,class:"param-description"},Mp={key:2,class:"no-parameters"},Ap=zl({__name:"McpToolCard",props:{tool:{type:Object,required:!0}},emits:["test"],setup(e){const a=e,l=t(()=>{var e;return(null==(e=a.tool.inputSchema)?void 0:e.properties)||{}}),r=t(()=>{var e;return(null==(e=a.tool.inputSchema)?void 0:e.required)||[]}),p=t(()=>Object.keys(l.value).length>0);function v(e){return r.value.includes(e)}return(a,t)=>(n(),s("div",kp,[o("div",_p,[o("h3",xp,m(e.tool.name),1),c(d(F),{size:"small",type:"primary",quaternary:"",onClick:t[0]||(t[0]=e=>a.$emit("test"))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ja))]),_:1})]),default:u(()=>[t[1]||(t[1]=h(" 测试工具 ",-1))]),_:1})]),e.tool.description?(n(),s("p",Cp,m(e.tool.description),1)):i("",!0),p.value?(n(),s("div",Up,[o("div",Pp,[c(d(R),{size:14,class:"params-icon"},{default:u(()=>[c(d(xa))]),_:1}),t[2]||(t[2]=o("span",{class:"params-label"},"参数列表",-1))]),o("div",Sp,[(n(!0),s(f,null,y(l.value,(e,a)=>(n(),s("div",{key:a,class:"param-item"},[o("div",zp,[o("span",Tp,m(a),1),c(d(H),{type:v(a)?"error":"default",size:"tiny",bordered:!1},{default:u(()=>[h(m(v(a)?"必填":"可选"),1)]),_:2},1032,["type"]),e.type?(n(),g(d(H),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>{return[h(m((a=e.type,Array.isArray(a)?a.filter(e=>"null"!==e).join(" | "):a)),1)];var a}),_:2},1024)):i("",!0)]),e.description?(n(),s("p",Ip,m(e.description),1)):i("",!0)]))),128))])])):(n(),s("div",Mp,[c(d(K),{depth:"3"},{default:u(()=>[...t[3]||(t[3]=[h("无需参数",-1)])]),_:1})]))]))}},[["__scopeId","data-v-1fcd002c"]]),Op={class:"field-label"},$p={key:0,class:"required"},jp={key:0,class:"empty-schema"},Lp=zl({__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,r=a,v=t(()=>{var e;return(null==(e=l.schema)?void 0:e.properties)||{}}),b=t(()=>{var e;return(null==(e=l.schema)?void 0:e.required)||[]}),w=t(()=>Object.keys(v.value));function k(e){const a=v.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 b.value.includes(e)}function C(e){var a;return(null==(a=v.value[e])?void 0:a.description)||""}function U(e){const a=v.value[e];return Array.isArray(null==a?void 0:a.enum)&&a.enum.length>0}function P(e){const a=v.value[e];return Array.isArray(null==a?void 0:a.enum)?a.enum.map(e=>({label:String(e),value:e})):[]}function S(e){const a=v.value[e];return(null==a?void 0:a.description)?a.description:null!=(null==a?void 0:a.default)?`默认: ${a.default}`:`请输入 ${e}`}function z(e){const a=v.value[e];return a&&(a.properties||a.additionalProperties)?a:null}function T(e,a){r("update:modelValue",{...l.modelValue,[e]:a})}return x(()=>[l.schema,w.value],()=>{!function(){const e={};let a=!1;for(const t of w.value){const s=v.value[t];null!=(null==s?void 0:s.default)&&void 0===l.modelValue[t]&&(e[t]=s.default,a=!0)}a&&r("update:modelValue",{...l.modelValue,...e})}()},{immediate:!0,deep:!0}),(a,l)=>{const t=E("McpDynamicForm",!0);return n(),s("div",{class:p(["dynamic-form",{"nested-form":e.depth>0}])},[e.depth>=e.maxDepth?(n(),g(d(pe),{key:0,type:"warning",bordered:!1,class:"depth-warning"},{default:u(()=>[h(" 嵌套层级已达上限("+m(e.maxDepth)+" 层),无法继续展开 ",1)]),_:1})):(n(),s(f,{key:1},[(n(!0),s(f,null,y(w.value,a=>(n(),s("div",{key:a,class:"field"},[o("label",Op,[h(m(a)+" ",1),_(a)?(n(),s("span",$p,"*")):i("",!0),C(a)?(n(),g(d(ie),{key:1,trigger:"hover"},{trigger:u(()=>[c(d(R),{size:14,class:"field-tip-icon"},{default:u(()=>[c(d(Ia))]),_:1})]),default:u(()=>[h(" "+m(C(a)),1)]),_:2},1024)):i("",!0)]),"string"===k(a)&&U(a)?(n(),g(d(ee),{key:0,value:e.modelValue[a],options:P(a),placeholder:S(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","options","placeholder","onUpdate:value"])):"string"===k(a)?(n(),g(d(ne),{key:1,value:e.modelValue[a]??"",placeholder:S(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"])):"number"===k(a)||"integer"===k(a)?(n(),g(d(oe),{key:2,value:e.modelValue[a],placeholder:S(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(d(G),{key:3,value:!!e.modelValue[a],"onUpdate:value":e=>T(a,e)},null,8,["value","onUpdate:value"])):"array"===k(a)?(n(),g(d(ve),{key:4,value:e.modelValue[a]||[],placeholder:S(a),min:0,"onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"])):"object"===k(a)&&z(a)?(n(),g(t,{key:5,schema:z(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(d(ne),{key:6,value:null!=e.modelValue[a]?String(e.modelValue[a]):"",placeholder:S(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"]))]))),128)),0===w.value.length?(n(),s("div",jp,[c(d(K),{depth:"3"},{default:u(()=>[...l[0]||(l[0]=[h("无可配置属性",-1)])]),_:1})])):i("",!0)],64))],2)}}},[["__scopeId","data-v-b199234d"]]),Ep={class:"modal-content"},Dp={key:0,class:"tool-info"},Np={key:1,class:"params-section"},Bp={class:"section-header"},Rp={key:2,class:"no-params"},Fp={key:3,class:"result-section"},Hp={class:"section-header"},Gp={key:0,class:"result-duration"},Kp={key:0,class:"result-display"},qp={key:1,class:"result-error"},Wp={class:"modal-footer"},Vp=zl({__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 r=e,v=a,f=t({get:()=>r.visible,set:e=>v("update:visible",e)}),y=l({}),b=l(!1),w=l(null),k=t(()=>{var e,a;const l=null==(a=null==(e=r.tool)?void 0:e.inputSchema)?void 0:a.properties;return l&&Object.keys(l).length>0}),_=t(()=>null!==w.value);async function C(){if(r.serverId&&r.tool){b.value=!0,w.value=null;try{const e=await async function(e,a,l={}){return(await ct.post(`/mcp/servers/${e}/tools/test`,{toolName:a,arguments:l})).data}(r.serverId,r.tool.name,y.value);if(e.success){const a=$d(e.result,"工具执行失败");w.value={result:e.result,duration:e.duration,isError:e.isError||!1},e.isError?(w.value.result=a,jd(Ds,e.result,"工具执行失败",`${r.tool.name}: `)):Ds.success(`工具执行成功 (${e.duration}ms)`)}else w.value={result:$d(e,"执行失败"),isError:!0},jd(Ds,e,"执行失败",`${r.tool.name}: `)}catch(e){const a=$d(e,"执行失败");w.value={result:a,isError:!0},jd(Ds,e,"执行失败",`${r.tool.name}: `)}finally{b.value=!1}}else Ds.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(()=>[r.visible,r.tool],([e,a])=>{e&&a&&(y.value={},w.value=null)}),(a,l)=>{var t;return n(),g(d(se),{show:f.value,"onUpdate:show":l[2]||(l[2]=e=>f.value=e),preset:"card",title:(null==(t=e.tool)?void 0:t.name)||"测试工具",style:{width:"700px","max-width":"90vw"},segmented:{content:"soft",footer:"soft"}},{footer:u(()=>[o("div",Wp,[c(d(F),{onClick:l[1]||(l[1]=e=>f.value=!1)},{default:u(()=>[...l[7]||(l[7]=[h("关闭",-1)])]),_:1}),c(d(F),{type:"primary",loading:b.value,disabled:!e.serverId||!e.tool,onClick:C},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(La))]),_:1})]),default:u(()=>[h(" "+m(b.value?"执行中...":"执行工具"),1)]),_:1},8,["loading","disabled"])])]),default:u(()=>{var a;return[o("div",Ep,[(null==(a=e.tool)?void 0:a.description)?(n(),s("div",Dp,[c(d(pe),{type:"info",bordered:!1},{default:u(()=>[h(m(e.tool.description),1)]),_:1})])):i("",!0),k.value?(n(),s("div",Np,[o("div",Bp,[c(d(R),{size:16,class:"section-icon"},{default:u(()=>[c(d(xa))]),_:1}),l[3]||(l[3]=o("span",{class:"section-title"},"输入参数",-1))]),c(Lp,{modelValue:y.value,"onUpdate:modelValue":l[0]||(l[0]=e=>y.value=e),schema:e.tool.inputSchema},null,8,["modelValue","schema"])])):(n(),s("div",Rp,[c(d(K),{depth:"3"},{default:u(()=>[...l[4]||(l[4]=[h("此工具无需参数,可直接执行",-1)])]),_:1})])),_.value?(n(),s("div",Fp,[o("div",Hp,[c(d(R),{size:16,class:p(["section-icon",{error:w.value.isError}])},{default:u(()=>[w.value.isError?(n(),g(d(Re),{key:1})):(n(),g(d(Be),{key:0}))]),_:1},8,["class"]),l[5]||(l[5]=o("span",{class:"section-title"},"执行结果",-1)),null!=w.value.duration?(n(),s("span",Gp,m(w.value.duration)+"ms ",1)):i("",!0)]),w.value.isError?(n(),s("div",qp,[c(d(pe),{type:"error",bordered:!1},{header:u(()=>[...l[6]||(l[6]=[h("执行失败",-1)])]),default:u(()=>{var e;return[h(" "+m((null==(e=w.value.result)?void 0:e.message)||w.value.result||"未知错误"),1)]}),_:1})])):(n(),s("div",Kp,[c(d(ye),{code:U(w.value.result),language:"json","word-wrap":!0},null,8,["code"])]))])):i("",!0)])]}),_:1},8,["show","title"])}}},[["__scopeId","data-v-e945d675"]]),Jp={class:"drawer-header"},Zp={class:"server-info"},Qp={class:"server-details"},Yp={class:"server-name"},Xp={class:"server-meta"},ev={class:"drawer-body"},av={key:0,class:"tools-container"},lv={class:"tools-stats"},tv={class:"stats-text"},sv={key:0,class:"stats-duration"},nv={class:"collapse-header"},ov={class:"tool-index"},iv={class:"tool-title"},rv={key:1,class:"empty-state"},cv={key:2,class:"error-state"},uv=zl({__name:"McpServerDetailDrawer",props:{visible:{type:Boolean,default:!1},server:{type:Object,default:null}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=ei(600),v=e,b=a,w=t({get:()=>v.visible,set:e=>b("update:visible",e)}),k=l(!1),_=l([]),C=l(""),U=l(0),P=l(!1),S=l(null);async function z(){var e,a,l,t,s;if(null==(e=v.server)?void 0:e.id){k.value=!0,C.value="",_.value=[],U.value=0;try{const e=await async function(e){return(await ct.get(`/mcp/servers/${e}/tools`)).data}(v.server.id);e.success?(_.value=e.tools||[],U.value=e.duration||0):(C.value=$d(e,"获取工具列表失败"),jd(Ds,e,"获取工具列表失败",`${(null==(a=v.server)?void 0:a.name)||(null==(l=v.server)?void 0:l.id)}: `))}catch(n){C.value=$d(n,"连接服务器失败"),jd(Ds,n,"获取工具列表失败",`${(null==(t=v.server)?void 0:t.name)||(null==(s=v.server)?void 0:s.id)}: `)}finally{k.value=!1}}}return x(()=>v.visible,e=>{e&&v.server?z():(_.value=[],C.value="",U.value=0)}),(a,l)=>{var t;return n(),s(f,null,[c(d(ce),{show:w.value,"onUpdate:show":l[0]||(l[0]=e=>w.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>{var a,l,t,r,v;return[o("div",Jp,[o("div",Zp,[c(d(R),{size:20,class:"server-icon"},{default:u(()=>[c(d(Je))]),_:1}),o("div",Qp,[o("span",Yp,m((null==(a=e.server)?void 0:a.name)||(null==(l=e.server)?void 0:l.id)),1),o("div",Xp,[(null==(r=null==(t=e.server)?void 0:t.server)?void 0:r.type)?(n(),g(d(H),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(m(e.server.server.type),1)]),_:1})):i("",!0),(null==(v=e.server)?void 0:v.status)?(n(),s("span",{key:1,class:p(["status-dot",{online:"online"===e.server.status,error:"error"===e.server.status}])},null,2)):i("",!0)])])])])]}),default:u(()=>[o("div",ev,[c(d(ge),{type:"line",animated:""},{default:u(()=>[c(d(he),{name:"tools",tab:"工具列表"},{default:u(()=>[c(d(Z),{show:k.value},{default:u(()=>[!k.value&&_.value.length>0?(n(),s("div",av,[o("div",lv,[o("span",tv,"共 "+m(_.value.length)+" 个工具",1),U.value?(n(),s("span",sv," 耗时 "+m(U.value)+"ms ",1)):i("",!0)]),c(d(me),{"arrow-placement":"right","default-expanded-names":[]},{default:u(()=>[(n(!0),s(f,null,y(_.value,(e,a)=>(n(),g(d(fe),{key:e.name,name:a},{header:u(()=>[o("div",nv,[o("span",ov,m(a+1),1),o("span",iv,m(e.name),1)])]),default:u(()=>[c(Ap,{tool:e,onTest:a=>function(e){S.value=e,P.value=!0}(e)},null,8,["tool","onTest"])]),_:2},1032,["name"]))),128))]),_:1})])):k.value||0!==_.value.length?i("",!0):(n(),s("div",rv,[c(d(R),{size:48,class:"empty-icon"},{default:u(()=>[c(d(Ea))]),_:1}),l[2]||(l[2]=o("p",{class:"empty-title"},"该服务器未提供工具",-1)),l[3]||(l[3]=o("p",{class:"empty-desc"},"此 MCP 服务器没有注册任何可用工具",-1))])),C.value?(n(),s("div",cv,[c(d(pe),{type:"error",bordered:!1},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Da))]),_:1})]),default:u(()=>[h(" "+m(C.value),1)]),_:1})])):i("",!0)]),_:1},8,["show"])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]),c(Vp,{visible:P.value,"onUpdate:visible":l[1]||(l[1]=e=>P.value=e),"server-id":null==(t=e.server)?void 0:t.id,tool:S.value},null,8,["visible","server-id","tool"])],64)}}},[["__scopeId","data-v-d38ad0a4"]]),dv={class:"drawer-header"},pv={class:"header-title"},vv={class:"header-actions"},mv={class:"mcp-container"},fv={class:"stats-bar"},yv={class:"stats-text"},gv={class:"server-list"},hv={key:0,class:"empty-state"},bv=["onClick","onDragstart","onDragover","onDrop"],wv={class:"card-header"},kv={class:"card-title"},_v={class:"server-name"},xv={class:"card-actions"},Cv={key:0,class:"card-desc"},Uv={key:1,class:"card-tags"},Pv={class:"card-apps"},Sv={class:"paste-modal-content"},zv={key:0,class:"parse-error"},Tv={class:"paste-modal-footer"},Iv={class:"batch-modal-content"},Mv={class:"batch-actions"},Av={class:"batch-selected"},Ov={class:"batch-list"},$v={class:"batch-item-info"},jv={class:"batch-item-header"},Lv={class:"batch-item-name"},Ev={class:"batch-item-detail"},Dv={key:0},Nv={key:1,class:"batch-args"},Bv={class:"batch-modal-footer"},Rv={class:"export-modal-content"},Fv={class:"export-info"},Hv={class:"export-modal-footer"},Gv=zl({__name:"McpDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=ei(720),b=e,w=a,k=t({get:()=>b.visible,set:e=>w("update:visible",e)}),C=l(!1),U=l({}),P=l(!1),S=l(null),z=_({}),T=l(null),I=l(null),M=l(!1),A=l(""),O=l(""),$=l(!1),j=l(!1),L=l([]),E=l([]),D=l(!1),N=l(!1),B=l({format:"",content:"",filename:""}),K=l(!1),q=l(null),W=t(()=>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=t(()=>W.value.length),J=t(()=>Object.keys(U.value)),Q=t(()=>{const e=W.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,omp:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.omp}).length}}),Y=t({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"},{label:"同步 OMP 已有配置",key:"omp"}],ee=[{label:"导出为 JSON (通用)",key:"json"},{label:"导出为 Claude 格式",key:"claude"},{label:"导出为 Codex 格式 (TOML)",key:"codex"},{label:"导出为 OpenCode 格式",key:"opencode"},{label:"导出为 Gemini 格式",key:"gemini"},{label:"导出为 OMP 格式",key:"omp"}];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 oe(){C.value=!0;try{const e=await async function(){return(await ct.get("/mcp/servers")).data}();e.success&&(U.value=e.servers)}catch(e){Ds.error("加载 MCP 服务器失败")}finally{C.value=!1}}async function ue(e){z[e.id]=!0,U.value[e.id].status="testing";try{const a=await async function(e){return(await ct.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?Ds.success(`${e.name||e.id}: ${l.message} (${l.duration}ms)`):jd(Ds,l,"测试失败",`${e.name||e.id}: `)}}catch(a){U.value[e.id].status="error",jd(Ds,a,"测试失败",`${e.name||e.id}: `)}finally{z[e.id]=!1}}async function de(e,a,l){try{const t=await async function(e,a,l){return(await ct.post(`/mcp/servers/${e}/toggle`,{app:a,enabled:l})).data}(e,a,l);t.success&&(U.value[e]=t.server,Ds.success(`已${l?"启用":"禁用"} ${a}`))}catch(t){Ds.error("操作失败")}}function pe(e){Ns.warning({title:"删除确认",content:`确定要删除 MCP 服务器 "${e.name||e.id}" 吗?此操作将从所有平台配置中移除该服务器。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await ct.delete(`/mcp/servers/${e}`)).data}(e.id)).success&&(delete U.value[e.id],Ds.success("删除成功"))}catch(a){Ds.error("删除失败")}}})}async function ve(e){try{const a=await async function(e){return(await ct.post(`/mcp/import/${e}`)).data}(e);a.success&&(Ds.success(a.message),await oe())}catch(a){Ds.error("同步失败")}}async function me(e){try{const a=await async function(e="json"){return(await ct.get("/mcp/export",{params:{format:e}})).data}(e);a.success&&(B.value={format:a.format,content:a.content,filename:a.filename},N.value=!0)}catch(a){Ds.error("导出失败")}}async function fe(){try{const e=await Lo(B.value.content);if("manual"===(null==e?void 0:e.method))return void Ds.warning("自动复制失败,已弹出手动复制框");Ds.success("已复制到剪贴板")}catch{Ds.error("复制失败")}}function ye(){const e=new Blob([B.value.content],{type:"text/plain"}),a=URL.createObjectURL(e),l=document.createElement("a");l.href=a,l.download=B.value.filename,l.click(),URL.revokeObjectURL(a),Ds.success("下载成功")}function ge(){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=[...W.value],[s]=t.splice(l,1);t.splice(a,0,s);const n=t.map(e=>e.id);try{await async function(e){return(await ct.post("/mcp/servers/order",{serverIds:e})).data}(n),await oe()}catch(o){Ds.error("排序保存失败")}T.value=null}function ke(){S.value=null,P.value=!0}function _e(){oe()}function xe(){O.value="",$.value=!0;try{let l,t=A.value.trim();if(!t)return O.value="请输入配置内容",void($.value=!1);t.startsWith("{")||t.startsWith("[")||(t=t.replace(/^[\s,]+/,""),t=t.replace(/[\s,]+$/,""),t=`{${t}}`);try{l=JSON.parse(t)}catch(e){let s=t.replace(/\}\s*"/g,'}, "');try{l=JSON.parse(s)}catch(a){return O.value="JSON 格式错误:"+e.message,void($.value=!1)}}const s=[];let n=null;if(l.mcpServers&&"object"==typeof l.mcpServers)n=l.mcpServers;else if(l.mcp_servers&&"object"==typeof l.mcp_servers)n=l.mcp_servers;else if(l.command||l.url)n={"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 O.value="未找到有效的 MCP 服务器配置,请检查 JSON 格式",void($.value=!1);n=l}for(const[e,a]of Object.entries(n)){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,omp:!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||"streamable_http",l.server.url=a.url,a.headers&&"object"==typeof a.headers&&(l.server.headers=a.headers)),s.push(l)}if(0===s.length)return O.value="未找到有效的 MCP 服务器配置",void($.value=!1);1!==s.length||te(s[0].id)?(L.value=s,E.value=s.filter(e=>!te(e.id)).map(e=>e.id),j.value=!0,M.value=!1):(S.value=s[0],P.value=!0,M.value=!1,A.value="")}catch(l){O.value="解析失败:"+l.message}finally{$.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 s=L.value.find(e=>e.id===t);if(s)try{await Od(s),e++}catch(l){a++}}e>0?(Ds.success(`成功导入 ${e} 个服务器${a>0?`,${a} 个失败`:""}`),await oe()):Ds.error("导入失败"),j.value=!1,A.value="",L.value=[],E.value=[]}catch(l){Ds.error("批量导入失败")}finally{D.value=!1}}return x(()=>b.visible,e=>{e&&oe()}),x(M,e=>{e||(O.value="")}),(e,a)=>(n(),s(f,null,[c(d(ce),{show:k.value,"onUpdate:show":a[6]||(a[6]=e=>k.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{title:"MCP 服务器管理",closable:"","native-scrollbar":!1},{header:u(()=>[o("div",dv,[o("div",pv,[c(d(R),{size:20,class:"header-icon"},{default:u(()=>[c(d(Je))]),_:1}),a[17]||(a[17]=o("span",null,"MCP 服务器管理",-1))]),o("div",vv,[c(d(be),{trigger:"click",options:ee,onSelect:me},{default:u(()=>[c(d(F),{size:"small",quaternary:""},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fa))]),_:1})]),default:u(()=>[a[18]||(a[18]=h(" 导出 ",-1))]),_:1})]),_:1}),c(d(F),{size:"small",type:"primary",ghost:"",onClick:a[0]||(a[0]=e=>M.value=!0)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ia))]),_:1})]),default:u(()=>[a[19]||(a[19]=h(" 粘贴解析 ",-1))]),_:1}),c(d(F),{size:"small",type:"primary",onClick:ke},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Oa))]),_:1})]),default:u(()=>[a[20]||(a[20]=h(" 添加 ",-1))]),_:1})])])]),default:u(()=>[o("div",mv,[o("div",fv,[o("span",yv,[h(" 共 "+m(V.value)+" 个服务器 ",1),V.value>0?(n(),s(f,{key:0},[h(" · Claude: "+m(Q.value.claude)+" · Codex: "+m(Q.value.codex)+" · Gemini: "+m(Q.value.gemini)+" · OpenCode: "+m(Q.value.opencode)+" · OMP: "+m(Q.value.omp),1)],64)):i("",!0)]),c(d(be),{trigger:"click",options:X,onSelect:ve},{default:u(()=>[c(d(F),{size:"tiny",quaternary:""},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Na))]),_:1})]),default:u(()=>[a[21]||(a[21]=h(" 同步 ",-1))]),_:1})]),_:1})]),o("div",gv,[c(d(Z),{show:C.value},{default:u(()=>[0!==W.value.length||C.value?(n(),s("div",{key:1,class:"server-cards",ref_key:"serverCardsRef",ref:I},[(n(!0),s(f,null,y(W.value,(e,l)=>{var t,r,b,w,k,_,x;return n(),s("div",{key:e.id,class:p(["server-card",{dragging:T.value===l}]),draggable:"true",onClick:a=>function(e){q.value=e,K.value=!0}(e),onDragstart:e=>function(e,a){T.value=a,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",a)}(e,l),onDragend:ge,onDragover:e=>{return(a=e).preventDefault(),void(a.dataTransfer.dropEffect="move");var a},onDrop:e=>he(e,l)},[o("div",wv,[o("div",kv,[c(d(R),{class:"drag-handle",size:14},{default:u(()=>[c(d(Ba))]),_:1}),o("span",_v,m(e.name||e.id),1),(null==(t=e.server)?void 0:t.type)?(n(),g(d(H),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(m(e.server.type),1)]),_:2},1024)):i("",!0),e.status?(n(),g(d(ie),{key:1},{trigger:u(()=>[o("span",{class:p(["status-dot",{online:"online"===e.status,error:"error"===e.status,testing:"testing"===e.status}])},null,2)]),default:u(()=>[h(" "+m(ae(e)),1)]),_:2},1024)):i("",!0)]),o("div",xv,[c(d(ie),null,{trigger:u(()=>[c(d(F),{quaternary:"",size:"tiny",loading:z[e.id],onClick:v(a=>ue(e),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(La))]),_:1})]),_:1},8,["loading","onClick"])]),default:u(()=>[a[24]||(a[24]=h(" 测试连接 ",-1))]),_:2},1024),c(d(F),{quaternary:"",size:"tiny",onClick:v(a=>function(e){S.value=e,P.value=!0}(e),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ra))]),_:1})]),_:1},8,["onClick"]),c(d(F),{quaternary:"",size:"tiny",onClick:v(a=>pe(e),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1},8,["onClick"])])]),e.description?(n(),s("p",Cv,m(e.description),1)):i("",!0),(null==(r=e.tags)?void 0:r.length)?(n(),s("div",Uv,[(n(!0),s(f,null,y(e.tags.slice(0,3),e=>(n(),g(d(H),{key:e,size:"tiny",bordered:!1},{default:u(()=>[h(m(e),1)]),_:2},1024))),128))])):i("",!0),o("div",Pv,[o("label",{class:"app-toggle",onClick:a[1]||(a[1]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(b=e.apps)?void 0:b.claude,"onUpdate:value":a=>de(e.id,"claude",a)},null,8,["value","onUpdate:value"]),a[25]||(a[25]=o("span",{class:"app-label"},"Claude",-1))]),o("label",{class:"app-toggle",onClick:a[2]||(a[2]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(w=e.apps)?void 0:w.codex,"onUpdate:value":a=>de(e.id,"codex",a)},null,8,["value","onUpdate:value"]),a[26]||(a[26]=o("span",{class:"app-label"},"Codex",-1))]),o("label",{class:"app-toggle",onClick:a[3]||(a[3]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(k=e.apps)?void 0:k.gemini,"onUpdate:value":a=>de(e.id,"gemini",a)},null,8,["value","onUpdate:value"]),a[27]||(a[27]=o("span",{class:"app-label"},"Gemini",-1))]),o("label",{class:"app-toggle",onClick:a[4]||(a[4]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(_=e.apps)?void 0:_.opencode,"onUpdate:value":a=>de(e.id,"opencode",a)},null,8,["value","onUpdate:value"]),a[28]||(a[28]=o("span",{class:"app-label"},"OpenCode",-1))]),o("label",{class:"app-toggle",onClick:a[5]||(a[5]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(x=e.apps)?void 0:x.omp,"onUpdate:value":a=>de(e.id,"omp",a)},null,8,["value","onUpdate:value"]),a[29]||(a[29]=o("span",{class:"app-label"},"OMP",-1))])])],42,bv)}),128))],512)):(n(),s("div",hv,[c(d(R),{size:48,class:"empty-icon"},{default:u(()=>[c(d(Je))]),_:1}),a[22]||(a[22]=o("p",{class:"empty-title"},"暂无 MCP 服务器",-1)),a[23]||(a[23]=o("p",{class:"empty-desc"},'点击上方"添加"按钮添加 MCP 服务器,或"粘贴解析"快速导入',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),c(wp,{visible:P.value,"onUpdate:visible":a[7]||(a[7]=e=>P.value=e),"editing-server":S.value,"existing-ids":J.value,onSaved:_e},null,8,["visible","editing-server","existing-ids"]),c(d(se),{show:M.value,"onUpdate:show":a[10]||(a[10]=e=>M.value=e),preset:"card",title:"粘贴 MCP 配置",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[o("div",Tv,[c(d(F),{onClick:a[9]||(a[9]=e=>M.value=!1)},{default:u(()=>[...a[32]||(a[32]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:xe,loading:$.value},{default:u(()=>[...a[33]||(a[33]=[h(" 解析配置 ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[o("div",Sv,[a[30]||(a[30]=o("p",{class:"paste-hint"}," 粘贴 JSON 格式的 MCP 配置,支持单个或批量导入。格式示例: ",-1)),a[31]||(a[31]=o("pre",{class:"paste-example"},'{\n "mcpServers": {\n "服务器名称": {\n "type": "streamable_http",\n "url": "https://example.com/mcp"\n }\n }\n}',-1)),c(d(ne),{value:A.value,"onUpdate:value":a[8]||(a[8]=e=>A.value=e),type:"textarea",placeholder:"在此粘贴 JSON 配置...",rows:8,status:O.value?"error":void 0},null,8,["value","status"]),O.value?(n(),s("p",zv,m(O.value),1)):i("",!0)])]),_:1},8,["show"]),c(d(se),{show:j.value,"onUpdate:show":a[13]||(a[13]=e=>j.value=e),preset:"card",title:"选择要导入的 MCP 服务器",style:{width:"650px","max-width":"90vw"}},{footer:u(()=>[o("div",Bv,[c(d(F),{onClick:a[12]||(a[12]=e=>j.value=!1)},{default:u(()=>[...a[35]||(a[35]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",disabled:0===E.value.length,loading:D.value,onClick:Ue},{default:u(()=>[h(" 导入选中 ("+m(E.value.length)+") ",1)]),_:1},8,["disabled","loading"])])]),default:u(()=>[o("div",Iv,[o("div",Mv,[c(d(we),{checked:Y.value,"onUpdate:checked":[a[11]||(a[11]=e=>Y.value=e),Ce]},{default:u(()=>[h(" 全选 ("+m(L.value.length)+") ",1)]),_:1},8,["checked"]),o("span",Av,"已选择 "+m(E.value.length)+" 个",1)]),o("div",Ov,[(n(!0),s(f,null,y(L.value,e=>{var l,t,r,v;return n(),s("div",{key:e.id,class:p(["batch-item",{selected:E.value.includes(e.id),exists:te(e.id)}])},[c(d(we),{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"]),o("div",$v,[o("div",jv,[o("span",Lv,m(e.id),1),te(e.id)?(n(),g(d(H),{key:0,size:"tiny",type:"warning"},{default:u(()=>[...a[34]||(a[34]=[h("已存在",-1)])]),_:1})):i("",!0),(null==(l=e.server)?void 0:l.type)?(n(),g(d(H),{key:1,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(m(e.server.type),1)]),_:2},1024)):i("",!0)]),o("div",Ev,[(null==(t=e.server)?void 0:t.command)?(n(),s("span",Dv,m(e.server.command),1)):i("",!0),(null==(v=null==(r=e.server)?void 0:r.args)?void 0:v.length)?(n(),s("span",Nv,m(e.server.args.slice(0,3).join(" "))+m(e.server.args.length>3?"...":""),1)):i("",!0)])])],2)}),128))])])]),_:1},8,["show"]),c(d(se),{show:N.value,"onUpdate:show":a[15]||(a[15]=e=>N.value=e),preset:"card",title:"导出 MCP 配置",style:{width:"650px","max-width":"90vw"}},{footer:u(()=>[o("div",Hv,[c(d(F),{onClick:a[14]||(a[14]=e=>N.value=!1)},{default:u(()=>[...a[36]||(a[36]=[h("关闭",-1)])]),_:1}),c(d(F),{onClick:fe},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ha))]),_:1})]),default:u(()=>[a[37]||(a[37]=h(" 复制 ",-1))]),_:1}),c(d(F),{type:"primary",onClick:ye},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fa))]),_:1})]),default:u(()=>[a[38]||(a[38]=h(" 下载 ",-1))]),_:1})])]),default:u(()=>[o("div",Rv,[o("div",Fv,[o("span",null,"格式: "+m(B.value.format),1),o("span",null,"文件名: "+m(B.value.filename),1)]),c(d(ne),{value:B.value.content,type:"textarea",readonly:"",rows:12,class:"export-content"},null,8,["value"])])]),_:1},8,["show"]),c(uv,{visible:K.value,"onUpdate:visible":a[16]||(a[16]=e=>K.value=e),server:q.value},null,8,["visible","server"])],64))}},[["__scopeId","data-v-5a783e62"]]);const Kv={key:0,class:"editor-container"},qv=["innerHTML"],Wv={key:1,class:"placeholder-text"},Vv={class:"preview-hint"},Jv=zl({__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:i}){const r=e,v=i,f=l(r.defaultEditing),y=l(null);function g(e,a){pl.getLanguage(e)||pl.registerLanguage(e,a)}g("javascript",vl),g("typescript",gl),g("json",yl),g("bash",fl),g("shell",fl),g("sh",fl),g("python",ml),g("css",hl),g("xml",bl),g("html",bl);const h=new kl({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&pl.getLanguage(a))try{return'<pre class="hljs"><code>'+pl.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(l){}return'<pre class="hljs"><code>'+h.utils.escapeHtml(e)+"</code></pre>"}}),b=t(()=>h.render(r.modelValue||""));function w(){r.disabled||(f.value=!0,v("edit"),I(()=>{var e;null==(e=y.value)||e.focus()}))}function k(){f.value=!1,v("blur")}function _(){setTimeout(()=>{k()},150)}function C(){k()}return x(()=>r.defaultEditing,e=>{e&&!f.value&&w()}),a({enterEditMode:w,exitEditMode:k,isEditing:f}),(a,l)=>(n(),s("div",{class:p(["markdown-editor",{"is-editing":f.value,"is-empty":!e.modelValue}])},[f.value?(n(),s("div",Kv,[c(d(ne),{ref_key:"inputRef",ref:y,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:$(C,["esc"])},null,8,["value","rows","placeholder","disabled"]),l[1]||(l[1]=o("div",{class:"editor-hint"},[o("span",null,"按 Esc 退出编辑 | 支持 Markdown 格式")],-1))])):(n(),s("div",{key:1,class:"preview-container",style:z({minHeight:e.minHeight+"px"}),onDblclick:w},[e.modelValue?(n(),s("div",{key:0,class:"markdown-content",innerHTML:b.value},null,8,qv)):(n(),s("div",Wv,m(e.placeholder||"双击编辑..."),1)),o("div",Vv,[c(d(R),{size:"12"},{default:u(()=>[c(d(Ra))]),_:1}),l[2]||(l[2]=o("span",null,"双击编辑",-1))])],36))],2))}},[["__scopeId","data-v-224a81d1"]]),Zv={class:"form-header"},Qv={class:"form-container"},Yv={class:"form-section"},Xv={class:"section-title"},em={class:"form-item"},am={key:0,class:"form-error"},lm={class:"form-item"},tm={class:"form-item"},sm={class:"form-section"},nm={class:"section-title"},om={class:"apps-toggles"},im={class:"app-toggle"},rm={class:"app-toggle"},cm={class:"app-toggle"},um={class:"app-toggle"},dm={class:"app-toggle"},pm={class:"form-section content-section"},vm={class:"section-title"},mm={class:"form-footer"},fm=zl({__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:r}=ei(600),p=e,v=a,f=t({get:()=>p.visible,set:e=>v("update:visible",e)}),y=t(()=>!!p.editingPreset),b=l(!1),w=l(""),k=_({id:"",name:"",description:"",content:"",apps:{claude:!0,codex:!0,gemini:!0,opencode:!0,omp:!1}});async function C(){var e;if(k.id.trim()?/^[a-zA-Z0-9_-]+$/.test(k.id)?!y.value&&p.existingIds.includes(k.id)?(w.value="该 ID 已被使用",0):(w.value="",1):(w.value="ID 只能包含字母、数字、下划线和连字符",0):(w.value="预设 ID 不能为空",0))if(k.name.trim()){b.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=p.editingPreset)?void 0:e.isBuiltin)&&(a.isBuiltin=!0);const l=await async function(e){return(await ct.post("/prompts/presets",e)).data}(a);l.success&&(Ds.success(y.value?"保存成功":"创建成功"),v("saved"),f.value=!1)}catch(a){Ds.error("保存失败: "+a.message)}finally{b.value=!1}}else Ds.error("预设名称不能为空")}function U(){f.value=!1}return x(()=>p.visible,e=>{var a,l,t,s,n;e&&(p.editingPreset?(k.id=p.editingPreset.id||"",k.name=p.editingPreset.name||"",k.description=p.editingPreset.description||"",k.content=p.editingPreset.content||"",k.apps={claude:(null==(a=p.editingPreset.apps)?void 0:a.claude)??!0,codex:(null==(l=p.editingPreset.apps)?void 0:l.codex)??!0,gemini:(null==(t=p.editingPreset.apps)?void 0:t.gemini)??!0,opencode:(null==(s=p.editingPreset.apps)?void 0:s.opencode)??!0,omp:(null==(n=p.editingPreset.apps)?void 0:n.omp)??!1}):(k.id="",k.name="",k.description="",k.content="",k.apps={claude:!0,codex:!0,gemini:!0,opencode:!0,omp:!1}),w.value="")}),(a,l)=>(n(),g(d(ce),{show:f.value,"onUpdate:show":l[9]||(l[9]=e=>f.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",Zv,[c(d(R),{size:18,class:"header-icon"},{default:u(()=>[c(d(Oa))]),_:1}),o("span",null,m(y.value?"编辑预设":"新建预设"),1)])]),footer:u(()=>[o("div",mm,[c(d(F),{onClick:U},{default:u(()=>[...l[27]||(l[27]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:C,loading:b.value},{default:u(()=>[h(m(y.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>{var a;return[o("div",Qv,[o("div",Yv,[o("div",Xv,[c(d(R),{size:16},{default:u(()=>[c(d(Ia))]),_:1}),l[10]||(l[10]=o("span",null,"基本信息",-1))]),o("div",em,[l[11]||(l[11]=o("label",{class:"form-label"},[h("预设 ID "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:k.id,"onUpdate:value":l[0]||(l[0]=e=>k.id=e),placeholder:"唯一标识符,如 my-preset",disabled:y.value&&(null==(a=e.editingPreset)?void 0:a.isBuiltin)},null,8,["value","disabled"]),w.value?(n(),s("p",am,m(w.value),1)):i("",!0)]),o("div",lm,[l[12]||(l[12]=o("label",{class:"form-label"},[h("名称 "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:k.name,"onUpdate:value":l[1]||(l[1]=e=>k.name=e),placeholder:"预设名称"},null,8,["value"])]),o("div",tm,[l[13]||(l[13]=o("label",{class:"form-label"},"描述",-1)),c(d(ne),{value:k.description,"onUpdate:value":l[2]||(l[2]=e=>k.description=e),placeholder:"简短描述这个预设的用途"},null,8,["value"])])]),o("div",sm,[o("div",nm,[c(d(R),{size:16},{default:u(()=>[c(d(Ma))]),_:1}),l[14]||(l[14]=o("span",null,"生效范围",-1))]),o("div",om,[o("label",im,[c(d(G),{value:k.apps.claude,"onUpdate:value":l[3]||(l[3]=e=>k.apps.claude=e)},null,8,["value"]),l[15]||(l[15]=o("span",{class:"app-name"},"Claude",-1)),l[16]||(l[16]=o("span",{class:"app-path"},"~/.claude/CLAUDE.md",-1))]),o("label",rm,[c(d(G),{value:k.apps.codex,"onUpdate:value":l[4]||(l[4]=e=>k.apps.codex=e)},null,8,["value"]),l[17]||(l[17]=o("span",{class:"app-name"},"Codex",-1)),l[18]||(l[18]=o("span",{class:"app-path"},"~/.codex/AGENTS.md",-1))]),o("label",cm,[c(d(G),{value:k.apps.gemini,"onUpdate:value":l[5]||(l[5]=e=>k.apps.gemini=e)},null,8,["value"]),l[19]||(l[19]=o("span",{class:"app-name"},"Gemini",-1)),l[20]||(l[20]=o("span",{class:"app-path"},"~/.gemini/GEMINI.md",-1))]),o("label",um,[c(d(G),{value:k.apps.opencode,"onUpdate:value":l[6]||(l[6]=e=>k.apps.opencode=e)},null,8,["value"]),l[21]||(l[21]=o("span",{class:"app-name"},"OpenCode",-1)),l[22]||(l[22]=o("span",{class:"app-path"},"~/.config/opencode/AGENTS.md",-1))]),o("label",dm,[c(d(G),{value:k.apps.omp,"onUpdate:value":l[7]||(l[7]=e=>k.apps.omp=e)},null,8,["value"]),l[23]||(l[23]=o("span",{class:"app-name"},"OMP",-1)),l[24]||(l[24]=o("span",{class:"app-path"},"~/.omp/agent/prompts/coding-tool-x/*.md",-1))])])]),o("div",pm,[o("div",vm,[c(d(R),{size:16},{default:u(()=>[c(d(ia))]),_:1}),l[25]||(l[25]=o("span",null,"提示词内容",-1)),l[26]||(l[26]=o("span",{class:"content-hint"},"支持 Markdown 格式",-1))]),c(Jv,{modelValue:k.content,"onUpdate:modelValue":l[8]||(l[8]=e=>k.content=e),rows:16,"min-height":300,placeholder:"# 系统提示词\n\n在这里编写你的系统提示词..."},null,8,["modelValue"])])])]}),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-6862fc60"]]),ym={class:"drawer-header"},gm={class:"header-title"},hm={class:"prompts-container"},bm={class:"status-card"},wm={class:"status-info"},km={class:"status-text"},_m={class:"status-value"},xm={class:"status-actions"},Cm={class:"stats-bar"},Um={class:"stats-text"},Pm={class:"preset-list"},Sm={key:0,class:"empty-state"},zm={key:1,class:"preset-cards"},Tm={class:"card-header"},Im={class:"card-title"},Mm={class:"preset-name"},Am={class:"card-actions"},Om={key:0,class:"card-desc"},$m={class:"card-apps"},jm={class:"card-preview"},Lm={class:"preview-content"},Em=zl({__name:"PromptsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=ei(720),v=e,b=a,w=t({get:()=>v.visible,set:e=>b("update:visible",e)}),k=l(!1),_=l({}),C=l(null),U=l(!1),P=l(null),S=l(null),z=l(!1),T=["claude","codex","gemini","opencode","omp"],I={claude:"Claude",codex:"Codex",gemini:"Gemini",opencode:"OpenCode",omp:"OMP"},M=t(()=>{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]}),A=t(()=>M.value.length),O=t(()=>Object.keys(_.value)),$=t(()=>C.value?_.value[C.value]:null),j=t(()=>{const e=M.value;return{builtin:e.filter(e=>e.isBuiltin).length,custom:e.filter(e=>!e.isBuiltin).length}}),L=[{label:"从 Claude 导入",key:"claude"},{label:"从 Codex 导入",key:"codex"},{label:"从 Gemini 导入",key:"gemini"},{label:"从 OpenCode 导入",key:"opencode"}];function E(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 D(){k.value=!0;try{const e=await async function(){return(await ct.get("/prompts/presets")).data}();e.success&&(_.value=e.presets,C.value=e.activePresetId)}catch(e){Ds.error("加载预设失败")}finally{k.value=!1}}async function N(e){S.value=e.id;try{(await async function(e){return(await ct.post(`/prompts/presets/${e}/activate`)).data}(e.id)).success&&(C.value=e.id,Ds.success(`已激活预设 "${e.name}"`))}catch(a){Ds.error("激活失败: "+a.message)}finally{S.value=null}}async function B(){Ns.warning({title:"移除提示词",content:"确定要移除当前激活的提示词吗?这将删除各平台的提示词文件,并移除 coding-tool-x 管理的 OMP prompt template。",positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{z.value=!0;try{(await async function(){return(await ct.post("/prompts/deactivate")).data}()).success&&(C.value=null,Ds.success("已移除提示词"))}catch(e){Ds.error("移除失败: "+e.message)}finally{z.value=!1}}})}function G(e){Ns.warning({title:"删除确认",content:`确定要删除预设 "${e.name}" 吗?此操作不可恢复。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await ct.delete(`/prompts/presets/${e}`)).data}(e.id)).success&&(delete _.value[e.id],Ds.success("删除成功"))}catch(a){Ds.error("删除失败: "+a.message)}}})}async function K(e){try{const a=await async function(e,a){return(await ct.post(`/prompts/import/${e}`,{name:a})).data}(e);a.success&&(_.value[a.preset.id]=a.preset,Ds.success(a.message))}catch(a){Ds.error("导入失败: "+a.message)}}function q(){P.value=null,U.value=!0}function W(){D()}return x(()=>v.visible,e=>{e&&D()}),(e,a)=>(n(),s(f,null,[c(d(ce),{show:w.value,"onUpdate:show":a[0]||(a[0]=e=>w.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{title:"Prompts 管理",closable:"","native-scrollbar":!1},{header:u(()=>[o("div",ym,[o("div",gm,[c(d(R),{size:20,class:"header-icon"},{default:u(()=>[c(d(Oa))]),_:1}),a[2]||(a[2]=o("span",null,"Prompts 管理",-1))])])]),default:u(()=>[o("div",hm,[o("div",bm,[o("div",wm,[$.value?(n(),s(f,{key:0},[c(d(R),{class:"status-icon active",size:18},{default:u(()=>[c(d(Be))]),_:1}),o("div",km,[a[3]||(a[3]=o("span",{class:"status-label"},"当前激活:",-1)),o("span",_m,m($.value.name),1)])],64)):(n(),s(f,{key:1},[c(d(R),{class:"status-icon inactive",size:18},{default:u(()=>[c(d(Ga))]),_:1}),a[4]||(a[4]=o("div",{class:"status-text"},[o("span",{class:"status-label"},"未激活任何提示词")],-1))],64))]),o("div",xm,[c(d(be),{trigger:"click",options:L,onSelect:K},{default:u(()=>[c(d(F),{size:"small",tertiary:"",class:"action-btn"},{icon:u(()=>[c(d(R),{size:14},{default:u(()=>[c(d(Fa))]),_:1})]),default:u(()=>[a[5]||(a[5]=h(" 导入 ",-1))]),_:1})]),_:1}),c(d(F),{size:"small",tertiary:"",type:"primary",class:"action-btn",onClick:q},{icon:u(()=>[c(d(R),{size:14},{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[6]||(a[6]=h(" 新建 ",-1))]),_:1}),$.value?(n(),g(d(ie),{key:0,trigger:"hover"},{trigger:u(()=>[c(d(F),{size:"small",quaternary:"",class:"action-btn remove-btn",onClick:B,loading:z.value},{icon:u(()=>[c(d(R),{size:16},{default:u(()=>[c(d(Fe))]),_:1})]),default:u(()=>[a[7]||(a[7]=h(" 移除 ",-1))]),_:1},8,["loading"])]),default:u(()=>[a[8]||(a[8]=h(" 删除各平台的提示词文件 ",-1))]),_:1})):i("",!0)])]),o("div",Cm,[o("span",Um,[h(" 共 "+m(A.value)+" 个预设 ",1),A.value>0?(n(),s(f,{key:0},[h(" · 自定义: "+m(j.value.custom)+" · 内置模板: "+m(j.value.builtin),1)],64)):i("",!0)])]),o("div",Pm,[c(d(Z),{show:k.value},{default:u(()=>[0!==M.value.length||k.value?(n(),s("div",zm,[(n(!0),s(f,null,y(M.value,e=>(n(),s("div",{key:e.id,class:p(["preset-card",{active:e.id===C.value}])},[o("div",Tm,[o("div",Im,[e.id===C.value?(n(),g(d(R),{key:0,class:"active-icon",size:16},{default:u(()=>[c(d(Be))]),_:1})):i("",!0),o("span",Mm,m(e.name),1),e.isBuiltin?(n(),g(d(H),{key:1,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[...a[11]||(a[11]=[h("模板",-1)])]),_:1})):i("",!0),e.isImported?(n(),g(d(H),{key:2,size:"tiny",bordered:!1,type:"warning"},{default:u(()=>[...a[12]||(a[12]=[h("已导入",-1)])]),_:1})):i("",!0)]),o("div",Am,[e.id!==C.value?(n(),g(d(F),{key:0,size:"tiny",type:"primary",onClick:a=>N(e),loading:S.value===e.id},{default:u(()=>[...a[13]||(a[13]=[h(" 激活 ",-1)])]),_:1},8,["onClick","loading"])):i("",!0),c(d(F),{quaternary:"",size:"tiny",onClick:a=>function(e){P.value=e,U.value=!0}(e)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ra))]),_:1})]),_:1},8,["onClick"]),e.isBuiltin?i("",!0):(n(),g(d(F),{key:1,quaternary:"",size:"tiny",onClick:a=>G(e)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1},8,["onClick"]))])]),e.description?(n(),s("p",Om,m(e.description),1)):i("",!0),o("div",$m,[a[14]||(a[14]=o("span",{class:"apps-label"},"生效范围:",-1)),(n(),s(f,null,y(T,a=>{var l;return c(d(H),{key:a,type:(null==(l=e.apps)?void 0:l[a])?"success":"default",size:"tiny",bordered:!1},{default:u(()=>[h(m(I[a]),1)]),_:2},1032,["type"])}),64))]),o("div",jm,[o("pre",Lm,m(E(e.content)),1)])],2))),128))])):(n(),s("div",Sm,[c(d(R),{size:48,class:"empty-icon"},{default:u(()=>[c(d(Oa))]),_:1}),a[9]||(a[9]=o("p",{class:"empty-title"},"暂无预设",-1)),a[10]||(a[10]=o("p",{class:"empty-desc"},'点击上方"新建"按钮创建系统提示词预设',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),c(fm,{visible:U.value,"onUpdate:visible":a[1]||(a[1]=e=>U.value=e),"editing-preset":P.value,"existing-ids":O.value,onSaved:W},null,8,["visible","editing-preset","existing-ids"])],64))}},[["__scopeId","data-v-79bd82f3"]]),Dm={class:"drawer-header"},Nm={class:"header-icon-wrapper"},Bm={class:"speed-test-container"},Rm={class:"test-controls"},Fm={key:0,class:"test-summary"},Hm={class:"summary-item"},Gm={class:"summary-value"},Km={class:"summary-item success"},qm={class:"summary-value"},Wm={class:"summary-item failed"},Vm={class:"summary-value"},Jm={class:"summary-item avg"},Zm={class:"summary-value"},Qm={class:"results-list"},Ym={key:0,class:"loading-state"},Xm={key:1,class:"empty-state"},ef={class:"empty-icon-wrapper"},af={key:2,class:"result-cards"},lf={class:"result-header"},tf={class:"channel-info"},sf={class:"channel-name"},nf={class:"result-status"},of={key:1,class:"status-badge failed"},rf={key:0,class:"result-details"},cf={class:"latency-bar"},uf={key:1,class:"error-info"},df={class:"error-container"},pf={class:"error-msg"},vf={key:0,class:"error-latency"},mf={key:1,class:"result-meta"},ff={class:"meta-item status-indicator"},yf={class:"meta-item status-indicator"},gf={key:0,class:"meta-item http-code"},hf={key:1,class:"meta-item time"},bf={key:1,class:"cache-hint"},wf="speedTestResults",kf="speedTestSummary",_f="speedTestTime",xf=zl({__name:"SpeedTestDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=ei(520),v=e,b=a,w=t({get:()=>v.visible,set:e=>b("update:visible",e)}),k=l(!1),_=l([]),C=l(null),U=l("all"),P=l(!1),S=[{label:"全部渠道",value:"all"},{label:"Claude",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"}];async function T(){k.value=!0,_.value=[],C.value=null,P.value=!1;const e=[];"all"!==U.value&&"claude"!==U.value||e.push({type:"claude",fn:At}),"all"!==U.value&&"codex"!==U.value||e.push({type:"codex",fn:$t}),"all"!==U.value&&"gemini"!==U.value||e.push({type:"gemini",fn:Lt}),"all"!==U.value&&"opencode"!==U.value||e.push({type:"opencode",fn:Kt});let a=[],l={total:0,success:0,failed:0,avgLatency:null},t=0,s=0;try{for(const{type:o,fn:i}of e)try{const e=await i(1e4);if(e.results){const n=e.results.map(e=>({...e,channelType:o,channelName:`[${o.toUpperCase()}] ${e.channelName}`,testedAt:Date.now()}));a=a.concat(n),_.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),s+=e.summary.success||0))}}catch(n){}l.avgLatency=s>0?Math.round(t/s):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(wf,JSON.stringify(_.value)),localStorage.setItem(kf,JSON.stringify(C.value)),localStorage.setItem(_f,Date.now().toString())}catch(e){}}(),0===l.total?Ds.info("没有找到可测试的渠道"):Ds.success(`测试完成: ${l.success}/${l.total} 成功`)}catch(n){Ds.error("测试失败: "+n.message)}finally{k.value=!1}}function I(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 A(e){switch(e){case"claude":return"Claude";case"codex":return"Codex";case"gemini":return"Gemini";case"opencode":return"OpenCode";default:return(null==e?void 0:e.toUpperCase())||""}}function O(e){switch(e){case"claude":return"type-claude";case"codex":return"type-codex";case"gemini":return"type-gemini";case"opencode":return"type-opencode";default:return""}}return x(()=>v.visible,e=>{e&&function(){try{const e=localStorage.getItem(_f);if(e&&Date.now()-parseInt(e)<3e5){const e=localStorage.getItem(wf),a=localStorage.getItem(kf);return e&&(_.value=JSON.parse(e),P.value=!0),a&&(C.value=JSON.parse(a)),!0}}catch(e){}}()}),(e,a)=>(n(),g(d(ce),{show:w.value,"onUpdate:show":a[1]||(a[1]=e=>w.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",Dm,[o("div",Nm,[c(d(R),{size:18},{default:u(()=>[c(d(Ne))]),_:1})]),a[2]||(a[2]=o("span",null,"渠道速度测试",-1))])]),default:u(()=>[o("div",Bm,[o("div",Rm,[c(d(F),{type:"primary",loading:k.value,disabled:k.value,onClick:T,class:"test-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(La))]),_:1})]),default:u(()=>[h(" "+m(k.value?"测试中...":"开始全部测试"),1)]),_:1},8,["loading","disabled"]),c(d(ee),{value:U.value,"onUpdate:value":a[0]||(a[0]=e=>U.value=e),options:S,placeholder:"选择渠道类型",style:{width:"140px"}},null,8,["value"])]),C.value?(n(),s("div",Fm,[o("div",Hm,[a[3]||(a[3]=o("span",{class:"summary-label"},"总计",-1)),o("span",Gm,m(C.value.total),1)]),o("div",Km,[a[4]||(a[4]=o("span",{class:"summary-label"},"成功",-1)),o("span",qm,m(C.value.success),1)]),o("div",Wm,[a[5]||(a[5]=o("span",{class:"summary-label"},"失败",-1)),o("span",Vm,m(C.value.failed),1)]),o("div",Jm,[a[6]||(a[6]=o("span",{class:"summary-label"},"平均延迟",-1)),o("span",Zm,m(null!==C.value.avgLatency&&void 0!==C.value.avgLatency?C.value.avgLatency+"ms":"-"),1)])])):i("",!0),o("div",Qm,[k.value&&0===_.value.length?(n(),s("div",Ym,[c(d(Z),{size:"large"}),a[7]||(a[7]=o("p",{class:"loading-text"},"正在测试渠道连接速度和 API 可用性...",-1))])):0!==_.value.length||k.value?(n(),s("div",af,[(n(!0),s(f,null,y(_.value,e=>{return n(),s("div",{key:e.channelId,class:p(["result-card",[e.success?"success":"failed",e.testing?"testing":""]])},[o("div",lf,[o("div",tf,[o("span",{class:p(["channel-type-badge",O(e.channelType)])},m(A(e.channelType)),3),o("span",sf,m((l=e.channelName,l?l.replace(/^\[(CLAUDE|CODEX|GEMINI|OPENCODE)\]\s*/i,""):"")),1)]),o("div",nf,[e.testing?(n(),g(d(Z),{key:0,size:14})):(n(),s(f,{key:1},[e.success?(n(),s("span",{key:0,class:p(["latency-badge",e.level])},m(e.latency)+"ms ",3)):(n(),s("span",of,"失败"))],64))])]),e.testing?i("",!0):(n(),s("div",rf,[e.success?(n(),s(f,{key:0},[o("div",cf,[o("div",{class:p(["latency-fill",e.level]),style:z({width:(a=e.latency,(null==a?0:Math.min(a/3e3*100,100))+"%")})},null,6)]),o("span",{class:p(["latency-level",e.level])},m(I(e.level)),3)],64)):(n(),s("div",uf,[o("div",df,[c(d(R),{size:14,class:"error-icon"},{default:u(()=>[c(d(Da))]),_:1}),o("span",pf,m(e.error),1)]),null!==e.latency&&void 0!==e.latency?(n(),s("span",vf," 响应 "+m(e.latency)+"ms ",1)):i("",!0)]))])),e.testing?i("",!0):(n(),s("div",mf,[o("span",ff,[o("span",{class:p(["status-dot",e.networkOk?"ok":"fail"])},null,2),h(" 网络"+m(e.networkOk?"正常":"异常"),1)]),o("span",yf,[o("span",{class:p(["status-dot",e.apiOk?"ok":"fail"])},null,2),h(" API"+m(e.apiOk?"可用":"不可用"),1)]),e.statusCode?(n(),s("span",gf,"HTTP "+m(e.statusCode),1)):i("",!0),e.testedAt?(n(),s("span",hf,m(M(e.testedAt)),1)):i("",!0)]))],2);var a,l}),128))])):(n(),s("div",Xm,[o("div",ef,[c(d(R),{size:32},{default:u(()=>[c(d(Ne))]),_:1})]),a[8]||(a[8]=o("p",{class:"empty-title"},"暂无测试结果",-1)),a[9]||(a[9]=o("p",{class:"empty-desc"},"点击上方按钮开始测试渠道连接速度",-1))]))]),P.value&&!k.value?(n(),s("div",bf,[c(d(R),{size:14},{default:u(()=>[c(d(Ka))]),_:1}),a[10]||(a[10]=o("span",null,"显示的是缓存的测试结果,点击按钮重新测试",-1))])):i("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-e4ab15fb"]]),Cf="http://localhost:19999";async function Uf(e){return(await dl.post(`${Cf}/api/convert/opencode/claude`,e)).data}async function Pf(e){return(await dl.post(`${Cf}/api/convert/opencode/codex`,e)).data}async function Sf(e){return(await dl.post(`${Cf}/api/convert/opencode/gemini`,e)).data}const zf={class:"drawer-header"},Tf={class:"header-icon-wrapper"},If={class:"convert-container"},Mf={class:"action-row"},Af={key:1,class:"result-section"},Of={class:"result-meta"},$f={class:"meta-row"},jf={class:"meta-row"},Lf={class:"meta-row"},Ef={class:"warning-list"},Df={class:"action-row"},Nf=zl({__name:"GatewayConvertDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=ei(620,520),p=e,v=a,b=t({get:()=>p.visible,set:e=>v("update:visible",e)}),w=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(""),P=l(!1),S=l(null),z=l(""),T=l(!1),I={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=t(()=>{var e;return(null==(e=S.value)?void 0:e.requestBody)?JSON.stringify(S.value.requestBody,null,2):""});function A(){const e=I[_.value]||I.claude;U.value=JSON.stringify(e,null,2)}async function O(){if(!T.value)try{const e=await async function(){return(await dl.get(`${Cf}/api/convert/opencode/formats`)).data}();Array.isArray(e.sourceTypes)&&e.sourceTypes.length>0&&(w.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 $(){z.value="",S.value=null}async function j(){var e,a;let l;z.value="",S.value=null;try{l=JSON.parse(U.value||"{}")}catch(t){return void(z.value="原始请求 JSON 解析失败,请检查格式")}P.value=!0;try{const e={claude:Uf,codex:Pf,gemini:Sf}[_.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||"转换失败");S.value=a,Ds.success("转换完成")}catch(t){const l=(null==(a=null==(e=t.response)?void 0:e.data)?void 0:a.error)||t.message||"转换失败";z.value=l}finally{P.value=!1}}async function L(){if(!S.value)return;const e={endpoint:S.value.endpoint,requestBody:S.value.requestBody};try{await navigator.clipboard.writeText(JSON.stringify(e,null,2)),Ds.success("已复制转换结果")}catch(a){Ds.error("复制失败,请手动复制")}}return x(()=>_.value,()=>{A()}),x(()=>p.visible,async e=>{e&&(await O(),U.value||A())}),(e,a)=>(n(),g(d(ce),{show:b.value,"onUpdate:show":a[3]||(a[3]=e=>b.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",zf,[o("div",Tf,[c(d(R),{size:18},{default:u(()=>[c(d(qa))]),_:1})]),a[4]||(a[4]=o("span",null,"OpenCode 请求转换",-1))])]),default:u(()=>[o("div",If,[c(d(Y),{"label-placement":"top"},{default:u(()=>[c(d(X),{label:"来源渠道"},{default:u(()=>[c(d(ee),{value:_.value,"onUpdate:value":a[0]||(a[0]=e=>_.value=e),options:w.value,placeholder:"选择来源渠道"},null,8,["value","options"])]),_:1}),c(d(X),{label:"目标 API"},{default:u(()=>[c(d(ee),{value:C.value,"onUpdate:value":a[1]||(a[1]=e=>C.value=e),options:k.value,placeholder:"选择目标 API"},null,8,["value","options"])]),_:1}),c(d(X),{label:"原始请求 JSON"},{default:u(()=>[c(d(ne),{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}),o("div",Mf,[c(d(F),{quaternary:"",onClick:A},{default:u(()=>[...a[5]||(a[5]=[h("填充示例",-1)])]),_:1}),c(d(ae),null,{default:u(()=>[c(d(F),{onClick:$},{default:u(()=>[...a[6]||(a[6]=[h("清空结果",-1)])]),_:1}),c(d(F),{type:"primary",loading:P.value,onClick:j},{default:u(()=>[...a[7]||(a[7]=[h("开始转换",-1)])]),_:1},8,["loading"])]),_:1})]),z.value?(n(),g(d(pe),{key:0,type:"error","show-icon":!0,style:{"margin-top":"12px"}},{default:u(()=>[h(m(z.value),1)]),_:1})):i("",!0),S.value?(n(),s("div",Af,[o("div",Of,[o("div",$f,[a[8]||(a[8]=o("span",{class:"meta-label"},"转换端点",-1)),c(d(H),{type:"success",size:"small",bordered:!1},{default:u(()=>[h(m(S.value.endpoint),1)]),_:1})]),o("div",jf,[a[9]||(a[9]=o("span",{class:"meta-label"},"目标协议",-1)),c(d(H),{type:"info",size:"small",bordered:!1},{default:u(()=>[h(m(S.value.targetApi),1)]),_:1})]),o("div",Lf,[a[10]||(a[10]=o("span",{class:"meta-label"},"消息数量",-1)),c(d(H),{size:"small",bordered:!1},{default:u(()=>{var e;return[h(m((null==(e=S.value.meta)?void 0:e.messageCount)??0),1)]}),_:1})])]),Array.isArray(S.value.warnings)&&S.value.warnings.length>0?(n(),g(d(pe),{key:0,type:"warning","show-icon":!0,style:{"margin-top":"12px"}},{default:u(()=>[a[11]||(a[11]=o("div",{class:"warning-title"},"转换警告",-1)),o("ul",Ef,[(n(!0),s(f,null,y(S.value.warnings,(e,a)=>(n(),s("li",{key:a},m(e),1))),128))])]),_:1})):i("",!0),c(d(X),{label:"转换后请求 JSON",style:{"margin-top":"12px"}},{default:u(()=>[c(d(ne),{value:M.value,type:"textarea",readonly:"",autosize:{minRows:10,maxRows:18}},null,8,["value"])]),_:1}),o("div",Df,[a[13]||(a[13]=o("div",null,null,-1)),c(d(F),{size:"small",onClick:L},{default:u(()=>[...a[12]||(a[12]=[h("复制转换结果",-1)])]),_:1})])])):i("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-e6530b83"]]);async function Bf(e){return(await ct.get(`/config-registry/${e}`)).data}async function Rf(e){return(await ct.post(`/config-registry/${e}/import`)).data}async function Ff(e,a,l){const t=encodeURIComponent(a);return(await ct.put(`/config-registry/${e}/${t}/toggle`,{enabled:l})).data}async function Hf(e,a,l,t){const s=encodeURIComponent(a);return(await ct.put(`/config-registry/${e}/${s}/platform/${l}`,{enabled:t})).data}async function Gf(e){return(await ct.post(`/config-registry/${e}/sync`)).data}function Kf(e={}){return Boolean((null==e?void 0:e.isLocal)||"local"===(null==e?void 0:e.source))}function qf(e={}){return Boolean("local-repo"===(null==e?void 0:e.source)||"local"===(null==e?void 0:e.repoProvider)||(null==e?void 0:e.repoLocalPath))}function Wf(e={}){return Boolean("gitlab"===(null==e?void 0:e.repoProvider)||(null==e?void 0:e.repoProjectPath))}function Vf(e={}){return Boolean("github"===(null==e?void 0:e.repoProvider)||((null==e?void 0:e.repoOwner)||(null==e?void 0:e.repoName))&&!Wf(e)&&!qf(e))}function Jf(e={}){return!(null==e?void 0:e.protected)&&Boolean((null==e?void 0:e.installSource)||(null==e?void 0:e.isLocal)||qf(e)||Wf(e)||Vf(e))}function Zf(e={}){return(null==e?void 0:e.protected)||"system-installed"===(null==e?void 0:e.source)?"系统":"native-installed"===(null==e?void 0:e.source)?"原生":qf(e)?"本地仓库":Kf(e)?"本地技能":Wf(e)?"GitLab":Vf(e)?"GitHub":""}function Qf(e={}){return Kf(e)&&!qf(e)?"":qf(e)?(null==e?void 0:e.repoLocalPath)||"":Wf(e)?(null==e?void 0:e.repoProjectPath)||[null==e?void 0:e.repoOwner,null==e?void 0:e.repoName].filter(Boolean).join("/"):Vf(e)?[null==e?void 0:e.repoOwner,null==e?void 0:e.repoName].filter(Boolean).join("/"):""}function Yf(e={}){return Kf(e)||qf(e)?null:(null==e?void 0:e.readmeUrl)||(null==e?void 0:e.repoUrl)||null}function Xf(e={}){return Wf(e)?"GitLab":Vf(e)?"GitHub":"仓库"}function ey(e={}){const a=Zf(e),l=Qf(e);return a&&l?`${a} · ${l}`:a||"未知来源"}const ay={class:"asset-card-main"},ly={class:"asset-card-top"},ty={class:"asset-card-title-stack"},sy={class:"asset-card-title-row"},ny={class:"asset-name"},oy={class:"asset-tags"},iy={key:0,class:"asset-description"},ry={class:"asset-meta"},cy={class:"asset-meta-item mono"},uy=["title"],dy=["href"],py=zl({__name:"SkillCard",props:{skill:{type:Object,required:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1}},emits:["click","install","uninstall"],setup:e=>(a,l)=>{return n(),s("div",{class:p(["skill-card asset-card",{"is-installed":e.skill.installed,"is-protected":e.skill.protected}]),onClick:l[4]||(l[4]=l=>a.$emit("click",e.skill))},[o("div",ay,[o("div",ly,[o("div",ty,[o("div",sy,[o("span",{class:p(["asset-status-dot",{active:e.skill.installed}])},null,2),o("span",ny,m(e.skill.name),1)]),o("div",oy,[e.skill.installed?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...l[5]||(l[5]=[h("已安装",-1)])]),_:1})):i("",!0),e.skill.protected?(n(),g(d(H),{key:1,type:"default",size:"tiny",bordered:!1},{default:u(()=>[...l[6]||(l[6]=[h("受保护",-1)])]),_:1})):i("",!0),d(Zf)(e.skill)?(n(),g(d(H),{key:2,type:"info",size:"tiny",bordered:!1},{default:u(()=>[h(m(d(Zf)(e.skill)),1)]),_:1})):i("",!0)])])]),e.skill.description?(n(),s("div",iy,m((t=e.skill.description,r=120,(null==t?void 0:t.length)>r?t.slice(0,r)+"...":t)),1)):i("",!0),o("div",ry,[o("span",cy,m(e.skill.directory),1),d(Qf)(e.skill)?(n(),s("span",{key:0,class:"asset-meta-item source-item",title:d(Qf)(e.skill)},m(d(Qf)(e.skill)),9,uy)):i("",!0),d(Yf)(e.skill)?(n(),s("a",{key:1,class:"asset-link",href:d(Yf)(e.skill),target:"_blank",rel:"noopener noreferrer",onClick:l[0]||(l[0]=v(()=>{},["stop"]))},m(d(Xf)(e.skill)),9,dy)):i("",!0)])]),o("div",{class:"asset-card-actions",onClick:l[3]||(l[3]=v(()=>{},["stop"]))},[e.skill.installed&&!e.skill.protected?(n(),g(d(F),{key:0,size:"small",tertiary:"",type:"error",loading:e.uninstalling,focusable:!1,onClick:l[1]||(l[1]=l=>a.$emit("uninstall",e.skill))},{default:u(()=>[...l[7]||(l[7]=[h("卸载",-1)])]),_:1},8,["loading"])):e.skill.installed&&e.skill.protected?(n(),g(d(F),{key:1,size:"small",tertiary:"",disabled:"",focusable:!1},{default:u(()=>[...l[8]||(l[8]=[h("受保护",-1)])]),_:1})):(n(),g(d(F),{key:2,size:"small",type:"primary",loading:e.installing,disabled:!d(Jf)(e.skill),focusable:!1,onClick:l[2]||(l[2]=l=>a.$emit("install",e.skill))},{default:u(()=>[...l[9]||(l[9]=[h("安装",-1)])]),_:1},8,["loading","disabled"]))])],2);var t,r}},[["__scopeId","data-v-49678fbf"]]);function vy(e=""){return String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").replace(/\/+$/,"")}function my(e=""){const a=String(e||"").trim();if(!a)return null;if(function(e=""){return/^(\/|~\/|\.\/|\.\.\/|[a-zA-Z]:[\\/]|file:\/\/)/.test(String(e||"").trim())}(a))return{provider:"local",localPath:a};const l=a.match(/^git@([^:]+):(.+?)(?:\.git)?$/i);if(l){const e=`https://${l[1]}`,a=l[2].replace(/\.git$/i,"").replace(/^\/+|\/+$/g,""),t=l[1].includes("github")?"github":"gitlab";if("gitlab"===t)return{provider:t,host:e,projectPath:a};const s=a.split("/");if(s.length>=2)return{provider:t,host:e,owner:s[0],name:s[1]}}try{const e=new URL(a);return e.hostname.includes("github")?function(e){const a=e.pathname.replace(/^\/+|\/+$/g,"").replace(/\.git$/i,"").split("/").filter(Boolean);if(a.length<2)return null;const l={provider:"github",host:`${e.protocol}//${e.host}`,owner:a[0],name:a[1]};if(("tree"===a[2]||"blob"===a[2])&&a[3]){l.branch=a[3];const e=a.slice(4);"blob"===a[2]&&e.length>0?l.directory=vy(e.slice(0,-1).join("/")):l.directory=vy(e.join("/"))}return l}(e):function(e){const a=e.pathname.replace(/^\/+|\/+$/g,"").replace(/\.git$/i,"").split("/").filter(Boolean);if(0===a.length)return null;const l=a.findIndex((e,l)=>"-"===e&&("tree"===a[l+1]||"blob"===a[l+1])),t=l>=0?a.slice(0,l):a;if(0===t.length)return null;const s={provider:"gitlab",host:`${e.protocol}//${e.host}`,projectPath:t.join("/")};if(l>=0&&a[l+2]){s.branch=a[l+2];const e=a.slice(l+3);"blob"===a[l+1]&&e.length>0?s.directory=vy(e.slice(0,-1).join("/")):s.directory=vy(e.join("/"))}return s}(e)}catch{}const t=a.split("/").filter(Boolean);return 2===t.length?{provider:"github",owner:t[0],name:t[1]}:null}const fy={class:"repo-manager"},yy={class:"repo-list"},gy={class:"repo-main"},hy={class:"repo-info"},by={class:"repo-name-row"},wy={class:"repo-name"},ky={class:"repo-branch"},_y={key:0,class:"repo-auth-hint"},xy={class:"repo-actions"},Cy={key:0,class:"empty-hint"},Uy={class:"add-repo"},Py={class:"add-form"},Sy={class:"tips"},zy={class:"recommended"},Ty={class:"recommended-list"},Iy=["onClick"],My={class:"rec-info"},Ay={class:"rec-name"},Oy={class:"rec-desc"},$y={key:0,class:"auth-manager"},jy={class:"auth-meta"},Ly={class:"auth-meta-row"},Ey={class:"auth-value"},Dy={class:"auth-meta-row"},Ny={class:"auth-value"},By={class:"auth-meta-row"},Ry={class:"auth-value"},Fy={class:"auth-actions"},Hy=zl({__name:"SkillRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const r=e,v=a,b=t({get:()=>r.visible,set:e=>v("update:visible",e)}),k=l([]),_=l(!1),C=l(!1),U=l(!1),P=l(null),S=l(!1),z=l(!1),T=l({token:""}),I=l({input:"",branch:"main"}),M=t(()=>P.value?("gitlab"===P.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),A=t(()=>"codex"===r.platform?[{provider:"github",owner:"openai",name:"skills",description:"Codex 官方技能库",branch:"main",directory:"skills/.curated"}]:"opencode"===r.platform?[{provider:"github",owner:"Shakudo-io",name:"opencode-skills",description:"OpenCode 官方技能库(46个技能)",branch:"main",directory:""}]:"gemini"===r.platform?[{provider:"github",owner:"google-gemini",name:"gemini-cli",description:"Gemini 官方技能库",branch:"main",directory:".gemini/skills"}]:[{provider:"github",owner:"anthropics",name:"skills",description:"官方技能库",branch:"main",directory:"skills"},{provider:"github",owner:"ComposioHQ",name:"awesome-claude-skills",description:"社区精选",branch:"master"},{provider:"github",owner:"cexll",name:"myclaude",description:"多智能体工作流",branch:"master"}]);function O(e){const a=e.provider||(e.localPath?"local":e.projectPath?"gitlab":"github"),l=vy(e.directory),t=e.branch||"main";return"local"===a?`local:${e.localPath||""}::${l}`:"gitlab"===a?`gitlab:${e.host||"https://gitlab.com"}::${e.projectPath||""}::${t}::${l}`:`github:${e.host||"https://github.com"}::${e.owner||""}/${e.name||""}::${t}::${l}`}function j(e){return"local"===e.provider?e.localPath||e.name||"本地仓库":"gitlab"===e.provider&&e.projectPath||[e.owner,e.name].filter(Boolean).join("/")}function L(e){const a=[];return"local"===e.provider?a.push("本地仓库"):"gitlab"===e.provider?(a.push("GitLab"),e.host&&a.push(e.host.replace(/^https?:\/\//,""))):a.push("GitHub"),e.branch&&a.push(e.branch),e.directory&&a.push(`目录: ${e.directory}`),a.join(" · ")}function E(e){return"github"===(null==e?void 0:e.provider)||"gitlab"===(null==e?void 0:e.provider)}function D(e){return E(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function N(){U.value=!1,P.value=null,T.value.token="",S.value=!1,z.value=!1}const B=t(()=>my(I.value.input)),K=t(()=>!!B.value);async function q(){_.value=!0;try{const e=await async function(e="claude"){return(await ct.get("/skills/repos",{params:{platform:e}})).data}(r.platform);e.success&&(k.value=e.repos||[])}catch(e){Ds.error("加载仓库失败: "+e.message)}finally{_.value=!1}}async function W(){if(!K.value)return;const e=B.value;C.value=!0;try{const a=await uo({...e,branch:I.value.branch||"main",enabled:!0},r.platform);a.success&&(k.value=a.repos,I.value.input="",I.value.branch="main",Ds.success("仓库添加成功"),v("updated"))}catch(a){Ds.error("添加失败: "+a.message)}finally{C.value=!1}}async function V(e){try{const a=await async function(e,a="claude"){return(await ct.delete("/skills/repos",{params:{platform:a,id:e.id||"",owner:e.owner||"",name:e.name||"",directory:e.directory||""}})).data}(e,r.platform);a.success&&(k.value=a.repos,Ds.success("仓库已删除"),v("updated"))}catch(a){Ds.error("删除失败: "+a.message)}}async function J(e,a){try{const l=await async function(e,a,l="claude"){return(await ct.put("/skills/repos/toggle",{id:e.id||"",owner:e.owner||"",name:e.name||"",enabled:a,directory:e.directory||"",platform:l})).data}(e,a,r.platform);l.success&&(k.value=l.repos,v("updated"))}catch(l){Ds.error("操作失败: "+l.message)}}async function Q(){const e=P.value,a=T.value.token.trim();if(e&&a){S.value=!0;try{const l=await po(e,{token:a},r.platform);l.success&&(k.value=l.repos||[],Ds.success("仓库 Token 已保存"),v("updated"),N())}catch(l){Ds.error("保存 Token 失败: "+l.message)}finally{S.value=!1}}}async function Y(){const e=P.value;if(e){z.value=!0;try{const a=await po(e,{clearToken:!0},r.platform);a.success&&(k.value=a.repos||[],Ds.success("仓库 Token 已清除"),v("updated"),N())}catch(a){Ds.error("清除 Token 失败: "+a.message)}finally{z.value=!1}}}function X(e){const a=O(e);return k.value.some(e=>O(e)===a)}function ee(){N(),v("update:visible",!1)}return x(()=>r.visible,e=>{e&&q()}),x(()=>r.platform,()=>{r.visible&&q()}),w(()=>{r.visible&&q()}),(e,a)=>(n(),s(f,null,[c(d(se),{show:b.value,"onUpdate:show":a[2]||(a[2]=e=>b.value=e),preset:"card",title:"技能仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:ee},{default:u(()=>[o("div",fy,[o("div",yy,[c(d(Z),{show:_.value},{default:u(()=>[(n(!0),s(f,null,y(k.value,e=>(n(),s("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:"repo-item"},[o("div",gy,[c(d(G),{value:e.enabled,size:"small","onUpdate:value":a=>J(e,a)},null,8,["value","onUpdate:value"]),o("div",hy,[o("div",by,[o("div",wy,m(j(e)),1),E(e)?(n(),g(d(H),{key:0,size:"tiny",type:e.hasToken?"success":"default",bordered:!1},{default:u(()=>[h(m(e.hasToken?"已配 Token":"未配 Token"),1)]),_:2},1032,["type"])):i("",!0)]),o("div",ky,m(L(e)),1),E(e)?(n(),s("div",_y,m(D(e)),1)):i("",!0)])]),o("div",xy,[E(e)?(n(),g(d(F),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){E(e)&&(P.value=e,T.value.token="",U.value=!0)}(e)},{default:u(()=>[...a[5]||(a[5]=[h(" 认证 ",-1)])]),_:1},8,["onClick"])):i("",!0),c(d(F),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>V(e)},{default:u(()=>[...a[6]||(a[6]=[h(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===k.value.length?(n(),s("div",Cy," 暂无仓库,请添加 ")):i("",!0)]),_:1},8,["show"])]),o("div",Uy,[a[8]||(a[8]=o("div",{class:"add-title"},"添加仓库",-1)),o("div",Py,[c(d(ne),{value:I.value.input,"onUpdate:value":a[0]||(a[0]=e=>I.value.input=e),placeholder:"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:$(W,["enter"])},null,8,["value"]),c(d(ne),{value:I.value.branch,"onUpdate:value":a[1]||(a[1]=e=>I.value.branch=e),placeholder:"分支(本地可忽略)",size:"small",class:"branch-input"},null,8,["value"]),c(d(F),{type:"primary",size:"small",disabled:!K.value,loading:C.value,focusable:!1,onClick:W},{default:u(()=>[...a[7]||(a[7]=[h(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[9]||(a[9]=o("div",{class:"add-hint"}," 支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径 ",-1))]),o("div",Sy,[c(d(pe),{type:"info",bordered:!1,size:"small"},{default:u(()=>[...a[10]||(a[10]=[h(" 支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。 ",-1)])]),_:1})]),o("div",zy,[a[12]||(a[12]=o("div",{class:"recommended-title"},"推荐仓库",-1)),o("div",Ty,[(n(!0),s(f,null,y(A.value,e=>(n(),s("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:p(["recommended-item",{added:X(e)}]),onClick:a=>!X(e)&&async function(e){C.value=!0;try{const a=await uo({...e,branch:e.branch||"main",directory:e.directory||"",enabled:!0},r.platform);a.success&&(k.value=a.repos,Ds.success("仓库添加成功"),v("updated"))}catch(a){Ds.error("添加失败: "+a.message)}finally{C.value=!1}}(e)},[o("div",My,[o("span",Ay,m(j(e)),1),o("span",Oy,m(e.description),1)]),X(e)?(n(),g(d(H),{key:0,size:"tiny",type:"success",bordered:!1},{default:u(()=>[...a[11]||(a[11]=[h(" 已添加 ",-1)])]),_:1})):(n(),g(d(R),{key:1,class:"add-icon"},{default:u(()=>[c(d(Ke))]),_:1}))],10,Iy))),128))])])])]),_:1},8,["show"]),c(d(se),{show:U.value,"onUpdate:show":a[4]||(a[4]=e=>U.value=e),preset:"card",title:M.value,bordered:!1,style:{width:"460px","max-width":"92vw"},onClose:N},{default:u(()=>[P.value?(n(),s("div",$y,[c(d(pe),{type:"info",bordered:!1,size:"small"},{default:u(()=>{return[h(m((e=P.value,"gitlab"===(null==e?void 0:e.provider)?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),o("div",jy,[o("div",Ly,[a[13]||(a[13]=o("span",{class:"auth-label"},"仓库",-1)),o("span",Ey,m(j(P.value)),1)]),o("div",Dy,[a[14]||(a[14]=o("span",{class:"auth-label"},"来源",-1)),o("span",Ny,m("gitlab"===P.value.provider?"GitLab":"GitHub"),1)]),o("div",By,[a[15]||(a[15]=o("span",{class:"auth-label"},"当前状态",-1)),o("span",Ry,m(P.value.hasToken?`已配置 ${P.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),c(d(ne),{value:T.value.token,"onUpdate:value":a[3]||(a[3]=e=>T.value.token=e),type:"password","show-password-on":"click",clearable:"",placeholder:"输入此仓库专属 Token",onKeyup:$(Q,["enter"])},null,8,["value"]),a[19]||(a[19]=o("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),o("div",Fy,[c(d(F),{focusable:!1,onClick:N},{default:u(()=>[...a[16]||(a[16]=[h(" 取消 ",-1)])]),_:1}),P.value.hasToken?(n(),g(d(F),{key:0,type:"warning",secondary:"",focusable:!1,loading:z.value,onClick:Y},{default:u(()=>[...a[17]||(a[17]=[h(" 清除 Token ",-1)])]),_:1},8,["loading"])):i("",!0),c(d(F),{type:"primary",focusable:!1,disabled:!T.value.token.trim(),loading:S.value,onClick:Q},{default:u(()=>[...a[18]||(a[18]=[h(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):i("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-af029748"]]),Gy={style:{"margin-bottom":"12px"}},Ky={class:"file-list"},qy={class:"file-item"},Wy={class:"file-info"},Vy={class:"file-path"},Jy={key:1,class:"file-size"},Zy={class:"file-actions"},Qy={class:"modal-footer"},Yy=zl({__name:"SkillCreateModal",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","created"],setup(e,{emit:a}){const r=e,v=a,b=t({get:()=>r.visible,set:e=>v("update:visible",e)}),w=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),P=l({directory:"",files:[]}),S={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}]},z=l(!1),T=l(!1),I=l(null),M=l(""),A=l(-1),O=l(!1),$=l(""),j=l(""),L=t(()=>P.value.files.some(e=>"SKILL.md"===e.path));function E(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 D({file:e}){return!0}async function N({file:e,onFinish:a,onError:l}){try{const t=new FileReader;t.onload=l=>{var t;const s=E(e.name);let n=e.name;if(null==(t=e.file)?void 0:t.webkitRelativePath){n=e.file.webkitRelativePath.split("/").slice(1).join("/")}P.value.files.push({path:n,content:s?l.target.result:btoa(l.target.result),isBase64:!s,size:e.file.size}),a()},t.onerror=l,E(e.name)?t.readAsText(e.file):t.readAsBinaryString(e.file)}catch(t){l()}}function B(){A.value>=0&&(P.value.files[A.value].content=M.value),T.value=!1,I.value=null,M.value="",A.value=-1}function G(){$.value.trim()?P.value.files.some(e=>e.path===$.value)?Ds.warning("文件已存在"):(P.value.files.push({path:$.value,content:j.value,isBase64:!1,size:new Blob([j.value]).size}),O.value=!1,$.value="",j.value=""):Ds.warning("请输入文件路径")}function q(){const e=`---\nname: "${P.value.directory||"我的技能"}"\ndescription: "技能描述"\n---\n\n# 技能指令\n\n在这里编写你的技能内容...\n`;P.value.files.unshift({path:"SKILL.md",content:e,isBase64:!1,size:new Blob([e]).size})}async function W(){"simple"===w.value?await async function(){var e,a,l;try{await(null==(e=k.value)?void 0:e.validate())}catch(t){return}z.value=!0;try{const e=await async function(e,a="claude"){return(await ct.post("/skills/create",{...e,platform:a})).data}({name:_.value.name||_.value.directory,directory:_.value.directory,description:_.value.description,content:_.value.content},r.platform);e.success?(Ds.success("技能创建成功"),v("created"),V()):Ds.error(e.message||"创建失败")}catch(t){Ds.error("创建失败: "+((null==(l=null==(a=t.response)?void 0:a.data)?void 0:l.message)||t.message))}finally{z.value=!1}}():await async function(){var e,a,l;try{await(null==(e=U.value)?void 0:e.validate())}catch(t){return}if(!L.value)return void Ds.error("必须包含 SKILL.md 文件");z.value=!0;try{const e=await async function(e,a="claude"){return(await ct.post("/skills/create-with-files",{...e,platform:a})).data}({directory:P.value.directory,files:P.value.files.map(e=>({path:e.path,content:e.content,isBase64:e.isBase64}))},r.platform);e.success?(Ds.success(`技能创建成功,包含 ${e.fileCount} 个文件`),v("created"),V()):Ds.error(e.message||"创建失败")}catch(t){Ds.error("创建失败: "+((null==(l=null==(a=t.response)?void 0:a.data)?void 0:l.message)||t.message))}finally{z.value=!1}}()}function V(){v("update:visible",!1)}return x(()=>r.visible,e=>{e||(w.value="simple",_.value={directory:"",name:"",description:"",content:""},P.value={directory:"",files:[]},I.value=null,M.value="",A.value=-1,$.value="",j.value="")}),(e,a)=>(n(),g(d(se),{show:b.value,"onUpdate:show":a[14]||(a[14]=e=>b.value=e),preset:"card",title:"创建自定义技能",bordered:!1,closable:!0,style:{width:"680px","max-width":"90vw"},onClose:V},{footer:u(()=>[o("div",Qy,[c(d(F),{onClick:V},{default:u(()=>[...a[24]||(a[24]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:z.value,onClick:W},{default:u(()=>[...a[25]||(a[25]=[h(" 创建 ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[c(d(ge),{value:w.value,"onUpdate:value":a[6]||(a[6]=e=>w.value=e),type:"line",animated:""},{default:u(()=>[c(d(he),{name:"simple",tab:"简单模式"},{default:u(()=>[c(d(Y),{ref_key:"simpleFormRef",ref:k,model:_.value,rules:C,"label-placement":"top","label-width":"auto"},{default:u(()=>[c(d(X),{label:"目录名称",path:"directory"},{feedback:u(()=>[...a[15]||(a[15]=[h(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:u(()=>[c(d(ne),{value:_.value.directory,"onUpdate:value":a[0]||(a[0]=e=>_.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),c(d(X),{label:"技能名称",path:"name"},{default:u(()=>[c(d(ne),{value:_.value.name,"onUpdate:value":a[1]||(a[1]=e=>_.value.name=e),placeholder:"显示名称,可以是中文",maxlength:100},null,8,["value"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:_.value.description,"onUpdate:value":a[2]||(a[2]=e=>_.value.description=e),type:"textarea",placeholder:"简短描述这个技能的用途",rows:2,maxlength:200},null,8,["value"])]),_:1}),c(d(X),{label:"技能内容 (提示词,支持 Markdown)",path:"content"},{default:u(()=>[c(Jv,{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}),c(d(he),{name:"advanced",tab:"高级模式 (多文件)"},{default:u(()=>[c(d(Y),{ref_key:"advancedFormRef",ref:U,model:P.value,rules:S,"label-placement":"top","label-width":"auto"},{default:u(()=>[c(d(X),{label:"目录名称",path:"directory"},{feedback:u(()=>[...a[16]||(a[16]=[h(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:u(()=>[c(d(ne),{value:P.value.directory,"onUpdate:value":a[4]||(a[4]=e=>P.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),c(d(X),{label:"文件上传"},{default:u(()=>[c(d(ke),{multiple:"","directory-dnd":"","show-file-list":!1,"custom-request":N,onBeforeUpload:D},{default:u(()=>[c(d(_e),null,{default:u(()=>[o("div",Gy,[c(d(R),{size:"48",depth:3},{default:u(()=>[c(d(Wa))]),_:1})]),c(d(K),{style:{"font-size":"16px"}},{default:u(()=>[...a[17]||(a[17]=[h(" 拖放文件或文件夹到此处,或点击选择 ",-1)])]),_:1}),c(d(xe),{depth:"3",style:{margin:"8px 0 0 0"}},{default:u(()=>[...a[18]||(a[18]=[h(" 必须包含 SKILL.md 文件 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),P.value.files.length>0?(n(),g(d(X),{key:0,label:"已添加的文件"},{default:u(()=>[o("div",Ky,[(n(!0),s(f,null,y(P.value.files,(e,l)=>(n(),g(d(Ce),{key:e.path,size:"small",class:p({"skill-md":"SKILL.md"===e.path})},{default:u(()=>{return[o("div",qy,[o("div",Wy,[c(d(R),{size:16,class:"file-icon"},{default:u(()=>[e.isDirectory?(n(),g(d(Va),{key:1})):(n(),g(d(sa),{key:0}))]),_:2},1024),o("span",Vy,m(e.path),1),"SKILL.md"===e.path?(n(),g(d(H),{key:0,size:"small",type:"primary"},{default:u(()=>[...a[19]||(a[19]=[h("必需",-1)])]),_:1})):i("",!0),e.size?(n(),s("span",Jy,m((t=e.size,t<1024?t+" B":t<1048576?(t/1024).toFixed(1)+" KB":(t/1048576).toFixed(1)+" MB")),1)):i("",!0)]),o("div",Zy,[E(e.path)?(n(),g(d(F),{key:0,size:"small",text:"",onClick:e=>function(e){const a=P.value.files[e];I.value=a,M.value=a.content,A.value=e,T.value=!0}(l)},{default:u(()=>[...a[20]||(a[20]=[h(" 编辑 ",-1)])]),_:1},8,["onClick"])):i("",!0),"SKILL.md"!==e.path?(n(),g(d(F),{key:1,size:"small",text:"",type:"error",onClick:e=>function(e){P.value.files.splice(e,1)}(l)},{default:u(()=>[...a[21]||(a[21]=[h(" 删除 ",-1)])]),_:1},8,["onClick"])):i("",!0)])])];var t}),_:2},1032,["class"]))),128))])]),_:1})):i("",!0),c(d(X),null,{default:u(()=>[c(d(ae),null,{default:u(()=>[c(d(F),{onClick:a[5]||(a[5]=e=>O.value=!0)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[22]||(a[22]=h(" 添加文件 ",-1))]),_:1}),L.value?i("",!0):(n(),g(d(F),{key:0,onClick:q},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Oa))]),_:1})]),default:u(()=>[a[23]||(a[23]=h(" 添加 SKILL.md 模板 ",-1))]),_:1}))]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["value"]),c(d(se),{show:T.value,"onUpdate:show":a[9]||(a[9]=e=>T.value=e),preset:"card",title:"编辑文件",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:a[8]||(a[8]=e=>T.value=!1)},{default:u(()=>[...a[26]||(a[26]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:B},{default:u(()=>[...a[27]||(a[27]=[h("保存",-1)])]),_:1})]),_:1})]),default:u(()=>{var e;return[c(d(X),{label:(null==(e=I.value)?void 0:e.path)||"文件内容"},{default:u(()=>[c(d(ne),{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"]),c(d(se),{show:O.value,"onUpdate:show":a[13]||(a[13]=e=>O.value=e),preset:"card",title:"添加新文件",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:a[12]||(a[12]=e=>O.value=!1)},{default:u(()=>[...a[29]||(a[29]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:G},{default:u(()=>[...a[30]||(a[30]=[h("添加",-1)])]),_:1})]),_:1})]),default:u(()=>[c(d(Y),{"label-placement":"top"},{default:u(()=>[c(d(X),{label:"文件路径"},{feedback:u(()=>[...a[28]||(a[28]=[h(" 可以包含子目录,如 scripts/helper.sh ",-1)])]),default:u(()=>[c(d(ne),{value:$.value,"onUpdate:value":a[10]||(a[10]=e=>$.value=e),placeholder:"例如: scripts/helper.sh 或 README.md"},null,8,["value"])]),_:1}),c(d(X),{label:"文件内容"},{default:u(()=>[c(d(ne),{value:j.value,"onUpdate:value":a[11]||(a[11]=e=>j.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-e4db56d3"]]),Xy={key:0,class:"asset-detail-info-section"},eg={class:"asset-detail-section-title"},ag={class:"asset-detail-box asset-detail-path-box"},lg={class:"asset-detail-path-text"},tg={__name:"AssetPathField",props:{path:{type:String,default:""},title:{type:String,default:"路径"}},setup(e){const a=e,l=t(()=>String(a.path||"").trim());async function r(){if(l.value)try{const e=await Lo(l.value);if("manual"===(null==e?void 0:e.method))return void Ds.warning("自动复制失败,已弹出手动复制框");Ds.success("已复制路径")}catch{Ds.error("复制路径失败")}}return(a,t)=>l.value?(n(),s("div",Xy,[o("h3",eg,m(e.title),1),o("div",ag,[c(d(R),{size:16,class:"asset-detail-path-icon"},{default:u(()=>[c(d(Oa))]),_:1}),o("code",lg,m(l.value),1),c(d(ie),{trigger:"hover"},{trigger:u(()=>[c(d(F),{circle:"",quaternary:"",size:"tiny",class:"asset-detail-path-copy","aria-label":"复制路径",onClick:v(r,["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ha))]),_:1})]),_:1})]),default:u(()=>[t[0]||(t[0]=h(" 复制路径 ",-1))]),_:1})])])):i("",!0)}},sg={class:"asset-detail-drawer-header"},ng={class:"asset-detail-identity"},og={class:"asset-detail-heading"},ig={class:"asset-detail-name"},rg={class:"asset-detail-meta"},cg={key:3,class:"asset-detail-subtle"},ug={class:"asset-detail-body"},dg={key:0,class:"asset-detail-loading"},pg={key:1,class:"asset-detail-error"},vg={class:"asset-detail-container"},mg={class:"asset-detail-info-section"},fg={class:"asset-detail-description"},yg={key:0,class:"asset-detail-info-section"},gg={class:"asset-detail-box"},hg=["href"],bg={key:1},wg={class:"asset-detail-info-section"},kg={class:"asset-detail-actions"},_g=["innerHTML"],xg={key:1,class:"asset-detail-empty"},Cg={__name:"SkillDetailDrawer",props:{visible:{type:Boolean,default:!1},skill:{type:Object,default:null},platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const{drawerWidth:r}=ei(600),p=e,v=a,f=t({get:()=>p.visible,set:e=>v("update:visible",e)}),y=l(!1),b=l(""),w=l(null),k=l(!1),_=l(!1),C={height:"100%",minHeight:0,overflow:"hidden"},U=t(()=>{var e;if(!(null==(e=w.value)?void 0:e.content))return"";try{return wl(w.value.content,{breaks:!0,gfm:!0})}catch{return w.value.content}}),P=t(()=>w.value?Qf(w.value):""),S=t(()=>w.value?Yf(w.value):""),z=t(()=>w.value?Xf(w.value):""),T=t(()=>{var e,a,l;return(null==(e=w.value)?void 0:e.installPath)||(null==(a=w.value)?void 0:a.path)||(null==(l=w.value)?void 0:l.fullPath)||""});function I(e){return{id:e.repoId,provider:e.repoProvider,host:e.repoHost,owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main",directory:e.repoDirectory||"",projectPath:e.repoProjectPath,localPath:e.repoLocalPath,repoUrl:e.repoUrl}}async function M(){var e,a,l,t,s,n,o,i,r,c;if(null==(e=p.skill)?void 0:e.directory){y.value=!0,b.value="";try{const e=await async function(e,a="claude",l=null,t=null){const s={platform:a};return t&&(s.fullDirectory=t),l&&(l.id&&(s.repoId=l.id),l.provider&&(s.provider=l.provider),l.host&&(s.host=l.host),l.owner&&(s.owner=l.owner),l.name&&(s.name=l.name),l.branch&&(s.branch=l.branch),l.directory&&(s.directory=l.directory),l.projectPath&&(s.projectPath=l.projectPath),l.localPath&&(s.localPath=l.localPath),l.repoUrl&&(s.repoUrl=l.repoUrl)),(await ct.get(`/skills/detail/${e}`,{params:s})).data}(p.skill.directory,p.platform,I(p.skill),p.skill.fullDirectory||null);e.success?w.value={...p.skill,...e,source:e.source||(null==(a=p.skill)?void 0:a.source),repoProvider:e.repoProvider||(null==(l=p.skill)?void 0:l.repoProvider),repoOwner:e.repoOwner||(null==(t=p.skill)?void 0:t.repoOwner),repoName:e.repoName||(null==(s=p.skill)?void 0:s.repoName),repoProjectPath:e.repoProjectPath||(null==(n=p.skill)?void 0:n.repoProjectPath),repoLocalPath:e.repoLocalPath||(null==(o=p.skill)?void 0:o.repoLocalPath),repoUrl:e.repoUrl||(null==(i=p.skill)?void 0:i.repoUrl)}:b.value=e.message||"加载失败"}catch(u){b.value=(null==(c=null==(r=u.response)?void 0:r.data)?void 0:c.message)||u.message||"加载失败"}finally{y.value=!1}}}async function A(){var e,a;if(p.skill&&!p.skill.protected){k.value=!0;try{(await ro(p.skill.directory,I(p.skill),p.skill.fullDirectory||null,p.platform)).success&&(Ds.success("安装成功"),w.value&&(w.value.installed=!0),v("updated"))}catch(l){Ds.error("安装失败: "+((null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message))}finally{k.value=!1}}}async function O(){var e,a;if(w.value&&!w.value.protected){_.value=!0;try{(await co(w.value.directory,p.platform)).success&&(Ds.success("卸载成功"),w.value&&(w.value.installed=!1),v("updated"))}catch(l){Ds.error("卸载失败: "+((null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message))}finally{_.value=!1}}}async function $(){var e;if(null==(e=w.value)?void 0:e.content)try{const e=await Lo(w.value.content);if("manual"===(null==e?void 0:e.method))return void Ds.warning("自动复制失败,已弹出手动复制框");Ds.success("已复制到剪贴板")}catch{Ds.error("复制失败")}}return x(()=>p.visible,e=>{e&&p.skill?M():(w.value=null,b.value="")}),(a,l)=>(n(),g(d(ce),{show:f.value,"onUpdate:show":l[0]||(l[0]=e=>f.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":C},{header:u(()=>{var a,t,r,p;return[o("div",sg,[o("div",ng,[c(d(R),{size:20,class:"asset-detail-icon"},{default:u(()=>[c(d(Je))]),_:1}),o("div",og,[o("span",ig,m((null==(a=w.value)?void 0:a.name)||(null==(t=e.skill)?void 0:t.name)||"技能详情"),1),o("div",rg,[(null==(r=w.value)?void 0:r.installed)?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...l[1]||(l[1]=[h("已安装",-1)])]),_:1})):(n(),g(d(H),{key:1,type:"default",size:"tiny",bordered:!1},{default:u(()=>[...l[2]||(l[2]=[h("未安装",-1)])]),_:1})),(null==(p=w.value)?void 0:p.protected)?(n(),g(d(H),{key:2,type:"default",size:"tiny",bordered:!1},{default:u(()=>[...l[3]||(l[3]=[h("受保护",-1)])]),_:1})):i("",!0),w.value?(n(),s("span",cg,m(d(ey)(w.value)),1)):i("",!0)])])])])]}),default:u(()=>[o("div",ug,[y.value?(n(),s("div",dg,[c(d(Z),{size:"medium"}),l[4]||(l[4]=o("p",null,"加载技能详情中...",-1))])):b.value?(n(),s("div",pg,[c(d(R),{size:44,class:"asset-detail-error-icon"},{default:u(()=>[c(d(Da))]),_:1}),o("p",null,m(b.value),1),c(d(F),{size:"small",onClick:M},{default:u(()=>[...l[5]||(l[5]=[h("重试",-1)])]),_:1})])):w.value?(n(),g(d(ge),{key:2,type:"line",animated:"",class:"asset-detail-tabs"},{default:u(()=>[c(d(he),{name:"overview",tab:"概览"},{default:u(()=>[o("div",vg,[o("div",mg,[l[6]||(l[6]=o("h3",{class:"asset-detail-section-title"},"描述",-1)),o("p",fg,m(w.value.description||"暂无描述"),1)]),c(tg,{path:T.value},null,8,["path"]),P.value||S.value?(n(),s("div",yg,[l[7]||(l[7]=o("h3",{class:"asset-detail-section-title"},"来源",-1)),o("div",gg,[c(d(R),{size:16},{default:u(()=>[c(d(la))]),_:1}),S.value?(n(),s("a",{key:0,class:"asset-detail-link",href:S.value,target:"_blank",rel:"noopener noreferrer"},m(z.value),9,hg)):(n(),s("code",bg,m(P.value),1))])])):i("",!0),o("div",wg,[l[12]||(l[12]=o("h3",{class:"asset-detail-section-title"},"操作",-1)),o("div",kg,[!w.value.installed&&d(Jf)(w.value)?(n(),g(d(F),{key:0,type:"primary",size:"small",loading:k.value,onClick:A},{default:u(()=>[...l[8]||(l[8]=[h(" 安装此技能 ",-1)])]),_:1},8,["loading"])):i("",!0),w.value.installed&&!w.value.protected?(n(),g(d(F),{key:1,type:"error",tertiary:"",size:"small",loading:_.value,onClick:O},{default:u(()=>[...l[9]||(l[9]=[h(" 卸载 ",-1)])]),_:1},8,["loading"])):w.value.installed&&w.value.protected?(n(),g(d(F),{key:2,tertiary:"",size:"small",disabled:""},{default:u(()=>[...l[10]||(l[10]=[h(" 受保护 ",-1)])]),_:1})):i("",!0),c(d(F),{text:"",size:"small",disabled:!w.value.content,onClick:$},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ha))]),_:1})]),default:u(()=>[l[11]||(l[11]=h(" 复制内容 ",-1))]),_:1},8,["disabled"])])])])]),_:1}),c(d(he),{name:"content",tab:"内容"},{default:u(()=>[w.value.content?(n(),s("div",{key:0,class:"asset-detail-content",innerHTML:U.value},null,8,_g)):(n(),s("div",xg,[c(d(R),{size:44,class:"asset-detail-empty-icon"},{default:u(()=>[c(d(Oa))]),_:1}),l[13]||(l[13]=o("p",null,"暂无技能内容",-1))]))]),_:1})]),_:1})):i("",!0)])]),_:1})]),_:1},8,["show","width"]))}},Ug={key:0,class:"asset-panel-header"},Pg={class:"asset-title-group"},Sg={class:"asset-heading"},zg={class:"asset-title-row"},Tg={class:"asset-platform-pill"},Ig={class:"asset-action-row"},Mg={key:1,class:"asset-drawer-toolbar"},Ag={class:"asset-action-row"},Og={class:"asset-summary"},$g={class:"asset-summary-item"},jg={class:"asset-summary-value"},Lg={class:"asset-summary-item"},Eg={class:"asset-summary-value"},Dg={class:"asset-summary-item"},Ng={class:"asset-summary-value"},Bg={class:"asset-filter-bar"},Rg={class:"asset-panel-content"},Fg={key:0,class:"asset-empty"},Hg={key:1,class:"asset-list"},Gg={class:"asset-footer"},Kg=zl({__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,r=M(),v=Ue(),b=l(!1),k=l([]),_=l(""),C=l("all"),U=l(!1),P=l(!1),S=l(!1),z=l(null),T=l({}),I=l({}),A=l(!1),O=l(0),$=vr.filter(e=>!1!==e.supportsSkills).map(e=>e.key),j=t(()=>{if(a.platform&&$.includes(a.platform))return a.platform;const e=r.meta.channel;return $.includes(e)?e:"claude"}),L=t(()=>{const e=gr(j.value);return e.label||e.title||"Claude Code"}),E=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"}],D=t(()=>k.value.filter(e=>e.installed).length),N=t(()=>{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)}),B=t(()=>_.value?"没有匹配的技能":"installed"===C.value?"暂无已安装的技能":"uninstalled"===C.value?"所有技能都已安装":"暂无可用技能,请配置仓库源");async function H(e=!1){const a=++O.value,l=j.value;b.value=!0;try{const t=await io(e,l);if(a!==O.value||l!==j.value)return;t.success&&(k.value=t.skills||[])}catch(t){v.error("加载技能失败: "+t.message)}finally{a===O.value&&(b.value=!1)}}async function G(){if("claude"===j.value){A.value=!0;try{const e=await Rf("skills");e.success?(v.success(`成功导入 ${e.imported} 个技能`),await H()):v.error(e.message||"导入失败")}catch(e){v.error("导入失败: "+e.message)}finally{A.value=!1}}}async function K(e){if(!e.protected){T.value[e.key]=!0;try{let a;if(e.isLocal)a=await async function(e,a="claude"){return(await ct.post("/skills/install-local",{directory:e,platform:a})).data}(e.directory,j.value);else{if(!e.repoOwner&&!e.repoProjectPath&&!e.repoLocalPath)return void v.error("缺少仓库信息");a=await ro(e.directory,{id:e.repoId,provider:e.repoProvider,host:e.repoHost,owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main",directory:e.repoDirectory||"",projectPath:e.repoProjectPath,localPath:e.repoLocalPath,repoUrl:e.repoUrl},e.fullDirectory||null,j.value)}if(a.success){v.success(`技能 "${e.name}" 安装成功`);const a=k.value.find(a=>a.key===e.key);a&&(a.installed=!0)}}catch(a){v.error("安装失败: "+a.message)}finally{delete T.value[e.key]}}}async function q(e){if(!e.protected){I.value[e.key]=!0;try{if((await co(e.directory,j.value)).success){v.success(`技能 "${e.name}" 已卸载`);const a=k.value.find(a=>a.key===e.key);a&&(a.installed=!1)}}catch(a){v.error("卸载失败: "+a.message)}finally{delete I.value[e.key]}}}function W(e){z.value=e,S.value=!0}return w(()=>{a.inDrawer&&!a.drawerVisible||H()}),x(()=>a.drawerVisible,e=>{e&&H()}),x(()=>j.value,()=>{H()}),(a,l)=>(n(),s("div",{class:p(["skills-panel asset-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?i("",!0):(n(),s("div",Ug,[o("div",Pg,[e.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d($a))]),_:1})]),_:1})),o("div",Sg,[o("div",zg,[l[14]||(l[14]=o("span",{class:"asset-title"},"技能管理",-1)),o("span",Tg,m(L.value),1)]),l[15]||(l[15]=o("div",{class:"asset-subtitle"},"安装、创建和同步当前平台可用的技能",-1))])]),o("div",Ig,[c(d(F),{text:"",focusable:!1,onClick:l[1]||(l[1]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[16]||(l[16]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",focusable:!1,onClick:l[2]||(l[2]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(la))]),_:1})]),default:u(()=>[l[17]||(l[17]=h(" 仓库 ",-1))]),_:1}),c(d(F),{text:"",focusable:!1,onClick:G,loading:A.value,disabled:"claude"!==j.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ja))]),_:1})]),default:u(()=>[l[18]||(l[18]=h(" 导入 ",-1))]),_:1},8,["loading","disabled"]),c(d(F),{text:"",focusable:!1,onClick:l[3]||(l[3]=e=>H(!0)),loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[19]||(l[19]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),s("div",Mg,[o("div",Ag,[c(d(F),{text:"",focusable:!1,onClick:l[4]||(l[4]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[20]||(l[20]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",focusable:!1,onClick:l[5]||(l[5]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(la))]),_:1})]),default:u(()=>[l[21]||(l[21]=h(" 仓库 ",-1))]),_:1}),c(d(F),{text:"",focusable:!1,onClick:G,loading:A.value,disabled:"claude"!==j.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ja))]),_:1})]),default:u(()=>[l[22]||(l[22]=h(" 导入 ",-1))]),_:1},8,["loading","disabled"]),c(d(F),{text:"",focusable:!1,onClick:l[6]||(l[6]=e=>H(!0)),loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[23]||(l[23]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",Og,[o("span",$g,[l[24]||(l[24]=o("span",{class:"asset-summary-label"},"全部",-1)),o("span",jg,m(k.value.length),1)]),o("span",Lg,[l[25]||(l[25]=o("span",{class:"asset-summary-label"},"已安装",-1)),o("span",Eg,m(D.value),1)]),o("span",Dg,[l[26]||(l[26]=o("span",{class:"asset-summary-label"},"可安装",-1)),o("span",Ng,m(k.value.length-D.value),1)])]),o("div",Bg,[c(d(ne),{value:_.value,"onUpdate:value":l[7]||(l[7]=e=>_.value=e),placeholder:"搜索技能名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:C.value,"onUpdate:value":l[8]||(l[8]=e=>C.value=e),options:E,size:"small",class:"asset-filter"},null,8,["value"])]),o("div",Rg,[c(d(Z),{show:b.value},{default:u(()=>[0!==N.value.length||b.value?(n(),s("div",Hg,[(n(!0),s(f,null,y(N.value,e=>(n(),g(py,{key:e.key,skill:e,installing:!!T.value[e.key],uninstalling:!!I.value[e.key],onInstall:K,onUninstall:q,onClick:W},null,8,["skill","installing","uninstalling"]))),128))])):(n(),s("div",Fg,[c(d(Q),{description:B.value},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Je))]),_:1})]),extra:u(()=>[0===k.value.length?(n(),g(d(F),{key:0,size:"small",onClick:l[9]||(l[9]=e=>U.value=!0)},{default:u(()=>[...l[27]||(l[27]=[h("配置仓库源",-1)])]),_:1})):i("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),o("div",Gg,[c(d(R),{size:"14",class:"asset-info-icon"},{default:u(()=>[c(d(Ia))]),_:1}),o("span",null,"安装/卸载后需重启 "+m(L.value)+" 生效",1)]),c(Hy,{visible:U.value,"onUpdate:visible":l[10]||(l[10]=e=>U.value=e),platform:j.value,onUpdated:l[11]||(l[11]=e=>H(!0))},null,8,["visible","platform"]),c(Yy,{visible:P.value,"onUpdate:visible":l[12]||(l[12]=e=>P.value=e),platform:j.value,onCreated:H},null,8,["visible","platform"]),c(Cg,{visible:S.value,"onUpdate:visible":l[13]||(l[13]=e=>S.value=e),skill:z.value,platform:j.value,onUpdated:H},null,8,["visible","skill","platform"])],2))}},[["__scopeId","data-v-b019bf7d"]]),qg=zl({__name:"SkillsDrawer",props:{visible:{type:Boolean,default:!1},platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=ei(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},"技能管理",-1)])]),default:u(()=>[c(Kg,{"in-drawer":!0,"hide-back":!0,"drawer-visible":r.value,platform:l.platform,onBack:a[0]||(a[0]=e=>r.value=!1)},null,8,["drawer-visible","platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-150a7bc9"]]);async function Wg(e=null,a="claude"){return(await ct.get("/commands",{params:e?{projectPath:e,platform:a}:{platform:a}})).data}const Vg={class:"asset-card-main"},Jg={class:"asset-card-top"},Zg={class:"asset-card-title-stack"},Qg={class:"asset-card-title-row"},Yg={class:"asset-name mono"},Xg={class:"asset-tags"},eh={key:0,class:"asset-description"},ah={class:"asset-meta"},lh={key:0,class:"asset-meta-item"},th={key:1,class:"asset-meta-item"},sh={class:"asset-card-actions"},nh={class:"asset-platform-strip"},oh=zl({__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,t=a;return(a,r)=>{var y,b;return n(),s("div",{class:p(["command-card asset-card",{"is-project":"project"===e.command.scope,"is-managed":e.registryInfo}]),onClick:r[9]||(r[9]=a=>t("click",e.command))},[o("div",Vg,[o("div",Jg,[o("div",Zg,[o("div",Qg,[o("span",{class:p(["asset-status-dot",{active:(null==(y=e.registryInfo)?void 0:y.enabled)||"project"===e.command.scope}])},null,2),o("span",Yg,"/"+m(e.command.name),1)]),o("div",Xg,[c(d(H),{type:"user"===e.command.scope?"info":"success",size:"tiny",bordered:!1},{default:u(()=>[h(m("user"===e.command.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),e.registryInfo?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...r[10]||(r[10]=[h("托管",-1)])]),_:1})):i("",!0),e.command.namespace?(n(),g(d(H),{key:1,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.command.namespace),1)]),_:1})):i("",!0)])])]),e.command.description?(n(),s("div",eh,m((b=e.command.description,b?b.length>80?b.slice(0,80)+"...":b:"")),1)):i("",!0),o("div",ah,[e.command.allowedTools?(n(),s("span",lh,[c(d(R),{size:"12"},{default:u(()=>[c(d(Ya))]),_:1}),h(" "+m(e.command.allowedTools),1)])):i("",!0),e.command.argumentHint?(n(),s("span",th,[c(d(R),{size:"12"},{default:u(()=>[c(d(Xa))]),_:1}),h(" "+m(e.command.argumentHint),1)])):i("",!0)])]),o("div",sh,[e.registryInfo?(n(),s(f,{key:0},[c(d(ie),{trigger:"hover"},{trigger:u(()=>[c(d(G),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":r[0]||(r[0]=a=>t("toggle-enabled",e.command,a)),onClick:r[1]||(r[1]=v(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[h(" "+m(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),o("div",nh,[c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.claude}]),onClick:r[2]||(r[2]=v(a=>{var l;return t("toggle-platform",e.command,"claude",!(null==(l=e.registryInfo.platforms)?void 0:l.claude))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(el))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Claude Code "+m((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.codex}]),onClick:r[3]||(r[3]=v(a=>{var l;return t("toggle-platform",e.command,"codex",!(null==(l=e.registryInfo.platforms)?void 0:l.codex))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(Qe))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Codex CLI "+m((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.gemini}]),onClick:r[4]||(r[4]=v(a=>{var l;return t("toggle-platform",e.command,"gemini",!(null==(l=e.registryInfo.platforms)?void 0:l.gemini))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ra))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Gemini CLI "+m((null==(a=e.registryInfo.platforms)?void 0:a.gemini)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.opencode}]),onClick:r[5]||(r[5]=v(a=>{var l;return t("toggle-platform",e.command,"opencode",!(null==(l=e.registryInfo.platforms)?void 0:l.opencode))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ia))]),_:1})],2)]}),default:u(()=>{var a;return[h(" OpenCode "+m((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.omp}]),onClick:r[6]||(r[6]=v(a=>{var l;return t("toggle-platform",e.command,"omp",!(null==(l=e.registryInfo.platforms)?void 0:l.omp))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ha))]),_:1})],2)]}),default:u(()=>{var a;return[h(" OMP "+m((null==(a=e.registryInfo.platforms)?void 0:a.omp)?"已启用":"未启用"),1)]}),_:1})])],64)):(n(),s(f,{key:1},[c(d(F),{size:"tiny",tertiary:"",onClick:r[7]||(r[7]=v(a=>t("edit",e.command),["stop"]))},{default:u(()=>[...r[11]||(r[11]=[h(" 编辑 ",-1)])]),_:1}),c(d(F),{size:"tiny",tertiary:"",type:"error",loading:l.deleting,onClick:r[8]||(r[8]=v(a=>t("delete",e.command),["stop"]))},{default:u(()=>[...r[12]||(r[12]=[h(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2)}}},[["__scopeId","data-v-165deb4e"]]),ih={class:"asset-detail-drawer-header"},rh={class:"asset-detail-identity"},ch={class:"asset-detail-heading"},uh={class:"asset-detail-name mono"},dh={class:"asset-detail-meta"},ph={key:2,class:"asset-detail-subtle"},vh={class:"asset-detail-body"},mh={class:"asset-detail-container"},fh={class:"asset-detail-info-section"},yh={class:"asset-detail-description"},gh={class:"asset-detail-info-section"},hh={class:"asset-detail-list"},bh={class:"asset-detail-row"},wh={class:"asset-detail-value"},kh={key:0,class:"asset-detail-row"},_h={class:"asset-detail-value"},xh={key:1,class:"asset-detail-row"},Ch={class:"asset-detail-value"},Uh={key:2,class:"asset-detail-row"},Ph={class:"asset-detail-value"},Sh={key:3,class:"asset-detail-row"},zh={class:"asset-detail-value"},Th={key:4,class:"asset-detail-row"},Ih={class:"asset-detail-value"},Mh={key:0,class:"asset-detail-info-section"},Ah={class:"asset-detail-box"},Oh={class:"asset-detail-code"},$h={key:1,class:"asset-detail-empty"},jh={__name:"CommandDetailDrawer",props:{visible:{type:Boolean,default:!1},command:{type:Object,default:null},platform:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:l}=ei(600),r=e,p=a,v=t({get:()=>r.visible,set:e=>p("update:visible",e)}),f={height:"100%",minHeight:0,overflow:"hidden"},y=t(()=>{const e=gr(r.platform);return e.label||e.title||""}),b=t(()=>{var e,a;return(null==(e=r.command)?void 0:e.fullPath)||(null==(a=r.command)?void 0:a.path)||""});function w(e){return"project"===e?"项目级":"用户级"}return(a,t)=>(n(),g(d(ce),{show:v.value,"onUpdate:show":t[0]||(t[0]=e=>v.value=e),width:d(l),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":f},{header:u(()=>{var a,l,t;return[o("div",ih,[o("div",rh,[c(d(R),{size:20,class:"asset-detail-icon"},{default:u(()=>[c(d(Qe))]),_:1}),o("div",ch,[o("span",uh,m((null==(a=e.command)?void 0:a.name)?`/${e.command.name}`:"命令详情"),1),o("div",dh,[(null==(l=e.command)?void 0:l.scope)?(n(),g(d(H),{key:0,type:"project"===e.command.scope?"success":"info",size:"tiny",bordered:!1},{default:u(()=>[h(m(w(e.command.scope)),1)]),_:1},8,["type"])):i("",!0),(null==(t=e.command)?void 0:t.namespace)?(n(),g(d(H),{key:1,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.command.namespace),1)]),_:1})):i("",!0),y.value?(n(),s("span",ph,m(y.value),1)):i("",!0)])])])])]}),default:u(()=>[o("div",vh,[e.command?(n(),g(d(ge),{key:0,type:"line",animated:"",class:"asset-detail-tabs"},{default:u(()=>[c(d(he),{name:"overview",tab:"概览"},{default:u(()=>[o("div",mh,[o("div",fh,[t[1]||(t[1]=o("h3",{class:"asset-detail-section-title"},"描述",-1)),o("p",yh,m(e.command.description||"暂无描述"),1)]),o("div",gh,[t[8]||(t[8]=o("h3",{class:"asset-detail-section-title"},"基础信息",-1)),o("div",hh,[o("div",bh,[t[2]||(t[2]=o("span",{class:"asset-detail-label"},"作用域",-1)),o("span",wh,m(w(e.command.scope)),1)]),e.command.namespace?(n(),s("div",kh,[t[3]||(t[3]=o("span",{class:"asset-detail-label"},"命名空间",-1)),o("span",_h,m(e.command.namespace),1)])):i("",!0),e.command.argumentHint?(n(),s("div",xh,[t[4]||(t[4]=o("span",{class:"asset-detail-label"},"参数提示",-1)),o("span",Ch,m(e.command.argumentHint),1)])):i("",!0),e.command.model?(n(),s("div",Uh,[t[5]||(t[5]=o("span",{class:"asset-detail-label"},"模型",-1)),o("span",Ph,m(e.command.model),1)])):i("",!0),e.command.agent?(n(),s("div",Sh,[t[6]||(t[6]=o("span",{class:"asset-detail-label"},"Agent",-1)),o("span",zh,m(e.command.agent),1)])):i("",!0),""!==e.command.subtask&&void 0!==e.command.subtask&&null!==e.command.subtask?(n(),s("div",Th,[t[7]||(t[7]=o("span",{class:"asset-detail-label"},"Subtask",-1)),o("span",Ih,m(String(e.command.subtask)),1)])):i("",!0)])]),e.command.allowedTools?(n(),s("div",Mh,[t[9]||(t[9]=o("h3",{class:"asset-detail-section-title"},"允许的工具",-1)),o("div",Ah,[c(d(R),{size:16},{default:u(()=>[c(d(Ya))]),_:1}),o("code",null,m(e.command.allowedTools),1)])])):i("",!0),c(tg,{path:b.value},null,8,["path"])])]),_:1}),c(d(he),{name:"content",tab:"内容"},{default:u(()=>[o("pre",Oh,m(e.command.body||"(无内容)"),1)]),_:1})]),_:1})):(n(),s("div",$h,[c(d(R),{size:44,class:"asset-detail-empty-icon"},{default:u(()=>[c(d(Oa))]),_:1}),t[10]||(t[10]=o("p",null,"未选择命令",-1))]))])]),_:1})]),_:1},8,["show","width"]))}},Lh={class:"config-edit-header"},Eh={class:"config-edit-identity"},Dh={class:"config-edit-icon"},Nh={class:"config-edit-title-stack"},Bh={class:"config-edit-kicker"},Rh={class:"config-edit-title"},Fh={class:"config-edit-badges"},Hh={class:"command-workbench"},Gh={class:"command-sidebar"},Kh={class:"config-edit-section"},qh={class:"section-heading"},Wh={class:"field-grid"},Vh={class:"scope-option"},Jh={class:"scope-path"},Zh={class:"scope-option"},Qh={class:"scope-path"},Yh={class:"config-edit-section"},Xh={class:"section-heading"},eb={key:1,class:"platform-note"},ab={class:"config-edit-section token-section"},lb={class:"section-heading"},tb={class:"command-token-box"},sb={key:0,class:"token-row"},nb={key:1,class:"token-row"},ob={class:"config-edit-section content-section"},ib={class:"section-heading"},rb={class:"modal-footer"},cb=zl({__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 r=e,p=a,v=t({get:()=>r.visible,set:e=>p("update:visible",e)}),y=t(()=>!!r.command),b=t(()=>y.value?"编辑命令":"创建命令"),w=t(()=>{const e=gr(r.platform);return e.label||e.title||"Claude Code"}),k=t(()=>"opencode"===r.platform?"~/.config/opencode/commands/":"gemini"===r.platform?"~/.gemini/commands/":"omp"===r.platform?"~/.omp/agent/commands/":"codex"===r.platform?"~/.codex/commands/":"~/.claude/commands/"),_=t(()=>"opencode"===r.platform?".opencode/commands/":"gemini"===r.platform?".gemini/commands/":"omp"===r.platform?".omp/commands/":"codex"===r.platform?".codex/commands/":".claude/commands/"),C=t(()=>"opencode"!==r.platform&&"gemini"!==r.platform&&"omp"!==r.platform),U=t(()=>"project"===M.value.scope?"项目级":"用户级"),P=t(()=>M.value.name?`/${M.value.name}`:"编辑命令"),S=t(()=>"gemini"===r.platform?"TOML":"Markdown"),z=l(null),T=l(!1),I={maxHeight:"calc(92vh - 134px)",overflowY:"auto",paddingBottom:"18px"},M=l({name:"",scope:"user",namespace:"",description:"",allowedTools:"",argumentHint:"",body:""}),A={name:{required:!0,message:"请输入命令名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"}};function O(){M.value={name:"",scope:"user",namespace:"",description:"",allowedTools:"",argumentHint:"",body:""}}function $(){v.value=!1,O()}async function j(){var e;try{await(null==(e=z.value)?void 0:e.validate())}catch{return}T.value=!0;try{const e={...M.value,projectPath:r.projectPath};y.value?(await async function(e,a,l,t="claude"){return(await ct.put(`/commands/${a}/${e}`,{...l,platform:t})).data}(M.value.name,M.value.scope,e,r.platform),Ds.success("命令更新成功")):(await async function(e,a="claude"){return(await ct.post("/commands",{...e,platform:a})).data}(e,r.platform),Ds.success("命令创建成功")),p("saved"),v.value=!1,O()}catch(a){Ds.error("操作失败: "+a.message)}finally{T.value=!1}}return x(()=>r.command,e=>{e?M.value={name:e.name||"",scope:e.scope||"user",namespace:e.namespace||"",description:e.description||"",allowedTools:e.allowedTools||"",argumentHint:e.argumentHint||"",body:e.body||""}:O()},{immediate:!0}),(e,a)=>(n(),g(d(se),{show:v.value,"onUpdate:show":a[7]||(a[7]=e=>v.value=e),preset:"card",title:b.value,style:{width:"min(940px, 96vw)","max-height":"92vh"},"content-style":I,"mask-closable":!1,class:"config-edit-modal"},{footer:u(()=>[o("div",rb,[c(d(F),{onClick:$},{default:u(()=>[...a[19]||(a[19]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:T.value,onClick:j},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Pa))]),_:1})]),default:u(()=>[h(" "+m(y.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>[o("div",Lh,[o("div",Eh,[o("span",Dh,[c(d(R),{size:22},{default:u(()=>[c(d(Qe))]),_:1})]),o("div",Nh,[o("span",Bh,m(w.value),1),o("span",Rh,m(y.value?P.value:"创建新命令"),1)])]),o("div",Fh,[c(d(H),{size:"small",bordered:!1,type:"info"},{default:u(()=>[h(m(U.value),1)]),_:1}),M.value.namespace?(n(),g(d(H),{key:0,size:"small",bordered:!1,type:"warning"},{default:u(()=>[h(m(M.value.namespace),1)]),_:1})):i("",!0),c(d(H),{size:"small",bordered:!1,type:"success"},{default:u(()=>[h(m(S.value),1)]),_:1})])]),c(d(Y),{ref_key:"formRef",ref:z,model:M.value,rules:A,"label-placement":"top","require-mark-placement":"right-hanging",class:"config-edit-form"},{default:u(()=>[o("div",Hh,[o("div",Gh,[o("section",Kh,[o("div",qh,[c(d(R),{size:16},{default:u(()=>[c(d(ka))]),_:1}),a[8]||(a[8]=o("span",null,"命令入口",-1))]),o("div",Wh,[c(d(X),{label:"命令名",path:"name"},{default:u(()=>[c(d(ne),{value:M.value.name,"onUpdate:value":a[0]||(a[0]=e=>M.value.name=e),disabled:y.value,placeholder:"review"},{prefix:u(()=>[...a[9]||(a[9]=[h("/",-1)])]),_:1},8,["value","disabled"])]),_:1}),c(d(X),{label:"命名空间",path:"namespace"},{default:u(()=>[c(d(ne),{value:M.value.namespace,"onUpdate:value":a[1]||(a[1]=e=>M.value.namespace=e),disabled:y.value,placeholder:"frontend"},null,8,["value","disabled"])]),_:1})]),c(d(X),{label:"作用域",path:"scope"},{default:u(()=>[c(d(le),{value:M.value.scope,"onUpdate:value":a[2]||(a[2]=e=>M.value.scope=e),disabled:y.value,class:"scope-picker"},{default:u(()=>[c(d(te),{value:"user"},{default:u(()=>[o("span",Vh,[a[10]||(a[10]=o("span",{class:"scope-title"},"用户级",-1)),o("span",Jh,m(k.value),1)])]),_:1}),c(d(te),{value:"project"},{default:u(()=>[o("span",Zh,[a[11]||(a[11]=o("span",{class:"scope-title"},"项目级",-1)),o("span",Qh,m(_.value),1)])]),_:1})]),_:1},8,["value","disabled"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:M.value.description,"onUpdate:value":a[3]||(a[3]=e=>M.value.description=e),type:"textarea",autosize:{minRows:3,maxRows:5},placeholder:"一句话说明这个 slash command 的用途"},null,8,["value"])]),_:1})]),o("section",Yh,[o("div",Xh,[c(d(R),{size:16},{default:u(()=>[c(d(xa))]),_:1}),a[12]||(a[12]=o("span",null,"Frontmatter",-1))]),C.value?(n(),s(f,{key:0},[c(d(X),{label:"允许的工具",path:"allowedTools"},{default:u(()=>[c(d(ne),{value:M.value.allowedTools,"onUpdate:value":a[4]||(a[4]=e=>M.value.allowedTools=e),placeholder:"Bash, Edit, Read"},null,8,["value"])]),_:1}),c(d(X),{label:"参数提示",path:"argumentHint"},{default:u(()=>[c(d(ne),{value:M.value.argumentHint,"onUpdate:value":a[5]||(a[5]=e=>M.value.argumentHint=e),placeholder:"add [id] | remove [id]"},null,8,["value"])]),_:1})],64)):(n(),s("div",eb,[c(d(R),{size:16},{default:u(()=>[c(d(Ia))]),_:1}),o("span",null,m(w.value)+" commands 会按平台原生格式保存,当前平台不写入 Claude/Codex 风格的工具和参数 frontmatter。",1)]))]),o("section",ab,[o("div",lb,[c(d(R),{size:16},{default:u(()=>[c(d(ia))]),_:1}),a[13]||(a[13]=o("span",null,"可用变量",-1))]),o("div",tb,[a[16]||(a[16]=o("div",{class:"token-row"},[o("code",null,"$ARGUMENTS"),o("span",null,"完整参数")],-1)),a[17]||(a[17]=o("div",{class:"token-row"},[o("code",null,"$1"),o("span",null,"第一个参数")],-1)),C.value?(n(),s("div",sb,[...a[14]||(a[14]=[o("code",null,"!",-1),o("span",null,"执行 shell 行",-1)])])):i("",!0),C.value?(n(),s("div",nb,[...a[15]||(a[15]=[o("code",null,"@",-1),o("span",null,"引用文件",-1)])])):i("",!0)])])]),o("section",ob,[o("div",ib,[c(d(R),{size:16},{default:u(()=>[c(d(Oa))]),_:1}),a[18]||(a[18]=o("span",null,"命令内容",-1))]),c(d(X),{path:"body","show-label":!1,class:"editor-form-item"},{default:u(()=>[c(Jv,{modelValue:M.value.body,"onUpdate:modelValue":a[6]||(a[6]=e=>M.value.body=e),rows:12,"min-height":280,placeholder:"写下命令提示词。可以使用 $ARGUMENTS、$1、$2 等变量。","default-editing":!y.value},null,8,["modelValue","default-editing"])]),_:1})])])]),_:1},8,["model"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-713e6dff"]]),ub={key:0,class:"asset-panel-header"},db={class:"asset-title-group"},pb={class:"asset-heading"},vb={class:"asset-title-row"},mb={class:"asset-platform-pill"},fb={class:"asset-action-row"},yb={key:1,class:"asset-drawer-toolbar"},gb={class:"asset-action-row"},hb={class:"asset-summary"},bb={class:"asset-summary-item"},wb={class:"asset-summary-value"},kb={class:"asset-summary-item"},_b={class:"asset-summary-value"},xb={class:"asset-summary-item"},Cb={class:"asset-summary-value"},Ub={class:"asset-summary-item"},Pb={class:"asset-summary-value"},Sb={class:"asset-filter-bar"},zb={class:"asset-panel-content"},Tb={key:0,class:"asset-empty"},Ib={key:1,class:"asset-list"},Mb={class:"asset-footer"},Ab=zl({__name:"CommandsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null},platform:{type:String,default:""}},emits:["back","updated"],setup(e,{emit:a}){const r=e,v=a,b=M(),k=l([]),_=l(!1),C=l(""),U=l("all"),P=l(!1),S=l(!1),z=l(null),T=l(null),I=l({}),A=l({}),O=l({}),$=vr.filter(e=>!1!==e.supportsCommands).map(e=>e.key),j=t(()=>{if($.includes(r.platform))return r.platform;const e=b.meta.channel;return $.includes(e)?e:"claude"}),L=t(()=>"opencode"===j.value?"使用 /命令名 在 OpenCode 中调用":"omp"===j.value?"使用 OMP slash command 调用":"gemini"===j.value?"使用 /命令名 在 Gemini CLI 中调用":"codex"===j.value?"使用 /命令名 在 Codex CLI 中调用":"使用 /命令名 在 Claude Code 中调用"),E=t(()=>{const e=gr(j.value);return e.label||e.title||"Claude Code"}),D=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],N=t(()=>k.value.filter(e=>"user"===e.scope).length),B=t(()=>k.value.filter(e=>"project"===e.scope).length),H=t(()=>Object.keys(A.value).length),G=t(()=>{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=>A.value[e.name])),C.value.trim()){const a=C.value.toLowerCase();e=e.filter(e=>{var l,t,s;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))||(null==(s=e.namespace)?void 0:s.toLowerCase().includes(a))})}return e}),K=t(()=>C.value?"没有匹配的命令":"user"===U.value?"暂无用户级命令":"project"===U.value?"暂无项目级命令":"managed"===U.value?"暂无托管的命令":"暂无自定义命令");async function q(){_.value=!0;try{const[e,a]=await Promise.all([Wg(r.projectPath,j.value),Bf("commands")]);if(e.success&&(k.value=e.commands||[]),a.success){A.value={};for(const[e,l]of Object.entries(a.items||{}))A.value[e]=l}}catch(e){Ds.error("加载命令列表失败: "+e.message)}finally{_.value=!1}}async function W(e,a){O.value[e.name]=!0;try{(await Ff("commands",e.name,a)).success&&(Ds.success(a?"已启用":"已禁用"),await q())}catch(l){Ds.error("切换失败: "+l.message)}finally{delete O.value[e.name]}}async function V(e,a,l){O.value[e.name]=!0;try{(await Hf("commands",e.name,a,l)).success&&(Ds.success(`${a} ${l?"已启用":"已禁用"}`),await q())}catch(t){Ds.error("切换失败: "+t.message)}finally{delete O.value[e.name]}}async function J(){_.value=!0;try{const e=await Gf("commands");(null==e?void 0:e.success)||Ds.warning((null==e?void 0:e.message)||"同步失败,已继续刷新列表")}catch(e){Ds.warning("同步失败,已继续刷新列表: "+e.message)}await q()}function Y(e){T.value=e,P.value=!0}async function X(e){I.value[e.path]=!0;try{(await async function(e,a,l=null,t=null,s="claude"){const n={};return s&&(n.platform=s),l&&(n.projectPath=l),t&&(n.namespace=t),(await ct.delete(`/commands/${a}/${e}`,{params:n})).data}(e.name,e.scope,r.projectPath,e.namespace,j.value)).success&&(Ds.success("命令已删除"),await q(),v("updated"))}catch(a){Ds.error("删除失败: "+a.message)}finally{delete I.value[e.path]}}function ae(e){z.value=e,S.value=!0}function le(){T.value=null,q(),v("updated")}function te(){v("back")}return w(()=>{q()}),x(j,()=>{q()}),(a,l)=>(n(),s("div",{class:p(["commands-panel asset-panel",{"in-drawer":r.inDrawer}])},[r.inDrawer?i("",!0):(n(),s("div",ub,[o("div",db,[r.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:te,class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d($a))]),_:1})]),_:1})),o("div",pb,[o("div",vb,[l[7]||(l[7]=o("span",{class:"asset-title"},"命令管理",-1)),o("span",mb,m(E.value),1)]),l[8]||(l[8]=o("div",{class:"asset-subtitle"},"维护 slash commands、作用域和跨平台启用状态",-1))])]),o("div",fb,[c(d(F),{text:"",onClick:l[0]||(l[0]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:J,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[10]||(l[10]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),r.inDrawer?(n(),s("div",yb,[o("div",gb,[c(d(F),{text:"",onClick:l[1]||(l[1]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[11]||(l[11]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:J,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[12]||(l[12]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",hb,[o("span",bb,[l[13]||(l[13]=o("span",{class:"asset-summary-label"},"全部",-1)),o("span",wb,m(k.value.length),1)]),o("span",kb,[l[14]||(l[14]=o("span",{class:"asset-summary-label"},"用户级",-1)),o("span",_b,m(N.value),1)]),o("span",xb,[l[15]||(l[15]=o("span",{class:"asset-summary-label"},"项目级",-1)),o("span",Cb,m(B.value),1)]),o("span",Ub,[l[16]||(l[16]=o("span",{class:"asset-summary-label"},"托管",-1)),o("span",Pb,m(H.value),1)])]),o("div",Sb,[c(d(ne),{value:C.value,"onUpdate:value":l[2]||(l[2]=e=>C.value=e),placeholder:"搜索命令、描述或命名空间",clearable:"",size:"small",class:"asset-search"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:U.value,"onUpdate:value":l[3]||(l[3]=e=>U.value=e),options:D,size:"small",class:"asset-filter"},null,8,["value"])]),o("div",zb,[c(d(Z),{show:_.value},{default:u(()=>[0!==G.value.length||_.value?(n(),s("div",Ib,[(n(!0),s(f,null,y(G.value,e=>(n(),g(oh,{key:e.path,command:e,deleting:!!I.value[e.path],"registry-info":A.value[e.name],toggling:!!O.value[e.name],onEdit:Y,onDelete:X,onClick:ae,onToggleEnabled:W,onTogglePlatform:V},null,8,["command","deleting","registry-info","toggling"]))),128))])):(n(),s("div",Tb,[c(d(Q),{description:K.value},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Qe))]),_:1})]),extra:u(()=>[c(d(F),{size:"small",onClick:l[4]||(l[4]=e=>P.value=!0)},{default:u(()=>[...l[17]||(l[17]=[h(" 创建第一个命令 ",-1)])]),_:1})]),_:1},8,["description"])]))]),_:1},8,["show"])]),o("div",Mb,[c(d(R),{size:"14",class:"asset-info-icon"},{default:u(()=>[c(d(Ia))]),_:1}),o("span",null,m(L.value),1)]),c(cb,{visible:P.value,"onUpdate:visible":l[5]||(l[5]=e=>P.value=e),command:T.value,"project-path":e.projectPath,platform:j.value,onSaved:le},null,8,["visible","command","project-path","platform"]),c(jh,{visible:S.value,"onUpdate:visible":l[6]||(l[6]=e=>S.value=e),command:z.value,platform:j.value},null,8,["visible","command","platform"])],2))}},[["__scopeId","data-v-4db32847"]]),Ob=zl({__name:"CommandsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=ei(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},[o("span",null,"命令管理")],-1)])]),default:u(()=>[c(Ab,{onBack:a[0]||(a[0]=e=>r.value=!1),"hide-back":!0,"in-drawer":!0,platform:l.platform},null,8,["platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-bfb32ef8"]]);async function $b(e=null,a="claude"){return(await ct.get("/agents",{params:e?{projectPath:e,platform:a}:{platform:a}})).data}const jb={class:"asset-card-main"},Lb={class:"asset-card-top"},Eb={class:"asset-card-title-stack"},Db={class:"asset-card-title-row"},Nb={class:"asset-name"},Bb={class:"asset-tags"},Rb={key:0,class:"asset-description"},Fb={class:"asset-meta"},Hb={key:0,class:"asset-meta-item"},Gb={key:1,class:"asset-meta-item"},Kb={class:"asset-card-actions"},qb={class:"asset-platform-strip"},Wb=zl({__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,t=a;return(a,r)=>{var y,b,w;return n(),s("div",{class:p(["agent-card asset-card",{"is-project":"project"===e.agent.scope,"is-managed":e.registryInfo}]),onClick:r[8]||(r[8]=a=>t("click",e.agent))},[o("div",jb,[o("div",Lb,[o("div",Eb,[o("div",Db,[o("span",{class:p(["asset-status-dot",{active:(null==(y=e.registryInfo)?void 0:y.enabled)||"project"===e.agent.scope}])},null,2),o("span",Nb,m(e.agent.name),1)]),o("div",Bb,[c(d(H),{type:"user"===e.agent.scope?"info":"success",size:"tiny",bordered:!1},{default:u(()=>[h(m("user"===e.agent.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),e.registryInfo?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...r[9]||(r[9]=[h("托管",-1)])]),_:1})):i("",!0),e.agent.model?(n(),g(d(H),{key:1,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.agent.model),1)]),_:1})):i("",!0)])])]),e.agent.description?(n(),s("div",Rb,m((w=e.agent.description,w?w.length>80?w.slice(0,80)+"...":w:"")),1)):i("",!0),o("div",Fb,[e.agent.tools?(n(),s("span",Hb,[c(d(R),{size:"12"},{default:u(()=>[c(d(Ya))]),_:1}),h(" "+m((b=e.agent.tools,b?b.length>30?b.slice(0,30)+"...":b:"")),1)])):i("",!0),e.agent.permissionMode?(n(),s("span",Gb,[c(d(R),{size:"12"},{default:u(()=>[c(d(al))]),_:1}),h(" "+m(e.agent.permissionMode),1)])):i("",!0)])]),o("div",Kb,[e.registryInfo?(n(),s(f,{key:0},[c(d(ie),{trigger:"hover"},{trigger:u(()=>[c(d(G),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":r[0]||(r[0]=a=>t("toggle-enabled",e.agent,a)),onClick:r[1]||(r[1]=v(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[h(" "+m(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),o("div",qb,[c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.claude}]),onClick:r[2]||(r[2]=v(a=>{var l;return t("toggle-platform",e.agent,"claude",!(null==(l=e.registryInfo.platforms)?void 0:l.claude))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(el))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Claude Code "+m((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.codex}]),onClick:r[3]||(r[3]=v(a=>{var l;return t("toggle-platform",e.agent,"codex",!(null==(l=e.registryInfo.platforms)?void 0:l.codex))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(Qe))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Codex CLI "+m((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.gemini}]),onClick:r[4]||(r[4]=v(a=>{var l;return t("toggle-platform",e.agent,"gemini",!(null==(l=e.registryInfo.platforms)?void 0:l.gemini))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ra))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Gemini CLI "+m((null==(a=e.registryInfo.platforms)?void 0:a.gemini)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.opencode}]),onClick:r[5]||(r[5]=v(a=>{var l;return t("toggle-platform",e.agent,"opencode",!(null==(l=e.registryInfo.platforms)?void 0:l.opencode))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ia))]),_:1})],2)]}),default:u(()=>{var a;return[h(" OpenCode "+m((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1})])],64)):(n(),s(f,{key:1},[c(d(F),{size:"tiny",tertiary:"",onClick:r[6]||(r[6]=v(a=>t("edit",e.agent),["stop"]))},{default:u(()=>[...r[10]||(r[10]=[h(" 编辑 ",-1)])]),_:1}),c(d(F),{size:"tiny",tertiary:"",type:"error",loading:l.deleting,onClick:r[7]||(r[7]=v(a=>t("delete",e.agent),["stop"]))},{default:u(()=>[...r[11]||(r[11]=[h(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2)}}},[["__scopeId","data-v-85a35dfe"]]),Vb={class:"asset-detail-drawer-header"},Jb={class:"asset-detail-identity"},Zb={class:"asset-detail-heading"},Qb={class:"asset-detail-name"},Yb={class:"asset-detail-meta"},Xb={key:2,class:"asset-detail-subtle"},ew={class:"asset-detail-body"},aw={key:0,class:"asset-detail-loading"},lw={class:"asset-detail-container"},tw={class:"asset-detail-info-section"},sw={class:"asset-detail-description"},nw={class:"asset-detail-info-section"},ow={class:"asset-detail-list"},iw={class:"asset-detail-row"},rw={class:"asset-detail-value"},cw={key:0,class:"asset-detail-row"},uw={class:"asset-detail-value mono"},dw={key:1,class:"asset-detail-row"},pw={class:"asset-detail-value mono"},vw={key:2,class:"asset-detail-row"},mw={class:"asset-detail-value"},fw={key:3,class:"asset-detail-row"},yw={class:"asset-detail-value"},gw={key:4,class:"asset-detail-row"},hw={class:"asset-detail-value"},bw={key:1,class:"asset-detail-info-section"},ww={class:"asset-detail-box"},kw={class:"asset-detail-code"},_w={key:2,class:"asset-detail-empty"},xw={__name:"AgentDetailDrawer",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},platform:{type:String,default:"claude"},loading:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:l}=ei(600),r=e,p=a,v=t({get:()=>r.visible,set:e=>p("update:visible",e)}),f={height:"100%",minHeight:0,overflow:"hidden"},y=t(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[r.platform]||"")),b=t(()=>{var e;return(null==(e=r.agent)?void 0:e.fileName)?"codex"===r.platform?`[agents.${r.agent.fileName}]`:`${r.agent.fileName}.md`:""}),w=t(()=>r.agent?"codex"===r.platform?r.agent.fullContent||"(无内容)":r.agent.systemPrompt||"(无内容)":"(无内容)"),k=t(()=>{var e,a;return(null==(e=r.agent)?void 0:e.fullPath)||(null==(a=r.agent)?void 0:a.path)||""});function _(e){return"project"===e?"项目级":"用户级"}return(a,t)=>(n(),g(d(ce),{show:v.value,"onUpdate:show":t[0]||(t[0]=e=>v.value=e),width:d(l),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":f},{header:u(()=>{var a,l,t;return[o("div",Vb,[o("div",Jb,[c(d(R),{size:20,class:"asset-detail-icon"},{default:u(()=>[c(d(Ye))]),_:1}),o("div",Zb,[o("span",Qb,m((null==(a=e.agent)?void 0:a.name)||"代理详情"),1),o("div",Yb,[(null==(l=e.agent)?void 0:l.scope)?(n(),g(d(H),{key:0,type:"project"===e.agent.scope?"success":"info",size:"tiny",bordered:!1},{default:u(()=>[h(m(_(e.agent.scope)),1)]),_:1},8,["type"])):i("",!0),(null==(t=e.agent)?void 0:t.model)?(n(),g(d(H),{key:1,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.agent.model),1)]),_:1})):i("",!0),y.value?(n(),s("span",Xb,m(y.value),1)):i("",!0)])])])])]}),default:u(()=>[o("div",ew,[e.loading&&!e.agent?(n(),s("div",aw,[c(d(Z),{size:"medium"}),t[1]||(t[1]=o("p",null,"加载代理详情中...",-1))])):e.agent?(n(),g(d(ge),{key:1,type:"line",animated:"",class:"asset-detail-tabs"},{default:u(()=>[c(d(he),{name:"overview",tab:"概览"},{default:u(()=>[o("div",lw,["codex"===e.platform&&e.agent.configReadError?(n(),g(d(pe),{key:0,type:"warning",bordered:!1},{default:u(()=>[h(m(e.agent.configReadError),1)]),_:1})):i("",!0),o("div",tw,[t[2]||(t[2]=o("h3",{class:"asset-detail-section-title"},"描述",-1)),o("p",sw,m(e.agent.description||"暂无描述"),1)]),o("div",nw,[t[9]||(t[9]=o("h3",{class:"asset-detail-section-title"},"基础信息",-1)),o("div",ow,[o("div",iw,[t[3]||(t[3]=o("span",{class:"asset-detail-label"},"作用域",-1)),o("span",rw,m(_(e.agent.scope)),1)]),e.agent.fileName?(n(),s("div",cw,[t[4]||(t[4]=o("span",{class:"asset-detail-label"},"文件名",-1)),o("span",uw,m(b.value),1)])):i("",!0),"codex"===e.platform&&e.agent.configFile?(n(),s("div",dw,[t[5]||(t[5]=o("span",{class:"asset-detail-label"},"config_file",-1)),o("span",pw,m(e.agent.configFile),1)])):i("",!0),e.agent.model?(n(),s("div",vw,[t[6]||(t[6]=o("span",{class:"asset-detail-label"},"模型",-1)),o("span",mw,m(e.agent.model),1)])):i("",!0),e.agent.permissionMode?(n(),s("div",fw,[t[7]||(t[7]=o("span",{class:"asset-detail-label"},"权限模式",-1)),o("span",yw,m(e.agent.permissionMode),1)])):i("",!0),e.agent.skills?(n(),s("div",gw,[t[8]||(t[8]=o("span",{class:"asset-detail-label"},"技能",-1)),o("span",hw,m(e.agent.skills),1)])):i("",!0)])]),e.agent.tools?(n(),s("div",bw,[t[10]||(t[10]=o("h3",{class:"asset-detail-section-title"},"可用工具",-1)),o("div",ww,[c(d(R),{size:16},{default:u(()=>[c(d(Ya))]),_:1}),o("code",null,m(e.agent.tools),1)])])):i("",!0),c(tg,{path:k.value},null,8,["path"])])]),_:1}),c(d(he),{name:"content",tab:"codex"===e.platform?"配置":"提示词"},{default:u(()=>[o("pre",kw,m(w.value),1)]),_:1},8,["tab"])]),_:1})):(n(),s("div",_w,[c(d(R),{size:44,class:"asset-detail-empty-icon"},{default:u(()=>[c(d(Oa))]),_:1}),t[11]||(t[11]=o("p",null,"未选择代理",-1))]))])]),_:1})]),_:1},8,["show","width"]))}},Cw={class:"config-edit-header"},Uw={class:"config-edit-identity"},Pw={class:"config-edit-icon"},Sw={class:"config-edit-title-stack"},zw={class:"config-edit-kicker"},Tw={class:"config-edit-title"},Iw={class:"config-edit-badges"},Mw={class:"config-edit-section"},Aw={class:"section-heading"},Ow={class:"field-grid"},$w={class:"scope-option"},jw={class:"scope-path"},Lw={class:"scope-option"},Ew={class:"scope-path"},Dw={key:0,class:"platform-note"},Nw={class:"config-edit-section"},Bw={class:"section-heading"},Rw={key:1,class:"empty-config-box"},Fw={class:"field-grid"},Hw={key:0,class:"config-edit-section content-section"},Gw={class:"section-heading"},Kw={class:"modal-footer"},qw=zl({__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 r=e,v=a,y=t({get:()=>r.visible,set:e=>v("update:visible",e)}),b=t(()=>!!r.agent),w=t(()=>"codex"===r.platform),k=t(()=>"claude"===r.platform),_=t(()=>"codex"===r.platform||"opencode"===r.platform),C=t(()=>b.value?"编辑代理":"创建代理"),U=t(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[r.platform]||"Claude Code")),P=t(()=>"codex"===r.platform?"~/.codex/config.toml":"opencode"===r.platform?"~/.config/opencode/agents/":"gemini"===r.platform?"~/.gemini/agents/":"~/.claude/agents/"),S=t(()=>"opencode"===r.platform?".opencode/agents/":"gemini"===r.platform?".gemini/agents/":".claude/agents/"),z=t(()=>"project"===L.value.scope?"项目级":"用户级"),T=t(()=>{var e;return(null==(e=j.find(e=>e.value===L.value.configMode))?void 0:e.label)||"配置"}),I=l(null),M=l(!1),A={maxHeight:"calc(92vh - 134px)",overflowY:"auto",paddingBottom:"18px"},O=[{label:"Sonnet",value:"sonnet"},{label:"Opus",value:"opus"},{label:"Haiku",value:"haiku"},{label:"继承 (inherit)",value:"inherit"}],$=[{label:"默认 (default)",value:"default"},{label:"宽松 (permissive)",value:"permissive"},{label:"严格 (strict)",value:"strict"}],j=[{label:"仅描述",value:"none"},{label:"托管 TOML",value:"managed"},{label:"自定义路径",value:"custom"}],L=l({fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}),E=t(()=>{const e={fileName:{required:!0,message:"请输入文件名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"},description:{required:!0,message:"请输入代理描述",trigger:"blur"}};return k.value&&(e.name={required:!0,message:"请输入代理名称",trigger:"blur"}),w.value&&(e.configMode={required:!0,message:"请选择配置模式",trigger:"change"},e.configFile={required:"custom"===L.value.configMode,message:"请输入自定义配置文件路径",trigger:"blur"}),e});function D(){L.value={fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}}function N(){y.value=!1,D()}async function B(){var e;try{await(null==(e=I.value)?void 0:e.validate())}catch{return}M.value=!0;try{const e={...L.value,projectPath:r.projectPath};w.value?("custom"===L.value.configMode?e.configFile=L.value.configFile:delete e.configFile,"managed"===L.value.configMode||"custom"===L.value.configMode?e.configContent=L.value.configContent||"":delete e.configContent):(delete e.configMode,delete e.configFile,delete e.configContent),b.value?(await async function(e,a,l,t="claude"){return(await ct.put(`/agents/${a}/${e}`,{...l,platform:t})).data}(L.value.fileName,L.value.scope,e,r.platform),Ds.success("代理更新成功")):(await async function(e,a="claude"){return(await ct.post("/agents",{...e,platform:a})).data}(e,r.platform),Ds.success("代理创建成功")),v("saved"),y.value=!1,D()}catch(a){Ds.error("操作失败: "+a.message)}finally{M.value=!1}}return x(()=>r.agent,e=>{if(e){const a=e.configMode||(e.configFile?String(e.configFile).includes("/.codex/agents/")?"managed":"custom":"none");L.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 D()},{immediate:!0}),x(()=>r.platform,e=>{"codex"===e&&(L.value.scope="user",L.value.configMode||(L.value.configMode="none"))},{immediate:!0}),(e,a)=>(n(),g(d(se),{show:y.value,"onUpdate:show":a[13]||(a[13]=e=>y.value=e),preset:"card",title:C.value,style:{width:"min(940px, 96vw)","max-height":"92vh"},"content-style":A,"mask-closable":!1,class:"config-edit-modal"},{footer:u(()=>[o("div",Kw,[c(d(F),{onClick:N},{default:u(()=>[...a[21]||(a[21]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:M.value,onClick:B},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Pa))]),_:1})]),default:u(()=>[h(" "+m(b.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>[o("div",Cw,[o("div",Uw,[o("span",Pw,[c(d(R),{size:22},{default:u(()=>[c(d(Ye))]),_:1})]),o("div",Sw,[o("span",zw,m(U.value),1),o("span",Tw,m(b.value?L.value.fileName||"编辑代理":"创建新代理"),1)])]),o("div",Iw,[c(d(H),{size:"small",bordered:!1,type:"info"},{default:u(()=>[h(m(z.value),1)]),_:1}),w.value?(n(),g(d(H),{key:0,size:"small",bordered:!1,type:"success"},{default:u(()=>[...a[14]||(a[14]=[h("Codex 用户级",-1)])]),_:1})):i("",!0),w.value&&"none"!==L.value.configMode?(n(),g(d(H),{key:1,size:"small",bordered:!1,type:"warning"},{default:u(()=>[h(m(T.value),1)]),_:1})):i("",!0)])]),c(d(Y),{ref_key:"formRef",ref:I,model:L.value,rules:E.value,"label-placement":"top","require-mark-placement":"right-hanging",class:"config-edit-form"},{default:u(()=>[o("div",{class:p(["config-edit-grid",{"is-codex":w.value}])},[o("section",Mw,[o("div",Aw,[c(d(R),{size:16},{default:u(()=>[c(d(ka))]),_:1}),a[15]||(a[15]=o("span",null,"基础信息",-1))]),o("div",Ow,[c(d(X),{label:"文件名",path:"fileName"},{default:u(()=>[c(d(ne),{value:L.value.fileName,"onUpdate:value":a[0]||(a[0]=e=>L.value.fileName=e),disabled:b.value,placeholder:"code-reviewer"},null,8,["value","disabled"])]),_:1}),k.value?(n(),g(d(X),{key:0,label:"显示名称",path:"name"},{default:u(()=>[c(d(ne),{value:L.value.name,"onUpdate:value":a[1]||(a[1]=e=>L.value.name=e),placeholder:"代理的显示名称"},null,8,["value"])]),_:1})):i("",!0)]),c(d(X),{label:"作用域",path:"scope"},{default:u(()=>[c(d(le),{value:L.value.scope,"onUpdate:value":a[2]||(a[2]=e=>L.value.scope=e),disabled:b.value,class:p(["scope-picker",{"single-option":w.value}])},{default:u(()=>[c(d(te),{value:"user"},{default:u(()=>[o("span",$w,[a[16]||(a[16]=o("span",{class:"scope-title"},"用户级",-1)),o("span",jw,m(P.value),1)])]),_:1}),w.value?i("",!0):(n(),g(d(te),{key:0,value:"project"},{default:u(()=>[o("span",Lw,[a[17]||(a[17]=o("span",{class:"scope-title"},"项目级",-1)),o("span",Ew,m(S.value),1)])]),_:1}))]),_:1},8,["value","disabled","class"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:L.value.description,"onUpdate:value":a[3]||(a[3]=e=>L.value.description=e),type:"textarea",autosize:{minRows:3,maxRows:5},placeholder:"一句话说明这个代理什么时候该被调用"},null,8,["value"])]),_:1}),w.value?(n(),s("div",Dw,[c(d(R),{size:16},{default:u(()=>[c(d(Ia))]),_:1}),a[18]||(a[18]=o("span",null,[h("Codex agents 写入用户级配置。描述会进入 "),o("code",null,"~/.codex/config.toml"),h(",TOML 配置可托管到 "),o("code",null,"~/.codex/agents/"),h("。")],-1))])):i("",!0)]),o("section",Nw,[o("div",Bw,[c(d(R),{size:16},{default:u(()=>[c(d(xa))]),_:1}),o("span",null,m(w.value?"运行配置":"模型与权限"),1)]),w.value?(n(),s(f,{key:0},[c(d(X),{label:"配置模式",path:"configMode"},{default:u(()=>[c(d(ee),{value:L.value.configMode,"onUpdate:value":a[4]||(a[4]=e=>L.value.configMode=e),options:j,placeholder:"选择配置模式"},null,8,["value"])]),_:1}),"custom"===L.value.configMode?(n(),g(d(X),{key:0,label:"配置文件路径",path:"configFile"},{default:u(()=>[c(d(ne),{value:L.value.configFile,"onUpdate:value":a[5]||(a[5]=e=>L.value.configFile=e),placeholder:"~/.omx/agents/my-agent.toml"},null,8,["value"])]),_:1})):i("",!0),"none"===L.value.configMode?(n(),s("div",Rw,[c(d(R),{size:18},{default:u(()=>[c(d(Oa))]),_:1}),a[19]||(a[19]=o("span",null,"仅保存代理描述,不额外写入模型或工具配置。",-1))])):(n(),g(d(X),{key:2,label:"Agent Config (TOML)",path:"configContent",class:"editor-form-item"},{default:u(()=>[c(d(ne),{value:L.value.configContent,"onUpdate:value":a[6]||(a[6]=e=>L.value.configContent=e),type:"textarea",autosize:{minRows:14,maxRows:22},class:"toml-editor",placeholder:'model = "gpt-5.4"'},null,8,["value"])]),_:1}))],64)):(n(),s(f,{key:1},[c(d(X),{label:"可用工具",path:"tools"},{default:u(()=>[c(d(ne),{value:L.value.tools,"onUpdate:value":a[7]||(a[7]=e=>L.value.tools=e),placeholder:"Read, Edit, Bash"},null,8,["value"])]),_:1}),c(d(X),{label:"模型",path:"model"},{default:u(()=>[_.value?(n(),g(d(ne),{key:0,value:L.value.model,"onUpdate:value":a[8]||(a[8]=e=>L.value.model=e),placeholder:"gpt-5, claude-sonnet-4, openrouter/model"},null,8,["value"])):(n(),g(d(ee),{key:1,value:L.value.model,"onUpdate:value":a[9]||(a[9]=e=>L.value.model=e),options:O,placeholder:"选择模型",clearable:""},null,8,["value"]))]),_:1}),o("div",Fw,["opencode"!==r.platform?(n(),g(d(X),{key:0,label:"权限模式",path:"permissionMode"},{default:u(()=>[c(d(ee),{value:L.value.permissionMode,"onUpdate:value":a[10]||(a[10]=e=>L.value.permissionMode=e),options:$,placeholder:"选择权限模式",clearable:""},null,8,["value"])]),_:1})):i("",!0),"opencode"!==r.platform?(n(),g(d(X),{key:1,label:"技能",path:"skills"},{default:u(()=>[c(d(ne),{value:L.value.skills,"onUpdate:value":a[11]||(a[11]=e=>L.value.skills=e),placeholder:"自动加载的技能,逗号分隔"},null,8,["value"])]),_:1})):i("",!0)])],64))]),w.value?i("",!0):(n(),s("section",Hw,[o("div",Gw,[c(d(R),{size:16},{default:u(()=>[c(d(Oa))]),_:1}),a[20]||(a[20]=o("span",null,"系统提示词",-1))]),c(d(X),{path:"systemPrompt","show-label":!1,class:"editor-form-item"},{default:u(()=>[c(Jv,{modelValue:L.value.systemPrompt,"onUpdate:modelValue":a[12]||(a[12]=e=>L.value.systemPrompt=e),rows:10,"min-height":240,placeholder:"定义代理的行为、边界和输出要求","default-editing":!b.value},null,8,["modelValue","default-editing"])]),_:1})]))],2)]),_:1},8,["model","rules"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-00915421"]]),Ww={key:0,class:"asset-panel-header"},Vw={class:"asset-title-group"},Jw={class:"asset-heading"},Zw={class:"asset-title-row"},Qw={class:"asset-platform-pill"},Yw={class:"asset-action-row"},Xw={key:1,class:"asset-drawer-toolbar"},ek={class:"asset-action-row"},ak={class:"asset-summary"},lk={class:"asset-summary-item"},tk={class:"asset-summary-value"},sk={class:"asset-summary-item"},nk={class:"asset-summary-value"},ok={class:"asset-summary-item"},ik={class:"asset-summary-value"},rk={class:"asset-summary-item"},ck={class:"asset-summary-value"},uk={class:"asset-filter-bar"},dk={class:"asset-panel-content"},pk={key:0,class:"asset-empty"},vk={key:1,class:"asset-list"},mk={class:"asset-footer"},fk=zl({__name:"AgentsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null},platform:{type:String,default:""}},emits:["back","updated"],setup(e,{emit:a}){const r=e,v=a,b=M(),k=l([]),_=l(!1),C=l(""),U=l("all"),P=l(!1),S=l(!1),z=l(null),T=l(!1),I=l(null),A=l({}),O=l({}),$=l({}),j=vr.filter(e=>!1!==e.supportsAgents).map(e=>e.key),L=t(()=>{if(j.includes(r.platform))return r.platform;const e=b.meta.channel;return j.includes(e)?e:"claude"}),E=t(()=>"opencode"===L.value?"使用 @agent 或 Task 在 OpenCode 中调用":"gemini"===L.value?"使用 @agent 调用 Gemini 自定义代理":"使用 Task tool 调用自定义代理"),D=t(()=>{const e=gr(L.value);return e.label||e.title||"Claude Code"}),N=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],B=t(()=>k.value.filter(e=>"user"===e.scope).length),H=t(()=>k.value.filter(e=>"project"===e.scope).length),G=t(()=>Object.keys(O.value).length);function K(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 q(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(O.value[l])return l;return a[0]||""}const W=t(()=>{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=>O.value[q(e)])),C.value.trim()){const a=C.value.toLowerCase();e=e.filter(e=>{var l,t,s;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))||(null==(s=e.fileName)?void 0:s.toLowerCase().includes(a))})}return e}),V=t(()=>C.value?"没有匹配的代理":"user"===U.value?"暂无用户级代理":"project"===U.value?"暂无项目级代理":"managed"===U.value?"暂无托管的代理":"暂无自定义代理");async function J(){_.value=!0;try{const[e,a]=await Promise.all([$b(r.projectPath,L.value),Bf("agents")]);if(e.success&&(k.value=e.agents||[]),a.success){O.value={};for(const[e,l]of Object.entries(a.items||{}))O.value[e]=l}}catch(e){Ds.error("加载代理列表失败: "+e.message)}finally{_.value=!1}}async function Y(e,a){const l=q(e);if(l){$.value[l]=!0;try{(await Ff("agents",l,a)).success&&(Ds.success(a?"已启用":"已禁用"),await J())}catch(t){Ds.error("切换失败: "+t.message)}finally{delete $.value[l]}}else Ds.error("未找到代理对应的托管配置键")}async function X(e,a,l){const t=q(e);if(t){$.value[t]=!0;try{(await Hf("agents",t,a,l)).success&&(Ds.success(`${a} ${l?"已启用":"已禁用"}`),await J())}catch(s){Ds.error("切换失败: "+s.message)}finally{delete $.value[t]}}else Ds.error("未找到代理对应的托管配置键")}async function ae(){_.value=!0;try{const e=await Gf("agents");(null==e?void 0:e.success)||Ds.warning((null==e?void 0:e.message)||"同步失败,已继续刷新列表")}catch(e){Ds.warning("同步失败,已继续刷新列表: "+e.message)}await J()}function le(){I.value=null,P.value=!0}function te(e){P.value=e,e||(I.value=null)}function se(e){ie(e,!0)}async function oe(e){const a=K(e);A.value[a]=!0;try{(await async function(e,a,l=null,t="claude"){const s={};return t&&(s.platform=t),l&&(s.projectPath=l),(await ct.delete(`/agents/${a}/${e}`,{params:s})).data}(e.fileName,e.scope,r.projectPath,L.value)).success&&(Ds.success("代理已删除"),await J(),v("updated"))}catch(l){Ds.error("删除失败: "+l.message)}finally{delete A.value[a]}}async function ie(e,a=!1){if(e){if("codex"!==L.value)return a?(I.value=e,void(P.value=!0)):(z.value=e,void(S.value=!0));T.value=!0,a||(z.value=null,S.value=!0);try{const l=await async function(e,a,l=null,t="claude"){const s={};return t&&(s.platform=t),l&&(s.projectPath=l),(await ct.get(`/agents/${a}/${e}`,{params:s})).data}(e.fileName,e.scope,r.projectPath,L.value),t=(null==l?void 0:l.agent)||e;a?(I.value=t,P.value=!0):z.value=t}catch(l){Ds.error("加载代理详情失败: "+l.message),a?(I.value=e,P.value=!0):z.value=e}finally{T.value=!1}}}function re(e){ie(e,!1)}function ce(){I.value=null,J(),v("updated")}function ue(){v("back")}return w(()=>{J()}),x(L,()=>{J()}),(a,l)=>(n(),s("div",{class:p(["agents-panel asset-panel",{"in-drawer":r.inDrawer}])},[r.inDrawer?i("",!0):(n(),s("div",Ww,[o("div",Vw,[r.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:ue,class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d($a))]),_:1})]),_:1})),o("div",Jw,[o("div",Zw,[l[3]||(l[3]=o("span",{class:"asset-title"},"代理管理",-1)),o("span",Qw,m(D.value),1)]),l[4]||(l[4]=o("div",{class:"asset-subtitle"},"维护自定义代理、工具权限和平台启用状态",-1))])]),o("div",Yw,[c(d(F),{text:"",onClick:le,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[5]||(l[5]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:ae,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[6]||(l[6]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),r.inDrawer?(n(),s("div",Xw,[o("div",ek,[c(d(F),{text:"",onClick:le,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[7]||(l[7]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:ae,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[8]||(l[8]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",ak,[o("span",lk,[l[9]||(l[9]=o("span",{class:"asset-summary-label"},"全部",-1)),o("span",tk,m(k.value.length),1)]),o("span",sk,[l[10]||(l[10]=o("span",{class:"asset-summary-label"},"用户级",-1)),o("span",nk,m(B.value),1)]),o("span",ok,[l[11]||(l[11]=o("span",{class:"asset-summary-label"},"项目级",-1)),o("span",ik,m(H.value),1)]),o("span",rk,[l[12]||(l[12]=o("span",{class:"asset-summary-label"},"托管",-1)),o("span",ck,m(G.value),1)])]),o("div",uk,[c(d(ne),{value:C.value,"onUpdate:value":l[0]||(l[0]=e=>C.value=e),placeholder:"搜索代理、描述或文件名",clearable:"",size:"small",class:"asset-search"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:U.value,"onUpdate:value":l[1]||(l[1]=e=>U.value=e),options:N,size:"small",class:"asset-filter"},null,8,["value"])]),o("div",dk,[c(d(Z),{show:_.value},{default:u(()=>[0!==W.value.length||_.value?(n(),s("div",vk,[(n(!0),s(f,null,y(W.value,e=>(n(),g(Wb,{key:K(e),agent:e,deleting:!!A.value[K(e)],"registry-info":O.value[q(e)],toggling:!!$.value[q(e)],onEdit:se,onDelete:oe,onClick:re,onToggleEnabled:Y,onTogglePlatform:X},null,8,["agent","deleting","registry-info","toggling"]))),128))])):(n(),s("div",pk,[c(d(Q),{description:V.value},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Ye))]),_:1})]),extra:u(()=>[c(d(F),{size:"small",onClick:le},{default:u(()=>[...l[13]||(l[13]=[h(" 创建第一个代理 ",-1)])]),_:1})]),_:1},8,["description"])]))]),_:1},8,["show"])]),o("div",mk,[c(d(R),{size:"14",class:"asset-info-icon"},{default:u(()=>[c(d(Ia))]),_:1}),o("span",null,m(E.value),1)]),c(qw,{visible:P.value,"onUpdate:visible":te,agent:I.value,"project-path":e.projectPath,platform:L.value,onSaved:ce},null,8,["visible","agent","project-path","platform"]),c(xw,{visible:S.value,"onUpdate:visible":l[2]||(l[2]=e=>S.value=e),agent:z.value,platform:L.value,loading:T.value},null,8,["visible","agent","platform","loading"])],2))}},[["__scopeId","data-v-16252a9f"]]),yk=zl({__name:"AgentsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=ei(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},[o("span",null,"代理管理")],-1)])]),default:u(()=>[c(fk,{onBack:a[0]||(a[0]=e=>r.value=!1),"hide-back":!0,"in-drawer":!0,platform:l.platform},null,8,["platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b9b7a7fa"]]);async function gk(e,a,l="claude",t=""){const s={platform:l};t?s.source=t:(s.directory=e,s.repo=a);return(await ct.post("/plugins/install",s)).data}async function hk(e,a="claude"){return(await ct.post("/plugins/repos",{...e,platform:a})).data}async function bk(e,a={},l="claude"){return(await ct.put("/plugins/repos/auth",{id:e.id||"",owner:e.owner||"",name:e.name||"",token:a.token||"",clearToken:!!a.clearToken,platform:l})).data}async function wk(e="claude"){return(await ct.post("/plugins/repos/sync",{platform:e})).data}const kk={class:"asset-card-main"},_k={class:"asset-card-top"},xk={class:"asset-card-title-stack"},Ck={class:"asset-card-title-row"},Uk={class:"asset-name"},Pk={class:"asset-tags"},Sk={key:0,class:"asset-description"},zk={class:"asset-meta"},Tk={class:"asset-meta-item mono"},Ik=["href"],Mk={__name:"PluginCard",props:{plugin:{type:Object,required:!0},readonly:{type:Boolean,default:!1},canInstall:{type:Boolean,default:!0},canUninstall:{type:Boolean,default:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1}},emits:["click","install","uninstall"],setup(e){function a(e){return!!((null==e?void 0:e.installSource)||(null==e?void 0:e.repoOwner)||(null==e?void 0:e.repoProjectPath)||(null==e?void 0:e.repoLocalPath))}return(l,t)=>{return n(),s("div",{class:p(["plugin-card asset-card",{"is-installed":e.plugin.installed,"is-disabled":e.readonly}]),onClick:t[4]||(t[4]=a=>l.$emit("click",e.plugin))},[o("div",kk,[o("div",_k,[o("div",xk,[o("div",Ck,[o("span",{class:p(["asset-status-dot",{active:e.plugin.installed}])},null,2),o("span",Uk,m(e.plugin.name),1)]),o("div",Pk,[e.plugin.installed?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...t[5]||(t[5]=[h("已安装",-1)])]),_:1})):i("",!0),e.readonly?(n(),g(d(H),{key:1,type:"default",size:"tiny",bordered:!1},{default:u(()=>[...t[6]||(t[6]=[h("缓存",-1)])]),_:1})):i("",!0),"skill-bundle"===e.plugin.pluginKind?(n(),g(d(H),{key:2,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[...t[7]||(t[7]=[h("技能包插件",-1)])]),_:1})):i("",!0),"gitlab"===e.plugin.repoProvider?(n(),g(d(H),{key:3,type:"info",size:"tiny",bordered:!1},{default:u(()=>[...t[8]||(t[8]=[h("GitLab",-1)])]),_:1})):"local"===e.plugin.repoProvider?(n(),g(d(H),{key:4,type:"info",size:"tiny",bordered:!1},{default:u(()=>[...t[9]||(t[9]=[h("本地",-1)])]),_:1})):e.plugin.repoOwner?(n(),g(d(H),{key:5,type:"info",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.plugin.repoOwner),1)]),_:1})):i("",!0)])])]),e.plugin.description?(n(),s("div",Sk,m((c=e.plugin.description,f=120,(null==c?void 0:c.length)>f?c.slice(0,f)+"...":c)),1)):i("",!0),o("div",zk,[o("span",Tk,m(e.plugin.directory),1),e.plugin.readmeUrl?(n(),s("a",{key:0,class:"asset-link",href:e.plugin.readmeUrl,target:"_blank",onClick:t[0]||(t[0]=v(()=>{},["stop"]))},m((r=e.plugin,"gitlab"===(null==r?void 0:r.repoProvider)?"GitLab":"local"===(null==r?void 0:r.repoProvider)?"本地":"GitHub")),9,Ik)):i("",!0)])]),e.readonly?i("",!0):(n(),s("div",{key:0,class:"asset-card-actions",onClick:t[3]||(t[3]=v(()=>{},["stop"]))},[e.plugin.installed&&e.canUninstall?(n(),g(d(F),{key:0,size:"small",tertiary:"",type:"error",loading:e.uninstalling,focusable:!1,onClick:t[1]||(t[1]=a=>l.$emit("uninstall",e.plugin))},{default:u(()=>[...t[10]||(t[10]=[h("卸载",-1)])]),_:1},8,["loading"])):e.canInstall?(n(),g(d(F),{key:1,size:"small",type:"primary",loading:e.installing,disabled:!a(e.plugin),focusable:!1,onClick:t[2]||(t[2]=a=>l.$emit("install",e.plugin))},{default:u(()=>[...t[11]||(t[11]=[h("安装",-1)])]),_:1},8,["loading","disabled"])):i("",!0)]))],2);var r,c,f}}},Ak={class:"repo-manager"},Ok={class:"repo-list"},$k={class:"repo-main"},jk={class:"repo-info"},Lk={class:"repo-name-row"},Ek={class:"repo-name"},Dk={class:"repo-branch"},Nk={key:0,class:"repo-auth-hint"},Bk={class:"repo-actions"},Rk={key:0,class:"empty-hint"},Fk={class:"add-repo"},Hk={class:"add-form"},Gk={class:"tips"},Kk={key:0,class:"recommended"},qk={class:"recommended-list"},Wk=["onClick"],Vk={class:"rec-info"},Jk={class:"rec-name"},Zk={class:"rec-desc"},Qk={key:0,class:"auth-manager"},Yk={class:"auth-meta"},Xk={class:"auth-meta-row"},e_={class:"auth-value"},a_={class:"auth-meta-row"},l_={class:"auth-value"},t_={class:"auth-meta-row"},s_={class:"auth-value"},n_={class:"auth-actions"},o_=zl({__name:"PluginRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const r=e,v=a,b=t({get:()=>r.visible,set:e=>v("update:visible",e)}),k=l([]),_=l(!1),C=l(!1),U=l(!1),P=l(!1),S=l(null),z=l(!1),T=l(!1),I=l({token:""}),M=l({input:"",branch:"main"}),A=t(()=>S.value?("gitlab"===S.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),O=t(()=>"opencode"===r.platform?[{owner:"Tommertom",name:"opencode-plugin-marketplace",url:"https://github.com/Tommertom/opencode-plugin-marketplace",description:"OpenCode 插件市场",branch:"main"},{owner:"avifenesh",name:"awesome-slash",url:"https://github.com/avifenesh/awesome-slash",description:"Awesome Slash 命令集",branch:"main"},{owner:"NeoLabHQ",name:"context-engineering-kit",url:"https://github.com/NeoLabHQ/context-engineering-kit",description:"上下文工程工具包",branch:"master"},{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"}]:"codex"===r.platform?[]:[{owner:"anthropics",name:"claude-plugins-official",url:"https://github.com/anthropics/claude-plugins-official",description:"官方插件库",branch:"main"}]),j=t(()=>!!my(M.value.input.trim()));function L(e){const a=e.provider||(e.localPath?"local":e.projectPath?"gitlab":"github"),l=e.branch||"main",t=vy(e.directory);return"local"===a?`local:${e.localPath||""}::${t}`:"gitlab"===a?`gitlab:${e.host||"https://gitlab.com"}::${e.projectPath||""}::${l}::${t}`:`github:${e.host||"https://github.com"}::${e.owner||""}/${e.name||""}::${l}::${t}`}function E(e){return"local"===e.provider?e.localPath||e.name||"本地仓库":"gitlab"===e.provider&&e.projectPath||[e.owner,e.name].filter(Boolean).join("/")}function D(e){const a=[];return"local"===e.provider?a.push("本地仓库"):"gitlab"===e.provider?(a.push("GitLab"),e.host&&a.push(e.host.replace(/^https?:\/\//,""))):a.push("GitHub"),e.branch&&a.push(e.branch),e.directory&&a.push(`目录: ${e.directory}`),a.join(" · ")}function N(e){return"github"===(null==e?void 0:e.provider)||"gitlab"===(null==e?void 0:e.provider)}function B(e){return N(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function K(){P.value=!1,S.value=null,I.value.token="",z.value=!1,T.value=!1}async function q(){_.value=!0;try{const e=await async function(e="claude"){return(await ct.get("/plugins/repos",{params:{platform:e}})).data}(r.platform);e.success&&(k.value=e.repos||[])}catch(e){Ds.error("加载仓库失败: "+e.message)}finally{_.value=!1}}async function W(){U.value=!0;try{(await wk(r.platform)).success&&(Ds.success("仓库同步成功"),v("updated"))}catch(e){Ds.error("同步失败: "+e.message)}finally{U.value=!1}}async function V(){if(!j.value)return;const e=my(M.value.input.trim());C.value=!0;try{const a=await hk({...e,branch:M.value.branch||"main",enabled:!0},r.platform);a.success&&(k.value=a.repos,M.value.input="",M.value.branch="main",Ds.success("仓库添加成功"),v("updated"))}catch(a){Ds.error("添加失败: "+a.message)}finally{C.value=!1}}async function J(e){try{const a=await async function(e,a="claude"){return(await ct.delete("/plugins/repos",{params:{platform:a,id:e.id||"",owner:e.owner||"",name:e.name||""}})).data}(e,r.platform);a.success&&(k.value=a.repos,Ds.success("仓库已删除"),v("updated"))}catch(a){Ds.error("删除失败: "+a.message)}}async function Q(e,a){try{const l=await async function(e,a,l="claude"){return(await ct.put("/plugins/repos/toggle",{id:e.id||"",owner:e.owner||"",name:e.name||"",enabled:a,platform:l})).data}(e,a,r.platform);l.success&&(k.value=l.repos,v("updated"))}catch(l){Ds.error("操作失败: "+l.message)}}async function Y(){const e=S.value,a=I.value.token.trim();if(e&&a){z.value=!0;try{const l=await bk(e,{token:a},r.platform);l.success&&(k.value=l.repos||[],Ds.success("仓库 Token 已保存"),v("updated"),K())}catch(l){Ds.error("保存 Token 失败: "+l.message)}finally{z.value=!1}}}async function X(){const e=S.value;if(e){T.value=!0;try{const a=await bk(e,{clearToken:!0},r.platform);a.success&&(k.value=a.repos||[],Ds.success("仓库 Token 已清除"),v("updated"),K())}catch(a){Ds.error("清除 Token 失败: "+a.message)}finally{T.value=!1}}}function ee(e){const a=L(e);return k.value.some(e=>L(e)===a)}function ae(){K(),v("update:visible",!1)}return x(()=>r.visible,e=>{e&&q()}),x(()=>r.platform,()=>{r.visible&&q()}),w(()=>{r.visible&&q()}),(e,a)=>(n(),s(f,null,[c(d(se),{show:b.value,"onUpdate:show":a[2]||(a[2]=e=>b.value=e),preset:"card",title:"插件仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:ae},{"header-extra":u(()=>[c(d(F),{type:"primary",size:"small",loading:U.value,focusable:!1,onClick:W},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Na))]),_:1})]),default:u(()=>[a[5]||(a[5]=h(" 同步 ",-1))]),_:1},8,["loading"])]),default:u(()=>[o("div",Ak,[o("div",Ok,[c(d(Z),{show:_.value},{default:u(()=>[(n(!0),s(f,null,y(k.value,e=>(n(),s("div",{key:e.id||`${e.owner}/${e.name}/${e.localPath||""}`,class:"repo-item"},[o("div",$k,[c(d(G),{value:e.enabled,size:"small","onUpdate:value":a=>Q(e,a)},null,8,["value","onUpdate:value"]),o("div",jk,[o("div",Lk,[o("div",Ek,m(E(e)),1),N(e)?(n(),g(d(H),{key:0,size:"tiny",type:e.hasToken?"success":"default",bordered:!1},{default:u(()=>[h(m(e.hasToken?"已配 Token":"未配 Token"),1)]),_:2},1032,["type"])):i("",!0)]),o("div",Dk,m(D(e)),1),N(e)?(n(),s("div",Nk,m(B(e)),1)):i("",!0)])]),o("div",Bk,[N(e)?(n(),g(d(F),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){N(e)&&(S.value=e,I.value.token="",P.value=!0)}(e)},{default:u(()=>[...a[6]||(a[6]=[h(" 认证 ",-1)])]),_:1},8,["onClick"])):i("",!0),c(d(F),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>J(e)},{default:u(()=>[...a[7]||(a[7]=[h(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===k.value.length?(n(),s("div",Rk," 暂无仓库,请添加 ")):i("",!0)]),_:1},8,["show"])]),o("div",Fk,[a[9]||(a[9]=o("div",{class:"add-title"},"添加仓库",-1)),o("div",Hk,[c(d(ne),{value:M.value.input,"onUpdate:value":a[0]||(a[0]=e=>M.value.input=e),placeholder:"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:$(V,["enter"])},null,8,["value"]),c(d(ne),{value:M.value.branch,"onUpdate:value":a[1]||(a[1]=e=>M.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"]),c(d(F),{type:"primary",size:"small",disabled:!j.value,loading:C.value,focusable:!1,onClick:V},{default:u(()=>[...a[8]||(a[8]=[h(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[10]||(a[10]=o("div",{class:"add-hint"}," 支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径 ",-1))]),o("div",Gk,[c(d(pe),{type:"info",bordered:!1,size:"small"},{default:u(()=>[...a[11]||(a[11]=[h(" 支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。 ",-1)])]),_:1})]),O.value.length>0?(n(),s("div",Kk,[a[13]||(a[13]=o("div",{class:"recommended-title"},"推荐仓库",-1)),o("div",qk,[(n(!0),s(f,null,y(O.value,e=>(n(),s("div",{key:e.url||`${e.owner}/${e.name}`,class:p(["recommended-item",{added:ee(e)}]),onClick:a=>!ee(e)&&async function(e){C.value=!0;try{const a=await hk({owner:e.owner,name:e.name,url:e.url,branch:e.branch,enabled:!0},r.platform);a.success&&(k.value=a.repos,Ds.success("仓库添加成功"),v("updated"))}catch(a){Ds.error("添加失败: "+a.message)}finally{C.value=!1}}(e)},[o("div",Vk,[o("span",Jk,m(e.owner)+"/"+m(e.name),1),o("span",Zk,m(e.description),1)]),ee(e)?(n(),g(d(H),{key:0,size:"tiny",type:"success",bordered:!1},{default:u(()=>[...a[12]||(a[12]=[h(" 已添加 ",-1)])]),_:1})):(n(),g(d(R),{key:1,class:"add-icon"},{default:u(()=>[c(d(Ke))]),_:1}))],10,Wk))),128))])])):i("",!0)])]),_:1},8,["show"]),c(d(se),{show:P.value,"onUpdate:show":a[4]||(a[4]=e=>P.value=e),preset:"card",title:A.value,bordered:!1,style:{width:"460px","max-width":"92vw"},onClose:K},{default:u(()=>[S.value?(n(),s("div",Qk,[c(d(pe),{type:"info",bordered:!1,size:"small"},{default:u(()=>{return[h(m((e=S.value,"gitlab"===(null==e?void 0:e.provider)?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),o("div",Yk,[o("div",Xk,[a[14]||(a[14]=o("span",{class:"auth-label"},"仓库",-1)),o("span",e_,m(E(S.value)),1)]),o("div",a_,[a[15]||(a[15]=o("span",{class:"auth-label"},"来源",-1)),o("span",l_,m("gitlab"===S.value.provider?"GitLab":"GitHub"),1)]),o("div",t_,[a[16]||(a[16]=o("span",{class:"auth-label"},"当前状态",-1)),o("span",s_,m(S.value.hasToken?`已配置 ${S.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),c(d(ne),{value:I.value.token,"onUpdate:value":a[3]||(a[3]=e=>I.value.token=e),type:"password","show-password-on":"click",clearable:"",placeholder:"输入此仓库专属 Token",onKeyup:$(Y,["enter"])},null,8,["value"]),a[20]||(a[20]=o("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),o("div",n_,[c(d(F),{focusable:!1,onClick:K},{default:u(()=>[...a[17]||(a[17]=[h(" 取消 ",-1)])]),_:1}),S.value.hasToken?(n(),g(d(F),{key:0,type:"warning",secondary:"",focusable:!1,loading:T.value,onClick:X},{default:u(()=>[...a[18]||(a[18]=[h(" 清除 Token ",-1)])]),_:1},8,["loading"])):i("",!0),c(d(F),{type:"primary",focusable:!1,disabled:!I.value.token.trim(),loading:z.value,onClick:Y},{default:u(()=>[...a[19]||(a[19]=[h(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):i("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-ce6b2d35"]]),i_={class:"asset-detail-drawer-header"},r_={class:"asset-detail-identity"},c_={class:"asset-detail-heading"},u_={class:"asset-detail-name"},d_={class:"asset-detail-meta"},p_={key:2,class:"asset-detail-subtle"},v_={class:"asset-detail-body"},m_={class:"asset-detail-container"},f_={class:"asset-detail-info-section"},y_={class:"asset-detail-description"},g_={key:0,class:"asset-detail-info-section"},h_={class:"asset-detail-list"},b_={class:"asset-detail-value mono"},w_={key:1,class:"asset-detail-info-section"},k_={class:"asset-detail-box"},__=["href"],x_={key:1},C_={class:"asset-detail-container"},U_={key:0,class:"asset-detail-loading"},P_=["innerHTML"],S_={key:2,class:"asset-detail-empty"},z_={__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}){wl.setOptions({breaks:!0,gfm:!0});const{drawerWidth:r}=ei(600),p=e,v=a,b=t({get:()=>p.visible,set:e=>v("update:visible",e)}),w=l(""),k=l(!1),_=t(()=>{var e,a;return/^(https?:)?\/\//.test((null==(e=p.plugin)?void 0:e.repoUrl)||(null==(a=p.plugin)?void 0:a.gitUrl)||"")}),C=t(()=>{var e,a,l,t;return(null==(e=p.plugin)?void 0:e.installPath)||(null==(a=p.plugin)?void 0:a.fullPath)||(null==(l=p.plugin)?void 0:l.path)||(null==(t=p.plugin)?void 0:t.directory)||""}),U=t(()=>{var e;return Array.isArray(null==(e=p.plugin)?void 0:e.skillPaths)?p.plugin.skillPaths:[]}),P={height:"100%",minHeight:0,overflow:"hidden"};x(()=>p.visible,async e=>{if(e&&p.plugin){k.value=!0;try{const e={repoId:p.plugin.repoId,repoProvider:p.plugin.repoProvider,repoHost:p.plugin.repoHost,repoOwner:p.plugin.repoOwner,repoName:p.plugin.repoName,repoBranch:p.plugin.repoBranch,directory:p.plugin.directory,source:p.plugin.source,repoUrl:p.plugin.repoUrl,repoProjectPath:p.plugin.repoProjectPath,repoLocalPath:p.plugin.repoLocalPath,installPath:p.plugin.installPath},a=await async function(e,a={},l="claude"){const t=new URLSearchParams;return l&&t.append("platform",l),a.repoId&&t.append("repoId",a.repoId),a.repoProvider&&t.append("repoProvider",a.repoProvider),a.repoHost&&t.append("repoHost",a.repoHost),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),a.repoProjectPath&&t.append("repoProjectPath",a.repoProjectPath),a.repoLocalPath&&t.append("repoLocalPath",a.repoLocalPath),a.installPath&&t.append("installPath",a.installPath),(await ct.get(`/plugins/${encodeURIComponent(e)}/readme?${t.toString()}`)).data}(p.plugin.name,e,p.platform);w.value=a.readme||""}catch(a){w.value=""}finally{k.value=!1}}});const S=t(()=>w.value?wl(w.value):"");return(a,l)=>(n(),g(d(ce),{show:b.value,"onUpdate:show":l[0]||(l[0]=e=>b.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":P},{header:u(()=>{var a,t,r,p;return[o("div",i_,[o("div",r_,[c(d(R),{size:20,class:"asset-detail-icon"},{default:u(()=>[c(d(Je))]),_:1}),o("div",c_,[o("span",u_,m((null==(a=e.plugin)?void 0:a.name)||"插件详情"),1),o("div",d_,[(null==(t=e.plugin)?void 0:t.version)?(n(),g(d(H),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(" v"+m(e.plugin.version),1)]),_:1})):i("",!0),"skill-bundle"===(null==(r=e.plugin)?void 0:r.pluginKind)?(n(),g(d(H),{key:1,size:"tiny",bordered:!1,type:"warning"},{default:u(()=>[...l[1]||(l[1]=[h(" 技能包插件 ",-1)])]),_:1})):i("",!0),(null==(p=e.plugin)?void 0:p.author)?(n(),s("span",p_,[c(d(R),{size:12},{default:u(()=>[c(d(Ye))]),_:1}),h(" "+m(e.plugin.author),1)])):i("",!0)])])])])]}),default:u(()=>[o("div",v_,[c(d(ge),{type:"line",animated:"",class:"asset-detail-tabs"},{default:u(()=>[c(d(he),{name:"overview",tab:"概览"},{default:u(()=>{var a,t,r,p;return[o("div",m_,[o("div",f_,[l[2]||(l[2]=o("h3",{class:"asset-detail-section-title"},"描述",-1)),o("p",y_,m((null==(a=e.plugin)?void 0:a.description)||"暂无描述"),1)]),U.value.length>0?(n(),s("div",g_,[l[3]||(l[3]=o("h3",{class:"asset-detail-section-title"},"包含技能",-1)),o("div",h_,[(n(!0),s(f,null,y(U.value,e=>(n(),s("div",{key:e,class:"asset-detail-row"},[o("span",b_,m(e),1)]))),128))])])):i("",!0),(null==(t=e.plugin)?void 0:t.repoUrl)||(null==(r=e.plugin)?void 0:r.gitUrl)||(null==(p=e.plugin)?void 0:p.repoLocalPath)?(n(),s("div",w_,[l[4]||(l[4]=o("h3",{class:"asset-detail-section-title"},"仓库地址",-1)),o("div",k_,[c(d(R),{size:16},{default:u(()=>[c(d(ll))]),_:1}),_.value?(n(),s("a",{key:0,class:"asset-detail-link",href:e.plugin.repoUrl||e.plugin.gitUrl,target:"_blank",rel:"noopener noreferrer"},m(e.plugin.repoUrl||e.plugin.gitUrl),9,__)):(n(),s("span",x_,m(e.plugin.repoLocalPath),1))])])):i("",!0),c(tg,{path:C.value},null,8,["path"])])]}),_:1}),c(d(he),{name:"readme",tab:"README"},{default:u(()=>[o("div",C_,[k.value?(n(),s("div",U_,[c(d(Z),{size:"medium"}),l[5]||(l[5]=o("p",null,"加载 README 中...",-1))])):w.value?(n(),s("div",{key:1,class:"asset-detail-content",innerHTML:S.value},null,8,P_)):(n(),s("div",S_,[c(d(R),{size:44,class:"asset-detail-empty-icon"},{default:u(()=>[c(d(Oa))]),_:1}),l[6]||(l[6]=o("p",null,"暂无 README 文档",-1))]))])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]))}},T_={key:0,class:"asset-panel-header"},I_={class:"asset-title-group"},M_={class:"asset-heading"},A_={class:"asset-title-row"},O_={class:"asset-platform-pill"},$_={class:"asset-action-row"},j_={key:1,class:"asset-drawer-toolbar"},L_={class:"asset-action-row"},E_={class:"asset-summary"},D_={class:"asset-summary-item"},N_={class:"asset-summary-value"},B_={class:"asset-summary-item"},R_={class:"asset-summary-value"},F_={class:"asset-summary-item"},H_={class:"asset-summary-value"},G_={class:"asset-filter-bar"},K_={class:"asset-panel-content"},q_={key:0,class:"asset-empty"},W_={key:1,class:"asset-list"},V_={key:2,class:"asset-footer"},J_=zl({__name:"PluginsPanel",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,r=M(),v=Ue(),b=l(!1),k=l([]),_=l(""),C=l("all"),U=l(!1),P=l(!1),S=l(null),z=l({}),T=l({}),I=l(!1),A=l(0),O=l({supportsPlugins:!0,repositories:!0,market:!0,install:!0,uninstall:!0,import:!0,syncRepos:!0}),$=vr.filter(e=>!1!==e.supportsPlugins).map(e=>e.key),j=t(()=>{if(a.platform&&$.includes(a.platform))return a.platform;const e=Array.isArray(r.query.platform)?r.query.platform[0]:r.query.platform;if($.includes(e))return e;const l=r.meta.channel;return $.includes(l)?l:"claude"}),L=t(()=>{const e=gr(j.value);return e.label||e.title||"Claude Code"}),E=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"}],D=t(()=>k.value.filter(e=>e.installed).length),N=t(()=>{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)}),B=t(()=>_.value?"没有匹配的插件":"installed"===C.value?"暂无已安装的插件":"uninstalled"===C.value?"所有插件都已安装":!1===O.value.supportsPlugins?O.value.disabledReason||`${L.value} 暂未提供插件管理能力`:"暂无可用插件,请配置仓库源");async function H(e){try{const a=await async function(e="claude"){return(await ct.get("/plugins/capabilities",{params:{platform:e}})).data}(e);if(a.success&&a.capabilities)return void(O.value={supportsPlugins:!0,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,...a.capabilities})}catch{}O.value={supportsPlugins:$.includes(j.value),repositories:$.includes(j.value),market:$.includes(j.value),install:$.includes(j.value),uninstall:$.includes(j.value),import:"claude"===j.value,syncRepos:"claude"===j.value}}async function G(e=!1){const a=++A.value,l=j.value;b.value=!0;try{if(await H(l),!1===O.value.supportsPlugins)return void(k.value=[]);e&&O.value.syncRepos&&await wk(l).catch(()=>{});const t=await async function(e="claude"){return(await ct.get("/plugins",{params:{platform:e}})).data}(l),s=t.success?t.plugins:[];let n=[];const o=(e,a)=>{const l={};for(const n of a)l[n.name]=n;const t=e.map(e=>{const a=l[e.name]||{};return{...a,...e,installed:!0,key:`installed-${e.name}`,description:e.description||a.description||"",repoProvider:e.repoProvider||a.repoProvider||"",repoHost:e.repoHost||a.repoHost||"",repoOwner:e.repoOwner||a.repoOwner||"",repoName:e.repoName||a.repoName||"",repoBranch:e.repoBranch||a.repoBranch||"main",repoProjectPath:e.repoProjectPath||a.repoProjectPath||"",repoLocalPath:e.repoLocalPath||a.repoLocalPath||"",repoId:e.repoId||a.repoId||"",repoUrl:e.repoUrl||a.repoUrl||"",marketplace:e.marketplace||a.marketplace||"",installSource:e.installSource||a.installSource||"",readmeUrl:e.readmeUrl||a.readmeUrl||"",containsSkills:Boolean(e.containsSkills||a.containsSkills),skillPaths:Array.isArray(e.skillPaths)?e.skillPaths:Array.isArray(a.skillPaths)?a.skillPaths:[],pluginKind:e.pluginKind||a.pluginKind||(e.containsSkills||a.containsSkills?"skill-bundle":"plugin"),strict:Object.prototype.hasOwnProperty.call(e,"strict")?e.strict:a.strict,directory:e.directory||a.directory||e.installPath||""}}),s=new Set(e.map(e=>e.name));return[...t,...a.filter(e=>!s.has(e.name)).map(e=>({...e,installed:!1,key:`market-${e.repoId||e.repoProjectPath||e.repoLocalPath||e.repoOwner||"repo"}-${e.directory||e.name}`}))]};k.value=o(s,n),O.value.market&&async function(e="claude",a=!1){return(await ct.get("/plugins/market",{params:{platform:e,refresh:a?"1":""}})).data}(l,e).catch(()=>({success:!0,plugins:[]})).then(e=>{a===A.value&&l===j.value&&(n=e.success?e.plugins:[],k.value=o(s,n))})}catch(t){v.error("加载插件失败: "+t.message)}finally{a===A.value&&(b.value=!1)}}async function K(){if("claude"===j.value){I.value=!0;try{const e=await Rf("plugins");e.success?(v.success(`成功导入 ${e.imported} 个插件`),await G(!0)):v.error(e.message||"导入失败")}catch(e){v.error("导入失败: "+e.message)}finally{I.value=!1}}}async function q(e){if(O.value.install&&!e.readonly){if(!(e.installSource||e.repoOwner||e.repoProjectPath||e.repoLocalPath))return v.error("缺少可安装来源");z.value[e.key]=!0;try{const a=e.installSource?await gk("",null,j.value,e.installSource):await gk(e.directory,{id:e.repoId,provider:e.repoProvider,host:e.repoHost,owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main",projectPath:e.repoProjectPath,localPath:e.repoLocalPath,repoUrl:e.repoUrl,marketplace:e.marketplace},j.value);if(a.success){v.success(`插件 "${e.name}" 安装成功`);const a=k.value.findIndex(a=>a.key===e.key);-1!==a&&(k.value[a]={...k.value[a],installed:!0,key:`installed-${e.name}`})}else v.error(a.message||"安装失败")}catch(a){v.error("安装失败: "+a.message)}finally{delete z.value[e.key]}}}async function W(e){if(O.value.uninstall&&!e.readonly){T.value[e.key]=!0;try{const a=await async function(e,a="claude"){return(await ct.delete(`/plugins/${encodeURIComponent(e)}`,{params:{platform:a}})).data}(e.name,j.value);if(a.success){v.success(`插件 "${e.name}" 已卸载`);const a=k.value.findIndex(a=>a.key===e.key);-1!==a&&(k.value[a]={...k.value[a],installed:!1,key:`market-${e.repoId||e.repoProjectPath||e.repoLocalPath||e.repoOwner||"repo"}-${e.directory||e.name}`})}else v.error(a.message||a.error||"卸载失败")}catch(a){v.error("卸载失败: "+a.message)}finally{delete T.value[e.key]}}}function V(e){S.value=e,P.value=!0}return w(()=>{a.inDrawer&&!a.drawerVisible||G()}),x(()=>a.drawerVisible,e=>{e&&G()}),x(()=>j.value,()=>{G()}),(a,l)=>(n(),s("div",{class:p(["plugins-panel asset-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?i("",!0):(n(),s("div",T_,[o("div",I_,[e.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d($a))]),_:1})]),_:1})),o("div",M_,[o("div",A_,[l[10]||(l[10]=o("span",{class:"asset-title"},"插件管理",-1)),o("span",O_,m(L.value),1)]),l[11]||(l[11]=o("div",{class:"asset-subtitle"},"管理平台插件、仓库源和市场安装状态",-1))])]),o("div",$_,[O.value.repositories?(n(),g(d(F),{key:0,text:"",focusable:!1,onClick:l[1]||(l[1]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(la))]),_:1})]),default:u(()=>[l[12]||(l[12]=h(" 仓库 ",-1))]),_:1})):i("",!0),O.value.import?(n(),g(d(F),{key:1,text:"",focusable:!1,onClick:K,loading:I.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ja))]),_:1})]),default:u(()=>[l[13]||(l[13]=h(" 导入 ",-1))]),_:1},8,["loading"])):i("",!0),c(d(F),{text:"",focusable:!1,onClick:l[2]||(l[2]=e=>G(!0)),loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[14]||(l[14]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),s("div",j_,[o("div",L_,[O.value.repositories?(n(),g(d(F),{key:0,text:"",focusable:!1,onClick:l[3]||(l[3]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(la))]),_:1})]),default:u(()=>[l[15]||(l[15]=h(" 仓库 ",-1))]),_:1})):i("",!0),O.value.import?(n(),g(d(F),{key:1,text:"",focusable:!1,onClick:K,loading:I.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ja))]),_:1})]),default:u(()=>[l[16]||(l[16]=h(" 导入 ",-1))]),_:1},8,["loading"])):i("",!0),c(d(F),{text:"",focusable:!1,onClick:l[4]||(l[4]=e=>G(!0)),loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[17]||(l[17]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",E_,[o("span",D_,[l[18]||(l[18]=o("span",{class:"asset-summary-label"},"全部",-1)),o("span",N_,m(k.value.length),1)]),o("span",B_,[l[19]||(l[19]=o("span",{class:"asset-summary-label"},"已安装",-1)),o("span",R_,m(D.value),1)]),o("span",F_,[l[20]||(l[20]=o("span",{class:"asset-summary-label"},"可安装",-1)),o("span",H_,m(k.value.length-D.value),1)])]),o("div",G_,[c(d(ne),{value:_.value,"onUpdate:value":l[5]||(l[5]=e=>_.value=e),placeholder:"搜索插件名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:C.value,"onUpdate:value":l[6]||(l[6]=e=>C.value=e),options:E,size:"small",class:"asset-filter"},null,8,["value"])]),o("div",K_,[c(d(Z),{show:b.value},{default:u(()=>[0!==N.value.length||b.value?(n(),s("div",W_,[(n(!0),s(f,null,y(N.value,e=>(n(),g(Mk,{key:e.key,plugin:e,readonly:e.readonly||!O.value.install&&!O.value.uninstall,"can-install":O.value.install,"can-uninstall":O.value.uninstall,installing:!!z.value[e.key],uninstalling:!!T.value[e.key],onInstall:q,onUninstall:W,onClick:V},null,8,["plugin","readonly","can-install","can-uninstall","installing","uninstalling"]))),128))])):(n(),s("div",q_,[c(d(Q),{description:B.value},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Je))]),_:1})]),extra:u(()=>[0===k.value.length&&O.value.repositories?(n(),g(d(F),{key:0,size:"small",onClick:l[7]||(l[7]=e=>U.value=!0)},{default:u(()=>[...l[21]||(l[21]=[h("配置仓库源",-1)])]),_:1})):i("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),O.value.install||O.value.uninstall?(n(),s("div",V_,[c(d(R),{size:"14",class:"asset-info-icon"},{default:u(()=>[c(d(Ia))]),_:1}),o("span",null,"安装/卸载后需重启 "+m(L.value)+" 生效",1)])):i("",!0),O.value.repositories?(n(),g(o_,{key:3,visible:U.value,"onUpdate:visible":l[8]||(l[8]=e=>U.value=e),platform:j.value,onUpdated:G},null,8,["visible","platform"])):i("",!0),c(z_,{visible:P.value,"onUpdate:visible":l[9]||(l[9]=e=>P.value=e),plugin:S.value,platform:j.value,onUpdated:G},null,8,["visible","plugin","platform"])],2))}},[["__scopeId","data-v-5a7deaf1"]]),Z_=zl({__name:"PluginsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=ei(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},[o("span",null,"插件管理")],-1)])]),default:u(()=>[c(J_,{onBack:a[0]||(a[0]=e=>r.value=!1),"hide-back":!0,"in-drawer":!0,"drawer-visible":r.value,platform:l.platform},null,8,["drawer-visible","platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-1d785d25"]]),Q_="/workspaces";async function Y_(){return(await ct.get(`${Q_}/available-projects`)).data}const X_={class:"card-header"},ex={class:"card-title"},ax={class:"name"},lx={class:"card-body"},tx={key:0,class:"info-row"},sx={class:"value"},nx={class:"info-row"},ox={class:"value"},ix={class:"info-row"},rx={class:"value path"},cx={key:1,class:"info-row"},ux={class:"value"},dx=zl({__name:"WorkspaceCard",props:{workspace:{type:Object,required:!0}},emits:["click","view","delete"],setup:e=>(a,l)=>{return n(),s("div",{class:"workspace-card",onClick:l[3]||(l[3]=l=>a.$emit("click",e.workspace))},[o("div",X_,[o("div",ex,[o("span",ax,m(e.workspace.name),1),c(d(H),{type:e.workspace.exists?"success":"error",size:"small"},{default:u(()=>[h(m(e.workspace.exists?"存在":"不存在"),1)]),_:1},8,["type"])]),o("div",{class:"card-actions",onClick:l[2]||(l[2]=v(()=>{},["stop"]))},[c(d(F),{text:"",size:"small",onClick:l[0]||(l[0]=l=>a.$emit("view",e.workspace))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(tl))]),_:1})]),_:1}),c(d(F),{text:"",size:"small",type:"error",onClick:l[1]||(l[1]=l=>a.$emit("delete",e.workspace))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1})])]),o("div",lx,[e.workspace.description?(n(),s("div",tx,[l[4]||(l[4]=o("span",{class:"label"},"描述",-1)),o("span",sx,m(e.workspace.description),1)])):i("",!0),o("div",nx,[l[5]||(l[5]=o("span",{class:"label"},"项目数",-1)),o("span",ox,m(e.workspace.projectCount||0),1)]),o("div",ix,[l[6]||(l[6]=o("span",{class:"label"},"路径",-1)),o("span",rx,m(e.workspace.path),1)]),e.workspace.lastUsed?(n(),s("div",cx,[l[7]||(l[7]=o("span",{class:"label"},"最后使用",-1)),o("span",ux,m((t=e.workspace.lastUsed,t?new Date(t).toLocaleString("zh-CN"):"-")),1)])):i("",!0)])]);var t}},[["__scopeId","data-v-74e07bc9"]]),px="/config-templates";async function vx(){return(await ct.get(px)).data}async function mx(){return(await ct.get(`${px}/available-configs`)).data}const fx={class:"project-item"},yx={class:"item-header"},gx={class:"item-title"},hx={class:"item-body"},bx={key:2,class:"git-options"},wx={key:0,class:"branch-inputs"},kx={key:1,class:"branch-inputs"},_x={key:2,class:"branch-inputs"},xx=zl({__name:"ProjectItem",props:{project:{type:Object,required:!0},index:{type:Number,required:!0},existingOptions:{type:Array,default:()=>[]},showRemoveButton:{type:Boolean,default:!0}},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 ct.get(`${Q_}/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),e.data.isGitRepo&&!a.project.branchMode&&(a.project.branchMode="existing"))}catch(e){}}return(a,t)=>(n(),s("div",fx,[o("div",yx,[o("span",gx,"项目 "+m(e.index+1),1),e.showRemoveButton?(n(),g(d(F),{key:0,text:"",size:"tiny",type:"error",onClick:t[0]||(t[0]=e=>a.$emit("remove"))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fe))]),_:1})]),_:1})):i("",!0)]),o("div",hx,[e.project.fromExisting?(n(),s(f,{key:0},[c(d(ee),{value:e.project.selectedKey,"onUpdate:value":[t[1]||(t[1]=a=>e.project.selectedKey=a),t[2]||(t[2]=l=>a.$emit("select-existing",e.index,l))],options:e.existingOptions,placeholder:"选择已有项目",filterable:"",size:"small"},null,8,["value","options"]),c(d(ne),{value:e.project.sourcePath,placeholder:"项目路径",disabled:"",size:"small"},null,8,["value"])],64)):(n(),s(f,{key:1},[c(d(ne),{value:e.project.sourcePath,"onUpdate:value":t[3]||(t[3]=a=>e.project.sourcePath=a),placeholder:"项目源路径",size:"small",onBlur:l},null,8,["value"]),c(d(ne),{value:e.project.name,"onUpdate:value":t[4]||(t[4]=a=>e.project.name=a),placeholder:"软链接名称(可选)",size:"small"},null,8,["value"])],64)),e.project.isGitRepo?(n(),s("div",bx,[c(d(we),{checked:e.project.createWorktree,"onUpdate:checked":t[5]||(t[5]=a=>e.project.createWorktree=a),size:"small"},{default:u(()=>[...t[10]||(t[10]=[h(" 创建 Git Worktree ",-1)])]),_:1},8,["checked"]),e.project.createWorktree?(n(),s("div",wx,[c(d(le),{value:e.project.branchMode,"onUpdate:value":t[6]||(t[6]=a=>e.project.branchMode=a),size:"small",class:"branch-mode-group"},{default:u(()=>[c(d(te),{value:"existing"},{default:u(()=>[...t[11]||(t[11]=[h("使用已有分支",-1)])]),_:1}),c(d(te),{value:"new"},{default:u(()=>[...t[12]||(t[12]=[h("新建分支",-1)])]),_:1})]),_:1},8,["value"])])):i("",!0),e.project.createWorktree&&"existing"===(e.project.branchMode||"existing")?(n(),s("div",kx,[c(d(ne),{value:e.project.branch,"onUpdate:value":t[7]||(t[7]=a=>e.project.branch=a),placeholder:"已有分支名(留空使用当前分支)",size:"small",style:{flex:"1"}},null,8,["value"])])):i("",!0),e.project.createWorktree&&"new"===(e.project.branchMode||"existing")?(n(),s("div",_x,[c(d(ne),{value:e.project.branch,"onUpdate:value":t[8]||(t[8]=a=>e.project.branch=a),placeholder:"新分支名",size:"small",style:{flex:"1"}},null,8,["value"]),c(d(ne),{value:e.project.baseBranch,"onUpdate:value":t[9]||(t[9]=a=>e.project.baseBranch=a),placeholder:"基于分支(可选,如 main)",size:"small",style:{flex:"1"}},null,8,["value"])])):i("",!0),e.project.createWorktree?(n(),g(d(K),{key:3,depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:u(()=>["existing"===(e.project.branchMode||"existing")?(n(),s(f,{key:0},[h(" [INFO] 填已有分支名时优先直接检出;留空则使用当前分支 ")],64)):e.project.branch&&e.project.baseBranch?(n(),s(f,{key:1},[h(' [INFO] 将新建分支 "'+m(e.project.branch)+'",并基于 "'+m(e.project.baseBranch)+'" 创建 ',1)],64)):e.project.branch?(n(),s(f,{key:2},[h(' [INFO] 将新建分支 "'+m(e.project.branch)+'",并基于源仓库当前分支创建 ',1)],64)):(n(),s(f,{key:3},[h(" [INFO] 请输入新分支名 ")],64))]),_:1})):i("",!0)])):i("",!0),e.project.isGitRepo?(n(),g(d(K),{key:3,depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...t[13]||(t[13]=[h("[v] Git 仓库",-1)])]),_:1})):i("",!0)])]))}},[["__scopeId","data-v-1cf82955"]]);function Cx(e=""){const a=String(e||"").trim();if(!a)return"";const l=a.replace(/[\\/]+$/,"");if(!l)return"";const t=l.split(/[\\/]+/);return t[t.length-1]||""}function Ux({fromExisting:e=!1}={}){return{sourcePath:"",name:"",createWorktree:!1,branchMode:"existing",branch:"",baseBranch:"",isGitRepo:!1,fromExisting:e,selectedKey:""}}function Px(e){return"string"==typeof e?e.trim():""}function Sx(e={}){const a={sourcePath:Px(e.sourcePath),name:Px(e.name),createWorktree:!1!==e.createWorktree&&!!e.isGitRepo};if(a.name||delete a.name,!a.createWorktree)return a;const l=Px(e.branch);if(l&&(a.branch=l),"new"===e.branchMode){const l=Px(e.baseBranch);l&&(a.baseBranch=l)}return a}const zx={class:"projects-section"},Tx={class:"projects-actions"},Ix={key:0,class:"projects-list"},Mx=zl({__name:"WorkspaceFormModal",props:{show:{type:Boolean,default:!1}},emits:["update:show","success"],setup(e,{emit:a}){const i=e,r=a,p=Ue(),m=l(null),b=l(!1),w=l([]),k=l([]),_=t({get:()=>i.show,set:e=>r("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"}]},P=t(()=>w.value.map(e=>({label:e.name,value:e.id}))),S=t(()=>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 z(e){C.value.projects.push(Ux({fromExisting:e}))}function T(e,a){const l=S.value.find(e=>e.value===a);if(!l)return;const t=C.value.projects[e];t.sourcePath=l.path,t.name=Cx(l.path),t.isGitRepo=l.isGitRepo,t.createWorktree=l.isGitRepo,t.branchMode="existing",t.branch="",t.baseBranch=""}async function I(){var e;try{await(null==(e=m.value)?void 0:e.validate());for(const e of C.value.projects)if(!e.sourcePath)return void p.error("请填写项目路径");b.value=!0;const a={...C.value,projects:C.value.projects.map(Sx)},l=await async function(e){return(await ct.post(Q_,e)).data}(a);l.success?(p.success("工作区创建成功"),C.value={name:"",description:"",baseDir:"",configTemplateId:null,projects:[]},r("success")):p.error(l.message||"创建失败")}catch(a){const e=a.message||"创建失败";e.includes("\n")?p.warning(e,{duration:8e3}):p.error(e),a.errors}finally{b.value=!1}}return x(_,e=>{e&&async function(){try{const[e,a]=await Promise.all([vx(),Y_()]);e.success&&(w.value=e.data||[]),a.success&&(k.value=Array.isArray(a.data)?a.data:[])}catch(e){}}()}),(e,a)=>(n(),g(d(se),{show:_.value,"onUpdate:show":a[8]||(a[8]=e=>_.value=e),preset:"card",title:"创建工作区",style:{width:"650px"},"mask-closable":!1},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:a[7]||(a[7]=e=>_.value=!1)},{default:u(()=>[...a[12]||(a[12]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:I,loading:b.value},{default:u(()=>[...a[13]||(a[13]=[h("创建",-1)])]),_:1},8,["loading"])]),_:1})]),default:u(()=>[c(d(Y),{ref_key:"formRef",ref:m,model:C.value,rules:U,"label-placement":"left","label-width":"100"},{default:u(()=>[c(d(X),{label:"工作区名称",path:"name"},{default:u(()=>[c(d(ne),{value:C.value.name,"onUpdate:value":a[0]||(a[0]=e=>C.value.name=e),placeholder:"输入工作区名称",onKeydown:a[1]||(a[1]=$(v(()=>{},["prevent"]),["enter"]))},null,8,["value"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:C.value.description,"onUpdate:value":a[2]||(a[2]=e=>C.value.description=e),placeholder:"可选描述",type:"textarea",rows:2},null,8,["value"])]),_:1}),c(d(X),{label:"基础目录",path:"baseDir"},{default:u(()=>[c(d(ne),{value:C.value.baseDir,"onUpdate:value":a[3]||(a[3]=e=>C.value.baseDir=e),placeholder:"留空则使用第一个项目的父目录"},null,8,["value"])]),_:1}),c(d(X),{label:"配置模板",path:"configTemplateId"},{default:u(()=>[c(d(ee),{value:C.value.configTemplateId,"onUpdate:value":a[4]||(a[4]=e=>C.value.configTemplateId=e),options:P.value,placeholder:"选择配置模板",clearable:""},null,8,["value","options"])]),_:1}),c(d(X),{label:"项目列表",path:"projects"},{default:u(()=>[o("div",zx,[o("div",Tx,[c(d(F),{size:"small",dashed:"",onClick:a[5]||(a[5]=e=>z(!1))},{default:u(()=>[...a[9]||(a[9]=[h("添加项目",-1)])]),_:1}),c(d(F),{size:"small",dashed:"",onClick:a[6]||(a[6]=e=>z(!0))},{default:u(()=>[...a[10]||(a[10]=[h("添加已有项目",-1)])]),_:1})]),C.value.projects.length>0?(n(),s("div",Ix,[(n(!0),s(f,null,y(C.value.projects,(e,a)=>(n(),g(xx,{key:a,project:e,index:a,"existing-options":S.value,onRemove:e=>function(e){C.value.projects.splice(e,1)}(a),onSelectExisting:T},null,8,["project","index","existing-options","onRemove"]))),128))])):(n(),g(d(K),{key:1,depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[11]||(a[11]=[h("请添加至少一个项目",-1)])]),_:1}))])]),_:1})]),_:1},8,["model"])]),_:1},8,["show"]))}},[["__scopeId","data-v-4b48727c"]]),Ax={class:"form-section"},Ox={class:"actions-row"},$x=zl({__name:"WorkspaceProjectFormModal",props:{show:{type:Boolean,default:!1},workspaceId:{type:String,required:!0}},emits:["update:show","success"],setup(e,{emit:a}){const s=e,i=a,r=Ue(),p=l(!1),v=l([]),m=l(Ux()),f=t({get:()=>s.show,set:e=>i("update:show",e)}),y=t(()=>v.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 b(){m.value=Ux()}function w(){m.value=Ux({fromExisting:!1})}function k(){m.value=Ux({fromExisting:!0})}function _(e,a){const l=y.value.find(e=>e.value===a);l&&(m.value.selectedKey=a,m.value.sourcePath=l.path,m.value.name=Cx(l.path),m.value.isGitRepo=l.isGitRepo,m.value.createWorktree=l.isGitRepo,m.value.branchMode="existing",m.value.branch="",m.value.baseBranch="",m.value.fromExisting=!0)}async function C(){const e=Sx(m.value);if(e.sourcePath)if(!m.value.createWorktree||"new"!==m.value.branchMode||e.branch){p.value=!0;try{const a=await async function(e,a){return(await ct.post(`${Q_}/${e}/projects`,a)).data}(s.workspaceId,e);if(a.success)return r.success("仓库已添加到工作区"),f.value=!1,b(),void i("success");r.error(a.message||"添加失败")}catch(a){r.error(`添加失败: ${a.message}`)}finally{p.value=!1}}else r.error("请输入新分支名");else r.error("请填写项目路径")}return x(f,e=>{e&&(b(),async function(){try{const e=await Y_();e.success&&(v.value=Array.isArray(e.data)?e.data:[])}catch(e){}}())}),(e,a)=>(n(),g(d(se),{show:f.value,"onUpdate:show":a[1]||(a[1]=e=>f.value=e),preset:"card",title:"添加仓库到工作区",style:{width:"620px"},"mask-closable":!1},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:a[0]||(a[0]=e=>f.value=!1)},{default:u(()=>[...a[4]||(a[4]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:p.value,onClick:C},{default:u(()=>[...a[5]||(a[5]=[h("添加",-1)])]),_:1},8,["loading"])]),_:1})]),default:u(()=>[o("div",Ax,[o("div",Ox,[c(d(F),{size:"small",dashed:"",type:m.value.fromExisting?"default":"primary",onClick:w},{default:u(()=>[...a[2]||(a[2]=[h(" 手动填写路径 ",-1)])]),_:1},8,["type"]),c(d(F),{size:"small",dashed:"",type:m.value.fromExisting?"primary":"default",onClick:k},{default:u(()=>[...a[3]||(a[3]=[h(" 选择已有项目 ",-1)])]),_:1},8,["type"])]),c(xx,{project:m.value,index:0,"existing-options":y.value,"show-remove-button":!1,onSelectExisting:_},null,8,["project","existing-options"])])]),_:1},8,["show"]))}},[["__scopeId","data-v-16febc8c"]]),jx={class:"section-header"},Lx={class:"section-title"},Ex={key:0,class:"projects-list"},Dx={class:"proj-name"},Nx={class:"proj-path"},Bx=zl({__name:"WorkspaceDetailModal",props:{show:{type:Boolean,default:!1},workspace:{type:Object,default:null}},emits:["update:show","updated"],setup(e,{emit:a}){const r=e,p=a,v=Ue(),b=Pe(),w=t({get:()=>r.show,set:e=>p("update:show",e)}),k=l(null),_=l(!1);function C(e){return e?new Date(e).toLocaleString("zh-CN"):"-"}async function U(){var e;if(null==(e=r.workspace)?void 0:e.id)try{const e=await async function(e){return(await ct.get(`${Q_}/${e}`)).data}(r.workspace.id);e.success&&(k.value=e.data)}catch(a){}}function P(){U(),p("updated")}function S(e){var a;(null==(a=r.workspace)?void 0:a.id)&&b.warning({title:"确认移除仓库",content:`确定要从工作区移除 "${e.name}" 吗?`,positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{try{const a=await async function(e,a,l=!1){const t=encodeURIComponent(a);return(await ct.delete(`${Q_}/${e}/projects/${t}`,{params:{removeWorktrees:l}})).data}(r.workspace.id,e.name);if(a.success)return v.success("仓库已移除"),void P();v.error(a.message||"移除失败")}catch(a){v.error(`移除失败: ${a.message}`)}}})}async function z(e){var a;if(null==(a=r.workspace)?void 0:a.id)try{const a=await async function(e,a,l=null){return(await ct.post(`${Q_}/${e}/launch`,{tool:a,projectName:l})).data}(r.workspace.id,e);if(a.success){const e=`cd "${a.data.cwd}" && ${a.data.command}`,l=await Lo(e);if("manual"===(null==l?void 0:l.method))return void v.warning("自动复制失败,已弹出手动复制框");v.success("启动命令已复制到剪贴板")}else v.error(a.message||"获取命令失败")}catch(l){v.error("获取命令失败: "+l.message)}}return x(w,e=>{e&&r.workspace&&U()}),(a,l)=>(n(),g(d(se),{show:w.value,"onUpdate:show":l[6]||(l[6]=e=>w.value=e),preset:"card",title:"工作区详情",style:{width:"700px"}},{default:u(()=>{var a,t,p,v,b,w;return[e.workspace?(n(),s(f,{key:0},[c(d(Se),{column:1,bordered:"",size:"small"},{default:u(()=>[c(d(ze),{label:"名称"},{default:u(()=>[h(m(e.workspace.name),1)]),_:1}),c(d(ze),{label:"描述"},{default:u(()=>[h(m(e.workspace.description||"-"),1)]),_:1}),c(d(ze),{label:"路径"},{default:u(()=>[h(m(e.workspace.path),1)]),_:1}),c(d(ze),{label:"状态"},{default:u(()=>[c(d(H),{type:e.workspace.exists?"success":"error",size:"small"},{default:u(()=>[h(m(e.workspace.exists?"存在":"不存在"),1)]),_:1},8,["type"])]),_:1}),c(d(ze),{label:"创建时间"},{default:u(()=>[h(m(C(e.workspace.createdAt)),1)]),_:1}),c(d(ze),{label:"最后使用"},{default:u(()=>[h(m(C(e.workspace.lastUsed)),1)]),_:1})]),_:1}),c(d(de)),l[15]||(l[15]=o("div",{class:"section-title"},"启动 CLI 工具",-1)),c(d(ae),null,{default:u(()=>[c(d(F),{type:"primary",size:"small",onClick:l[0]||(l[0]=e=>z("claude")),disabled:!e.workspace.exists},{default:u(()=>[...l[7]||(l[7]=[h(" Claude Code ",-1)])]),_:1},8,["disabled"]),c(d(F),{type:"info",size:"small",onClick:l[1]||(l[1]=e=>z("codex")),disabled:!e.workspace.exists},{default:u(()=>[...l[8]||(l[8]=[h(" Codex ",-1)])]),_:1},8,["disabled"]),c(d(F),{type:"success",size:"small",onClick:l[2]||(l[2]=e=>z("gemini")),disabled:!e.workspace.exists},{default:u(()=>[...l[9]||(l[9]=[h(" Gemini CLI ",-1)])]),_:1},8,["disabled"]),c(d(F),{type:"warning",size:"small",onClick:l[3]||(l[3]=e=>z("omp")),disabled:!e.workspace.exists},{default:u(()=>[...l[10]||(l[10]=[h(" OMP ",-1)])]),_:1},8,["disabled"])]),_:1}),c(d(K),{depth:"3",style:{display:"block","margin-top":"6px","font-size":"11px"}},{default:u(()=>[...l[11]||(l[11]=[h(" 点击按钮将复制启动命令到剪贴板 ",-1)])]),_:1}),c(d(de)),o("div",jx,[o("div",Lx,"包含项目 ("+m((null==(t=null==(a=k.value)?void 0:a.projects)?void 0:t.length)||0)+")",1),c(d(F),{size:"small",type:"primary",ghost:"",disabled:!(null==(p=k.value)?void 0:p.exists),onClick:l[4]||(l[4]=e=>_.value=!0)},{default:u(()=>[...l[12]||(l[12]=[h(" 添加仓库 ",-1)])]),_:1},8,["disabled"])]),(null==(b=null==(v=k.value)?void 0:v.projects)?void 0:b.length)?(n(),s("div",Ex,[(n(!0),s(f,null,y(k.value.projects,(e,a)=>(n(),s("div",{class:"project-row",key:a},[c(d(H),{type:e.sourceExists?"success":"error",size:"small"},{default:u(()=>[h(m(e.sourceExists?"[v]":"[x]"),1)]),_:2},1032,["type"]),o("span",Dx,m(e.name),1),o("span",Nx,m(e.sourcePath),1),e.useWorktree?(n(),g(d(H),{key:0,type:"info",size:"small"},{default:u(()=>[...l[13]||(l[13]=[h("worktree",-1)])]),_:1})):i("",!0),c(d(F),{text:"",size:"small",type:"error",onClick:a=>S(e)},{default:u(()=>[...l[14]||(l[14]=[h(" 移除 ",-1)])]),_:1},8,["onClick"])]))),128))])):(n(),g(d(Q),{key:1,description:"暂无项目",size:"small"}))],64)):i("",!0),c($x,{show:_.value,"onUpdate:show":l[5]||(l[5]=e=>_.value=e),"workspace-id":(null==(w=r.workspace)?void 0:w.id)||"",onSuccess:P},null,8,["show","workspace-id"])]}),_:1},8,["show"]))}},[["__scopeId","data-v-1ee80e2a"]]),Rx={key:0,class:"panel-header"},Fx={class:"header-left"},Hx={class:"header-right"},Gx={key:1,class:"drawer-header-bar"},Kx={class:"header-right"},qx={class:"stats-bar"},Wx={class:"stats-text"},Vx={class:"filter-bar"},Jx={class:"panel-content"},Zx={key:0,class:"empty-state"},Qx={key:1,class:"card-list"},Yx={class:"panel-footer"},Xx=zl({__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 r=e,v=a,b=Ue(),k=Pe(),_=l(!1),C=l([]),U=l(""),P=l(!1),S=l(!1),z=l(null),T=t(()=>{if(!U.value.trim())return C.value;const e=U.value.toLowerCase();return C.value.filter(a=>{var l,t,s;return(null==(l=a.name)?void 0:l.toLowerCase().includes(e))||(null==(t=a.description)?void 0:t.toLowerCase().includes(e))||(null==(s=a.path)?void 0:s.toLowerCase().includes(e))})});async function I(){_.value=!0;try{const e=await async function(){return(await ct.get(Q_)).data}();e.success&&(C.value=e.data||[])}catch(e){b.error("加载工作区失败: "+e.message)}finally{_.value=!1}}function M(e){z.value=e,S.value=!0}function A(e){k.warning({title:"确认删除",content:`确定要删除工作区"${e.name}"吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{const a=await async function(e,a=!1){return(await ct.delete(`${Q_}/${e}`,{params:{removeFiles:a}})).data}(e.id,!1);a.success?(b.success("删除成功"),I(),v("updated")):b.error(a.message||"删除失败")}catch(a){b.error("删除失败: "+a.message)}}})}function O(){P.value=!1,I(),v("updated")}return w(()=>I()),x(()=>r.drawerVisible,e=>{e&&I()}),(a,l)=>(n(),s("div",{class:p(["workspace-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?i("",!0):(n(),s("div",Rx,[o("div",Fx,[e.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d($a))]),_:1})]),_:1})),l[7]||(l[7]=o("span",{class:"panel-title"},"工作区管理",-1))]),o("div",Hx,[c(d(F),{text:"",onClick:l[1]||(l[1]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[8]||(l[8]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:I,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),s("div",Gx,[o("div",Kx,[c(d(F),{text:"",onClick:l[2]||(l[2]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[10]||(l[10]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:I,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[11]||(l[11]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",qx,[o("span",Wx," 共 "+m(C.value.length)+" 个工作区 ",1)]),o("div",Vx,[c(d(ne),{value:U.value,"onUpdate:value":l[3]||(l[3]=e=>U.value=e),placeholder:"搜索工作区...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"])]),o("div",Jx,[c(d(Z),{show:_.value},{default:u(()=>[0!==T.value.length||_.value?(n(),s("div",Qx,[(n(!0),s(f,null,y(T.value,e=>(n(),g(dx,{key:e.id,workspace:e,onClick:M,onView:M,onDelete:A},null,8,["workspace"]))),128))])):(n(),s("div",Zx,[c(d(Q),{description:"暂无工作区"},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Wa))]),_:1})]),extra:u(()=>[c(d(F),{size:"small",onClick:l[4]||(l[4]=e=>P.value=!0)},{default:u(()=>[...l[12]||(l[12]=[h("创建第一个工作区",-1)])]),_:1})]),_:1})]))]),_:1},8,["show"])]),o("div",Yx,[c(d(R),{size:"14",class:"info-icon"},{default:u(()=>[c(d(Ia))]),_:1}),l[13]||(l[13]=o("span",null,"工作区用于管理多个项目的统一开发环境",-1))]),c(Mx,{show:P.value,"onUpdate:show":l[5]||(l[5]=e=>P.value=e),onSuccess:O},null,8,["show"]),c(Bx,{show:S.value,"onUpdate:show":l[6]||(l[6]=e=>S.value=e),workspace:z.value,onUpdated:I},null,8,["show","workspace"])],2))}},[["__scopeId","data-v-da5160b9"]]),eC=zl({__name:"WorkspaceDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=ei(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},"工作区管理",-1)])]),default:u(()=>[c(Xx,{"in-drawer":!0,"hide-back":!0,"drawer-visible":r.value,onBack:a[0]||(a[0]=e=>r.value=!1)},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-311a4d94"]]),aC={class:"card-header"},lC={class:"card-title"},tC={class:"name"},sC={class:"card-body"},nC={key:0,class:"description"},oC={class:"stats"},iC={key:0},rC={key:1},cC={key:2},uC={key:3},dC={key:4},pC=zl({__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"},omp:{label:"OMP",color:"#0f9f9a",textColor:"#fff",borderColor:"#0f9f9a"}},r={claude:"CLAUDE.md",codex:"AGENTS.md",gemini:"GEMINI.md",opencode:".opencode/AGENTS.md",omp:".omp/commands"};function p(e){var a;return(null==(a=l[e])?void 0:a.label)||e}function f(e){const a=l[e];return a?{color:a.color,textColor:a.textColor,borderColor:a.borderColor}:{}}const y=t(()=>{var e,l,t;const s=a.template,n=null==s?void 0:s.cliType;if(!n||"all"===n)return null;if("omp"===n&&(null==(e=null==s?void 0:s.commands)?void 0:e.length))return r.omp;const o=null==(l=null==s?void 0:s.aiConfigs)?void 0:l[n];return(null==o?void 0:o.enabled)?r[n]||null:"claude"===n&&(null==(t=null==s?void 0:s.claudeMd)?void 0:t.enabled)?"CLAUDE.md":null});return(a,l)=>{var t,r,b,w,k,_;return n(),s("div",{class:"template-card",onClick:l[5]||(l[5]=l=>a.$emit("click",e.template))},[o("div",aC,[o("div",lC,[o("span",tC,m(e.template.name),1),e.template.cliType?(n(),g(d(H),{key:0,size:"small",color:f(e.template.cliType),round:""},{default:u(()=>[h(m(p(e.template.cliType)),1)]),_:1},8,["color"])):i("",!0)]),o("div",{class:"card-actions",onClick:l[4]||(l[4]=v(()=>{},["stop"]))},[c(d(F),{size:"small",type:"primary",onClick:l[0]||(l[0]=l=>a.$emit("apply",e.template))},{default:u(()=>[...l[6]||(l[6]=[h("应用",-1)])]),_:1}),c(d(F),{size:"small",onClick:l[1]||(l[1]=l=>a.$emit("preview",e.template))},{default:u(()=>[...l[7]||(l[7]=[h("预览",-1)])]),_:1}),c(d(F),{size:"small",onClick:l[2]||(l[2]=l=>a.$emit("edit",e.template))},{default:u(()=>[...l[8]||(l[8]=[h("编辑",-1)])]),_:1}),c(d(F),{size:"small",type:"error",loading:e.deleting,onClick:l[3]||(l[3]=l=>a.$emit("delete",e.template))},{default:u(()=>[...l[9]||(l[9]=[h("删除",-1)])]),_:1},8,["loading"])])]),o("div",sC,[e.template.description?(n(),s("div",nC,m((k=e.template.description,_=80,(null==k?void 0:k.length)>_?k.slice(0,_)+"...":k)),1)):i("",!0),o("div",oC,[y.value?(n(),s("span",iC,m(y.value),1)):i("",!0),(null==(t=e.template.skills)?void 0:t.length)?(n(),s("span",rC,m(e.template.skills.length)+" Skills",1)):i("",!0),(null==(r=e.template.agents)?void 0:r.length)?(n(),s("span",cC,m(e.template.agents.length)+" Agents",1)):i("",!0),(null==(b=e.template.commands)?void 0:b.length)?(n(),s("span",uC,m(e.template.commands.length)+" Commands",1)):i("",!0),(null==(w=e.template.mcpServers)?void 0:w.length)?(n(),s("span",dC,m(e.template.mcpServers.length)+" MCP",1)):i("",!0)])])])}}},[["__scopeId","data-v-0bfacefb"]]),vC=["innerHTML"],mC=zl({__name:"MarkdownViewer",props:{content:{type:String,default:""}},setup(e){const a=e;function l(e,a){pl.getLanguage(e)||pl.registerLanguage(e,a)}l("javascript",vl),l("typescript",gl),l("json",yl),l("bash",fl),l("shell",fl),l("sh",fl),l("python",ml),l("css",hl),l("xml",bl),l("html",bl);const o=new kl({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&pl.getLanguage(a))try{return'<pre class="hljs"><code>'+pl.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(l){}return'<pre class="hljs"><code>'+o.utils.escapeHtml(e)+"</code></pre>"}}),i=t(()=>o.render(a.content||""));return(e,a)=>(n(),s("div",{class:"markdown-viewer",innerHTML:i.value},null,8,vC))}},[["__scopeId","data-v-9e29f753"]]),fC={class:"ai-config-header"},yC={key:0,class:"prompt-preview"},gC={class:"ai-config-header"},hC={class:"ai-config-header"},bC={class:"ai-config-header"},wC=zl({__name:"ConfigTemplateFormModal",props:{show:Boolean,template:Object,availableConfigs:{type:Object,default:()=>({})}},emits:["update:show","success"],setup(e,{emit:a}){const r=e,p=a,v=Ue(),y=l(null),b=l(!1),w=[{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"},{label:"OMP",value:"omp"}],k={claude:{skills:!0,agents:!0,commands:!0},codex:{skills:!0,agents:!0,commands:!0},gemini:{skills:!0,agents:!0,commands:!0},opencode:{skills:!0,agents:!0,commands:!0},omp:{skills:!0,agents:!1,commands:!0}},_=t(()=>{var e;return!!(null==(e=r.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:""},omp:{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"}},P=t(()=>{var e;const a=C.value.cliType,l=(null==(e=r.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}))}),S=t(()=>{var e,a;const l=C.value.cliType,t=(null==(e=r.availableConfigs)?void 0:e.agentsByPlatform)||{};return(l&&t[l]?t[l]:(null==(a=r.availableConfigs)?void 0:a.agents)||[]).map(e=>({value:e.fileName,label:e.name||e.fileName,disabled:!1}))}),z=t(()=>{var e,a;const l=C.value.cliType,t=(null==(e=r.availableConfigs)?void 0:e.commandsByPlatform)||{};return(l&&t[l]?t[l]:(null==(a=r.availableConfigs)?void 0:a.commands)||[]).map(e=>({value:e.namespace?`${e.namespace}/${e.name}`:e.name,label:e.namespace?`${e.namespace}/${e.name}`:e.name,disabled:!1}))}),T=t(()=>{var e,a;const l=(null==(e=r.availableConfigs)?void 0:e.mcpServers)||[],t=(null==(a=r.availableConfigs)?void 0:a.mcpPresets)||[],s=[...l.map(e=>({value:e.id,label:e.name||e.id})),...t.map(e=>({value:e.id,label:`${e.name} (预设)`}))],n=new Set;return s.filter(e=>!n.has(e.value)&&(n.add(e.value),!0))}),I=l(null),M=t(()=>{var e;return((null==(e=r.availableConfigs)?void 0:e.prompts)||[]).map(e=>({value:e.id,label:e.isBuiltin?`[内置] ${e.name}`:e.name,description:e.description}))}),A=t({get:()=>C.value.skills.map(e=>e.directory),set:e=>{var a;const l=C.value.cliType,t=(null==(a=r.availableConfigs)?void 0:a.skillsByPlatform)||{},s=l&&t[l]?t[l]:[];C.value.skills=e.map(e=>{const a=s.find(a=>a.directory===e);return a?{...a}:{directory:e,name:e}})}}),O=t({get:()=>C.value.agents.map(e=>e.fileName),set:e=>{var a,l;const t=C.value.cliType,s=(null==(a=r.availableConfigs)?void 0:a.agentsByPlatform)||{},n=t&&s[t]?s[t]:(null==(l=r.availableConfigs)?void 0:l.agents)||[];C.value.agents=e.map(e=>{const a=n.find(a=>a.fileName===e);return a?{...a}:{fileName:e}})}}),$=t({get:()=>C.value.commands.map(e=>e.namespace?`${e.namespace}/${e.name}`:e.name),set:e=>{var a,l;const t=C.value.cliType,s=(null==(a=r.availableConfigs)?void 0:a.commandsByPlatform)||{},n=t&&s[t]?s[t]:(null==(l=r.availableConfigs)?void 0:l.commands)||[];C.value.commands=e.map(e=>{const a=n.find(a=>(a.namespace?`${a.namespace}/${a.name}`:a.name)===e);return a?{...a}:{name:e}})}});function j(e){var a;if(!e)return void(C.value.aiConfigs.claude.content="");const l=((null==(a=r.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=y.value)?void 0:e.validate())}catch{return}b.value=!0;try{const e={...C.value};let a;a=_.value?await async function(e,a){return(await ct.put(`${px}/${e}`,a)).data}(r.template.id,e):await async function(e){return(await ct.post(px,e)).data}(e),a.success?(v.success(_.value?"保存成功":"创建成功"),p("success")):v.error(a.message||"操作失败")}catch(a){v.error("操作失败: "+a.message)}finally{b.value=!1}}return x(()=>r.show,e=>{if(e)if(I.value=null,r.template){let e={claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""},omp:{enabled:!1,content:""}};if(r.template.aiConfigs)for(const a of["claude","codex","gemini","opencode","omp"])r.template.aiConfigs[a]&&(e[a]={...r.template.aiConfigs[a]});else r.template.claudeMd&&(e.claude={...r.template.claudeMd});C.value={name:r.template.name||"",description:r.template.description||"",cliType:r.template.cliType||"",aiConfigs:e,claudeMd:r.template.claudeMd?{...r.template.claudeMd}:{enabled:!1,content:""},skills:r.template.skills?[...r.template.skills]:[],agents:r.template.agents?[...r.template.agents]:[],commands:r.template.commands?[...r.template.commands]:[],mcpServers:r.template.mcpServers?[...r.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:""},omp:{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)=>{const t=E("n-text");return n(),g(d(se),{show:e.show,preset:"card",title:_.value?"编辑配置模版":"创建配置模版",style:{width:"850px","max-height":"90vh"},"mask-closable":!1,"onUpdate:show":l[28]||(l[28]=e=>p("update:show",e))},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:l[27]||(l[27]=e=>p("update:show",!1))},{default:u(()=>[...l[35]||(l[35]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:b.value,onClick:L},{default:u(()=>[h(m(_.value?"保存":"创建"),1)]),_:1},8,["loading"])]),_:1})]),default:u(()=>[c(d(Te),{style:{"max-height":"calc(90vh - 140px)"}},{default:u(()=>[c(d(Y),{ref_key:"formRef",ref:y,model:C.value,rules:U,"label-placement":"left","label-width":"100"},{default:u(()=>[c(d(Ce),{title:"基本信息",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[c(d(X),{label:"模版名称",path:"name"},{default:u(()=>[c(d(ne),{value:C.value.name,"onUpdate:value":l[0]||(l[0]=e=>C.value.name=e),placeholder:"输入模版名称"},null,8,["value"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:C.value.description,"onUpdate:value":l[1]||(l[1]=e=>C.value.description=e),type:"textarea",rows:2,placeholder:"输入模版描述"},null,8,["value"])]),_:1}),c(d(X),{label:"CLI 工具",path:"cliType"},{default:u(()=>[c(d(ee),{value:C.value.cliType,"onUpdate:value":l[2]||(l[2]=e=>C.value.cliType=e),options:w,placeholder:"选择 CLI 工具类型"},null,8,["value"])]),_:1})]),_:1}),C.value.cliType?i("",!0):(n(),g(d(Ce),{key:0,size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[c(d(Q),{description:"请先选择 CLI 工具类型以显示配置项"})]),_:1})),"claude"===C.value.cliType?(n(),s(f,{key:1},[c(d(Ce),{title:"CLAUDE.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[o("div",fC,[c(d(ae),{align:"center"},{default:u(()=>[c(d(G),{value:C.value.aiConfigs.claude.enabled,"onUpdate:value":l[3]||(l[3]=e=>C.value.aiConfigs.claude.enabled=e)},null,8,["value"]),c(t,{depth:C.value.aiConfigs.claude.enabled?1:3},{default:u(()=>[...l[29]||(l[29]=[h("启用 CLAUDE.md",-1)])]),_:1},8,["depth"])]),_:1})]),c(d(Ie),{show:C.value.aiConfigs.claude.enabled},{default:u(()=>[c(d(ee),{value:I.value,"onUpdate:value":[l[4]||(l[4]=e=>I.value=e),j],options:M.value,placeholder:"选择 Prompt 预设作为 CLAUDE.md 内容",clearable:"",style:{"margin-bottom":"10px"}},null,8,["value","options"]),C.value.aiConfigs.claude.content?(n(),s("div",yC,[c(mC,{content:C.value.aiConfigs.claude.content},null,8,["content"])])):(n(),g(d(Q),{key:1,description:"可选择 Prompt 预设,或留空",style:{padding:"24px 0"}}))]),_:1},8,["show"])]),_:1}),c(d(Ce),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[5]||(l[5]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.agents.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:O.value,"onUpdate:value":l[6]||(l[6]=e=>O.value=e),options:S.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.commands.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:$.value,"onUpdate:value":l[7]||(l[7]=e=>$.value=e),options:z.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[c(d(Me),{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)):i("",!0),"codex"===C.value.cliType?(n(),s(f,{key:2},[c(d(Ce),{title:"AGENTS.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[o("div",gC,[c(d(ae),{align:"center"},{default:u(()=>[c(d(G),{value:C.value.aiConfigs.codex.enabled,"onUpdate:value":l[9]||(l[9]=e=>C.value.aiConfigs.codex.enabled=e)},null,8,["value"]),c(t,{depth:C.value.aiConfigs.codex.enabled?1:3},{default:u(()=>[...l[30]||(l[30]=[h("启用 AGENTS.md",-1)])]),_:1},8,["depth"])]),_:1})]),c(d(Ie),{show:C.value.aiConfigs.codex.enabled},{default:u(()=>[c(Jv,{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}),c(d(Ce),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[11]||(l[11]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.agents.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:O.value,"onUpdate:value":l[12]||(l[12]=e=>O.value=e),options:S.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.commands.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:$.value,"onUpdate:value":l[13]||(l[13]=e=>$.value=e),options:z.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[c(d(Me),{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)):i("",!0),"gemini"===C.value.cliType?(n(),s(f,{key:3},[c(d(Ce),{title:"GEMINI.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[o("div",hC,[c(d(ae),{align:"center"},{default:u(()=>[c(d(G),{value:C.value.aiConfigs.gemini.enabled,"onUpdate:value":l[15]||(l[15]=e=>C.value.aiConfigs.gemini.enabled=e)},null,8,["value"]),c(t,{depth:C.value.aiConfigs.gemini.enabled?1:3},{default:u(()=>[...l[31]||(l[31]=[h("启用 GEMINI.md",-1)])]),_:1},8,["depth"])]),_:1})]),c(d(Ie),{show:C.value.aiConfigs.gemini.enabled},{default:u(()=>[c(Jv,{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}),c(d(Ce),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[17]||(l[17]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[c(d(Me),{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)):i("",!0),"opencode"===C.value.cliType?(n(),s(f,{key:4},[c(d(Ce),{title:".opencode/AGENTS.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[o("div",bC,[c(d(ae),{align:"center"},{default:u(()=>[c(d(G),{value:C.value.aiConfigs.opencode.enabled,"onUpdate:value":l[19]||(l[19]=e=>C.value.aiConfigs.opencode.enabled=e)},null,8,["value"]),c(t,{depth:C.value.aiConfigs.opencode.enabled?1:3},{default:u(()=>[...l[32]||(l[32]=[h("启用 .opencode/AGENTS.md",-1)])]),_:1},8,["depth"])]),_:1})]),c(d(Ie),{show:C.value.aiConfigs.opencode.enabled},{default:u(()=>[c(Jv,{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}),c(d(Ce),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[21]||(l[21]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.agents.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:O.value,"onUpdate:value":l[22]||(l[22]=e=>O.value=e),options:S.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.commands.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:$.value,"onUpdate:value":l[23]||(l[23]=e=>$.value=e),options:z.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.mcpServers.length),1)]),_:1})]),default:u(()=>[c(d(Me),{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)):i("",!0),"omp"===C.value.cliType?(n(),s(f,{key:5},[c(d(Ce),{title:"OMP Commands",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[c(d(H),{size:"small",type:"success"},{default:u(()=>[...l[33]||(l[33]=[h(".omp/commands",-1)])]),_:1})]),_:1}),c(d(Ce),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[25]||(l[25]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(C.value.commands.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:$.value,"onUpdate:value":l[26]||(l[26]=e=>$.value=e),options:z.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),c(d(Ce),{title:"MCP Servers",size:"small"},{default:u(()=>[c(d(H),{size:"small",type:"default"},{default:u(()=>[...l[34]||(l[34]=[h("packages/extensions",-1)])]),_:1})]),_:1})],64)):i("",!0)]),_:1},8,["model"])]),_:1})]),_:1},8,["show","title"])}}},[["__scopeId","data-v-dbfa10c3"]]),kC={key:0},_C={key:1},xC={key:2},CC={key:4},UC={__name:"ConfigApplyModal",props:{show:Boolean,template:Object},emits:["update:show","success"],setup(e,{emit:a}){const r=e,p=a,v=Ue(),b=l(null),w=l(!1),k=l(!1),_=l(null),C=l(!1),U=l([]),P=l(null),S={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"},omp:{key:"omp",name:"OMP command templates",fileName:".omp/commands",color:"#0f9f9a"}},z=t(()=>{var e,a;const l=(null==(e=r.template)?void 0:e.aiConfigs)||{},t=null==(a=r.template)?void 0:a.cliType;if("omp"===t&&S.omp)return[S.omp];const s=Object.entries(l).filter(([,e])=>(null==e?void 0:e.enabled)&&(null==e?void 0:e.content)).map(([e])=>S[e]).filter(Boolean);if(t&&"all"!==t){const e=l[t];if((null==e?void 0:e.enabled)&&(null==e?void 0:e.content)&&S[t])return[S[t]]}return s});function T(){return z.value.map(e=>e.key)}const I=l({targetPath:"",aiConfigTypes:[]}),M={targetPath:{required:!0,message:"请输入目标路径",trigger:"blur"}},A=t(()=>{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 O(e){e&&(I.value.targetPath=e)}async function $(){if(I.value.targetPath&&r.template&&0!==I.value.aiConfigTypes.length){w.value=!0;try{const e=await async function(e,a,l=["claude"]){const t=Array.isArray(l)?l:[l];return(await ct.post(`${px}/${e}/preview`,{targetPath:a,aiConfigTypes:t})).data}(r.template.id,I.value.targetPath,I.value.aiConfigTypes);e.success?_.value=e.data:v.error(e.message||"预览失败")}catch(e){v.error("预览失败: "+e.message)}finally{w.value=!1}}}async function j(){var e,a,l;try{await(null==(e=b.value)?void 0:e.validate())}catch{return}if(r.template&&0!==I.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 ct.post(`${px}/${e}/apply`,{targetPath:a,aiConfigTypes:t})).data}(r.template.id,I.value.targetPath,I.value.aiConfigTypes);if(e.success){const t=(null==(l=null==(a=e.data)?void 0:a.results)?void 0:l.skipped)||[];t.length>0?v.warning(`模版已部分应用,${t.length} 项已跳过`):v.success("模版应用成功"),p("success",e.data||null)}else v.error(e.message||"应用失败")}catch(t){v.error("应用失败: "+t.message)}finally{k.value=!1}}}return x(()=>r.show,e=>{e&&(I.value.targetPath="",I.value.aiConfigTypes=T(),_.value=null,P.value=null,async function(){C.value=!0;try{const e=await Y_();e.success?U.value=Array.isArray(e.data)?e.data:[]:U.value=[]}catch(e){U.value=[]}finally{C.value=!1}}())}),x(()=>r.template,()=>{I.value.aiConfigTypes=T()}),(a,l)=>{var t;return n(),g(d(se),{show:e.show,preset:"card",title:`应用模版: ${(null==(t=e.template)?void 0:t.name)||""}`,style:{width:"650px"},"mask-closable":!1,"onUpdate:show":l[4]||(l[4]=e=>p("update:show",e))},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:l[3]||(l[3]=e=>p("update:show",!1))},{default:u(()=>[...l[14]||(l[14]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:k.value,disabled:!I.value.targetPath||0===I.value.aiConfigTypes.length,onClick:j},{default:u(()=>[...l[15]||(l[15]=[h(" 确认应用 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:u(()=>[c(d(Y),{ref_key:"formRef",ref:b,model:I.value,rules:M},{default:u(()=>[c(d(X),{label:"选择已有项目"},{default:u(()=>[c(d(ee),{value:P.value,"onUpdate:value":[l[0]||(l[0]=e=>P.value=e),O],options:A.value,loading:C.value,placeholder:"选择已有项目路径",filterable:"",clearable:""},null,8,["value","options","loading"])]),_:1}),c(d(X),{label:"目标项目路径",path:"targetPath"},{default:u(()=>[c(d(ne),{value:I.value.targetPath,"onUpdate:value":l[1]||(l[1]=e=>I.value.targetPath=e),placeholder:"输入项目目录路径,如 /path/to/project"},null,8,["value"])]),_:1}),z.value.length>0?(n(),g(d(X),{key:0,label:"生成配置文件"},{default:u(()=>[c(d(Ae),{value:I.value.aiConfigTypes,"onUpdate:value":l[2]||(l[2]=e=>I.value.aiConfigTypes=e)},{default:u(()=>[c(d(ae),null,{default:u(()=>[(n(!0),s(f,null,y(z.value,e=>(n(),g(d(we),{key:e.key,value:e.key},{default:u(()=>[c(d(ae),{align:"center",size:4},{default:u(()=>[c(d(R),{size:16,color:e.color},{default:u(()=>[c(d(Oa))]),_:1},8,["color"]),o("span",null,m(e.name),1),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h("("+m(e.fileName||e.name)+")",1)]),_:2},1024)]),_:2},1024)]),_:2},1032,["value"]))),128))]),_:1})]),_:1},8,["value"]),c(d(K),{depth:"3",style:{"font-size":"12px","margin-top":"4px",display:"block"}},{default:u(()=>[...l[5]||(l[5]=[h(" 可同时选择多个 CLI 配置文件 ",-1)])]),_:1})]),_:1})):i("",!0)]),_:1},8,["model"]),c(d(ae),{style:{"margin-bottom":"16px"}},{default:u(()=>[c(d(F),{onClick:$,loading:w.value,disabled:!I.value.targetPath||0===I.value.aiConfigTypes.length},{default:u(()=>[...l[6]||(l[6]=[h(" 预览应用效果 ",-1)])]),_:1},8,["loading","disabled"])]),_:1}),_.value?(n(),g(d(Ce),{key:0,size:"small",title:"应用预览"},{default:u(()=>[c(d(ae),{vertical:""},{default:u(()=>{var e,a,t,o,r;return[_.value.summary?(n(),s("div",kC,[c(d(K),{depth:"3"},{default:u(()=>[...l[7]||(l[7]=[h("将应用:",-1)])]),_:1}),c(d(ae),{style:{"margin-top":"8px"},wrap:""},{default:u(()=>[(n(!0),s(f,null,y(_.value.summary.aiConfigs,e=>{return n(),g(d(H),{key:e.type,type:(a=e.type,{claude:"warning",codex:"success",gemini:"info",opencode:"error",omp:"success"}[a]||"default"),size:"small"},{default:u(()=>[h(m(e.fileName||e.name),1)]),_:2},1032,["type"]);var a}),128)),_.value.summary.skills?(n(),g(d(H),{key:0,type:"info",size:"small"},{default:u(()=>[h(m(_.value.summary.skills)+" Skills",1)]),_:1})):i("",!0),_.value.summary.agents?(n(),g(d(H),{key:1,type:"info",size:"small"},{default:u(()=>[h(m(_.value.summary.agents)+" Agents",1)]),_:1})):i("",!0),_.value.summary.commands?(n(),g(d(H),{key:2,type:"info",size:"small"},{default:u(()=>[h(m(_.value.summary.commands)+" Commands",1)]),_:1})):i("",!0),_.value.summary.plugins?(n(),g(d(H),{key:3,type:"warning",size:"small"},{default:u(()=>[h(m(_.value.summary.plugins)+" Plugins",1)]),_:1})):i("",!0),_.value.summary.mcpServers?(n(),g(d(H),{key:4,type:"warning",size:"small"},{default:u(()=>[h(m(_.value.summary.mcpServers)+" MCP",1)]),_:1})):i("",!0),_.value.summary.skipped?(n(),g(d(H),{key:5,type:"error",size:"small"},{default:u(()=>[h(m(_.value.summary.skipped)+" Skipped",1)]),_:1})):i("",!0)]),_:1})])):i("",!0),c(d(de),{style:{margin:"12px 0"}}),(null==(e=_.value.willCreate)?void 0:e.length)?(n(),s("div",_C,[c(d(K),{type:"success"},{default:u(()=>[...l[8]||(l[8]=[h("将创建:",-1)])]),_:1}),c(d(Oe),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),s(f,null,y(_.value.willCreate,e=>(n(),g(d($e),{key:e},{default:u(()=>[c(d(K),{code:""},{default:u(()=>[h(m(e),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):i("",!0),(null==(a=_.value.willOverwrite)?void 0:a.length)?(n(),s("div",xC,[c(d(K),{type:"warning"},{default:u(()=>[...l[9]||(l[9]=[h("将覆盖:",-1)])]),_:1}),c(d(Oe),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),s(f,null,y(_.value.willOverwrite,e=>(n(),g(d($e),{key:e},{default:u(()=>[c(d(K),{code:""},{default:u(()=>[h(m(e),1)]),_:2},1024),c(d(H),{type:"warning",size:"tiny",style:{"margin-left":"8px"}},{default:u(()=>[...l[10]||(l[10]=[h("已存在",-1)])]),_:1})]),_:2},1024))),128))]),_:1})])):i("",!0),(null==(t=_.value.willOverwrite)?void 0:t.length)?(n(),g(d(pe),{key:3,type:"warning",style:{"margin-top":"8px"}},{default:u(()=>[...l[11]||(l[11]=[h(" 以上文件将被覆盖,请确认后再应用 ",-1)])]),_:1})):i("",!0),(null==(o=_.value.skipped)?void 0:o.length)?(n(),s("div",CC,[c(d(K),{type:"error"},{default:u(()=>[...l[12]||(l[12]=[h("将跳过:",-1)])]),_:1}),c(d(Oe),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),s(f,null,y(_.value.skipped,(e,a)=>(n(),g(d($e),{key:`${e.type}-${e.item}-${a}`},{default:u(()=>[c(d(K),null,{default:u(()=>[h(m(e.type)+": ",1)]),_:2},1024),c(d(K),{code:""},{default:u(()=>[h(m(e.item),1)]),_:2},1024),c(d(K),{depth:"3"},{default:u(()=>[h(" - "+m(e.reason),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):i("",!0),(null==(r=_.value.skipped)?void 0:r.length)?(n(),g(d(pe),{key:5,type:"info",style:{"margin-top":"8px"}},{default:u(()=>[...l[13]||(l[13]=[h(" 本次将进行部分应用,以上项会被跳过。 ",-1)])]),_:1})):i("",!0)]}),_:1})]),_:1})):i("",!0)]),_:1},8,["show","title"])}}},PC={key:0,class:"preview-content"},SC={class:"info-section"},zC={class:"info-row"},TC={class:"value"},IC={key:0,class:"info-row"},MC={class:"value"},AC={key:1,class:"info-row"},OC={class:"stats-section"},$C={class:"stats-grid"},jC={key:1,class:"stat-item"},LC={key:2,class:"stat-item"},EC={key:3,class:"stat-item"},DC={key:4,class:"stat-item"},NC={key:5,class:"stat-item"},BC={class:"markdown-content"},RC={class:"markdown-content"},FC={class:"list-items"},HC={class:"list-items"},GC={class:"list-items"},KC={key:0,class:"list-note"},qC={class:"list-items"},WC=zl({__name:"ConfigPreviewModal",props:{show:Boolean,template:Object},emits:["update:show","apply"],setup(e,{emit:a}){const l=e,r=a,p={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"},omp:{key:"omp",name:"OMP command templates",fileName:".omp/commands",color:"#0f9f9a"}},v=t(()=>{var e,a,t,s;const n=(null==(e=l.template)?void 0:e.aiConfigs)||{},o=Object.entries(n).filter(([,e])=>(null==e?void 0:e.enabled)&&(null==e?void 0:e.content)).map(([e,a])=>({...p[e],content:a.content})).filter(e=>e.key),i=null==(a=l.template)?void 0:a.cliType;if("omp"===i&&(null==(s=null==(t=l.template)?void 0:t.commands)?void 0:s.length))return[{...p.omp,content:l.template.commands.map(e=>`- ${e.namespace?`${e.namespace}/`:""}${e.name||e}`).join("\n")}];if(i&&"all"!==i){const e=n[i];if((null==e?void 0:e.enabled)&&(null==e?void 0:e.content)&&p[i])return[{...p[i],content:e.content}]}return o}),b=t(()=>v.value.length>0),w=t(()=>{var e,a,t,s,n;const o=l.template;return!!o&&(b.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==(s=o.commands)?void 0:s.length)||(null==(n=o.mcpServers)?void 0:n.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"},omp:{label:"OMP",color:"#0f9f9a",textColor:"#fff",borderColor:"#0f9f9a"}};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(){r("apply",l.template)}return(a,l)=>{var t;return n(),g(d(se),{show:e.show,preset:"card",title:`模版预览: ${(null==(t=e.template)?void 0:t.name)||""}`,style:{width:"750px","max-height":"80vh"},"mask-closable":!0,"onUpdate:show":l[1]||(l[1]=e=>r("update:show",e))},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:l[0]||(l[0]=e=>r("update:show",!1))},{default:u(()=>[...l[7]||(l[7]=[h("关闭",-1)])]),_:1}),c(d(F),{type:"primary",onClick:C},{default:u(()=>[...l[8]||(l[8]=[h("应用此模版",-1)])]),_:1})]),_:1})]),default:u(()=>{var a,t,r,p,k;return[e.template?(n(),s("div",PC,[o("div",SC,[o("div",zC,[l[2]||(l[2]=o("span",{class:"label"},"名称:",-1)),o("span",TC,m(e.template.name),1)]),e.template.description?(n(),s("div",IC,[l[3]||(l[3]=o("span",{class:"label"},"描述:",-1)),o("span",MC,m(e.template.description),1)])):i("",!0),e.template.cliType?(n(),s("div",AC,[l[4]||(l[4]=o("span",{class:"label"},"CLI 工具:",-1)),c(d(H),{size:"small",color:x(e.template.cliType),round:""},{default:u(()=>[h(m(_(e.template.cliType)),1)]),_:1},8,["color"])])):i("",!0)]),o("div",OC,[l[6]||(l[6]=o("div",{class:"section-title"},"包含配置",-1)),o("div",$C,[b.value?(n(!0),s(f,{key:0},y(v.value,e=>(n(),s("div",{class:"stat-item",key:e.key},[c(d(R),{size:"20",color:e.color},{default:u(()=>[c(d(Oa))]),_:1},8,["color"]),o("span",null,m(e.fileName||e.name),1)]))),128)):(null==(a=e.template.claudeMd)?void 0:a.enabled)?(n(),s("div",jC,[c(d(R),{size:"20"},{default:u(()=>[c(d(Oa))]),_:1}),l[5]||(l[5]=o("span",null,"CLAUDE.md",-1))])):i("",!0),(null==(t=e.template.skills)?void 0:t.length)?(n(),s("div",LC,[c(d(R),{size:"20"},{default:u(()=>[c(d(Je))]),_:1}),o("span",null,m(e.template.skills.length)+" Skills",1)])):i("",!0),(null==(r=e.template.agents)?void 0:r.length)?(n(),s("div",EC,[c(d(R),{size:"20"},{default:u(()=>[c(d(sl))]),_:1}),o("span",null,m(e.template.agents.length)+" Agents",1)])):i("",!0),(null==(p=e.template.commands)?void 0:p.length)?(n(),s("div",DC,[c(d(R),{size:"20"},{default:u(()=>[c(d(Qe))]),_:1}),o("span",null,m(e.template.commands.length)+" Commands",1)])):i("",!0),(null==(k=e.template.mcpServers)?void 0:k.length)?(n(),s("div",NC,[c(d(R),{size:"20"},{default:u(()=>[c(d(Aa))]),_:1}),o("span",null,m(e.template.mcpServers.length)+" MCP Servers",1)])):i("",!0)])]),w.value?(n(),g(d(me),{key:0,class:"details-section"},{default:u(()=>{var a,l,t,r,p;return[(n(!0),s(f,null,y(v.value,e=>(n(),g(d(fe),{key:e.key,title:`${e.name} 配置 (${e.fileName||e.name})`,name:e.key},{default:u(()=>[o("div",BC,[c(mC,{content:e.content},null,8,["content"])])]),_:2},1032,["title","name"]))),128)),!b.value&&(null==(a=e.template.claudeMd)?void 0:a.content)?(n(),g(d(fe),{key:0,title:"CLAUDE.md 内容",name:"claudeMd"},{default:u(()=>[o("div",RC,[c(mC,{content:e.template.claudeMd.content},null,8,["content"])])]),_:1})):i("",!0),(null==(l=e.template.skills)?void 0:l.length)?(n(),g(d(fe),{key:1,title:"Skills 列表",name:"skills"},{default:u(()=>[o("div",FC,[(n(!0),s(f,null,y(e.template.skills,(e,a)=>(n(),s("div",{key:a,class:"list-item"},m(e.name||e),1))),128))])]),_:1})):i("",!0),(null==(t=e.template.agents)?void 0:t.length)?(n(),g(d(fe),{key:2,title:"Agents 列表",name:"agents"},{default:u(()=>[o("div",HC,[(n(!0),s(f,null,y(e.template.agents,(e,a)=>(n(),s("div",{key:a,class:"list-item"},m(e.name||e),1))),128))])]),_:1})):i("",!0),(null==(r=e.template.commands)?void 0:r.length)?(n(),g(d(fe),{key:3,title:"Commands 列表",name:"commands"},{default:u(()=>[o("div",GC,["omp"===e.template.cliType?(n(),s("div",KC," 将写入 .omp/commands,作为 OMP commands 使用。 ")):i("",!0),(n(!0),s(f,null,y(e.template.commands,(e,a)=>(n(),s("div",{key:a,class:"list-item"},m(e.name||e),1))),128))])]),_:1})):i("",!0),(null==(p=e.template.mcpServers)?void 0:p.length)?(n(),g(d(fe),{key:4,title:"MCP Servers",name:"mcpServers"},{default:u(()=>[o("div",qC,[(n(!0),s(f,null,y(e.template.mcpServers,(e,a)=>(n(),s("div",{key:a,class:"list-item"},m(e.name||e),1))),128))])]),_:1})):i("",!0)]}),_:1})):i("",!0)])):i("",!0)]}),_:1},8,["show","title"])}}},[["__scopeId","data-v-27b692bd"]]),VC={key:0,class:"panel-header"},JC={class:"header-left"},ZC={class:"header-right"},QC={key:1,class:"drawer-header-bar"},YC={class:"header-right"},XC={class:"stats-bar"},eU={class:"stats-text"},aU={class:"filter-bar"},lU={class:"panel-content"},tU={key:0,class:"empty-state"},sU={key:1,class:"card-list"},nU={class:"panel-footer"},oU=zl({__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,r=Ue(),v=Pe(),b=l(!1),k=l([]),_=l({}),C=l(""),U=l(""),P=[{label:"全部 CLI",value:""},{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"},{label:"OMP",value:"omp"}],S=l(null),z=l(!1),T=l(!1),I=l(!1),M=l(null),A=l(null),O=l(null),$=t(()=>{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 j(){b.value=!0;try{const[e,a]=await Promise.all([vx(),mx()]);e.success&&(k.value=e.data||[]),a.success&&(_.value=a.data||{})}catch(e){r.error("加载数据失败: "+e.message)}finally{b.value=!1}}function L(){M.value=null,z.value=!0}function E(e){M.value={...e},z.value=!0}function D(e){O.value=e,I.value=!0}function N(e){A.value=e,I.value=!1,T.value=!0}function B(e){v.warning({title:"确认删除",content:`确定要删除模版 "${e.name}" 吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{S.value=e.id;try{const a=await async function(e){return(await ct.delete(`${px}/${e}`)).data}(e.id);a.success?(r.success("删除成功"),j()):r.error(a.message||"删除失败")}catch(a){r.error("删除失败: "+a.message)}finally{S.value=null}}})}function H(){z.value=!1,j()}function G(){T.value=!1,j()}return w(()=>j()),x(()=>a.drawerVisible,e=>{e&&j()}),(a,l)=>(n(),s("div",{class:p(["templates-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?i("",!0):(n(),s("div",VC,[o("div",JC,[e.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d($a))]),_:1})]),_:1})),l[6]||(l[6]=o("span",{class:"panel-title"},"配置模版管理",-1))]),o("div",ZC,[c(d(F),{text:"",onClick:L,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[7]||(l[7]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:j,loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[8]||(l[8]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),s("div",QC,[o("div",YC,[c(d(F),{text:"",onClick:L,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:j,loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[10]||(l[10]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",XC,[o("span",eU," 共 "+m(k.value.length)+" 个模版 ",1)]),o("div",aU,[c(d(ne),{value:C.value,"onUpdate:value":l[1]||(l[1]=e=>C.value=e),placeholder:"搜索模版...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:U.value,"onUpdate:value":l[2]||(l[2]=e=>U.value=e),options:P,size:"small",class:"filter-select"},null,8,["value"])]),o("div",lU,[c(d(Z),{show:b.value},{default:u(()=>[0!==$.value.length||b.value?(n(),s("div",sU,[(n(!0),s(f,null,y($.value,e=>(n(),g(pC,{key:e.id,template:e,deleting:S.value===e.id,onClick:D,onPreview:D,onEdit:E,onDelete:B,onApply:N},null,8,["template","deleting"]))),128))])):(n(),s("div",tU,[c(d(Q),{description:"暂无配置模版"},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(sa))]),_:1})]),extra:u(()=>[c(d(F),{size:"small",onClick:L},{default:u(()=>[...l[11]||(l[11]=[h("创建第一个模版",-1)])]),_:1})]),_:1})]))]),_:1},8,["show"])]),o("div",nU,[c(d(R),{size:"14",class:"info-icon"},{default:u(()=>[c(d(Ia))]),_:1}),l[12]||(l[12]=o("span",null,"配置模版可快速应用到工作区",-1))]),c(wC,{show:z.value,"onUpdate:show":l[3]||(l[3]=e=>z.value=e),template:M.value,"available-configs":_.value,onSuccess:H},null,8,["show","template","available-configs"]),c(UC,{show:T.value,"onUpdate:show":l[4]||(l[4]=e=>T.value=e),template:A.value,onSuccess:G},null,8,["show","template"]),c(WC,{show:I.value,"onUpdate:show":l[5]||(l[5]=e=>I.value=e),template:O.value,onApply:N},null,8,["show","template"])],2))}},[["__scopeId","data-v-a5e12341"]]),iU=zl({__name:"ConfigTemplatesDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=ei(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},"配置模版管理",-1)])]),default:u(()=>[c(oU,{"in-drawer":!0,"hide-back":!0,"drawer-visible":r.value,onBack:a[0]||(a[0]=e=>r.value=!1)},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-c337d3e9"]]);const rU={class:"drawer-header"},cU={class:"export-import-container"},uU={class:"section"},dU={class:"section-header"},pU={class:"section"},vU={class:"section-header"},mU={key:0,class:"import-preview"},fU={class:"preview-stats"},yU={class:"stat-item"},gU={class:"stat-item"},hU={class:"stat-item"},bU=zl({__name:"ConfigExportDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const r=e,p=a,{drawerWidth:v}=ei(520,480),f=t({get:()=>r.visible,set:e=>p("update:visible",e)}),y=l(!1),b=l(!1),w=l(null),k=l(null),_=l(null),x=l(null),C=l(!1);async function U(){y.value=!0;try{const e=await async function(e="zip"){return(await ct.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),Ds.success("配置导出成功")}catch(e){Ds.error("导出失败: "+e.message)}finally{y.value=!1}}async function P({file:e}){try{w.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 ct.post("/config-export/preview-zip",a,{headers:{"Content-Type":"application/zip"}})).data}(e.file);return void(a.success?(w.value=a.data,_.value=e.file,k.value=null,x.value="zip",Ds.success("ZIP 配置解析成功")):Ds.error("ZIP 配置格式错误: "+a.message))}const l=await e.file.text(),t=JSON.parse(l),s=await async function(e){return(await ct.post("/config-export/preview",{data:e})).data}(t);s.success?(w.value=s.data,k.value=t,_.value=null,x.value="json",Ds.success("配置文件解析成功")):Ds.error("配置文件格式错误: "+s.message)}catch(a){Ds.error("文件解析失败: "+a.message)}}async function S(){if(k.value||_.value){b.value=!0;try{const e="zip"===x.value?await async function(e,a=!1){const l=await e.arrayBuffer();return(await ct.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 ct.post("/config-export/import",{data:e,overwrite:a})).data}(k.value,C.value);e.success?(Ds.success("配置导入成功: "+e.message),z()):Ds.error("配置导入失败: "+e.message)}catch(e){Ds.error("导入失败: "+e.message)}finally{b.value=!1}}}function z(){w.value=null,k.value=null,_.value=null,x.value=null,C.value=!1}return(e,a)=>(n(),g(d(ce),{show:f.value,"onUpdate:show":a[1]||(a[1]=e=>f.value=e),width:d(v),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",rU,[c(d(R),{size:20,color:"#18a058"},{default:u(()=>[c(d(Ja))]),_:1}),a[2]||(a[2]=o("span",null,"配置导出/导入",-1))])]),default:u(()=>[o("div",cU,[o("div",uU,[o("div",dU,[c(d(K),{strong:""},{default:u(()=>[...a[3]||(a[3]=[h("导出配置",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[4]||(a[4]=[h(" 导出多平台配置为 ZIP(含渠道、Agents/Skills/Commands、原生配置等) ",-1)])]),_:1})]),c(d(F),{type:"primary",loading:y.value,onClick:U},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fa))]),_:1})]),default:u(()=>[a[5]||(a[5]=h(" 导出配置 ",-1))]),_:1},8,["loading"])]),c(d(de)),o("div",pU,[o("div",vU,[c(d(K),{strong:""},{default:u(()=>[...a[6]||(a[6]=[h("导入配置",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[7]||(a[7]=[h(" 从 JSON 或 ZIP 文件导入配置(支持覆盖已有配置) ",-1)])]),_:1})]),c(d(ke),{"custom-request":P,"show-file-list":!1,accept:".json,.zip"},{default:u(()=>[c(d(F),null,{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(nl))]),_:1})]),default:u(()=>[a[8]||(a[8]=h(" 选择配置文件 ",-1))]),_:1})]),_:1}),w.value?(n(),s("div",mU,[c(d(K),{strong:"",style:{"font-size":"14px"}},{default:u(()=>[...a[9]||(a[9]=[h("导入预览",-1)])]),_:1}),o("div",fU,[o("div",yU,[c(d(K),{depth:"3"},{default:u(()=>[...a[10]||(a[10]=[h("配置模板:",-1)])]),_:1}),c(d(K),null,{default:u(()=>[h(m(w.value.counts.configTemplates),1)]),_:1})]),o("div",gU,[c(d(K),{depth:"3"},{default:u(()=>[...a[11]||(a[11]=[h("渠道总数:",-1)])]),_:1}),c(d(K),null,{default:u(()=>[h(m(w.value.counts.channels),1)]),_:1})]),o("div",hU,[c(d(K),{depth:"3"},{default:u(()=>[...a[12]||(a[12]=[h("插件:",-1)])]),_:1}),c(d(K),null,{default:u(()=>[h(m(w.value.counts.plugins||0),1)]),_:1})])]),c(d(we),{checked:C.value,"onUpdate:checked":a[0]||(a[0]=e=>C.value=e),style:{"margin-top":"12px"}},{default:u(()=>[...a[13]||(a[13]=[h(" 覆盖已有配置 ",-1)])]),_:1},8,["checked"]),c(d(ae),{style:{"margin-top":"16px"}},{default:u(()=>[c(d(F),{type:"primary",loading:b.value,onClick:S},{default:u(()=>[...a[14]||(a[14]=[h(" 确认导入 ",-1)])]),_:1},8,["loading"]),c(d(F),{onClick:z},{default:u(()=>[...a[15]||(a[15]=[h("取消",-1)])]),_:1})]),_:1})])):i("",!0)])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-d8c9eada"]]),wU={class:"drawer-header"},kU={class:"oauth-container"},_U={class:"toolbar"},xU={class:"tool-panel"},CU={class:"state-top"},UU={class:"state-storage"},PU={class:"state-tags"},SU={class:"state-grid"},zU={class:"state-item"},TU={class:"state-value"},IU={class:"state-item"},MU={class:"state-value"},AU={class:"state-item"},OU={class:"state-value"},$U={key:1,class:"credential-list"},jU={class:"credential-top"},LU={class:"credential-main"},EU={class:"credential-name"},DU={class:"credential-tags"},NU={class:"credential-actions"},BU={class:"credential-meta"},RU={class:"meta-item"},FU={class:"meta-value"},HU={class:"meta-item"},GU={class:"meta-value"},KU={class:"meta-item"},qU={class:"meta-value"},WU={class:"meta-item"},VU={class:"meta-value"},JU={class:"import-modal"},ZU={class:"import-tool"},QU={style:{display:"flex","align-items":"center","justify-content":"center",gap:"8px"}},YU=zl({__name:"OAuthCredentialsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const r=e,v=a,{drawerWidth:b}=ei(720),w=t({get:()=>r.visible,set:e=>v("update:visible",e)}),k=["claude","codex","gemini","opencode","omp"],_={claude:"Claude",codex:"Codex",gemini:"Gemini",opencode:"OpenCode",omp:"OMP"},C=l("claude"),U=l(!1),P=l(""),S=l({}),z=l(!1),T=l("claude"),I=l(""),M=l("");function A(e){var a;return(null==(a=S.value)?void 0:a[e])||null}function O(e){var a;return[...(null==(a=A(e))?void 0:a.credentials)||[]].sort((a,l)=>{const t=Number(j(e,l))-Number(j(e,a));if(0!==t)return t;const s=Number(l.isDefault)-Number(a.isDefault);return 0!==s?s:(l.updatedAt||l.createdAt||0)-(a.updatedAt||a.createdAt||0)})}function $(e){return"opencode"===e}function j(e,a){return L(e,a)}function L(e,a){var l;const t=null==(l=A(e))?void 0:l.nativeState,s=E(e);return!(!(null==t?void 0:t.oauthPresent)||0===s.length)&&s.some(e=>{const l=!(!e.tokenPreview||!a.tokenPreview)&&e.tokenPreview===a.tokenPreview,t=!e.providerId||!a.providerId||e.providerId===a.providerId,s=!e.accountId||!a.accountId||e.accountId===a.accountId,n=!e.accountEmail||!a.accountEmail||e.accountEmail===a.accountEmail;return l&&t&&s&&n})}function E(e){var a;const l=null==(a=A(e))?void 0:a.nativeState,t=Array.isArray(null==l?void 0:l.nativeCredentials)?l.nativeCredentials:[];return t.length>0?t:(null==l?void 0:l.nativeCredential)?[l.nativeCredential]:[]}function D(e){return"oauth"===e?"OAuth 控制":"mixed"===e?"混合模式":"proxy"===e?"动态切换":"channel"===e?"渠道控制":"未接管"}function N(e){const a=String(e||"").trim();return a?"keychain"===a?"Keychain":"file"===a?"凭证文件":"auth-file"===a?"auth.json":"auth-broker"===a||"auth-broker-existing"===a?"OMP Auth Broker":"settings-env"===a?"settings.env":"encrypted-file"===a?"加密文件":"legacy-file"===a?"旧文件":"plaintext-file"===a?"明文文件":"auth-file+keychain"===a?"auth.json + keyring":"encrypted-file+keychain"===a?"加密文件 + keyring":a:"未检测"}function B(e){if(!e)return"-";const a=Number(e),l=Number.isFinite(a)&&a>0?a:Date.parse(e);return Number.isFinite(l)?new Date(l).toLocaleString():String(e)}async function K(){U.value=!0;try{const e=await vo();S.value=e.tools||{}}catch(e){Ds.error("加载 OAuth 凭证失败: "+(e.message||"未知错误"))}finally{U.value=!1}}async function q(e,a){var l,t;P.value=e;try{await a()}catch(s){const e=(null==(t=null==(l=null==s?void 0:s.response)?void 0:l.data)?void 0:t.error)||(null==s?void 0:s.message)||"操作失败";Ds.error(e)}finally{P.value=""}}function W({file:e,onFinish:a,onError:l}){const t=new FileReader;t.onload=e=>{M.value=e.target.result,a()},t.onerror=l,t.readAsText(e.file)}function V(){z.value=!1,I.value="",M.value=""}async function J(){M.value.trim()?await q(`import-${T.value}`,async()=>{const e=await async function(e,a={}){return(await ct.post(`/oauth-credentials/${e}/import`,a)).data}(T.value,{name:I.value,raw:M.value});S.value[T.value]=e.summary,Ds.success("OAuth 凭证导入成功"),V()}):Ds.warning("请先粘贴 OAuth 内容")}async function Y(e){await q(`sync-${e}`,async()=>{var a;const l=await async function(e){return(await ct.post(`/oauth-credentials/${e}/sync-local`)).data}(e);S.value[e]=l.summary||(null==(a=l.tools)?void 0:a[e]);const t=Array.isArray(l.credentials)?l.credentials.length:0;Ds.success(t>1?`${_[e]} 本地 OAuth 已同步 ${t} 条凭证`:`${_[e]} 本地 OAuth 已同步`)})}async function X(e,a,l){const t=j(e,a);l!==t&&await q(`toggle-${e}-${a.id}`,async()=>{if(l){const l=await async function(e,a){return(await ct.post(`/oauth-credentials/${e}/${a}/apply`)).data}(e,a.id);S.value[e]=l.toolSummary,Ds.success(l.message||`${_[e]} OAuth 已启用`)}else{const l=await mo(e,a.id);S.value[e]={...l.toolSummary||S.value[e]||{},nativeState:l.nativeState};const t=$(e)?`${_[e]} OAuth provider 已关闭`:`${_[e]} 本机 OAuth 已关闭`;Ds.success(l.message||t)}window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e}}))})}async function ee(e,a){var l;const t=((null==(l=A(e))?void 0:l.credentials)||[]).find(e=>e.id===a),s=!!t&&L(e,t);window.confirm(s?"当前凭证正在本机生效,删除时会一并清理本机 OAuth,确认继续吗?":"确认删除该凭证吗?")&&await q(`delete-${e}-${a}`,async()=>{const l=await async function(e,a){return(await ct.delete(`/oauth-credentials/${e}/${a}`)).data}(e,a);if(S.value[e]=l.summary,s){const l=$(e)?await mo(e,a):await async function(e){return(await ct.post(`/oauth-credentials/${e}/clear-native`)).data}(e);S.value[e]={...S.value[e]||{},...l.toolSummary||{},nativeState:l.nativeState},Ds.success($(e)?"OAuth 凭证已删除,对应本机 OAuth provider 也已关闭":"OAuth 凭证已删除,本机 OAuth 也已清理")}else Ds.success("OAuth 凭证已删除");window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e}}))})}return x(()=>r.visible,e=>{e&&K()}),(e,a)=>(n(),s(f,null,[c(d(ce),{show:w.value,"onUpdate:show":a[3]||(a[3]=e=>w.value=e),width:d(b),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",wU,[c(d(R),{size:20,color:"#2080f0"},{default:u(()=>[c(d(ea))]),_:1}),a[7]||(a[7]=o("span",null,"OAuth 凭证管理",-1))])]),default:u(()=>[o("div",kU,[c(d(pe),{type:"info","show-icon":!1},{default:u(()=>[...a[8]||(a[8]=[h(" 这里只管理 OAuth token 的导入、同步和切换,不直接发起 OAuth 登录。过期后由用户自行刷新。 ",-1)])]),_:1}),o("div",_U,[c(d(ae),null,{default:u(()=>[c(d(F),{secondary:"",onClick:K,loading:U.value},{default:u(()=>[...a[9]||(a[9]=[h(" 刷新 ",-1)])]),_:1},8,["loading"]),c(d(F),{type:"primary",secondary:"",loading:P.value===`sync-${C.value}`,onClick:a[0]||(a[0]=e=>Y(C.value))},{default:u(()=>[...a[10]||(a[10]=[h(" 同步本地现有配置 ",-1)])]),_:1},8,["loading"]),c(d(F),{type:"primary",onClick:a[1]||(a[1]=e=>{return a=C.value,T.value=a,I.value="",M.value="",void(z.value=!0);var a})},{default:u(()=>[...a[11]||(a[11]=[h(" 手动导入 ",-1)])]),_:1})]),_:1})]),c(d(Z),{show:U.value},{default:u(()=>[c(d(ge),{value:C.value,"onUpdate:value":a[2]||(a[2]=e=>C.value=e),type:"line",animated:""},{default:u(()=>[(n(),s(f,null,y(k,e=>c(d(he),{key:e,name:e,tab:_[e]},{default:u(()=>{var l,t;return[o("div",xU,[a[24]||(a[24]=o("div",{class:"section-header"},[o("div",null,[o("div",{class:"section-title"},"已管理凭证"),o("div",{class:"section-desc"},"Claude / Codex / Gemini 单开,OpenCode 支持多开;关闭开关即可停用本机 OAuth。")])],-1)),c(d(Ce),{size:"small",class:"state-card"},{default:u(()=>{var l,t,s,r,p,v,f,y,b,w,k,_,x,C,U;return[o("div",CU,[o("div",null,[a[12]||(a[12]=o("div",{class:"section-title"},"当前本机状态",-1)),o("div",UU,m(N(null==(s=null==(t=null==(l=A(e))?void 0:l.nativeState)?void 0:t.nativeCredential)?void 0:s.storage)),1)]),o("div",PU,[c(d(H),{size:"small",type:(U=null==(p=null==(r=A(e))?void 0:r.nativeState)?void 0:p.mode,"oauth"===U?"success":"mixed"===U?"info":"proxy"===U?"warning":"channel"===U?"info":"default")},{default:u(()=>{var a,l;return[h(m(D(null==(l=null==(a=A(e))?void 0:a.nativeState)?void 0:l.mode)),1)]}),_:2},1032,["type"]),E(e).length>1?(n(),g(d(H),{key:0,size:"small",type:"info"},{default:u(()=>[h(m(E(e).length)+" 个已启用 ",1)]),_:2},1024)):i("",!0)])]),o("div",SU,[o("div",zU,[a[13]||(a[13]=o("span",{class:"state-label"},"Token",-1)),o("span",TU,m((null==(y=null==(f=null==(v=A(e))?void 0:v.nativeState)?void 0:f.nativeCredential)?void 0:y.tokenPreview)||"-"),1)]),o("div",IU,[a[14]||(a[14]=o("span",{class:"state-label"},"Email",-1)),o("span",MU,m((null==(k=null==(w=null==(b=A(e))?void 0:b.nativeState)?void 0:w.nativeCredential)?void 0:k.accountEmail)||"-"),1)]),o("div",AU,[a[15]||(a[15]=o("span",{class:"state-label"},"Account ID",-1)),o("span",OU,m((null==(C=null==(x=null==(_=A(e))?void 0:_.nativeState)?void 0:x.nativeCredential)?void 0:C.accountId)||"-"),1)])]),a[16]||(a[16]=o("div",{class:"state-hint"}," 通过下方凭证开关控制本机 OAuth。若本机已有未托管 OAuth,可先点“同步本地现有配置”后再切换。 ",-1))]}),_:2},1024),(null==(t=null==(l=A(e))?void 0:l.credentials)?void 0:t.length)?(n(),s("div",$U,[(n(!0),s(f,null,y(O(e),l=>(n(),g(d(Ce),{key:l.id,size:"small",class:p(["credential-card",j(e,l)?"credential-card--active":"credential-card--inactive"])},{default:u(()=>[o("div",jU,[o("div",LU,[o("div",EU,m(l.name),1),o("div",DU,[j(e,l)?(n(),g(d(H),{key:0,size:"small",type:"info"},{default:u(()=>[...a[17]||(a[17]=[h("已启用",-1)])]),_:1})):i("",!0),l.isDefault?(n(),g(d(H),{key:1,size:"small",type:"success"},{default:u(()=>[...a[18]||(a[18]=[h("默认",-1)])]),_:1})):i("",!0),l.providerId?(n(),g(d(H),{key:2,size:"small"},{default:u(()=>[h(m(l.providerId),1)]),_:2},1024)):i("",!0),l.source?(n(),g(d(H),{key:3,size:"small",bordered:!1},{default:u(()=>{return[h(m((e=l.source,"synced-local"===e?"同步本地":"manual"===e?"手动导入":e||"-")),1)];var e}),_:2},1024)):i("",!0)])]),o("div",NU,[c(d(F),{size:"small",quaternary:"",loading:P.value===`delete-${e}-${l.id}`,onClick:a=>ee(e,l.id)},{default:u(()=>[...a[19]||(a[19]=[h(" 删除 ",-1)])]),_:1},8,["loading","onClick"]),c(d(G),{size:"small",value:j(e,l),loading:P.value===`toggle-${e}-${l.id}`,disabled:""!==P.value,"onUpdate:value":a=>X(e,l,a)},null,8,["value","loading","disabled","onUpdate:value"])])]),o("div",BU,[o("div",RU,[a[20]||(a[20]=o("span",{class:"meta-label"},"Token",-1)),o("span",FU,m(l.tokenPreview||"-"),1)]),o("div",HU,[a[21]||(a[21]=o("span",{class:"meta-label"},"Email",-1)),o("span",GU,m(l.accountEmail||"-"),1)]),o("div",KU,[a[22]||(a[22]=o("span",{class:"meta-label"},"Account ID",-1)),o("span",qU,m(l.accountId||"-"),1)]),o("div",WU,[a[23]||(a[23]=o("span",{class:"meta-label"},"更新时间",-1)),o("span",VU,m(B(l.updatedAt||l.createdAt)),1)])])]),_:2},1032,["class"]))),128))])):(n(),g(d(Q),{key:0,description:"暂无 OAuth 凭证",size:"small"}))])]}),_:2},1032,["name","tab"])),64))]),_:1},8,["value"])]),_:1},8,["show"])])]),_:1})]),_:1},8,["show","width"]),c(d(se),{show:z.value,"onUpdate:show":a[6]||(a[6]=e=>z.value=e),preset:"card",title:"手动导入 OAuth 凭证",style:{width:"720px","max-width":"92vw"}},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:V},{default:u(()=>[...a[27]||(a[27]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:P.value===`import-${T.value}`,onClick:J},{default:u(()=>[...a[28]||(a[28]=[h(" 导入 ",-1)])]),_:1},8,["loading"])]),_:1})]),default:u(()=>[o("div",JU,[o("div",ZU,m(_[T.value]),1),c(d(ne),{value:I.value,"onUpdate:value":a[4]||(a[4]=e=>I.value=e),placeholder:"可选:凭证名称,留空则自动生成"},null,8,["value"]),c(d(ke),{accept:".json","show-file-list":!1,"custom-request":W},{default:u(()=>[c(d(_e),{style:{padding:"12px 0"}},{default:u(()=>[o("div",QU,[c(d(R),{size:"18"},{default:u(()=>[c(d(sa))]),_:1}),a[25]||(a[25]=o("span",{style:{"font-size":"13px"}},"上传 JSON 文件(如 auth.json),或直接在下方粘贴",-1))])]),_:1})]),_:1}),c(d(ne),{value:M.value,"onUpdate:value":a[5]||(a[5]=e=>M.value=e),type:"textarea",rows:10,placeholder:"粘贴 token JSON、auth.json 片段或该工具原生 OAuth 结构"},null,8,["value"]),a[26]||(a[26]=o("div",{class:"import-hint"}," Claude 支持 `claudeAiOauth`/token JSON,Codex 支持 `auth.json`,Gemini 支持 `access_token` 或 `token` 结构,OpenCode 支持 `providerId + oauth` 或 `auth.json` 片段。 ",-1))])]),_:1},8,["show"])],64))}},[["__scopeId","data-v-784304b2"]]),XU=["disabled"],eP=zl({__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,s=a,i=t(()=>l.disabled?"#6b7280":l.active?"#18a058":void 0);function r(){l.disabled||s("click")}return(a,l)=>(n(),g(d(ie),{placement:e.tooltipPlacement},{trigger:u(()=>[o("button",{class:p(["header-button",{active:e.active,disabled:e.disabled}]),disabled:e.disabled,onClick:r},[c(d(R),{size:e.iconSize,color:i.value},{default:u(()=>[(n(),g(P(e.icon)))]),_:1},8,["size","color"])],10,XU)]),default:u(()=>[A(a.$slots,"default",{},()=>[h(m(e.tooltip),1)],!0)]),_:3},8,["placement"]))}},[["__scopeId","data-v-b515354d"]]);async function aP(e=null){const a=e?{platform:e}:{};return(await ct.get("/env/check",{params:a})).data}const lP={class:"modal-header"},tP={class:"modal-content"},sP={class:"desc-text"},nP={class:"conflict-list"},oP={class:"list-header"},iP={key:0,class:"selected-hint"},rP={class:"conflict-items"},cP=["onClick"],uP={class:"item-content"},dP={class:"item-header"},pP={class:"var-name"},vP={class:"var-value"},mP={class:"var-source"},fP={class:"modal-footer"},yP=zl({__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 r=e,b=a,w=t({get:()=>r.visible,set:e=>b("update:visible",e)}),k=l(new Set),_=l(!1),x=t(()=>k.value.size),C=t(()=>r.conflicts.length>0&&k.value.size===r.conflicts.length),U=t(()=>k.value.size>0&&k.value.size<r.conflicts.length),P=t(()=>r.conflicts.length>0&&r.conflicts.every(e=>"process"===e.sourceType));function S(e){return`${e.varName}:${e.sourcePath}`}function z(e){return"process"===e.sourceType?"进程环境变量":e.sourcePath}function T(e){k.value=e?new Set(r.conflicts.map(S)):new Set}function I(){b("close")}function M(){b("ignore")}function A(){b("never-remind")}async function O(){const e=r.conflicts.filter(e=>k.value.has(S(e)));e.every(e=>"process"===e.sourceType)?Ds.warning("进程环境变量无法直接删除,请手动从 shell 配置文件中移除"):Ns.warning({title:"确认删除",content:`确定要删除选中的 ${e.length} 个环境变量吗?删除前会自动备份。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{_.value=!0;try{(await async function(e){return(await ct.post("/env/delete",{conflicts:e})).data}(e)).success&&(Ds.success("删除成功,备份已保存"),k.value=new Set,b("deleted"))}catch(a){Ds.error("删除失败: "+a.message)}finally{_.value=!1}}})}return(a,l)=>(n(),g(d(se),{show:w.value,"onUpdate:show":l[1]||(l[1]=e=>w.value=e),preset:"card",title:null,bordered:!1,closable:!0,"mask-closable":!1,style:{width:"560px","max-width":"90vw"},onClose:I},{header:u(()=>[o("div",lP,[c(d(R),{class:"warning-icon",size:22},{default:u(()=>[c(d(Sa))]),_:1}),l[2]||(l[2]=o("span",{class:"header-title"},"检测到环境变量冲突",-1))])]),footer:u(()=>[o("div",fP,[c(d(F),{tertiary:"",onClick:M},{default:u(()=>[...l[8]||(l[8]=[h(" 暂时忽略 ",-1)])]),_:1}),c(d(F),{tertiary:"",onClick:A},{default:u(()=>[...l[9]||(l[9]=[h(" 不再提醒 ",-1)])]),_:1}),P.value?i("",!0):(n(),g(d(F),{key:0,type:"error",disabled:0===x.value,loading:_.value,onClick:O},{default:u(()=>[h(" 删除选中 ("+m(x.value)+") ",1)]),_:1},8,["disabled","loading"]))])]),default:u(()=>[o("div",tP,[o("p",sP,[l[3]||(l[3]=h(" 发现 ",-1)),o("strong",null,m(e.conflicts.length),1),l[4]||(l[4]=h(" 个环境变量可能影响代理配置,建议清理后再使用代理功能。 ",-1))]),P.value?(n(),g(d(pe),{key:0,type:"info",bordered:!1,class:"process-env-alert"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ia))]),_:1})]),default:u(()=>[l[5]||(l[5]=o("div",{class:"alert-content"},[o("p",{class:"alert-title"},"这些环境变量来自当前进程,请按以下步骤处理:"),o("ol",{class:"alert-list"},[o("li",null,"检查对应 shell 配置文件(如 ~/.zshrc、~/.bashrc 或 PowerShell Profile)中是否有这些变量"),o("li",null,"如果有,删除或注释掉相关行"),o("li",null,[o("strong",null,"重启终端"),h(",然后重新运行 "),o("code",null,"ct")])]),o("p",{class:"alert-hint"},"如果配置文件中没有,可能是终端临时设置的,直接重启终端即可")],-1))]),_:1})):i("",!0),o("div",nP,[o("div",oP,[c(d(we),{checked:C.value,indeterminate:U.value,"onUpdate:checked":T},{default:u(()=>[...l[6]||(l[6]=[h(" 全选 ",-1)])]),_:1},8,["checked","indeterminate"]),x.value>0?(n(),s("span",iP," 已选 "+m(x.value)+" 项 ",1)):i("",!0)]),c(d(Te),{style:{"max-height":"280px"}},{default:u(()=>[o("div",rP,[(n(!0),s(f,null,y(e.conflicts,e=>{return n(),s("div",{key:S(e),class:p(["conflict-item",{selected:k.value.has(S(e))}]),onClick:a=>function(e){const a=S(e);k.value.has(a)?k.value.delete(a):k.value.add(a),k.value=new Set(k.value)}(e)},[c(d(we),{checked:k.value.has(S(e)),onClick:l[0]||(l[0]=v(()=>{},["stop"])),"onUpdate:checked":a=>function(e,a){const l=S(e);a?k.value.add(l):k.value.delete(l),k.value=new Set(k.value)}(e,a)},null,8,["checked","onUpdate:checked"]),o("div",uP,[o("div",dP,[o("code",pP,m(e.varName),1),c(d(H),{type:(a=e.platform,{claude:"warning",codex:"success",gemini:"info"}[a]||"default"),size:"tiny",bordered:!1},{default:u(()=>[h(m(e.platform),1)]),_:2},1032,["type"])]),o("div",vP,m(e.varValue),1),o("div",mP,[l[7]||(l[7]=o("span",{class:"source-label"},"来源:",-1)),h(" "+m(z(e)),1)])])],10,cP);var a}),128))])]),_:1})])])]),_:1},8,["show"]))}},[["__scopeId","data-v-7ea71ef7"]]);function gP(){const e=Ir(),{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 hP={class:"layout"},bP={class:"panel-security-auth"},wP={class:"header"},kP={class:"logo-wrapper"},_P=["alt"],xP={class:"nav-tabs"},CP={class:"header-actions"},UP={class:"env-warning-count"},PP={class:"favorites-button-wrapper"},SP={key:0,class:"favorites-badge"},zP={class:"more-menu-trigger","aria-label":"更多工具"},TP={class:"main-container"},IP={key:0,class:"global-loading-overlay"},MP={class:"left-content"},AP="coding-tool-x",OP=zl({__name:"Layout",setup(e){const{isDark:a,toggleTheme:r}=Fr(),{claudeProxy:v,codexProxy:f,geminiProxy:y,opencodeProxy:b,ompProxy:k,startProxy:_,stopProxy:U}=Bn(),{totalFavorites:S}=ci(),{loadDashboard:z}=gP(),T=D(),A=M(),O=[{label:"配置模板",key:"config-templates"},{label:"配置导入/导出",key:"config-export"},{label:"OAuth 凭证",key:"oauth"},{label:"渠道速度测试",key:"speed-test"},{type:"divider",key:"divider-1"},{label:"使用帮助",key:"help"},{label:"GitHub 仓库",key:"github"}],j=t(()=>A.name),L=t(()=>A.meta.channel||null),N=t(()=>A.path);x(L,e=>{e&&(te.value=!1)});const B=t(()=>L.value&&(Le.value||Ee.value&&$e.value)),H=l(!1),G=l(!1),q=l(!1),W=l(!1),V=l(!1),J=l(!1),Q=l(!1),Y=l(!1),X=l(!1),ee=l(!1),le=l(!1),te=l(!1),oe=l(!1),re=l(""),ce=l(!1),ue=l(""),de=l(!1),pe=l(""),ve=l(!1),me=l(""),fe=l(!1),ye=l(null),ge=l(null),he=l(null),we=l([]),ke=l(!1),_e=l(!1),xe=l(!1),Ce=l(""),Ue=l(""),Pe=l(!1),Se=t(()=>_e.value&&!xe.value);function ze(){Ce.value="",Ue.value="",Pe.value=!1}async function Te(){var e,a;if(Ce.value){Pe.value=!0,Ue.value="";try{const e=await wr(Ce.value);e.success?(xe.value=!0,ze()):Ue.value=e.error||"密码错误"}catch(l){Ue.value=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.error)||"密码错误"}finally{Pe.value=!1}}else Ue.value="请输入密码"}async function Ie(){try{const e=await aP();e.success&&(we.value=e.conflicts||[],0===we.value.length&&(ke.value=!1))}catch(e){}}function Me(){ke.value=!1}function Ae(){ke.value=!1,localStorage.setItem("envConflictNeverRemind","true")}const Oe=l(!1),$e=t(()=>"codex"===L.value?f.value.running:"gemini"===L.value?y.value.running:"opencode"===L.value?b.value.running:"omp"===L.value?k.value.running:v.value.running),je=t(()=>"codex"===L.value?f.value.loading:"gemini"===L.value?y.value.loading:"opencode"===L.value?b.value.loading:"omp"===L.value?k.value.loading:v.value.loading);const Le=l(!0),Ee=l(!0);function De(){T.push({name:"home"})}function Ne(e){"config-templates"!==e?"config-export"!==e?"oauth"!==e?"speed-test"!==e?"help"!==e?"github"===e&&window.open("https://github.com/ZeaoZhang/coding-tool","_blank"):Y.value=!0:J.value=!0:te.value=!0:le.value=!0:ee.value=!0}async function Be(e){var a,l;const t=L.value||"claude",s=function(e=L.value){return"codex"===e?f:"gemini"===e?y:"opencode"===e?b:"omp"===e?k:v}(t);s.value.loading=!0;try{let a;a=e?await _(t):await U(t,{refreshChannelsDrawer:!0}),!1!==a.success?(Ds.success(e?"代理已启动":"代理已停止"),e&&(Ee.value=!0),async function(){try{await Hs("panelVisibility","showChannels",Le.value),await Hs("panelVisibility","showLogs",Ee.value)}catch(e){}}()):Ds.error(a.error||"操作失败")}catch(n){Ds.error((null==(l=null==(a=n.response)?void 0:a.data)?void 0:l.error)||n.message||"操作失败")}finally{s.value.loading=!1}}function Re(e){const{showChannels:a,showLogs:l}=e.detail;Le.value=a,Ee.value=l}function Fe(e){var a;re.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",oe.value=!0}function He(e){te.value=!0}function Ge(e){var a;ue.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",ce.value=!0}function Ke(e){var a;pe.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",de.value=!0}function qe(e){var a;me.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",ve.value=!0}function We(){"opencode"===L.value&&(Q.value=!0)}function Ve({session:e,channel:a}){ye.value=e,ge.value=a,fe.value=!0,I(()=>{var e;null==(e=he.value)||e.open()})}return w(()=>{!async function(){Oe.value=!0;try{const e=await br();_e.value=Boolean((null==e?void 0:e.success)&&e.hasPassword),xe.value=!_e.value,_e.value||ze()}catch(e){_e.value=!1,xe.value=!0,ze()}finally{Oe.value=!1}}(),async function(){var e,a;try{const l=await z();l&&l.uiConfig&&(Le.value=!1!==(null==(e=l.uiConfig.panelVisibility)?void 0:e.showChannels),Ee.value=!1!==(null==(a=l.uiConfig.panelVisibility)?void 0:a.showLogs))}catch(l){}}(),window.addEventListener("panel-visibility-change",Re),window.addEventListener("open-skills-drawer",Fe),window.addEventListener("open-commands-drawer",Ge),window.addEventListener("open-agents-drawer",Ke),window.addEventListener("open-plugins-drawer",qe),window.addEventListener("open-gateway-convert-drawer",We),window.addEventListener("open-oauth-credentials-drawer",He),async function(){var e;try{const a=await aP();a.success&&(null==(e=a.conflicts)?void 0:e.length)>0&&(we.value=a.conflicts,"true"!==localStorage.getItem("envConflictNeverRemind")&&(ke.value=!0))}catch(a){}}()}),C(()=>{window.removeEventListener("panel-visibility-change",Re),window.removeEventListener("open-skills-drawer",Fe),window.removeEventListener("open-commands-drawer",Ge),window.removeEventListener("open-agents-drawer",Ke),window.removeEventListener("open-plugins-drawer",qe),window.removeEventListener("open-gateway-convert-drawer",We),window.removeEventListener("open-oauth-credentials-drawer",He)}),x(()=>L.value,e=>{"opencode"!==e&&Q.value&&(Q.value=!1)}),(e,l)=>{const t=E("router-view");return n(),s("div",hP,[c(yP,{visible:ke.value,"onUpdate:visible":l[0]||(l[0]=e=>ke.value=e),conflicts:we.value,onDeleted:Ie,onClose:l[1]||(l[1]=e=>ke.value=!1),onIgnore:Me,onNeverRemind:Ae},null,8,["visible","conflicts"]),c(d(se),{show:Se.value,preset:"card",title:"验证访问密码","mask-closable":!1,"close-on-esc":!1,closable:!1,style:{width:"460px","max-width":"92vw"}},{default:u(()=>[o("div",bP,[c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...l[34]||(l[34]=[h(" 请输入访问密码后进入面板 ",-1)])]),_:1}),c(d(ne),{value:Ce.value,"onUpdate:value":l[2]||(l[2]=e=>Ce.value=e),type:"password",placeholder:"访问密码","show-password-on":"click",autofocus:"",onKeydown:$(Te,["enter"])},null,8,["value"]),Ue.value?(n(),g(d(K),{key:0,depth:"3",class:"panel-security-error"},{default:u(()=>[h(m(Ue.value),1)]),_:1})):i("",!0),c(d(K),{depth:"3",class:"panel-security-hint"},{default:u(()=>[l[36]||(l[36]=h(" 忘记密码可在终端执行 ",-1)),c(d(K),{code:""},{default:u(()=>[...l[35]||(l[35]=[h("ctx security reset",-1)])]),_:1}),l[37]||(l[37]=h(" 关闭密码 ",-1))]),_:1}),c(d(ae),{justify:"end",style:{"margin-top":"16px"}},{default:u(()=>[c(d(F),{type:"primary",loading:Pe.value,onClick:Te},{default:u(()=>[...l[38]||(l[38]=[h(" 验证 ",-1)])]),_:1},8,["loading"])]),_:1})])]),_:1},8,["show"]),o("header",wP,[o("div",{class:"logo-section",onClick:De},[o("div",kP,[o("img",{src:"/logo.png",alt:`${AP} logo`,class:"logo-image"},null,8,_P)]),o("div",{class:"title-group"},[o("h1",{class:"title-main"},m(AP)),l[39]||(l[39]=o("span",{class:"title-sub"},"AI 编程工作台",-1))])]),o("div",xP,[o("div",{class:p(["nav-tab",{active:"home"===j.value}]),onClick:l[3]||(l[3]=e=>d(T).push({name:"home"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(ol))]),_:1}),l[40]||(l[40]=o("span",{class:"nav-label"},"Home",-1))],2),o("div",{class:p(["nav-tab",{active:"claude"===L.value}]),onClick:l[4]||(l[4]=e=>d(T).push({name:"claude-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(oa))]),_:1}),l[41]||(l[41]=o("span",{class:"nav-label"},"Claude",-1))],2),o("div",{class:p(["nav-tab",{active:"codex"===L.value}]),onClick:l[5]||(l[5]=e=>d(T).push({name:"codex-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(ia))]),_:1}),l[42]||(l[42]=o("span",{class:"nav-label"},"Codex",-1))],2),o("div",{class:p(["nav-tab",{active:"gemini"===L.value}]),onClick:l[6]||(l[6]=e=>d(T).push({name:"gemini-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(ra))]),_:1}),l[43]||(l[43]=o("span",{class:"nav-label"},"Gemini",-1))],2),o("div",{class:p(["nav-tab",{active:"opencode"===L.value}]),onClick:l[7]||(l[7]=e=>d(T).push({name:"opencode-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(Je))]),_:1}),l[44]||(l[44]=o("span",{class:"nav-label"},"OpenCode",-1))],2),o("div",{class:p(["nav-tab",{active:"omp"===L.value}]),onClick:l[8]||(l[8]=e=>d(T).push({name:"omp-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(ha))]),_:1}),l[45]||(l[45]=o("span",{class:"nav-label"},"OMP",-1))],2),o("div",{class:p(["nav-tab",{active:"analytics"===j.value}]),onClick:l[9]||(l[9]=e=>d(T).push({name:"analytics"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(il))]),_:1}),l[46]||(l[46]=o("span",{class:"nav-label"},"Analytics",-1))],2)]),o("div",CP,[we.value.length>0?(n(),g(d(ie),{key:0,trigger:"hover"},{trigger:u(()=>[o("div",{class:"env-warning-btn",onClick:l[10]||(l[10]=e=>ke.value=!0)},[c(d(R),{size:18,class:"env-warning-icon"},{default:u(()=>[c(d(Sa))]),_:1}),o("span",UP,m(we.value.length),1)])]),default:u(()=>[h(" 检测到 "+m(we.value.length)+" 个环境变量冲突,点击查看 ",1)]),_:1})):i("",!0),c(eP,{icon:d(a)?d(Ca):d(Ua),tooltip:d(a)?"切换到亮色主题":"切换到暗色主题",onClick:d(r)},null,8,["icon","tooltip","onClick"]),l[47]||(l[47]=o("div",{class:"header-divider"},null,-1)),o("div",PP,[c(eP,{icon:d(rl),tooltip:`我的收藏 (${d(S)})`,onClick:l[11]||(l[11]=e=>G.value=!0)},null,8,["icon","tooltip"]),d(S)>0?(n(),s("div",SP,m(d(S)),1)):i("",!0)]),c(eP,{icon:d(Wa),tooltip:"工作区管理",onClick:l[12]||(l[12]=e=>X.value=!0)},null,8,["icon"]),c(eP,{icon:d(cl),tooltip:"Prompts 管理",onClick:l[13]||(l[13]=e=>V.value=!0)},null,8,["icon"]),c(eP,{icon:d(Aa),tooltip:"MCP 服务器管理",onClick:l[14]||(l[14]=e=>W.value=!0)},null,8,["icon"]),c(eP,{icon:d(xa),tooltip:"设置",onClick:l[15]||(l[15]=e=>q.value=!0)},null,8,["icon"]),c(d(be),{trigger:"click",placement:"bottom-end",options:O,onSelect:Ne},{default:u(()=>[o("div",zP,[c(eP,{icon:d(ul),tooltip:"更多工具"},null,8,["icon"])])]),_:1})])]),o("div",TP,[Oe.value?(n(),s("div",IP,[c(d(Z),{size:"large"},{description:u(()=>[...l[48]||(l[48]=[h(" 加载配置中... ",-1)])]),_:1})])):i("",!0),o("div",MP,[c(t,null,{default:u(({Component:e})=>[(n(),g(P(e),{key:N.value}))]),_:1})]),B.value?(n(),g(xo,{key:1,"show-channels":Le.value,"show-logs":Ee.value,"proxy-running":$e.value,"proxy-loading":je.value,onProxyToggle:Be,onShowRecent:l[16]||(l[16]=e=>H.value=!0)},null,8,["show-channels","show-logs","proxy-running","proxy-loading"])):i("",!0)]),c(ti,{visible:H.value,"onUpdate:visible":l[17]||(l[17]=e=>H.value=e),channel:L.value},null,8,["visible","channel"]),c(Mi,{visible:G.value,"onUpdate:visible":l[18]||(l[18]=e=>G.value=e),onViewHistory:Ve},null,8,["visible"]),ye.value?(n(),g(pr,{key:0,ref_key:"chatHistoryRef",ref:he,show:fe.value,"onUpdate:show":l[19]||(l[19]=e=>fe.value=e),"project-name":ye.value.projectName,"session-id":ye.value.sessionId,"session-alias":ye.value.alias,channel:ge.value},null,8,["show","project-name","session-id","session-alias","channel"])):i("",!0),c(Ad,{visible:q.value,"onUpdate:visible":l[20]||(l[20]=e=>q.value=e)},null,8,["visible"]),c(Gv,{visible:W.value,"onUpdate:visible":l[21]||(l[21]=e=>W.value=e)},null,8,["visible"]),c(Em,{visible:V.value,"onUpdate:visible":l[22]||(l[22]=e=>V.value=e)},null,8,["visible"]),c(xf,{visible:J.value,"onUpdate:visible":l[23]||(l[23]=e=>J.value=e)},null,8,["visible"]),"opencode"===L.value?(n(),g(Nf,{key:1,visible:Q.value,"onUpdate:visible":l[24]||(l[24]=e=>Q.value=e)},null,8,["visible"])):i("",!0),c(eC,{visible:X.value,"onUpdate:visible":l[25]||(l[25]=e=>X.value=e)},null,8,["visible"]),c(iU,{visible:ee.value,"onUpdate:visible":l[26]||(l[26]=e=>ee.value=e)},null,8,["visible"]),c(bU,{visible:le.value,"onUpdate:visible":l[27]||(l[27]=e=>le.value=e)},null,8,["visible"]),c(YU,{visible:te.value,"onUpdate:visible":l[28]||(l[28]=e=>te.value=e)},null,8,["visible"]),c(qg,{visible:oe.value,"onUpdate:visible":l[29]||(l[29]=e=>oe.value=e),platform:re.value},null,8,["visible","platform"]),c(Ob,{visible:ce.value,"onUpdate:visible":l[30]||(l[30]=e=>ce.value=e),platform:ue.value},null,8,["visible","platform"]),c(yk,{visible:de.value,"onUpdate:visible":l[31]||(l[31]=e=>de.value=e),platform:pe.value},null,8,["visible","platform"]),c(Z_,{visible:ve.value,"onUpdate:visible":l[32]||(l[32]=e=>ve.value=e),platform:me.value},null,8,["visible","platform"]),c(d(se),{show:Y.value,"onUpdate:show":l[33]||(l[33]=e=>Y.value=e),preset:"card",title:`${AP} 使用帮助`,style:{width:"800px","max-width":"90vw"}},{default:u(()=>[o("div",{class:"help-content"},[o("div",{class:"help-section"},[l[49]||(l[49]=o("h4",null,"[START] 快速开始",-1)),o("p",null,m(AP)+" 是面向 Claude Code、Codex、Gemini 和 OpenCode 的统一 AI 编程工作台,提供会话管理、动态渠道切换、全局搜索与实时监控能力。"),l[50]||(l[50]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"[STAR] 最简单的启动方式:",-1)),l[51]||(l[51]=o("div",{style:{background:"var(--bg-primary)",padding:"12px","border-radius":"6px",margin:"8px 0","border-left":"3px solid #18a058"}},[o("p",{style:{margin:"0","font-family":"'Courier New', monospace","font-size":"13px","font-weight":"600",color:"var(--primary-color)"}},"ctx start"),o("p",{style:{margin:"4px 0 0 0","font-size":"12px",color:"var(--text-secondary)"}},[h("• 后台启动所有服务"),o("br"),h("• 可以关闭终端窗口"),o("br"),h("• 代理服务保持运行")])],-1)),l[52]||(l[52]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"[LOG] 日常工作流:",-1)),l[53]||(l[53]=o("div",{style:{"font-size":"12px","line-height":"1.8",color:"var(--text-secondary)"}},[o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx start"),h(" 启动服务"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx status"),h(" 查看状态"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx logs"),h(" 查看日志"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx stop"),h(" 停止服务 ")],-1))]),l[62]||(l[62]=o("div",{class:"help-section"},[o("h4",null,"[AI] 支持的 AI 工具"),o("ul",null,[o("li",null,[o("strong",null,"Claude Code"),h(":Anthropic 官方命令行工具,支持 Claude 系列模型")]),o("li",null,[o("strong",null,"Codex"),h(":支持 OpenAI GPT 系列和 Claude 模型(通过 OpenAI 兼容格式)")]),o("li",null,[o("strong",null,"Gemini"),h(":支持 Google Gemini 系列模型")])])],-1)),l[63]||(l[63]=o("div",{class:"help-section"},[o("h4",null,"[LOG] 命令行用法"),o("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"[START] 服务管理"),o("div",{class:"command-list"},[o("div",{class:"command-item"},[o("code",null,"ctx start"),o("span",null,"后台启动所有服务(推荐)")]),o("div",{class:"command-item"},[o("code",null,"ctx stop"),o("span",null,"停止所有服务")]),o("div",{class:"command-item"},[o("code",null,"ctx restart"),o("span",null,"重启所有服务")]),o("div",{class:"command-item"},[o("code",null,"ctx status"),o("span",null,"查看服务状态")])]),o("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"[PROXY] 代理管理"),o("div",{class:"command-list"},[o("div",{class:"command-item"},[o("code",null,"ctx claude start"),o("span",null,"启动 Claude 代理")]),o("div",{class:"command-item"},[o("code",null,"ctx codex start"),o("span",null,"启动 Codex 代理")]),o("div",{class:"command-item"},[o("code",null,"ctx gemini start"),o("span",null,"启动 Gemini 代理")]),o("div",{class:"command-item"},[o("code",null,"ctx claude stop"),o("span",null,"停止指定代理(支持 stop/restart/status)")])]),o("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"[LOG] 日志管理"),o("div",{class:"command-list"},[o("div",{class:"command-item"},[o("code",null,"ctx logs"),o("span",null,"查看所有日志")]),o("div",{class:"command-item"},[o("code",null,"ctx logs claude"),o("span",null,"查看 Claude 日志(支持 ui/codex/gemini)")]),o("div",{class:"command-item"},[o("code",null,"ctx logs --follow"),o("span",null,"实时跟踪日志")]),o("div",{class:"command-item"},[o("code",null,"ctx logs --clear"),o("span",null,"清空日志")])]),o("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"[STATS] 其他命令"),o("div",{class:"command-list"},[o("div",{class:"command-item"},[o("code",null,"ctx stats"),o("span",null,"查看统计信息")]),o("div",{class:"command-item"},[o("code",null,"ctx doctor"),o("span",null,"系统诊断")]),o("div",{class:"command-item"},[o("code",null,"ctx -h"),o("span",null,"完整帮助")])])],-1)),l[64]||(l[64]=o("div",{class:"help-section"},[o("h4",null,"[TARGET] Web UI 功能"),o("ul",null,[o("li",null,[o("strong",null,"多类型支持"),h(":统一管理 Claude Code、Codex、Gemini 三种工具的项目和会话")]),o("li",null,[o("strong",null,"项目管理"),h(":查看所有项目,支持拖拽排序、搜索过滤、删除项目")]),o("li",null,[o("strong",null,"会话管理"),h(":查看项目会话列表,支持搜索、Fork、删除、重命名")]),o("li",null,[o("strong",null,"快速启动"),h(":点击会话可直接复制对应 AI 工具启动命令")]),o("li",null,[o("strong",null,"动态切换"),h(":每种工具独立的渠道管理,可在右侧面板快速切换 API 渠道")]),o("li",null,[o("strong",null,"实时日志"),h(":查看各类型代理的实时请求日志、token 消耗和成本统计")]),o("li",null,[o("strong",null,"全局搜索"),h(":使用 "),o("kbd",null,"Cmd/Ctrl"),h(" + "),o("kbd",null,"K"),h(" 在所有项目中搜索对话内容")])])],-1)),l[65]||(l[65]=o("div",{class:"help-section"},[o("h4",null,"[BOLT] 代理服务与渠道管理"),o("p",null,"每种 AI 工具都有独立的代理服务和渠道配置:"),o("ul",null,[o("li",null,[o("strong",null,"Claude 代理"),h(":端口 20088,支持 Anthropic API 格式")]),o("li",null,[o("strong",null,"Codex 代理"),h(":端口 20089,支持 OpenAI API 格式(兼容 Claude)")]),o("li",null,[o("strong",null,"Gemini 代理"),h(":端口 20090,支持 Gemini API 格式")])]),o("p",null,"在 Dashboard 或各工具详情页,可以添加多个渠道并快速切换,无需修改配置文件或重启工具。")],-1)),o("div",{class:"help-section"},[l[54]||(l[54]=o("h4",null,"[STAR] 后台启动与开机自启",-1)),l[55]||(l[55]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"后台启动服务",-1)),l[56]||(l[56]=o("p",{style:{"font-size":"12px","line-height":"1.8"}},[h("使用 "),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx start"),h(" 命令后台启动所有服务,可以安全关闭终端窗口而不影响代理服务的运行。")],-1)),l[57]||(l[57]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"配置开机自启(可选)",-1)),l[58]||(l[58]=o("p",{style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px 0"}},"第一次启用开机自启只需三个步骤:",-1)),l[59]||(l[59]=o("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)"}},[h(" # 第 1 步:启用 PM2 开机自启"),o("br"),o("span",{style:{color:"var(--primary-color)"}},"pm2 startup"),o("br"),o("br"),h(" # 第 2 步:保存配置"),o("br"),o("span",{style:{color:"var(--primary-color)"}},"pm2 save"),o("br"),o("br"),h(" # 第 3 步:重启电脑,服务自动启动 [v] ")],-1)),l[60]||(l[60]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"相关命令",-1)),l[61]||(l[61]=o("div",{style:{"font-size":"12px",color:"var(--text-secondary)","line-height":"1.8"}},[o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx start"),h(" 后台启动"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx status"),h(" 查看状态"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx logs"),h(" 查看日志"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"pm2 list"),h(" 查看所有后台进程"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"pm2 unstartup"),h(" 禁用开机自启 ")],-1)),o("p",{style:{color:"#18a058","font-size":"12px","margin-top":"8px"}},"[TIP] 提示:配置开机自启后,重启电脑时 "+m(AP)+" 会自动启动,无需手动运行命令。")]),l[66]||(l[66]=o("div",{class:"help-section"},[o("h4",null,"[LINK] 相关链接"),o("div",{class:"link-list"},[o("a",{href:"https://github.com/ZeaoZhang/coding-tool",target:"_blank"},"GitHub 仓库"),o("a",{href:"https://github.com/ZeaoZhang/coding-tool/issues",target:"_blank"},"问题反馈")])],-1))])]),_:1},8,["show","title"])])}}},[["__scopeId","data-v-50daf587"]]),$P=N({__name:"App",setup(e){const{isDark:a,loadTheme:l}=Fr(),s=t(()=>a.value?V:null),o=t(()=>a.value?{common:{primaryColor:"#18a058",primaryColorHover:"#1db165",primaryColorPressed:"#0c7a43",fontFamily:'"SF Pro Display", "SF Pro Text", "Segoe UI Variable Display", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif',fontFamilyMono:'"SF Mono", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace',borderRadius:"16px",borderRadiusSmall:"12px",bodyColor:"#0a1116",cardColor:"#121b22",modalColor:"#121b22",popoverColor:"#121b22",tableColor:"#121b22",inputColor:"#16222a",codeColor:"#0d171d",tabColor:"#121b22",actionColor:"#16222a",tableHeaderColor:"#16222a",hoverColor:"rgba(255, 255, 255, 0.08)",pressedColor:"rgba(255, 255, 255, 0.12)",borderColor:"#263740",dividerColor:"#263740"},Drawer:{color:"#121b22",headerColor:"#121b22",footerColor:"#121b22"},Modal:{color:"#121b22",boxShadow:"0 24px 64px rgba(0, 0, 0, 0.42)"},Card:{color:"#121b22",borderColor:"#263740"},Popover:{color:"#121b22",textColor:"#edf5f4",boxShadow:"0 20px 48px rgba(0, 0, 0, 0.34)"},Tooltip:{color:"#121b22",textColor:"#edf5f4",boxShadow:"0 20px 48px rgba(0, 0, 0, 0.34)"},Dialog:{color:"#121b22"},Button:{borderRadiusMedium:"12px"},Input:{borderRadius:"12px"}}:{common:{primaryColor:"#18a058",primaryColorHover:"#1db165",primaryColorPressed:"#0c7a43",fontFamily:'"SF Pro Display", "SF Pro Text", "Segoe UI Variable Display", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif',fontFamilyMono:'"SF Mono", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace',borderRadius:"16px",borderRadiusSmall:"12px",bodyColor:"#f4f7f8",cardColor:"#ffffff",modalColor:"#ffffff",popoverColor:"#ffffff",tableColor:"#ffffff",inputColor:"#f7faf8",codeColor:"#edf3f1",tabColor:"#ffffff",actionColor:"#f7faf8",tableHeaderColor:"#edf3f1",hoverColor:"rgba(24, 160, 88, 0.08)",pressedColor:"rgba(24, 160, 88, 0.12)",borderColor:"#d8e1de",dividerColor:"#d8e1de"},Modal:{color:"#ffffff",boxShadow:"0 24px 64px rgba(15, 23, 29, 0.16)"},Card:{color:"#ffffff",borderColor:"#d8e1de"},Popover:{color:"#ffffff",textColor:"#122025",boxShadow:"0 18px 42px rgba(15, 23, 29, 0.12)"},Tooltip:{color:"rgba(18, 32, 37, 0.94)",textColor:"#f7faf8",boxShadow:"0 18px 42px rgba(15, 23, 29, 0.18)"},Drawer:{color:"#ffffff",headerColor:"#ffffff",footerColor:"#ffffff"},Button:{borderRadiusMedium:"12px"},Input:{borderRadius:"12px"}});return w(()=>{l()}),(e,a)=>(n(),g(d(Ee),{theme:s.value,"theme-overrides":o.value},{default:u(()=>[c(d(je),null,{default:u(()=>[c(d(Le),null,{default:u(()=>[c(OP)]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"]))}}),jP=B();$P.use(jP),$P.use(Sl),$P.mount("#app"),function(){if(ln)return;const e=an();e.connectWebSocket(),queueMicrotask(()=>{const a=()=>{e.loadChannels(),e.loadAdvancedConfig()};"undefined"==typeof window||"function"!=typeof window.requestIdleCallback?setTimeout(a,0):window.requestIdleCallback(a,{timeout:1e3})}),ln=!0}();export{Zo as A,oU as B,pr as C,mr as D,jn as E,$n as F,Ln as G,J_ as P,ti as R,Kg as S,Xx as W,zl as _,Fs as a,Bn as b,gP as c,gr as d,Tn as e,In as f,Bs as g,Mn as h,An as i,On as j,vt as k,kt as l,St as m,Rt as n,Zt as o,hr as p,wi as q,Lo as r,Rs as s,Ds as t,Hs as u,Ns as v,Ko as w,Vo as x,ci as y,Go as z};
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ProjectList-BB4Whns8.js","assets/vue-vendor-B5RqjEjQ.js","assets/markdown-BNJfEgCA.js","assets/markdown-BfC0goYb.css","assets/vendors-DQA4Hw9v.js","assets/icons-nGdSKQn2.js","assets/naive-ui-CVyvdmg1.js","assets/ProjectList-D3a0oRum.css","assets/SessionList-CvurKSRK.js","assets/SessionList-D12muXvx.css","assets/Home-D7hovkk9.js","assets/Home-Jom_ZcdY.css","assets/WorkspaceManager-CZeXnxu1.js","assets/WorkspaceManager-CrwgQgmP.css","assets/ConfigTemplates-DV2KFuC4.js","assets/ConfigTemplates-Bidwfdf2.css","assets/SkillManager-DQjRXOFg.js","assets/SkillManager-D7pd-d_P.css","assets/PluginManager-Bd3hhc5A.js","assets/PluginManager-ROyoZ-6m.css","assets/Analytics-BqDjJUJl.js","assets/Analytics-RNn1BUbG.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{U as e,V as a,r as l,f as t,c as s,o as n,a as o,W as i,s as r,X as c,Y as u,N as d,L as p,Z as v,_ as m,F as f,$ as y,a0 as g,p as h,G as b,h as w,a1 as k,k as _,w as C,K as x,a2 as U,a3 as P,y as S,R as z,a4 as T,v as I,a5 as M,x as A,t as O,a6 as $,i as j,J as L,a7 as E,a8 as D,M as N,a9 as B}from"./vue-vendor-B5RqjEjQ.js";import{N as R,B as F,a as H,b as G,c as K,d as q,e as W,f as V,l as J,g as Z,h as Q,i as Y,j as X,k as ee,m as ae,n as le,o as te,p as se,q as ne,r as oe,s as ie,t as re,u as ce,v as ue,w as de,x as pe,y as ve,z as me,A as fe,C as ye,D as ge,E as he,F as be,G as we,H as ke,I as _e,J as Ce,K as xe,L as Ue,M as Pe,O as Se,P as ze,S as Te,Q as Ie,R as Me,T as Ae,U as Oe,V as $e,W as je,X as Le,Y as Ee}from"./naive-ui-CVyvdmg1.js";import{C as De,S as Ne,a as Be,b as Re,c as Fe,O as He,A as Ge,d as Ke,T as qe,e as We,f as Ve,E as Je,g as Ze,h as Qe,P as Ye,i as Xe,K as ea,j as aa,k as la,G as ta,l as sa,D as na,m as oa,n as ia,o as ra,p as ca,q as ua,r as da,s as pa,t as va,I as ma,u as fa,v as ya,w as ga,x as ha,y as ba,z as wa,N as ka,B as _a,F as Ca,H as xa,J as Ua,M as Pa,L as Sa,W as za,Q as Ta,R as Ia,U as Ma,V as Aa,X as Oa,Y as $a,Z as ja,_ as La,$ as Ea,a0 as Da,a1 as Na,a2 as Ba,a3 as Ra,a4 as Fa,a5 as Ha,a6 as Ga,a7 as Ka,a8 as qa,a9 as Wa,aa as Va,ab as Ja,ac as Za,ad as Qa,ae as Ya,af as Xa,ag as el,ah as al,ai as ll,aj as tl,ak as sl,al as nl,am as ol,an as il,ao as rl,ap as cl,aq as ul}from"./icons-nGdSKQn2.js";import{a as dl}from"./vendors-DQA4Hw9v.js";import{H as pl,j as vl,p as ml,b as fl,d as yl,t as gl,e as hl,x as bl,f as wl,M as kl}from"./markdown-BNJfEgCA.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 _l={},Cl=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 _l)return;_l[e]=!0;const a=e.endsWith(".css"),t=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${t}`))return;const s=document.createElement("link");return s.rel=a?"stylesheet":"modulepreload",a||(s.as="script"),s.crossOrigin="",s.href=e,l&&s.setAttribute("nonce",l),document.head.appendChild(s),a?new Promise((a,l)=>{s.addEventListener("load",a),s.addEventListener("error",()=>l(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function s(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&&s(e.reason);return e().catch(s)})},xl=()=>Cl(()=>import("./ProjectList-BB4Whns8.js"),__vite__mapDeps([0,1,2,3,4,5,6,7])),Ul=()=>Cl(()=>import("./SessionList-CvurKSRK.js"),__vite__mapDeps([8,1,2,3,4,5,6,9])),Pl=[{path:"/",name:"home",component:()=>Cl(()=>import("./Home-D7hovkk9.js"),__vite__mapDeps([10,4,2,3,1,5,6,11]))},{path:"/claude",name:"claude-projects",component:xl,meta:{channel:"claude"}},{path:"/claude/sessions/:projectName",name:"claude-sessions",component:Ul,props:!0,meta:{channel:"claude"}},{path:"/codex",name:"codex-projects",component:xl,meta:{channel:"codex"}},{path:"/codex/sessions/:projectName",name:"codex-sessions",component:Ul,props:!0,meta:{channel:"codex"}},{path:"/gemini",name:"gemini-projects",component:xl,meta:{channel:"gemini"}},{path:"/gemini/sessions/:projectName",name:"gemini-sessions",component:Ul,props:!0,meta:{channel:"gemini"}},{path:"/opencode",name:"opencode-projects",component:xl,meta:{channel:"opencode"}},{path:"/opencode/sessions/:projectName",name:"opencode-sessions",component:Ul,props:!0,meta:{channel:"opencode"}},{path:"/omp",name:"omp-projects",component:xl,meta:{channel:"omp"}},{path:"/omp/sessions/:projectName",name:"omp-sessions",component:Ul,props:!0,meta:{channel:"omp"}},{path:"/workspaces",name:"workspaces",component:()=>Cl(()=>import("./WorkspaceManager-CZeXnxu1.js"),__vite__mapDeps([12,1,2,3,6,5,4,13]))},{path:"/config-templates",name:"config-templates",component:()=>Cl(()=>import("./ConfigTemplates-DV2KFuC4.js"),__vite__mapDeps([14,1,2,3,6,5,4,15]))},{path:"/skills",name:"skills",component:()=>Cl(()=>import("./SkillManager-DQjRXOFg.js"),__vite__mapDeps([16,1,2,3,6,5,4,17]))},{path:"/plugins",name:"plugins",component:()=>Cl(()=>import("./PluginManager-Bd3hhc5A.js"),__vite__mapDeps([18,1,2,3,6,5,4,19]))},{path:"/analytics",name:"analytics",component:()=>Cl(()=>import("./Analytics-BqDjJUJl.js"),__vite__mapDeps([20,1,2,3,6,5,4,21]))},{path:"/:pathMatch(.*)*",redirect:"/"}],Sl=e({history:a(),routes:Pl}),zl=(e,a)=>{const l=e.__vccOpts||e;for(const[t,s]of a)l[t]=s;return l},Tl={class:"channel-header"},Il={class:"channel-title"},Ml=["title"],Al={class:"channel-actions"},Ol={class:"test-result-header"},$l={class:"test-result-status"},jl={class:"test-result-info"},Ll={key:0,class:"latency"},El={key:1,class:"status-code"},Dl={key:0,class:"test-result-error"},Nl={class:"channel-info"},Bl={class:"info-main"},Rl={class:"info-footer"},Fl={class:"channel-meta"},Hl={class:"meta-item"},Gl={class:"meta-value"},Kl={class:"meta-item"},ql=zl({__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})},balance:{type:Object,default:null},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","refresh-balance"],setup(e,{emit:a}){const w=e,k=a,_=l(!1),C=l(null),x=t(()=>{var e;if(!(null==(e=w.balance)?void 0:e.visible))return"";const a=[];if(w.balance.platform&&a.push(w.balance.platform),w.balance.stale&&a.push("缓存"),w.balance.updatedAt)try{a.push(new Date(w.balance.updatedAt).toLocaleString())}catch{}return a.join(" · ")});async function U(){if(w.testFn){_.value=!0,C.value=null;try{const e=await w.testFn(w.channel.id,2e4);C.value=e}catch(e){C.value={success:!1,error:e.message||"测试失败",latency:null,statusCode:null}}finally{_.value=!1}}}return(a,l)=>{var t,w,P;return n(),s("div",{class:p(["channel-card",{collapsed:e.collapsed,disabled:!1===e.channel.enabled,"status-frozen":"frozen"===(null==(t=e.channel.health)?void 0:t.status),"status-checking":"checking"===(null==(w=e.channel.health)?void 0:w.status)}])},[o("div",Tl,[o("div",Il,[c(d(F),{text:"",size:"tiny",class:"collapse-btn",onClick:l[0]||(l[0]=v(e=>a.$emit("toggle-collapse"),["stop"]))},{default:u(()=>[c(d(R),{size:"16",class:p({collapsed:e.collapsed})},{default:u(()=>[c(d(De))]),_:1},8,["class"])]),_:1}),o("span",{class:"channel-name",title:e.channel.name},m(e.channel.name),9,Ml),(n(!0),s(f,null,y(e.headerTags,e=>(n(),g(d(H),{key:e.text,size:"tiny",type:e.type||"default",bordered:!1},{default:u(()=>[h(m(e.text),1)]),_:2},1032,["type"]))),128))]),o("div",Al,[e.showApplyButton?(n(),g(d(F),{key:0,size:"tiny",type:"primary",class:"apply-btn",onClick:l[1]||(l[1]=e=>a.$emit("apply"))},{default:u(()=>[...l[8]||(l[8]=[h(" 写入配置 ",-1)])]),_:1})):i("",!0),c(d(F),{size:"tiny",loading:_.value,onClick:U},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ne))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 测速 ",-1))]),_:1},8,["loading"]),c(d(F),{size:"tiny",onClick:l[2]||(l[2]=e=>a.$emit("edit"))},{default:u(()=>[...l[10]||(l[10]=[h(" 编辑 ",-1)])]),_:1}),c(d(F),{size:"tiny",type:"error",onClick:l[3]||(l[3]=e=>a.$emit("delete"))},{default:u(()=>[...l[11]||(l[11]=[h(" 删除 ",-1)])]),_:1}),c(d(G),{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"])])]),C.value?(n(),s("div",{key:0,class:p(["test-result",C.value.success?"success":"failed"])},[o("div",Ol,[o("span",$l,[C.value.success?(n(),g(d(R),{key:0,color:"#18a058"},{default:u(()=>[c(d(Be))]),_:1})):(n(),g(d(R),{key:1,color:"#f56c6c"},{default:u(()=>[c(d(Re))]),_:1})),h(" "+m(C.value.success?"测试成功":"测试失败"),1)]),o("div",jl,[C.value.latency?(n(),s("span",Ll,m(C.value.latency)+"ms",1)):i("",!0),C.value.statusCode?(n(),s("span",El,"HTTP "+m(C.value.statusCode),1)):i("",!0)]),c(d(F),{text:"",size:"tiny",onClick:l[5]||(l[5]=e=>C.value=null)},{default:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fe))]),_:1})]),_:1})]),C.value.error?(n(),s("div",Dl,m(C.value.error),1)):i("",!0)],2)):i("",!0),r(o("div",Nl,[o("div",Bl,[(n(!0),s(f,null,y(e.infoRows,e=>(n(),s("div",{key:e.label,class:"info-row"},[c(d(K),{depth:"3",class:"label"},{default:u(()=>[h(m(e.label)+":",1)]),_:2},1024),c(d(K),{depth:"2",class:p(["value",{mono:e.mono}])},{default:u(()=>[h(m(e.value||"—"),1)]),_:2},1032,["class"]),"function"==typeof e.action?(n(),g(d(F),{key:0,size:"tiny",text:"",type:"primary",onClick:a=>e.action()},{default:u(()=>[h(m(e.actionLabel||"操作"),1)]),_:2},1032,["onClick"])):i("",!0)]))),128))]),o("div",Rl,[e.channel.websiteUrl?(n(),g(d(F),{key:0,text:"",size:"tiny",onClick:l[6]||(l[6]=l=>a.$emit("open-website",e.channel.websiteUrl))},{icon:u(()=>[c(d(R),{size:"14"},{default:u(()=>[c(d(He))]),_:1})]),default:u(()=>[l[12]||(l[12]=h(" 前往官网 ",-1))]),_:1})):i("",!0),l[15]||(l[15]=o("div",{class:"footer-spacer"},null,-1)),o("div",Fl,[(null==(P=e.balance)?void 0:P.visible)&&e.balance.label?(n(),g(d(H),{key:0,size:"tiny",type:"success",bordered:!1,class:"balance-meta-tag",title:x.value,onClick:l[7]||(l[7]=v(e=>k("refresh-balance"),["stop"]))},{default:u(()=>[h(m(e.balance.label),1)]),_:1},8,["title"])):i("",!0),o("span",Hl,[l[13]||(l[13]=h(" 权重: ",-1)),o("span",Gl,m(e.meta.weight),1)]),o("span",Kl,[l[14]||(l[14]=h(" 并发: ",-1)),o("span",{class:p(["meta-value",{"meta-active":e.meta.concurrencyActive}])},m(e.meta.concurrencyText),3)])])])],512),[[b,!e.collapsed]])],2)}}},[["__scopeId","data-v-51007f34"]]),Wl=l(null),Vl=l(null),Jl=l(!1),Zl={claude:["claude-opus-4-7","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.5","gpt-5.4","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark","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-preview","gemini-3.1-flash-preview","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 s=t.toLowerCase();a.has(s)||(a.add(s),l.push(t))}),l}function Yl(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 Xl=null;async function et(e={}){const a=!0===e.forceRefresh;return!a&&Wl.value&&Vl.value?Wl.value:Xl||(Jl.value=!0,Xl=(async()=>{try{const l=new URLSearchParams;a&&l.set("forceRefresh","true");const t=l.toString(),s=t?`/api/config/default-models?${t}`:"/api/config/default-models",n=await fetch(s);if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);const o=await n.json();Wl.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=Yl(l);e&&a[e].push(l)}return{claude:Ql(a.claude),codex:Ql(a.codex),gemini:Ql(a.gemini)}}((await e.json()).models||{});Vl.value={claude:a.claude.length>0?a.claude:[...Zl.claude],codex:a.codex.length>0?a.codex:[...Zl.codex],gemini:a.gemini.length>0?a.gemini:[...Zl.gemini]}}catch(e){Vl.value={claude:[...Zl.claude],codex:[...Zl.codex],gemini:[...Zl.gemini]}}}catch(l){Wl.value=Zl,Vl.value={claude:[...Zl.claude],codex:[...Zl.codex],gemini:[...Zl.gemini]}}finally{Jl.value=!1,Xl=null}return Wl.value})(),Xl)}function at(e){var a;return(null==(a=Wl.value)?void 0:a[e])||Zl[e]||[]}function lt(e){var a;return(null==(a=Vl.value)?void 0:a[e])||Zl[e]||[]}function tt(){return{defaultModels:Wl,allModels:Vl,loading:Jl,loadDefaultModels:et,getDefaultModels:at,getAllModelsByToolType:lt}}const st={class:"model-redirect-editor"},nt={class:"redirect-input"},ot={class:"redirect-arrow"},it={class:"redirect-input"},rt=zl({__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,i=a,{getDefaultModels:r,loadDefaultModels:p}=tt();w(async()=>{await p()});const v=t(()=>{if(l.availableModels&&l.availableModels.length>0)return l.availableModels;return r(l.channelType).map(e=>({label:e,value:e}))});function m(e){if(!e)return v.value;const a=e.toLowerCase();return v.value.filter(e=>(e.label||e.value||"").toLowerCase().includes(a))}function g(e,a,t){const s=[...l.modelValue];s[e]={...s[e],[a]:t},i("update:modelValue",s)}function b(){i("update:modelValue",[...l.modelValue,{from:"",to:""}])}return(a,t)=>(n(),s("div",st,[(n(!0),s(f,null,y(e.modelValue,(e,a)=>(n(),s("div",{key:a,class:"redirect-row"},[o("div",nt,[c(d(q),{value:e.from,options:m(e.from),placeholder:"源模型",clearable:"","get-show":()=>!0,"onUpdate:value":e=>g(a,"from",e)},null,8,["value","options","onUpdate:value"])]),o("div",ot,[c(d(R),{size:"16",color:"#999"},{default:u(()=>[c(d(Ge))]),_:1})]),o("div",it,[c(d(q),{value:e.to,options:m(e.to),placeholder:"目标模型",clearable:"","get-show":()=>!0,"onUpdate:value":e=>g(a,"to",e)},null,8,["value","options","onUpdate:value"])]),c(d(F),{quaternary:"",circle:"",size:"small",onClick:e=>function(e){const a=l.modelValue.filter((a,l)=>l!==e);i("update:modelValue",a)}(a)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fe))]),_:1})]),_:1},8,["onClick"])]))),128)),c(d(F),{dashed:"",size:"small",onClick:b,class:"add-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[t[0]||(t[0]=h(" 添加重定向规则 ",-1))]),_:1})]))}},[["__scopeId","data-v-8ebdcad0"]]),ct=dl.create({baseURL:"/api",timeout:3e4});function ut(e="claude"){return"codex"===e?"/codex":"gemini"===e?"/gemini":"opencode"===e?"/opencode":"omp"===e?"/omp":""}async function dt(){return(await ct.get("/channels")).data}async function pt(){return(await ct.post("/channels/sync-current")).data}async function vt(e,a,l,t,s={}){const n={name:e,baseUrl:a,apiKey:l,websiteUrl:t,...s};return(await ct.post("/channels",n)).data}async function mt(e,a){return(await ct.put(`/channels/${e}`,a)).data}async function ft(e){return(await ct.delete(`/channels/${e}`)).data}async function yt(e){return(await ct.post(`/channels/${e}/apply-to-settings`)).data}async function gt(e){return(await ct.post(`/channels/${e}/reset-health`)).data}async function ht(e){return(await ct.get("/channel-balances",{params:{source:e}})).data}async function bt(e,a){return(await ct.post(`/channel-balances/${e}/${a}/refresh`)).data}async function wt(){return(await ct.get("/codex/channels")).data}async function kt(){return(await ct.post("/codex/channels/sync-current")).data}async function _t(e,a,l,t,s,n={}){return(await ct.post("/codex/channels",{name:e,providerKey:a,baseUrl:l,apiKey:t,websiteUrl:s,...n})).data}async function Ct(e,a){return(await ct.put(`/codex/channels/${e}`,a)).data}async function xt(e){return(await ct.delete(`/codex/channels/${e}`)).data}async function Ut(e){return(await ct.post(`/codex/channels/${e}/apply-to-settings`)).data}async function Pt(e){return(await ct.post(`/codex/channels/${e}/reset-health`)).data}async function St(){return(await ct.get("/gemini/channels")).data}async function zt(){return(await ct.post("/gemini/channels/sync-current")).data}async function Tt(e,a,l,t,s,n={}){return(await ct.post("/gemini/channels",{name:e,baseUrl:a,apiKey:l,model:t,websiteUrl:s,...n})).data}async function It(e,a){return(await ct.put(`/gemini/channels/${e}`,a)).data}async function Mt(e){return(await ct.delete(`/gemini/channels/${e}`)).data}async function At(e){return(await ct.post(`/gemini/channels/${e}/reset-health`)).data}async function Ot(e,a=2e4){return(await ct.post(`/channels/${e}/speed-test`,{timeout:a})).data}async function $t(e,a="claude"){const l=a?{params:{type:a}}:void 0;return(await ct.get(`/channels/${e}/models`,l)).data}async function jt(e=2e4){return(await ct.post("/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function Lt(e,a=2e4){return(await ct.post(`/codex/channels/${e}/speed-test`,{timeout:a})).data}async function Et(e=2e4){return(await ct.post("/codex/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function Dt(e,a=2e4){return(await ct.post(`/gemini/channels/${e}/speed-test`,{timeout:a})).data}async function Nt(e=2e4){return(await ct.post("/gemini/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function Bt(e){return(await ct.get(`/codex/channels/${e}/models`)).data}async function Rt(e){return(await ct.get(`/gemini/channels/${e}/models`)).data}async function Ft(){return(await ct.get("/opencode/channels")).data}async function Ht(){return(await ct.post("/opencode/channels/sync-current")).data}async function Gt(e,a,l,t={}){return(await ct.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 Kt(e,a){return(await ct.put(`/opencode/channels/${e}`,a)).data}async function qt(e){return(await ct.delete(`/opencode/channels/${e}`)).data}async function Wt(e){return(await ct.post(`/opencode/channels/${e}/reset-health`)).data}async function Vt(e,a=2e4){return(await ct.post(`/opencode/channels/${e}/speed-test`,{timeout:a})).data}async function Jt(e=2e4){return(await ct.post("/opencode/channels/speed-test-all",{timeout:e},{timeout:12e4})).data}async function Zt(e,{forceRefresh:a=!1}={}){return(await ct.get(`/opencode/channels/${e}/models`,{params:a?{forceRefresh:"true"}:{}})).data}async function Qt({baseUrl:e,apiKey:a,gatewaySourceType:l}){return(await ct.post("/opencode/channels/probe-models",{baseUrl:e,apiKey:a,gatewaySourceType:l})).data}async function Yt(){return(await ct.get("/omp/channels")).data}async function Xt(){return(await ct.post("/omp/channels/sync-current")).data}async function es(e,a,l,t={}){return(await ct.post("/omp/channels",{name:e,baseUrl:a,apiKey:l,wireApi:t.wireApi||"openai",providerApi:t.providerApi||t.wireApi||"openai-completions",providerKey:t.providerKey||"",authMode:t.authMode||"api_key",oauthProviderId:t.oauthProviderId||"",gatewaySourceType:t.gatewaySourceType||"openai_compatible",enabled:!1!==t.enabled,weight:t.weight||1,maxConcurrency:t.maxConcurrency||null,model:t.model||null,modelRedirects:t.modelRedirects||[],allowedModels:t.allowedModels||[],speedTestModel:t.speedTestModel||null,presetId:t.presetId||null,websiteUrl:t.websiteUrl||"",balanceToken:t.balanceToken||"",balanceUserId:t.balanceUserId||null})).data}async function as(e,a){return(await ct.put(`/omp/channels/${e}`,a)).data}async function ls(e){return(await ct.delete(`/omp/channels/${e}`)).data}async function ts(e){return(await ct.post(`/omp/channels/${e}/reset-health`)).data}async function ss(e,a=2e4){return(await ct.post(`/omp/channels/${e}/speed-test`,{timeout:a})).data}async function ns(e,{forceRefresh:a=!1}={}){return(await ct.get(`/omp/channels/${e}/models`,{params:a?{forceRefresh:"true"}:{}})).data}async function os(e){return(await ct.post("/omp/channels/probe-models",e)).data}ct.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 is=Object.freeze(Object.defineProperty({__proto__:null,applyChannelToSettings:yt,applyCodexChannelToSettings:Ut,createChannel:vt,createCodexChannel:_t,createGeminiChannel:Tt,createOmpChannel:es,createOpenCodeChannel:Gt,deleteChannel:ft,deleteCodexChannel:xt,deleteGeminiChannel:Mt,deleteOmpChannel:ls,deleteOpenCodeChannel:qt,fetchChannelModels:$t,fetchCodexChannelModels:Bt,fetchGeminiChannelModels:Rt,fetchOmpChannelModels:ns,fetchOpenCodeChannelModels:Zt,getBestChannelForRestore:async function(){return(await ct.get("/channels/best-for-restore")).data},getChannelBalances:ht,getChannelPoolStatus:async function(){return(await ct.get("/channels/pool/status")).data},getChannels:dt,getCodexChannels:wt,getCurrentChannel:async function(){return(await ct.get("/channels/current")).data},getEnabledCodexChannels:async function(){return(await ct.get("/codex/channels/enabled")).data},getEnabledGeminiChannels:async function(){return(await ct.get("/gemini/channels/enabled")).data},getEnabledOmpChannels:async function(){return{channels:((await Yt()).channels||[]).filter(e=>!1!==e.enabled)}},getEnabledOpenCodeChannels:async function(){return{channels:((await Ft()).channels||[]).filter(e=>!1!==e.enabled)}},getGeminiChannels:St,getOmpAuthProviders:async function({forceRefresh:e=!1}={}){return(await ct.get("/omp/config/auth-providers",{params:e?{forceRefresh:"true"}:{}})).data},getOmpChannels:Yt,getOmpProxyStatus:async function(){return(await ct.get("/omp/proxy/status")).data},getOpenCodeChannels:Ft,getOpenCodeProxyStatus:async function(){return(await ct.get("/opencode/proxy/status")).data},probeOmpChannelModels:os,probeOpenCodeChannelModels:Qt,refreshChannelBalance:bt,resetChannelHealth:gt,resetCodexChannelHealth:Pt,resetGeminiChannelHealth:At,resetOmpChannelHealth:ts,resetOpenCodeChannelHealth:Wt,saveChannelOrder:async function(e){return(await ct.post("/channels/order",{order:e})).data},saveCodexChannelOrder:async function(e){return(await ct.post("/codex/channels/order",{order:e})).data},saveGeminiChannelOrder:async function(e){return(await ct.post("/gemini/channels/order",{order:e})).data},saveOmpChannelOrder:async function(e){return(await ct.post("/omp/channels/order",{order:e})).data},saveOpenCodeChannelOrder:async function(e){return(await ct.post("/opencode/channels/order",{order:e})).data},startOmpProxy:async function(){return(await ct.post("/omp/proxy/start")).data},startOpenCodeProxy:async function(){return(await ct.post("/opencode/proxy/start")).data},stopOmpProxy:async function(){return(await ct.post("/omp/proxy/stop")).data},stopOpenCodeProxy:async function(){return(await ct.post("/opencode/proxy/stop")).data},syncCurrentClaudeChannel:pt,syncCurrentCodexChannel:kt,syncCurrentGeminiChannel:zt,syncCurrentOmpChannel:Xt,syncCurrentOpenCodeChannel:Ht,testAllClaudeChannelsSpeed:jt,testAllCodexChannelsSpeed:Et,testAllGeminiChannelsSpeed:Nt,testAllOmpChannelsSpeed:async function(e=2e4){return(await ct.post("/omp/channels/speed-test-all",{timeout:e},{timeout:12e4})).data},testAllOpenCodeChannelsSpeed:Jt,testClaudeChannelSpeed:Ot,testCodexChannelSpeed:Lt,testGeminiChannelSpeed:Dt,testOmpChannelSpeed:ss,testOpenCodeChannelSpeed:Vt,updateChannel:mt,updateCodexChannel:Ct,updateGeminiChannel:It,updateOmpChannel:as,updateOpenCodeChannel:Kt},Symbol.toStringTag,{value:"Module"})),rs=[{id:"official",name:"Claude 官方",category:"official",websiteUrl:"https://www.anthropic.com",baseUrl:"https://api.anthropic.com",env:{}},{id:"openai",name:"OpenAI",category:"third_party",websiteUrl:"https://platform.openai.com",baseUrl:"https://api.openai.com/v1",gatewaySourceType:"openai_compatible",targetApi:"responses",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:{}}],cs={official:"官方",cn_official:"国内官方",aggregator:"聚合服务",third_party:"第三方",custom:"自定义"};function us(e){return rs.find(a=>a.id===e)}const ds=[{id:"openai",name:"OpenAI",category:"official",websiteUrl:"https://platform.openai.com",baseUrl:"https://api.openai.com/v1",providerKey:"openai-official"},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:"",providerKey:""}],ps={official:"官方",custom:"自定义"};function vs(e){return ds.find(a=>a.id===e)}const ms=[{id:"google",name:"Google AI",category:"official",websiteUrl:"https://ai.google.dev",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiFormat:"gemini_api"},{id:"vertex_ai_v1",name:"Vertex AI v1",category:"official",websiteUrl:"https://cloud.google.com/vertex-ai/generative-ai/docs",baseUrl:"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google",apiFormat:"vertex_ai_v1"},{id:"custom",name:"自定义",category:"custom",websiteUrl:"",baseUrl:"",apiFormat:"gemini_api"}],fs={official:"官方",custom:"自定义"};function ys(e){return ms.find(a=>a.id===e)}const gs=[{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:[]}],hs={apikey:"API Key",entry:"转换入口",custom:"自定义"};function bs(e){return gs.find(a=>a.id===e)}const{getAllModelsByToolType:ws,loadDefaultModels:ks}=tt(),_s=/^https?:\/\//i,Cs=/^[a-z0-9_-]+$/i,xs=new Set(["anyrouter","newcli"]);function Us(e){const a=Number(e);return!Number.isFinite(a)||a<=0?null:Math.round(a)}function Ps(e){const a=Number(e);return!Number.isFinite(a)||a<1?1:Math.min(100,Math.round(a))}function Ss(e,a,{required:l}={}){if(!a)return l?`${e}不能为空`:"";if(!_s.test(a))return`${e}必须以 http:// 或 https:// 开头`;try{new URL(a)}catch(t){return`${e}不是合法的链接`}return""}function zs(e){const a=String(e||"").trim();return a?Cs.test(a)?"openai"===a.toLowerCase()?"Provider Key 不能使用保留值 openai,请改成 openai-official 之类的自定义标识":"":"只能包含字母、数字、下划线和中划线,例如 openai-official":"Provider Key 不能为空"}function Ts(e){const a=!0!==e._showChannelBalance||Is(e);return{apiKey:e.apiKey||"",authMode:"oauth"===e.authMode?"oauth":"api_key",oauthProviderId:e.oauthProviderId||e.providerKey||"",balanceToken:a&&e.balanceToken||"",balanceUserId:a&&e.balanceUserId||null}}function Is(e={}){return!0===e._showChannelBalance&&xs.has(function(e={}){const a=[e.presetId,e.providerKey,e.name,e.websiteUrl,e.baseUrl].map(e=>String(e||"").trim().toLowerCase()).join(" ");return a.includes("anyrouter")?"anyrouter":a.includes("code.newcli.com")||a.includes("newcli")||a.includes("new-cli")?"newcli":null}(e))}function Ms(e="余额凭据"){return{key:"balanceToken",label:e,type:"password",showWhen:Is,placeholder:"选填:余额接口需要的会话 Token / Cookie(NewCLI 可填完整 Cookie)"}}function As(){return{key:"balanceUserId",label:"余额用户 ID",type:"number",min:1,clearable:!0,showWhen:Is,placeholder:"选填:New API / AnyRouter 需要 New-Api-User 时填写"}}function Os(e){return{...e}}function $s(e={}){const a=Array.isArray(e.allowedModels)?e.allowedModels.map(e=>String(e||"").trim()).filter(Boolean):[];return 0===a.length?"(默认/测速模型)":a.length<=3?a.join(", "):`${a.slice(0,3).join(", ")} +${a.length-3}`}function js(e){const a=String(e||"").trim().toLowerCase();return"claude"===a?"Claude Code":"gemini"===a?"Gemini":"Codex"}function Ls(e=[]){return e.map(e=>({label:e,value:e}))}function Es(...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 s=t.toLowerCase();a.has(s)||(a.add(s),l.push({label:(null==e?void 0:e.label)||t,value:t}))}return l}function Ds(e){return Ls(ws(e))}const Ns={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:"停用"}]},Bs={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:rs,presetCategories:cs,getPresetById:us,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=>Ss("接口地址",e,{required:!0})},{key:"apiKey",label:"接口密钥",type:"password",required:!0,placeholder:"sk-..."},Ms(),As(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>Ss("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则自动检测)",description:"指定用于速度测试的模型,留空则使用自动检测",options:Ds("claude"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,showWhen:e=>"official"===e.presetId||"openai_compatible"===e.gatewaySourceType,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"OpenAI 网关",description:"OpenAI 格式渠道需要通过 Claude 代理使用;优先选择 Responses API,不兼容时再切到 Chat Completions",showWhen:e=>"openai_compatible"===e.gatewaySourceType,fields:[{key:"targetApi",label:"上游接口",type:"radio-group",options:[{label:"Responses API",value:"responses"},{label:"Chat Completions",value:"chat.completions"}]}]},{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:Ns.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:"",balanceToken:"",balanceUserId:null,websiteUrl:"https://www.anthropic.com",speedTestModel:"",modelConfig:{model:"",haikuModel:"",sonnetModel:"",opusModel:""},modelRedirects:[],proxyUrl:"",gatewaySourceType:"claude",targetApi:"responses",maxConcurrency:null,weight:1,enabled:!0,availableModels:[],modelsFetching:!1,modelsFetchError:null}),mapChannelToForm:e=>{var a,l,t,s;return{presetId:e.presetId||"official",name:e.name||"",baseUrl:e.baseUrl||"",apiKey:e.apiKey||"",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,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==(s=e.modelConfig)?void 0:s.opusModel)||""},modelRedirects:e.modelRedirects||[],proxyUrl:e.proxyUrl||"",gatewaySourceType:e.gatewaySourceType||"claude",targetApi:e.targetApi||"responses",maxConcurrency:e.maxConcurrency??null,weight:e.weight||1,enabled:!1!==e.enabled,availableModels:[],modelsFetching:!1,modelsFetchError:null}},onPresetChange:(e,a)=>{const l=us(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",t.targetApi=l.targetApi||t.targetApi||"responses",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||""}),Os(t)},fetchModelsForChannel:async(e,a)=>{var l;await ks();var t;const s=Ds((t=a.gatewaySourceType,"openai_compatible"===String(t||"").trim().toLowerCase()?"codex":"claude"));if(a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=s,void(a.modelsFetching=!1);try{const l=await $t(e,a.gatewaySourceType||null);l.models&&l.models.length>0?(a.availableModels=Es(Ls(l.models),s),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表(API 端点受保护)",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=s,a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(n){a.availableModels=s;const e=null==(l=n.response)?void 0:l.data;e?(a.modelsFetchError=e.error||n.message||"获取模型列表失败",a.modelsFetchErrorHint=e.errorHint||"已使用默认模型列表"):(a.modelsFetchError=n.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表")}finally{a.modelsFetching=!1}},testFn:Ot,api:{fetch:async()=>(await dt()).channels||[],syncCurrent:pt,create:async e=>{const a=Ts(e);await vt(e.name,e.baseUrl,a.apiKey,e.websiteUrl||void 0,{maxConcurrency:Us(e.maxConcurrency),weight:Ps(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",targetApi:e.targetApi||"responses",balanceToken:a.balanceToken,balanceUserId:a.balanceUserId})},update:async(e,a)=>{const l=Ts(a);await mt(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:Us(a.maxConcurrency),weight:Ps(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",targetApi:a.targetApi||"responses",balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},toggle:async(e,a)=>{await mt(e.id,{enabled:a})},remove:ft,applyToSettings:async e=>yt(e.id),resetHealth:async e=>gt(e.id)},getHeaderTags:(e,a)=>{var l,t;const s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},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:ds,presetCategories:ps,getPresetById:vs,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-official",disabledOnEdit:!0,validate:zs},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://api.example.com",validate:e=>Ss("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-..."},Ms(),As(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>Ss("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用默认)",description:"指定用于速度测试的模型,留空则使用默认模型",options:Ds("codex"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:Ns.schedule}],getInitialForm:()=>({presetId:"openai",name:"OpenAI",providerKey:"openai-official",baseUrl:"https://api.openai.com/v1",apiKey:"",balanceToken:"",balanceUserId:null,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||"",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,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=vs(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",Os(t)},fetchModelsForChannel:async(e,a)=>{if(await ks(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=Ds("codex"),void(a.modelsFetching=!1);try{const l=await Bt(e);l.models&&l.models.length>0?(a.availableModels=Es(Ls(l.models),Ds("codex")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=Ds("codex"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(l){a.availableModels=Ds("codex"),a.modelsFetchError=l.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表"}finally{a.modelsFetching=!1}},testFn:Lt,api:{fetch:async()=>(await wt()).channels||[],syncCurrent:kt,create:async e=>{const a=Ts(e);await _t(e.name,e.providerKey,e.baseUrl,a.apiKey,e.websiteUrl||"",{maxConcurrency:Us(e.maxConcurrency),weight:Ps(e.weight),enabled:e.enabled,modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,gatewaySourceType:e.gatewaySourceType||"codex",balanceToken:a.balanceToken,balanceUserId:a.balanceUserId})},update:async(e,a)=>{const l=Ts(a);await Ct(e.id,{name:a.name,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:Us(a.maxConcurrency),weight:Ps(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,gatewaySourceType:a.gatewaySourceType||"codex",balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},toggle:async(e,a)=>Ct(e.id,{enabled:a}),remove:xt,applyToSettings:async e=>Ut(e.id),resetHealth:async e=>Pt(e.id)},getHeaderTags:(e,a)=>{var l,t;const s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},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:ms,presetCategories:fs,getPresetById:ys,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=>Ss("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"AIza..."},Ms(),As(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>Ss("官网链接",e,{required:!1})},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用 model 字段)",description:"指定用于速度测试的模型,留空则使用上方配置的 Model",options:Ds("gemini"),clearable:!0}]},{title:"模型重定向",description:"仅在代理开启时生效,将请求的模型重定向到指定模型",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:Ns.schedule}],getInitialForm:()=>({presetId:"google",name:"Google AI",model:"gemini-2.5-pro",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiKey:"",apiFormat:"gemini_api",balanceToken:"",balanceUserId:null,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||"",apiFormat:e.apiFormat||"gemini_api",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,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=ys(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.apiFormat=l.apiFormat||"gemini_api",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"gemini",Os(t)},fetchModelsForChannel:async(e,a)=>{if(await ks(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,!e)return a.availableModels=Ds("gemini"),void(a.modelsFetching=!1);try{const l=await Rt(e);l.models&&l.models.length>0?(a.availableModels=Es(Ls(l.models),Ds("gemini")),l.fallbackUsed&&(a.modelsFetchError=l.error||"无法自动获取模型列表",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表,您也可以手动输入模型名称")):!l.fallbackUsed&&l.supported||(a.availableModels=Ds("gemini"),a.modelsFetchError=l.error||"该供应商不支持模型列表接口",a.modelsFetchErrorHint=l.errorHint||"已使用默认模型列表")}catch(l){a.availableModels=Ds("gemini"),a.modelsFetchError=l.message||"获取模型列表失败",a.modelsFetchErrorHint="已使用默认模型列表"}finally{a.modelsFetching=!1}},testFn:Dt,api:{fetch:async()=>(await St()).channels||[],syncCurrent:zt,create:async e=>{const a=Ts(e);await Tt(e.name,e.baseUrl,a.apiKey,e.model,e.websiteUrl||"",{maxConcurrency:Us(e.maxConcurrency),weight:Ps(e.weight),enabled:e.enabled,modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,apiFormat:e.apiFormat||"gemini_api",gatewaySourceType:e.gatewaySourceType||"gemini",balanceToken:a.balanceToken,balanceUserId:a.balanceUserId})},update:async(e,a)=>{const l=Ts(a);await It(e.id,{name:a.name,model:a.model,baseUrl:a.baseUrl,apiKey:l.apiKey,websiteUrl:a.websiteUrl,maxConcurrency:Us(a.maxConcurrency),weight:Ps(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,apiFormat:a.apiFormat||"gemini_api",gatewaySourceType:a.gatewaySourceType||"gemini",balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},toggle:async(e,a)=>It(e.id,{enabled:a}),remove:Mt,resetHealth:async e=>At(e.id)},getHeaderTags:(e,a)=>{var l,t;const s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},buildInfoRows:(e,a)=>{var l,t;return[{label:"Model",value:e.model,mono:!0},{label:"API",value:(t=e.apiFormat,"vertex_ai_v1"===String(t||"").trim().toLowerCase()?"Vertex AI v1":"Gemini API")},{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:gs,presetCategories:hs,getPresetById:bs,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=>Ss("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-..."},Ms(),As(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>Ss("官网链接",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:Ns.schedule}],getInitialForm:()=>({presetId:"openrouter",name:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",wireApi:"openai",apiKey:"",balanceToken:"",balanceUserId:null,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||"",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,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=bs(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",Os(t)},fetchModelsForChannel:async(e,a,{forceRefresh:l=!1}={})=>{await ks(),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=Ds(l),void(a.modelsFetching=!1)}if(e)try{const t=await Zt(e,{forceRefresh:l});t.models&&t.models.length>0?(a.availableModels=Ls(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(s){a.availableModels=[],a.modelsFetchError=s.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}else{if(!a.baseUrl)return a.availableModels=[],void(a.modelsFetching=!1);try{const e=await Qt({baseUrl:a.baseUrl,apiKey:a.apiKey||"",gatewaySourceType:a.gatewaySourceType||"codex"});a.availableModels=e.models&&e.models.length>0?Ls(e.models):[],e.error&&(a.modelsFetchError=e.error,a.modelsFetchErrorHint=e.errorHint||"请手动填写模型名称")}catch(s){a.availableModels=[],a.modelsFetchError=s.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}}},testFn:Vt,api:{fetch:async()=>(await Ft()).channels||[],syncCurrent:Ht,create:async e=>{const a=Ts(e);await Gt(e.name,e.baseUrl,a.apiKey,{wireApi:e.wireApi||"openai",maxConcurrency:Us(e.maxConcurrency),weight:Ps(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=Ts(a);await Kt(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:Us(a.maxConcurrency),weight:Ps(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,allowedModels:a.allowedModels||[],balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},toggle:async(e,a)=>Kt(e.id,{enabled:a}),remove:qt,resetHealth:async e=>Wt(e.id)},getHeaderTags:(e,a)=>{var l,t;const s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},buildInfoRows:(e,a)=>{var l;return[{label:"入口协议",value:js(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:"重置状态"}]}}),omp:()=>({type:"omp",displayName:"OMP",schedulerSource:"omp",storageKeys:{localCollapse:"ompChannelCollapse",collapseConfigKey:"omp",orderConfigKey:"omp"},emptyDescription:"暂无 OMP 渠道",showEmptyAction:!0,emptyActionText:"添加 OMP 渠道",modalWidth:600,formLabelWidth:95,showApplyButton:!1,presets:gs,presetCategories:hs,getPresetById:bs,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-official",validate:zs},{key:"baseUrl",label:"Base URL",type:"text",required:!0,placeholder:"https://api.example.com/v1",validate:e=>Ss("Base URL",e,{required:!0})},{key:"apiKey",label:"API Key",type:"password",required:!0,placeholder:"sk-...",validate:e=>function(e,a){if(null==a||""===a)return`${e}不能为空`}("API Key",e)},Ms(),As(),{key:"websiteUrl",label:"官网链接",type:"text",placeholder:"https://(选填)",validate:e=>Ss("官网链接",e,{required:!1})},{key:"model",label:"默认模型",type:"select",placeholder:"选择或输入默认模型(留空则由 OMP 决定)",options:[],clearable:!0},{key:"speedTestModel",label:"测速模型",type:"select",placeholder:"选择用于测速的模型(留空则使用默认模型)",options:[],clearable:!0},{key:"allowedModels",label:"可用模型",type:"model-multi-select",placeholder:"选择注册到 OMP models.yml 的模型",description:"仅选中的模型会暴露给 OMP;留空时仅使用默认模型/测速模型,不回退到 provider 全量目录"}]},{title:"模型重定向",description:"仅在 coding-tool-x 托管 OMP models.yml provider 启用时用于模型选择提示",collapsible:!0,fields:[{key:"modelRedirects",type:"model-redirect",fullWidth:!0}]},{title:"调度配置",fields:Ns.schedule}],getInitialForm:()=>({presetId:"openrouter",name:"OpenRouter",providerKey:"openrouter",baseUrl:"https://openrouter.ai/api/v1",wireApi:"openai",providerApi:"openai-completions",apiKey:"",balanceToken:"",balanceUserId:null,websiteUrl:"https://openrouter.ai",model:"",gatewaySourceType:"openai_compatible",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||"",providerKey:e.providerKey||e.provider||e.name||"",baseUrl:e.baseUrl||"",wireApi:e.wireApi||"openai",providerApi:e.providerApi||e.api||"openai-completions",apiKey:e.apiKey||"",balanceToken:e.balanceToken||"",balanceUserId:e.balanceUserId??null,websiteUrl:e.websiteUrl||"",model:e.model||"",gatewaySourceType:e.gatewaySourceType||"openai_compatible",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=bs(e);if(!l)return a;const t={...a,presetId:e};return t.name=l.name,t.providerKey=(l.id||l.name||"provider").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-|-$/g,""),t.baseUrl=l.baseUrl,t.websiteUrl=l.websiteUrl||"",t.wireApi=l.wireApi||"openai",t.providerApi="openai-completions",t.gatewaySourceType=l.gatewaySourceType||t.gatewaySourceType||"openai_compatible",Os(t)},fetchModelsForChannel:async(e,a,{forceRefresh:l=!1}={})=>{if(await ks(),a.modelsFetching=!0,a.modelsFetchError=null,a.modelsFetchErrorHint=null,e)try{const t=await ns(e,{forceRefresh:l});a.availableModels=t.models&&t.models.length>0?Ls(t.models):[],t.error&&(a.modelsFetchError=t.error,a.modelsFetchErrorHint=t.errorHint||"请手动填写模型名称")}catch(t){a.availableModels=[],a.modelsFetchError=t.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}else{if(!a.baseUrl)return a.availableModels=[],void(a.modelsFetching=!1);try{const e=await os({baseUrl:a.baseUrl,apiKey:a.apiKey||"",gatewaySourceType:a.gatewaySourceType||"openai_compatible",authMode:"api_key",oauthProviderId:"",model:a.model||null,speedTestModel:a.speedTestModel||null,allowedModels:Array.isArray(a.allowedModels)?a.allowedModels:[],modelRedirects:Array.isArray(a.modelRedirects)?a.modelRedirects:[]});a.availableModels=e.models&&e.models.length>0?Ls(e.models):[],e.error&&(a.modelsFetchError=e.error,a.modelsFetchErrorHint=e.errorHint||"请手动填写模型名称")}catch(t){a.availableModels=[],a.modelsFetchError=t.message||"获取模型列表失败",a.modelsFetchErrorHint="请手动填写模型名称"}finally{a.modelsFetching=!1}}},testFn:ss,api:{fetch:async()=>(await Yt()).channels||[],syncCurrent:Xt,create:async e=>{const a=Ts(e);await es(e.name,e.baseUrl,a.apiKey,{wireApi:e.wireApi||"openai",providerApi:e.providerApi||"openai-completions",providerKey:e.providerKey,authMode:"api_key",oauthProviderId:"",maxConcurrency:Us(e.maxConcurrency),weight:Ps(e.weight),enabled:e.enabled,model:e.model||null,gatewaySourceType:e.gatewaySourceType||"openai_compatible",modelRedirects:e.modelRedirects||[],speedTestModel:e.speedTestModel||null,presetId:e.presetId||null,websiteUrl:e.websiteUrl||"",allowedModels:e.allowedModels||[],balanceToken:a.balanceToken,balanceUserId:a.balanceUserId})},update:async(e,a)=>{const l=Ts(a);await as(e.id,{name:a.name,providerKey:a.providerKey,baseUrl:a.baseUrl,apiKey:l.apiKey,wireApi:a.wireApi||"openai",providerApi:a.providerApi||"openai-completions",authMode:"api_key",oauthProviderId:"",websiteUrl:a.websiteUrl,model:a.model||null,gatewaySourceType:a.gatewaySourceType||"openai_compatible",maxConcurrency:Us(a.maxConcurrency),weight:Ps(a.weight),enabled:a.enabled,modelRedirects:a.modelRedirects||[],speedTestModel:a.speedTestModel||null,presetId:a.presetId||null,allowedModels:a.allowedModels||[],balanceToken:l.balanceToken,balanceUserId:l.balanceUserId})},toggle:async(e,a)=>as(e.id,{enabled:a}),remove:ls,resetHealth:async e=>ts(e.id)},getHeaderTags:(e,a)=>{var l,t;const s=[];return"frozen"===(null==(l=e.health)?void 0:l.status)?s.push({text:a.formatFreeze(e.health.freezeRemaining),type:"error"}):"checking"===(null==(t=e.health)?void 0:t.status)&&s.push({text:"检测中",type:"warning"}),s},buildInfoRows:(e,a)=>{var l;const t=e.ompAuthProvider,s=[{label:"Provider",value:e.providerKey||e.provider||"(未设置)",mono:!0},{label:"API",value:e.providerApi||e.api||"openai-completions",mono:!0},{label:"Model",value:e.model||"(默认)",mono:!0},{label:"Allowed",value:$s(e),mono:!0}];return t&&s.push({label:"Login",value:t.loggedIn?`${t.name||t.id} (${t.accountCount||0})`:`${t.name||t.id} (未登录)`}),s.push({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:"重置状态"}),s}})};function Rs(){return W(["message","dialog"],{configProviderProps:{theme:"dark"===document.documentElement.getAttribute("data-theme")?V:J}})}let Fs=Rs();new MutationObserver(()=>{Fs=Rs()}).observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]});const Hs={success:(...e)=>Fs.message.success(...e),error:(...e)=>Fs.message.error(...e),warning:(...e)=>Fs.message.warning(...e),info:(...e)=>Fs.message.info(...e),loading:(...e)=>Fs.message.loading(...e)},Gs={success:(...e)=>Fs.dialog.success(...e),error:(...e)=>Fs.dialog.error(...e),warning:(...e)=>Fs.dialog.warning(...e),info:(...e)=>Fs.dialog.info(...e),create:(...e)=>Fs.dialog.create(...e)};async function Ks(){return(await ct.get("/ui-config")).data}async function qs(e){return(await ct.post("/ui-config",{config:e})).data}async function Ws(e,a){return(await ct.put(`/ui-config/${e}`,{value:a})).data}async function Vs(e,a,l){return(await ct.put(`/ui-config/${e}/${a}`,{value:l})).data}const Js=Object.freeze(Object.defineProperty({__proto__:null,getUIConfig:Ks,saveUIConfig:qs,updateNestedUIConfig:Vs,updateUIConfigKey:Ws},Symbol.toStringTag,{value:"Module"})),Zs="__ccAdvancedConfigBound__";let Qs=null,Ys=0,Xs=!1,en=null;const an=Object.create(null),ln=new Set;function tn(){const e=new Date;return e.setHours(0,0,0,0),{start:e.getTime(),end:e.getTime()+864e5}}function sn(e,a){if(a.usageMissing)return null;if(void 0!==a.totalTokens&&null!==a.totalTokens)return Number(a.totalTokens)||0;const l=Number(a.inputTokens)||0,t=Number(a.outputTokens)||0,s=Number(a.cacheCreation)||0,n=Number(a.cacheRead)||0;return"claude"===e?l+t+s+n:l+t}function nn(e={}){const a=[e.model,e.redirectedModel,e.modelFromUrl,e.originalModel];for(const l of a)if("string"==typeof l&&l.trim())return l.trim();return""}const on=k("global",()=>{const e=l({running:!1,loading:!1,activeChannel:null,port:20088,runtime:null,startTime:null,defaultPort:20088}),a=l({running:!1,loading:!1,activeChannel:null,port:20089,runtime:null,startTime:null,defaultPort:20089}),s=l({running:!1,loading:!1,activeChannel:null,port:20090,runtime:null,startTime:null,defaultPort:20090}),n=l({running:!1,loading:!1,activeChannel:null,port:20091,runtime:null,startTime:null,defaultPort:20091}),o=l({running:!1,loading:!1,activeChannel:null,port:20092,runtime:null,startTime:null,defaultPort:20092}),i=l([]),r=l([]),c=l([]),u=l([]),d=l([]);function p(){Object.keys(an).forEach(e=>{delete an[e]}),i.value.forEach(e=>{(null==e?void 0:e.name)&&(an[e.name]="claude")}),r.value.forEach(e=>{(null==e?void 0:e.name)&&(an[e.name]="codex")}),c.value.forEach(e=>{(null==e?void 0:e.name)&&(an[e.name]="gemini")}),u.value.forEach(e=>{(null==e?void 0:e.name)&&(an[e.name]="opencode")}),d.value.forEach(e=>{(null==e?void 0:e.name)&&(an[e.name]="omp")})}const v=_({claude:{channels:[],pending:0},codex:{channels:[],pending:0},gemini:{channels:[],pending:0},opencode:{channels:[],pending:0},omp:{channels:[],pending:0}}),m=_({claude:[],codex:[],gemini:[],opencode:[],omp:[]}),f=l(!1),y=l(100),g=l(30);let h=100,b=tn();function w(e){return function(){const e=Date.now();(e<b.start||e>=b.end)&&(b=tn(),P())}(),e>=b.start&&e<b.end}function k(e){for(;e.length>h;)e.pop()}function C(e){h=e,y.value=e,Object.values(m).forEach(k)}function x(e){const a=parseInt(e,10);if(Number.isNaN(a))return;const l=Math.min(Math.max(a,10),300);g.value!==l&&(g.value=l)}function U(e){const a=function(e){var a,l,t,s;if(e.source)return e.source;if("opencode"===e.toolType)return"opencode";if("omp"===e.toolType)return"omp";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(a.includes("omp"))return"omp"}if(e.channel){const a=an[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("omp"))?"omp":(null==(t=e.action)?void 0:t.includes("codex"))?"codex":(null==(s=e.action)?void 0:s.includes("gemini"))?"gemini":"claude"}(e),l=m[a];if(!l)return;const t=e.timestamp||Date.now();if(!w(t))return;const s=e.time||new Date(t).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}),n={id:e.id||`${Date.now()}-${Math.random()}`,source:a,type:e.type||(e.action?"action":"log"),status:e.status||(e.error?"error":"success"),action:e.action||null,channel:e.channel||e.channelName||"Unknown",model:nn(e),originalModel:e.originalModel||null,redirectedModel:e.redirectedModel||null,message:e.message,error:e.error||null,statusCode:e.statusCode||null,stage:e.stage||null,usageMissing:Boolean(e.usageMissing),timestamp:t,time:s,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:sn(a,e)},cost:e.cost||0,isHistory:Xs,isNew:!Xs};l.unshift(n),k(l),n.isNew&&setTimeout(()=>{n.isNew=!1},4500)}function P(){Object.keys(m).forEach(e=>{m[e].splice(0,m[e].length)})}function S(e,a={},l){e.value={...e.value,...a,activeChannel:l||e.value.activeChannel}}function z(e=[],a=[]){if(!Array.isArray(a))return e;const l=new Map(e.filter(e=>null==e?void 0:e.id).map(e=>[e.id,e]));return a.map(e=>{const a=l.get(null==e?void 0:e.id);return a?!Object.prototype.hasOwnProperty.call(e,"apiKey")&&a.apiKey?{...a,...e,apiKey:a.apiKey}:{...a,...e}:e})}function T(l){const{source:t,proxy:v,activeChannel:m,channels:f}=l;"claude"===t?(S(e,v,m),f&&(i.value=z(i.value,f),p())):"codex"===t?(S(a,v,m),f&&(r.value=z(r.value,f),p())):"gemini"===t?(S(s,v,m),f&&(c.value=z(c.value,f),p())):"opencode"===t?(S(n,v,m),f&&(u.value=z(u.value,f),p())):"omp"===t&&(S(o,v,m),f&&(d.value=z(d.value,f),p()))}async function I(){var l,t,i,r,c;try{const[u,d,p,v,m]=await Promise.all([dl.get("/api/proxy/status").catch(()=>({})),dl.get("/api/codex/proxy/status").catch(()=>({})),dl.get("/api/gemini/proxy/status").catch(()=>({})),dl.get("/api/opencode/proxy/status").catch(()=>({})),dl.get("/api/omp/proxy/status").catch(()=>({}))]);(null==(l=u.data)?void 0:l.proxy)&&S(e,u.data.proxy,u.data.activeChannel),(null==(t=d.data)?void 0:t.proxy)&&S(a,d.data.proxy,d.data.activeChannel),(null==(i=p.data)?void 0:i.proxy)&&S(s,p.data.proxy,p.data.activeChannel),(null==(r=v.data)?void 0:r.proxy)&&S(n,v.data.proxy,v.data.activeChannel),(null==(c=m.data)?void 0:c.proxy)&&S(o,m.data.proxy,m.data.activeChannel)}catch(u){}}async function M(){var e,a,l,t,s;try{const[n,o,m,f,y,g,h,b,w,k]=await Promise.all([dl.get("/api/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/codex/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/gemini/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/opencode/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/omp/channels").catch(()=>({data:{channels:[]}})),dl.get("/api/channels/pool/status?source=claude").catch(()=>({data:null})),dl.get("/api/channels/pool/status?source=codex").catch(()=>({data:null})),dl.get("/api/channels/pool/status?source=gemini").catch(()=>({data:null})),dl.get("/api/channels/pool/status?source=opencode").catch(()=>({data:null})),dl.get("/api/channels/pool/status?source=omp").catch(()=>({data:null}))]);i.value=n.data.channels||[],r.value=o.data.channels||[],c.value=m.data.channels||[],u.value=f.data.channels||[],d.value=y.data.channels||[],p(),(null==(e=g.data)?void 0:e.scheduler)&&(v.claude=g.data.scheduler),(null==(a=h.data)?void 0:a.scheduler)&&(v.codex=h.data.scheduler),(null==(l=b.data)?void 0:l.scheduler)&&(v.gemini=b.data.scheduler),(null==(t=w.data)?void 0:t.scheduler)&&(v.opencode=w.data.scheduler),(null==(s=k.data)?void 0:s.scheduler)&&(v.omp=k.data.scheduler)}catch(n){}}function A(l){return"codex"===l?a:"gemini"===l?s:"opencode"===l?n:"omp"===l?o:e}return"undefined"==typeof window||window[Zs]||(window.addEventListener("advanced-config-change",e=>{var a,l;(null==(a=e.detail)?void 0:a.maxLogs)&&C(e.detail.maxLogs),(null==(l=e.detail)?void 0:l.statsInterval)&&x(e.detail.statsInterval)}),window[Zs]=!0),{claudeProxy:e,codexProxy:a,geminiProxy:s,opencodeProxy:n,ompProxy:o,claudeChannels:i,codexChannels:r,geminiChannels:c,opencodeChannels:u,ompChannels:d,schedulerState:v,connectWebSocket:function e(){if(Qs&&Qs.readyState===WebSocket.OPEN)return;const a=`${"https:"===window.location.protocol?"wss:":"ws:"}//${window.location.host}/ws`;try{Qs=new WebSocket(a),Qs.onopen=()=>{Ys=0,f.value=!0,Xs=!0,clearTimeout(en),en=setTimeout(()=>{Xs=!1},2e3),I()},Qs.onmessage=e=>{try{const a=JSON.parse(e.data);"proxy-state"===a.type?T(a):"scheduler-state"===a.type?function(e){const{source:a,scheduler:l}=e;v[a]&&l&&(v[a]=l)}(a):"browser-notification"===a.type?function(e){if("undefined"==typeof window||"undefined"==typeof Notification)return;if("granted"!==Notification.permission)return;const a=e.id||`${e.source||"claude"}-${e.timestamp||Date.now()}`;if(ln.has(a))return;ln.add(a),new Notification(e.title||"coding-tool-x",{body:e.message||"任务已完成",tag:a,icon:"/logo.png"}).onclick=()=>{try{window.focus(),e.url&&window.location.assign(e.url)}catch(a){}}}(a):U(a)}catch(a){}},Qs.onclose=()=>{f.value=!1,Qs=null,Xs=!1,clearTimeout(en);const a=Math.min(1e3*Math.pow(2,Ys),1e4);Ys+=1,setTimeout(e,a)},Qs.onerror=e=>{f.value=!1}}catch(l){f.value=!1}},initializeState:I,loadChannels:M,getProxyState:A,getChannels:function(e){return"codex"===e?r:"gemini"===e?c:"opencode"===e?u:"omp"===e?d:i},getSchedulerState:function(e){return v[e]||{channels:[],pending:0}},handleProxyStateUpdate:T,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":"omp"===e?"/api/omp/proxy/start":"/api/proxy/start";const l=await dl.post(a);if(l.data.success){const a=A(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 s;s="codex"===e?"/api/codex/proxy/stop":"gemini"===e?"/api/gemini/proxy/stop":"opencode"===e?"/api/opencode/proxy/stop":"omp"===e?"/api/omp/proxy/stop":"/api/proxy/stop";const n=await dl.post(s),o=A(e);return o.value.running=!1,o.value.activeChannel=null,o.value.startTime=null,o.value.runtime=null,!1!==(null==(l=n.data)?void 0:l.success)&&await M(),a.refreshChannelsDrawer&&!1!==(null==(t=n.data)?void 0:t.success)&&"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e,reason:"proxy-stop"}})),n.data},getLogs:function(e){return t(()=>m[e]||[])},wsConnected:f,clearLogsState:P,clearLogsForSource:function(e){m[e]&&m[e].splice(0,m[e].length)},logLimit:y,statsInterval:g,loadAdvancedConfig:async function(){try{const e=await fetch("/api/config/advanced");if(e.ok){const a=await e.json();C(a.maxLogs||100),a.statsInterval&&x(a.statsInterval)}}catch(e){}}}});let rn=!1;function cn(e){try{const a=localStorage.getItem(e);if(a)return JSON.parse(a)}catch(a){}return{}}function un(e,a){try{localStorage.setItem(e,JSON.stringify(a))}catch(l){}}function dn(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 pn(e){const a=on();let l=null;const t=_({channels:[],balances:{},loading:!1,syncing:!1,toggling:{},collapsed:cn(e.storageKeys.localCollapse),showDialog:!1,editingChannel:null,showChannelBalance:!1,formData:e.getInitialForm()}),s=_({});function n(){var l;const s=a.schedulerState[e.schedulerSource];(null==(l=null==s?void 0:s.channels)?void 0:l.length)&&t.channels.length&&(t.channels.forEach(e=>{const a=s.channels.find(a=>a.id===e.id);(null==a?void 0:a.health)&&(e.health=a.health)}),u())}const o=C(()=>{var l;return null==(l=a.schedulerState[e.schedulerSource])?void 0:l.channels},n);async function i(){t.loading=!0;try{const a=await e.api.fetch();t.channels=Array.isArray(a)?[...a]:[],await async function(){try{if(t.channels.length>0){const e=[...t.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),l=e.filter(e=>!1===e.enabled);l.forEach(e=>{t.collapsed[e.id]=!0}),t.channels=[...a,...l]}}catch(e){}}(),await r(),n(),u()}catch(a){Hs.error(dn(a,`${e.displayName} 渠道加载失败`))}finally{t.loading=!1}}async function r(){var a;try{const l=await m();if(!0!==(null==(a=null==l?void 0:l.channelBalance)?void 0:a.showRemaining))return t.showChannelBalance=!1,t.formData._showChannelBalance=!1,void(t.balances={});t.showChannelBalance=!0,t.formData._showChannelBalance=!0;const s=await ht(e.type);t.balances=(null==s?void 0:s.enabled)&&s.balances?s.balances:{}}catch(l){t.balances={}}}function c(){l&&(clearTimeout(l),l=null)}function u(){c();const e=t.channels.filter(e=>{var a,l;return"frozen"===(null==(a=e.health)?void 0:a.status)&&Number(null==(l=e.health)?void 0:l.freezeRemaining)>0}).sort((e,a)=>{var l,t;return Number((null==(l=e.health)?void 0:l.freezeRemaining)||0)-Number((null==(t=a.health)?void 0:t.freezeRemaining)||0)})[0];if(!e)return;const a=Math.max(1e3,1e3*Number(e.health.freezeRemaining||0));l=setTimeout(()=>{l=null,i()},a+250)}let d=null,p=0;const v=6e4;async function m(){const e=Date.now();if(d&&e-p<v)return d;try{const a=await Ks();if(a.success&&a.config)return d=a.config,p=e,d}catch(a){}return null}async function f(){try{await Vs("channelCollapse",e.storageKeys.collapseConfigKey,t.collapsed)}catch(a){}}function y(){t.showDialog=!1,t.editingChannel=null,t.formData=e.getInitialForm(),t.formData._showChannelBalance=t.showChannelBalance,g()}function g(){Object.keys(s).forEach(e=>{delete s[e]})}function h(){let a=!0;const l=e=>{const a=e.key.replace(/\./g,"_");delete s[e.key],delete s[a]};return e.formSections.forEach(e=>{const n=(e=>!e.showWhen||e.showWhen(t.formData))(e);e.fields.forEach(e=>{if(!n||!(e=>!e.showWhen||e.showWhen(t.formData))(e))return void l(e);if(e.disabledOnEdit&&t.editingChannel)return void l(e);const o=((e,a)=>{if(!a||"string"!=typeof a||!a.includes("."))return e[a];const l=a.split(".");let t=e;for(const s of l)t=null==t?void 0:t[s];return t})(t.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,t.formData)||""),i?(s[e.key]={status:"error",message:i},a=!1):l(e)})}),a}function b(a={}){const l=Number(a.added||0),t=Number(a.updated||0),s=Number(a.skipped||0);if(l>0||t>0){const a=[];return l>0&&a.push(`新增 ${l} 个`),t>0&&a.push(`更新 ${t} 个`),`${e.displayName} 同步完成:${a.join(",")}`}return s>0?`${e.displayName} 已在列表中,未重复导入`:`${e.displayName} 无需同步`}async function w(){d=null,p=0,await r(),t.formData._showChannelBalance=t.showChannelBalance}return"undefined"!=typeof window&&window.addEventListener("channel-balance-visibility-change",w),Promise.all([i(),async function(){var a;try{const l=await m();if(l){const s=(null==(a=l.channelCollapse)?void 0:a[e.storageKeys.collapseConfigKey])||{};t.collapsed=s,un(e.storageKeys.localCollapse,s)}}catch(l){}}()]),x(()=>{c(),o(),"undefined"!=typeof window&&window.removeEventListener("channel-balance-visibility-change",w)}),{state:t,validation:s,actions:{loadChannels:i,openAddDialog:function(){t.editingChannel=null,t.formData=e.getInitialForm(),t.formData._showChannelBalance=t.showChannelBalance,g(),t.showDialog=!0},closeDialog:y,toggleCollapse:function(a){t.collapsed[a]=!t.collapsed[a],un(e.storageKeys.localCollapse,t.collapsed),f()},handleEdit:function(a){t.editingChannel=a,t.formData=e.mapChannelToForm(a),t.formData._showChannelBalance=t.showChannelBalance,g(),t.showDialog=!0},handleSave:async function(){if(h())try{t.editingChannel?(await e.api.update(t.editingChannel,t.formData),Hs.success(`${e.displayName} 渠道已更新`)):(await e.api.create(t.formData),Hs.success(`${e.displayName} 渠道已添加`)),y(),await i()}catch(a){Hs.error(dn(a))}else Hs.error("请检查表单填写是否完整")},handleDelete:function(a){Gs.warning({title:`删除 ${e.displayName} 渠道`,content:"确定要删除这个渠道吗?",positiveText:"确定",negativeText:"取消",onPositiveClick:async()=>{try{await e.api.remove(a),Hs.success(`${e.displayName} 渠道已删除`),await i()}catch(l){Hs.error(dn(l))}}})},handleToggleEnabled:async function(a,l){if(a&&!t.toggling[a.id]){t.toggling[a.id]=!0;try{const s="boolean"==typeof l?l:!1===a.enabled;await e.api.toggle(a,s),Hs.success(`${e.displayName} 渠道已${s?"启用":"禁用"}`),s?(delete t.collapsed[a.id],un(e.storageKeys.localCollapse,t.collapsed),f()):(t.collapsed[a.id]=!0,un(e.storageKeys.localCollapse,t.collapsed),f()),await i(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e.type}}))}catch(s){Hs.error(dn(s))}finally{t.toggling[a.id]=!1}}},handleSyncCurrentChannels:async function(){if("function"!=typeof e.api.syncCurrent)return Hs.warning(`${e.displayName} 暂不支持同步`),null;if(t.syncing)return null;t.syncing=!0;try{const a=await e.api.syncCurrent();await i(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e.type}}));const l=Array.isArray(null==a?void 0:a.warnings)?a.warnings.filter(Boolean):[];l.length>0&&Hs.warning(l.join(";"));const t=Number((null==a?void 0:a.added)||0),s=Number((null==a?void 0:a.updated)||0);return t>0||s>0?Hs.success(b(a)):Hs.info(b(a)),a}catch(a){return Hs.error(dn(a,`${e.displayName} 同步失败`)),null}finally{t.syncing=!1}},handleApplyToSettings:function(a){"function"==typeof e.api.applyToSettings&&Gs.warning({title:"写入配置",content:"写入配置后会关闭动态切换并默认使用该渠道,是否继续?",positiveText:"确定",negativeText:"取消",onPositiveClick:async()=>{try{await e.api.applyToSettings(a),Hs.success("已将渠道写入配置文件"),await i(),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e.type}}))}catch(l){Hs.error(dn(l))}}})},handleResetHealth:async function(a){if("function"==typeof e.api.resetHealth)try{await e.api.resetHealth(a),Hs.success("渠道健康状态已重置"),await i()}catch(l){Hs.error(dn(l))}},handleRefreshBalance:async function(a){if(null==a?void 0:a.id)try{const l=await bt(e.type,a.id);(null==l?void 0:l.enabled)&&l.balance&&(t.balances[a.id]=l.balance)}catch(l){}}}}}const vn={key:0,class:"loading-container"},mn={key:1},fn={key:0,class:"empty-state"},yn={key:1,class:"channels-list"},gn={class:"section-title"},hn={key:0,class:"section-desc"},bn={key:2,class:"auth-provider-status"},wn={style:{padding:"8px",color:"#d03050","font-size":"12px"}},kn={style:{"font-weight":"500","margin-bottom":"4px"}},_n={key:0,style:{color:"#666","font-size":"11px","line-height":"1.4"}},Cn={style:{padding:"8px",color:"#d03050","font-size":"12px"}},xn={style:{"font-weight":"500","margin-bottom":"4px"}},Un={key:0,style:{color:"#666","font-size":"11px","line-height":"1.4"}},Pn={class:"dialog-footer"},Sn={__name:"BaseChannelPanel",props:{type:{type:String,required:!0}},emits:["open-website"],setup(e,{expose:a,emit:l}){const v=l,w=(Bs[e.type]||Bs.claude)(),{state:k,validation:_,actions:x}=pn(w),{getChannelInflight:T}=function(e="claude"){const a=on();return{getChannelInflight:function(l){var t;const s=null==(t=(a.schedulerState[e]||{channels:[]}).channels)?void 0:t.find(e=>e.id===l);return s?s.inflight:0}}}(w.schedulerSource);async function I(){w.fetchModelsForChannel&&await O({forceRefresh:!0})}C(()=>k.showDialog,async e=>{e&&w.fetchModelsForChannel&&await O()});const M=t(()=>{if(!w.presets)return[];const e={};return w.presets.forEach(a=>{var l;const t=a.category||"custom";e[t]||(e[t]={type:"group",label:(null==(l=w.presetCategories)?void 0:l[t])||t,key:t,children:[]}),e[t].children.push({label:a.name,value:a.id})}),Object.values(e)});async function A(e){if(w.onPresetChange){const a=w.onPresetChange(e,k.formData);Object.assign(k.formData,a)}else k.formData.presetId=e;await O()}async function O({forceRefresh:e=!1}={}){var a;w.fetchModelsForChannel&&await w.fetchModelsForChannel((null==(a=k.editingChannel)?void 0:a.id)||null,k.formData,{forceRefresh:e})}function $(e,a){if(!a.includes("."))return e[a];const l=a.split(".");let t=e;for(const s of l)t=null==t?void 0:t[s];return t}function j(e,a,l){if(!a.includes("."))return void(e[a]=l);const t=a.split(".");let s=e;for(let n=0;n<t.length-1;n++)s[t[n]]||(s[t[n]]={}),s=s[t[n]];s[t[t.length-1]]=l}function L(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 E(e,a){const l=[],t=new Set,s=e=>{for(const a of e||[]){const e=String((null==a?void 0:a.value)||"").trim();if(!e)continue;const s=e.toLowerCase();t.has(s)||(t.add(s),l.push({label:(null==a?void 0:a.label)||e,value:e}))}};s(k.formData.availableModels||[]),s(a||[]);const n=l;if(!e||!n.length)return n;const o=e.toLowerCase();return n.filter(e=>(e.label||e.value||"").toLowerCase().includes(o))}function D(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 N(e){var a,l;const t=e.replace(/\./g,"_");return(null==(a=_[t])?void 0:a.message)||(null==(l=_[e])?void 0:l.message)}function B(e){if("function"!=typeof e.getStatus)return{tags:[],message:""};const a=e.getStatus(k.formData)||{};return{tags:Array.isArray(a.tags)?a.tags:[],message:a.message||"",warning:!0===a.warning}}const K={getChannelInflight:T,getChannelBalance:e=>k.balances[e.id]||null,formatFreeze:e=>`冻结 ${e||0}s`,maskApiKey:e=>void 0===e?"已隐藏":e?e.length<=12?"******":`${e.slice(0,8)}******${e.slice(-4)}`:"(未设置)",handleResetHealth:e=>x.handleResetHealth(e),handleRefreshBalance:e=>x.handleRefreshBalance(e),handleOpenWebsite:e=>v("open-website",e)};function W(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 V(e){switch(e.type){case"password":case"text":default:return ne;case"number":return oe;case"switch":return G;case"radio-group":return le}}function J(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:x.openAddDialog,syncCurrentChannels:x.handleSyncCurrentChannels,refresh:x.loadChannels}),(e,a)=>(n(),s("div",null,[d(k).loading?(n(),s("div",vn,[c(d(Z),{size:"small"})])):(n(),s("div",mn,[0===d(k).channels.length?(n(),s("div",fn,[c(d(Q),{description:d(w).emptyDescription},U({_:2},[d(w).showEmptyAction?{name:"extra",fn:u(()=>[c(d(F),{type:"primary",size:"small",onClick:d(x).openAddDialog},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[h(" "+m(d(w).emptyActionText),1)]),_:1},8,["onClick"])]),key:"0"}:void 0]),1032,["description"])])):(n(),s("div",yn,[(n(!0),s(f,null,y(d(k).channels,e=>(n(),g(ql,{key:e.id,channel:e,collapsed:d(k).collapsed[e.id],"header-tags":d(w).getHeaderTags(e,K),balance:K.getChannelBalance(e),"info-rows":d(w).buildInfoRows(e,K),meta:W(e),"show-apply-button":d(w).showApplyButton,"channel-type":d(w).type,"test-fn":d(w).testFn,toggling:!!d(k).toggling[e.id],onToggleCollapse:a=>d(x).toggleCollapse(e.id),onApply:a=>d(x).handleApplyToSettings(e),onEdit:a=>d(x).handleEdit(e),onDelete:a=>d(x).handleDelete(e.id),onToggleEnabled:a=>d(x).handleToggleEnabled(e,a),onRefreshBalance:a=>d(x).handleRefreshBalance(e),onOpenWebsite:a[0]||(a[0]=e=>v("open-website",e))},null,8,["channel","collapsed","header-tags","balance","info-rows","meta","show-apply-button","channel-type","test-fn","toggling","onToggleCollapse","onApply","onEdit","onDelete","onToggleEnabled","onRefreshBalance"]))),128))]))])),c(d(se),{show:d(k).showDialog,"onUpdate:show":a[5]||(a[5]=e=>d(k).showDialog=e),preset:"card",title:d(k).editingChannel?d(w).editTitle:d(w).addTitle,class:"channel-dialog",style:z({width:d(w).modalWidth+"px",maxHeight:"80vh"}),"content-style":{maxHeight:"calc(80vh - 100px)",overflowY:"auto"}},{footer:u(()=>[o("div",Pn,[c(d(F),{onClick:d(x).closeDialog},{default:u(()=>[...a[6]||(a[6]=[h("取消",-1)])]),_:1},8,["onClick"]),c(d(F),{type:"primary",onClick:d(x).handleSave},{default:u(()=>[h(m(d(k).editingChannel?"保存修改":"添加渠道"),1)]),_:1},8,["onClick"])])]),default:u(()=>[c(d(Y),{"label-placement":"left","label-width":d(w).formLabelWidth,class:"channel-form"},{default:u(()=>[(n(!0),s(f,null,y(d(w).formSections,e=>(n(),s(f,{key:e.title},[!e.showWhen||e.showWhen(d(k).formData)?(n(),s("div",{key:0,class:p(["form-section",{collapsible:e.collapsible}])},[o("div",gn,[h(m(e.title)+" ",1),e.description?(n(),s("span",hn,m(e.description),1)):i("",!0)]),(n(!0),s(f,null,y(e.fields,e=>r((n(),g(d(X),{key:e.key,label:e.label,"label-style":e.fullWidth?{display:"none"}:void 0,required:e.required,"validation-status":D(e.key),feedback:N(e.key)},{default:u(()=>["preset"===e.type?(n(),g(d(ee),{key:0,value:d(k).formData.presetId,options:M.value,placeholder:e.placeholder,"onUpdate:value":A},null,8,["value","options","placeholder"])):"model-redirect"===e.type?(n(),g(rt,{key:1,modelValue:d(k).formData.modelRedirects,"onUpdate:modelValue":a[1]||(a[1]=e=>d(k).formData.modelRedirects=e),"available-models":d(k).formData.availableModels,"channel-type":d(w).type},null,8,["modelValue","available-models","channel-type"])):"auth-provider-status"===e.type?(n(),s("div",bn,[B(e).tags.length>0?(n(),g(d(ae),{key:0,size:"small",class:"auth-provider-tags"},{default:u(()=>[(n(!0),s(f,null,y(B(e).tags,e=>(n(),g(d(H),{key:e.text,size:"small",type:e.type||"default",bordered:!1},{default:u(()=>[h(m(e.text),1)]),_:2},1032,["type"]))),128))]),_:2},1024)):i("",!0),B(e).message?(n(),s("div",{key:1,class:p(["auth-provider-message",{warning:B(e).warning}])},m(B(e).message),3)):i("",!0)])):"model-multi-select"===e.type?(n(),g(d(ee),{key:3,value:d(k).formData.allowedModels,"onUpdate:value":a[2]||(a[2]=e=>d(k).formData.allowedModels=e),options:d(k).formData.availableModels||[],placeholder:e.placeholder,loading:d(k).formData.modelsFetching,multiple:"",filterable:"",clearable:"",tag:"",onFocus:I},null,8,["value","options","placeholder","loading"])):"select"===e.type&&"speedTestModel"===e.key?(n(),g(d(q),{key:4,value:d(k).formData.speedTestModel,options:E(d(k).formData.speedTestModel,e.options),placeholder:e.placeholder,loading:d(k).formData.modelsFetching,"get-show":()=>!0,clearable:"",onFocus:I,"onUpdate:value":a[3]||(a[3]=e=>d(k).formData.speedTestModel=e)},U({_:2},[d(k).formData.modelsFetchError?{name:"empty",fn:u(()=>[o("div",wn,[o("div",kn,m(d(k).formData.modelsFetchError),1),d(k).formData.modelsFetchErrorHint?(n(),s("div",_n,m(d(k).formData.modelsFetchErrorHint),1)):i("",!0)])]),key:"0"}:void 0]),1032,["value","options","placeholder","loading"])):"select"===e.type&&"model"===e.key?(n(),g(d(q),{key:5,value:d(k).formData.model,options:E(d(k).formData.model,e.options),placeholder:e.placeholder,loading:d(k).formData.modelsFetching,"get-show":()=>!0,clearable:"",onFocus:I,"onUpdate:value":a[4]||(a[4]=e=>d(k).formData.model=e)},U({_:2},[d(k).formData.modelsFetchError?{name:"empty",fn:u(()=>[o("div",Cn,[o("div",xn,m(d(k).formData.modelsFetchError),1),d(k).formData.modelsFetchErrorHint?(n(),s("div",Un,m(d(k).formData.modelsFetchErrorHint),1)):i("",!0)])]),key:"0"}:void 0]),1032,["value","options","placeholder","loading"])):"autocomplete"===e.type?(n(),g(d(q),{key:6,value:$(d(k).formData,e.key),options:L($(d(k).formData,e.key)),placeholder:e.placeholder,"get-show":()=>!0,"onUpdate:value":a=>j(d(k).formData,e.key,a)},null,8,["value","options","placeholder","onUpdate:value"])):"radio-group"===e.type?(n(),g(d(le),{key:7,value:$(d(k).formData,e.key),"onUpdate:value":a=>j(d(k).formData,e.key,a)},{default:u(()=>[c(d(ae),null,{default:u(()=>[(n(!0),s(f,null,y(e.options,e=>(n(),g(d(te),{key:e.value,value:e.value},{default:u(()=>[h(m(e.label),1)]),_:2},1032,["value"]))),128))]),_:2},1024)]),_:2},1032,["value","onUpdate:value"])):(n(),g(P(V(e)),S({key:8,value:$(d(k).formData,e.key)},{ref_for:!0},J(e),{"onUpdate:value":a=>j(d(k).formData,e.key,a)}),null,16,["value","onUpdate:value"]))]),_:2},1032,["label","label-style","required","validation-status","feedback"])),[[b,!e.showWhen||e.showWhen(d(k).formData)]])),128))],2)):i("",!0)],64))),128))]),_:1},8,["label-width"])]),_:1},8,["show","title","style"])]))}},zn={__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()},syncCurrentChannels:()=>{var e;return null==(e=o.value)?void 0:e.syncCurrentChannels()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(Sn,{ref_key:"baseRef",ref:o,type:"claude",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},Tn={__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()},syncCurrentChannels:()=>{var e;return null==(e=o.value)?void 0:e.syncCurrentChannels()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(Sn,{ref_key:"baseRef",ref:o,type:"codex",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},In={__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()},syncCurrentChannels:()=>{var e;return null==(e=o.value)?void 0:e.syncCurrentChannels()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(Sn,{ref_key:"baseRef",ref:o,type:"gemini",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},Mn={__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()},syncCurrentChannels:()=>{var e;return null==(e=o.value)?void 0:e.syncCurrentChannels()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(Sn,{ref_key:"baseRef",ref:o,type:"opencode",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}},An={__name:"OmpChannelPanel",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()},syncCurrentChannels:()=>{var e;return null==(e=o.value)?void 0:e.syncCurrentChannels()},refresh:()=>{var e;return null==(e=o.value)?void 0:e.refresh()}}),(e,a)=>(n(),g(Sn,{ref_key:"baseRef",ref:o,type:"omp",onOpenWebsite:a[0]||(a[0]=e=>s("open-website",e))},null,512))}};async function On(){return(await ct.get("/statistics/today")).data}async function $n(){return(await ct.get("/claude/statistics/today")).data}async function jn(){return(await ct.get("/codex/statistics/today")).data}async function Ln(){return(await ct.get("/gemini/statistics/today")).data}async function En(){return(await ct.get("/opencode/statistics/today")).data}async function Dn(){return(await ct.get("/omp/statistics/today")).data}async function Nn(e){return(await ct.get("/statistics/trend",{params:e})).data}async function Bn(e){return(await ct.get("/statistics/filters",{params:e})).data}function Rn(e){return`/api/statistics/trend/export?${new URLSearchParams(e).toString()}`}const Fn=Object.freeze(Object.defineProperty({__proto__:null,getAvailableFilters:Bn,getClaudeTodayStatistics:$n,getCodexTodayStatistics:jn,getDailyStatistics:async function(e){return(await ct.get(`/statistics/daily/${e}`)).data},getGeminiTodayStatistics:Ln,getModelStats:async function(){return(await ct.get("/statistics/models")).data},getModelStatsHistory:async function(e=7){return(await ct.get("/statistics/models/history",{params:{days:e}})).data},getOmpTodayStatistics:Dn,getOpenCodeTodayStatistics:En,getRecentStatistics:async function(e=7){return(await ct.get("/statistics/recent",{params:{days:e}})).data},getStatistics:async function(){return(await ct.get("/statistics/summary")).data},getTodayStatistics:On,getToolModelStats:async function(e){return(await ct.get(`/statistics/models/${e}`)).data},getTrendExportUrl:Rn,getTrendStatistics:Nn},Symbol.toStringTag,{value:"Module"}));async function Hn(){return(await ct.post("/proxy/logs/clear")).data}const Gn=Object.freeze(Object.defineProperty({__proto__:null,clearProxyLogs:Hn,getCodexProxyStatus:async function(){return(await ct.get("/codex/proxy/status")).data},getGeminiProxyStatus:async function(){return(await ct.get("/gemini/proxy/status")).data},getProxyStatus:async function(){return(await ct.get("/proxy/status")).data},startCodexProxy:async function(){return(await ct.post("/codex/proxy/start")).data},startGeminiProxy:async function(){return(await ct.post("/gemini/proxy/start")).data},startProxy:async function(){return(await ct.post("/proxy/start")).data},stopCodexProxy:async function(){return(await ct.post("/codex/proxy/stop")).data},stopGeminiProxy:async function(){return(await ct.post("/gemini/proxy/stop")).data},stopProxy:async function(){return(await ct.post("/proxy/stop")).data}},Symbol.toStringTag,{value:"Module"}));function Kn(){const e=on(),{claudeProxy:a,codexProxy:l,geminiProxy:t,opencodeProxy:s,ompProxy:n,claudeChannels:o,codexChannels:i,geminiChannels:r,opencodeChannels:c,ompChannels:u,wsConnected:d,logLimit:p,statsInterval:v}=T(e);return{claudeProxy:a,codexProxy:l,geminiProxy:t,opencodeProxy:s,ompProxy:n,claudeChannels:o,codexChannels:i,geminiChannels:r,opencodeChannels:c,ompChannels:u,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:d,clearLogsState:e.clearLogsState,clearLogsForSource:e.clearLogsForSource,logLimit:p,statsInterval:v,loadAdvancedConfig:e.loadAdvancedConfig}}const qn={class:"proxy-logs"},Wn={class:"logs-header"},Vn={class:"header-left"},Jn={class:"today-stats"},Zn={class:"logs-table"},Qn={key:0,class:"empty-state"},Yn={class:"action-message"},Xn={class:"action-time"},eo={class:"action-message"},ao={class:"action-time"},lo=["title"],to={key:0},so={style:{"font-family":"monospace","font-size":"12px"}},no={key:0,style:{"margin-top":"4px"}},oo={style:{"font-family":"monospace","font-size":"12px"}},io={key:1,style:{"margin-top":"6px",color:"#d97706","font-size":"12px"}},ro={key:1},co={class:"logs-footer"},uo={class:"count"},po=zl({__name:"ProxyLogs",props:{source:{type:String,default:"claude"}},setup(e){const a=e,{getLogs:r,wsConnected:v,clearLogsState:b,logLimit:k}=Kn(),_={claude:r("claude"),codex:r("codex"),gemini:r("gemini"),opencode:r("opencode")},U=t(()=>((_[a.source]||_.claude).value||[]).slice(0,k.value));l(U.value.length);const S=l(null),z=l({requests:0,tokens:0});let T=null,M=null;function A(e,a){var l;return e.usageMissing?"--":(null==(l=e.tokens)?void 0:l[a])||0}async function O(){var e,l,t,s,n,o;try{if("opencode"===a.source){const a=await En();return void(z.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})}if("claude"===a.source){const e=await $n();return void(z.value={requests:(null==(t=null==e?void 0:e.summary)?void 0:t.requests)||0,tokens:(null==(s=null==e?void 0:e.summary)?void 0:s.tokens)||0})}const i=await On(),r="gemini"===a.source?"gemini":"codex",c=null==(n=i.byToolType)?void 0:n[r];z.value=c?{requests:c.requests||0,tokens:(null==(o=c.tokens)?void 0:o.total)||0}:{requests:0,tokens:0}}catch(i){}}async function $(){try{await Hn(),b(),Hs.success("日志已清空")}catch(e){Hs.error("清空失败: "+e.message)}}return C(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)&&I(()=>{S.value&&(S.value.scrollTop=0)})}),C(()=>a.source,()=>{var e;O(),M=(null==(e=U.value[0])?void 0:e.id)||null}),w(()=>{O(),T=setInterval(()=>{O()},3e4)}),x(()=>{T&&(clearInterval(T),T=null)}),(a,l)=>(n(),s("div",qn,[o("div",Wn,[o("div",Vn,[l[0]||(l[0]=o("h3",{class:"title"},"实时日志",-1)),o("div",Jn,[c(d(H),{size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(" 今日请求: "+m(z.value.requests),1)]),_:1}),c(d(H),{size:"tiny",bordered:!1,type:"success"},{default:u(()=>{return[h(" 今日Token: "+m((e=z.value.tokens,e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(1)+"K":e.toString())),1)];var e}),_:1})])]),c(d(F),{text:"",size:"small",onClick:$},{default:u(()=>[c(d(R),{size:"16"},{default:u(()=>[c(d(qe))]),_:1}),l[1]||(l[1]=h(" 清空 ",-1))]),_:1})]),o("div",Zn,[o("div",{class:p(["table-header",`table-header-${e.source}`])},[o("div",{class:p(["col col-channel",`col-channel-${e.source}`])},"渠道",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"请求",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"回复",2),"claude"===e.source?(n(),s(f,{key:0},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},"写入",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"命中",2)],64)):"codex"===e.source?(n(),s(f,{key:1},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},"推理",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"缓存",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):"gemini"===e.source?(n(),s(f,{key:2},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},"缓存",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):"opencode"===e.source?(n(),s(f,{key:3},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},"推理",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"缓存",2),o("div",{class:p(["col col-token",`col-token-${e.source}`])},"总计",2)],64)):i("",!0),o("div",{class:p(["col col-time",`col-time-${e.source}`])},"时间",2)],2),o("div",{class:"table-body",ref_key:"tableBody",ref:S},[0===U.value.length?(n(),s("div",Qn," 暂无日志 ")):i("",!0),(n(!0),s(f,null,y(U.value,a=>(n(),s("div",{key:a.id,class:p(["action"===a.type?"action-row":"error"===a.status?"error-row":"table-row",{"new-log":a.isNew}])},["action"===a.type?(n(),s(f,{key:0},[c(d(R),{size:"16",style:{color:"#18a058","margin-right":"8px"}},{default:u(()=>[c(d(We))]),_:1}),o("span",Yn,m(a.message),1),o("span",Xn,m(a.time),1)],64)):"error"===a.status?(n(),s(f,{key:1},[c(d(R),{size:"16",style:{color:"#d03050","margin-right":"8px"}},{default:u(()=>[c(d(Ve))]),_:1}),o("span",eo,m(a.channel)+": "+m(a.error||a.message||"请求失败"),1),o("span",ao,m(a.time),1)],64)):(n(),g(d(ie),{key:2,placement:"top",style:{maxWidth:"300px"}},{trigger:u(()=>[o("div",{class:p(["table-row-content",`table-row-content-${e.source}`])},[o("div",{class:p(["col col-channel",`col-channel-${e.source}`]),title:a.channel},[c(d(H),{size:"small",type:"success"},{default:u(()=>[h(m(a.channel),1)]),_:2},1024)],10,lo),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"input")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"output")),3),"claude"===e.source?(n(),s(f,{key:0},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cacheCreation")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cacheRead")),3)],64)):"codex"===e.source?(n(),s(f,{key:1},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"reasoning")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cached")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"total")),3)],64)):"gemini"===e.source?(n(),s(f,{key:2},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cached")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"total")),3)],64)):"opencode"===e.source?(n(),s(f,{key:3},[o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"reasoning")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"cached")),3),o("div",{class:p(["col col-token",`col-token-${e.source}`])},m(A(a,"total")),3)],64)):i("",!0),o("div",{class:p(["col col-time",`col-time-${e.source}`])},m(a.time),3)],2)]),default:u(()=>[a.model?(n(),s("div",to,[l[3]||(l[3]=o("div",{style:{"font-weight":"600","margin-bottom":"4px"}},"模型信息",-1)),o("div",so,m(a.model),1),a.originalModel&&a.originalModel!==a.model?(n(),s("div",no,[l[2]||(l[2]=o("div",{style:{"font-weight":"600","margin-bottom":"4px"}},"模型重定向",-1)),o("div",oo,m(a.originalModel)+" → "+m(a.model),1)])):i("",!0),a.usageMissing?(n(),s("div",io," 上游响应未返回 usage,当前仅确认实际模型,无法计算 token。 ")):i("",!0)])):(n(),s("div",ro,"暂无模型信息"))]),_:2},1024))],2))),128))],512)]),o("div",co,[o("span",{class:p(["status",{connected:d(v)}])},[c(d(R),{size:"14"},{default:u(()=>[(n(),g(P(d(v)?d(We):d(Ve))))]),_:1}),h(" "+m(d(v)?"已连接":"未连接"),1)],2),o("span",uo,"共 "+m(U.value.length)+" 条",1)])]))}},[["__scopeId","data-v-deb41f23"]]);async function vo(e=!1,a="claude"){return(await ct.get("/skills",{params:{refresh:e?"1":"",platform:a}})).data}async function mo(e,a,l=null,t="claude"){return(await ct.post("/skills/install",{directory:e,repo:a,fullDirectory:l,platform:t})).data}async function fo(e,a="claude"){return(await ct.post("/skills/uninstall",{directory:e,platform:a})).data}async function yo(e,a="claude"){return(await ct.post("/skills/repos",{...e,platform:a})).data}async function go(e,a={},l="claude"){return(await ct.put("/skills/repos/auth",{id:e.id||"",owner:e.owner||"",name:e.name||"",directory:e.directory||"",token:a.token||"",clearToken:!!a.clearToken,platform:l})).data}async function ho(){return(await ct.get("/oauth-credentials")).data}async function bo(e,a){return(await ct.post(`/oauth-credentials/${e}/${a}/disable-native`)).data}const wo={class:"right-panel"},ko={class:"toolbar-section"},_o={class:"toolbar-left"},Co={class:"toolbar-right"},xo={key:0,class:"oauth-banner"},Uo={class:"panel-header"},Po={class:"header-title"},So={class:"header-actions"},zo={class:"channels-scroll-area"},To=zl({__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 r=M(),v=e,y=a,b=t(()=>r.meta.channel||"claude"),k=l(null),_=l(null),U=l(null),P=l(null),S=l(null),z=l(!1),T=l(0),I=l({}),A=["claude","codex","gemini","opencode","omp"],O=["claude","codex","opencode","omp"],$=["claude","codex","gemini","opencode"],j=t(()=>A.includes(b.value)),L=j,E=j,D=t(()=>O.includes(b.value)),N=t(()=>$.includes(b.value)),B=t(()=>{var e,a;const l=b.value,t=null==(a=null==(e=I.value)?void 0:e[l])?void 0:a.nativeState;return!(!(null==t?void 0:t.oauthPresent)||"oauth"!==(null==t?void 0:t.mode))}),q=t(()=>"opencode"===b.value?"检测到 OAuth 凭证。OpenCode 支持保留 OAuth 与 API providers 并存。":"当前由 OAuth 控制。写入渠道或开启动态切换时,会自动退出 OAuth 控制。");async function W(){try{const e=await ho();I.value=e.tools||{}}catch{}}function V(){window.dispatchEvent(new CustomEvent("open-oauth-credentials-drawer"))}async function J(){if(j.value)try{const e=await vo(!1,b.value);e.success&&e.skills&&(T.value=e.skills.filter(e=>e.installed).length)}catch(e){}else T.value=0}const Z={claude:k,codex:_,gemini:U,opencode:P,omp:S},Q={claude:"Claude 渠道管理",codex:"Codex 渠道管理",gemini:"Gemini 渠道管理",opencode:"OpenCode 渠道管理",omp:"OMP 渠道管理"},Y=t(()=>Q[b.value]||"Claude 渠道管理");function X(e){window.open(e,"_blank")}function ee(){var e,a,l;null==(l=null==(a=null==(e=Z[b.value])?void 0:e.value)?void 0:a.openAddDialog)||l.call(a)}async function ae(){var e;const a=null==(e=Z[b.value])?void 0:e.value;if((null==a?void 0:a.syncCurrentChannels)&&!z.value){z.value=!0;try{await a.syncCurrentChannels()}finally{z.value=!1}}}function le(e){var a;const l=null==(a=null==e?void 0:e.detail)?void 0:a.channel;l&&l!==b.value||function(e=b.value){var a,l,t;null==(t=null==(l=null==(a=Z[e])?void 0:a.value)?void 0:l.refresh)||t.call(l)}(),W()}function te(e){y("proxy-toggle",e)}function se(){y("show-recent")}function ne(e){var a,l;null==(l=null==(a=null==e?void 0:e.currentTarget)?void 0:a.blur)||l.call(a)}function oe(e){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:b.value}})),ne(e)}function re(e){window.dispatchEvent(new CustomEvent("open-commands-drawer",{detail:{platform:b.value}})),ne(e)}function ce(e){window.dispatchEvent(new CustomEvent("open-agents-drawer",{detail:{platform:b.value}})),ne(e)}function ue(e){window.dispatchEvent(new CustomEvent("open-plugins-drawer",{detail:{platform:b.value}})),ne(e)}return w(()=>{J(),W(),"undefined"!=typeof window&&window.addEventListener("channel-management-refresh",le)}),C(()=>b.value,()=>{J(),W()}),C(()=>v.proxyRunning,()=>{W()}),x(()=>{"undefined"!=typeof window&&window.removeEventListener("channel-management-refresh",le)}),(a,l)=>(n(),s("div",wo,[o("div",ko,[o("div",_o,[c(d(K),{depth:"3",class:"toolbar-label"},{default:u(()=>[...l[0]||(l[0]=[h("动态切换",-1)])]),_:1}),c(d(G),{value:e.proxyRunning,loading:e.proxyLoading,disabled:e.proxyLoading,size:"small","onUpdate:value":te},null,8,["value","loading","disabled"]),j.value&&T.value>0?(n(),g(d(H),{key:0,type:"success",size:"small",bordered:!1},{default:u(()=>[h(m(T.value)+" 技能 ",1)]),_:1})):i("",!0)]),o("div",Co,[d(L)?(n(),g(d(ie),{key:0,trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:oe},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Je))]),_:1})]),_:1})]),default:u(()=>[l[1]||(l[1]=h(" Skills 技能 ",-1))]),_:1})):i("",!0),D.value?(n(),g(d(ie),{key:1,trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:ue},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Ze))]),_:1})]),_:1})]),default:u(()=>[l[2]||(l[2]=h(" Plugins 插件 ",-1))]),_:1})):i("",!0),d(E)||N.value?(n(),s(f,{key:2},[d(E)?(n(),g(d(ie),{key:0,trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:re},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Qe))]),_:1})]),_:1})]),default:u(()=>[l[3]||(l[3]=h(" Commands 命令 ",-1))]),_:1})):i("",!0),N.value?(n(),g(d(ie),{key:1,trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:ce},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Ye))]),_:1})]),_:1})]),default:u(()=>[l[4]||(l[4]=h(" Agents 代理 ",-1))]),_:1})):i("",!0)],64)):i("",!0),l[6]||(l[6]=o("div",{class:"toolbar-divider"},null,-1)),c(d(ie),{trigger:"hover"},{trigger:u(()=>[c(d(F),{text:"",size:"small",class:"toolbar-btn",onClick:se},{icon:u(()=>[c(d(R),{size:18},{default:u(()=>[c(d(Xe))]),_:1})]),_:1})]),default:u(()=>[l[5]||(l[5]=h(" 最新对话 ",-1))]),_:1})])]),B.value?(n(),s("div",xo,[c(d(R),{size:14,color:"#2080f0"},{default:u(()=>[c(d(ea))]),_:1}),o("span",null,m(q.value),1),c(d(F),{text:"",size:"small",type:"primary",onClick:V},{default:u(()=>[...l[7]||(l[7]=[h(" 凭证管理 → ",-1)])]),_:1})])):i("",!0),e.showChannels?(n(),s("div",{key:1,class:p(["channels-section",{"full-height":!e.showLogs||!e.proxyRunning}])},[o("div",Uo,[o("div",Po,[o("h3",null,m(Y.value),1),c(d(K),{depth:"3",class:"header-hint"},{default:u(()=>[...l[8]||(l[8]=[h("启用渠道优先显示",-1)])]),_:1})]),o("div",So,[c(d(F),{secondary:"",size:"small",loading:z.value,disabled:z.value,onClick:ae},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(aa))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 同步 ",-1))]),_:1},8,["loading","disabled"]),c(d(F),{type:"primary",size:"small",onClick:ee},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[10]||(l[10]=h(" 添加 ",-1))]),_:1})])]),o("div",zo,["claude"===b.value?(n(),g(zn,{key:0,ref_key:"claudePanelRef",ref:k,onOpenWebsite:X},null,512)):"codex"===b.value?(n(),g(Tn,{key:1,ref_key:"codexPanelRef",ref:_,onOpenWebsite:X},null,512)):"gemini"===b.value?(n(),g(In,{key:2,ref_key:"geminiPanelRef",ref:U,onOpenWebsite:X},null,512)):"opencode"===b.value?(n(),g(Mn,{key:3,ref_key:"opencodePanelRef",ref:P,onOpenWebsite:X},null,512)):"omp"===b.value?(n(),g(An,{key:4,ref_key:"ompPanelRef",ref:S,onOpenWebsite:X},null,512)):i("",!0)])],2)):i("",!0),e.showLogs?(n(),s("div",{key:2,class:p(["logs-section",{"full-height":!e.showChannels}])},[c(po,{source:b.value},null,8,["source"])],2)):i("",!0)]))}},[["__scopeId","data-v-d6b1d30d"]]),Io={class:"session-left"},Mo={class:"session-icon"},Ao={class:"session-info"},Oo={class:"session-header"},$o={class:"session-title-row"},jo={class:"session-title"},Lo={class:"session-meta"},Eo={class:"meta-item"},Do={key:0,class:"session-message"},No={key:1,class:"session-path"},Bo={class:"session-actions"},Ro=zl({__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 r=e,p=l(!1),v=t(()=>r.session.alias?`${r.session.alias} (${r.session.sessionId.substring(0,8)})`:r.session.sessionId);function f(e){const a=new Date(e),l=new Date-a,t=Math.floor(l/6e4),s=Math.floor(l/36e5),n=Math.floor(l/864e5);return t<1?"刚刚":t<60?`${t}分钟前`:s<24?`${s}小时前`:n<7?`${n}天前`:a.toLocaleDateString("zh-CN")}function y(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(),s("div",{class:"session-item",onMouseenter:l[4]||(l[4]=e=>p.value=!0),onMouseleave:l[5]||(l[5]=e=>p.value=!1)},[o("div",Io,[o("div",Mo,[c(d(R),{size:"24",color:"#18a058"},{default:u(()=>[c(d(la))]),_:1})]),o("div",Ao,[o("div",Oo,[o("div",$o,[e.showProject&&e.session.projectDisplayName?(n(),g(d(H),{key:0,size:"small",type:"info",bordered:!1,style:{"margin-right":"8px"}},{default:u(()=>[h(m(e.session.projectDisplayName),1)]),_:1})):i("",!0),o("span",jo,m(v.value),1),e.session.forkedFrom?(n(),g(d(ie),{key:1,placement:"top"},{trigger:u(()=>[c(d(H),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ta))]),_:1})]),default:u(()=>[l[6]||(l[6]=h(" Fork ",-1))]),_:1})]),default:u(()=>[o("span",null,"Fork 自 "+m(e.session.forkedFrom),1)]),_:1})):i("",!0)]),o("div",Lo,[o("span",Eo,[c(d(R),{size:"14"},{default:u(()=>[c(d(sa))]),_:1}),h(" "+m(f(e.session.mtime)),1)]),c(d(H),{size:"small",bordered:!1,type:"info"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(na))]),_:1})]),default:u(()=>[h(" "+m(y(e.session.size)),1)]),_:1}),e.session.gitBranch?(n(),g(d(H),{key:0,size:"small",bordered:!1,type:"success"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ta))]),_:1})]),default:u(()=>[h(" "+m(e.session.gitBranch),1)]),_:1})):i("",!0)])]),e.session.firstMessage?(n(),s("div",Do,m(e.session.firstMessage),1)):i("",!0),e.showProject&&e.session.projectFullPath?(n(),s("div",No," 路径: "+m(e.session.projectFullPath),1)):i("",!0)])]),o("div",Bo,[c(d(F),{size:"small",onClick:l[0]||(l[0]=l=>a.$emit("set-alias",e.session))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(oa))]),_:1})]),default:u(()=>[l[7]||(l[7]=h(" 别名 ",-1))]),_:1}),c(d(F),{type:"primary",size:"small",onClick:l[1]||(l[1]=l=>a.$emit("launch",e.session))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qe))]),_:1})]),default:u(()=>[l[8]||(l[8]=h(" 使用对话 ",-1))]),_:1}),e.hideFork?i("",!0):(n(),g(d(F),{key:0,size:"small",onClick:l[2]||(l[2]=l=>a.$emit("fork",e.session))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ta))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" Fork ",-1))]),_:1})),e.hideDelete?i("",!0):(n(),g(d(F),{key:1,size:"small",type:"error",onClick:l[3]||(l[3]=l=>a.$emit("delete",e.session))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1})),A(a.$slots,"actions-extra",{},void 0,!0)])],32))}},[["__scopeId","data-v-32d1b310"]]);async function Fo(e,a={}){var l;const t=String(e||"");if(!t)throw new Error("没有可复制的内容");const{manualFallback:s=!0}=a;let n=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){n=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(s&&function(e){return"undefined"!=typeof window&&"function"==typeof window.prompt&&(window.prompt("自动复制失败,请手动复制以下内容:",e),!0)}(t))return{copied:!1,method:"manual",error:n||null};throw n||new Error("当前环境不支持自动复制,请手动复制命令")}async function Ho(e,a="claude"){const l=ut(a);return(await ct.get(`${l}/sessions/${e}`)).data}async function Go(e,a){return(await ct.post("/aliases",{sessionId:e,alias:a})).data}async function Ko(e){return(await ct.delete(`/aliases/${e}`)).data}async function qo(e,a,l="claude"){const t=ut(l);return(await ct.delete(`${t}/sessions/${e}/${a}`)).data}async function Wo(e,a,l="claude"){const t=ut(l);return(await ct.post(`${t}/sessions/${e}/batch-delete`,{sessionIds:a})).data}async function Vo(e,a,l="claude",t={}){const s=ut(l);return(await ct.post(`${s}/sessions/${e}/${a}/fork`,t)).data}async function Jo(e,a,l="claude"){const t=ut(l);return(await ct.post(`${t}/sessions/${e}/order`,{order:a})).data}async function Zo(e,a,l=15,t="claude"){const s=ut(t);return(await ct.get(`${s}/sessions/${e}/search`,{params:{keyword:a,context:l}})).data}async function Qo(e,a=35,l="claude"){const t=ut(l);return(await ct.get(`${t}/sessions/search/global`,{params:{keyword:e,context:a}})).data}async function Yo(e,a,l="claude"){const t=ut(l);return(await ct.post(`${t}/sessions/${e}/${a}/launch`)).data}function Xo(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 ei(e,a,l="claude"){const t=await Yo(e,a,l),s=Xo(t);if(!s)throw new Error("未获取到可复制的启动命令");return{text:s,data:t,copyResult:await Fo(s)}}async function ai(e,a,l=1,t=20,s="desc",n="claude"){const o=ut(n);return(await ct.get(`${o}/sessions/${e}/${a}/messages`,{params:{page:l,limit:t,order:s}})).data}async function li(e,a,l="claude"){const t=ut(l);return(await ct.get(`${t}/sessions/${e}/${a}/outline`)).data}async function ti(e,a,l="claude"){const t=ut(l);return(await ct.get(`${t}/sessions/${e}/${a}/status`)).data}async function si(e=5,a="claude"){const l=ut(a);return(await ct.get(`${l}/sessions/recent/list?limit=${e}`)).data}const ni=Object.freeze(Object.defineProperty({__proto__:null,copySessionLaunchCommand:ei,createSession:async function(e,a="claude"){return(await ct.post(`/sessions/${e}/create`,{toolType:a})).data},deleteAlias:Ko,deleteSession:qo,deleteSessions:Wo,forkSession:Vo,formatLaunchCommandForCopy:Xo,getRecentSessions:si,getSessionLaunchCommand:Yo,getSessionMessages:ai,getSessionOutline:li,getSessionStatus:ti,getSessions:Ho,launchSession:async function(e,a,l=!1,t="claude"){const s=ut(t);return(await ct.post(`${s}/sessions/${e}/${a}/launch`,{fork:l})).data},saveSessionOrder:Jo,searchSessions:Zo,searchSessionsGlobally:Qo,setAlias:Go},Symbol.toStringTag,{value:"Module"}));function oi(e=520,a=null){const s=l("undefined"!=typeof window?window.innerWidth:1200),n=()=>{s.value=window.innerWidth};w(()=>{window.addEventListener("resize",n)}),x(()=>{window.removeEventListener("resize",n)});const o=t(()=>s.value<640),i=t(()=>s.value>=640&&s.value<1024);return{drawerWidth:t(()=>{if(s.value<640)return"100%";if(s.value<768)return Math.min(.95*s.value,e);if(s.value<1024){const l=a||e;return Math.min(.85*s.value,l)}return e}),isMobile:o,isTablet:i,windowWidth:s}}const ii={key:0,class:"loading-container"},ri={key:1,class:"sessions-list"},ci=zl({__name:"RecentSessionsDrawer",props:{visible:{type:Boolean,default:!1},channel:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:o}=oi(720),i=e,r=a,p=l(!1),v=l([]),m=l(!1),b=t(()=>i.channel);async function w(){m.value=!0;try{const e=await si(10,i.channel);v.value=e.sessions}catch(e){Hs.error("加载失败: "+e.message)}finally{m.value=!1}}async function k(e){const a=e.alias||"";let l=a;const t=await new Promise(e=>{const t=Gs.create({title:"设置别名",content:()=>O(ne,{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 Go(e.sessionId,t),Hs.success("别名设置成功")):(await Ko(e.sessionId),Hs.success("别名已删除")),await w()}catch(s){Hs.error("操作失败: "+s.message)}}async function _(e){try{const{copyResult:a}=await ei(e.projectName,e.sessionId,i.channel);if("manual"===(null==a?void 0:a.method))return void Hs.warning("自动复制失败,已弹出手动复制框");Hs.success("启动命令已复制到剪贴板")}catch(a){Hs.error("复制失败: "+a.message)}}return C(()=>i.visible,e=>{p.value=e,e&&w()}),C(p,e=>{r("update:visible",e)}),C(()=>i.channel,()=>{p.value&&w()}),(e,a)=>(n(),g(d(ce),{show:p.value,"onUpdate:show":a[0]||(a[0]=e=>p.value=e),width:d(o),placement:"right","show-close":!0},{default:u(()=>[c(d(re),{title:"claude"===i.channel?"Claude 最新对话":"codex"===i.channel?"Codex 最新对话":"gemini"===i.channel?"Gemini 最新对话":"opencode"===i.channel?"OpenCode 最新对话":"omp"===i.channel?"OMP 最新对话":"最新对话","native-scrollbar":!1,closable:""},{default:u(()=>[m.value?(n(),s("div",ii,[c(d(Z),{size:"medium"},{description:u(()=>[...a[1]||(a[1]=[h("加载中...",-1)])]),_:1})])):v.value.length>0?(n(),s("div",ri,[(n(!0),s(f,null,y(v.value,e=>(n(),g(Ro,{key:e.sessionId,session:e,channel:b.value,"show-project":!0,"hide-fork":!0,"hide-delete":!0,onSetAlias:k,onLaunch:_},null,8,["session","channel"]))),128))])):(n(),g(d(Q),{key:2,description:"暂无最近使用的会话",style:{"margin-top":"60px"}},{icon:u(()=>[c(d(R),{size:"48"},{default:u(()=>[c(d(Xe))]),_:1})]),_:1}))]),_:1},8,["title"])]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b7e63ff8"]]);async function ui(){return(await ct.get("/favorites")).data}async function di(e,a){return(await ct.post("/favorites",{channel:e,sessionData:a})).data}async function pi(e,a,l){return(await ct.delete(`/favorites/${e}/${encodeURIComponent(a)}/${l}`)).data}const vi=Object.freeze(Object.defineProperty({__proto__:null,addFavorite:di,checkFavorite:async function(e,a,l){return(await ct.get(`/favorites/check/${e}/${encodeURIComponent(a)}/${l}`)).data},getAllFavorites:ui,getFavorites:async function(e){return(await ct.get(`/favorites/${e}`)).data},removeFavorite:pi},Symbol.toStringTag,{value:"Module"})),mi=k("favorites",()=>{const e=l({claude:[],codex:[],gemini:[]}),a=l(!1),s=l(!1);let n=null;const o=t(()=>{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:o,isLoaded:a,loading:s,loadFavorites:async function(l=!1){if(a.value&&!l)return e.value;if(n&&!l)return n;let t=null;return t=(async()=>{s.value=!0;try{const l=await ui();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{s.value=!1,n===t&&(n=null)}})(),n=t,t},addFavorite:async function(a,l){try{const t=await di(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 s=await pi(a,l,t);if(s.success&&s.favorites)return e.value=s.favorites,!0}catch(s){}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 fi(){const e=mi(),{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 yi(e="claude"){const a=ut(e);return(await ct.get(`${a}/projects`)).data}async function gi(e,a="claude"){const l=ut(a);return(await ct.post(`${l}/projects/order`,{order:e})).data}async function hi(e,a="claude"){const l=ut(a);return(await ct.delete(`${l}/projects/${e}`)).data}const bi=Object.freeze(Object.defineProperty({__proto__:null,createProject:async function(e,a,l="claude"){const t=ut(l);return(await ct.post(`${t}/projects/create`,{projectName:e,projectPath:a})).data},deleteProject:hi,getProjects:yi,saveProjectOrder:gi},Symbol.toStringTag,{value:"Module"})),wi=new Map,ki=new Map;function _i(e,a){return`${e}:${a}`}function Ci(e,a){wi.set(e,{timestamp:Date.now(),payload:a})}function xi(e,a,l){ki.set(_i(e,a),{timestamp:Date.now(),payload:l})}function Ui(e,a){a?ki.delete(_i(e,a)):Array.from(ki.keys()).filter(a=>a.startsWith(`${e}:`)).forEach(e=>ki.delete(e))}const Pi=k("sessions",()=>{const e=l([]),a=l(null),s=l(null),n=l([]),o=l({}),i=l(0),r=l(!1),c=l(null),u=l("claude"),d=t(()=>n.value.map(e=>({...e,alias:o.value[e.sessionId]||null})));function p(){a.value&&(i.value=n.value.reduce((e,a)=>e+(Number(a.size)||0),0),xi(u.value,a.value,{sessions:n.value,aliases:o.value,totalSize:i.value,projectInfo:s.value}))}async function v(e,{force:l=!1}={}){r.value=!0,c.value=null;try{if(!l){const l=function(e,a){const l=_i(e,a),t=ki.get(l);return t?Date.now()-t.timestamp>2e4?(ki.delete(l),null):t.payload:null}(u.value,e);if(l)return n.value=l.sessions||[],o.value=l.aliases||{},i.value=l.totalSize||0,a.value=e,s.value=l.projectInfo||null,void(r.value=!1)}const t=await Ho(e,u.value);n.value=t.sessions,o.value=t.aliases,i.value=t.totalSize||0,a.value=e,s.value=t.projectInfo,xi(u.value,e,{sessions:t.sessions,aliases:t.aliases,totalSize:t.totalSize,projectInfo:t.projectInfo})}catch(t){c.value=t.message}finally{r.value=!1}}return{projects:e,currentProject:a,currentProjectInfo:s,sessions:n,aliases:o,totalSize:i,loading:r,error:c,currentChannel:u,sessionsWithAlias:d,setChannel:function(e){u.value=e},fetchProjects:async function({force:l=!1}={}){var t,s;r.value=!0,c.value=null;try{if(!l){const l=function(e){const a=wi.get(e);return a?Date.now()-a.timestamp>3e4?(wi.delete(e),null):a.payload:null}(u.value);if(l)return e.value=l.projects||[],a.value=l.currentProject||(null==(s=null==(t=l.projects)?void 0:t[0])?void 0:s.name)||null,void(r.value=!1)}const n=await yi(u.value);e.value=n.projects,a.value=n.currentProject,Ci(u.value,{projects:n.projects,currentProject:n.currentProject}),Ui(u.value)}catch(n){c.value=n.message}finally{r.value=!1}},fetchSessions:v,setAlias:async function(e,a){try{await Go(e,a),o.value[e]=a}catch(l){throw c.value=l.message,l}},deleteAlias:async function(e){try{await Ko(e),delete o.value[e]}catch(a){throw c.value=a.message,a}},deleteSession:async function(e){try{await qo(a.value,e,u.value),n.value=n.value.filter(a=>a.sessionId!==e),o.value[e]&&delete o.value[e],p()}catch(l){throw c.value=l.message,l}},deleteSessions:async function(e=[]){const l=Array.from(new Set((e||[]).filter(Boolean)));if(0===l.length)return{deletedSessionIds:[],failed:[]};let t=[],s=[];try{const e=await Wo(a.value,l,u.value);t=Array.isArray(null==e?void 0:e.deletedSessionIds)?e.deletedSessionIds:[],s=Array.isArray(null==e?void 0:e.failed)?e.failed.map(e=>({sessionId:e.sessionId,error:new Error(e.error||"删除失败")})):[]}catch(i){throw c.value=i.message,i}if(t.length>0){const e=new Set(t);n.value=n.value.filter(a=>!e.has(a.sessionId)),Object.keys(o.value).forEach(a=>{e.has(a)&&delete o.value[a]}),p()}return s.length>0&&0===t.length&&(c.value=s[0].error.message),{deletedSessionIds:t,failed:s}},forkSession:async function(e,l={}){try{const t=await Vo(a.value,e,u.value,l);return await v(a.value,{force:!0}),t.newSessionId}catch(t){throw c.value=t.message,t}},saveProjectOrder:async function(l){try{await gi(l,u.value);const t=l.map(a=>e.value.find(e=>e.name===a)).filter(Boolean),s=e.value.filter(e=>!l.includes(e.name));e.value=[...t,...s],Ci(u.value,{projects:e.value,currentProject:a.value})}catch(t){throw c.value=t.message,t}},saveSessionOrder:async function(e){try{await Jo(a.value,e,u.value);const l=e.map(e=>n.value.find(a=>a.sessionId===e)).filter(Boolean),t=n.value.filter(a=>!e.includes(a.sessionId));n.value=[...l,...t],xi(u.value,a.value,{sessions:n.value,aliases:o.value,totalSize:i.value,projectInfo:s.value})}catch(l){throw c.value=l.message,l}},deleteProject:async function(l){try{await hi(l,u.value),e.value=e.value.filter(e=>e.name!==l),a.value===l&&(a.value=null),(t=u.value)?wi.delete(t):wi.clear(),Ui(u.value,l)}catch(s){throw c.value=s.message,s}var t}}}),Si={class:"favorites-container"},zi={key:0,class:"favorites-section"},Ti={class:"section-header claude-header"},Ii={class:"sessions-list"},Mi={key:1,class:"favorites-section"},Ai={class:"section-header codex-header"},Oi={class:"sessions-list"},$i={key:2,class:"favorites-section"},ji={class:"section-header gemini-header"},Li={class:"sessions-list"},Ei=zl({__name:"FavoritesDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible","view-history"],setup(e,{emit:a}){const{drawerWidth:r}=oi(720),p=e,b=a,w=t({get:()=>p.visible,set:e=>b("update:visible",e)}),{getFavorites:k,removeFavorite:_,getAllFavorites:C}=fi(),x=Pi(),U=t(()=>k("claude")),P=t(()=>k("codex")),S=t(()=>k("gemini")),z=l(!1),T=l(null),I=l(""),M=l("");function A(e){let a="claude";P.value.some(a=>a.sessionId===e.sessionId&&a.projectName===e.projectName)?a="codex":S.value.some(a=>a.sessionId===e.sessionId&&a.projectName===e.projectName)&&(a="gemini"),T.value=e,I.value=e.alias||"",M.value=a,z.value=!0}async function O(){var e,a;if(T.value)try{x.setChannel(M.value);const l=T.value.sessionId;if(I.value){await x.setAlias(l,I.value),Hs.success("别名设置成功");const a=null==(e=C()[M.value])?void 0:e.find(e=>e.sessionId===l&&e.projectName===T.value.projectName);a&&(a.alias=I.value)}else{await x.deleteAlias(l),Hs.success("别名已删除");const e=null==(a=C()[M.value])?void 0:a.find(e=>e.sessionId===l&&e.projectName===T.value.projectName);e&&(e.alias="")}z.value=!1,T.value=null,I.value=""}catch(l){Hs.error("操作失败: "+l.message)}}async function j(e,a){try{const{copyResult:l}=await ei(a.projectName,a.sessionId,e);if("manual"===(null==l?void 0:l.method))return void Hs.warning("自动复制失败,已弹出手动复制框");Hs.success("启动命令已复制到剪贴板")}catch(l){Hs.error("复制失败: "+l.message)}}async function L(e,a){try{await _(e,a.projectName,a.sessionId),Hs.success("已移除收藏")}catch(l){Hs.error("移除失败: "+l.message)}}return(e,a)=>(n(),g(d(ce),{show:w.value,"onUpdate:show":a[3]||(a[3]=e=>w.value=e),width:d(r),placement:"right"},{default:u(()=>[c(d(re),{title:"我的收藏",closable:""},{default:u(()=>[o("div",Si,[U.value.length>0?(n(),s("div",zi,[o("div",Ti,[c(d(R),{size:20},{default:u(()=>[c(d(ia))]),_:1}),a[4]||(a[4]=o("h3",{class:"section-title"},"Claude",-1)),c(d(H),{size:"small",bordered:!1,type:"success"},{default:u(()=>[h(m(U.value.length),1)]),_:1})]),o("div",Ii,[(n(!0),s(f,null,y(U.value,l=>(n(),g(Ro,{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:A,onLaunch:e=>j("claude",l)},{"actions-extra":u(()=>[c(d(F),{size:"small",type:"error",onClick:v(e=>L("claude",l),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),default:u(()=>[a[5]||(a[5]=h(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):i("",!0),P.value.length>0?(n(),s("div",Mi,[o("div",Ai,[c(d(R),{size:20},{default:u(()=>[c(d(ra))]),_:1}),a[6]||(a[6]=o("h3",{class:"section-title"},"Codex",-1)),c(d(H),{size:"small",bordered:!1,type:"info"},{default:u(()=>[h(m(P.value.length),1)]),_:1})]),o("div",Oi,[(n(!0),s(f,null,y(P.value,l=>(n(),g(Ro,{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:A,onLaunch:e=>j("codex",l)},{"actions-extra":u(()=>[c(d(F),{size:"small",type:"error",onClick:v(e=>L("codex",l),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),default:u(()=>[a[7]||(a[7]=h(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):i("",!0),S.value.length>0?(n(),s("div",$i,[o("div",ji,[c(d(R),{size:20},{default:u(()=>[c(d(ca))]),_:1}),a[8]||(a[8]=o("h3",{class:"section-title"},"Gemini",-1)),c(d(H),{size:"small",bordered:!1,type:"warning"},{default:u(()=>[h(m(S.value.length),1)]),_:1})]),o("div",Li,[(n(!0),s(f,null,y(S.value,l=>(n(),g(Ro,{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:A,onLaunch:e=>j("gemini",l)},{"actions-extra":u(()=>[c(d(F),{size:"small",type:"error",onClick:v(e=>L("gemini",l),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),default:u(()=>[a[9]||(a[9]=h(" 移除 ",-1))]),_:1},8,["onClick"])]),_:2},1032,["session","onClick","onLaunch"]))),128))])])):i("",!0),0===e.totalCount?(n(),g(d(Q),{key:3,description:"暂无收藏",style:{"margin-top":"80px"}},{icon:u(()=>[c(d(R),{size:48},{default:u(()=>[c(d(ua))]),_:1})]),extra:u(()=>[c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[10]||(a[10]=[h(' 在会话列表中点击"收藏"按钮添加收藏 ',-1)])]),_:1})]),_:1})):i("",!0)]),c(d(se),{show:z.value,"onUpdate:show":a[2]||(a[2]=e=>z.value=e),preset:"dialog",title:"设置别名"},{action:u(()=>[c(d(ae),null,{default:u(()=>[c(d(F),{onClick:a[1]||(a[1]=e=>z.value=!1)},{default:u(()=>[...a[11]||(a[11]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:O},{default:u(()=>[...a[12]||(a[12]=[h("确定",-1)])]),_:1})]),_:1})]),default:u(()=>[c(d(ne),{value:I.value,"onUpdate:value":a[0]||(a[0]=e=>I.value=e),placeholder:"输入别名(留空删除)",onKeyup:$(O,["enter"])},null,8,["value"])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-56e896bc"]]),Di=["id"],Ni={class:"message-header"},Bi={key:0,class:"message-model"},Ri={class:"message-time"},Fi={class:"message-time"},Hi={key:0,class:"user-content"},Gi={key:0},Ki={key:1,class:"image-item"},qi=["src"],Wi=["innerHTML"],Vi=500,Ji=zl({__name:"ChatMessage",props:{message:{type:Object,required:!0},messageAnchorId:{type:String,default:""}},setup(e){pl.registerLanguage("javascript",vl),pl.registerLanguage("python",ml),pl.registerLanguage("bash",fl),pl.registerLanguage("json",yl),pl.registerLanguage("typescript",gl),pl.registerLanguage("css",hl),pl.registerLanguage("xml",bl),pl.registerLanguage("html",bl);const a=e,r=l(!1),u=t(()=>{const e=a.message.content;return"string"==typeof e&&e.length>Vi}),v=t(()=>{const e=a.message.content;return"string"==typeof e&&e.length>Vi?e.substring(0,Vi)+"...":e});wl.setOptions({highlight:(e,a)=>{if(a&&pl.getLanguage(a))try{return pl.highlight(e,{language:a}).value}catch(l){}return pl.highlightAuto(e).value},breaks:!0,gfm:!0});const g=t(()=>{if("assistant"===a.message.type&&a.message.content)try{return wl.parse(a.message.content)}catch(e){return a.message.content}return""}),b=t(()=>{if("assistant"===a.message.type&&a.message.content)try{const e=a.message.content,l=e.length>Vi?e.substring(0,Vi)+"...":e;return wl.parse(l)}catch(e){return a.message.content.substring(0,Vi)+"..."}return""});function w(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 Fo(e,{manualFallback:!1})}catch{}}function _(e){var a,l,t,s;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==(s=e.source)?void 0:s.url)?e.source.url:e.url?e.url:null}return(a,l)=>(n(),s("div",{id:e.messageAnchorId||void 0,class:p(["chat-message",[`message-${e.message.type}`]])},[o("div",Ni,["assistant"===e.message.type?(n(),s(f,{key:0},[c(d(R),{size:16,component:d(da),class:"role-icon"},null,8,["component"]),l[1]||(l[1]=o("span",{class:"message-role"},"AI",-1)),e.message.model?(n(),s("span",Bi,m(e.message.model),1)):i("",!0),o("span",Ri,m(e.message.timestamp?w(e.message.timestamp):""),1),l[2]||(l[2]=o("span",{class:"spacer"},null,-1)),o("span",{class:"copy-btn",onClick:k,title:"复制"},[c(d(R),{size:14,component:d(pa)},null,8,["component"])])],64)):(n(),s(f,{key:1},[o("span",{class:"copy-btn",onClick:k,title:"复制"},[c(d(R),{size:14,component:d(pa)},null,8,["component"])]),l[3]||(l[3]=o("span",{class:"spacer"},null,-1)),o("span",Fi,m(e.message.timestamp?w(e.message.timestamp):""),1),l[4]||(l[4]=o("span",{class:"message-role"},"用户",-1)),c(d(R),{size:16,component:d(va),class:"role-icon"},null,8,["component"])],64))]),o("div",{class:p(["message-content",{collapsed:!r.value&&u.value}])},["user"===e.message.type?(n(),s("div",Hi,["string"==typeof e.message.content?(n(),s(f,{key:0},[h(m(r.value?e.message.content:v.value),1)],64)):Array.isArray(e.message.content)?(n(!0),s(f,{key:1},y(e.message.content,(e,a)=>(n(),s("div",{key:a,class:"content-item"},["text"===e.type?(n(),s("div",Gi,m(e.text),1)):"image"===e.type?(n(),s("div",Ki,[_(e)?(n(),s("img",{key:0,src:_(e),alt:"会话图片",loading:"lazy"},null,8,qi)):(n(),s(f,{key:1},[c(d(R),{size:20,component:d(ma)},null,8,["component"]),l[5]||(l[5]=o("span",null,"图片内容",-1))],64))])):i("",!0)]))),128)):i("",!0)])):"assistant"===e.message.type?(n(),s("div",{key:1,class:"assistant-content markdown-body",innerHTML:r.value?g.value:b.value},null,8,Wi)):i("",!0)],2),u.value?(n(),s("div",{key:0,class:"expand-btn",onClick:l[0]||(l[0]=e=>r.value=!r.value)},m(r.value?"收起":"展开全部"),1)):i("",!0)],10,Di))}},[["__scopeId","data-v-35aebdef"]]),Zi={class:"drawer-wrapper"},Qi={class:"header-row"},Yi={class:"session-name"},Xi={key:0,class:"session-summary"},er={class:"drawer-body"},ar={key:0,class:"loading-container"},lr={key:1,class:"empty-container"},tr={key:2,class:"history-layout"},sr={class:"mobile-toc-toggle"},nr={class:"toc-header"},or={key:0,class:"toc-header-hint"},ir={key:0,class:"toc-empty"},rr={key:1,class:"toc-empty"},cr={key:2,class:"toc-list"},ur=["onClick"],dr={class:"toc-order"},pr={class:"toc-preview"},vr={class:"toc-time"},mr={class:"messages-pane"},fr={key:0,class:"load-more-top"},yr={class:"messages-list"},gr=20,hr=zl({__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:r}){const v=e,b=r,{drawerWidth:w}=oi(960,840),k=t({get:()=>v.show,set:e=>b("update:show",e)}),_=l(!1),x=l(!1),U=l([]),P=l([]),S=l({}),z=l(1),T=l(0),M=l(!1),A=l(null),O=l(null),$=l(!1),L=l(null),E=l(!1),D=l(null);let N=0,B=null,G="";const K=t(()=>me(v.sessionId).slice(0,16)||"session"),q=t(()=>{const e=new Map;return U.value.map((a,l)=>{const t=function(e,a){const l=ve(e);if(l)return`msg-${K.value}-${me(l)}`;const t=(null==e?void 0:e.timestamp)?String(e.timestamp):"",s=(null==e?void 0:e.type)?String(e.type):"unknown",n=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)}(`${s}|${t}|${n}`),i=t?me(t):`idx${a}`;return`msg-${K.value}-${s}-${i}-${o}`}(a,l),s=e.get(t)||0;return e.set(t,s+1),0===s?t:`${t}-${s+1}`})}),W=t(()=>{const e=new Map;return U.value.forEach((a,l)=>{!a.anchorOnly&&"user"===a.type&&a.userMessageNumber&&e.set(a.userMessageNumber,q.value[l])}),e}),V=t(()=>U.value.map((e,a)=>({message:e,index:a})).filter(({message:e})=>!e.anchorOnly)),J=t(()=>P.value);function Y(e={}){return[e.lastModified||"",e.size||0].join(":")}async function X(){try{x.value=!0;const e=await li(v.projectName,v.sessionId,v.channel);P.value=Array.isArray(null==e?void 0:e.items)?e.items:[]}catch(e){}finally{x.value=!1}}async function ee(){const e=await ti(v.projectName,v.sessionId,v.channel);return G=Y(e),e}async function ae(e=1,a={}){var l,t;if(_.value)return;const{skipFirstPageScroll:s=!1,limitOverride:n=gr}=a;try{_.value=!0;const a=await ai(v.projectName,v.sessionId,e,n,"desc",v.channel),{messages:l,metadata:t,pagination:o}=a;1===e?(U.value=l.reverse(),S.value=t):U.value=[...l.reverse(),...U.value],z.value=o.page,T.value=o.total,M.value=o.hasMore,1===e&&I(async()=>{D.value?await ie(D.value,{allowLoadMore:!0}):s||te(!1),ne()})}catch(o){const e="加载聊天记录失败: "+((null==(t=null==(l=o.response)?void 0:l.data)?void 0:t.error)||o.message);b("error",e)}finally{_.value=!1}}function le(){if(!M.value||_.value)return;const e=A.value,a=(null==e?void 0:e.scrollHeight)||0;ae(z.value+1).then(()=>{I(()=>{if(e){const l=e.scrollHeight;e.scrollTop=l-a,ne()}})})}function te(e=!0){I(()=>{const a=A.value;a&&(a.scrollTo({top:a.scrollHeight,behavior:e?"smooth":"auto"}),ne())})}function se(e){const a=e.target;if(!a)return;const{scrollTop:l,scrollHeight:t,clientHeight:s}=a;$.value=t-l-s>200,l<100&&M.value&&!_.value&&le(),ne()}function ne(){N||(N=requestAnimationFrame(()=>{N=0,function(){var e;const a=A.value;if(!a||0===J.value.length)return void(L.value=null);const l=Array.from(W.value.keys()).sort((e,a)=>e-a);if(!l.length)return void(L.value=(null==(e=J.value[J.value.length-1])?void 0:e.userMessageNumber)||null);const t=Math.max(0,a.scrollHeight-a.clientHeight);if(t>0&&t-a.scrollTop<=6)return void(L.value=l[l.length-1]);const s=a.scrollTop,n=s+a.clientHeight,o=s+ge();let i=null,r=null;for(const u of J.value){const e=fe(W.value.get(u.userMessageNumber));if(!e)continue;const l=ye(e,a),t=l+e.offsetHeight;l<=o+1&&(r=u),!i&&t>s&&l<n&&(i=u)}const c=(null==r?void 0:r.userMessageNumber)||(null==i?void 0:i.userMessageNumber)||l[0]||J.value[0].userMessageNumber;c&&(L.value=c)}()}))}function oe(e,a=!0){const l=A.value;if(!l||!e)return!1;const t=fe(e);if(!t)return!1;const s=ye(t,l),n=Math.max(0,l.scrollHeight-l.clientHeight),o=be(s-ge(),0,n);return l.scrollTo({top:o,behavior:a?"smooth":"auto"}),ne(),!0}async function ie(e,a={}){if(!e)return!1;const{allowLoadMore:l=!1}=a;let t=0;for(;t<50;){t+=1;const a=re(e);if(a&&oe(a,!0))return Number.isInteger(e.userMessageNumber)&&(L.value=e.userMessageNumber),D.value=null,!0;if(!l||!M.value||_.value)break;const s=z.value;if(await ae(z.value+1),z.value===s)break}return D.value=null,ne(),!1}function re(e){if(e.anchorId&&"string"==typeof e.anchorId)return e.anchorId;if(Number.isInteger(e.userMessageNumber))return W.value.get(e.userMessageNumber)||"";if("number"==typeof e.messageIndex&&e.messageIndex>=0)return q.value[e.messageIndex]||"";if(e.messageId){const a=String(e.messageId),l=U.value.findIndex(e=>ve(e)===a);if(l>=0)return q.value[l]}return""}async function ue(){var e,a,l;if(_.value)return;const t=A.value,s=!t||t.scrollHeight-t.scrollTop-t.clientHeight<=40,n=(null==t?void 0:t.scrollTop)||0,o=Math.max(z.value,1);try{_.value=!0;const t=[];for(let e=1;e<=o;e+=1)t.push(await ai(v.projectName,v.sessionId,e,gr,"desc",v.channel));const s=[];for(let e=t.length-1;e>=0;e-=1){const a=t[e],l=Array.isArray(null==a?void 0:a.messages)?a.messages:[];s.push(...l.slice().reverse())}U.value=s,S.value=(null==(e=t[0])?void 0:e.metadata)||S.value,T.value=(null==(l=null==(a=t[0])?void 0:a.pagination)?void 0:l.total)||s.length,z.value=o,M.value=o*gr<T.value}finally{_.value=!1}if(await I(),t)if(s)te(!1);else{const e=Math.max(0,t.scrollHeight-t.clientHeight);t.scrollTop=be(n,0,e),ne()}}function de(){B&&(clearInterval(B),B=null)}function pe(){de(),B=setInterval(()=>{k.value&&async function(){try{const e=Y(await ti(v.projectName,v.sessionId,v.channel));if(!e)return;if(G&&e!==G)return G=e,void(await Promise.all([X(),ue()]));G=e}catch(e){}}()},3e3)}function ve(e){return e&&"object"==typeof e?String(e.messageId||e.id||e.uuid||e.turnId||""):""}function me(e){return String(e||"").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)}function fe(e){const a=A.value;if(!a||!e)return null;const l=document.getElementById(e);return l&&a.contains(l)?l:null}function ye(e,a){const l=a.getBoundingClientRect(),t=e.getBoundingClientRect();return a.scrollTop+(t.top-l.top)}function ge(){var e;return((null==(e=O.value)?void 0:e.offsetHeight)||0)+12}function he(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"})}function be(e,a,l){return Math.min(Math.max(e,a),l)}return C(J,()=>{J.value.length?(J.value.some(e=>e.userMessageNumber===L.value)||(L.value=J.value[0].userMessageNumber),ne()):L.value=null},{deep:!0}),C(k,e=>{e?I(()=>{ne()}):de()}),j(()=>{N&&(cancelAnimationFrame(N),N=0),de()}),a({open:function(e){de(),D.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,userMessageNumber:Number.isInteger(a.userMessageNumber)?a.userMessageNumber:null};return l.anchorId||l.messageId||null!==l.messageIndex||null!==l.userMessageNumber?l:null}(e),E.value=!1,U.value=[],P.value=[],S.value={},z.value=1,T.value=0,M.value=!1,$.value=!1,L.value=null,G="",Promise.all([X(),ae(1,{skipFirstPageScroll:Boolean(D.value)}),ee()]).then(()=>{k.value&&pe()}).catch(()=>{})}}),(a,l)=>(n(),g(d(ce),{show:k.value,"onUpdate:show":l[2]||(l[2]=e=>k.value=e),width:d(w),placement:"right","auto-focus":!1,"trap-focus":!1,"block-scroll":!1},{default:u(()=>[o("div",Zi,[o("div",{ref_key:"headerRef",ref:O,class:"drawer-header"},[o("div",Qi,[c(d(R),{size:18,component:d(da)},null,8,["component"]),o("span",Yi,m(e.sessionAlias||e.sessionId.substring(0,8))+" ("+m(T.value)+")",1),S.value.gitBranch?(n(),g(d(H),{key:0,size:"small",type:"info"},{icon:u(()=>[c(d(R),{component:d(fa)},null,8,["component"])]),default:u(()=>[h(" "+m(S.value.gitBranch),1)]),_:1})):i("",!0),l[3]||(l[3]=o("span",{class:"spacer"},null,-1)),c(d(R),{size:20,component:d(ya),class:"close-btn",onClick:l[0]||(l[0]=e=>k.value=!1)},null,8,["component"])]),S.value.summary?(n(),s("div",Xi,m(S.value.summary),1)):i("",!0)],512),o("div",er,[_.value&&0===U.value.length?(n(),s("div",ar,[c(d(Z),{size:"medium"},{description:u(()=>[...l[4]||(l[4]=[h("加载聊天记录...",-1)])]),_:1})])):_.value||0!==U.value.length?(n(),s("div",tr,[o("div",sr,[c(d(F),{tertiary:"",size:"small",onClick:l[1]||(l[1]=e=>E.value=!E.value)},{default:u(()=>[h(m(E.value?"展开用户目录":"收起用户目录"),1)]),_:1})]),o("aside",{class:p(["toc-rail",{"mobile-collapsed":E.value}])},[o("div",nr,[l[5]||(l[5]=h(" 用户目录 ",-1)),x.value?(n(),s("span",or,"加载中...")):i("",!0)]),x.value&&0===J.value.length?(n(),s("div",ir,"目录加载中...")):0===J.value.length?(n(),s("div",rr,"暂无用户消息")):(n(),s("div",cr,[(n(!0),s(f,null,y(J.value,e=>(n(),s("button",{key:e.userMessageNumber,type:"button",class:p(["toc-item",{active:L.value===e.userMessageNumber}]),onClick:a=>function(e){(null==e?void 0:e.userMessageNumber)&&(L.value=e.userMessageNumber,ie({userMessageNumber:e.userMessageNumber},{allowLoadMore:!0}))}(e)},[o("span",dr,"#"+m(e.userMessageNumber),1),o("span",pr,m(e.preview),1),o("span",vr,m(he(e.timestamp)),1)],10,ur))),128))]))],2),o("div",mr,[o("div",{class:"messages-container",ref_key:"messagesContainer",ref:A,onScroll:se},[M.value?(n(),s("div",fr,[c(d(F),{loading:_.value,onClick:le,size:"small",secondary:""},{icon:u(()=>[c(d(R),{component:d(ga)},null,8,["component"])]),default:u(()=>[l[6]||(l[6]=h(" 加载更早的消息 ",-1))]),_:1},8,["loading"])])):i("",!0),o("div",yr,[(n(!0),s(f,null,y(V.value,({message:e,index:a})=>(n(),g(Ji,{key:q.value[a]||a,message:e,"message-anchor-id":q.value[a]},null,8,["message","message-anchor-id"]))),128))])],544),$.value?(n(),s("div",{key:0,class:"scroll-btn",onClick:te},[c(d(R),{size:18,component:d(ha)},null,8,["component"])])):i("",!0)])])):(n(),s("div",lr,[c(d(Q),{description:"暂无聊天记录"})]))])])]),_:1},8,["show","width"]))}},[["__scopeId","data-v-a3f56791"]]),br=[{key:"claude",title:"ClaudeCode",label:"Claude Code",command:"claude",icon:ia,color:"#18a058",defaultVisible:!0,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!0,supportsAgents:!0},{key:"codex",title:"Codex-CLI",label:"Codex",command:"codex",icon:ra,color:"#3b82f6",defaultVisible:!0,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!0,supportsAgents:!0},{key:"gemini",title:"Gemini-CLI",label:"Gemini",command:"gemini",icon:ca,color:"#a855f7",defaultVisible:!0,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!1,supportsAgents:!0},{key:"opencode",title:"OpenCode",label:"OpenCode",command:"opencode",icon:Je,color:"#ea580c",defaultVisible:!0,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!0,supportsAgents:!0},{key:"omp",title:"OMP",label:"OMP",command:"omp",icon:ba,color:"#0f9f9a",defaultVisible:!1,supportsManagedConfig:!0,supportsProxy:!0,supportsProjects:!0,supportsSessions:!0,supportsSkills:!0,supportsCommands:!0,supportsPlugins:!0,supportsAgents:!1}],wr=["claude","codex","gemini","opencode"];function kr(e=[]){const a=[],l=new Set;return Array.isArray(e)?(e.forEach(e=>{const t=function(e={}){const a=String(e.key||"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");if(!a||br.some(e=>e.key===a))return null;const l=String(e.name||e.title||a).trim()||a,t=String(e.command||a).trim()||a;return{key:a,name:l,title:String(e.title||l).trim()||l,command:t,configDir:String(e.configDir||"").trim(),icon:String(e.icon||"").trim(),color:String(e.color||"").trim(),enabled:!1!==e.enabled,custom:!0,supportsManagedConfig:!1,supportsProxy:!1,supportsProjects:!1,supportsSessions:!1,supportsSkills:!1,supportsCommands:!1,supportsPlugins:!1,supportsAgents:!1}}(e);t&&!l.has(t.key)&&(l.add(t.key),a.push(t))}),a):a}function _r(e=[]){return[...br,...kr(e).filter(e=>!1!==e.enabled)]}function Cr(e,a=[]){return _r(a).find(a=>a.key===e)||{key:e,title:e,label:e,command:e,icon:Qe,custom:!0,supportsManagedConfig:!1,supportsProxy:!1,supportsProjects:!1,supportsSessions:!1,supportsSkills:!1,supportsCommands:!1,supportsPlugins:!1,supportsAgents:!1}}function xr(e=[],a=[]){const l=new Set(_r(a).map(e=>e.key)),t=[];return Array.isArray(e)&&e.forEach(e=>{const a=String(e||"").trim().toLowerCase();a&&!t.includes(a)&&l.has(a)&&t.push(a)}),wr.forEach(e=>{t.length<4&&!t.includes(e)&&t.push(e)}),t.slice(0,4)}async function Ur(){return(await ct.get("/security")).data}async function Pr(e){return(await ct.post("/security/verify",{password:e})).data}async function Sr(e){return(await ct.post("/security/password",e)).data}const zr=Object.freeze(Object.defineProperty({__proto__:null,getSecurityStatus:Ur,setSecurityPassword:Sr,verifySecurityPassword:Pr},Symbol.toStringTag,{value:"Module"}));async function Tr(){return(await ct.get("/pm2-autostart")).data}async function Ir(){return(await ct.post("/pm2-autostart",{action:"enable"})).data}async function Mr(){return(await ct.post("/pm2-autostart",{action:"disable"})).data}const Ar=Object.freeze(Object.defineProperty({__proto__:null,disableAutoStart:Mr,enableAutoStart:Ir,getAutoStartStatus:Tr},Symbol.toStringTag,{value:"Module"}));async function Or(){return(await ct.get("/dashboard/init")).data}const $r=Object.freeze(Object.defineProperty({__proto__:null,getDashboardInit:Or},Symbol.toStringTag,{value:"Module"}));const jr={...bi,...ni,...is,...Gn,...Fn,...Object.freeze(Object.defineProperty({__proto__:null,checkForUpdates:async function(){return(await ct.get("/version/check")).data},getAllChangelog:async function(){return(await ct.get("/version/changelog")).data},getChangelog:async function(e){return(await ct.get(`/version/changelog/${e}`)).data},getCurrentVersion:async function(){return(await ct.get("/version/current")).data},performUpdate:async function(){return(await ct.post("/version/update")).data}},Symbol.toStringTag,{value:"Module"})),...vi,...Js,...zr,...Ar,...$r},Lr=k("dashboard",()=>{const e=l({uiConfig:null,favorites:null,channels:{claude:[],codex:[],gemini:[],opencode:[],omp:[]},proxyStatus:{claude:{},codex:{},gemini:{},opencode:{},omp:{}},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:{}},omp:{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},omp:{projectCount:0,sessionCount:0}}}),a=l(!1),t=l(!1);let s=null,n=null;async function o(l=!1){return t.value&&!l?e.value:(s&&!l||(a.value=!0,s=(async()=>{var l,n,o,i,r,c,u,d,p,v,m,f,y,g,h,b,w,k,_,C;try{const a=await Or();if(!a||!1===a.success)throw new Error((null==a?void 0:a.message)||"Failed to load dashboard");const s=a.data||{},x=(e={})=>({requests:e.requests||0,tokens:e.tokens||0,cost:e.cost||0,byModel:e.byModel||{}});return e.value={uiConfig:s.uiConfig||null,favorites:s.favorites||null,channels:{claude:(null==(l=s.channels)?void 0:l.claude)||[],codex:(null==(n=s.channels)?void 0:n.codex)||[],gemini:(null==(o=s.channels)?void 0:o.gemini)||[],opencode:(null==(i=s.channels)?void 0:i.opencode)||[],omp:(null==(r=s.channels)?void 0:r.omp)||[]},proxyStatus:{claude:(null==(c=s.proxyStatus)?void 0:c.claude)||{},codex:(null==(u=s.proxyStatus)?void 0:u.codex)||{},gemini:(null==(d=s.proxyStatus)?void 0:d.gemini)||{},opencode:(null==(p=s.proxyStatus)?void 0:p.opencode)||{},omp:(null==(v=s.proxyStatus)?void 0:v.omp)||{}},todayStats:{claude:x(null==(m=s.todayStats)?void 0:m.claude),codex:x(null==(f=s.todayStats)?void 0:f.codex),gemini:x(null==(y=s.todayStats)?void 0:y.gemini),opencode:x(null==(g=s.todayStats)?void 0:g.opencode),omp:x(null==(h=s.todayStats)?void 0:h.omp)},counts:{claude:(null==(b=s.counts)?void 0:b.claude)||{projectCount:0,sessionCount:0},codex:(null==(w=s.counts)?void 0:w.codex)||{projectCount:0,sessionCount:0},gemini:(null==(k=s.counts)?void 0:k.gemini)||{projectCount:0,sessionCount:0},opencode:(null==(_=s.counts)?void 0:_.opencode)||{projectCount:0,sessionCount:0},omp:(null==(C=s.counts)?void 0:C.omp)||{projectCount:0,sessionCount:0}}},t.value=!0,e.value}finally{a.value=!1,s=null}})().catch(e=>{throw e})),s)}return{dashboardData:e,isLoading:a,isLoaded:t,loadDashboard:o,enableAutoRefresh:function(){n||(n=setInterval(()=>{o(!0).catch(()=>{})},3e5))},disableAutoRefresh:function(){n&&(clearInterval(n),n=null)},refreshChannels:async function(a){try{if("claude"===a){const a=await jr.getChannels();a.success&&(e.value.channels.claude=a.channels)}else if("codex"===a){const a=await jr.getCodexChannels();a.success&&(e.value.channels.codex=a.channels)}else if("gemini"===a){const a=await jr.getGeminiChannels();a.success&&(e.value.channels.gemini=a.channels)}else if("opencode"===a){const a=await jr.getOpenCodeChannels();a.success&&(e.value.channels.opencode=a.channels)}else if("omp"===a){const a=await jr.getOmpChannels();a.success&&(e.value.channels.omp=a.channels)}}catch(l){}},refreshProxyStatus:async function(a){try{if("claude"===a){const a=await jr.getProxyStatus();a.success&&(e.value.proxyStatus.claude=a)}else if("codex"===a){const a=await jr.getCodexProxyStatus();a.success&&(e.value.proxyStatus.codex=a)}else if("gemini"===a){const a=await jr.getGeminiProxyStatus();a.success&&(e.value.proxyStatus.gemini=a)}else if("opencode"===a){const a=await jr.getOpenCodeProxyStatus();a.success&&(e.value.proxyStatus.opencode=a)}else if("omp"===a){const a=await jr.getOmpProxyStatus();a.success&&(e.value.proxyStatus.omp=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 jr.getClaudeTodayStatistics();e.value.todayStats.claude=l(a)}else if("codex"===a){const a=await jr.getCodexTodayStatistics();e.value.todayStats.codex=l(a)}else if("gemini"===a){const a=await jr.getGeminiTodayStatistics();e.value.todayStats.gemini=l(a)}else if("opencode"===a){const a=await jr.getOpenCodeTodayStatistics();e.value.todayStats.opencode=l(a)}else if("omp"===a){const a=await jr.getOmpTodayStatistics();e.value.todayStats.omp=l(a)}}catch(l){}}}}),Er="cc-theme",Dr=l(!1);let Nr=!1,Br=null,Rr=null,Fr=!1;function Hr(){return Br||(Br=Lr(),Rr=T(Br).dashboardData),Br}function Gr(){Fr||Rr&&(C(()=>{var e,a;return null==(a=null==(e=Rr.value)?void 0:e.uiConfig)?void 0:a.theme},e=>{if(!e)return;const a="dark"===e;if(!Nr)return Nr=!0,Dr.value=a,void qr(a);Dr.value!==a&&(Dr.value=a,qr(a))}),Fr=!0)}async function Kr(){var e,a,l,t;if(Nr)return;const s="undefined"!=typeof window?null==(e=window.localStorage)?void 0:e.getItem(Er):null;"dark"!==s&&"light"!==s||(Dr.value="dark"===s,qr(Dr.value));try{const e=Hr();Gr();let n=null==(l=null==(a=null==Rr?void 0:Rr.value)?void 0:a.uiConfig)?void 0:l.theme;if(!n){const a=await e.loadDashboard().catch(()=>null);n=null==(t=null==a?void 0:a.uiConfig)?void 0:t.theme}n||s?n&&(Dr.value="dark"===n):Dr.value=window.matchMedia("(prefers-color-scheme: dark)").matches}catch(n){s||(Dr.value=window.matchMedia("(prefers-color-scheme: dark)").matches)}qr(Dr.value),Nr=!0}function qr(e){e?document.documentElement.setAttribute("data-theme","dark"):document.documentElement.removeAttribute("data-theme")}function Wr(){Dr.value=!Dr.value}function Vr(){return{isDark:Dr,toggleTheme:Wr,loadTheme:Kr}}C(Dr,async e=>{var a;qr(e);try{null==(a=window.localStorage)||a.setItem(Er,e?"dark":"light")}catch(l){}try{await Ws("theme",e?"dark":"light");Hr();Gr(),Rr.value&&(Rr.value={...Rr.value,uiConfig:{...Rr.value.uiConfig||{},theme:e?"dark":"light"}})}catch(l){}});const Jr={class:"settings-container"},Zr={class:"settings-sidebar"},Qr={class:"sidebar-header"},Yr={class:"settings-menu"},Xr=["onClick"],ec={class:"menu-label"},ac={class:"settings-content"},lc={class:"settings-panel"},tc={class:"panel-header"},sc={class:"panel-title-row"},nc={class:"panel-body"},oc={class:"setting-group"},ic={class:"setting-item"},rc={class:"setting-label"},cc={class:"visibility-options"},uc={class:"visibility-item"},dc={class:"visibility-info"},pc={class:"visibility-item"},vc={class:"visibility-info"},mc={class:"visibility-item"},fc={class:"visibility-info"},yc={class:"setting-item"},gc={class:"setting-label"},hc={class:"home-cli-settings"},bc={class:"home-cli-slots"},wc={class:"custom-cli-list"},kc={class:"custom-cli-grid"},_c={class:"custom-cli-actions"},Cc={class:"home-cli-actions"},xc={class:"setting-item"},Uc={class:"setting-label"},Pc={class:"simple-theme-options"},Sc={class:"theme-text"},zc={key:0,class:"theme-check"},Tc={class:"theme-text"},Ic={key:0,class:"theme-check"},Mc={class:"settings-panel"},Ac={class:"panel-header"},Oc={class:"panel-title-row"},$c={class:"panel-body"},jc={class:"setting-group"},Lc={class:"setting-item"},Ec={class:"setting-label"},Dc={class:"notification-options"},Nc={class:"visibility-item"},Bc={class:"visibility-info"},Rc={key:1,class:"notification-type-section"},Fc={class:"radio-content"},Hc={class:"radio-content"},Gc={class:"radio-content"},Kc={style:{"font-size":"13px"}},qc={class:"setting-item"},Wc={class:"setting-label"},Vc={class:"notification-options"},Jc={class:"remote-provider-toolbar"},Zc={class:"remote-provider-header"},Qc={class:"remote-provider-title-row"},Yc={class:"remote-provider-avatar"},Xc={class:"remote-provider-title"},eu={class:"remote-provider-name-row"},au={class:"remote-provider-fields"},lu={class:"remote-field"},tu={class:"remote-field remote-field-wide"},su={class:"remote-field"},nu={class:"remote-field"},ou={class:"remote-field"},iu={class:"remote-field remote-field-wide"},ru={class:"remote-field"},cu={class:"remote-field"},uu={class:"remote-field"},du={key:2,class:"remote-field remote-field-wide"},pu={key:3,class:"remote-field remote-field-wide"},vu={class:"remote-field"},mu={class:"remote-field"},fu={class:"remote-field"},yu={class:"remote-field"},gu={class:"remote-field"},hu={key:1,class:"remote-field remote-field-wide"},bu={class:"remote-field"},wu={class:"remote-field"},ku={class:"remote-field remote-field-wide"},_u={class:"remote-provider-actions"},Cu={class:"panel-footer"},xu={class:"settings-panel"},Uu={class:"panel-header"},Pu={class:"panel-title-row"},Su={class:"panel-body"},zu={class:"setting-group"},Tu={class:"setting-item"},Iu={class:"setting-label"},Mu={class:"ports-grid"},Au={class:"port-field"},Ou={class:"port-field"},$u={class:"port-field"},ju={class:"port-field"},Lu={class:"port-field"},Eu={class:"port-field"},Du={class:"setting-item"},Nu={class:"setting-label"},Bu={class:"advanced-options"},Ru={class:"option-field"},Fu={class:"option-label"},Hu={class:"setting-item"},Gu={class:"setting-label"},Ku={class:"advanced-options"},qu={class:"option-field"},Wu={class:"option-label"},Vu={class:"option-field"},Ju={class:"option-label"},Zu={class:"setting-item"},Qu={class:"setting-label"},Yu={style:{"margin-top":"16px"}},Xu={style:{background:"var(--bg-secondary)",padding:"16px","border-radius":"8px","border-left":"3px solid var(--border-secondary)"}},ed={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},ad={class:"panel-footer"},ld={class:"settings-panel"},td={class:"panel-header"},sd={class:"panel-title-row"},nd={class:"panel-body"},od={class:"setting-group"},id={class:"setting-item"},rd={class:"setting-label"},cd={class:"security-status"},ud={class:"setting-item"},dd={class:"setting-label"},pd={class:"security-form"},vd={class:"panel-footer"},md={class:"settings-panel"},fd={class:"panel-header"},yd={class:"panel-title-row"},gd={class:"panel-body"},hd={class:"setting-item",style:{"margin-bottom":"12px"}},bd={class:"model-meta-section"},wd={class:"speed-test-defaults"},kd={class:"speed-test-default-label"},_d={class:"model-toolbar"},Cd={class:"model-filter-row"},xd={key:0,class:"setting-item"},Ud={key:1,class:"model-list"},Pd=["onClick"],Sd={class:"model-card-id"},zd={key:0,class:"model-card-body"},Td={class:"model-meta-editor"},Id={class:"model-meta-section"},Md={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},Ad={class:"model-meta-section",style:{"margin-top":"8px"}},Od={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},$d={class:"panel-footer"},jd={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},Ld={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},Ed={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},Dd=zl({__name:"SettingsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:k}=oi(720);async function _(e){return(await ct.post("/settings/model-settings",e)).data}async function x(e){return(await ct.delete(`/settings/model-settings/${encodeURIComponent(e)}`)).data}const U=e,S=a,z=t({get:()=>U.visible,set:e=>S("update:visible",e)}),T=l("appearance"),{isDark:I,toggleTheme:M}=Vr(),A=l(!0),O=l(!0),$=l(!1),j=l({webUI:19999,proxy:20088,codexProxy:20089,geminiProxy:20090,opencodeProxy:20091,ompProxy:20092}),E=l({webUI:19999,proxy:20088,codexProxy:20089,geminiProxy:20090,opencodeProxy:20091,ompProxy:20092}),D=l(!1),N=l([...wr]),B=l([]),q=l({homeCliColumns:[...wr],customCliPlatforms:[]}),W=l(!1),V=l(!1),J=l(!1),Y=t(()=>V.value?"[v] 已启用":"未启用"),X=t(()=>V.value?"重启电脑时 coding-tool-x 会自动启动。如需禁用,点击下方按钮":"启用后,重启电脑时 coding-tool-x 会自动启动"),ie=l({maxLogs:100,statsInterval:30,enableSessionBinding:!0}),ve=l({maxLogs:100,statsInterval:30,enableSessionBinding:!0}),me=[{key:"claude",label:"Claude Code",description:"当 Claude Code 任务完成或等待交互时发送系统通知",implementation:"通过 Claude Code 的 Stop Hook 在任务完成时发送通知",externalMessage:"检测到已有非 Coding Tool 的 Stop Hook。本界面只管理 Coding Tool 写入的通知配置。"},{key:"codex",label:"Codex CLI",description:"当 Codex CLI 当前回合完成并等待下一步交互时发送系统通知",implementation:"通过 Codex CLI 的 notify 命令在回合完成后发送通知",externalMessage:"检测到现有 notify 配置。启用 Coding Tool 托管通知会替换当前 notify 命令;关闭时只会移除 Coding Tool 写入的 notify。"},{key:"gemini",label:"Gemini CLI",description:"当 Gemini CLI 回合完成或等待下一步交互时发送系统通知",implementation:"通过 Gemini CLI 的 AfterAgent Hook 在任务完成时发送通知",externalMessage:"检测到已有非 Coding Tool 的 Gemini Hook。本界面只管理 Coding Tool 写入的通知配置。"},{key:"opencode",label:"OpenCode",description:"当 OpenCode 会话空闲或发生错误时发送系统通知",implementation:"通过 OpenCode 插件事件(session.idle / session.error)发送通知",externalMessage:"检测到其他 OpenCode 通知配置时,本界面只管理 Coding Tool 生成的插件文件。"},{key:"omp",label:"OMP",description:"当 OMP 回合完成或等待下一步交互时发送系统通知",implementation:"通过 OMP 托管 Extension 事件发送通知",externalMessage:"检测到其他 OMP 通知扩展时,本界面只管理 Coding Tool 生成的扩展文件。"}];function fe(e={}){return{enabled:!0===e.enabled,type:"dialog"===e.type||"browser"===e.type?e.type:"notification",external:!0===e.external}}const ye={wechatBot:{label:"微信",description:"使用个人微信 iLink token 发送通知",hint:"首次 token 可由 GA 微信扫码生成;也可以直接填写 token。"},qqBot:{label:"QQ",description:"通过 OneBot / NapCat / go-cqhttp 兼容 HTTP 接口发送通知",hint:"GA 当前构建已移除 QQ 前端,这里按 OneBot 兼容桥接入。"},feishuBot:{label:"飞书",description:"通过飞书自定义机器人 Webhook 发送通知",hint:"填写飞书自定义机器人 Webhook URL。"},wecomBot:{label:"企业微信",description:"通过企业微信群机器人 Webhook 发送通知",hint:"当前通知发送使用企业微信群机器人 Webhook;GA 的 bot_id / secret 长连接模式不适合单向通知。"},dingtalkBot:{label:"钉钉",description:"支持钉钉自定义机器人 Webhook 和 GA 同款 App 模式",hint:"App 模式需要 App Key / App Secret,并填写用户 ID 或群会话 ID。"},telegramBot:{label:"Telegram",description:"通过 Telegram Bot API sendMessage 发送通知",hint:"需要 Token 和 Chat ID。"}},ge={wechatBot:"微",qqBot:"Q",feishuBot:"飞",wecomBot:"企",dingtalkBot:"钉",telegramBot:"T"},he={wechatBot:"微信 Bot",qqBot:"QQ Bot",feishuBot:"飞书 Bot",wecomBot:"企业微信 Bot",dingtalkBot:"钉钉 Bot",telegramBot:"Telegram Bot"},be=Object.entries(ye).map(([e,a])=>({label:a.label,value:e})),we=[{label:"私聊",value:"private"},{label:"群聊",value:"group"}],ke=[{label:"Webhook",value:"webhook"},{label:"GA App 模式",value:"app"}],_e=[{label:"群会话",value:"group"},{label:"用户",value:"user"}];function Ce(e){switch(e){case"wechatBot":return{tokenFile:"~/.wxbot/token.json",botToken:"",targetUserId:"",contextToken:""};case"qqBot":return{endpoint:"http://127.0.0.1:3000",accessToken:"",targetType:"private",targetId:""};case"feishuBot":case"wecomBot":return{webhookUrl:""};case"dingtalkBot":return{mode:"webhook",webhookUrl:"",clientId:"",clientSecret:"",targetType:"group",targetId:""};case"telegramBot":return{botToken:"",chatId:"",proxy:""};default:return{}}}function xe(e={}){const a=ye[e.type]?e.type:"telegramBot",l=he[a],t=e.name&&e.name!==l?e.name:Ue(a);return{id:e.id||`${a}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:a,name:t,enabled:!0===e.enabled,config:{...Ce(a),...e.config||{}}}}function Ue(e){var a;return(null==(a=ye[e])?void 0:a.label)||"远程通知"}function Pe(e){var a;return(null==(a=ye[e])?void 0:a.description)||""}function Se(e){var a;return(null==(a=ye[e])?void 0:a.hint)||""}function ze(e={}){var a,l,t,s,n,o,i,r,c;const u={enabled:null==(a=null==e?void 0:e.stopHook)?void 0:a.enabled,type:null==(l=null==e?void 0:e.stopHook)?void 0:l.type},d=Array.isArray(null==(t=null==e?void 0:e.remoteNotifications)?void 0:t.providers)?e.remoteNotifications.providers.map(xe):[];return{claude:fe((null==(s=null==e?void 0:e.platforms)?void 0:s.claude)||u),codex:fe(null==(n=null==e?void 0:e.platforms)?void 0:n.codex),gemini:fe(null==(o=null==e?void 0:e.platforms)?void 0:o.gemini),opencode:fe(null==(i=null==e?void 0:e.platforms)?void 0:i.opencode),omp:fe((null==(r=null==e?void 0:e.platforms)?void 0:r.omp)||(null==(c=null==e?void 0:e.platforms)?void 0:c.omp)),remoteNotifications:{providers:d}}}const Te=l(ze()),Ie=l(ze()),Me=l(!1),Ae=l(""),Oe=l("telegramBot"),$e=l(""),je=l("default"),Le=t(()=>"undefined"!=typeof window&&"undefined"!=typeof Notification&&(!!window.isSecureContext||["localhost","127.0.0.1","::1"].includes(window.location.hostname))),Ee=t(()=>Le.value?"granted"===je.value?"已授权":"denied"===je.value?"已被浏览器拒绝,请在浏览器站点设置里重新开启":"尚未授权,保存时会请求浏览器权限":"当前环境不支持浏览器通知,请使用 localhost 或 HTTPS 页面");function De(e="notification"){if("browser"===e)return"浏览器通知";if("dialog"===e)return"确认式弹窗";switch($e.value){case"win32":return"右上角悬浮卡片";case"darwin":return"角落横幅通知";case"linux":return"桌面环境通知";default:return"轻提醒卡片"}}function Ne(e="notification"){return"browser"===e?Le.value?"granted"===je.value?"通过当前打开的 Web 页面显示浏览器原生通知":"denied"===je.value?"浏览器通知权限已被拒绝,需要先在浏览器中重新授权":"通过当前打开的 Web 页面显示原生通知,保存时会请求权限":"当前页面环境不支持浏览器通知":"dialog"===e?"强制提醒,需要手动点击确认才能关闭":"win32"===$e.value?"轻量提醒,几秒后自动消失,带提示音(Windows 使用系统 Toast 风格提醒)":"轻量提醒,几秒后自动消失,带提示音"}function Re(){"undefined"!=typeof Notification?je.value=Notification.permission:je.value="unsupported"}function Fe(){Te.value.remoteNotifications.providers.push(function(e="telegramBot"){return{id:`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:e,name:Ue(e),enabled:!1,config:Ce(e)}}(Oe.value))}const He=l({hasPassword:!1}),Ge=l(!1),We=l(!1),Ve=l({currentPassword:"",newPassword:"",confirmPassword:""}),Je=l(!1);let Ze=null;const Qe=l(!1),Ye=l(!1),Xe=l({}),ea=l({}),aa=l({}),la=l(""),ta=l("all"),sa=l(!1),na=l({modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0}),oa=l(new Set),ia=l({claude:"",codex:"",gemini:""}),ra=l({claude:"",codex:"",gemini:""}),ua=[{key:"claude",label:"Claude Code"},{key:"codex",label:"Codex"},{key:"gemini",label:"Gemini CLI"}],da=l(new Set),pa=t(()=>Object.keys(aa.value).length>0),va=t(()=>pa.value||JSON.stringify(ia.value)!==JSON.stringify(ra.value)),ma=t(()=>{const e=String(na.value.modelId||"").trim();if(!e)return"请输入模型 ID";const a=Object.keys(Xe.value).find(a=>a.toLowerCase()===e.toLowerCase());return a?`模型已存在:${a}`:!Number.isFinite(na.value.context)||na.value.context<=0?"Context 窗口必须为正数":!Number.isFinite(na.value.output)||na.value.output<=0?"Max Output 必须为正数":na.value.inputPrice<0||na.value.outputPrice<0||na.value.cacheCreationPrice<0||na.value.cacheReadPrice<0?"价格不能为负数":""});function fa(){na.value={modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0},sa.value=!0}function ya(){sa.value=!1}function ga(){if(ma.value)return;const e=String(na.value.modelId||"").trim(),a={limit:{context:na.value.context,output:na.value.output},pricing:{input:na.value.inputPrice,output:na.value.outputPrice,cacheCreation:na.value.cacheCreationPrice,cacheRead:na.value.cacheReadPrice}};Xe.value[e]=a,aa.value[e]={limit:{...a.limit},pricing:{...a.pricing}},la.value=e,sa.value=!1,Hs.success("模型已新增,请点击“保存设置”使其生效")}function ha(e){return oa.value.has(e)}function ba(e){return!ha(e)}const Ia=t(()=>{const e=Object.keys(Xe.value),a=la.value.trim().toLowerCase(),l=ta.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||!!ea.value[e]))});function Ma(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 Aa=t(()=>{const e={claude:[],codex:[],gemini:[]};for(const[a,l]of Object.entries(Xe.value||{})){if(!l||"object"!=typeof l||!l.limit||!l.pricing)continue;const t=Ma(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 Oa(e,a,l){var t,s,n,o;return void 0!==(null==(s=null==(t=aa.value[e])?void 0:t[a])?void 0:s[l])?aa.value[e][a][l]:(null==(o=null==(n=Xe.value[e])?void 0:n[a])?void 0:o[l])??null}function $a(e,a,l,t){if(!aa.value[e]){const a=Xe.value[e]||{};aa.value[e]={limit:{...a.limit||{}},pricing:{...a.pricing||{}}}}aa.value[e][a]||(aa.value[e][a]={}),aa.value[e][a][l]=t}async function ja(){var e,a,l;Qe.value=!0;try{const t=await async function(){return(await ct.get("/settings/model-settings")).data}();Xe.value=t.models||{},ea.value=t.overrides||{},oa.value=new Set(t.builtinModelIds||[]),ia.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={...ia.value};let a=!1;for(const l of ua){const t=Aa.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&&(ia.value=e)}(),ra.value={...ia.value},aa.value={}}catch(t){}finally{Qe.value=!1}}async function La(){Ye.value=!0;try{const e={...ea.value};for(const[a,l]of Object.entries(aa.value)){const t=e[a]||{};e[a]={limit:{...t.limit||{},...l.limit||{}},pricing:{...t.pricing||{},...l.pricing||{}}}}await _({overrides:e,defaultSpeedTestModels:ia.value}),ea.value=e,ra.value={...ia.value},aa.value={},await ja(),Hs.success("模型设置已保存")}catch(e){Hs.error("保存失败:"+e.message)}finally{Ye.value=!1}}async function Ea(){try{await _({overrides:{},defaultSpeedTestModels:ia.value}),ea.value={},aa.value={},await ja(),Hs.success("全部模型设置已重置为内置默认值")}catch(e){Hs.error("重置失败:"+e.message)}}const Da=t(()=>j.value.webUI!==E.value.webUI||j.value.proxy!==E.value.proxy||j.value.codexProxy!==E.value.codexProxy||j.value.geminiProxy!==E.value.geminiProxy||j.value.opencodeProxy!==E.value.opencodeProxy||j.value.ompProxy!==E.value.ompProxy||ie.value.maxLogs!==ve.value.maxLogs||ie.value.statsInterval!==ve.value.statsInterval||ie.value.enableSessionBinding!==ve.value.enableSessionBinding),Na=t(()=>function(e=[]){return _r(e).map(e=>({label:e.label||e.title||e.key,value:e.key}))}(B.value)),Ba=t(()=>JSON.stringify(N.value)!==JSON.stringify(q.value.homeCliColumns)||JSON.stringify(kr(B.value))!==JSON.stringify(q.value.customCliPlatforms)),Ra=t(()=>Ve.value.newPassword&&Ve.value.confirmPassword?Ve.value.newPassword.length<4?"密码至少 4 位":Ve.value.newPassword!==Ve.value.confirmPassword?"两次输入的新密码不一致":"":""),Fa=t(()=>!(!Ve.value.newPassword||!Ve.value.confirmPassword)&&(!Ra.value&&!(He.value.hasPassword&&!Ve.value.currentPassword))),Ha=t(()=>[{key:"appearance",label:"外观设置",icon:L(wa)},{key:"notification",label:"通知设置",icon:L(ka)},{key:"advanced",label:"高级设置",icon:L(_a)},{key:"security",label:"安全设置",icon:L(Ca)},{key:"model-settings",label:"模型设置",icon:L(ca)}]);async function Ga(){var e,a,l;try{const t=await Ks();if(t.success&&t.config){A.value=!1!==(null==(e=t.config.panelVisibility)?void 0:e.showChannels),O.value=!1!==(null==(a=t.config.panelVisibility)?void 0:a.showLogs),$.value=!0===(null==(l=t.config.channelBalance)?void 0:l.showRemaining);const s=kr(t.config.customCliPlatforms||[]),n=xr(t.config.homeCliColumns||t.config.dashboardChannelOrder,s);B.value=s.map(e=>({...e})),N.value=n,q.value={homeCliColumns:[...n],customCliPlatforms:s.map(e=>({...e}))}}}catch(t){}}function Ka(){B.value=kr(B.value),N.value=xr(N.value,B.value)}function qa(){const e=B.value.length+1;B.value.push({key:`custom-cli-${e}`,name:`Custom CLI ${e}`,command:"",configDir:"",icon:"",color:"",enabled:!0}),Ka()}function Wa(){N.value=[...wr]}async function Va(){W.value=!0;try{Ka();const e=kr(B.value),a=xr(N.value,e),l=await Ks(),t=l.success&&l.config?l.config:{},s=await qs({...t,customCliPlatforms:e,homeCliColumns:a,dashboardChannelOrder:a});if(!s.success)throw new Error(s.message||"保存失败");B.value=e.map(e=>({...e})),N.value=a,q.value={homeCliColumns:[...a],customCliPlatforms:e.map(e=>({...e}))};try{localStorage.setItem("dashboardChannelOrder",JSON.stringify(a))}catch{}window.dispatchEvent(new CustomEvent("home-cli-columns-change",{detail:{homeCliColumns:a,customCliPlatforms:e}})),Hs.success("首页 CLI 显示已保存")}catch(e){Hs.error("保存失败: "+e.message)}finally{W.value=!1}}async function Ja(){try{await Vs("panelVisibility","showChannels",A.value),await Vs("panelVisibility","showLogs",O.value),await Vs("channelBalance","showRemaining",$.value)}catch(e){}}function Za(e){A.value=e,Ja(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:e,showLogs:O.value}}))}function Qa(e){O.value=e,Ja(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:A.value,showLogs:e}}))}function Ya(e){$.value=e,Ja(),window.dispatchEvent(new CustomEvent("channel-balance-visibility-change",{detail:{showRemaining:e}}))}async function Xa(e){try{(await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:j.value,maxLogs:ie.value.maxLogs,statsInterval:ie.value.statsInterval,enableSessionBinding:e})})).ok?(ve.value.enableSessionBinding=e,Hs.success(e?"会话绑定已开启":"会话绑定已关闭")):(ie.value.enableSessionBinding=!e,Hs.error("保存失���"))}catch(a){ie.value.enableSessionBinding=!e,Hs.error("保存失败: "+a.message)}}async function el(){Me.value=!0;try{me.some(e=>{const a=Te.value[e.key];return a.enabled&&"browser"===a.type})&&await async function(){if(!Le.value)throw new Error("当前页面环境不支持浏览器通知,请改用 HTTPS 或 localhost 页面");if(Re(),"granted"===je.value)return;const e=await Notification.requestPermission();if(je.value=e,"granted"!==e)throw new Error("浏览器通知权限未授予")}();const e=await fetch("/api/hooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({platforms:Object.fromEntries(me.map(e=>[e.key,{enabled:Te.value[e.key].enabled,type:Te.value[e.key].type}])),remoteNotifications:{providers:Te.value.remoteNotifications.providers}})});if(e.ok){const a=await e.json(),l=ze(a);Te.value=l,Ie.value=JSON.parse(JSON.stringify(l)),$e.value=a.platform||$e.value,Hs.success("通知设置已保存")}else{const a=await e.json();Hs.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Hs.error("保存失败:"+e.message)}finally{Me.value=!1}}function al(){Ve.value={currentPassword:"",newPassword:"",confirmPassword:""}}async function ll(e=!1){return We.value&&Ze?Ze:Ge.value&&!e?Promise.resolve():(We.value=!0,Ze=(async()=>{try{const e=await Ur();e.success&&(He.value={hasPassword:Boolean(e.hasPassword)},Ge.value=!0)}catch(e){}finally{We.value=!1,Ze=null}})(),Ze)}async function tl(){var e,a;if(!Fa.value)return void Hs.warning("请完善密码信息");const l=He.value.hasPassword;Je.value=!0;try{const e={newPassword:Ve.value.newPassword};He.value.hasPassword&&(e.currentPassword=Ve.value.currentPassword);const a=await Sr(e);a.success?(He.value.hasPassword=!0,Ge.value=!0,al(),Hs.success(l?"密码已更新":"密码已设置")):Hs.error(a.error||"保存失败")}catch(t){Hs.error((null==(a=null==(e=t.response)?void 0:e.data)?void 0:a.error)||"保存失败")}finally{Je.value=!1}}async function sl(){D.value=!0;try{const e=await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:j.value,maxLogs:ie.value.maxLogs,statsInterval:ie.value.statsInterval,enableSessionBinding:ie.value.enableSessionBinding})});if(e.ok)E.value={...j.value},ve.value={...ie.value},window.dispatchEvent(new CustomEvent("advanced-config-change",{detail:{maxLogs:ie.value.maxLogs,statsInterval:ie.value.statsInterval}})),Hs.success("配置已保存,端口修改需要重启服务器生效");else{const a=await e.json();Hs.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Hs.error("保存失败:"+e.message)}finally{D.value=!1}}async function nl(){J.value=!0;try{const e=await Ir();if(e.success)V.value=!0,Hs.success("开机自启已启用");else{const a=e.message||"未知错误";a.includes("暂无运行中的进程")||a.includes("请先启动")?Hs.warning(a):Hs.error(a)}}catch(e){Hs.error(e.message||"启用失败:未知错误")}finally{J.value=!1}}async function ol(){J.value=!0;try{const e=await Mr();if(e.success)V.value=!1,Hs.success("开机自启已禁用");else{const a=e.message||"未知错误";a.includes("未启用")||a.includes("不存在")?Hs.warning(a):Hs.error(a)}}catch(e){Hs.error(e.message||"禁用失败:未知错误")}finally{J.value=!1}}return w(()=>{Re(),Ga(),ll(),ja()}),C(z,e=>{e?(Ga(),async function(){var e,a,l,t,s,n;try{const o=await fetch("/api/config/advanced");if(o.ok){const i=await o.json();j.value={webUI:(null==(e=i.ports)?void 0:e.webUI)||19999,proxy:(null==(a=i.ports)?void 0:a.proxy)||20088,codexProxy:(null==(l=i.ports)?void 0:l.codexProxy)||20089,geminiProxy:(null==(t=i.ports)?void 0:t.geminiProxy)||20090,opencodeProxy:(null==(s=i.ports)?void 0:s.opencodeProxy)||20091,ompProxy:(null==(n=i.ports)?void 0:n.ompProxy)||20092},E.value={...j.value},ie.value={maxLogs:i.maxLogs||100,statsInterval:i.statsInterval||30,enableSessionBinding:!1!==i.enableSessionBinding},ve.value={...ie.value}}}catch(o){}}(),async function(){var e;try{const a=await Tr();a&&a.success?V.value=(null==(e=a.data)?void 0:e.enabled)||!1:V.value=!1}catch(a){V.value=!1}}(),async function(){try{const e=await fetch("/api/hooks");if(e.ok){const a=await e.json(),l=ze(a);Te.value=l,Ie.value=JSON.parse(JSON.stringify(l)),$e.value=a.platform||"",Re()}}catch(e){}}(),ja(),ll(!0)):al()}),C(T,(e,a)=>{"security"===e&&ll(),"security"===a&&"security"!==e&&al()}),(e,a)=>(n(),g(d(ce),{show:z.value,"onUpdate:show":a[29]||(a[29]=e=>z.value=e),width:d(k),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{"show-header":!1,closable:"","native-scrollbar":!1},{default:u(()=>[o("div",Jr,[o("div",Zr,[o("div",Qr,[c(d(R),{size:"20",color:"var(--text-secondary)"},{default:u(()=>[c(d(xa))]),_:1}),a[30]||(a[30]=o("span",{class:"sidebar-title"},"设置分类",-1))]),o("div",Yr,[(n(!0),s(f,null,y(Ha.value,e=>(n(),s("div",{key:e.key,class:p(["menu-item",{active:T.value===e.key}]),onClick:a=>T.value=e.key},[c(d(R),{size:18,class:"menu-icon"},{default:u(()=>[(n(),g(P(e.icon)))]),_:2},1024),o("span",ec,m(e.label),1),e.badge?(n(),g(d(ue),{key:0,value:e.badge,type:e.badgeType||"info","show-zero":!1},null,8,["value","type"])):i("",!0)],10,Xr))),128))])]),o("div",ac,[r(o("div",lc,[o("div",tc,[o("div",sc,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(wa))]),_:1}),o("div",null,[a[32]||(a[32]=o("h3",{class:"panel-title"},"外观设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[31]||(a[31]=[h("自定义界面外观和主题",-1)])]),_:1})])])]),o("div",nc,[o("div",oc,[o("div",ic,[o("div",rc,[c(d(K),{strong:""},{default:u(()=>[...a[33]||(a[33]=[h("面板显示",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[34]||(a[34]=[h(" 控制右侧面板中各个区域的显示 ",-1)])]),_:1})]),o("div",cc,[o("div",uc,[o("div",dc,[c(d(K),{strong:""},{default:u(()=>[...a[35]||(a[35]=[h("显示渠道列表",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[36]||(a[36]=[h(" 在右侧面板显示 API 渠道管理区域 ",-1)])]),_:1})]),c(d(G),{value:A.value,"onUpdate:value":Za},null,8,["value"])]),o("div",pc,[o("div",vc,[c(d(K),{strong:""},{default:u(()=>[...a[37]||(a[37]=[h("显示实时日志",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[38]||(a[38]=[h(" 在 Dashboard 显示实时日志区域 ",-1)])]),_:1})]),c(d(G),{value:O.value,"onUpdate:value":Qa},null,8,["value"])]),o("div",mc,[o("div",fc,[c(d(K),{strong:""},{default:u(()=>[...a[39]||(a[39]=[h("显示剩余金额",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...a[40]||(a[40]=[h(" 在渠道卡片显示可识别 API 网关的余额 ",-1)])]),_:1})]),c(d(G),{value:$.value,"onUpdate:value":Ya},null,8,["value"])])])]),c(d(de)),o("div",yc,[o("div",gc,[c(d(K),{strong:""},{default:u(()=>[...a[41]||(a[41]=[h("首页 CLI 显示",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[42]||(a[42]=[h(" 固定四个槽位,默认是 Claude Code / Codex / Gemini / OpenCode;OMP 和自定义 CLI 可替换任一列 ",-1)])]),_:1})]),o("div",hc,[o("div",bc,[(n(!0),s(f,null,y(N.value,(e,a)=>(n(),s("div",{key:a,class:"home-cli-slot"},[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h("第 "+m(a+1)+" 列",1)]),_:2},1024),c(d(ee),{value:N.value[a],options:Na.value,size:"small","onUpdate:value":e=>function(e,a){const l=[...N.value],t=l.findIndex((l,t)=>l===a&&t!==e);l[e]=a,t>=0&&(l[t]=N.value[e]),N.value=xr(l,B.value)}(a,e)},null,8,["value","options","onUpdate:value"])]))),128))]),o("div",wc,[(n(!0),s(f,null,y(B.value,(e,l)=>(n(),s("div",{key:e.key||l,class:"custom-cli-item"},[o("div",kc,[c(d(ne),{value:e.key,"onUpdate:value":a=>e.key=a,size:"small",placeholder:"key,如 aider",onBlur:Ka},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.name,"onUpdate:value":a=>e.name=a,size:"small",placeholder:"名称"},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.command,"onUpdate:value":a=>e.command=a,size:"small",placeholder:"启动命令"},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.configDir,"onUpdate:value":a=>e.configDir=a,size:"small",placeholder:"配置目录(可选)"},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.icon,"onUpdate:value":a=>e.icon=a,size:"small",placeholder:"图标名(可选)"},null,8,["value","onUpdate:value"]),c(d(ne),{value:e.color,"onUpdate:value":a=>e.color=a,size:"small",placeholder:"颜色(可选)"},null,8,["value","onUpdate:value"])]),o("div",_c,[c(d(G),{value:e.enabled,"onUpdate:value":a=>e.enabled=a,size:"small"},null,8,["value","onUpdate:value"]),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[43]||(a[43]=[h("可作为首页列",-1)])]),_:1}),c(d(F),{text:"",size:"small",type:"error",onClick:e=>function(e){B.value.splice(e,1),Ka()}(l)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1},8,["onClick"])])]))),128))]),o("div",Cc,[c(d(F),{size:"small",onClick:qa},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[44]||(a[44]=h(" 新增自定义 CLI ",-1))]),_:1}),c(d(F),{size:"small",onClick:Wa},{default:u(()=>[...a[45]||(a[45]=[h("恢复默认四列",-1)])]),_:1}),c(d(F),{type:"primary",size:"small",loading:W.value,disabled:!Ba.value,onClick:Va},{default:u(()=>[...a[46]||(a[46]=[h(" 保存首页显示 ",-1)])]),_:1},8,["loading","disabled"])])])]),c(d(de)),o("div",xc,[o("div",Uc,[c(d(K),{strong:""},{default:u(()=>[...a[47]||(a[47]=[h("界面主题",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[48]||(a[48]=[h(" 选择你喜欢的界面主题风格 ",-1)])]),_:1})]),o("div",Pc,[o("div",{class:p(["simple-theme-item",{active:!d(I)}]),onClick:a[0]||(a[0]=e=>d(I)&&d(M)())},[c(d(R),{size:20,class:"theme-icon"},{default:u(()=>[c(d(Ua))]),_:1}),o("div",Sc,[c(d(K),{strong:""},{default:u(()=>[...a[49]||(a[49]=[h("亮色模式",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[50]||(a[50]=[h("经典的浅色主题",-1)])]),_:1})]),d(I)?i("",!0):(n(),s("div",zc,[c(d(R),{size:20,color:"#18a058"},{default:u(()=>[c(d(Be))]),_:1})]))],2),o("div",{class:p(["simple-theme-item",{active:d(I)}]),onClick:a[1]||(a[1]=e=>!d(I)&&d(M)())},[c(d(R),{size:20,class:"theme-icon"},{default:u(()=>[c(d(Pa))]),_:1}),o("div",Tc,[c(d(K),{strong:""},{default:u(()=>[...a[51]||(a[51]=[h("暗色模式",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[52]||(a[52]=[h("护眼的深色主题",-1)])]),_:1})]),d(I)?(n(),s("div",Ic,[c(d(R),{size:20,color:"#18a058"},{default:u(()=>[c(d(Be))]),_:1})])):i("",!0)],2)])])])])],512),[[b,"appearance"===T.value]]),r(o("div",Mc,[o("div",Ac,[o("div",Oc,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(ka))]),_:1}),o("div",null,[a[54]||(a[54]=o("h3",{class:"panel-title"},"通知设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[53]||(a[53]=[h("配置任务完成时的系统通知",-1)])]),_:1})])])]),o("div",$c,[o("div",jc,[(n(),s(f,null,y(me,(e,l)=>(n(),s(f,{key:e.key},[o("div",Lc,[o("div",Ec,[c(d(K),{strong:""},{default:u(()=>[h(m(e.label),1)]),_:2},1024),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[h(m(e.description),1)]),_:2},1024)]),o("div",Dc,[o("div",Nc,[o("div",Bc,[c(d(K),{strong:""},{default:u(()=>[...a[55]||(a[55]=[h("启用任务完成通知",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[h(m(e.implementation),1)]),_:2},1024)]),c(d(G),{value:Te.value[e.key].enabled,"onUpdate:value":a=>Te.value[e.key].enabled=a},null,8,["value","onUpdate:value"])]),Te.value[e.key].external?(n(),g(d(pe),{key:0,type:"warning",bordered:!1,style:{"margin-top":"16px"}},{default:u(()=>[h(m(e.externalMessage),1)]),_:2},1024)):i("",!0),Te.value[e.key].enabled?(n(),s("div",Rc,[c(d(K),{depth:"2",style:{"font-size":"13px","margin-bottom":"12px",display:"block"}},{default:u(()=>[...a[56]||(a[56]=[h(" 选择通知方式 ",-1)])]),_:1}),c(d(le),{value:Te.value[e.key].type,"onUpdate:value":a=>Te.value[e.key].type=a},{default:u(()=>[c(d(ae),{vertical:""},{default:u(()=>[c(d(te),{value:"notification"},{default:u(()=>[o("div",Fc,[c(d(K),{strong:""},{default:u(()=>[h(m(De("notification")),1)]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[h(m(Ne("notification")),1)]),_:1})])]),_:1}),c(d(te),{value:"browser",disabled:!Le.value},{default:u(()=>[o("div",Hc,[c(d(K),{strong:""},{default:u(()=>[h(m(De("browser")),1)]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[h(m(Ne("browser")),1)]),_:1})])]),_:1},8,["disabled"]),c(d(te),{value:"dialog"},{default:u(()=>[o("div",Gc,[c(d(K),{strong:""},{default:u(()=>[h(m(De("dialog")),1)]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[h(m(Ne("dialog")),1)]),_:1})])]),_:1})]),_:1})]),_:1},8,["value","onUpdate:value"]),"claude"===e.key&&"darwin"===$e.value?(n(),g(d(pe),{key:0,type:"info",bordered:!1,style:{"margin-top":"16px"},"show-icon":!1},{default:u(()=>[o("div",Kc,[c(d(K),{strong:""},{default:u(()=>[...a[57]||(a[57]=[h("[TIP] 更好的通知体验",-1)])]),_:1}),c(d(K),{depth:"3",style:{display:"block","margin-top":"4px","font-size":"12px"}},{default:u(()=>[...a[58]||(a[58]=[h(" 安装 terminal-notifier 后,点击通知可自动打开终端 ",-1)])]),_:1}),c(d(K),{code:"",style:{display:"block","margin-top":"8px","font-size":"12px"}},{default:u(()=>[...a[59]||(a[59]=[h(" brew install terminal-notifier ",-1)])]),_:1})])]),_:1})):i("",!0),"browser"===Te.value[e.key].type?(n(),g(d(pe),{key:1,type:"info",bordered:!1,style:{"margin-top":"16px"}},{default:u(()=>[h(" 当前权限状态:"+m(Ee.value),1)]),_:1})):i("",!0)])):i("",!0)])]),l<me.length-1?(n(),g(d(de),{key:0})):i("",!0)],64))),64)),c(d(de)),o("div",qc,[o("div",Wc,[c(d(K),{strong:""},{default:u(()=>[...a[60]||(a[60]=[h("远程通知渠道",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[61]||(a[61]=[h(" 支持微信、QQ、飞书、企业微信、钉钉、Telegram ",-1)])]),_:1})]),o("div",Vc,[o("div",Jc,[c(d(ee),{value:Oe.value,"onUpdate:value":a[2]||(a[2]=e=>Oe.value=e),options:d(be),size:"small",style:{"max-width":"220px"}},null,8,["value","options"]),c(d(F),{size:"small",secondary:"",type:"primary",onClick:Fe},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[62]||(a[62]=h(" 添加渠道 ",-1))]),_:1})]),0===Te.value.remoteNotifications.providers.length?(n(),g(d(Q),{key:0,description:"还没有远程通知渠道",style:{padding:"20px 0"}})):i("",!0),(n(!0),s(f,null,y(Te.value.remoteNotifications.providers,e=>{return n(),s("div",{key:e.id,class:"remote-provider-card"},[o("div",Zc,[o("div",Qc,[o("div",Yc,m((l=e.type,ge[l]||"通")),1),o("div",Xc,[o("div",eu,[c(d(K),{strong:""},{default:u(()=>[h(m(e.name||Ue(e.type)),1)]),_:2},1024),c(d(H),{size:"tiny",bordered:!1,type:e.enabled?"success":"default"},{default:u(()=>[h(m(e.enabled?"已启用":"未启用"),1)]),_:2},1032,["type"])]),c(d(K),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:u(()=>[h(m(Pe(e.type)),1)]),_:2},1024)])]),c(d(ae),{size:"small",align:"center"},{default:u(()=>[c(d(G),{value:e.enabled,"onUpdate:value":a=>e.enabled=a,size:"small"},null,8,["value","onUpdate:value"]),c(d(F),{size:"small",quaternary:"",circle:"",type:"error",onClick:a=>{return l=e.id,void(Te.value.remoteNotifications.providers=Te.value.remoteNotifications.providers.filter(e=>e.id!==l));var l}},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1},8,["onClick"])]),_:2},1024)]),o("div",au,[o("div",lu,[a[63]||(a[63]=o("span",{class:"remote-field-label"},"渠道名称",-1)),c(d(ne),{value:e.name,"onUpdate:value":a=>e.name=a,size:"small",placeholder:"例如:我的飞书"},null,8,["value","onUpdate:value"])]),"wechatBot"===e.type?(n(),s(f,{key:0},[o("div",tu,[a[64]||(a[64]=o("span",{class:"remote-field-label"},"token.json 路径",-1)),c(d(ne),{value:e.config.tokenFile,"onUpdate:value":a=>e.config.tokenFile=a,size:"small",placeholder:"~/.wxbot/token.json"},null,8,["value","onUpdate:value"])]),o("div",su,[a[65]||(a[65]=o("span",{class:"remote-field-label"},"Token",-1)),c(d(ne),{value:e.config.botToken,"onUpdate:value":a=>e.config.botToken=a,size:"small",type:"password","show-password-on":"click",placeholder:"可直接填写 token"},null,8,["value","onUpdate:value"])]),o("div",nu,[a[66]||(a[66]=o("span",{class:"remote-field-label"},"接收用户 ID",-1)),c(d(ne),{value:e.config.targetUserId,"onUpdate:value":a=>e.config.targetUserId=a,size:"small",placeholder:"user id"},null,8,["value","onUpdate:value"])]),o("div",ou,[a[67]||(a[67]=o("span",{class:"remote-field-label"},"Context Token",-1)),c(d(ne),{value:e.config.contextToken,"onUpdate:value":a=>e.config.contextToken=a,size:"small",placeholder:"可选"},null,8,["value","onUpdate:value"])])],64)):"qqBot"===e.type?(n(),s(f,{key:1},[o("div",iu,[a[68]||(a[68]=o("span",{class:"remote-field-label"},"OneBot HTTP 地址",-1)),c(d(ne),{value:e.config.endpoint,"onUpdate:value":a=>e.config.endpoint=a,size:"small",placeholder:"http://127.0.0.1:3000"},null,8,["value","onUpdate:value"])]),o("div",ru,[a[69]||(a[69]=o("span",{class:"remote-field-label"},"Access Token",-1)),c(d(ne),{value:e.config.accessToken,"onUpdate:value":a=>e.config.accessToken=a,size:"small",type:"password","show-password-on":"click",placeholder:"可选"},null,8,["value","onUpdate:value"])]),o("div",cu,[a[70]||(a[70]=o("span",{class:"remote-field-label"},"接收类型",-1)),c(d(ee),{value:e.config.targetType,"onUpdate:value":a=>e.config.targetType=a,size:"small",options:we},null,8,["value","onUpdate:value"])]),o("div",uu,[a[71]||(a[71]=o("span",{class:"remote-field-label"},"用户号或群号",-1)),c(d(ne),{value:e.config.targetId,"onUpdate:value":a=>e.config.targetId=a,size:"small",placeholder:"QQ ID"},null,8,["value","onUpdate:value"])])],64)):"feishuBot"===e.type?(n(),s("div",du,[a[72]||(a[72]=o("span",{class:"remote-field-label"},"Webhook URL",-1)),c(d(ne),{value:e.config.webhookUrl,"onUpdate:value":a=>e.config.webhookUrl=a,size:"small",placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/..."},null,8,["value","onUpdate:value"])])):"wecomBot"===e.type?(n(),s("div",pu,[a[73]||(a[73]=o("span",{class:"remote-field-label"},"Webhook URL",-1)),c(d(ne),{value:e.config.webhookUrl,"onUpdate:value":a=>e.config.webhookUrl=a,size:"small",placeholder:"企业微信群机器人 Webhook URL"},null,8,["value","onUpdate:value"])])):"dingtalkBot"===e.type?(n(),s(f,{key:4},[o("div",vu,[a[74]||(a[74]=o("span",{class:"remote-field-label"},"接入模式",-1)),c(d(ee),{value:e.config.mode,"onUpdate:value":a=>e.config.mode=a,size:"small",options:ke},null,8,["value","onUpdate:value"])]),"app"===e.config.mode?(n(),s(f,{key:0},[o("div",mu,[a[75]||(a[75]=o("span",{class:"remote-field-label"},"App Key",-1)),c(d(ne),{value:e.config.clientId,"onUpdate:value":a=>e.config.clientId=a,size:"small",placeholder:"Client ID"},null,8,["value","onUpdate:value"])]),o("div",fu,[a[76]||(a[76]=o("span",{class:"remote-field-label"},"App Secret",-1)),c(d(ne),{value:e.config.clientSecret,"onUpdate:value":a=>e.config.clientSecret=a,size:"small",type:"password","show-password-on":"click",placeholder:"Secret"},null,8,["value","onUpdate:value"])]),o("div",yu,[a[77]||(a[77]=o("span",{class:"remote-field-label"},"接收类型",-1)),c(d(ee),{value:e.config.targetType,"onUpdate:value":a=>e.config.targetType=a,size:"small",options:_e},null,8,["value","onUpdate:value"])]),o("div",gu,[a[78]||(a[78]=o("span",{class:"remote-field-label"},"接收对象 ID",-1)),c(d(ne),{value:e.config.targetId,"onUpdate:value":a=>e.config.targetId=a,size:"small",placeholder:"用户 ID 或群会话 ID"},null,8,["value","onUpdate:value"])])],64)):(n(),s("div",hu,[a[79]||(a[79]=o("span",{class:"remote-field-label"},"Webhook URL",-1)),c(d(ne),{value:e.config.webhookUrl,"onUpdate:value":a=>e.config.webhookUrl=a,size:"small",placeholder:"钉钉自定义机器人 Webhook URL"},null,8,["value","onUpdate:value"])]))],64)):"telegramBot"===e.type?(n(),s(f,{key:5},[o("div",bu,[a[80]||(a[80]=o("span",{class:"remote-field-label"},"Token",-1)),c(d(ne),{value:e.config.botToken,"onUpdate:value":a=>e.config.botToken=a,size:"small",type:"password","show-password-on":"click",placeholder:"Telegram token"},null,8,["value","onUpdate:value"])]),o("div",wu,[a[81]||(a[81]=o("span",{class:"remote-field-label"},"Chat ID",-1)),c(d(ne),{value:e.config.chatId,"onUpdate:value":a=>e.config.chatId=a,size:"small",placeholder:"Chat ID"},null,8,["value","onUpdate:value"])]),o("div",ku,[a[82]||(a[82]=o("span",{class:"remote-field-label"},"Proxy",-1)),c(d(ne),{value:e.config.proxy,"onUpdate:value":a=>e.config.proxy=a,size:"small",placeholder:"可选,例如 http://127.0.0.1:2082"},null,8,["value","onUpdate:value"])])],64)):i("",!0)]),o("div",_u,[c(d(F),{size:"small",secondary:"",loading:Ae.value===e.id,onClick:a=>async function(e){Ae.value=e.id;try{const a=await fetch("/api/hooks/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e})}),l=await a.json().catch(()=>({}));if(!a.ok)throw new Error(l.error||"测试通知发送失败");Hs.success(l.message||"测试通知已发送")}catch(a){Hs.error("测试失败:"+a.message)}finally{Ae.value=""}}(e)},{default:u(()=>[...a[83]||(a[83]=[h(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h(m(Se(e.type)),1)]),_:2},1024)])]);var l}),128))])])])]),o("div",Cu,[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{size:"large",onClick:a[3]||(a[3]=e=>z.value=!1)},{default:u(()=>[...a[84]||(a[84]=[h(" 取消 ",-1)])]),_:1}),c(d(F),{type:"primary",size:"large",loading:Me.value,disabled:JSON.stringify(Te.value)===JSON.stringify(Ie.value),onClick:el},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Sa))]),_:1})]),default:u(()=>[a[85]||(a[85]=h(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[b,"notification"===T.value]]),r(o("div",xu,[o("div",Uu,[o("div",Pu,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(_a))]),_:1}),o("div",null,[a[87]||(a[87]=o("h3",{class:"panel-title"},"高级设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[86]||(a[86]=[h("端口配置和高级选项",-1)])]),_:1})])])]),o("div",Su,[o("div",zu,[o("div",Tu,[o("div",Iu,[c(d(K),{strong:""},{default:u(()=>[...a[88]||(a[88]=[h("端口配置",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[89]||(a[89]=[h(" 修改后需要重启服务器才能生效 ",-1)])]),_:1})]),o("div",Mu,[o("div",Au,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[90]||(a[90]=[h("Web UI 端口",-1)])]),_:1}),c(d(oe),{value:j.value.webUI,"onUpdate:value":a[4]||(a[4]=e=>j.value.webUI=e),min:1024,max:65535,"show-button":!1,placeholder:"19999"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Be))]),_:1})]),_:1},8,["value"])]),o("div",Ou,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[91]||(a[91]=[h("Claude 代理",-1)])]),_:1}),c(d(oe),{value:j.value.proxy,"onUpdate:value":a[5]||(a[5]=e=>j.value.proxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20088"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(_a))]),_:1})]),_:1},8,["value"])]),o("div",$u,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[92]||(a[92]=[h("Codex 代理",-1)])]),_:1}),c(d(oe),{value:j.value.codexProxy,"onUpdate:value":a[6]||(a[6]=e=>j.value.codexProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20089"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(_a))]),_:1})]),_:1},8,["value"])]),o("div",ju,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[93]||(a[93]=[h("Gemini 代理",-1)])]),_:1}),c(d(oe),{value:j.value.geminiProxy,"onUpdate:value":a[7]||(a[7]=e=>j.value.geminiProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20090"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(_a))]),_:1})]),_:1},8,["value"])]),o("div",Lu,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[94]||(a[94]=[h("OpenCode 代理",-1)])]),_:1}),c(d(oe),{value:j.value.opencodeProxy,"onUpdate:value":a[8]||(a[8]=e=>j.value.opencodeProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20091"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(_a))]),_:1})]),_:1},8,["value"])]),o("div",Eu,[c(d(K),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:u(()=>[...a[95]||(a[95]=[h("OMP 托管端口",-1)])]),_:1}),c(d(oe),{value:j.value.ompProxy,"onUpdate:value":a[9]||(a[9]=e=>j.value.ompProxy=e),min:1024,max:65535,"show-button":!1,placeholder:"20092"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(_a))]),_:1})]),_:1},8,["value"])])])]),c(d(de)),o("div",Du,[o("div",Nu,[c(d(K),{strong:""},{default:u(()=>[...a[96]||(a[96]=[h("负载均衡",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[97]||(a[97]=[h(" 多渠道负载均衡时的分配策略 ",-1)])]),_:1})]),o("div",Bu,[o("div",Ru,[o("div",Fu,[c(d(K),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[98]||(a[98]=[h("多渠道负载会话绑定",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[99]||(a[99]=[h("开启后同一对话始终使用同一渠道,保证上下文连续性",-1)])]),_:1})]),c(d(G),{value:ie.value.enableSessionBinding,"onUpdate:value":[a[10]||(a[10]=e=>ie.value.enableSessionBinding=e),Xa],size:"medium"},null,8,["value"])])])]),c(d(de)),o("div",Hu,[o("div",Gu,[c(d(K),{strong:""},{default:u(()=>[...a[100]||(a[100]=[h("日志和性能",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[101]||(a[101]=[h(" 控制日志显示和数据刷新行为 ",-1)])]),_:1})]),o("div",Ku,[o("div",qu,[o("div",Wu,[c(d(K),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[102]||(a[102]=[h("实时日志保留数量",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[103]||(a[103]=[h("超过此数量将自动清理旧日志",-1)])]),_:1})]),c(d(oe),{value:ie.value.maxLogs,"onUpdate:value":a[11]||(a[11]=e=>ie.value.maxLogs=e),min:50,max:500,step:10,style:{width:"140px"}},{suffix:u(()=>[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[104]||(a[104]=[h("条",-1)])]),_:1})]),_:1},8,["value"])]),o("div",Vu,[o("div",Ju,[c(d(K),{depth:"2",style:{"font-size":"13px"}},{default:u(()=>[...a[105]||(a[105]=[h("统计数据刷新间隔",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[106]||(a[106]=[h("自动刷新今日统计的时间间隔",-1)])]),_:1})]),c(d(oe),{value:ie.value.statsInterval,"onUpdate:value":a[12]||(a[12]=e=>ie.value.statsInterval=e),min:10,max:300,step:5,style:{width:"140px"}},{suffix:u(()=>[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[107]||(a[107]=[h("秒",-1)])]),_:1})]),_:1},8,["value"])])])]),c(d(de)),o("div",Zu,[o("div",Qu,[c(d(K),{strong:""},{default:u(()=>[...a[108]||(a[108]=[h("开机自启",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[109]||(a[109]=[h(" 启用此选项后,重启电脑时 coding-tool-x 会自动启动 ",-1)])]),_:1})]),o("div",Yu,[o("div",Xu,[o("div",ed,[c(d(K),{strong:"",style:{flex:"1"}},{default:u(()=>[h(m(Y.value),1)]),_:1}),V.value?(n(),g(d(F),{key:1,type:"warning",size:"small",loading:J.value,onClick:ol},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(za))]),_:1})]),default:u(()=>[a[111]||(a[111]=h(" 禁用自启 ",-1))]),_:1},8,["loading"])):(n(),g(d(F),{key:0,type:"primary",size:"small",loading:J.value,onClick:nl},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Be))]),_:1})]),default:u(()=>[a[110]||(a[110]=h(" 启用自启 ",-1))]),_:1},8,["loading"]))]),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h(m(X.value),1)]),_:1})])])])])]),o("div",ad,[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{size:"large",onClick:a[13]||(a[13]=e=>z.value=!1)},{default:u(()=>[...a[112]||(a[112]=[h(" 取消 ",-1)])]),_:1}),c(d(F),{type:"primary",size:"large",loading:D.value,disabled:!Da.value,onClick:sl},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Sa))]),_:1})]),default:u(()=>[a[113]||(a[113]=h(" 保存端口配置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[b,"advanced"===T.value]]),r(o("div",ld,[o("div",td,[o("div",sd,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(Ca))]),_:1}),o("div",null,[a[115]||(a[115]=o("h3",{class:"panel-title"},"安全设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[114]||(a[114]=[h("设置访问密码,保护面板访问",-1)])]),_:1})])])]),o("div",nd,[o("div",od,[o("div",id,[o("div",rd,[c(d(K),{strong:""},{default:u(()=>[...a[116]||(a[116]=[h("访问保护",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[117]||(a[117]=[h(" 启用后,重新打开面板时需要先输入访问密码 ",-1)])]),_:1})]),o("div",cd,[He.value.hasPassword?(n(),g(d(H),{key:0,type:"success",bordered:!1},{default:u(()=>[...a[118]||(a[118]=[h(" 已启用 ",-1)])]),_:1})):(n(),g(d(H),{key:1,type:"warning",bordered:!1},{default:u(()=>[...a[119]||(a[119]=[h(" 未启用 ",-1)])]),_:1}))])]),c(d(de)),o("div",ud,[o("div",dd,[c(d(K),{strong:""},{default:u(()=>[h(m(He.value.hasPassword?"修改密码":"设置密码"),1)]),_:1}),c(d(K),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:u(()=>[...a[120]||(a[120]=[h(" 密码至少 4 位,建议包含数字与字母 ",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px","margin-top":"4px"}},{default:u(()=>[a[122]||(a[122]=h(" 忘记密码可在终端执行 ",-1)),c(d(K),{code:""},{default:u(()=>[...a[121]||(a[121]=[h("ctx security reset",-1)])]),_:1}),a[123]||(a[123]=h(" 关闭密码 ",-1))]),_:1})]),o("div",pd,[He.value.hasPassword?(n(),g(d(ne),{key:0,value:Ve.value.currentPassword,"onUpdate:value":a[14]||(a[14]=e=>Ve.value.currentPassword=e),type:"password",placeholder:"当前密码","show-password-on":"click"},null,8,["value"])):i("",!0),c(d(ne),{value:Ve.value.newPassword,"onUpdate:value":a[15]||(a[15]=e=>Ve.value.newPassword=e),type:"password",placeholder:"新密码","show-password-on":"click"},null,8,["value"]),c(d(ne),{value:Ve.value.confirmPassword,"onUpdate:value":a[16]||(a[16]=e=>Ve.value.confirmPassword=e),type:"password",placeholder:"确认新密码","show-password-on":"click"},null,8,["value"]),Ra.value?(n(),g(d(K),{key:1,depth:"3",class:"security-error"},{default:u(()=>[h(m(Ra.value),1)]),_:1})):i("",!0)])])])]),o("div",vd,[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{size:"large",onClick:a[17]||(a[17]=e=>z.value=!1)},{default:u(()=>[...a[124]||(a[124]=[h(" 取消 ",-1)])]),_:1}),c(d(F),{type:"primary",size:"large",loading:Je.value,disabled:!Fa.value,onClick:tl},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Sa))]),_:1})]),default:u(()=>[a[125]||(a[125]=h(" 保存密码 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[b,"security"===T.value]]),r(o("div",md,[o("div",fd,[o("div",yd,[c(d(R),{size:"24",color:"var(--text-secondary)"},{default:u(()=>[c(d(ca))]),_:1}),o("div",null,[a[127]||(a[127]=o("h3",{class:"panel-title"},"模型设置",-1)),c(d(K),{depth:"3",class:"panel-subtitle"},{default:u(()=>[...a[126]||(a[126]=[h("管理默认测速模型、模型上下文窗口和定价信息",-1)])]),_:1})])])]),o("div",gd,[c(d(Z),{show:Qe.value},{default:u(()=>[o("div",hd,[o("div",bd,[c(d(K),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[128]||(a[128]=[h("默认测速模型",-1)])]),_:1}),o("div",wd,[(n(),s(f,null,y(ua,e=>o("div",{key:e.key,class:"speed-test-default-row"},[o("div",kd,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h(m(e.label),1)]),_:2},1024)]),c(d(ee),{value:ia.value[e.key],"onUpdate:value":a=>ia.value[e.key]=a,options:Aa.value[e.key],placeholder:`选择${e.label}默认测速模型`,disabled:0===(Aa.value[e.key]||[]).length,size:"small",filterable:""},null,8,["value","onUpdate:value","options","placeholder","disabled"])])),64))])])]),o("div",_d,[c(d(ne),{value:la.value,"onUpdate:value":a[18]||(a[18]=e=>la.value=e),placeholder:"搜索模型 ID...",clearable:"",size:"small",style:{flex:"1","min-width":"0"}},null,8,["value"]),c(d(F),{size:"small",type:"primary",onClick:fa},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[129]||(a[129]=h(" 新增 ",-1))]),_:1})]),o("div",Cd,[c(d(le),{value:ta.value,"onUpdate:value":a[19]||(a[19]=e=>ta.value=e),size:"small"},{default:u(()=>[c(d(te),{value:"all"},{default:u(()=>[...a[130]||(a[130]=[h("全部",-1)])]),_:1}),c(d(te),{value:"claude"},{default:u(()=>[...a[131]||(a[131]=[h("Claude",-1)])]),_:1}),c(d(te),{value:"openai"},{default:u(()=>[...a[132]||(a[132]=[h("OpenAI",-1)])]),_:1}),c(d(te),{value:"gemini"},{default:u(()=>[...a[133]||(a[133]=[h("Gemini",-1)])]),_:1}),c(d(te),{value:"overrides"},{default:u(()=>[...a[134]||(a[134]=[h("自定义",-1)])]),_:1})]),_:1},8,["value"])]),0===Ia.value.length?(n(),s("div",xd,[c(d(Q),{description:"没有匹配的模型"})])):(n(),s("div",Ud,[(n(!0),s(f,null,y(Ia.value,e=>(n(),s("div",{key:e,class:p(["model-card",{expanded:da.value.has(e)}])},[o("div",{class:"model-card-header",onClick:a=>(e=>{da.value.has(e)?da.value.delete(e):da.value.add(e),da.value=new Set(da.value)})(e)},[c(d(R),{size:"14",class:"expand-icon"},{default:u(()=>[c(d(Ta))]),_:1}),o("span",Sd,m(e),1),ea.value[e]?(n(),g(d(H),{key:0,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[...a[135]||(a[135]=[h("自定义",-1)])]),_:1})):i("",!0),o("div",{class:"model-card-actions",onClick:a[20]||(a[20]=v(()=>{},["stop"]))},[ea.value[e]&&ha(e)?(n(),g(d(F),{key:0,size:"tiny",quaternary:"",type:"warning",onClick:a=>async function(e){try{await x(e),delete ea.value[e],delete aa.value[e],await ja(),Hs.success(`${e} 已重置为内置默认值`)}catch(a){Hs.error("重置失败:"+a.message)}}(e)},{default:u(()=>[...a[136]||(a[136]=[h(" 重置 ",-1)])]),_:1},8,["onClick"])):i("",!0),ba(e)?(n(),g(d(F),{key:1,size:"tiny",quaternary:"",type:"error",onClick:a=>async function(e){try{const a=!!ea.value[e];a&&(await x(e),delete ea.value[e]),delete aa.value[e],ba(e)?delete Xe.value[e]:a&&await ja(),Hs.success(`已删除模型:${e}`)}catch(a){Hs.error("删除失败:"+a.message)}}(e)},{default:u(()=>[...a[137]||(a[137]=[h(" 删除 ",-1)])]),_:1},8,["onClick"])):i("",!0)])],8,Pd),da.value.has(e)?(n(),s("div",zd,[o("div",Td,[o("div",Id,[c(d(K),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[138]||(a[138]=[h("上下文限制",-1)])]),_:1}),o("div",Md,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[139]||(a[139]=[h("Context 窗口 (tokens)",-1)])]),_:1}),c(d(oe),{value:Oa(e,"limit","context"),"onUpdate:value":a=>$a(e,"limit","context",a),min:1e3,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[140]||(a[140]=[h("Max Output (tokens)",-1)])]),_:1}),c(d(oe),{value:Oa(e,"limit","output"),"onUpdate:value":a=>$a(e,"limit","output",a),min:100,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])]),o("div",Ad,[c(d(K),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:u(()=>[...a[141]||(a[141]=[h("定价(USD / 百万 tokens)",-1)])]),_:1}),o("div",Od,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[142]||(a[142]=[h("输入价格",-1)])]),_:1}),c(d(oe),{value:Oa(e,"pricing","input"),"onUpdate:value":a=>$a(e,"pricing","input",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[143]||(a[143]=[h("输出价格",-1)])]),_:1}),c(d(oe),{value:Oa(e,"pricing","output"),"onUpdate:value":a=>$a(e,"pricing","output",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[144]||(a[144]=[h("缓存写入价格",-1)])]),_:1}),c(d(oe),{value:Oa(e,"pricing","cacheCreation"),"onUpdate:value":a=>$a(e,"pricing","cacheCreation",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...a[145]||(a[145]=[h("缓存读取价格",-1)])]),_:1}),c(d(oe),{value:Oa(e,"pricing","cacheRead"),"onUpdate:value":a=>$a(e,"pricing","cacheRead",a),min:0,step:.01,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])])])])):i("",!0)],2))),128))]))]),_:1},8,["show"])]),o("div",$d,[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{size:"large",onClick:Ea,disabled:0===Object.keys(ea.value).length},{default:u(()=>[...a[146]||(a[146]=[h(" 重置全部 ",-1)])]),_:1},8,["disabled"]),c(d(F),{type:"primary",size:"large",loading:Ye.value,disabled:!va.value,onClick:La},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Sa))]),_:1})]),default:u(()=>[a[147]||(a[147]=h(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[b,"model-settings"===T.value]])])]),c(d(se),{show:sa.value,"onUpdate:show":a[28]||(a[28]=e=>sa.value=e),preset:"card",title:"新增模型设置",style:{width:"560px"},"mask-closable":!1},{default:u(()=>[c(d(ae),{vertical:"",size:12},{default:u(()=>[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[148]||(a[148]=[h("模型 ID",-1)])]),_:1}),c(d(ne),{value:na.value.modelId,"onUpdate:value":a[21]||(a[21]=e=>na.value.modelId=e),placeholder:"例如:gpt-4.1-mini",clearable:""},null,8,["value"])]),o("div",jd,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[149]||(a[149]=[h("Context 窗口",-1)])]),_:1}),c(d(oe),{value:na.value.context,"onUpdate:value":a[22]||(a[22]=e=>na.value.context=e),min:1e3,step:1e3,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[150]||(a[150]=[h("Max Output",-1)])]),_:1}),c(d(oe),{value:na.value.output,"onUpdate:value":a[23]||(a[23]=e=>na.value.output=e),min:100,step:100,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),o("div",Ld,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[151]||(a[151]=[h("输入价格",-1)])]),_:1}),c(d(oe),{value:na.value.inputPrice,"onUpdate:value":a[24]||(a[24]=e=>na.value.inputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[152]||(a[152]=[h("输出价格",-1)])]),_:1}),c(d(oe),{value:na.value.outputPrice,"onUpdate:value":a[25]||(a[25]=e=>na.value.outputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),o("div",Ed,[o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[153]||(a[153]=[h("缓存写入价格",-1)])]),_:1}),c(d(oe),{value:na.value.cacheCreationPrice,"onUpdate:value":a[26]||(a[26]=e=>na.value.cacheCreationPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),o("div",null,[c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[154]||(a[154]=[h("缓存读取价格",-1)])]),_:1}),c(d(oe),{value:na.value.cacheReadPrice,"onUpdate:value":a[27]||(a[27]=e=>na.value.cacheReadPrice=e),min:0,step:.01,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),ma.value?(n(),g(d(K),{key:0,depth:"3",class:"security-error"},{default:u(()=>[h(m(ma.value),1)]),_:1})):i("",!0),c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:ya},{default:u(()=>[...a[155]||(a[155]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",disabled:!!ma.value,onClick:ga},{default:u(()=>[...a[156]||(a[156]=[h(" 新增 ",-1)])]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-9c23d322"]]);async function Nd(e){return(await ct.post("/mcp/servers",e)).data}function Bd(e,a="操作失败"){const l=String(function(e){var a,l,t,s,n,o,i,r,c,u,d,p,v,m;return e?"string"==typeof e?e:e.message||e.error||(null==(a=e.result)?void 0:a.message)||(null==(l=e.result)?void 0:l.error)||(null==(s=null==(t=e.response)?void 0:t.data)?void 0:s.message)||(null==(o=null==(n=e.response)?void 0:n.data)?void 0:o.error)||(null==(c=null==(r=null==(i=e.response)?void 0:i.data)?void 0:r.result)?void 0:c.message)||(null==(p=null==(d=null==(u=e.response)?void 0:u.data)?void 0:d.result)?void 0:p.error)||(null==(v=e.data)?void 0:v.message)||(null==(m=e.data)?void 0:m.error)||"":""}(e)||"").trim();return l||a}function Rd(e,a,l="操作失败",t=""){const s=Bd(a,l),n=function(e){var a,l,t,s,n,o,i,r,c,u,d,p,v;return(null==e?void 0:e.hint)||(null==(a=null==e?void 0:e.data)?void 0:a.hint)||(null==(l=null==e?void 0:e.result)?void 0:l.hint)||(null==(s=null==(t=null==e?void 0:e.result)?void 0:t.data)?void 0:s.hint)||(null==(o=null==(n=null==e?void 0:e.response)?void 0:n.data)?void 0:o.hint)||(null==(c=null==(r=null==(i=null==e?void 0:e.response)?void 0:i.data)?void 0:r.result)?void 0:c.hint)||(null==(v=null==(p=null==(d=null==(u=null==e?void 0:e.response)?void 0:u.data)?void 0:d.result)?void 0:p.data)?void 0:v.hint)||null}(a),o=s.split(/\r?\n/).map(e=>e.trim()).filter(Boolean),i=[null==n?void 0:n.title,...Array.isArray(null==n?void 0:n.details)?n.details:[]].map(e=>String(e||"").trim()).filter(Boolean).filter(e=>!o.includes(e)),r=[...o,...i],c=r[0]||l,u=r.slice(1),d=t?`${t}${c}`:c;return e.error(d,{duration:u.length>0?8e3:5e3}),u.length>0&&e.warning(u.join("\n"),{duration:12e3,closable:!0}),s}const Fd={class:"drawer-header"},Hd={class:"header-title"},Gd={class:"drawer-footer"},Kd={class:"form-content"},qd={key:0,class:"form-group"},Wd={class:"group-title"},Vd={class:"preset-grid"},Jd=["onClick"],Zd={class:"form-group"},Qd={class:"group-title"},Yd={class:"field"},Xd={key:0,class:"field-error"},ep={class:"field"},ap={class:"form-group"},lp={class:"group-title"},tp={class:"platform-toggles"},sp={class:"platform-item"},np={class:"platform-item"},op={class:"platform-item"},ip={class:"platform-item"},rp={class:"platform-item"},cp={class:"form-group"},up={class:"group-title"},dp={class:"field"},pp={class:"field"},vp={class:"field"},mp={class:"field"},fp={class:"kv-row"},yp={class:"field"},gp={class:"field"},hp={class:"kv-row"},bp={class:"collapse-header"},wp={class:"collapse-content"},kp={class:"field"},_p={class:"field"},Cp={class:"field-row"},xp={class:"field"},Up={class:"field"},Pp=zl({__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:r}=oi(520),v=e,b=a,w=t({get:()=>v.visible,set:e=>b("update:visible",e)}),k=t(()=>!!v.editingServer),x=l([]),U=l(!1),P=l(-1),S=l(!1),z=_({id:"",name:"",description:"",homepage:"",docs:"",apps:{claude:!0,codex:!1,gemini:!1,opencode:!1,omp:!1},server:{type:"stdio",command:"",args:[],env:{},url:"",headers:{}}}),T=l("stdio"),I=l([]),M=l([]),A=l(""),O=t(()=>z.id.trim()&&!k.value&&v.existingIds.includes(z.id.trim())?"该 ID 已存在":"");function $(e){return v.existingIds.includes(e)}async function j(){U.value=!0;try{const e=await async function(){return(await ct.get("/mcp/presets")).data}();e.success&&(x.value=e.presets)}catch(e){}finally{U.value=!1}}function L(){P.value=-1,E()}function E(){z.id="",z.name="",z.description="",z.homepage="",z.docs="",z.apps={claude:!0,codex:!1,gemini:!1,opencode:!1,omp:!1},z.server={type:"stdio",command:"",args:[],env:{},url:"",headers:{}},T.value="stdio",I.value=[],M.value=[],A.value=""}async function D(){var e,a,l,t,s;if(!z.id.trim())return void Hs.error("请输入服务器 ID");if(O.value)return void Hs.error(O.value);if("stdio"===T.value&&!(null==(e=z.server.command)?void 0:e.trim()))return void Hs.error("请输入命令");if(("streamable_http"===T.value||"sse"===T.value)&&!(null==(a=z.server.url)?void 0:a.trim()))return void Hs.error("请输入 URL");const n={type:T.value};if("stdio"===T.value){n.command=z.server.command,(null==(l=z.server.args)?void 0:l.length)&&(n.args=z.server.args.filter(e=>e.trim()));const e={};I.value.forEach(a=>{a.key.trim()&&(e[a.key.trim()]=a.value)}),Object.keys(e).length>0&&(n.env=e)}else{n.url=z.server.url;const e={};M.value.forEach(a=>{a.key.trim()&&(e[a.key.trim()]=a.value)}),Object.keys(e).length>0&&(n.headers=e)}const o={id:z.id.trim(),name:z.name.trim()||z.id.trim(),server:n,apps:z.apps};z.description.trim()&&(o.description=z.description.trim()),z.homepage.trim()&&(o.homepage=z.homepage.trim()),z.docs.trim()&&(o.docs=z.docs.trim()),A.value.trim()&&(o.tags=A.value.split(",").map(e=>e.trim()).filter(e=>e)),S.value=!0;try{(await Nd(o)).success&&(Hs.success(k.value?"保存成功":"添加成功"),b("saved"),w.value=!1)}catch(i){Hs.error((null==(s=null==(t=i.response)?void 0:t.data)?void 0:s.error)||"保存失败")}finally{S.value=!1}}return C(()=>v.visible,e=>{e&&(j(),v.editingServer?function(){const e=v.editingServer;e&&(z.id=e.id,z.name=e.name||"",z.description=e.description||"",z.homepage=e.homepage||"",z.docs=e.docs||"",z.apps={claude:!0,codex:!1,gemini:!1,opencode:!1,omp:!1,...e.apps},A.value=(e.tags||[]).join(", "),e.server&&(T.value=e.server.type||"stdio",z.server={...e.server},z.server.type=T.value,e.server.env?I.value=Object.entries(e.server.env).map(([e,a])=>({key:e,value:a})):I.value=[],e.server.headers?M.value=Object.entries(e.server.headers).map(([e,a])=>({key:e,value:a})):M.value=[]))}():(E(),P.value=-1))}),C(T,e=>{z.server.type=e}),(e,a)=>(n(),g(d(ce),{show:w.value,"onUpdate:show":a[19]||(a[19]=e=>w.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",Fd,[c(d(F),{quaternary:"",size:"small",onClick:a[0]||(a[0]=e=>w.value=!1)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ja))]),_:1})]),_:1}),o("span",Hd,m(k.value?"编辑 MCP 服务器":"添加 MCP 服务器"),1)])]),footer:u(()=>[o("div",Gd,[c(d(F),{onClick:a[1]||(a[1]=e=>w.value=!1)},{default:u(()=>[...a[20]||(a[20]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:S.value,onClick:D},{default:u(()=>[h(m(k.value?"保存":"添加"),1)]),_:1},8,["loading"])])]),default:u(()=>[c(d(Z),{show:U.value},{default:u(()=>[o("div",Kd,[k.value?i("",!0):(n(),s("div",qd,[o("div",Wd,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d(Ia))]),_:1}),a[21]||(a[21]=o("span",null,"快速选择",-1))]),o("div",Vd,[o("div",{class:p(["preset-chip",{active:-1===P.value}]),onClick:L},[c(d(R),{size:14},{default:u(()=>[c(d(Ke))]),_:1}),a[22]||(a[22]=o("span",null,"自定义",-1))],2),(n(!0),s(f,null,y(x.value,(e,l)=>(n(),g(d(ie),{key:e.id,disabled:!$(e.id)},{trigger:u(()=>[o("div",{class:p(["preset-chip",{active:P.value===l,disabled:$(e.id)}]),onClick:a=>!$(e.id)&&function(e){P.value=e;const a=x.value[e];if(!a)return;let l=a.id,t=1;for(;v.existingIds.includes(l);)l=`${a.id}-${t}`,t++;z.id=l,z.name=a.name||a.id,z.description=a.description||"",z.homepage=a.homepage||"",z.docs=a.docs||"",A.value=(a.tags||[]).join(", "),a.server&&(T.value=a.server.type||"stdio",z.server={...a.server},z.server.type=T.value,a.server.env?I.value=Object.entries(a.server.env).map(([e,a])=>({key:e,value:a})):I.value=[],a.server.headers?M.value=Object.entries(a.server.headers).map(([e,a])=>({key:e,value:a})):M.value=[])}(l)},[h(m(e.id)+" ",1),$(e.id)?(n(),g(d(R),{key:0,size:12,class:"installed-icon"},{default:u(()=>[c(d(Be))]),_:1})):i("",!0)],10,Jd)]),default:u(()=>[a[23]||(a[23]=h(" 已安装 ",-1))]),_:2},1032,["disabled"]))),128))])])),o("div",Zd,[o("div",Qd,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d(Ma))]),_:1}),a[24]||(a[24]=o("span",null,"基本信息",-1))]),o("div",Yd,[a[25]||(a[25]=o("label",{class:"field-label"},[h(" ID "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:z.id,"onUpdate:value":a[2]||(a[2]=e=>z.id=e),placeholder:"服务器唯一标识,如 fetch、memory",disabled:k.value,status:O.value?"error":void 0},null,8,["value","disabled","status"]),O.value?(n(),s("span",Xd,m(O.value),1)):i("",!0)]),o("div",ep,[a[26]||(a[26]=o("label",{class:"field-label"},"显示名称",-1)),c(d(ne),{value:z.name,"onUpdate:value":a[3]||(a[3]=e=>z.name=e),placeholder:"可选,用于展示的名称"},null,8,["value"])])]),o("div",ap,[o("div",lp,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d(Aa))]),_:1}),a[27]||(a[27]=o("span",null,"启用平台",-1))]),o("div",tp,[o("label",sp,[c(d(G),{size:"small",value:z.apps.claude,"onUpdate:value":a[4]||(a[4]=e=>z.apps.claude=e)},null,8,["value"]),a[28]||(a[28]=o("span",{class:"platform-name"},"Claude",-1))]),o("label",np,[c(d(G),{size:"small",value:z.apps.codex,"onUpdate:value":a[5]||(a[5]=e=>z.apps.codex=e)},null,8,["value"]),a[29]||(a[29]=o("span",{class:"platform-name"},"Codex",-1))]),o("label",op,[c(d(G),{size:"small",value:z.apps.gemini,"onUpdate:value":a[6]||(a[6]=e=>z.apps.gemini=e)},null,8,["value"]),a[30]||(a[30]=o("span",{class:"platform-name"},"Gemini",-1))]),o("label",ip,[c(d(G),{size:"small",value:z.apps.opencode,"onUpdate:value":a[7]||(a[7]=e=>z.apps.opencode=e)},null,8,["value"]),a[31]||(a[31]=o("span",{class:"platform-name"},"OpenCode",-1))]),o("label",rp,[c(d(G),{size:"small",value:z.apps.omp,"onUpdate:value":a[8]||(a[8]=e=>z.apps.omp=e)},null,8,["value"]),a[32]||(a[32]=o("span",{class:"platform-name"},"OMP",-1))])])]),o("div",cp,[o("div",up,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d(Oa))]),_:1}),a[33]||(a[33]=o("span",null,"服务器配置",-1))]),o("div",dp,[a[37]||(a[37]=o("label",{class:"field-label"},"类型",-1)),c(d(le),{value:T.value,"onUpdate:value":a[9]||(a[9]=e=>T.value=e),class:"type-radios"},{default:u(()=>[c(d(te),{value:"stdio"},{default:u(()=>[...a[34]||(a[34]=[o("span",{class:"radio-label"},"stdio",-1),o("span",{class:"radio-desc"},"本地命令",-1)])]),_:1}),c(d(te),{value:"streamable_http"},{default:u(()=>[...a[35]||(a[35]=[o("span",{class:"radio-label"},"streamable_http",-1)])]),_:1}),c(d(te),{value:"sse"},{default:u(()=>[...a[36]||(a[36]=[o("span",{class:"radio-label"},"sse",-1)])]),_:1})]),_:1},8,["value"])]),"stdio"===T.value?(n(),s(f,{key:0},[o("div",pp,[a[38]||(a[38]=o("label",{class:"field-label"},[h(" 命令 "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:z.server.command,"onUpdate:value":a[10]||(a[10]=e=>z.server.command=e),placeholder:"如 npx、uvx、node"},null,8,["value"])]),o("div",vp,[a[39]||(a[39]=o("label",{class:"field-label"},"参数",-1)),c(d(ve),{value:z.server.args,"onUpdate:value":a[11]||(a[11]=e=>z.server.args=e),placeholder:"点击添加参数",min:0},null,8,["value"])]),o("div",mp,[a[41]||(a[41]=o("label",{class:"field-label"},"环境变量",-1)),c(d(ve),{value:I.value,"onUpdate:value":a[12]||(a[12]=e=>I.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:u(({value:e})=>[o("div",fp,[c(d(ne),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"变量名",class:"kv-key"},null,8,["value","onUpdate:value"]),a[40]||(a[40]=o("span",{class:"kv-sep"},"=",-1)),c(d(ne),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64)):(n(),s(f,{key:1},[o("div",yp,[a[42]||(a[42]=o("label",{class:"field-label"},[h(" URL "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:z.server.url,"onUpdate:value":a[13]||(a[13]=e=>z.server.url=e),placeholder:"http://localhost:3000/mcp"},null,8,["value"])]),o("div",gp,[a[44]||(a[44]=o("label",{class:"field-label"},"请求头",-1)),c(d(ve),{value:M.value,"onUpdate:value":a[14]||(a[14]=e=>M.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:u(({value:e})=>[o("div",hp,[c(d(ne),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"Header 名",class:"kv-key"},null,8,["value","onUpdate:value"]),a[43]||(a[43]=o("span",{class:"kv-sep"},":",-1)),c(d(ne),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64))]),c(d(me),{class:"extra-collapse"},{default:u(()=>[c(d(fe),{name:"extra"},{header:u(()=>[o("div",bp,[c(d(R),{size:16,class:"group-icon"},{default:u(()=>[c(d($a))]),_:1}),a[45]||(a[45]=o("span",null,"附加信息",-1)),a[46]||(a[46]=o("span",{class:"collapse-hint"},"(可选)",-1))])]),default:u(()=>[o("div",wp,[o("div",kp,[a[47]||(a[47]=o("label",{class:"field-label"},"描述",-1)),c(d(ne),{value:z.description,"onUpdate:value":a[15]||(a[15]=e=>z.description=e),type:"textarea",placeholder:"服务器功能描述",rows:2},null,8,["value"])]),o("div",_p,[a[48]||(a[48]=o("label",{class:"field-label"},"标签",-1)),c(d(ne),{value:A.value,"onUpdate:value":a[16]||(a[16]=e=>A.value=e),placeholder:"用逗号分隔,如 http, web, fetch"},null,8,["value"])]),o("div",Cp,[o("div",xp,[a[49]||(a[49]=o("label",{class:"field-label"},"主页",-1)),c(d(ne),{value:z.homepage,"onUpdate:value":a[17]||(a[17]=e=>z.homepage=e),placeholder:"https://github.com/..."},null,8,["value"])]),o("div",Up,[a[50]||(a[50]=o("label",{class:"field-label"},"文档",-1)),c(d(ne),{value:z.docs,"onUpdate:value":a[18]||(a[18]=e=>z.docs=e),placeholder:"https://..."},null,8,["value"])])])])]),_:1})]),_:1})])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-3a372956"]]),Sp={class:"tool-card"},zp={class:"tool-header"},Tp={class:"tool-name"},Ip={key:0,class:"tool-description"},Mp={key:1,class:"tool-parameters"},Ap={class:"params-header"},Op={class:"params-list"},$p={class:"param-info"},jp={class:"param-name"},Lp={key:0,class:"param-description"},Ep={key:2,class:"no-parameters"},Dp=zl({__name:"McpToolCard",props:{tool:{type:Object,required:!0}},emits:["test"],setup(e){const a=e,l=t(()=>{var e;return(null==(e=a.tool.inputSchema)?void 0:e.properties)||{}}),r=t(()=>{var e;return(null==(e=a.tool.inputSchema)?void 0:e.required)||[]}),p=t(()=>Object.keys(l.value).length>0);function v(e){return r.value.includes(e)}return(a,t)=>(n(),s("div",Sp,[o("div",zp,[o("h3",Tp,m(e.tool.name),1),c(d(F),{size:"small",type:"primary",quaternary:"",onClick:t[0]||(t[0]=e=>a.$emit("test"))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(La))]),_:1})]),default:u(()=>[t[1]||(t[1]=h(" 测试工具 ",-1))]),_:1})]),e.tool.description?(n(),s("p",Ip,m(e.tool.description),1)):i("",!0),p.value?(n(),s("div",Mp,[o("div",Ap,[c(d(R),{size:14,class:"params-icon"},{default:u(()=>[c(d(xa))]),_:1}),t[2]||(t[2]=o("span",{class:"params-label"},"参数列表",-1))]),o("div",Op,[(n(!0),s(f,null,y(l.value,(e,a)=>(n(),s("div",{key:a,class:"param-item"},[o("div",$p,[o("span",jp,m(a),1),c(d(H),{type:v(a)?"error":"default",size:"tiny",bordered:!1},{default:u(()=>[h(m(v(a)?"必填":"可选"),1)]),_:2},1032,["type"]),e.type?(n(),g(d(H),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>{return[h(m((a=e.type,Array.isArray(a)?a.filter(e=>"null"!==e).join(" | "):a)),1)];var a}),_:2},1024)):i("",!0)]),e.description?(n(),s("p",Lp,m(e.description),1)):i("",!0)]))),128))])])):(n(),s("div",Ep,[c(d(K),{depth:"3"},{default:u(()=>[...t[3]||(t[3]=[h("无需参数",-1)])]),_:1})]))]))}},[["__scopeId","data-v-1fcd002c"]]),Np={class:"field-label"},Bp={key:0,class:"required"},Rp={key:0,class:"empty-schema"},Fp=zl({__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,r=a,v=t(()=>{var e;return(null==(e=l.schema)?void 0:e.properties)||{}}),b=t(()=>{var e;return(null==(e=l.schema)?void 0:e.required)||[]}),w=t(()=>Object.keys(v.value));function k(e){const a=v.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 b.value.includes(e)}function x(e){var a;return(null==(a=v.value[e])?void 0:a.description)||""}function U(e){const a=v.value[e];return Array.isArray(null==a?void 0:a.enum)&&a.enum.length>0}function P(e){const a=v.value[e];return Array.isArray(null==a?void 0:a.enum)?a.enum.map(e=>({label:String(e),value:e})):[]}function S(e){const a=v.value[e];return(null==a?void 0:a.description)?a.description:null!=(null==a?void 0:a.default)?`默认: ${a.default}`:`请输入 ${e}`}function z(e){const a=v.value[e];return a&&(a.properties||a.additionalProperties)?a:null}function T(e,a){r("update:modelValue",{...l.modelValue,[e]:a})}return C(()=>[l.schema,w.value],()=>{!function(){const e={};let a=!1;for(const t of w.value){const s=v.value[t];null!=(null==s?void 0:s.default)&&void 0===l.modelValue[t]&&(e[t]=s.default,a=!0)}a&&r("update:modelValue",{...l.modelValue,...e})}()},{immediate:!0,deep:!0}),(a,l)=>{const t=E("McpDynamicForm",!0);return n(),s("div",{class:p(["dynamic-form",{"nested-form":e.depth>0}])},[e.depth>=e.maxDepth?(n(),g(d(pe),{key:0,type:"warning",bordered:!1,class:"depth-warning"},{default:u(()=>[h(" 嵌套层级已达上限("+m(e.maxDepth)+" 层),无法继续展开 ",1)]),_:1})):(n(),s(f,{key:1},[(n(!0),s(f,null,y(w.value,a=>(n(),s("div",{key:a,class:"field"},[o("label",Np,[h(m(a)+" ",1),_(a)?(n(),s("span",Bp,"*")):i("",!0),x(a)?(n(),g(d(ie),{key:1,trigger:"hover"},{trigger:u(()=>[c(d(R),{size:14,class:"field-tip-icon"},{default:u(()=>[c(d(Ma))]),_:1})]),default:u(()=>[h(" "+m(x(a)),1)]),_:2},1024)):i("",!0)]),"string"===k(a)&&U(a)?(n(),g(d(ee),{key:0,value:e.modelValue[a],options:P(a),placeholder:S(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","options","placeholder","onUpdate:value"])):"string"===k(a)?(n(),g(d(ne),{key:1,value:e.modelValue[a]??"",placeholder:S(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"])):"number"===k(a)||"integer"===k(a)?(n(),g(d(oe),{key:2,value:e.modelValue[a],placeholder:S(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(d(G),{key:3,value:!!e.modelValue[a],"onUpdate:value":e=>T(a,e)},null,8,["value","onUpdate:value"])):"array"===k(a)?(n(),g(d(ve),{key:4,value:e.modelValue[a]||[],placeholder:S(a),min:0,"onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"])):"object"===k(a)&&z(a)?(n(),g(t,{key:5,schema:z(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(d(ne),{key:6,value:null!=e.modelValue[a]?String(e.modelValue[a]):"",placeholder:S(a),clearable:"","onUpdate:value":e=>T(a,e)},null,8,["value","placeholder","onUpdate:value"]))]))),128)),0===w.value.length?(n(),s("div",Rp,[c(d(K),{depth:"3"},{default:u(()=>[...l[0]||(l[0]=[h("无可配置属性",-1)])]),_:1})])):i("",!0)],64))],2)}}},[["__scopeId","data-v-b199234d"]]),Hp={class:"modal-content"},Gp={key:0,class:"tool-info"},Kp={key:1,class:"params-section"},qp={class:"section-header"},Wp={key:2,class:"no-params"},Vp={key:3,class:"result-section"},Jp={class:"section-header"},Zp={key:0,class:"result-duration"},Qp={key:0,class:"result-display"},Yp={key:1,class:"result-error"},Xp={class:"modal-footer"},ev=zl({__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 r=e,v=a,f=t({get:()=>r.visible,set:e=>v("update:visible",e)}),y=l({}),b=l(!1),w=l(null),k=t(()=>{var e,a;const l=null==(a=null==(e=r.tool)?void 0:e.inputSchema)?void 0:a.properties;return l&&Object.keys(l).length>0}),_=t(()=>null!==w.value);async function x(){if(r.serverId&&r.tool){b.value=!0,w.value=null;try{const e=await async function(e,a,l={}){return(await ct.post(`/mcp/servers/${e}/tools/test`,{toolName:a,arguments:l})).data}(r.serverId,r.tool.name,y.value);if(e.success){const a=Bd(e.result,"工具执行失败");w.value={result:e.result,duration:e.duration,isError:e.isError||!1},e.isError?(w.value.result=a,Rd(Hs,e.result,"工具执行失败",`${r.tool.name}: `)):Hs.success(`工具执行成功 (${e.duration}ms)`)}else w.value={result:Bd(e,"执行失败"),isError:!0},Rd(Hs,e,"执行失败",`${r.tool.name}: `)}catch(e){const a=Bd(e,"执行失败");w.value={result:a,isError:!0},Rd(Hs,e,"执行失败",`${r.tool.name}: `)}finally{b.value=!1}}else Hs.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 C(()=>[r.visible,r.tool],([e,a])=>{e&&a&&(y.value={},w.value=null)}),(a,l)=>{var t;return n(),g(d(se),{show:f.value,"onUpdate:show":l[2]||(l[2]=e=>f.value=e),preset:"card",title:(null==(t=e.tool)?void 0:t.name)||"测试工具",style:{width:"700px","max-width":"90vw"},segmented:{content:"soft",footer:"soft"}},{footer:u(()=>[o("div",Xp,[c(d(F),{onClick:l[1]||(l[1]=e=>f.value=!1)},{default:u(()=>[...l[7]||(l[7]=[h("关闭",-1)])]),_:1}),c(d(F),{type:"primary",loading:b.value,disabled:!e.serverId||!e.tool,onClick:x},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ea))]),_:1})]),default:u(()=>[h(" "+m(b.value?"执行中...":"执行工具"),1)]),_:1},8,["loading","disabled"])])]),default:u(()=>{var a;return[o("div",Hp,[(null==(a=e.tool)?void 0:a.description)?(n(),s("div",Gp,[c(d(pe),{type:"info",bordered:!1},{default:u(()=>[h(m(e.tool.description),1)]),_:1})])):i("",!0),k.value?(n(),s("div",Kp,[o("div",qp,[c(d(R),{size:16,class:"section-icon"},{default:u(()=>[c(d(xa))]),_:1}),l[3]||(l[3]=o("span",{class:"section-title"},"输入参数",-1))]),c(Fp,{modelValue:y.value,"onUpdate:modelValue":l[0]||(l[0]=e=>y.value=e),schema:e.tool.inputSchema},null,8,["modelValue","schema"])])):(n(),s("div",Wp,[c(d(K),{depth:"3"},{default:u(()=>[...l[4]||(l[4]=[h("此工具无需参数,可直接执行",-1)])]),_:1})])),_.value?(n(),s("div",Vp,[o("div",Jp,[c(d(R),{size:16,class:p(["section-icon",{error:w.value.isError}])},{default:u(()=>[w.value.isError?(n(),g(d(Re),{key:1})):(n(),g(d(Be),{key:0}))]),_:1},8,["class"]),l[5]||(l[5]=o("span",{class:"section-title"},"执行结果",-1)),null!=w.value.duration?(n(),s("span",Zp,m(w.value.duration)+"ms ",1)):i("",!0)]),w.value.isError?(n(),s("div",Yp,[c(d(pe),{type:"error",bordered:!1},{header:u(()=>[...l[6]||(l[6]=[h("执行失败",-1)])]),default:u(()=>{var e;return[h(" "+m((null==(e=w.value.result)?void 0:e.message)||w.value.result||"未知错误"),1)]}),_:1})])):(n(),s("div",Qp,[c(d(ye),{code:U(w.value.result),language:"json","word-wrap":!0},null,8,["code"])]))])):i("",!0)])]}),_:1},8,["show","title"])}}},[["__scopeId","data-v-e945d675"]]),av={class:"drawer-header"},lv={class:"server-info"},tv={class:"server-details"},sv={class:"server-name"},nv={class:"server-meta"},ov={class:"drawer-body"},iv={key:0,class:"tools-container"},rv={class:"tools-stats"},cv={class:"stats-text"},uv={key:0,class:"stats-duration"},dv={class:"collapse-header"},pv={class:"tool-index"},vv={class:"tool-title"},mv={key:1,class:"empty-state"},fv={key:2,class:"error-state"},yv=zl({__name:"McpServerDetailDrawer",props:{visible:{type:Boolean,default:!1},server:{type:Object,default:null}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=oi(600),v=e,b=a,w=t({get:()=>v.visible,set:e=>b("update:visible",e)}),k=l(!1),_=l([]),x=l(""),U=l(0),P=l(!1),S=l(null);async function z(){var e,a,l,t,s;if(null==(e=v.server)?void 0:e.id){k.value=!0,x.value="",_.value=[],U.value=0;try{const e=await async function(e){return(await ct.get(`/mcp/servers/${e}/tools`)).data}(v.server.id);e.success?(_.value=e.tools||[],U.value=e.duration||0):(x.value=Bd(e,"获取工具列表失败"),Rd(Hs,e,"获取工具列表失败",`${(null==(a=v.server)?void 0:a.name)||(null==(l=v.server)?void 0:l.id)}: `))}catch(n){x.value=Bd(n,"连接服务器失败"),Rd(Hs,n,"获取工具列表失败",`${(null==(t=v.server)?void 0:t.name)||(null==(s=v.server)?void 0:s.id)}: `)}finally{k.value=!1}}}return C(()=>v.visible,e=>{e&&v.server?z():(_.value=[],x.value="",U.value=0)}),(a,l)=>{var t;return n(),s(f,null,[c(d(ce),{show:w.value,"onUpdate:show":l[0]||(l[0]=e=>w.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>{var a,l,t,r,v;return[o("div",av,[o("div",lv,[c(d(R),{size:20,class:"server-icon"},{default:u(()=>[c(d(Je))]),_:1}),o("div",tv,[o("span",sv,m((null==(a=e.server)?void 0:a.name)||(null==(l=e.server)?void 0:l.id)),1),o("div",nv,[(null==(r=null==(t=e.server)?void 0:t.server)?void 0:r.type)?(n(),g(d(H),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(m(e.server.server.type),1)]),_:1})):i("",!0),(null==(v=e.server)?void 0:v.status)?(n(),s("span",{key:1,class:p(["status-dot",{online:"online"===e.server.status,error:"error"===e.server.status}])},null,2)):i("",!0)])])])])]}),default:u(()=>[o("div",ov,[c(d(ge),{type:"line",animated:""},{default:u(()=>[c(d(he),{name:"tools",tab:"工具列表"},{default:u(()=>[c(d(Z),{show:k.value},{default:u(()=>[!k.value&&_.value.length>0?(n(),s("div",iv,[o("div",rv,[o("span",cv,"共 "+m(_.value.length)+" 个工具",1),U.value?(n(),s("span",uv," 耗时 "+m(U.value)+"ms ",1)):i("",!0)]),c(d(me),{"arrow-placement":"right","default-expanded-names":[]},{default:u(()=>[(n(!0),s(f,null,y(_.value,(e,a)=>(n(),g(d(fe),{key:e.name,name:a},{header:u(()=>[o("div",dv,[o("span",pv,m(a+1),1),o("span",vv,m(e.name),1)])]),default:u(()=>[c(Dp,{tool:e,onTest:a=>function(e){S.value=e,P.value=!0}(e)},null,8,["tool","onTest"])]),_:2},1032,["name"]))),128))]),_:1})])):k.value||0!==_.value.length?i("",!0):(n(),s("div",mv,[c(d(R),{size:48,class:"empty-icon"},{default:u(()=>[c(d(Da))]),_:1}),l[2]||(l[2]=o("p",{class:"empty-title"},"该服务器未提供工具",-1)),l[3]||(l[3]=o("p",{class:"empty-desc"},"此 MCP 服务器没有注册任何可用工具",-1))])),x.value?(n(),s("div",fv,[c(d(pe),{type:"error",bordered:!1},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Na))]),_:1})]),default:u(()=>[h(" "+m(x.value),1)]),_:1})])):i("",!0)]),_:1},8,["show"])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]),c(ev,{visible:P.value,"onUpdate:visible":l[1]||(l[1]=e=>P.value=e),"server-id":null==(t=e.server)?void 0:t.id,tool:S.value},null,8,["visible","server-id","tool"])],64)}}},[["__scopeId","data-v-d38ad0a4"]]),gv={class:"drawer-header"},hv={class:"header-title"},bv={class:"header-actions"},wv={class:"mcp-container"},kv={class:"stats-bar"},_v={class:"stats-text"},Cv={class:"server-list"},xv={key:0,class:"empty-state"},Uv=["onClick","onDragstart","onDragover","onDrop"],Pv={class:"card-header"},Sv={class:"card-title"},zv={class:"server-name"},Tv={class:"card-actions"},Iv={key:0,class:"card-desc"},Mv={key:1,class:"card-tags"},Av={class:"card-apps"},Ov={class:"paste-modal-content"},$v={key:0,class:"parse-error"},jv={class:"paste-modal-footer"},Lv={class:"batch-modal-content"},Ev={class:"batch-actions"},Dv={class:"batch-selected"},Nv={class:"batch-list"},Bv={class:"batch-item-info"},Rv={class:"batch-item-header"},Fv={class:"batch-item-name"},Hv={class:"batch-item-detail"},Gv={key:0},Kv={key:1,class:"batch-args"},qv={class:"batch-modal-footer"},Wv={class:"export-modal-content"},Vv={class:"export-info"},Jv={class:"export-modal-footer"},Zv=zl({__name:"McpDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=oi(720),b=e,w=a,k=t({get:()=>b.visible,set:e=>w("update:visible",e)}),x=l(!1),U=l({}),P=l(!1),S=l(null),z=_({}),T=l(null),I=l(null),M=l(!1),A=l(""),O=l(""),$=l(!1),j=l(!1),L=l([]),E=l([]),D=l(!1),N=l(!1),B=l({format:"",content:"",filename:""}),K=l(!1),q=l(null),W=t(()=>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=t(()=>W.value.length),J=t(()=>Object.keys(U.value)),Q=t(()=>{const e=W.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,omp:e.filter(e=>{var a;return null==(a=e.apps)?void 0:a.omp}).length}}),Y=t({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"},{label:"同步 OMP 已有配置",key:"omp"}],ee=[{label:"导出为 JSON (通用)",key:"json"},{label:"导出为 Claude 格式",key:"claude"},{label:"导出为 Codex 格式 (TOML)",key:"codex"},{label:"导出为 OpenCode 格式",key:"opencode"},{label:"导出为 Gemini 格式",key:"gemini"},{label:"导出为 OMP 格式",key:"omp"}];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 oe(){x.value=!0;try{const e=await async function(){return(await ct.get("/mcp/servers")).data}();e.success&&(U.value=e.servers)}catch(e){Hs.error("加载 MCP 服务器失败")}finally{x.value=!1}}async function ue(e){z[e.id]=!0,U.value[e.id].status="testing";try{const a=await async function(e){return(await ct.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?Hs.success(`${e.name||e.id}: ${l.message} (${l.duration}ms)`):Rd(Hs,l,"测试失败",`${e.name||e.id}: `)}}catch(a){U.value[e.id].status="error",Rd(Hs,a,"测试失败",`${e.name||e.id}: `)}finally{z[e.id]=!1}}async function de(e,a,l){try{const t=await async function(e,a,l){return(await ct.post(`/mcp/servers/${e}/toggle`,{app:a,enabled:l})).data}(e,a,l);t.success&&(U.value[e]=t.server,Hs.success(`已${l?"启用":"禁用"} ${a}`))}catch(t){Hs.error("操作失败")}}function pe(e){Gs.warning({title:"删除确认",content:`确定要删除 MCP 服务器 "${e.name||e.id}" 吗?此操作将从所有平台配置中移除该服务器。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await ct.delete(`/mcp/servers/${e}`)).data}(e.id)).success&&(delete U.value[e.id],Hs.success("删除成功"))}catch(a){Hs.error("删除失败")}}})}async function ve(e){try{const a=await async function(e){return(await ct.post(`/mcp/import/${e}`)).data}(e);a.success&&(Hs.success(a.message),await oe())}catch(a){Hs.error("同步失败")}}async function me(e){try{const a=await async function(e="json"){return(await ct.get("/mcp/export",{params:{format:e}})).data}(e);a.success&&(B.value={format:a.format,content:a.content,filename:a.filename},N.value=!0)}catch(a){Hs.error("导出失败")}}async function fe(){try{const e=await Fo(B.value.content);if("manual"===(null==e?void 0:e.method))return void Hs.warning("自动复制失败,已弹出手动复制框");Hs.success("已复制到剪贴板")}catch{Hs.error("复制失败")}}function ye(){const e=new Blob([B.value.content],{type:"text/plain"}),a=URL.createObjectURL(e),l=document.createElement("a");l.href=a,l.download=B.value.filename,l.click(),URL.revokeObjectURL(a),Hs.success("下载成功")}function ge(){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=[...W.value],[s]=t.splice(l,1);t.splice(a,0,s);const n=t.map(e=>e.id);try{await async function(e){return(await ct.post("/mcp/servers/order",{serverIds:e})).data}(n),await oe()}catch(o){Hs.error("排序保存失败")}T.value=null}function ke(){S.value=null,P.value=!0}function _e(){oe()}function Ce(){O.value="",$.value=!0;try{let l,t=A.value.trim();if(!t)return O.value="请输入配置内容",void($.value=!1);t.startsWith("{")||t.startsWith("[")||(t=t.replace(/^[\s,]+/,""),t=t.replace(/[\s,]+$/,""),t=`{${t}}`);try{l=JSON.parse(t)}catch(e){let s=t.replace(/\}\s*"/g,'}, "');try{l=JSON.parse(s)}catch(a){return O.value="JSON 格式错误:"+e.message,void($.value=!1)}}const s=[];let n=null;if(l.mcpServers&&"object"==typeof l.mcpServers)n=l.mcpServers;else if(l.mcp_servers&&"object"==typeof l.mcp_servers)n=l.mcp_servers;else if(l.command||l.url)n={"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 O.value="未找到有效的 MCP 服务器配置,请检查 JSON 格式",void($.value=!1);n=l}for(const[e,a]of Object.entries(n)){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,omp:!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||"streamable_http",l.server.url=a.url,a.headers&&"object"==typeof a.headers&&(l.server.headers=a.headers)),s.push(l)}if(0===s.length)return O.value="未找到有效的 MCP 服务器配置",void($.value=!1);1!==s.length||te(s[0].id)?(L.value=s,E.value=s.filter(e=>!te(e.id)).map(e=>e.id),j.value=!0,M.value=!1):(S.value=s[0],P.value=!0,M.value=!1,A.value="")}catch(l){O.value="解析失败:"+l.message}finally{$.value=!1}}function xe(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 s=L.value.find(e=>e.id===t);if(s)try{await Nd(s),e++}catch(l){a++}}e>0?(Hs.success(`成功导入 ${e} 个服务器${a>0?`,${a} 个失败`:""}`),await oe()):Hs.error("导入失败"),j.value=!1,A.value="",L.value=[],E.value=[]}catch(l){Hs.error("批量导入失败")}finally{D.value=!1}}return C(()=>b.visible,e=>{e&&oe()}),C(M,e=>{e||(O.value="")}),(e,a)=>(n(),s(f,null,[c(d(ce),{show:k.value,"onUpdate:show":a[6]||(a[6]=e=>k.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{title:"MCP 服务器管理",closable:"","native-scrollbar":!1},{header:u(()=>[o("div",gv,[o("div",hv,[c(d(R),{size:20,class:"header-icon"},{default:u(()=>[c(d(Je))]),_:1}),a[17]||(a[17]=o("span",null,"MCP 服务器管理",-1))]),o("div",bv,[c(d(be),{trigger:"click",options:ee,onSelect:me},{default:u(()=>[c(d(F),{size:"small",quaternary:""},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fa))]),_:1})]),default:u(()=>[a[18]||(a[18]=h(" 导出 ",-1))]),_:1})]),_:1}),c(d(F),{size:"small",type:"primary",ghost:"",onClick:a[0]||(a[0]=e=>M.value=!0)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ra))]),_:1})]),default:u(()=>[a[19]||(a[19]=h(" 粘贴解析 ",-1))]),_:1}),c(d(F),{size:"small",type:"primary",onClick:ke},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d($a))]),_:1})]),default:u(()=>[a[20]||(a[20]=h(" 添加 ",-1))]),_:1})])])]),default:u(()=>[o("div",wv,[o("div",kv,[o("span",_v,[h(" 共 "+m(V.value)+" 个服务器 ",1),V.value>0?(n(),s(f,{key:0},[h(" · Claude: "+m(Q.value.claude)+" · Codex: "+m(Q.value.codex)+" · Gemini: "+m(Q.value.gemini)+" · OpenCode: "+m(Q.value.opencode)+" · OMP: "+m(Q.value.omp),1)],64)):i("",!0)]),c(d(be),{trigger:"click",options:X,onSelect:ve},{default:u(()=>[c(d(F),{size:"tiny",quaternary:""},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(aa))]),_:1})]),default:u(()=>[a[21]||(a[21]=h(" 同步 ",-1))]),_:1})]),_:1})]),o("div",Cv,[c(d(Z),{show:x.value},{default:u(()=>[0!==W.value.length||x.value?(n(),s("div",{key:1,class:"server-cards",ref_key:"serverCardsRef",ref:I},[(n(!0),s(f,null,y(W.value,(e,l)=>{var t,r,b,w,k,_,C;return n(),s("div",{key:e.id,class:p(["server-card",{dragging:T.value===l}]),draggable:"true",onClick:a=>function(e){q.value=e,K.value=!0}(e),onDragstart:e=>function(e,a){T.value=a,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",a)}(e,l),onDragend:ge,onDragover:e=>{return(a=e).preventDefault(),void(a.dataTransfer.dropEffect="move");var a},onDrop:e=>he(e,l)},[o("div",Pv,[o("div",Sv,[c(d(R),{class:"drag-handle",size:14},{default:u(()=>[c(d(Ba))]),_:1}),o("span",zv,m(e.name||e.id),1),(null==(t=e.server)?void 0:t.type)?(n(),g(d(H),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(m(e.server.type),1)]),_:2},1024)):i("",!0),e.status?(n(),g(d(ie),{key:1},{trigger:u(()=>[o("span",{class:p(["status-dot",{online:"online"===e.status,error:"error"===e.status,testing:"testing"===e.status}])},null,2)]),default:u(()=>[h(" "+m(ae(e)),1)]),_:2},1024)):i("",!0)]),o("div",Tv,[c(d(ie),null,{trigger:u(()=>[c(d(F),{quaternary:"",size:"tiny",loading:z[e.id],onClick:v(a=>ue(e),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ea))]),_:1})]),_:1},8,["loading","onClick"])]),default:u(()=>[a[24]||(a[24]=h(" 测试连接 ",-1))]),_:2},1024),c(d(F),{quaternary:"",size:"tiny",onClick:v(a=>function(e){S.value=e,P.value=!0}(e),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ra))]),_:1})]),_:1},8,["onClick"]),c(d(F),{quaternary:"",size:"tiny",onClick:v(a=>pe(e),["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1},8,["onClick"])])]),e.description?(n(),s("p",Iv,m(e.description),1)):i("",!0),(null==(r=e.tags)?void 0:r.length)?(n(),s("div",Mv,[(n(!0),s(f,null,y(e.tags.slice(0,3),e=>(n(),g(d(H),{key:e,size:"tiny",bordered:!1},{default:u(()=>[h(m(e),1)]),_:2},1024))),128))])):i("",!0),o("div",Av,[o("label",{class:"app-toggle",onClick:a[1]||(a[1]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(b=e.apps)?void 0:b.claude,"onUpdate:value":a=>de(e.id,"claude",a)},null,8,["value","onUpdate:value"]),a[25]||(a[25]=o("span",{class:"app-label"},"Claude",-1))]),o("label",{class:"app-toggle",onClick:a[2]||(a[2]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(w=e.apps)?void 0:w.codex,"onUpdate:value":a=>de(e.id,"codex",a)},null,8,["value","onUpdate:value"]),a[26]||(a[26]=o("span",{class:"app-label"},"Codex",-1))]),o("label",{class:"app-toggle",onClick:a[3]||(a[3]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(k=e.apps)?void 0:k.gemini,"onUpdate:value":a=>de(e.id,"gemini",a)},null,8,["value","onUpdate:value"]),a[27]||(a[27]=o("span",{class:"app-label"},"Gemini",-1))]),o("label",{class:"app-toggle",onClick:a[4]||(a[4]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(_=e.apps)?void 0:_.opencode,"onUpdate:value":a=>de(e.id,"opencode",a)},null,8,["value","onUpdate:value"]),a[28]||(a[28]=o("span",{class:"app-label"},"OpenCode",-1))]),o("label",{class:"app-toggle",onClick:a[5]||(a[5]=v(()=>{},["stop"]))},[c(d(G),{size:"small",value:null==(C=e.apps)?void 0:C.omp,"onUpdate:value":a=>de(e.id,"omp",a)},null,8,["value","onUpdate:value"]),a[29]||(a[29]=o("span",{class:"app-label"},"OMP",-1))])])],42,Uv)}),128))],512)):(n(),s("div",xv,[c(d(R),{size:48,class:"empty-icon"},{default:u(()=>[c(d(Je))]),_:1}),a[22]||(a[22]=o("p",{class:"empty-title"},"暂无 MCP 服务器",-1)),a[23]||(a[23]=o("p",{class:"empty-desc"},'点击上方"添加"按钮添加 MCP 服务器,或"粘贴解析"快速导入',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),c(Pp,{visible:P.value,"onUpdate:visible":a[7]||(a[7]=e=>P.value=e),"editing-server":S.value,"existing-ids":J.value,onSaved:_e},null,8,["visible","editing-server","existing-ids"]),c(d(se),{show:M.value,"onUpdate:show":a[10]||(a[10]=e=>M.value=e),preset:"card",title:"粘贴 MCP 配置",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[o("div",jv,[c(d(F),{onClick:a[9]||(a[9]=e=>M.value=!1)},{default:u(()=>[...a[32]||(a[32]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:Ce,loading:$.value},{default:u(()=>[...a[33]||(a[33]=[h(" 解析配置 ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[o("div",Ov,[a[30]||(a[30]=o("p",{class:"paste-hint"}," 粘贴 JSON 格式的 MCP 配置,支持单个或批量导入。格式示例: ",-1)),a[31]||(a[31]=o("pre",{class:"paste-example"},'{\n "mcpServers": {\n "服务器名称": {\n "type": "streamable_http",\n "url": "https://example.com/mcp"\n }\n }\n}',-1)),c(d(ne),{value:A.value,"onUpdate:value":a[8]||(a[8]=e=>A.value=e),type:"textarea",placeholder:"在此粘贴 JSON 配置...",rows:8,status:O.value?"error":void 0},null,8,["value","status"]),O.value?(n(),s("p",$v,m(O.value),1)):i("",!0)])]),_:1},8,["show"]),c(d(se),{show:j.value,"onUpdate:show":a[13]||(a[13]=e=>j.value=e),preset:"card",title:"选择要导入的 MCP 服务器",style:{width:"650px","max-width":"90vw"}},{footer:u(()=>[o("div",qv,[c(d(F),{onClick:a[12]||(a[12]=e=>j.value=!1)},{default:u(()=>[...a[35]||(a[35]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",disabled:0===E.value.length,loading:D.value,onClick:Ue},{default:u(()=>[h(" 导入选中 ("+m(E.value.length)+") ",1)]),_:1},8,["disabled","loading"])])]),default:u(()=>[o("div",Lv,[o("div",Ev,[c(d(we),{checked:Y.value,"onUpdate:checked":[a[11]||(a[11]=e=>Y.value=e),xe]},{default:u(()=>[h(" 全选 ("+m(L.value.length)+") ",1)]),_:1},8,["checked"]),o("span",Dv,"已选择 "+m(E.value.length)+" 个",1)]),o("div",Nv,[(n(!0),s(f,null,y(L.value,e=>{var l,t,r,v;return n(),s("div",{key:e.id,class:p(["batch-item",{selected:E.value.includes(e.id),exists:te(e.id)}])},[c(d(we),{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"]),o("div",Bv,[o("div",Rv,[o("span",Fv,m(e.id),1),te(e.id)?(n(),g(d(H),{key:0,size:"tiny",type:"warning"},{default:u(()=>[...a[34]||(a[34]=[h("已存在",-1)])]),_:1})):i("",!0),(null==(l=e.server)?void 0:l.type)?(n(),g(d(H),{key:1,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(m(e.server.type),1)]),_:2},1024)):i("",!0)]),o("div",Hv,[(null==(t=e.server)?void 0:t.command)?(n(),s("span",Gv,m(e.server.command),1)):i("",!0),(null==(v=null==(r=e.server)?void 0:r.args)?void 0:v.length)?(n(),s("span",Kv,m(e.server.args.slice(0,3).join(" "))+m(e.server.args.length>3?"...":""),1)):i("",!0)])])],2)}),128))])])]),_:1},8,["show"]),c(d(se),{show:N.value,"onUpdate:show":a[15]||(a[15]=e=>N.value=e),preset:"card",title:"导出 MCP 配置",style:{width:"650px","max-width":"90vw"}},{footer:u(()=>[o("div",Jv,[c(d(F),{onClick:a[14]||(a[14]=e=>N.value=!1)},{default:u(()=>[...a[36]||(a[36]=[h("关闭",-1)])]),_:1}),c(d(F),{onClick:fe},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ha))]),_:1})]),default:u(()=>[a[37]||(a[37]=h(" 复制 ",-1))]),_:1}),c(d(F),{type:"primary",onClick:ye},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fa))]),_:1})]),default:u(()=>[a[38]||(a[38]=h(" 下载 ",-1))]),_:1})])]),default:u(()=>[o("div",Wv,[o("div",Vv,[o("span",null,"格式: "+m(B.value.format),1),o("span",null,"文件名: "+m(B.value.filename),1)]),c(d(ne),{value:B.value.content,type:"textarea",readonly:"",rows:12,class:"export-content"},null,8,["value"])])]),_:1},8,["show"]),c(yv,{visible:K.value,"onUpdate:visible":a[16]||(a[16]=e=>K.value=e),server:q.value},null,8,["visible","server"])],64))}},[["__scopeId","data-v-5a783e62"]]);const Qv={key:0,class:"editor-container"},Yv=["innerHTML"],Xv={key:1,class:"placeholder-text"},em={class:"preview-hint"},am=zl({__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:i}){const r=e,v=i,f=l(r.defaultEditing),y=l(null);function g(e,a){pl.getLanguage(e)||pl.registerLanguage(e,a)}g("javascript",vl),g("typescript",gl),g("json",yl),g("bash",fl),g("shell",fl),g("sh",fl),g("python",ml),g("css",hl),g("xml",bl),g("html",bl);const h=new kl({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&pl.getLanguage(a))try{return'<pre class="hljs"><code>'+pl.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(l){}return'<pre class="hljs"><code>'+h.utils.escapeHtml(e)+"</code></pre>"}}),b=t(()=>h.render(r.modelValue||""));function w(){r.disabled||(f.value=!0,v("edit"),I(()=>{var e;null==(e=y.value)||e.focus()}))}function k(){f.value=!1,v("blur")}function _(){setTimeout(()=>{k()},150)}function x(){k()}return C(()=>r.defaultEditing,e=>{e&&!f.value&&w()}),a({enterEditMode:w,exitEditMode:k,isEditing:f}),(a,l)=>(n(),s("div",{class:p(["markdown-editor",{"is-editing":f.value,"is-empty":!e.modelValue}])},[f.value?(n(),s("div",Qv,[c(d(ne),{ref_key:"inputRef",ref:y,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:$(x,["esc"])},null,8,["value","rows","placeholder","disabled"]),l[1]||(l[1]=o("div",{class:"editor-hint"},[o("span",null,"按 Esc 退出编辑 | 支持 Markdown 格式")],-1))])):(n(),s("div",{key:1,class:"preview-container",style:z({minHeight:e.minHeight+"px"}),onDblclick:w},[e.modelValue?(n(),s("div",{key:0,class:"markdown-content",innerHTML:b.value},null,8,Yv)):(n(),s("div",Xv,m(e.placeholder||"双击编辑..."),1)),o("div",em,[c(d(R),{size:"12"},{default:u(()=>[c(d(Ra))]),_:1}),l[2]||(l[2]=o("span",null,"双击编辑",-1))])],36))],2))}},[["__scopeId","data-v-224a81d1"]]),lm={class:"form-header"},tm={class:"form-container"},sm={class:"form-section"},nm={class:"section-title"},om={class:"form-item"},im={key:0,class:"form-error"},rm={class:"form-item"},cm={class:"form-item"},um={class:"form-section"},dm={class:"section-title"},pm={class:"apps-toggles"},vm={class:"app-toggle"},mm={class:"app-toggle"},fm={class:"app-toggle"},ym={class:"app-toggle"},gm={class:"app-toggle"},hm={class:"form-section content-section"},bm={class:"section-title"},wm={class:"form-footer"},km=zl({__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:r}=oi(600),p=e,v=a,f=t({get:()=>p.visible,set:e=>v("update:visible",e)}),y=t(()=>!!p.editingPreset),b=l(!1),w=l(""),k=_({id:"",name:"",description:"",content:"",apps:{claude:!0,codex:!0,gemini:!0,opencode:!0,omp:!1}});async function x(){var e;if(k.id.trim()?/^[a-zA-Z0-9_-]+$/.test(k.id)?!y.value&&p.existingIds.includes(k.id)?(w.value="该 ID 已被使用",0):(w.value="",1):(w.value="ID 只能包含字母、数字、下划线和连字符",0):(w.value="预设 ID 不能为空",0))if(k.name.trim()){b.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=p.editingPreset)?void 0:e.isBuiltin)&&(a.isBuiltin=!0);const l=await async function(e){return(await ct.post("/prompts/presets",e)).data}(a);l.success&&(Hs.success(y.value?"保存成功":"创建成功"),v("saved"),f.value=!1)}catch(a){Hs.error("保存失败: "+a.message)}finally{b.value=!1}}else Hs.error("预设名称不能为空")}function U(){f.value=!1}return C(()=>p.visible,e=>{var a,l,t,s,n;e&&(p.editingPreset?(k.id=p.editingPreset.id||"",k.name=p.editingPreset.name||"",k.description=p.editingPreset.description||"",k.content=p.editingPreset.content||"",k.apps={claude:(null==(a=p.editingPreset.apps)?void 0:a.claude)??!0,codex:(null==(l=p.editingPreset.apps)?void 0:l.codex)??!0,gemini:(null==(t=p.editingPreset.apps)?void 0:t.gemini)??!0,opencode:(null==(s=p.editingPreset.apps)?void 0:s.opencode)??!0,omp:(null==(n=p.editingPreset.apps)?void 0:n.omp)??!1}):(k.id="",k.name="",k.description="",k.content="",k.apps={claude:!0,codex:!0,gemini:!0,opencode:!0,omp:!1}),w.value="")}),(a,l)=>(n(),g(d(ce),{show:f.value,"onUpdate:show":l[9]||(l[9]=e=>f.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",lm,[c(d(R),{size:18,class:"header-icon"},{default:u(()=>[c(d($a))]),_:1}),o("span",null,m(y.value?"编辑预设":"新建预设"),1)])]),footer:u(()=>[o("div",wm,[c(d(F),{onClick:U},{default:u(()=>[...l[27]||(l[27]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:x,loading:b.value},{default:u(()=>[h(m(y.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>{var a;return[o("div",tm,[o("div",sm,[o("div",nm,[c(d(R),{size:16},{default:u(()=>[c(d(Ma))]),_:1}),l[10]||(l[10]=o("span",null,"基本信息",-1))]),o("div",om,[l[11]||(l[11]=o("label",{class:"form-label"},[h("预设 ID "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:k.id,"onUpdate:value":l[0]||(l[0]=e=>k.id=e),placeholder:"唯一标识符,如 my-preset",disabled:y.value&&(null==(a=e.editingPreset)?void 0:a.isBuiltin)},null,8,["value","disabled"]),w.value?(n(),s("p",im,m(w.value),1)):i("",!0)]),o("div",rm,[l[12]||(l[12]=o("label",{class:"form-label"},[h("名称 "),o("span",{class:"required"},"*")],-1)),c(d(ne),{value:k.name,"onUpdate:value":l[1]||(l[1]=e=>k.name=e),placeholder:"预设名称"},null,8,["value"])]),o("div",cm,[l[13]||(l[13]=o("label",{class:"form-label"},"描述",-1)),c(d(ne),{value:k.description,"onUpdate:value":l[2]||(l[2]=e=>k.description=e),placeholder:"简短描述这个预设的用途"},null,8,["value"])])]),o("div",um,[o("div",dm,[c(d(R),{size:16},{default:u(()=>[c(d(Aa))]),_:1}),l[14]||(l[14]=o("span",null,"生效范围",-1))]),o("div",pm,[o("label",vm,[c(d(G),{value:k.apps.claude,"onUpdate:value":l[3]||(l[3]=e=>k.apps.claude=e)},null,8,["value"]),l[15]||(l[15]=o("span",{class:"app-name"},"Claude",-1)),l[16]||(l[16]=o("span",{class:"app-path"},"~/.claude/CLAUDE.md",-1))]),o("label",mm,[c(d(G),{value:k.apps.codex,"onUpdate:value":l[4]||(l[4]=e=>k.apps.codex=e)},null,8,["value"]),l[17]||(l[17]=o("span",{class:"app-name"},"Codex",-1)),l[18]||(l[18]=o("span",{class:"app-path"},"~/.codex/AGENTS.md",-1))]),o("label",fm,[c(d(G),{value:k.apps.gemini,"onUpdate:value":l[5]||(l[5]=e=>k.apps.gemini=e)},null,8,["value"]),l[19]||(l[19]=o("span",{class:"app-name"},"Gemini",-1)),l[20]||(l[20]=o("span",{class:"app-path"},"~/.gemini/GEMINI.md",-1))]),o("label",ym,[c(d(G),{value:k.apps.opencode,"onUpdate:value":l[6]||(l[6]=e=>k.apps.opencode=e)},null,8,["value"]),l[21]||(l[21]=o("span",{class:"app-name"},"OpenCode",-1)),l[22]||(l[22]=o("span",{class:"app-path"},"~/.config/opencode/AGENTS.md",-1))]),o("label",gm,[c(d(G),{value:k.apps.omp,"onUpdate:value":l[7]||(l[7]=e=>k.apps.omp=e)},null,8,["value"]),l[23]||(l[23]=o("span",{class:"app-name"},"OMP",-1)),l[24]||(l[24]=o("span",{class:"app-path"},"~/.omp/agent/prompts/coding-tool-x/*.md",-1))])])]),o("div",hm,[o("div",bm,[c(d(R),{size:16},{default:u(()=>[c(d(ra))]),_:1}),l[25]||(l[25]=o("span",null,"提示词内容",-1)),l[26]||(l[26]=o("span",{class:"content-hint"},"支持 Markdown 格式",-1))]),c(am,{modelValue:k.content,"onUpdate:modelValue":l[8]||(l[8]=e=>k.content=e),rows:16,"min-height":300,placeholder:"# 系统提示词\n\n在这里编写你的系统提示词..."},null,8,["modelValue"])])])]}),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-6862fc60"]]),_m={class:"drawer-header"},Cm={class:"header-title"},xm={class:"prompts-container"},Um={class:"status-card"},Pm={class:"status-info"},Sm={class:"status-text"},zm={class:"status-value"},Tm={class:"status-actions"},Im={class:"stats-bar"},Mm={class:"stats-text"},Am={class:"preset-list"},Om={key:0,class:"empty-state"},$m={key:1,class:"preset-cards"},jm={class:"card-header"},Lm={class:"card-title"},Em={class:"preset-name"},Dm={class:"card-actions"},Nm={key:0,class:"card-desc"},Bm={class:"card-apps"},Rm={class:"card-preview"},Fm={class:"preview-content"},Hm=zl({__name:"PromptsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=oi(720),v=e,b=a,w=t({get:()=>v.visible,set:e=>b("update:visible",e)}),k=l(!1),_=l({}),x=l(null),U=l(!1),P=l(null),S=l(null),z=l(!1),T=["claude","codex","gemini","opencode","omp"],I={claude:"Claude",codex:"Codex",gemini:"Gemini",opencode:"OpenCode",omp:"OMP"},M=t(()=>{const e=Object.values(_.value),a=e.filter(e=>!e.isBuiltin),l=e.filter(e=>e.isBuiltin);return a.sort((e,a)=>e.id===x.value?-1:a.id===x.value?1:(a.updatedAt||0)-(e.updatedAt||0)),[...a,...l]}),A=t(()=>M.value.length),O=t(()=>Object.keys(_.value)),$=t(()=>x.value?_.value[x.value]:null),j=t(()=>{const e=M.value;return{builtin:e.filter(e=>e.isBuiltin).length,custom:e.filter(e=>!e.isBuiltin).length}}),L=[{label:"从 Claude 导入",key:"claude"},{label:"从 Codex 导入",key:"codex"},{label:"从 Gemini 导入",key:"gemini"},{label:"从 OpenCode 导入",key:"opencode"}];function E(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 D(){k.value=!0;try{const e=await async function(){return(await ct.get("/prompts/presets")).data}();e.success&&(_.value=e.presets,x.value=e.activePresetId)}catch(e){Hs.error("加载预设失败")}finally{k.value=!1}}async function N(e){S.value=e.id;try{(await async function(e){return(await ct.post(`/prompts/presets/${e}/activate`)).data}(e.id)).success&&(x.value=e.id,Hs.success(`已激活预设 "${e.name}"`))}catch(a){Hs.error("激活失败: "+a.message)}finally{S.value=null}}async function B(){Gs.warning({title:"移除提示词",content:"确定要移除当前激活的提示词吗?这将删除各平台的提示词文件,并移除 coding-tool-x 管理的 OMP prompt template。",positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{z.value=!0;try{(await async function(){return(await ct.post("/prompts/deactivate")).data}()).success&&(x.value=null,Hs.success("已移除提示词"))}catch(e){Hs.error("移除失败: "+e.message)}finally{z.value=!1}}})}function G(e){Gs.warning({title:"删除确认",content:`确定要删除预设 "${e.name}" 吗?此操作不可恢复。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await ct.delete(`/prompts/presets/${e}`)).data}(e.id)).success&&(delete _.value[e.id],Hs.success("删除成功"))}catch(a){Hs.error("删除失败: "+a.message)}}})}async function K(e){try{const a=await async function(e,a){return(await ct.post(`/prompts/import/${e}`,{name:a})).data}(e);a.success&&(_.value[a.preset.id]=a.preset,Hs.success(a.message))}catch(a){Hs.error("导入失败: "+a.message)}}function q(){P.value=null,U.value=!0}function W(){D()}return C(()=>v.visible,e=>{e&&D()}),(e,a)=>(n(),s(f,null,[c(d(ce),{show:w.value,"onUpdate:show":a[0]||(a[0]=e=>w.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{title:"Prompts 管理",closable:"","native-scrollbar":!1},{header:u(()=>[o("div",_m,[o("div",Cm,[c(d(R),{size:20,class:"header-icon"},{default:u(()=>[c(d($a))]),_:1}),a[2]||(a[2]=o("span",null,"Prompts 管理",-1))])])]),default:u(()=>[o("div",xm,[o("div",Um,[o("div",Pm,[$.value?(n(),s(f,{key:0},[c(d(R),{class:"status-icon active",size:18},{default:u(()=>[c(d(Be))]),_:1}),o("div",Sm,[a[3]||(a[3]=o("span",{class:"status-label"},"当前激活:",-1)),o("span",zm,m($.value.name),1)])],64)):(n(),s(f,{key:1},[c(d(R),{class:"status-icon inactive",size:18},{default:u(()=>[c(d(Ga))]),_:1}),a[4]||(a[4]=o("div",{class:"status-text"},[o("span",{class:"status-label"},"未激活任何提示词")],-1))],64))]),o("div",Tm,[c(d(be),{trigger:"click",options:L,onSelect:K},{default:u(()=>[c(d(F),{size:"small",tertiary:"",class:"action-btn"},{icon:u(()=>[c(d(R),{size:14},{default:u(()=>[c(d(Fa))]),_:1})]),default:u(()=>[a[5]||(a[5]=h(" 导入 ",-1))]),_:1})]),_:1}),c(d(F),{size:"small",tertiary:"",type:"primary",class:"action-btn",onClick:q},{icon:u(()=>[c(d(R),{size:14},{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[6]||(a[6]=h(" 新建 ",-1))]),_:1}),$.value?(n(),g(d(ie),{key:0,trigger:"hover"},{trigger:u(()=>[c(d(F),{size:"small",quaternary:"",class:"action-btn remove-btn",onClick:B,loading:z.value},{icon:u(()=>[c(d(R),{size:16},{default:u(()=>[c(d(Fe))]),_:1})]),default:u(()=>[a[7]||(a[7]=h(" 移除 ",-1))]),_:1},8,["loading"])]),default:u(()=>[a[8]||(a[8]=h(" 删除各平台的提示词文件 ",-1))]),_:1})):i("",!0)])]),o("div",Im,[o("span",Mm,[h(" 共 "+m(A.value)+" 个预设 ",1),A.value>0?(n(),s(f,{key:0},[h(" · 自定义: "+m(j.value.custom)+" · 内置模板: "+m(j.value.builtin),1)],64)):i("",!0)])]),o("div",Am,[c(d(Z),{show:k.value},{default:u(()=>[0!==M.value.length||k.value?(n(),s("div",$m,[(n(!0),s(f,null,y(M.value,e=>(n(),s("div",{key:e.id,class:p(["preset-card",{active:e.id===x.value}])},[o("div",jm,[o("div",Lm,[e.id===x.value?(n(),g(d(R),{key:0,class:"active-icon",size:16},{default:u(()=>[c(d(Be))]),_:1})):i("",!0),o("span",Em,m(e.name),1),e.isBuiltin?(n(),g(d(H),{key:1,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[...a[11]||(a[11]=[h("模板",-1)])]),_:1})):i("",!0),e.isImported?(n(),g(d(H),{key:2,size:"tiny",bordered:!1,type:"warning"},{default:u(()=>[...a[12]||(a[12]=[h("已导入",-1)])]),_:1})):i("",!0)]),o("div",Dm,[e.id!==x.value?(n(),g(d(F),{key:0,size:"tiny",type:"primary",onClick:a=>N(e),loading:S.value===e.id},{default:u(()=>[...a[13]||(a[13]=[h(" 激活 ",-1)])]),_:1},8,["onClick","loading"])):i("",!0),c(d(F),{quaternary:"",size:"tiny",onClick:a=>function(e){P.value=e,U.value=!0}(e)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ra))]),_:1})]),_:1},8,["onClick"]),e.isBuiltin?i("",!0):(n(),g(d(F),{key:1,quaternary:"",size:"tiny",onClick:a=>G(e)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1},8,["onClick"]))])]),e.description?(n(),s("p",Nm,m(e.description),1)):i("",!0),o("div",Bm,[a[14]||(a[14]=o("span",{class:"apps-label"},"生效范围:",-1)),(n(),s(f,null,y(T,a=>{var l;return c(d(H),{key:a,type:(null==(l=e.apps)?void 0:l[a])?"success":"default",size:"tiny",bordered:!1},{default:u(()=>[h(m(I[a]),1)]),_:2},1032,["type"])}),64))]),o("div",Rm,[o("pre",Fm,m(E(e.content)),1)])],2))),128))])):(n(),s("div",Om,[c(d(R),{size:48,class:"empty-icon"},{default:u(()=>[c(d($a))]),_:1}),a[9]||(a[9]=o("p",{class:"empty-title"},"暂无预设",-1)),a[10]||(a[10]=o("p",{class:"empty-desc"},'点击上方"新建"按钮创建系统提示词预设',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),c(km,{visible:U.value,"onUpdate:visible":a[1]||(a[1]=e=>U.value=e),"editing-preset":P.value,"existing-ids":O.value,onSaved:W},null,8,["visible","editing-preset","existing-ids"])],64))}},[["__scopeId","data-v-79bd82f3"]]),Gm={class:"drawer-header"},Km={class:"header-icon-wrapper"},qm={class:"speed-test-container"},Wm={class:"test-controls"},Vm={key:0,class:"test-summary"},Jm={class:"summary-item"},Zm={class:"summary-value"},Qm={class:"summary-item success"},Ym={class:"summary-value"},Xm={class:"summary-item failed"},ef={class:"summary-value"},af={class:"summary-item avg"},lf={class:"summary-value"},tf={class:"results-list"},sf={key:0,class:"loading-state"},nf={key:1,class:"empty-state"},of={class:"empty-icon-wrapper"},rf={key:2,class:"result-cards"},cf={class:"result-header"},uf={class:"channel-info"},df={class:"channel-name"},pf={class:"result-status"},vf={key:1,class:"status-badge failed"},mf={key:0,class:"result-details"},ff={class:"latency-bar"},yf={key:1,class:"error-info"},gf={class:"error-container"},hf={class:"error-msg"},bf={key:0,class:"error-latency"},wf={key:1,class:"result-meta"},kf={class:"meta-item status-indicator"},_f={class:"meta-item status-indicator"},Cf={key:0,class:"meta-item http-code"},xf={key:1,class:"meta-item time"},Uf={key:1,class:"cache-hint"},Pf="speedTestResults",Sf="speedTestSummary",zf="speedTestTime",Tf=zl({__name:"SpeedTestDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=oi(520),v=e,b=a,w=t({get:()=>v.visible,set:e=>b("update:visible",e)}),k=l(!1),_=l([]),x=l(null),U=l("all"),P=l(!1),S=[{label:"全部渠道",value:"all"},{label:"Claude",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"}];async function T(){k.value=!0,_.value=[],x.value=null,P.value=!1;const e=[];"all"!==U.value&&"claude"!==U.value||e.push({type:"claude",fn:jt}),"all"!==U.value&&"codex"!==U.value||e.push({type:"codex",fn:Et}),"all"!==U.value&&"gemini"!==U.value||e.push({type:"gemini",fn:Nt}),"all"!==U.value&&"opencode"!==U.value||e.push({type:"opencode",fn:Jt});let a=[],l={total:0,success:0,failed:0,avgLatency:null},t=0,s=0;try{for(const{type:o,fn:i}of e)try{const e=await i(1e4);if(e.results){const n=e.results.map(e=>({...e,channelType:o,channelName:`[${o.toUpperCase()}] ${e.channelName}`,testedAt:Date.now()}));a=a.concat(n),_.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),s+=e.summary.success||0))}}catch(n){}l.avgLatency=s>0?Math.round(t/s):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}),x.value=l,function(){try{localStorage.setItem(Pf,JSON.stringify(_.value)),localStorage.setItem(Sf,JSON.stringify(x.value)),localStorage.setItem(zf,Date.now().toString())}catch(e){}}(),0===l.total?Hs.info("没有找到可测试的渠道"):Hs.success(`测试完成: ${l.success}/${l.total} 成功`)}catch(n){Hs.error("测试失败: "+n.message)}finally{k.value=!1}}function I(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 A(e){switch(e){case"claude":return"Claude";case"codex":return"Codex";case"gemini":return"Gemini";case"opencode":return"OpenCode";default:return(null==e?void 0:e.toUpperCase())||""}}function O(e){switch(e){case"claude":return"type-claude";case"codex":return"type-codex";case"gemini":return"type-gemini";case"opencode":return"type-opencode";default:return""}}return C(()=>v.visible,e=>{e&&function(){try{const e=localStorage.getItem(zf);if(e&&Date.now()-parseInt(e)<3e5){const e=localStorage.getItem(Pf),a=localStorage.getItem(Sf);return e&&(_.value=JSON.parse(e),P.value=!0),a&&(x.value=JSON.parse(a)),!0}}catch(e){}}()}),(e,a)=>(n(),g(d(ce),{show:w.value,"onUpdate:show":a[1]||(a[1]=e=>w.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",Gm,[o("div",Km,[c(d(R),{size:18},{default:u(()=>[c(d(Ne))]),_:1})]),a[2]||(a[2]=o("span",null,"渠道速度测试",-1))])]),default:u(()=>[o("div",qm,[o("div",Wm,[c(d(F),{type:"primary",loading:k.value,disabled:k.value,onClick:T,class:"test-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ea))]),_:1})]),default:u(()=>[h(" "+m(k.value?"测试中...":"开始全部测试"),1)]),_:1},8,["loading","disabled"]),c(d(ee),{value:U.value,"onUpdate:value":a[0]||(a[0]=e=>U.value=e),options:S,placeholder:"选择渠道类型",style:{width:"140px"}},null,8,["value"])]),x.value?(n(),s("div",Vm,[o("div",Jm,[a[3]||(a[3]=o("span",{class:"summary-label"},"总计",-1)),o("span",Zm,m(x.value.total),1)]),o("div",Qm,[a[4]||(a[4]=o("span",{class:"summary-label"},"成功",-1)),o("span",Ym,m(x.value.success),1)]),o("div",Xm,[a[5]||(a[5]=o("span",{class:"summary-label"},"失败",-1)),o("span",ef,m(x.value.failed),1)]),o("div",af,[a[6]||(a[6]=o("span",{class:"summary-label"},"平均延迟",-1)),o("span",lf,m(null!==x.value.avgLatency&&void 0!==x.value.avgLatency?x.value.avgLatency+"ms":"-"),1)])])):i("",!0),o("div",tf,[k.value&&0===_.value.length?(n(),s("div",sf,[c(d(Z),{size:"large"}),a[7]||(a[7]=o("p",{class:"loading-text"},"正在测试渠道连接速度和 API 可用性...",-1))])):0!==_.value.length||k.value?(n(),s("div",rf,[(n(!0),s(f,null,y(_.value,e=>{return n(),s("div",{key:e.channelId,class:p(["result-card",[e.success?"success":"failed",e.testing?"testing":""]])},[o("div",cf,[o("div",uf,[o("span",{class:p(["channel-type-badge",O(e.channelType)])},m(A(e.channelType)),3),o("span",df,m((l=e.channelName,l?l.replace(/^\[(CLAUDE|CODEX|GEMINI|OPENCODE)\]\s*/i,""):"")),1)]),o("div",pf,[e.testing?(n(),g(d(Z),{key:0,size:14})):(n(),s(f,{key:1},[e.success?(n(),s("span",{key:0,class:p(["latency-badge",e.level])},m(e.latency)+"ms ",3)):(n(),s("span",vf,"失败"))],64))])]),e.testing?i("",!0):(n(),s("div",mf,[e.success?(n(),s(f,{key:0},[o("div",ff,[o("div",{class:p(["latency-fill",e.level]),style:z({width:(a=e.latency,(null==a?0:Math.min(a/3e3*100,100))+"%")})},null,6)]),o("span",{class:p(["latency-level",e.level])},m(I(e.level)),3)],64)):(n(),s("div",yf,[o("div",gf,[c(d(R),{size:14,class:"error-icon"},{default:u(()=>[c(d(Na))]),_:1}),o("span",hf,m(e.error),1)]),null!==e.latency&&void 0!==e.latency?(n(),s("span",bf," 响应 "+m(e.latency)+"ms ",1)):i("",!0)]))])),e.testing?i("",!0):(n(),s("div",wf,[o("span",kf,[o("span",{class:p(["status-dot",e.networkOk?"ok":"fail"])},null,2),h(" 网络"+m(e.networkOk?"正常":"异常"),1)]),o("span",_f,[o("span",{class:p(["status-dot",e.apiOk?"ok":"fail"])},null,2),h(" API"+m(e.apiOk?"可用":"不可用"),1)]),e.statusCode?(n(),s("span",Cf,"HTTP "+m(e.statusCode),1)):i("",!0),e.testedAt?(n(),s("span",xf,m(M(e.testedAt)),1)):i("",!0)]))],2);var a,l}),128))])):(n(),s("div",nf,[o("div",of,[c(d(R),{size:32},{default:u(()=>[c(d(Ne))]),_:1})]),a[8]||(a[8]=o("p",{class:"empty-title"},"暂无测试结果",-1)),a[9]||(a[9]=o("p",{class:"empty-desc"},"点击上方按钮开始测试渠道连接速度",-1))]))]),P.value&&!k.value?(n(),s("div",Uf,[c(d(R),{size:14},{default:u(()=>[c(d(Ka))]),_:1}),a[10]||(a[10]=o("span",null,"显示的是缓存的测试结果,点击按钮重新测试",-1))])):i("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-e4ab15fb"]]),If="http://localhost:19999";async function Mf(e){return(await dl.post(`${If}/api/convert/opencode/claude`,e)).data}async function Af(e){return(await dl.post(`${If}/api/convert/opencode/codex`,e)).data}async function Of(e){return(await dl.post(`${If}/api/convert/opencode/gemini`,e)).data}const $f={class:"drawer-header"},jf={class:"header-icon-wrapper"},Lf={class:"convert-container"},Ef={class:"action-row"},Df={key:1,class:"result-section"},Nf={class:"result-meta"},Bf={class:"meta-row"},Rf={class:"meta-row"},Ff={class:"meta-row"},Hf={class:"warning-list"},Gf={class:"action-row"},Kf=zl({__name:"GatewayConvertDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:r}=oi(620,520),p=e,v=a,b=t({get:()=>p.visible,set:e=>v("update:visible",e)}),w=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"),x=l("responses"),U=l(""),P=l(!1),S=l(null),z=l(""),T=l(!1),I={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=t(()=>{var e;return(null==(e=S.value)?void 0:e.requestBody)?JSON.stringify(S.value.requestBody,null,2):""});function A(){const e=I[_.value]||I.claude;U.value=JSON.stringify(e,null,2)}async function O(){if(!T.value)try{const e=await async function(){return(await dl.get(`${If}/api/convert/opencode/formats`)).data}();Array.isArray(e.sourceTypes)&&e.sourceTypes.length>0&&(w.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&&(x.value=e.defaultTargetApi),T.value=!0}catch(e){}}function $(){z.value="",S.value=null}async function j(){var e,a;let l;z.value="",S.value=null;try{l=JSON.parse(U.value||"{}")}catch(t){return void(z.value="原始请求 JSON 解析失败,请检查格式")}P.value=!0;try{const e={claude:Mf,codex:Af,gemini:Of}[_.value];if(!e)throw new Error(`Unsupported sourceType: ${_.value}`);const a=await e({payload:l,options:{targetApi:x.value}});if(!1===a.success)throw new Error(a.error||"转换失败");S.value=a,Hs.success("转换完成")}catch(t){const l=(null==(a=null==(e=t.response)?void 0:e.data)?void 0:a.error)||t.message||"转换失败";z.value=l}finally{P.value=!1}}async function L(){if(!S.value)return;const e={endpoint:S.value.endpoint,requestBody:S.value.requestBody};try{await navigator.clipboard.writeText(JSON.stringify(e,null,2)),Hs.success("已复制转换结果")}catch(a){Hs.error("复制失败,请手动复制")}}return C(()=>_.value,()=>{A()}),C(()=>p.visible,async e=>{e&&(await O(),U.value||A())}),(e,a)=>(n(),g(d(ce),{show:b.value,"onUpdate:show":a[3]||(a[3]=e=>b.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",$f,[o("div",jf,[c(d(R),{size:18},{default:u(()=>[c(d(qa))]),_:1})]),a[4]||(a[4]=o("span",null,"OpenCode 请求转换",-1))])]),default:u(()=>[o("div",Lf,[c(d(Y),{"label-placement":"top"},{default:u(()=>[c(d(X),{label:"来源渠道"},{default:u(()=>[c(d(ee),{value:_.value,"onUpdate:value":a[0]||(a[0]=e=>_.value=e),options:w.value,placeholder:"选择来源渠道"},null,8,["value","options"])]),_:1}),c(d(X),{label:"目标 API"},{default:u(()=>[c(d(ee),{value:x.value,"onUpdate:value":a[1]||(a[1]=e=>x.value=e),options:k.value,placeholder:"选择目标 API"},null,8,["value","options"])]),_:1}),c(d(X),{label:"原始请求 JSON"},{default:u(()=>[c(d(ne),{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}),o("div",Ef,[c(d(F),{quaternary:"",onClick:A},{default:u(()=>[...a[5]||(a[5]=[h("填充示例",-1)])]),_:1}),c(d(ae),null,{default:u(()=>[c(d(F),{onClick:$},{default:u(()=>[...a[6]||(a[6]=[h("清空结果",-1)])]),_:1}),c(d(F),{type:"primary",loading:P.value,onClick:j},{default:u(()=>[...a[7]||(a[7]=[h("开始转换",-1)])]),_:1},8,["loading"])]),_:1})]),z.value?(n(),g(d(pe),{key:0,type:"error","show-icon":!0,style:{"margin-top":"12px"}},{default:u(()=>[h(m(z.value),1)]),_:1})):i("",!0),S.value?(n(),s("div",Df,[o("div",Nf,[o("div",Bf,[a[8]||(a[8]=o("span",{class:"meta-label"},"转换端点",-1)),c(d(H),{type:"success",size:"small",bordered:!1},{default:u(()=>[h(m(S.value.endpoint),1)]),_:1})]),o("div",Rf,[a[9]||(a[9]=o("span",{class:"meta-label"},"目标协议",-1)),c(d(H),{type:"info",size:"small",bordered:!1},{default:u(()=>[h(m(S.value.targetApi),1)]),_:1})]),o("div",Ff,[a[10]||(a[10]=o("span",{class:"meta-label"},"消息数量",-1)),c(d(H),{size:"small",bordered:!1},{default:u(()=>{var e;return[h(m((null==(e=S.value.meta)?void 0:e.messageCount)??0),1)]}),_:1})])]),Array.isArray(S.value.warnings)&&S.value.warnings.length>0?(n(),g(d(pe),{key:0,type:"warning","show-icon":!0,style:{"margin-top":"12px"}},{default:u(()=>[a[11]||(a[11]=o("div",{class:"warning-title"},"转换警告",-1)),o("ul",Hf,[(n(!0),s(f,null,y(S.value.warnings,(e,a)=>(n(),s("li",{key:a},m(e),1))),128))])]),_:1})):i("",!0),c(d(X),{label:"转换后请求 JSON",style:{"margin-top":"12px"}},{default:u(()=>[c(d(ne),{value:M.value,type:"textarea",readonly:"",autosize:{minRows:10,maxRows:18}},null,8,["value"])]),_:1}),o("div",Gf,[a[13]||(a[13]=o("div",null,null,-1)),c(d(F),{size:"small",onClick:L},{default:u(()=>[...a[12]||(a[12]=[h("复制转换结果",-1)])]),_:1})])])):i("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-e6530b83"]]);async function qf(e){return(await ct.get(`/config-registry/${e}`)).data}async function Wf(e){return(await ct.post(`/config-registry/${e}/import`)).data}async function Vf(e,a,l){const t=encodeURIComponent(a);return(await ct.put(`/config-registry/${e}/${t}/toggle`,{enabled:l})).data}async function Jf(e,a,l,t){const s=encodeURIComponent(a);return(await ct.put(`/config-registry/${e}/${s}/platform/${l}`,{enabled:t})).data}async function Zf(e){return(await ct.post(`/config-registry/${e}/sync`)).data}function Qf(e={}){return Boolean((null==e?void 0:e.isLocal)||"local"===(null==e?void 0:e.source))}function Yf(e={}){return Boolean("local-repo"===(null==e?void 0:e.source)||"local"===(null==e?void 0:e.repoProvider)||(null==e?void 0:e.repoLocalPath))}function Xf(e={}){return Boolean("gitlab"===(null==e?void 0:e.repoProvider)||(null==e?void 0:e.repoProjectPath))}function ey(e={}){return Boolean("github"===(null==e?void 0:e.repoProvider)||((null==e?void 0:e.repoOwner)||(null==e?void 0:e.repoName))&&!Xf(e)&&!Yf(e))}function ay(e={}){return!(null==e?void 0:e.protected)&&Boolean((null==e?void 0:e.installSource)||(null==e?void 0:e.isLocal)||Yf(e)||Xf(e)||ey(e))}function ly(e={}){return(null==e?void 0:e.protected)||"system-installed"===(null==e?void 0:e.source)?"系统":"native-installed"===(null==e?void 0:e.source)?"原生":Yf(e)?"本地仓库":Qf(e)?"本地技能":Xf(e)?"GitLab":ey(e)?"GitHub":""}function ty(e={}){return Qf(e)&&!Yf(e)?"":Yf(e)?(null==e?void 0:e.repoLocalPath)||"":Xf(e)?(null==e?void 0:e.repoProjectPath)||[null==e?void 0:e.repoOwner,null==e?void 0:e.repoName].filter(Boolean).join("/"):ey(e)?[null==e?void 0:e.repoOwner,null==e?void 0:e.repoName].filter(Boolean).join("/"):""}function sy(e={}){return Qf(e)||Yf(e)?null:(null==e?void 0:e.readmeUrl)||(null==e?void 0:e.repoUrl)||null}function ny(e={}){return Xf(e)?"GitLab":ey(e)?"GitHub":"仓库"}function oy(e={}){const a=ly(e),l=ty(e);return a&&l?`${a} · ${l}`:a||"未知来源"}const iy={class:"asset-card-main"},ry={class:"asset-card-top"},cy={class:"asset-card-title-stack"},uy={class:"asset-card-title-row"},dy={class:"asset-name"},py={class:"asset-tags"},vy={key:0,class:"asset-description"},my={class:"asset-meta"},fy={class:"asset-meta-item mono"},yy=["title"],gy=["href"],hy=zl({__name:"SkillCard",props:{skill:{type:Object,required:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1}},emits:["click","install","uninstall"],setup:e=>(a,l)=>{return n(),s("div",{class:p(["skill-card asset-card",{"is-installed":e.skill.installed,"is-protected":e.skill.protected}]),onClick:l[4]||(l[4]=l=>a.$emit("click",e.skill))},[o("div",iy,[o("div",ry,[o("div",cy,[o("div",uy,[o("span",{class:p(["asset-status-dot",{active:e.skill.installed}])},null,2),o("span",dy,m(e.skill.name),1)]),o("div",py,[e.skill.installed?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...l[5]||(l[5]=[h("已安装",-1)])]),_:1})):i("",!0),e.skill.protected?(n(),g(d(H),{key:1,type:"default",size:"tiny",bordered:!1},{default:u(()=>[...l[6]||(l[6]=[h("受保护",-1)])]),_:1})):i("",!0),d(ly)(e.skill)?(n(),g(d(H),{key:2,type:"info",size:"tiny",bordered:!1},{default:u(()=>[h(m(d(ly)(e.skill)),1)]),_:1})):i("",!0)])])]),e.skill.description?(n(),s("div",vy,m((t=e.skill.description,r=120,(null==t?void 0:t.length)>r?t.slice(0,r)+"...":t)),1)):i("",!0),o("div",my,[o("span",fy,m(e.skill.directory),1),d(ty)(e.skill)?(n(),s("span",{key:0,class:"asset-meta-item source-item",title:d(ty)(e.skill)},m(d(ty)(e.skill)),9,yy)):i("",!0),d(sy)(e.skill)?(n(),s("a",{key:1,class:"asset-link",href:d(sy)(e.skill),target:"_blank",rel:"noopener noreferrer",onClick:l[0]||(l[0]=v(()=>{},["stop"]))},m(d(ny)(e.skill)),9,gy)):i("",!0)])]),o("div",{class:"asset-card-actions",onClick:l[3]||(l[3]=v(()=>{},["stop"]))},[e.skill.installed&&!e.skill.protected?(n(),g(d(F),{key:0,size:"small",tertiary:"",type:"error",loading:e.uninstalling,focusable:!1,onClick:l[1]||(l[1]=l=>a.$emit("uninstall",e.skill))},{default:u(()=>[...l[7]||(l[7]=[h("卸载",-1)])]),_:1},8,["loading"])):e.skill.installed&&e.skill.protected?(n(),g(d(F),{key:1,size:"small",tertiary:"",disabled:"",focusable:!1},{default:u(()=>[...l[8]||(l[8]=[h("受保护",-1)])]),_:1})):(n(),g(d(F),{key:2,size:"small",type:"primary",loading:e.installing,disabled:!d(ay)(e.skill),focusable:!1,onClick:l[2]||(l[2]=l=>a.$emit("install",e.skill))},{default:u(()=>[...l[9]||(l[9]=[h("安装",-1)])]),_:1},8,["loading","disabled"]))])],2);var t,r}},[["__scopeId","data-v-49678fbf"]]);function by(e=""){return String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").replace(/\/+$/,"")}function wy(e=""){const a=String(e||"").trim();if(!a)return null;if(function(e=""){return/^(\/|~\/|\.\/|\.\.\/|[a-zA-Z]:[\\/]|file:\/\/)/.test(String(e||"").trim())}(a))return{provider:"local",localPath:a};const l=a.match(/^git@([^:]+):(.+?)(?:\.git)?$/i);if(l){const e=`https://${l[1]}`,a=l[2].replace(/\.git$/i,"").replace(/^\/+|\/+$/g,""),t=l[1].includes("github")?"github":"gitlab";if("gitlab"===t)return{provider:t,host:e,projectPath:a};const s=a.split("/");if(s.length>=2)return{provider:t,host:e,owner:s[0],name:s[1]}}try{const e=new URL(a);return e.hostname.includes("github")?function(e){const a=e.pathname.replace(/^\/+|\/+$/g,"").replace(/\.git$/i,"").split("/").filter(Boolean);if(a.length<2)return null;const l={provider:"github",host:`${e.protocol}//${e.host}`,owner:a[0],name:a[1]};if(("tree"===a[2]||"blob"===a[2])&&a[3]){l.branch=a[3];const e=a.slice(4);"blob"===a[2]&&e.length>0?l.directory=by(e.slice(0,-1).join("/")):l.directory=by(e.join("/"))}return l}(e):function(e){const a=e.pathname.replace(/^\/+|\/+$/g,"").replace(/\.git$/i,"").split("/").filter(Boolean);if(0===a.length)return null;const l=a.findIndex((e,l)=>"-"===e&&("tree"===a[l+1]||"blob"===a[l+1])),t=l>=0?a.slice(0,l):a;if(0===t.length)return null;const s={provider:"gitlab",host:`${e.protocol}//${e.host}`,projectPath:t.join("/")};if(l>=0&&a[l+2]){s.branch=a[l+2];const e=a.slice(l+3);"blob"===a[l+1]&&e.length>0?s.directory=by(e.slice(0,-1).join("/")):s.directory=by(e.join("/"))}return s}(e)}catch{}const t=a.split("/").filter(Boolean);return 2===t.length?{provider:"github",owner:t[0],name:t[1]}:null}const ky={class:"repo-manager"},_y={class:"repo-list"},Cy={class:"repo-main"},xy={class:"repo-info"},Uy={class:"repo-name-row"},Py={class:"repo-name"},Sy={class:"repo-branch"},zy={key:0,class:"repo-auth-hint"},Ty={class:"repo-actions"},Iy={key:0,class:"empty-hint"},My={class:"add-repo"},Ay={class:"add-form"},Oy={class:"tips"},$y={class:"recommended"},jy={class:"recommended-list"},Ly=["onClick"],Ey={class:"rec-info"},Dy={class:"rec-name"},Ny={class:"rec-desc"},By={key:0,class:"auth-manager"},Ry={class:"auth-meta"},Fy={class:"auth-meta-row"},Hy={class:"auth-value"},Gy={class:"auth-meta-row"},Ky={class:"auth-value"},qy={class:"auth-meta-row"},Wy={class:"auth-value"},Vy={class:"auth-actions"},Jy=zl({__name:"SkillRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const r=e,v=a,b=t({get:()=>r.visible,set:e=>v("update:visible",e)}),k=l([]),_=l(!1),x=l(!1),U=l(!1),P=l(null),S=l(!1),z=l(!1),T=l({token:""}),I=l({input:"",branch:"main"}),M=t(()=>P.value?("gitlab"===P.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),A=t(()=>"codex"===r.platform?[{provider:"github",owner:"openai",name:"skills",description:"Codex 官方技能库",branch:"main",directory:"skills/.curated"}]:"opencode"===r.platform?[{provider:"github",owner:"Shakudo-io",name:"opencode-skills",description:"OpenCode 官方技能库(46个技能)",branch:"main",directory:""}]:"gemini"===r.platform?[{provider:"github",owner:"google-gemini",name:"gemini-cli",description:"Gemini 官方技能库",branch:"main",directory:".gemini/skills"}]:[{provider:"github",owner:"anthropics",name:"skills",description:"官方技能库",branch:"main",directory:"skills"},{provider:"github",owner:"ComposioHQ",name:"awesome-claude-skills",description:"社区精选",branch:"master"},{provider:"github",owner:"cexll",name:"myclaude",description:"多智能体工作流",branch:"master"}]);function O(e){const a=e.provider||(e.localPath?"local":e.projectPath?"gitlab":"github"),l=by(e.directory),t=e.branch||"main";return"local"===a?`local:${e.localPath||""}::${l}`:"gitlab"===a?`gitlab:${e.host||"https://gitlab.com"}::${e.projectPath||""}::${t}::${l}`:`github:${e.host||"https://github.com"}::${e.owner||""}/${e.name||""}::${t}::${l}`}function j(e){return"local"===e.provider?e.localPath||e.name||"本地仓库":"gitlab"===e.provider&&e.projectPath||[e.owner,e.name].filter(Boolean).join("/")}function L(e){const a=[];return"local"===e.provider?a.push("本地仓库"):"gitlab"===e.provider?(a.push("GitLab"),e.host&&a.push(e.host.replace(/^https?:\/\//,""))):a.push("GitHub"),e.branch&&a.push(e.branch),e.directory&&a.push(`目录: ${e.directory}`),a.join(" · ")}function E(e){return"github"===(null==e?void 0:e.provider)||"gitlab"===(null==e?void 0:e.provider)}function D(e){return E(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function N(){U.value=!1,P.value=null,T.value.token="",S.value=!1,z.value=!1}const B=t(()=>wy(I.value.input)),K=t(()=>!!B.value);async function q(){_.value=!0;try{const e=await async function(e="claude"){return(await ct.get("/skills/repos",{params:{platform:e}})).data}(r.platform);e.success&&(k.value=e.repos||[])}catch(e){Hs.error("加载仓库失败: "+e.message)}finally{_.value=!1}}async function W(){if(!K.value)return;const e=B.value;x.value=!0;try{const a=await yo({...e,branch:I.value.branch||"main",enabled:!0},r.platform);a.success&&(k.value=a.repos,I.value.input="",I.value.branch="main",Hs.success("仓库添加成功"),v("updated"))}catch(a){Hs.error("添加失败: "+a.message)}finally{x.value=!1}}async function V(e){try{const a=await async function(e,a="claude"){return(await ct.delete("/skills/repos",{params:{platform:a,id:e.id||"",owner:e.owner||"",name:e.name||"",directory:e.directory||""}})).data}(e,r.platform);a.success&&(k.value=a.repos,Hs.success("仓库已删除"),v("updated"))}catch(a){Hs.error("删除失败: "+a.message)}}async function J(e,a){try{const l=await async function(e,a,l="claude"){return(await ct.put("/skills/repos/toggle",{id:e.id||"",owner:e.owner||"",name:e.name||"",enabled:a,directory:e.directory||"",platform:l})).data}(e,a,r.platform);l.success&&(k.value=l.repos,v("updated"))}catch(l){Hs.error("操作失败: "+l.message)}}async function Q(){const e=P.value,a=T.value.token.trim();if(e&&a){S.value=!0;try{const l=await go(e,{token:a},r.platform);l.success&&(k.value=l.repos||[],Hs.success("仓库 Token 已保存"),v("updated"),N())}catch(l){Hs.error("保存 Token 失败: "+l.message)}finally{S.value=!1}}}async function Y(){const e=P.value;if(e){z.value=!0;try{const a=await go(e,{clearToken:!0},r.platform);a.success&&(k.value=a.repos||[],Hs.success("仓库 Token 已清除"),v("updated"),N())}catch(a){Hs.error("清除 Token 失败: "+a.message)}finally{z.value=!1}}}function X(e){const a=O(e);return k.value.some(e=>O(e)===a)}function ee(){N(),v("update:visible",!1)}return C(()=>r.visible,e=>{e&&q()}),C(()=>r.platform,()=>{r.visible&&q()}),w(()=>{r.visible&&q()}),(e,a)=>(n(),s(f,null,[c(d(se),{show:b.value,"onUpdate:show":a[2]||(a[2]=e=>b.value=e),preset:"card",title:"技能仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:ee},{default:u(()=>[o("div",ky,[o("div",_y,[c(d(Z),{show:_.value},{default:u(()=>[(n(!0),s(f,null,y(k.value,e=>(n(),s("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:"repo-item"},[o("div",Cy,[c(d(G),{value:e.enabled,size:"small","onUpdate:value":a=>J(e,a)},null,8,["value","onUpdate:value"]),o("div",xy,[o("div",Uy,[o("div",Py,m(j(e)),1),E(e)?(n(),g(d(H),{key:0,size:"tiny",type:e.hasToken?"success":"default",bordered:!1},{default:u(()=>[h(m(e.hasToken?"已配 Token":"未配 Token"),1)]),_:2},1032,["type"])):i("",!0)]),o("div",Sy,m(L(e)),1),E(e)?(n(),s("div",zy,m(D(e)),1)):i("",!0)])]),o("div",Ty,[E(e)?(n(),g(d(F),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){E(e)&&(P.value=e,T.value.token="",U.value=!0)}(e)},{default:u(()=>[...a[5]||(a[5]=[h(" 认证 ",-1)])]),_:1},8,["onClick"])):i("",!0),c(d(F),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>V(e)},{default:u(()=>[...a[6]||(a[6]=[h(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===k.value.length?(n(),s("div",Iy," 暂无仓库,请添加 ")):i("",!0)]),_:1},8,["show"])]),o("div",My,[a[8]||(a[8]=o("div",{class:"add-title"},"添加仓库",-1)),o("div",Ay,[c(d(ne),{value:I.value.input,"onUpdate:value":a[0]||(a[0]=e=>I.value.input=e),placeholder:"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:$(W,["enter"])},null,8,["value"]),c(d(ne),{value:I.value.branch,"onUpdate:value":a[1]||(a[1]=e=>I.value.branch=e),placeholder:"分支(本地可忽略)",size:"small",class:"branch-input"},null,8,["value"]),c(d(F),{type:"primary",size:"small",disabled:!K.value,loading:x.value,focusable:!1,onClick:W},{default:u(()=>[...a[7]||(a[7]=[h(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[9]||(a[9]=o("div",{class:"add-hint"}," 支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径 ",-1))]),o("div",Oy,[c(d(pe),{type:"info",bordered:!1,size:"small"},{default:u(()=>[...a[10]||(a[10]=[h(" 支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。 ",-1)])]),_:1})]),o("div",$y,[a[12]||(a[12]=o("div",{class:"recommended-title"},"推荐仓库",-1)),o("div",jy,[(n(!0),s(f,null,y(A.value,e=>(n(),s("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:p(["recommended-item",{added:X(e)}]),onClick:a=>!X(e)&&async function(e){x.value=!0;try{const a=await yo({...e,branch:e.branch||"main",directory:e.directory||"",enabled:!0},r.platform);a.success&&(k.value=a.repos,Hs.success("仓库添加成功"),v("updated"))}catch(a){Hs.error("添加失败: "+a.message)}finally{x.value=!1}}(e)},[o("div",Ey,[o("span",Dy,m(j(e)),1),o("span",Ny,m(e.description),1)]),X(e)?(n(),g(d(H),{key:0,size:"tiny",type:"success",bordered:!1},{default:u(()=>[...a[11]||(a[11]=[h(" 已添加 ",-1)])]),_:1})):(n(),g(d(R),{key:1,class:"add-icon"},{default:u(()=>[c(d(Ke))]),_:1}))],10,Ly))),128))])])])]),_:1},8,["show"]),c(d(se),{show:U.value,"onUpdate:show":a[4]||(a[4]=e=>U.value=e),preset:"card",title:M.value,bordered:!1,style:{width:"460px","max-width":"92vw"},onClose:N},{default:u(()=>[P.value?(n(),s("div",By,[c(d(pe),{type:"info",bordered:!1,size:"small"},{default:u(()=>{return[h(m((e=P.value,"gitlab"===(null==e?void 0:e.provider)?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),o("div",Ry,[o("div",Fy,[a[13]||(a[13]=o("span",{class:"auth-label"},"仓库",-1)),o("span",Hy,m(j(P.value)),1)]),o("div",Gy,[a[14]||(a[14]=o("span",{class:"auth-label"},"来源",-1)),o("span",Ky,m("gitlab"===P.value.provider?"GitLab":"GitHub"),1)]),o("div",qy,[a[15]||(a[15]=o("span",{class:"auth-label"},"当前状态",-1)),o("span",Wy,m(P.value.hasToken?`已配置 ${P.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),c(d(ne),{value:T.value.token,"onUpdate:value":a[3]||(a[3]=e=>T.value.token=e),type:"password","show-password-on":"click",clearable:"",placeholder:"输入此仓库专属 Token",onKeyup:$(Q,["enter"])},null,8,["value"]),a[19]||(a[19]=o("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),o("div",Vy,[c(d(F),{focusable:!1,onClick:N},{default:u(()=>[...a[16]||(a[16]=[h(" 取消 ",-1)])]),_:1}),P.value.hasToken?(n(),g(d(F),{key:0,type:"warning",secondary:"",focusable:!1,loading:z.value,onClick:Y},{default:u(()=>[...a[17]||(a[17]=[h(" 清除 Token ",-1)])]),_:1},8,["loading"])):i("",!0),c(d(F),{type:"primary",focusable:!1,disabled:!T.value.token.trim(),loading:S.value,onClick:Q},{default:u(()=>[...a[18]||(a[18]=[h(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):i("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-af029748"]]),Zy={style:{"margin-bottom":"12px"}},Qy={class:"file-list"},Yy={class:"file-item"},Xy={class:"file-info"},eg={class:"file-path"},ag={key:1,class:"file-size"},lg={class:"file-actions"},tg={class:"modal-footer"},sg=zl({__name:"SkillCreateModal",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","created"],setup(e,{emit:a}){const r=e,v=a,b=t({get:()=>r.visible,set:e=>v("update:visible",e)}),w=l("simple"),k=l(null),_=l({directory:"",name:"",description:"",content:""}),x={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}],content:[{required:!0,message:"请输入技能内容",trigger:"blur"}]},U=l(null),P=l({directory:"",files:[]}),S={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}]},z=l(!1),T=l(!1),I=l(null),M=l(""),A=l(-1),O=l(!1),$=l(""),j=l(""),L=t(()=>P.value.files.some(e=>"SKILL.md"===e.path));function E(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 D({file:e}){return!0}async function N({file:e,onFinish:a,onError:l}){try{const t=new FileReader;t.onload=l=>{var t;const s=E(e.name);let n=e.name;if(null==(t=e.file)?void 0:t.webkitRelativePath){n=e.file.webkitRelativePath.split("/").slice(1).join("/")}P.value.files.push({path:n,content:s?l.target.result:btoa(l.target.result),isBase64:!s,size:e.file.size}),a()},t.onerror=l,E(e.name)?t.readAsText(e.file):t.readAsBinaryString(e.file)}catch(t){l()}}function B(){A.value>=0&&(P.value.files[A.value].content=M.value),T.value=!1,I.value=null,M.value="",A.value=-1}function G(){$.value.trim()?P.value.files.some(e=>e.path===$.value)?Hs.warning("文件已存在"):(P.value.files.push({path:$.value,content:j.value,isBase64:!1,size:new Blob([j.value]).size}),O.value=!1,$.value="",j.value=""):Hs.warning("请输入文件路径")}function q(){const e=`---\nname: "${P.value.directory||"我的技能"}"\ndescription: "技能描述"\n---\n\n# 技能指令\n\n在这里编写你的技能内容...\n`;P.value.files.unshift({path:"SKILL.md",content:e,isBase64:!1,size:new Blob([e]).size})}async function W(){"simple"===w.value?await async function(){var e,a,l;try{await(null==(e=k.value)?void 0:e.validate())}catch(t){return}z.value=!0;try{const e=await async function(e,a="claude"){return(await ct.post("/skills/create",{...e,platform:a})).data}({name:_.value.name||_.value.directory,directory:_.value.directory,description:_.value.description,content:_.value.content},r.platform);e.success?(Hs.success("技能创建成功"),v("created"),V()):Hs.error(e.message||"创建失败")}catch(t){Hs.error("创建失败: "+((null==(l=null==(a=t.response)?void 0:a.data)?void 0:l.message)||t.message))}finally{z.value=!1}}():await async function(){var e,a,l;try{await(null==(e=U.value)?void 0:e.validate())}catch(t){return}if(!L.value)return void Hs.error("必须包含 SKILL.md 文件");z.value=!0;try{const e=await async function(e,a="claude"){return(await ct.post("/skills/create-with-files",{...e,platform:a})).data}({directory:P.value.directory,files:P.value.files.map(e=>({path:e.path,content:e.content,isBase64:e.isBase64}))},r.platform);e.success?(Hs.success(`技能创建成功,包含 ${e.fileCount} 个文件`),v("created"),V()):Hs.error(e.message||"创建失败")}catch(t){Hs.error("创建失败: "+((null==(l=null==(a=t.response)?void 0:a.data)?void 0:l.message)||t.message))}finally{z.value=!1}}()}function V(){v("update:visible",!1)}return C(()=>r.visible,e=>{e||(w.value="simple",_.value={directory:"",name:"",description:"",content:""},P.value={directory:"",files:[]},I.value=null,M.value="",A.value=-1,$.value="",j.value="")}),(e,a)=>(n(),g(d(se),{show:b.value,"onUpdate:show":a[14]||(a[14]=e=>b.value=e),preset:"card",title:"创建自定义技能",bordered:!1,closable:!0,style:{width:"680px","max-width":"90vw"},onClose:V},{footer:u(()=>[o("div",tg,[c(d(F),{onClick:V},{default:u(()=>[...a[24]||(a[24]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:z.value,onClick:W},{default:u(()=>[...a[25]||(a[25]=[h(" 创建 ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[c(d(ge),{value:w.value,"onUpdate:value":a[6]||(a[6]=e=>w.value=e),type:"line",animated:""},{default:u(()=>[c(d(he),{name:"simple",tab:"简单模式"},{default:u(()=>[c(d(Y),{ref_key:"simpleFormRef",ref:k,model:_.value,rules:x,"label-placement":"top","label-width":"auto"},{default:u(()=>[c(d(X),{label:"目录名称",path:"directory"},{feedback:u(()=>[...a[15]||(a[15]=[h(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:u(()=>[c(d(ne),{value:_.value.directory,"onUpdate:value":a[0]||(a[0]=e=>_.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),c(d(X),{label:"技能名称",path:"name"},{default:u(()=>[c(d(ne),{value:_.value.name,"onUpdate:value":a[1]||(a[1]=e=>_.value.name=e),placeholder:"显示名称,可以是中文",maxlength:100},null,8,["value"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:_.value.description,"onUpdate:value":a[2]||(a[2]=e=>_.value.description=e),type:"textarea",placeholder:"简短描述这个技能的用途",rows:2,maxlength:200},null,8,["value"])]),_:1}),c(d(X),{label:"技能内容 (提示词,支持 Markdown)",path:"content"},{default:u(()=>[c(am,{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}),c(d(he),{name:"advanced",tab:"高级模式 (多文件)"},{default:u(()=>[c(d(Y),{ref_key:"advancedFormRef",ref:U,model:P.value,rules:S,"label-placement":"top","label-width":"auto"},{default:u(()=>[c(d(X),{label:"目录名称",path:"directory"},{feedback:u(()=>[...a[16]||(a[16]=[h(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:u(()=>[c(d(ne),{value:P.value.directory,"onUpdate:value":a[4]||(a[4]=e=>P.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),c(d(X),{label:"文件上传"},{default:u(()=>[c(d(ke),{multiple:"","directory-dnd":"","show-file-list":!1,"custom-request":N,onBeforeUpload:D},{default:u(()=>[c(d(_e),null,{default:u(()=>[o("div",Zy,[c(d(R),{size:"48",depth:3},{default:u(()=>[c(d(Wa))]),_:1})]),c(d(K),{style:{"font-size":"16px"}},{default:u(()=>[...a[17]||(a[17]=[h(" 拖放文件或文件夹到此处,或点击选择 ",-1)])]),_:1}),c(d(Ce),{depth:"3",style:{margin:"8px 0 0 0"}},{default:u(()=>[...a[18]||(a[18]=[h(" 必须包含 SKILL.md 文件 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),P.value.files.length>0?(n(),g(d(X),{key:0,label:"已添加的文件"},{default:u(()=>[o("div",Qy,[(n(!0),s(f,null,y(P.value.files,(e,l)=>(n(),g(d(xe),{key:e.path,size:"small",class:p({"skill-md":"SKILL.md"===e.path})},{default:u(()=>{return[o("div",Yy,[o("div",Xy,[c(d(R),{size:16,class:"file-icon"},{default:u(()=>[e.isDirectory?(n(),g(d(Va),{key:1})):(n(),g(d(na),{key:0}))]),_:2},1024),o("span",eg,m(e.path),1),"SKILL.md"===e.path?(n(),g(d(H),{key:0,size:"small",type:"primary"},{default:u(()=>[...a[19]||(a[19]=[h("必需",-1)])]),_:1})):i("",!0),e.size?(n(),s("span",ag,m((t=e.size,t<1024?t+" B":t<1048576?(t/1024).toFixed(1)+" KB":(t/1048576).toFixed(1)+" MB")),1)):i("",!0)]),o("div",lg,[E(e.path)?(n(),g(d(F),{key:0,size:"small",text:"",onClick:e=>function(e){const a=P.value.files[e];I.value=a,M.value=a.content,A.value=e,T.value=!0}(l)},{default:u(()=>[...a[20]||(a[20]=[h(" 编辑 ",-1)])]),_:1},8,["onClick"])):i("",!0),"SKILL.md"!==e.path?(n(),g(d(F),{key:1,size:"small",text:"",type:"error",onClick:e=>function(e){P.value.files.splice(e,1)}(l)},{default:u(()=>[...a[21]||(a[21]=[h(" 删除 ",-1)])]),_:1},8,["onClick"])):i("",!0)])])];var t}),_:2},1032,["class"]))),128))])]),_:1})):i("",!0),c(d(X),null,{default:u(()=>[c(d(ae),null,{default:u(()=>[c(d(F),{onClick:a[5]||(a[5]=e=>O.value=!0)},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[a[22]||(a[22]=h(" 添加文件 ",-1))]),_:1}),L.value?i("",!0):(n(),g(d(F),{key:0,onClick:q},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d($a))]),_:1})]),default:u(()=>[a[23]||(a[23]=h(" 添加 SKILL.md 模板 ",-1))]),_:1}))]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["value"]),c(d(se),{show:T.value,"onUpdate:show":a[9]||(a[9]=e=>T.value=e),preset:"card",title:"编辑文件",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:a[8]||(a[8]=e=>T.value=!1)},{default:u(()=>[...a[26]||(a[26]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:B},{default:u(()=>[...a[27]||(a[27]=[h("保存",-1)])]),_:1})]),_:1})]),default:u(()=>{var e;return[c(d(X),{label:(null==(e=I.value)?void 0:e.path)||"文件内容"},{default:u(()=>[c(d(ne),{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"]),c(d(se),{show:O.value,"onUpdate:show":a[13]||(a[13]=e=>O.value=e),preset:"card",title:"添加新文件",style:{width:"600px","max-width":"90vw"}},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:a[12]||(a[12]=e=>O.value=!1)},{default:u(()=>[...a[29]||(a[29]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:G},{default:u(()=>[...a[30]||(a[30]=[h("添加",-1)])]),_:1})]),_:1})]),default:u(()=>[c(d(Y),{"label-placement":"top"},{default:u(()=>[c(d(X),{label:"文件路径"},{feedback:u(()=>[...a[28]||(a[28]=[h(" 可以包含子目录,如 scripts/helper.sh ",-1)])]),default:u(()=>[c(d(ne),{value:$.value,"onUpdate:value":a[10]||(a[10]=e=>$.value=e),placeholder:"例如: scripts/helper.sh 或 README.md"},null,8,["value"])]),_:1}),c(d(X),{label:"文件内容"},{default:u(()=>[c(d(ne),{value:j.value,"onUpdate:value":a[11]||(a[11]=e=>j.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-e4db56d3"]]),ng={key:0,class:"asset-detail-info-section"},og={class:"asset-detail-section-title"},ig={class:"asset-detail-box asset-detail-path-box"},rg={class:"asset-detail-path-text"},cg={__name:"AssetPathField",props:{path:{type:String,default:""},title:{type:String,default:"路径"}},setup(e){const a=e,l=t(()=>String(a.path||"").trim());async function r(){if(l.value)try{const e=await Fo(l.value);if("manual"===(null==e?void 0:e.method))return void Hs.warning("自动复制失败,已弹出手动复制框");Hs.success("已复制路径")}catch{Hs.error("复制路径失败")}}return(a,t)=>l.value?(n(),s("div",ng,[o("h3",og,m(e.title),1),o("div",ig,[c(d(R),{size:16,class:"asset-detail-path-icon"},{default:u(()=>[c(d($a))]),_:1}),o("code",rg,m(l.value),1),c(d(ie),{trigger:"hover"},{trigger:u(()=>[c(d(F),{circle:"",quaternary:"",size:"tiny",class:"asset-detail-path-copy","aria-label":"复制路径",onClick:v(r,["stop"])},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ha))]),_:1})]),_:1})]),default:u(()=>[t[0]||(t[0]=h(" 复制路径 ",-1))]),_:1})])])):i("",!0)}},ug={class:"asset-detail-drawer-header"},dg={class:"asset-detail-identity"},pg={class:"asset-detail-heading"},vg={class:"asset-detail-name"},mg={class:"asset-detail-meta"},fg={key:3,class:"asset-detail-subtle"},yg={class:"asset-detail-body"},gg={key:0,class:"asset-detail-loading"},hg={key:1,class:"asset-detail-error"},bg={class:"asset-detail-container"},wg={class:"asset-detail-info-section"},kg={class:"asset-detail-description"},_g={key:0,class:"asset-detail-info-section"},Cg={class:"asset-detail-box"},xg=["href"],Ug={key:1},Pg={class:"asset-detail-info-section"},Sg={class:"asset-detail-actions"},zg=["innerHTML"],Tg={key:1,class:"asset-detail-empty"},Ig={__name:"SkillDetailDrawer",props:{visible:{type:Boolean,default:!1},skill:{type:Object,default:null},platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const{drawerWidth:r}=oi(600),p=e,v=a,f=t({get:()=>p.visible,set:e=>v("update:visible",e)}),y=l(!1),b=l(""),w=l(null),k=l(!1),_=l(!1),x={height:"100%",minHeight:0,overflow:"hidden"},U=t(()=>{var e;if(!(null==(e=w.value)?void 0:e.content))return"";try{return wl(w.value.content,{breaks:!0,gfm:!0})}catch{return w.value.content}}),P=t(()=>w.value?ty(w.value):""),S=t(()=>w.value?sy(w.value):""),z=t(()=>w.value?ny(w.value):""),T=t(()=>{var e,a,l;return(null==(e=w.value)?void 0:e.installPath)||(null==(a=w.value)?void 0:a.path)||(null==(l=w.value)?void 0:l.fullPath)||""});function I(e){return{id:e.repoId,provider:e.repoProvider,host:e.repoHost,owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main",directory:e.repoDirectory||"",projectPath:e.repoProjectPath,localPath:e.repoLocalPath,repoUrl:e.repoUrl}}async function M(){var e,a,l,t,s,n,o,i,r,c;if(null==(e=p.skill)?void 0:e.directory){y.value=!0,b.value="";try{const e=await async function(e,a="claude",l=null,t=null){const s={platform:a};return t&&(s.fullDirectory=t),l&&(l.id&&(s.repoId=l.id),l.provider&&(s.provider=l.provider),l.host&&(s.host=l.host),l.owner&&(s.owner=l.owner),l.name&&(s.name=l.name),l.branch&&(s.branch=l.branch),l.directory&&(s.directory=l.directory),l.projectPath&&(s.projectPath=l.projectPath),l.localPath&&(s.localPath=l.localPath),l.repoUrl&&(s.repoUrl=l.repoUrl)),(await ct.get(`/skills/detail/${e}`,{params:s})).data}(p.skill.directory,p.platform,I(p.skill),p.skill.fullDirectory||null);e.success?w.value={...p.skill,...e,source:e.source||(null==(a=p.skill)?void 0:a.source),repoProvider:e.repoProvider||(null==(l=p.skill)?void 0:l.repoProvider),repoOwner:e.repoOwner||(null==(t=p.skill)?void 0:t.repoOwner),repoName:e.repoName||(null==(s=p.skill)?void 0:s.repoName),repoProjectPath:e.repoProjectPath||(null==(n=p.skill)?void 0:n.repoProjectPath),repoLocalPath:e.repoLocalPath||(null==(o=p.skill)?void 0:o.repoLocalPath),repoUrl:e.repoUrl||(null==(i=p.skill)?void 0:i.repoUrl)}:b.value=e.message||"加载失败"}catch(u){b.value=(null==(c=null==(r=u.response)?void 0:r.data)?void 0:c.message)||u.message||"加载失败"}finally{y.value=!1}}}async function A(){var e,a;if(p.skill&&!p.skill.protected){k.value=!0;try{(await mo(p.skill.directory,I(p.skill),p.skill.fullDirectory||null,p.platform)).success&&(Hs.success("安装成功"),w.value&&(w.value.installed=!0),v("updated"))}catch(l){Hs.error("安装失败: "+((null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message))}finally{k.value=!1}}}async function O(){var e,a;if(w.value&&!w.value.protected){_.value=!0;try{(await fo(w.value.directory,p.platform)).success&&(Hs.success("卸载成功"),w.value&&(w.value.installed=!1),v("updated"))}catch(l){Hs.error("卸载失败: "+((null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message))}finally{_.value=!1}}}async function $(){var e;if(null==(e=w.value)?void 0:e.content)try{const e=await Fo(w.value.content);if("manual"===(null==e?void 0:e.method))return void Hs.warning("自动复制失败,已弹出手动复制框");Hs.success("已复制到剪贴板")}catch{Hs.error("复制失败")}}return C(()=>p.visible,e=>{e&&p.skill?M():(w.value=null,b.value="")}),(a,l)=>(n(),g(d(ce),{show:f.value,"onUpdate:show":l[0]||(l[0]=e=>f.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":x},{header:u(()=>{var a,t,r,p;return[o("div",ug,[o("div",dg,[c(d(R),{size:20,class:"asset-detail-icon"},{default:u(()=>[c(d(Je))]),_:1}),o("div",pg,[o("span",vg,m((null==(a=w.value)?void 0:a.name)||(null==(t=e.skill)?void 0:t.name)||"技能详情"),1),o("div",mg,[(null==(r=w.value)?void 0:r.installed)?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...l[1]||(l[1]=[h("已安装",-1)])]),_:1})):(n(),g(d(H),{key:1,type:"default",size:"tiny",bordered:!1},{default:u(()=>[...l[2]||(l[2]=[h("未安装",-1)])]),_:1})),(null==(p=w.value)?void 0:p.protected)?(n(),g(d(H),{key:2,type:"default",size:"tiny",bordered:!1},{default:u(()=>[...l[3]||(l[3]=[h("受保护",-1)])]),_:1})):i("",!0),w.value?(n(),s("span",fg,m(d(oy)(w.value)),1)):i("",!0)])])])])]}),default:u(()=>[o("div",yg,[y.value?(n(),s("div",gg,[c(d(Z),{size:"medium"}),l[4]||(l[4]=o("p",null,"加载技能详情中...",-1))])):b.value?(n(),s("div",hg,[c(d(R),{size:44,class:"asset-detail-error-icon"},{default:u(()=>[c(d(Na))]),_:1}),o("p",null,m(b.value),1),c(d(F),{size:"small",onClick:M},{default:u(()=>[...l[5]||(l[5]=[h("重试",-1)])]),_:1})])):w.value?(n(),g(d(ge),{key:2,type:"line",animated:"",class:"asset-detail-tabs"},{default:u(()=>[c(d(he),{name:"overview",tab:"概览"},{default:u(()=>[o("div",bg,[o("div",wg,[l[6]||(l[6]=o("h3",{class:"asset-detail-section-title"},"描述",-1)),o("p",kg,m(w.value.description||"暂无描述"),1)]),c(cg,{path:T.value},null,8,["path"]),P.value||S.value?(n(),s("div",_g,[l[7]||(l[7]=o("h3",{class:"asset-detail-section-title"},"来源",-1)),o("div",Cg,[c(d(R),{size:16},{default:u(()=>[c(d(ta))]),_:1}),S.value?(n(),s("a",{key:0,class:"asset-detail-link",href:S.value,target:"_blank",rel:"noopener noreferrer"},m(z.value),9,xg)):(n(),s("code",Ug,m(P.value),1))])])):i("",!0),o("div",Pg,[l[12]||(l[12]=o("h3",{class:"asset-detail-section-title"},"操作",-1)),o("div",Sg,[!w.value.installed&&d(ay)(w.value)?(n(),g(d(F),{key:0,type:"primary",size:"small",loading:k.value,onClick:A},{default:u(()=>[...l[8]||(l[8]=[h(" 安装此技能 ",-1)])]),_:1},8,["loading"])):i("",!0),w.value.installed&&!w.value.protected?(n(),g(d(F),{key:1,type:"error",tertiary:"",size:"small",loading:_.value,onClick:O},{default:u(()=>[...l[9]||(l[9]=[h(" 卸载 ",-1)])]),_:1},8,["loading"])):w.value.installed&&w.value.protected?(n(),g(d(F),{key:2,tertiary:"",size:"small",disabled:""},{default:u(()=>[...l[10]||(l[10]=[h(" 受保护 ",-1)])]),_:1})):i("",!0),c(d(F),{text:"",size:"small",disabled:!w.value.content,onClick:$},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ha))]),_:1})]),default:u(()=>[l[11]||(l[11]=h(" 复制内容 ",-1))]),_:1},8,["disabled"])])])])]),_:1}),c(d(he),{name:"content",tab:"内容"},{default:u(()=>[w.value.content?(n(),s("div",{key:0,class:"asset-detail-content",innerHTML:U.value},null,8,zg)):(n(),s("div",Tg,[c(d(R),{size:44,class:"asset-detail-empty-icon"},{default:u(()=>[c(d($a))]),_:1}),l[13]||(l[13]=o("p",null,"暂无技能内容",-1))]))]),_:1})]),_:1})):i("",!0)])]),_:1})]),_:1},8,["show","width"]))}},Mg={key:0,class:"asset-panel-header"},Ag={class:"asset-title-group"},Og={class:"asset-heading"},$g={class:"asset-title-row"},jg={class:"asset-platform-pill"},Lg={class:"asset-action-row"},Eg={key:1,class:"asset-drawer-toolbar"},Dg={class:"asset-action-row"},Ng={class:"asset-summary"},Bg={class:"asset-summary-item"},Rg={class:"asset-summary-value"},Fg={class:"asset-summary-item"},Hg={class:"asset-summary-value"},Gg={class:"asset-summary-item"},Kg={class:"asset-summary-value"},qg={class:"asset-filter-bar"},Wg={class:"asset-panel-content"},Vg={key:0,class:"asset-empty"},Jg={key:1,class:"asset-list"},Zg={class:"asset-footer"},Qg=zl({__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,r=M(),v=Ue(),b=l(!1),k=l([]),_=l(""),x=l("all"),U=l(!1),P=l(!1),S=l(!1),z=l(null),T=l({}),I=l({}),A=l(!1),O=l(0),$=br.filter(e=>!1!==e.supportsSkills).map(e=>e.key),j=t(()=>{if(a.platform&&$.includes(a.platform))return a.platform;const e=r.meta.channel;return $.includes(e)?e:"claude"}),L=t(()=>{const e=Cr(j.value);return e.label||e.title||"Claude Code"}),E=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"}],D=t(()=>k.value.filter(e=>e.installed).length),N=t(()=>{let e=k.value;if("installed"===x.value?e=e.filter(e=>e.installed):"uninstalled"===x.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)}),B=t(()=>_.value?"没有匹配的技能":"installed"===x.value?"暂无已安装的技能":"uninstalled"===x.value?"所有技能都已安装":"暂无可用技能,请配置仓库源");async function H(e=!1){const a=++O.value,l=j.value;b.value=!0;try{const t=await vo(e,l);if(a!==O.value||l!==j.value)return;t.success&&(k.value=t.skills||[])}catch(t){v.error("加载技能失败: "+t.message)}finally{a===O.value&&(b.value=!1)}}async function G(){if("claude"===j.value){A.value=!0;try{const e=await Wf("skills");e.success?(v.success(`成功导入 ${e.imported} 个技能`),await H()):v.error(e.message||"导入失败")}catch(e){v.error("导入失败: "+e.message)}finally{A.value=!1}}}async function K(e){if(!e.protected){T.value[e.key]=!0;try{let a;if(e.isLocal)a=await async function(e,a="claude"){return(await ct.post("/skills/install-local",{directory:e,platform:a})).data}(e.directory,j.value);else{if(!e.repoOwner&&!e.repoProjectPath&&!e.repoLocalPath)return void v.error("缺少仓库信息");a=await mo(e.directory,{id:e.repoId,provider:e.repoProvider,host:e.repoHost,owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main",directory:e.repoDirectory||"",projectPath:e.repoProjectPath,localPath:e.repoLocalPath,repoUrl:e.repoUrl},e.fullDirectory||null,j.value)}if(a.success){v.success(`技能 "${e.name}" 安装成功`);const a=k.value.find(a=>a.key===e.key);a&&(a.installed=!0)}}catch(a){v.error("安装失败: "+a.message)}finally{delete T.value[e.key]}}}async function q(e){if(!e.protected){I.value[e.key]=!0;try{if((await fo(e.directory,j.value)).success){v.success(`技能 "${e.name}" 已卸载`);const a=k.value.find(a=>a.key===e.key);a&&(a.installed=!1)}}catch(a){v.error("卸载失败: "+a.message)}finally{delete I.value[e.key]}}}function W(e){z.value=e,S.value=!0}return w(()=>{a.inDrawer&&!a.drawerVisible||H()}),C(()=>a.drawerVisible,e=>{e&&H()}),C(()=>j.value,()=>{H()}),(a,l)=>(n(),s("div",{class:p(["skills-panel asset-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?i("",!0):(n(),s("div",Mg,[o("div",Ag,[e.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ja))]),_:1})]),_:1})),o("div",Og,[o("div",$g,[l[14]||(l[14]=o("span",{class:"asset-title"},"技能管理",-1)),o("span",jg,m(L.value),1)]),l[15]||(l[15]=o("div",{class:"asset-subtitle"},"安装、创建和同步当前平台可用的技能",-1))])]),o("div",Lg,[c(d(F),{text:"",focusable:!1,onClick:l[1]||(l[1]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[16]||(l[16]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",focusable:!1,onClick:l[2]||(l[2]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ta))]),_:1})]),default:u(()=>[l[17]||(l[17]=h(" 仓库 ",-1))]),_:1}),c(d(F),{text:"",focusable:!1,onClick:G,loading:A.value,disabled:"claude"!==j.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ja))]),_:1})]),default:u(()=>[l[18]||(l[18]=h(" 导入 ",-1))]),_:1},8,["loading","disabled"]),c(d(F),{text:"",focusable:!1,onClick:l[3]||(l[3]=e=>H(!0)),loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[19]||(l[19]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),s("div",Eg,[o("div",Dg,[c(d(F),{text:"",focusable:!1,onClick:l[4]||(l[4]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[20]||(l[20]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",focusable:!1,onClick:l[5]||(l[5]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ta))]),_:1})]),default:u(()=>[l[21]||(l[21]=h(" 仓库 ",-1))]),_:1}),c(d(F),{text:"",focusable:!1,onClick:G,loading:A.value,disabled:"claude"!==j.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ja))]),_:1})]),default:u(()=>[l[22]||(l[22]=h(" 导入 ",-1))]),_:1},8,["loading","disabled"]),c(d(F),{text:"",focusable:!1,onClick:l[6]||(l[6]=e=>H(!0)),loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[23]||(l[23]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",Ng,[o("span",Bg,[l[24]||(l[24]=o("span",{class:"asset-summary-label"},"全部",-1)),o("span",Rg,m(k.value.length),1)]),o("span",Fg,[l[25]||(l[25]=o("span",{class:"asset-summary-label"},"已安装",-1)),o("span",Hg,m(D.value),1)]),o("span",Gg,[l[26]||(l[26]=o("span",{class:"asset-summary-label"},"可安装",-1)),o("span",Kg,m(k.value.length-D.value),1)])]),o("div",qg,[c(d(ne),{value:_.value,"onUpdate:value":l[7]||(l[7]=e=>_.value=e),placeholder:"搜索技能名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:x.value,"onUpdate:value":l[8]||(l[8]=e=>x.value=e),options:E,size:"small",class:"asset-filter"},null,8,["value"])]),o("div",Wg,[c(d(Z),{show:b.value},{default:u(()=>[0!==N.value.length||b.value?(n(),s("div",Jg,[(n(!0),s(f,null,y(N.value,e=>(n(),g(hy,{key:e.key,skill:e,installing:!!T.value[e.key],uninstalling:!!I.value[e.key],onInstall:K,onUninstall:q,onClick:W},null,8,["skill","installing","uninstalling"]))),128))])):(n(),s("div",Vg,[c(d(Q),{description:B.value},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Je))]),_:1})]),extra:u(()=>[0===k.value.length?(n(),g(d(F),{key:0,size:"small",onClick:l[9]||(l[9]=e=>U.value=!0)},{default:u(()=>[...l[27]||(l[27]=[h("配置仓库源",-1)])]),_:1})):i("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),o("div",Zg,[c(d(R),{size:"14",class:"asset-info-icon"},{default:u(()=>[c(d(Ma))]),_:1}),o("span",null,"安装/卸载后需重启 "+m(L.value)+" 生效",1)]),c(Jy,{visible:U.value,"onUpdate:visible":l[10]||(l[10]=e=>U.value=e),platform:j.value,onUpdated:l[11]||(l[11]=e=>H(!0))},null,8,["visible","platform"]),c(sg,{visible:P.value,"onUpdate:visible":l[12]||(l[12]=e=>P.value=e),platform:j.value,onCreated:H},null,8,["visible","platform"]),c(Ig,{visible:S.value,"onUpdate:visible":l[13]||(l[13]=e=>S.value=e),skill:z.value,platform:j.value,onUpdated:H},null,8,["visible","skill","platform"])],2))}},[["__scopeId","data-v-b019bf7d"]]),Yg=zl({__name:"SkillsDrawer",props:{visible:{type:Boolean,default:!1},platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=oi(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},"技能管理",-1)])]),default:u(()=>[c(Qg,{"in-drawer":!0,"hide-back":!0,"drawer-visible":r.value,platform:l.platform,onBack:a[0]||(a[0]=e=>r.value=!1)},null,8,["drawer-visible","platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-150a7bc9"]]);async function Xg(e=null,a="claude"){return(await ct.get("/commands",{params:e?{projectPath:e,platform:a}:{platform:a}})).data}const eh={class:"asset-card-main"},ah={class:"asset-card-top"},lh={class:"asset-card-title-stack"},th={class:"asset-card-title-row"},sh={class:"asset-name mono"},nh={class:"asset-tags"},oh={key:0,class:"asset-description"},ih={class:"asset-meta"},rh={key:0,class:"asset-meta-item"},ch={key:1,class:"asset-meta-item"},uh={class:"asset-card-actions"},dh={class:"asset-platform-strip"},ph=zl({__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,t=a;return(a,r)=>{var y,b;return n(),s("div",{class:p(["command-card asset-card",{"is-project":"project"===e.command.scope,"is-managed":e.registryInfo}]),onClick:r[9]||(r[9]=a=>t("click",e.command))},[o("div",eh,[o("div",ah,[o("div",lh,[o("div",th,[o("span",{class:p(["asset-status-dot",{active:(null==(y=e.registryInfo)?void 0:y.enabled)||"project"===e.command.scope}])},null,2),o("span",sh,"/"+m(e.command.name),1)]),o("div",nh,[c(d(H),{type:"user"===e.command.scope?"info":"success",size:"tiny",bordered:!1},{default:u(()=>[h(m("user"===e.command.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),e.registryInfo?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...r[10]||(r[10]=[h("托管",-1)])]),_:1})):i("",!0),e.command.namespace?(n(),g(d(H),{key:1,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.command.namespace),1)]),_:1})):i("",!0)])])]),e.command.description?(n(),s("div",oh,m((b=e.command.description,b?b.length>80?b.slice(0,80)+"...":b:"")),1)):i("",!0),o("div",ih,[e.command.allowedTools?(n(),s("span",rh,[c(d(R),{size:"12"},{default:u(()=>[c(d(Ya))]),_:1}),h(" "+m(e.command.allowedTools),1)])):i("",!0),e.command.argumentHint?(n(),s("span",ch,[c(d(R),{size:"12"},{default:u(()=>[c(d(Xa))]),_:1}),h(" "+m(e.command.argumentHint),1)])):i("",!0)])]),o("div",uh,[e.registryInfo?(n(),s(f,{key:0},[c(d(ie),{trigger:"hover"},{trigger:u(()=>[c(d(G),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":r[0]||(r[0]=a=>t("toggle-enabled",e.command,a)),onClick:r[1]||(r[1]=v(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[h(" "+m(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),o("div",dh,[c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.claude}]),onClick:r[2]||(r[2]=v(a=>{var l;return t("toggle-platform",e.command,"claude",!(null==(l=e.registryInfo.platforms)?void 0:l.claude))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(el))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Claude Code "+m((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.codex}]),onClick:r[3]||(r[3]=v(a=>{var l;return t("toggle-platform",e.command,"codex",!(null==(l=e.registryInfo.platforms)?void 0:l.codex))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(Qe))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Codex CLI "+m((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.gemini}]),onClick:r[4]||(r[4]=v(a=>{var l;return t("toggle-platform",e.command,"gemini",!(null==(l=e.registryInfo.platforms)?void 0:l.gemini))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ca))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Gemini CLI "+m((null==(a=e.registryInfo.platforms)?void 0:a.gemini)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.opencode}]),onClick:r[5]||(r[5]=v(a=>{var l;return t("toggle-platform",e.command,"opencode",!(null==(l=e.registryInfo.platforms)?void 0:l.opencode))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ra))]),_:1})],2)]}),default:u(()=>{var a;return[h(" OpenCode "+m((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.omp}]),onClick:r[6]||(r[6]=v(a=>{var l;return t("toggle-platform",e.command,"omp",!(null==(l=e.registryInfo.platforms)?void 0:l.omp))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ba))]),_:1})],2)]}),default:u(()=>{var a;return[h(" OMP "+m((null==(a=e.registryInfo.platforms)?void 0:a.omp)?"已启用":"未启用"),1)]}),_:1})])],64)):(n(),s(f,{key:1},[c(d(F),{size:"tiny",tertiary:"",onClick:r[7]||(r[7]=v(a=>t("edit",e.command),["stop"]))},{default:u(()=>[...r[11]||(r[11]=[h(" 编辑 ",-1)])]),_:1}),c(d(F),{size:"tiny",tertiary:"",type:"error",loading:l.deleting,onClick:r[8]||(r[8]=v(a=>t("delete",e.command),["stop"]))},{default:u(()=>[...r[12]||(r[12]=[h(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2)}}},[["__scopeId","data-v-165deb4e"]]),vh={class:"asset-detail-drawer-header"},mh={class:"asset-detail-identity"},fh={class:"asset-detail-heading"},yh={class:"asset-detail-name mono"},gh={class:"asset-detail-meta"},hh={key:2,class:"asset-detail-subtle"},bh={class:"asset-detail-body"},wh={class:"asset-detail-container"},kh={class:"asset-detail-info-section"},_h={class:"asset-detail-description"},Ch={class:"asset-detail-info-section"},xh={class:"asset-detail-list"},Uh={class:"asset-detail-row"},Ph={class:"asset-detail-value"},Sh={key:0,class:"asset-detail-row"},zh={class:"asset-detail-value"},Th={key:1,class:"asset-detail-row"},Ih={class:"asset-detail-value"},Mh={key:2,class:"asset-detail-row"},Ah={class:"asset-detail-value"},Oh={key:3,class:"asset-detail-row"},$h={class:"asset-detail-value"},jh={key:4,class:"asset-detail-row"},Lh={class:"asset-detail-value"},Eh={key:0,class:"asset-detail-info-section"},Dh={class:"asset-detail-box"},Nh={class:"asset-detail-code"},Bh={key:1,class:"asset-detail-empty"},Rh={__name:"CommandDetailDrawer",props:{visible:{type:Boolean,default:!1},command:{type:Object,default:null},platform:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:l}=oi(600),r=e,p=a,v=t({get:()=>r.visible,set:e=>p("update:visible",e)}),f={height:"100%",minHeight:0,overflow:"hidden"},y=t(()=>{const e=Cr(r.platform);return e.label||e.title||""}),b=t(()=>{var e,a;return(null==(e=r.command)?void 0:e.fullPath)||(null==(a=r.command)?void 0:a.path)||""});function w(e){return"project"===e?"项目级":"用户级"}return(a,t)=>(n(),g(d(ce),{show:v.value,"onUpdate:show":t[0]||(t[0]=e=>v.value=e),width:d(l),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":f},{header:u(()=>{var a,l,t;return[o("div",vh,[o("div",mh,[c(d(R),{size:20,class:"asset-detail-icon"},{default:u(()=>[c(d(Qe))]),_:1}),o("div",fh,[o("span",yh,m((null==(a=e.command)?void 0:a.name)?`/${e.command.name}`:"命令详情"),1),o("div",gh,[(null==(l=e.command)?void 0:l.scope)?(n(),g(d(H),{key:0,type:"project"===e.command.scope?"success":"info",size:"tiny",bordered:!1},{default:u(()=>[h(m(w(e.command.scope)),1)]),_:1},8,["type"])):i("",!0),(null==(t=e.command)?void 0:t.namespace)?(n(),g(d(H),{key:1,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.command.namespace),1)]),_:1})):i("",!0),y.value?(n(),s("span",hh,m(y.value),1)):i("",!0)])])])])]}),default:u(()=>[o("div",bh,[e.command?(n(),g(d(ge),{key:0,type:"line",animated:"",class:"asset-detail-tabs"},{default:u(()=>[c(d(he),{name:"overview",tab:"概览"},{default:u(()=>[o("div",wh,[o("div",kh,[t[1]||(t[1]=o("h3",{class:"asset-detail-section-title"},"描述",-1)),o("p",_h,m(e.command.description||"暂无描述"),1)]),o("div",Ch,[t[8]||(t[8]=o("h3",{class:"asset-detail-section-title"},"基础信息",-1)),o("div",xh,[o("div",Uh,[t[2]||(t[2]=o("span",{class:"asset-detail-label"},"作用域",-1)),o("span",Ph,m(w(e.command.scope)),1)]),e.command.namespace?(n(),s("div",Sh,[t[3]||(t[3]=o("span",{class:"asset-detail-label"},"命名空间",-1)),o("span",zh,m(e.command.namespace),1)])):i("",!0),e.command.argumentHint?(n(),s("div",Th,[t[4]||(t[4]=o("span",{class:"asset-detail-label"},"参数提示",-1)),o("span",Ih,m(e.command.argumentHint),1)])):i("",!0),e.command.model?(n(),s("div",Mh,[t[5]||(t[5]=o("span",{class:"asset-detail-label"},"模型",-1)),o("span",Ah,m(e.command.model),1)])):i("",!0),e.command.agent?(n(),s("div",Oh,[t[6]||(t[6]=o("span",{class:"asset-detail-label"},"Agent",-1)),o("span",$h,m(e.command.agent),1)])):i("",!0),""!==e.command.subtask&&void 0!==e.command.subtask&&null!==e.command.subtask?(n(),s("div",jh,[t[7]||(t[7]=o("span",{class:"asset-detail-label"},"Subtask",-1)),o("span",Lh,m(String(e.command.subtask)),1)])):i("",!0)])]),e.command.allowedTools?(n(),s("div",Eh,[t[9]||(t[9]=o("h3",{class:"asset-detail-section-title"},"允许的工具",-1)),o("div",Dh,[c(d(R),{size:16},{default:u(()=>[c(d(Ya))]),_:1}),o("code",null,m(e.command.allowedTools),1)])])):i("",!0),c(cg,{path:b.value},null,8,["path"])])]),_:1}),c(d(he),{name:"content",tab:"内容"},{default:u(()=>[o("pre",Nh,m(e.command.body||"(无内容)"),1)]),_:1})]),_:1})):(n(),s("div",Bh,[c(d(R),{size:44,class:"asset-detail-empty-icon"},{default:u(()=>[c(d($a))]),_:1}),t[10]||(t[10]=o("p",null,"未选择命令",-1))]))])]),_:1})]),_:1},8,["show","width"]))}},Fh={class:"config-edit-header"},Hh={class:"config-edit-identity"},Gh={class:"config-edit-icon"},Kh={class:"config-edit-title-stack"},qh={class:"config-edit-kicker"},Wh={class:"config-edit-title"},Vh={class:"config-edit-badges"},Jh={class:"command-workbench"},Zh={class:"command-sidebar"},Qh={class:"config-edit-section"},Yh={class:"section-heading"},Xh={class:"field-grid"},eb={class:"scope-option"},ab={class:"scope-path"},lb={class:"scope-option"},tb={class:"scope-path"},sb={class:"config-edit-section"},nb={class:"section-heading"},ob={key:1,class:"platform-note"},ib={class:"config-edit-section token-section"},rb={class:"section-heading"},cb={class:"command-token-box"},ub={key:0,class:"token-row"},db={key:1,class:"token-row"},pb={class:"config-edit-section content-section"},vb={class:"section-heading"},mb={class:"modal-footer"},fb=zl({__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 r=e,p=a,v=t({get:()=>r.visible,set:e=>p("update:visible",e)}),y=t(()=>!!r.command),b=t(()=>y.value?"编辑命令":"创建命令"),w=t(()=>{const e=Cr(r.platform);return e.label||e.title||"Claude Code"}),k=t(()=>"opencode"===r.platform?"~/.config/opencode/commands/":"gemini"===r.platform?"~/.gemini/commands/":"omp"===r.platform?"~/.omp/agent/commands/":"codex"===r.platform?"~/.codex/commands/":"~/.claude/commands/"),_=t(()=>"opencode"===r.platform?".opencode/commands/":"gemini"===r.platform?".gemini/commands/":"omp"===r.platform?".omp/commands/":"codex"===r.platform?".codex/commands/":".claude/commands/"),x=t(()=>"opencode"!==r.platform&&"gemini"!==r.platform&&"omp"!==r.platform),U=t(()=>"project"===M.value.scope?"项目级":"用户级"),P=t(()=>M.value.name?`/${M.value.name}`:"编辑命令"),S=t(()=>"gemini"===r.platform?"TOML":"Markdown"),z=l(null),T=l(!1),I={maxHeight:"calc(92vh - 134px)",overflowY:"auto",paddingBottom:"18px"},M=l({name:"",scope:"user",namespace:"",description:"",allowedTools:"",argumentHint:"",body:""}),A={name:{required:!0,message:"请输入命令名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"}};function O(){M.value={name:"",scope:"user",namespace:"",description:"",allowedTools:"",argumentHint:"",body:""}}function $(){v.value=!1,O()}async function j(){var e;try{await(null==(e=z.value)?void 0:e.validate())}catch{return}T.value=!0;try{const e={...M.value,projectPath:r.projectPath};y.value?(await async function(e,a,l,t="claude"){return(await ct.put(`/commands/${a}/${e}`,{...l,platform:t})).data}(M.value.name,M.value.scope,e,r.platform),Hs.success("命令更新成功")):(await async function(e,a="claude"){return(await ct.post("/commands",{...e,platform:a})).data}(e,r.platform),Hs.success("命令创建成功")),p("saved"),v.value=!1,O()}catch(a){Hs.error("操作失败: "+a.message)}finally{T.value=!1}}return C(()=>r.command,e=>{e?M.value={name:e.name||"",scope:e.scope||"user",namespace:e.namespace||"",description:e.description||"",allowedTools:e.allowedTools||"",argumentHint:e.argumentHint||"",body:e.body||""}:O()},{immediate:!0}),(e,a)=>(n(),g(d(se),{show:v.value,"onUpdate:show":a[7]||(a[7]=e=>v.value=e),preset:"card",title:b.value,style:{width:"min(940px, 96vw)","max-height":"92vh"},"content-style":I,"mask-closable":!1,class:"config-edit-modal"},{footer:u(()=>[o("div",mb,[c(d(F),{onClick:$},{default:u(()=>[...a[19]||(a[19]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:T.value,onClick:j},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Sa))]),_:1})]),default:u(()=>[h(" "+m(y.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>[o("div",Fh,[o("div",Hh,[o("span",Gh,[c(d(R),{size:22},{default:u(()=>[c(d(Qe))]),_:1})]),o("div",Kh,[o("span",qh,m(w.value),1),o("span",Wh,m(y.value?P.value:"创建新命令"),1)])]),o("div",Vh,[c(d(H),{size:"small",bordered:!1,type:"info"},{default:u(()=>[h(m(U.value),1)]),_:1}),M.value.namespace?(n(),g(d(H),{key:0,size:"small",bordered:!1,type:"warning"},{default:u(()=>[h(m(M.value.namespace),1)]),_:1})):i("",!0),c(d(H),{size:"small",bordered:!1,type:"success"},{default:u(()=>[h(m(S.value),1)]),_:1})])]),c(d(Y),{ref_key:"formRef",ref:z,model:M.value,rules:A,"label-placement":"top","require-mark-placement":"right-hanging",class:"config-edit-form"},{default:u(()=>[o("div",Jh,[o("div",Zh,[o("section",Qh,[o("div",Yh,[c(d(R),{size:16},{default:u(()=>[c(d(_a))]),_:1}),a[8]||(a[8]=o("span",null,"命令入口",-1))]),o("div",Xh,[c(d(X),{label:"命令名",path:"name"},{default:u(()=>[c(d(ne),{value:M.value.name,"onUpdate:value":a[0]||(a[0]=e=>M.value.name=e),disabled:y.value,placeholder:"review"},{prefix:u(()=>[...a[9]||(a[9]=[h("/",-1)])]),_:1},8,["value","disabled"])]),_:1}),c(d(X),{label:"命名空间",path:"namespace"},{default:u(()=>[c(d(ne),{value:M.value.namespace,"onUpdate:value":a[1]||(a[1]=e=>M.value.namespace=e),disabled:y.value,placeholder:"frontend"},null,8,["value","disabled"])]),_:1})]),c(d(X),{label:"作用域",path:"scope"},{default:u(()=>[c(d(le),{value:M.value.scope,"onUpdate:value":a[2]||(a[2]=e=>M.value.scope=e),disabled:y.value,class:"scope-picker"},{default:u(()=>[c(d(te),{value:"user"},{default:u(()=>[o("span",eb,[a[10]||(a[10]=o("span",{class:"scope-title"},"用户级",-1)),o("span",ab,m(k.value),1)])]),_:1}),c(d(te),{value:"project"},{default:u(()=>[o("span",lb,[a[11]||(a[11]=o("span",{class:"scope-title"},"项目级",-1)),o("span",tb,m(_.value),1)])]),_:1})]),_:1},8,["value","disabled"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:M.value.description,"onUpdate:value":a[3]||(a[3]=e=>M.value.description=e),type:"textarea",autosize:{minRows:3,maxRows:5},placeholder:"一句话说明这个 slash command 的用途"},null,8,["value"])]),_:1})]),o("section",sb,[o("div",nb,[c(d(R),{size:16},{default:u(()=>[c(d(xa))]),_:1}),a[12]||(a[12]=o("span",null,"Frontmatter",-1))]),x.value?(n(),s(f,{key:0},[c(d(X),{label:"允许的工具",path:"allowedTools"},{default:u(()=>[c(d(ne),{value:M.value.allowedTools,"onUpdate:value":a[4]||(a[4]=e=>M.value.allowedTools=e),placeholder:"Bash, Edit, Read"},null,8,["value"])]),_:1}),c(d(X),{label:"参数提示",path:"argumentHint"},{default:u(()=>[c(d(ne),{value:M.value.argumentHint,"onUpdate:value":a[5]||(a[5]=e=>M.value.argumentHint=e),placeholder:"add [id] | remove [id]"},null,8,["value"])]),_:1})],64)):(n(),s("div",ob,[c(d(R),{size:16},{default:u(()=>[c(d(Ma))]),_:1}),o("span",null,m(w.value)+" commands 会按平台原生格式保存,当前平台不写入 Claude/Codex 风格的工具和参数 frontmatter。",1)]))]),o("section",ib,[o("div",rb,[c(d(R),{size:16},{default:u(()=>[c(d(ra))]),_:1}),a[13]||(a[13]=o("span",null,"可用变量",-1))]),o("div",cb,[a[16]||(a[16]=o("div",{class:"token-row"},[o("code",null,"$ARGUMENTS"),o("span",null,"完整参数")],-1)),a[17]||(a[17]=o("div",{class:"token-row"},[o("code",null,"$1"),o("span",null,"第一个参数")],-1)),x.value?(n(),s("div",ub,[...a[14]||(a[14]=[o("code",null,"!",-1),o("span",null,"执行 shell 行",-1)])])):i("",!0),x.value?(n(),s("div",db,[...a[15]||(a[15]=[o("code",null,"@",-1),o("span",null,"引用文件",-1)])])):i("",!0)])])]),o("section",pb,[o("div",vb,[c(d(R),{size:16},{default:u(()=>[c(d($a))]),_:1}),a[18]||(a[18]=o("span",null,"命令内容",-1))]),c(d(X),{path:"body","show-label":!1,class:"editor-form-item"},{default:u(()=>[c(am,{modelValue:M.value.body,"onUpdate:modelValue":a[6]||(a[6]=e=>M.value.body=e),rows:12,"min-height":280,placeholder:"写下命令提示词。可以使用 $ARGUMENTS、$1、$2 等变量。","default-editing":!y.value},null,8,["modelValue","default-editing"])]),_:1})])])]),_:1},8,["model"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-713e6dff"]]),yb={key:0,class:"asset-panel-header"},gb={class:"asset-title-group"},hb={class:"asset-heading"},bb={class:"asset-title-row"},wb={class:"asset-platform-pill"},kb={class:"asset-action-row"},_b={key:1,class:"asset-drawer-toolbar"},Cb={class:"asset-action-row"},xb={class:"asset-summary"},Ub={class:"asset-summary-item"},Pb={class:"asset-summary-value"},Sb={class:"asset-summary-item"},zb={class:"asset-summary-value"},Tb={class:"asset-summary-item"},Ib={class:"asset-summary-value"},Mb={class:"asset-summary-item"},Ab={class:"asset-summary-value"},Ob={class:"asset-filter-bar"},$b={class:"asset-panel-content"},jb={key:0,class:"asset-empty"},Lb={key:1,class:"asset-list"},Eb={class:"asset-footer"},Db=zl({__name:"CommandsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null},platform:{type:String,default:""}},emits:["back","updated"],setup(e,{emit:a}){const r=e,v=a,b=M(),k=l([]),_=l(!1),x=l(""),U=l("all"),P=l(!1),S=l(!1),z=l(null),T=l(null),I=l({}),A=l({}),O=l({}),$=br.filter(e=>!1!==e.supportsCommands).map(e=>e.key),j=t(()=>{if($.includes(r.platform))return r.platform;const e=b.meta.channel;return $.includes(e)?e:"claude"}),L=t(()=>"opencode"===j.value?"使用 /命令名 在 OpenCode 中调用":"omp"===j.value?"使用 OMP slash command 调用":"gemini"===j.value?"使用 /命令名 在 Gemini CLI 中调用":"codex"===j.value?"使用 /命令名 在 Codex CLI 中调用":"使用 /命令名 在 Claude Code 中调用"),E=t(()=>{const e=Cr(j.value);return e.label||e.title||"Claude Code"}),D=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],N=t(()=>k.value.filter(e=>"user"===e.scope).length),B=t(()=>k.value.filter(e=>"project"===e.scope).length),H=t(()=>Object.keys(A.value).length),G=t(()=>{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=>A.value[e.name])),x.value.trim()){const a=x.value.toLowerCase();e=e.filter(e=>{var l,t,s;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))||(null==(s=e.namespace)?void 0:s.toLowerCase().includes(a))})}return e}),K=t(()=>x.value?"没有匹配的命令":"user"===U.value?"暂无用户级命令":"project"===U.value?"暂无项目级命令":"managed"===U.value?"暂无托管的命令":"暂无自定义命令");async function q(){_.value=!0;try{const[e,a]=await Promise.all([Xg(r.projectPath,j.value),qf("commands")]);if(e.success&&(k.value=e.commands||[]),a.success){A.value={};for(const[e,l]of Object.entries(a.items||{}))A.value[e]=l}}catch(e){Hs.error("加载命令列表失败: "+e.message)}finally{_.value=!1}}async function W(e,a){O.value[e.name]=!0;try{(await Vf("commands",e.name,a)).success&&(Hs.success(a?"已启用":"已禁用"),await q())}catch(l){Hs.error("切换失败: "+l.message)}finally{delete O.value[e.name]}}async function V(e,a,l){O.value[e.name]=!0;try{(await Jf("commands",e.name,a,l)).success&&(Hs.success(`${a} ${l?"已启用":"已禁用"}`),await q())}catch(t){Hs.error("切换失败: "+t.message)}finally{delete O.value[e.name]}}async function J(){_.value=!0;try{const e=await Zf("commands");(null==e?void 0:e.success)||Hs.warning((null==e?void 0:e.message)||"同步失败,已继续刷新列表")}catch(e){Hs.warning("同步失败,已继续刷新列表: "+e.message)}await q()}function Y(e){T.value=e,P.value=!0}async function X(e){I.value[e.path]=!0;try{(await async function(e,a,l=null,t=null,s="claude"){const n={};return s&&(n.platform=s),l&&(n.projectPath=l),t&&(n.namespace=t),(await ct.delete(`/commands/${a}/${e}`,{params:n})).data}(e.name,e.scope,r.projectPath,e.namespace,j.value)).success&&(Hs.success("命令已删除"),await q(),v("updated"))}catch(a){Hs.error("删除失败: "+a.message)}finally{delete I.value[e.path]}}function ae(e){z.value=e,S.value=!0}function le(){T.value=null,q(),v("updated")}function te(){v("back")}return w(()=>{q()}),C(j,()=>{q()}),(a,l)=>(n(),s("div",{class:p(["commands-panel asset-panel",{"in-drawer":r.inDrawer}])},[r.inDrawer?i("",!0):(n(),s("div",yb,[o("div",gb,[r.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:te,class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ja))]),_:1})]),_:1})),o("div",hb,[o("div",bb,[l[7]||(l[7]=o("span",{class:"asset-title"},"命令管理",-1)),o("span",wb,m(E.value),1)]),l[8]||(l[8]=o("div",{class:"asset-subtitle"},"维护 slash commands、作用域和跨平台启用状态",-1))])]),o("div",kb,[c(d(F),{text:"",onClick:l[0]||(l[0]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:J,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[10]||(l[10]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),r.inDrawer?(n(),s("div",_b,[o("div",Cb,[c(d(F),{text:"",onClick:l[1]||(l[1]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[11]||(l[11]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:J,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[12]||(l[12]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",xb,[o("span",Ub,[l[13]||(l[13]=o("span",{class:"asset-summary-label"},"全部",-1)),o("span",Pb,m(k.value.length),1)]),o("span",Sb,[l[14]||(l[14]=o("span",{class:"asset-summary-label"},"用户级",-1)),o("span",zb,m(N.value),1)]),o("span",Tb,[l[15]||(l[15]=o("span",{class:"asset-summary-label"},"项目级",-1)),o("span",Ib,m(B.value),1)]),o("span",Mb,[l[16]||(l[16]=o("span",{class:"asset-summary-label"},"托管",-1)),o("span",Ab,m(H.value),1)])]),o("div",Ob,[c(d(ne),{value:x.value,"onUpdate:value":l[2]||(l[2]=e=>x.value=e),placeholder:"搜索命令、描述或命名空间",clearable:"",size:"small",class:"asset-search"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:U.value,"onUpdate:value":l[3]||(l[3]=e=>U.value=e),options:D,size:"small",class:"asset-filter"},null,8,["value"])]),o("div",$b,[c(d(Z),{show:_.value},{default:u(()=>[0!==G.value.length||_.value?(n(),s("div",Lb,[(n(!0),s(f,null,y(G.value,e=>(n(),g(ph,{key:e.path,command:e,deleting:!!I.value[e.path],"registry-info":A.value[e.name],toggling:!!O.value[e.name],onEdit:Y,onDelete:X,onClick:ae,onToggleEnabled:W,onTogglePlatform:V},null,8,["command","deleting","registry-info","toggling"]))),128))])):(n(),s("div",jb,[c(d(Q),{description:K.value},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Qe))]),_:1})]),extra:u(()=>[c(d(F),{size:"small",onClick:l[4]||(l[4]=e=>P.value=!0)},{default:u(()=>[...l[17]||(l[17]=[h(" 创建第一个命令 ",-1)])]),_:1})]),_:1},8,["description"])]))]),_:1},8,["show"])]),o("div",Eb,[c(d(R),{size:"14",class:"asset-info-icon"},{default:u(()=>[c(d(Ma))]),_:1}),o("span",null,m(L.value),1)]),c(fb,{visible:P.value,"onUpdate:visible":l[5]||(l[5]=e=>P.value=e),command:T.value,"project-path":e.projectPath,platform:j.value,onSaved:le},null,8,["visible","command","project-path","platform"]),c(Rh,{visible:S.value,"onUpdate:visible":l[6]||(l[6]=e=>S.value=e),command:z.value,platform:j.value},null,8,["visible","command","platform"])],2))}},[["__scopeId","data-v-4db32847"]]),Nb=zl({__name:"CommandsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=oi(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},[o("span",null,"命令管理")],-1)])]),default:u(()=>[c(Db,{onBack:a[0]||(a[0]=e=>r.value=!1),"hide-back":!0,"in-drawer":!0,platform:l.platform},null,8,["platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-bfb32ef8"]]);async function Bb(e=null,a="claude"){return(await ct.get("/agents",{params:e?{projectPath:e,platform:a}:{platform:a}})).data}const Rb={class:"asset-card-main"},Fb={class:"asset-card-top"},Hb={class:"asset-card-title-stack"},Gb={class:"asset-card-title-row"},Kb={class:"asset-name"},qb={class:"asset-tags"},Wb={key:0,class:"asset-description"},Vb={class:"asset-meta"},Jb={key:0,class:"asset-meta-item"},Zb={key:1,class:"asset-meta-item"},Qb={class:"asset-card-actions"},Yb={class:"asset-platform-strip"},Xb=zl({__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,t=a;return(a,r)=>{var y,b,w;return n(),s("div",{class:p(["agent-card asset-card",{"is-project":"project"===e.agent.scope,"is-managed":e.registryInfo}]),onClick:r[8]||(r[8]=a=>t("click",e.agent))},[o("div",Rb,[o("div",Fb,[o("div",Hb,[o("div",Gb,[o("span",{class:p(["asset-status-dot",{active:(null==(y=e.registryInfo)?void 0:y.enabled)||"project"===e.agent.scope}])},null,2),o("span",Kb,m(e.agent.name),1)]),o("div",qb,[c(d(H),{type:"user"===e.agent.scope?"info":"success",size:"tiny",bordered:!1},{default:u(()=>[h(m("user"===e.agent.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),e.registryInfo?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...r[9]||(r[9]=[h("托管",-1)])]),_:1})):i("",!0),e.agent.model?(n(),g(d(H),{key:1,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.agent.model),1)]),_:1})):i("",!0)])])]),e.agent.description?(n(),s("div",Wb,m((w=e.agent.description,w?w.length>80?w.slice(0,80)+"...":w:"")),1)):i("",!0),o("div",Vb,[e.agent.tools?(n(),s("span",Jb,[c(d(R),{size:"12"},{default:u(()=>[c(d(Ya))]),_:1}),h(" "+m((b=e.agent.tools,b?b.length>30?b.slice(0,30)+"...":b:"")),1)])):i("",!0),e.agent.permissionMode?(n(),s("span",Zb,[c(d(R),{size:"12"},{default:u(()=>[c(d(al))]),_:1}),h(" "+m(e.agent.permissionMode),1)])):i("",!0)])]),o("div",Qb,[e.registryInfo?(n(),s(f,{key:0},[c(d(ie),{trigger:"hover"},{trigger:u(()=>[c(d(G),{value:e.registryInfo.enabled,size:"small",loading:e.toggling,"onUpdate:value":r[0]||(r[0]=a=>t("toggle-enabled",e.agent,a)),onClick:r[1]||(r[1]=v(()=>{},["stop"]))},null,8,["value","loading"])]),default:u(()=>[h(" "+m(e.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),o("div",Yb,[c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.claude}]),onClick:r[2]||(r[2]=v(a=>{var l;return t("toggle-platform",e.agent,"claude",!(null==(l=e.registryInfo.platforms)?void 0:l.claude))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(el))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Claude Code "+m((null==(a=e.registryInfo.platforms)?void 0:a.claude)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.codex}]),onClick:r[3]||(r[3]=v(a=>{var l;return t("toggle-platform",e.agent,"codex",!(null==(l=e.registryInfo.platforms)?void 0:l.codex))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(Qe))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Codex CLI "+m((null==(a=e.registryInfo.platforms)?void 0:a.codex)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.gemini}]),onClick:r[4]||(r[4]=v(a=>{var l;return t("toggle-platform",e.agent,"gemini",!(null==(l=e.registryInfo.platforms)?void 0:l.gemini))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ca))]),_:1})],2)]}),default:u(()=>{var a;return[h(" Gemini CLI "+m((null==(a=e.registryInfo.platforms)?void 0:a.gemini)?"已启用":"未启用"),1)]}),_:1}),c(d(ie),{trigger:"hover"},{trigger:u(()=>{var a;return[o("span",{class:p(["asset-platform-icon",{active:null==(a=e.registryInfo.platforms)?void 0:a.opencode}]),onClick:r[5]||(r[5]=v(a=>{var l;return t("toggle-platform",e.agent,"opencode",!(null==(l=e.registryInfo.platforms)?void 0:l.opencode))},["stop"]))},[c(d(R),{size:"14"},{default:u(()=>[c(d(ra))]),_:1})],2)]}),default:u(()=>{var a;return[h(" OpenCode "+m((null==(a=e.registryInfo.platforms)?void 0:a.opencode)?"已启用":"未启用"),1)]}),_:1})])],64)):(n(),s(f,{key:1},[c(d(F),{size:"tiny",tertiary:"",onClick:r[6]||(r[6]=v(a=>t("edit",e.agent),["stop"]))},{default:u(()=>[...r[10]||(r[10]=[h(" 编辑 ",-1)])]),_:1}),c(d(F),{size:"tiny",tertiary:"",type:"error",loading:l.deleting,onClick:r[7]||(r[7]=v(a=>t("delete",e.agent),["stop"]))},{default:u(()=>[...r[11]||(r[11]=[h(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2)}}},[["__scopeId","data-v-85a35dfe"]]),ew={class:"asset-detail-drawer-header"},aw={class:"asset-detail-identity"},lw={class:"asset-detail-heading"},tw={class:"asset-detail-name"},sw={class:"asset-detail-meta"},nw={key:2,class:"asset-detail-subtle"},ow={class:"asset-detail-body"},iw={key:0,class:"asset-detail-loading"},rw={class:"asset-detail-container"},cw={class:"asset-detail-info-section"},uw={class:"asset-detail-description"},dw={class:"asset-detail-info-section"},pw={class:"asset-detail-list"},vw={class:"asset-detail-row"},mw={class:"asset-detail-value"},fw={key:0,class:"asset-detail-row"},yw={class:"asset-detail-value mono"},gw={key:1,class:"asset-detail-row"},hw={class:"asset-detail-value mono"},bw={key:2,class:"asset-detail-row"},ww={class:"asset-detail-value"},kw={key:3,class:"asset-detail-row"},_w={class:"asset-detail-value"},Cw={key:4,class:"asset-detail-row"},xw={class:"asset-detail-value"},Uw={key:1,class:"asset-detail-info-section"},Pw={class:"asset-detail-box"},Sw={class:"asset-detail-code"},zw={key:2,class:"asset-detail-empty"},Tw={__name:"AgentDetailDrawer",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},platform:{type:String,default:"claude"},loading:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:l}=oi(600),r=e,p=a,v=t({get:()=>r.visible,set:e=>p("update:visible",e)}),f={height:"100%",minHeight:0,overflow:"hidden"},y=t(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[r.platform]||"")),b=t(()=>{var e;return(null==(e=r.agent)?void 0:e.fileName)?"codex"===r.platform?`[agents.${r.agent.fileName}]`:`${r.agent.fileName}.md`:""}),w=t(()=>r.agent?"codex"===r.platform?r.agent.fullContent||"(无内容)":r.agent.systemPrompt||"(无内容)":"(无内容)"),k=t(()=>{var e,a;return(null==(e=r.agent)?void 0:e.fullPath)||(null==(a=r.agent)?void 0:a.path)||""});function _(e){return"project"===e?"项目级":"用户级"}return(a,t)=>(n(),g(d(ce),{show:v.value,"onUpdate:show":t[0]||(t[0]=e=>v.value=e),width:d(l),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":f},{header:u(()=>{var a,l,t;return[o("div",ew,[o("div",aw,[c(d(R),{size:20,class:"asset-detail-icon"},{default:u(()=>[c(d(Ye))]),_:1}),o("div",lw,[o("span",tw,m((null==(a=e.agent)?void 0:a.name)||"代理详情"),1),o("div",sw,[(null==(l=e.agent)?void 0:l.scope)?(n(),g(d(H),{key:0,type:"project"===e.agent.scope?"success":"info",size:"tiny",bordered:!1},{default:u(()=>[h(m(_(e.agent.scope)),1)]),_:1},8,["type"])):i("",!0),(null==(t=e.agent)?void 0:t.model)?(n(),g(d(H),{key:1,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.agent.model),1)]),_:1})):i("",!0),y.value?(n(),s("span",nw,m(y.value),1)):i("",!0)])])])])]}),default:u(()=>[o("div",ow,[e.loading&&!e.agent?(n(),s("div",iw,[c(d(Z),{size:"medium"}),t[1]||(t[1]=o("p",null,"加载代理详情中...",-1))])):e.agent?(n(),g(d(ge),{key:1,type:"line",animated:"",class:"asset-detail-tabs"},{default:u(()=>[c(d(he),{name:"overview",tab:"概览"},{default:u(()=>[o("div",rw,["codex"===e.platform&&e.agent.configReadError?(n(),g(d(pe),{key:0,type:"warning",bordered:!1},{default:u(()=>[h(m(e.agent.configReadError),1)]),_:1})):i("",!0),o("div",cw,[t[2]||(t[2]=o("h3",{class:"asset-detail-section-title"},"描述",-1)),o("p",uw,m(e.agent.description||"暂无描述"),1)]),o("div",dw,[t[9]||(t[9]=o("h3",{class:"asset-detail-section-title"},"基础信息",-1)),o("div",pw,[o("div",vw,[t[3]||(t[3]=o("span",{class:"asset-detail-label"},"作用域",-1)),o("span",mw,m(_(e.agent.scope)),1)]),e.agent.fileName?(n(),s("div",fw,[t[4]||(t[4]=o("span",{class:"asset-detail-label"},"文件名",-1)),o("span",yw,m(b.value),1)])):i("",!0),"codex"===e.platform&&e.agent.configFile?(n(),s("div",gw,[t[5]||(t[5]=o("span",{class:"asset-detail-label"},"config_file",-1)),o("span",hw,m(e.agent.configFile),1)])):i("",!0),e.agent.model?(n(),s("div",bw,[t[6]||(t[6]=o("span",{class:"asset-detail-label"},"模型",-1)),o("span",ww,m(e.agent.model),1)])):i("",!0),e.agent.permissionMode?(n(),s("div",kw,[t[7]||(t[7]=o("span",{class:"asset-detail-label"},"权限模式",-1)),o("span",_w,m(e.agent.permissionMode),1)])):i("",!0),e.agent.skills?(n(),s("div",Cw,[t[8]||(t[8]=o("span",{class:"asset-detail-label"},"技能",-1)),o("span",xw,m(e.agent.skills),1)])):i("",!0)])]),e.agent.tools?(n(),s("div",Uw,[t[10]||(t[10]=o("h3",{class:"asset-detail-section-title"},"可用工具",-1)),o("div",Pw,[c(d(R),{size:16},{default:u(()=>[c(d(Ya))]),_:1}),o("code",null,m(e.agent.tools),1)])])):i("",!0),c(cg,{path:k.value},null,8,["path"])])]),_:1}),c(d(he),{name:"content",tab:"codex"===e.platform?"配置":"提示词"},{default:u(()=>[o("pre",Sw,m(w.value),1)]),_:1},8,["tab"])]),_:1})):(n(),s("div",zw,[c(d(R),{size:44,class:"asset-detail-empty-icon"},{default:u(()=>[c(d($a))]),_:1}),t[11]||(t[11]=o("p",null,"未选择代理",-1))]))])]),_:1})]),_:1},8,["show","width"]))}},Iw={class:"config-edit-header"},Mw={class:"config-edit-identity"},Aw={class:"config-edit-icon"},Ow={class:"config-edit-title-stack"},$w={class:"config-edit-kicker"},jw={class:"config-edit-title"},Lw={class:"config-edit-badges"},Ew={class:"config-edit-section"},Dw={class:"section-heading"},Nw={class:"field-grid"},Bw={class:"scope-option"},Rw={class:"scope-path"},Fw={class:"scope-option"},Hw={class:"scope-path"},Gw={key:0,class:"platform-note"},Kw={class:"config-edit-section"},qw={class:"section-heading"},Ww={key:1,class:"empty-config-box"},Vw={class:"field-grid"},Jw={key:0,class:"config-edit-section content-section"},Zw={class:"section-heading"},Qw={class:"modal-footer"},Yw=zl({__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 r=e,v=a,y=t({get:()=>r.visible,set:e=>v("update:visible",e)}),b=t(()=>!!r.agent),w=t(()=>"codex"===r.platform),k=t(()=>"claude"===r.platform),_=t(()=>"codex"===r.platform||"opencode"===r.platform),x=t(()=>b.value?"编辑代理":"创建代理"),U=t(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[r.platform]||"Claude Code")),P=t(()=>"codex"===r.platform?"~/.codex/config.toml":"opencode"===r.platform?"~/.config/opencode/agents/":"gemini"===r.platform?"~/.gemini/agents/":"~/.claude/agents/"),S=t(()=>"opencode"===r.platform?".opencode/agents/":"gemini"===r.platform?".gemini/agents/":".claude/agents/"),z=t(()=>"project"===L.value.scope?"项目级":"用户级"),T=t(()=>{var e;return(null==(e=j.find(e=>e.value===L.value.configMode))?void 0:e.label)||"配置"}),I=l(null),M=l(!1),A={maxHeight:"calc(92vh - 134px)",overflowY:"auto",paddingBottom:"18px"},O=[{label:"Sonnet",value:"sonnet"},{label:"Opus",value:"opus"},{label:"Haiku",value:"haiku"},{label:"继承 (inherit)",value:"inherit"}],$=[{label:"默认 (default)",value:"default"},{label:"宽松 (permissive)",value:"permissive"},{label:"严格 (strict)",value:"strict"}],j=[{label:"仅描述",value:"none"},{label:"托管 TOML",value:"managed"},{label:"自定义路径",value:"custom"}],L=l({fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}),E=t(()=>{const e={fileName:{required:!0,message:"请输入文件名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"},description:{required:!0,message:"请输入代理描述",trigger:"blur"}};return k.value&&(e.name={required:!0,message:"请输入代理名称",trigger:"blur"}),w.value&&(e.configMode={required:!0,message:"请选择配置模式",trigger:"change"},e.configFile={required:"custom"===L.value.configMode,message:"请输入自定义配置文件路径",trigger:"blur"}),e});function D(){L.value={fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}}function N(){y.value=!1,D()}async function B(){var e;try{await(null==(e=I.value)?void 0:e.validate())}catch{return}M.value=!0;try{const e={...L.value,projectPath:r.projectPath};w.value?("custom"===L.value.configMode?e.configFile=L.value.configFile:delete e.configFile,"managed"===L.value.configMode||"custom"===L.value.configMode?e.configContent=L.value.configContent||"":delete e.configContent):(delete e.configMode,delete e.configFile,delete e.configContent),b.value?(await async function(e,a,l,t="claude"){return(await ct.put(`/agents/${a}/${e}`,{...l,platform:t})).data}(L.value.fileName,L.value.scope,e,r.platform),Hs.success("代理更新成功")):(await async function(e,a="claude"){return(await ct.post("/agents",{...e,platform:a})).data}(e,r.platform),Hs.success("代理创建成功")),v("saved"),y.value=!1,D()}catch(a){Hs.error("操作失败: "+a.message)}finally{M.value=!1}}return C(()=>r.agent,e=>{if(e){const a=e.configMode||(e.configFile?String(e.configFile).includes("/.codex/agents/")?"managed":"custom":"none");L.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 D()},{immediate:!0}),C(()=>r.platform,e=>{"codex"===e&&(L.value.scope="user",L.value.configMode||(L.value.configMode="none"))},{immediate:!0}),(e,a)=>(n(),g(d(se),{show:y.value,"onUpdate:show":a[13]||(a[13]=e=>y.value=e),preset:"card",title:x.value,style:{width:"min(940px, 96vw)","max-height":"92vh"},"content-style":A,"mask-closable":!1,class:"config-edit-modal"},{footer:u(()=>[o("div",Qw,[c(d(F),{onClick:N},{default:u(()=>[...a[21]||(a[21]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:M.value,onClick:B},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Sa))]),_:1})]),default:u(()=>[h(" "+m(b.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:u(()=>[o("div",Iw,[o("div",Mw,[o("span",Aw,[c(d(R),{size:22},{default:u(()=>[c(d(Ye))]),_:1})]),o("div",Ow,[o("span",$w,m(U.value),1),o("span",jw,m(b.value?L.value.fileName||"编辑代理":"创建新代理"),1)])]),o("div",Lw,[c(d(H),{size:"small",bordered:!1,type:"info"},{default:u(()=>[h(m(z.value),1)]),_:1}),w.value?(n(),g(d(H),{key:0,size:"small",bordered:!1,type:"success"},{default:u(()=>[...a[14]||(a[14]=[h("Codex 用户级",-1)])]),_:1})):i("",!0),w.value&&"none"!==L.value.configMode?(n(),g(d(H),{key:1,size:"small",bordered:!1,type:"warning"},{default:u(()=>[h(m(T.value),1)]),_:1})):i("",!0)])]),c(d(Y),{ref_key:"formRef",ref:I,model:L.value,rules:E.value,"label-placement":"top","require-mark-placement":"right-hanging",class:"config-edit-form"},{default:u(()=>[o("div",{class:p(["config-edit-grid",{"is-codex":w.value}])},[o("section",Ew,[o("div",Dw,[c(d(R),{size:16},{default:u(()=>[c(d(_a))]),_:1}),a[15]||(a[15]=o("span",null,"基础信息",-1))]),o("div",Nw,[c(d(X),{label:"文件名",path:"fileName"},{default:u(()=>[c(d(ne),{value:L.value.fileName,"onUpdate:value":a[0]||(a[0]=e=>L.value.fileName=e),disabled:b.value,placeholder:"code-reviewer"},null,8,["value","disabled"])]),_:1}),k.value?(n(),g(d(X),{key:0,label:"显示名称",path:"name"},{default:u(()=>[c(d(ne),{value:L.value.name,"onUpdate:value":a[1]||(a[1]=e=>L.value.name=e),placeholder:"代理的显示名称"},null,8,["value"])]),_:1})):i("",!0)]),c(d(X),{label:"作用域",path:"scope"},{default:u(()=>[c(d(le),{value:L.value.scope,"onUpdate:value":a[2]||(a[2]=e=>L.value.scope=e),disabled:b.value,class:p(["scope-picker",{"single-option":w.value}])},{default:u(()=>[c(d(te),{value:"user"},{default:u(()=>[o("span",Bw,[a[16]||(a[16]=o("span",{class:"scope-title"},"用户级",-1)),o("span",Rw,m(P.value),1)])]),_:1}),w.value?i("",!0):(n(),g(d(te),{key:0,value:"project"},{default:u(()=>[o("span",Fw,[a[17]||(a[17]=o("span",{class:"scope-title"},"项目级",-1)),o("span",Hw,m(S.value),1)])]),_:1}))]),_:1},8,["value","disabled","class"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:L.value.description,"onUpdate:value":a[3]||(a[3]=e=>L.value.description=e),type:"textarea",autosize:{minRows:3,maxRows:5},placeholder:"一句话说明这个代理什么时候该被调用"},null,8,["value"])]),_:1}),w.value?(n(),s("div",Gw,[c(d(R),{size:16},{default:u(()=>[c(d(Ma))]),_:1}),a[18]||(a[18]=o("span",null,[h("Codex agents 写入用户级配置。描述会进入 "),o("code",null,"~/.codex/config.toml"),h(",TOML 配置可托管到 "),o("code",null,"~/.codex/agents/"),h("。")],-1))])):i("",!0)]),o("section",Kw,[o("div",qw,[c(d(R),{size:16},{default:u(()=>[c(d(xa))]),_:1}),o("span",null,m(w.value?"运行配置":"模型与权限"),1)]),w.value?(n(),s(f,{key:0},[c(d(X),{label:"配置模式",path:"configMode"},{default:u(()=>[c(d(ee),{value:L.value.configMode,"onUpdate:value":a[4]||(a[4]=e=>L.value.configMode=e),options:j,placeholder:"选择配置模式"},null,8,["value"])]),_:1}),"custom"===L.value.configMode?(n(),g(d(X),{key:0,label:"配置文件路径",path:"configFile"},{default:u(()=>[c(d(ne),{value:L.value.configFile,"onUpdate:value":a[5]||(a[5]=e=>L.value.configFile=e),placeholder:"~/.omx/agents/my-agent.toml"},null,8,["value"])]),_:1})):i("",!0),"none"===L.value.configMode?(n(),s("div",Ww,[c(d(R),{size:18},{default:u(()=>[c(d($a))]),_:1}),a[19]||(a[19]=o("span",null,"仅保存代理描述,不额外写入模型或工具配置。",-1))])):(n(),g(d(X),{key:2,label:"Agent Config (TOML)",path:"configContent",class:"editor-form-item"},{default:u(()=>[c(d(ne),{value:L.value.configContent,"onUpdate:value":a[6]||(a[6]=e=>L.value.configContent=e),type:"textarea",autosize:{minRows:14,maxRows:22},class:"toml-editor",placeholder:'model = "gpt-5.4"'},null,8,["value"])]),_:1}))],64)):(n(),s(f,{key:1},[c(d(X),{label:"可用工具",path:"tools"},{default:u(()=>[c(d(ne),{value:L.value.tools,"onUpdate:value":a[7]||(a[7]=e=>L.value.tools=e),placeholder:"Read, Edit, Bash"},null,8,["value"])]),_:1}),c(d(X),{label:"模型",path:"model"},{default:u(()=>[_.value?(n(),g(d(ne),{key:0,value:L.value.model,"onUpdate:value":a[8]||(a[8]=e=>L.value.model=e),placeholder:"gpt-5, claude-sonnet-4, openrouter/model"},null,8,["value"])):(n(),g(d(ee),{key:1,value:L.value.model,"onUpdate:value":a[9]||(a[9]=e=>L.value.model=e),options:O,placeholder:"选择模型",clearable:""},null,8,["value"]))]),_:1}),o("div",Vw,["opencode"!==r.platform?(n(),g(d(X),{key:0,label:"权限模式",path:"permissionMode"},{default:u(()=>[c(d(ee),{value:L.value.permissionMode,"onUpdate:value":a[10]||(a[10]=e=>L.value.permissionMode=e),options:$,placeholder:"选择权限模式",clearable:""},null,8,["value"])]),_:1})):i("",!0),"opencode"!==r.platform?(n(),g(d(X),{key:1,label:"技能",path:"skills"},{default:u(()=>[c(d(ne),{value:L.value.skills,"onUpdate:value":a[11]||(a[11]=e=>L.value.skills=e),placeholder:"自动加载的技能,逗号分隔"},null,8,["value"])]),_:1})):i("",!0)])],64))]),w.value?i("",!0):(n(),s("section",Jw,[o("div",Zw,[c(d(R),{size:16},{default:u(()=>[c(d($a))]),_:1}),a[20]||(a[20]=o("span",null,"系统提示词",-1))]),c(d(X),{path:"systemPrompt","show-label":!1,class:"editor-form-item"},{default:u(()=>[c(am,{modelValue:L.value.systemPrompt,"onUpdate:modelValue":a[12]||(a[12]=e=>L.value.systemPrompt=e),rows:10,"min-height":240,placeholder:"定义代理的行为、边界和输出要求","default-editing":!b.value},null,8,["modelValue","default-editing"])]),_:1})]))],2)]),_:1},8,["model","rules"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-00915421"]]),Xw={key:0,class:"asset-panel-header"},ek={class:"asset-title-group"},ak={class:"asset-heading"},lk={class:"asset-title-row"},tk={class:"asset-platform-pill"},sk={class:"asset-action-row"},nk={key:1,class:"asset-drawer-toolbar"},ok={class:"asset-action-row"},ik={class:"asset-summary"},rk={class:"asset-summary-item"},ck={class:"asset-summary-value"},uk={class:"asset-summary-item"},dk={class:"asset-summary-value"},pk={class:"asset-summary-item"},vk={class:"asset-summary-value"},mk={class:"asset-summary-item"},fk={class:"asset-summary-value"},yk={class:"asset-filter-bar"},gk={class:"asset-panel-content"},hk={key:0,class:"asset-empty"},bk={key:1,class:"asset-list"},wk={class:"asset-footer"},kk=zl({__name:"AgentsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null},platform:{type:String,default:""}},emits:["back","updated"],setup(e,{emit:a}){const r=e,v=a,b=M(),k=l([]),_=l(!1),x=l(""),U=l("all"),P=l(!1),S=l(!1),z=l(null),T=l(!1),I=l(null),A=l({}),O=l({}),$=l({}),j=br.filter(e=>!1!==e.supportsAgents).map(e=>e.key),L=t(()=>{if(j.includes(r.platform))return r.platform;const e=b.meta.channel;return j.includes(e)?e:"claude"}),E=t(()=>"opencode"===L.value?"使用 @agent 或 Task 在 OpenCode 中调用":"gemini"===L.value?"使用 @agent 调用 Gemini 自定义代理":"使用 Task tool 调用自定义代理"),D=t(()=>{const e=Cr(L.value);return e.label||e.title||"Claude Code"}),N=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],B=t(()=>k.value.filter(e=>"user"===e.scope).length),H=t(()=>k.value.filter(e=>"project"===e.scope).length),G=t(()=>Object.keys(O.value).length);function K(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 q(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(O.value[l])return l;return a[0]||""}const W=t(()=>{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=>O.value[q(e)])),x.value.trim()){const a=x.value.toLowerCase();e=e.filter(e=>{var l,t,s;return(null==(l=e.name)?void 0:l.toLowerCase().includes(a))||(null==(t=e.description)?void 0:t.toLowerCase().includes(a))||(null==(s=e.fileName)?void 0:s.toLowerCase().includes(a))})}return e}),V=t(()=>x.value?"没有匹配的代理":"user"===U.value?"暂无用户级代理":"project"===U.value?"暂无项目级代理":"managed"===U.value?"暂无托管的代理":"暂无自定义代理");async function J(){_.value=!0;try{const[e,a]=await Promise.all([Bb(r.projectPath,L.value),qf("agents")]);if(e.success&&(k.value=e.agents||[]),a.success){O.value={};for(const[e,l]of Object.entries(a.items||{}))O.value[e]=l}}catch(e){Hs.error("加载代理列表失败: "+e.message)}finally{_.value=!1}}async function Y(e,a){const l=q(e);if(l){$.value[l]=!0;try{(await Vf("agents",l,a)).success&&(Hs.success(a?"已启用":"已禁用"),await J())}catch(t){Hs.error("切换失败: "+t.message)}finally{delete $.value[l]}}else Hs.error("未找到代理对应的托管配置键")}async function X(e,a,l){const t=q(e);if(t){$.value[t]=!0;try{(await Jf("agents",t,a,l)).success&&(Hs.success(`${a} ${l?"已启用":"已禁用"}`),await J())}catch(s){Hs.error("切换失败: "+s.message)}finally{delete $.value[t]}}else Hs.error("未找到代理对应的托管配置键")}async function ae(){_.value=!0;try{const e=await Zf("agents");(null==e?void 0:e.success)||Hs.warning((null==e?void 0:e.message)||"同步失败,已继续刷新列表")}catch(e){Hs.warning("同步失败,已继续刷新列表: "+e.message)}await J()}function le(){I.value=null,P.value=!0}function te(e){P.value=e,e||(I.value=null)}function se(e){ie(e,!0)}async function oe(e){const a=K(e);A.value[a]=!0;try{(await async function(e,a,l=null,t="claude"){const s={};return t&&(s.platform=t),l&&(s.projectPath=l),(await ct.delete(`/agents/${a}/${e}`,{params:s})).data}(e.fileName,e.scope,r.projectPath,L.value)).success&&(Hs.success("代理已删除"),await J(),v("updated"))}catch(l){Hs.error("删除失败: "+l.message)}finally{delete A.value[a]}}async function ie(e,a=!1){if(e){if("codex"!==L.value)return a?(I.value=e,void(P.value=!0)):(z.value=e,void(S.value=!0));T.value=!0,a||(z.value=null,S.value=!0);try{const l=await async function(e,a,l=null,t="claude"){const s={};return t&&(s.platform=t),l&&(s.projectPath=l),(await ct.get(`/agents/${a}/${e}`,{params:s})).data}(e.fileName,e.scope,r.projectPath,L.value),t=(null==l?void 0:l.agent)||e;a?(I.value=t,P.value=!0):z.value=t}catch(l){Hs.error("加载代理详情失败: "+l.message),a?(I.value=e,P.value=!0):z.value=e}finally{T.value=!1}}}function re(e){ie(e,!1)}function ce(){I.value=null,J(),v("updated")}function ue(){v("back")}return w(()=>{J()}),C(L,()=>{J()}),(a,l)=>(n(),s("div",{class:p(["agents-panel asset-panel",{"in-drawer":r.inDrawer}])},[r.inDrawer?i("",!0):(n(),s("div",Xw,[o("div",ek,[r.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:ue,class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ja))]),_:1})]),_:1})),o("div",ak,[o("div",lk,[l[3]||(l[3]=o("span",{class:"asset-title"},"代理管理",-1)),o("span",tk,m(D.value),1)]),l[4]||(l[4]=o("div",{class:"asset-subtitle"},"维护自定义代理、工具权限和平台启用状态",-1))])]),o("div",sk,[c(d(F),{text:"",onClick:le,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[5]||(l[5]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:ae,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[6]||(l[6]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),r.inDrawer?(n(),s("div",nk,[o("div",ok,[c(d(F),{text:"",onClick:le,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[7]||(l[7]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:ae,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[8]||(l[8]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",ik,[o("span",rk,[l[9]||(l[9]=o("span",{class:"asset-summary-label"},"全部",-1)),o("span",ck,m(k.value.length),1)]),o("span",uk,[l[10]||(l[10]=o("span",{class:"asset-summary-label"},"用户级",-1)),o("span",dk,m(B.value),1)]),o("span",pk,[l[11]||(l[11]=o("span",{class:"asset-summary-label"},"项目级",-1)),o("span",vk,m(H.value),1)]),o("span",mk,[l[12]||(l[12]=o("span",{class:"asset-summary-label"},"托管",-1)),o("span",fk,m(G.value),1)])]),o("div",yk,[c(d(ne),{value:x.value,"onUpdate:value":l[0]||(l[0]=e=>x.value=e),placeholder:"搜索代理、描述或文件名",clearable:"",size:"small",class:"asset-search"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:U.value,"onUpdate:value":l[1]||(l[1]=e=>U.value=e),options:N,size:"small",class:"asset-filter"},null,8,["value"])]),o("div",gk,[c(d(Z),{show:_.value},{default:u(()=>[0!==W.value.length||_.value?(n(),s("div",bk,[(n(!0),s(f,null,y(W.value,e=>(n(),g(Xb,{key:K(e),agent:e,deleting:!!A.value[K(e)],"registry-info":O.value[q(e)],toggling:!!$.value[q(e)],onEdit:se,onDelete:oe,onClick:re,onToggleEnabled:Y,onTogglePlatform:X},null,8,["agent","deleting","registry-info","toggling"]))),128))])):(n(),s("div",hk,[c(d(Q),{description:V.value},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Ye))]),_:1})]),extra:u(()=>[c(d(F),{size:"small",onClick:le},{default:u(()=>[...l[13]||(l[13]=[h(" 创建第一个代理 ",-1)])]),_:1})]),_:1},8,["description"])]))]),_:1},8,["show"])]),o("div",wk,[c(d(R),{size:"14",class:"asset-info-icon"},{default:u(()=>[c(d(Ma))]),_:1}),o("span",null,m(E.value),1)]),c(Yw,{visible:P.value,"onUpdate:visible":te,agent:I.value,"project-path":e.projectPath,platform:L.value,onSaved:ce},null,8,["visible","agent","project-path","platform"]),c(Tw,{visible:S.value,"onUpdate:visible":l[2]||(l[2]=e=>S.value=e),agent:z.value,platform:L.value,loading:T.value},null,8,["visible","agent","platform","loading"])],2))}},[["__scopeId","data-v-16252a9f"]]),_k=zl({__name:"AgentsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=oi(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},[o("span",null,"代理管理")],-1)])]),default:u(()=>[c(kk,{onBack:a[0]||(a[0]=e=>r.value=!1),"hide-back":!0,"in-drawer":!0,platform:l.platform},null,8,["platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b9b7a7fa"]]);async function Ck(e,a,l="claude",t=""){const s={platform:l};t?s.source=t:(s.directory=e,s.repo=a);return(await ct.post("/plugins/install",s)).data}async function xk(e,a="claude"){return(await ct.post("/plugins/repos",{...e,platform:a})).data}async function Uk(e,a={},l="claude"){return(await ct.put("/plugins/repos/auth",{id:e.id||"",owner:e.owner||"",name:e.name||"",token:a.token||"",clearToken:!!a.clearToken,platform:l})).data}async function Pk(e="claude"){return(await ct.post("/plugins/repos/sync",{platform:e})).data}const Sk={class:"asset-card-main"},zk={class:"asset-card-top"},Tk={class:"asset-card-title-stack"},Ik={class:"asset-card-title-row"},Mk={class:"asset-name"},Ak={class:"asset-tags"},Ok={key:0,class:"asset-description"},$k={class:"asset-meta"},jk={class:"asset-meta-item mono"},Lk=["href"],Ek={__name:"PluginCard",props:{plugin:{type:Object,required:!0},readonly:{type:Boolean,default:!1},canInstall:{type:Boolean,default:!0},canUninstall:{type:Boolean,default:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1}},emits:["click","install","uninstall"],setup(e){function a(e){return!!((null==e?void 0:e.installSource)||(null==e?void 0:e.repoOwner)||(null==e?void 0:e.repoProjectPath)||(null==e?void 0:e.repoLocalPath))}return(l,t)=>{return n(),s("div",{class:p(["plugin-card asset-card",{"is-installed":e.plugin.installed,"is-disabled":e.readonly}]),onClick:t[4]||(t[4]=a=>l.$emit("click",e.plugin))},[o("div",Sk,[o("div",zk,[o("div",Tk,[o("div",Ik,[o("span",{class:p(["asset-status-dot",{active:e.plugin.installed}])},null,2),o("span",Mk,m(e.plugin.name),1)]),o("div",Ak,[e.plugin.installed?(n(),g(d(H),{key:0,type:"success",size:"tiny",bordered:!1},{default:u(()=>[...t[5]||(t[5]=[h("已安装",-1)])]),_:1})):i("",!0),e.readonly?(n(),g(d(H),{key:1,type:"default",size:"tiny",bordered:!1},{default:u(()=>[...t[6]||(t[6]=[h("缓存",-1)])]),_:1})):i("",!0),"skill-bundle"===e.plugin.pluginKind?(n(),g(d(H),{key:2,type:"warning",size:"tiny",bordered:!1},{default:u(()=>[...t[7]||(t[7]=[h("技能包插件",-1)])]),_:1})):i("",!0),"gitlab"===e.plugin.repoProvider?(n(),g(d(H),{key:3,type:"info",size:"tiny",bordered:!1},{default:u(()=>[...t[8]||(t[8]=[h("GitLab",-1)])]),_:1})):"local"===e.plugin.repoProvider?(n(),g(d(H),{key:4,type:"info",size:"tiny",bordered:!1},{default:u(()=>[...t[9]||(t[9]=[h("本地",-1)])]),_:1})):e.plugin.repoOwner?(n(),g(d(H),{key:5,type:"info",size:"tiny",bordered:!1},{default:u(()=>[h(m(e.plugin.repoOwner),1)]),_:1})):i("",!0)])])]),e.plugin.description?(n(),s("div",Ok,m((c=e.plugin.description,f=120,(null==c?void 0:c.length)>f?c.slice(0,f)+"...":c)),1)):i("",!0),o("div",$k,[o("span",jk,m(e.plugin.directory),1),e.plugin.readmeUrl?(n(),s("a",{key:0,class:"asset-link",href:e.plugin.readmeUrl,target:"_blank",onClick:t[0]||(t[0]=v(()=>{},["stop"]))},m((r=e.plugin,"gitlab"===(null==r?void 0:r.repoProvider)?"GitLab":"local"===(null==r?void 0:r.repoProvider)?"本地":"GitHub")),9,Lk)):i("",!0)])]),e.readonly?i("",!0):(n(),s("div",{key:0,class:"asset-card-actions",onClick:t[3]||(t[3]=v(()=>{},["stop"]))},[e.plugin.installed&&e.canUninstall?(n(),g(d(F),{key:0,size:"small",tertiary:"",type:"error",loading:e.uninstalling,focusable:!1,onClick:t[1]||(t[1]=a=>l.$emit("uninstall",e.plugin))},{default:u(()=>[...t[10]||(t[10]=[h("卸载",-1)])]),_:1},8,["loading"])):e.canInstall?(n(),g(d(F),{key:1,size:"small",type:"primary",loading:e.installing,disabled:!a(e.plugin),focusable:!1,onClick:t[2]||(t[2]=a=>l.$emit("install",e.plugin))},{default:u(()=>[...t[11]||(t[11]=[h("安装",-1)])]),_:1},8,["loading","disabled"])):i("",!0)]))],2);var r,c,f}}},Dk={class:"repo-manager"},Nk={class:"repo-list"},Bk={class:"repo-main"},Rk={class:"repo-info"},Fk={class:"repo-name-row"},Hk={class:"repo-name"},Gk={class:"repo-branch"},Kk={key:0,class:"repo-auth-hint"},qk={class:"repo-actions"},Wk={key:0,class:"empty-hint"},Vk={class:"add-repo"},Jk={class:"add-form"},Zk={class:"tips"},Qk={key:0,class:"recommended"},Yk={class:"recommended-list"},Xk=["onClick"],e_={class:"rec-info"},a_={class:"rec-name"},l_={class:"rec-desc"},t_={key:0,class:"auth-manager"},s_={class:"auth-meta"},n_={class:"auth-meta-row"},o_={class:"auth-value"},i_={class:"auth-meta-row"},r_={class:"auth-value"},c_={class:"auth-meta-row"},u_={class:"auth-value"},d_={class:"auth-actions"},p_=zl({__name:"PluginRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const r=e,v=a,b=t({get:()=>r.visible,set:e=>v("update:visible",e)}),k=l([]),_=l(!1),x=l(!1),U=l(!1),P=l(!1),S=l(null),z=l(!1),T=l(!1),I=l({token:""}),M=l({input:"",branch:"main"}),A=t(()=>S.value?("gitlab"===S.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),O=t(()=>"opencode"===r.platform?[{owner:"Tommertom",name:"opencode-plugin-marketplace",url:"https://github.com/Tommertom/opencode-plugin-marketplace",description:"OpenCode 插件市场",branch:"main"},{owner:"avifenesh",name:"awesome-slash",url:"https://github.com/avifenesh/awesome-slash",description:"Awesome Slash 命令集",branch:"main"},{owner:"NeoLabHQ",name:"context-engineering-kit",url:"https://github.com/NeoLabHQ/context-engineering-kit",description:"上下文工程工具包",branch:"master"},{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"}]:"codex"===r.platform?[]:[{owner:"anthropics",name:"claude-plugins-official",url:"https://github.com/anthropics/claude-plugins-official",description:"官方插件库",branch:"main"}]),j=t(()=>!!wy(M.value.input.trim()));function L(e){const a=e.provider||(e.localPath?"local":e.projectPath?"gitlab":"github"),l=e.branch||"main",t=by(e.directory);return"local"===a?`local:${e.localPath||""}::${t}`:"gitlab"===a?`gitlab:${e.host||"https://gitlab.com"}::${e.projectPath||""}::${l}::${t}`:`github:${e.host||"https://github.com"}::${e.owner||""}/${e.name||""}::${l}::${t}`}function E(e){return"local"===e.provider?e.localPath||e.name||"本地仓库":"gitlab"===e.provider&&e.projectPath||[e.owner,e.name].filter(Boolean).join("/")}function D(e){const a=[];return"local"===e.provider?a.push("本地仓库"):"gitlab"===e.provider?(a.push("GitLab"),e.host&&a.push(e.host.replace(/^https?:\/\//,""))):a.push("GitHub"),e.branch&&a.push(e.branch),e.directory&&a.push(`目录: ${e.directory}`),a.join(" · ")}function N(e){return"github"===(null==e?void 0:e.provider)||"gitlab"===(null==e?void 0:e.provider)}function B(e){return N(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function K(){P.value=!1,S.value=null,I.value.token="",z.value=!1,T.value=!1}async function q(){_.value=!0;try{const e=await async function(e="claude"){return(await ct.get("/plugins/repos",{params:{platform:e}})).data}(r.platform);e.success&&(k.value=e.repos||[])}catch(e){Hs.error("加载仓库失败: "+e.message)}finally{_.value=!1}}async function W(){U.value=!0;try{(await Pk(r.platform)).success&&(Hs.success("仓库同步成功"),v("updated"))}catch(e){Hs.error("同步失败: "+e.message)}finally{U.value=!1}}async function V(){if(!j.value)return;const e=wy(M.value.input.trim());x.value=!0;try{const a=await xk({...e,branch:M.value.branch||"main",enabled:!0},r.platform);a.success&&(k.value=a.repos,M.value.input="",M.value.branch="main",Hs.success("仓库添加成功"),v("updated"))}catch(a){Hs.error("添加失败: "+a.message)}finally{x.value=!1}}async function J(e){try{const a=await async function(e,a="claude"){return(await ct.delete("/plugins/repos",{params:{platform:a,id:e.id||"",owner:e.owner||"",name:e.name||""}})).data}(e,r.platform);a.success&&(k.value=a.repos,Hs.success("仓库已删除"),v("updated"))}catch(a){Hs.error("删除失败: "+a.message)}}async function Q(e,a){try{const l=await async function(e,a,l="claude"){return(await ct.put("/plugins/repos/toggle",{id:e.id||"",owner:e.owner||"",name:e.name||"",enabled:a,platform:l})).data}(e,a,r.platform);l.success&&(k.value=l.repos,v("updated"))}catch(l){Hs.error("操作失败: "+l.message)}}async function Y(){const e=S.value,a=I.value.token.trim();if(e&&a){z.value=!0;try{const l=await Uk(e,{token:a},r.platform);l.success&&(k.value=l.repos||[],Hs.success("仓库 Token 已保存"),v("updated"),K())}catch(l){Hs.error("保存 Token 失败: "+l.message)}finally{z.value=!1}}}async function X(){const e=S.value;if(e){T.value=!0;try{const a=await Uk(e,{clearToken:!0},r.platform);a.success&&(k.value=a.repos||[],Hs.success("仓库 Token 已清除"),v("updated"),K())}catch(a){Hs.error("清除 Token 失败: "+a.message)}finally{T.value=!1}}}function ee(e){const a=L(e);return k.value.some(e=>L(e)===a)}function ae(){K(),v("update:visible",!1)}return C(()=>r.visible,e=>{e&&q()}),C(()=>r.platform,()=>{r.visible&&q()}),w(()=>{r.visible&&q()}),(e,a)=>(n(),s(f,null,[c(d(se),{show:b.value,"onUpdate:show":a[2]||(a[2]=e=>b.value=e),preset:"card",title:"插件仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:ae},{"header-extra":u(()=>[c(d(F),{type:"primary",size:"small",loading:U.value,focusable:!1,onClick:W},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(aa))]),_:1})]),default:u(()=>[a[5]||(a[5]=h(" 同步 ",-1))]),_:1},8,["loading"])]),default:u(()=>[o("div",Dk,[o("div",Nk,[c(d(Z),{show:_.value},{default:u(()=>[(n(!0),s(f,null,y(k.value,e=>(n(),s("div",{key:e.id||`${e.owner}/${e.name}/${e.localPath||""}`,class:"repo-item"},[o("div",Bk,[c(d(G),{value:e.enabled,size:"small","onUpdate:value":a=>Q(e,a)},null,8,["value","onUpdate:value"]),o("div",Rk,[o("div",Fk,[o("div",Hk,m(E(e)),1),N(e)?(n(),g(d(H),{key:0,size:"tiny",type:e.hasToken?"success":"default",bordered:!1},{default:u(()=>[h(m(e.hasToken?"已配 Token":"未配 Token"),1)]),_:2},1032,["type"])):i("",!0)]),o("div",Gk,m(D(e)),1),N(e)?(n(),s("div",Kk,m(B(e)),1)):i("",!0)])]),o("div",qk,[N(e)?(n(),g(d(F),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){N(e)&&(S.value=e,I.value.token="",P.value=!0)}(e)},{default:u(()=>[...a[6]||(a[6]=[h(" 认证 ",-1)])]),_:1},8,["onClick"])):i("",!0),c(d(F),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>J(e)},{default:u(()=>[...a[7]||(a[7]=[h(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===k.value.length?(n(),s("div",Wk," 暂无仓库,请添加 ")):i("",!0)]),_:1},8,["show"])]),o("div",Vk,[a[9]||(a[9]=o("div",{class:"add-title"},"添加仓库",-1)),o("div",Jk,[c(d(ne),{value:M.value.input,"onUpdate:value":a[0]||(a[0]=e=>M.value.input=e),placeholder:"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:$(V,["enter"])},null,8,["value"]),c(d(ne),{value:M.value.branch,"onUpdate:value":a[1]||(a[1]=e=>M.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"]),c(d(F),{type:"primary",size:"small",disabled:!j.value,loading:x.value,focusable:!1,onClick:V},{default:u(()=>[...a[8]||(a[8]=[h(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[10]||(a[10]=o("div",{class:"add-hint"}," 支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径 ",-1))]),o("div",Zk,[c(d(pe),{type:"info",bordered:!1,size:"small"},{default:u(()=>[...a[11]||(a[11]=[h(" 支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。 ",-1)])]),_:1})]),O.value.length>0?(n(),s("div",Qk,[a[13]||(a[13]=o("div",{class:"recommended-title"},"推荐仓库",-1)),o("div",Yk,[(n(!0),s(f,null,y(O.value,e=>(n(),s("div",{key:e.url||`${e.owner}/${e.name}`,class:p(["recommended-item",{added:ee(e)}]),onClick:a=>!ee(e)&&async function(e){x.value=!0;try{const a=await xk({owner:e.owner,name:e.name,url:e.url,branch:e.branch,enabled:!0},r.platform);a.success&&(k.value=a.repos,Hs.success("仓库添加成功"),v("updated"))}catch(a){Hs.error("添加失败: "+a.message)}finally{x.value=!1}}(e)},[o("div",e_,[o("span",a_,m(e.owner)+"/"+m(e.name),1),o("span",l_,m(e.description),1)]),ee(e)?(n(),g(d(H),{key:0,size:"tiny",type:"success",bordered:!1},{default:u(()=>[...a[12]||(a[12]=[h(" 已添加 ",-1)])]),_:1})):(n(),g(d(R),{key:1,class:"add-icon"},{default:u(()=>[c(d(Ke))]),_:1}))],10,Xk))),128))])])):i("",!0)])]),_:1},8,["show"]),c(d(se),{show:P.value,"onUpdate:show":a[4]||(a[4]=e=>P.value=e),preset:"card",title:A.value,bordered:!1,style:{width:"460px","max-width":"92vw"},onClose:K},{default:u(()=>[S.value?(n(),s("div",t_,[c(d(pe),{type:"info",bordered:!1,size:"small"},{default:u(()=>{return[h(m((e=S.value,"gitlab"===(null==e?void 0:e.provider)?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),o("div",s_,[o("div",n_,[a[14]||(a[14]=o("span",{class:"auth-label"},"仓库",-1)),o("span",o_,m(E(S.value)),1)]),o("div",i_,[a[15]||(a[15]=o("span",{class:"auth-label"},"来源",-1)),o("span",r_,m("gitlab"===S.value.provider?"GitLab":"GitHub"),1)]),o("div",c_,[a[16]||(a[16]=o("span",{class:"auth-label"},"当前状态",-1)),o("span",u_,m(S.value.hasToken?`已配置 ${S.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),c(d(ne),{value:I.value.token,"onUpdate:value":a[3]||(a[3]=e=>I.value.token=e),type:"password","show-password-on":"click",clearable:"",placeholder:"输入此仓库专属 Token",onKeyup:$(Y,["enter"])},null,8,["value"]),a[20]||(a[20]=o("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),o("div",d_,[c(d(F),{focusable:!1,onClick:K},{default:u(()=>[...a[17]||(a[17]=[h(" 取消 ",-1)])]),_:1}),S.value.hasToken?(n(),g(d(F),{key:0,type:"warning",secondary:"",focusable:!1,loading:T.value,onClick:X},{default:u(()=>[...a[18]||(a[18]=[h(" 清除 Token ",-1)])]),_:1},8,["loading"])):i("",!0),c(d(F),{type:"primary",focusable:!1,disabled:!I.value.token.trim(),loading:z.value,onClick:Y},{default:u(()=>[...a[19]||(a[19]=[h(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):i("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-ce6b2d35"]]),v_={class:"asset-detail-drawer-header"},m_={class:"asset-detail-identity"},f_={class:"asset-detail-heading"},y_={class:"asset-detail-name"},g_={class:"asset-detail-meta"},h_={key:2,class:"asset-detail-subtle"},b_={class:"asset-detail-body"},w_={class:"asset-detail-container"},k_={class:"asset-detail-info-section"},__={class:"asset-detail-description"},C_={key:0,class:"asset-detail-info-section"},x_={class:"asset-detail-list"},U_={class:"asset-detail-value mono"},P_={key:1,class:"asset-detail-info-section"},S_={class:"asset-detail-box"},z_=["href"],T_={key:1},I_={class:"asset-detail-container"},M_={key:0,class:"asset-detail-loading"},A_=["innerHTML"],O_={key:2,class:"asset-detail-empty"},$_={__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}){wl.setOptions({breaks:!0,gfm:!0});const{drawerWidth:r}=oi(600),p=e,v=a,b=t({get:()=>p.visible,set:e=>v("update:visible",e)}),w=l(""),k=l(!1),_=t(()=>{var e,a;return/^(https?:)?\/\//.test((null==(e=p.plugin)?void 0:e.repoUrl)||(null==(a=p.plugin)?void 0:a.gitUrl)||"")}),x=t(()=>{var e,a,l,t;return(null==(e=p.plugin)?void 0:e.installPath)||(null==(a=p.plugin)?void 0:a.fullPath)||(null==(l=p.plugin)?void 0:l.path)||(null==(t=p.plugin)?void 0:t.directory)||""}),U=t(()=>{var e;return Array.isArray(null==(e=p.plugin)?void 0:e.skillPaths)?p.plugin.skillPaths:[]}),P={height:"100%",minHeight:0,overflow:"hidden"};C(()=>p.visible,async e=>{if(e&&p.plugin){k.value=!0;try{const e={repoId:p.plugin.repoId,repoProvider:p.plugin.repoProvider,repoHost:p.plugin.repoHost,repoOwner:p.plugin.repoOwner,repoName:p.plugin.repoName,repoBranch:p.plugin.repoBranch,directory:p.plugin.directory,source:p.plugin.source,repoUrl:p.plugin.repoUrl,repoProjectPath:p.plugin.repoProjectPath,repoLocalPath:p.plugin.repoLocalPath,installPath:p.plugin.installPath},a=await async function(e,a={},l="claude"){const t=new URLSearchParams;return l&&t.append("platform",l),a.repoId&&t.append("repoId",a.repoId),a.repoProvider&&t.append("repoProvider",a.repoProvider),a.repoHost&&t.append("repoHost",a.repoHost),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),a.repoProjectPath&&t.append("repoProjectPath",a.repoProjectPath),a.repoLocalPath&&t.append("repoLocalPath",a.repoLocalPath),a.installPath&&t.append("installPath",a.installPath),(await ct.get(`/plugins/${encodeURIComponent(e)}/readme?${t.toString()}`)).data}(p.plugin.name,e,p.platform);w.value=a.readme||""}catch(a){w.value=""}finally{k.value=!1}}});const S=t(()=>w.value?wl(w.value):"");return(a,l)=>(n(),g(d(ce),{show:b.value,"onUpdate:show":l[0]||(l[0]=e=>b.value=e),width:d(r),placement:"right","show-mask":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":P},{header:u(()=>{var a,t,r,p;return[o("div",v_,[o("div",m_,[c(d(R),{size:20,class:"asset-detail-icon"},{default:u(()=>[c(d(Je))]),_:1}),o("div",f_,[o("span",y_,m((null==(a=e.plugin)?void 0:a.name)||"插件详情"),1),o("div",g_,[(null==(t=e.plugin)?void 0:t.version)?(n(),g(d(H),{key:0,size:"tiny",bordered:!1,type:"info"},{default:u(()=>[h(" v"+m(e.plugin.version),1)]),_:1})):i("",!0),"skill-bundle"===(null==(r=e.plugin)?void 0:r.pluginKind)?(n(),g(d(H),{key:1,size:"tiny",bordered:!1,type:"warning"},{default:u(()=>[...l[1]||(l[1]=[h(" 技能包插件 ",-1)])]),_:1})):i("",!0),(null==(p=e.plugin)?void 0:p.author)?(n(),s("span",h_,[c(d(R),{size:12},{default:u(()=>[c(d(Ye))]),_:1}),h(" "+m(e.plugin.author),1)])):i("",!0)])])])])]}),default:u(()=>[o("div",b_,[c(d(ge),{type:"line",animated:"",class:"asset-detail-tabs"},{default:u(()=>[c(d(he),{name:"overview",tab:"概览"},{default:u(()=>{var a,t,r,p;return[o("div",w_,[o("div",k_,[l[2]||(l[2]=o("h3",{class:"asset-detail-section-title"},"描述",-1)),o("p",__,m((null==(a=e.plugin)?void 0:a.description)||"暂无描述"),1)]),U.value.length>0?(n(),s("div",C_,[l[3]||(l[3]=o("h3",{class:"asset-detail-section-title"},"包含技能",-1)),o("div",x_,[(n(!0),s(f,null,y(U.value,e=>(n(),s("div",{key:e,class:"asset-detail-row"},[o("span",U_,m(e),1)]))),128))])])):i("",!0),(null==(t=e.plugin)?void 0:t.repoUrl)||(null==(r=e.plugin)?void 0:r.gitUrl)||(null==(p=e.plugin)?void 0:p.repoLocalPath)?(n(),s("div",P_,[l[4]||(l[4]=o("h3",{class:"asset-detail-section-title"},"仓库地址",-1)),o("div",S_,[c(d(R),{size:16},{default:u(()=>[c(d(ll))]),_:1}),_.value?(n(),s("a",{key:0,class:"asset-detail-link",href:e.plugin.repoUrl||e.plugin.gitUrl,target:"_blank",rel:"noopener noreferrer"},m(e.plugin.repoUrl||e.plugin.gitUrl),9,z_)):(n(),s("span",T_,m(e.plugin.repoLocalPath),1))])])):i("",!0),c(cg,{path:x.value},null,8,["path"])])]}),_:1}),c(d(he),{name:"readme",tab:"README"},{default:u(()=>[o("div",I_,[k.value?(n(),s("div",M_,[c(d(Z),{size:"medium"}),l[5]||(l[5]=o("p",null,"加载 README 中...",-1))])):w.value?(n(),s("div",{key:1,class:"asset-detail-content",innerHTML:S.value},null,8,A_)):(n(),s("div",O_,[c(d(R),{size:44,class:"asset-detail-empty-icon"},{default:u(()=>[c(d($a))]),_:1}),l[6]||(l[6]=o("p",null,"暂无 README 文档",-1))]))])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]))}},j_={key:0,class:"asset-panel-header"},L_={class:"asset-title-group"},E_={class:"asset-heading"},D_={class:"asset-title-row"},N_={class:"asset-platform-pill"},B_={class:"asset-action-row"},R_={key:1,class:"asset-drawer-toolbar"},F_={class:"asset-action-row"},H_={class:"asset-summary"},G_={class:"asset-summary-item"},K_={class:"asset-summary-value"},q_={class:"asset-summary-item"},W_={class:"asset-summary-value"},V_={class:"asset-summary-item"},J_={class:"asset-summary-value"},Z_={class:"asset-filter-bar"},Q_={class:"asset-panel-content"},Y_={key:0,class:"asset-empty"},X_={key:1,class:"asset-list"},eC={key:2,class:"asset-footer"},aC=zl({__name:"PluginsPanel",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,r=M(),v=Ue(),b=l(!1),k=l([]),_=l(""),x=l("all"),U=l(!1),P=l(!1),S=l(null),z=l({}),T=l({}),I=l(!1),A=l(0),O=l({supportsPlugins:!0,repositories:!0,market:!0,install:!0,uninstall:!0,import:!0,syncRepos:!0}),$=br.filter(e=>!1!==e.supportsPlugins).map(e=>e.key),j=t(()=>{if(a.platform&&$.includes(a.platform))return a.platform;const e=Array.isArray(r.query.platform)?r.query.platform[0]:r.query.platform;if($.includes(e))return e;const l=r.meta.channel;return $.includes(l)?l:"claude"}),L=t(()=>{const e=Cr(j.value);return e.label||e.title||"Claude Code"}),E=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"}],D=t(()=>k.value.filter(e=>e.installed).length),N=t(()=>{let e=k.value;if("installed"===x.value?e=e.filter(e=>e.installed):"uninstalled"===x.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)}),B=t(()=>_.value?"没有匹配的插件":"installed"===x.value?"暂无已安装的插件":"uninstalled"===x.value?"所有插件都已安装":!1===O.value.supportsPlugins?O.value.disabledReason||`${L.value} 暂未提供插件管理能力`:"暂无可用插件,请配置仓库源");async function H(e){try{const a=await async function(e="claude"){return(await ct.get("/plugins/capabilities",{params:{platform:e}})).data}(e);if(a.success&&a.capabilities)return void(O.value={supportsPlugins:!0,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,...a.capabilities})}catch{}O.value={supportsPlugins:$.includes(j.value),repositories:$.includes(j.value),market:$.includes(j.value),install:$.includes(j.value),uninstall:$.includes(j.value),import:"claude"===j.value,syncRepos:"claude"===j.value}}async function G(e=!1){const a=++A.value,l=j.value;b.value=!0;try{if(await H(l),!1===O.value.supportsPlugins)return void(k.value=[]);e&&O.value.syncRepos&&await Pk(l).catch(()=>{});const t=await async function(e="claude"){return(await ct.get("/plugins",{params:{platform:e}})).data}(l),s=t.success?t.plugins:[];let n=[];const o=(e,a)=>{const l={};for(const n of a)l[n.name]=n;const t=e.map(e=>{const a=l[e.name]||{};return{...a,...e,installed:!0,key:`installed-${e.name}`,description:e.description||a.description||"",repoProvider:e.repoProvider||a.repoProvider||"",repoHost:e.repoHost||a.repoHost||"",repoOwner:e.repoOwner||a.repoOwner||"",repoName:e.repoName||a.repoName||"",repoBranch:e.repoBranch||a.repoBranch||"main",repoProjectPath:e.repoProjectPath||a.repoProjectPath||"",repoLocalPath:e.repoLocalPath||a.repoLocalPath||"",repoId:e.repoId||a.repoId||"",repoUrl:e.repoUrl||a.repoUrl||"",marketplace:e.marketplace||a.marketplace||"",installSource:e.installSource||a.installSource||"",readmeUrl:e.readmeUrl||a.readmeUrl||"",containsSkills:Boolean(e.containsSkills||a.containsSkills),skillPaths:Array.isArray(e.skillPaths)?e.skillPaths:Array.isArray(a.skillPaths)?a.skillPaths:[],pluginKind:e.pluginKind||a.pluginKind||(e.containsSkills||a.containsSkills?"skill-bundle":"plugin"),strict:Object.prototype.hasOwnProperty.call(e,"strict")?e.strict:a.strict,directory:e.directory||a.directory||e.installPath||""}}),s=new Set(e.map(e=>e.name));return[...t,...a.filter(e=>!s.has(e.name)).map(e=>({...e,installed:!1,key:`market-${e.repoId||e.repoProjectPath||e.repoLocalPath||e.repoOwner||"repo"}-${e.directory||e.name}`}))]};k.value=o(s,n),O.value.market&&async function(e="claude",a=!1){return(await ct.get("/plugins/market",{params:{platform:e,refresh:a?"1":""}})).data}(l,e).catch(()=>({success:!0,plugins:[]})).then(e=>{a===A.value&&l===j.value&&(n=e.success?e.plugins:[],k.value=o(s,n))})}catch(t){v.error("加载插件失败: "+t.message)}finally{a===A.value&&(b.value=!1)}}async function K(){if("claude"===j.value){I.value=!0;try{const e=await Wf("plugins");e.success?(v.success(`成功导入 ${e.imported} 个插件`),await G(!0)):v.error(e.message||"导入失败")}catch(e){v.error("导入失败: "+e.message)}finally{I.value=!1}}}async function q(e){if(O.value.install&&!e.readonly){if(!(e.installSource||e.repoOwner||e.repoProjectPath||e.repoLocalPath))return v.error("缺少可安装来源");z.value[e.key]=!0;try{const a=e.installSource?await Ck("",null,j.value,e.installSource):await Ck(e.directory,{id:e.repoId,provider:e.repoProvider,host:e.repoHost,owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main",projectPath:e.repoProjectPath,localPath:e.repoLocalPath,repoUrl:e.repoUrl,marketplace:e.marketplace},j.value);if(a.success){v.success(`插件 "${e.name}" 安装成功`);const a=k.value.findIndex(a=>a.key===e.key);-1!==a&&(k.value[a]={...k.value[a],installed:!0,key:`installed-${e.name}`})}else v.error(a.message||"安装失败")}catch(a){v.error("安装失败: "+a.message)}finally{delete z.value[e.key]}}}async function W(e){if(O.value.uninstall&&!e.readonly){T.value[e.key]=!0;try{const a=await async function(e,a="claude"){return(await ct.delete(`/plugins/${encodeURIComponent(e)}`,{params:{platform:a}})).data}(e.name,j.value);if(a.success){v.success(`插件 "${e.name}" 已卸载`);const a=k.value.findIndex(a=>a.key===e.key);-1!==a&&(k.value[a]={...k.value[a],installed:!1,key:`market-${e.repoId||e.repoProjectPath||e.repoLocalPath||e.repoOwner||"repo"}-${e.directory||e.name}`})}else v.error(a.message||a.error||"卸载失败")}catch(a){v.error("卸载失败: "+a.message)}finally{delete T.value[e.key]}}}function V(e){S.value=e,P.value=!0}return w(()=>{a.inDrawer&&!a.drawerVisible||G()}),C(()=>a.drawerVisible,e=>{e&&G()}),C(()=>j.value,()=>{G()}),(a,l)=>(n(),s("div",{class:p(["plugins-panel asset-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?i("",!0):(n(),s("div",j_,[o("div",L_,[e.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ja))]),_:1})]),_:1})),o("div",E_,[o("div",D_,[l[10]||(l[10]=o("span",{class:"asset-title"},"插件管理",-1)),o("span",N_,m(L.value),1)]),l[11]||(l[11]=o("div",{class:"asset-subtitle"},"管理平台插件、仓库源和市场安装状态",-1))])]),o("div",B_,[O.value.repositories?(n(),g(d(F),{key:0,text:"",focusable:!1,onClick:l[1]||(l[1]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ta))]),_:1})]),default:u(()=>[l[12]||(l[12]=h(" 仓库 ",-1))]),_:1})):i("",!0),O.value.import?(n(),g(d(F),{key:1,text:"",focusable:!1,onClick:K,loading:I.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ja))]),_:1})]),default:u(()=>[l[13]||(l[13]=h(" 导入 ",-1))]),_:1},8,["loading"])):i("",!0),c(d(F),{text:"",focusable:!1,onClick:l[2]||(l[2]=e=>G(!0)),loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[14]||(l[14]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),s("div",R_,[o("div",F_,[O.value.repositories?(n(),g(d(F),{key:0,text:"",focusable:!1,onClick:l[3]||(l[3]=e=>U.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ta))]),_:1})]),default:u(()=>[l[15]||(l[15]=h(" 仓库 ",-1))]),_:1})):i("",!0),O.value.import?(n(),g(d(F),{key:1,text:"",focusable:!1,onClick:K,loading:I.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ja))]),_:1})]),default:u(()=>[l[16]||(l[16]=h(" 导入 ",-1))]),_:1},8,["loading"])):i("",!0),c(d(F),{text:"",focusable:!1,onClick:l[4]||(l[4]=e=>G(!0)),loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[17]||(l[17]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",H_,[o("span",G_,[l[18]||(l[18]=o("span",{class:"asset-summary-label"},"全部",-1)),o("span",K_,m(k.value.length),1)]),o("span",q_,[l[19]||(l[19]=o("span",{class:"asset-summary-label"},"已安装",-1)),o("span",W_,m(D.value),1)]),o("span",V_,[l[20]||(l[20]=o("span",{class:"asset-summary-label"},"可安装",-1)),o("span",J_,m(k.value.length-D.value),1)])]),o("div",Z_,[c(d(ne),{value:_.value,"onUpdate:value":l[5]||(l[5]=e=>_.value=e),placeholder:"搜索插件名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:x.value,"onUpdate:value":l[6]||(l[6]=e=>x.value=e),options:E,size:"small",class:"asset-filter"},null,8,["value"])]),o("div",Q_,[c(d(Z),{show:b.value},{default:u(()=>[0!==N.value.length||b.value?(n(),s("div",X_,[(n(!0),s(f,null,y(N.value,e=>(n(),g(Ek,{key:e.key,plugin:e,readonly:e.readonly||!O.value.install&&!O.value.uninstall,"can-install":O.value.install,"can-uninstall":O.value.uninstall,installing:!!z.value[e.key],uninstalling:!!T.value[e.key],onInstall:q,onUninstall:W,onClick:V},null,8,["plugin","readonly","can-install","can-uninstall","installing","uninstalling"]))),128))])):(n(),s("div",Y_,[c(d(Q),{description:B.value},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Je))]),_:1})]),extra:u(()=>[0===k.value.length&&O.value.repositories?(n(),g(d(F),{key:0,size:"small",onClick:l[7]||(l[7]=e=>U.value=!0)},{default:u(()=>[...l[21]||(l[21]=[h("配置仓库源",-1)])]),_:1})):i("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),O.value.install||O.value.uninstall?(n(),s("div",eC,[c(d(R),{size:"14",class:"asset-info-icon"},{default:u(()=>[c(d(Ma))]),_:1}),o("span",null,"安装/卸载后需重启 "+m(L.value)+" 生效",1)])):i("",!0),O.value.repositories?(n(),g(p_,{key:3,visible:U.value,"onUpdate:visible":l[8]||(l[8]=e=>U.value=e),platform:j.value,onUpdated:G},null,8,["visible","platform"])):i("",!0),c($_,{visible:P.value,"onUpdate:visible":l[9]||(l[9]=e=>P.value=e),plugin:S.value,platform:j.value,onUpdated:G},null,8,["visible","plugin","platform"])],2))}},[["__scopeId","data-v-5a7deaf1"]]),lC=zl({__name:"PluginsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=oi(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},[o("span",null,"插件管理")],-1)])]),default:u(()=>[c(aC,{onBack:a[0]||(a[0]=e=>r.value=!1),"hide-back":!0,"in-drawer":!0,"drawer-visible":r.value,platform:l.platform},null,8,["drawer-visible","platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-1d785d25"]]),tC="/workspaces";async function sC(){return(await ct.get(`${tC}/available-projects`)).data}const nC={class:"card-header"},oC={class:"card-title"},iC={class:"name"},rC={class:"card-body"},cC={key:0,class:"info-row"},uC={class:"value"},dC={class:"info-row"},pC={class:"value"},vC={class:"info-row"},mC={class:"value path"},fC={key:1,class:"info-row"},yC={class:"value"},gC=zl({__name:"WorkspaceCard",props:{workspace:{type:Object,required:!0}},emits:["click","view","delete"],setup:e=>(a,l)=>{return n(),s("div",{class:"workspace-card",onClick:l[3]||(l[3]=l=>a.$emit("click",e.workspace))},[o("div",nC,[o("div",oC,[o("span",iC,m(e.workspace.name),1),c(d(H),{type:e.workspace.exists?"success":"error",size:"small"},{default:u(()=>[h(m(e.workspace.exists?"存在":"不存在"),1)]),_:1},8,["type"])]),o("div",{class:"card-actions",onClick:l[2]||(l[2]=v(()=>{},["stop"]))},[c(d(F),{text:"",size:"small",onClick:l[0]||(l[0]=l=>a.$emit("view",e.workspace))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(tl))]),_:1})]),_:1}),c(d(F),{text:"",size:"small",type:"error",onClick:l[1]||(l[1]=l=>a.$emit("delete",e.workspace))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(qe))]),_:1})]),_:1})])]),o("div",rC,[e.workspace.description?(n(),s("div",cC,[l[4]||(l[4]=o("span",{class:"label"},"描述",-1)),o("span",uC,m(e.workspace.description),1)])):i("",!0),o("div",dC,[l[5]||(l[5]=o("span",{class:"label"},"项目数",-1)),o("span",pC,m(e.workspace.projectCount||0),1)]),o("div",vC,[l[6]||(l[6]=o("span",{class:"label"},"路径",-1)),o("span",mC,m(e.workspace.path),1)]),e.workspace.lastUsed?(n(),s("div",fC,[l[7]||(l[7]=o("span",{class:"label"},"最后使用",-1)),o("span",yC,m((t=e.workspace.lastUsed,t?new Date(t).toLocaleString("zh-CN"):"-")),1)])):i("",!0)])]);var t}},[["__scopeId","data-v-74e07bc9"]]),hC="/config-templates";async function bC(){return(await ct.get(hC)).data}async function wC(){return(await ct.get(`${hC}/available-configs`)).data}const kC={class:"project-item"},_C={class:"item-header"},CC={class:"item-title"},xC={class:"item-body"},UC={key:2,class:"git-options"},PC={key:0,class:"branch-inputs"},SC={key:1,class:"branch-inputs"},zC={key:2,class:"branch-inputs"},TC=zl({__name:"ProjectItem",props:{project:{type:Object,required:!0},index:{type:Number,required:!0},existingOptions:{type:Array,default:()=>[]},showRemoveButton:{type:Boolean,default:!0}},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 ct.get(`${tC}/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),e.data.isGitRepo&&!a.project.branchMode&&(a.project.branchMode="existing"))}catch(e){}}return(a,t)=>(n(),s("div",kC,[o("div",_C,[o("span",CC,"项目 "+m(e.index+1),1),e.showRemoveButton?(n(),g(d(F),{key:0,text:"",size:"tiny",type:"error",onClick:t[0]||(t[0]=e=>a.$emit("remove"))},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fe))]),_:1})]),_:1})):i("",!0)]),o("div",xC,[e.project.fromExisting?(n(),s(f,{key:0},[c(d(ee),{value:e.project.selectedKey,"onUpdate:value":[t[1]||(t[1]=a=>e.project.selectedKey=a),t[2]||(t[2]=l=>a.$emit("select-existing",e.index,l))],options:e.existingOptions,placeholder:"选择已有项目",filterable:"",size:"small"},null,8,["value","options"]),c(d(ne),{value:e.project.sourcePath,placeholder:"项目路径",disabled:"",size:"small"},null,8,["value"])],64)):(n(),s(f,{key:1},[c(d(ne),{value:e.project.sourcePath,"onUpdate:value":t[3]||(t[3]=a=>e.project.sourcePath=a),placeholder:"项目源路径",size:"small",onBlur:l},null,8,["value"]),c(d(ne),{value:e.project.name,"onUpdate:value":t[4]||(t[4]=a=>e.project.name=a),placeholder:"软链接名称(可选)",size:"small"},null,8,["value"])],64)),e.project.isGitRepo?(n(),s("div",UC,[c(d(we),{checked:e.project.createWorktree,"onUpdate:checked":t[5]||(t[5]=a=>e.project.createWorktree=a),size:"small"},{default:u(()=>[...t[10]||(t[10]=[h(" 创建 Git Worktree ",-1)])]),_:1},8,["checked"]),e.project.createWorktree?(n(),s("div",PC,[c(d(le),{value:e.project.branchMode,"onUpdate:value":t[6]||(t[6]=a=>e.project.branchMode=a),size:"small",class:"branch-mode-group"},{default:u(()=>[c(d(te),{value:"existing"},{default:u(()=>[...t[11]||(t[11]=[h("使用已有分支",-1)])]),_:1}),c(d(te),{value:"new"},{default:u(()=>[...t[12]||(t[12]=[h("新建分支",-1)])]),_:1})]),_:1},8,["value"])])):i("",!0),e.project.createWorktree&&"existing"===(e.project.branchMode||"existing")?(n(),s("div",SC,[c(d(ne),{value:e.project.branch,"onUpdate:value":t[7]||(t[7]=a=>e.project.branch=a),placeholder:"已有分支名(留空使用当前分支)",size:"small",style:{flex:"1"}},null,8,["value"])])):i("",!0),e.project.createWorktree&&"new"===(e.project.branchMode||"existing")?(n(),s("div",zC,[c(d(ne),{value:e.project.branch,"onUpdate:value":t[8]||(t[8]=a=>e.project.branch=a),placeholder:"新分支名",size:"small",style:{flex:"1"}},null,8,["value"]),c(d(ne),{value:e.project.baseBranch,"onUpdate:value":t[9]||(t[9]=a=>e.project.baseBranch=a),placeholder:"基于分支(可选,如 main)",size:"small",style:{flex:"1"}},null,8,["value"])])):i("",!0),e.project.createWorktree?(n(),g(d(K),{key:3,depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:u(()=>["existing"===(e.project.branchMode||"existing")?(n(),s(f,{key:0},[h(" [INFO] 填已有分支名时优先直接检出;留空则使用当前分支 ")],64)):e.project.branch&&e.project.baseBranch?(n(),s(f,{key:1},[h(' [INFO] 将新建分支 "'+m(e.project.branch)+'",并基于 "'+m(e.project.baseBranch)+'" 创建 ',1)],64)):e.project.branch?(n(),s(f,{key:2},[h(' [INFO] 将新建分支 "'+m(e.project.branch)+'",并基于源仓库当前分支创建 ',1)],64)):(n(),s(f,{key:3},[h(" [INFO] 请输入新分支名 ")],64))]),_:1})):i("",!0)])):i("",!0),e.project.isGitRepo?(n(),g(d(K),{key:3,depth:"3",style:{"font-size":"11px"}},{default:u(()=>[...t[13]||(t[13]=[h("[v] Git 仓库",-1)])]),_:1})):i("",!0)])]))}},[["__scopeId","data-v-1cf82955"]]);function IC(e=""){const a=String(e||"").trim();if(!a)return"";const l=a.replace(/[\\/]+$/,"");if(!l)return"";const t=l.split(/[\\/]+/);return t[t.length-1]||""}function MC({fromExisting:e=!1}={}){return{sourcePath:"",name:"",createWorktree:!1,branchMode:"existing",branch:"",baseBranch:"",isGitRepo:!1,fromExisting:e,selectedKey:""}}function AC(e){return"string"==typeof e?e.trim():""}function OC(e={}){const a={sourcePath:AC(e.sourcePath),name:AC(e.name),createWorktree:!1!==e.createWorktree&&!!e.isGitRepo};if(a.name||delete a.name,!a.createWorktree)return a;const l=AC(e.branch);if(l&&(a.branch=l),"new"===e.branchMode){const l=AC(e.baseBranch);l&&(a.baseBranch=l)}return a}const $C={class:"projects-section"},jC={class:"projects-actions"},LC={key:0,class:"projects-list"},EC=zl({__name:"WorkspaceFormModal",props:{show:{type:Boolean,default:!1}},emits:["update:show","success"],setup(e,{emit:a}){const i=e,r=a,p=Ue(),m=l(null),b=l(!1),w=l([]),k=l([]),_=t({get:()=>i.show,set:e=>r("update:show",e)}),x=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"}]},P=t(()=>w.value.map(e=>({label:e.name,value:e.id}))),S=t(()=>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 z(e){x.value.projects.push(MC({fromExisting:e}))}function T(e,a){const l=S.value.find(e=>e.value===a);if(!l)return;const t=x.value.projects[e];t.sourcePath=l.path,t.name=IC(l.path),t.isGitRepo=l.isGitRepo,t.createWorktree=l.isGitRepo,t.branchMode="existing",t.branch="",t.baseBranch=""}async function I(){var e;try{await(null==(e=m.value)?void 0:e.validate());for(const e of x.value.projects)if(!e.sourcePath)return void p.error("请填写项目路径");b.value=!0;const a={...x.value,projects:x.value.projects.map(OC)},l=await async function(e){return(await ct.post(tC,e)).data}(a);l.success?(p.success("工作区创建成功"),x.value={name:"",description:"",baseDir:"",configTemplateId:null,projects:[]},r("success")):p.error(l.message||"创建失败")}catch(a){const e=a.message||"创建失败";e.includes("\n")?p.warning(e,{duration:8e3}):p.error(e),a.errors}finally{b.value=!1}}return C(_,e=>{e&&async function(){try{const[e,a]=await Promise.all([bC(),sC()]);e.success&&(w.value=e.data||[]),a.success&&(k.value=Array.isArray(a.data)?a.data:[])}catch(e){}}()}),(e,a)=>(n(),g(d(se),{show:_.value,"onUpdate:show":a[8]||(a[8]=e=>_.value=e),preset:"card",title:"创建工作区",style:{width:"650px"},"mask-closable":!1},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:a[7]||(a[7]=e=>_.value=!1)},{default:u(()=>[...a[12]||(a[12]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",onClick:I,loading:b.value},{default:u(()=>[...a[13]||(a[13]=[h("创建",-1)])]),_:1},8,["loading"])]),_:1})]),default:u(()=>[c(d(Y),{ref_key:"formRef",ref:m,model:x.value,rules:U,"label-placement":"left","label-width":"100"},{default:u(()=>[c(d(X),{label:"工作区名称",path:"name"},{default:u(()=>[c(d(ne),{value:x.value.name,"onUpdate:value":a[0]||(a[0]=e=>x.value.name=e),placeholder:"输入工作区名称",onKeydown:a[1]||(a[1]=$(v(()=>{},["prevent"]),["enter"]))},null,8,["value"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:x.value.description,"onUpdate:value":a[2]||(a[2]=e=>x.value.description=e),placeholder:"可选描述",type:"textarea",rows:2},null,8,["value"])]),_:1}),c(d(X),{label:"基础目录",path:"baseDir"},{default:u(()=>[c(d(ne),{value:x.value.baseDir,"onUpdate:value":a[3]||(a[3]=e=>x.value.baseDir=e),placeholder:"留空则使用第一个项目的父目录"},null,8,["value"])]),_:1}),c(d(X),{label:"配置模板",path:"configTemplateId"},{default:u(()=>[c(d(ee),{value:x.value.configTemplateId,"onUpdate:value":a[4]||(a[4]=e=>x.value.configTemplateId=e),options:P.value,placeholder:"选择配置模板",clearable:""},null,8,["value","options"])]),_:1}),c(d(X),{label:"项目列表",path:"projects"},{default:u(()=>[o("div",$C,[o("div",jC,[c(d(F),{size:"small",dashed:"",onClick:a[5]||(a[5]=e=>z(!1))},{default:u(()=>[...a[9]||(a[9]=[h("添加项目",-1)])]),_:1}),c(d(F),{size:"small",dashed:"",onClick:a[6]||(a[6]=e=>z(!0))},{default:u(()=>[...a[10]||(a[10]=[h("添加已有项目",-1)])]),_:1})]),x.value.projects.length>0?(n(),s("div",LC,[(n(!0),s(f,null,y(x.value.projects,(e,a)=>(n(),g(TC,{key:a,project:e,index:a,"existing-options":S.value,onRemove:e=>function(e){x.value.projects.splice(e,1)}(a),onSelectExisting:T},null,8,["project","index","existing-options","onRemove"]))),128))])):(n(),g(d(K),{key:1,depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[11]||(a[11]=[h("请添加至少一个项目",-1)])]),_:1}))])]),_:1})]),_:1},8,["model"])]),_:1},8,["show"]))}},[["__scopeId","data-v-4b48727c"]]),DC={class:"form-section"},NC={class:"actions-row"},BC=zl({__name:"WorkspaceProjectFormModal",props:{show:{type:Boolean,default:!1},workspaceId:{type:String,required:!0}},emits:["update:show","success"],setup(e,{emit:a}){const s=e,i=a,r=Ue(),p=l(!1),v=l([]),m=l(MC()),f=t({get:()=>s.show,set:e=>i("update:show",e)}),y=t(()=>v.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 b(){m.value=MC()}function w(){m.value=MC({fromExisting:!1})}function k(){m.value=MC({fromExisting:!0})}function _(e,a){const l=y.value.find(e=>e.value===a);l&&(m.value.selectedKey=a,m.value.sourcePath=l.path,m.value.name=IC(l.path),m.value.isGitRepo=l.isGitRepo,m.value.createWorktree=l.isGitRepo,m.value.branchMode="existing",m.value.branch="",m.value.baseBranch="",m.value.fromExisting=!0)}async function x(){const e=OC(m.value);if(e.sourcePath)if(!m.value.createWorktree||"new"!==m.value.branchMode||e.branch){p.value=!0;try{const a=await async function(e,a){return(await ct.post(`${tC}/${e}/projects`,a)).data}(s.workspaceId,e);if(a.success)return r.success("仓库已添加到工作区"),f.value=!1,b(),void i("success");r.error(a.message||"添加失败")}catch(a){r.error(`添加失败: ${a.message}`)}finally{p.value=!1}}else r.error("请输入新分支名");else r.error("请填写项目路径")}return C(f,e=>{e&&(b(),async function(){try{const e=await sC();e.success&&(v.value=Array.isArray(e.data)?e.data:[])}catch(e){}}())}),(e,a)=>(n(),g(d(se),{show:f.value,"onUpdate:show":a[1]||(a[1]=e=>f.value=e),preset:"card",title:"添加仓库到工作区",style:{width:"620px"},"mask-closable":!1},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:a[0]||(a[0]=e=>f.value=!1)},{default:u(()=>[...a[4]||(a[4]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:p.value,onClick:x},{default:u(()=>[...a[5]||(a[5]=[h("添加",-1)])]),_:1},8,["loading"])]),_:1})]),default:u(()=>[o("div",DC,[o("div",NC,[c(d(F),{size:"small",dashed:"",type:m.value.fromExisting?"default":"primary",onClick:w},{default:u(()=>[...a[2]||(a[2]=[h(" 手动填写路径 ",-1)])]),_:1},8,["type"]),c(d(F),{size:"small",dashed:"",type:m.value.fromExisting?"primary":"default",onClick:k},{default:u(()=>[...a[3]||(a[3]=[h(" 选择已有项目 ",-1)])]),_:1},8,["type"])]),c(TC,{project:m.value,index:0,"existing-options":y.value,"show-remove-button":!1,onSelectExisting:_},null,8,["project","existing-options"])])]),_:1},8,["show"]))}},[["__scopeId","data-v-16febc8c"]]),RC={class:"section-header"},FC={class:"section-title"},HC={key:0,class:"projects-list"},GC={class:"proj-name"},KC={class:"proj-path"},qC=zl({__name:"WorkspaceDetailModal",props:{show:{type:Boolean,default:!1},workspace:{type:Object,default:null}},emits:["update:show","updated"],setup(e,{emit:a}){const r=e,p=a,v=Ue(),b=Pe(),w=t({get:()=>r.show,set:e=>p("update:show",e)}),k=l(null),_=l(!1);function x(e){return e?new Date(e).toLocaleString("zh-CN"):"-"}async function U(){var e;if(null==(e=r.workspace)?void 0:e.id)try{const e=await async function(e){return(await ct.get(`${tC}/${e}`)).data}(r.workspace.id);e.success&&(k.value=e.data)}catch(a){}}function P(){U(),p("updated")}function S(e){var a;(null==(a=r.workspace)?void 0:a.id)&&b.warning({title:"确认移除仓库",content:`确定要从工作区移除 "${e.name}" 吗?`,positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{try{const a=await async function(e,a,l=!1){const t=encodeURIComponent(a);return(await ct.delete(`${tC}/${e}/projects/${t}`,{params:{removeWorktrees:l}})).data}(r.workspace.id,e.name);if(a.success)return v.success("仓库已移除"),void P();v.error(a.message||"移除失败")}catch(a){v.error(`移除失败: ${a.message}`)}}})}async function z(e){var a;if(null==(a=r.workspace)?void 0:a.id)try{const a=await async function(e,a,l=null){return(await ct.post(`${tC}/${e}/launch`,{tool:a,projectName:l})).data}(r.workspace.id,e);if(a.success){const e=`cd "${a.data.cwd}" && ${a.data.command}`,l=await Fo(e);if("manual"===(null==l?void 0:l.method))return void v.warning("自动复制失败,已弹出手动复制框");v.success("启动命令已复制到剪贴板")}else v.error(a.message||"获取命令失败")}catch(l){v.error("获取命令失败: "+l.message)}}return C(w,e=>{e&&r.workspace&&U()}),(a,l)=>(n(),g(d(se),{show:w.value,"onUpdate:show":l[6]||(l[6]=e=>w.value=e),preset:"card",title:"工作区详情",style:{width:"700px"}},{default:u(()=>{var a,t,p,v,b,w;return[e.workspace?(n(),s(f,{key:0},[c(d(Se),{column:1,bordered:"",size:"small"},{default:u(()=>[c(d(ze),{label:"名称"},{default:u(()=>[h(m(e.workspace.name),1)]),_:1}),c(d(ze),{label:"描述"},{default:u(()=>[h(m(e.workspace.description||"-"),1)]),_:1}),c(d(ze),{label:"路径"},{default:u(()=>[h(m(e.workspace.path),1)]),_:1}),c(d(ze),{label:"状态"},{default:u(()=>[c(d(H),{type:e.workspace.exists?"success":"error",size:"small"},{default:u(()=>[h(m(e.workspace.exists?"存在":"不存在"),1)]),_:1},8,["type"])]),_:1}),c(d(ze),{label:"创建时间"},{default:u(()=>[h(m(x(e.workspace.createdAt)),1)]),_:1}),c(d(ze),{label:"最后使用"},{default:u(()=>[h(m(x(e.workspace.lastUsed)),1)]),_:1})]),_:1}),c(d(de)),l[15]||(l[15]=o("div",{class:"section-title"},"启动 CLI 工具",-1)),c(d(ae),null,{default:u(()=>[c(d(F),{type:"primary",size:"small",onClick:l[0]||(l[0]=e=>z("claude")),disabled:!e.workspace.exists},{default:u(()=>[...l[7]||(l[7]=[h(" Claude Code ",-1)])]),_:1},8,["disabled"]),c(d(F),{type:"info",size:"small",onClick:l[1]||(l[1]=e=>z("codex")),disabled:!e.workspace.exists},{default:u(()=>[...l[8]||(l[8]=[h(" Codex ",-1)])]),_:1},8,["disabled"]),c(d(F),{type:"success",size:"small",onClick:l[2]||(l[2]=e=>z("gemini")),disabled:!e.workspace.exists},{default:u(()=>[...l[9]||(l[9]=[h(" Gemini CLI ",-1)])]),_:1},8,["disabled"]),c(d(F),{type:"warning",size:"small",onClick:l[3]||(l[3]=e=>z("omp")),disabled:!e.workspace.exists},{default:u(()=>[...l[10]||(l[10]=[h(" OMP ",-1)])]),_:1},8,["disabled"])]),_:1}),c(d(K),{depth:"3",style:{display:"block","margin-top":"6px","font-size":"11px"}},{default:u(()=>[...l[11]||(l[11]=[h(" 点击按钮将复制启动命令到剪贴板 ",-1)])]),_:1}),c(d(de)),o("div",RC,[o("div",FC,"包含项目 ("+m((null==(t=null==(a=k.value)?void 0:a.projects)?void 0:t.length)||0)+")",1),c(d(F),{size:"small",type:"primary",ghost:"",disabled:!(null==(p=k.value)?void 0:p.exists),onClick:l[4]||(l[4]=e=>_.value=!0)},{default:u(()=>[...l[12]||(l[12]=[h(" 添加仓库 ",-1)])]),_:1},8,["disabled"])]),(null==(b=null==(v=k.value)?void 0:v.projects)?void 0:b.length)?(n(),s("div",HC,[(n(!0),s(f,null,y(k.value.projects,(e,a)=>(n(),s("div",{class:"project-row",key:a},[c(d(H),{type:e.sourceExists?"success":"error",size:"small"},{default:u(()=>[h(m(e.sourceExists?"[v]":"[x]"),1)]),_:2},1032,["type"]),o("span",GC,m(e.name),1),o("span",KC,m(e.sourcePath),1),e.useWorktree?(n(),g(d(H),{key:0,type:"info",size:"small"},{default:u(()=>[...l[13]||(l[13]=[h("worktree",-1)])]),_:1})):i("",!0),c(d(F),{text:"",size:"small",type:"error",onClick:a=>S(e)},{default:u(()=>[...l[14]||(l[14]=[h(" 移除 ",-1)])]),_:1},8,["onClick"])]))),128))])):(n(),g(d(Q),{key:1,description:"暂无项目",size:"small"}))],64)):i("",!0),c(BC,{show:_.value,"onUpdate:show":l[5]||(l[5]=e=>_.value=e),"workspace-id":(null==(w=r.workspace)?void 0:w.id)||"",onSuccess:P},null,8,["show","workspace-id"])]}),_:1},8,["show"]))}},[["__scopeId","data-v-1ee80e2a"]]),WC={key:0,class:"panel-header"},VC={class:"header-left"},JC={class:"header-right"},ZC={key:1,class:"drawer-header-bar"},QC={class:"header-right"},YC={class:"stats-bar"},XC={class:"stats-text"},ex={class:"filter-bar"},ax={class:"panel-content"},lx={key:0,class:"empty-state"},tx={key:1,class:"card-list"},sx={class:"panel-footer"},nx=zl({__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 r=e,v=a,b=Ue(),k=Pe(),_=l(!1),x=l([]),U=l(""),P=l(!1),S=l(!1),z=l(null),T=t(()=>{if(!U.value.trim())return x.value;const e=U.value.toLowerCase();return x.value.filter(a=>{var l,t,s;return(null==(l=a.name)?void 0:l.toLowerCase().includes(e))||(null==(t=a.description)?void 0:t.toLowerCase().includes(e))||(null==(s=a.path)?void 0:s.toLowerCase().includes(e))})});async function I(){_.value=!0;try{const e=await async function(){return(await ct.get(tC)).data}();e.success&&(x.value=e.data||[])}catch(e){b.error("加载工作区失败: "+e.message)}finally{_.value=!1}}function M(e){z.value=e,S.value=!0}function A(e){k.warning({title:"确认删除",content:`确定要删除工作区"${e.name}"吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{const a=await async function(e,a=!1){return(await ct.delete(`${tC}/${e}`,{params:{removeFiles:a}})).data}(e.id,!1);a.success?(b.success("删除成功"),I(),v("updated")):b.error(a.message||"删除失败")}catch(a){b.error("删除失败: "+a.message)}}})}function O(){P.value=!1,I(),v("updated")}return w(()=>I()),C(()=>r.drawerVisible,e=>{e&&I()}),(a,l)=>(n(),s("div",{class:p(["workspace-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?i("",!0):(n(),s("div",WC,[o("div",VC,[e.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ja))]),_:1})]),_:1})),l[7]||(l[7]=o("span",{class:"panel-title"},"工作区管理",-1))]),o("div",JC,[c(d(F),{text:"",onClick:l[1]||(l[1]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[8]||(l[8]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:I,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),s("div",ZC,[o("div",QC,[c(d(F),{text:"",onClick:l[2]||(l[2]=e=>P.value=!0),class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[10]||(l[10]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:I,loading:_.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[11]||(l[11]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",YC,[o("span",XC," 共 "+m(x.value.length)+" 个工作区 ",1)]),o("div",ex,[c(d(ne),{value:U.value,"onUpdate:value":l[3]||(l[3]=e=>U.value=e),placeholder:"搜索工作区...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"])]),o("div",ax,[c(d(Z),{show:_.value},{default:u(()=>[0!==T.value.length||_.value?(n(),s("div",tx,[(n(!0),s(f,null,y(T.value,e=>(n(),g(gC,{key:e.id,workspace:e,onClick:M,onView:M,onDelete:A},null,8,["workspace"]))),128))])):(n(),s("div",lx,[c(d(Q),{description:"暂无工作区"},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(Wa))]),_:1})]),extra:u(()=>[c(d(F),{size:"small",onClick:l[4]||(l[4]=e=>P.value=!0)},{default:u(()=>[...l[12]||(l[12]=[h("创建第一个工作区",-1)])]),_:1})]),_:1})]))]),_:1},8,["show"])]),o("div",sx,[c(d(R),{size:"14",class:"info-icon"},{default:u(()=>[c(d(Ma))]),_:1}),l[13]||(l[13]=o("span",null,"工作区用于管理多个项目的统一开发环境",-1))]),c(EC,{show:P.value,"onUpdate:show":l[5]||(l[5]=e=>P.value=e),onSuccess:O},null,8,["show"]),c(qC,{show:S.value,"onUpdate:show":l[6]||(l[6]=e=>S.value=e),workspace:z.value,onUpdated:I},null,8,["show","workspace"])],2))}},[["__scopeId","data-v-da5160b9"]]),ox=zl({__name:"WorkspaceDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=oi(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},"工作区管理",-1)])]),default:u(()=>[c(nx,{"in-drawer":!0,"hide-back":!0,"drawer-visible":r.value,onBack:a[0]||(a[0]=e=>r.value=!1)},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-311a4d94"]]),ix={class:"card-header"},rx={class:"card-title"},cx={class:"name"},ux={class:"card-body"},dx={key:0,class:"description"},px={class:"stats"},vx={key:0},mx={key:1},fx={key:2},yx={key:3},gx={key:4},hx=zl({__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"},omp:{label:"OMP",color:"#0f9f9a",textColor:"#fff",borderColor:"#0f9f9a"}},r={claude:"CLAUDE.md",codex:"AGENTS.md",gemini:"GEMINI.md",opencode:".opencode/AGENTS.md",omp:".omp/commands"};function p(e){var a;return(null==(a=l[e])?void 0:a.label)||e}function f(e){const a=l[e];return a?{color:a.color,textColor:a.textColor,borderColor:a.borderColor}:{}}const y=t(()=>{var e,l,t;const s=a.template,n=null==s?void 0:s.cliType;if(!n||"all"===n)return null;if("omp"===n&&(null==(e=null==s?void 0:s.commands)?void 0:e.length))return r.omp;const o=null==(l=null==s?void 0:s.aiConfigs)?void 0:l[n];return(null==o?void 0:o.enabled)?r[n]||null:"claude"===n&&(null==(t=null==s?void 0:s.claudeMd)?void 0:t.enabled)?"CLAUDE.md":null});return(a,l)=>{var t,r,b,w,k,_;return n(),s("div",{class:"template-card",onClick:l[5]||(l[5]=l=>a.$emit("click",e.template))},[o("div",ix,[o("div",rx,[o("span",cx,m(e.template.name),1),e.template.cliType?(n(),g(d(H),{key:0,size:"small",color:f(e.template.cliType),round:""},{default:u(()=>[h(m(p(e.template.cliType)),1)]),_:1},8,["color"])):i("",!0)]),o("div",{class:"card-actions",onClick:l[4]||(l[4]=v(()=>{},["stop"]))},[c(d(F),{size:"small",type:"primary",onClick:l[0]||(l[0]=l=>a.$emit("apply",e.template))},{default:u(()=>[...l[6]||(l[6]=[h("应用",-1)])]),_:1}),c(d(F),{size:"small",onClick:l[1]||(l[1]=l=>a.$emit("preview",e.template))},{default:u(()=>[...l[7]||(l[7]=[h("预览",-1)])]),_:1}),c(d(F),{size:"small",onClick:l[2]||(l[2]=l=>a.$emit("edit",e.template))},{default:u(()=>[...l[8]||(l[8]=[h("编辑",-1)])]),_:1}),c(d(F),{size:"small",type:"error",loading:e.deleting,onClick:l[3]||(l[3]=l=>a.$emit("delete",e.template))},{default:u(()=>[...l[9]||(l[9]=[h("删除",-1)])]),_:1},8,["loading"])])]),o("div",ux,[e.template.description?(n(),s("div",dx,m((k=e.template.description,_=80,(null==k?void 0:k.length)>_?k.slice(0,_)+"...":k)),1)):i("",!0),o("div",px,[y.value?(n(),s("span",vx,m(y.value),1)):i("",!0),(null==(t=e.template.skills)?void 0:t.length)?(n(),s("span",mx,m(e.template.skills.length)+" Skills",1)):i("",!0),(null==(r=e.template.agents)?void 0:r.length)?(n(),s("span",fx,m(e.template.agents.length)+" Agents",1)):i("",!0),(null==(b=e.template.commands)?void 0:b.length)?(n(),s("span",yx,m(e.template.commands.length)+" Commands",1)):i("",!0),(null==(w=e.template.mcpServers)?void 0:w.length)?(n(),s("span",gx,m(e.template.mcpServers.length)+" MCP",1)):i("",!0)])])])}}},[["__scopeId","data-v-0bfacefb"]]),bx=["innerHTML"],wx=zl({__name:"MarkdownViewer",props:{content:{type:String,default:""}},setup(e){const a=e;function l(e,a){pl.getLanguage(e)||pl.registerLanguage(e,a)}l("javascript",vl),l("typescript",gl),l("json",yl),l("bash",fl),l("shell",fl),l("sh",fl),l("python",ml),l("css",hl),l("xml",bl),l("html",bl);const o=new kl({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&pl.getLanguage(a))try{return'<pre class="hljs"><code>'+pl.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(l){}return'<pre class="hljs"><code>'+o.utils.escapeHtml(e)+"</code></pre>"}}),i=t(()=>o.render(a.content||""));return(e,a)=>(n(),s("div",{class:"markdown-viewer",innerHTML:i.value},null,8,bx))}},[["__scopeId","data-v-9e29f753"]]),kx={class:"ai-config-header"},_x={key:0,class:"prompt-preview"},Cx={class:"ai-config-header"},xx={class:"ai-config-header"},Ux={class:"ai-config-header"},Px=zl({__name:"ConfigTemplateFormModal",props:{show:Boolean,template:Object,availableConfigs:{type:Object,default:()=>({})}},emits:["update:show","success"],setup(e,{emit:a}){const r=e,p=a,v=Ue(),y=l(null),b=l(!1),w=[{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"},{label:"OMP",value:"omp"}],k={claude:{skills:!0,agents:!0,commands:!0},codex:{skills:!0,agents:!0,commands:!0},gemini:{skills:!0,agents:!0,commands:!0},opencode:{skills:!0,agents:!0,commands:!0},omp:{skills:!0,agents:!1,commands:!0}},_=t(()=>{var e;return!!(null==(e=r.template)?void 0:e.id)}),x=l({name:"",description:"",cliType:"",aiConfigs:{claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""},omp:{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"}},P=t(()=>{var e;const a=x.value.cliType,l=(null==(e=r.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}))}),S=t(()=>{var e,a;const l=x.value.cliType,t=(null==(e=r.availableConfigs)?void 0:e.agentsByPlatform)||{};return(l&&t[l]?t[l]:(null==(a=r.availableConfigs)?void 0:a.agents)||[]).map(e=>({value:e.fileName,label:e.name||e.fileName,disabled:!1}))}),z=t(()=>{var e,a;const l=x.value.cliType,t=(null==(e=r.availableConfigs)?void 0:e.commandsByPlatform)||{};return(l&&t[l]?t[l]:(null==(a=r.availableConfigs)?void 0:a.commands)||[]).map(e=>({value:e.namespace?`${e.namespace}/${e.name}`:e.name,label:e.namespace?`${e.namespace}/${e.name}`:e.name,disabled:!1}))}),T=t(()=>{var e,a;const l=(null==(e=r.availableConfigs)?void 0:e.mcpServers)||[],t=(null==(a=r.availableConfigs)?void 0:a.mcpPresets)||[],s=[...l.map(e=>({value:e.id,label:e.name||e.id})),...t.map(e=>({value:e.id,label:`${e.name} (预设)`}))],n=new Set;return s.filter(e=>!n.has(e.value)&&(n.add(e.value),!0))}),I=l(null),M=t(()=>{var e;return((null==(e=r.availableConfigs)?void 0:e.prompts)||[]).map(e=>({value:e.id,label:e.isBuiltin?`[内置] ${e.name}`:e.name,description:e.description}))}),A=t({get:()=>x.value.skills.map(e=>e.directory),set:e=>{var a;const l=x.value.cliType,t=(null==(a=r.availableConfigs)?void 0:a.skillsByPlatform)||{},s=l&&t[l]?t[l]:[];x.value.skills=e.map(e=>{const a=s.find(a=>a.directory===e);return a?{...a}:{directory:e,name:e}})}}),O=t({get:()=>x.value.agents.map(e=>e.fileName),set:e=>{var a,l;const t=x.value.cliType,s=(null==(a=r.availableConfigs)?void 0:a.agentsByPlatform)||{},n=t&&s[t]?s[t]:(null==(l=r.availableConfigs)?void 0:l.agents)||[];x.value.agents=e.map(e=>{const a=n.find(a=>a.fileName===e);return a?{...a}:{fileName:e}})}}),$=t({get:()=>x.value.commands.map(e=>e.namespace?`${e.namespace}/${e.name}`:e.name),set:e=>{var a,l;const t=x.value.cliType,s=(null==(a=r.availableConfigs)?void 0:a.commandsByPlatform)||{},n=t&&s[t]?s[t]:(null==(l=r.availableConfigs)?void 0:l.commands)||[];x.value.commands=e.map(e=>{const a=n.find(a=>(a.namespace?`${a.namespace}/${a.name}`:a.name)===e);return a?{...a}:{name:e}})}});function j(e){var a;if(!e)return void(x.value.aiConfigs.claude.content="");const l=((null==(a=r.availableConfigs)?void 0:a.prompts)||[]).find(a=>a.id===e);l&&(x.value.aiConfigs.claude.enabled=!0,x.value.aiConfigs.claude.content=l.content)}async function L(){var e;try{await(null==(e=y.value)?void 0:e.validate())}catch{return}b.value=!0;try{const e={...x.value};let a;a=_.value?await async function(e,a){return(await ct.put(`${hC}/${e}`,a)).data}(r.template.id,e):await async function(e){return(await ct.post(hC,e)).data}(e),a.success?(v.success(_.value?"保存成功":"创建成功"),p("success")):v.error(a.message||"操作失败")}catch(a){v.error("操作失败: "+a.message)}finally{b.value=!1}}return C(()=>r.show,e=>{if(e)if(I.value=null,r.template){let e={claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""},omp:{enabled:!1,content:""}};if(r.template.aiConfigs)for(const a of["claude","codex","gemini","opencode","omp"])r.template.aiConfigs[a]&&(e[a]={...r.template.aiConfigs[a]});else r.template.claudeMd&&(e.claude={...r.template.claudeMd});x.value={name:r.template.name||"",description:r.template.description||"",cliType:r.template.cliType||"",aiConfigs:e,claudeMd:r.template.claudeMd?{...r.template.claudeMd}:{enabled:!1,content:""},skills:r.template.skills?[...r.template.skills]:[],agents:r.template.agents?[...r.template.agents]:[],commands:r.template.commands?[...r.template.commands]:[],mcpServers:r.template.mcpServers?[...r.template.mcpServers]:[]}}else x.value={name:"",description:"",cliType:"",aiConfigs:{claude:{enabled:!1,content:""},codex:{enabled:!1,content:""},gemini:{enabled:!1,content:""},opencode:{enabled:!1,content:""},omp:{enabled:!1,content:""}},claudeMd:{enabled:!1,content:""},skills:[],agents:[],commands:[],mcpServers:[]}}),C(()=>x.value.cliType,e=>{const a=k[e];a&&(a.skills||(x.value.skills=[]),a.agents||(x.value.agents=[]),a.commands||(x.value.commands=[]))}),(a,l)=>{const t=E("n-text");return n(),g(d(se),{show:e.show,preset:"card",title:_.value?"编辑配置模版":"创建配置模版",style:{width:"850px","max-height":"90vh"},"mask-closable":!1,"onUpdate:show":l[28]||(l[28]=e=>p("update:show",e))},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:l[27]||(l[27]=e=>p("update:show",!1))},{default:u(()=>[...l[35]||(l[35]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:b.value,onClick:L},{default:u(()=>[h(m(_.value?"保存":"创建"),1)]),_:1},8,["loading"])]),_:1})]),default:u(()=>[c(d(Te),{style:{"max-height":"calc(90vh - 140px)"}},{default:u(()=>[c(d(Y),{ref_key:"formRef",ref:y,model:x.value,rules:U,"label-placement":"left","label-width":"100"},{default:u(()=>[c(d(xe),{title:"基本信息",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[c(d(X),{label:"模版名称",path:"name"},{default:u(()=>[c(d(ne),{value:x.value.name,"onUpdate:value":l[0]||(l[0]=e=>x.value.name=e),placeholder:"输入模版名称"},null,8,["value"])]),_:1}),c(d(X),{label:"描述",path:"description"},{default:u(()=>[c(d(ne),{value:x.value.description,"onUpdate:value":l[1]||(l[1]=e=>x.value.description=e),type:"textarea",rows:2,placeholder:"输入模版描述"},null,8,["value"])]),_:1}),c(d(X),{label:"CLI 工具",path:"cliType"},{default:u(()=>[c(d(ee),{value:x.value.cliType,"onUpdate:value":l[2]||(l[2]=e=>x.value.cliType=e),options:w,placeholder:"选择 CLI 工具类型"},null,8,["value"])]),_:1})]),_:1}),x.value.cliType?i("",!0):(n(),g(d(xe),{key:0,size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[c(d(Q),{description:"请先选择 CLI 工具类型以显示配置项"})]),_:1})),"claude"===x.value.cliType?(n(),s(f,{key:1},[c(d(xe),{title:"CLAUDE.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[o("div",kx,[c(d(ae),{align:"center"},{default:u(()=>[c(d(G),{value:x.value.aiConfigs.claude.enabled,"onUpdate:value":l[3]||(l[3]=e=>x.value.aiConfigs.claude.enabled=e)},null,8,["value"]),c(t,{depth:x.value.aiConfigs.claude.enabled?1:3},{default:u(()=>[...l[29]||(l[29]=[h("启用 CLAUDE.md",-1)])]),_:1},8,["depth"])]),_:1})]),c(d(Ie),{show:x.value.aiConfigs.claude.enabled},{default:u(()=>[c(d(ee),{value:I.value,"onUpdate:value":[l[4]||(l[4]=e=>I.value=e),j],options:M.value,placeholder:"选择 Prompt 预设作为 CLAUDE.md 内容",clearable:"",style:{"margin-bottom":"10px"}},null,8,["value","options"]),x.value.aiConfigs.claude.content?(n(),s("div",_x,[c(wx,{content:x.value.aiConfigs.claude.content},null,8,["content"])])):(n(),g(d(Q),{key:1,description:"可选择 Prompt 预设,或留空",style:{padding:"24px 0"}}))]),_:1},8,["show"])]),_:1}),c(d(xe),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[5]||(l[5]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.agents.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:O.value,"onUpdate:value":l[6]||(l[6]=e=>O.value=e),options:S.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.commands.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:$.value,"onUpdate:value":l[7]||(l[7]=e=>$.value=e),options:z.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.mcpServers.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:x.value.mcpServers,"onUpdate:value":l[8]||(l[8]=e=>x.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):i("",!0),"codex"===x.value.cliType?(n(),s(f,{key:2},[c(d(xe),{title:"AGENTS.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[o("div",Cx,[c(d(ae),{align:"center"},{default:u(()=>[c(d(G),{value:x.value.aiConfigs.codex.enabled,"onUpdate:value":l[9]||(l[9]=e=>x.value.aiConfigs.codex.enabled=e)},null,8,["value"]),c(t,{depth:x.value.aiConfigs.codex.enabled?1:3},{default:u(()=>[...l[30]||(l[30]=[h("启用 AGENTS.md",-1)])]),_:1},8,["depth"])]),_:1})]),c(d(Ie),{show:x.value.aiConfigs.codex.enabled},{default:u(()=>[c(am,{modelValue:x.value.aiConfigs.codex.content,"onUpdate:modelValue":l[10]||(l[10]=e=>x.value.aiConfigs.codex.content=e),rows:10,"min-height":220,placeholder:"输入 AGENTS.md 内容"},null,8,["modelValue"])]),_:1},8,["show"])]),_:1}),c(d(xe),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[11]||(l[11]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.agents.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:O.value,"onUpdate:value":l[12]||(l[12]=e=>O.value=e),options:S.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.commands.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:$.value,"onUpdate:value":l[13]||(l[13]=e=>$.value=e),options:z.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.mcpServers.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:x.value.mcpServers,"onUpdate:value":l[14]||(l[14]=e=>x.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):i("",!0),"gemini"===x.value.cliType?(n(),s(f,{key:3},[c(d(xe),{title:"GEMINI.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[o("div",xx,[c(d(ae),{align:"center"},{default:u(()=>[c(d(G),{value:x.value.aiConfigs.gemini.enabled,"onUpdate:value":l[15]||(l[15]=e=>x.value.aiConfigs.gemini.enabled=e)},null,8,["value"]),c(t,{depth:x.value.aiConfigs.gemini.enabled?1:3},{default:u(()=>[...l[31]||(l[31]=[h("启用 GEMINI.md",-1)])]),_:1},8,["depth"])]),_:1})]),c(d(Ie),{show:x.value.aiConfigs.gemini.enabled},{default:u(()=>[c(am,{modelValue:x.value.aiConfigs.gemini.content,"onUpdate:modelValue":l[16]||(l[16]=e=>x.value.aiConfigs.gemini.content=e),rows:10,"min-height":220,placeholder:"输入 GEMINI.md 内容"},null,8,["modelValue"])]),_:1},8,["show"])]),_:1}),c(d(xe),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[17]||(l[17]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.mcpServers.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:x.value.mcpServers,"onUpdate:value":l[18]||(l[18]=e=>x.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):i("",!0),"opencode"===x.value.cliType?(n(),s(f,{key:4},[c(d(xe),{title:".opencode/AGENTS.md",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[o("div",Ux,[c(d(ae),{align:"center"},{default:u(()=>[c(d(G),{value:x.value.aiConfigs.opencode.enabled,"onUpdate:value":l[19]||(l[19]=e=>x.value.aiConfigs.opencode.enabled=e)},null,8,["value"]),c(t,{depth:x.value.aiConfigs.opencode.enabled?1:3},{default:u(()=>[...l[32]||(l[32]=[h("启用 .opencode/AGENTS.md",-1)])]),_:1},8,["depth"])]),_:1})]),c(d(Ie),{show:x.value.aiConfigs.opencode.enabled},{default:u(()=>[c(am,{modelValue:x.value.aiConfigs.opencode.content,"onUpdate:modelValue":l[20]||(l[20]=e=>x.value.aiConfigs.opencode.content=e),rows:10,"min-height":220,placeholder:"输入 .opencode/AGENTS.md 内容"},null,8,["modelValue"])]),_:1},8,["show"])]),_:1}),c(d(xe),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[21]||(l[21]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"Agents",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.agents.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:O.value,"onUpdate:value":l[22]||(l[22]=e=>O.value=e),options:S.value,"source-title":"可用 Agents","target-title":"已选 Agents"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.commands.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:$.value,"onUpdate:value":l[23]||(l[23]=e=>$.value=e),options:z.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"MCP Servers",size:"small"},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.mcpServers.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:x.value.mcpServers,"onUpdate:value":l[24]||(l[24]=e=>x.value.mcpServers=e),options:T.value,"source-title":"可用 MCP Servers","target-title":"已选 MCP Servers"},null,8,["value","options"])]),_:1})],64)):i("",!0),"omp"===x.value.cliType?(n(),s(f,{key:5},[c(d(xe),{title:"OMP Commands",size:"small",style:{"margin-bottom":"16px"}},{default:u(()=>[c(d(H),{size:"small",type:"success"},{default:u(()=>[...l[33]||(l[33]=[h(".omp/commands",-1)])]),_:1})]),_:1}),c(d(xe),{title:"Skills",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.skills.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:A.value,"onUpdate:value":l[25]||(l[25]=e=>A.value=e),options:P.value,"source-title":"可用 Skills","target-title":"已选 Skills"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"Commands",size:"small",style:{"margin-bottom":"16px"}},{"header-extra":u(()=>[c(d(H),{size:"small"},{default:u(()=>[h("已选 "+m(x.value.commands.length),1)]),_:1})]),default:u(()=>[c(d(Me),{value:$.value,"onUpdate:value":l[26]||(l[26]=e=>$.value=e),options:z.value,"source-title":"可用 Commands","target-title":"已选 Commands"},null,8,["value","options"])]),_:1}),c(d(xe),{title:"MCP Servers",size:"small"},{default:u(()=>[c(d(H),{size:"small",type:"default"},{default:u(()=>[...l[34]||(l[34]=[h("packages/extensions",-1)])]),_:1})]),_:1})],64)):i("",!0)]),_:1},8,["model"])]),_:1})]),_:1},8,["show","title"])}}},[["__scopeId","data-v-dbfa10c3"]]),Sx={key:0},zx={key:1},Tx={key:2},Ix={key:4},Mx={__name:"ConfigApplyModal",props:{show:Boolean,template:Object},emits:["update:show","success"],setup(e,{emit:a}){const r=e,p=a,v=Ue(),b=l(null),w=l(!1),k=l(!1),_=l(null),x=l(!1),U=l([]),P=l(null),S={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"},omp:{key:"omp",name:"OMP command templates",fileName:".omp/commands",color:"#0f9f9a"}},z=t(()=>{var e,a;const l=(null==(e=r.template)?void 0:e.aiConfigs)||{},t=null==(a=r.template)?void 0:a.cliType;if("omp"===t&&S.omp)return[S.omp];const s=Object.entries(l).filter(([,e])=>(null==e?void 0:e.enabled)&&(null==e?void 0:e.content)).map(([e])=>S[e]).filter(Boolean);if(t&&"all"!==t){const e=l[t];if((null==e?void 0:e.enabled)&&(null==e?void 0:e.content)&&S[t])return[S[t]]}return s});function T(){return z.value.map(e=>e.key)}const I=l({targetPath:"",aiConfigTypes:[]}),M={targetPath:{required:!0,message:"请输入目标路径",trigger:"blur"}},A=t(()=>{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 O(e){e&&(I.value.targetPath=e)}async function $(){if(I.value.targetPath&&r.template&&0!==I.value.aiConfigTypes.length){w.value=!0;try{const e=await async function(e,a,l=["claude"]){const t=Array.isArray(l)?l:[l];return(await ct.post(`${hC}/${e}/preview`,{targetPath:a,aiConfigTypes:t})).data}(r.template.id,I.value.targetPath,I.value.aiConfigTypes);e.success?_.value=e.data:v.error(e.message||"预览失败")}catch(e){v.error("预览失败: "+e.message)}finally{w.value=!1}}}async function j(){var e,a,l;try{await(null==(e=b.value)?void 0:e.validate())}catch{return}if(r.template&&0!==I.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 ct.post(`${hC}/${e}/apply`,{targetPath:a,aiConfigTypes:t})).data}(r.template.id,I.value.targetPath,I.value.aiConfigTypes);if(e.success){const t=(null==(l=null==(a=e.data)?void 0:a.results)?void 0:l.skipped)||[];t.length>0?v.warning(`模版已部分应用,${t.length} 项已跳过`):v.success("模版应用成功"),p("success",e.data||null)}else v.error(e.message||"应用失败")}catch(t){v.error("应用失败: "+t.message)}finally{k.value=!1}}}return C(()=>r.show,e=>{e&&(I.value.targetPath="",I.value.aiConfigTypes=T(),_.value=null,P.value=null,async function(){x.value=!0;try{const e=await sC();e.success?U.value=Array.isArray(e.data)?e.data:[]:U.value=[]}catch(e){U.value=[]}finally{x.value=!1}}())}),C(()=>r.template,()=>{I.value.aiConfigTypes=T()}),(a,l)=>{var t;return n(),g(d(se),{show:e.show,preset:"card",title:`应用模版: ${(null==(t=e.template)?void 0:t.name)||""}`,style:{width:"650px"},"mask-closable":!1,"onUpdate:show":l[4]||(l[4]=e=>p("update:show",e))},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:l[3]||(l[3]=e=>p("update:show",!1))},{default:u(()=>[...l[14]||(l[14]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:k.value,disabled:!I.value.targetPath||0===I.value.aiConfigTypes.length,onClick:j},{default:u(()=>[...l[15]||(l[15]=[h(" 确认应用 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:u(()=>[c(d(Y),{ref_key:"formRef",ref:b,model:I.value,rules:M},{default:u(()=>[c(d(X),{label:"选择已有项目"},{default:u(()=>[c(d(ee),{value:P.value,"onUpdate:value":[l[0]||(l[0]=e=>P.value=e),O],options:A.value,loading:x.value,placeholder:"选择已有项目路径",filterable:"",clearable:""},null,8,["value","options","loading"])]),_:1}),c(d(X),{label:"目标项目路径",path:"targetPath"},{default:u(()=>[c(d(ne),{value:I.value.targetPath,"onUpdate:value":l[1]||(l[1]=e=>I.value.targetPath=e),placeholder:"输入项目目录路径,如 /path/to/project"},null,8,["value"])]),_:1}),z.value.length>0?(n(),g(d(X),{key:0,label:"生成配置文件"},{default:u(()=>[c(d(Ae),{value:I.value.aiConfigTypes,"onUpdate:value":l[2]||(l[2]=e=>I.value.aiConfigTypes=e)},{default:u(()=>[c(d(ae),null,{default:u(()=>[(n(!0),s(f,null,y(z.value,e=>(n(),g(d(we),{key:e.key,value:e.key},{default:u(()=>[c(d(ae),{align:"center",size:4},{default:u(()=>[c(d(R),{size:16,color:e.color},{default:u(()=>[c(d($a))]),_:1},8,["color"]),o("span",null,m(e.name),1),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[h("("+m(e.fileName||e.name)+")",1)]),_:2},1024)]),_:2},1024)]),_:2},1032,["value"]))),128))]),_:1})]),_:1},8,["value"]),c(d(K),{depth:"3",style:{"font-size":"12px","margin-top":"4px",display:"block"}},{default:u(()=>[...l[5]||(l[5]=[h(" 可同时选择多个 CLI 配置文件 ",-1)])]),_:1})]),_:1})):i("",!0)]),_:1},8,["model"]),c(d(ae),{style:{"margin-bottom":"16px"}},{default:u(()=>[c(d(F),{onClick:$,loading:w.value,disabled:!I.value.targetPath||0===I.value.aiConfigTypes.length},{default:u(()=>[...l[6]||(l[6]=[h(" 预览应用效果 ",-1)])]),_:1},8,["loading","disabled"])]),_:1}),_.value?(n(),g(d(xe),{key:0,size:"small",title:"应用预览"},{default:u(()=>[c(d(ae),{vertical:""},{default:u(()=>{var e,a,t,o,r;return[_.value.summary?(n(),s("div",Sx,[c(d(K),{depth:"3"},{default:u(()=>[...l[7]||(l[7]=[h("将应用:",-1)])]),_:1}),c(d(ae),{style:{"margin-top":"8px"},wrap:""},{default:u(()=>[(n(!0),s(f,null,y(_.value.summary.aiConfigs,e=>{return n(),g(d(H),{key:e.type,type:(a=e.type,{claude:"warning",codex:"success",gemini:"info",opencode:"error",omp:"success"}[a]||"default"),size:"small"},{default:u(()=>[h(m(e.fileName||e.name),1)]),_:2},1032,["type"]);var a}),128)),_.value.summary.skills?(n(),g(d(H),{key:0,type:"info",size:"small"},{default:u(()=>[h(m(_.value.summary.skills)+" Skills",1)]),_:1})):i("",!0),_.value.summary.agents?(n(),g(d(H),{key:1,type:"info",size:"small"},{default:u(()=>[h(m(_.value.summary.agents)+" Agents",1)]),_:1})):i("",!0),_.value.summary.commands?(n(),g(d(H),{key:2,type:"info",size:"small"},{default:u(()=>[h(m(_.value.summary.commands)+" Commands",1)]),_:1})):i("",!0),_.value.summary.plugins?(n(),g(d(H),{key:3,type:"warning",size:"small"},{default:u(()=>[h(m(_.value.summary.plugins)+" Plugins",1)]),_:1})):i("",!0),_.value.summary.mcpServers?(n(),g(d(H),{key:4,type:"warning",size:"small"},{default:u(()=>[h(m(_.value.summary.mcpServers)+" MCP",1)]),_:1})):i("",!0),_.value.summary.skipped?(n(),g(d(H),{key:5,type:"error",size:"small"},{default:u(()=>[h(m(_.value.summary.skipped)+" Skipped",1)]),_:1})):i("",!0)]),_:1})])):i("",!0),c(d(de),{style:{margin:"12px 0"}}),(null==(e=_.value.willCreate)?void 0:e.length)?(n(),s("div",zx,[c(d(K),{type:"success"},{default:u(()=>[...l[8]||(l[8]=[h("将创建:",-1)])]),_:1}),c(d(Oe),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),s(f,null,y(_.value.willCreate,e=>(n(),g(d($e),{key:e},{default:u(()=>[c(d(K),{code:""},{default:u(()=>[h(m(e),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):i("",!0),(null==(a=_.value.willOverwrite)?void 0:a.length)?(n(),s("div",Tx,[c(d(K),{type:"warning"},{default:u(()=>[...l[9]||(l[9]=[h("将覆盖:",-1)])]),_:1}),c(d(Oe),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),s(f,null,y(_.value.willOverwrite,e=>(n(),g(d($e),{key:e},{default:u(()=>[c(d(K),{code:""},{default:u(()=>[h(m(e),1)]),_:2},1024),c(d(H),{type:"warning",size:"tiny",style:{"margin-left":"8px"}},{default:u(()=>[...l[10]||(l[10]=[h("已存在",-1)])]),_:1})]),_:2},1024))),128))]),_:1})])):i("",!0),(null==(t=_.value.willOverwrite)?void 0:t.length)?(n(),g(d(pe),{key:3,type:"warning",style:{"margin-top":"8px"}},{default:u(()=>[...l[11]||(l[11]=[h(" 以上文件将被覆盖,请确认后再应用 ",-1)])]),_:1})):i("",!0),(null==(o=_.value.skipped)?void 0:o.length)?(n(),s("div",Ix,[c(d(K),{type:"error"},{default:u(()=>[...l[12]||(l[12]=[h("将跳过:",-1)])]),_:1}),c(d(Oe),{style:{margin:"4px 0"}},{default:u(()=>[(n(!0),s(f,null,y(_.value.skipped,(e,a)=>(n(),g(d($e),{key:`${e.type}-${e.item}-${a}`},{default:u(()=>[c(d(K),null,{default:u(()=>[h(m(e.type)+": ",1)]),_:2},1024),c(d(K),{code:""},{default:u(()=>[h(m(e.item),1)]),_:2},1024),c(d(K),{depth:"3"},{default:u(()=>[h(" - "+m(e.reason),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):i("",!0),(null==(r=_.value.skipped)?void 0:r.length)?(n(),g(d(pe),{key:5,type:"info",style:{"margin-top":"8px"}},{default:u(()=>[...l[13]||(l[13]=[h(" 本次将进行部分应用,以上项会被跳过。 ",-1)])]),_:1})):i("",!0)]}),_:1})]),_:1})):i("",!0)]),_:1},8,["show","title"])}}},Ax={key:0,class:"preview-content"},Ox={class:"info-section"},$x={class:"info-row"},jx={class:"value"},Lx={key:0,class:"info-row"},Ex={class:"value"},Dx={key:1,class:"info-row"},Nx={class:"stats-section"},Bx={class:"stats-grid"},Rx={key:1,class:"stat-item"},Fx={key:2,class:"stat-item"},Hx={key:3,class:"stat-item"},Gx={key:4,class:"stat-item"},Kx={key:5,class:"stat-item"},qx={class:"markdown-content"},Wx={class:"markdown-content"},Vx={class:"list-items"},Jx={class:"list-items"},Zx={class:"list-items"},Qx={key:0,class:"list-note"},Yx={class:"list-items"},Xx=zl({__name:"ConfigPreviewModal",props:{show:Boolean,template:Object},emits:["update:show","apply"],setup(e,{emit:a}){const l=e,r=a,p={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"},omp:{key:"omp",name:"OMP command templates",fileName:".omp/commands",color:"#0f9f9a"}},v=t(()=>{var e,a,t,s;const n=(null==(e=l.template)?void 0:e.aiConfigs)||{},o=Object.entries(n).filter(([,e])=>(null==e?void 0:e.enabled)&&(null==e?void 0:e.content)).map(([e,a])=>({...p[e],content:a.content})).filter(e=>e.key),i=null==(a=l.template)?void 0:a.cliType;if("omp"===i&&(null==(s=null==(t=l.template)?void 0:t.commands)?void 0:s.length))return[{...p.omp,content:l.template.commands.map(e=>`- ${e.namespace?`${e.namespace}/`:""}${e.name||e}`).join("\n")}];if(i&&"all"!==i){const e=n[i];if((null==e?void 0:e.enabled)&&(null==e?void 0:e.content)&&p[i])return[{...p[i],content:e.content}]}return o}),b=t(()=>v.value.length>0),w=t(()=>{var e,a,t,s,n;const o=l.template;return!!o&&(b.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==(s=o.commands)?void 0:s.length)||(null==(n=o.mcpServers)?void 0:n.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"},omp:{label:"OMP",color:"#0f9f9a",textColor:"#fff",borderColor:"#0f9f9a"}};function _(e){var a;return(null==(a=k[e])?void 0:a.label)||e}function C(e){const a=k[e];return a?{color:a.color,textColor:a.textColor,borderColor:a.borderColor}:{}}function x(){r("apply",l.template)}return(a,l)=>{var t;return n(),g(d(se),{show:e.show,preset:"card",title:`模版预览: ${(null==(t=e.template)?void 0:t.name)||""}`,style:{width:"750px","max-height":"80vh"},"mask-closable":!0,"onUpdate:show":l[1]||(l[1]=e=>r("update:show",e))},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:l[0]||(l[0]=e=>r("update:show",!1))},{default:u(()=>[...l[7]||(l[7]=[h("关闭",-1)])]),_:1}),c(d(F),{type:"primary",onClick:x},{default:u(()=>[...l[8]||(l[8]=[h("应用此模版",-1)])]),_:1})]),_:1})]),default:u(()=>{var a,t,r,p,k;return[e.template?(n(),s("div",Ax,[o("div",Ox,[o("div",$x,[l[2]||(l[2]=o("span",{class:"label"},"名称:",-1)),o("span",jx,m(e.template.name),1)]),e.template.description?(n(),s("div",Lx,[l[3]||(l[3]=o("span",{class:"label"},"描述:",-1)),o("span",Ex,m(e.template.description),1)])):i("",!0),e.template.cliType?(n(),s("div",Dx,[l[4]||(l[4]=o("span",{class:"label"},"CLI 工具:",-1)),c(d(H),{size:"small",color:C(e.template.cliType),round:""},{default:u(()=>[h(m(_(e.template.cliType)),1)]),_:1},8,["color"])])):i("",!0)]),o("div",Nx,[l[6]||(l[6]=o("div",{class:"section-title"},"包含配置",-1)),o("div",Bx,[b.value?(n(!0),s(f,{key:0},y(v.value,e=>(n(),s("div",{class:"stat-item",key:e.key},[c(d(R),{size:"20",color:e.color},{default:u(()=>[c(d($a))]),_:1},8,["color"]),o("span",null,m(e.fileName||e.name),1)]))),128)):(null==(a=e.template.claudeMd)?void 0:a.enabled)?(n(),s("div",Rx,[c(d(R),{size:"20"},{default:u(()=>[c(d($a))]),_:1}),l[5]||(l[5]=o("span",null,"CLAUDE.md",-1))])):i("",!0),(null==(t=e.template.skills)?void 0:t.length)?(n(),s("div",Fx,[c(d(R),{size:"20"},{default:u(()=>[c(d(Je))]),_:1}),o("span",null,m(e.template.skills.length)+" Skills",1)])):i("",!0),(null==(r=e.template.agents)?void 0:r.length)?(n(),s("div",Hx,[c(d(R),{size:"20"},{default:u(()=>[c(d(sl))]),_:1}),o("span",null,m(e.template.agents.length)+" Agents",1)])):i("",!0),(null==(p=e.template.commands)?void 0:p.length)?(n(),s("div",Gx,[c(d(R),{size:"20"},{default:u(()=>[c(d(Qe))]),_:1}),o("span",null,m(e.template.commands.length)+" Commands",1)])):i("",!0),(null==(k=e.template.mcpServers)?void 0:k.length)?(n(),s("div",Kx,[c(d(R),{size:"20"},{default:u(()=>[c(d(Oa))]),_:1}),o("span",null,m(e.template.mcpServers.length)+" MCP Servers",1)])):i("",!0)])]),w.value?(n(),g(d(me),{key:0,class:"details-section"},{default:u(()=>{var a,l,t,r,p;return[(n(!0),s(f,null,y(v.value,e=>(n(),g(d(fe),{key:e.key,title:`${e.name} 配置 (${e.fileName||e.name})`,name:e.key},{default:u(()=>[o("div",qx,[c(wx,{content:e.content},null,8,["content"])])]),_:2},1032,["title","name"]))),128)),!b.value&&(null==(a=e.template.claudeMd)?void 0:a.content)?(n(),g(d(fe),{key:0,title:"CLAUDE.md 内容",name:"claudeMd"},{default:u(()=>[o("div",Wx,[c(wx,{content:e.template.claudeMd.content},null,8,["content"])])]),_:1})):i("",!0),(null==(l=e.template.skills)?void 0:l.length)?(n(),g(d(fe),{key:1,title:"Skills 列表",name:"skills"},{default:u(()=>[o("div",Vx,[(n(!0),s(f,null,y(e.template.skills,(e,a)=>(n(),s("div",{key:a,class:"list-item"},m(e.name||e),1))),128))])]),_:1})):i("",!0),(null==(t=e.template.agents)?void 0:t.length)?(n(),g(d(fe),{key:2,title:"Agents 列表",name:"agents"},{default:u(()=>[o("div",Jx,[(n(!0),s(f,null,y(e.template.agents,(e,a)=>(n(),s("div",{key:a,class:"list-item"},m(e.name||e),1))),128))])]),_:1})):i("",!0),(null==(r=e.template.commands)?void 0:r.length)?(n(),g(d(fe),{key:3,title:"Commands 列表",name:"commands"},{default:u(()=>[o("div",Zx,["omp"===e.template.cliType?(n(),s("div",Qx," 将写入 .omp/commands,作为 OMP commands 使用。 ")):i("",!0),(n(!0),s(f,null,y(e.template.commands,(e,a)=>(n(),s("div",{key:a,class:"list-item"},m(e.name||e),1))),128))])]),_:1})):i("",!0),(null==(p=e.template.mcpServers)?void 0:p.length)?(n(),g(d(fe),{key:4,title:"MCP Servers",name:"mcpServers"},{default:u(()=>[o("div",Yx,[(n(!0),s(f,null,y(e.template.mcpServers,(e,a)=>(n(),s("div",{key:a,class:"list-item"},m(e.name||e),1))),128))])]),_:1})):i("",!0)]}),_:1})):i("",!0)])):i("",!0)]}),_:1},8,["show","title"])}}},[["__scopeId","data-v-27b692bd"]]),eU={key:0,class:"panel-header"},aU={class:"header-left"},lU={class:"header-right"},tU={key:1,class:"drawer-header-bar"},sU={class:"header-right"},nU={class:"stats-bar"},oU={class:"stats-text"},iU={class:"filter-bar"},rU={class:"panel-content"},cU={key:0,class:"empty-state"},uU={key:1,class:"card-list"},dU={class:"panel-footer"},pU=zl({__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,r=Ue(),v=Pe(),b=l(!1),k=l([]),_=l({}),x=l(""),U=l(""),P=[{label:"全部 CLI",value:""},{label:"Claude Code",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"},{label:"OMP",value:"omp"}],S=l(null),z=l(!1),T=l(!1),I=l(!1),M=l(null),A=l(null),O=l(null),$=t(()=>{let e=k.value;if(U.value&&(e=e.filter(e=>e.cliType===U.value)),x.value.trim()){const a=x.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 j(){b.value=!0;try{const[e,a]=await Promise.all([bC(),wC()]);e.success&&(k.value=e.data||[]),a.success&&(_.value=a.data||{})}catch(e){r.error("加载数据失败: "+e.message)}finally{b.value=!1}}function L(){M.value=null,z.value=!0}function E(e){M.value={...e},z.value=!0}function D(e){O.value=e,I.value=!0}function N(e){A.value=e,I.value=!1,T.value=!0}function B(e){v.warning({title:"确认删除",content:`确定要删除模版 "${e.name}" 吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{S.value=e.id;try{const a=await async function(e){return(await ct.delete(`${hC}/${e}`)).data}(e.id);a.success?(r.success("删除成功"),j()):r.error(a.message||"删除失败")}catch(a){r.error("删除失败: "+a.message)}finally{S.value=null}}})}function H(){z.value=!1,j()}function G(){T.value=!1,j()}return w(()=>j()),C(()=>a.drawerVisible,e=>{e&&j()}),(a,l)=>(n(),s("div",{class:p(["templates-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?i("",!0):(n(),s("div",eU,[o("div",aU,[e.hideBack?i("",!0):(n(),g(d(F),{key:0,text:"",onClick:l[0]||(l[0]=e=>a.$emit("back")),class:"back-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(ja))]),_:1})]),_:1})),l[6]||(l[6]=o("span",{class:"panel-title"},"配置模版管理",-1))]),o("div",lU,[c(d(F),{text:"",onClick:L,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[7]||(l[7]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:j,loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[8]||(l[8]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])),e.inDrawer?(n(),s("div",tU,[o("div",sU,[c(d(F),{text:"",onClick:L,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ke))]),_:1})]),default:u(()=>[l[9]||(l[9]=h(" 创建 ",-1))]),_:1}),c(d(F),{text:"",onClick:j,loading:b.value,class:"action-btn"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Za))]),_:1})]),default:u(()=>[l[10]||(l[10]=h(" 刷新 ",-1))]),_:1},8,["loading"])])])):i("",!0),o("div",nU,[o("span",oU," 共 "+m(k.value.length)+" 个模版 ",1)]),o("div",iU,[c(d(ne),{value:x.value,"onUpdate:value":l[1]||(l[1]=e=>x.value=e),placeholder:"搜索模版...",clearable:"",size:"small",class:"search-input"},{prefix:u(()=>[c(d(R),null,{default:u(()=>[c(d(Qa))]),_:1})]),_:1},8,["value"]),c(d(ee),{value:U.value,"onUpdate:value":l[2]||(l[2]=e=>U.value=e),options:P,size:"small",class:"filter-select"},null,8,["value"])]),o("div",rU,[c(d(Z),{show:b.value},{default:u(()=>[0!==$.value.length||b.value?(n(),s("div",uU,[(n(!0),s(f,null,y($.value,e=>(n(),g(hx,{key:e.id,template:e,deleting:S.value===e.id,onClick:D,onPreview:D,onEdit:E,onDelete:B,onApply:N},null,8,["template","deleting"]))),128))])):(n(),s("div",cU,[c(d(Q),{description:"暂无配置模版"},{icon:u(()=>[c(d(R),{size:"48",color:"var(--text-quaternary)"},{default:u(()=>[c(d(na))]),_:1})]),extra:u(()=>[c(d(F),{size:"small",onClick:L},{default:u(()=>[...l[11]||(l[11]=[h("创建第一个模版",-1)])]),_:1})]),_:1})]))]),_:1},8,["show"])]),o("div",dU,[c(d(R),{size:"14",class:"info-icon"},{default:u(()=>[c(d(Ma))]),_:1}),l[12]||(l[12]=o("span",null,"配置模版可快速应用到工作区",-1))]),c(Px,{show:z.value,"onUpdate:show":l[3]||(l[3]=e=>z.value=e),template:M.value,"available-configs":_.value,onSuccess:H},null,8,["show","template","available-configs"]),c(Mx,{show:T.value,"onUpdate:show":l[4]||(l[4]=e=>T.value=e),template:A.value,onSuccess:G},null,8,["show","template"]),c(Xx,{show:I.value,"onUpdate:show":l[5]||(l[5]=e=>I.value=e),template:O.value,onApply:N},null,8,["show","template"])],2))}},[["__scopeId","data-v-a5e12341"]]),vU=zl({__name:"ConfigTemplatesDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:i}=oi(720),r=t({get:()=>l.visible,set:e=>s("update:visible",e)}),p={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(n(),g(d(ce),{show:r.value,"onUpdate:show":a[1]||(a[1]=e=>r.value=e),width:d(i),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1,"body-content-style":p},{header:u(()=>[...a[2]||(a[2]=[o("div",{class:"drawer-header"},"配置模版管理",-1)])]),default:u(()=>[c(pU,{"in-drawer":!0,"hide-back":!0,"drawer-visible":r.value,onBack:a[0]||(a[0]=e=>r.value=!1)},null,8,["drawer-visible"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-c337d3e9"]]);const mU={class:"drawer-header"},fU={class:"export-import-container"},yU={class:"section"},gU={class:"section-header"},hU={class:"section"},bU={class:"section-header"},wU={key:0,class:"import-preview"},kU={class:"preview-stats"},_U={class:"stat-item"},CU={class:"stat-item"},xU={class:"stat-item"},UU=zl({__name:"ConfigExportDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const r=e,p=a,{drawerWidth:v}=oi(520,480),f=t({get:()=>r.visible,set:e=>p("update:visible",e)}),y=l(!1),b=l(!1),w=l(null),k=l(null),_=l(null),C=l(null),x=l(!1);async function U(){y.value=!0;try{const e=await async function(e="zip"){return(await ct.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),Hs.success("配置导出成功")}catch(e){Hs.error("导出失败: "+e.message)}finally{y.value=!1}}async function P({file:e}){try{w.value=null,k.value=null,_.value=null,C.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 ct.post("/config-export/preview-zip",a,{headers:{"Content-Type":"application/zip"}})).data}(e.file);return void(a.success?(w.value=a.data,_.value=e.file,k.value=null,C.value="zip",Hs.success("ZIP 配置解析成功")):Hs.error("ZIP 配置格式错误: "+a.message))}const l=await e.file.text(),t=JSON.parse(l),s=await async function(e){return(await ct.post("/config-export/preview",{data:e})).data}(t);s.success?(w.value=s.data,k.value=t,_.value=null,C.value="json",Hs.success("配置文件解析成功")):Hs.error("配置文件格式错误: "+s.message)}catch(a){Hs.error("文件解析失败: "+a.message)}}async function S(){if(k.value||_.value){b.value=!0;try{const e="zip"===C.value?await async function(e,a=!1){const l=await e.arrayBuffer();return(await ct.post(`/config-export/import-zip?overwrite=${a}`,l,{headers:{"Content-Type":"application/zip"}})).data}(_.value,x.value):await async function(e,a=!1){return(await ct.post("/config-export/import",{data:e,overwrite:a})).data}(k.value,x.value);e.success?(Hs.success("配置导入成功: "+e.message),z()):Hs.error("配置导入失败: "+e.message)}catch(e){Hs.error("导入失败: "+e.message)}finally{b.value=!1}}}function z(){w.value=null,k.value=null,_.value=null,C.value=null,x.value=!1}return(e,a)=>(n(),g(d(ce),{show:f.value,"onUpdate:show":a[1]||(a[1]=e=>f.value=e),width:d(v),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",mU,[c(d(R),{size:20,color:"#18a058"},{default:u(()=>[c(d(Ja))]),_:1}),a[2]||(a[2]=o("span",null,"配置导出/导入",-1))])]),default:u(()=>[o("div",fU,[o("div",yU,[o("div",gU,[c(d(K),{strong:""},{default:u(()=>[...a[3]||(a[3]=[h("导出配置",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[4]||(a[4]=[h(" 导出多平台配置为 ZIP(含渠道、Agents/Skills/Commands、原生配置等) ",-1)])]),_:1})]),c(d(F),{type:"primary",loading:y.value,onClick:U},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Fa))]),_:1})]),default:u(()=>[a[5]||(a[5]=h(" 导出配置 ",-1))]),_:1},8,["loading"])]),c(d(de)),o("div",hU,[o("div",bU,[c(d(K),{strong:""},{default:u(()=>[...a[6]||(a[6]=[h("导入配置",-1)])]),_:1}),c(d(K),{depth:"3",style:{"font-size":"12px"}},{default:u(()=>[...a[7]||(a[7]=[h(" 从 JSON 或 ZIP 文件导入配置(支持覆盖已有配置) ",-1)])]),_:1})]),c(d(ke),{"custom-request":P,"show-file-list":!1,accept:".json,.zip"},{default:u(()=>[c(d(F),null,{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(nl))]),_:1})]),default:u(()=>[a[8]||(a[8]=h(" 选择配置文件 ",-1))]),_:1})]),_:1}),w.value?(n(),s("div",wU,[c(d(K),{strong:"",style:{"font-size":"14px"}},{default:u(()=>[...a[9]||(a[9]=[h("导入预览",-1)])]),_:1}),o("div",kU,[o("div",_U,[c(d(K),{depth:"3"},{default:u(()=>[...a[10]||(a[10]=[h("配置模板:",-1)])]),_:1}),c(d(K),null,{default:u(()=>[h(m(w.value.counts.configTemplates),1)]),_:1})]),o("div",CU,[c(d(K),{depth:"3"},{default:u(()=>[...a[11]||(a[11]=[h("渠道总数:",-1)])]),_:1}),c(d(K),null,{default:u(()=>[h(m(w.value.counts.channels),1)]),_:1})]),o("div",xU,[c(d(K),{depth:"3"},{default:u(()=>[...a[12]||(a[12]=[h("插件:",-1)])]),_:1}),c(d(K),null,{default:u(()=>[h(m(w.value.counts.plugins||0),1)]),_:1})])]),c(d(we),{checked:x.value,"onUpdate:checked":a[0]||(a[0]=e=>x.value=e),style:{"margin-top":"12px"}},{default:u(()=>[...a[13]||(a[13]=[h(" 覆盖已有配置 ",-1)])]),_:1},8,["checked"]),c(d(ae),{style:{"margin-top":"16px"}},{default:u(()=>[c(d(F),{type:"primary",loading:b.value,onClick:S},{default:u(()=>[...a[14]||(a[14]=[h(" 确认导入 ",-1)])]),_:1},8,["loading"]),c(d(F),{onClick:z},{default:u(()=>[...a[15]||(a[15]=[h("取消",-1)])]),_:1})]),_:1})])):i("",!0)])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-d8c9eada"]]),PU={class:"drawer-header"},SU={class:"oauth-container"},zU={class:"toolbar"},TU={class:"tool-panel"},IU={class:"state-top"},MU={class:"state-storage"},AU={class:"state-tags"},OU={class:"state-grid"},$U={class:"state-item"},jU={class:"state-value"},LU={class:"state-item"},EU={class:"state-value"},DU={class:"state-item"},NU={class:"state-value"},BU={key:1,class:"credential-list"},RU={class:"credential-top"},FU={class:"credential-main"},HU={class:"credential-name"},GU={class:"credential-tags"},KU={class:"credential-actions"},qU={class:"credential-meta"},WU={class:"meta-item"},VU={class:"meta-value"},JU={class:"meta-item"},ZU={class:"meta-value"},QU={class:"meta-item"},YU={class:"meta-value"},XU={class:"meta-item"},eP={class:"meta-value"},aP={class:"import-modal"},lP={class:"import-tool"},tP={style:{display:"flex","align-items":"center","justify-content":"center",gap:"8px"}},sP=zl({__name:"OAuthCredentialsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const r=e,v=a,{drawerWidth:b}=oi(720),w=t({get:()=>r.visible,set:e=>v("update:visible",e)}),k=["claude","codex","gemini","opencode","omp"],_={claude:"Claude",codex:"Codex",gemini:"Gemini",opencode:"OpenCode",omp:"OMP"},x=l("claude"),U=l(!1),P=l(""),S=l({}),z=l(!1),T=l("claude"),I=l(""),M=l("");function A(e){var a;return(null==(a=S.value)?void 0:a[e])||null}function O(e){var a;return[...(null==(a=A(e))?void 0:a.credentials)||[]].sort((a,l)=>{const t=Number(j(e,l))-Number(j(e,a));if(0!==t)return t;const s=Number(l.isDefault)-Number(a.isDefault);return 0!==s?s:(l.updatedAt||l.createdAt||0)-(a.updatedAt||a.createdAt||0)})}function $(e){return"opencode"===e}function j(e,a){return L(e,a)}function L(e,a){var l;const t=null==(l=A(e))?void 0:l.nativeState,s=E(e);return!(!(null==t?void 0:t.oauthPresent)||0===s.length)&&s.some(e=>{const l=!(!e.tokenPreview||!a.tokenPreview)&&e.tokenPreview===a.tokenPreview,t=!e.providerId||!a.providerId||e.providerId===a.providerId,s=!e.accountId||!a.accountId||e.accountId===a.accountId,n=!e.accountEmail||!a.accountEmail||e.accountEmail===a.accountEmail;return l&&t&&s&&n})}function E(e){var a;const l=null==(a=A(e))?void 0:a.nativeState,t=Array.isArray(null==l?void 0:l.nativeCredentials)?l.nativeCredentials:[];return t.length>0?t:(null==l?void 0:l.nativeCredential)?[l.nativeCredential]:[]}function D(e){return"oauth"===e?"OAuth 控制":"mixed"===e?"混合模式":"proxy"===e?"动态切换":"channel"===e?"渠道控制":"未接管"}function N(e){const a=String(e||"").trim();return a?"keychain"===a?"Keychain":"file"===a?"凭证文件":"auth-file"===a?"auth.json":"auth-broker"===a||"auth-broker-existing"===a?"OMP Auth Broker":"settings-env"===a?"settings.env":"encrypted-file"===a?"加密文件":"legacy-file"===a?"旧文件":"plaintext-file"===a?"明文文件":"auth-file+keychain"===a?"auth.json + keyring":"encrypted-file+keychain"===a?"加密文件 + keyring":a:"未检测"}function B(e){if(!e)return"-";const a=Number(e),l=Number.isFinite(a)&&a>0?a:Date.parse(e);return Number.isFinite(l)?new Date(l).toLocaleString():String(e)}async function K(){U.value=!0;try{const e=await ho();S.value=e.tools||{}}catch(e){Hs.error("加载 OAuth 凭证失败: "+(e.message||"未知错误"))}finally{U.value=!1}}async function q(e,a){var l,t;P.value=e;try{await a()}catch(s){const e=(null==(t=null==(l=null==s?void 0:s.response)?void 0:l.data)?void 0:t.error)||(null==s?void 0:s.message)||"操作失败";Hs.error(e)}finally{P.value=""}}function W({file:e,onFinish:a,onError:l}){const t=new FileReader;t.onload=e=>{M.value=e.target.result,a()},t.onerror=l,t.readAsText(e.file)}function V(){z.value=!1,I.value="",M.value=""}async function J(){M.value.trim()?await q(`import-${T.value}`,async()=>{const e=await async function(e,a={}){return(await ct.post(`/oauth-credentials/${e}/import`,a)).data}(T.value,{name:I.value,raw:M.value});S.value[T.value]=e.summary,Hs.success("OAuth 凭证导入成功"),V()}):Hs.warning("请先粘贴 OAuth 内容")}async function Y(e){await q(`sync-${e}`,async()=>{var a;const l=await async function(e){return(await ct.post(`/oauth-credentials/${e}/sync-local`)).data}(e);S.value[e]=l.summary||(null==(a=l.tools)?void 0:a[e]);const t=Array.isArray(l.credentials)?l.credentials.length:0;Hs.success(t>1?`${_[e]} 本地 OAuth 已同步 ${t} 条凭证`:`${_[e]} 本地 OAuth 已同步`)})}async function X(e,a,l){const t=j(e,a);l!==t&&await q(`toggle-${e}-${a.id}`,async()=>{if(l){const l=await async function(e,a){return(await ct.post(`/oauth-credentials/${e}/${a}/apply`)).data}(e,a.id);S.value[e]=l.toolSummary,Hs.success(l.message||`${_[e]} OAuth 已启用`)}else{const l=await bo(e,a.id);S.value[e]={...l.toolSummary||S.value[e]||{},nativeState:l.nativeState};const t=$(e)?`${_[e]} OAuth provider 已关闭`:`${_[e]} 本机 OAuth 已关闭`;Hs.success(l.message||t)}window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e}}))})}async function ee(e,a){var l;const t=((null==(l=A(e))?void 0:l.credentials)||[]).find(e=>e.id===a),s=!!t&&L(e,t);window.confirm(s?"当前凭证正在本机生效,删除时会一并清理本机 OAuth,确认继续吗?":"确认删除该凭证吗?")&&await q(`delete-${e}-${a}`,async()=>{const l=await async function(e,a){return(await ct.delete(`/oauth-credentials/${e}/${a}`)).data}(e,a);if(S.value[e]=l.summary,s){const l=$(e)?await bo(e,a):await async function(e){return(await ct.post(`/oauth-credentials/${e}/clear-native`)).data}(e);S.value[e]={...S.value[e]||{},...l.toolSummary||{},nativeState:l.nativeState},Hs.success($(e)?"OAuth 凭证已删除,对应本机 OAuth provider 也已关闭":"OAuth 凭证已删除,本机 OAuth 也已清理")}else Hs.success("OAuth 凭证已删除");window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:e}}))})}return C(()=>r.visible,e=>{e&&K()}),(e,a)=>(n(),s(f,null,[c(d(ce),{show:w.value,"onUpdate:show":a[3]||(a[3]=e=>w.value=e),width:d(b),placement:"right","mask-closable":!0},{default:u(()=>[c(d(re),{closable:"","native-scrollbar":!1},{header:u(()=>[o("div",PU,[c(d(R),{size:20,color:"#2080f0"},{default:u(()=>[c(d(ea))]),_:1}),a[7]||(a[7]=o("span",null,"OAuth 凭证管理",-1))])]),default:u(()=>[o("div",SU,[c(d(pe),{type:"info","show-icon":!1},{default:u(()=>[...a[8]||(a[8]=[h(" 这里只管理 OAuth token 的导入、同步和切换,不直接发起 OAuth 登录。过期后由用户自行刷新。 ",-1)])]),_:1}),o("div",zU,[c(d(ae),null,{default:u(()=>[c(d(F),{secondary:"",onClick:K,loading:U.value},{default:u(()=>[...a[9]||(a[9]=[h(" 刷新 ",-1)])]),_:1},8,["loading"]),c(d(F),{type:"primary",secondary:"",loading:P.value===`sync-${x.value}`,onClick:a[0]||(a[0]=e=>Y(x.value))},{default:u(()=>[...a[10]||(a[10]=[h(" 同步本地现有配置 ",-1)])]),_:1},8,["loading"]),c(d(F),{type:"primary",onClick:a[1]||(a[1]=e=>{return a=x.value,T.value=a,I.value="",M.value="",void(z.value=!0);var a})},{default:u(()=>[...a[11]||(a[11]=[h(" 手动导入 ",-1)])]),_:1})]),_:1})]),c(d(Z),{show:U.value},{default:u(()=>[c(d(ge),{value:x.value,"onUpdate:value":a[2]||(a[2]=e=>x.value=e),type:"line",animated:""},{default:u(()=>[(n(),s(f,null,y(k,e=>c(d(he),{key:e,name:e,tab:_[e]},{default:u(()=>{var l,t;return[o("div",TU,[a[24]||(a[24]=o("div",{class:"section-header"},[o("div",null,[o("div",{class:"section-title"},"已管理凭证"),o("div",{class:"section-desc"},"Claude / Codex / Gemini 单开,OpenCode 支持多开;关闭开关即可停用本机 OAuth。")])],-1)),c(d(xe),{size:"small",class:"state-card"},{default:u(()=>{var l,t,s,r,p,v,f,y,b,w,k,_,C,x,U;return[o("div",IU,[o("div",null,[a[12]||(a[12]=o("div",{class:"section-title"},"当前本机状态",-1)),o("div",MU,m(N(null==(s=null==(t=null==(l=A(e))?void 0:l.nativeState)?void 0:t.nativeCredential)?void 0:s.storage)),1)]),o("div",AU,[c(d(H),{size:"small",type:(U=null==(p=null==(r=A(e))?void 0:r.nativeState)?void 0:p.mode,"oauth"===U?"success":"mixed"===U?"info":"proxy"===U?"warning":"channel"===U?"info":"default")},{default:u(()=>{var a,l;return[h(m(D(null==(l=null==(a=A(e))?void 0:a.nativeState)?void 0:l.mode)),1)]}),_:2},1032,["type"]),E(e).length>1?(n(),g(d(H),{key:0,size:"small",type:"info"},{default:u(()=>[h(m(E(e).length)+" 个已启用 ",1)]),_:2},1024)):i("",!0)])]),o("div",OU,[o("div",$U,[a[13]||(a[13]=o("span",{class:"state-label"},"Token",-1)),o("span",jU,m((null==(y=null==(f=null==(v=A(e))?void 0:v.nativeState)?void 0:f.nativeCredential)?void 0:y.tokenPreview)||"-"),1)]),o("div",LU,[a[14]||(a[14]=o("span",{class:"state-label"},"Email",-1)),o("span",EU,m((null==(k=null==(w=null==(b=A(e))?void 0:b.nativeState)?void 0:w.nativeCredential)?void 0:k.accountEmail)||"-"),1)]),o("div",DU,[a[15]||(a[15]=o("span",{class:"state-label"},"Account ID",-1)),o("span",NU,m((null==(x=null==(C=null==(_=A(e))?void 0:_.nativeState)?void 0:C.nativeCredential)?void 0:x.accountId)||"-"),1)])]),a[16]||(a[16]=o("div",{class:"state-hint"}," 通过下方凭证开关控制本机 OAuth。若本机已有未托管 OAuth,可先点“同步本地现有配置”后再切换。 ",-1))]}),_:2},1024),(null==(t=null==(l=A(e))?void 0:l.credentials)?void 0:t.length)?(n(),s("div",BU,[(n(!0),s(f,null,y(O(e),l=>(n(),g(d(xe),{key:l.id,size:"small",class:p(["credential-card",j(e,l)?"credential-card--active":"credential-card--inactive"])},{default:u(()=>[o("div",RU,[o("div",FU,[o("div",HU,m(l.name),1),o("div",GU,[j(e,l)?(n(),g(d(H),{key:0,size:"small",type:"info"},{default:u(()=>[...a[17]||(a[17]=[h("已启用",-1)])]),_:1})):i("",!0),l.isDefault?(n(),g(d(H),{key:1,size:"small",type:"success"},{default:u(()=>[...a[18]||(a[18]=[h("默认",-1)])]),_:1})):i("",!0),l.providerId?(n(),g(d(H),{key:2,size:"small"},{default:u(()=>[h(m(l.providerId),1)]),_:2},1024)):i("",!0),l.source?(n(),g(d(H),{key:3,size:"small",bordered:!1},{default:u(()=>{return[h(m((e=l.source,"synced-local"===e?"同步本地":"manual"===e?"手动导入":e||"-")),1)];var e}),_:2},1024)):i("",!0)])]),o("div",KU,[c(d(F),{size:"small",quaternary:"",loading:P.value===`delete-${e}-${l.id}`,onClick:a=>ee(e,l.id)},{default:u(()=>[...a[19]||(a[19]=[h(" 删除 ",-1)])]),_:1},8,["loading","onClick"]),c(d(G),{size:"small",value:j(e,l),loading:P.value===`toggle-${e}-${l.id}`,disabled:""!==P.value,"onUpdate:value":a=>X(e,l,a)},null,8,["value","loading","disabled","onUpdate:value"])])]),o("div",qU,[o("div",WU,[a[20]||(a[20]=o("span",{class:"meta-label"},"Token",-1)),o("span",VU,m(l.tokenPreview||"-"),1)]),o("div",JU,[a[21]||(a[21]=o("span",{class:"meta-label"},"Email",-1)),o("span",ZU,m(l.accountEmail||"-"),1)]),o("div",QU,[a[22]||(a[22]=o("span",{class:"meta-label"},"Account ID",-1)),o("span",YU,m(l.accountId||"-"),1)]),o("div",XU,[a[23]||(a[23]=o("span",{class:"meta-label"},"更新时间",-1)),o("span",eP,m(B(l.updatedAt||l.createdAt)),1)])])]),_:2},1032,["class"]))),128))])):(n(),g(d(Q),{key:0,description:"暂无 OAuth 凭证",size:"small"}))])]}),_:2},1032,["name","tab"])),64))]),_:1},8,["value"])]),_:1},8,["show"])])]),_:1})]),_:1},8,["show","width"]),c(d(se),{show:z.value,"onUpdate:show":a[6]||(a[6]=e=>z.value=e),preset:"card",title:"手动导入 OAuth 凭证",style:{width:"720px","max-width":"92vw"}},{footer:u(()=>[c(d(ae),{justify:"end"},{default:u(()=>[c(d(F),{onClick:V},{default:u(()=>[...a[27]||(a[27]=[h("取消",-1)])]),_:1}),c(d(F),{type:"primary",loading:P.value===`import-${T.value}`,onClick:J},{default:u(()=>[...a[28]||(a[28]=[h(" 导入 ",-1)])]),_:1},8,["loading"])]),_:1})]),default:u(()=>[o("div",aP,[o("div",lP,m(_[T.value]),1),c(d(ne),{value:I.value,"onUpdate:value":a[4]||(a[4]=e=>I.value=e),placeholder:"可选:凭证名称,留空则自动生成"},null,8,["value"]),c(d(ke),{accept:".json","show-file-list":!1,"custom-request":W},{default:u(()=>[c(d(_e),{style:{padding:"12px 0"}},{default:u(()=>[o("div",tP,[c(d(R),{size:"18"},{default:u(()=>[c(d(na))]),_:1}),a[25]||(a[25]=o("span",{style:{"font-size":"13px"}},"上传 JSON 文件(如 auth.json),或直接在下方粘贴",-1))])]),_:1})]),_:1}),c(d(ne),{value:M.value,"onUpdate:value":a[5]||(a[5]=e=>M.value=e),type:"textarea",rows:10,placeholder:"粘贴 token JSON、auth.json 片段或该工具原生 OAuth 结构"},null,8,["value"]),a[26]||(a[26]=o("div",{class:"import-hint"}," Claude 支持 `claudeAiOauth`/token JSON,Codex 支持 `auth.json`,Gemini 支持 `access_token` 或 `token` 结构,OpenCode 支持 `providerId + oauth` 或 `auth.json` 片段。 ",-1))])]),_:1},8,["show"])],64))}},[["__scopeId","data-v-784304b2"]]),nP=["disabled"],oP=zl({__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,s=a,i=t(()=>l.disabled?"#6b7280":l.active?"#18a058":void 0);function r(){l.disabled||s("click")}return(a,l)=>(n(),g(d(ie),{placement:e.tooltipPlacement},{trigger:u(()=>[o("button",{class:p(["header-button",{active:e.active,disabled:e.disabled}]),disabled:e.disabled,onClick:r},[c(d(R),{size:e.iconSize,color:i.value},{default:u(()=>[(n(),g(P(e.icon)))]),_:1},8,["size","color"])],10,nP)]),default:u(()=>[A(a.$slots,"default",{},()=>[h(m(e.tooltip),1)],!0)]),_:3},8,["placement"]))}},[["__scopeId","data-v-b515354d"]]);async function iP(e=null){const a=e?{platform:e}:{};return(await ct.get("/env/check",{params:a})).data}const rP={class:"modal-header"},cP={class:"modal-content"},uP={class:"desc-text"},dP={class:"conflict-list"},pP={class:"list-header"},vP={key:0,class:"selected-hint"},mP={class:"conflict-items"},fP=["onClick"],yP={class:"item-content"},gP={class:"item-header"},hP={class:"var-name"},bP={class:"var-value"},wP={class:"var-source"},kP={class:"modal-footer"},_P=zl({__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 r=e,b=a,w=t({get:()=>r.visible,set:e=>b("update:visible",e)}),k=l(new Set),_=l(!1),C=t(()=>k.value.size),x=t(()=>r.conflicts.length>0&&k.value.size===r.conflicts.length),U=t(()=>k.value.size>0&&k.value.size<r.conflicts.length),P=t(()=>r.conflicts.length>0&&r.conflicts.every(e=>"process"===e.sourceType));function S(e){return`${e.varName}:${e.sourcePath}`}function z(e){return"process"===e.sourceType?"进程环境变量":e.sourcePath}function T(e){k.value=e?new Set(r.conflicts.map(S)):new Set}function I(){b("close")}function M(){b("ignore")}function A(){b("never-remind")}async function O(){const e=r.conflicts.filter(e=>k.value.has(S(e)));e.every(e=>"process"===e.sourceType)?Hs.warning("进程环境变量无法直接删除,请手动从 shell 配置文件中移除"):Gs.warning({title:"确认删除",content:`确定要删除选中的 ${e.length} 个环境变量吗?删除前会自动备份。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{_.value=!0;try{(await async function(e){return(await ct.post("/env/delete",{conflicts:e})).data}(e)).success&&(Hs.success("删除成功,备份已保存"),k.value=new Set,b("deleted"))}catch(a){Hs.error("删除失败: "+a.message)}finally{_.value=!1}}})}return(a,l)=>(n(),g(d(se),{show:w.value,"onUpdate:show":l[1]||(l[1]=e=>w.value=e),preset:"card",title:null,bordered:!1,closable:!0,"mask-closable":!1,style:{width:"560px","max-width":"90vw"},onClose:I},{header:u(()=>[o("div",rP,[c(d(R),{class:"warning-icon",size:22},{default:u(()=>[c(d(za))]),_:1}),l[2]||(l[2]=o("span",{class:"header-title"},"检测到环境变量冲突",-1))])]),footer:u(()=>[o("div",kP,[c(d(F),{tertiary:"",onClick:M},{default:u(()=>[...l[8]||(l[8]=[h(" 暂时忽略 ",-1)])]),_:1}),c(d(F),{tertiary:"",onClick:A},{default:u(()=>[...l[9]||(l[9]=[h(" 不再提醒 ",-1)])]),_:1}),P.value?i("",!0):(n(),g(d(F),{key:0,type:"error",disabled:0===C.value,loading:_.value,onClick:O},{default:u(()=>[h(" 删除选中 ("+m(C.value)+") ",1)]),_:1},8,["disabled","loading"]))])]),default:u(()=>[o("div",cP,[o("p",uP,[l[3]||(l[3]=h(" 发现 ",-1)),o("strong",null,m(e.conflicts.length),1),l[4]||(l[4]=h(" 个环境变量可能影响代理配置,建议清理后再使用代理功能。 ",-1))]),P.value?(n(),g(d(pe),{key:0,type:"info",bordered:!1,class:"process-env-alert"},{icon:u(()=>[c(d(R),null,{default:u(()=>[c(d(Ma))]),_:1})]),default:u(()=>[l[5]||(l[5]=o("div",{class:"alert-content"},[o("p",{class:"alert-title"},"这些环境变量来自当前进程,请按以下步骤处理:"),o("ol",{class:"alert-list"},[o("li",null,"检查对应 shell 配置文件(如 ~/.zshrc、~/.bashrc 或 PowerShell Profile)中是否有这些变量"),o("li",null,"如果有,删除或注释掉相关行"),o("li",null,[o("strong",null,"重启终端"),h(",然后重新运行 "),o("code",null,"ct")])]),o("p",{class:"alert-hint"},"如果配置文件中没有,可能是终端临时设置的,直接重启终端即可")],-1))]),_:1})):i("",!0),o("div",dP,[o("div",pP,[c(d(we),{checked:x.value,indeterminate:U.value,"onUpdate:checked":T},{default:u(()=>[...l[6]||(l[6]=[h(" 全选 ",-1)])]),_:1},8,["checked","indeterminate"]),C.value>0?(n(),s("span",vP," 已选 "+m(C.value)+" 项 ",1)):i("",!0)]),c(d(Te),{style:{"max-height":"280px"}},{default:u(()=>[o("div",mP,[(n(!0),s(f,null,y(e.conflicts,e=>{return n(),s("div",{key:S(e),class:p(["conflict-item",{selected:k.value.has(S(e))}]),onClick:a=>function(e){const a=S(e);k.value.has(a)?k.value.delete(a):k.value.add(a),k.value=new Set(k.value)}(e)},[c(d(we),{checked:k.value.has(S(e)),onClick:l[0]||(l[0]=v(()=>{},["stop"])),"onUpdate:checked":a=>function(e,a){const l=S(e);a?k.value.add(l):k.value.delete(l),k.value=new Set(k.value)}(e,a)},null,8,["checked","onUpdate:checked"]),o("div",yP,[o("div",gP,[o("code",hP,m(e.varName),1),c(d(H),{type:(a=e.platform,{claude:"warning",codex:"success",gemini:"info"}[a]||"default"),size:"tiny",bordered:!1},{default:u(()=>[h(m(e.platform),1)]),_:2},1032,["type"])]),o("div",bP,m(e.varValue),1),o("div",wP,[l[7]||(l[7]=o("span",{class:"source-label"},"来源:",-1)),h(" "+m(z(e)),1)])])],10,fP);var a}),128))])]),_:1})])])]),_:1},8,["show"]))}},[["__scopeId","data-v-7ea71ef7"]]);function CP(){const e=Lr(),{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 xP={class:"layout"},UP={class:"panel-security-auth"},PP={class:"header"},SP={class:"logo-wrapper"},zP=["alt"],TP={class:"nav-tabs"},IP={class:"header-actions"},MP={class:"env-warning-count"},AP={class:"favorites-button-wrapper"},OP={key:0,class:"favorites-badge"},$P={class:"more-menu-trigger","aria-label":"更多工具"},jP={class:"main-container"},LP={key:0,class:"global-loading-overlay"},EP={class:"left-content"},DP="coding-tool-x",NP=zl({__name:"Layout",setup(e){const{isDark:a,toggleTheme:r}=Vr(),{claudeProxy:v,codexProxy:f,geminiProxy:y,opencodeProxy:b,ompProxy:k,startProxy:_,stopProxy:U}=Kn(),{totalFavorites:S}=fi(),{loadDashboard:z}=CP(),T=D(),A=M(),O=[{label:"配置模板",key:"config-templates"},{label:"配置导入/导出",key:"config-export"},{label:"OAuth 凭证",key:"oauth"},{label:"渠道速度测试",key:"speed-test"},{type:"divider",key:"divider-1"},{label:"使用帮助",key:"help"},{label:"GitHub 仓库",key:"github"}],j=t(()=>A.name),L=t(()=>A.meta.channel||null),N=t(()=>A.path);C(L,e=>{e&&(te.value=!1)});const B=t(()=>L.value&&(Le.value||Ee.value&&$e.value)),H=l(!1),G=l(!1),q=l(!1),W=l(!1),V=l(!1),J=l(!1),Q=l(!1),Y=l(!1),X=l(!1),ee=l(!1),le=l(!1),te=l(!1),oe=l(!1),re=l(""),ce=l(!1),ue=l(""),de=l(!1),pe=l(""),ve=l(!1),me=l(""),fe=l(!1),ye=l(null),ge=l(null),he=l(null),we=l([]),ke=l(!1),_e=l(!1),Ce=l(!1),xe=l(""),Ue=l(""),Pe=l(!1),Se=t(()=>_e.value&&!Ce.value);function ze(){xe.value="",Ue.value="",Pe.value=!1}async function Te(){var e,a;if(xe.value){Pe.value=!0,Ue.value="";try{const e=await Pr(xe.value);e.success?(Ce.value=!0,ze()):Ue.value=e.error||"密码错误"}catch(l){Ue.value=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.error)||"密码错误"}finally{Pe.value=!1}}else Ue.value="请输入密码"}async function Ie(){try{const e=await iP();e.success&&(we.value=e.conflicts||[],0===we.value.length&&(ke.value=!1))}catch(e){}}function Me(){ke.value=!1}function Ae(){ke.value=!1,localStorage.setItem("envConflictNeverRemind","true")}const Oe=l(!1),$e=t(()=>"codex"===L.value?f.value.running:"gemini"===L.value?y.value.running:"opencode"===L.value?b.value.running:"omp"===L.value?k.value.running:v.value.running),je=t(()=>"codex"===L.value?f.value.loading:"gemini"===L.value?y.value.loading:"opencode"===L.value?b.value.loading:"omp"===L.value?k.value.loading:v.value.loading);const Le=l(!0),Ee=l(!0);function De(){T.push({name:"home"})}function Ne(e){"config-templates"!==e?"config-export"!==e?"oauth"!==e?"speed-test"!==e?"help"!==e?"github"===e&&window.open("https://github.com/ZeaoZhang/coding-tool","_blank"):Y.value=!0:J.value=!0:te.value=!0:le.value=!0:ee.value=!0}async function Be(e){var a,l;const t=L.value||"claude",s=function(e=L.value){return"codex"===e?f:"gemini"===e?y:"opencode"===e?b:"omp"===e?k:v}(t);s.value.loading=!0;try{let a;a=e?await _(t):await U(t,{refreshChannelsDrawer:!0}),!1!==a.success?(Hs.success(e?"代理已启动":"代理已停止"),e&&(Ee.value=!0),async function(){try{await Vs("panelVisibility","showChannels",Le.value),await Vs("panelVisibility","showLogs",Ee.value)}catch(e){}}()):Hs.error(a.error||"操作失败")}catch(n){Hs.error((null==(l=null==(a=n.response)?void 0:a.data)?void 0:l.error)||n.message||"操作失败")}finally{s.value.loading=!1}}function Re(e){const{showChannels:a,showLogs:l}=e.detail;Le.value=a,Ee.value=l}function Fe(e){var a;re.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",oe.value=!0}function He(e){te.value=!0}function Ge(e){var a;ue.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",ce.value=!0}function Ke(e){var a;pe.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",de.value=!0}function qe(e){var a;me.value=(null==(a=null==e?void 0:e.detail)?void 0:a.platform)||"",ve.value=!0}function We(){"opencode"===L.value&&(Q.value=!0)}function Ve({session:e,channel:a}){ye.value=e,ge.value=a,fe.value=!0,I(()=>{var e;null==(e=he.value)||e.open()})}return w(()=>{!async function(){Oe.value=!0;try{const e=await Ur();_e.value=Boolean((null==e?void 0:e.success)&&e.hasPassword),Ce.value=!_e.value,_e.value||ze()}catch(e){_e.value=!1,Ce.value=!0,ze()}finally{Oe.value=!1}}(),async function(){var e,a;try{const l=await z();l&&l.uiConfig&&(Le.value=!1!==(null==(e=l.uiConfig.panelVisibility)?void 0:e.showChannels),Ee.value=!1!==(null==(a=l.uiConfig.panelVisibility)?void 0:a.showLogs))}catch(l){}}(),window.addEventListener("panel-visibility-change",Re),window.addEventListener("open-skills-drawer",Fe),window.addEventListener("open-commands-drawer",Ge),window.addEventListener("open-agents-drawer",Ke),window.addEventListener("open-plugins-drawer",qe),window.addEventListener("open-gateway-convert-drawer",We),window.addEventListener("open-oauth-credentials-drawer",He),async function(){var e;try{const a=await iP();a.success&&(null==(e=a.conflicts)?void 0:e.length)>0&&(we.value=a.conflicts,"true"!==localStorage.getItem("envConflictNeverRemind")&&(ke.value=!0))}catch(a){}}()}),x(()=>{window.removeEventListener("panel-visibility-change",Re),window.removeEventListener("open-skills-drawer",Fe),window.removeEventListener("open-commands-drawer",Ge),window.removeEventListener("open-agents-drawer",Ke),window.removeEventListener("open-plugins-drawer",qe),window.removeEventListener("open-gateway-convert-drawer",We),window.removeEventListener("open-oauth-credentials-drawer",He)}),C(()=>L.value,e=>{"opencode"!==e&&Q.value&&(Q.value=!1)}),(e,l)=>{const t=E("router-view");return n(),s("div",xP,[c(_P,{visible:ke.value,"onUpdate:visible":l[0]||(l[0]=e=>ke.value=e),conflicts:we.value,onDeleted:Ie,onClose:l[1]||(l[1]=e=>ke.value=!1),onIgnore:Me,onNeverRemind:Ae},null,8,["visible","conflicts"]),c(d(se),{show:Se.value,preset:"card",title:"验证访问密码","mask-closable":!1,"close-on-esc":!1,closable:!1,style:{width:"460px","max-width":"92vw"}},{default:u(()=>[o("div",UP,[c(d(K),{depth:"3",style:{"font-size":"13px"}},{default:u(()=>[...l[34]||(l[34]=[h(" 请输入访问密码后进入面板 ",-1)])]),_:1}),c(d(ne),{value:xe.value,"onUpdate:value":l[2]||(l[2]=e=>xe.value=e),type:"password",placeholder:"访问密码","show-password-on":"click",autofocus:"",onKeydown:$(Te,["enter"])},null,8,["value"]),Ue.value?(n(),g(d(K),{key:0,depth:"3",class:"panel-security-error"},{default:u(()=>[h(m(Ue.value),1)]),_:1})):i("",!0),c(d(K),{depth:"3",class:"panel-security-hint"},{default:u(()=>[l[36]||(l[36]=h(" 忘记密码可在终端执行 ",-1)),c(d(K),{code:""},{default:u(()=>[...l[35]||(l[35]=[h("ctx security reset",-1)])]),_:1}),l[37]||(l[37]=h(" 关闭密码 ",-1))]),_:1}),c(d(ae),{justify:"end",style:{"margin-top":"16px"}},{default:u(()=>[c(d(F),{type:"primary",loading:Pe.value,onClick:Te},{default:u(()=>[...l[38]||(l[38]=[h(" 验证 ",-1)])]),_:1},8,["loading"])]),_:1})])]),_:1},8,["show"]),o("header",PP,[o("div",{class:"logo-section",onClick:De},[o("div",SP,[o("img",{src:"/logo.png",alt:`${DP} logo`,class:"logo-image"},null,8,zP)]),o("div",{class:"title-group"},[o("h1",{class:"title-main"},m(DP)),l[39]||(l[39]=o("span",{class:"title-sub"},"AI 编程工作台",-1))])]),o("div",TP,[o("div",{class:p(["nav-tab",{active:"home"===j.value}]),onClick:l[3]||(l[3]=e=>d(T).push({name:"home"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(ol))]),_:1}),l[40]||(l[40]=o("span",{class:"nav-label"},"Home",-1))],2),o("div",{class:p(["nav-tab",{active:"claude"===L.value}]),onClick:l[4]||(l[4]=e=>d(T).push({name:"claude-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(ia))]),_:1}),l[41]||(l[41]=o("span",{class:"nav-label"},"Claude",-1))],2),o("div",{class:p(["nav-tab",{active:"codex"===L.value}]),onClick:l[5]||(l[5]=e=>d(T).push({name:"codex-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(ra))]),_:1}),l[42]||(l[42]=o("span",{class:"nav-label"},"Codex",-1))],2),o("div",{class:p(["nav-tab",{active:"gemini"===L.value}]),onClick:l[6]||(l[6]=e=>d(T).push({name:"gemini-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(ca))]),_:1}),l[43]||(l[43]=o("span",{class:"nav-label"},"Gemini",-1))],2),o("div",{class:p(["nav-tab",{active:"opencode"===L.value}]),onClick:l[7]||(l[7]=e=>d(T).push({name:"opencode-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(Je))]),_:1}),l[44]||(l[44]=o("span",{class:"nav-label"},"OpenCode",-1))],2),o("div",{class:p(["nav-tab",{active:"omp"===L.value}]),onClick:l[8]||(l[8]=e=>d(T).push({name:"omp-projects"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(ba))]),_:1}),l[45]||(l[45]=o("span",{class:"nav-label"},"OMP",-1))],2),o("div",{class:p(["nav-tab",{active:"analytics"===j.value}]),onClick:l[9]||(l[9]=e=>d(T).push({name:"analytics"}))},[c(d(R),{size:18,class:"nav-icon"},{default:u(()=>[c(d(il))]),_:1}),l[46]||(l[46]=o("span",{class:"nav-label"},"Analytics",-1))],2)]),o("div",IP,[we.value.length>0?(n(),g(d(ie),{key:0,trigger:"hover"},{trigger:u(()=>[o("div",{class:"env-warning-btn",onClick:l[10]||(l[10]=e=>ke.value=!0)},[c(d(R),{size:18,class:"env-warning-icon"},{default:u(()=>[c(d(za))]),_:1}),o("span",MP,m(we.value.length),1)])]),default:u(()=>[h(" 检测到 "+m(we.value.length)+" 个环境变量冲突,点击查看 ",1)]),_:1})):i("",!0),c(oP,{icon:d(a)?d(Ua):d(Pa),tooltip:d(a)?"切换到亮色主题":"切换到暗色主题",onClick:d(r)},null,8,["icon","tooltip","onClick"]),l[47]||(l[47]=o("div",{class:"header-divider"},null,-1)),o("div",AP,[c(oP,{icon:d(rl),tooltip:`我的收藏 (${d(S)})`,onClick:l[11]||(l[11]=e=>G.value=!0)},null,8,["icon","tooltip"]),d(S)>0?(n(),s("div",OP,m(d(S)),1)):i("",!0)]),c(oP,{icon:d(Wa),tooltip:"工作区管理",onClick:l[12]||(l[12]=e=>X.value=!0)},null,8,["icon"]),c(oP,{icon:d(cl),tooltip:"Prompts 管理",onClick:l[13]||(l[13]=e=>V.value=!0)},null,8,["icon"]),c(oP,{icon:d(Oa),tooltip:"MCP 服务器管理",onClick:l[14]||(l[14]=e=>W.value=!0)},null,8,["icon"]),c(oP,{icon:d(xa),tooltip:"设置",onClick:l[15]||(l[15]=e=>q.value=!0)},null,8,["icon"]),c(d(be),{trigger:"click",placement:"bottom-end",options:O,onSelect:Ne},{default:u(()=>[o("div",$P,[c(oP,{icon:d(ul),tooltip:"更多工具"},null,8,["icon"])])]),_:1})])]),o("div",jP,[Oe.value?(n(),s("div",LP,[c(d(Z),{size:"large"},{description:u(()=>[...l[48]||(l[48]=[h(" 加载配置中... ",-1)])]),_:1})])):i("",!0),o("div",EP,[c(t,null,{default:u(({Component:e})=>[(n(),g(P(e),{key:N.value}))]),_:1})]),B.value?(n(),g(To,{key:1,"show-channels":Le.value,"show-logs":Ee.value,"proxy-running":$e.value,"proxy-loading":je.value,onProxyToggle:Be,onShowRecent:l[16]||(l[16]=e=>H.value=!0)},null,8,["show-channels","show-logs","proxy-running","proxy-loading"])):i("",!0)]),c(ci,{visible:H.value,"onUpdate:visible":l[17]||(l[17]=e=>H.value=e),channel:L.value},null,8,["visible","channel"]),c(Ei,{visible:G.value,"onUpdate:visible":l[18]||(l[18]=e=>G.value=e),onViewHistory:Ve},null,8,["visible"]),ye.value?(n(),g(hr,{key:0,ref_key:"chatHistoryRef",ref:he,show:fe.value,"onUpdate:show":l[19]||(l[19]=e=>fe.value=e),"project-name":ye.value.projectName,"session-id":ye.value.sessionId,"session-alias":ye.value.alias,channel:ge.value},null,8,["show","project-name","session-id","session-alias","channel"])):i("",!0),c(Dd,{visible:q.value,"onUpdate:visible":l[20]||(l[20]=e=>q.value=e)},null,8,["visible"]),c(Zv,{visible:W.value,"onUpdate:visible":l[21]||(l[21]=e=>W.value=e)},null,8,["visible"]),c(Hm,{visible:V.value,"onUpdate:visible":l[22]||(l[22]=e=>V.value=e)},null,8,["visible"]),c(Tf,{visible:J.value,"onUpdate:visible":l[23]||(l[23]=e=>J.value=e)},null,8,["visible"]),"opencode"===L.value?(n(),g(Kf,{key:1,visible:Q.value,"onUpdate:visible":l[24]||(l[24]=e=>Q.value=e)},null,8,["visible"])):i("",!0),c(ox,{visible:X.value,"onUpdate:visible":l[25]||(l[25]=e=>X.value=e)},null,8,["visible"]),c(vU,{visible:ee.value,"onUpdate:visible":l[26]||(l[26]=e=>ee.value=e)},null,8,["visible"]),c(UU,{visible:le.value,"onUpdate:visible":l[27]||(l[27]=e=>le.value=e)},null,8,["visible"]),c(sP,{visible:te.value,"onUpdate:visible":l[28]||(l[28]=e=>te.value=e)},null,8,["visible"]),c(Yg,{visible:oe.value,"onUpdate:visible":l[29]||(l[29]=e=>oe.value=e),platform:re.value},null,8,["visible","platform"]),c(Nb,{visible:ce.value,"onUpdate:visible":l[30]||(l[30]=e=>ce.value=e),platform:ue.value},null,8,["visible","platform"]),c(_k,{visible:de.value,"onUpdate:visible":l[31]||(l[31]=e=>de.value=e),platform:pe.value},null,8,["visible","platform"]),c(lC,{visible:ve.value,"onUpdate:visible":l[32]||(l[32]=e=>ve.value=e),platform:me.value},null,8,["visible","platform"]),c(d(se),{show:Y.value,"onUpdate:show":l[33]||(l[33]=e=>Y.value=e),preset:"card",title:`${DP} 使用帮助`,style:{width:"800px","max-width":"90vw"}},{default:u(()=>[o("div",{class:"help-content"},[o("div",{class:"help-section"},[l[49]||(l[49]=o("h4",null,"[START] 快速开始",-1)),o("p",null,m(DP)+" 是面向 Claude Code、Codex、Gemini 和 OpenCode 的统一 AI 编程工作台,提供会话管理、动态渠道切换、全局搜索与实时监控能力。"),l[50]||(l[50]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"[STAR] 最简单的启动方式:",-1)),l[51]||(l[51]=o("div",{style:{background:"var(--bg-primary)",padding:"12px","border-radius":"6px",margin:"8px 0","border-left":"3px solid #18a058"}},[o("p",{style:{margin:"0","font-family":"'Courier New', monospace","font-size":"13px","font-weight":"600",color:"var(--primary-color)"}},"ctx start"),o("p",{style:{margin:"4px 0 0 0","font-size":"12px",color:"var(--text-secondary)"}},[h("• 后台启动所有服务"),o("br"),h("• 可以关闭终端窗口"),o("br"),h("• 代理服务保持运行")])],-1)),l[52]||(l[52]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"[LOG] 日常工作流:",-1)),l[53]||(l[53]=o("div",{style:{"font-size":"12px","line-height":"1.8",color:"var(--text-secondary)"}},[o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx start"),h(" 启动服务"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx status"),h(" 查看状态"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx logs"),h(" 查看日志"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px","border-radius":"3px",color:"var(--primary-color)"}},"ctx stop"),h(" 停止服务 ")],-1))]),l[62]||(l[62]=o("div",{class:"help-section"},[o("h4",null,"[AI] 支持的 AI 工具"),o("ul",null,[o("li",null,[o("strong",null,"Claude Code"),h(":Anthropic 官方命令行工具,支持 Claude 系列模型")]),o("li",null,[o("strong",null,"Codex"),h(":支持 OpenAI GPT 系列和 Claude 模型(通过 OpenAI 兼容格式)")]),o("li",null,[o("strong",null,"Gemini"),h(":支持 Google Gemini 系列模型")])])],-1)),l[63]||(l[63]=o("div",{class:"help-section"},[o("h4",null,"[LOG] 命令行用法"),o("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"[START] 服务管理"),o("div",{class:"command-list"},[o("div",{class:"command-item"},[o("code",null,"ctx start"),o("span",null,"后台启动所有服务(推荐)")]),o("div",{class:"command-item"},[o("code",null,"ctx stop"),o("span",null,"停止所有服务")]),o("div",{class:"command-item"},[o("code",null,"ctx restart"),o("span",null,"重启所有服务")]),o("div",{class:"command-item"},[o("code",null,"ctx status"),o("span",null,"查看服务状态")])]),o("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"[PROXY] 代理管理"),o("div",{class:"command-list"},[o("div",{class:"command-item"},[o("code",null,"ctx claude start"),o("span",null,"启动 Claude 代理")]),o("div",{class:"command-item"},[o("code",null,"ctx codex start"),o("span",null,"启动 Codex 代理")]),o("div",{class:"command-item"},[o("code",null,"ctx gemini start"),o("span",null,"启动 Gemini 代理")]),o("div",{class:"command-item"},[o("code",null,"ctx claude stop"),o("span",null,"停止指定代理(支持 stop/restart/status)")])]),o("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"[LOG] 日志管理"),o("div",{class:"command-list"},[o("div",{class:"command-item"},[o("code",null,"ctx logs"),o("span",null,"查看所有日志")]),o("div",{class:"command-item"},[o("code",null,"ctx logs claude"),o("span",null,"查看 Claude 日志(支持 ui/codex/gemini)")]),o("div",{class:"command-item"},[o("code",null,"ctx logs --follow"),o("span",null,"实时跟踪日志")]),o("div",{class:"command-item"},[o("code",null,"ctx logs --clear"),o("span",null,"清空日志")])]),o("h5",{style:{margin:"16px 0 8px 0","font-size":"14px",color:"var(--primary-color)"}},"[STATS] 其他命令"),o("div",{class:"command-list"},[o("div",{class:"command-item"},[o("code",null,"ctx stats"),o("span",null,"查看统计信息")]),o("div",{class:"command-item"},[o("code",null,"ctx doctor"),o("span",null,"系统诊断")]),o("div",{class:"command-item"},[o("code",null,"ctx -h"),o("span",null,"完整帮助")])])],-1)),l[64]||(l[64]=o("div",{class:"help-section"},[o("h4",null,"[TARGET] Web UI 功能"),o("ul",null,[o("li",null,[o("strong",null,"多类型支持"),h(":统一管理 Claude Code、Codex、Gemini 三种工具的项目和会话")]),o("li",null,[o("strong",null,"项目管理"),h(":查看所有项目,支持拖拽排序、搜索过滤、删除项目")]),o("li",null,[o("strong",null,"会话管理"),h(":查看项目会话列表,支持搜索、Fork、删除、重命名")]),o("li",null,[o("strong",null,"快速启动"),h(":点击会话可直接复制对应 AI 工具启动命令")]),o("li",null,[o("strong",null,"动态切换"),h(":每种工具独立的渠道管理,可在右侧面板快速切换 API 渠道")]),o("li",null,[o("strong",null,"实时日志"),h(":查看各类型代理的实时请求日志、token 消耗和成本统计")]),o("li",null,[o("strong",null,"全局搜索"),h(":使用 "),o("kbd",null,"Cmd/Ctrl"),h(" + "),o("kbd",null,"K"),h(" 在所有项目中搜索对话内容")])])],-1)),l[65]||(l[65]=o("div",{class:"help-section"},[o("h4",null,"[BOLT] 代理服务与渠道管理"),o("p",null,"每种 AI 工具都有独立的代理服务和渠道配置:"),o("ul",null,[o("li",null,[o("strong",null,"Claude 代理"),h(":端口 20088,支持 Anthropic API 格式")]),o("li",null,[o("strong",null,"Codex 代理"),h(":端口 20089,支持 OpenAI API 格式(兼容 Claude)")]),o("li",null,[o("strong",null,"Gemini 代理"),h(":端口 20090,支持 Gemini API 格式")])]),o("p",null,"在 Dashboard 或各工具详情页,可以添加多个渠道并快速切换,无需修改配置文件或重启工具。")],-1)),o("div",{class:"help-section"},[l[54]||(l[54]=o("h4",null,"[STAR] 后台启动与开机自启",-1)),l[55]||(l[55]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"后台启动服务",-1)),l[56]||(l[56]=o("p",{style:{"font-size":"12px","line-height":"1.8"}},[h("使用 "),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx start"),h(" 命令后台启动所有服务,可以安全关闭终端窗口而不影响代理服务的运行。")],-1)),l[57]||(l[57]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"配置开机自启(可选)",-1)),l[58]||(l[58]=o("p",{style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px 0"}},"第一次启用开机自启只需三个步骤:",-1)),l[59]||(l[59]=o("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)"}},[h(" # 第 1 步:启用 PM2 开机自启"),o("br"),o("span",{style:{color:"var(--primary-color)"}},"pm2 startup"),o("br"),o("br"),h(" # 第 2 步:保存配置"),o("br"),o("span",{style:{color:"var(--primary-color)"}},"pm2 save"),o("br"),o("br"),h(" # 第 3 步:重启电脑,服务自动启动 [v] ")],-1)),l[60]||(l[60]=o("h5",{style:{margin:"12px 0 8px 0","font-size":"13px",color:"#18a058"}},"相关命令",-1)),l[61]||(l[61]=o("div",{style:{"font-size":"12px",color:"var(--text-secondary)","line-height":"1.8"}},[o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx start"),h(" 后台启动"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx status"),h(" 查看状态"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"ctx logs"),h(" 查看日志"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"pm2 list"),h(" 查看所有后台进程"),o("br"),o("code",{style:{background:"var(--bg-primary)",padding:"2px 6px"}},"pm2 unstartup"),h(" 禁用开机自启 ")],-1)),o("p",{style:{color:"#18a058","font-size":"12px","margin-top":"8px"}},"[TIP] 提示:配置开机自启后,重启电脑时 "+m(DP)+" 会自动启动,无需手动运行命令。")]),l[66]||(l[66]=o("div",{class:"help-section"},[o("h4",null,"[LINK] 相关链接"),o("div",{class:"link-list"},[o("a",{href:"https://github.com/ZeaoZhang/coding-tool",target:"_blank"},"GitHub 仓库"),o("a",{href:"https://github.com/ZeaoZhang/coding-tool/issues",target:"_blank"},"问题反馈")])],-1))])]),_:1},8,["show","title"])])}}},[["__scopeId","data-v-50daf587"]]),BP=N({__name:"App",setup(e){const{isDark:a,loadTheme:l}=Vr(),s=t(()=>a.value?V:null),o=t(()=>a.value?{common:{primaryColor:"#18a058",primaryColorHover:"#1db165",primaryColorPressed:"#0c7a43",fontFamily:'"SF Pro Display", "SF Pro Text", "Segoe UI Variable Display", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif',fontFamilyMono:'"SF Mono", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace',borderRadius:"16px",borderRadiusSmall:"12px",bodyColor:"#0a1116",cardColor:"#121b22",modalColor:"#121b22",popoverColor:"#121b22",tableColor:"#121b22",inputColor:"#16222a",codeColor:"#0d171d",tabColor:"#121b22",actionColor:"#16222a",tableHeaderColor:"#16222a",hoverColor:"rgba(255, 255, 255, 0.08)",pressedColor:"rgba(255, 255, 255, 0.12)",borderColor:"#263740",dividerColor:"#263740"},Drawer:{color:"#121b22",headerColor:"#121b22",footerColor:"#121b22"},Modal:{color:"#121b22",boxShadow:"0 24px 64px rgba(0, 0, 0, 0.42)"},Card:{color:"#121b22",borderColor:"#263740"},Popover:{color:"#121b22",textColor:"#edf5f4",boxShadow:"0 20px 48px rgba(0, 0, 0, 0.34)"},Tooltip:{color:"#121b22",textColor:"#edf5f4",boxShadow:"0 20px 48px rgba(0, 0, 0, 0.34)"},Dialog:{color:"#121b22"},Button:{borderRadiusMedium:"12px"},Input:{borderRadius:"12px"}}:{common:{primaryColor:"#18a058",primaryColorHover:"#1db165",primaryColorPressed:"#0c7a43",fontFamily:'"SF Pro Display", "SF Pro Text", "Segoe UI Variable Display", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif',fontFamilyMono:'"SF Mono", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace',borderRadius:"16px",borderRadiusSmall:"12px",bodyColor:"#f4f7f8",cardColor:"#ffffff",modalColor:"#ffffff",popoverColor:"#ffffff",tableColor:"#ffffff",inputColor:"#f7faf8",codeColor:"#edf3f1",tabColor:"#ffffff",actionColor:"#f7faf8",tableHeaderColor:"#edf3f1",hoverColor:"rgba(24, 160, 88, 0.08)",pressedColor:"rgba(24, 160, 88, 0.12)",borderColor:"#d8e1de",dividerColor:"#d8e1de"},Modal:{color:"#ffffff",boxShadow:"0 24px 64px rgba(15, 23, 29, 0.16)"},Card:{color:"#ffffff",borderColor:"#d8e1de"},Popover:{color:"#ffffff",textColor:"#122025",boxShadow:"0 18px 42px rgba(15, 23, 29, 0.12)"},Tooltip:{color:"rgba(18, 32, 37, 0.94)",textColor:"#f7faf8",boxShadow:"0 18px 42px rgba(15, 23, 29, 0.18)"},Drawer:{color:"#ffffff",headerColor:"#ffffff",footerColor:"#ffffff"},Button:{borderRadiusMedium:"12px"},Input:{borderRadius:"12px"}});return w(()=>{l()}),(e,a)=>(n(),g(d(Ee),{theme:s.value,"theme-overrides":o.value},{default:u(()=>[c(d(je),null,{default:u(()=>[c(d(Le),null,{default:u(()=>[c(NP)]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"]))}}),RP=B();BP.use(RP),BP.use(Sl),BP.mount("#app"),function(){if(rn)return;const e=on();e.connectWebSocket(),queueMicrotask(()=>{const a=()=>{e.loadChannels(),e.loadAdvancedConfig()};"undefined"==typeof window||"function"!=typeof window.requestIdleCallback?setTimeout(a,0):window.requestIdleCallback(a,{timeout:1e3})}),rn=!0}();export{li as A,pU as B,hr as C,wr as D,Bn as E,Nn as F,Rn as G,aC as P,ci as R,Qg as S,nx as W,zl as _,Ws as a,Kn as b,CP as c,Cr as d,$n as e,jn as f,Ks as g,Ln as h,En as i,Dn as j,mt as k,Ct as l,It as m,Kt as n,as as o,xr as p,Pi as q,Fo as r,qs as s,Hs as t,Vs as u,Gs as v,Qo as w,ei as x,fi as y,Zo as z};
|