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