import{r as k,aR as $e,o as K,V as Te,x as i,y as r,z as e,L as A,K as C,al as fe,aY as Z,aX as ge,aq as z,aZ as Ce,C as D,O as b,c as ee,P as j,I as te,a5 as be,R as ae,an as Y,u as E,q as Ae,Y as Ue,Q as _e,ac as Ie,B as je}from"./vue-vendor-CKToUHZx.js";import{s as S}from"./toast-BvwA7Mwb.js";import{a as M,_ as Ve}from"./index-DhITICXu.js";import"./element-plus-B8Fs_0jW.js";import"./vendor-BDiMbLwQ.js";const le=k(!1),xe=k({title:"",message:"",confirmText:"继续",cancelText:"取消"}),Q=k(null);function we(){return{showConfirmModal:le,confirmOptions:xe,showConfirm:(y,x,U="继续",$="取消")=>new Promise(h=>{xe.value={title:y,message:x,confirmText:U,cancelText:$},Q.value=h,le.value=!0}),handleConfirm:()=>{le.value=!1,Q.value&&(Q.value(!0),Q.value=null)},handleCancel:()=>{le.value=!1,Q.value&&(Q.value(!1),Q.value=null)}}}const he=$e("accounts",()=>{const R=k([]),L=k([]),o=k(!1),y=k(null),x=k(""),U=k("asc"),$=async()=>{o.value=!0,y.value=null;try{const f=await M.get("/admin/claude-accounts");if(f.success)R.value=f.data||[];else throw new Error(f.message||"获取Claude账户失败")}catch(f){throw y.value=f.message,f}finally{o.value=!1}},h=async()=>{o.value=!0,y.value=null;try{const f=await M.get("/admin/gemini-accounts");if(f.success)L.value=f.data||[];else throw new Error(f.message||"获取Gemini账户失败")}catch(f){throw y.value=f.message,f}finally{o.value=!1}};return{claudeAccounts:R,geminiAccounts:L,loading:o,error:y,sortBy:x,sortOrder:U,fetchClaudeAccounts:$,fetchGeminiAccounts:h,fetchAllAccounts:async()=>{o.value=!0,y.value=null;try{await Promise.all([$(),h()])}catch(f){throw y.value=f.message,f}finally{o.value=!1}},createClaudeAccount:async f=>{o.value=!0,y.value=null;try{const d=await M.post("/admin/claude-accounts",f);if(d.success)return await $(),d.data;throw new Error(d.message||"创建Claude账户失败")}catch(d){throw y.value=d.message,d}finally{o.value=!1}},createGeminiAccount:async f=>{o.value=!0,y.value=null;try{const d=await M.post("/admin/gemini-accounts",f);if(d.success)return await h(),d.data;throw new Error(d.message||"创建Gemini账户失败")}catch(d){throw y.value=d.message,d}finally{o.value=!1}},updateClaudeAccount:async(f,d)=>{o.value=!0,y.value=null;try{const T=await M.put(`/admin/claude-accounts/${f}`,d);if(T.success)return await $(),T;throw new Error(T.message||"更新Claude账户失败")}catch(T){throw y.value=T.message,T}finally{o.value=!1}},updateGeminiAccount:async(f,d)=>{o.value=!0,y.value=null;try{const T=await M.put(`/admin/gemini-accounts/${f}`,d);if(T.success)return await h(),T;throw new Error(T.message||"更新Gemini账户失败")}catch(T){throw y.value=T.message,T}finally{o.value=!1}},toggleAccount:async(f,d)=>{o.value=!0,y.value=null;try{const T=f==="claude"?`/admin/claude-accounts/${d}/toggle`:`/admin/gemini-accounts/${d}/toggle`,W=await M.put(T);if(W.success)return f==="claude"?await $():await h(),W;throw new Error(W.message||"切换状态失败")}catch(T){throw y.value=T.message,T}finally{o.value=!1}},deleteAccount:async(f,d)=>{o.value=!0,y.value=null;try{const T=f==="claude"?`/admin/claude-accounts/${d}`:`/admin/gemini-accounts/${d}`,W=await M.delete(T);if(W.success)return f==="claude"?await $():await h(),W;throw new Error(W.message||"删除失败")}catch(T){throw y.value=T.message,T}finally{o.value=!1}},refreshClaudeToken:async f=>{o.value=!0,y.value=null;try{const d=await M.post(`/admin/claude-accounts/${f}/refresh`);if(d.success)return await $(),d;throw new Error(d.message||"Token刷新失败")}catch(d){throw y.value=d.message,d}finally{o.value=!1}},generateClaudeAuthUrl:async f=>{try{const d=await M.post("/admin/claude-accounts/generate-auth-url",f);if(d.success)return d.data;throw new Error(d.message||"生成授权URL失败")}catch(d){throw y.value=d.message,d}},exchangeClaudeCode:async f=>{try{const d=await M.post("/admin/claude-accounts/exchange-code",f);if(d.success)return d.data;throw new Error(d.message||"交换授权码失败")}catch(d){throw y.value=d.message,d}},generateGeminiAuthUrl:async f=>{try{const d=await M.post("/admin/gemini-accounts/generate-auth-url",f);if(d.success)return d.data;throw new Error(d.message||"生成授权URL失败")}catch(d){throw y.value=d.message,d}},exchangeGeminiCode:async f=>{try{const d=await M.post("/admin/gemini-accounts/exchange-code",f);if(d.success)return d.data;throw new Error(d.message||"交换授权码失败")}catch(d){throw y.value=d.message,d}},sortAccounts:f=>{x.value===f?U.value=U.value==="asc"?"desc":"asc":(x.value=f,U.value="asc")},reset:()=>{R.value=[],L.value=[],o.value=!1,y.value=null,x.value="",U.value="asc"}}}),Se={class:"space-y-4"},Ge={class:"flex items-center justify-between"},Re={class:"flex items-center cursor-pointer"},Me={key:0,class:"bg-gray-50 p-4 rounded-lg border border-gray-200 space-y-4"},Pe={class:"grid grid-cols-2 gap-4"},Oe={class:"space-y-4"},Le={class:"flex items-center"},ze={key:0,class:"grid grid-cols-2 gap-4"},De={class:"relative"},Ee=["type"],ve={__name:"ProxyConfig",props:{modelValue:{type:Object,default:()=>({enabled:!1,type:"socks5",host:"",port:"",username:"",password:""})}},emits:["update:modelValue"],setup(R,{emit:L}){const o=R,y=L,x=k({...o.modelValue}),U=k(!!(x.value.username||x.value.password)),$=k(!1);K(()=>o.modelValue,v=>{JSON.stringify(v)!==JSON.stringify(x.value)&&(x.value={...v},U.value=!!(v.username||v.password))},{deep:!0}),K(()=>x.value.enabled,v=>{_()}),K(()=>x.value.type,v=>{_()}),K(()=>x.value.host,v=>{_()}),K(()=>x.value.port,v=>{_()}),K(()=>x.value.username,v=>{_()}),K(()=>x.value.password,v=>{_()}),K(U,v=>{v||(x.value.username="",x.value.password="",_())});let h=null;function _(){h&&clearTimeout(h),h=setTimeout(()=>{const v={...x.value};U.value||(v.username="",v.password=""),y("update:modelValue",v)},100)}return Te(()=>{h&&clearTimeout(h)}),(v,c)=>(r(),i("div",Se,[e("div",Ge,[c[9]||(c[9]=e("h4",{class:"text-sm font-semibold text-gray-700"},"代理设置 (可选)",-1)),e("label",Re,[C(e("input",{type:"checkbox","onUpdate:modelValue":c[0]||(c[0]=I=>x.value.enabled=I),class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[fe,x.value.enabled]]),c[8]||(c[8]=e("span",{class:"ml-2 text-sm text-gray-700"},"启用代理",-1))])]),x.value.enabled?(r(),i("div",Me,[c[17]||(c[17]=Z('
配置代理以访问受限的网络资源。支持 SOCKS5 和 HTTP 代理。
请确保代理服务器稳定可用,否则会影响账户的正常使用。
',1)),e("div",null,[c[11]||(c[11]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"代理类型",-1)),C(e("select",{"onUpdate:modelValue":c[1]||(c[1]=I=>x.value.type=I),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),[[ge,x.value.type]])]),e("div",Pe,[e("div",null,[c[12]||(c[12]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"主机地址",-1)),C(e("input",{"onUpdate:modelValue":c[2]||(c[2]=I=>x.value.host=I),type:"text",placeholder:"例如: 192.168.1.100",class:"form-input w-full"},null,512),[[z,x.value.host]])]),e("div",null,[c[13]||(c[13]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"端口",-1)),C(e("input",{"onUpdate:modelValue":c[3]||(c[3]=I=>x.value.port=I),type:"number",placeholder:"例如: 1080",class:"form-input w-full"},null,512),[[z,x.value.port]])])]),e("div",Oe,[e("div",Le,[C(e("input",{type:"checkbox","onUpdate:modelValue":c[4]||(c[4]=I=>U.value=I),id:"proxyAuth",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[fe,U.value]]),c[14]||(c[14]=e("label",{for:"proxyAuth",class:"ml-2 text-sm text-gray-700 cursor-pointer"}," 需要身份验证 ",-1))]),U.value?(r(),i("div",ze,[e("div",null,[c[15]||(c[15]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"用户名",-1)),C(e("input",{"onUpdate:modelValue":c[5]||(c[5]=I=>x.value.username=I),type:"text",placeholder:"代理用户名",class:"form-input w-full"},null,512),[[z,x.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",De,[C(e("input",{"onUpdate:modelValue":c[6]||(c[6]=I=>x.value.password=I),type:$.value?"text":"password",placeholder:"代理密码",class:"form-input w-full pr-10"},null,8,Ee),[[Ce,x.value.password]]),e("button",{type:"button",onClick:c[7]||(c[7]=I=>$.value=!$.value),class:"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600"},[e("i",{class:D($.value?"fas fa-eye-slash":"fas fa-eye")},null,2)])])])])):A("",!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,"提示:"),b("代理设置将用于所有与此账户相关的API请求。请确保代理服务器支持HTTPS流量转发。 ")])],-1))])):A("",!0)]))}},Ke={class:"space-y-6"},We={key:0},qe={class:"bg-blue-50 p-6 rounded-lg border border-blue-200"},Be={class:"flex items-start gap-4"},Ne={class:"flex-1"},Fe={class:"space-y-4"},He={class:"bg-white/80 rounded-lg p-4 border border-blue-300"},Je={class:"flex items-start gap-3"},Ye={class:"flex-1"},Qe=["disabled"],Xe={key:0,class:"fas fa-link mr-2"},Ze={key:1,class:"loading-spinner mr-2"},et={key:1,class:"space-y-3"},tt={class:"flex items-center gap-2"},st=["value"],lt={class:"bg-white/80 rounded-lg p-4 border border-blue-300"},at={class:"flex items-start gap-3"},ot={class:"flex-1"},nt={class:"space-y-3"},rt={key:1},it={class:"bg-green-50 p-6 rounded-lg border border-green-200"},ut={class:"flex items-start gap-4"},dt={class:"flex-1"},ct={class:"space-y-4"},mt={class:"bg-white/80 rounded-lg p-4 border border-green-300"},pt={class:"flex items-start gap-3"},ft={class:"flex-1"},xt=["disabled"],vt={key:0,class:"fas fa-link mr-2"},yt={key:1,class:"loading-spinner mr-2"},gt={key:1,class:"space-y-3"},bt={class:"flex items-center gap-2"},wt=["value"],ht={class:"bg-white/80 rounded-lg p-4 border border-green-300"},kt={class:"flex items-start gap-3"},$t={class:"flex-1"},Tt={class:"space-y-3"},Ct={class:"flex gap-3 pt-4"},At=["disabled"],Ut={key:0,class:"loading-spinner mr-2"},_t={__name:"OAuthFlow",props:{platform:{type:String,required:!0},proxy:{type:Object,default:null}},emits:["success","back"],setup(R,{emit:L}){const o=R,y=L,x=he(),U=k(!1),$=k(!1),h=k(""),_=k(""),v=k(!1),c=k(""),I=ee(()=>h.value&&_.value.trim());K(_,g=>{if(!g||typeof g!="string")return;const a=g.trim();if(!a)return;if(a.startsWith("http://")||a.startsWith("https://"))if(a.startsWith("http://localhost:45462"))try{const q=new URL(a).searchParams.get("code");q?(_.value=q,S("成功提取授权码!","success"),console.log("Successfully extracted authorization code from URL")):S("URL 中未找到授权码参数,请检查链接是否正确","error")}catch(N){console.error("Failed to parse URL:",N),S("链接格式错误,请检查是否为完整的 URL","error")}else if(o.platform==="gemini")try{const q=new URL(a).searchParams.get("code");q&&(_.value=q,S("成功提取授权码!","success"))}catch{}else S("请粘贴以 http://localhost:45462 开头的链接","error")});const P=async()=>{var g;U.value=!0;try{const a=(g=o.proxy)!=null&&g.enabled?{proxy:{type:o.proxy.type,host:o.proxy.host,port:parseInt(o.proxy.port),username:o.proxy.username||null,password:o.proxy.password||null}}:{};if(o.platform==="claude"){const G=await x.generateClaudeAuthUrl(a);h.value=G.authUrl,c.value=G.sessionId}else if(o.platform==="gemini"){const G=await x.generateGeminiAuthUrl(a);h.value=G.authUrl,c.value=G.sessionId}}catch(a){S(a.message||"生成授权链接失败","error")}finally{U.value=!1}},V=()=>{h.value="",_.value="",P()},F=async()=>{try{await navigator.clipboard.writeText(h.value),v.value=!0,S("链接已复制","success"),setTimeout(()=>{v.value=!1},2e3)}catch{const a=document.createElement("input");a.value=h.value,document.body.appendChild(a),a.select(),document.execCommand("copy"),document.body.removeChild(a),v.value=!0,S("链接已复制","success"),setTimeout(()=>{v.value=!1},2e3)}},s=async()=>{var g;if(I.value){$.value=!0;try{let a={};o.platform==="claude"?a={sessionId:c.value,callbackUrl:_.value.trim()}:o.platform==="gemini"&&(a={code:_.value.trim(),sessionId:c.value}),(g=o.proxy)!=null&&g.enabled&&(a.proxy={type:o.proxy.type,host:o.proxy.host,port:parseInt(o.proxy.port),username:o.proxy.username||null,password:o.proxy.password||null});let G;o.platform==="claude"?G=await x.exchangeClaudeCode(a):o.platform==="gemini"&&(G=await x.exchangeGeminiCode(a)),y("success",G)}catch(a){S(a.message||"授权失败,请检查授权码是否正确","error")}finally{$.value=!1}}};return(g,a)=>(r(),i("div",Ke,[R.platform==="claude"?(r(),i("div",We,[e("div",qe,[e("div",Be,[a[14]||(a[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",Ne,[a[12]||(a[12]=e("h4",{class:"font-semibold text-blue-900 mb-3"},"Claude 账户授权",-1)),a[13]||(a[13]=e("p",{class:"text-sm text-blue-800 mb-4"}," 请按照以下步骤完成 Claude 账户的授权: ",-1)),e("div",Fe,[e("div",He,[e("div",Je,[a[5]||(a[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",Ye,[a[4]||(a[4]=e("p",{class:"font-medium text-blue-900 mb-2"},"点击下方按钮生成授权链接",-1)),h.value?(r(),i("div",et,[e("div",tt,[e("input",{type:"text",value:h.value,readonly:"",class:"form-input flex-1 text-xs font-mono bg-gray-50"},null,8,st),e("button",{onClick:F,class:"px-3 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors",title:"复制链接"},[e("i",{class:D(v.value?"fas fa-check text-green-500":"fas fa-copy")},null,2)])]),e("button",{onClick:V,class:"text-xs text-blue-600 hover:text-blue-700"},a[3]||(a[3]=[e("i",{class:"fas fa-sync-alt mr-1"},null,-1),b("重新生成 ",-1)]))])):(r(),i("button",{key:0,onClick:P,disabled:U.value,class:"btn btn-primary px-4 py-2 text-sm"},[U.value?(r(),i("div",Ze)):(r(),i("i",Xe)),b(" "+j(U.value?"生成中...":"生成授权链接"),1)],8,Qe))])])]),a[11]||(a[11]=Z('2
在浏览器中打开链接并完成授权
请在新标签页中打开授权链接,登录您的 Claude 账户并授权。
注意: 如果您设置了代理,请确保浏览器也使用相同的代理访问授权页面。
',1)),e("div",lt,[e("div",at,[a[10]||(a[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",ot,[a[8]||(a[8]=e("p",{class:"font-medium text-blue-900 mb-2"},"输入 Authorization Code",-1)),a[9]||(a[9]=e("p",{class:"text-sm text-blue-700 mb-3"},[b(" 授权完成后,页面会显示一个 "),e("strong",null,"Authorization Code"),b(",请将其复制并粘贴到下方输入框: ")],-1)),e("div",nt,[e("div",null,[a[6]||(a[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"}),b("Authorization Code ")],-1)),C(e("textarea",{"onUpdate:modelValue":a[0]||(a[0]=G=>_.value=G),rows:"3",class:"form-input w-full resize-none font-mono text-sm",placeholder:"粘贴从Claude页面获取的Authorization Code..."},null,512),[[z,_.value]])]),a[7]||(a[7]=e("p",{class:"text-xs text-gray-500 mt-2"},[e("i",{class:"fas fa-info-circle mr-1"}),b(" 请粘贴从Claude页面复制的Authorization Code ")],-1))])])])])])])])])])):R.platform==="gemini"?(r(),i("div",rt,[e("div",it,[e("div",ut,[a[26]||(a[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",dt,[a[24]||(a[24]=e("h4",{class:"font-semibold text-green-900 mb-3"},"Gemini 账户授权",-1)),a[25]||(a[25]=e("p",{class:"text-sm text-green-800 mb-4"}," 请按照以下步骤完成 Gemini 账户的授权: ",-1)),e("div",ct,[e("div",mt,[e("div",pt,[a[17]||(a[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",ft,[a[16]||(a[16]=e("p",{class:"font-medium text-green-900 mb-2"},"点击下方按钮生成授权链接",-1)),h.value?(r(),i("div",gt,[e("div",bt,[e("input",{type:"text",value:h.value,readonly:"",class:"form-input flex-1 text-xs font-mono bg-gray-50"},null,8,wt),e("button",{onClick:F,class:"px-3 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors",title:"复制链接"},[e("i",{class:D(v.value?"fas fa-check text-green-500":"fas fa-copy")},null,2)])]),e("button",{onClick:V,class:"text-xs text-green-600 hover:text-green-700"},a[15]||(a[15]=[e("i",{class:"fas fa-sync-alt mr-1"},null,-1),b("重新生成 ",-1)]))])):(r(),i("button",{key:0,onClick:P,disabled:U.value,class:"btn btn-primary px-4 py-2 text-sm"},[U.value?(r(),i("div",yt)):(r(),i("i",vt)),b(" "+j(U.value?"生成中...":"生成授权链接"),1)],8,xt))])])]),a[23]||(a[23]=Z('2
在浏览器中打开链接并完成授权
点击上方的授权链接,在新页面中完成Google账号登录 点击“登录”按钮后可能会加载很慢(这是正常的) 如果超过1分钟还在加载,请按 F5 刷新页面 授权完成后会跳转到 http://localhost:45462 (可能显示无法访问) 提示: 如果页面一直无法跳转,可以打开浏览器开发者工具(F12),F5刷新一下授权页再点击页面的登录按钮,在“网络”标签中找到以 localhost:45462 开头的请求,复制其完整URL。
',1)),e("div",ht,[e("div",kt,[a[22]||(a[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",$t,[a[20]||(a[20]=e("p",{class:"font-medium text-green-900 mb-2"},"复制oauth后的链接",-1)),a[21]||(a[21]=e("p",{class:"text-sm text-green-700 mb-3"}," 复制浏览器地址栏的完整链接并粘贴到下方输入框: ",-1)),e("div",Tt,[e("div",null,[a[18]||(a[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"}),b("复制oauth后的链接 ")],-1)),C(e("textarea",{"onUpdate:modelValue":a[1]||(a[1]=G=>_.value=G),rows:"3",class:"form-input w-full resize-none font-mono text-sm",placeholder:"粘贴以 http://localhost:45462 开头的完整链接..."},null,512),[[z,_.value]])]),a[19]||(a[19]=Z(' 支持粘贴完整链接,系统会自动提取授权码
也可以直接粘贴授权码(code参数的值)
',1))])])])])])])])])])):A("",!0),e("div",Ct,[e("button",{type:"button",onClick:a[2]||(a[2]=G=>g.$emit("back")),class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors"}," 上一步 "),e("button",{type:"button",onClick:s,disabled:!I.value||$.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[$.value?(r(),i("div",Ut)):A("",!0),b(" "+j($.value?"验证中...":"完成授权"),1)],8,At)])]))}},It={key:0,class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},jt={class:"modal-content w-full max-w-md p-6 mx-auto"},Vt={class:"flex items-start gap-4 mb-6"},St={class:"flex-1"},Gt={class:"text-lg font-bold text-gray-900 mb-2"},Rt={class:"text-gray-600 text-sm leading-relaxed whitespace-pre-line"},Mt={class:"flex gap-3"},ke={__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(R){return(L,o)=>(r(),te(be,{to:"body"},[R.show?(r(),i("div",It,[e("div",jt,[e("div",Vt,[o[2]||(o[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",St,[e("h3",Gt,j(R.title),1),e("p",Rt,j(R.message),1)])]),e("div",Mt,[e("button",{onClick:o[0]||(o[0]=y=>L.$emit("cancel")),class:"flex-1 px-4 py-2.5 bg-gray-100 text-gray-700 rounded-xl font-medium hover:bg-gray-200 transition-colors"},j(R.cancelText),1),e("button",{onClick:o[1]||(o[1]=y=>L.$emit("confirm")),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"},j(R.confirmText),1)])])])):A("",!0)]))}},Pt={key:0,class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},Ot={class:"modal-content w-full max-w-2xl p-8 mx-auto max-h-[90vh] overflow-y-auto custom-scrollbar"},Lt={class:"flex items-center justify-between mb-6"},zt={class:"flex items-center gap-3"},Dt={class:"text-xl font-bold text-gray-900"},Et={key:0,class:"flex items-center justify-center mb-8"},Kt={class:"flex items-center space-x-4"},Wt={class:"flex items-center"},qt={class:"flex items-center"},Bt={key:1},Nt={class:"space-y-6"},Ft={key:0},Ht={class:"flex gap-4"},Jt={class:"flex items-center cursor-pointer"},Yt={class:"flex items-center cursor-pointer"},Qt={key:1},Xt={class:"flex gap-4"},Zt={class:"flex items-center cursor-pointer"},es={class:"flex items-center cursor-pointer"},ts={key:0,class:"text-red-500 text-xs mt-1"},ss={class:"flex gap-4"},ls={class:"flex items-center cursor-pointer"},as={class:"flex items-center cursor-pointer"},os={key:2},ns={key:3,class:"space-y-4 bg-blue-50 p-4 rounded-lg border border-blue-200"},rs={class:"flex items-start gap-3 mb-4"},is={key:0,class:"text-sm text-blue-800 mb-2"},us={key:1,class:"text-sm text-blue-800 mb-2"},ds={class:"bg-white/80 rounded-lg p-3 mt-2 mb-2 border border-blue-300"},cs={key:0,class:"text-xs text-blue-800"},ms={key:1,class:"text-xs text-blue-800"},ps={key:0,class:"text-red-500 text-xs mt-1"},fs={class:"flex gap-3 pt-4"},xs=["disabled"],vs=["disabled"],ys={key:0,class:"loading-spinner mr-2"},gs={key:3,class:"space-y-6"},bs={class:"flex gap-4"},ws={class:"flex items-center cursor-pointer"},hs={class:"flex items-center cursor-pointer"},ks={key:0},$s={class:"bg-amber-50 p-4 rounded-lg border border-amber-200"},Ts={class:"space-y-4"},Cs={class:"flex gap-3 pt-4"},As=["disabled"],Us={key:0,class:"loading-spinner mr-2"},ye={__name:"AccountForm",props:{account:{type:Object,default:null}},emits:["close","success"],setup(R,{emit:L}){var f,d,T,W,se;const o=R,y=L,x=he(),{showConfirmModal:U,confirmOptions:$,showConfirm:h,handleConfirm:_,handleCancel:v}=we(),c=ee(()=>!!o.account),I=k(!0),P=k(1),V=k(!1),F=()=>{var p;return(p=o.account)!=null&&p.proxy&&o.account.proxy.host&&o.account.proxy.port?{enabled:!0,type:o.account.proxy.type||"socks5",host:o.account.proxy.host,port:o.account.proxy.port,username:o.account.proxy.username||"",password:o.account.proxy.password||""}:{enabled:!1,type:"socks5",host:"",port:"",username:"",password:""}},s=k({platform:((f=o.account)==null?void 0:f.platform)||"claude",addType:"oauth",name:((d=o.account)==null?void 0:d.name)||"",description:((T=o.account)==null?void 0:T.description)||"",accountType:((W=o.account)==null?void 0:W.accountType)||"shared",projectId:((se=o.account)==null?void 0:se.projectId)||"",accessToken:"",refreshToken:"",proxy:F()}),g=k({name:"",accessToken:""}),a=ee(()=>{var p;return((p=s.value.name)==null?void 0:p.trim())&&s.value.platform});ee(()=>{var p,t,m;return s.value.addType==="manual"?((p=s.value.name)==null?void 0:p.trim())&&((t=s.value.accessToken)==null?void 0:t.trim()):(m=s.value.name)==null?void 0:m.trim()});const G=async()=>{if(g.value.name="",!a.value){(!s.value.name||s.value.name.trim()==="")&&(g.value.name="请填写账户名称");return}s.value.platform==="gemini"&&P.value===1&&s.value.addType==="oauth"&&(!s.value.projectId||s.value.projectId.trim()==="")&&!await h("项目编号未填写",`您尚未填写项目编号。
如果您的Google账号绑定了Google Cloud或被识别为Workspace账号,需要提供项目编号。
如果您使用的是普通个人账号,可以继续不填写。`,"继续","返回填写")||(P.value=2)},N=async p=>{V.value=!0;try{const t={name:s.value.name,description:s.value.description,accountType:s.value.accountType,proxy:s.value.proxy.enabled?{type:s.value.proxy.type,host:s.value.proxy.host,port:parseInt(s.value.proxy.port),username:s.value.proxy.username||null,password:s.value.proxy.password||null}:null};s.value.platform==="claude"?t.claudeAiOauth=p.claudeAiOauth||p:s.value.platform==="gemini"&&(t.geminiOauth=p.tokens||p,s.value.projectId&&(t.projectId=s.value.projectId));let m;s.value.platform==="claude"?m=await x.createClaudeAccount(t):m=await x.createGeminiAccount(t),y("success",m)}catch(t){S(t.message||"账户创建失败","error")}finally{V.value=!1}},q=async()=>{g.value.name="",g.value.accessToken="";let p=!1;if((!s.value.name||s.value.name.trim()==="")&&(g.value.name="请填写账户名称",p=!0),s.value.addType==="manual"&&(!s.value.accessToken||s.value.accessToken.trim()==="")&&(g.value.accessToken="请填写 Access Token",p=!0),!p){V.value=!0;try{const t={name:s.value.name,description:s.value.description,accountType:s.value.accountType,proxy:s.value.proxy.enabled?{type:s.value.proxy.type,host:s.value.proxy.host,port:parseInt(s.value.proxy.port),username:s.value.proxy.username||null,password:s.value.proxy.password||null}:null};if(s.value.platform==="claude"){const u=s.value.refreshToken?6e5:31536e6;t.claudeAiOauth={accessToken:s.value.accessToken,refreshToken:s.value.refreshToken||"",expiresAt:Date.now()+u,scopes:["user:inference"]}}else if(s.value.platform==="gemini"){const u=s.value.refreshToken?6e5:31536e6;t.geminiOauth={access_token:s.value.accessToken,refresh_token:s.value.refreshToken||"",scope:"https://www.googleapis.com/auth/cloud-platform",token_type:"Bearer",expiry_date:Date.now()+u},s.value.projectId&&(t.projectId=s.value.projectId)}let m;s.value.platform==="claude"?m=await x.createClaudeAccount(t):m=await x.createGeminiAccount(t),y("success",m)}catch(t){S(t.message||"账户创建失败","error")}finally{V.value=!1}}},X=async()=>{if(g.value.name="",!s.value.name||s.value.name.trim()===""){g.value.name="请填写账户名称";return}if(!(s.value.platform==="gemini"&&(!s.value.projectId||s.value.projectId.trim()==="")&&!await h("项目编号未填写",`您尚未填写项目编号。
如果您的Google账号绑定了Google Cloud或被识别为Workspace账号,需要提供项目编号。
如果您使用的是普通个人账号,可以继续不填写。`,"继续保存","返回填写"))){V.value=!0;try{const p={name:s.value.name,description:s.value.description,accountType:s.value.accountType,proxy:s.value.proxy.enabled?{type:s.value.proxy.type,host:s.value.proxy.host,port:parseInt(s.value.proxy.port),username:s.value.proxy.username||null,password:s.value.proxy.password||null}:null};if(s.value.accessToken||s.value.refreshToken){if(o.account.platform==="claude"){const t=s.value.refreshToken?6e5:31536e6;p.claudeAiOauth={accessToken:s.value.accessToken||"",refreshToken:s.value.refreshToken||"",expiresAt:Date.now()+t,scopes:["user:inference"]}}else if(o.account.platform==="gemini"){const t=s.value.refreshToken?6e5:31536e6;p.geminiOauth={access_token:s.value.accessToken||"",refresh_token:s.value.refreshToken||"",scope:"https://www.googleapis.com/auth/cloud-platform",token_type:"Bearer",expiry_date:Date.now()+t}}}o.account.platform==="gemini"&&s.value.projectId&&(p.projectId=s.value.projectId),o.account.platform==="claude"?await x.updateClaudeAccount(o.account.id,p):await x.updateGeminiAccount(o.account.id,p),y("success")}catch(p){S(p.message||"账户更新失败","error")}finally{V.value=!1}}};return K(()=>s.value.name,()=>{var p;g.value.name&&((p=s.value.name)!=null&&p.trim())&&(g.value.name="")}),K(()=>s.value.accessToken,()=>{var p;g.value.accessToken&&((p=s.value.accessToken)!=null&&p.trim())&&(g.value.accessToken="")}),K(()=>o.account,p=>{if(p){const t=p.proxy&&p.proxy.host&&p.proxy.port?{enabled:!0,type:p.proxy.type||"socks5",host:p.proxy.host,port:p.proxy.port,username:p.proxy.username||"",password:p.proxy.password||""}:{enabled:!1,type:"socks5",host:"",port:"",username:"",password:""};s.value={platform:p.platform,addType:"oauth",name:p.name,description:p.description||"",accountType:p.accountType||"shared",projectId:p.projectId||"",accessToken:"",refreshToken:"",proxy:t}}},{immediate:!0}),(p,t)=>(r(),te(be,{to:"body"},[I.value?(r(),i("div",Pt,[e("div",Ot,[e("div",Lt,[e("div",zt,[t[24]||(t[24]=e("div",{class:"w-10 h-10 bg-gradient-to-br from-green-500 to-green-600 rounded-xl flex items-center justify-center"},[e("i",{class:"fas fa-user-circle text-white"})],-1)),e("h3",Dt,j(c.value?"编辑账户":"添加账户"),1)]),e("button",{onClick:t[0]||(t[0]=m=>p.$emit("close")),class:"text-gray-400 hover:text-gray-600 transition-colors"},t[25]||(t[25]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),!c.value&&s.value.addType==="oauth"?(r(),i("div",Et,[e("div",Kt,[e("div",Wt,[e("div",{class:D(["w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold",P.value>=1?"bg-blue-500 text-white":"bg-gray-200 text-gray-500"])}," 1 ",2),t[26]||(t[26]=e("span",{class:"ml-2 text-sm font-medium text-gray-700"},"基本信息",-1))]),t[28]||(t[28]=e("div",{class:"w-8 h-0.5 bg-gray-300"},null,-1)),e("div",qt,[e("div",{class:D(["w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold",P.value>=2?"bg-blue-500 text-white":"bg-gray-200 text-gray-500"])}," 2 ",2),t[27]||(t[27]=e("span",{class:"ml-2 text-sm font-medium text-gray-700"},"授权认证",-1))])])])):A("",!0),P.value===1&&!c.value?(r(),i("div",Bt,[e("div",Nt,[c.value?A("",!0):(r(),i("div",Ft,[t[31]||(t[31]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"平台",-1)),e("div",Ht,[e("label",Jt,[C(e("input",{type:"radio","onUpdate:modelValue":t[1]||(t[1]=m=>s.value.platform=m),value:"claude",class:"mr-2"},null,512),[[Y,s.value.platform]]),t[29]||(t[29]=e("span",{class:"text-sm text-gray-700"},"Claude",-1))]),e("label",Yt,[C(e("input",{type:"radio","onUpdate:modelValue":t[2]||(t[2]=m=>s.value.platform=m),value:"gemini",class:"mr-2"},null,512),[[Y,s.value.platform]]),t[30]||(t[30]=e("span",{class:"text-sm text-gray-700"},"Gemini",-1))])])])),c.value?A("",!0):(r(),i("div",Qt,[t[34]||(t[34]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"添加方式",-1)),e("div",Xt,[e("label",Zt,[C(e("input",{type:"radio","onUpdate:modelValue":t[3]||(t[3]=m=>s.value.addType=m),value:"oauth",class:"mr-2"},null,512),[[Y,s.value.addType]]),t[32]||(t[32]=e("span",{class:"text-sm text-gray-700"},"OAuth 授权 (推荐)",-1))]),e("label",es,[C(e("input",{type:"radio","onUpdate:modelValue":t[4]||(t[4]=m=>s.value.addType=m),value:"manual",class:"mr-2"},null,512),[[Y,s.value.addType]]),t[33]||(t[33]=e("span",{class:"text-sm text-gray-700"},"手动输入 Access Token",-1))])])])),e("div",null,[t[35]||(t[35]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户名称",-1)),C(e("input",{"onUpdate:modelValue":t[5]||(t[5]=m=>s.value.name=m),type:"text",required:"",class:D(["form-input w-full",{"border-red-500":g.value.name}]),placeholder:"为账户设置一个易识别的名称"},null,2),[[z,s.value.name]]),g.value.name?(r(),i("p",ts,j(g.value.name),1)):A("",!0)]),e("div",null,[t[36]||(t[36]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"描述 (可选)",-1)),C(e("textarea",{"onUpdate:modelValue":t[6]||(t[6]=m=>s.value.description=m),rows:"3",class:"form-input w-full resize-none",placeholder:"账户用途说明..."},null,512),[[z,s.value.description]])]),e("div",null,[t[39]||(t[39]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户类型",-1)),e("div",ss,[e("label",ls,[C(e("input",{type:"radio","onUpdate:modelValue":t[7]||(t[7]=m=>s.value.accountType=m),value:"shared",class:"mr-2"},null,512),[[Y,s.value.accountType]]),t[37]||(t[37]=e("span",{class:"text-sm text-gray-700"},"共享账户",-1))]),e("label",as,[C(e("input",{type:"radio","onUpdate:modelValue":t[8]||(t[8]=m=>s.value.accountType=m),value:"dedicated",class:"mr-2"},null,512),[[Y,s.value.accountType]]),t[38]||(t[38]=e("span",{class:"text-sm text-gray-700"},"专属账户",-1))])]),t[40]||(t[40]=e("p",{class:"text-xs text-gray-500 mt-2"}," 共享账户:供所有API Key使用;专属账户:仅供特定API Key使用 ",-1))]),s.value.platform==="gemini"?(r(),i("div",os,[t[41]||(t[41]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"项目编号 (可选)",-1)),C(e("input",{"onUpdate:modelValue":t[9]||(t[9]=m=>s.value.projectId=m),type:"text",class:"form-input w-full",placeholder:"例如:123456789012(纯数字)"},null,512),[[z,s.value.projectId]]),t[42]||(t[42]=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 账号需要提供项目编号"),e("p",null,"某些 Google 账号(特别是绑定了 Google Cloud 的账号)会被识别为 Workspace 账号,需要提供额外的项目编号。"),e("div",{class:"mt-2 p-2 bg-white rounded border border-yellow-300"},[e("p",{class:"font-medium mb-1"},"如何获取项目编号:"),e("ol",{class:"list-decimal list-inside space-y-1 ml-2"},[e("li",null,[b("访问 "),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,[b("复制"),e("span",{class:"font-semibold text-red-600"},"项目编号(Project Number)"),b(",通常是12位纯数字")]),e("li",{class:"text-red-600"},"⚠️ 注意:不要复制项目ID(Project ID),要复制项目编号!")])]),e("p",{class:"mt-2"},[e("strong",null,"提示:"),b("如果您的账号是普通个人账号(未绑定 Google Cloud),请留空此字段。")])])])],-1))])):A("",!0),s.value.addType==="manual"?(r(),i("div",ns,[e("div",rs,[t[48]||(t[48]=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[46]||(t[46]=e("h5",{class:"font-semibold text-blue-900 mb-2"},"手动输入 Token",-1)),s.value.platform==="claude"?(r(),i("p",is," 请输入有效的 Claude Access Token。如果您有 Refresh Token,建议也一并填写以支持自动刷新。 ")):s.value.platform==="gemini"?(r(),i("p",us," 请输入有效的 Gemini Access Token。如果您有 Refresh Token,建议也一并填写以支持自动刷新。 ")):A("",!0),e("div",ds,[t[45]||(t[45]=e("p",{class:"text-sm text-blue-900 font-medium mb-1"},[e("i",{class:"fas fa-folder-open mr-1"}),b(" 获取 Access Token 的方法: ")],-1)),s.value.platform==="claude"?(r(),i("p",cs,t[43]||(t[43]=[b(" 请从已登录 Claude Code 的机器上获取 ",-1),e("code",{class:"bg-blue-100 px-1 py-0.5 rounded font-mono"},"~/.claude/.credentials.json",-1),b(" 文件中的凭证, 请勿使用 Claude 官网 API Keys 页面的密钥。 ",-1)]))):s.value.platform==="gemini"?(r(),i("p",ms,t[44]||(t[44]=[b(" 请从已登录 Gemini CLI 的机器上获取 ",-1),e("code",{class:"bg-blue-100 px-1 py-0.5 rounded font-mono"},"~/.config/gemini/credentials.json",-1),b(" 文件中的凭证。 ",-1)]))):A("",!0)]),t[47]||(t[47]=e("p",{class:"text-xs text-blue-600"},"💡 如果未填写 Refresh Token,Token 过期后需要手动更新。",-1))])]),e("div",null,[t[49]||(t[49]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"Access Token *",-1)),C(e("textarea",{"onUpdate:modelValue":t[10]||(t[10]=m=>s.value.accessToken=m),rows:"4",required:"",class:D(["form-input w-full resize-none font-mono text-xs",{"border-red-500":g.value.accessToken}]),placeholder:"请输入 Access Token..."},null,2),[[z,s.value.accessToken]]),g.value.accessToken?(r(),i("p",ps,j(g.value.accessToken),1)):A("",!0)]),e("div",null,[t[50]||(t[50]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"Refresh Token (可选)",-1)),C(e("textarea",{"onUpdate:modelValue":t[11]||(t[11]=m=>s.value.refreshToken=m),rows:"4",class:"form-input w-full resize-none font-mono text-xs",placeholder:"请输入 Refresh Token..."},null,512),[[z,s.value.refreshToken]])])])):A("",!0),ae(ve,{modelValue:s.value.proxy,"onUpdate:modelValue":t[12]||(t[12]=m=>s.value.proxy=m)},null,8,["modelValue"]),e("div",fs,[e("button",{type:"button",onClick:t[13]||(t[13]=m=>p.$emit("close")),class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors"}," 取消 "),s.value.addType==="oauth"?(r(),i("button",{key:0,type:"button",onClick:G,disabled:V.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"}," 下一步 ",8,xs)):(r(),i("button",{key:1,type:"button",onClick:q,disabled:V.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[V.value?(r(),i("div",ys)):A("",!0),b(" "+j(V.value?"创建中...":"创建"),1)],8,vs))])])])):A("",!0),P.value===2&&s.value.addType==="oauth"?(r(),te(_t,{key:2,platform:s.value.platform,proxy:s.value.proxy,onSuccess:N,onBack:t[14]||(t[14]=m=>P.value=1)},null,8,["platform","proxy"])):A("",!0),c.value?(r(),i("div",gs,[e("div",null,[t[51]||(t[51]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户名称",-1)),C(e("input",{"onUpdate:modelValue":t[15]||(t[15]=m=>s.value.name=m),type:"text",required:"",class:"form-input w-full",placeholder:"为账户设置一个易识别的名称"},null,512),[[z,s.value.name]])]),e("div",null,[t[52]||(t[52]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"描述 (可选)",-1)),C(e("textarea",{"onUpdate:modelValue":t[16]||(t[16]=m=>s.value.description=m),rows:"3",class:"form-input w-full resize-none",placeholder:"账户用途说明..."},null,512),[[z,s.value.description]])]),e("div",null,[t[55]||(t[55]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户类型",-1)),e("div",bs,[e("label",ws,[C(e("input",{type:"radio","onUpdate:modelValue":t[17]||(t[17]=m=>s.value.accountType=m),value:"shared",class:"mr-2"},null,512),[[Y,s.value.accountType]]),t[53]||(t[53]=e("span",{class:"text-sm text-gray-700"},"共享账户",-1))]),e("label",hs,[C(e("input",{type:"radio","onUpdate:modelValue":t[18]||(t[18]=m=>s.value.accountType=m),value:"dedicated",class:"mr-2"},null,512),[[Y,s.value.accountType]]),t[54]||(t[54]=e("span",{class:"text-sm text-gray-700"},"专属账户",-1))])]),t[56]||(t[56]=e("p",{class:"text-xs text-gray-500 mt-2"}," 共享账户:供所有API Key使用;专属账户:仅供特定API Key使用 ",-1))]),s.value.platform==="gemini"?(r(),i("div",ks,[t[57]||(t[57]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"项目编号 (可选)",-1)),C(e("input",{"onUpdate:modelValue":t[19]||(t[19]=m=>s.value.projectId=m),type:"text",class:"form-input w-full",placeholder:"例如:123456789012(纯数字)"},null,512),[[z,s.value.projectId]]),t[58]||(t[58]=e("p",{class:"text-xs text-gray-500 mt-2"}," Google Cloud/Workspace 账号可能需要提供项目编号 ",-1))])):A("",!0),e("div",$s,[t[61]||(t[61]=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",Ts,[e("div",null,[t[59]||(t[59]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"新的 Access Token",-1)),C(e("textarea",{"onUpdate:modelValue":t[20]||(t[20]=m=>s.value.accessToken=m),rows:"4",class:"form-input w-full resize-none font-mono text-xs",placeholder:"留空表示不更新..."},null,512),[[z,s.value.accessToken]])]),e("div",null,[t[60]||(t[60]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"新的 Refresh Token",-1)),C(e("textarea",{"onUpdate:modelValue":t[21]||(t[21]=m=>s.value.refreshToken=m),rows:"4",class:"form-input w-full resize-none font-mono text-xs",placeholder:"留空表示不更新..."},null,512),[[z,s.value.refreshToken]])])])]),ae(ve,{modelValue:s.value.proxy,"onUpdate:modelValue":t[22]||(t[22]=m=>s.value.proxy=m)},null,8,["modelValue"]),e("div",Cs,[e("button",{type:"button",onClick:t[23]||(t[23]=m=>p.$emit("close")),class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors"}," 取消 "),e("button",{type:"button",onClick:X,disabled:V.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[V.value?(r(),i("div",Us)):A("",!0),b(" "+j(V.value?"更新中...":"更新"),1)],8,As)])])):A("",!0)])])):A("",!0),ae(ke,{show:E(U),title:E($).title,message:E($).message,"confirm-text":E($).confirmText,"cancel-text":E($).cancelText,onConfirm:E(_),onCancel:E(v)},null,8,["show","title","message","confirm-text","cancel-text","onConfirm","onCancel"])]))}},_s={class:"accounts-container"},Is={class:"card p-6"},js={class:"flex flex-col md:flex-row justify-between items-center gap-4 mb-6"},Vs={class:"flex gap-2"},Ss={key:0,class:"text-center py-12"},Gs={key:1,class:"text-center py-12"},Rs={key:2,class:"table-container"},Ms={class:"min-w-full"},Ps={class:"bg-gray-50/80 backdrop-blur-sm"},Os={key:1,class:"fas fa-sort ml-1 text-gray-400"},Ls={key:1,class:"fas fa-sort ml-1 text-gray-400"},zs={key:1,class:"fas fa-sort ml-1 text-gray-400"},Ds={key:1,class:"fas fa-sort ml-1 text-gray-400"},Es={class:"divide-y divide-gray-200/50"},Ks={class:"px-6 py-4 whitespace-nowrap"},Ws={class:"flex items-center"},qs={class:"flex items-center gap-2"},Bs={class:"text-sm font-semibold text-gray-900"},Ns={key:0,class:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-purple-100 text-purple-800"},Fs={key:1,class:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800"},Hs={class:"text-xs text-gray-500"},Js={class:"px-6 py-4 whitespace-nowrap"},Ys={key:0,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-yellow-100 text-yellow-800"},Qs={key:1,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-indigo-100 text-indigo-800"},Xs={class:"px-6 py-4 whitespace-nowrap"},Zs={key:0,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-blue-100 text-blue-800"},el={key:1,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-orange-100 text-orange-800"},tl={class:"px-6 py-4 whitespace-nowrap"},sl={class:"flex flex-col gap-1"},ll={key:0,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-yellow-100 text-yellow-800"},al={key:1,class:"text-xs text-gray-500"},ol={class:"px-6 py-4 whitespace-nowrap text-sm text-gray-600"},nl={key:0,class:"text-xs bg-blue-50 px-2 py-1 rounded font-mono"},rl={key:1,class:"text-gray-400"},il={class:"px-6 py-4 whitespace-nowrap text-sm"},ul={key:0,class:"space-y-1"},dl={class:"flex items-center gap-2"},cl={class:"text-sm font-medium text-gray-900"},ml={class:"flex items-center gap-2"},pl={class:"text-xs text-gray-600"},fl={key:0,class:"text-xs text-gray-500"},xl={key:1,class:"text-gray-400 text-xs"},vl={class:"px-6 py-4 whitespace-nowrap"},yl={key:0,class:"space-y-2"},gl={class:"flex items-center gap-2"},bl={class:"w-24 bg-gray-200 rounded-full h-2"},wl={class:"text-xs text-gray-700 font-medium min-w-[32px]"},hl={class:"text-xs text-gray-600"},kl={key:0,class:"text-indigo-600 font-medium"},$l={key:1,class:"text-gray-400 text-sm"},Tl={key:2,class:"text-gray-400 text-sm"},Cl={class:"px-6 py-4 whitespace-nowrap text-sm text-gray-600"},Al={class:"px-6 py-4 whitespace-nowrap text-sm font-medium"},Ul={class:"flex items-center gap-2"},_l=["onClick","disabled","title"],Il=["onClick"],jl=["onClick"],Vl={__name:"AccountsView",setup(R){const{showConfirmModal:L,confirmOptions:o,showConfirm:y,handleConfirm:x,handleCancel:U}=we(),$=k([]),h=k(!1),_=k("name"),v=k(""),c=k("asc"),I=k([]),P=k(!1),V=k(!1),F=k(null),s=ee(()=>v.value?[...$.value].sort((l,n)=>{var B,H,J,oe,ne,re,ie,ue,de,ce,me,pe;let w=l[v.value],O=n[v.value];return v.value==="dailyTokens"?(w=((H=(B=l.usage)==null?void 0:B.daily)==null?void 0:H.allTokens)||0,O=((oe=(J=n.usage)==null?void 0:J.daily)==null?void 0:oe.allTokens)||0):v.value==="dailyRequests"?(w=((re=(ne=l.usage)==null?void 0:ne.daily)==null?void 0:re.requests)||0,O=((ue=(ie=n.usage)==null?void 0:ie.daily)==null?void 0:ue.requests)||0):v.value==="totalTokens"&&(w=((ce=(de=l.usage)==null?void 0:de.total)==null?void 0:ce.allTokens)||0,O=((pe=(me=n.usage)==null?void 0:me.total)==null?void 0:pe.allTokens)||0),v.value==="lastUsed"&&(w=l.lastUsedAt?new Date(l.lastUsedAt).getTime():0,O=n.lastUsedAt?new Date(n.lastUsedAt).getTime():0),v.value==="status"&&(w=l.isActive?1:0,O=n.isActive?1:0),wO?c.value==="asc"?1:-1:0}):$.value),g=async()=>{h.value=!0;try{const[u,l,n]=await Promise.all([M.get("/admin/claude-accounts"),M.get("/admin/gemini-accounts"),M.get("/admin/api-keys")]);n.success&&(I.value=n.data||[]);const w=[];if(u.success){const O=(u.data||[]).map(B=>{const H=I.value.filter(J=>J.claudeAccountId===B.id).length;return{...B,platform:"claude",boundApiKeysCount:H}});w.push(...O)}if(l.success){const O=(l.data||[]).map(B=>{const H=I.value.filter(J=>J.geminiAccountId===B.id).length;return{...B,platform:"gemini",boundApiKeysCount:H}});w.push(...O)}$.value=w}catch{S("加载账户失败","error")}finally{h.value=!1}},a=u=>{u&&(v.value===u?c.value=c.value==="asc"?"desc":"asc":(v.value=u,c.value="asc"))},G=u=>{if(u==null)return"0";const l=Number(u);return l>=1e6?Math.floor(l/1e6).toLocaleString()+"M":l.toLocaleString()},N=u=>{if(!u)return"从未使用";const l=new Date(u),w=new Date-l;return w<6e4?"刚刚":w<36e5?`${Math.floor(w/6e4)} 分钟前`:w<864e5?`${Math.floor(w/36e5)} 小时前`:w<6048e5?`${Math.floor(w/864e5)} 天前`:l.toLocaleDateString("zh-CN")},q=async()=>{try{const u=await M.get("/admin/api-keys");u.success&&(I.value=u.data)}catch(u){console.error("Failed to load API keys:",u)}},X=u=>{if(!u||!u.host||!u.port)return null;let l=`${u.type}://${u.host}:${u.port}`;if(u.username){const n=u.username.length>2?u.username[0]+"***"+u.username[u.username.length-1]:"***",w=u.password?"****":"";l=`${u.type}://${n}:${w}@${u.host}:${u.port}`}return l},f=(u,l)=>{if(!u||!l)return"--";const n=new Date(u),w=new Date(l),O=n.getHours().toString().padStart(2,"0"),B=n.getMinutes().toString().padStart(2,"0"),H=w.getHours().toString().padStart(2,"0"),J=w.getMinutes().toString().padStart(2,"0");return`${O}:${B} - ${H}:${J}`},d=u=>{if(!u||u<=0)return"已结束";const l=Math.floor(u/60),n=u%60;return l>0?`${l}小时${n}分钟`:`${n}分钟`},T=()=>{P.value=!0},W=u=>{F.value=u,V.value=!0},se=async u=>{const l=I.value.filter(w=>w.claudeAccountId===u.id||w.geminiAccountId===u.id).length;if(l>0){S(`无法删除此账号,有 ${l} 个API Key绑定到此账号,请先解绑所有API Key`,"error");return}if(await y("删除账户",`确定要删除账户 "${u.name}" 吗?
此操作不可恢复。`,"删除","取消"))try{const w=u.platform==="claude"?`/admin/claude-accounts/${u.id}`:`/admin/gemini-accounts/${u.id}`,O=await M.delete(w);O.success?(S("账户已删除","success"),g()):S(O.message||"删除失败","error")}catch{S("删除失败","error")}},p=async u=>{if(!u.isRefreshing)try{u.isRefreshing=!0;const l=await M.post(`/admin/claude-accounts/${u.id}/refresh`);l.success?(S("Token刷新成功","success"),g()):S(l.message||"Token刷新失败","error")}catch{S("Token刷新失败","error")}finally{u.isRefreshing=!1}},t=()=>{P.value=!1,S("账户创建成功","success"),g()},m=()=>{V.value=!1,S("账户更新成功","success"),g()};return K(_,u=>{const l={name:"name",dailyTokens:"dailyTokens",dailyRequests:"dailyRequests",totalTokens:"totalTokens",lastUsed:"lastUsed"};l[u]&&a(l[u])}),Ae(()=>{g(),q()}),(u,l)=>(r(),i("div",_s,[e("div",Is,[e("div",js,[l[10]||(l[10]=e("div",null,[e("h3",{class:"text-xl font-bold text-gray-900 mb-2"},"账户管理"),e("p",{class:"text-gray-600"},"管理您的 Claude 和 Gemini 账户及代理配置")],-1)),e("div",Vs,[C(e("select",{"onUpdate:modelValue":l[0]||(l[0]=n=>_.value=n),onChange:l[1]||(l[1]=n=>a()),class:"form-input px-3 py-2 text-sm"},l[8]||(l[8]=[Z('按名称排序 按今日Token排序 按今日请求数排序 按总Token排序 按最后使用排序 ',5)]),544),[[ge,_.value]]),e("button",{onClick:Ue(T,["stop"]),class:"btn btn-success px-6 py-3 flex items-center gap-2"},l[9]||(l[9]=[e("i",{class:"fas fa-plus"},null,-1),b("添加账户 ",-1)]))])]),h.value?(r(),i("div",Ss,l[11]||(l[11]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500"},"正在加载账户...",-1)]))):s.value.length===0?(r(),i("div",Gs,l[12]||(l[12]=[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)]))):(r(),i("div",Rs,[e("table",Ms,[e("thead",Ps,[e("tr",null,[e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:l[2]||(l[2]=n=>a("name"))},[l[13]||(l[13]=b(" 名称 ",-1)),v.value==="name"?(r(),i("i",{key:0,class:D(["fas",c.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(r(),i("i",Os))]),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:l[3]||(l[3]=n=>a("platform"))},[l[14]||(l[14]=b(" 平台 ",-1)),v.value==="platform"?(r(),i("i",{key:0,class:D(["fas",c.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(r(),i("i",Ls))]),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:l[4]||(l[4]=n=>a("accountType"))},[l[15]||(l[15]=b(" 类型 ",-1)),v.value==="accountType"?(r(),i("i",{key:0,class:D(["fas",c.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(r(),i("i",zs))]),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:l[5]||(l[5]=n=>a("status"))},[l[16]||(l[16]=b(" 状态 ",-1)),v.value==="status"?(r(),i("i",{key:0,class:D(["fas",c.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(r(),i("i",Ds))]),l[17]||(l[17]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"代理",-1)),l[18]||(l[18]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"今日使用",-1)),l[19]||(l[19]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"会话窗口",-1)),l[20]||(l[20]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"最后使用",-1)),l[21]||(l[21]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"操作",-1))])]),e("tbody",Es,[(r(!0),i(_e,null,Ie(s.value,n=>(r(),i("tr",{key:n.id,class:"table-row"},[e("td",Ks,[e("div",Ws,[l[24]||(l[24]=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-3"},[e("i",{class:"fas fa-user-circle text-white text-xs"})],-1)),e("div",null,[e("div",qs,[e("div",Bs,j(n.name),1),n.accountType==="dedicated"?(r(),i("span",Ns,l[22]||(l[22]=[e("i",{class:"fas fa-lock mr-1"},null,-1),b("专属 ",-1)]))):(r(),i("span",Fs,l[23]||(l[23]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),b("共享 ",-1)])))]),e("div",Hs,j(n.id),1)])])]),e("td",Js,[n.platform==="gemini"?(r(),i("span",Ys,l[25]||(l[25]=[e("i",{class:"fas fa-robot mr-1"},null,-1),b("Gemini ",-1)]))):(r(),i("span",Qs,l[26]||(l[26]=[e("i",{class:"fas fa-brain mr-1"},null,-1),b("Claude ",-1)])))]),e("td",Xs,[n.scopes&&n.scopes.length>0?(r(),i("span",Zs,l[27]||(l[27]=[e("i",{class:"fas fa-lock mr-1"},null,-1),b("OAuth ",-1)]))):(r(),i("span",el,l[28]||(l[28]=[e("i",{class:"fas fa-key mr-1"},null,-1),b("传统 ",-1)])))]),e("td",tl,[e("div",sl,[e("span",{class:D(["inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold",n.isActive?"bg-green-100 text-green-800":"bg-red-100 text-red-800"])},[e("div",{class:D(["w-2 h-2 rounded-full mr-2",n.isActive?"bg-green-500":"bg-red-500"])},null,2),b(" "+j(n.isActive?"正常":"异常"),1)],2),n.rateLimitStatus&&n.rateLimitStatus.isRateLimited?(r(),i("span",ll,[l[29]||(l[29]=e("i",{class:"fas fa-exclamation-triangle mr-1"},null,-1)),b(" 限流中 ("+j(n.rateLimitStatus.minutesRemaining)+"分钟) ",1)])):A("",!0),n.accountType==="dedicated"?(r(),i("span",al," 绑定: "+j(n.boundApiKeysCount||0)+" 个API Key ",1)):A("",!0)])]),e("td",ol,[X(n.proxy)?(r(),i("div",nl,j(X(n.proxy)),1)):(r(),i("div",rl,"无代理"))]),e("td",il,[n.usage&&n.usage.daily?(r(),i("div",ul,[e("div",dl,[l[30]||(l[30]=e("div",{class:"w-2 h-2 bg-green-500 rounded-full"},null,-1)),e("span",cl,j(n.usage.daily.requests||0)+" 次",1)]),e("div",ml,[l[31]||(l[31]=e("div",{class:"w-2 h-2 bg-blue-500 rounded-full"},null,-1)),e("span",pl,j(G(n.usage.daily.allTokens||0))+" tokens",1)]),n.usage.averages&&n.usage.averages.rpm>0?(r(),i("div",fl," 平均 "+j(n.usage.averages.rpm.toFixed(2))+" RPM ",1)):A("",!0)])):(r(),i("div",xl,"暂无数据"))]),e("td",vl,[n.platform==="claude"&&n.sessionWindow&&n.sessionWindow.hasActiveWindow?(r(),i("div",yl,[e("div",gl,[e("div",bl,[e("div",{class:"bg-gradient-to-r from-blue-500 to-indigo-600 h-2 rounded-full transition-all duration-300",style:je({width:n.sessionWindow.progress+"%"})},null,4)]),e("span",wl,j(n.sessionWindow.progress)+"% ",1)]),e("div",hl,[e("div",null,j(f(n.sessionWindow.windowStart,n.sessionWindow.windowEnd)),1),n.sessionWindow.remainingTime>0?(r(),i("div",kl," 剩余 "+j(d(n.sessionWindow.remainingTime)),1)):A("",!0)])])):n.platform==="claude"?(r(),i("div",$l,l[32]||(l[32]=[e("i",{class:"fas fa-minus"},null,-1)]))):(r(),i("div",Tl,l[33]||(l[33]=[e("span",{class:"text-xs"},"N/A",-1)])))]),e("td",Cl,j(N(n.lastUsedAt)),1),e("td",Al,[e("div",Ul,[n.platform==="claude"&&n.scopes?(r(),i("button",{key:0,onClick:w=>p(n),disabled:n.isRefreshing,class:D(["px-3 py-1.5 rounded-lg text-xs font-medium transition-colors",n.isRefreshing?"bg-gray-100 text-gray-400 cursor-not-allowed":"bg-blue-100 text-blue-700 hover:bg-blue-200"]),title:n.isRefreshing?"刷新中...":"刷新Token"},[e("i",{class:D(["fas fa-sync-alt",n.isRefreshing?"animate-spin":""])},null,2)],10,_l)):A("",!0),e("button",{onClick:w=>W(n),class:"px-3 py-1.5 bg-blue-100 text-blue-700 rounded-lg text-xs font-medium hover:bg-blue-200 transition-colors"},l[34]||(l[34]=[e("i",{class:"fas fa-edit"},null,-1)]),8,Il),e("button",{onClick:w=>se(n),class:"px-3 py-1.5 bg-red-100 text-red-700 rounded-lg text-xs font-medium hover:bg-red-200 transition-colors"},l[35]||(l[35]=[e("i",{class:"fas fa-trash"},null,-1)]),8,jl)])])]))),128))])])]))]),P.value?(r(),te(ye,{key:0,onClose:l[6]||(l[6]=n=>P.value=!1),onSuccess:t})):A("",!0),V.value?(r(),te(ye,{key:1,account:F.value,onClose:l[7]||(l[7]=n=>V.value=!1),onSuccess:m},null,8,["account"])):A("",!0),ae(ke,{show:E(L),title:E(o).title,message:E(o).message,"confirm-text":E(o).confirmText,"cancel-text":E(o).cancelText,onConfirm:E(x),onCancel:E(U)},null,8,["show","title","message","confirm-text","cancel-text","onConfirm","onCancel"])]))}},Ol=Ve(Vl,[["__scopeId","data-v-aec45f3e"]]);export{Ol as default};