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