Files
claude-relay-service/web/admin-spa/dist/assets/AccountsView-B5i7uFP2.js
2025-08-18 01:38:00 +00:00

16 lines
135 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"},"项目 IDProject ID"),C(",通常是字符串格式 ")]),e("li",{class:"text-red-600"}," ⚠️ 注意:要复制项目 IDProject 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 TokenToken 过期后需要手动更新。 ",-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};