import{r as w,aR as Pe,o as O,V as ze,x as n,y as a,z as e,L as b,K as g,al as _e,aY as $e,aX as ce,aq as M,aZ as Ee,C as K,O as $,c as ne,P as x,I as oe,a5 as Te,q as De,an as Q,Q as ie,ac as ue,R as he,u as Y,Y as Oe,B as Ce}from"./vue-vendor-CKToUHZx.js";import{s as h}from"./toast-BvwA7Mwb.js";import{a as V,_ as We}from"./index-BFtKxwt4.js";import"./element-plus-B8Fs_0jW.js";import"./vendor-BDiMbLwQ.js";const ke=w(!1),Se=w({title:"",message:"",confirmText:"继续",cancelText:"取消"}),le=w(null);function Ke(){return{showConfirmModal:ke,confirmOptions:Se,showConfirm:(C,u,G="继续",j="取消")=>new Promise(U=>{Se.value={title:C,message:u,confirmText:G,cancelText:j},le.value=U,ke.value=!0}),handleConfirm:()=>{ke.value=!1,le.value&&(le.value(!0),le.value=null)},handleCancel:()=>{ke.value=!1,le.value&&(le.value(!1),le.value=null)}}}const Le=Pe("accounts",()=>{const z=w([]),W=w([]),p=w([]),C=w(!1),u=w(null),G=w(""),j=w("asc"),U=async()=>{C.value=!0,u.value=null;try{const f=await V.get("/admin/claude-accounts");if(f.success)z.value=f.data||[];else throw new Error(f.message||"获取Claude账户失败")}catch(f){throw u.value=f.message,f}finally{C.value=!1}},k=async()=>{C.value=!0,u.value=null;try{const f=await V.get("/admin/claude-console-accounts");if(f.success)W.value=f.data||[];else throw new Error(f.message||"获取Claude Console账户失败")}catch(f){throw u.value=f.message,f}finally{C.value=!1}},y=async()=>{C.value=!0,u.value=null;try{const f=await V.get("/admin/gemini-accounts");if(f.success)p.value=f.data||[];else throw new Error(f.message||"获取Gemini账户失败")}catch(f){throw u.value=f.message,f}finally{C.value=!1}};return{claudeAccounts:z,claudeConsoleAccounts:W,geminiAccounts:p,loading:C,error:u,sortBy:G,sortOrder:j,fetchClaudeAccounts:U,fetchClaudeConsoleAccounts:k,fetchGeminiAccounts:y,fetchAllAccounts:async()=>{C.value=!0,u.value=null;try{await Promise.all([U(),k(),y()])}catch(f){throw u.value=f.message,f}finally{C.value=!1}},createClaudeAccount:async f=>{C.value=!0,u.value=null;try{const m=await V.post("/admin/claude-accounts",f);if(m.success)return await U(),m.data;throw new Error(m.message||"创建Claude账户失败")}catch(m){throw u.value=m.message,m}finally{C.value=!1}},createClaudeConsoleAccount:async f=>{C.value=!0,u.value=null;try{const m=await V.post("/admin/claude-console-accounts",f);if(m.success)return await k(),m.data;throw new Error(m.message||"创建Claude Console账户失败")}catch(m){throw u.value=m.message,m}finally{C.value=!1}},createGeminiAccount:async f=>{C.value=!0,u.value=null;try{const m=await V.post("/admin/gemini-accounts",f);if(m.success)return await y(),m.data;throw new Error(m.message||"创建Gemini账户失败")}catch(m){throw u.value=m.message,m}finally{C.value=!1}},updateClaudeAccount:async(f,m)=>{C.value=!0,u.value=null;try{const T=await V.put(`/admin/claude-accounts/${f}`,m);if(T.success)return await U(),T;throw new Error(T.message||"更新Claude账户失败")}catch(T){throw u.value=T.message,T}finally{C.value=!1}},updateClaudeConsoleAccount:async(f,m)=>{C.value=!0,u.value=null;try{const T=await V.put(`/admin/claude-console-accounts/${f}`,m);if(T.success)return await k(),T;throw new Error(T.message||"更新Claude Console账户失败")}catch(T){throw u.value=T.message,T}finally{C.value=!1}},updateGeminiAccount:async(f,m)=>{C.value=!0,u.value=null;try{const T=await V.put(`/admin/gemini-accounts/${f}`,m);if(T.success)return await y(),T;throw new Error(T.message||"更新Gemini账户失败")}catch(T){throw u.value=T.message,T}finally{C.value=!1}},toggleAccount:async(f,m)=>{C.value=!0,u.value=null;try{let T;f==="claude"?T=`/admin/claude-accounts/${m}/toggle`:f==="claude-console"?T=`/admin/claude-console-accounts/${m}/toggle`:T=`/admin/gemini-accounts/${m}/toggle`;const H=await V.put(T);if(H.success)return f==="claude"?await U():f==="claude-console"?await k():await y(),H;throw new Error(H.message||"切换状态失败")}catch(T){throw u.value=T.message,T}finally{C.value=!1}},deleteAccount:async(f,m)=>{C.value=!0,u.value=null;try{let T;f==="claude"?T=`/admin/claude-accounts/${m}`:f==="claude-console"?T=`/admin/claude-console-accounts/${m}`:T=`/admin/gemini-accounts/${m}`;const H=await V.delete(T);if(H.success)return f==="claude"?await U():f==="claude-console"?await k():await y(),H;throw new Error(H.message||"删除失败")}catch(T){throw u.value=T.message,T}finally{C.value=!1}},refreshClaudeToken:async f=>{C.value=!0,u.value=null;try{const m=await V.post(`/admin/claude-accounts/${f}/refresh`);if(m.success)return await U(),m;throw new Error(m.message||"Token刷新失败")}catch(m){throw u.value=m.message,m}finally{C.value=!1}},generateClaudeAuthUrl:async f=>{try{const m=await V.post("/admin/claude-accounts/generate-auth-url",f);if(m.success)return m.data;throw new Error(m.message||"生成授权URL失败")}catch(m){throw u.value=m.message,m}},exchangeClaudeCode:async f=>{try{const m=await V.post("/admin/claude-accounts/exchange-code",f);if(m.success)return m.data;throw new Error(m.message||"交换授权码失败")}catch(m){throw u.value=m.message,m}},generateGeminiAuthUrl:async f=>{try{const m=await V.post("/admin/gemini-accounts/generate-auth-url",f);if(m.success)return m.data;throw new Error(m.message||"生成授权URL失败")}catch(m){throw u.value=m.message,m}},exchangeGeminiCode:async f=>{try{const m=await V.post("/admin/gemini-accounts/exchange-code",f);if(m.success)return m.data;throw new Error(m.message||"交换授权码失败")}catch(m){throw u.value=m.message,m}},sortAccounts:f=>{G.value===f?j.value=j.value==="asc"?"desc":"asc":(G.value=f,j.value="asc")},reset:()=>{z.value=[],W.value=[],p.value=[],C.value=!1,u.value=null,G.value="",j.value="asc"}}}),qe={class:"space-y-4"},Be={class:"flex items-center justify-between"},Fe={class:"flex items-center cursor-pointer"},Ne={key:0,class:"bg-gray-50 p-4 rounded-lg border border-gray-200 space-y-4"},He={class:"grid grid-cols-2 gap-4"},Je={class:"space-y-4"},Ye={class:"flex items-center"},Qe={key:0,class:"grid grid-cols-2 gap-4"},Xe={class:"relative"},Ze=["type"],Me={__name:"ProxyConfig",props:{modelValue:{type:Object,default:()=>({enabled:!1,type:"socks5",host:"",port:"",username:"",password:""})}},emits:["update:modelValue"],setup(z,{emit:W}){const p=z,C=W,u=w({...p.modelValue}),G=w(!!(u.value.username||u.value.password)),j=w(!1);O(()=>p.modelValue,y=>{JSON.stringify(y)!==JSON.stringify(u.value)&&(u.value={...y},G.value=!!(y.username||y.password))},{deep:!0}),O(()=>u.value.enabled,y=>{k()}),O(()=>u.value.type,y=>{k()}),O(()=>u.value.host,y=>{k()}),O(()=>u.value.port,y=>{k()}),O(()=>u.value.username,y=>{k()}),O(()=>u.value.password,y=>{k()}),O(G,y=>{y||(u.value.username="",u.value.password="",k())});let U=null;function k(){U&&clearTimeout(U),U=setTimeout(()=>{const y={...u.value};G.value||(y.username="",y.password=""),C("update:modelValue",y)},100)}return ze(()=>{U&&clearTimeout(U)}),(y,c)=>(a(),n("div",qe,[e("div",Be,[c[9]||(c[9]=e("h4",{class:"text-sm font-semibold text-gray-700"}," 代理设置 (可选) ",-1)),e("label",Fe,[g(e("input",{"onUpdate:modelValue":c[0]||(c[0]=D=>u.value.enabled=D),type:"checkbox",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[_e,u.value.enabled]]),c[8]||(c[8]=e("span",{class:"ml-2 text-sm text-gray-700"},"启用代理",-1))])]),u.value.enabled?(a(),n("div",Ne,[c[17]||(c[17]=$e('
配置代理以访问受限的网络资源。支持 SOCKS5 和 HTTP 代理。
请确保代理服务器稳定可用,否则会影响账户的正常使用。
',1)),e("div",null,[c[11]||(c[11]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"代理类型",-1)),g(e("select",{"onUpdate:modelValue":c[1]||(c[1]=D=>u.value.type=D),class:"form-input w-full"},c[10]||(c[10]=[e("option",{value:"socks5"}," SOCKS5 ",-1),e("option",{value:"http"}," HTTP ",-1),e("option",{value:"https"}," HTTPS ",-1)]),512),[[ce,u.value.type]])]),e("div",He,[e("div",null,[c[12]||(c[12]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"主机地址",-1)),g(e("input",{"onUpdate:modelValue":c[2]||(c[2]=D=>u.value.host=D),type:"text",placeholder:"例如: 192.168.1.100",class:"form-input w-full"},null,512),[[M,u.value.host]])]),e("div",null,[c[13]||(c[13]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"端口",-1)),g(e("input",{"onUpdate:modelValue":c[3]||(c[3]=D=>u.value.port=D),type:"number",placeholder:"例如: 1080",class:"form-input w-full"},null,512),[[M,u.value.port]])])]),e("div",Je,[e("div",Ye,[g(e("input",{id:"proxyAuth","onUpdate:modelValue":c[4]||(c[4]=D=>G.value=D),type:"checkbox",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[_e,G.value]]),c[14]||(c[14]=e("label",{for:"proxyAuth",class:"ml-2 text-sm text-gray-700 cursor-pointer"}," 需要身份验证 ",-1))]),G.value?(a(),n("div",Qe,[e("div",null,[c[15]||(c[15]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"用户名",-1)),g(e("input",{"onUpdate:modelValue":c[5]||(c[5]=D=>u.value.username=D),type:"text",placeholder:"代理用户名",class:"form-input w-full"},null,512),[[M,u.value.username]])]),e("div",null,[c[16]||(c[16]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"密码",-1)),e("div",Xe,[g(e("input",{"onUpdate:modelValue":c[6]||(c[6]=D=>u.value.password=D),type:j.value?"text":"password",placeholder:"代理密码",class:"form-input w-full pr-10"},null,8,Ze),[[Ee,u.value.password]]),e("button",{type:"button",class:"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600",onClick:c[7]||(c[7]=D=>j.value=!j.value)},[e("i",{class:K(j.value?"fas fa-eye-slash":"fas fa-eye")},null,2)])])])])):b("",!0)]),c[18]||(c[18]=e("div",{class:"bg-blue-50 p-3 rounded-lg border border-blue-200"},[e("p",{class:"text-xs text-blue-700"},[e("i",{class:"fas fa-info-circle mr-1"}),e("strong",null,"提示:"),$("代理设置将用于所有与此账户相关的API请求。请确保代理服务器支持HTTPS流量转发。 ")])],-1))])):b("",!0)]))}},et={class:"space-y-6"},tt={key:0},st={class:"bg-blue-50 p-6 rounded-lg border border-blue-200"},lt={class:"flex items-start gap-4"},ot={class:"flex-1"},at={class:"space-y-4"},rt={class:"bg-white/80 rounded-lg p-4 border border-blue-300"},nt={class:"flex items-start gap-3"},it={class:"flex-1"},ut=["disabled"],dt={key:0,class:"fas fa-link mr-2"},pt={key:1,class:"loading-spinner mr-2"},mt={key:1,class:"space-y-3"},ct={class:"flex items-center gap-2"},ft=["value"],xt={class:"bg-white/80 rounded-lg p-4 border border-blue-300"},vt={class:"flex items-start gap-3"},yt={class:"flex-1"},gt={class:"space-y-3"},bt={key:1},wt={class:"bg-green-50 p-6 rounded-lg border border-green-200"},kt={class:"flex items-start gap-4"},ht={class:"flex-1"},$t={class:"space-y-4"},Ct={class:"bg-white/80 rounded-lg p-4 border border-green-300"},Tt={class:"flex items-start gap-3"},At={class:"flex-1"},Ut=["disabled"],It={key:0,class:"fas fa-link mr-2"},jt={key:1,class:"loading-spinner mr-2"},Vt={key:1,class:"space-y-3"},_t={class:"flex items-center gap-2"},St=["value"],Mt={class:"bg-white/80 rounded-lg p-4 border border-green-300"},Gt={class:"flex items-start gap-3"},Dt={class:"flex-1"},Kt={class:"space-y-3"},Lt={class:"flex gap-3 pt-4"},Rt=["disabled"],Pt={key:0,class:"loading-spinner mr-2"},zt={__name:"OAuthFlow",props:{platform:{type:String,required:!0},proxy:{type:Object,default:null}},emits:["success","back"],setup(z,{emit:W}){const p=z,C=W,u=Le(),G=w(!1),j=w(!1),U=w(""),k=w(""),y=w(!1),c=w(""),D=ne(()=>U.value&&k.value.trim());O(k,v=>{if(!v||typeof v!="string")return;const i=v.trim();if(!i)return;if(i.startsWith("http://")||i.startsWith("https://"))if(i.startsWith("http://localhost:45462"))try{const q=new URL(i).searchParams.get("code");q?(k.value=q,h("成功提取授权码!","success"),console.log("Successfully extracted authorization code from URL")):h("URL 中未找到授权码参数,请检查链接是否正确","error")}catch(N){console.error("Failed to parse URL:",N),h("链接格式错误,请检查是否为完整的 URL","error")}else if(p.platform==="gemini")try{const q=new URL(i).searchParams.get("code");q&&(k.value=q,h("成功提取授权码!","success"))}catch{}else h("请粘贴以 http://localhost:45462 开头的链接","error")});const S=async()=>{var v;G.value=!0;try{const i=(v=p.proxy)!=null&&v.enabled?{proxy:{type:p.proxy.type,host:p.proxy.host,port:parseInt(p.proxy.port),username:p.proxy.username||null,password:p.proxy.password||null}}:{};if(p.platform==="claude"){const R=await u.generateClaudeAuthUrl(i);U.value=R.authUrl,c.value=R.sessionId}else if(p.platform==="gemini"){const R=await u.generateGeminiAuthUrl(i);U.value=R.authUrl,c.value=R.sessionId}}catch(i){h(i.message||"生成授权链接失败","error")}finally{G.value=!1}},L=()=>{U.value="",k.value="",S()},F=async()=>{try{await navigator.clipboard.writeText(U.value),y.value=!0,h("链接已复制","success"),setTimeout(()=>{y.value=!1},2e3)}catch{const i=document.createElement("input");i.value=U.value,document.body.appendChild(i),i.select(),document.execCommand("copy"),document.body.removeChild(i),y.value=!0,h("链接已复制","success"),setTimeout(()=>{y.value=!1},2e3)}},l=async()=>{var v;if(D.value){j.value=!0;try{let i={};p.platform==="claude"?i={sessionId:c.value,callbackUrl:k.value.trim()}:p.platform==="gemini"&&(i={code:k.value.trim(),sessionId:c.value}),(v=p.proxy)!=null&&v.enabled&&(i.proxy={type:p.proxy.type,host:p.proxy.host,port:parseInt(p.proxy.port),username:p.proxy.username||null,password:p.proxy.password||null});let R;p.platform==="claude"?R=await u.exchangeClaudeCode(i):p.platform==="gemini"&&(R=await u.exchangeGeminiCode(i)),C("success",R)}catch(i){h(i.message||"授权失败,请检查授权码是否正确","error")}finally{j.value=!1}}};return(v,i)=>(a(),n("div",et,[z.platform==="claude"?(a(),n("div",tt,[e("div",st,[e("div",lt,[i[14]||(i[14]=e("div",{class:"w-10 h-10 bg-blue-500 rounded-lg flex items-center justify-center flex-shrink-0"},[e("i",{class:"fas fa-link text-white"})],-1)),e("div",ot,[i[12]||(i[12]=e("h4",{class:"font-semibold text-blue-900 mb-3"}," Claude 账户授权 ",-1)),i[13]||(i[13]=e("p",{class:"text-sm text-blue-800 mb-4"}," 请按照以下步骤完成 Claude 账户的授权: ",-1)),e("div",at,[e("div",rt,[e("div",nt,[i[5]||(i[5]=e("div",{class:"w-6 h-6 bg-blue-600 text-white rounded-full flex items-center justify-center text-xs font-bold flex-shrink-0"}," 1 ",-1)),e("div",it,[i[4]||(i[4]=e("p",{class:"font-medium text-blue-900 mb-2"}," 点击下方按钮生成授权链接 ",-1)),U.value?(a(),n("div",mt,[e("div",ct,[e("input",{type:"text",value:U.value,readonly:"",class:"form-input flex-1 text-xs font-mono bg-gray-50"},null,8,ft),e("button",{class:"px-3 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors",title:"复制链接",onClick:F},[e("i",{class:K(y.value?"fas fa-check text-green-500":"fas fa-copy")},null,2)])]),e("button",{class:"text-xs text-blue-600 hover:text-blue-700",onClick:L},i[3]||(i[3]=[e("i",{class:"fas fa-sync-alt mr-1"},null,-1),$("重新生成 ",-1)]))])):(a(),n("button",{key:0,disabled:G.value,class:"btn btn-primary px-4 py-2 text-sm",onClick:S},[G.value?(a(),n("div",pt)):(a(),n("i",dt)),$(" "+x(G.value?"生成中...":"生成授权链接"),1)],8,ut))])])]),i[11]||(i[11]=$e(' 2
在浏览器中打开链接并完成授权
请在新标签页中打开授权链接,登录您的 Claude 账户并授权。
注意: 如果您设置了代理,请确保浏览器也使用相同的代理访问授权页面。
',1)),e("div",xt,[e("div",vt,[i[10]||(i[10]=e("div",{class:"w-6 h-6 bg-blue-600 text-white rounded-full flex items-center justify-center text-xs font-bold flex-shrink-0"}," 3 ",-1)),e("div",yt,[i[8]||(i[8]=e("p",{class:"font-medium text-blue-900 mb-2"}," 输入 Authorization Code ",-1)),i[9]||(i[9]=e("p",{class:"text-sm text-blue-700 mb-3"},[$(" 授权完成后,页面会显示一个 "),e("strong",null,"Authorization Code"),$(",请将其复制并粘贴到下方输入框: ")],-1)),e("div",gt,[e("div",null,[i[6]||(i[6]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},[e("i",{class:"fas fa-key text-blue-500 mr-2"}),$("Authorization Code ")],-1)),g(e("textarea",{"onUpdate:modelValue":i[0]||(i[0]=R=>k.value=R),rows:"3",class:"form-input w-full resize-none font-mono text-sm",placeholder:"粘贴从Claude页面获取的Authorization Code..."},null,512),[[M,k.value]])]),i[7]||(i[7]=e("p",{class:"text-xs text-gray-500 mt-2"},[e("i",{class:"fas fa-info-circle mr-1"}),$(" 请粘贴从Claude页面复制的Authorization Code ")],-1))])])])])])])])])])):z.platform==="gemini"?(a(),n("div",bt,[e("div",wt,[e("div",kt,[i[26]||(i[26]=e("div",{class:"w-10 h-10 bg-green-500 rounded-lg flex items-center justify-center flex-shrink-0"},[e("i",{class:"fas fa-robot text-white"})],-1)),e("div",ht,[i[24]||(i[24]=e("h4",{class:"font-semibold text-green-900 mb-3"}," Gemini 账户授权 ",-1)),i[25]||(i[25]=e("p",{class:"text-sm text-green-800 mb-4"}," 请按照以下步骤完成 Gemini 账户的授权: ",-1)),e("div",$t,[e("div",Ct,[e("div",Tt,[i[17]||(i[17]=e("div",{class:"w-6 h-6 bg-green-600 text-white rounded-full flex items-center justify-center text-xs font-bold flex-shrink-0"}," 1 ",-1)),e("div",At,[i[16]||(i[16]=e("p",{class:"font-medium text-green-900 mb-2"}," 点击下方按钮生成授权链接 ",-1)),U.value?(a(),n("div",Vt,[e("div",_t,[e("input",{type:"text",value:U.value,readonly:"",class:"form-input flex-1 text-xs font-mono bg-gray-50"},null,8,St),e("button",{class:"px-3 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors",title:"复制链接",onClick:F},[e("i",{class:K(y.value?"fas fa-check text-green-500":"fas fa-copy")},null,2)])]),e("button",{class:"text-xs text-green-600 hover:text-green-700",onClick:L},i[15]||(i[15]=[e("i",{class:"fas fa-sync-alt mr-1"},null,-1),$("重新生成 ",-1)]))])):(a(),n("button",{key:0,disabled:G.value,class:"btn btn-primary px-4 py-2 text-sm",onClick:S},[G.value?(a(),n("div",jt)):(a(),n("i",It)),$(" "+x(G.value?"生成中...":"生成授权链接"),1)],8,Ut))])])]),i[23]||(i[23]=$e(' 2
在浏览器中打开链接并完成授权
请在新标签页中打开授权链接,登录您的 Gemini 账户并授权。
注意: 如果您设置了代理,请确保浏览器也使用相同的代理访问授权页面。
',1)),e("div",Mt,[e("div",Gt,[i[22]||(i[22]=e("div",{class:"w-6 h-6 bg-green-600 text-white rounded-full flex items-center justify-center text-xs font-bold flex-shrink-0"}," 3 ",-1)),e("div",Dt,[i[20]||(i[20]=e("p",{class:"font-medium text-green-900 mb-2"}," 输入 Authorization Code ",-1)),i[21]||(i[21]=e("p",{class:"text-sm text-green-700 mb-3"}," 授权完成后,页面会显示一个 Authorization Code,请将其复制并粘贴到下方输入框: ",-1)),e("div",Kt,[e("div",null,[i[18]||(i[18]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},[e("i",{class:"fas fa-key text-green-500 mr-2"}),$("Authorization Code ")],-1)),g(e("textarea",{"onUpdate:modelValue":i[1]||(i[1]=R=>k.value=R),rows:"3",class:"form-input w-full resize-none font-mono text-sm",placeholder:"粘贴从Gemini页面获取的Authorization Code..."},null,512),[[M,k.value]])]),i[19]||(i[19]=e("div",{class:"mt-2 space-y-1"},[e("p",{class:"text-xs text-gray-600"},[e("i",{class:"fas fa-check-circle text-green-500 mr-1"}),$(" 请粘贴从Gemini页面复制的Authorization Code ")])],-1))])])])])])])])])])):b("",!0),e("div",Lt,[e("button",{type:"button",class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors",onClick:i[2]||(i[2]=R=>v.$emit("back"))}," 上一步 "),e("button",{type:"button",disabled:!D.value||j.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold",onClick:l},[j.value?(a(),n("div",Pt)):b("",!0),$(" "+x(j.value?"验证中...":"完成授权"),1)],8,Rt)])]))}},Et={key:0,class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},Ot={class:"modal-content w-full max-w-md p-6 mx-auto"},Wt={class:"flex items-start gap-4 mb-6"},qt={class:"flex-1"},Bt={class:"text-lg font-bold text-gray-900 mb-2"},Ft={class:"text-gray-600 text-sm leading-relaxed whitespace-pre-line"},Nt={class:"flex gap-3"},Re={__name:"ConfirmModal",props:{show:{type:Boolean,required:!0},title:{type:String,default:""},message:{type:String,default:""},confirmText:{type:String,default:"继续"},cancelText:{type:String,default:"取消"}},emits:["confirm","cancel"],setup(z){return(W,p)=>(a(),oe(Te,{to:"body"},[z.show?(a(),n("div",Et,[e("div",Ot,[e("div",Wt,[p[2]||(p[2]=e("div",{class:"w-12 h-12 bg-gradient-to-br from-yellow-400 to-yellow-500 rounded-full flex items-center justify-center flex-shrink-0"},[e("i",{class:"fas fa-exclamation text-white text-xl"})],-1)),e("div",qt,[e("h3",Bt,x(z.title),1),e("p",Ft,x(z.message),1)])]),e("div",Nt,[e("button",{class:"flex-1 px-4 py-2.5 bg-gray-100 text-gray-700 rounded-xl font-medium hover:bg-gray-200 transition-colors",onClick:p[0]||(p[0]=C=>W.$emit("cancel"))},x(z.cancelText),1),e("button",{class:"flex-1 px-4 py-2.5 bg-gradient-to-r from-yellow-500 to-orange-500 text-white rounded-xl font-medium hover:from-yellow-600 hover:to-orange-600 transition-colors shadow-sm",onClick:p[1]||(p[1]=C=>W.$emit("confirm"))},x(z.confirmText),1)])])])):b("",!0)]))}},Ht={key:0,class:"fixed inset-0 modal z-50 flex items-center justify-center p-3 sm:p-4"},Jt={class:"modal-content w-full max-w-4xl p-4 sm:p-6 md:p-8 mx-auto max-h-[90vh] overflow-y-auto custom-scrollbar"},Yt={class:"flex items-center justify-between mb-4 sm:mb-6"},Qt={class:"mb-6"},Xt={key:0,class:"mb-6 p-4 bg-blue-50 rounded-lg border border-blue-200"},Zt={class:"space-y-4"},es={class:"flex gap-4"},ts={class:"flex items-center cursor-pointer"},ss={class:"flex items-center cursor-pointer"},ls={class:"flex gap-3"},os=["disabled"],as={key:0,class:"loading-spinner mr-2"},rs={class:"space-y-4"},ns={key:0,class:"text-center py-8"},is={key:1,class:"text-center py-8 bg-gray-50 rounded-lg"},us={key:2,class:"grid gap-4 grid-cols-1 md:grid-cols-2"},ds={class:"flex items-start justify-between mb-3"},ps={class:"flex-1"},ms={class:"font-semibold text-gray-900"},cs={class:"text-sm text-gray-500 mt-1"},fs={class:"flex items-center gap-2 ml-4"},xs={class:"flex items-center justify-between text-sm text-gray-600"},vs={class:"flex items-center gap-4"},ys={class:"flex items-center gap-2"},gs=["onClick"],bs=["disabled","onClick"],ws={key:1,class:"fixed inset-0 modal z-60 flex items-center justify-center p-3 sm:p-4"},ks={class:"modal-content w-full max-w-lg p-4 sm:p-6"},hs={class:"space-y-4"},$s={class:"px-3 py-2 bg-gray-100 rounded-lg text-sm text-gray-600"},Cs={class:"flex gap-3 pt-4"},Ts=["disabled"],As={key:0,class:"loading-spinner mr-2"},Us={__name:"GroupManagementModal",emits:["close","refresh"],setup(z,{emit:W}){const p=W,C=w(!0),u=w(!1),G=w([]),j=w(!1),U=w(!1),k=w({name:"",platform:"claude",description:""}),y=w(!1),c=w(!1),D=w(null),S=w({name:"",platform:"",description:""}),L=_=>_?new Date(_).toLocaleDateString("zh-CN"):"-",F=async()=>{u.value=!0;try{const _=await V.get("/admin/account-groups");G.value=_.data||[]}catch{h("加载分组列表失败","error")}finally{u.value=!1}},l=async()=>{var _,d;if(!k.value.name||!k.value.platform){h("请填写必填项","error");return}U.value=!0;try{await V.post("/admin/account-groups",{name:k.value.name,platform:k.value.platform,description:k.value.description}),h("分组创建成功","success"),v(),await F(),p("refresh")}catch(I){h(((d=(_=I.response)==null?void 0:_.data)==null?void 0:d.error)||"创建分组失败","error")}finally{U.value=!1}},v=()=>{j.value=!1,k.value={name:"",platform:"claude",description:""}},i=_=>{D.value=_,S.value={name:_.name,platform:_.platform,description:_.description||""},y.value=!0},R=async()=>{var _,d;if(!S.value.name){h("请填写分组名称","error");return}c.value=!0;try{await V.put(`/admin/account-groups/${D.value.id}`,{name:S.value.name,description:S.value.description}),h("分组更新成功","success"),N(),await F(),p("refresh")}catch(I){h(((d=(_=I.response)==null?void 0:_.data)==null?void 0:d.error)||"更新分组失败","error")}finally{c.value=!1}},N=()=>{y.value=!1,D.value=null,S.value={name:"",platform:"",description:""}},q=async _=>{var d,I;if(_.memberCount>0){h("分组内还有成员,无法删除","error");return}if(confirm(`确定要删除分组 "${_.name}" 吗?`))try{await V.delete(`/admin/account-groups/${_.id}`),h("分组删除成功","success"),await F(),p("refresh")}catch(se){h(((I=(d=se.response)==null?void 0:d.data)==null?void 0:I.error)||"删除分组失败","error")}};return De(()=>{F()}),(_,d)=>(a(),oe(Te,{to:"body"},[C.value?(a(),n("div",Ht,[e("div",Jt,[e("div",Yt,[d[9]||(d[9]=e("div",{class:"flex items-center gap-2 sm:gap-3"},[e("div",{class:"w-8 h-8 sm:w-10 sm:h-10 bg-gradient-to-br from-purple-500 to-purple-600 rounded-lg sm:rounded-xl flex items-center justify-center"},[e("i",{class:"fas fa-layer-group text-white text-sm sm:text-base"})]),e("h3",{class:"text-lg sm:text-xl font-bold text-gray-900"}," 账户分组管理 ")],-1)),e("button",{class:"text-gray-400 hover:text-gray-600 transition-colors p-1",onClick:d[0]||(d[0]=I=>_.$emit("close"))},d[8]||(d[8]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("div",Qt,[e("button",{class:"btn btn-primary px-4 py-2",onClick:d[1]||(d[1]=I=>j.value=!0)},d[10]||(d[10]=[e("i",{class:"fas fa-plus mr-2"},null,-1),$(" 创建新分组 ",-1)]))]),j.value?(a(),n("div",Xt,[d[16]||(d[16]=e("h4",{class:"text-lg font-semibold text-gray-900 mb-4"}," 创建新分组 ",-1)),e("div",Zt,[e("div",null,[d[11]||(d[11]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"分组名称 *",-1)),g(e("input",{"onUpdate:modelValue":d[2]||(d[2]=I=>k.value.name=I),type:"text",class:"form-input w-full",placeholder:"输入分组名称"},null,512),[[M,k.value.name]])]),e("div",null,[d[14]||(d[14]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"平台类型 *",-1)),e("div",es,[e("label",ts,[g(e("input",{"onUpdate:modelValue":d[3]||(d[3]=I=>k.value.platform=I),type:"radio",value:"claude",class:"mr-2"},null,512),[[Q,k.value.platform]]),d[12]||(d[12]=e("span",{class:"text-sm text-gray-700"},"Claude",-1))]),e("label",ss,[g(e("input",{"onUpdate:modelValue":d[4]||(d[4]=I=>k.value.platform=I),type:"radio",value:"gemini",class:"mr-2"},null,512),[[Q,k.value.platform]]),d[13]||(d[13]=e("span",{class:"text-sm text-gray-700"},"Gemini",-1))])])]),e("div",null,[d[15]||(d[15]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"描述 (可选)",-1)),g(e("textarea",{"onUpdate:modelValue":d[5]||(d[5]=I=>k.value.description=I),rows:"2",class:"form-input w-full resize-none",placeholder:"分组描述..."},null,512),[[M,k.value.description]])]),e("div",ls,[e("button",{class:"btn btn-primary px-4 py-2",disabled:!k.value.name||!k.value.platform||U.value,onClick:l},[U.value?(a(),n("div",as)):b("",!0),$(" "+x(U.value?"创建中...":"创建"),1)],8,os),e("button",{class:"btn btn-secondary px-4 py-2",onClick:v}," 取消 ")])])])):b("",!0),e("div",rs,[u.value?(a(),n("div",ns,d[17]||(d[17]=[e("div",{class:"loading-spinner-lg mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500"}," 加载中... ",-1)]))):G.value.length===0?(a(),n("div",is,d[18]||(d[18]=[e("i",{class:"fas fa-layer-group text-4xl text-gray-300 mb-4"},null,-1),e("p",{class:"text-gray-500"}," 暂无分组 ",-1)]))):(a(),n("div",us,[(a(!0),n(ie,null,ue(G.value,I=>(a(),n("div",{key:I.id,class:"bg-white rounded-lg border p-4 hover:shadow-md transition-shadow"},[e("div",ds,[e("div",ps,[e("h4",ms,x(I.name),1),e("p",cs,x(I.description||"暂无描述"),1)]),e("div",fs,[e("span",{class:K(["px-2 py-1 text-xs font-medium rounded-full",I.platform==="claude"?"bg-purple-100 text-purple-700":"bg-blue-100 text-blue-700"])},x(I.platform==="claude"?"Claude":"Gemini"),3)])]),e("div",xs,[e("div",vs,[e("span",null,[d[19]||(d[19]=e("i",{class:"fas fa-users mr-1"},null,-1)),$(" "+x(I.memberCount||0)+" 个成员 ",1)]),e("span",null,[d[20]||(d[20]=e("i",{class:"fas fa-clock mr-1"},null,-1)),$(" "+x(L(I.createdAt)),1)])]),e("div",ys,[e("button",{class:"text-blue-600 hover:text-blue-800 transition-colors",title:"编辑",onClick:se=>i(I)},d[21]||(d[21]=[e("i",{class:"fas fa-edit"},null,-1)]),8,gs),e("button",{class:"text-red-600 hover:text-red-800 transition-colors",title:"删除",disabled:I.memberCount>0,onClick:se=>q(I)},d[22]||(d[22]=[e("i",{class:"fas fa-trash"},null,-1)]),8,bs)])])]))),128))]))])])])):b("",!0),y.value?(a(),n("div",ws,[e("div",ks,[e("div",{class:"flex items-center justify-between mb-4"},[d[24]||(d[24]=e("h3",{class:"text-lg font-bold text-gray-900"}," 编辑分组 ",-1)),e("button",{class:"text-gray-400 hover:text-gray-600 transition-colors",onClick:N},d[23]||(d[23]=[e("i",{class:"fas fa-times"},null,-1)]))]),e("div",hs,[e("div",null,[d[25]||(d[25]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"分组名称 *",-1)),g(e("input",{"onUpdate:modelValue":d[6]||(d[6]=I=>S.value.name=I),type:"text",class:"form-input w-full",placeholder:"输入分组名称"},null,512),[[M,S.value.name]])]),e("div",null,[d[27]||(d[27]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"平台类型",-1)),e("div",$s,[$(x(S.value.platform==="claude"?"Claude":"Gemini")+" ",1),d[26]||(d[26]=e("span",{class:"text-xs text-gray-500 ml-2"},"(不可修改)",-1))])]),e("div",null,[d[28]||(d[28]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"描述 (可选)",-1)),g(e("textarea",{"onUpdate:modelValue":d[7]||(d[7]=I=>S.value.description=I),rows:"2",class:"form-input w-full resize-none",placeholder:"分组描述..."},null,512),[[M,S.value.description]])]),e("div",Cs,[e("button",{class:"btn btn-primary px-4 py-2 flex-1",disabled:!S.value.name||c.value,onClick:R},[c.value?(a(),n("div",As)):b("",!0),$(" "+x(c.value?"更新中...":"更新"),1)],8,Ts),e("button",{class:"btn btn-secondary px-4 py-2 flex-1",onClick:N}," 取消 ")])])])])):b("",!0)]))}},Is={key:0,class:"fixed inset-0 modal z-50 flex items-center justify-center p-3 sm:p-4"},js={class:"modal-content w-full max-w-2xl p-4 sm:p-6 md:p-8 mx-auto max-h-[90vh] overflow-y-auto custom-scrollbar"},Vs={class:"flex items-center justify-between mb-4 sm:mb-6"},_s={class:"flex items-center gap-2 sm:gap-3"},Ss={class:"text-lg sm:text-xl font-bold text-gray-900"},Ms={key:0,class:"flex items-center justify-center mb-4 sm:mb-8"},Gs={class:"flex items-center space-x-2 sm:space-x-4"},Ds={class:"flex items-center"},Ks={class:"flex items-center"},Ls={key:1},Rs={class:"space-y-6"},Ps={key:0},zs={class:"flex gap-4"},Es={class:"flex items-center cursor-pointer"},Os={class:"flex items-center cursor-pointer"},Ws={class:"flex items-center cursor-pointer"},qs={key:1},Bs={class:"flex gap-4"},Fs={class:"flex items-center cursor-pointer"},Ns={class:"flex items-center cursor-pointer"},Hs={key:0,class:"text-red-500 text-xs mt-1"},Js={class:"flex gap-4"},Ys={class:"flex items-center cursor-pointer"},Qs={class:"flex items-center cursor-pointer"},Xs={class:"flex items-center cursor-pointer"},Zs={key:2},el={class:"flex gap-2"},tl=["value"],sl={key:3},ll={key:4,class:"space-y-4"},ol={key:0,class:"text-red-500 text-xs mt-1"},al={key:0,class:"text-red-500 text-xs mt-1"},rl={class:"mb-2 flex gap-2"},nl={key:5},il={key:6,class:"space-y-4 bg-blue-50 p-4 rounded-lg border border-blue-200"},ul={class:"flex items-start gap-3 mb-4"},dl={key:0,class:"text-sm text-blue-800 mb-2"},pl={key:1,class:"text-sm text-blue-800 mb-2"},ml={class:"bg-white/80 rounded-lg p-3 mt-2 mb-2 border border-blue-300"},cl={key:0,class:"text-xs text-blue-800"},fl={key:1,class:"text-xs text-blue-800"},xl={key:0,class:"text-red-500 text-xs mt-1"},vl={class:"flex gap-3 pt-4"},yl=["disabled"],gl=["disabled"],bl={key:0,class:"loading-spinner mr-2"},wl={key:3,class:"space-y-6"},kl={class:"flex gap-4"},hl={class:"flex items-center cursor-pointer"},$l={class:"flex items-center cursor-pointer"},Cl={class:"flex items-center cursor-pointer"},Tl={key:0},Al={class:"flex gap-2"},Ul=["value"],Il={key:1},jl={key:2},Vl={key:3,class:"space-y-4"},_l={class:"mb-2 flex gap-2"},Sl={key:4,class:"bg-amber-50 p-4 rounded-lg border border-amber-200"},Ml={class:"space-y-4"},Gl={class:"flex gap-3 pt-4"},Dl=["disabled"],Kl={key:0,class:"loading-spinner mr-2"},Ge={__name:"AccountForm",props:{account:{type:Object,default:null}},emits:["close","success"],setup(z,{emit:W}){var de,pe,fe,me,xe,ve,ye,ge,be,we;const p=z,C=W,u=Le(),{showConfirmModal:G,confirmOptions:j,showConfirm:U,handleConfirm:k,handleCancel:y}=Ke(),c=ne(()=>!!p.account),D=w(!0),S=w(1),L=w(!1),F=()=>{var r;return(r=p.account)!=null&&r.proxy&&p.account.proxy.host&&p.account.proxy.port?{enabled:!0,type:p.account.proxy.type||"socks5",host:p.account.proxy.host,port:p.account.proxy.port,username:p.account.proxy.username||"",password:p.account.proxy.password||""}:{enabled:!1,type:"socks5",host:"",port:"",username:"",password:""}},l=w({platform:((de=p.account)==null?void 0:de.platform)||"claude",addType:"oauth",name:((pe=p.account)==null?void 0:pe.name)||"",description:((fe=p.account)==null?void 0:fe.description)||"",accountType:((me=p.account)==null?void 0:me.accountType)||"shared",groupId:"",projectId:((xe=p.account)==null?void 0:xe.projectId)||"",accessToken:"",refreshToken:"",proxy:F(),apiUrl:((ve=p.account)==null?void 0:ve.apiUrl)||"",apiKey:((ye=p.account)==null?void 0:ye.apiKey)||"",priority:((ge=p.account)==null?void 0:ge.priority)||50,supportedModels:(()=>{var t;const r=(t=p.account)==null?void 0:t.supportedModels;return r?typeof r=="object"&&!Array.isArray(r)?Object.keys(r).join(`
`):Array.isArray(r)?r.join(`
`):"":""})(),userAgent:((be=p.account)==null?void 0:be.userAgent)||"",rateLimitDuration:((we=p.account)==null?void 0:we.rateLimitDuration)||60}),v=w({name:"",accessToken:"",apiUrl:"",apiKey:""}),i=ne(()=>{var r;return((r=l.value.name)==null?void 0:r.trim())&&l.value.platform});ne(()=>{var r,t,s;return l.value.addType==="manual"?((r=l.value.name)==null?void 0:r.trim())&&((t=l.value.accessToken)==null?void 0:t.trim()):(s=l.value.name)==null?void 0:s.trim()});const R=async()=>{if(v.value.name="",!i.value){(!l.value.name||l.value.name.trim()==="")&&(v.value.name="请填写账户名称");return}if(l.value.accountType==="group"&&(!l.value.groupId||l.value.groupId.trim()==="")){h("请选择一个分组","error");return}l.value.platform==="gemini"&&S.value===1&&l.value.addType==="oauth"&&(!l.value.projectId||l.value.projectId.trim()==="")&&!await U("项目 ID 未填写",`您尚未填写项目 ID。
如果您的Google账号绑定了Google Cloud或被识别为Workspace账号,需要提供项目 ID。
如果您使用的是普通个人账号,可以继续不填写。`,"继续","返回填写")||(S.value=2)},N=async r=>{L.value=!0;try{const t={name:l.value.name,description:l.value.description,accountType:l.value.accountType,groupId:l.value.accountType==="group"?l.value.groupId:void 0,proxy:l.value.proxy.enabled?{type:l.value.proxy.type,host:l.value.proxy.host,port:parseInt(l.value.proxy.port),username:l.value.proxy.username||null,password:l.value.proxy.password||null}:null};l.value.platform==="claude"?(t.claudeAiOauth=r.claudeAiOauth||r,t.priority=l.value.priority||50):l.value.platform==="gemini"&&(t.geminiOauth=r.tokens||r,l.value.projectId&&(t.projectId=l.value.projectId));let s;l.value.platform==="claude"?s=await u.createClaudeAccount(t):s=await u.createGeminiAccount(t),C("success",s)}catch(t){h(t.message||"账户创建失败","error")}finally{L.value=!1}},q=async()=>{v.value.name="",v.value.accessToken="",v.value.apiUrl="",v.value.apiKey="";let r=!1;if((!l.value.name||l.value.name.trim()==="")&&(v.value.name="请填写账户名称",r=!0),l.value.platform==="claude-console"?((!l.value.apiUrl||l.value.apiUrl.trim()==="")&&(v.value.apiUrl="请填写 API URL",r=!0),(!l.value.apiKey||l.value.apiKey.trim()==="")&&(v.value.apiKey="请填写 API Key",r=!0)):l.value.addType==="manual"&&(!l.value.accessToken||l.value.accessToken.trim()==="")&&(v.value.accessToken="请填写 Access Token",r=!0),l.value.accountType==="group"&&(!l.value.groupId||l.value.groupId.trim()==="")&&(h("请选择一个分组","error"),r=!0),!r){L.value=!0;try{const t={name:l.value.name,description:l.value.description,accountType:l.value.accountType,groupId:l.value.accountType==="group"?l.value.groupId:void 0,proxy:l.value.proxy.enabled?{type:l.value.proxy.type,host:l.value.proxy.host,port:parseInt(l.value.proxy.port),username:l.value.proxy.username||null,password:l.value.proxy.password||null}:null};if(l.value.platform==="claude"){const o=l.value.refreshToken?6e5:31536e6;t.claudeAiOauth={accessToken:l.value.accessToken,refreshToken:l.value.refreshToken||"",expiresAt:Date.now()+o,scopes:["user:inference"]},t.priority=l.value.priority||50}else if(l.value.platform==="gemini"){const o=l.value.refreshToken?6e5:31536e6;t.geminiOauth={access_token:l.value.accessToken,refresh_token:l.value.refreshToken||"",scope:"https://www.googleapis.com/auth/cloud-platform",token_type:"Bearer",expiry_date:Date.now()+o},l.value.projectId&&(t.projectId=l.value.projectId)}else l.value.platform==="claude-console"&&(t.apiUrl=l.value.apiUrl,t.apiKey=l.value.apiKey,t.priority=l.value.priority||50,t.supportedModels=l.value.supportedModels?l.value.supportedModels.split(`
`).filter(o=>o.trim()):[],t.userAgent=l.value.userAgent||null,t.rateLimitDuration=l.value.rateLimitDuration||60);let s;l.value.platform==="claude"?s=await u.createClaudeAccount(t):l.value.platform==="claude-console"?s=await u.createClaudeConsoleAccount(t):s=await u.createGeminiAccount(t),C("success",s)}catch(t){h(t.message||"账户创建失败","error")}finally{L.value=!1}}},_=async()=>{if(v.value.name="",!l.value.name||l.value.name.trim()===""){v.value.name="请填写账户名称";return}if(l.value.accountType==="group"&&(!l.value.groupId||l.value.groupId.trim()==="")){h("请选择一个分组","error");return}if(!(l.value.platform==="gemini"&&(!l.value.projectId||l.value.projectId.trim()==="")&&!await U("项目 ID 未填写",`您尚未填写项目 ID。
如果您的Google账号绑定了Google Cloud或被识别为Workspace账号,需要提供项目 ID。
如果您使用的是普通个人账号,可以继续不填写。`,"继续保存","返回填写"))){L.value=!0;try{const r={name:l.value.name,description:l.value.description,accountType:l.value.accountType,groupId:l.value.accountType==="group"?l.value.groupId:void 0,proxy:l.value.proxy.enabled?{type:l.value.proxy.type,host:l.value.proxy.host,port:parseInt(l.value.proxy.port),username:l.value.proxy.username||null,password:l.value.proxy.password||null}:null};if(l.value.accessToken||l.value.refreshToken){if(p.account.platform==="claude"){const t=l.value.refreshToken?6e5:31536e6;r.claudeAiOauth={accessToken:l.value.accessToken||"",refreshToken:l.value.refreshToken||"",expiresAt:Date.now()+t,scopes:["user:inference"]}}else if(p.account.platform==="gemini"){const t=l.value.refreshToken?6e5:31536e6;r.geminiOauth={access_token:l.value.accessToken||"",refresh_token:l.value.refreshToken||"",scope:"https://www.googleapis.com/auth/cloud-platform",token_type:"Bearer",expiry_date:Date.now()+t}}}p.account.platform==="gemini"&&l.value.projectId&&(r.projectId=l.value.projectId),p.account.platform==="claude"&&(r.priority=l.value.priority||50),p.account.platform==="claude-console"&&(r.apiUrl=l.value.apiUrl,l.value.apiKey&&(r.apiKey=l.value.apiKey),r.priority=l.value.priority||50,r.supportedModels=l.value.supportedModels?l.value.supportedModels.split(`
`).filter(t=>t.trim()):[],r.userAgent=l.value.userAgent||null,r.rateLimitDuration=l.value.rateLimitDuration||60),p.account.platform==="claude"?await u.updateClaudeAccount(p.account.id,r):p.account.platform==="claude-console"?await u.updateClaudeConsoleAccount(p.account.id,r):await u.updateGeminiAccount(p.account.id,r),C("success")}catch(r){h(r.message||"账户更新失败","error")}finally{L.value=!1}}};O(()=>l.value.name,()=>{var r;v.value.name&&((r=l.value.name)!=null&&r.trim())&&(v.value.name="")}),O(()=>l.value.accessToken,()=>{var r;v.value.accessToken&&((r=l.value.accessToken)!=null&&r.trim())&&(v.value.accessToken="")}),O(()=>l.value.apiUrl,()=>{var r;v.value.apiUrl&&((r=l.value.apiUrl)!=null&&r.trim())&&(v.value.apiUrl="")}),O(()=>l.value.apiKey,()=>{var r;v.value.apiKey&&((r=l.value.apiKey)!=null&&r.trim())&&(v.value.apiKey="")});const d=w([]),I=w(!1),se=w(!1),ae=ne(()=>{const r=l.value.platform==="claude-console"?"claude":l.value.platform;return d.value.filter(t=>t.platform===r)}),f=async()=>{I.value=!0;try{const r=await V.get("/admin/account-groups");d.value=r.data||[]}catch{h("加载分组列表失败","error"),d.value=[]}finally{I.value=!1}},m=async()=>{await f(),h("分组列表已刷新","success")},T=async()=>{await f()};O(()=>l.value.platform,(r,t)=>{r==="claude-console"?l.value.addType="manual":t==="claude-console"&&(r==="claude"||r==="gemini")&&(l.value.addType="oauth"),l.value.accountType==="group"&&(l.value.groupId="")}),O(()=>l.value.accountType,r=>{r==="group"&&d.value.length===0&&f()}),O(()=>l.value.groupId,r=>{r==="__new__"&&(l.value.groupId="",se.value=!0)});const H=r=>{const t=l.value.supportedModels?l.value.supportedModels.split(`
`).filter(s=>s.trim()):[];if(t.includes(r)){h(`模型 ${r} 已存在`,"info");return}t.push(r),l.value.supportedModels=t.join(`
`),h(`已添加模型 ${r}`,"success")};return O(()=>p.account,r=>{if(r){const t=r.proxy&&r.proxy.host&&r.proxy.port?{enabled:!0,type:r.proxy.type||"socks5",host:r.proxy.host,port:r.proxy.port,username:r.proxy.username||"",password:r.proxy.password||""}:{enabled:!1,type:"socks5",host:"",port:"",username:"",password:""};l.value={platform:r.platform,addType:"oauth",name:r.name,description:r.description||"",accountType:r.accountType||"shared",groupId:"",projectId:r.projectId||"",accessToken:"",refreshToken:"",proxy:t,apiUrl:r.apiUrl||"",apiKey:"",priority:r.priority||50,supportedModels:(()=>{const s=r.supportedModels;return s?typeof s=="object"&&!Array.isArray(s)?Object.keys(s).join(`
`):Array.isArray(s)?s.join(`
`):"":""})(),userAgent:r.userAgent||"",rateLimitDuration:r.rateLimitDuration||60},r.accountType==="group"&&f().then(()=>{r.groupInfo&&r.groupInfo.id?l.value.groupId=r.groupInfo.id:d.value.forEach(s=>{V.get(`/admin/account-groups/${s.id}/members`).then(o=>{(o.data||[]).some(E=>E.id===r.id)&&(l.value.groupId=s.id)}).catch(()=>{})})})}},{immediate:!0}),(r,t)=>(a(),oe(Te,{to:"body"},[D.value?(a(),n("div",Is,[e("div",js,[e("div",Vs,[e("div",_s,[t[48]||(t[48]=e("div",{class:"w-8 h-8 sm:w-10 sm:h-10 bg-gradient-to-br from-green-500 to-green-600 rounded-lg sm:rounded-xl flex items-center justify-center"},[e("i",{class:"fas fa-user-circle text-white text-sm sm:text-base"})],-1)),e("h3",Ss,x(c.value?"编辑账户":"添加账户"),1)]),e("button",{class:"text-gray-400 hover:text-gray-600 transition-colors p-1",onClick:t[0]||(t[0]=s=>r.$emit("close"))},t[49]||(t[49]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),!c.value&&l.value.addType==="oauth"?(a(),n("div",Ms,[e("div",Gs,[e("div",Ds,[e("div",{class:K(["w-6 h-6 sm:w-8 sm:h-8 rounded-full flex items-center justify-center text-xs sm:text-sm font-semibold",S.value>=1?"bg-blue-500 text-white":"bg-gray-200 text-gray-500"])}," 1 ",2),t[50]||(t[50]=e("span",{class:"ml-1.5 sm:ml-2 text-xs sm:text-sm font-medium text-gray-700"},"基本信息",-1))]),t[52]||(t[52]=e("div",{class:"w-4 sm:w-8 h-0.5 bg-gray-300"},null,-1)),e("div",Ks,[e("div",{class:K(["w-6 h-6 sm:w-8 sm:h-8 rounded-full flex items-center justify-center text-xs sm:text-sm font-semibold",S.value>=2?"bg-blue-500 text-white":"bg-gray-200 text-gray-500"])}," 2 ",2),t[51]||(t[51]=e("span",{class:"ml-1.5 sm:ml-2 text-xs sm:text-sm font-medium text-gray-700"},"授权认证",-1))])])])):b("",!0),S.value===1&&!c.value?(a(),n("div",Ls,[e("div",Rs,[c.value?b("",!0):(a(),n("div",Ps,[t[56]||(t[56]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"平台",-1)),e("div",zs,[e("label",Es,[g(e("input",{"onUpdate:modelValue":t[1]||(t[1]=s=>l.value.platform=s),type:"radio",value:"claude",class:"mr-2"},null,512),[[Q,l.value.platform]]),t[53]||(t[53]=e("span",{class:"text-sm text-gray-700"},"Claude",-1))]),e("label",Os,[g(e("input",{"onUpdate:modelValue":t[2]||(t[2]=s=>l.value.platform=s),type:"radio",value:"claude-console",class:"mr-2"},null,512),[[Q,l.value.platform]]),t[54]||(t[54]=e("span",{class:"text-sm text-gray-700"},"Claude Console",-1))]),e("label",Ws,[g(e("input",{"onUpdate:modelValue":t[3]||(t[3]=s=>l.value.platform=s),type:"radio",value:"gemini",class:"mr-2"},null,512),[[Q,l.value.platform]]),t[55]||(t[55]=e("span",{class:"text-sm text-gray-700"},"Gemini",-1))])])])),!c.value&&l.value.platform!=="claude-console"?(a(),n("div",qs,[t[59]||(t[59]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"添加方式",-1)),e("div",Bs,[e("label",Fs,[g(e("input",{"onUpdate:modelValue":t[4]||(t[4]=s=>l.value.addType=s),type:"radio",value:"oauth",class:"mr-2"},null,512),[[Q,l.value.addType]]),t[57]||(t[57]=e("span",{class:"text-sm text-gray-700"},"OAuth 授权 (推荐)",-1))]),e("label",Ns,[g(e("input",{"onUpdate:modelValue":t[5]||(t[5]=s=>l.value.addType=s),type:"radio",value:"manual",class:"mr-2"},null,512),[[Q,l.value.addType]]),t[58]||(t[58]=e("span",{class:"text-sm text-gray-700"},"手动输入 Access Token",-1))])])])):b("",!0),e("div",null,[t[60]||(t[60]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户名称",-1)),g(e("input",{"onUpdate:modelValue":t[6]||(t[6]=s=>l.value.name=s),type:"text",required:"",class:K(["form-input w-full",{"border-red-500":v.value.name}]),placeholder:"为账户设置一个易识别的名称"},null,2),[[M,l.value.name]]),v.value.name?(a(),n("p",Hs,x(v.value.name),1)):b("",!0)]),e("div",null,[t[61]||(t[61]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"描述 (可选)",-1)),g(e("textarea",{"onUpdate:modelValue":t[7]||(t[7]=s=>l.value.description=s),rows:"3",class:"form-input w-full resize-none",placeholder:"账户用途说明..."},null,512),[[M,l.value.description]])]),e("div",null,[t[65]||(t[65]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户类型",-1)),e("div",Js,[e("label",Ys,[g(e("input",{"onUpdate:modelValue":t[8]||(t[8]=s=>l.value.accountType=s),type:"radio",value:"shared",class:"mr-2"},null,512),[[Q,l.value.accountType]]),t[62]||(t[62]=e("span",{class:"text-sm text-gray-700"},"共享账户",-1))]),e("label",Qs,[g(e("input",{"onUpdate:modelValue":t[9]||(t[9]=s=>l.value.accountType=s),type:"radio",value:"dedicated",class:"mr-2"},null,512),[[Q,l.value.accountType]]),t[63]||(t[63]=e("span",{class:"text-sm text-gray-700"},"专属账户",-1))]),e("label",Xs,[g(e("input",{"onUpdate:modelValue":t[10]||(t[10]=s=>l.value.accountType=s),type:"radio",value:"group",class:"mr-2"},null,512),[[Q,l.value.accountType]]),t[64]||(t[64]=e("span",{class:"text-sm text-gray-700"},"分组调度",-1))])]),t[66]||(t[66]=e("p",{class:"text-xs text-gray-500 mt-2"}," 共享账户:供所有API Key使用;专属账户:仅供特定API Key使用;分组调度:加入分组供分组内调度 ",-1))]),l.value.accountType==="group"?(a(),n("div",Zs,[t[69]||(t[69]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"选择分组 *",-1)),e("div",el,[g(e("select",{"onUpdate:modelValue":t[11]||(t[11]=s=>l.value.groupId=s),class:"form-input flex-1",required:""},[t[67]||(t[67]=e("option",{value:""}," 请选择分组 ",-1)),(a(!0),n(ie,null,ue(ae.value,s=>(a(),n("option",{key:s.id,value:s.id},x(s.name)+" ("+x(s.memberCount||0)+" 个成员) ",9,tl))),128)),t[68]||(t[68]=e("option",{value:"__new__"}," + 新建分组 ",-1))],512),[[ce,l.value.groupId]]),e("button",{type:"button",class:"px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500",onClick:m},[e("i",{class:K(["fas fa-sync-alt",{"animate-spin":I.value}])},null,2)])])])):b("",!0),l.value.platform==="gemini"?(a(),n("div",sl,[t[70]||(t[70]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"项目 ID (可选)",-1)),g(e("input",{"onUpdate:modelValue":t[12]||(t[12]=s=>l.value.projectId=s),type:"text",class:"form-input w-full",placeholder:"例如:verdant-wares-464411-k9"},null,512),[[M,l.value.projectId]]),t[71]||(t[71]=e("div",{class:"mt-2 p-3 bg-yellow-50 border border-yellow-200 rounded-lg"},[e("div",{class:"flex items-start gap-2"},[e("i",{class:"fas fa-info-circle text-yellow-600 mt-0.5"}),e("div",{class:"text-xs text-yellow-700"},[e("p",{class:"font-medium mb-1"}," Google Cloud/Workspace 账号需要提供项目 ID "),e("p",null,"某些 Google 账号(特别是绑定了 Google Cloud 的账号)会被识别为 Workspace 账号,需要提供额外的项目 ID。"),e("div",{class:"mt-2 p-2 bg-white rounded border border-yellow-300"},[e("p",{class:"font-medium mb-1"}," 如何获取项目 ID: "),e("ol",{class:"list-decimal list-inside space-y-1 ml-2"},[e("li",null,[$(" 访问 "),e("a",{href:"https://console.cloud.google.com/welcome",target:"_blank",class:"text-blue-600 hover:underline font-medium"},"Google Cloud Console")]),e("li",null,[$("复制"),e("span",{class:"font-semibold text-red-600"},"项目 ID(Project ID)"),$(",通常是字符串格式")]),e("li",{class:"text-red-600"}," ⚠️ 注意:要复制项目 ID(Project ID),不要复制项目编号(Project Number)! ")])]),e("p",{class:"mt-2"},[e("strong",null,"提示:"),$("如果您的账号是普通个人账号(未绑定 Google Cloud),请留空此字段。 ")])])])],-1))])):b("",!0),l.value.platform==="claude-console"&&!c.value?(a(),n("div",ll,[e("div",null,[t[72]||(t[72]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"API URL *",-1)),g(e("input",{"onUpdate:modelValue":t[13]||(t[13]=s=>l.value.apiUrl=s),type:"text",required:"",class:K(["form-input w-full",{"border-red-500":v.value.apiUrl}]),placeholder:"例如:https://api.example.com"},null,2),[[M,l.value.apiUrl]]),v.value.apiUrl?(a(),n("p",ol,x(v.value.apiUrl),1)):b("",!0)]),e("div",null,[t[73]||(t[73]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"API Key *",-1)),g(e("input",{"onUpdate:modelValue":t[14]||(t[14]=s=>l.value.apiKey=s),type:"password",required:"",class:K(["form-input w-full",{"border-red-500":v.value.apiKey}]),placeholder:"请输入API Key"},null,2),[[M,l.value.apiKey]]),v.value.apiKey?(a(),n("p",al,x(v.value.apiKey),1)):b("",!0)]),e("div",null,[t[74]||(t[74]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"支持的模型 (可选)--注意,ClaudeCode必须加上hiku模型!",-1)),e("div",rl,[e("button",{type:"button",class:"px-3 py-1 text-xs bg-blue-100 text-blue-700 rounded-lg hover:bg-blue-200 transition-colors",onClick:t[15]||(t[15]=s=>H("claude-sonnet-4-20250514"))}," + claude-sonnet-4-20250514 "),e("button",{type:"button",class:"px-3 py-1 text-xs bg-purple-100 text-purple-700 rounded-lg hover:bg-purple-200 transition-colors",onClick:t[16]||(t[16]=s=>H("claude-opus-4-20250514"))}," + claude-opus-4-20250514 "),e("button",{type:"button",class:"px-3 py-1 text-xs bg-green-100 text-green-700 rounded-lg hover:bg-purple-200 transition-colors",onClick:t[17]||(t[17]=s=>H("claude-3-5-haiku-20241022"))}," + claude-3-5-haiku-20241022 ")]),g(e("textarea",{"onUpdate:modelValue":t[18]||(t[18]=s=>l.value.supportedModels=s),rows:"3",class:"form-input w-full resize-none",placeholder:"每行一个模型,留空表示支持所有模型。特别注意,ClaudeCode必须加上hiku模型!"},null,512),[[M,l.value.supportedModels]]),t[75]||(t[75]=e("p",{class:"text-xs text-gray-500 mt-1"}," 留空表示支持所有模型。如果指定模型,请求中的模型不在列表内将不会调度到此账号 ",-1))]),e("div",null,[t[76]||(t[76]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"自定义 User-Agent (可选)",-1)),g(e("input",{"onUpdate:modelValue":t[19]||(t[19]=s=>l.value.userAgent=s),type:"text",class:"form-input w-full",placeholder:"默认:claude-cli/1.0.61 (console, cli)"},null,512),[[M,l.value.userAgent]])]),e("div",null,[t[77]||(t[77]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"限流时间 (分钟)",-1)),g(e("input",{"onUpdate:modelValue":t[20]||(t[20]=s=>l.value.rateLimitDuration=s),type:"number",min:"1",class:"form-input w-full",placeholder:"默认60分钟"},null,512),[[M,l.value.rateLimitDuration,void 0,{number:!0}]]),t[78]||(t[78]=e("p",{class:"text-xs text-gray-500 mt-1"}," 当账号返回429错误时,暂停调度的时间(分钟) ",-1))])])):b("",!0),l.value.platform==="claude"||l.value.platform==="claude-console"?(a(),n("div",nl,[t[79]||(t[79]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"调度优先级 (1-100)",-1)),g(e("input",{"onUpdate:modelValue":t[21]||(t[21]=s=>l.value.priority=s),type:"number",min:"1",max:"100",class:"form-input w-full",placeholder:"数字越小优先级越高,默认50"},null,512),[[M,l.value.priority,void 0,{number:!0}]]),t[80]||(t[80]=e("p",{class:"text-xs text-gray-500 mt-1"}," 数字越小优先级越高,建议范围:1-100 ",-1))])):b("",!0),l.value.addType==="manual"&&l.value.platform!=="claude-console"?(a(),n("div",il,[e("div",ul,[t[86]||(t[86]=e("div",{class:"w-8 h-8 bg-blue-500 rounded-lg flex items-center justify-center flex-shrink-0 mt-1"},[e("i",{class:"fas fa-info text-white text-sm"})],-1)),e("div",null,[t[84]||(t[84]=e("h5",{class:"font-semibold text-blue-900 mb-2"}," 手动输入 Token ",-1)),l.value.platform==="claude"?(a(),n("p",dl," 请输入有效的 Claude Access Token。如果您有 Refresh Token,建议也一并填写以支持自动刷新。 ")):l.value.platform==="gemini"?(a(),n("p",pl," 请输入有效的 Gemini Access Token。如果您有 Refresh Token,建议也一并填写以支持自动刷新。 ")):b("",!0),e("div",ml,[t[83]||(t[83]=e("p",{class:"text-sm text-blue-900 font-medium mb-1"},[e("i",{class:"fas fa-folder-open mr-1"}),$(" 获取 Access Token 的方法: ")],-1)),l.value.platform==="claude"?(a(),n("p",cl,t[81]||(t[81]=[$(" 请从已登录 Claude Code 的机器上获取 ",-1),e("code",{class:"bg-blue-100 px-1 py-0.5 rounded font-mono"},"~/.claude/.credentials.json",-1),$(" 文件中的凭证, 请勿使用 Claude 官网 API Keys 页面的密钥。 ",-1)]))):l.value.platform==="gemini"?(a(),n("p",fl,t[82]||(t[82]=[$(" 请从已登录 Gemini CLI 的机器上获取 ",-1),e("code",{class:"bg-blue-100 px-1 py-0.5 rounded font-mono"},"~/.config/gemini/credentials.json",-1),$(" 文件中的凭证。 ",-1)]))):b("",!0)]),t[85]||(t[85]=e("p",{class:"text-xs text-blue-600"}," 💡 如果未填写 Refresh Token,Token 过期后需要手动更新。 ",-1))])]),e("div",null,[t[87]||(t[87]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"Access Token *",-1)),g(e("textarea",{"onUpdate:modelValue":t[22]||(t[22]=s=>l.value.accessToken=s),rows:"4",required:"",class:K(["form-input w-full resize-none font-mono text-xs",{"border-red-500":v.value.accessToken}]),placeholder:"请输入 Access Token..."},null,2),[[M,l.value.accessToken]]),v.value.accessToken?(a(),n("p",xl,x(v.value.accessToken),1)):b("",!0)]),e("div",null,[t[88]||(t[88]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"Refresh Token (可选)",-1)),g(e("textarea",{"onUpdate:modelValue":t[23]||(t[23]=s=>l.value.refreshToken=s),rows:"4",class:"form-input w-full resize-none font-mono text-xs",placeholder:"请输入 Refresh Token..."},null,512),[[M,l.value.refreshToken]])])])):b("",!0),he(Me,{modelValue:l.value.proxy,"onUpdate:modelValue":t[24]||(t[24]=s=>l.value.proxy=s)},null,8,["modelValue"]),e("div",vl,[e("button",{type:"button",class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors",onClick:t[25]||(t[25]=s=>r.$emit("close"))}," 取消 "),l.value.addType==="oauth"&&l.value.platform!=="claude-console"?(a(),n("button",{key:0,type:"button",disabled:L.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold",onClick:R}," 下一步 ",8,yl)):(a(),n("button",{key:1,type:"button",disabled:L.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold",onClick:q},[L.value?(a(),n("div",bl)):b("",!0),$(" "+x(L.value?"创建中...":"创建"),1)],8,gl))])])])):b("",!0),S.value===2&&l.value.addType==="oauth"?(a(),oe(zt,{key:2,platform:l.value.platform,proxy:l.value.proxy,onSuccess:N,onBack:t[26]||(t[26]=s=>S.value=1)},null,8,["platform","proxy"])):b("",!0),c.value?(a(),n("div",wl,[e("div",null,[t[89]||(t[89]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户名称",-1)),g(e("input",{"onUpdate:modelValue":t[27]||(t[27]=s=>l.value.name=s),type:"text",required:"",class:"form-input w-full",placeholder:"为账户设置一个易识别的名称"},null,512),[[M,l.value.name]])]),e("div",null,[t[90]||(t[90]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"描述 (可选)",-1)),g(e("textarea",{"onUpdate:modelValue":t[28]||(t[28]=s=>l.value.description=s),rows:"3",class:"form-input w-full resize-none",placeholder:"账户用途说明..."},null,512),[[M,l.value.description]])]),e("div",null,[t[94]||(t[94]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户类型",-1)),e("div",kl,[e("label",hl,[g(e("input",{"onUpdate:modelValue":t[29]||(t[29]=s=>l.value.accountType=s),type:"radio",value:"shared",class:"mr-2"},null,512),[[Q,l.value.accountType]]),t[91]||(t[91]=e("span",{class:"text-sm text-gray-700"},"共享账户",-1))]),e("label",$l,[g(e("input",{"onUpdate:modelValue":t[30]||(t[30]=s=>l.value.accountType=s),type:"radio",value:"dedicated",class:"mr-2"},null,512),[[Q,l.value.accountType]]),t[92]||(t[92]=e("span",{class:"text-sm text-gray-700"},"专属账户",-1))]),e("label",Cl,[g(e("input",{"onUpdate:modelValue":t[31]||(t[31]=s=>l.value.accountType=s),type:"radio",value:"group",class:"mr-2"},null,512),[[Q,l.value.accountType]]),t[93]||(t[93]=e("span",{class:"text-sm text-gray-700"},"分组调度",-1))])]),t[95]||(t[95]=e("p",{class:"text-xs text-gray-500 mt-2"}," 共享账户:供所有API Key使用;专属账户:仅供特定API Key使用;分组调度:加入分组供分组内调度 ",-1))]),l.value.accountType==="group"?(a(),n("div",Tl,[t[98]||(t[98]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"选择分组 *",-1)),e("div",Al,[g(e("select",{"onUpdate:modelValue":t[32]||(t[32]=s=>l.value.groupId=s),class:"form-input flex-1",required:""},[t[96]||(t[96]=e("option",{value:""}," 请选择分组 ",-1)),(a(!0),n(ie,null,ue(ae.value,s=>(a(),n("option",{key:s.id,value:s.id},x(s.name)+" ("+x(s.memberCount||0)+" 个成员) ",9,Ul))),128)),t[97]||(t[97]=e("option",{value:"__new__"}," + 新建分组 ",-1))],512),[[ce,l.value.groupId]]),e("button",{type:"button",class:"px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500",onClick:m},[e("i",{class:K(["fas fa-sync-alt",{"animate-spin":I.value}])},null,2)])])])):b("",!0),l.value.platform==="gemini"?(a(),n("div",Il,[t[99]||(t[99]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"项目 ID (可选)",-1)),g(e("input",{"onUpdate:modelValue":t[33]||(t[33]=s=>l.value.projectId=s),type:"text",class:"form-input w-full",placeholder:"例如:verdant-wares-464411-k9"},null,512),[[M,l.value.projectId]]),t[100]||(t[100]=e("p",{class:"text-xs text-gray-500 mt-2"}," Google Cloud/Workspace 账号可能需要提供项目 ID ",-1))])):b("",!0),l.value.platform==="claude"||l.value.platform==="claude-console"?(a(),n("div",jl,[t[101]||(t[101]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"调度优先级 (1-100)",-1)),g(e("input",{"onUpdate:modelValue":t[34]||(t[34]=s=>l.value.priority=s),type:"number",min:"1",max:"100",class:"form-input w-full",placeholder:"数字越小优先级越高"},null,512),[[M,l.value.priority,void 0,{number:!0}]]),t[102]||(t[102]=e("p",{class:"text-xs text-gray-500 mt-1"}," 数字越小优先级越高,建议范围:1-100 ",-1))])):b("",!0),l.value.platform==="claude-console"?(a(),n("div",Vl,[e("div",null,[t[103]||(t[103]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"API URL",-1)),g(e("input",{"onUpdate:modelValue":t[35]||(t[35]=s=>l.value.apiUrl=s),type:"text",required:"",class:"form-input w-full",placeholder:"例如:https://api.example.com"},null,512),[[M,l.value.apiUrl]])]),e("div",null,[t[104]||(t[104]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"API Key",-1)),g(e("input",{"onUpdate:modelValue":t[36]||(t[36]=s=>l.value.apiKey=s),type:"password",class:"form-input w-full",placeholder:"留空表示不更新"},null,512),[[M,l.value.apiKey]]),t[105]||(t[105]=e("p",{class:"text-xs text-gray-500 mt-1"}," 留空表示不更新 API Key ",-1))]),e("div",null,[t[106]||(t[106]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"支持的模型 (可选)",-1)),e("div",_l,[e("button",{type:"button",class:"px-3 py-1 text-xs bg-blue-100 text-blue-700 rounded-lg hover:bg-blue-200 transition-colors",onClick:t[37]||(t[37]=s=>H("claude-sonnet-4-20250514"))}," + claude-sonnet-4-20250514 "),e("button",{type:"button",class:"px-3 py-1 text-xs bg-purple-100 text-purple-700 rounded-lg hover:bg-purple-200 transition-colors",onClick:t[38]||(t[38]=s=>H("claude-opus-4-20250514"))}," + claude-opus-4-20250514 "),e("button",{type:"button",class:"px-3 py-1 text-xs bg-green-100 text-green-700 rounded-lg hover:bg-purple-200 transition-colors",onClick:t[39]||(t[39]=s=>H("claude-3-5-haiku-20241022"))}," + claude-3-5-haiku-20241022 ")]),g(e("textarea",{"onUpdate:modelValue":t[40]||(t[40]=s=>l.value.supportedModels=s),rows:"3",class:"form-input w-full resize-none",placeholder:"每行一个模型,留空表示支持所有模型。特别注意,ClaudeCode必须加上hiku模型!"},null,512),[[M,l.value.supportedModels]])]),e("div",null,[t[107]||(t[107]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"自定义 User-Agent (可选)",-1)),g(e("input",{"onUpdate:modelValue":t[41]||(t[41]=s=>l.value.userAgent=s),type:"text",class:"form-input w-full",placeholder:"默认:claude-cli/1.0.61 (console, cli)"},null,512),[[M,l.value.userAgent]])]),e("div",null,[t[108]||(t[108]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"限流时间 (分钟)",-1)),g(e("input",{"onUpdate:modelValue":t[42]||(t[42]=s=>l.value.rateLimitDuration=s),type:"number",min:"1",class:"form-input w-full"},null,512),[[M,l.value.rateLimitDuration,void 0,{number:!0}]])])])):b("",!0),l.value.platform!=="claude-console"?(a(),n("div",Sl,[t[111]||(t[111]=e("div",{class:"flex items-start gap-3 mb-4"},[e("div",{class:"w-8 h-8 bg-amber-500 rounded-lg flex items-center justify-center flex-shrink-0 mt-1"},[e("i",{class:"fas fa-key text-white text-sm"})]),e("div",null,[e("h5",{class:"font-semibold text-amber-900 mb-2"}," 更新 Token "),e("p",{class:"text-sm text-amber-800 mb-2"}," 可以更新 Access Token 和 Refresh Token。为了安全起见,不会显示当前的 Token 值。 "),e("p",{class:"text-xs text-amber-600"}," 💡 留空表示不更新该字段。 ")])],-1)),e("div",Ml,[e("div",null,[t[109]||(t[109]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"新的 Access Token",-1)),g(e("textarea",{"onUpdate:modelValue":t[43]||(t[43]=s=>l.value.accessToken=s),rows:"4",class:"form-input w-full resize-none font-mono text-xs",placeholder:"留空表示不更新..."},null,512),[[M,l.value.accessToken]])]),e("div",null,[t[110]||(t[110]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"新的 Refresh Token",-1)),g(e("textarea",{"onUpdate:modelValue":t[44]||(t[44]=s=>l.value.refreshToken=s),rows:"4",class:"form-input w-full resize-none font-mono text-xs",placeholder:"留空表示不更新..."},null,512),[[M,l.value.refreshToken]])])])])):b("",!0),he(Me,{modelValue:l.value.proxy,"onUpdate:modelValue":t[45]||(t[45]=s=>l.value.proxy=s)},null,8,["modelValue"]),e("div",Gl,[e("button",{type:"button",class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors",onClick:t[46]||(t[46]=s=>r.$emit("close"))}," 取消 "),e("button",{type:"button",disabled:L.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold",onClick:_},[L.value?(a(),n("div",Kl)):b("",!0),$(" "+x(L.value?"更新中...":"更新"),1)],8,Dl)])])):b("",!0)])])):b("",!0),he(Re,{show:Y(G),title:Y(j).title,message:Y(j).message,"confirm-text":Y(j).confirmText,"cancel-text":Y(j).cancelText,onConfirm:Y(k),onCancel:Y(y)},null,8,["show","title","message","confirm-text","cancel-text","onConfirm","onCancel"]),se.value?(a(),oe(Us,{key:1,onClose:t[47]||(t[47]=s=>se.value=!1),onRefresh:T})):b("",!0)]))}},Ll={class:"accounts-container"},Rl={class:"card p-4 sm:p-6"},Pl={class:"flex flex-col gap-4 mb-4 sm:mb-6"},zl={class:"flex flex-col sm:flex-row gap-2 sm:items-center sm:justify-between"},El={class:"flex flex-col sm:flex-row gap-2"},Ol=["value"],Wl={key:0,class:"text-center py-12"},ql={key:1,class:"text-center py-12"},Bl={key:2,class:"hidden md:block table-container"},Fl={class:"w-full table-fixed"},Nl={class:"bg-gray-50/80 backdrop-blur-sm"},Hl={key:1,class:"fas fa-sort ml-1 text-gray-400"},Jl={key:1,class:"fas fa-sort ml-1 text-gray-400"},Yl={key:1,class:"fas fa-sort ml-1 text-gray-400"},Ql={key:1,class:"fas fa-sort ml-1 text-gray-400"},Xl={class:"divide-y divide-gray-200/50"},Zl={class:"px-3 py-4"},eo={class:"flex items-center"},to={class:"min-w-0"},so={class:"flex items-center gap-2"},lo=["title"],oo={key:0,class:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-purple-100 text-purple-800"},ao={key:1,class:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-blue-100 text-blue-800"},ro={key:2,class:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800"},no=["title"],io=["title"],uo={class:"px-3 py-4"},po={class:"flex items-center gap-1"},mo={key:0,class:"flex items-center gap-1.5 px-2.5 py-1 bg-gradient-to-r from-yellow-100 to-amber-100 rounded-lg border border-yellow-200"},co={class:"text-xs font-medium text-yellow-700"},fo={key:1,class:"flex items-center gap-1.5 px-2.5 py-1 bg-gradient-to-r from-purple-100 to-pink-100 rounded-lg border border-purple-200"},xo={key:2,class:"flex items-center gap-1.5 px-2.5 py-1 bg-gradient-to-r from-indigo-100 to-blue-100 rounded-lg border border-indigo-200"},vo={class:"text-xs font-medium text-indigo-700"},yo={class:"px-3 py-4 whitespace-nowrap"},go={class:"flex flex-col gap-1"},bo={key:0,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-yellow-100 text-yellow-800"},wo={key:1,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-gray-100 text-gray-700"},ko=["title"],ho={key:3,class:"text-xs text-gray-500"},$o={class:"px-3 py-4 whitespace-nowrap"},Co={key:0,class:"flex items-center gap-2"},To={class:"w-16 bg-gray-200 rounded-full h-2"},Ao={class:"text-xs text-gray-700 font-medium min-w-[20px]"},Uo={key:1,class:"text-gray-400 text-sm"},Io={class:"px-3 py-4 text-sm text-gray-600"},jo=["title"],Vo={key:1,class:"text-gray-400"},_o={class:"px-3 py-4 whitespace-nowrap text-sm"},So={key:0,class:"space-y-1"},Mo={class:"flex items-center gap-2"},Go={class:"text-sm font-medium text-gray-900"},Do={class:"flex items-center gap-2"},Ko={class:"text-xs text-gray-600"},Lo={key:0,class:"text-xs text-gray-500"},Ro={key:1,class:"text-gray-400 text-xs"},Po={class:"px-3 py-4 whitespace-nowrap"},zo={key:0,class:"space-y-2"},Eo={class:"flex items-center gap-2"},Oo={class:"w-24 bg-gray-200 rounded-full h-2"},Wo={class:"text-xs text-gray-700 font-medium min-w-[32px]"},qo={class:"text-xs text-gray-600"},Bo={key:0,class:"text-indigo-600 font-medium"},Fo={key:1,class:"text-gray-400 text-sm"},No={key:2,class:"text-gray-400 text-sm"},Ho={class:"px-3 py-4 whitespace-nowrap text-sm text-gray-600"},Jo={class:"px-3 py-4 whitespace-nowrap text-sm font-medium"},Yo={class:"flex items-center gap-1 flex-wrap"},Qo=["disabled","title","onClick"],Xo=["disabled","title","onClick"],Zo={class:"ml-1"},ea=["onClick"],ta=["onClick"],sa={key:3,class:"md:hidden space-y-3"},la={class:"flex items-start justify-between mb-3"},oa={class:"flex items-center gap-3"},aa={class:"text-sm font-semibold text-gray-900"},ra={class:"flex items-center gap-2 mt-0.5"},na={class:"text-xs text-gray-500"},ia={class:"text-xs text-gray-500"},ua={class:"grid grid-cols-2 gap-3 mb-3"},da={class:"text-sm font-semibold text-gray-900"},pa={class:"text-xs text-gray-500 mt-0.5"},ma={class:"text-sm font-semibold text-gray-900"},ca={class:"text-xs text-gray-500 mt-0.5"},fa={class:"space-y-2 mb-3"},xa={key:0,class:"bg-gray-50 rounded-lg p-2 space-y-1.5"},va={class:"flex items-center justify-between text-xs"},ya={class:"text-gray-700 font-medium"},ga={class:"w-full h-2 bg-gray-200 rounded-full overflow-hidden"},ba={class:"flex items-center justify-between text-xs"},wa={class:"text-gray-500"},ka={key:0,class:"text-indigo-600 font-medium"},ha={key:1,class:"text-gray-500"},$a={class:"flex items-center justify-between text-xs"},Ca={class:"text-gray-700"},Ta={key:1,class:"flex items-center justify-between text-xs"},Aa={class:"text-gray-700"},Ua={class:"flex items-center justify-between text-xs"},Ia={class:"text-gray-700 font-medium"},ja={class:"flex gap-2 mt-3 pt-3 border-t border-gray-100"},Va=["disabled","onClick"],_a=["disabled","onClick"],Sa=["onClick"],Ma=["onClick"],Ga={__name:"AccountsView",setup(z){const{showConfirmModal:W,confirmOptions:p,showConfirm:C,handleConfirm:u,handleCancel:G}=Ke(),j=w([]),U=w(!1),k=w("name"),y=w(""),c=w("asc"),D=w([]),S=w({}),L=w([]),F=w("all"),l=w([]),v=w(!1),i=w(!1),R=w(null),N=ne(()=>{const t=l.value.length>0?l.value:j.value;return y.value?[...t].sort((o,A)=>{var X,Z,B,P,ee,te,re,Ae,Ue,Ie,je,Ve;let E=o[y.value],J=A[y.value];return y.value==="dailyTokens"?(E=((Z=(X=o.usage)==null?void 0:X.daily)==null?void 0:Z.allTokens)||0,J=((P=(B=A.usage)==null?void 0:B.daily)==null?void 0:P.allTokens)||0):y.value==="dailyRequests"?(E=((te=(ee=o.usage)==null?void 0:ee.daily)==null?void 0:te.requests)||0,J=((Ae=(re=A.usage)==null?void 0:re.daily)==null?void 0:Ae.requests)||0):y.value==="totalTokens"&&(E=((Ie=(Ue=o.usage)==null?void 0:Ue.total)==null?void 0:Ie.allTokens)||0,J=((Ve=(je=A.usage)==null?void 0:je.total)==null?void 0:Ve.allTokens)||0),y.value==="lastUsed"&&(E=o.lastUsedAt?new Date(o.lastUsedAt).getTime():0,J=A.lastUsedAt?new Date(A.lastUsedAt).getTime():0),y.value==="status"&&(E=o.isActive?1:0,J=A.isActive?1:0),EJ?c.value==="asc"?1:-1:0}):t}),q=async()=>{U.value=!0;try{const[t,s,o,A,E]=await Promise.all([V.get("/admin/claude-accounts"),V.get("/admin/claude-console-accounts"),V.get("/admin/gemini-accounts"),V.get("/admin/api-keys"),V.get("/admin/account-groups")]);A.success&&(D.value=A.data||[]),E.success&&(L.value=E.data||[]);const J=new Map,X=new Map;for(const B of L.value){J.set(B.id,B);try{const P=await V.get(`/admin/account-groups/${B.id}/members`);P.success&&(P.data||[]).forEach(te=>{X.set(te.id,B)})}catch(P){console.error(`Failed to load members for group ${B.id}:`,P)}}const Z=[];if(t.success){const B=(t.data||[]).map(P=>{const ee=D.value.filter(re=>re.claudeAccountId===P.id).length,te=X.get(P.id)||null;return{...P,platform:"claude",boundApiKeysCount:ee,groupInfo:te}});Z.push(...B)}if(s.success){const B=(s.data||[]).map(P=>{const ee=X.get(P.id)||null;return{...P,platform:"claude-console",boundApiKeysCount:0,groupInfo:ee}});Z.push(...B)}if(o.success){const B=(o.data||[]).map(P=>{const ee=D.value.filter(re=>re.geminiAccountId===P.id).length,te=X.get(P.id)||null;return{...P,platform:"gemini",boundApiKeysCount:ee,groupInfo:te}});Z.push(...B)}j.value=Z,ae()}catch{h("加载账户失败","error")}finally{U.value=!1}},_=t=>{t&&(y.value===t?c.value=c.value==="asc"?"desc":"asc":(y.value=t,c.value="asc"))},d=t=>{if(t==null)return"0";const s=Number(t);return s>=1e6?Math.floor(s/1e6).toLocaleString()+"M":s.toLocaleString()},I=t=>{if(!t)return"从未使用";const s=new Date(t),A=new Date-s;return A<6e4?"刚刚":A<36e5?`${Math.floor(A/6e4)} 分钟前`:A<864e5?`${Math.floor(A/36e5)} 小时前`:A<6048e5?`${Math.floor(A/864e5)} 天前`:s.toLocaleDateString("zh-CN")},se=async()=>{try{const t=await V.get("/admin/api-keys");t.success&&(D.value=t.data)}catch(t){console.error("Failed to load API keys:",t)}},ae=()=>{F.value==="all"?l.value=j.value:F.value==="ungrouped"?l.value=j.value.filter(t=>!t.groupInfo):l.value=j.value.filter(t=>t.groupInfo&&t.groupInfo.id===F.value)},f=t=>{if(!t||!t.host||!t.port)return null;const s=t.type==="socks5"?"S5":t.type.toUpperCase();let o=t.host;o.length>15&&(o=o.substring(0,12)+"...");let A=`${s}://${o}:${t.port}`;return t.username&&(A=`${s}://***@${o}:${t.port}`),A},m=(t,s)=>{if(!t||!s)return"--";const o=new Date(t),A=new Date(s),E=o.getHours().toString().padStart(2,"0"),J=o.getMinutes().toString().padStart(2,"0"),X=A.getHours().toString().padStart(2,"0"),Z=A.getMinutes().toString().padStart(2,"0");return`${E}:${J} - ${X}:${Z}`},T=t=>{if(!t||t<=0)return"已结束";const s=Math.floor(t/60),o=t%60;return s>0?`${s}小时${o}分钟`:`${o}分钟`},H=()=>{v.value=!0},de=t=>{R.value=t,i.value=!0},pe=async t=>{const s=D.value.filter(A=>A.claudeAccountId===t.id||A.geminiAccountId===t.id).length;if(s>0){h(`无法删除此账号,有 ${s} 个API Key绑定到此账号,请先解绑所有API Key`,"error");return}if(await C("删除账户",`确定要删除账户 "${t.name}" 吗?
此操作不可恢复。`,"删除","取消"))try{let A;t.platform==="claude"?A=`/admin/claude-accounts/${t.id}`:t.platform==="claude-console"?A=`/admin/claude-console-accounts/${t.id}`:A=`/admin/gemini-accounts/${t.id}`;const E=await V.delete(A);E.success?(h("账户已删除","success"),q()):h(E.message||"删除失败","error")}catch{h("删除失败","error")}},fe=async t=>{if(!t.isRefreshing)try{t.isRefreshing=!0;const s=await V.post(`/admin/claude-accounts/${t.id}/refresh`);s.success?(h("Token刷新成功","success"),q()):h(s.message||"Token刷新失败","error")}catch{h("Token刷新失败","error")}finally{t.isRefreshing=!1}},me=async t=>{if(!t.isTogglingSchedulable)try{t.isTogglingSchedulable=!0;let s;if(t.platform==="claude")s=`/admin/claude-accounts/${t.id}/toggle-schedulable`;else if(t.platform==="claude-console")s=`/admin/claude-console-accounts/${t.id}/toggle-schedulable`;else if(t.platform==="gemini")s=`/admin/gemini-accounts/${t.id}/toggle-schedulable`;else{h("该账户类型暂不支持调度控制","warning");return}const o=await V.put(s);o.success?(t.schedulable=o.schedulable,h(o.schedulable?"已启用调度":"已禁用调度","success")):h(o.message||"操作失败","error")}catch{h("切换调度状态失败","error")}finally{t.isTogglingSchedulable=!1}},xe=()=>{v.value=!1,h("账户创建成功","success"),q()},ve=()=>{i.value=!1,h("账户更新成功","success"),q()},ye=t=>t.status==="blocked"?"已封锁":t.isRateLimited||t.status==="rate_limited"||t.rateLimitStatus&&t.rateLimitStatus.isRateLimited?"限流中":t.status==="error"||!t.isActive?"错误":t.schedulable===!1?"已暂停":"正常",ge=t=>t.status==="blocked"?"bg-red-100 text-red-800":t.isRateLimited||t.status==="rate_limited"||t.rateLimitStatus&&t.rateLimitStatus.isRateLimited?"bg-orange-100 text-orange-800":t.status==="error"||!t.isActive?"bg-red-100 text-red-800":t.schedulable===!1?"bg-gray-100 text-gray-800":"bg-green-100 text-green-800",be=t=>t.status==="blocked"?"bg-red-500":t.isRateLimited||t.status==="rate_limited"||t.rateLimitStatus&&t.rateLimitStatus.isRateLimited?"bg-orange-500":t.status==="error"||!t.isActive?"bg-red-500":t.schedulable===!1?"bg-gray-500":"bg-green-500",we=t=>I(t),r=async t=>{if(!S.value[t.id])try{S.value[t.id]=!0;const s=await V.post(`/admin/claude-accounts/${t.id}/refresh`);s.success?(h("Token刷新成功","success"),q()):h(s.message||"Token刷新失败","error")}catch{h("Token刷新失败","error")}finally{S.value[t.id]=!1}};return O(k,t=>{const s={name:"name",dailyTokens:"dailyTokens",dailyRequests:"dailyRequests",totalTokens:"totalTokens",lastUsed:"lastUsed"};s[t]&&_(s[t])}),De(()=>{q(),se()}),(t,s)=>(a(),n("div",Ll,[e("div",Rl,[e("div",Pl,[s[13]||(s[13]=e("div",null,[e("h3",{class:"text-lg sm:text-xl font-bold text-gray-900 mb-1 sm:mb-2"}," 账户管理 "),e("p",{class:"text-sm sm:text-base text-gray-600"}," 管理您的 Claude 和 Gemini 账户及代理配置 ")],-1)),e("div",zl,[e("div",El,[g(e("select",{"onUpdate:modelValue":s[0]||(s[0]=o=>k.value=o),class:"form-input px-3 py-2 text-sm w-full sm:w-auto",onChange:s[1]||(s[1]=o=>_())},s[9]||(s[9]=[$e(' 按名称排序 按今日Token排序 按今日请求数排序 按总Token排序 按最后使用排序 ',5)]),544),[[ce,k.value]]),g(e("select",{"onUpdate:modelValue":s[2]||(s[2]=o=>F.value=o),class:"form-input px-3 py-2 text-sm w-full sm:w-auto",onChange:ae},[s[10]||(s[10]=e("option",{value:"all"}," 所有账户 ",-1)),s[11]||(s[11]=e("option",{value:"ungrouped"}," 未分组账户 ",-1)),(a(!0),n(ie,null,ue(L.value,o=>(a(),n("option",{key:o.id,value:o.id},x(o.name)+" ("+x(o.platform==="claude"?"Claude":"Gemini")+") ",9,Ol))),128))],544),[[ce,F.value]])]),e("button",{class:"btn btn-success px-4 sm:px-6 py-2 sm:py-3 flex items-center gap-2 w-full sm:w-auto justify-center",onClick:Oe(H,["stop"])},s[12]||(s[12]=[e("i",{class:"fas fa-plus"},null,-1),$("添加账户 ",-1)]))])]),U.value?(a(),n("div",Wl,s[14]||(s[14]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500"}," 正在加载账户... ",-1)]))):N.value.length===0?(a(),n("div",ql,s[15]||(s[15]=[e("div",{class:"w-16 h-16 mx-auto mb-4 bg-gray-100 rounded-full flex items-center justify-center"},[e("i",{class:"fas fa-user-circle text-gray-400 text-xl"})],-1),e("p",{class:"text-gray-500 text-lg"}," 暂无账户 ",-1),e("p",{class:"text-gray-400 text-sm mt-2"}," 点击上方按钮添加您的第一个账户 ",-1)]))):(a(),n("div",Bl,[e("table",Fl,[e("thead",Nl,[e("tr",null,[e("th",{class:"px-3 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100 w-[22%] min-w-[180px]",onClick:s[3]||(s[3]=o=>_("name"))},[s[16]||(s[16]=$(" 名称 ",-1)),y.value==="name"?(a(),n("i",{key:0,class:K(["fas",c.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(a(),n("i",Hl))]),e("th",{class:"px-3 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100 w-[15%] min-w-[120px]",onClick:s[4]||(s[4]=o=>_("platform"))},[s[17]||(s[17]=$(" 平台/类型 ",-1)),y.value==="platform"?(a(),n("i",{key:0,class:K(["fas",c.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(a(),n("i",Jl))]),e("th",{class:"px-3 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100 w-[12%] min-w-[100px]",onClick:s[5]||(s[5]=o=>_("status"))},[s[18]||(s[18]=$(" 状态 ",-1)),y.value==="status"?(a(),n("i",{key:0,class:K(["fas",c.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(a(),n("i",Yl))]),e("th",{class:"px-3 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100 w-[8%] min-w-[80px]",onClick:s[6]||(s[6]=o=>_("priority"))},[s[19]||(s[19]=$(" 优先级 ",-1)),y.value==="priority"?(a(),n("i",{key:0,class:K(["fas",c.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(a(),n("i",Ql))]),s[20]||(s[20]=e("th",{class:"px-3 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider w-[10%] min-w-[100px]"}," 代理 ",-1)),s[21]||(s[21]=e("th",{class:"px-3 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider w-[10%] min-w-[90px]"}," 今日使用 ",-1)),s[22]||(s[22]=e("th",{class:"px-3 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider w-[10%] min-w-[100px]"}," 会话窗口 ",-1)),s[23]||(s[23]=e("th",{class:"px-3 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider w-[8%] min-w-[80px]"}," 最后使用 ",-1)),s[24]||(s[24]=e("th",{class:"px-3 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider w-[15%] min-w-[180px]"}," 操作 ",-1))])]),e("tbody",Xl,[(a(!0),n(ie,null,ue(N.value,o=>(a(),n("tr",{key:o.id,class:"table-row"},[e("td",Zl,[e("div",eo,[s[29]||(s[29]=e("div",{class:"w-8 h-8 bg-gradient-to-br from-green-500 to-green-600 rounded-lg flex items-center justify-center mr-2 flex-shrink-0"},[e("i",{class:"fas fa-user-circle text-white text-xs"})],-1)),e("div",to,[e("div",so,[e("div",{class:"text-sm font-semibold text-gray-900 truncate",title:o.name},x(o.name),9,lo),o.accountType==="dedicated"?(a(),n("span",oo,s[25]||(s[25]=[e("i",{class:"fas fa-lock mr-1"},null,-1),$("专属 ",-1)]))):o.accountType==="group"?(a(),n("span",ao,s[26]||(s[26]=[e("i",{class:"fas fa-layer-group mr-1"},null,-1),$("分组调度 ",-1)]))):(a(),n("span",ro,s[27]||(s[27]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),$("共享 ",-1)]))),o.groupInfo?(a(),n("span",{key:3,class:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-gray-100 text-gray-600 ml-1",title:`所属分组: ${o.groupInfo.name}`},[s[28]||(s[28]=e("i",{class:"fas fa-folder mr-1"},null,-1)),$(x(o.groupInfo.name),1)],8,no)):b("",!0)]),e("div",{class:"text-xs text-gray-500 truncate",title:o.id},x(o.id),9,io)])])]),e("td",uo,[e("div",po,[o.platform==="gemini"?(a(),n("div",mo,[s[30]||(s[30]=e("i",{class:"fas fa-robot text-yellow-700 text-xs"},null,-1)),s[31]||(s[31]=e("span",{class:"text-xs font-semibold text-yellow-800"},"Gemini",-1)),s[32]||(s[32]=e("span",{class:"w-px h-4 bg-yellow-300 mx-1"},null,-1)),e("span",co,x(o.scopes&&o.scopes.length>0?"OAuth":"传统"),1)])):o.platform==="claude-console"?(a(),n("div",fo,s[33]||(s[33]=[e("i",{class:"fas fa-terminal text-purple-700 text-xs"},null,-1),e("span",{class:"text-xs font-semibold text-purple-800"},"Console",-1),e("span",{class:"w-px h-4 bg-purple-300 mx-1"},null,-1),e("span",{class:"text-xs font-medium text-purple-700"},"API Key",-1)]))):(a(),n("div",xo,[s[34]||(s[34]=e("i",{class:"fas fa-brain text-indigo-700 text-xs"},null,-1)),s[35]||(s[35]=e("span",{class:"text-xs font-semibold text-indigo-800"},"Claude",-1)),s[36]||(s[36]=e("span",{class:"w-px h-4 bg-indigo-300 mx-1"},null,-1)),e("span",vo,x(o.scopes&&o.scopes.length>0?"OAuth":"传统"),1)]))])]),e("td",yo,[e("div",go,[e("span",{class:K(["inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold",o.status==="blocked"?"bg-orange-100 text-orange-800":o.isActive?"bg-green-100 text-green-800":"bg-red-100 text-red-800"])},[e("div",{class:K(["w-2 h-2 rounded-full mr-2",o.status==="blocked"?"bg-orange-500":o.isActive?"bg-green-500":"bg-red-500"])},null,2),$(" "+x(o.status==="blocked"?"已封锁":o.isActive?"正常":"异常"),1)],2),o.rateLimitStatus&&o.rateLimitStatus.isRateLimited?(a(),n("span",bo,[s[37]||(s[37]=e("i",{class:"fas fa-exclamation-triangle mr-1"},null,-1)),$(" 限流中 ("+x(o.rateLimitStatus.minutesRemaining)+"分钟) ",1)])):b("",!0),o.schedulable===!1?(a(),n("span",wo,s[38]||(s[38]=[e("i",{class:"fas fa-pause-circle mr-1"},null,-1),$(" 不可调度 ",-1)]))):b("",!0),o.status==="blocked"&&o.errorMessage?(a(),n("span",{key:2,class:"text-xs text-gray-500 mt-1 max-w-xs truncate",title:o.errorMessage},x(o.errorMessage),9,ko)):b("",!0),o.accountType==="dedicated"?(a(),n("span",ho," 绑定: "+x(o.boundApiKeysCount||0)+" 个API Key ",1)):b("",!0)])]),e("td",$o,[o.platform==="claude"||o.platform==="claude-console"?(a(),n("div",Co,[e("div",To,[e("div",{class:"bg-gradient-to-r from-green-500 to-blue-600 h-2 rounded-full transition-all duration-300",style:Ce({width:101-(o.priority||50)+"%"})},null,4)]),e("span",Ao,x(o.priority||50),1)])):(a(),n("div",Uo,s[39]||(s[39]=[e("span",{class:"text-xs"},"N/A",-1)])))]),e("td",Io,[f(o.proxy)?(a(),n("div",{key:0,class:"text-xs bg-blue-50 px-2 py-1 rounded font-mono break-all",title:f(o.proxy)},x(f(o.proxy)),9,jo)):(a(),n("div",Vo," 无代理 "))]),e("td",_o,[o.usage&&o.usage.daily?(a(),n("div",So,[e("div",Mo,[s[40]||(s[40]=e("div",{class:"w-2 h-2 bg-green-500 rounded-full"},null,-1)),e("span",Go,x(o.usage.daily.requests||0)+" 次",1)]),e("div",Do,[s[41]||(s[41]=e("div",{class:"w-2 h-2 bg-blue-500 rounded-full"},null,-1)),e("span",Ko,x(d(o.usage.daily.allTokens||0))+" tokens",1)]),o.usage.averages&&o.usage.averages.rpm>0?(a(),n("div",Lo," 平均 "+x(o.usage.averages.rpm.toFixed(2))+" RPM ",1)):b("",!0)])):(a(),n("div",Ro," 暂无数据 "))]),e("td",Po,[o.platform==="claude"&&o.sessionWindow&&o.sessionWindow.hasActiveWindow?(a(),n("div",zo,[e("div",Eo,[e("div",Oo,[e("div",{class:"bg-gradient-to-r from-blue-500 to-indigo-600 h-2 rounded-full transition-all duration-300",style:Ce({width:o.sessionWindow.progress+"%"})},null,4)]),e("span",Wo,x(o.sessionWindow.progress)+"% ",1)]),e("div",qo,[e("div",null,x(m(o.sessionWindow.windowStart,o.sessionWindow.windowEnd)),1),o.sessionWindow.remainingTime>0?(a(),n("div",Bo," 剩余 "+x(T(o.sessionWindow.remainingTime)),1)):b("",!0)])])):o.platform==="claude"?(a(),n("div",Fo,s[42]||(s[42]=[e("i",{class:"fas fa-minus"},null,-1)]))):(a(),n("div",No,s[43]||(s[43]=[e("span",{class:"text-xs"},"N/A",-1)])))]),e("td",Ho,x(I(o.lastUsedAt)),1),e("td",Jo,[e("div",Yo,[o.platform==="claude"&&o.scopes?(a(),n("button",{key:0,disabled:o.isRefreshing,class:K(["px-2.5 py-1 rounded text-xs font-medium transition-colors",o.isRefreshing?"bg-gray-100 text-gray-400 cursor-not-allowed":"bg-blue-100 text-blue-700 hover:bg-blue-200"]),title:o.isRefreshing?"刷新中...":"刷新Token",onClick:A=>fe(o)},[e("i",{class:K(["fas fa-sync-alt",o.isRefreshing?"animate-spin":""])},null,2),s[44]||(s[44]=e("span",{class:"ml-1"},"刷新",-1))],10,Qo)):b("",!0),e("button",{disabled:o.isTogglingSchedulable,class:K(["px-2.5 py-1 rounded text-xs font-medium transition-colors",o.isTogglingSchedulable?"bg-gray-100 text-gray-400 cursor-not-allowed":o.schedulable?"bg-green-100 text-green-700 hover:bg-green-200":"bg-gray-100 text-gray-700 hover:bg-gray-200"]),title:o.schedulable?"点击禁用调度":"点击启用调度",onClick:A=>me(o)},[e("i",{class:K(["fas",o.schedulable?"fa-toggle-on":"fa-toggle-off"])},null,2),e("span",Zo,x(o.schedulable?"调度":"停用"),1)],10,Xo),e("button",{class:"px-2.5 py-1 bg-blue-100 text-blue-700 rounded text-xs font-medium hover:bg-blue-200 transition-colors",title:"编辑账户",onClick:A=>de(o)},s[45]||(s[45]=[e("i",{class:"fas fa-edit"},null,-1),e("span",{class:"ml-1"},"编辑",-1)]),8,ea),e("button",{class:"px-2.5 py-1 bg-red-100 text-red-700 rounded text-xs font-medium hover:bg-red-200 transition-colors",title:"删除账户",onClick:A=>pe(o)},s[46]||(s[46]=[e("i",{class:"fas fa-trash"},null,-1),e("span",{class:"ml-1"},"删除",-1)]),8,ta)])])]))),128))])])])),!U.value&&N.value.length>0?(a(),n("div",sa,[(a(!0),n(ie,null,ue(N.value,o=>{var A,E,J,X,Z,B,P,ee;return a(),n("div",{key:o.id,class:"card p-4 hover:shadow-lg transition-shadow"},[e("div",la,[e("div",oa,[e("div",{class:K(["w-10 h-10 rounded-lg flex items-center justify-center flex-shrink-0",o.platform==="claude"?"bg-gradient-to-br from-purple-500 to-purple-600":"bg-gradient-to-br from-blue-500 to-blue-600"])},[e("i",{class:K(["text-white text-sm",o.platform==="claude"?"fas fa-brain":"fas fa-robot"])},null,2)],2),e("div",null,[e("h4",aa,x(o.name||o.email),1),e("div",ra,[e("span",na,x(o.platform),1),s[47]||(s[47]=e("span",{class:"text-xs text-gray-400"},"|",-1)),e("span",ia,x(o.type),1)])])]),e("span",{class:K(["inline-flex items-center px-2 py-1 rounded-full text-xs font-semibold",ge(o)])},[e("div",{class:K(["w-1.5 h-1.5 rounded-full mr-1.5",be(o)])},null,2),$(" "+x(ye(o)),1)],2)]),e("div",ua,[e("div",null,[s[48]||(s[48]=e("p",{class:"text-xs text-gray-500"}," 今日使用 ",-1)),e("p",da,x(d(((E=(A=o.usage)==null?void 0:A.daily)==null?void 0:E.requests)||0))+" 次 ",1),e("p",pa,x(d(((X=(J=o.usage)==null?void 0:J.daily)==null?void 0:X.allTokens)||0))+" tokens ",1)]),e("div",null,[s[49]||(s[49]=e("p",{class:"text-xs text-gray-500"}," 总使用量 ",-1)),e("p",ma,x(d(((B=(Z=o.usage)==null?void 0:Z.total)==null?void 0:B.requests)||0))+" 次 ",1),e("p",ca,x(d(((ee=(P=o.usage)==null?void 0:P.total)==null?void 0:ee.allTokens)||0))+" tokens ",1)])]),e("div",fa,[o.platform==="claude"&&o.sessionWindow&&o.sessionWindow.hasActiveWindow?(a(),n("div",xa,[e("div",va,[s[50]||(s[50]=e("span",{class:"text-gray-600 font-medium"},"会话窗口",-1)),e("span",ya,x(o.sessionWindow.progress)+"% ",1)]),e("div",ga,[e("div",{class:"h-full bg-gradient-to-r from-blue-500 to-indigo-600 transition-all duration-300",style:Ce({width:o.sessionWindow.progress+"%"})},null,4)]),e("div",ba,[e("span",wa,x(m(o.sessionWindow.windowStart,o.sessionWindow.windowEnd)),1),o.sessionWindow.remainingTime>0?(a(),n("span",ka," 剩余 "+x(T(o.sessionWindow.remainingTime)),1)):(a(),n("span",ha," 已结束 "))])])):b("",!0),e("div",$a,[s[51]||(s[51]=e("span",{class:"text-gray-500"},"最后使用",-1)),e("span",Ca,x(o.lastUsedAt?we(o.lastUsedAt):"从未使用"),1)]),o.proxyConfig&&o.proxyConfig.type!=="none"?(a(),n("div",Ta,[s[52]||(s[52]=e("span",{class:"text-gray-500"},"代理",-1)),e("span",Aa,x(o.proxyConfig.type.toUpperCase()),1)])):b("",!0),e("div",Ua,[s[53]||(s[53]=e("span",{class:"text-gray-500"},"优先级",-1)),e("span",Ia,x(o.priority||0),1)])]),e("div",ja,[o.platform==="claude"&&o.type==="oauth"?(a(),n("button",{key:0,class:"flex-1 px-3 py-2 text-xs text-blue-600 bg-blue-50 rounded-lg hover:bg-blue-100 transition-colors flex items-center justify-center gap-1",disabled:S.value[o.id],onClick:te=>r(o)},[e("i",{class:K(["fas fa-sync-alt",{"animate-spin":S.value[o.id]}])},null,2),$(" "+x(S.value[o.id]?"刷新中":"刷新"),1)],8,Va)):b("",!0),e("button",{class:K(["flex-1 px-3 py-2 text-xs rounded-lg transition-colors flex items-center justify-center gap-1",o.schedulable?"text-gray-600 bg-gray-50 hover:bg-gray-100":"text-green-600 bg-green-50 hover:bg-green-100"]),disabled:o.isTogglingSchedulable,onClick:te=>me(o)},[e("i",{class:K(["fas",o.schedulable?"fa-pause":"fa-play"])},null,2),$(" "+x(o.schedulable?"暂停":"启用"),1)],10,_a),e("button",{class:"flex-1 px-3 py-2 text-xs text-gray-600 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors",onClick:te=>de(o)},s[54]||(s[54]=[e("i",{class:"fas fa-edit mr-1"},null,-1),$(" 编辑 ",-1)]),8,Sa),e("button",{class:"px-3 py-2 text-xs text-red-600 bg-red-50 rounded-lg hover:bg-red-100 transition-colors",onClick:te=>pe(o)},s[55]||(s[55]=[e("i",{class:"fas fa-trash"},null,-1)]),8,Ma)])])}),128))])):b("",!0)]),v.value?(a(),oe(Ge,{key:0,onClose:s[7]||(s[7]=o=>v.value=!1),onSuccess:xe})):b("",!0),i.value?(a(),oe(Ge,{key:1,account:R.value,onClose:s[8]||(s[8]=o=>i.value=!1),onSuccess:ve},null,8,["account"])):b("",!0),he(Re,{show:Y(W),title:Y(p).title,message:Y(p).message,"confirm-text":Y(p).confirmText,"cancel-text":Y(p).cancelText,onConfirm:Y(u),onCancel:Y(G)},null,8,["show","title","message","confirm-text","cancel-text","onConfirm","onCancel"])]))}},za=We(Ga,[["__scopeId","data-v-2c7d7fea"]]);export{za as default};