mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
4 lines
84 KiB
JavaScript
4 lines
84 KiB
JavaScript
import{aP as $e,r as k,aY as Ge,c as Ce,o as Te,q as He,Z as Ye,x as o,z as t,L as x,C as E,O as l,u as g,K as d,S as X,aq as p,al as Q,P as v,aT as A,Q as Z,ac as le,R as Ue,aV as _,J as Je,T as Xe,Y as Ze,y as n}from"./vue-vendor-DV7DYXbz.js";import{b1 as _e,b2 as et,_ as tt,s as f,b3 as at,b4 as rt,b5 as st,b6 as lt,b7 as ot,b8 as nt,b9 as Ae,ba as dt,bb as it,bc as ut,bd as gt,be as ft}from"./index-BahP9Xx9.js";import{C as ct}from"./ConfirmModal-C2rCOkXI.js";import"./element-plus-BSjV1f9S.js";import"./vendor-Dr8jvgFu.js";const bt=$e("settings",()=>{const M=k({siteName:"Claude Relay Service",siteIcon:"",siteIconData:"",showAdminButton:!0,apiStatsNotice:{enabled:!1,title:"",content:""},updatedAt:null}),R=k(!1),W=k(!1),I=async()=>{R.value=!0;const m=await _e();return m.success&&(M.value={...M.value,...m.data},w()),R.value=!1,m},b=async m=>{W.value=!0;const h=await et(m);return h.success&&(M.value={...M.value,...h.data},w()),W.value=!1,h},ee=async()=>{const m={siteName:"Claude Relay Service",siteIcon:"",siteIconData:"",showAdminButton:!0,apiStatsNotice:{enabled:!1,title:"",content:""},updatedAt:null};return M.value={...m},await b(m)},w=()=>{if(M.value.siteName&&(document.title=`${M.value.siteName} - 管理后台`),M.value.siteIconData||M.value.siteIcon){const m=document.querySelector('link[rel="icon"]')||document.createElement("link");m.rel="icon",m.href=M.value.siteIconData||M.value.siteIcon,document.querySelector('link[rel="icon"]')||document.head.appendChild(m)}};return{oemSettings:M,loading:R,saving:W,loadOemSettings:I,saveOemSettings:b,resetOemSettings:ee,applyOemSettings:w,formatDateTime:m=>m?new Date(m).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"",validateIconFile:m=>{const h=[];return m.size>350*1024&&h.push("图标文件大小不能超过 350KB"),["image/x-icon","image/png","image/jpeg","image/jpg","image/svg+xml"].includes(m.type)||h.push("不支持的文件类型,请选择 .ico, .png, .jpg 或 .svg 文件"),{isValid:h.length===0,errors:h}},fileToBase64:m=>new Promise((h,K)=>{const F=new FileReader;F.onload=te=>h(te.target.result),F.onerror=K,F.readAsDataURL(m)})}}),xt={class:"settings-container"},pt={class:"card p-4 sm:p-6"},yt={class:"mb-6"},vt={class:"flex space-x-8"},mt={key:0,class:"py-12 text-center"},kt={key:1},wt={class:"table-container hidden sm:block"},ht={class:"min-w-full"},St={class:"divide-y divide-gray-200/50 dark:divide-gray-600/50"},Ct={class:"table-row"},Tt={class:"px-6 py-4"},Ut={class:"table-row"},At={class:"px-6 py-4"},Mt={class:"space-y-3"},It={key:0,class:"inline-flex items-center gap-3 rounded-lg bg-gray-50 p-3 dark:bg-gray-700"},Bt=["src"],Et={class:"table-row"},Rt={class:"px-6 py-4"},Vt={class:"flex items-center"},Dt={class:"inline-flex cursor-pointer items-center"},Qt={class:"ml-3 text-sm font-medium text-gray-900 dark:text-gray-300"},qt={class:"border-b border-gray-100 dark:border-gray-700"},Pt={class:"px-6 py-4"},jt={class:"flex items-center"},Nt={class:"inline-flex cursor-pointer items-center"},Lt={class:"ml-3 text-sm font-medium text-gray-900 dark:text-gray-300"},Ot={key:0,class:"mt-3 space-y-3"},Wt={class:"px-6 py-6",colspan:"2"},zt={class:"flex items-center justify-between"},Kt={class:"flex gap-3"},Ft=["disabled"],$t={key:0,class:"loading-spinner mr-2"},Gt={key:1,class:"fas fa-save mr-2"},Ht=["disabled"],Yt={key:0,class:"text-sm text-gray-500 dark:text-gray-400"},Jt={class:"space-y-4 sm:hidden"},Xt={class:"glass-card p-4"},Zt={class:"glass-card p-4"},_t={class:"space-y-3"},ea={key:0,class:"inline-flex items-center gap-3 rounded-lg bg-gray-50 p-3 dark:bg-gray-700"},ta=["src"],aa={class:"glass-card p-4"},ra={class:"space-y-2"},sa={class:"inline-flex cursor-pointer items-center"},la={class:"ml-3 text-sm font-medium text-gray-900 dark:text-gray-300"},oa={class:"glass-card p-4"},na={class:"flex flex-col gap-3"},da=["disabled"],ia={key:0,class:"loading-spinner mr-2"},ua={key:1,class:"fas fa-save mr-2"},ga=["disabled"],fa={key:0,class:"text-center text-sm text-gray-500 dark:text-gray-400"},ca={class:"mb-6 rounded-lg bg-white/80 p-6 shadow-lg backdrop-blur-sm dark:bg-gray-800/80"},ba={class:"flex items-center justify-between"},xa={class:"relative inline-flex cursor-pointer items-center"},pa={class:"mb-6 rounded-lg bg-white/80 p-6 shadow-lg backdrop-blur-sm dark:bg-gray-800/80"},ya={class:"space-y-3"},va={class:"font-medium text-gray-700 dark:text-gray-300"},ma={class:"ml-2 text-sm text-gray-500 dark:text-gray-400"},ka={class:"relative inline-flex cursor-pointer items-center"},wa=["onUpdate:modelValue"],ha={class:"mb-6 rounded-lg bg-white/80 p-6 shadow-lg backdrop-blur-sm dark:bg-gray-800/80"},Sa={class:"mb-4 flex items-center justify-between"},Ca={key:0,class:"space-y-4"},Ta={class:"flex items-start justify-between"},Ua={class:"flex-1"},Aa={class:"flex items-center"},Ma={class:"font-semibold text-gray-800 dark:text-gray-200"},Ia={class:"text-sm text-gray-500 dark:text-gray-400"},Ba={class:"mt-3 space-y-1 text-sm"},Ea={key:0,class:"flex items-center text-gray-600 dark:text-gray-400"},Ra={class:"truncate"},Va={key:1,class:"flex items-center text-gray-600 dark:text-gray-400"},Da={class:"truncate"},Qa={key:2,class:"flex items-center text-gray-600 dark:text-gray-400"},qa={class:"truncate"},Pa={key:3,class:"flex items-center text-gray-600 dark:text-gray-400"},ja={class:"truncate"},Na={key:4,class:"flex items-center text-gray-600 dark:text-gray-400"},La={class:"truncate"},Oa={key:5,class:"flex items-center text-gray-600 dark:text-gray-400"},Wa={class:"truncate"},za={key:6,class:"flex items-center text-gray-600 dark:text-gray-400"},Ka={class:"ml-4 flex items-center space-x-2"},Fa={class:"relative inline-flex cursor-pointer items-center"},$a=["checked","onChange"],Ga=["onClick"],Ha=["onClick"],Ya=["onClick"],Ja={key:1,class:"py-8 text-center text-gray-500 dark:text-gray-400"},Xa={class:"rounded-lg bg-white/80 p-6 shadow-lg backdrop-blur-sm dark:bg-gray-800/80"},Za={class:"grid grid-cols-1 gap-4 md:grid-cols-3"},_a={key:0,class:"py-12 text-center"},er={key:1},tr={class:"mb-6 rounded-lg bg-white/80 p-6 shadow-lg backdrop-blur-sm dark:bg-gray-800/80"},ar={class:"flex items-center justify-between"},rr={class:"relative inline-flex cursor-pointer items-center"},sr={class:"mb-6 rounded-lg bg-white/80 p-6 shadow-lg backdrop-blur-sm dark:bg-gray-800/80"},lr={class:"flex items-center justify-between"},or={class:"relative inline-flex cursor-pointer items-center"},nr={key:0,class:"mt-6 space-y-4"},dr={class:"mb-6 rounded-lg bg-white/80 p-6 shadow-lg backdrop-blur-sm dark:bg-gray-800/80"},ir={class:"flex items-center justify-between"},ur={class:"relative inline-flex cursor-pointer items-center"},gr={key:0,class:"mt-6 space-y-4"},fr={class:"mb-6 rounded-lg bg-white/80 p-6 shadow-lg backdrop-blur-sm dark:bg-gray-800/80"},cr={class:"flex items-center justify-between"},br={class:"relative inline-flex cursor-pointer items-center"},xr={key:0,class:"mt-6 space-y-4"},pr={key:0,class:"rounded-lg bg-gray-50 p-4 text-sm text-gray-500 dark:bg-gray-700/50 dark:text-gray-400"},yr={key:0,class:"ml-2"},vr={key:0,class:"py-12 text-center"},mr={key:1},kr={class:"mb-6 rounded-lg bg-gradient-to-r from-blue-50 to-indigo-50 p-6 dark:from-blue-900/20 dark:to-indigo-900/20"},wr={class:"flex items-start"},hr={class:"mt-2 text-sm text-gray-600 dark:text-gray-400"},Sr={class:"rounded-lg bg-white/80 p-6 shadow-lg backdrop-blur-sm dark:bg-gray-800/80"},Cr={class:"mb-4 flex items-center justify-between"},Tr=["disabled"],Ur={class:"space-y-4"},Ar={class:"flex items-center"},Mr={class:"font-medium text-gray-900 dark:text-gray-100"},Ir={class:"text-xs text-gray-500 dark:text-gray-400"},Br={key:0,class:"ml-2 rounded bg-blue-100 px-1.5 py-0.5 text-blue-700 dark:bg-blue-900/50 dark:text-blue-300"},Er={class:"flex items-center gap-3"},Rr=["onUpdate:modelValue"],Vr={key:0,class:"mt-4 rounded-lg bg-gray-50 p-3 text-sm text-gray-500 dark:bg-gray-700/50 dark:text-gray-400"},Dr={key:0,class:"ml-2"},Qr={class:"dark:to-gray-750 relative border-b border-gray-200 bg-gradient-to-r from-blue-50 to-indigo-50 px-6 py-5 dark:border-gray-700 dark:from-gray-800"},qr={class:"flex items-center justify-between"},Pr={class:"flex items-center space-x-3"},jr={class:"text-xl font-semibold text-gray-900 dark:text-white"},Nr={class:"mt-0.5 text-sm text-gray-600 dark:text-gray-400"},Lr={class:"p-6"},Or={class:"space-y-5"},Wr={class:"relative"},zr=["disabled"],Kr={key:0,class:"mt-1 text-xs text-amber-600 dark:text-amber-400"},Fr={key:0},$r={class:"relative"},Gr={key:0,class:"absolute inset-y-0 right-0 flex items-center pr-3"},Hr={key:1,class:"absolute inset-y-0 right-0 flex items-center pr-3"},Yr={key:0,class:"mt-2 flex items-start rounded-lg bg-blue-50 p-3 dark:bg-blue-900/20"},Jr={class:"text-sm text-blue-700 dark:text-blue-300"},Xr={key:1,class:"space-y-5"},Zr={key:2,class:"space-y-5"},_r={key:3,class:"space-y-5"},es={class:"grid grid-cols-1 gap-4 sm:grid-cols-2"},ts={key:4,class:"rounded-xl border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-900/50"},as={class:"space-y-4"},rs={class:"flex items-center justify-between"},ss={class:"flex cursor-pointer items-center",for:"enableSign"},ls={key:0,class:"rounded-full bg-green-100 px-2 py-1 text-xs font-medium text-green-700 dark:bg-green-900/50 dark:text-green-400"},os={key:0},ns={class:"border-t border-gray-200 bg-gray-50 px-6 py-4 dark:border-gray-700 dark:bg-gray-900/50"},ds={class:"flex items-center justify-between"},is={class:"flex space-x-3"},us=["disabled"],gs=["disabled"],fs=Object.assign({name:"SettingsView"},{__name:"SettingsView",setup(M){const R=bt(),{loading:W,saving:I,oemSettings:b}=Ge(R),ee=k(),w=k("branding"),i=k(!0),T=k(new AbortController),z=k(!1),m=k({title:"",message:"",type:"primary",confirmText:"确认",cancelText:"取消"}),h=k(null),K=(a,e,r="确认",c="取消",y="primary")=>new Promise(O=>{m.value={title:a,message:e,confirmText:r,cancelText:c,type:y},h.value=O,z.value=!0}),F=()=>{var a;z.value=!1,(a=h.value)==null||a.call(h,!0)},te=()=>{var a;z.value=!1,(a=h.value)==null||a.call(h,!1)},P=Ce({get(){return!b.value.showAdminButton},set(a){b.value.showAdminButton=!a}}),V=k(!1),q=k(!1),j=k(!1),N=k(!1),ae={accountAnomaly:!0,quotaWarning:!0,systemError:!0,securityAlert:!0,rateLimitRecovery:!0},S=k({enabled:!1,platforms:[],notificationTypes:{...ae},retrySettings:{maxRetries:3,retryDelay:1e3,timeout:1e4}}),re=k(!1),u=k({claudeCodeOnlyEnabled:!1,globalSessionBindingEnabled:!1,sessionBindingErrorMessage:"你的本地session已污染,请清理后使用。",sessionBindingTtlDays:30,userMessageQueueEnabled:!1,userMessageQueueDelayMs:200,userMessageQueueTimeoutMs:5e3,concurrentRequestQueueEnabled:!1,concurrentRequestQueueMaxSize:3,concurrentRequestQueueMaxSizeMultiplier:0,concurrentRequestQueueTimeoutMs:1e4,updatedAt:null,updatedBy:null}),se=k(!1),H=k(!1),U=k({baseService:"claude",rates:{claude:1,codex:1,gemini:1,droid:1,bedrock:1,azure:1,ccr:1},updatedAt:null,updatedBy:null}),L=k(!1),B=k(null),s=k({type:"wechat_work",name:"",url:"",enableSign:!1,secret:"",botToken:"",chatId:"",apiBaseUrl:"",proxyUrl:"",deviceKey:"",serverUrl:"",level:"",sound:"",group:"",host:"",port:null,secure:!1,user:"",pass:"",from:"",to:"",timeout:null,ignoreTLS:!1}),oe=Te(w,async a=>{i.value&&(a==="webhook"?await $():a==="claude"?await Ie():a==="serviceRates"&&await de())}),ne=Te(()=>s.value.type,a=>{V.value=!1,q.value=!1,B.value||(a==="bark"?(s.value.url="",s.value.enableSign=!1,s.value.secret="",s.value.botToken="",s.value.chatId="",s.value.apiBaseUrl="",s.value.proxyUrl="",s.value.host="",s.value.port=null,s.value.secure=!1,s.value.user="",s.value.pass="",s.value.from="",s.value.to="",s.value.timeout=null,s.value.ignoreTLS=!1):a==="smtp"?(s.value.url="",s.value.enableSign=!1,s.value.secret="",s.value.deviceKey="",s.value.serverUrl="",s.value.level="",s.value.sound="",s.value.group="",s.value.botToken="",s.value.chatId="",s.value.apiBaseUrl="",s.value.proxyUrl=""):a==="telegram"?(s.value.url="",s.value.enableSign=!1,s.value.secret="",s.value.deviceKey="",s.value.serverUrl="",s.value.level="",s.value.sound="",s.value.group="",s.value.host="",s.value.port=null,s.value.secure=!1,s.value.user="",s.value.pass="",s.value.from="",s.value.to="",s.value.timeout=null,s.value.ignoreTLS=!1,s.value.botToken="",s.value.chatId="",s.value.apiBaseUrl="",s.value.proxyUrl=""):(s.value.deviceKey="",s.value.serverUrl="",s.value.level="",s.value.sound="",s.value.group="",s.value.host="",s.value.port=null,s.value.secure=!1,s.value.user="",s.value.pass="",s.value.from="",s.value.to="",s.value.timeout=null,s.value.ignoreTLS=!1,s.value.botToken="",s.value.chatId="",s.value.apiBaseUrl="",s.value.proxyUrl=""))}),Me=Ce(()=>s.value.type==="bark"?!!s.value.deviceKey:s.value.type==="telegram"?!!(s.value.botToken&&s.value.chatId):s.value.type==="smtp"?!!(s.value.host&&s.value.user&&s.value.pass&&s.value.to):!!s.value.url&&!V.value);He(async()=>{try{await R.loadOemSettings(),w.value==="webhook"&&await $(),w.value==="serviceRates"&&await de()}catch{f("加载设置失败","error")}}),Ye(()=>{i.value=!1,T.value&&T.value.abort(),oe&&oe(),ne&&ne(),L.value&&(L.value=!1,B.value=null)});const $=async()=>{if(i.value)try{const a=await at({signal:T.value.signal});if(a.success&&i.value){const e=a.config||{};S.value={...e,notificationTypes:{...ae,...e.notificationTypes||{}}}}}catch(a){if(a.name==="AbortError"||!i.value)return;f("获取webhook配置失败","error"),console.error(a)}},G=async()=>{if(i.value)try{const a={...S.value,notificationTypes:{...ae,...S.value.notificationTypes||{}}};(await st(a,{signal:T.value.signal})).success&&i.value&&(S.value=a,f("配置已保存","success"))}catch(a){if(a.name==="AbortError"||!i.value)return;f("保存配置失败","error"),console.error(a)}},Ie=async()=>{var a,e,r,c,y,O,ye,ve,me,ke,we,he,Se;if(i.value){re.value=!0;try{const C=await ft({signal:T.value.signal});C.success&&i.value&&(u.value={claudeCodeOnlyEnabled:((a=C.config)==null?void 0:a.claudeCodeOnlyEnabled)??!1,globalSessionBindingEnabled:((e=C.config)==null?void 0:e.globalSessionBindingEnabled)??!1,sessionBindingErrorMessage:((r=C.config)==null?void 0:r.sessionBindingErrorMessage)||"你的本地session已污染,请清理后使用。",sessionBindingTtlDays:((c=C.config)==null?void 0:c.sessionBindingTtlDays)??30,userMessageQueueEnabled:((y=C.config)==null?void 0:y.userMessageQueueEnabled)??!1,userMessageQueueDelayMs:((O=C.config)==null?void 0:O.userMessageQueueDelayMs)??200,userMessageQueueTimeoutMs:((ye=C.config)==null?void 0:ye.userMessageQueueTimeoutMs)??5e3,concurrentRequestQueueEnabled:((ve=C.config)==null?void 0:ve.concurrentRequestQueueEnabled)??!1,concurrentRequestQueueMaxSize:((me=C.config)==null?void 0:me.concurrentRequestQueueMaxSize)??3,concurrentRequestQueueMaxSizeMultiplier:((ke=C.config)==null?void 0:ke.concurrentRequestQueueMaxSizeMultiplier)??0,concurrentRequestQueueTimeoutMs:((we=C.config)==null?void 0:we.concurrentRequestQueueTimeoutMs)??1e4,updatedAt:((he=C.config)==null?void 0:he.updatedAt)||null,updatedBy:((Se=C.config)==null?void 0:Se.updatedBy)||null})}catch(C){if(C.name==="AbortError"||!i.value)return;f("获取 Claude 转发配置失败","error"),console.error(C)}finally{i.value&&(re.value=!1)}}},D=async()=>{var a,e;if(i.value)try{const r={claudeCodeOnlyEnabled:u.value.claudeCodeOnlyEnabled,globalSessionBindingEnabled:u.value.globalSessionBindingEnabled,sessionBindingErrorMessage:u.value.sessionBindingErrorMessage,sessionBindingTtlDays:u.value.sessionBindingTtlDays,userMessageQueueEnabled:u.value.userMessageQueueEnabled,userMessageQueueDelayMs:u.value.userMessageQueueDelayMs,userMessageQueueTimeoutMs:u.value.userMessageQueueTimeoutMs,concurrentRequestQueueEnabled:u.value.concurrentRequestQueueEnabled,concurrentRequestQueueMaxSize:u.value.concurrentRequestQueueMaxSize,concurrentRequestQueueMaxSizeMultiplier:u.value.concurrentRequestQueueMaxSizeMultiplier,concurrentRequestQueueTimeoutMs:u.value.concurrentRequestQueueTimeoutMs},c=await ot(r,{signal:T.value.signal});c.success&&i.value&&(u.value={...u.value,updatedAt:((a=c.config)==null?void 0:a.updatedAt)||new Date().toISOString(),updatedBy:((e=c.config)==null?void 0:e.updatedBy)||null},f("Claude 转发配置已保存","success"))}catch(r){if(r.name==="AbortError"||!i.value)return;f("保存 Claude 转发配置失败","error"),console.error(r)}},de=async()=>{var a,e,r,c;if(i.value){se.value=!0;try{const y=await rt({signal:T.value.signal});y.success&&i.value&&(U.value={baseService:((a=y.data)==null?void 0:a.baseService)||"claude",rates:((e=y.data)==null?void 0:e.rates)||U.value.rates,updatedAt:(r=y.data)==null?void 0:r.updatedAt,updatedBy:(c=y.data)==null?void 0:c.updatedBy})}catch(y){if(y.name==="AbortError"||!i.value)return;console.error("加载服务倍率配置失败:",y)}finally{i.value&&(se.value=!1)}}},Be=async()=>{var a,e;if(i.value){H.value=!0;try{const r=await nt({rates:U.value.rates,baseService:U.value.baseService},{signal:T.value.signal});r.success&&i.value&&(U.value.updatedAt=((a=r.data)==null?void 0:a.updatedAt)||new Date().toISOString(),U.value.updatedBy=(e=r.data)==null?void 0:e.updatedBy,f("服务倍率配置已保存","success"))}catch(r){if(r.name==="AbortError"||!i.value)return;f("保存服务倍率配置失败","error"),console.error(r)}finally{i.value&&(H.value=!1)}}},Ee=a=>({claude:"fas fa-robot",codex:"fas fa-code",gemini:"fas fa-gem",droid:"fas fa-android",bedrock:"fab fa-aws",azure:"fab fa-microsoft",ccr:"fas fa-server"})[a]||"fas fa-cog",Re=a=>({claude:"bg-gradient-to-br from-orange-500 to-amber-600",codex:"bg-gradient-to-br from-green-500 to-emerald-600",gemini:"bg-gradient-to-br from-blue-500 to-indigo-600",droid:"bg-gradient-to-br from-green-600 to-lime-600",bedrock:"bg-gradient-to-br from-yellow-500 to-orange-600",azure:"bg-gradient-to-br from-blue-600 to-cyan-600",ccr:"bg-gradient-to-br from-purple-500 to-pink-600"})[a]||"bg-gradient-to-br from-gray-500 to-gray-600",Ve=a=>({claude:"Claude",codex:"Codex (OpenAI)",gemini:"Gemini",droid:"Droid",bedrock:"AWS Bedrock",azure:"Azure OpenAI",ccr:"CCR"})[a]||a,De=()=>{if(["bark","smtp","telegram"].includes(s.value.type)){V.value=!1,q.value=!1;return}const a=s.value.url;if(!a){V.value=!1,q.value=!1;return}try{new URL(a),a.startsWith("http://")||a.startsWith("https://")?(V.value=!1,q.value=!0):(V.value=!0,q.value=!1)}catch{V.value=!0,q.value=!1}},ie=()=>{if(s.value.type==="bark"){if(!s.value.deviceKey)return f("请输入Bark设备密钥","error"),!1}else if(s.value.type==="telegram"){if(!s.value.botToken)return f("请输入 Telegram 机器人 Token","error"),!1;if(!s.value.chatId)return f("请输入 Telegram Chat ID","error"),!1;if(s.value.apiBaseUrl)try{const a=new URL(s.value.apiBaseUrl);if(!["http:","https:"].includes(a.protocol))return f("Telegram API 基础地址仅支持 http 或 https","error"),!1}catch{return f("请输入有效的 Telegram API 基础地址","error"),!1}if(s.value.proxyUrl)try{const a=new URL(s.value.proxyUrl);if(!["http:","https:","socks4:","socks4a:","socks5:"].includes(a.protocol))return f("Telegram 代理仅支持 http/https/socks 协议","error"),!1}catch{return f("请输入有效的 Telegram 代理地址","error"),!1}}else if(s.value.type==="smtp"){const a=[{field:"host",message:"SMTP服务器"},{field:"user",message:"用户名"},{field:"pass",message:"密码"},{field:"to",message:"收件人邮箱"}];for(const{field:e,message:r}of a)if(!s.value[e])return f(`请输入${r}`,"error"),!1}else{if(!s.value.url)return f("请输入Webhook URL","error"),!1;if(V.value)return f("请输入有效的Webhook URL","error"),!1}return!0},Qe=async()=>{if(i.value&&ie()){N.value=!0;try{let a;B.value?a=await dt(B.value.id,s.value,{signal:T.value.signal}):a=await it(s.value,{signal:T.value.signal}),a.success&&i.value&&(f(B.value?"平台已更新":"平台已添加","success"),await $(),Y())}catch(a){if(a.name==="AbortError"||!i.value)return;f(a.message||"操作失败","error"),console.error(a)}finally{i.value&&(N.value=!1)}}},qe=a=>{B.value=a,s.value={type:a.type||"wechat_work",name:a.name||"",url:a.url||"",enableSign:a.enableSign||!1,secret:a.secret||"",botToken:a.botToken||"",chatId:a.chatId||"",apiBaseUrl:a.apiBaseUrl||"",proxyUrl:a.proxyUrl||"",deviceKey:a.deviceKey||"",serverUrl:a.serverUrl||"",level:a.level||"",sound:a.sound||"",group:a.group||"",host:a.host||"",port:a.port??null,secure:a.secure||!1,user:a.user||"",pass:a.pass||"",from:a.from||"",to:Array.isArray(a.to)?a.to.join(", "):a.to||"",timeout:a.timeout??null,ignoreTLS:a.ignoreTLS||!1},L.value=!0},Pe=async a=>{if(i.value&&await K("删除平台","确定要删除这个平台吗?","删除","取消","danger"))try{(await gt(a,{signal:T.value.signal})).success&&i.value&&(f("平台已删除","success"),await $())}catch(e){if(e.name==="AbortError"||!i.value)return;f("删除失败","error"),console.error(e)}},je=async a=>{if(i.value)try{const e=await ut(a,{signal:T.value.signal});e.success&&i.value&&(f(e.message,"success"),await $())}catch(e){if(e.name==="AbortError"||!i.value)return;f("操作失败","error"),console.error(e)}},Ne=async a=>{if(i.value)try{const e={type:a.type,secret:a.secret,enableSign:a.enableSign};a.type==="bark"?(e.deviceKey=a.deviceKey,e.serverUrl=a.serverUrl,e.level=a.level,e.sound=a.sound,e.group=a.group):a.type==="smtp"?(e.host=a.host,e.port=a.port,e.secure=a.secure,e.user=a.user,e.pass=a.pass,e.from=a.from,e.to=a.to,e.ignoreTLS=a.ignoreTLS):a.type==="telegram"?(e.botToken=a.botToken,e.chatId=a.chatId,e.apiBaseUrl=a.apiBaseUrl,e.proxyUrl=a.proxyUrl):e.url=a.url,(await Ae(e,{signal:T.value.signal})).success&&i.value&&f("测试成功","success")}catch(e){if(e.name==="AbortError"||!i.value)return;f(e.error||e.message||"测试失败","error"),console.error(e)}},Le=async()=>{if(i.value&&ie()){j.value=!0;try{(await Ae(s.value,{signal:T.value.signal})).success&&i.value&&f("测试成功","success")}catch(a){if(a.name==="AbortError"||!i.value)return;f(a.error||a.message||"测试失败","error"),console.error(a)}finally{i.value&&(j.value=!1)}}},Oe=async()=>{var a,e,r,c;if(i.value)try{(await lt({signal:T.value.signal})).success&&i.value&&f("测试通知已发送","success")}catch(y){if(y.name==="AbortError"||!i.value)return;const O=((e=(a=y==null?void 0:y.response)==null?void 0:a.data)==null?void 0:e.message)||((c=(r=y==null?void 0:y.response)==null?void 0:r.data)==null?void 0:c.error)||(y==null?void 0:y.message)||"发送失败";f(O,"error"),console.error(y)}},Y=()=>{i.value&&(L.value=!1,setTimeout(()=>{i.value&&(B.value=null,s.value={type:"wechat_work",name:"",url:"",enableSign:!1,secret:"",botToken:"",chatId:"",apiBaseUrl:"",proxyUrl:"",deviceKey:"",serverUrl:"",level:"",sound:"",group:"",host:"",port:null,secure:!1,user:"",pass:"",from:"",to:"",timeout:null,ignoreTLS:!1},V.value=!1,q.value=!1,j.value=!1,N.value=!1)},0))},ue=a=>({wechat_work:"企业微信",dingtalk:"钉钉",feishu:"飞书",slack:"Slack",discord:"Discord",telegram:"Telegram",bark:"Bark",smtp:"邮件通知",custom:"自定义"})[a]||a,We=a=>({wechat_work:"fab fa-weixin text-green-600",dingtalk:"fas fa-comment-dots text-blue-500",feishu:"fas fa-dove text-blue-600",slack:"fab fa-slack text-purple-600",discord:"fab fa-discord text-indigo-600",telegram:"fab fa-telegram-plane text-sky-500",bark:"fas fa-bell text-orange-500",smtp:"fas fa-envelope text-blue-600",custom:"fas fa-webhook text-gray-600"})[a]||"fas fa-bell",ge=a=>({wechat_work:"请在企业微信群机器人设置中获取Webhook地址",dingtalk:"请在钉钉群机器人设置中获取Webhook地址",feishu:"请在飞书群机器人设置中获取Webhook地址",slack:"请在Slack应用的Incoming Webhooks中获取地址",discord:"请在Discord服务器的集成设置中创建Webhook",telegram:"使用 @BotFather 创建机器人并复制 Token,Chat ID 可通过 @userinfobot 或相关工具获取",bark:"请在Bark App中查看您的设备密钥",smtp:"请配置SMTP服务器信息,支持Gmail、QQ邮箱等",custom:"请输入完整的Webhook接收地址"})[a]||"",ze=a=>a?a.length<=12?a:`${a.slice(0,6)}...${a.slice(-4)}`:"",Ke=a=>({accountAnomaly:"账号异常",quotaWarning:"配额警告",systemError:"系统错误",securityAlert:"安全警报",rateLimitRecovery:"限流恢复",test:"测试通知"})[a]||a,Fe=a=>({accountAnomaly:"账号状态异常、认证失败等",quotaWarning:"API调用配额不足警告",systemError:"系统运行错误和故障",securityAlert:"安全相关的警报通知",rateLimitRecovery:"限流状态恢复时发送提醒",test:"用于测试Webhook连接是否正常"})[a]||"",fe=async()=>{try{const a={siteName:b.value.siteName,siteIcon:b.value.siteIcon,siteIconData:b.value.siteIconData,showAdminButton:b.value.showAdminButton,apiStatsNotice:b.value.apiStatsNotice},e=await R.saveOemSettings(a);e&&e.success?f("OEM设置保存成功","success"):f((e==null?void 0:e.message)||"保存失败","error")}catch{f("保存OEM设置失败","error")}},ce=async()=>{if(await K("重置设置",`确定要重置为默认设置吗?
|
||
|
||
这将清除所有自定义的网站名称和图标设置。`,"重置","取消","warning"))try{const a=await R.resetOemSettings();a&&a.success?f("已重置为默认设置","success"):f("重置失败","error")}catch{f("重置失败","error")}},be=async a=>{const e=a.target.files[0];if(!e)return;const r=R.validateIconFile(e);if(!r.isValid){r.errors.forEach(c=>f(c,"error"));return}try{const c=await R.fileToBase64(e);b.value.siteIconData=c}catch{f("文件读取失败","error")}a.target.value=""},xe=()=>{b.value.siteIcon="",b.value.siteIconData=""},pe=()=>{console.warn("Icon failed to load")},J=R.formatDateTime;return(a,e)=>(n(),o(Z,null,[t("div",xt,[t("div",pt,[e[145]||(e[145]=t("div",{class:"mb-4 sm:mb-6"},[t("h3",{class:"mb-1 text-lg font-bold text-gray-900 dark:text-gray-100 sm:mb-2 sm:text-xl"}," 系统设置 "),t("p",{class:"text-sm text-gray-600 dark:text-gray-400 sm:text-base"},"网站定制和通知配置")],-1)),t("div",yt,[t("nav",vt,[t("button",{class:E(["border-b-2 pb-2 text-sm font-medium transition-colors",w.value==="branding"?"border-blue-500 text-blue-600 dark:border-blue-400 dark:text-blue-400":"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"]),onClick:e[0]||(e[0]=r=>w.value="branding")},e[51]||(e[51]=[t("i",{class:"fas fa-palette mr-2"},null,-1),l(" 品牌设置 ",-1)]),2),t("button",{class:E(["border-b-2 pb-2 text-sm font-medium transition-colors",w.value==="webhook"?"border-blue-500 text-blue-600 dark:border-blue-400 dark:text-blue-400":"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"]),onClick:e[1]||(e[1]=r=>w.value="webhook")},e[52]||(e[52]=[t("i",{class:"fas fa-bell mr-2"},null,-1),l(" 通知设置 ",-1)]),2),t("button",{class:E(["border-b-2 pb-2 text-sm font-medium transition-colors",w.value==="claude"?"border-blue-500 text-blue-600 dark:border-blue-400 dark:text-blue-400":"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"]),onClick:e[2]||(e[2]=r=>w.value="claude")},e[53]||(e[53]=[t("i",{class:"fas fa-robot mr-2"},null,-1),l(" Claude 转发 ",-1)]),2),t("button",{class:E(["border-b-2 pb-2 text-sm font-medium transition-colors",w.value==="serviceRates"?"border-blue-500 text-blue-600 dark:border-blue-400 dark:text-blue-400":"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"]),onClick:e[3]||(e[3]=r=>w.value="serviceRates")},e[54]||(e[54]=[t("i",{class:"fas fa-balance-scale mr-2"},null,-1),l(" 服务倍率 ",-1)]),2)])]),g(W)?(n(),o("div",mt,e[55]||(e[55]=[t("div",{class:"loading-spinner mx-auto mb-4"},null,-1),t("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载设置...",-1)]))):(n(),o("div",kt,[d(t("div",null,[t("div",wt,[t("table",ht,[t("tbody",St,[t("tr",Ct,[e[57]||(e[57]=t("td",{class:"w-48 whitespace-nowrap px-6 py-4"},[t("div",{class:"flex items-center"},[t("div",{class:"mr-3 flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600"},[t("i",{class:"fas fa-font text-xs text-white"})]),t("div",null,[t("div",{class:"text-sm font-semibold text-gray-900 dark:text-gray-100"}," 网站名称 "),t("div",{class:"text-xs text-gray-500 dark:text-gray-400"},"品牌标识")])])],-1)),t("td",Tt,[d(t("input",{"onUpdate:modelValue":e[4]||(e[4]=r=>g(b).siteName=r),class:"form-input w-full max-w-md dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",maxlength:"100",placeholder:"Claude Relay Service",type:"text"},null,512),[[p,g(b).siteName]]),e[56]||(e[56]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 将显示在浏览器标题和页面头部 ",-1))])]),t("tr",Ut,[e[62]||(e[62]=t("td",{class:"w-48 whitespace-nowrap px-6 py-4"},[t("div",{class:"flex items-center"},[t("div",{class:"mr-3 flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-purple-500 to-purple-600"},[t("i",{class:"fas fa-image text-xs text-white"})]),t("div",null,[t("div",{class:"text-sm font-semibold text-gray-900 dark:text-gray-100"}," 网站图标 "),t("div",{class:"text-xs text-gray-500 dark:text-gray-400"},"Favicon")])])],-1)),t("td",At,[t("div",Mt,[g(b).siteIconData||g(b).siteIcon?(n(),o("div",It,[t("img",{alt:"图标预览",class:"h-8 w-8",src:g(b).siteIconData||g(b).siteIcon,onError:pe},null,40,Bt),e[59]||(e[59]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400"},"当前图标",-1)),t("button",{class:"rounded-lg px-3 py-1 font-medium text-red-600 transition-colors hover:bg-red-50 hover:text-red-900",onClick:xe},e[58]||(e[58]=[t("i",{class:"fas fa-trash mr-1"},null,-1),l("删除 ",-1)]))])):x("",!0),t("div",null,[t("input",{ref_key:"iconFileInput",ref:ee,accept:".ico,.png,.jpg,.jpeg,.svg",class:"hidden",type:"file",onChange:be},null,544),t("button",{class:"btn btn-success px-4 py-2",onClick:e[5]||(e[5]=r=>a.$refs.iconFileInput.click())},e[60]||(e[60]=[t("i",{class:"fas fa-upload mr-2"},null,-1),l(" 上传图标 ",-1)])),e[61]||(e[61]=t("span",{class:"ml-3 text-xs text-gray-500 dark:text-gray-400"},"支持 .ico, .png, .jpg, .svg 格式,最大 350KB",-1))])])])]),t("tr",Et,[e[65]||(e[65]=t("td",{class:"w-48 whitespace-nowrap px-6 py-4"},[t("div",{class:"flex items-center"},[t("div",{class:"mr-3 flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-indigo-500 to-purple-600"},[t("i",{class:"fas fa-eye-slash text-xs text-white"})]),t("div",null,[t("div",{class:"text-sm font-semibold text-gray-900 dark:text-gray-100"}," 管理入口 "),t("div",{class:"text-xs text-gray-500 dark:text-gray-400"},"登录按钮显示")])])],-1)),t("td",Rt,[t("div",Vt,[t("label",Dt,[d(t("input",{"onUpdate:modelValue":e[6]||(e[6]=r=>P.value=r),class:"peer sr-only",type:"checkbox"},null,512),[[Q,P.value]]),e[63]||(e[63]=t("div",{class:"peer relative h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-blue-600 peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:border-gray-600 dark:bg-gray-700 dark:peer-focus:ring-blue-800"},null,-1)),t("span",Qt,v(P.value?"隐藏登录按钮":"显示登录按钮"),1)])]),e[64]||(e[64]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 隐藏后,用户需要直接访问 /admin/login 页面登录 ",-1))])]),t("tr",qt,[e[69]||(e[69]=t("td",{class:"w-48 whitespace-nowrap px-6 py-4"},[t("div",{class:"flex items-center"},[t("div",{class:"mr-3 flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-amber-500 to-orange-600"},[t("i",{class:"fas fa-bell text-xs text-white"})]),t("div",null,[t("div",{class:"text-sm font-semibold text-gray-900 dark:text-gray-100"}," 统计页通知 "),t("div",{class:"text-xs text-gray-500 dark:text-gray-400"},"API Stats")])])],-1)),t("td",Pt,[t("div",jt,[t("label",Nt,[d(t("input",{"onUpdate:modelValue":e[7]||(e[7]=r=>g(b).apiStatsNotice.enabled=r),class:"peer sr-only",type:"checkbox"},null,512),[[Q,g(b).apiStatsNotice.enabled]]),e[66]||(e[66]=t("div",{class:"peer relative h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-blue-600 peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:border-gray-600 dark:bg-gray-700 dark:peer-focus:ring-blue-800"},null,-1)),t("span",Lt,v(g(b).apiStatsNotice.enabled?"已启用":"已禁用"),1)])]),g(b).apiStatsNotice.enabled?(n(),o("div",Ot,[t("div",null,[e[67]||(e[67]=t("label",{class:"mb-1 block text-xs text-gray-500 dark:text-gray-400"}," 标题 ",-1)),d(t("input",{"onUpdate:modelValue":e[8]||(e[8]=r=>g(b).apiStatsNotice.title=r),class:"form-input w-full max-w-md dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",maxlength:"100",placeholder:"通知标题",type:"text"},null,512),[[p,g(b).apiStatsNotice.title]])]),t("div",null,[e[68]||(e[68]=t("label",{class:"mb-1 block text-xs text-gray-500 dark:text-gray-400"}," 内容 ",-1)),d(t("textarea",{"onUpdate:modelValue":e[9]||(e[9]=r=>g(b).apiStatsNotice.content=r),class:"form-input w-full max-w-md resize-none dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",maxlength:"2000",placeholder:"通知内容(支持换行)",rows:"3"},null,512),[[p,g(b).apiStatsNotice.content]])])])):x("",!0)])]),t("tr",null,[t("td",Wt,[t("div",zt,[t("div",Kt,[t("button",{class:E(["btn btn-primary px-6 py-3",{"cursor-not-allowed opacity-50":g(I)}]),disabled:g(I),onClick:fe},[g(I)?(n(),o("div",$t)):(n(),o("i",Gt)),l(" "+v(g(I)?"保存中...":"保存设置"),1)],10,Ft),t("button",{class:"btn bg-gray-100 px-6 py-3 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",disabled:g(I),onClick:ce},e[70]||(e[70]=[t("i",{class:"fas fa-undo mr-2"},null,-1),l(" 重置为默认 ",-1)]),8,Ht)]),g(b).updatedAt?(n(),o("div",Yt,[e[71]||(e[71]=t("i",{class:"fas fa-clock mr-1"},null,-1)),l(" 最后更新:"+v(g(J)(g(b).updatedAt)),1)])):x("",!0)])])])])])]),t("div",Jt,[t("div",Xt,[e[72]||(e[72]=A('<div class="mb-3 flex items-center gap-3" data-v-9495fcfd><div class="flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-blue-500 to-cyan-600 text-white shadow-md" data-v-9495fcfd><i class="fas fa-tag" data-v-9495fcfd></i></div><div data-v-9495fcfd><h3 class="text-base font-semibold text-gray-900 dark:text-gray-100" data-v-9495fcfd>站点名称</h3><p class="text-sm text-gray-500 dark:text-gray-400" data-v-9495fcfd>自定义您的站点品牌名称</p></div></div>',1)),d(t("input",{"onUpdate:modelValue":e[10]||(e[10]=r=>g(b).siteName=r),class:"form-input w-full dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",maxlength:"100",placeholder:"Claude Relay Service",type:"text"},null,512),[[p,g(b).siteName]])]),t("div",Zt,[e[76]||(e[76]=A('<div class="mb-3 flex items-center gap-3" data-v-9495fcfd><div class="flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-purple-500 to-pink-600 text-white shadow-md" data-v-9495fcfd><i class="fas fa-image" data-v-9495fcfd></i></div><div data-v-9495fcfd><h3 class="text-base font-semibold text-gray-900 dark:text-gray-100" data-v-9495fcfd>站点图标</h3><p class="text-sm text-gray-500 dark:text-gray-400" data-v-9495fcfd> 上传自定义图标或输入图标URL </p></div></div>',1)),t("div",_t,[g(b).siteIconData||g(b).siteIcon?(n(),o("div",ea,[t("img",{alt:"图标预览",class:"h-8 w-8",src:g(b).siteIconData||g(b).siteIcon,onError:pe},null,40,ta),e[73]||(e[73]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400"},"当前图标",-1)),t("button",{class:"rounded-lg px-3 py-1 font-medium text-red-600 transition-colors hover:bg-red-50 hover:text-red-900",onClick:xe}," 删除 ")])):x("",!0),t("div",null,[t("input",{ref:"iconFileInputMobile",accept:".ico,.png,.jpg,.jpeg,.svg",class:"hidden",type:"file",onChange:be},null,544),t("button",{class:"btn btn-success px-4 py-2",onClick:e[11]||(e[11]=r=>a.$refs.iconFileInputMobile.click())},e[74]||(e[74]=[t("i",{class:"fas fa-upload mr-2"},null,-1),l(" 上传图标 ",-1)])),e[75]||(e[75]=t("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 支持 .ico, .png, .jpg, .svg 格式,最大 350KB ",-1))])])]),t("div",aa,[e[79]||(e[79]=A('<div class="mb-3 flex items-center gap-3" data-v-9495fcfd><div class="flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-indigo-500 to-purple-600 text-white shadow-md" data-v-9495fcfd><i class="fas fa-eye-slash" data-v-9495fcfd></i></div><div data-v-9495fcfd><h3 class="text-base font-semibold text-gray-900 dark:text-gray-100" data-v-9495fcfd>管理入口</h3><p class="text-sm text-gray-500 dark:text-gray-400" data-v-9495fcfd>控制登录按钮在首页的显示</p></div></div>',1)),t("div",ra,[t("label",sa,[d(t("input",{"onUpdate:modelValue":e[12]||(e[12]=r=>P.value=r),class:"peer sr-only",type:"checkbox"},null,512),[[Q,P.value]]),e[77]||(e[77]=t("div",{class:"peer relative h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-blue-600 peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:border-gray-600 dark:bg-gray-700 dark:peer-focus:ring-blue-800"},null,-1)),t("span",la,v(P.value?"隐藏登录按钮":"显示登录按钮"),1)]),e[78]||(e[78]=t("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 隐藏后,用户需要直接访问 /admin/login 页面登录 ",-1))])]),t("div",oa,[t("div",na,[t("button",{class:E(["btn btn-primary w-full px-6 py-3",{"cursor-not-allowed opacity-50":g(I)}]),disabled:g(I),onClick:fe},[g(I)?(n(),o("div",ia)):(n(),o("i",ua)),l(" "+v(g(I)?"保存中...":"保存设置"),1)],10,da),t("button",{class:"btn w-full bg-gray-100 px-6 py-3 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",disabled:g(I),onClick:ce},e[80]||(e[80]=[t("i",{class:"fas fa-undo mr-2"},null,-1),l(" 重置为默认 ",-1)]),8,ga),g(b).updatedAt?(n(),o("div",fa,[e[81]||(e[81]=t("i",{class:"fas fa-clock mr-1"},null,-1)),l(" 上次更新: "+v(g(J)(g(b).updatedAt)),1)])):x("",!0)])])])],512),[[X,w.value==="branding"]]),d(t("div",null,[t("div",ca,[t("div",ba,[e[83]||(e[83]=t("div",null,[t("h2",{class:"text-lg font-semibold text-gray-800 dark:text-gray-200"},"启用通知"),t("p",{class:"mt-1 text-sm text-gray-600 dark:text-gray-400"}," 开启后,系统将按配置发送通知到指定平台 ")],-1)),t("label",xa,[d(t("input",{"onUpdate:modelValue":e[13]||(e[13]=r=>S.value.enabled=r),class:"peer sr-only",type:"checkbox",onChange:G},null,544),[[Q,S.value.enabled]]),e[82]||(e[82]=t("div",{class:"peer h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-blue-600 peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:border-gray-600 dark:bg-gray-700 dark:peer-focus:ring-blue-800"},null,-1))])])]),t("div",pa,[e[85]||(e[85]=t("h2",{class:"mb-4 text-lg font-semibold text-gray-800 dark:text-gray-200"},"通知类型",-1)),t("div",ya,[(n(!0),o(Z,null,le(S.value.notificationTypes,(r,c)=>(n(),o("div",{key:c,class:"flex items-center justify-between"},[t("div",null,[t("span",va,v(Ke(c)),1),t("span",ma,v(Fe(c)),1)]),t("label",ka,[d(t("input",{"onUpdate:modelValue":y=>S.value.notificationTypes[c]=y,class:"peer sr-only",type:"checkbox",onChange:G},null,40,wa),[[Q,S.value.notificationTypes[c]]]),e[84]||(e[84]=t("div",{class:"peer h-5 w-9 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-4 after:w-4 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-green-600 peer-checked:after:translate-x-full peer-checked:after:border-white dark:border-gray-600 dark:bg-gray-700"},null,-1))])]))),128))])]),t("div",ha,[t("div",Sa,[e[87]||(e[87]=t("h2",{class:"text-lg font-semibold text-gray-800 dark:text-gray-200"},"通知平台",-1)),t("button",{class:"rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-blue-700",onClick:e[14]||(e[14]=r=>L.value=!0)},e[86]||(e[86]=[t("i",{class:"fas fa-plus mr-2"},null,-1),l(" 添加平台 ",-1)]))]),S.value.platforms&&S.value.platforms.length>0?(n(),o("div",Ca,[(n(!0),o(Z,null,le(S.value.platforms,r=>(n(),o("div",{key:r.id,class:"rounded-lg border border-gray-200 p-4 dark:border-gray-700"},[t("div",Ta,[t("div",Ua,[t("div",Aa,[t("i",{class:E(["mr-3 text-xl",We(r.type)])},null,2),t("div",null,[t("h3",Ma,v(r.name||ue(r.type)),1),t("p",Ia,v(ue(r.type)),1)])]),t("div",Ba,[r.type!=="smtp"&&r.type!=="telegram"?(n(),o("div",Ea,[e[88]||(e[88]=t("i",{class:"fas fa-link mr-2"},null,-1)),t("span",Ra,v(r.url),1)])):x("",!0),r.type==="telegram"?(n(),o("div",Va,[e[89]||(e[89]=t("i",{class:"fas fa-comments mr-2"},null,-1)),t("span",Da,"Chat ID: "+v(r.chatId||"未配置"),1)])):x("",!0),r.type==="telegram"&&r.botToken?(n(),o("div",Qa,[e[90]||(e[90]=t("i",{class:"fas fa-key mr-2"},null,-1)),t("span",qa,"Token: "+v(ze(r.botToken)),1)])):x("",!0),r.type==="telegram"&&r.apiBaseUrl?(n(),o("div",Pa,[e[91]||(e[91]=t("i",{class:"fas fa-globe mr-2"},null,-1)),t("span",ja,"API: "+v(r.apiBaseUrl),1)])):x("",!0),r.type==="telegram"&&r.proxyUrl?(n(),o("div",Na,[e[92]||(e[92]=t("i",{class:"fas fa-route mr-2"},null,-1)),t("span",La,"代理: "+v(r.proxyUrl),1)])):x("",!0),r.type==="smtp"&&r.to?(n(),o("div",Oa,[e[93]||(e[93]=t("i",{class:"fas fa-envelope mr-2"},null,-1)),t("span",Wa,v(Array.isArray(r.to)?r.to.join(", "):r.to),1)])):x("",!0),r.enableSign?(n(),o("div",za,e[94]||(e[94]=[t("i",{class:"fas fa-shield-alt mr-2"},null,-1),t("span",null,"已启用签名验证",-1)]))):x("",!0)])]),t("div",Ka,[t("label",Fa,[t("input",{checked:r.enabled,class:"peer sr-only",type:"checkbox",onChange:c=>je(r.id)},null,40,$a),e[95]||(e[95]=t("div",{class:"peer h-5 w-9 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-4 after:w-4 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-green-600 peer-checked:after:translate-x-full peer-checked:after:border-white dark:border-gray-600 dark:bg-gray-700"},null,-1))]),t("button",{class:"rounded-lg bg-blue-100 p-2 text-blue-600 transition-colors hover:bg-blue-200 dark:bg-blue-900 dark:text-blue-400 dark:hover:bg-blue-800",title:"测试连接",onClick:c=>Ne(r)},e[96]||(e[96]=[t("i",{class:"fas fa-vial"},null,-1)]),8,Ga),t("button",{class:"rounded-lg bg-gray-100 p-2 text-gray-600 transition-colors hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-400 dark:hover:bg-gray-600",title:"编辑",onClick:c=>qe(r)},e[97]||(e[97]=[t("i",{class:"fas fa-edit"},null,-1)]),8,Ha),t("button",{class:"rounded-lg bg-red-100 p-2 text-red-600 transition-colors hover:bg-red-200 dark:bg-red-900 dark:text-red-400 dark:hover:bg-red-800",title:"删除",onClick:c=>Pe(r.id)},e[98]||(e[98]=[t("i",{class:"fas fa-trash"},null,-1)]),8,Ya)])])]))),128))])):(n(),o("div",Ja,' 暂无配置的通知平台,请点击"添加平台"按钮添加 '))]),t("div",Xa,[e[102]||(e[102]=t("h2",{class:"mb-4 text-lg font-semibold text-gray-800 dark:text-gray-200"},"高级设置",-1)),t("div",Za,[t("div",null,[e[99]||(e[99]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"}," 最大重试次数 ",-1)),d(t("input",{"onUpdate:modelValue":e[15]||(e[15]=r=>S.value.retrySettings.maxRetries=r),class:"mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white sm:text-sm",max:"10",min:"0",type:"number",onChange:G},null,544),[[p,S.value.retrySettings.maxRetries,void 0,{number:!0}]])]),t("div",null,[e[100]||(e[100]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"}," 重试延迟 (毫秒) ",-1)),d(t("input",{"onUpdate:modelValue":e[16]||(e[16]=r=>S.value.retrySettings.retryDelay=r),class:"mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white sm:text-sm",max:"10000",min:"100",step:"100",type:"number",onChange:G},null,544),[[p,S.value.retrySettings.retryDelay,void 0,{number:!0}]])]),t("div",null,[e[101]||(e[101]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"}," 超时时间 (毫秒) ",-1)),d(t("input",{"onUpdate:modelValue":e[17]||(e[17]=r=>S.value.retrySettings.timeout=r),class:"mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white sm:text-sm",max:"30000",min:"1000",step:"1000",type:"number",onChange:G},null,544),[[p,S.value.retrySettings.timeout,void 0,{number:!0}]])])])]),t("div",{class:"mt-6 text-center"},[t("button",{class:"rounded-lg bg-green-600 px-6 py-3 text-white shadow-lg transition-all hover:bg-green-700 hover:shadow-xl",onClick:Oe},e[103]||(e[103]=[t("i",{class:"fas fa-paper-plane mr-2"},null,-1),l(" 发送测试通知 ",-1)]))])],512),[[X,w.value==="webhook"]]),d(t("div",null,[re.value?(n(),o("div",_a,e[104]||(e[104]=[t("div",{class:"loading-spinner mx-auto mb-4"},null,-1),t("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载配置...",-1)]))):(n(),o("div",er,[t("div",tr,[t("div",ar,[e[106]||(e[106]=A('<div data-v-9495fcfd><div class="flex items-center" data-v-9495fcfd><div class="mr-3 flex h-10 w-10 items-center justify-center rounded-full bg-gradient-to-br from-orange-500 to-amber-600 text-white shadow-lg" data-v-9495fcfd><i class="fas fa-terminal" data-v-9495fcfd></i></div><div data-v-9495fcfd><h2 class="text-lg font-semibold text-gray-800 dark:text-gray-200" data-v-9495fcfd> 仅允许 Claude Code 客户端 </h2><p class="mt-1 text-sm text-gray-600 dark:text-gray-400" data-v-9495fcfd> 启用后,所有 <code class="rounded bg-gray-100 px-1 dark:bg-gray-700" data-v-9495fcfd>/api/v1/messages</code> 和 <code class="rounded bg-gray-100 px-1 dark:bg-gray-700" data-v-9495fcfd>/claude/v1/messages</code> 端点将强制验证 Claude Code CLI 客户端 </p></div></div></div>',1)),t("label",rr,[d(t("input",{"onUpdate:modelValue":e[18]||(e[18]=r=>u.value.claudeCodeOnlyEnabled=r),class:"peer sr-only",type:"checkbox",onChange:D},null,544),[[Q,u.value.claudeCodeOnlyEnabled]]),e[105]||(e[105]=t("div",{class:"peer h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-orange-500 peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-orange-300 dark:border-gray-600 dark:bg-gray-700 dark:peer-focus:ring-orange-800"},null,-1))])]),e[107]||(e[107]=A('<div class="mt-4 rounded-lg bg-amber-50 p-4 dark:bg-amber-900/20" data-v-9495fcfd><div class="flex" data-v-9495fcfd><i class="fas fa-info-circle mt-0.5 text-amber-500" data-v-9495fcfd></i><div class="ml-3" data-v-9495fcfd><p class="text-sm text-amber-700 dark:text-amber-300" data-v-9495fcfd> 此设置与 API Key 级别的客户端限制是 <strong data-v-9495fcfd>OR 逻辑</strong>:全局启用或 API Key 设置中启用,都会执行 Claude Code 验证。 </p></div></div></div>',1))]),t("div",sr,[t("div",lr,[e[109]||(e[109]=A('<div data-v-9495fcfd><div class="flex items-center" data-v-9495fcfd><div class="mr-3 flex h-10 w-10 items-center justify-center rounded-full bg-gradient-to-br from-purple-500 to-indigo-600 text-white shadow-lg" data-v-9495fcfd><i class="fas fa-link" data-v-9495fcfd></i></div><div data-v-9495fcfd><h2 class="text-lg font-semibold text-gray-800 dark:text-gray-200" data-v-9495fcfd> 强制会话绑定 </h2><p class="mt-1 text-sm text-gray-600 dark:text-gray-400" data-v-9495fcfd> 启用后,系统会将原始会话 ID 绑定到首次使用的账户,确保上下文的一致性 </p></div></div></div>',1)),t("label",or,[d(t("input",{"onUpdate:modelValue":e[19]||(e[19]=r=>u.value.globalSessionBindingEnabled=r),class:"peer sr-only",type:"checkbox",onChange:D},null,544),[[Q,u.value.globalSessionBindingEnabled]]),e[108]||(e[108]=t("div",{class:"peer h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-purple-500 peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-purple-300 dark:border-gray-600 dark:bg-gray-700 dark:peer-focus:ring-purple-800"},null,-1))])]),u.value.globalSessionBindingEnabled?(n(),o("div",nr,[t("div",null,[e[110]||(e[110]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-clock mr-2 text-gray-400"}),l(" 绑定有效期(天) ")],-1)),d(t("input",{"onUpdate:modelValue":e[20]||(e[20]=r=>u.value.sessionBindingTtlDays=r),class:"mt-1 block w-full max-w-xs rounded-lg border border-gray-300 bg-white px-3 py-2 shadow-sm focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-500/20 dark:border-gray-500 dark:bg-gray-700 dark:text-white sm:text-sm",max:"365",min:"1",placeholder:"30",type:"number",onChange:D},null,544),[[p,u.value.sessionBindingTtlDays,void 0,{number:!0}]]),e[111]||(e[111]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 会话绑定到账户后的有效时间,过期后会自动解除绑定 ",-1))]),t("div",null,[e[112]||(e[112]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-exclamation-triangle mr-2 text-gray-400"}),l(" 旧会话污染提示 ")],-1)),d(t("textarea",{"onUpdate:modelValue":e[21]||(e[21]=r=>u.value.sessionBindingErrorMessage=r),class:"mt-1 block w-full rounded-lg border border-gray-300 bg-white px-3 py-2 shadow-sm focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-500/20 dark:border-gray-500 dark:bg-gray-700 dark:text-white sm:text-sm",placeholder:"你的本地session已污染,请清理后使用。",rows:"2",onChange:D},null,544),[[p,u.value.sessionBindingErrorMessage]]),e[113]||(e[113]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 当检测到为旧的sessionId且未在系统中有调度记录时提示,返回给客户端的错误消息 ",-1))])])):x("",!0),e[114]||(e[114]=A('<div class="mt-4 rounded-lg bg-purple-50 p-4 dark:bg-purple-900/20" data-v-9495fcfd><div class="flex" data-v-9495fcfd><i class="fas fa-lightbulb mt-0.5 text-purple-500" data-v-9495fcfd></i><div class="ml-3" data-v-9495fcfd><p class="text-sm text-purple-700 dark:text-purple-300" data-v-9495fcfd><strong data-v-9495fcfd>工作原理:</strong>系统会提取请求中的原始 session ID (来自 <code class="rounded bg-purple-100 px-1 dark:bg-purple-800" data-v-9495fcfd>metadata.user_id</code>), 并将其与首次调度的账户绑定。后续使用相同 session ID 的请求将自动路由到同一账户。 </p><p class="mt-2 text-sm text-purple-700 dark:text-purple-300" data-v-9495fcfd><strong data-v-9495fcfd>新会话识别:</strong>如果绑定会话历史中没有该sessionId但请求中 <code class="rounded bg-purple-100 px-1 dark:bg-purple-800" data-v-9495fcfd>messages.length > 1</code>, 系统会认为这是一个污染的会话并拒绝请求。 </p></div></div></div>',1))]),t("div",dr,[t("div",ir,[e[116]||(e[116]=A('<div data-v-9495fcfd><div class="flex items-center" data-v-9495fcfd><div class="mr-3 flex h-10 w-10 items-center justify-center rounded-full bg-gradient-to-br from-cyan-500 to-teal-600 text-white shadow-lg" data-v-9495fcfd><i class="fas fa-list-ol" data-v-9495fcfd></i></div><div data-v-9495fcfd><h2 class="text-lg font-semibold text-gray-800 dark:text-gray-200" data-v-9495fcfd> 用户消息串行队列 </h2><p class="mt-1 text-sm text-gray-600 dark:text-gray-400" data-v-9495fcfd> 启用后,同一账户的用户消息请求将串行执行,并在请求之间添加延迟,防止触发上游限流 </p></div></div></div>',1)),t("label",ur,[d(t("input",{"onUpdate:modelValue":e[22]||(e[22]=r=>u.value.userMessageQueueEnabled=r),class:"peer sr-only",type:"checkbox",onChange:D},null,544),[[Q,u.value.userMessageQueueEnabled]]),e[115]||(e[115]=t("div",{class:"peer h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-teal-500 peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-teal-300 dark:border-gray-600 dark:bg-gray-700 dark:peer-focus:ring-teal-800"},null,-1))])]),u.value.userMessageQueueEnabled?(n(),o("div",gr,[t("div",null,[e[117]||(e[117]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-hourglass-half mr-2 text-gray-400"}),l(" 请求间隔(毫秒) ")],-1)),d(t("input",{"onUpdate:modelValue":e[23]||(e[23]=r=>u.value.userMessageQueueDelayMs=r),class:"mt-1 block w-full max-w-xs rounded-lg border border-gray-300 bg-white px-3 py-2 shadow-sm focus:border-teal-500 focus:outline-none focus:ring-2 focus:ring-teal-500/20 dark:border-gray-500 dark:bg-gray-700 dark:text-white sm:text-sm",max:"10000",min:"0",placeholder:"200",type:"number",onChange:D},null,544),[[p,u.value.userMessageQueueDelayMs,void 0,{number:!0}]]),e[118]||(e[118]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 同一账户的用户消息请求之间的最小间隔时间(0-10000毫秒) ",-1))]),t("div",null,[e[119]||(e[119]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-stopwatch mr-2 text-gray-400"}),l(" 队列超时(毫秒) ")],-1)),d(t("input",{"onUpdate:modelValue":e[24]||(e[24]=r=>u.value.userMessageQueueTimeoutMs=r),class:"mt-1 block w-full max-w-xs rounded-lg border border-gray-300 bg-white px-3 py-2 shadow-sm focus:border-teal-500 focus:outline-none focus:ring-2 focus:ring-teal-500/20 dark:border-gray-500 dark:bg-gray-700 dark:text-white sm:text-sm",max:"300000",min:"1000",placeholder:"30000",type:"number",onChange:D},null,544),[[p,u.value.userMessageQueueTimeoutMs,void 0,{number:!0}]]),e[120]||(e[120]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 请求在队列中等待的最大时间,超时将返回 503 错误(1000-300000毫秒) ",-1))])])):x("",!0),e[121]||(e[121]=A('<div class="mt-4 rounded-lg bg-teal-50 p-4 dark:bg-teal-900/20" data-v-9495fcfd><div class="flex" data-v-9495fcfd><i class="fas fa-info-circle mt-0.5 text-teal-500" data-v-9495fcfd></i><div class="ml-3" data-v-9495fcfd><p class="text-sm text-teal-700 dark:text-teal-300" data-v-9495fcfd><strong data-v-9495fcfd>工作原理:</strong>系统检测请求中最后一条消息的 <code class="rounded bg-teal-100 px-1 dark:bg-teal-800" data-v-9495fcfd>role</code> 是否为 <code class="rounded bg-teal-100 px-1 dark:bg-teal-800" data-v-9495fcfd>user</code>。用户消息请求需要排队串行执行,而工具调用结果、助手消息续传等不受此限制。 </p></div></div></div>',1))]),t("div",fr,[t("div",cr,[e[123]||(e[123]=A('<div class="flex items-center" data-v-9495fcfd><div class="flex h-12 w-12 items-center justify-center rounded-lg bg-gradient-to-r from-blue-500 to-cyan-500 text-white shadow-lg" data-v-9495fcfd><i class="fas fa-layer-group text-xl" data-v-9495fcfd></i></div><div class="ml-4" data-v-9495fcfd><h4 class="text-lg font-semibold text-gray-900 dark:text-white" data-v-9495fcfd> 并发请求排队 </h4><p class="text-sm text-gray-500 dark:text-gray-400" data-v-9495fcfd> 当 API Key 并发请求超限时进入队列等待,而非直接拒绝 </p></div></div>',1)),t("label",br,[d(t("input",{"onUpdate:modelValue":e[25]||(e[25]=r=>u.value.concurrentRequestQueueEnabled=r),class:"peer sr-only",type:"checkbox",onChange:D},null,544),[[Q,u.value.concurrentRequestQueueEnabled]]),e[122]||(e[122]=t("div",{class:"peer h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-blue-500 peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:border-gray-600 dark:bg-gray-700 dark:peer-focus:ring-blue-800"},null,-1))])]),u.value.concurrentRequestQueueEnabled?(n(),o("div",xr,[t("div",null,[e[124]||(e[124]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-list-ol mr-2 text-gray-400"}),l(" 固定最小排队数 ")],-1)),d(t("input",{"onUpdate:modelValue":e[26]||(e[26]=r=>u.value.concurrentRequestQueueMaxSize=r),class:"mt-1 block w-full max-w-xs rounded-lg border border-gray-300 bg-white px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-500 dark:bg-gray-700 dark:text-white sm:text-sm",max:"100",min:"1",placeholder:"3",type:"number",onChange:D},null,544),[[p,u.value.concurrentRequestQueueMaxSize,void 0,{number:!0}]]),e[125]||(e[125]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 最大排队数的固定最小值(1-100) ",-1))]),t("div",null,[e[126]||(e[126]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-times mr-2 text-gray-400"}),l(" 排队数倍数 ")],-1)),d(t("input",{"onUpdate:modelValue":e[27]||(e[27]=r=>u.value.concurrentRequestQueueMaxSizeMultiplier=r),class:"mt-1 block w-full max-w-xs rounded-lg border border-gray-300 bg-white px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-500 dark:bg-gray-700 dark:text-white sm:text-sm",max:"10",min:"0",placeholder:"1",step:"0.5",type:"number",onChange:D},null,544),[[p,u.value.concurrentRequestQueueMaxSizeMultiplier,void 0,{number:!0}]]),e[127]||(e[127]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 最大排队数 = MAX(倍数 × 并发限制, 固定值),设为 0 则仅使用固定值 ",-1))]),t("div",null,[e[128]||(e[128]=t("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-stopwatch mr-2 text-gray-400"}),l(" 排队超时时间(毫秒) ")],-1)),d(t("input",{"onUpdate:modelValue":e[28]||(e[28]=r=>u.value.concurrentRequestQueueTimeoutMs=r),class:"mt-1 block w-full max-w-xs rounded-lg border border-gray-300 bg-white px-3 py-2 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-500 dark:bg-gray-700 dark:text-white sm:text-sm",max:"300000",min:"5000",placeholder:"10000",type:"number",onChange:D},null,544),[[p,u.value.concurrentRequestQueueTimeoutMs,void 0,{number:!0}]]),e[129]||(e[129]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 请求在排队中等待的最大时间,超时将返回 429 错误(5秒-5分钟,默认10秒) ",-1))])])):x("",!0),e[130]||(e[130]=A('<div class="mt-4 rounded-lg bg-blue-50 p-4 dark:bg-blue-900/20" data-v-9495fcfd><div class="flex" data-v-9495fcfd><i class="fas fa-info-circle mt-0.5 text-blue-500" data-v-9495fcfd></i><div class="ml-3" data-v-9495fcfd><p class="text-sm text-blue-700 dark:text-blue-300" data-v-9495fcfd><strong data-v-9495fcfd>工作原理:</strong>当 API Key 的并发请求超过 <code class="rounded bg-blue-100 px-1 dark:bg-blue-800" data-v-9495fcfd>concurrencyLimit</code> 时,超限请求会进入队列等待而非直接返回 429。适合 Claude Code Agent 并行工具调用场景。 </p></div></div></div>',1))]),u.value.updatedAt?(n(),o("div",pr,[e[133]||(e[133]=t("i",{class:"fas fa-history mr-2"},null,-1)),l(" 最后更新:"+v(g(J)(u.value.updatedAt))+" ",1),u.value.updatedBy?(n(),o("span",yr,[e[131]||(e[131]=l(" 由 ",-1)),t("strong",null,v(u.value.updatedBy),1),e[132]||(e[132]=l(" 修改 ",-1))])):x("",!0)])):x("",!0)]))],512),[[X,w.value==="claude"]]),d(t("div",null,[se.value?(n(),o("div",vr,e[134]||(e[134]=[t("div",{class:"loading-spinner mx-auto mb-4"},null,-1),t("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载配置...",-1)]))):(n(),o("div",mr,[t("div",kr,[t("div",wr,[e[138]||(e[138]=t("div",{class:"mr-4 flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full bg-blue-500 text-white"},[t("i",{class:"fas fa-info"})],-1)),t("div",null,[e[137]||(e[137]=t("h3",{class:"text-lg font-semibold text-gray-800 dark:text-gray-200"}," 服务倍率说明 ",-1)),t("p",hr,[e[135]||(e[135]=l(" 服务倍率用于计算不同服务的计费费用。以 ",-1)),t("strong",null,v(U.value.baseService||"claude"),1),e[136]||(e[136]=l(" 为基准(倍率 1.0),其他服务按倍率换算。例如:Gemini 倍率 0.5 表示消耗 $1 只扣除 $0.5 额度。 ",-1))])])])]),t("div",Sr,[t("div",Cr,[e[140]||(e[140]=t("h2",{class:"text-lg font-semibold text-gray-800 dark:text-gray-200"},[t("i",{class:"fas fa-sliders-h mr-2 text-blue-500"}),l(" 倍率配置 ")],-1)),t("button",{class:"rounded-lg bg-blue-500 px-4 py-2 text-sm font-medium text-white hover:bg-blue-600 disabled:opacity-50",disabled:H.value,onClick:Be},[e[139]||(e[139]=t("i",{class:"fas fa-save mr-2"},null,-1)),l(" "+v(H.value?"保存中...":"保存配置"),1)],8,Tr)]),t("div",Ur,[(n(!0),o(Z,null,le(U.value.rates,(r,c)=>(n(),o("div",{key:c,class:"flex items-center justify-between rounded-lg border border-gray-200 p-4 dark:border-gray-700"},[t("div",Ar,[t("div",{class:E(["mr-3 flex h-10 w-10 items-center justify-center rounded-lg",Re(c)])},[t("i",{class:E(["text-white",Ee(c)])},null,2)],2),t("div",null,[t("div",Mr,v(Ve(c)),1),t("div",Ir,[l(v(c)+" ",1),c===U.value.baseService?(n(),o("span",Br," 基准服务 ")):x("",!0)])])]),t("div",Er,[d(t("input",{"onUpdate:modelValue":y=>U.value.rates[c]=y,class:"w-24 rounded-lg border border-gray-300 px-3 py-2 text-center text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",max:"10",min:"0.1",step:"0.1",type:"number"},null,8,Rr),[[p,U.value.rates[c],void 0,{number:!0}]]),e[141]||(e[141]=t("span",{class:"text-sm text-gray-500 dark:text-gray-400"},"倍",-1))])]))),128))]),U.value.updatedAt?(n(),o("div",Vr,[e[144]||(e[144]=t("i",{class:"fas fa-history mr-2"},null,-1)),l(" 最后更新:"+v(g(J)(U.value.updatedAt))+" ",1),U.value.updatedBy?(n(),o("span",Dr,[e[142]||(e[142]=l(" 由 ",-1)),t("strong",null,v(U.value.updatedBy),1),e[143]||(e[143]=l(" 修改 ",-1))])):x("",!0)])):x("",!0)])]))],512),[[X,w.value==="serviceRates"]])]))])]),L.value?(n(),o("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm transition-all duration-300 ease-out",onClick:Y},[t("div",{class:"relative mx-4 w-full max-w-2xl overflow-hidden rounded-2xl bg-white shadow-2xl transition-all duration-300 ease-out dark:bg-gray-800",onClick:e[50]||(e[50]=Ze(()=>{},["stop"]))},[t("div",Qr,[t("div",qr,[t("div",Pr,[e[146]||(e[146]=t("div",{class:"flex h-10 w-10 items-center justify-center rounded-full bg-gradient-to-br from-blue-500 to-indigo-600 text-white shadow-lg"},[t("i",{class:"fas fa-bell"})],-1)),t("div",null,[t("h3",jr,v(B.value?"编辑":"添加")+"通知平台 ",1),t("p",Nr," 配置"+v(B.value?"并更新":"新的")+"Webhook通知渠道 ",1)])]),t("button",{class:"rounded-lg p-2 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300",onClick:Y},e[147]||(e[147]=[t("i",{class:"fas fa-times text-lg"},null,-1)]))])]),t("div",Lr,[t("div",Or,[t("div",null,[e[151]||(e[151]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-layer-group mr-2 text-gray-400"}),l(" 平台类型 ")],-1)),t("div",Wr,[d(t("select",{"onUpdate:modelValue":e[29]||(e[29]=r=>s.value.type=r),class:"w-full appearance-none rounded-xl border border-gray-300 bg-white px-4 py-3 pr-10 text-gray-900 shadow-sm transition-all focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white",disabled:B.value},e[148]||(e[148]=[A('<option value="wechat_work" data-v-9495fcfd>🟢 企业微信</option><option value="dingtalk" data-v-9495fcfd>🔵 钉钉</option><option value="feishu" data-v-9495fcfd>🟦 飞书</option><option value="slack" data-v-9495fcfd>🟣 Slack</option><option value="discord" data-v-9495fcfd>🟪 Discord</option><option value="telegram" data-v-9495fcfd>✈️ Telegram</option><option value="bark" data-v-9495fcfd>🔔 Bark</option><option value="smtp" data-v-9495fcfd>📧 邮件通知</option><option value="custom" data-v-9495fcfd>⚙️ 自定义</option>',9)]),8,zr),[[_,s.value.type]]),e[149]||(e[149]=t("div",{class:"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3"},[t("i",{class:"fas fa-chevron-down text-gray-400"})],-1))]),B.value?(n(),o("p",Kr,e[150]||(e[150]=[t("i",{class:"fas fa-info-circle mr-1"},null,-1),l(" 编辑模式下不能更改平台类型 ",-1)]))):x("",!0)]),t("div",null,[e[152]||(e[152]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-tag mr-2 text-gray-400"}),l(" 名称 "),t("span",{class:"ml-2 text-xs text-gray-500"},"(可选)")],-1)),d(t("input",{"onUpdate:modelValue":e[30]||(e[30]=r=>s.value.name=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"例如:运维群通知、开发测试群",type:"text"},null,512),[[p,s.value.name]])]),s.value.type!=="bark"&&s.value.type!=="smtp"&&s.value.type!=="telegram"?(n(),o("div",Fr,[e[156]||(e[156]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-link mr-2 text-gray-400"}),l(" Webhook URL "),t("span",{class:"ml-1 text-xs text-red-500"},"*")],-1)),t("div",$r,[d(t("input",{"onUpdate:modelValue":e[31]||(e[31]=r=>s.value.url=r),class:E(["w-full rounded-xl border border-gray-300 bg-white px-4 py-3 pr-10 font-mono text-sm text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",{"border-red-500 focus:border-red-500 focus:ring-red-500/20":V.value,"border-green-500 focus:border-green-500 focus:ring-green-500/20":q.value}]),placeholder:"https://...",required:"",type:"url",onInput:De},null,34),[[p,s.value.url]]),q.value?(n(),o("div",Gr,e[153]||(e[153]=[t("i",{class:"fas fa-check-circle text-green-500"},null,-1)]))):x("",!0),V.value?(n(),o("div",Hr,e[154]||(e[154]=[t("i",{class:"fas fa-exclamation-circle text-red-500"},null,-1)]))):x("",!0)]),ge(s.value.type)?(n(),o("div",Yr,[e[155]||(e[155]=t("i",{class:"fas fa-info-circle mr-2 mt-0.5 text-blue-600 dark:text-blue-400"},null,-1)),t("p",Jr,v(ge(s.value.type)),1)])):x("",!0)])):x("",!0),s.value.type==="telegram"?(n(),o("div",Xr,[t("div",null,[e[157]||(e[157]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-robot mr-2 text-gray-400"}),l(" Bot Token "),t("span",{class:"ml-1 text-xs text-red-500"},"*")],-1)),d(t("input",{"onUpdate:modelValue":e[32]||(e[32]=r=>s.value.botToken=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 font-mono text-sm text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"例如:123456789:ABCDEFghijk-xyz",required:"",type:"text"},null,512),[[p,s.value.botToken]]),e[158]||(e[158]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 在 Telegram 的 @BotFather 中创建机器人后获得的 Token ",-1))]),t("div",null,[e[159]||(e[159]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-comments mr-2 text-gray-400"}),l(" Chat ID "),t("span",{class:"ml-1 text-xs text-red-500"},"*")],-1)),d(t("input",{"onUpdate:modelValue":e[33]||(e[33]=r=>s.value.chatId=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 font-mono text-sm text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"例如:123456789 或 -1001234567890",required:"",type:"text"},null,512),[[p,s.value.chatId]]),e[160]||(e[160]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 可使用 @userinfobot、@RawDataBot 或 API 获取聊天/频道的 Chat ID ",-1))]),t("div",null,[e[161]||(e[161]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-globe mr-2 text-gray-400"}),l(" API 基础地址 "),t("span",{class:"ml-2 text-xs text-gray-500"},"(可选)")],-1)),d(t("input",{"onUpdate:modelValue":e[34]||(e[34]=r=>s.value.apiBaseUrl=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 font-mono text-sm text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"默认: https://api.telegram.org",type:"url"},null,512),[[p,s.value.apiBaseUrl]]),e[162]||(e[162]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 使用自建 Bot API 时可覆盖默认域名,需以 http 或 https 开头 ",-1))]),t("div",null,[e[163]||(e[163]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-route mr-2 text-gray-400"}),l(" 代理地址 "),t("span",{class:"ml-2 text-xs text-gray-500"},"(可选)")],-1)),d(t("input",{"onUpdate:modelValue":e[35]||(e[35]=r=>s.value.proxyUrl=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 font-mono text-sm text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"例如:socks5://user:pass@127.0.0.1:1080",type:"text"},null,512),[[p,s.value.proxyUrl]]),e[164]||(e[164]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 支持 http、https、socks4/4a/5 代理,留空则直接连接 Telegram 官方 API ",-1))]),e[165]||(e[165]=t("div",{class:"flex items-start rounded-lg bg-blue-50 p-3 text-sm text-blue-700 dark:bg-blue-900/20 dark:text-blue-300"},[t("i",{class:"fas fa-info-circle mr-2 mt-0.5"}),t("div",null,"机器人需先加入对应群组或频道并授予发送消息权限,通知会以纯文本方式发送。")],-1))])):x("",!0),s.value.type==="bark"?(n(),o("div",Zr,[t("div",null,[e[166]||(e[166]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-key mr-2 text-gray-400"}),l(" 设备密钥 (Device Key) "),t("span",{class:"ml-1 text-xs text-red-500"},"*")],-1)),d(t("input",{"onUpdate:modelValue":e[36]||(e[36]=r=>s.value.deviceKey=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 font-mono text-sm text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"例如:aBcDeFgHiJkLmNoPqRsTuVwX",required:"",type:"text"},null,512),[[p,s.value.deviceKey]]),e[167]||(e[167]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 在Bark App中查看您的推送密钥 ",-1))]),t("div",null,[e[168]||(e[168]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-server mr-2 text-gray-400"}),l(" 服务器地址 "),t("span",{class:"ml-2 text-xs text-gray-500"},"(可选)")],-1)),d(t("input",{"onUpdate:modelValue":e[37]||(e[37]=r=>s.value.serverUrl=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 font-mono text-sm text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"默认: https://api.day.app/push",type:"url"},null,512),[[p,s.value.serverUrl]])]),t("div",null,[e[170]||(e[170]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-flag mr-2 text-gray-400"}),l(" 通知级别 ")],-1)),d(t("select",{"onUpdate:modelValue":e[38]||(e[38]=r=>s.value.level=r),class:"w-full appearance-none rounded-xl border border-gray-300 bg-white px-4 py-3 pr-10 text-gray-900 shadow-sm transition-all focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white"},e[169]||(e[169]=[A('<option value="" data-v-9495fcfd>自动(根据通知类型)</option><option value="passive" data-v-9495fcfd>被动</option><option value="active" data-v-9495fcfd>默认</option><option value="timeSensitive" data-v-9495fcfd>时效性</option><option value="critical" data-v-9495fcfd>紧急</option>',5)]),512),[[_,s.value.level]])]),t("div",null,[e[172]||(e[172]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-volume-up mr-2 text-gray-400"}),l(" 通知声音 ")],-1)),d(t("select",{"onUpdate:modelValue":e[39]||(e[39]=r=>s.value.sound=r),class:"w-full appearance-none rounded-xl border border-gray-300 bg-white px-4 py-3 pr-10 text-gray-900 shadow-sm transition-all focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white"},e[171]||(e[171]=[A('<option value="" data-v-9495fcfd>自动(根据通知类型)</option><option value="default" data-v-9495fcfd>默认</option><option value="alarm" data-v-9495fcfd>警报</option><option value="bell" data-v-9495fcfd>铃声</option><option value="birdsong" data-v-9495fcfd>鸟鸣</option><option value="electronic" data-v-9495fcfd>电子音</option><option value="glass" data-v-9495fcfd>玻璃</option><option value="horn" data-v-9495fcfd>喇叭</option><option value="silence" data-v-9495fcfd>静音</option>',9)]),512),[[_,s.value.sound]])]),t("div",null,[e[173]||(e[173]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-folder mr-2 text-gray-400"}),l(" 通知分组 "),t("span",{class:"ml-2 text-xs text-gray-500"},"(可选)")],-1)),d(t("input",{"onUpdate:modelValue":e[40]||(e[40]=r=>s.value.group=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"默认: claude-relay",type:"text"},null,512),[[p,s.value.group]])]),e[174]||(e[174]=t("div",{class:"mt-2 flex items-start rounded-lg bg-blue-50 p-3 dark:bg-blue-900/20"},[t("i",{class:"fas fa-info-circle mr-2 mt-0.5 text-blue-600 dark:text-blue-400"}),t("div",{class:"text-sm text-blue-700 dark:text-blue-300"},[t("p",null,"1. 在iPhone上安装Bark App"),t("p",null,"2. 打开App获取您的设备密钥"),t("p",null,"3. 将密钥粘贴到上方输入框")])],-1))])):x("",!0),s.value.type==="smtp"?(n(),o("div",_r,[t("div",null,[e[175]||(e[175]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-server mr-2 text-gray-400"}),l(" SMTP 服务器 "),t("span",{class:"ml-1 text-xs text-red-500"},"*")],-1)),d(t("input",{"onUpdate:modelValue":e[41]||(e[41]=r=>s.value.host=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"例如: smtp.gmail.com",required:"",type:"text"},null,512),[[p,s.value.host]])]),t("div",es,[t("div",null,[e[176]||(e[176]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-plug mr-2 text-gray-400"}),l(" 端口 ")],-1)),d(t("input",{"onUpdate:modelValue":e[42]||(e[42]=r=>s.value.port=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 text-gray-900 shadow-sm transition-all focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white",max:"65535",min:"1",placeholder:"587",type:"number"},null,512),[[p,s.value.port,void 0,{number:!0}]]),e[177]||(e[177]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 默认: 587 (TLS) 或 465 (SSL) ",-1))]),t("div",null,[e[179]||(e[179]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-shield-alt mr-2 text-gray-400"}),l(" 加密方式 ")],-1)),d(t("select",{"onUpdate:modelValue":e[43]||(e[43]=r=>s.value.secure=r),class:"w-full appearance-none rounded-xl border border-gray-300 bg-white px-4 py-3 pr-10 text-gray-900 shadow-sm transition-all focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white"},e[178]||(e[178]=[t("option",{value:!1},"STARTTLS (端口587)",-1),t("option",{value:!0},"SSL/TLS (端口465)",-1)]),512),[[_,s.value.secure]])])]),t("div",null,[e[180]||(e[180]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-user mr-2 text-gray-400"}),l(" 用户名 "),t("span",{class:"ml-1 text-xs text-red-500"},"*")],-1)),d(t("input",{"onUpdate:modelValue":e[44]||(e[44]=r=>s.value.user=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"user@example.com",required:"",type:"email"},null,512),[[p,s.value.user]])]),t("div",null,[e[181]||(e[181]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-lock mr-2 text-gray-400"}),l(" 密码 / 应用密码 "),t("span",{class:"ml-1 text-xs text-red-500"},"*")],-1)),d(t("input",{"onUpdate:modelValue":e[45]||(e[45]=r=>s.value.pass=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"邮箱密码或应用专用密码",required:"",type:"password"},null,512),[[p,s.value.pass]]),e[182]||(e[182]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 建议使用应用专用密码,而非邮箱登录密码 ",-1))]),t("div",null,[e[183]||(e[183]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-paper-plane mr-2 text-gray-400"}),l(" 发件人邮箱 "),t("span",{class:"ml-2 text-xs text-gray-500"},"(可选)")],-1)),d(t("input",{"onUpdate:modelValue":e[46]||(e[46]=r=>s.value.from=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"默认使用用户名邮箱",type:"email"},null,512),[[p,s.value.from]])]),t("div",null,[e[184]||(e[184]=t("label",{class:"mb-2 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-envelope mr-2 text-gray-400"}),l(" 收件人邮箱 "),t("span",{class:"ml-1 text-xs text-red-500"},"*")],-1)),d(t("input",{"onUpdate:modelValue":e[47]||(e[47]=r=>s.value.to=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder:text-gray-500",placeholder:"admin@example.com",required:"",type:"email"},null,512),[[p,s.value.to]]),e[185]||(e[185]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},"接收通知的邮箱地址",-1))])])):x("",!0),s.value.type==="dingtalk"||s.value.type==="feishu"?(n(),o("div",ts,[t("div",as,[t("div",rs,[t("label",ss,[d(t("input",{id:"enableSign","onUpdate:modelValue":e[48]||(e[48]=r=>s.value.enableSign=r),class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-2 focus:ring-blue-500 focus:ring-offset-0",type:"checkbox"},null,512),[[Q,s.value.enableSign]]),e[186]||(e[186]=t("span",{class:"ml-3 flex items-center text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-shield-alt mr-2 text-gray-400"}),l(" 启用签名验证 ")],-1))]),s.value.enableSign?(n(),o("span",ls," 已启用 ")):x("",!0)]),Ue(Xe,{"enter-active-class":"transition-all duration-200 ease-out","enter-from-class":"opacity-0 -translate-y-2","enter-to-class":"opacity-100 translate-y-0","leave-active-class":"transition-all duration-150 ease-in","leave-from-class":"opacity-100 translate-y-0","leave-to-class":"opacity-0 -translate-y-2"},{default:Je(()=>[s.value.enableSign?(n(),o("div",os,[e[187]||(e[187]=t("label",{class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"}," 签名密钥 ",-1)),d(t("input",{"onUpdate:modelValue":e[49]||(e[49]=r=>s.value.secret=r),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 font-mono text-sm text-gray-900 shadow-sm transition-all placeholder:text-gray-400 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder:text-gray-500",placeholder:"SEC...",type:"text"},null,512),[[p,s.value.secret]])])):x("",!0)]),_:1})])])):x("",!0)])]),t("div",ns,[t("div",ds,[e[189]||(e[189]=t("div",{class:"text-xs text-gray-500 dark:text-gray-400"},[t("i",{class:"fas fa-asterisk mr-1 text-red-500"}),l(" 必填项 ")],-1)),t("div",is,[t("button",{class:"group flex items-center rounded-xl border border-gray-300 bg-white px-4 py-2.5 text-sm font-medium text-gray-700 shadow-sm transition-all hover:bg-gray-50 hover:shadow-md dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700",onClick:Y},e[188]||(e[188]=[t("i",{class:"fas fa-times mr-2 transition-transform group-hover:scale-110"},null,-1),l(" 取消 ",-1)])),t("button",{class:"group flex items-center rounded-xl border border-blue-200 bg-blue-50 px-4 py-2.5 text-sm font-medium text-blue-700 shadow-sm transition-all hover:bg-blue-100 hover:shadow-md dark:border-blue-800 dark:bg-blue-900/50 dark:text-blue-300 dark:hover:bg-blue-900/70",disabled:j.value,onClick:Le},[t("i",{class:E(["mr-2 transition-transform",j.value?"fas fa-spinner fa-spin":"fas fa-vial group-hover:scale-110"])},null,2),l(" "+v(j.value?"测试中...":"测试连接"),1)],8,us),t("button",{class:"group flex items-center rounded-xl bg-gradient-to-r from-blue-600 to-indigo-600 px-5 py-2.5 text-sm font-medium text-white shadow-md transition-all hover:from-blue-700 hover:to-indigo-700 hover:shadow-lg disabled:cursor-not-allowed disabled:from-gray-400 disabled:to-gray-500",disabled:!Me.value||N.value,onClick:Qe},[t("i",{class:E(["mr-2 transition-transform",N.value?"fas fa-spinner fa-spin":"fas fa-save group-hover:scale-110"])},null,2),l(" "+v(N.value?"保存中...":B.value?"保存修改":"添加平台"),1)],8,gs)])])])]),Ue(ct,{"cancel-text":m.value.cancelText,"confirm-text":m.value.confirmText,message:m.value.message,show:z.value,title:m.value.title,type:m.value.type,onCancel:te,onConfirm:F},null,8,["cancel-text","confirm-text","message","show","title","type"])])):x("",!0)],64))}}),vs=tt(fs,[["__scopeId","data-v-9495fcfd"]]);export{vs as default};
|