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