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