4 lines
132 KiB
JavaScript
4 lines
132 KiB
JavaScript
import{t as e}from"./VDataTable-ClfE0-sD.js";import{_ as t,d as n,t as r}from"./VSelect-BvR-yyLS.js";import{n as i,t as a}from"./VRow-rmSa_q-C.js";import{$ as o,$r as s,Ar as c,At as l,Ct as u,Dr as d,Er as f,F as p,Ft as m,Gr as h,I as g,Ir as _,L as v,Lr as y,Lt as b,Nn as x,Nr as S,On as ee,Or as C,Q as te,Qr as w,Rr as ne,Sn as re,T as ie,Tr as T,Vr as ae,Wr as oe,Xn as E,Xr as se,Xt as ce,Yr as le,_ as ue,_i as D,ai as de,b as O,bi as fe,br as k,cn as pe,dr as me,dt as he,g as ge,gr as _e,h as A,ii as ve,in as j,jr as M,ln as ye,n as N,nt as be,pn as xe,q as Se,qr as P,r as Ce,ri as F,ti as I,u as we,ui as L,v as R,vr as Te,wr as z,wt as Ee,xi as B,xr as V,xt as De,y as H,yi as Oe,yr as ke}from"./index-CDcgx9V8.js";import{d as Ae,f as je,n as Me,o as Ne,r as Pe,t as Fe}from"./dist-DCycUQQT.js";import{a as Ie,i as Le,n as Re,o as ze,r as Be,t as Ve,u as He}from"./StatCardsRow-CdfBB9tI.js";import{t as Ue}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as We}from"./usePageActivateRefresh-CqHSpagO.js";import{t as Ge}from"./useSnackbar-u_XK4ZNm.js";import{n as Ke,t as qe}from"./dataTable-esDY4cOk.js";import{n as Je}from"./paginatedFetch-VYTwXwno.js";import{a as Ye,i as U,n as W,o as Xe,t as G}from"./VCard-pmpQR9O7.js";import{t as K}from"./VTextField-B-BnrJAQ.js";import{t as Ze}from"./VTable-BTftprIQ.js";import{t as Qe}from"./VDataTableServer-BIMNqMvk.js";import{t as q}from"./apiError-CpgZRt4T.js";import{t as $e}from"./labels-C-A2d08W.js";import{n as et,r as tt,t as nt}from"./status-BrGQYcd-.js";import{t as rt}from"./VSkeletonLoader-gL4kF19X.js";import{t as it}from"./VDialog-nKJcjfNL.js";import{n as at,t as ot}from"./VTooltip-tVMR683k.js";import{t as st}from"./VAutocomplete-CZMI3cz9.js";import{r as J}from"./validation-BMzYTJL4.js";import{n as ct,t as lt}from"./useServerSearchHistory-BnDuA-7p.js";import{a as ut,i as dt,n as ft,r as pt,t as mt}from"./useServerCategories-V7luFEnW.js";import{t as ht}from"./usePageAutoRefresh-DvG6Fd0_.js";import{t as gt}from"./VTextarea-PzNEhaMZ.js";import{i as _t,n as vt,r as yt,t as bt}from"./VExpansionPanels-ByOIBgKv.js";import{n as xt,t as St}from"./serverSiteUrl-DDZRgSNA.js";import{C as Ct,E as wt,S as Tt,T as Et,_ as Dt,a as Ot,b as kt,c as Y,d as At,f as jt,g as Mt,h as Nt,i as Pt,l as Ft,m as It,o as Lt,p as Rt,r as zt,s as Bt,t as Vt,u as Ht,v as Ut,y as Wt}from"./useWatchPins-DTUw7j9v.js";import{t as Gt}from"./ServerQuickAddDialogs-zcLgLArY.js";import{t as Kt}from"./useBtPanelLogin-DCNB-U_J.js";import{T as qt,t as Jt}from"./btpanel-C_41A_fE.js";var Yt={status:`status`,name:`name`,domain:`domain`,address:`domain`,category:`category`,target_path:`target_path`,agent_version:`agent_version`,agent:`agent_version`,last_heartbeat:`heartbeat`,heartbeat:`heartbeat`,created_at:`created_at`};function Xt(e){if(!e.length)return{};let t=Yt[e[0].key];return t?{sort_by:t,sort_order:e[0].order}:{}}function Zt(e){let t=e?.targetPathUnset,n=L([]),r=L(!1),i=L(1),a=L(20),o=L(0),s=L(``),c=L(``),l=L(null),u=L([{key:`created_at`,order:`desc`}]);function d(){let e=String(s.value??``).trim(),n=t!==void 0&&!e;return{search:e||void 0,...e?{}:pt(c.value),...!e&&l.value!==null?{is_online:l.value}:{},...Xt(u.value),...n?{target_path_unset:t}:{}}}async function f(e){e?.silent||(r.value=!0);try{let e=await Je(`/servers/`,d(),i.value,a.value);n.value=e.items,o.value=e.total,a.value===-1&&(i.value=1)}catch(e){throw n.value=[],o.value=0,e}finally{r.value=!1}}let p;h(()=>clearTimeout(p));function m(){clearTimeout(p),p=setTimeout(()=>{i.value=1,f()},300)}function g(e){i.value=e,f()}function _(e){a.value=e,i.value=1,f()}function v(e){c.value=e,i.value=1,f()}function y(e){l.value=e,i.value=1,f()}function b(){l.value!==null&&(l.value=null,i.value=1,f())}I(u,()=>{i.value=1,f()},{deep:!0});async function x(){return(await Je(`/servers/`,d(),1,-1)).items}return{servers:n,loading:r,page:i,itemsPerPage:a,total:o,search:s,categoryFilter:c,isOnlineFilter:l,sortBy:u,loadServers:f,onSearch:m,onPageChange:g,onItemsPerPageChange:_,onCategoryChange:v,onOnlineFilterChange:y,clearOnlineFilter:b,loadAllServers:x,listQueryParams:d}}function Qt(e){let t=(e??``).trim();return t===``||t===`/www/wwwroot`}function $t(e){if(typeof e==`number`&&Number.isFinite(e)&&e>0)return Math.trunc(e);if(typeof e==`string`&&/^\d+$/.test(e.trim())){let t=Number(e.trim());return Number.isFinite(t)&&t>0?t:null}return null}function en(e){let t=[];for(let n of e){let e=$t(typeof n==`object`&&n&&`id`in n?n.id:n);e!==null&&t.push(e)}return[...new Set(t)]}function tn(e,t){e.push({path:`/terminal`,query:{server_id:String(t)}})}var nn=[{minutes:30,label:`30分`},{minutes:60,label:`1时`},{minutes:120,label:`2时`},{minutes:480,label:`8时`},{minutes:1440,label:`24时`}];function rn(e){let t=new Set(nn.map(e=>e.minutes));return e!=null&&t.has(e)?e:e===8?480:e===24?1440:30}function an(e){return{30:`30分钟`,60:`1小时`,120:`2小时`,480:`8小时`,1440:`24小时`}[e]??`${e}分钟`}var on={class:`d-flex flex-wrap align-center ga-2`},sn={class:`text-body-2`},cn={class:`d-flex ga-1 flex-shrink-0`},ln=S({__name:`ServerAgentHint`,props:{action:{},message:{},compact:{type:Boolean},loading:{type:Boolean}},emits:[`install`,`upgrade`,`diagnose`],setup(e){let t=e;function n(e){return e===`install`?`info`:e===`upgrade`?`warning`:e===`offline`?`error`:`info`}return(e,r)=>t.action&&t.action!==`ok`&&t.message?(P(),f(g,{key:0,type:n(t.action),variant:`tonal`,density:t.compact?`compact`:`default`,class:`mb-0`},{default:F(()=>[T(`div`,on,[T(`span`,sn,B(t.message),1),t.compact?d(``,!0):(P(),f(R,{key:0})),T(`div`,cn,[t.action===`install`?(P(),f(v,{key:0,size:`small`,variant:`flat`,color:`primary`,loading:t.loading,onClick:r[0]||=t=>e.$emit(`install`)},{default:F(()=>[...r[3]||=[c(` 安装 Agent `,-1)]]),_:1},8,[`loading`])):d(``,!0),t.action===`upgrade`?(P(),f(v,{key:1,size:`small`,variant:`flat`,color:`warning`,loading:t.loading,onClick:r[1]||=t=>e.$emit(`upgrade`)},{default:F(()=>[...r[4]||=[c(` 升级 Agent `,-1)]]),_:1},8,[`loading`])):d(``,!0),t.action===`offline`?(P(),f(v,{key:2,size:`small`,variant:`text`,onClick:r[2]||=t=>e.$emit(`diagnose`)},{default:F(()=>[...r[5]||=[c(` 诊断 `,-1)]]),_:1})):d(``,!0)])])]),_:1},8,[`type`,`density`])):d(``,!0)}});function un(e,t){let n=Math.min(1,Math.max(0,t)),r=e.trim();if(r.startsWith(`#`)){let e=r.slice(1);if(e.length===3&&(e=e.split(``).map(e=>e+e).join(``)),e.length>=6){let t=Number.parseInt(e.slice(0,2),16),r=Number.parseInt(e.slice(2,4),16),i=Number.parseInt(e.slice(4,6),16);if(!Number.isNaN(t)&&!Number.isNaN(r)&&!Number.isNaN(i))return`rgba(${t},${r},${i},${n})`}}let i=r.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i);return i?`rgba(${i[1]},${i[2]},${i[3]},${n})`:r}var dn=Ue(S({__name:`WatchSparkline`,props:{points:{},metric:{},height:{}},setup(e){je([Ae,Ne,Pe,Me]);let t=e,n=xe(),r=z(()=>t.metric||`cpu_pct`),i=z(()=>{let e=n.current.value.colors.primary;return typeof e==`string`?e:`#1976D2`}),a=z(()=>{let e=r.value,n=t.points.map(e=>ce(e.ts)),a=t.points.map(t=>t[e]??null),o=i.value;return{animation:!1,grid:{left:4,right:4,top:6,bottom:4},xAxis:{type:`category`,show:!1,data:n},yAxis:{type:`value`,show:!1,min:0},tooltip:{trigger:`axis`,confine:!0,formatter:e=>{let t=n[e[0]?.dataIndex??0]??``,r=e[0]?.value;return`${t}<br/>${r==null?`—`:`${r}%`}`}},series:[{type:`line`,data:a,showSymbol:!1,smooth:!0,lineStyle:{width:1.5,color:o},areaStyle:{color:{type:`linear`,x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:un(o,.2)},{offset:1,color:un(o,.02)}]}}}]}});return(t,n)=>(P(),f(D(Fe),{class:`watch-sparkline`,style:fe({height:`${e.height??48}px`}),option:a.value,"update-options":{notMerge:!0},autoresize:``},null,8,[`style`,`option`]))}}),[[`__scopeId`,`data-v-ddd7aac4`]]),fn={class:`watch-metric-ring__label text-caption text-medium-emphasis mt-1`},pn=Ue(S({__name:`WatchMetricRing`,props:{label:{},accent:{},value:{},center:{},hint:{},size:{default:68},dimmed:{type:Boolean,default:!1}},setup(e){_e(e=>({v7b31cf64:s.value}));let t=e,n=z(()=>Math.max(4,Math.round(t.size*(t.dimmed?.08:.1)))),r=z(()=>t.dimmed?`rgba(var(--v-theme-on-surface), 0.22)`:Tt(t.accent,t.value)),i=z(()=>t.dimmed?`—`:t.center!=null&&t.center!==``?t.center:t.value==null?`—`:`${Math.round(t.value)}%`),a=z(()=>t.dimmed||t.value==null||Number.isNaN(t.value)?0:Math.max(0,Math.min(100,t.value))),o=z(()=>!t.dimmed&&!!t.hint),s=z(()=>`${Math.max(11,Math.round(t.size*.2))}px`);return(t,s)=>(P(),f(ot,{text:e.hint,location:`top`,disabled:!o.value},{activator:F(({props:t})=>[T(`div`,y({class:[`watch-metric-ring text-center`,{"watch-metric-ring--dimmed":e.dimmed}]},t),[M(te,{"model-value":a.value,size:e.size,width:n.value,color:r.value,"bg-color":`rgba(var(--v-theme-on-surface), 0.08)`,class:`watch-metric-ring__circle`},{default:F(()=>[T(`span`,{class:`watch-metric-ring__value`,style:fe({color:r.value})},B(i.value),5)]),_:1},8,[`model-value`,`size`,`width`,`color`]),T(`div`,fn,B(e.label),1)],16)]),_:1},8,[`text`,`disabled`]))}}),[[`__scopeId`,`data-v-ec4a9033`]]),mn=[`title`],hn={class:`watch-slot-header-actions d-flex align-center flex-shrink-0`},gn={class:`watch-ttl-chips d-flex flex-wrap ga-1`},_n={class:`watch-slot-paused-cta text-center`},vn={key:0,class:`watch-slot-waiting d-flex flex-column align-center justify-center text-center py-6`},yn=[`title`],bn={class:`watch-metric-rings d-flex justify-space-between mb-2`},X={key:2,class:`text-caption text-medium-emphasis mb-2 text-center`},xn={key:0},Sn={key:1},Cn=[`title`],Z={class:`text-truncate`},wn={class:`d-flex align-center justify-space-between mt-2`},Tn={class:`text-caption text-medium-emphasis`},En={class:`d-flex ga-1`},Dn={key:2,class:`d-flex align-center justify-space-between mt-2`},On={class:`text-caption text-medium-emphasis`},kn={class:`text-center text-medium-emphasis`},An={class:`text-caption`},jn=Ue(S({__name:`WatchSlotCard`,props:{slot:{},psutilInstallLoading:{type:Boolean},agentActionLoading:{type:Boolean}},emits:[`remove`,`processes`,`history`,`pick`,`monitoring`,`ttl`,`installPsutil`,`installAgent`,`upgradeAgent`],setup(e,{emit:t}){let n=e,r=t,i=z(()=>n.slot.monitoring_enabled!==!1),a=z(()=>rn(n.slot.ttl_minutes??(n.slot.ttl_hours===24?1440:n.slot.ttl_hours===8?480:void 0))),s=z(()=>i.value&&Dt(n.slot.metrics?.error,n.slot.metrics?.probe_status)),l=z(()=>n.slot.agent_action),u=z(()=>i.value&&l.value&&l.value!==`ok`&&!!n.slot.agent_action_message),p=L(`cpu_pct`),m=z(()=>n.slot.metrics?.load_1),h=z(()=>n.slot.metrics?.load_5),g=z(()=>n.slot.metrics?.load_15),_=z(()=>kt(m.value,n.slot.metrics?.cpu_cores)),b=z(()=>{if(m.value!=null)return Lt(m.value)}),x=z(()=>{let e=[];m.value!=null&&e.push(`1 分钟 ${Lt(m.value)}`),h.value!=null&&g.value!=null&&e.push(`5 / 15 ${Lt(h.value)} / ${Lt(g.value)}`);let t=Wt(m.value,n.slot.metrics?.cpu_cores);return t&&e.push(t),e.join(` · `)}),S=z(()=>Mt(n.slot.metrics)),ee=z(()=>i.value&&Ut(n.slot.metrics)),w=z(()=>(n.slot.metrics?.swap_total_gb??0)>0);return(t,m)=>e.slot.empty?(P(),f(G,{key:1,elevation:`0`,border:``,rounded:`lg`,link:!1,ripple:!1,class:`watch-slot-card watch-slot-card--empty d-flex align-center justify-center pa-4`,variant:`outlined`,role:`button`,tabindex:`0`,onClick:m[21]||=t=>r(`pick`,e.slot.slot_index),onKeydown:m[22]||=ke(k(t=>r(`pick`,e.slot.slot_index),[`prevent`]),[`enter`])},{default:F(()=>[T(`div`,kn,[M(o,{size:`28`,class:`mb-1`},{default:F(()=>[...m[37]||=[c(`mdi-plus-circle-outline`,-1)]]),_:1}),T(`div`,An,`槽 `+B(e.slot.slot_index+1)+` · 添加监测`,1)])]),_:1})):(P(),f(G,{key:0,elevation:`0`,border:``,rounded:`lg`,link:!1,ripple:!1,class:Oe([`watch-slot-card pa-3 watch-slot-card--filled`,{"watch-slot-card--error":i.value&&e.slot.metrics?.probe_status&&e.slot.metrics.probe_status!==`ok`,"watch-slot-card--paused":!i.value}]),role:`button`,tabindex:`0`,onClick:m[19]||=t=>i.value?r(`history`,e.slot):void 0,onKeydown:m[20]||=ke(k(t=>i.value?r(`history`,e.slot):void 0,[`prevent`]),[`enter`])},{default:F(()=>[T(`div`,{class:`watch-slot-header d-flex align-center mb-2`,onClick:m[6]||=k(()=>{},[`stop`])},[T(`div`,{class:`text-subtitle-2 text-truncate flex-grow-1 min-width-0`,title:e.slot.server_name},B(e.slot.server_name||`ID ${e.slot.server_id}`),9,mn),T(`div`,hn,[M(O,{size:`x-small`,variant:`tonal`,color:i.value?`info`:`warning`,label:``},{default:F(()=>[c(` 槽 `+B(e.slot.slot_index+1),1)]),_:1},8,[`color`]),M(Ce,{location:`bottom end`,"close-on-content-click":!0},{activator:F(({props:e})=>[M(v,y(e,{icon:`mdi-dots-vertical`,size:`x-small`,variant:`text`,class:`watch-slot-menu-btn`,"aria-label":`槽位操作`,onClick:m[0]||=k(()=>{},[`stop`])}),null,16)]),default:F(()=>[M(we,{density:`compact`,class:`watch-slot-menu-list`,"min-width":`168`},{default:F(()=>[i.value&&l.value===`upgrade`?(P(),f(A,{key:0,"prepend-icon":`mdi-arrow-up-bold`,title:`升级 Agent`,onClick:m[1]||=t=>r(`upgradeAgent`,e.slot.slot_index)})):d(``,!0),i.value&&l.value===`install`?(P(),f(A,{key:1,"prepend-icon":`mdi-download-network`,title:`安装 Agent`,onClick:m[2]||=t=>r(`installAgent`,e.slot.slot_index)})):d(``,!0),i.value&&(l.value===`upgrade`||l.value===`install`)?(P(),f(H,{key:2,class:`my-1`})):d(``,!0),i.value?(P(),f(A,{key:3,"prepend-icon":`mdi-pause-circle-outline`,title:`暂停实时监测`,onClick:m[3]||=t=>r(`monitoring`,e.slot.slot_index,!1)})):(P(),f(A,{key:4,"prepend-icon":`mdi-play-circle-outline`,title:`恢复实时监测`,onClick:m[4]||=t=>r(`monitoring`,e.slot.slot_index,!0)})),M(H,{class:`my-1`}),M(A,{"prepend-icon":`mdi-close-circle-outline`,title:`移除此槽`,"base-color":`error`,onClick:m[5]||=t=>r(`remove`,e.slot.slot_index)})]),_:1})]),_:1})])]),i.value?(P(),C(`div`,{key:0,class:`watch-ttl-row mb-2`,onClick:m[7]||=k(()=>{},[`stop`])},[m[23]||=T(`span`,{class:`text-caption text-medium-emphasis watch-ttl-label`},`时长`,-1),T(`div`,gn,[(P(!0),C(V,null,le(D(nn),t=>(P(),f(O,{key:t.minutes,color:a.value===t.minutes?`primary`:void 0,variant:a.value===t.minutes?`flat`:`outlined`,size:`x-small`,label:``,class:`watch-ttl-chip`,onClick:n=>r(`ttl`,e.slot.slot_index,t.minutes)},{default:F(()=>[c(B(t.label),1)]),_:2},1032,[`color`,`variant`,`onClick`]))),128))])])):d(``,!0),u.value?(P(),f(ln,{key:1,class:`mb-2`,compact:``,action:l.value,message:e.slot.agent_action_message,loading:n.agentActionLoading,onInstall:m[8]||=t=>r(`installAgent`,e.slot.slot_index),onUpgrade:m[9]||=t=>r(`upgradeAgent`,e.slot.slot_index)},null,8,[`action`,`message`,`loading`])):d(``,!0),i.value?(P(),C(`div`,{key:3,onClick:m[18]||=k(()=>{},[`stop`])},[ee.value?(P(),C(`div`,vn,[M(te,{indeterminate:``,color:`primary`,size:`36`,width:`3`}),m[26]||=T(`div`,{class:`text-body-2 mt-3`},`等待服务器回传信息…`,-1),m[27]||=T(`div`,{class:`text-caption text-medium-emphasis mt-1 px-2`},` 探针约每 5 秒轮询,首次通常 5–15 秒 `,-1)])):(P(),C(V,{key:1},[e.slot.metrics?.probe_status?(P(),f(O,{key:0,size:`x-small`,color:D(Et)(e.slot.metrics.probe_status),variant:`tonal`,class:`mb-2`,label:``},{default:F(()=>[c(B(D(wt)(e.slot.metrics.probe_status)),1)]),_:1},8,[`color`])):d(``,!0),S.value.short?(P(),C(`div`,{key:1,class:`text-caption text-medium-emphasis mb-2 text-truncate`,title:S.value.full},B(S.value.short),9,yn)):d(``,!0),T(`div`,bn,[M(pn,{label:`CPU`,accent:`cpu`,value:e.slot.metrics?.cpu_pct,hint:D(zt)(e.slot.metrics),size:56},null,8,[`value`,`hint`]),M(pn,{label:`内存`,accent:`mem`,value:e.slot.metrics?.mem_pct,hint:[D(Ft)(e.slot.metrics),D(Ht)(e.slot.metrics)].filter(Boolean).join(` · `),size:56},null,8,[`value`,`hint`]),M(pn,{label:`硬盘`,accent:`disk`,value:e.slot.metrics?.disk_pct,hint:[D(Pt)(e.slot.metrics),D(Ot)(e.slot.metrics)].filter(Boolean).join(` · `),size:56},null,8,[`value`,`hint`]),M(pn,{label:`负载`,accent:`load`,value:_.value,center:b.value,hint:x.value,size:56},null,8,[`value`,`center`,`hint`])]),w.value?(P(),C(`div`,X,[m[28]||=c(` 交换分区 `,-1),e.slot.metrics?.swap_used_gb!=null&&e.slot.metrics?.swap_total_gb!=null?(P(),C(`span`,xn,` · 已用 `+B(D(Nt)(e.slot.metrics.swap_used_gb,e.slot.metrics.swap_total_gb)),1)):d(``,!0),e.slot.metrics?.swap_pct==null?d(``,!0):(P(),C(`span`,Sn,` · `+B(e.slot.metrics.swap_pct)+`%`,1))])):d(``,!0),M(H,{class:`my-2`}),M(be,{modelValue:p.value,"onUpdate:modelValue":m[12]||=e=>p.value=e,density:`compact`,variant:`outlined`,divided:``,class:`mb-1`},{default:F(()=>[M(v,{value:`cpu_pct`,size:`x-small`},{default:F(()=>[...m[29]||=[c(`CPU`,-1)]]),_:1}),M(v,{value:`mem_pct`,size:`x-small`},{default:F(()=>[...m[30]||=[c(`内存`,-1)]]),_:1}),M(v,{value:`disk_pct`,size:`x-small`},{default:F(()=>[...m[31]||=[c(`硬盘`,-1)]]),_:1})]),_:1},8,[`modelValue`]),M(dn,{points:e.slot.sparkline||[],metric:p.value},null,8,[`points`,`metric`]),e.slot.metrics?.error?(P(),C(`div`,{key:3,class:`text-caption text-error mt-1`,title:D(At)(e.slot.metrics.error,e.slot.metrics.probe_status)},[T(`div`,Z,B(D(At)(e.slot.metrics.error,e.slot.metrics.probe_status)),1),s.value?(P(),f(v,{key:0,size:`x-small`,variant:`tonal`,color:`primary`,class:`mt-1`,loading:n.psutilInstallLoading,onClick:m[13]||=k(t=>r(`installPsutil`,e.slot.slot_index),[`stop`])},{default:F(()=>[...m[32]||=[c(` 安装 psutil(SSH) `,-1)]]),_:1},8,[`loading`])):d(``,!0)],8,Cn)):d(``,!0),T(`div`,wn,[T(`span`,Tn,` 剩余 `+B(D(It)(e.slot.remaining_sec))+` · `+B(D(an)(a.value)),1),T(`div`,En,[i.value?(P(),f(v,{key:0,size:`x-small`,variant:`text`,class:`watch-slot-pause-btn`,onClick:m[14]||=k(t=>r(`monitoring`,e.slot.slot_index,!1),[`stop`])},{default:F(()=>[...m[33]||=[c(` 暂停 `,-1)]]),_:1})):d(``,!0),M(v,{size:`x-small`,variant:`text`,onClick:m[15]||=k(t=>r(`processes`,e.slot),[`stop`])},{default:F(()=>[...m[34]||=[c(`详情`,-1)]]),_:1}),M(v,{size:`x-small`,variant:`text`,onClick:m[16]||=k(t=>r(`history`,e.slot),[`stop`])},{default:F(()=>[...m[35]||=[c(`历史`,-1)]]),_:1})])])],64)),ee.value?(P(),C(`div`,Dn,[T(`span`,On,` 剩余 `+B(D(It)(e.slot.remaining_sec))+` · `+B(D(an)(a.value)),1),M(v,{size:`x-small`,variant:`text`,onClick:m[17]||=k(t=>r(`history`,e.slot),[`stop`])},{default:F(()=>[...m[36]||=[c(`历史`,-1)]]),_:1})])):d(``,!0)])):(P(),C(`div`,{key:2,class:`watch-slot-paused-body flex-grow-1`,onClick:m[11]||=k(()=>{},[`stop`])},[T(`div`,_n,[M(o,{icon:`mdi-radar-off`,size:`40`,class:`text-medium-emphasis mb-3 watch-slot-paused-icon`}),M(v,{size:`small`,variant:`tonal`,color:`primary`,"prepend-icon":`mdi-play-circle-outline`,onClick:m[10]||=t=>r(`monitoring`,e.slot.slot_index,!0)},{default:F(()=>[...m[24]||=[c(` 恢复实时监测 `,-1)]]),_:1}),m[25]||=T(`div`,{class:`text-caption text-medium-emphasis mt-3 px-4`},` 槽位与子机绑定保留 · 关闭期间由 Agent 每 60 秒上报 `,-1)])]))]),_:1},8,[`class`]))}}),[[`__scopeId`,`data-v-c1ec911a`]]),Mn={class:`pa-3`},Nn={class:`watch-detail-section mb-3`},Pn={class:`text-body-2 font-weight-medium`},Fn={class:`watch-detail-section mb-3`},In={class:`text-body-2`},Ln={key:0,class:`watch-detail-section mb-3`},Rn={class:`d-flex flex-wrap ga-1`},zn={key:1,class:`watch-detail-section mb-3`},Bn={class:`text-medium-emphasis`},Vn={class:`font-weight-medium`},Hn={class:`watch-detail-section mb-3`},Un={key:1,class:`text-caption text-medium-emphasis`},Wn={class:`watch-detail-section`},Gn={key:1,class:`text-caption text-medium-emphasis`},Kn=Ue(S({__name:`WatchProcessDrawer`,props:{modelValue:{type:Boolean},slotData:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let n=e,r=t,i=L({top_cpu:[],top_mem:[]}),a=L(!1),o=z({get:()=>n.modelValue,set:e=>r(`update:modelValue`,e)}),s=z(()=>n.slotData?.metrics),l=z(()=>Bt(s.value?.load_1,s.value?.load_5,s.value?.load_15)),u=z(()=>Rt(s.value?.process_running,s.value?.process_total)),m=z(()=>s.value?.per_cpu_pct||[]),h=z(()=>{let e=s.value;if(!e)return[];let t=[];return e.mem_free_mb!=null&&t.push({label:`空闲内存`,value:Y(e.mem_free_mb)}),e.memory_used_gb!=null&&t.push({label:`已用`,value:Y(Math.round(e.memory_used_gb*1024))}),e.memory_total_gb!=null&&t.push({label:`总内存`,value:Y(Math.round(e.memory_total_gb*1024))}),e.mem_shared_mb!=null&&t.push({label:`共享`,value:Y(e.mem_shared_mb)}),e.memory_available_gb!=null&&t.push({label:`可分配内存`,value:Y(Math.round(e.memory_available_gb*1024))}),(e.mem_buffers_mb!=null||e.mem_cached_mb!=null)&&t.push({label:`buff/cache`,value:`${Y(e.mem_buffers_mb??0)} / ${Y(e.mem_cached_mb??0)}`}),t});async function g(){if(n.slotData?.server_id){a.value=!0;try{i.value=Ct((await j.get(`/watch/processes/${n.slotData.server_id}`)).processes||n.slotData.processes)}catch{i.value=Ct(n.slotData.processes)}finally{a.value=!1}}}return I(()=>[o.value,n.slotData?.server_id],([e])=>{e&&g()}),(t,n)=>(P(),f(N,{modelValue:o.value,"onUpdate:modelValue":n[1]||=e=>o.value=e,location:`right`,temporary:``,width:`400`,class:`watch-detail-drawer`},{default:F(()=>[M(ie,{density:`compact`,flat:``},{default:F(()=>[M(p,{class:`text-subtitle-1`},{default:F(()=>[c(` 服务器详情 · `+B(e.slotData?.server_name),1)]),_:1}),M(R),M(v,{icon:`mdi-close`,variant:`text`,onClick:n[0]||=e=>o.value=!1})]),_:1}),M(H),a.value?(P(),f(Se,{key:0,indeterminate:``})):d(``,!0),T(`div`,Mn,[T(`section`,Nn,[n[2]||=T(`div`,{class:`text-caption text-medium-emphasis mb-1`},`最近 1 / 5 / 15 分钟平均负载`,-1),T(`div`,Pn,B(l.value),1)]),T(`section`,Fn,[n[3]||=T(`div`,{class:`text-caption text-medium-emphasis mb-1`},`活动进程数 / 总进程数`,-1),T(`div`,In,B(u.value),1)]),m.value.length?(P(),C(`section`,Ln,[n[4]||=T(`div`,{class:`text-caption text-medium-emphasis mb-2`},`各核心 CPU 占用`,-1),T(`div`,Rn,[(P(!0),C(V,null,le(m.value,(e,t)=>(P(),f(O,{key:t,size:`x-small`,variant:`tonal`,color:e>=80?`error`:e>=50?`warning`:`primary`,label:``},{default:F(()=>[c(` 核心 `+B(t+1)+` `+B(D(jt)(e)),1)]),_:2},1032,[`color`]))),128))])])):d(``,!0),h.value.length?(P(),C(`section`,zn,[n[5]||=T(`div`,{class:`text-caption text-medium-emphasis mb-2`},`内存信息`,-1),(P(!0),C(V,null,le(h.value,e=>(P(),C(`div`,{key:e.label,class:`d-flex justify-space-between text-body-2 watch-detail-kv`},[T(`span`,Bn,B(e.label),1),T(`span`,Vn,B(e.value),1)]))),128))])):d(``,!0),T(`section`,Hn,[n[6]||=T(`div`,{class:`text-caption text-medium-emphasis mb-2`},`CPU 占用率 Top5`,-1),i.value.top_cpu.length?(P(),f(we,{key:0,density:`compact`,class:`watch-detail-list py-0`},{default:F(()=>[(P(!0),C(V,null,le(i.value.top_cpu,(e,t)=>(P(),f(A,{key:`cpu-${e.pid}-${t}`},{default:F(()=>[M(ge,{class:`text-body-2 text-truncate`},{default:F(()=>[c(B(e.name||`—`),1)]),_:2},1024),M(ue,null,{default:F(()=>[c(` PID `+B(e.pid??`—`)+` · CPU `+B(D(jt)(e.cpu_pct))+` · MEM `+B(D(jt)(e.mem_pct)),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})):(P(),C(`div`,Un,`暂无数据(约 10 秒刷新)`))]),T(`section`,Wn,[n[7]||=T(`div`,{class:`text-caption text-medium-emphasis mb-2`},`内存占用率 Top5`,-1),i.value.top_mem.length?(P(),f(we,{key:0,density:`compact`,class:`watch-detail-list py-0`},{default:F(()=>[(P(!0),C(V,null,le(i.value.top_mem,(e,t)=>(P(),f(A,{key:`mem-${e.pid}-${t}`},{default:F(()=>[M(ge,{class:`text-body-2 text-truncate`},{default:F(()=>[c(B(e.name||`—`),1)]),_:2},1024),M(ue,null,{default:F(()=>[c(` PID `+B(e.pid??`—`)+` · MEM `+B(D(jt)(e.mem_pct))+` · CPU `+B(D(jt)(e.cpu_pct)),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})):(P(),C(`div`,Gn,`暂无数据(约 10 秒刷新)`))])])]),_:1},8,[`modelValue`]))}}),[[`__scopeId`,`data-v-45a573bb`]]),qn={key:0,class:`text-caption text-medium-emphasis ml-2`},Jn=S({__name:`WatchSlotPickDialog`,props:_({slotIndex:{},loading:{type:Boolean}},{modelValue:{type:Boolean,required:!0},modelModifiers:{}}),emits:_([`pick`],[`update:modelValue`]),setup(e,{emit:t}){let n=s(e,`modelValue`),r=Ge(),i=e,a=t,l=L(``),u=L(!1),p=L([]),m=L(null),h=z(()=>{let e=l.value.toLowerCase().trim();return e?p.value.filter(t=>t.name.toLowerCase().includes(e)||(t.domain||``).toLowerCase().includes(e)||(t.target_path||``).toLowerCase().includes(e)||String(t.id).includes(e)):p.value});I(n,async e=>{if(!e){l.value=``,m.value=null;return}u.value=!0;try{p.value=(await Je(`/servers/`,{},1,-1)).items}catch{p.value=[],r(`加载服务器列表失败`,`warning`)}finally{u.value=!1}});function g(){m.value!=null&&a(`pick`,m.value)}return(t,r)=>(P(),f(it,{modelValue:n.value,"onUpdate:modelValue":r[3]||=e=>n.value=e,"max-width":`480`,onKeydown:ke(k(g,[`prevent`]),[`enter`])},{default:F(()=>[M(G,{rounded:`lg`},{default:F(()=>[M(U,null,{default:F(()=>[r[4]||=c(` 加入监测 `,-1),i.slotIndex==null?d(``,!0):(P(),C(`span`,qn,` 槽 `+B(i.slotIndex+1),1))]),_:1}),M(W,null,{default:F(()=>[M(st,{modelValue:m.value,"onUpdate:modelValue":r[0]||=e=>m.value=e,search:l.value,"onUpdate:search":r[1]||=e=>l.value=e,items:h.value,loading:u.value,"item-title":`name`,"item-value":`id`,label:`搜索服务器`,placeholder:`名称 / 域名 / 路径 / ID`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-magnify`,autofocus:``,"custom-filter":()=>!0},{item:F(({props:e,item:t})=>[M(A,y(e,{subtitle:t.domain}),{prepend:F(()=>[M(o,{color:t.is_online?`success`:`grey`,size:`8`,class:`mr-2`},{default:F(()=>[...r[5]||=[c(` mdi-circle `,-1)]]),_:1},8,[`color`])]),_:2},1040,[`subtitle`])]),_:1},8,[`modelValue`,`search`,`items`,`loading`])]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:r[2]||=e=>n.value=!1},{default:F(()=>[...r[6]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`primary`,variant:`flat`,disabled:m.value==null,loading:e.loading,onClick:g},{default:F(()=>[...r[7]||=[c(` 加入 `,-1)]]),_:1},8,[`disabled`,`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`onKeydown`]))}}),Yn={class:`watch-slot-row mb-4`},Xn={class:`d-flex align-center mb-3 watch-slot-row__header`},Zn=S({__name:`WatchSlotRow`,setup(e){let t=ye(),n=Ge(),{slots:r,loading:s,refreshPins:l,removeSlot:u,pinServer:d,setSlotMonitoring:p,setSlotTtl:m}=Vt(),h=L(!1),g=L(null),_=L(!1),y=L(null),b=L(!1),x=L(null),S=L(null);oe(()=>{l()});async function ee(e){try{await u(e),n(`已移除监测 · 槽 ${e+1}`,`success`)}catch(e){n(q(e,`移除监测失败`),`error`)}}async function te(e,t){try{await p(e,t),n(t?`已开启实时监测 · 槽 ${e+1}`:`已暂停实时监测 · 槽 ${e+1}`,`success`)}catch(e){n(q(e,`更新监测开关失败`),`error`)}}async function w(e,t){let i=r.value.find(t=>t.slot_index===e);if(!(!i||i.empty||i.ttl_minutes===t))try{await m(e,t),n(`监测时长已设为 ${an(t)} · 槽 ${e+1}`,`success`)}catch(e){n(q(e,`更新监测时长失败`),`error`)}}function ne(e){g.value=e,h.value=!0}function re(e){t.push({name:`WatchMetrics`,query:{server_id:String(e.server_id),session_id:e.session_id?String(e.session_id):void 0}})}function ie(e){y.value=e,_.value=!0}async function ae(e){let t=r.value.find(t=>t.slot_index===e);if(t?.server_id){x.value=e;try{n((await j.post(`/watch/servers/${t.server_id}/install-psutil`,{})).message||`psutil 安装成功`,`success`),await l()}catch(e){n(q(e,`安装 psutil 失败`),`error`)}finally{x.value=null}}}async function E(e){let t=r.value.find(t=>t.slot_index===e);if(t?.server_id){S.value=e;try{await j.post(`/servers/${t.server_id}/install-agent`,{}),n(`Agent 安装已提交 · 槽 ${e+1}`,`success`),await l()}catch(e){n(q(e,`安装 Agent 失败`),`error`)}finally{S.value=null}}}async function se(e){let t=r.value.find(t=>t.slot_index===e);if(t?.server_id){S.value=e;try{n((await j.post(`/servers/${t.server_id}/upgrade-agent`,{})).stdout?.trim()||`Agent 升级成功 · 槽 ${e+1}`,`success`),await l()}catch(e){n(q(e,`升级 Agent 失败`),`error`)}finally{S.value=null}}}async function ce(e){if(y.value!=null){b.value=!0;try{let t=await d(e,{slotIndex:y.value});t.ok?(n(`已加入监测 · 槽 ${y.value+1}`,`success`),_.value=!1):t.full?n(`监测槽已满,请先移除一台`,`warning`):n(t.error||`加入监测失败`,`error`)}finally{b.value=!1}}}return(e,t)=>(P(),C(`div`,Yn,[T(`div`,Xn,[M(o,{icon:`mdi-pulse`,size:`20`,color:`primary`,class:`mr-2`}),t[5]||=T(`span`,{class:`text-subtitle-1 font-weight-medium`},`实时监测`,-1),M(O,{size:`x-small`,variant:`tonal`,class:`ml-2`,label:``},{default:F(()=>[...t[2]||=[c(`最多 4 台`,-1)]]),_:1}),M(O,{size:`x-small`,variant:`outlined`,class:`ml-1`,label:``},{default:F(()=>[...t[3]||=[c(`默认 30 分 · 暂停不占 TTL`,-1)]]),_:1}),M(R),M(v,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-history`,to:{name:`WatchMetrics`}},{default:F(()=>[...t[4]||=[c(` 监测历史 `,-1)]]),_:1}),M(v,{icon:`mdi-refresh`,size:`small`,variant:`text`,loading:D(s),title:`刷新`,onClick:D(l)},null,8,[`loading`,`onClick`])]),M(a,{dense:``},{default:F(()=>[(P(!0),C(V,null,le(D(r),e=>(P(),f(i,{key:e.slot_index,cols:`12`,sm:`6`,lg:`3`},{default:F(()=>[M(jn,{slot:e,"psutil-install-loading":x.value===e.slot_index,"agent-action-loading":S.value===e.slot_index,onRemove:ee,onProcesses:ne,onHistory:re,onPick:ie,onMonitoring:te,onTtl:w,onInstallPsutil:ae,onInstallAgent:E,onUpgradeAgent:se},null,8,[`slot`,`psutil-install-loading`,`agent-action-loading`])]),_:2},1024))),128))]),_:1}),M(Kn,{modelValue:h.value,"onUpdate:modelValue":t[0]||=e=>h.value=e,"slot-data":g.value},null,8,[`modelValue`,`slot-data`]),M(Jn,{modelValue:_.value,"onUpdate:modelValue":t[1]||=e=>_.value=e,"slot-index":y.value,loading:b.value,onPick:ce},null,8,[`modelValue`,`slot-index`,`loading`])]))}}),Qn=S({__name:`ServerFormDialog`,props:{modelValue:{type:Boolean},form:{},isEditing:{type:Boolean},saving:{type:Boolean},lookupsLoading:{type:Boolean},passwordPresets:{},sshKeyPresets:{},categoryOptions:{},platforms:{},nodes:{},editHints:{},filesElevationItems:{}},emits:[`update:modelValue`,`save`],setup(e,{emit:t}){let n=e,o=t,s=z(()=>n.form.preset_id||n.isEditing?[]:[J(`SSH 密码或选择密码预设`)]),l=z(()=>n.form.ssh_key_preset_id||n.isEditing?[]:[J(`私钥或选择 SSH 密钥预设`)]);return(t,n)=>(P(),f(it,{"model-value":e.modelValue,"max-width":`720`,scrollable:``,persistent:``,"onUpdate:modelValue":n[19]||=e=>o(`update:modelValue`,e)},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,{class:`d-flex align-center`},{default:F(()=>[c(B(e.isEditing?`编辑服务器`:`添加服务器`)+` `,1),M(R),M(v,{icon:`mdi-close`,variant:`text`,size:`small`,disabled:e.saving,onClick:n[0]||=e=>o(`update:modelValue`,!1)},null,8,[`disabled`])]),_:1}),M(H),M(W,{class:`pt-4`},{default:F(()=>[e.lookupsLoading?(P(),f(Se,{key:0,indeterminate:``,color:`primary`,class:`mb-3`})):d(``,!0),n[22]||=T(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`基本信息`,-1),M(a,{dense:``},{default:F(()=>[M(i,{cols:`12`,sm:`6`},{default:F(()=>[M(K,{modelValue:e.form.name,"onUpdate:modelValue":n[1]||=t=>e.form.name=t,label:`名称`,variant:`outlined`,density:`compact`,rules:[D(J)(`服务器名称`)]},null,8,[`modelValue`,`rules`])]),_:1}),M(i,{cols:`12`,sm:`6`},{default:F(()=>[M(K,{modelValue:e.form.domain,"onUpdate:modelValue":n[2]||=t=>e.form.domain=t,label:`域名 / IP`,variant:`outlined`,density:`compact`,placeholder:`例:192.168.1.10`,rules:[D(J)(`域名或 IP`)]},null,8,[`modelValue`,`rules`])]),_:1}),M(i,{cols:`6`,sm:`4`},{default:F(()=>[M(K,{modelValue:e.form.port,"onUpdate:modelValue":n[3]||=t=>e.form.port=t,modelModifiers:{number:!0},label:`SSH 端口`,type:`number`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),M(i,{cols:`6`,sm:`8`},{default:F(()=>[M(K,{modelValue:e.form.username,"onUpdate:modelValue":n[4]||=t=>e.form.username=t,label:`SSH 用户名`,variant:`outlined`,density:`compact`,placeholder:`root`,rules:[D(J)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`])]),_:1})]),_:1}),M(H,{class:`my-4`}),n[23]||=T(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`认证方式`,-1),M(be,{modelValue:e.form.auth_method,"onUpdate:modelValue":n[5]||=t=>e.form.auth_method=t,mandatory:``,density:`compact`,variant:`outlined`,class:`mb-3`},{default:F(()=>[M(v,{value:`password`,size:`small`},{default:F(()=>[...n[20]||=[c(`密码`,-1)]]),_:1}),M(v,{value:`key`,size:`small`},{default:F(()=>[...n[21]||=[c(`SSH 密钥`,-1)]]),_:1})]),_:1},8,[`modelValue`]),e.form.auth_method===`password`?(P(),C(V,{key:1},[M(r,{modelValue:e.form.preset_id,"onUpdate:modelValue":n[6]||=t=>e.form.preset_id=t,items:e.passwordPresets,"item-title":`display`,"item-value":`id`,label:`密码预设(可选)`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`,hint:`选择后由服务端解密填入,无需再填密码框`,"persistent-hint":``},null,8,[`modelValue`,`items`]),e.form.preset_id?d(``,!0):(P(),f(K,{key:0,modelValue:e.form.password,"onUpdate:modelValue":n[7]||=t=>e.form.password=t,label:`SSH 密码`,variant:`outlined`,density:`compact`,type:`password`,placeholder:e.isEditing&&e.editHints.password_set?`留空表示不修改`:`安装 Agent 需可 SSH`,rules:s.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)):(P(),C(V,{key:2},[M(r,{modelValue:e.form.ssh_key_preset_id,"onUpdate:modelValue":n[8]||=t=>e.form.ssh_key_preset_id=t,items:e.sshKeyPresets,"item-title":`display`,"item-value":`id`,label:`SSH 密钥预设(可选)`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`,hint:`选择后由服务端解密私钥,无需再粘贴`,"persistent-hint":``},null,8,[`modelValue`,`items`]),M(K,{modelValue:e.form.ssh_key_path,"onUpdate:modelValue":n[9]||=t=>e.form.ssh_key_path=t,label:`密钥路径(可选)`,variant:`outlined`,density:`compact`,placeholder:`~/.ssh/id_rsa`,class:`mb-2`},null,8,[`modelValue`]),e.form.ssh_key_preset_id?d(``,!0):(P(),f(gt,{key:0,modelValue:e.form.ssh_key_private,"onUpdate:modelValue":n[10]||=t=>e.form.ssh_key_private=t,label:`私钥 PEM`,variant:`outlined`,density:`compact`,rows:`4`,"auto-grow":``,placeholder:e.isEditing&&e.editHints.ssh_key_private_set?`留空表示不修改私钥`:`粘贴 -----BEGIN ... PRIVATE KEY-----`,rules:l.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)),M(H,{class:`my-4`}),n[24]||=T(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`部署`,-1),M(K,{modelValue:e.form.target_path,"onUpdate:modelValue":n[11]||=t=>e.form.target_path=t,label:`目标路径`,variant:`outlined`,density:`compact`,placeholder:`/www/wwwroot`,hint:`文件同步与推送的根目录,须为绝对路径`,"persistent-hint":``,class:`mb-2`,rules:[D(J)(`目标路径`)]},null,8,[`modelValue`,`rules`]),M(ct,{modelValue:e.form.category,"onUpdate:modelValue":n[12]||=t=>e.form.category=t,items:e.categoryOptions,label:`分类`,variant:`outlined`,density:`compact`,clearable:``,hint:`可从已有分类选择或输入新分类`,"persistent-hint":``,class:`mb-2`},null,8,[`modelValue`,`items`]),M(gt,{modelValue:e.form.description,"onUpdate:modelValue":n[13]||=t=>e.form.description=t,label:`备注`,variant:`outlined`,density:`compact`,rows:`2`,"auto-grow":``,hint:`业务别名、tonex 对照名等;列表可快速编辑`,"persistent-hint":``},null,8,[`modelValue`]),M(bt,{variant:`accordion`,class:`mt-4`},{default:F(()=>[M(vt,{title:`高级选项`},{default:F(()=>[M(_t,null,{default:F(()=>[M(r,{modelValue:e.form.platform_id,"onUpdate:modelValue":n[14]||=t=>e.form.platform_id=t,items:e.platforms,"item-title":`name`,"item-value":`id`,label:`平台`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`},null,8,[`modelValue`,`items`]),M(r,{modelValue:e.form.node_id,"onUpdate:modelValue":n[15]||=t=>e.form.node_id=t,items:e.nodes,"item-title":`name`,"item-value":`id`,label:`节点`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`},null,8,[`modelValue`,`items`]),M(r,{modelValue:e.form.files_elevation,"onUpdate:modelValue":n[16]||=t=>e.form.files_elevation=t,items:e.filesElevationItems,"item-title":`title`,"item-value":`value`,label:`文件管理提权`,variant:`outlined`,density:`compact`,hint:`非 root 用户需目标机配置免密 sudo`,"persistent-hint":``,class:`mb-4`},null,8,[`modelValue`,`items`])]),_:1})]),_:1})]),_:1})]),_:1}),M(H),M(Xe,{class:`pa-4`},{default:F(()=>[M(R),M(v,{variant:`text`,disabled:e.saving,onClick:n[17]||=e=>o(`update:modelValue`,!1)},{default:F(()=>[...n[25]||=[c(`取消`,-1)]]),_:1},8,[`disabled`]),M(v,{color:`primary`,variant:`flat`,loading:e.saving,onClick:n[18]||=e=>o(`save`)},{default:F(()=>[...n[26]||=[c(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),$n={class:`d-flex align-end flex-wrap ga-3`},er={class:`server-batch-bar__section`},tr={class:`server-batch-bar__section`},nr={class:`d-flex flex-wrap ga-2`},rr={class:`server-batch-bar__section`},ir={class:`d-flex flex-wrap ga-2`},ar={class:`server-batch-bar__section`},or={class:`d-flex flex-wrap ga-2`},sr={class:`server-batch-bar__section`},cr={class:`d-flex flex-wrap ga-2`},lr=Ue(S({__name:`ServerBatchActionBar`,props:{count:{type:Number,required:!0},agentDiagnoseLoading:{type:Boolean,default:!1},btUnconfiguredCount:{type:Number,default:0},btSelectedUnconfiguredCount:{type:Number,default:0},btBatchLoading:{type:Boolean,default:!1}},emits:[`batch-category`,`health-check`,`detect-path`,`agent-diagnose`,`bt-bootstrap-all`,`bt-bootstrap-selected`,`install-agent`,`upgrade-agent`,`uninstall-agent`,`batch-delete`,`clear`],setup(e){return(t,n)=>e.count>0?(P(),f(G,{key:0,class:`server-batch-bar mx-4 mb-2`,variant:`flat`,rounded:`lg`,border:``},{default:F(()=>[M(W,{class:`server-batch-bar__inner py-3`},{default:F(()=>[T(`div`,$n,[T(`div`,er,[n[11]||=T(`span`,{class:`server-batch-bar__label`},`选择`,-1),M(O,{color:`primary`,variant:`flat`,size:`default`,label:``,class:`server-batch-bar__count`,"prepend-icon":`mdi-checkbox-marked-circle-outline`},{default:F(()=>[c(` 已选 `+B(e.count)+` 台 `,1)]),_:1})]),M(H,{vertical:``,class:`server-batch-bar__divider d-none d-sm-flex`}),T(`div`,tr,[n[15]||=T(`span`,{class:`server-batch-bar__label`},`运维`,-1),T(`div`,nr,[M(v,{size:`default`,variant:`flat`,color:`primary`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-heart-pulse`,onClick:n[0]||=e=>t.$emit(`health-check`)},{default:F(()=>[...n[12]||=[c(` 健康检查 `,-1)]]),_:1}),M(v,{size:`default`,variant:`flat`,color:`primary`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-folder-search-outline`,onClick:n[1]||=e=>t.$emit(`detect-path`)},{default:F(()=>[...n[13]||=[c(` 检测路径 `,-1)]]),_:1}),M(v,{size:`default`,variant:`flat`,color:`primary`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-stethoscope`,loading:e.agentDiagnoseLoading,onClick:n[2]||=e=>t.$emit(`agent-diagnose`)},{default:F(()=>[...n[14]||=[c(` 诊断 `,-1)]]),_:1},8,[`loading`])])]),M(H,{vertical:``,class:`server-batch-bar__divider d-none d-md-flex`}),T(`div`,rr,[n[16]||=T(`span`,{class:`server-batch-bar__label`},`宝塔`,-1),T(`div`,ir,[M(v,{size:`default`,variant:`flat`,color:`secondary`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-download-network`,disabled:!e.btUnconfiguredCount,loading:e.btBatchLoading,onClick:n[3]||=e=>t.$emit(`bt-bootstrap-all`)},{default:F(()=>[c(` 全部未配置 (`+B(e.btUnconfiguredCount)+`) `,1)]),_:1},8,[`disabled`,`loading`]),M(v,{size:`default`,variant:`flat`,color:`deep-orange`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-playlist-check`,disabled:!e.btSelectedUnconfiguredCount,loading:e.btBatchLoading,onClick:n[4]||=e=>t.$emit(`bt-bootstrap-selected`)},{default:F(()=>[c(` 选中获取 API (`+B(e.btSelectedUnconfiguredCount)+`) `,1)]),_:1},8,[`disabled`,`loading`])])]),M(H,{vertical:``,class:`server-batch-bar__divider d-none d-md-flex`}),T(`div`,ar,[n[20]||=T(`span`,{class:`server-batch-bar__label`},`Agent`,-1),T(`div`,or,[M(v,{size:`default`,variant:`flat`,color:`info`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-download`,onClick:n[5]||=e=>t.$emit(`install-agent`)},{default:F(()=>[...n[17]||=[c(` 安装 `,-1)]]),_:1}),M(v,{size:`default`,variant:`flat`,color:`warning`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-arrow-up-bold`,onClick:n[6]||=e=>t.$emit(`upgrade-agent`)},{default:F(()=>[...n[18]||=[c(` 升级 `,-1)]]),_:1}),M(v,{size:`default`,variant:`flat`,color:`error`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-package-down`,onClick:n[7]||=e=>t.$emit(`uninstall-agent`)},{default:F(()=>[...n[19]||=[c(` 卸载 `,-1)]]),_:1})])]),M(H,{vertical:``,class:`server-batch-bar__divider d-none d-md-flex`}),T(`div`,sr,[n[23]||=T(`span`,{class:`server-batch-bar__label`},`其他`,-1),T(`div`,cr,[M(v,{size:`default`,variant:`flat`,color:`secondary`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-tag-outline`,onClick:n[8]||=e=>t.$emit(`batch-category`)},{default:F(()=>[...n[21]||=[c(` 修改分类 `,-1)]]),_:1}),M(v,{size:`default`,variant:`flat`,color:`error`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-delete-sweep`,onClick:n[9]||=e=>t.$emit(`batch-delete`)},{default:F(()=>[...n[22]||=[c(` 批量删除 `,-1)]]),_:1})])]),M(R,{class:`d-none d-lg-flex`}),M(v,{size:`default`,variant:`outlined`,class:`server-batch-bar__btn`,"prepend-icon":`mdi-close`,onClick:n[10]||=e=>t.$emit(`clear`)},{default:F(()=>[...n[24]||=[c(` 取消选择 `,-1)]]),_:1})])]),_:1})]),_:1})):d(``,!0)}}),[[`__scopeId`,`data-v-6da8b6c2`]]),ur={class:`server-row-actions d-flex align-center justify-end flex-nowrap ga-1`},dr=Ue(S({__name:`ServerTableRowActions`,props:{btLoginLoading:{type:Boolean}},emits:[`terminal`,`bt-login`,`files`,`edit`],setup(e){return(t,n)=>(P(),C(`div`,ur,[M(v,{size:`small`,variant:`tonal`,color:`primary`,density:`comfortable`,class:`server-row-actions__btn`,"prepend-icon":`mdi-console`,title:`WebSSH 终端`,onClick:n[0]||=k(e=>t.$emit(`terminal`),[`stop`])},{default:F(()=>[...n[4]||=[c(` 终端 `,-1)]]),_:1}),M(v,{size:`small`,variant:`tonal`,color:`deep-orange`,density:`comfortable`,class:`server-row-actions__btn`,"prepend-icon":`mdi-login-variant`,title:`一键登录宝塔面板`,loading:e.btLoginLoading,disabled:e.btLoginLoading,onClick:n[1]||=k(e=>t.$emit(`bt-login`),[`stop`])},{default:F(()=>[...n[5]||=[c(` 一键登录 `,-1)]]),_:1},8,[`loading`,`disabled`]),M(v,{size:`small`,variant:`tonal`,color:`secondary`,density:`comfortable`,class:`server-row-actions__btn`,"prepend-icon":`mdi-folder-outline`,title:`文件管理`,onClick:n[2]||=k(e=>t.$emit(`files`),[`stop`])},{default:F(()=>[...n[6]||=[c(` 文件 `,-1)]]),_:1}),M(v,{size:`small`,variant:`tonal`,density:`comfortable`,class:`server-row-actions__btn`,"prepend-icon":`mdi-pencil-outline`,title:`编辑服务器`,onClick:n[3]||=k(e=>t.$emit(`edit`),[`stop`])},{default:F(()=>[...n[7]||=[c(` 编辑 `,-1)]]),_:1})]))}}),[[`__scopeId`,`data-v-83c03d1a`]]),fr=x({autoDraw:Boolean,autoDrawDuration:[Number,String],autoDrawEasing:{type:String,default:`ease`},color:String,gradient:{type:Array,default:()=>[]},gradientDirection:{type:String,validator:e=>[`top`,`bottom`,`left`,`right`].includes(e),default:`top`},height:{type:[String,Number],default:75},labels:{type:Array,default:()=>[]},labelSize:{type:[Number,String],default:7},lineWidth:{type:[String,Number],default:4},id:String,itemValue:{type:String,default:`value`},modelValue:{type:Array,default:()=>[]},min:[String,Number],max:[String,Number],padding:{type:[String,Number],default:8},showLabels:Boolean,smooth:[Boolean,String,Number],width:{type:[Number,String],default:300}},`Line`),pr=x({autoLineWidth:Boolean,...fr()},`VBarline`),mr=ee()({name:`VBarline`,props:pr(),setup(e,{slots:t}){let n=w(),r=z(()=>e.id||`barline-${n}`),i=z(()=>Number(e.autoDrawDuration)||500),a=z(()=>!!(e.showLabels||e.labels.length>0||t?.label)),o=z(()=>parseFloat(e.lineWidth)||4),s=z(()=>Math.max(e.modelValue.length*o.value,Number(e.width))),c=z(()=>({minX:0,maxX:s.value,minY:0,maxY:parseInt(e.height,10)})),l=z(()=>e.modelValue.map(t=>E(t,e.itemValue,t)));function u(t,n){let{minX:r,maxX:i,minY:a,maxY:o}=n,s=t.length,c=e.max==null?Math.max(...t):Number(e.max),l=e.min==null?Math.min(...t):Number(e.min);l>0&&e.min==null&&(l=0),c<0&&e.max==null&&(c=0);let u=i/(s===1?2:s),d=(o-a)/(c-l||1),f=o-Math.abs(l*d);return t.map((e,t)=>{let n=Math.abs(d*e);return{x:r+t*u,y:f-n+Number(e<0)*n,height:n,value:e}})}let d=z(()=>{let t=[],n=u(l.value,c.value),r=n.length;for(let i=0;t.length<r;i++){let r=n[i],a=e.labels[i];a||=typeof r==`object`?r.value:r,t.push({x:r.x,value:String(a)})}return t}),f=z(()=>u(l.value,c.value)),p=z(()=>f.value.length===1?(c.value.maxX-o.value)/2:(Math.abs(f.value[0].x-f.value[1].x)-o.value)/2),m=z(()=>typeof e.smooth==`boolean`?e.smooth?2:0:Number(e.smooth));re(()=>{let n=e.gradient.slice().length?e.gradient.slice().reverse():[``];return T(`svg`,{display:`block`},[T(`defs`,null,[T(`linearGradient`,{id:r.value,gradientUnits:`userSpaceOnUse`,x1:e.gradientDirection===`left`?`100%`:`0`,y1:e.gradientDirection===`top`?`100%`:`0`,x2:e.gradientDirection===`right`?`100%`:`0`,y2:e.gradientDirection===`bottom`?`100%`:`0`},[n.map((e,t)=>T(`stop`,{offset:t/Math.max(n.length-1,1),"stop-color":e||`currentColor`},null))])]),T(`clipPath`,{id:`${r.value}-clip`},[f.value.map(t=>T(`rect`,{x:t.x+p.value,y:t.y,width:o.value,height:t.height,rx:m.value,ry:m.value},[e.autoDraw&&!me()&&T(V,null,[T(`animate`,{attributeName:`y`,from:t.y+t.height,to:t.y,dur:`${i.value}ms`,fill:`freeze`},null),T(`animate`,{attributeName:`height`,from:`0`,to:t.height,dur:`${i.value}ms`,fill:`freeze`},null)])]))]),a.value&&T(`g`,{key:`labels`,style:{textAnchor:`middle`,dominantBaseline:`mathematical`,fill:`currentColor`}},[d.value.map((n,r)=>T(`text`,{x:n.x+p.value+o.value/2,y:parseInt(e.height,10)-2+(parseInt(e.labelSize,10)||7*.75),"font-size":Number(e.labelSize)||7},[t.label?.({index:r,value:n.value})??n.value]))]),T(`g`,{"clip-path":`url(#${r.value}-clip)`,fill:`url(#${r.value})`},[T(`rect`,{x:0,y:0,width:Math.max(e.modelValue.length*o.value,Number(e.width)),height:e.height},null)])])})}});function hr(e,t,n=!1,r=75){if(e.length===0)return``;let i=e.shift(),a=e[e.length-1];return(n?`M${i.x} ${r-i.x+2} L${i.x} ${i.y}`:`M${i.x} ${i.y}`)+e.map((n,r)=>{let a=e[r+1],o=e[r-1]||i,s=a&&gr(a,n,o);if(!a||s)return`L${n.x} ${n.y}`;let c=Math.min(_r(o,n),_r(a,n)),l=c/2<t?c/2:t,u=vr(o,n,l),d=vr(a,n,l);return`L${u.x} ${u.y}S${n.x} ${n.y} ${d.x} ${d.y}`}).join(``)+(n?`L${a.x} ${r-i.x+2} Z`:``)}function Q(e){return parseInt(e,10)}function gr(e,t,n){return Q(e.x+n.x)===Q(2*t.x)&&Q(e.y+n.y)===Q(2*t.y)}function _r(e,t){return Math.sqrt((t.x-e.x)**2+(t.y-e.y)**2)}function vr(e,t,n){let r={x:e.x-t.x,y:e.y-t.y},i=Math.sqrt(r.x*r.x+r.y*r.y),a={x:r.x/i,y:r.y/i};return{x:t.x+a.x*n,y:t.y+a.y*n}}var yr=x({fill:Boolean,...fr()},`VTrendline`),br=ee()({name:`VTrendline`,props:yr(),setup(e,{slots:t}){let n=w(),r=z(()=>e.id||`trendline-${n}`),i=z(()=>Number(e.autoDrawDuration)||(e.fill?500:2e3)),a=L(0),o=L(null);function s(t,n){let{minX:r,maxX:i,minY:a,maxY:o}=n;t.length===1&&(t=[t[0],t[0]]);let s=t.length,c=e.max==null?Math.max(...t):Number(e.max),l=e.min==null?Math.min(...t):Number(e.min),u=(i-r)/(s-1),d=(o-a)/(c-l||1);return t.map((e,t)=>({x:r+t*u,y:o-(e-l)*d,value:e}))}let c=z(()=>!!(e.showLabels||e.labels.length>0||t?.label)),l=z(()=>parseFloat(e.lineWidth)||4),u=z(()=>Number(e.width)),d=z(()=>{let t=Number(e.padding);return{minX:t,maxX:u.value-t,minY:t,maxY:parseInt(e.height,10)-t}}),f=z(()=>e.modelValue.map(t=>E(t,e.itemValue,t))),p=z(()=>{let t=[],n=s(f.value,d.value),r=n.length;for(let i=0;t.length<r;i++){let r=n[i],a=e.labels[i];a||=typeof r==`object`?r.value:r,t.push({x:r.x,value:String(a)})}return t});I(()=>e.modelValue,async()=>{if(await ne(),!e.autoDraw||!o.value||me())return;let t=o.value,n=t.getTotalLength();e.fill?(t.style.transformOrigin=`bottom center`,t.style.transition=`none`,t.style.transform=`scaleY(0)`,t.getBoundingClientRect(),t.style.transition=`transform ${i.value}ms ${e.autoDrawEasing}`,t.style.transform=`scaleY(1)`):(t.style.strokeDasharray=`${n}`,t.style.strokeDashoffset=`${n}`,t.getBoundingClientRect(),t.style.transition=`stroke-dashoffset ${i.value}ms ${e.autoDrawEasing}`,t.style.strokeDashoffset=`0`),a.value=n},{immediate:!0});function m(t){let n=typeof e.smooth==`boolean`?e.smooth?8:0:Number(e.smooth);return hr(s(f.value,d.value),n,t,parseInt(e.height,10))}re(()=>{let n=e.gradient.slice().length?e.gradient.slice().reverse():[``];return T(`svg`,{display:`block`,"stroke-width":parseFloat(e.lineWidth)??4},[T(`defs`,null,[T(`linearGradient`,{id:r.value,gradientUnits:`userSpaceOnUse`,x1:e.gradientDirection===`left`?`100%`:`0`,y1:e.gradientDirection===`top`?`100%`:`0`,x2:e.gradientDirection===`right`?`100%`:`0`,y2:e.gradientDirection===`bottom`?`100%`:`0`},[n.map((e,t)=>T(`stop`,{offset:t/Math.max(n.length-1,1),"stop-color":e||`currentColor`},null))])]),c.value&&T(`g`,{key:`labels`,style:{textAnchor:`middle`,dominantBaseline:`mathematical`,fill:`currentColor`}},[p.value.map((n,r)=>T(`text`,{x:n.x+l.value/2+l.value/2,y:parseInt(e.height,10)-4+(parseInt(e.labelSize,10)||7*.75),"font-size":Number(e.labelSize)||7},[t.label?.({index:r,value:n.value})??n.value]))]),T(`path`,{ref:o,d:m(e.fill),fill:e.fill?`url(#${r.value})`:`none`,stroke:e.fill?`none`:`url(#${r.value})`},null),e.fill&&T(`path`,{d:m(!1),fill:`none`,stroke:e.color??e.gradient?.[0]},null)])})}}),$=x({type:{type:String,default:`trend`},...pr(),...yr()},`VSparkline`),xr=ee()({name:`VSparkline`,props:$(),setup(e,{slots:t}){let{textColorClasses:n,textColorStyles:r}=he(()=>e.color),i=z(()=>!!(e.showLabels||e.labels.length>0||t?.label)),a=z(()=>{let t=parseInt(e.height,10);return i.value&&(t+=parseInt(e.labelSize,10)*1.5),t});re(()=>{let i=e.type===`trend`?br:mr,o=e.type===`trend`?br.filterProps(e):mr.filterProps(e);return M(i,y({key:e.type,class:n.value,style:r.value,viewBox:`0 0 ${e.width} ${parseInt(a.value,10)}`},o),t)})}}),Sr={class:`server-metric-sparklines`},Cr={class:`d-flex align-center justify-space-between mb-2`},wr={class:`text-caption text-medium-emphasis`},Tr={key:1,class:`text-caption text-error py-1 mb-2`},Er={key:2,class:`text-caption text-medium-emphasis py-1 mb-2`},Dr={class:`d-flex justify-space-between text-caption mb-1`},Or={class:`d-flex justify-space-between text-caption mb-1`},kr={key:0,class:`d-flex flex-wrap ga-1 mt-2`},Ar=S({__name:`ServerMetricSparklines`,props:{points:{},offlineSegments:{},intervalMinutes:{},loading:{type:Boolean},error:{}},emits:[`retry`],setup(e){let t=e,n=z(()=>t.points.length>0),r=z(()=>t.points.filter(e=>e.is_online&&(e.cpu_pct!=null||e.mem_pct!=null))),o=z(()=>r.value.map(e=>He(e.recorded_at))),s=z(()=>r.value.map(e=>e.cpu_pct??0)),l=z(()=>r.value.map(e=>e.mem_pct??0)),u=z(()=>{let e=[...t.points].reverse().find(e=>e.is_online&&e.cpu_pct!=null);return e?.cpu_pct==null?`—`:`${e.cpu_pct}%`}),p=z(()=>{let e=[...t.points].reverse().find(e=>e.is_online&&e.mem_pct!=null);return e?.mem_pct==null?`—`:`${e.mem_pct}%`});function m(e){return`${He(e.from)} – ${He(e.to)}`}return(t,r)=>(P(),C(`div`,Sr,[T(`div`,Cr,[T(`span`,wr,` 24h 趋势(每 `+B(e.intervalMinutes)+` 分钟采样) `,1),e.error?(P(),f(v,{key:0,variant:`text`,size:`x-small`,color:`primary`,onClick:r[0]||=e=>t.$emit(`retry`)},{default:F(()=>[...r[1]||=[c(` 重试 `,-1)]]),_:1})):d(``,!0)]),e.loading?(P(),f(rt,{key:0,type:`image`,height:`120`,class:`rounded mb-2`})):e.error?(P(),C(`div`,Tr,B(e.error),1)):n.value?(P(),C(V,{key:3},[M(a,{dense:``},{default:F(()=>[M(i,{cols:`12`,md:`6`},{default:F(()=>[T(`div`,Dr,[r[2]||=T(`span`,{class:`text-medium-emphasis`},`CPU`,-1),T(`span`,null,B(u.value),1)]),M(xr,{"model-value":s.value,labels:o.value,color:`primary`,height:`48`,smooth:``,interactive:``,"auto-draw":``},null,8,[`model-value`,`labels`])]),_:1}),M(i,{cols:`12`,md:`6`},{default:F(()=>[T(`div`,Or,[r[3]||=T(`span`,{class:`text-medium-emphasis`},`内存`,-1),T(`span`,null,B(p.value),1)]),M(xr,{"model-value":l.value,labels:o.value,color:`secondary`,height:`48`,smooth:``,interactive:``,"auto-draw":``},null,8,[`model-value`,`labels`])]),_:1})]),_:1}),e.offlineSegments.length?(P(),C(`div`,kr,[(P(!0),C(V,null,le(e.offlineSegments,(e,t)=>(P(),f(O,{key:`${e.from}-${e.to}-${t}`,size:`x-small`,variant:`tonal`,color:`grey`,label:``},{default:F(()=>[c(` 离线 `+B(m(e)),1)]),_:2},1024))),128))])):d(``,!0)],64)):(P(),C(`div`,Er,` 暂无历史数据(部署后约 10 分钟起陆续有采样) `))]))}}),jr={class:`server-inline-detail pa-3 rounded-b-lg`},Mr={class:`d-flex flex-wrap align-center ga-2 mb-3`},Nr={class:`text-caption text-medium-emphasis`},Pr={key:1,class:`d-flex flex-wrap ga-4 mb-3 text-body-2`},Fr={key:2,class:`text-caption text-warning mb-2`},Ir={class:`d-flex align-center ga-2 mb-2`},Lr=[`title`],Rr={class:`d-flex align-center ga-2 mb-2`},zr={class:`text-body-2 text-truncate`},Br={key:4,class:`text-caption text-error py-1`},Vr={key:5,class:`text-caption text-medium-emphasis py-1`},Hr=Ue(S({__name:`ServerInlineDetail`,props:{server:{},active:{type:Boolean},agentActionLoading:{type:Boolean}},emits:[`edit-path`,`edit-remark`,`install-agent`,`upgrade-agent`,`diagnose-agent`],setup(e){let t=e,n=L(null),r=L(!1),i=L(``),a=L(!1),o=L(``),s=L(null),l=L(!1),u=L(``),p=L([]),m=L([]),h=L(10),g=0,_=z(()=>n.value??t.server);function y(e){switch(e){case`success`:return`success`;case`failed`:return`error`;case`running`:return`warning`;case`cancelled`:return`grey`;default:return`default`}}function b(e){switch(e){case`success`:return`成功`;case`failed`:return`失败`;case`running`:return`进行中`;case`cancelled`:return`已取消`;default:return e}}function x(e){let t=[];return e.started_at&&t.push(ce(e.started_at)),e.sync_mode&&t.push(e.sync_mode),e.trigger_type&&t.push(e.trigger_type),e.push_permission&&t.push(`权限 ${$e(e.push_permission)}`),t.join(` · `)||`—`}function S(e){return Array.isArray(e)?e:e&&typeof e==`object`&&Array.isArray(e.items)?e.items:[]}async function ee(e){try{let r=await j.get(`/servers/${t.server.id}`);if(e!==g)return;n.value=r,i.value=``}catch(t){if(e!==g)return;n.value=null,i.value=q(t,`加载实时状态失败`)}}async function te(e){a.value=!0,o.value=``,s.value=null;try{let n=await j.get(`/servers/${t.server.id}/logs`,{limit:1});if(e!==g)return;s.value=S(n)[0]??null}catch(t){if(e!==g)return;o.value=q(t,`加载同步日志失败`),s.value=null}finally{e===g&&(a.value=!1)}}async function w(e){l.value=!0,u.value=``,p.value=[],m.value=[];try{let n=await j.get(`/servers/${t.server.id}/metrics`,{hours:24});if(e!==g)return;p.value=n.points??[],m.value=n.offline_segments??[],h.value=n.interval_minutes??10}catch(t){if(e!==g)return;u.value=q(t,`加载历史趋势失败`)}finally{e===g&&(l.value=!1)}}async function ne(){let e=++g;r.value=!0,i.value=``;try{await Promise.all([ee(e),te(e),w(e)])}finally{e===g&&(r.value=!1)}}return I(()=>t.active,e=>{e&&ne()}),I(()=>t.server.id,()=>{n.value=null,p.value=[],m.value=[],s.value=null,t.active&&ne()}),ae(()=>{g+=1}),(e,S)=>(P(),C(`div`,jr,[M(ln,{class:`mb-3`,action:_.value.agent_action,message:_.value.agent_action_message,loading:t.agentActionLoading,onInstall:S[0]||=t=>e.$emit(`install-agent`),onUpgrade:S[1]||=t=>e.$emit(`upgrade-agent`),onDiagnose:S[2]||=t=>e.$emit(`diagnose-agent`)},null,8,[`action`,`message`,`loading`]),T(`div`,Mr,[M(O,{color:D(et)(_.value.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:F(()=>[c(B(D(tt)(_.value.status)),1)]),_:1},8,[`color`]),T(`span`,Nr,` 心跳 `+B(D(nt)(_.value.last_heartbeat)),1),M(R),i.value?(P(),f(v,{key:0,variant:`text`,size:`x-small`,color:`primary`,loading:r.value,onClick:S[3]||=()=>ne()},{default:F(()=>[...S[7]||=[c(` 重试 `,-1)]]),_:1},8,[`loading`])):d(``,!0)]),r.value&&!n.value?(P(),f(rt,{key:0,type:`article`,class:`mb-3`})):(P(),C(`div`,Pr,[T(`div`,null,[S[8]||=T(`span`,{class:`text-caption text-medium-emphasis`},`CPU`,-1),c(` `+B(_.value.system_info?.cpu_usage??`—`)+`% `,1)]),T(`div`,null,[S[9]||=T(`span`,{class:`text-caption text-medium-emphasis`},`内存`,-1),c(` `+B(_.value.system_info?.mem_usage??`—`)+`% `,1)]),T(`div`,null,[S[10]||=T(`span`,{class:`text-caption text-medium-emphasis`},`磁盘`,-1),c(` `+B(_.value.system_info?.disk_usage??`—`)+`% `,1)]),T(`div`,null,[S[11]||=T(`span`,{class:`text-caption text-medium-emphasis`},`Agent`,-1),c(` `+B(_.value.agent_version||`未安装`),1)])])),i.value&&n.value?(P(),C(`div`,Fr,` 实时数据可能滞后:`+B(i.value),1)):d(``,!0),M(Ar,{class:`mb-3`,points:p.value,"offline-segments":m.value,"interval-minutes":h.value,loading:l.value,error:u.value,onRetry:S[4]||=()=>{w(de(g)?++g.value:++g)}},null,8,[`points`,`offline-segments`,`interval-minutes`,`loading`,`error`]),T(`div`,Ir,[S[12]||=T(`span`,{class:`text-caption text-medium-emphasis shrink-0`},`备注`,-1),T(`span`,{class:`text-body-2 text-truncate`,title:_.value.description||`无备注`},B(_.value.description?.trim()||`—`),9,Lr),M(v,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑备注`,onClick:S[5]||=k(t=>e.$emit(`edit-remark`),[`stop`])})]),T(`div`,Rr,[S[13]||=T(`span`,{class:`text-caption text-medium-emphasis shrink-0`},`目标路径`,-1),T(`span`,zr,B(_.value.target_path?.trim()||`未配置(推送页留空时无法推送到此机)`),1),M(v,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑目标路径`,onClick:S[6]||=k(t=>e.$emit(`edit-path`),[`stop`])})]),S[14]||=T(`div`,{class:`text-caption text-medium-emphasis mb-1`},`同步日志`,-1),a.value?(P(),f(rt,{key:3,type:`list-item-two-line`})):o.value?(P(),C(`div`,Br,B(o.value),1)):s.value?(P(),f(A,{key:6,density:`compact`,class:`bg-transparent pa-0`,subtitle:x(s.value),title:`${s.value.source_path} → ${s.value.target_path}`},{append:F(()=>[M(O,{size:`x-small`,color:y(s.value.status),variant:`tonal`,label:``},{default:F(()=>[c(B(b(s.value.status)),1)]),_:1},8,[`color`])]),_:1},8,[`subtitle`,`title`])):(P(),C(`div`,Vr,`暂无同步日志`))]))}}),[[`__scopeId`,`data-v-6699be4b`]]),Ur={class:`server-name-cell__body min-width-0`},Wr=[`title`],Gr={class:`d-flex align-start ga-1 mt-1`},Kr=[`title`],qr={key:1,class:`text-caption text-disabled`},Jr=S({__name:`ServerNameWithRemark`,props:{name:{},remark:{},expanded:{type:Boolean}},emits:[`toggle`,`edit-remark`],setup(e,{emit:t}){let n=t;return(t,r)=>(P(),C(`div`,{class:`server-name-cell d-flex align-start ga-1`,onClick:r[1]||=k(e=>n(`toggle`),[`stop`])},[M(o,{size:`small`,class:`mt-1 shrink-0`},{default:F(()=>[c(B(e.expanded?`mdi-chevron-down`:`mdi-chevron-right`),1)]),_:1}),T(`div`,Ur,[T(`div`,{class:`font-weight-medium text-primary text-truncate`,title:e.name},B(e.name),9,Wr),T(`div`,Gr,[e.remark?(P(),C(`span`,{key:0,class:`server-name-cell__remark text-caption text-medium-emphasis`,title:e.remark},B(e.remark),9,Kr)):(P(),C(`span`,qr,`无备注`)),M(v,{icon:`mdi-pencil-outline`,size:`x-small`,variant:`text`,density:`compact`,class:`shrink-0 mt-n1`,title:`编辑备注`,onClick:r[0]||=k(e=>n(`edit-remark`),[`stop`])})])])]))}}),Yr=S({__name:`ServerRemarkDialog`,props:{modelValue:{type:Boolean},modelValueText:{},serverName:{},saving:{type:Boolean}},emits:[`update:modelValue`,`update:modelValueText`,`save`],setup(e,{emit:t}){let n=t;return(t,r)=>(P(),f(it,{"model-value":e.modelValue,"max-width":`560`,persistent:``,"onUpdate:modelValue":r[3]||=e=>n(`update:modelValue`,e)},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,{class:`text-h6`},{default:F(()=>[...r[4]||=[c(`编辑备注`,-1)]]),_:1}),e.serverName?(P(),f(Ye,{key:0,class:`text-wrap pb-2`},{default:F(()=>[c(B(e.serverName),1)]),_:1})):d(``,!0),M(H),M(W,{class:`pt-4`},{default:F(()=>[M(gt,{"model-value":e.modelValueText,label:`备注`,variant:`outlined`,density:`comfortable`,rows:`4`,"auto-grow":``,"hide-details":``,placeholder:`tonex 对照名、业务别名等`,"onUpdate:modelValue":r[0]||=e=>n(`update:modelValueText`,e)},null,8,[`model-value`])]),_:1}),M(H),M(Xe,{class:`pa-4`},{default:F(()=>[M(R),M(v,{variant:`text`,disabled:e.saving,onClick:r[1]||=e=>n(`update:modelValue`,!1)},{default:F(()=>[...r[5]||=[c(`取消`,-1)]]),_:1},8,[`disabled`]),M(v,{color:`primary`,variant:`flat`,loading:e.saving,onClick:r[2]||=e=>n(`save`)},{default:F(()=>[...r[6]||=[c(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),Xr={class:`server-list-toolbar d-flex align-center flex-wrap ga-2 flex-grow-1`},Zr=Ue(S({__name:`ServerListToolbarActions`,props:{searchDraft:{},searchHistory:{},detectPathDisabled:{type:Boolean},showViewToggle:{type:Boolean,default:!1},viewMode:{},showRefresh:{type:Boolean,default:!1},refreshLoading:{type:Boolean,default:!1}},emits:[`update:searchDraft`,`update:viewMode`,`commit-search`,`search-combobox-update`,`add`,`quick-add`,`batch-add`,`credentials`,`detect-path`,`refresh`],setup(e,{emit:t}){let n=t;function r(e){n(`update:searchDraft`,e??``),n(`search-combobox-update`,e)}return(t,i)=>(P(),C(`div`,Xr,[M(ct,{"model-value":e.searchDraft,items:e.searchHistory,"prepend-inner-icon":`mdi-magnify`,label:`搜索名称/IP(含未设路径)`,density:`compact`,"hide-details":``,rounded:``,clearable:``,"auto-select-first":!1,class:`server-list-toolbar__search`,variant:`outlined`,placeholder:`输入后回车,或从历史选择`,"onUpdate:modelValue":r,onKeydown:i[0]||=ke(k(e=>n(`commit-search`),[`prevent`]),[`enter`])},null,8,[`model-value`,`items`]),M(v,{color:`primary`,variant:`flat`,"prepend-icon":`mdi-plus`,size:`small`,onClick:i[1]||=e=>n(`add`)},{default:F(()=>[...i[8]||=[c(` 添加 `,-1)]]),_:1}),M(v,{variant:`tonal`,"prepend-icon":`mdi-flash`,size:`small`,onClick:i[2]||=e=>n(`quick-add`)},{default:F(()=>[...i[9]||=[c(` 快速添加(IP) `,-1)]]),_:1}),M(v,{variant:`tonal`,"prepend-icon":`mdi-ip-network`,size:`small`,onClick:i[3]||=e=>n(`batch-add`)},{default:F(()=>[...i[10]||=[c(` 批量添加 `,-1)]]),_:1}),M(v,{variant:`tonal`,"prepend-icon":`mdi-key-outline`,size:`small`,onClick:i[4]||=e=>n(`credentials`)},{default:F(()=>[...i[11]||=[c(` 凭据 `,-1)]]),_:1}),M(v,{variant:`tonal`,"prepend-icon":`mdi-folder-search`,size:`small`,disabled:e.detectPathDisabled,title:`请先勾选至少一台服务器`,onClick:i[5]||=e=>n(`detect-path`)},{default:F(()=>[...i[12]||=[c(` 检测路径 `,-1)]]),_:1},8,[`disabled`]),e.showRefresh?(P(),f(v,{key:0,variant:`text`,size:`small`,"prepend-icon":`mdi-refresh`,loading:e.refreshLoading,onClick:i[6]||=e=>n(`refresh`)},{default:F(()=>[...i[13]||=[c(` 刷新 `,-1)]]),_:1},8,[`loading`])):d(``,!0),e.showViewToggle?(P(),f(be,{key:1,"model-value":e.viewMode,mandatory:``,density:`compact`,color:`primary`,variant:`outlined`,divided:``,"onUpdate:modelValue":i[7]||=e=>n(`update:viewMode`,e)},{default:F(()=>[M(v,{value:`table`,size:`small`,"prepend-icon":`mdi-table`},{default:F(()=>[...i[14]||=[c(`列表`,-1)]]),_:1}),M(v,{value:`group`,size:`small`,"prepend-icon":`mdi-folder-multiple`},{default:F(()=>[...i[15]||=[c(`分类`,-1)]]),_:1})]),_:1},8,[`model-value`])):d(``,!0)]))}}),[[`__scopeId`,`data-v-8a7903e0`]]),Qr=[{title:`状态`,key:`status`,width:88,minWidth:88},{title:`名称 / 备注`,key:`name`,minWidth:220},{title:`地址`,key:`domain`,minWidth:200},{title:`分类`,key:`category`,width:108,minWidth:108},{title:`目标路径`,key:`target_path`,minWidth:180},{title:`Agent`,key:`agent_version`,width:100,minWidth:100},{title:`心跳`,key:`last_heartbeat`,width:104,minWidth:104},{title:`操作`,key:`actions`,width:300,minWidth:300,align:`end`,sortable:!1}],$r={class:`d-flex align-center flex-wrap ga-2`},ei={class:`d-flex flex-column align-start py-1 ga-0`},ti={class:`text-medium-emphasis`},ni=[`href`,`title`],ri={key:1,class:`text-medium-emphasis`},ii={key:1,class:`d-flex align-center ga-1 server-path-cell`},ai=[`title`],oi={class:`text-medium-emphasis`},si={class:`text-caption text-medium-emphasis`},ci={class:`text-caption text-medium-emphasis`},li=[`colspan`],ui=Ue(S({__name:`ServerUnsetPathPanel`,props:_({highlight:{type:Boolean},servers:{},loading:{type:Boolean},total:{},page:{},itemsPerPage:{},itemsPerPageOptions:{},sortBy:{},expandedIds:{},selectedItems:{},selectAllLoading:{type:Boolean},editingPathId:{},editingPathValue:{},savingPathId:{},btLoginLoadingId:{},agentDiagnoseLoading:{type:Boolean},btUnconfiguredCount:{},btSelectedUnconfiguredCount:{},btBatchLoading:{type:Boolean},agentActionLoadingId:{},searchHistory:{}},{searchDraft:{required:!0},searchDraftModifiers:{},viewMode:{required:!0},viewModeModifiers:{}}),emits:_(`refresh.commit-search.search-combobox-update.add-server.quick-add.batch-add.open-credentials.update:sort-by.update:page.update:items-per-page.update:selected-items.update:expanded-ids.update:editing-path-value.select-all-filtered.toggle-expand.terminal.bt-login.files.edit.edit-path.edit-remark.save-path.cancel-edit-path.batch-category.health-check.detect-path.agent-diagnose.bt-bootstrap-all.bt-bootstrap-selected.install-agent.upgrade-agent.diagnose-agent.uninstall-agent.batch-delete.clear-selection`.split(`.`),[`update:searchDraft`,`update:viewMode`]),setup(e,{emit:t}){let n=e,r=s(e,`searchDraft`),i=s(e,`viewMode`),a=t,o=z(()=>{let e=[...Qr],t=e.findIndex(e=>e.key===`actions`),n=t>=0?t:e.length;return e.splice(n,0,{title:`添加时间`,key:`created_at`,width:148,minWidth:148}),e}),l=z(()=>en(n.selectedItems).length),u=z({get:()=>n.expandedIds,set:e=>{a(`update:expanded-ids`,e.map(e=>Number(e)).filter(e=>!Number.isNaN(e)))}});function p(e){return n.expandedIds.includes(e)}return(t,n)=>(P(),f(G,{id:`unset-path-panel`,elevation:`0`,rounded:`lg`,class:Oe([`my-5 unset-path-panel`,{"unset-path-panel--highlight":e.highlight}]),border:``},{default:F(()=>[M(U,{class:`server-panel-card-title d-flex align-center flex-wrap ga-2`},{default:F(()=>[n[32]||=T(`span`,{class:`text-h6 font-weight-medium text-no-wrap`},`未设置路径服务器`,-1),e.total>0?(P(),f(O,{key:0,size:`small`,color:`warning`,variant:`tonal`,label:``},{default:F(()=>[c(B(e.total),1)]),_:1})):d(``,!0),M(Zr,{"search-draft":r.value,"onUpdate:searchDraft":n[0]||=e=>r.value=e,"view-mode":i.value,"onUpdate:viewMode":n[1]||=e=>i.value=e,"search-history":e.searchHistory,"detect-path-disabled":l.value===0,"show-view-toggle":``,"show-refresh":``,"refresh-loading":e.loading,onCommitSearch:n[2]||=e=>a(`commit-search`),onSearchComboboxUpdate:n[3]||=e=>a(`search-combobox-update`,e),onAdd:n[4]||=e=>a(`add-server`),onQuickAdd:n[5]||=e=>a(`quick-add`),onBatchAdd:n[6]||=e=>a(`batch-add`),onCredentials:n[7]||=e=>a(`open-credentials`),onDetectPath:n[8]||=e=>a(`detect-path`),onRefresh:n[9]||=e=>a(`refresh`)},null,8,[`search-draft`,`view-mode`,`search-history`,`detect-path-disabled`,`refresh-loading`])]),_:1}),M(W,{class:`pt-0 pb-2`},{default:F(()=>[T(`div`,$r,[M(R),M(v,{size:`small`,variant:`tonal`,disabled:e.total===0,loading:e.selectAllLoading,onClick:n[10]||=e=>t.$emit(`select-all-filtered`)},{default:F(()=>[c(` 全选筛选结果 (`+B(e.total)+`) `,1)]),_:1},8,[`disabled`,`loading`])])]),_:1}),M(lr,{count:l.value,"agent-diagnose-loading":e.agentDiagnoseLoading,"bt-unconfigured-count":e.btUnconfiguredCount,"bt-selected-unconfigured-count":e.btSelectedUnconfiguredCount,"bt-batch-loading":e.btBatchLoading,onBatchCategory:n[11]||=e=>t.$emit(`batch-category`),onHealthCheck:n[12]||=e=>t.$emit(`health-check`),onDetectPath:n[13]||=e=>t.$emit(`detect-path`),onAgentDiagnose:n[14]||=e=>t.$emit(`agent-diagnose`),onBtBootstrapAll:n[15]||=e=>t.$emit(`bt-bootstrap-all`),onBtBootstrapSelected:n[16]||=e=>t.$emit(`bt-bootstrap-selected`),onInstallAgent:n[17]||=e=>t.$emit(`install-agent`),onUpgradeAgent:n[18]||=e=>t.$emit(`upgrade-agent`),onUninstallAgent:n[19]||=e=>t.$emit(`uninstall-agent`),onBatchDelete:n[20]||=e=>t.$emit(`batch-delete`),onClear:n[21]||=e=>t.$emit(`clear-selection`)},null,8,[`count`,`agent-diagnose-loading`,`bt-unconfigured-count`,`bt-selected-unconfigured-count`,`bt-batch-loading`]),M(Qe,{class:`server-data-table`,items:e.servers,headers:o.value,"items-length":e.total,loading:e.loading,page:e.page,"items-per-page":e.itemsPerPage,"items-per-page-options":e.itemsPerPageOptions,hover:``,density:`comfortable`,"item-value":`id`,"show-select":``,"show-expand":``,"model-value":e.selectedItems,"sort-by":e.sortBy,expanded:u.value,"onUpdate:expanded":n[27]||=e=>u.value=e,"onUpdate:modelValue":n[28]||=e=>t.$emit(`update:selected-items`,e),"onUpdate:sortBy":n[29]||=e=>t.$emit(`update:sort-by`,e),"onUpdate:page":n[30]||=e=>t.$emit(`update:page`,e),"onUpdate:itemsPerPage":n[31]||=e=>t.$emit(`update:items-per-page`,e)},{"item.data-table-expand":F(()=>[...n[33]||=[]]),"item.status":F(({item:e})=>[M(O,{color:D(et)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:F(()=>[c(B(D(tt)(e.status)),1)]),_:2},1032,[`color`])]),"item.name":F(({item:e})=>[M(Jr,{name:e.name,remark:e.description,expanded:p(e.id),onToggle:n=>t.$emit(`toggle-expand`,e),onEditRemark:n=>t.$emit(`edit-remark`,e)},null,8,[`name`,`remark`,`expanded`,`onToggle`,`onEditRemark`])]),"item.domain":F(({item:e})=>[T(`div`,ei,[T(`span`,ti,B(e.domain)+`:`+B(e.port),1),D(xt)(e)?(P(),C(`a`,{key:0,href:D(xt)(e),target:`_blank`,rel:`noopener noreferrer`,class:`text-caption text-primary site-link`,title:`打开 ${D(St)(e)}`,onClick:n[22]||=k(()=>{},[`stop`])},B(D(St)(e)),9,ni)):d(``,!0)])]),"item.category":F(({item:e})=>[e.category?(P(),f(O,{key:0,color:`primary`,variant:`tonal`,size:`small`,label:``},{default:F(()=>[c(B(e.category),1)]),_:2},1024)):(P(),C(`span`,ri,`—`))]),"item.target_path":F(({item:r})=>[e.editingPathId===r.id?(P(),C(`div`,{key:0,class:`d-flex align-center ga-1 server-path-cell`,onClick:n[26]||=k(()=>{},[`stop`])},[M(K,{"model-value":e.editingPathValue,density:`compact`,variant:`outlined`,"hide-details":``,placeholder:`/www/wwwroot`,class:`flex-grow-1`,style:{"min-width":`140px`},"onUpdate:modelValue":n[23]||=e=>t.$emit(`update:editing-path-value`,e),onKeyup:[ke(e=>t.$emit(`save-path`,r.id),[`enter`]),n[24]||=ke(e=>t.$emit(`cancel-edit-path`),[`esc`])]},null,8,[`model-value`,`onKeyup`]),M(v,{icon:`mdi-check`,size:`x-small`,variant:`text`,color:`primary`,loading:e.savingPathId===r.id,onClick:e=>t.$emit(`save-path`,r.id)},null,8,[`loading`,`onClick`]),M(v,{icon:`mdi-close`,size:`x-small`,variant:`text`,onClick:n[25]||=e=>t.$emit(`cancel-edit-path`)})])):(P(),C(`div`,ii,[T(`span`,{class:`text-caption text-medium-emphasis server-path-cell__text text-truncate d-inline-block flex-grow-1`,title:r.target_path||`未配置`},B(r.target_path?.trim()||`—`),9,ai),M(v,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑目标路径`,onClick:k(e=>t.$emit(`edit-path`,r),[`stop`])},null,8,[`onClick`])]))]),"item.agent_version":F(({item:e})=>[T(`div`,null,[T(`span`,oi,B(e.agent_version||`—`),1),e.agent_action===`install`?(P(),f(O,{key:0,size:`x-small`,color:`info`,variant:`tonal`,label:``,class:`mt-1`},{default:F(()=>[...n[34]||=[c(` 需安装 `,-1)]]),_:1})):e.agent_action===`upgrade`?(P(),f(O,{key:1,size:`x-small`,color:`warning`,variant:`tonal`,label:``,class:`mt-1`},{default:F(()=>[...n[35]||=[c(` 需升级 `,-1)]]),_:1})):d(``,!0)])]),"item.last_heartbeat":F(({item:e})=>[T(`span`,si,B(D(nt)(e.last_heartbeat)),1)]),"item.created_at":F(({item:e})=>[T(`span`,ci,B(D(ce)(e.created_at)),1)]),"item.actions":F(({item:n})=>[M(dr,{"bt-login-loading":e.btLoginLoadingId===n.id,onTerminal:e=>t.$emit(`terminal`,n),onBtLogin:e=>t.$emit(`bt-login`,n),onFiles:e=>t.$emit(`files`,n),onEdit:e=>t.$emit(`edit`,n)},null,8,[`bt-login-loading`,`onTerminal`,`onBtLogin`,`onFiles`,`onEdit`])]),"expanded-row":F(({columns:n,item:r})=>[T(`tr`,null,[T(`td`,{colspan:n.length,class:`pa-0`},[M(Hr,{server:r,active:p(r.id),"agent-action-loading":e.agentActionLoadingId===r.id,onEditPath:e=>t.$emit(`edit-path`,r),onEditRemark:e=>t.$emit(`edit-remark`,r),onInstallAgent:e=>t.$emit(`install-agent`,r),onUpgradeAgent:e=>t.$emit(`upgrade-agent`,r),onDiagnoseAgent:e=>t.$emit(`diagnose-agent`,r)},null,8,[`server`,`active`,`agent-action-loading`,`onEditPath`,`onEditRemark`,`onInstallAgent`,`onUpgradeAgent`,`onDiagnoseAgent`])],8,li)])]),"no-data":F(()=>[...n[36]||=[T(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无未设置路径的服务器`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`,`items-per-page`,`items-per-page-options`,`model-value`,`sort-by`,`expanded`])]),_:1},8,[`class`]))}}),[[`__scopeId`,`data-v-240dc126`]]),di={class:`d-flex align-center flex-wrap ga-2`},fi=S({__name:`ServerCategoryFilterBar`,props:{categories:{},categoryFilter:{},totalCount:{},categoriesLoading:{type:Boolean},searchActive:{type:Boolean}},emits:[`select`],setup(e){return(t,n)=>(P(),C(`div`,null,[e.searchActive?(P(),f(O,{key:0,size:`small`,variant:`tonal`,color:`info`,label:``,class:`mb-2`},{default:F(()=>[...n[1]||=[c(` 全库搜索中(含未设路径与连接失败;已忽略分类/在线筛选) `,-1)]]),_:1})):d(``,!0),T(`div`,di,[n[2]||=T(`span`,{class:`text-caption text-medium-emphasis mr-1`},`分类筛选`,-1),M(O,{color:e.categoryFilter===``?`primary`:void 0,variant:e.categoryFilter===``?`flat`:`outlined`,size:`small`,label:``,onClick:n[0]||=e=>t.$emit(`select`,``)},{default:F(()=>[c(` 全部 `+B(e.totalCount),1)]),_:1},8,[`color`,`variant`]),(P(!0),C(V,null,le(e.categories,n=>(P(),f(O,{key:n.name,color:e.categoryFilter===n.name?`primary`:void 0,variant:e.categoryFilter===n.name?`flat`:`outlined`,size:`small`,label:``,onClick:e=>t.$emit(`select`,n.name)},{default:F(()=>[c(B(n.label)+` `+B(n.count),1)]),_:2},1032,[`color`,`variant`,`onClick`]))),128)),e.categoriesLoading?(P(),f(te,{key:0,indeterminate:``,size:`16`,width:`2`})):d(``,!0),M(R),se(t.$slots,`trailing`)])]))}}),pi={class:`credentials-manager`},mi={class:`d-flex align-center flex-wrap ga-2 mb-3`},hi={class:`text-caption text-medium-emphasis`},gi=`127.0.0.1`,_i=S({name:`CredentialsManager`,__name:`CredentialsManager`,props:{active:{type:Boolean}},setup(t){let n=t,r=[...qe],i=Ge(),a=L(!1),o=L(`passwords`),s=L(null),l=L(1),u=L(0),d=L(20),p=L([]),m=L(!1),h=L({name:``,username:`root`,password:``}),g=Ke([{title:`预设名称`,key:`name`},{title:`用户名`,key:`username`,width:120},{title:`创建时间`,key:`created_at`,width:180},{title:`操作`,key:`actions`,width:150,align:`end`}]),_=L([]),y=L(!1),b=L({name:``,username:`root`}),x=L(null),S=Ke([{title:`名称`,key:`name`},{title:`用户名`,key:`username`,width:120},{title:`私钥`,key:`private_key_set`,width:120},{title:`操作`,key:`actions`,width:150,align:`end`}]),ee=L([]),te=L(!1),w=L({name:``,host:gi,port:3306,username:``,password:``,database:``}),ne=Ke([{title:`名称`,key:`name`},{title:`主机`,key:`host`},{title:`端口`,key:`port`,width:80},{title:`用户名`,key:`username`},{title:`数据库`,key:`database`},{title:`操作`,key:`actions`,width:150,align:`end`}]),re=L(!1),ie=L(``),ae=L(null);function oe(e){d.value=e,l.value=1,o.value===`db`&&ue()}function E(e){return ce(e)}async function se(e=!1){e||(a.value=!0);try{let e=await j.getList(`/presets/`);p.value=e.items,u.value=e.total}catch(e){p.value=[],i(q(e,`加载密码预设失败`),`error`)}finally{e||(a.value=!1)}}async function le(e=!1){e||(a.value=!0);try{let e=await j.getList(`/ssh-key-presets/`);_.value=e.items,u.value=e.total}catch(e){_.value=[],i(q(e,`加载 SSH 密钥失败`),`error`)}finally{e||(a.value=!1)}}async function ue(e=!1){e||(a.value=!0);try{let e=await Je(`/scripts/credentials`,{},l.value,d.value);ee.value=e.items,u.value=e.total,d.value===-1&&(l.value=1)}catch(e){ee.value=[],i(q(e,`加载数据库凭据失败`),`error`)}finally{e||(a.value=!1)}}function de(e=!1){switch(o.value){case`passwords`:se(e);break;case`sshkeys`:le(e);break;case`db`:ue(e);break}}I(o,()=>{l.value=1,de()}),I(()=>n.active,e=>{e&&de()},{immediate:!0});function fe(e){s.value=e.id,h.value={name:e.name,username:e.username||`root`,password:``},m.value=!0}async function k(){let e=h.value.name.trim(),t=h.value.password;if(!e){i(`请填写预设名称`,`error`);return}if(!s.value&&!t){i(`请填写 SSH 密码`,`error`);return}try{let n=h.value.username.trim()||`root`;if(s.value){let r={name:e,username:n};t&&(r.encrypted_pw=t),await j.put(`/presets/${s.value}`,r)}else await j.post(`/presets/`,{name:e,username:n,encrypted_pw:t});m.value=!1,se(),i(`保存成功`)}catch(e){i(q(e,`保存失败`),`error`)}}function pe(e){return e?Array.isArray(e)?e[0]??null:e:null}function me(e){if(s.value||b.value.name.trim())return;let t=pe(e);if(!t?.name)return;let n=t.name.replace(/\.(pem|key|ppk)$/i,``).trim();n&&(b.value.name=n)}async function he(){let e=pe(x.value);if(!e)return``;let t=(await e.text()).trim();if(!t.includes(`PRIVATE KEY`))throw Error(`不是有效的 PEM 私钥文件`);return t}function ge(){b.value={name:``,username:`root`},x.value=null}function _e(e){s.value=e.id,b.value={name:e.name,username:e.username||`root`},x.value=null,y.value=!0}async function A(){let e=b.value.name.trim(),t=b.value.username.trim()||`root`;if(!e){i(`请填写名称`,`error`);return}let n=``;try{n=await he()}catch(e){i(e instanceof Error?e.message:`读取私钥文件失败`,`error`);return}if(!s.value&&!n){i(`请选择私钥文件`,`error`);return}try{if(s.value){let r={name:e,username:t};n&&(r.private_key=n),await j.put(`/ssh-key-presets/${s.value}`,r)}else await j.post(`/ssh-key-presets/`,{name:e,username:t,private_key:n});y.value=!1,le(),i(`保存成功`)}catch(e){i(q(e,`保存失败`),`error`)}}function ve(e){s.value=e.id,w.value={name:e.name,host:e.host||gi,port:e.port||3306,username:e.username||``,password:``,database:e.database||``},te.value=!0}async function ye(){try{s.value?await j.put(`/scripts/credentials/${s.value}`,w.value):await j.post(`/scripts/credentials`,w.value),te.value=!1,ue(),i(`保存成功`)}catch(e){i(q(e,`保存失败`),`error`)}}function N(){s.value=null,o.value===`passwords`?(h.value={name:``,username:`root`,password:``},m.value=!0):o.value===`sshkeys`?(ge(),y.value=!0):(w.value={name:``,host:gi,port:3306,username:``,password:``,database:``},te.value=!0)}function xe(e,t){ie.value=e,ae.value=t.id,re.value=!0}async function Se(){try{ie.value===`password`?await j.delete(`/presets/${ae.value}`):ie.value===`sshkey`?await j.delete(`/ssh-key-presets/${ae.value}`):await j.delete(`/scripts/credentials/${ae.value}`),re.value=!1,de(),i(`已删除`)}catch(e){i(q(e,`删除失败`),`error`)}}return(t,n)=>(P(),C(`div`,pi,[T(`div`,mi,[M(be,{modelValue:o.value,"onUpdate:modelValue":n[0]||=e=>o.value=e,mandatory:``,density:`compact`,variant:`outlined`},{default:F(()=>[M(v,{size:`small`,value:`passwords`},{default:F(()=>[...n[22]||=[c(`密码预设`,-1)]]),_:1}),M(v,{size:`small`,value:`sshkeys`},{default:F(()=>[...n[23]||=[c(`SSH 密钥`,-1)]]),_:1}),M(v,{size:`small`,value:`db`},{default:F(()=>[...n[24]||=[c(`数据库凭据`,-1)]]),_:1})]),_:1},8,[`modelValue`]),M(R),M(v,{color:`primary`,variant:`flat`,size:`small`,"prepend-icon":`mdi-plus`,onClick:N},{default:F(()=>[...n[25]||=[c(`添加`,-1)]]),_:1})]),o.value===`passwords`?(P(),C(V,{key:0},[n[29]||=T(`p`,{class:`text-body-2 text-medium-emphasis mb-2`},` 保存常用 SSH 账号+密码模板;快速添加服务器时将按顺序轮询所有预设尝试登录。 `,-1),M(e,{items:p.value,headers:D(g),loading:a.value,hover:``,density:`comfortable`,"items-per-page":20,"items-per-page-options":r},{"item.created_at":F(({item:e})=>[T(`span`,hi,B(E(e.created_at)),1)]),"item.actions":F(({item:e})=>[M(v,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>fe(e)},{default:F(()=>[...n[26]||=[c(`编辑`,-1)]]),_:1},8,[`onClick`]),M(v,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>xe(`password`,e)},{default:F(()=>[...n[27]||=[c(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":F(()=>[...n[28]||=[T(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无密码预设`,-1)]]),_:1},8,[`items`,`headers`,`loading`])],64)):o.value===`sshkeys`?(P(),C(V,{key:1},[n[33]||=T(`p`,{class:`text-body-2 text-medium-emphasis mb-2`},` 上传本地 PEM 私钥文件(如 id_rsa、.pem);公钥由系统从私钥自动推导。 `,-1),M(e,{items:_.value,headers:D(S),loading:a.value,hover:``,density:`comfortable`,"items-per-page":20,"items-per-page-options":r},{"item.private_key_set":F(({item:e})=>[M(O,{color:e.private_key_set?`success`:`grey`,size:`small`,variant:`tonal`,label:``},{default:F(()=>[c(B(e.private_key_set?`已设置`:`未设置`),1)]),_:2},1032,[`color`])]),"item.actions":F(({item:e})=>[M(v,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>_e(e)},{default:F(()=>[...n[30]||=[c(`编辑`,-1)]]),_:1},8,[`onClick`]),M(v,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>xe(`sshkey`,e)},{default:F(()=>[...n[31]||=[c(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":F(()=>[...n[32]||=[T(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无 SSH 密钥`,-1)]]),_:1},8,[`items`,`headers`,`loading`])],64)):(P(),f(Qe,{key:2,items:ee.value,headers:D(ne),"items-length":u.value,loading:a.value,page:l.value,"items-per-page":d.value,"items-per-page-options":r,hover:``,density:`comfortable`,"onUpdate:page":n[1]||=e=>{l.value=e,ue()},"onUpdate:itemsPerPage":oe},{"item.actions":F(({item:e})=>[M(v,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>ve(e)},{default:F(()=>[...n[34]||=[c(`编辑`,-1)]]),_:1},8,[`onClick`]),M(v,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>xe(`db`,e)},{default:F(()=>[...n[35]||=[c(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":F(()=>[...n[36]||=[T(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无凭据`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`,`items-per-page`])),M(it,{modelValue:m.value,"onUpdate:modelValue":n[6]||=e=>m.value=e,"max-width":`500`},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[c(B(s.value?`编辑密码预设`:`新建密码预设`),1)]),_:1}),M(W,null,{default:F(()=>[M(K,{modelValue:h.value.name,"onUpdate:modelValue":n[2]||=e=>h.value.name=e,label:`预设名称`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`如:生产环境 root 密码`,rules:[D(J)(`预设名称`)]},null,8,[`modelValue`,`rules`]),M(K,{modelValue:h.value.username,"onUpdate:modelValue":n[3]||=e=>h.value.username=e,label:`SSH 用户名`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`root`,rules:[D(J)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`]),M(K,{modelValue:h.value.password,"onUpdate:modelValue":n[4]||=e=>h.value.password=e,label:`SSH 密码`,variant:`outlined`,density:`compact`,type:`password`,placeholder:s.value?`留空表示不修改`:`必填`,rules:s.value?[]:[D(J)(`SSH 密码`)]},null,8,[`modelValue`,`placeholder`,`rules`])]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:n[5]||=e=>m.value=!1},{default:F(()=>[...n[37]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`primary`,variant:`flat`,onClick:k},{default:F(()=>[...n[38]||=[c(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(it,{modelValue:y.value,"onUpdate:modelValue":n[11]||=e=>y.value=e,"max-width":`500`},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[c(B(s.value?`编辑 SSH 密钥`:`新建 SSH 密钥`),1)]),_:1}),M(W,null,{default:F(()=>[M(K,{modelValue:b.value.name,"onUpdate:modelValue":n[7]||=e=>b.value.name=e,label:`名称`,variant:`outlined`,density:`compact`,class:`mb-2`,rules:[D(J)(`名称`)]},null,8,[`modelValue`,`rules`]),M(K,{modelValue:b.value.username,"onUpdate:modelValue":n[8]||=e=>b.value.username=e,label:`SSH 用户名`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`root`,rules:[D(J)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`]),M(at,{modelValue:x.value,"onUpdate:modelValue":[n[9]||=e=>x.value=e,me],label:`私钥文件`,variant:`outlined`,density:`compact`,class:`mb-2`,"prepend-icon":`mdi-file-key`,"show-size":``,clearable:!0,hint:s.value?`留空表示不更换私钥`:`选择 PEM 私钥文件(id_rsa、.pem、.key 等)`,"persistent-hint":``},null,8,[`modelValue`,`hint`])]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:n[10]||=e=>y.value=!1},{default:F(()=>[...n[39]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`primary`,variant:`flat`,onClick:A},{default:F(()=>[...n[40]||=[c(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(it,{modelValue:te.value,"onUpdate:modelValue":n[19]||=e=>te.value=e,"max-width":`500`},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[c(B(s.value?`编辑数据库凭据`:`新建数据库凭据`),1)]),_:1}),M(W,null,{default:F(()=>[M(K,{modelValue:w.value.name,"onUpdate:modelValue":n[12]||=e=>w.value.name=e,label:`名称`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),M(K,{modelValue:w.value.host,"onUpdate:modelValue":n[13]||=e=>w.value.host=e,label:`数据库主机`,variant:`outlined`,density:`compact`,class:`mb-2`,hint:`脚本 $DB_HOST;子机本机 MySQL 一般为 127.0.0.1`,"persistent-hint":``},null,8,[`modelValue`]),M(K,{modelValue:w.value.port,"onUpdate:modelValue":n[14]||=e=>w.value.port=e,label:`端口`,variant:`outlined`,density:`compact`,type:`number`,class:`mb-2`},null,8,[`modelValue`]),M(K,{modelValue:w.value.username,"onUpdate:modelValue":n[15]||=e=>w.value.username=e,label:`用户名`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),M(K,{modelValue:w.value.password,"onUpdate:modelValue":n[16]||=e=>w.value.password=e,label:`密码`,variant:`outlined`,density:`compact`,type:`password`,class:`mb-2`},null,8,[`modelValue`]),M(K,{modelValue:w.value.database,"onUpdate:modelValue":n[17]||=e=>w.value.database=e,label:`数据库`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:n[18]||=e=>te.value=!1},{default:F(()=>[...n[41]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`primary`,variant:`flat`,onClick:ye},{default:F(()=>[...n[42]||=[c(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(it,{modelValue:re.value,"onUpdate:modelValue":n[21]||=e=>re.value=e,"max-width":`400`},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[...n[43]||=[c(`确认删除`,-1)]]),_:1}),M(W,null,{default:F(()=>[...n[44]||=[c(`确定要删除此凭据吗?`,-1)]]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:n[20]||=e=>re.value=!1},{default:F(()=>[...n[45]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`error`,variant:`flat`,onClick:Se},{default:F(()=>[...n[46]||=[c(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])]))}}),vi=S({__name:`CredentialsDialog`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`],setup(e,{emit:t}){let n=t;return(t,r)=>(P(),f(it,{"model-value":e.modelValue,"max-width":`960`,scrollable:``,"onUpdate:modelValue":r[1]||=e=>n(`update:modelValue`,e)},{default:F(()=>[M(G,{border:``,rounded:`lg`},{default:F(()=>[M(U,{class:`d-flex align-center`},{default:F(()=>[r[2]||=c(` 凭据管理 `,-1),M(R),M(v,{icon:`mdi-close`,variant:`text`,size:`small`,onClick:r[0]||=e=>n(`update:modelValue`,!1)})]),_:1}),M(H),M(W,{class:`pa-4`},{default:F(()=>[e.modelValue?(P(),f(_i,{key:0,active:e.modelValue},null,8,[`active`])):d(``,!0)]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),yi={class:`text-caption agent-diag-log`},bi=Ue(S({__name:`AgentDiagnoseDialog`,props:{modelValue:{type:Boolean},loading:{type:Boolean},result:{},targetName:{}},emits:[`update:modelValue`],setup(e){function t(e){return e===`online`?`success`:e===`offline`?`error`:`default`}function n(e){return e===`online`?`在线`:e===`offline`?`离线`:`未知`}return(r,i)=>(P(),f(it,{"model-value":e.modelValue,"max-width":`640`,scrollable:``,"onUpdate:modelValue":i[1]||=e=>r.$emit(`update:modelValue`,e)},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[c(`Agent 诊断 — `+B(e.targetName),1)]),_:1}),M(W,null,{default:F(()=>[e.loading?(P(),f(Se,{key:0,indeterminate:``,class:`mb-3`})):e.result?(P(),C(V,{key:1},[M(we,{density:`compact`},{default:F(()=>[M(A,{title:`中心侧状态`},{append:F(()=>[M(O,{size:`x-small`,variant:`tonal`,color:t(e.result.central_status),label:``},{default:F(()=>[c(B(n(e.result.central_status)),1)]),_:1},8,[`color`])]),_:1}),e.result.last_heartbeat_redis?(P(),f(A,{key:0,title:`Redis 心跳: ${e.result.last_heartbeat_redis}`},null,8,[`title`])):d(``,!0),e.result.last_heartbeat_db?(P(),f(A,{key:1,title:`MySQL 心跳: ${e.result.last_heartbeat_db}`},null,8,[`title`])):d(``,!0),M(A,{title:`Agent 版本(库): ${e.result.agent_version_db||`—`}`},null,8,[`title`]),e.result.remote?(P(),C(V,{key:2},[M(H,{class:`my-2`}),M(A,{title:`SSH 连接`},{append:F(()=>[M(o,{color:e.result.remote.ssh_ok?`success`:`error`},{default:F(()=>[c(B(e.result.remote.ssh_ok?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1}),e.result.remote.systemctl_active?(P(),f(A,{key:0,title:`systemctl: ${e.result.remote.systemctl_active}`,subtitle:e.result.remote.systemctl_detail||void 0},null,8,[`title`,`subtitle`])):d(``,!0),e.result.remote.central_health_http_code==null?d(``,!0):(P(),f(A,{key:1,title:`/health HTTP: ${e.result.remote.central_health_http_code}`},null,8,[`title`]))],64)):d(``,!0)]),_:1}),(P(!0),C(V,null,le(e.result.errors,(e,t)=>(P(),f(g,{key:t,type:`warning`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:F(()=>[c(B(e),1)]),_:2},1024))),128)),e.result.errors.length===0?(P(),f(g,{key:0,type:`success`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:F(()=>[...i[2]||=[c(` 未发现明显异常 `,-1)]]),_:1})):d(``,!0),e.result.remote?.log_errors?(P(),f(bt,{key:1,class:`mt-3`,variant:`accordion`},{default:F(()=>[M(vt,null,{default:F(()=>[M(yt,null,{default:F(()=>[...i[3]||=[c(`错误日志摘录`,-1)]]),_:1}),M(_t,null,{default:F(()=>[T(`pre`,yi,B(e.result.remote.log_errors),1)]),_:1})]),_:1})]),_:1})):d(``,!0)],64)):d(``,!0)]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:i[0]||=e=>r.$emit(`update:modelValue`,!1)},{default:F(()=>[...i[4]||=[c(`关闭`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),[[`__scopeId`,`data-v-a369f18c`]]);function xi(){return{name:``,domain:``,port:22,username:`root`,auth_method:`password`,preset_id:null,password:``,ssh_key_preset_id:null,ssh_key_path:``,ssh_key_private:``,target_path:`/www/wwwroot`,description:``,category:``,platform_id:null,node_id:null,files_elevation:`auto_sudo`}}function Si(e){return e===`uncategorized`?``:e}function Ci(e){let t=e.auth_method===`key`?`key`:`password`;return{name:e.name,domain:e.domain||``,port:e.port??22,username:e.username||`root`,auth_method:t,preset_id:e.preset_id,password:``,ssh_key_preset_id:e.ssh_key_preset_id,ssh_key_path:e.ssh_key_path||``,ssh_key_private:``,target_path:e.target_path||`/www/wwwroot`,description:e.description||``,category:e.category||``,platform_id:e.platform_id,node_id:e.node_id,files_elevation:e.files_elevation||`auto_sudo`}}function wi(e){let t=Ge(),n=L(!1),r=L(null),i=L(!1),a=L(xi()),o=L({password_set:!1,ssh_key_private_set:!1}),s=L([]),c=L([]),l=L([]),u=L([]),d=L([]),f=L(!1),p=z(()=>r.value!=null),m=[{title:`自动(权限失败时 sudo)`,value:`auto_sudo`},{title:`关闭 sudo`,value:`off`},{title:`始终 sudo(排障)`,value:`always_sudo`}];async function h(){f.value=!0;try{let[e,t,n,r]=await Promise.all([j.get(`/servers/categories`),j.getList(`/presets/`,{per_page:500}),j.getList(`/ssh-key-presets/`,{per_page:500}),j.get(`/assets/nodes`)]),i=new Set;for(let t of e.categories||[]){let e=Si(t.name);e&&i.add(e)}l.value=[...i].sort((e,t)=>e.localeCompare(t,`zh`)),u.value=(e.platforms||[]).map(e=>({id:e.id,name:e.name})),s.value=(t.items||[]).map(e=>({...e,display:`${e.name} (${e.username||`root`})`})),c.value=(n.items||[]).map(e=>({...e,display:`${e.name} (${e.username||`root`})`})),d.value=Array.isArray(r)?r:[]}catch{t(`加载表单选项失败`,`error`)}finally{f.value=!1}}async function g(){r.value=null,a.value=xi(),o.value={password_set:!1,ssh_key_private_set:!1},n.value=!0,await h()}async function _(e){r.value=e.id,a.value=Ci(e),o.value={password_set:!!e.password_set,ssh_key_private_set:!!(e.ssh_key_private_set||e.ssh_key_configured)},n.value=!0,await h()}function v(){n.value=!1,r.value=null,a.value=xi(),o.value={password_set:!1,ssh_key_private_set:!1}}function y(){let e=a.value;if(!e.name.trim())return`请填写服务器名称`;if(!e.domain.trim())return`请填写域名或 IP`;if(!e.username.trim())return`请填写 SSH 用户名`;let t=Number(e.port);if(!Number.isFinite(t)||t<1||t>65535)return`SSH 端口无效`;let n=e.target_path.trim();if(!n)return`请填写目标路径(部署根目录)`;if(!n.startsWith(`/`))return`目标路径须为绝对路径(以 / 开头)`;if(e.auth_method===`password`){if(!p.value&&!e.preset_id&&!e.password.trim())return`请选择密码预设或填写 SSH 密码(安装 Agent 需要可 SSH)`}else if(!p.value&&!e.ssh_key_preset_id&&!e.ssh_key_private.trim())return`请选择 SSH 密钥预设或粘贴私钥`;return null}function x(){let e=a.value,t={name:e.name.trim(),domain:e.domain.trim(),port:Number(e.port),username:e.username.trim()||`root`,auth_method:e.auth_method,target_path:e.target_path.trim(),description:e.description.trim()||null,category:e.category.trim()||void 0,platform_id:e.platform_id??void 0,node_id:e.node_id??void 0,files_elevation:e.files_elevation,agent_port:8601};return e.auth_method===`password`?(e.preset_id!=null&&(t.preset_id=e.preset_id),e.password.trim()&&(t.password=e.password.trim()),p.value||!e.preset_id&&e.password.trim()):(e.ssh_key_preset_id!=null&&(t.ssh_key_preset_id=e.ssh_key_preset_id),e.ssh_key_path.trim()&&(t.ssh_key_path=e.ssh_key_path.trim()),e.ssh_key_private.trim()&&(t.ssh_key_private=e.ssh_key_private.trim())),t}async function S(){let n=y();if(n){t(n,`error`);return}i.value=!0;try{let n=x();if(p.value&&r.value!=null)await j.put(`/servers/${r.value}`,n);else{let e=await j.post(`/servers/`,n);e.onboarding_job_id&&(b(e.onboarding_job_id,e.onboarding_label||`新服务器初始化`,1,`onboard`,`0/1`,`running`),Ee(`新服务器初始化已在后台执行(sudo + 路径探测)`)),e.agent_action===`install`&&Ee(e.agent_action_message||`请展开服务器行并点击「安装 Agent」以采集 CPU/内存等指标`)}v(),e(),t(`保存成功`)}catch(e){t(q(e,`保存失败`),`error`)}finally{i.value=!1}}return{visible:n,editingId:r,isEditing:p,saving:i,form:a,editHints:o,passwordPresets:s,sshKeyPresets:c,categoryOptions:l,platforms:u,nodes:d,lookupsLoading:f,filesElevationItems:m,openAdd:g,openEdit:_,close:v,save:S}}function Ti(e){let t=L([]),n=L(!1),r=L(!1),i=L(!1),a=L(`all`);async function o(){n.value=!0;try{t.value=await qt()}catch{t.value=[]}finally{n.value=!1}}function s(e){return t.value.find(t=>t.id===e)}let c=z(()=>t.value.filter(e=>!e.configured).length);function u(e){return e.filter(e=>{let t=s(e);return!!(t&&!t.configured)})}function d(){return u(e())}let f=z(()=>d().length),p=z(()=>{let t=e();return t.length?t.length-f.value:0}),m=z(()=>a.value===`all`?c.value:f.value);function h(e){if(a.value=e,e===`selected`){if(!f.value){window.$snackbar?.(`所选服务器均已配置 API,无需重复获取`,`info`);return}}else if(!c.value){window.$snackbar?.(`没有未配置的服务器`,`info`);return}i.value=!0}async function g(){r.value=!0;try{let e=a.value===`all`?await Jt([],{allUnconfigured:!0}):await Jt(d());i.value=!1,window.$snackbar?.(`已启动批量任务 #${e.job_id}`,`success`),await l(e.job_id,e.label),await o()}catch(e){window.$snackbar?.(e instanceof Error?e.message:`批量任务启动失败`,`error`)}finally{r.value=!1}}function _(e){let t=s(e);return t?t.configured:void 0}return{btServers:t,btServersLoading:n,batchLoading:r,batchConfirmOpen:i,batchMode:a,unconfiguredCount:c,selectedUnconfiguredCount:f,selectedConfiguredSkipCount:p,batchTargetCount:m,loadBtServers:o,openBatchConfirm:h,confirmBatchBootstrap:g,filterUnconfiguredIds:u,isBtConfigured:_}}var Ei={class:`mb-2`},Di={key:0,class:`text-caption text-medium-emphasis mb-2`},Oi=S({__name:`BtPanelBatchBootstrapDialog`,props:{modelValue:{type:Boolean},mode:{},targetCount:{},selectedTotal:{default:0},configuredSkipCount:{default:0},loading:{type:Boolean,default:!1}},emits:[`update:modelValue`,`confirm`],setup(e){return(t,n)=>(P(),f(it,{"model-value":e.modelValue,"max-width":`520`,"onUpdate:modelValue":n[2]||=e=>t.$emit(`update:modelValue`,e)},{default:F(()=>[M(G,{title:`批量 SSH 获取宝塔 API`},{default:F(()=>[M(W,null,{default:F(()=>[T(`p`,Ei,[n[3]||=c(` 将对 `,-1),T(`strong`,null,B(e.targetCount),1),n[4]||=c(` 台服务器执行 SSH 引导:开启子机 `,-1),n[5]||=T(`code`,null,`api.json`,-1),n[6]||=c(`、写入 Nexus 加密凭据、追加中心 IP 白名单。 `,-1)]),e.mode===`selected`&&e.configuredSkipCount>0?(P(),C(`p`,Di,` 已选 `+B(e.selectedTotal)+` 台,其中 `+B(e.configuredSkipCount)+` 台 API 已配置将自动跳过。 `,1)):d(``,!0),n[7]||=T(`p`,{class:`text-caption text-medium-emphasis mb-0`},` 前提:子机 root SSH 可达、已装宝塔(未装会标记为安装中并每 5 分钟重试)。 连接配置中需已设置「中心调用 IP」。 `,-1)]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:n[0]||=e=>t.$emit(`update:modelValue`,!1)},{default:F(()=>[...n[8]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`primary`,loading:e.loading,onClick:n[1]||=e=>t.$emit(`confirm`)},{default:F(()=>[...n[9]||=[c(`开始`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),ki={key:0,class:`d-flex align-center flex-wrap ga-2 mb-3`},Ai={class:`d-flex align-center flex-wrap ga-2`},ji={class:`d-flex flex-column align-start py-1 ga-0`},Mi={class:`text-medium-emphasis`},Ni=[`href`,`title`],Pi={key:1,class:`text-medium-emphasis`},Fi={key:1,class:`d-flex align-center ga-1 server-path-cell`},Ii=[`title`],Li={class:`text-medium-emphasis`},Ri={class:`text-caption text-medium-emphasis`},zi=[`colspan`],Bi={key:2,class:`px-4 pb-4`},Vi={key:0,class:`text-center py-8`},Hi={key:1,class:`text-center text-medium-emphasis py-6`},Ui={class:`d-flex align-center ga-2 flex-grow-1`},Wi={class:`text-caption text-medium-emphasis`},Gi={class:`font-weight-medium`},Ki={class:`text-medium-emphasis`},qi=[`href`],Ji={class:`text-caption text-medium-emphasis text-truncate`,style:{"max-width":`180px`}},Yi={class:`text-medium-emphasis`},Xi={class:`text-caption text-medium-emphasis`},Zi=[`title`],Qi={class:`text-body-2 mb-2`},$i={class:`text-body-2 text-medium-emphasis mb-3`},ea={key:0,class:`text-caption text-medium-emphasis mt-1`},ta={key:0},na={key:0},ra={key:0,class:`text-caption ml-1`},ia={key:1,class:`text-caption ml-1`},aa=Ue(S({name:`ServersPage`,__name:`ServersPage`,setup(r){async function o(e,t,n){let r={category:`/servers/batch/category`,"health-check":`/servers/check`,"detect-path":`/servers/batch/detect-path`,"install-agent":`/servers/batch/install-agent`,"upgrade-agent":`/servers/batch/upgrade-agent`,"uninstall-agent":`/servers/batch/uninstall-agent`}[e];if(!r)return null;let i=e===`category`?{server_ids:t,...n}:{server_ids:t},a=await j.post(r,i);if(!a?.job_id)throw Error(`服务端未返回任务 ID,请确认已部署支持后台批量任务的新版本`);return b(a.job_id,a.label,a.total,a.op||e,a.progress,a.status),Ee(`${a.label} 已提交`),a}function s(e,t,n){e&&(b(e,t||`新服务器初始化`,n,`onboard`,`0/${n}`,`running`),Ee(`新服务器初始化已在后台执行(sudo + 路径探测)`))}oe(()=>{It(),l=m(e=>{e.taskKind===`server_batch`&&(u(De.serverCategories),Promise.all([Z(!0),ln(!0),bn(),kr(!0)]))})});let l=null;ae(()=>{l?.()});let p=[...qe],h=Ge(),{pinnedMap:_,pinServer:y,slots:x}=Vt(),S=L(null),ee=L(!1),w=L(null);async function re(e){if(w.value!=null){S.value=w.value;try{let t=await y(w.value,e);t.ok?(h(`已替换槽 ${e+1}`,`success`),ee.value=!1,w.value=null):h(t.error||`替换失败`,`error`)}finally{S.value=null}}}let ie=ye(),E=pe(),se=L(!1);function ce(){if(E.query.credentials===`1`){se.value=!0;let e={...E.query};delete e.credentials,ie.replace({path:E.path,query:e})}}I(()=>E.query.credentials,()=>ce(),{immediate:!0});let{servers:ue,loading:fe,page:me,itemsPerPage:he,total:ge,search:_e,categoryFilter:A,isOnlineFilter:N,sortBy:be,loadServers:xe,onPageChange:Se,onItemsPerPageChange:Ce,onCategoryChange:we,onOnlineFilterChange:H,clearOnlineFilter:Oe,loadAllServers:Ae,listQueryParams:je}=Zt({targetPathUnset:!1}),Me=L([{key:`created_at`,order:`desc`}]),{items:Ne,record:Pe,loadHistoryOnly:Fe}=lt(),He=L(``);function Ue(){let e=String(He.value??``).trim();e!==String(_e.value??``).trim()&&(_e.value=e,He.value=e,me.value=1,ot.value=1,Pe(e),Z(),Kn(!0))}function Ke(e){if(He.value=e??``,e==null||e===``){if(!String(_e.value??``).trim())return;_e.value=``,me.value=1,ot.value=1,Pe(``),Z(),Kn(!0);return}let t=String(e).trim();Ne.value.includes(t)&&(_e.value=t,He.value=t,me.value=1,ot.value=1,Pe(t),Z(),Kn(!0))}let Ye=L([]),$e=L(0),at=L(!1),ot=L(1),st=L(10),J=L([]),Ct=L([]);function wt(e){return z({get:()=>e.value,set:t=>{e.value=t.map(e=>Number(e)).filter(e=>!Number.isNaN(e))}})}let Tt=wt(J),Et=L([]),Dt=z(()=>new Set(en(Et.value))),Ot=L(!1),kt=L(`main`);function Y(e){return e===`main`?{items:Q,ids:gr}:{items:Et,ids:Dt}}let{unconfiguredCount:At,batchLoading:jt,batchConfirmOpen:Mt,batchMode:Nt,batchTargetCount:Pt,selectedConfiguredSkipCount:Ft,loadBtServers:It,openBatchConfirm:Lt,confirmBatchBootstrap:Rt,filterUnconfiguredIds:zt,isBtConfigured:Bt}=Ti(()=>en(Y(kt.value).items.value)),{loadingId:Ht,openBtLogin:Ut}=Kt();function Wt(e){Ut(e,{needsBootstrap:Bt(e)!==!0})}let qt=z(()=>zt(en(Q.value)).length),Jt=z(()=>zt(en(Et.value)).length),Yt=z(()=>en(Y(kt.value).items.value).length);function $t(e,t){kt.value=e,It().then(()=>Lt(t))}let nn=z(()=>Y(kt.value).ids.value.size);function rn(){let e=String(_e.value??``).trim();return{search:e||void 0,...e?{}:pt(A.value),...!e&&N.value!==null?{is_online:N.value}:{}}}function an(){let e=String(_e.value??``).trim();return{...rn(),...Xt(Me.value),...e?{}:{target_path_unset:!0}}}function on(){return{...rn(),...Xt(be.value)}}async function sn(){return(await Je(`/servers/`,an(),1,-1)).items}async function cn(){if(!($e.value<=0)){Ot.value=!0;try{let e=await sn();Et.value=e.map(e=>e.id),h(`已选择未设路径筛选结果 ${e.length} 台`)}catch{h(`加载未设路径筛选结果失败`,`error`)}finally{Ot.value=!1}}}async function ln(e=!1){e||(at.value=!0);try{let e=await Je(`/servers/`,an(),ot.value,st.value);Ye.value=e.items,$e.value=e.total}catch{Ye.value=[],$e.value=0,e||h(`加载未设置路径服务器失败`,`error`)}finally{e||(at.value=!1)}}function un(e){J.value=J.value.includes(e.id)?[]:[e.id]}function dn(e){Ct.value=Ct.value.includes(e.id)?[]:[e.id]}function fn(e){J.value=[],Se(e)}function pn(e){J.value=[],Ce(e)}function mn(e){Ct.value=[],Et.value=[],ot.value=e,ln()}function hn(e){Ct.value=[],Et.value=[],st.value=e,ot.value=1,ln()}function gn(e,t){let n=Qt(t);J.value.includes(e)&&n&&(J.value=[]),Ct.value.includes(e)&&!n&&(Ct.value=[])}let{categories:_n,loading:vn,totalCount:yn,loadCategories:bn}=ut(),X=L(`table`),xn=L([]),Sn=L(!1),Cn=L([]);async function Z(e=!1){try{await xe({silent:e}),await ln(e),X.value===`group`&&await wn(e)}catch{e||h(`加载服务器列表失败`,`error`)}}async function wn(e=!1){e||(Sn.value=!0);try{xn.value=(await Je(`/servers/`,on(),1,-1)).items,Cn.value=En.value.map(e=>e.category)}catch{e||(xn.value=[],h(`加载分类视图失败`,`error`))}finally{e||(Sn.value=!1)}}async function Tn(){try{await xe({silent:!0}),await ln(!0),X.value===`group`&&await wn(!0)}catch{}}ht(Tn,3e4);let En=z(()=>dt(xn.value));function Dn(e){we(e),X.value===`group`&&wn()}function On(e,t){let n=new Set(Q.value.map(e=>typeof e==`number`?e:e.id));t?n.add(e):n.delete(e),Q.value=[...n]}let kn=L(!1);async function An(){if(!(ge.value<=0)){kn.value=!0;try{let e=await Ae();Q.value=e.map(e=>e.id),h(`已选择当前筛选结果 ${e.length} 台`)}catch{h(`加载筛选结果失败`,`error`)}finally{kn.value=!1}}}function jn(e){return e.length>0&&e.every(e=>gr.value.has(e.id))}function Mn(e){let t=jn(e),n=new Set(gr.value);for(let r of e)t?n.delete(r.id):n.add(r.id);Q.value=[...n]}I(A,()=>{Q.value=[],Et.value=[],J.value=[],Ct.value=[],ot.value=1,Z()}),I(N,()=>{Q.value=[],Et.value=[],J.value=[],Ct.value=[],ot.value=1,X.value===`group`&&wn(),ln()}),I(be,()=>{Q.value=[],J.value=[],X.value===`group`&&wn()},{deep:!0}),I(Me,()=>{Et.value=[],Ct.value=[],ot.value=1,ln()},{deep:!0}),I(_e,()=>{Q.value=[],Et.value=[],J.value=[],Ct.value=[],ot.value=1}),I(()=>[_e.value,ge.value,$e.value,Ln.value.length,fe.value],([e,t,n,r,i])=>{!String(e??``).trim()||i||t>0||n>0||r<=0||ne(()=>{document.getElementById(`pending-servers-panel`)?.scrollIntoView({behavior:`smooth`,block:`start`})})}),I(X,e=>{e===`group`&&wn()});let Nn=L(!1),Pn=L(!1),Fn=L(null),In=L(null),Ln=L([]),Rn=L(!1),zn=L(null),Bn=L(!1),Vn=L(null),Hn=L(!1),Un=[{title:`名称`,key:`name`},{title:`地址`,key:`address`},{title:`尝试次数`,key:`attempts`,width:100},{title:`最后错误`,key:`last_error`},{title:`最后尝试`,key:`last_attempt_at`,width:160},{title:`操作`,key:`actions`,width:140,align:`end`}];function Wn(){In.value?.open()}async function Gn(e){await Promise.all([Z(),kr()]);let t=e.server?.id;t!=null&&tn(ie,t)}async function Kn(e=!1){e||(Rn.value=!0);try{let e=String(_e.value??``).trim();Ln.value=(await j.get(`/servers/pending`,e?{search:e}:void 0)).items||[]}catch(e){Ln.value=[],h(q(e,`加载失败列表失败`),`error`)}finally{e||(Rn.value=!1)}}async function qn(e){zn.value=e.id;try{let t=await j.post(`/servers/pending/${e.id}/retry`,{});t.success&&t.server?(s(t.onboarding_job_id,t.onboarding_label,1),h(`重试成功:${t.matched_preset} (${t.matched_username})`),Z(),kr(),Kn()):(In.value?.showFailure(t.errors||[],t.message),Kn())}catch(e){h(q(e,`重试失败`),`error`)}finally{zn.value=null}}function Jn(e){Vn.value=e,Bn.value=!0}async function Yn(){if(Vn.value){Hn.value=!0;try{await j.delete(`/servers/pending/${Vn.value.id}`),Bn.value=!1,h(`已从失败列表移除`),Kn()}catch(e){h(q(e,`删除失败`),`error`)}finally{Hn.value=!1}}}let{visible:Xn,form:$n,isEditing:er,saving:tr,lookupsLoading:nr,passwordPresets:rr,sshKeyPresets:ir,categoryOptions:ar,platforms:or,nodes:sr,editHints:cr,filesElevationItems:ur,openAdd:fr,openEdit:pr,close:mr,save:hr}=wi(()=>{Z(),kr(),bn()});I(Xn,(e,t)=>{t&&!e&&mr()});let Q=L([]),gr=z(()=>new Set(en(Q.value))),_r=Qr,vr=L(!0),yr=L(!1),{statItems:br}=ze(),$=L(!1),xr=z(()=>br.value.map((e,t)=>{let n=Re[t],r=!1;return n===`offline`?r=N.value===!1&&!$.value:n===`unset-path-offline`?r=$.value&&N.value===!1:n===`unset-path`&&(r=$.value&&N.value!==!1),{...e,key:n,clickable:n!==`total`&&n!==`online`,active:r}})),Sr=z(()=>N.value===!0?`筛选:在线服务器`:N.value===!1?`筛选:离线服务器`:``),Cr=z(()=>!String(_e.value??``).trim()&&!!A.value&&!fe.value&&ge.value===0&&$e.value>0);function wr(){ne(()=>{document.getElementById(`unset-path-panel`)?.scrollIntoView({behavior:`smooth`,block:`start`})})}function Tr(){let e=E.query.status;e===`offline`?($.value=!1,N.value!==!1&&(N.value=!1,X.value=`table`,Z())):e===`online`&&($.value=!1,N.value!==!0&&(N.value=!0,X.value=`table`,Z())),E.query.unset_path===`1`&&($.value=!0,wr(),E.query.status===`offline`&&N.value!==!1&&(N.value=!1,Z(),ln()))}I(()=>[E.query.status,E.query.unset_path],()=>Tr(),{immediate:!0});function Er(e){if(e===`alerts`){$.value=!1,ie.push({path:`/alerts`});return}if(e===`unset-path-offline`){$.value=!0,H(!1),X.value=`table`,ln();let e={...E.query,unset_path:`1`,status:`offline`};ie.replace({path:E.path,query:e}),wr();return}if(e===`unset-path`){$.value=!$.value;let e={...E.query};$.value?(e.unset_path=`1`,delete e.status,N.value!==null&&(N.value=null,Z()),wr()):delete e.unset_path,ie.replace({path:E.path,query:e});return}if($.value=!1,e===`offline`){let e=N.value===!1?null:!1;H(e),X.value=`table`;let t={...E.query};delete t.unset_path,e===!1?t.status=`offline`:delete t.status,ie.replace({path:E.path,query:t})}}function Dr(){if(Oe(),E.query.status){let e={...E.query};delete e.status,ie.replace({path:E.path,query:e})}}function Or(){if($.value=!1,E.query.unset_path){let e={...E.query};delete e.unset_path,ie.replace({path:E.path,query:e})}}async function kr(e=!1){e||(vr.value=!0);try{Be(br,await Le())}catch{}finally{e||(vr.value=!1)}}async function Ar(){yr.value=!0;try{await Ie(br)}catch{h(`刷新统计数据失败`,`error`)}finally{yr.value=!1}}function jr(e){ie.push({path:`/terminal`,query:{server_id:String(e.id)}})}function Mr(e){ie.push({path:`/files`,query:{server_id:String(e.id)}})}let Nr=L(!1),Pr=L(!1),Fr=L(null),Ir=L(null),Lr=L(null);function Rr(e,t){let{items:n}=Y(e);return n.value.find(e=>typeof e==`object`&&e.id===t)||(e===`main`?ue.value:Ye.value).find(e=>e.id===t)}async function zr(e){kt.value=e;let{items:t}=Y(e),n=en(t.value);if(n.length!==1){h(n.length===0?`请先选择 1 台服务器`:`Agent 诊断每次仅支持单选 1 台`,`warning`);return}let r=Rr(e,n[0]);if(!r){h(`未找到所选服务器`,`error`);return}await Br(r)}async function Br(e){Lr.value=e,Ir.value=null,Nr.value=!0,Pr.value=!0;try{Ir.value=await j.post(`/servers/${e.id}/agent-diagnose`,{})}catch(e){Nr.value=!1,h(q(e,`Agent 诊断失败`),`error`)}finally{Pr.value=!1}}async function Vr(e){Fr.value=e.id;try{await j.post(`/servers/${e.id}/install-agent`,{}),h(`Agent 安装完成:${e.name}`,`success`),await xe()}catch(e){h(q(e,`安装 Agent 失败`),`error`)}finally{Fr.value=null}}async function Ur(e){Fr.value=e.id;try{await o(`upgrade-agent`,[e.id]),h(`已提交 Agent 升级:${e.name}`,`success`)}catch(e){h(q(e,`提交升级失败`),`error`)}finally{Fr.value=null}}function Wr(e){e?Vr(e):_i(`unset`)}function Gr(e){e?Ur(e):yi(`unset`)}function Kr(e){pr(e)}let qr=L(!1),Xr=L(``),$r=L(!1),ei=z(()=>{let e=new Set(mt.map(e=>e.id)),t=_n.value.filter(t=>t.name!==`uncategorized`&&!e.has(t.name)).map(e=>e.label);for(let e of mt)for(let n of e.members)t.includes(n)||t.push(n);if(ar.value.length)for(let e of ar.value)e&&!t.includes(e)&&t.push(e);return t.sort((e,t)=>e.localeCompare(t,`zh`))});function ti(e){kt.value=e;let{ids:t}=Y(e);if(t.value.size===0){h(`请先勾选至少一台服务器`,`error`);return}Xr.value=``,qr.value=!0}async function ni(){let{items:e,ids:t}=Y(kt.value),n=[...t.value];if(n.length!==0){$r.value=!0;try{await o(`category`,n,{category:(Xr.value||``).trim()}),qr.value=!1,e.value=[]}catch(e){h(q(e,`批量修改分类失败`),`error`)}finally{$r.value=!1}}}let ri=L(!1),ii=L(null),ai=L(``),oi=L(null),si=L(null),ci=L(``),li=L(null),di=L(!1),pi=L(``);function mi(e){kt.value=e;let{ids:t}=Y(e);if(!t.value.size){h(`请先选择服务器`,`warning`);return}ri.value=!0}async function hi(){let{items:e,ids:t}=Y(kt.value),n=[...t.value];if(n.length){ri.value=!1;try{await o(`detect-path`,n),e.value=[]}catch(e){h(q(e,`提交检测任务失败`),`error`)}}}async function gi(e){kt.value=e;let{items:t}=Y(e),n=en(t.value);if(!n.length){h(`请先选择服务器`,`warning`);return}try{await o(`health-check`,n)}catch(e){h(q(e,`提交健康检查失败`),`error`)}}async function _i(e){kt.value=e;let{items:t}=Y(e),n=en(t.value);if(!n.length){h(`请先选择服务器`,`warning`);return}try{await o(`install-agent`,n)}catch(e){h(q(e,`提交安装任务失败`),`error`)}}async function yi(e){kt.value=e;let{items:t}=Y(e),n=en(t.value);if(!n.length){h(`请先选择服务器`,`warning`);return}if(confirm(`确定对 ${n.length} 台服务器升级 Agent?`))try{await o(`upgrade-agent`,n)}catch(e){h(q(e,`提交升级任务失败`),`error`)}}async function xi(e){kt.value=e;let{items:t}=Y(e),n=en(t.value);if(!n.length){h(`请先选择服务器`,`warning`);return}if(confirm(`确定对 ${n.length} 台已安装 Agent 的服务器执行卸载?\n将停止服务、删除 /opt/nexus-agent 并清除 Agent 状态。`))try{await o(`uninstall-agent`,n)}catch(e){h(q(e,`提交卸载任务失败`),`error`)}}function Si(e){aa(),ii.value=e.id,ai.value=e.target_path?.trim()||`/www/wwwroot`}function Ci(){ii.value=null,ai.value=``,oi.value=null}async function Ei(e){let t=ai.value.trim();if(!t){h(`目标路径不能为空`,`warning`);return}if(!t.startsWith(`/`)){h(`目标路径须为绝对路径(以 / 开头)`,`warning`);return}oi.value=e;try{await j.put(`/servers/${e}`,{target_path:t}),h(`目标路径已更新`),Ci(),await Promise.all([Z(),ln()]),gn(e,t)}catch(e){h(q(e,`保存失败`),`error`)}finally{oi.value=null}}function Di(e){Ci(),si.value=e.id,ci.value=e.description?.trim()||``,pi.value=e.name,di.value=!0}function aa(){di.value=!1,si.value=null,ci.value=``,pi.value=``,li.value=null}async function oa(){let e=si.value;if(e!=null){li.value=e;try{let t=ci.value.trim()||null;await j.put(`/servers/${e}`,{description:t}),h(`备注已更新`),aa(),await Promise.all([Z(),ln()])}catch(e){h(q(e,`保存失败`),`error`)}finally{li.value=null}}}async function sa(e){kt.value=e;let{items:t,ids:n}=Y(e);if(n.value.size&&confirm(`确定删除选中的 ${n.value.size} 台服务器?`)){for(let e of n.value)try{await j.delete(`/servers/${e}`)}catch{}t.value=[],h(`批量删除完成`),await Promise.all([Z(),ln()]),kr()}}let ca=L(!1),la=L(``),ua=L(22),da=L(8601),fa=L(!1),pa=L(null);function ma(e){let t=e.trim();if(!t)return``;let n=t.indexOf(` `);if(n>=0)return t.slice(n+1).trim();let r=t.lastIndexOf(`,`);if(r>=0){let e=t.slice(r+1).trim(),n=t.slice(0,r).trim();if(e&&n&&(e.includes(`.`)||e.includes(`:`)))return e}return t}function ha(e){let t=new Set,n=[],r=0;for(let i of e.split(`
|
||
`)){let e=ma(i);if(!e)continue;r+=1;let a=e.toLowerCase();t.has(a)||(t.add(a),n.push(e))}return{unique:n.length,raw:r,deduped:Math.max(0,r-n.length)}}let ga=z(()=>ha(la.value));function _a(){la.value=``,ua.value=22,da.value=8601,pa.value=null,ca.value=!0}async function va(){let e=la.value.trim();if(!e){h(`请填写至少一个 IP 或域名`,`error`);return}fa.value=!0,pa.value=null;try{let t=await j.post(`/servers/add-by-ips-batch`,{text:e,port:ua.value||22,agent_port:da.value||8601});pa.value=t,t.created>0&&(s(t.onboarding_job_id,`新服务器初始化`,t.created),Z(),kr()),t.pending>0&&Kn(),h(t.pending>0?`添加完成:${t.created} 台成功,${t.pending} 台进入连接失败列表`:`添加完成:${t.created} 台成功`,t.pending>0?`warning`:`success`)}catch(e){h(q(e,`批量添加失败`),`error`)}finally{fa.value=!1}}async function ya(){if(!Fn.value)return;let e=Fn.value.id;Pn.value=!0;try{await j.delete(`/servers/${e}`),Nn.value=!1,J.value=J.value.filter(t=>t!==e),Ct.value=Ct.value.filter(t=>t!==e),await Promise.all([Z(),ln()]),kr(),h(`已删除`)}catch(e){h(q(e,`删除失败`),`error`)}finally{Pn.value=!1}}async function ba(e=!1){await Fe(),_e.value=``,He.value=``,await Promise.all([kr(e),bn(e),Z(e)]),e||await Kn()}return We(e=>{ba(e),It()}),(r,o)=>(P(),f(t,{fluid:``,class:`pa-4 pa-md-6`},{default:F(()=>[M(Ve,{items:xr.value,loading:vr.value,refreshing:yr.value,onClick:Er,onRefresh:Ar},null,8,[`items`,`loading`,`refreshing`]),M(Zn),Sr.value||$.value?(P(),C(`div`,ki,[Sr.value?(P(),f(O,{key:0,color:`primary`,variant:`tonal`,size:`small`,closable:``,label:``,"onClick:close":Dr},{default:F(()=>[c(B(Sr.value),1)]),_:1})):d(``,!0),$.value?(P(),f(O,{key:1,color:`warning`,variant:`tonal`,size:`small`,closable:``,label:``,"onClick:close":Or},{default:F(()=>[...o[65]||=[c(` 已定位:未设置路径服务器 `,-1)]]),_:1})):d(``,!0),o[66]||=T(`span`,{class:`text-caption text-medium-emphasis`},`点击顶部统计卡可切换筛选或定位`,-1)])):d(``,!0),M(G,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:F(()=>[M(W,{class:`py-3`},{default:F(()=>[M(fi,{categories:D(_n),"category-filter":D(A),"total-count":D(yn),"categories-loading":D(vn),"search-active":!!D(_e).trim(),onSelect:Dn},null,8,[`categories`,`category-filter`,`total-count`,`categories-loading`,`search-active`])]),_:1})]),_:1}),M(G,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:F(()=>[M(U,{class:`server-panel-card-title d-flex align-center flex-wrap ga-2`},{default:F(()=>[o[67]||=T(`span`,{class:`text-h6 font-weight-medium text-no-wrap`},`服务器列表`,-1),M(Zr,{"search-draft":He.value,"onUpdate:searchDraft":o[0]||=e=>He.value=e,"search-history":D(Ne),"detect-path-disabled":gr.value.size===0,"show-view-toggle":``,"view-mode":X.value,"onUpdate:viewMode":o[1]||=e=>X.value=e,onCommitSearch:Ue,onSearchComboboxUpdate:Ke,onAdd:D(fr),onQuickAdd:Wn,onBatchAdd:_a,onCredentials:o[2]||=e=>se.value=!0,onDetectPath:o[3]||=e=>mi(`main`)},null,8,[`search-draft`,`search-history`,`detect-path-disabled`,`view-mode`,`onAdd`])]),_:1}),M(W,{class:`pt-0 pb-2`},{default:F(()=>[Cr.value?(P(),f(g,{key:0,type:`info`,variant:`tonal`,density:`compact`,class:`mb-3`},{default:F(()=>[c(` 该分类「`+B(D(ft)(D(A)))+`」共 `+B($e.value)+` 台未设路径,已在下方区块展示 `,1),M(v,{variant:`text`,size:`small`,class:`ml-1`,onClick:wr},{default:F(()=>[...o[68]||=[c(` 定位 `,-1)]]),_:1})]),_:1})):d(``,!0),T(`div`,Ai,[M(R),M(v,{size:`small`,variant:`tonal`,disabled:D(ge)===0,loading:kn.value,onClick:An},{default:F(()=>[c(` 全选筛选结果 (`+B(D(ge))+`) `,1)]),_:1},8,[`disabled`,`loading`])])]),_:1}),M(lr,{count:gr.value.size,"agent-diagnose-loading":Pr.value,"bt-unconfigured-count":D(At),"bt-selected-unconfigured-count":qt.value,"bt-batch-loading":D(jt),onBatchCategory:o[4]||=e=>ti(`main`),onHealthCheck:o[5]||=e=>gi(`main`),onDetectPath:o[6]||=e=>mi(`main`),onAgentDiagnose:o[7]||=e=>zr(`main`),onBtBootstrapAll:o[8]||=e=>$t(`main`,`all`),onBtBootstrapSelected:o[9]||=e=>$t(`main`,`selected`),onInstallAgent:o[10]||=e=>_i(`main`),onUpgradeAgent:o[11]||=e=>yi(`main`),onUninstallAgent:o[12]||=e=>xi(`main`),onBatchDelete:o[13]||=e=>sa(`main`),onClear:o[14]||=e=>Q.value=[]},null,8,[`count`,`agent-diagnose-loading`,`bt-unconfigured-count`,`bt-selected-unconfigured-count`,`bt-batch-loading`]),X.value===`table`&&D(fe)&&!D(ue).length?(P(),f(rt,{key:0,type:`table-heading, table-row-divider@8`,class:`mb-4`})):d(``,!0),X.value===`table`?ve((P(),f(Qe,{key:1,items:D(ue),headers:D(_r),"items-length":D(ge),loading:D(fe),page:D(me),"items-per-page":D(he),"items-per-page-options":p,hover:``,density:`comfortable`,"item-value":`id`,"show-select":``,modelValue:Q.value,"onUpdate:modelValue":o[18]||=e=>Q.value=e,"sort-by":D(be),"onUpdate:sortBy":o[19]||=e=>de(be)?be.value=e:null,expanded:D(Tt),"onUpdate:expanded":o[20]||=e=>de(Tt)?Tt.value=e:null,"show-expand":``,class:`server-data-table`,"onUpdate:page":fn,"onUpdate:itemsPerPage":pn},{"item.data-table-expand":F(()=>[...o[69]||=[]]),"item.status":F(({item:e})=>[M(O,{color:D(et)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:F(()=>[c(B(D(tt)(e.status)),1)]),_:2},1032,[`color`])]),"item.name":F(({item:e})=>[M(Jr,{name:e.name,remark:e.description,expanded:J.value.includes(e.id),onToggle:t=>un(e),onEditRemark:t=>Di(e)},null,8,[`name`,`remark`,`expanded`,`onToggle`,`onEditRemark`])]),"item.domain":F(({item:e})=>[T(`div`,ji,[T(`span`,Mi,B(e.domain)+`:`+B(e.port),1),D(xt)(e)?(P(),C(`a`,{key:0,href:D(xt)(e),target:`_blank`,rel:`noopener noreferrer`,class:`text-caption text-primary site-link`,title:`打开 ${D(St)(e)}`,onClick:o[15]||=k(()=>{},[`stop`])},B(D(St)(e)),9,Ni)):d(``,!0)])]),"item.category":F(({item:e})=>[e.category?(P(),f(O,{key:0,color:`primary`,variant:`tonal`,size:`small`,label:``},{default:F(()=>[c(B(e.category),1)]),_:2},1024)):(P(),C(`span`,Pi,`—`))]),"item.target_path":F(({item:e})=>[ii.value===e.id?(P(),C(`div`,{key:0,class:`d-flex align-center ga-1 server-path-cell`,onClick:o[17]||=k(()=>{},[`stop`])},[M(K,{modelValue:ai.value,"onUpdate:modelValue":o[16]||=e=>ai.value=e,density:`compact`,variant:`outlined`,"hide-details":``,placeholder:`/www/wwwroot`,class:`flex-grow-1`,style:{"min-width":`140px`},onKeyup:[ke(t=>Ei(e.id),[`enter`]),ke(Ci,[`esc`])]},null,8,[`modelValue`,`onKeyup`]),M(v,{icon:`mdi-check`,size:`x-small`,variant:`text`,color:`primary`,loading:oi.value===e.id,onClick:t=>Ei(e.id)},null,8,[`loading`,`onClick`]),M(v,{icon:`mdi-close`,size:`x-small`,variant:`text`,onClick:Ci})])):(P(),C(`div`,Fi,[T(`span`,{class:`text-caption text-medium-emphasis server-path-cell__text text-truncate d-inline-block flex-grow-1`,title:e.target_path||`未配置`},B(e.target_path?.trim()||`—`),9,Ii),M(v,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑目标路径`,onClick:k(t=>Si(e),[`stop`])},null,8,[`onClick`])]))]),"item.agent_version":F(({item:e})=>[T(`div`,null,[T(`span`,Li,B(e.agent_version||`—`),1),e.agent_action===`install`?(P(),f(O,{key:0,size:`x-small`,color:`info`,variant:`tonal`,label:``,class:`mt-1`},{default:F(()=>[...o[70]||=[c(` 需安装 `,-1)]]),_:1})):e.agent_action===`upgrade`?(P(),f(O,{key:1,size:`x-small`,color:`warning`,variant:`tonal`,label:``,class:`mt-1`},{default:F(()=>[...o[71]||=[c(` 需升级 `,-1)]]),_:1})):d(``,!0)])]),"item.last_heartbeat":F(({item:e})=>[T(`span`,Ri,B(D(nt)(e.last_heartbeat)),1)]),"item.actions":F(({item:e})=>[M(dr,{"bt-login-loading":D(Ht)===e.id,onTerminal:t=>jr(e),onBtLogin:t=>Wt(e.id),onFiles:t=>Mr(e),onEdit:t=>Kr(e)},null,8,[`bt-login-loading`,`onTerminal`,`onBtLogin`,`onFiles`,`onEdit`])]),"expanded-row":F(({columns:e,item:t})=>[T(`tr`,null,[T(`td`,{colspan:e.length,class:`pa-0`},[M(Hr,{server:t,active:J.value.includes(t.id),"agent-action-loading":Fr.value===t.id,onEditPath:e=>Si(t),onEditRemark:e=>Di(t),onInstallAgent:e=>Vr(t),onUpgradeAgent:e=>Ur(t),onDiagnoseAgent:e=>Br(t)},null,8,[`server`,`active`,`agent-action-loading`,`onEditPath`,`onEditRemark`,`onInstallAgent`,`onUpgradeAgent`,`onDiagnoseAgent`])],8,zi)])]),"no-data":F(()=>[...o[72]||=[T(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无服务器数据`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`,`items-per-page`,`modelValue`,`sort-by`,`expanded`])),[[Te,!(D(fe)&&!D(ue).length)]]):(P(),C(`div`,Bi,[Sn.value?(P(),C(`div`,Vi,[M(te,{indeterminate:``,size:`32`}),o[73]||=T(`div`,{class:`text-caption text-medium-emphasis mt-2`},`按分类加载中…`,-1)])):En.value.length===0?(P(),C(`div`,Hi,` 暂无服务器数据 `)):(P(),f(bt,{key:2,modelValue:Cn.value,"onUpdate:modelValue":o[24]||=e=>Cn.value=e,multiple:``,variant:`accordion`,class:`servers-category-panels`},{default:F(()=>[(P(!0),C(V,null,le(En.value,e=>(P(),f(vt,{key:e.category,value:e.category},{default:F(()=>[M(yt,null,{default:F(()=>[T(`div`,Ui,[M(O,{color:`primary`,variant:`tonal`,size:`small`,label:``},{default:F(()=>[c(B(e.label),1)]),_:2},1024),T(`span`,Wi,B(e.servers.length)+` 台`,1),M(R),M(v,{size:`x-small`,variant:`text`,onClick:k(t=>Mn(e.servers),[`stop`])},{default:F(()=>[c(B(jn(e.servers)?`取消本组`:`全选本组`),1)]),_:2},1032,[`onClick`])])]),_:2},1024),M(_t,null,{default:F(()=>[M(Ze,{density:`compact`,hover:``},{default:F(()=>[o[75]||=T(`thead`,null,[T(`tr`,null,[T(`th`,{style:{width:`40px`}}),T(`th`,null,`状态`),T(`th`,null,`名称`),T(`th`,null,`地址`),T(`th`,null,`目标路径`),T(`th`,{class:`text-end`},`操作`)])],-1),T(`tbody`,null,[(P(!0),C(V,null,le(e.servers,e=>(P(),C(`tr`,{key:e.id},[T(`td`,{onClick:o[21]||=k(()=>{},[`stop`])},[M(n,{"model-value":gr.value.has(e.id),density:`compact`,"hide-details":``,"onUpdate:modelValue":t=>On(e.id,t)},null,8,[`model-value`,`onUpdate:modelValue`])]),T(`td`,null,[M(O,{color:D(et)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:F(()=>[c(B(D(tt)(e.status)),1)]),_:2},1032,[`color`])]),T(`td`,Gi,B(e.name),1),T(`td`,Ki,[T(`div`,null,B(e.domain)+`:`+B(e.port),1),D(xt)(e)?(P(),C(`a`,{key:0,href:D(xt)(e),target:`_blank`,rel:`noopener noreferrer`,class:`text-caption text-primary site-link`,onClick:o[22]||=k(()=>{},[`stop`])},B(D(St)(e)),9,qi)):d(``,!0)]),T(`td`,Ji,B(e.target_path?.trim()||`—`),1),T(`td`,{class:`text-end`,onClick:o[23]||=k(()=>{},[`stop`])},[M(v,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>Kr(e)},{default:F(()=>[...o[74]||=[c(`编辑`,-1)]]),_:1},8,[`onClick`])])]))),128))])]),_:2},1024)]),_:2},1024)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`]))]))]),_:1}),M(ui,{"search-draft":He.value,"onUpdate:searchDraft":o[25]||=e=>He.value=e,"view-mode":X.value,"onUpdate:viewMode":o[26]||=e=>X.value=e,"search-history":D(Ne),highlight:$.value,servers:Ye.value,loading:at.value,total:$e.value,page:ot.value,"items-per-page":st.value,"items-per-page-options":p,"expanded-ids":Ct.value,"selected-items":Et.value,"onUpdate:selectedItems":o[27]||=e=>Et.value=e,"sort-by":Me.value,"onUpdate:sortBy":o[28]||=e=>Me.value=e,"select-all-loading":Ot.value,"editing-path-id":ii.value,"editing-path-value":ai.value,"saving-path-id":oi.value,"bt-login-loading-id":D(Ht),"agent-diagnose-loading":Pr.value,"bt-unconfigured-count":D(At),"bt-selected-unconfigured-count":Jt.value,"bt-batch-loading":D(jt),"agent-action-loading-id":Fr.value,onRefresh:o[29]||=e=>ln(),"onUpdate:page":mn,"onUpdate:itemsPerPage":hn,"onUpdate:expandedIds":o[30]||=e=>Ct.value=e,"onUpdate:editingPathValue":o[31]||=e=>ai.value=e,onEditRemark:Di,onSelectAllFiltered:cn,onToggleExpand:dn,onTerminal:jr,onBtLogin:o[32]||=e=>Wt(e.id),onFiles:Mr,onEdit:Kr,onEditPath:Si,onSavePath:Ei,onCancelEditPath:Ci,onInstallAgent:Wr,onUpgradeAgent:Gr,onDiagnoseAgent:Br,onBatchCategory:o[33]||=e=>ti(`unset`),onHealthCheck:o[34]||=e=>gi(`unset`),onDetectPath:o[35]||=e=>mi(`unset`),onAgentDiagnose:o[36]||=e=>zr(`unset`),onBtBootstrapAll:o[37]||=e=>$t(`unset`,`all`),onBtBootstrapSelected:o[38]||=e=>$t(`unset`,`selected`),onUninstallAgent:o[39]||=e=>xi(`unset`),onBatchDelete:o[40]||=e=>sa(`unset`),onClearSelection:o[41]||=e=>Et.value=[],onCommitSearch:Ue,onSearchComboboxUpdate:Ke,onAddServer:D(fr),onQuickAdd:Wn,onBatchAdd:_a,onOpenCredentials:o[42]||=e=>se.value=!0},null,8,[`search-draft`,`view-mode`,`search-history`,`highlight`,`servers`,`loading`,`total`,`page`,`items-per-page`,`expanded-ids`,`selected-items`,`sort-by`,`select-all-loading`,`editing-path-id`,`editing-path-value`,`saving-path-id`,`bt-login-loading-id`,`agent-diagnose-loading`,`bt-unconfigured-count`,`bt-selected-unconfigured-count`,`bt-batch-loading`,`agent-action-loading-id`,`onAddServer`]),M(G,{id:`pending-servers-panel`,elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:F(()=>[M(U,{class:`d-flex align-center`},{default:F(()=>[o[77]||=c(` 连接失败列表 `,-1),Ln.value.length?(P(),f(O,{key:0,size:`small`,class:`ml-2`,color:`error`,variant:`tonal`,label:``},{default:F(()=>[c(B(Ln.value.length),1)]),_:1})):d(``,!0),M(R),M(v,{variant:`text`,size:`small`,"prepend-icon":`mdi-refresh`,loading:Rn.value,onClick:Kn},{default:F(()=>[...o[76]||=[c(` 刷新 `,-1)]]),_:1},8,[`loading`])]),_:1}),M(e,{items:Ln.value,headers:Un,loading:Rn.value,hover:``,density:`comfortable`,"items-per-page":10},{"item.address":F(({item:e})=>[T(`span`,Yi,B(e.domain)+`:`+B(e.port),1)]),"item.last_attempt_at":F(({item:e})=>[T(`span`,Xi,B(D(nt)(e.last_attempt_at)),1)]),"item.last_error":F(({item:e})=>[T(`span`,{class:`text-caption text-error text-truncate d-inline-block`,style:{"max-width":`320px`},title:e.last_error},B(e.last_error||`—`),9,Zi)]),"item.actions":F(({item:e})=>[M(v,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,loading:zn.value===e.id,onClick:t=>qn(e)},{default:F(()=>[...o[78]||=[c(` 重试 `,-1)]]),_:1},8,[`loading`,`onClick`]),M(v,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>Jn(e)},{default:F(()=>[...o[79]||=[c(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":F(()=>[...o[80]||=[T(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无连接失败记录`,-1)]]),_:1},8,[`items`,`loading`])]),_:1}),M(Qn,{modelValue:D(Xn),"onUpdate:modelValue":o[43]||=e=>de(Xn)?Xn.value=e:null,form:D($n),"is-editing":D(er),saving:D(tr),"lookups-loading":D(nr),"password-presets":D(rr),"ssh-key-presets":D(ir),"category-options":D(ar),platforms:D(or),nodes:D(sr),"edit-hints":D(cr),"files-elevation-items":D(ur),onSave:D(hr)},null,8,[`modelValue`,`form`,`is-editing`,`saving`,`lookups-loading`,`password-presets`,`ssh-key-presets`,`category-options`,`platforms`,`nodes`,`edit-hints`,`files-elevation-items`,`onSave`]),M(Yr,{modelValue:di.value,"onUpdate:modelValue":o[44]||=e=>di.value=e,"model-value-text":ci.value,"onUpdate:modelValueText":o[45]||=e=>ci.value=e,"server-name":pi.value,saving:li.value!=null,onSave:oa},null,8,[`modelValue`,`model-value-text`,`server-name`,`saving`]),M(it,{modelValue:Nn.value,"onUpdate:modelValue":o[47]||=e=>Nn.value=e,"max-width":`400`},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[...o[81]||=[c(`确认删除`,-1)]]),_:1}),M(W,null,{default:F(()=>[o[82]||=c(`确定要删除服务器 `,-1),T(`strong`,null,B(Fn.value?.name),1),o[83]||=c(` 吗?`,-1)]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:o[46]||=e=>Nn.value=!1},{default:F(()=>[...o[84]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`error`,variant:`flat`,onClick:ya,loading:Pn.value},{default:F(()=>[...o[85]||=[c(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(Gt,{ref_key:`quickAddDialogsRef`,ref:In,"on-success":Gn,"on-pending-failure":Kn},null,512),M(it,{modelValue:Bn.value,"onUpdate:modelValue":o[49]||=e=>Bn.value=e,"max-width":`400`},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[...o[86]||=[c(`确认删除`,-1)]]),_:1}),M(W,null,{default:F(()=>[o[87]||=c(`从失败列表移除 `,-1),T(`strong`,null,B(Vn.value?.domain),1),o[88]||=c(`?`,-1)]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:o[48]||=e=>Bn.value=!1},{default:F(()=>[...o[89]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`error`,variant:`flat`,loading:Hn.value,onClick:Yn},{default:F(()=>[...o[90]||=[c(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(it,{modelValue:ri.value,"onUpdate:modelValue":o[51]||=e=>ri.value=e,"max-width":`480`},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[...o[91]||=[c(`自动检测目标路径`,-1)]]),_:1}),M(W,null,{default:F(()=>[T(`p`,Qi,[o[92]||=c(` 将对选中的 `,-1),T(`strong`,null,B(nn.value),1),o[93]||=c(` 台服务器执行 SSH 检测。 `,-1)]),o[94]||=T(`p`,{class:`text-body-2 text-medium-emphasis mb-0`},[c(` 在 `),T(`code`,null,`/www/wwwroot`),c(` 下搜索 `),T(`code`,null,`crmeb`),c(` 目录,将其路径写入 `),T(`strong`,null,`target_path`),c(`。 `)],-1)]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:o[50]||=e=>ri.value=!1},{default:F(()=>[...o[95]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`primary`,variant:`flat`,onClick:hi},{default:F(()=>[...o[96]||=[c(`开始检测`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(it,{modelValue:qr.value,"onUpdate:modelValue":o[54]||=e=>qr.value=e,"max-width":`420`},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[...o[97]||=[c(`批量修改分类`,-1)]]),_:1}),M(W,null,{default:F(()=>[T(`div`,$i,` 已选择 `+B(nn.value)+` 台服务器,将统一设置为以下分类(留空表示清除分类)。 `,1),M(ct,{modelValue:Xr.value,"onUpdate:modelValue":o[52]||=e=>Xr.value=e,items:ei.value,label:`分类`,variant:`outlined`,density:`compact`,clearable:``,"hide-details":``,placeholder:`输入或选择分类`},null,8,[`modelValue`,`items`])]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:o[53]||=e=>qr.value=!1},{default:F(()=>[...o[98]||=[c(`取消`,-1)]]),_:1}),M(v,{color:`primary`,variant:`flat`,loading:$r.value,onClick:ni},{default:F(()=>[...o[99]||=[c(` 确认 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(it,{modelValue:ca.value,"onUpdate:modelValue":o[59]||=e=>ca.value=e,"max-width":`560`},{default:F(()=>[M(G,{border:``},{default:F(()=>[M(U,null,{default:F(()=>[...o[100]||=[c(`批量添加服务器`,-1)]]),_:1}),M(W,null,{default:F(()=>[o[101]||=T(`div`,{class:`text-body-2 text-medium-emphasis mb-3`},` 每行一个 IP 或域名;也可使用「名称 + Tab + IP」附带显示名称。空白行自动忽略,重复地址自动去重(不区分大小写)。SSH 凭据从「凭据」预设轮询匹配;连接失败将进入下方「连接失败列表」。 `,-1),M(gt,{modelValue:la.value,"onUpdate:modelValue":o[55]||=e=>la.value=e,label:`IP / 域名列表(可选:名称 Tab IP)`,variant:`outlined`,density:`compact`,rows:`10`,"auto-grow":``,placeholder:`武汉示例公司 192.168.1.10
|
||
192.168.1.11
|
||
10.0.0.5`},null,8,[`modelValue`]),ga.value.unique>0?(P(),C(`div`,ea,[c(` 将添加 `+B(ga.value.unique)+` 台 `,1),ga.value.deduped>0?(P(),C(`span`,ta,`(已去重 `+B(ga.value.deduped)+` 个重复)`,1)):d(``,!0)])):d(``,!0),M(a,{dense:``,class:`mt-1`},{default:F(()=>[M(i,{cols:`6`},{default:F(()=>[M(K,{modelValue:ua.value,"onUpdate:modelValue":o[56]||=e=>ua.value=e,modelModifiers:{number:!0},label:`SSH 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1}),M(i,{cols:`6`},{default:F(()=>[M(K,{modelValue:da.value,"onUpdate:modelValue":o[57]||=e=>da.value=e,modelModifiers:{number:!0},label:`Agent 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1})]),_:1}),pa.value?(P(),f(g,{key:1,type:pa.value.pending>0?`warning`:`success`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:F(()=>[c(` 共 `+B(pa.value.total)+` 台:成功 `+B(pa.value.created)+`,待连接 `+B(pa.value.pending)+`,跳过 `+B(pa.value.skipped)+` `,1),(pa.value.duplicates_removed??0)>0?(P(),C(`span`,na,` (输入 `+B(pa.value.input_lines)+` 行,去重 `+B(pa.value.duplicates_removed)+` 个) `,1)):d(``,!0)]),_:1},8,[`type`])):d(``,!0)]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:o[58]||=e=>ca.value=!1},{default:F(()=>[...o[102]||=[c(`关闭`,-1)]]),_:1}),M(v,{color:`primary`,variant:`flat`,onClick:va,loading:fa.value,disabled:!la.value.trim()},{default:F(()=>[...o[103]||=[c(` 开始添加 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(Oi,{modelValue:D(Mt),"onUpdate:modelValue":o[60]||=e=>de(Mt)?Mt.value=e:null,mode:D(Nt),"target-count":D(Pt),"selected-total":Yt.value,"configured-skip-count":D(Ft),loading:D(jt),onConfirm:D(Rt)},null,8,[`modelValue`,`mode`,`target-count`,`selected-total`,`configured-skip-count`,`loading`,`onConfirm`]),M(vi,{modelValue:se.value,"onUpdate:modelValue":o[61]||=e=>se.value=e},null,8,[`modelValue`]),M(bi,{modelValue:Nr.value,"onUpdate:modelValue":o[62]||=e=>Nr.value=e,loading:Pr.value,result:Ir.value,"target-name":Lr.value?.name},null,8,[`modelValue`,`loading`,`result`,`target-name`]),M(it,{modelValue:ee.value,"onUpdate:modelValue":o[64]||=e=>ee.value=e,"max-width":`420`},{default:F(()=>[M(G,{rounded:`lg`},{default:F(()=>[M(U,null,{default:F(()=>[...o[104]||=[c(`监测槽已满`,-1)]]),_:1}),M(W,{class:`text-body-2`},{default:F(()=>[...o[105]||=[c(` 请选择要替换的槽位(当前 Pin 的服务将被移除): `,-1)]]),_:1}),M(W,null,{default:F(()=>[M(a,{dense:``},{default:F(()=>[(P(!0),C(V,null,le(D(x),e=>(P(),f(i,{key:e.slot_index,cols:`6`},{default:F(()=>[M(v,{block:``,variant:`tonal`,color:e.empty?`primary`:`warning`,onClick:t=>re(e.slot_index)},{default:F(()=>[c(` 槽 `+B(e.slot_index+1)+` `,1),e.empty?(P(),C(`span`,ia,`(空)`)):(P(),C(`span`,ra,`(`+B(e.server_name)+`)`,1))]),_:2},1032,[`color`,`onClick`])]),_:2},1024))),128))]),_:1})]),_:1}),M(Xe,null,{default:F(()=>[M(R),M(v,{variant:`text`,onClick:o[63]||=e=>ee.value=!1},{default:F(()=>[...o[106]||=[c(`取消`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}}),[[`__scopeId`,`data-v-0a37f6d1`]]);export{aa as default}; |