Files
Nexus/web/app/assets/ServersPage-BAvxLTf4.js
T
2026-06-08 07:30:31 +08:00

7 lines
57 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{a as e,t}from"./VDataTable-DDvcFoZv.js";import{_ as n,a as r,c as i,d as a,i as o,l as s,n as c,o as ee,r as te,s as ne,t as l,u as re,v as u}from"./VSelect-qv3fL2oy.js";import{n as d,t as f}from"./VRow-B_1khu0W.js";import{$r as p,A as ie,B as m,Bn as ae,Cn as h,D as oe,Dr as g,F as _,H as v,Ir as y,J as se,Jn as ce,Kr as le,M as ue,N as b,Nn as de,O as fe,On as pe,P as me,Pn as he,Pr as x,Q as S,Qn as ge,Qr as _e,R as C,Rr as ve,Sr as ye,T as be,Tr as xe,U as Se,Ur as w,Wr as T,Yn as E,Yr as D,Z as Ce,Zn as we,Zr as Te,Zt as O,_ as k,_n as Ee,_r as De,ar as Oe,bt as ke,dn as Ae,dr as A,fr as j,ft as je,gr as M,hr as N,j as Me,k as Ne,kr as Pe,ln as Fe,lr as P,lt as F,m as Ie,mn as Le,n as Re,or as I,ot as ze,pr as L,pt as Be,sr as R,t as z,tn as Ve,u as He,ur as B,ut as Ue,v as We,xr as V,y as H,yn as U,z as W}from"./index-DC1GUjcg.js";import{t as Ge}from"./dataTable-esDY4cOk.js";import{t as Ke}from"./VDataTableServer-DmgDNDsc.js";import{t as G}from"./apiError-DkJwfJ23.js";import{n as qe}from"./labels-CzOhyWto.js";import{i as K}from"./validation-DMwOxx4a.js";import{t as q}from"./VDialog-2336zotW.js";import{t as Je}from"./VTextarea-Dde5kxXN.js";import{a as Ye,i as Xe,n as Ze,r as Qe,t as $e}from"./StatCardsRow-BgN54P9h.js";import{i as J,n as et,r as tt,t as nt}from"./VTabs-BJ-JhetG.js";import{t as rt}from"./usePageAutoRefresh-6iIH21ho.js";import{i as it,n as at,r as ot,t as st}from"./VExpansionPanels-BEgiCh1R.js";import{n as ct,t as lt}from"./useServerCategories-CZgCKa-o.js";function ut(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 dt(e){let t=[];for(let n of e){let e=ut(typeof n==`object`&&n&&`id`in n?n.id:n);e!==null&&t.push(e)}return[...new Set(t)]}var ft=h({alwaysFilter:Boolean,autoSelectFirst:{type:[Boolean,String]},clearOnSelect:{type:Boolean,default:!0},delimiters:Array,...r({filterKeys:[`title`]}),...c({hideNoData:!0,returnObject:!0}),...E(Re({modelValue:null,role:`combobox`}),[`validationValue`,`dirty`])},`VCombobox`),pt=U()({name:`VCombobox`,props:ft(),emits:{"update:focused":e=>!0,"update:modelValue":e=>!0,"update:search":e=>!0,"update:menu":e=>!0},setup(e,{emit:t,slots:n}){let{t:r}=Fe(),c=w(),l=T(!1),u=T(!0),d=T(!1),f=w(),p=w(),m=T(-1),h=!1,{items:g,transformIn:v,transformOut:y}=fe(e),{textColorClasses:se,textColorStyles:ue}=ke(()=>c.value?.color),{InputIcon:b}=Ie(e),S=Ae(e,`modelValue`,[],e=>v(we(e)),t=>{let n=y(t);return e.multiple?n:n[0]??null}),C=He(e),ve=le(()=>e.closableChips&&!C.isReadonly.value&&!C.isDisabled.value),xe=P(()=>!!(e.chips||n.chip)),E=P(()=>xe.value||!!n.selection),D=T(!e.multiple&&!E.value?S.value[0]?.title??``:``),Ce=T(null),O=P({get:()=>D.value,set:async t=>{if(D.value=t??``,t===null||t===``&&!e.multiple&&!E.value?S.value=[]:!e.multiple&&!E.value&&(S.value=[oe(e,t)],ye(()=>p.value?.scrollToIndex(0))),t&&e.multiple&&e.delimiters?.length){let e=et(t);e.length>1&&(tt(e),D.value=``)}t||(m.value=-1),u.value=!t}}),De=P(()=>typeof e.counterValue==`function`?e.counterValue(S.value):typeof e.counterValue==`number`?e.counterValue:e.multiple?S.value.length:O.value.length),{filteredItems:Oe,getMatches:A}=ee(e,g,()=>Ce.value??(e.alwaysFilter||!u.value?O.value:``)),j=P(()=>e.hideSelected&&Ce.value===null?Oe.value.filter(e=>!S.value.some(t=>t.value===e.value)):Oe.value),Me=P(()=>e.hideNoData&&!j.value.length||C.isReadonly.value||C.isDisabled.value),Pe=Ae(e,`menu`),F=P({get:()=>Pe.value,set:e=>{Pe.value&&!e&&f.value?.ΨopenChildren.size||e&&Me.value||(Pe.value=e)}}),{menuId:Re,ariaExpanded:I,ariaControls:ze}=te(e,F);x(D,e=>{h?ye(()=>h=!1):l.value&&!F.value&&(F.value=!0),t(`update:search`,e)}),x(S,t=>{!e.multiple&&!E.value&&(D.value=t[0]?.title??``)});let L=P(()=>S.value.map(e=>e.value)),Be=P(()=>j.value.find(e=>e.type===`item`&&!e.props.disabled)),Ve=P(()=>(e.autoSelectFirst===!0||e.autoSelectFirst===`exact`&&O.value===Be.value?.title)&&j.value.length>0&&!u.value&&!d.value),U=w(),W=w(),Ge=w(),Ke=i(U,c),G=s(F,()=>f.value?.contentEl,()=>c.value?.controlRef),{onTabKeydown:qe}=ne({groups:[{type:`element`,contentRef:W},{type:`list`,contentRef:U,displayItemsCount:()=>j.value.length},{type:`element`,contentRef:Ge}],onLeave:()=>{F.value=!1,c.value?.focus()}});function K(t){h=!0,ye(()=>h=!1),e.openOnClear&&(F.value=!0)}function q(){Me.value||(F.value=!0)}function Je(e){Me.value||(l.value&&(e.preventDefault(),e.stopPropagation()),F.value=!F.value)}function Ye(e){e.key===`Tab`&&qe(e),U.value?.$el.contains(e.target)&&(pe(e)||e.key===`Backspace`)&&c.value?.focus()}function Xe(t){if(ae(t)||C.isReadonly.value)return;let n=c.value?.selectionStart,r=S.value.length;if([`Enter`,`ArrowDown`,`ArrowUp`].includes(t.key)&&t.preventDefault(),[`Enter`,`ArrowDown`].includes(t.key)&&(F.value=!0),[`Escape`].includes(t.key)&&(F.value=!1),Ve.value&&[`Enter`,`Tab`].includes(t.key)&&Be.value&&!S.value.some(({value:e})=>e===Be.value.value)&&J(Be.value),t.key===`ArrowDown`&&Ve.value&&U.value?.focus(`next`),t.key===`Enter`&&O.value&&(J(oe(e,O.value),!0,!0),E.value&&(D.value=``)),[`Backspace`,`Delete`].includes(t.key)){if(!e.multiple&&E.value&&S.value.length>0&&!O.value)return J(S.value[0],!1);if(~m.value){t.preventDefault();let e=m.value;J(S.value[m.value],!1),m.value=e>=r-1?r-2:e}else t.key===`Backspace`&&!O.value&&(m.value=r-1);return}if(e.multiple)if(t.key===`ArrowLeft`){if(m.value<0&&n&&n>0)return;let e=m.value>-1?m.value-1:r-1;S.value[e]?m.value=e:(m.value=-1,c.value?.setSelectionRange(O.value.length,O.value.length))}else if(t.key===`ArrowRight`){if(m.value<0)return;let e=m.value+1;S.value[e]?m.value=e:(m.value=-1,c.value?.setSelectionRange(0,0))}else ~m.value&&pe(t)&&(m.value=-1)}function Ze(t){let n=et(t?.clipboardData?.getData(`Text`)??``);n.length>1&&e.multiple&&(t.preventDefault(),tt(n))}function Qe(){e.eager&&p.value?.calculateVisibleItems()}function $e(){l.value&&(f.value?.contentEl?._clickOutside?.lastMousedownWasOutside?l.value=!1:c.value?.focus()),u.value=!0,Ce.value=null}function J(t,n=!0,r=!1){if(!(!t||t.props.disabled))if(e.multiple){let r=S.value.findIndex(n=>(e.valueComparator||Ee)(n.value,t.value)),i=n??!~r;if(~r){let e=i?[...S.value,t]:[...S.value];e.splice(r,1),S.value=e}else i&&(S.value=[...S.value,t]);e.clearOnSelect&&(O.value=``)}else{let i=n!==!1;S.value=i?[t]:[],(!u.value||e.alwaysFilter)&&D.value&&(Ce.value=D.value),D.value=i&&!E.value?t.title:``,ye(()=>{F.value=r,u.value=!0})}}function et(t){let n=[`
`,...e.delimiters??[]].map(he).join(`|`);return t.split(RegExp(`(?:${n})+`))}async function tt(t){for(let n of t)n=n.trim(),n&&(J(oe(e,n)),await ye())}function nt(e){l.value=!0,setTimeout(()=>{d.value=!0})}function rt(e){if(d.value=!1,!c.value?.$el.contains(e.relatedTarget)){if(G(e))return;l.value=!1}}let it=0;function at(){it=performance.now()}function ot(e){let t=e.relatedTarget;((f.value?.contentEl)?.contains(t)||!t&&performance.now()-it<10)&&(l.value=!0)}return x(l,(t,n)=>{if(!(t||t===n)&&(m.value=-1,F.value=!1,O.value)){if(e.multiple){J(oe(e,O.value));return}if(!E.value)return;S.value.some(({title:e})=>e===O.value)?D.value=``:J(oe(e,O.value))}}),x(F,t=>{if(!e.hideSelected&&t&&S.value.length&&u.value){let t=j.value.findIndex(t=>S.value.some(n=>(e.valueComparator||Ee)(n.value,t.value)));ge&&window.requestAnimationFrame(()=>{t>=0&&p.value?.scrollToIndex(t)})}t&&(Ce.value=null)}),x(g,(e,t)=>{F.value||l.value&&!t.length&&e.length&&(F.value=!0)}),Le(()=>{let t=!!(!e.hideNoData||j.value.length||n[`prepend-item`]||n[`append-item`]||n[`no-data`]),i=S.value.length>0,s=z.filterProps(e),ee={search:O,filteredItems:Oe.value};return M(z,V({ref:c},s,{modelValue:O.value,"onUpdate:modelValue":e=>O.value=e,focused:l.value,"onUpdate:focused":e=>l.value=e,validationValue:S.externalValue,counterValue:De.value,dirty:i,class:[`v-combobox`,{"v-combobox--active-menu":F.value,"v-combobox--chips":!!e.chips,"v-combobox--selection-slot":!!E.value,"v-combobox--selecting-index":m.value>-1,[`v-combobox--${e.multiple?`multiple`:`single`}`]:!0},e.class],style:e.style,readonly:C.isReadonly.value,placeholder:i?void 0:e.placeholder,"onClick:clear":K,"onMousedown:control":q,onKeydown:Xe,onPaste:Ze,onBlur:ot,"aria-expanded":I.value,"aria-controls":ze.value}),{...n,default:({id:i})=>B(R,null,[M(We,V({id:Re.value,ref:f,modelValue:F.value,"onUpdate:modelValue":e=>F.value=e,activator:`parent`,disabled:Me.value,eager:e.eager,maxHeight:310,openOnClick:!1,closeOnContentClick:!1,onAfterEnter:Qe,onAfterLeave:$e},e.menuProps,{contentClass:[`v-combobox__content`,e.menuProps?.contentClass]}),{default:()=>[M(k,{elevation:e.menuElevation,onFocusin:nt,onKeydown:Ye,onMousedown:at},{default:()=>[n[`menu-header`]&&B(`header`,{ref:W},[n[`menu-header`](ee)]),t&&M(be,V({key:`combobox-list`,ref:U,filterable:!0,selected:L.value,selectStrategy:e.multiple?`independent`:`single-independent`,onMousedown:e=>e.preventDefault(),selectable:!!j.value.length,onFocusout:rt,tabindex:`-1`,"aria-live":`polite`,"aria-labelledby":`${i.value}-label`,"aria-multiselectable":e.multiple,color:e.itemColor??e.color},Ke,e.listProps),{default:()=>[n[`prepend-item`]?.(),!j.value.length&&!e.hideNoData&&(n[`no-data`]?.()??M(ie,{key:`no-data`,title:r(e.noDataText)},null)),M(re,{ref:p,renderless:!0,items:j.value,itemKey:`value`},{default:({item:t,index:r,itemRef:i})=>{let s=V(t.props,{ref:i,key:t.value,active:Ve.value&&t===Be.value?!0:void 0,onClick:()=>J(t,null),"aria-posinset":r+1,"aria-setsize":j.value.length});return t.type===`divider`?n.divider?.({props:t.raw,index:r})??M(me,V(t.props,{key:`divider-${r}`}),null):t.type===`subheader`?n.subheader?.({props:t.raw,index:r})??M(Ne,V(t.props,{key:`subheader-${r}`}),null):n.item?.({item:t.raw,internalItem:t,index:r,props:s})??M(ie,V(s,{role:`option`}),{prepend:({isSelected:n})=>B(R,null,[e.multiple&&!e.hideSelected?M(a,{key:t.value,modelValue:n,ripple:!1,tabindex:`-1`,"aria-hidden":!0,onClick:e=>e.preventDefault()},null):void 0,t.props.prependAvatar&&M(Se,{image:t.props.prependAvatar},null),t.props.prependIcon&&M(Ue,{icon:t.props.prependIcon},null)]),title:()=>u.value?t.title:o(`v-combobox`,t.title,A(t)?.title)})}}),n[`append-item`]?.()]}),n[`menu-footer`]&&B(`footer`,{ref:Ge},[n[`menu-footer`](ee)])]})]}),S.value.map((t,r)=>{function i(e){e.stopPropagation(),e.preventDefault(),J(t,!1)}let a=V(_.filterProps(t.props),{"onClick:close":i,onKeydown(e){e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),e.stopPropagation(),i(e))},onMousedown(e){e.preventDefault(),e.stopPropagation()},modelValue:!0,"onUpdate:modelValue":void 0}),o=xe.value?!!n.chip:!!n.selection,s=o?de(xe.value?n.chip({item:t.raw,internalItem:t,index:r,props:a}):n.selection({item:t.raw,internalItem:t,index:r})):void 0;if(!(o&&!s))return B(`div`,{key:t.value,class:Te([`v-combobox__selection`,r===m.value&&[`v-combobox__selection--selected`,se.value]]),style:_e(r===m.value?ue.value:{})},[xe.value?n.chip?M(je,{key:`chip-defaults`,defaults:{VChip:{closable:ve.value,size:`small`,text:t.title}}},{default:()=>[s]}):M(_,V({key:`chip`,closable:ve.value,size:`small`,text:t.title,disabled:t.props.disabled},a),null):s??B(`span`,{class:`v-combobox__selection-text`},[t.title,e.multiple&&r<S.value.length-1&&B(`span`,{class:`v-combobox__selection-comma`},[N(`,`)])])])})]),"append-inner":(...t)=>B(R,null,[n[`append-inner`]?.(...t),(!e.hideNoData||e.items.length)&&e.menuIcon?M(Ue,{class:`v-combobox__menu-icon`,color:c.value?.fieldIconColor,icon:e.menuIcon,onMousedown:Je,onClick:ce,"aria-hidden":!0,tabindex:`-1`},null):void 0,e.appendInnerIcon&&M(b,{key:`append-icon`,name:`appendInner`,color:t[0].iconColor.value},null)])})}),H({isFocused:l,isPristine:u,menu:F,search:O,selectionIndex:m,filteredItems:Oe,select:J},c)}}),mt=De({__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,r=t,i=P(()=>n.form.preset_id||n.isEditing?[]:[K(`SSH 密码或选择密码预设`)]),a=P(()=>n.form.ssh_key_preset_id||n.isEditing?[]:[K(`私钥或选择 SSH 密钥预设`)]);return(t,n)=>(g(),A(q,{"model-value":e.modelValue,"max-width":`720`,scrollable:``,persistent:``,"onUpdate:modelValue":n[18]||=e=>r(`update:modelValue`,e)},{default:y(()=>[M(C,{border:``},{default:y(()=>[M(m,{class:`d-flex align-center`},{default:y(()=>[N(p(e.isEditing?`编辑服务器`:`添加服务器`)+` `,1),M(b),M(S,{icon:`mdi-close`,variant:`text`,size:`small`,disabled:e.saving,onClick:n[0]||=e=>r(`update:modelValue`,!1)},null,8,[`disabled`])]),_:1}),M(me),M(W,{class:`pt-4`},{default:y(()=>[e.lookupsLoading?(g(),A(ze,{key:0,indeterminate:``,color:`primary`,class:`mb-3`})):j(``,!0),n[21]||=B(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`基本信息`,-1),M(f,{dense:``},{default:y(()=>[M(d,{cols:`12`,sm:`6`},{default:y(()=>[M(z,{modelValue:e.form.name,"onUpdate:modelValue":n[1]||=t=>e.form.name=t,label:`名称`,variant:`outlined`,density:`compact`,rules:[D(K)(`服务器名称`)]},null,8,[`modelValue`,`rules`])]),_:1}),M(d,{cols:`12`,sm:`6`},{default:y(()=>[M(z,{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(K)(`域名或 IP`)]},null,8,[`modelValue`,`rules`])]),_:1}),M(d,{cols:`6`,sm:`4`},{default:y(()=>[M(z,{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(d,{cols:`6`,sm:`8`},{default:y(()=>[M(z,{modelValue:e.form.username,"onUpdate:modelValue":n[4]||=t=>e.form.username=t,label:`SSH 用户名`,variant:`outlined`,density:`compact`,placeholder:`root`,rules:[D(K)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`])]),_:1})]),_:1}),M(me,{class:`my-4`}),n[22]||=B(`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:y(()=>[M(S,{value:`password`,size:`small`},{default:y(()=>[...n[19]||=[N(`密码`,-1)]]),_:1}),M(S,{value:`key`,size:`small`},{default:y(()=>[...n[20]||=[N(`SSH 密钥`,-1)]]),_:1})]),_:1},8,[`modelValue`]),e.form.auth_method===`password`?(g(),L(R,{key:1},[M(l,{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?j(``,!0):(g(),A(z,{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:i.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)):(g(),L(R,{key:2},[M(l,{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(z,{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?j(``,!0):(g(),A(Je,{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:a.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)),M(me,{class:`my-4`}),n[23]||=B(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`部署`,-1),M(z,{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(K)(`目标路径`)]},null,8,[`modelValue`,`rules`]),M(pt,{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":``},null,8,[`modelValue`,`items`]),M(st,{variant:`accordion`,class:`mt-4`},{default:y(()=>[M(at,{title:`高级选项`},{default:y(()=>[M(it,null,{default:y(()=>[M(l,{modelValue:e.form.platform_id,"onUpdate:modelValue":n[13]||=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(l,{modelValue:e.form.node_id,"onUpdate:modelValue":n[14]||=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(l,{modelValue:e.form.files_elevation,"onUpdate:modelValue":n[15]||=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":``},null,8,[`modelValue`,`items`])]),_:1})]),_:1})]),_:1})]),_:1}),M(me),M(v,{class:`pa-4`},{default:y(()=>[M(b),M(S,{variant:`text`,disabled:e.saving,onClick:n[16]||=e=>r(`update:modelValue`,!1)},{default:y(()=>[...n[24]||=[N(`取消`,-1)]]),_:1},8,[`disabled`]),M(S,{color:`primary`,variant:`flat`,loading:e.saving,onClick:n[17]||=e=>r(`save`)},{default:y(()=>[...n[25]||=[N(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),ht={key:1,class:`text-body-2 text-medium-emphasis mb-0`},gt={class:`text-body-2 mb-3`},_t={class:`text-success font-weight-medium`},vt={class:`text-error font-weight-medium`},yt={key:3,class:`text-medium-emphasis mb-0`},bt=De({__name:`BatchAgentResultDialog`,props:{modelValue:{type:Boolean},title:{},loading:{type:Boolean},results:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let n=e,r=t,i=P(()=>n.results.filter(e=>e.success).length),a=P(()=>n.results.length-i.value);return(t,n)=>(g(),A(q,{"model-value":e.modelValue,"max-width":`560`,scrollable:``,persistent:``,"onUpdate:modelValue":n[2]||=e=>r(`update:modelValue`,e)},{default:y(()=>[M(C,{border:``},{default:y(()=>[M(m,{class:`d-flex align-center`},{default:y(()=>[N(p(e.title)+` `,1),M(b),M(S,{icon:`mdi-close`,variant:`text`,size:`small`,disabled:e.loading,onClick:n[0]||=e=>r(`update:modelValue`,!1)},null,8,[`disabled`])]),_:1}),M(me),M(W,{class:`pt-4`},{default:y(()=>[e.loading?(g(),A(ze,{key:0,indeterminate:``,color:`primary`,class:`mb-2`})):j(``,!0),e.loading?(g(),L(`p`,ht,`正在执行,请稍候…`)):e.results.length?(g(),L(R,{key:2},[B(`p`,gt,[n[3]||=N(` 成功 `,-1),B(`span`,_t,p(i.value),1),n[4]||=N(` 台, 失败 `,-1),B(`span`,vt,p(a.value),1),n[5]||=N(` 台 `,-1)]),M(be,{density:`compact`,class:`rounded border`},{default:y(()=>[(g(!0),L(R,null,Pe(e.results,e=>(g(),A(ie,{key:e.server_id,class:`py-1`},{prepend:y(()=>[M(Ue,{color:e.success?`success`:`error`,size:`18`},{default:y(()=>[N(p(e.success?`mdi-check-circle`:`mdi-close-circle`),1)]),_:2},1032,[`color`])]),default:y(()=>[M(Me,{class:`text-body-2`},{default:y(()=>[N(p(e.server_name||`#${e.server_id}`),1)]),_:2},1024),e.success&&e.stdout?(g(),A(ue,{key:0,class:`text-caption text-medium-emphasis`},{default:y(()=>[N(p(e.stdout),1)]),_:2},1024)):!e.success&&e.error?(g(),A(ue,{key:1,class:`text-caption text-error`},{default:y(()=>[N(p(e.error),1)]),_:2},1024)):j(``,!0)]),_:2},1024))),128))]),_:1})],64)):(g(),L(`p`,yt,`无结果`))]),_:1}),M(me),M(v,{class:`pa-4`},{default:y(()=>[M(b),M(S,{color:`primary`,variant:`flat`,disabled:e.loading,onClick:n[1]||=e=>r(`update:modelValue`,!1)},{default:y(()=>[...n[6]||=[N(` 关闭 `,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}});function xt(){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`,category:``,platform_id:null,node_id:null,files_elevation:`auto_sudo`}}function St(e){return e===`uncategorized`?``:e}function Ct(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`,category:e.category||``,platform_id:e.platform_id,node_id:e.node_id,files_elevation:e.files_elevation||`auto_sudo`}}function wt(e){let t=n(),r=w(!1),i=w(null),a=w(!1),o=w(xt()),s=w({password_set:!1,ssh_key_private_set:!1}),c=w([]),ee=w([]),te=w([]),ne=w([]),l=w([]),re=w(!1),u=P(()=>i.value!=null),d=[{title:`自动(权限失败时 sudo`,value:`auto_sudo`},{title:`关闭 sudo`,value:`off`},{title:`始终 sudo(排障)`,value:`always_sudo`}];async function f(){re.value=!0;try{let[e,t,n,r]=await Promise.all([O.get(`/servers/categories`),O.getList(`/presets/`,{per_page:500}),O.getList(`/ssh-key-presets/`,{per_page:500}),O.get(`/assets/nodes`)]),i=new Set;for(let t of e.categories||[]){let e=St(t.name);e&&i.add(e)}te.value=[...i].sort((e,t)=>e.localeCompare(t,`zh`)),ne.value=(e.platforms||[]).map(e=>({id:e.id,name:e.name})),c.value=(t.items||[]).map(e=>({...e,display:`${e.name} (${e.username||`root`})`})),ee.value=(n.items||[]).map(e=>({...e,display:`${e.name} (${e.username||`root`})`})),l.value=Array.isArray(r)?r:[]}catch{t(`加载表单选项失败`,`error`)}finally{re.value=!1}}async function p(){i.value=null,o.value=xt(),s.value={password_set:!1,ssh_key_private_set:!1},r.value=!0,await f()}async function ie(e){i.value=e.id,o.value=Ct(e),s.value={password_set:!!e.password_set,ssh_key_private_set:!!(e.ssh_key_private_set||e.ssh_key_configured)},r.value=!0,await f()}function m(){r.value=!1,i.value=null,o.value=xt(),s.value={password_set:!1,ssh_key_private_set:!1}}function ae(){let e=o.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(!u.value&&!e.preset_id&&!e.password.trim())return`请选择密码预设或填写 SSH 密码(安装 Agent 需要可 SSH)`}else if(!u.value&&!e.ssh_key_preset_id&&!e.ssh_key_private.trim())return`请选择 SSH 密钥预设或粘贴私钥`;return null}function h(){let e=o.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(),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()),u.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 oe(){let n=ae();if(n){t(n,`error`);return}a.value=!0;try{let n=h();u.value&&i.value!=null?await O.put(`/servers/${i.value}`,n):await O.post(`/servers/`,n),m(),e(),t(`保存成功`)}catch(e){t(G(e,`保存失败`),`error`)}finally{a.value=!1}}return{visible:r,editingId:i,isEditing:u,saving:a,form:o,editHints:s,passwordPresets:c,sshKeyPresets:ee,categoryOptions:te,platforms:ne,nodes:l,lookupsLoading:re,filesElevationItems:d,openAdd:p,openEdit:ie,close:m,save:oe}}var Tt={class:`d-flex align-center flex-wrap ga-2`},Et={class:`text-body-2 mr-4`},Dt={class:`font-weight-medium`},Ot={class:`text-medium-emphasis`},kt={key:1,class:`text-medium-emphasis`},At={key:1,class:`d-flex align-center ga-1`},jt=[`title`],Mt={class:`text-medium-emphasis`},Nt={class:`text-caption text-medium-emphasis`},Pt={class:`d-flex ga-1`},Ft={key:2,class:`px-4 pb-4`},It={key:0,class:`text-center py-8`},Lt={key:1,class:`text-center text-medium-emphasis py-6`},Rt={class:`d-flex align-center ga-2 flex-grow-1`},zt={class:`text-caption text-medium-emphasis`},Bt=[`onClick`],Vt={class:`font-weight-medium`},Ht={class:`text-medium-emphasis`},Ut={class:`text-caption text-medium-emphasis text-truncate`,style:{"max-width":`180px`}},Wt={class:`text-medium-emphasis`},Gt={class:`text-caption text-medium-emphasis`},Kt=[`title`],qt={class:`text-h6`},Jt={class:`text-h6`},Yt={class:`text-h6`},Xt={class:`text-h6`},Zt={class:`text-body-1 font-weight-medium text-truncate`},Qt={key:0,class:`text-center py-4`},$t={key:1,class:`text-medium-emphasis text-center py-4`},en={key:1,class:`text-medium-emphasis`},tn={class:`text-body-2 mb-2`},nn={class:`text-body-2 text-medium-emphasis mb-3`},rn={key:0,class:`text-caption text-medium-emphasis mt-1`},an={key:0},on={key:0},sn=De({__name:`ServersPage`,setup(r){let i=[...Ge],o=n(),s=Ve(),{servers:c,loading:ee,page:te,itemsPerPage:ne,total:l,search:re,categoryFilter:ae,sortBy:h,loadServers:oe,onSearch:ce,onPageChange:le,onItemsPerPageChange:de,onCategoryChange:fe,onSortByChange:pe,loadAllServers:he}=Ye(),{categories:ge,loading:_e,totalCount:ye,loadCategories:Se}=ct(),T=w(`table`),E=w([]),we=w(!1),Te=w([]);async function k(){try{await oe(),T.value===`group`&&await Ee()}catch{o(`加载服务器列表失败`,`error`)}}async function Ee(e=!1){e||(we.value=!0);try{E.value=await he(),Te.value=ke.value.map(e=>e.category)}catch{e||(E.value=[],o(`加载分类视图失败`,`error`))}finally{e||(we.value=!1)}}async function De(){try{await oe({silent:!0}),T.value===`group`&&await Ee(!0)}catch{}}rt(De,3e4);let ke=P(()=>{let e={};for(let t of E.value){let n=t.category?.trim()||`uncategorized`;e[n]||(e[n]=[]),e[n].push(t)}return Object.entries(e).map(([e,t])=>({category:e,label:lt(e),servers:t.sort((e,t)=>e.name.localeCompare(t.name,`zh`))})).sort((e,t)=>e.category===`uncategorized`?1:t.category===`uncategorized`?-1:e.label.localeCompare(t.label,`zh`))});function Ae(e){fe(e),T.value===`group`&&Ee()}function je(e,t){let n=new Set(Y.value.map(e=>typeof e==`number`?e:e.id));t?n.add(e):n.delete(e),Y.value=[...n]}let Ne=w(!1);async function Fe(){if(!(l.value<=0)){Ne.value=!0;try{let e=await he();Y.value=e.map(e=>e.id),o(`已选择当前筛选结果 ${e.length} 台`)}catch{o(`加载筛选结果失败`,`error`)}finally{Ne.value=!1}}}function Ie(e){return e.length>0&&e.every(e=>X.value.has(e.id))}function Le(e){let t=Ie(e),n=new Set(X.value);for(let r of e)t?n.delete(r.id):n.add(r.id);Y.value=[...n]}x(ae,()=>{Y.value=[]}),x(h,()=>{Y.value=[]},{deep:!0}),x(re,()=>{Y.value=[]}),x(T,e=>{e===`group`&&Ee()});let Re=w(!1),ze=w(!1),He=w(null),We=w(!1),V=w(!1),H=w({domain:``,port:22,name:``}),U=w([]),K=w(!1),ut=w(null),ft=w(!1),ht=w([]),gt=w(``),_t=w(!1),vt=w(null),yt=w(!1),xt=[{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 St(){H.value={domain:``,port:22,name:``},We.value=!0}function Ct(e,t){ht.value=e,gt.value=t||``,ft.value=!0}async function sn(){K.value=!0;try{U.value=(await O.get(`/servers/pending`)).items||[]}catch(e){U.value=[],o(G(e,`加载失败列表失败`),`error`)}finally{K.value=!1}}async function cn(){let e=H.value.domain.trim();if(!e){o(`请填写 IP 或域名`,`error`);return}V.value=!0;try{let t={domain:e,port:H.value.port||22},n=H.value.name.trim();n&&(t.name=n);let r=await O.post(`/servers/add-by-ip`,t);r.success&&r.server?(We.value=!1,o(`添加成功:${r.matched_preset} (${r.matched_username})`),k(),Ln()):(We.value=!1,Ct(r.errors||[],r.message),sn())}catch(e){o(G(e,`添加失败`),`error`)}finally{V.value=!1}}async function ln(e){ut.value=e.id;try{let t=await O.post(`/servers/pending/${e.id}/retry`,{});t.success&&t.server?(o(`重试成功:${t.matched_preset} (${t.matched_username})`),k(),Ln(),sn()):(Ct(t.errors||[],t.message),sn())}catch(e){o(G(e,`重试失败`),`error`)}finally{ut.value=null}}function un(e){vt.value=e,_t.value=!0}async function dn(){if(vt.value){yt.value=!0;try{await O.delete(`/servers/pending/${vt.value.id}`),_t.value=!1,o(`已从失败列表移除`),sn()}catch(e){o(G(e,`删除失败`),`error`)}finally{yt.value=!1}}}let{visible:fn,form:pn,isEditing:mn,saving:hn,lookupsLoading:gn,passwordPresets:_n,sshKeyPresets:vn,categoryOptions:yn,platforms:bn,nodes:xn,editHints:Sn,filesElevationItems:Cn,openAdd:wn,openEdit:Tn,close:En,save:Dn}=wt(()=>{k(),Ln(),Se()});x(fn,(e,t)=>{t&&!e&&En()});let Y=w([]),X=P(()=>new Set(dt(Y.value))),Z=w(null),On=w(`info`),kn=w([]),An=w(!1);function jn(e){switch(e){case`success`:return`success`;case`failed`:return`error`;case`running`:return`warning`;case`cancelled`:return`grey`;default:return`default`}}function Mn(e){switch(e){case`success`:return`成功`;case`failed`:return`失败`;case`running`:return`进行中`;case`cancelled`:return`已取消`;default:return e}}function Nn(e){let t=[];return e.started_at&&t.push(e.started_at),e.sync_mode&&t.push(e.sync_mode),e.trigger_type&&t.push(e.trigger_type),e.push_permission&&t.push(`权限 ${qe(e.push_permission)}`),t.join(` · `)||`—`}function Pn(e){return Array.isArray(e)?e:e&&typeof e==`object`&&Array.isArray(e.items)?e.items:[]}let Fn=[{title:`状态`,key:`status`,width:100},{title:`名称`,key:`name`},{title:`地址`,key:`domain`},{title:`分类`,key:`category`,width:100},{title:`目标路径`,key:`target_path`,width:200},{title:`Agent`,key:`agent_version`,width:100},{title:`心跳`,key:`last_heartbeat`,width:120},{title:`操作`,key:`actions`,width:200,align:`end`,sortable:!1}],In=w([{subtitle:`服务器总数`,title:`0`,icon:`mdi-server-network`,color:`blue`},{subtitle:`在线`,title:`0`,icon:`mdi-check-circle-outline`,color:`green`},{subtitle:`离线`,title:`0`,icon:`mdi-alert-circle-outline`,color:`orange`},{subtitle:`告警中`,title:`0`,icon:`mdi-bell-alert-outline`,color:`red`}]);async function Ln(){try{let e=await O.get(`/servers/stats`);In.value[0].title=String(e.total),In.value[1].title=String(e.online),In.value[2].title=String(e.offline),In.value[3].title=String(e.alerts??0)}catch{}}function Rn(e){s.push({path:`/terminal`,query:{server_id:String(e.id)}})}function zn(e){s.push({path:`/files`,query:{server_id:String(e.id)}})}let Bn=w(!1),Vn=w(``),Hn=w(!1),Un=P(()=>{let e=ge.value.filter(e=>e.name!==`uncategorized`).map(e=>e.label);if(yn.value.length)for(let t of yn.value)t&&!e.includes(t)&&e.push(t);return e.sort((e,t)=>e.localeCompare(t,`zh`))});function Wn(){if(X.value.size===0){o(`请先勾选至少一台服务器`,`error`);return}Vn.value=``,Bn.value=!0}async function Gn(){let e=[...X.value];if(e.length!==0){Hn.value=!0;try{let t=(Vn.value||``).trim(),n=0;for(let r=0;r<e.length;r+=200){let i=await O.post(`/servers/batch/category`,{server_ids:e.slice(r,r+200),category:t});n+=i.updated}Bn.value=!1,Y.value=[],o(`已更新 ${n} 台服务器分类`),await Promise.all([k(),Se(),Ln()])}catch(e){o(G(e,`批量修改分类失败`),`error`)}finally{Hn.value=!1}}}let Q=w(!1),Kn=w(!1),qn=w(!1),Jn=w(!1),Yn=w(``),Xn=w([]),Zn=w(null),Qn=w(``),$n=w(null);function er(e){Yn.value=e,Xn.value=[],Jn.value=!0,qn.value=!0}function tr(e){Xn.value=e,Jn.value=!1}async function nr(e,t,n){let r=dt(Y.value);if(!r.length){o(`请先选择服务器`,`warning`);return}if(!(n?.confirm&&!confirm(n.confirm.replace(`{n}`,String(r.length))))){er(e);try{tr((await O.post(t,{server_ids:r})).results||[]),n?.reload!==!1&&k()}catch(e){qn.value=!1,o(G(e,`操作失败`),`error`)}}}function rr(e){Zn.value=e.id,Qn.value=e.target_path?.trim()||`/www/wwwroot`}function ir(){Zn.value=null,Qn.value=``,$n.value=null}async function ar(e){let t=Qn.value.trim();if(!t){o(`目标路径不能为空`,`warning`);return}if(!t.startsWith(`/`)){o(`目标路径须为绝对路径(以 / 开头)`,`warning`);return}$n.value=e;try{await O.put(`/servers/${e}`,{target_path:t}),o(`目标路径已更新`),ir(),k(),Z.value?.id===e&&(Z.value={...Z.value,target_path:t})}catch(e){o(G(e,`保存失败`),`error`)}finally{$n.value=null}}function or(){if(!X.value.size){o(`请先选择服务器`,`warning`);return}Kn.value=!0}async function sr(){Kn.value=!1,await nr(`自动检测目标路径`,`/servers/batch/detect-path`)}async function cr(){let e=dt(Y.value);if(e.length){o(`正在检查 ${e.length} 台服务器...`);try{await O.post(`/servers/check`,{server_ids:e}),o(`健康检查完成`),k()}catch(e){o(G(e,`检查失败`),`error`)}}}async function lr(){if(confirm(`确定删除选中的 ${X.value.size} 台服务器?`)){for(let e of X.value)try{await O.delete(`/servers/${e}`)}catch{}Y.value=[],o(`批量删除完成`),k(),Ln()}}async function ur(){Q.value=!0;try{await nr(`批量安装 Agent`,`/servers/batch/install-agent`,{reload:!0})}finally{Q.value=!1}}async function dr(){Q.value=!0;try{await nr(`批量升级 Agent`,`/servers/batch/upgrade-agent`,{confirm:`确定对 {n} 台服务器升级 Agent?`,reload:!0})}finally{Q.value=!1}}async function fr(){Q.value=!0;try{await nr(`批量卸载 Agent`,`/servers/batch/uninstall-agent`,{confirm:`确定对 {n} 台已安装 Agent 的服务器执行卸载?
将停止服务、删除 /opt/nexus-agent 并清除 Agent 状态。`,reload:!0})}finally{Q.value=!1}}async function pr(){try{let e=await O.getList(`/servers/`,{per_page:5e3}),t=[`ID`,`名称`,`地址`,`端口`,`用户名`,`分类`,`状态`,`Agent版本`,`最后心跳`],n=(e.items||[]).map(e=>[e.id,e.name,e.domain,e.port,e.username,e.category||``,e.status,e.agent_version||``,e.last_heartbeat||``]),r=``+[t.join(`,`),...n.map(e=>e.map(e=>`"${String(e).replace(/"/g,`""`)}"`).join(`,`))].join(`
`),i=new Blob([r],{type:`text/csv;charset=utf-8;`}),a=URL.createObjectURL(i),s=document.createElement(`a`);s.href=a,s.download=`servers_${new Date().toISOString().slice(0,10)}.csv`,s.click(),URL.revokeObjectURL(a),o(`导出完成`)}catch(e){o(e.message||`导出失败`,`error`)}}let mr=w(!1),hr=w(``),gr=w(22),_r=w(8601),vr=w(!1),$=w(null);function yr(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 br(e){let t=new Set,n=[],r=0;for(let i of e.split(`
`)){let e=yr(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 xr=P(()=>br(hr.value));function Sr(){hr.value=``,gr.value=22,_r.value=8601,$.value=null,mr.value=!0}async function Cr(){let e=hr.value.trim();if(!e){o(`请填写至少一个 IP 或域名`,`error`);return}vr.value=!0,$.value=null;try{let t=await O.post(`/servers/add-by-ips-batch`,{text:e,port:gr.value||22,agent_port:_r.value||8601});$.value=t,t.created>0&&(k(),Ln()),t.pending>0&&sn(),o(t.pending>0?`添加完成:${t.created} 台成功,${t.pending} 台进入连接失败列表`:`添加完成:${t.created} 台成功`,t.pending>0?`warning`:`success`)}catch(e){o(G(e,`批量添加失败`),`error`)}finally{vr.value=!1}}async function wr(e){Z.value=e,On.value=`info`,An.value=!0,kn.value=[];try{kn.value=Pn(await O.get(`/servers/${e.id}/logs`,{limit:20}))}catch{kn.value=[]}finally{An.value=!1}}function Tr(e){Tn(e)}function Er(e){He.value=e,Re.value=!0}async function Dr(){if(He.value){ze.value=!0;try{await O.delete(`/servers/${He.value.id}`),Re.value=!1,k(),Ln(),o(`已删除`)}catch(e){o(e.message||`删除失败`,`error`)}finally{ze.value=!1}}}return xe(()=>{Ln(),Se(),k(),sn()}),(n,r)=>(g(),A(u,{fluid:``,class:`pa-4 pa-md-6`},{default:y(()=>[M($e,{items:In.value},null,8,[`items`]),M(C,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:y(()=>[M(m,{class:`d-flex align-center`},{default:y(()=>[r[45]||=N(` 服务器列表 `,-1),M(b),M(z,{modelValue:D(re),"onUpdate:modelValue":[r[0]||=e=>ve(re)?re.value=e:null,D(ce)],"prepend-inner-icon":`mdi-magnify`,label:`搜索...`,density:`compact`,"hide-details":``,rounded:``,style:{"max-width":`240px`},variant:`outlined`},null,8,[`modelValue`,`onUpdate:modelValue`]),M(S,{color:`primary`,variant:`flat`,class:`ml-3`,"prepend-icon":`mdi-plus`,size:`small`,onClick:D(wn)},{default:y(()=>[...r[38]||=[N(` 添加 `,-1)]]),_:1},8,[`onClick`]),M(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-flash`,size:`small`,onClick:St},{default:y(()=>[...r[39]||=[N(` 快速添加(IP) `,-1)]]),_:1}),M(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-download`,size:`small`,onClick:pr},{default:y(()=>[...r[40]||=[N(` 导出CSV `,-1)]]),_:1}),M(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-ip-network`,size:`small`,onClick:Sr},{default:y(()=>[...r[41]||=[N(` 批量添加 `,-1)]]),_:1}),M(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-folder-search`,size:`small`,disabled:X.value.size===0,title:`请先勾选至少一台服务器`,onClick:or},{default:y(()=>[...r[42]||=[N(` 检测路径 `,-1)]]),_:1},8,[`disabled`]),M(Be,{modelValue:T.value,"onUpdate:modelValue":r[1]||=e=>T.value=e,mandatory:``,density:`compact`,class:`ml-2`,color:`primary`,variant:`outlined`,divided:``},{default:y(()=>[M(S,{value:`table`,size:`small`,"prepend-icon":`mdi-table`},{default:y(()=>[...r[43]||=[N(`列表`,-1)]]),_:1}),M(S,{value:`group`,size:`small`,"prepend-icon":`mdi-folder-multiple`},{default:y(()=>[...r[44]||=[N(`分类`,-1)]]),_:1})]),_:1},8,[`modelValue`])]),_:1}),M(W,{class:`pt-0 pb-2`},{default:y(()=>[B(`div`,Tt,[r[46]||=B(`span`,{class:`text-caption text-medium-emphasis mr-1`},`分类筛选`,-1),M(_,{color:D(ae)===``?`primary`:void 0,variant:D(ae)===``?`flat`:`outlined`,size:`small`,label:``,onClick:r[2]||=e=>Ae(``)},{default:y(()=>[N(` 全部 `+p(D(ye)),1)]),_:1},8,[`color`,`variant`]),(g(!0),L(R,null,Pe(D(ge),e=>(g(),A(_,{key:e.name,color:D(ae)===e.name?`primary`:void 0,variant:D(ae)===e.name?`flat`:`outlined`,size:`small`,label:``,onClick:t=>Ae(e.name)},{default:y(()=>[N(p(e.label)+` `+p(e.count),1)]),_:2},1032,[`color`,`variant`,`onClick`]))),128)),D(_e)?(g(),A(F,{key:0,indeterminate:``,size:`16`,width:`2`})):j(``,!0),M(b),M(S,{size:`small`,variant:`tonal`,disabled:D(l)===0,loading:Ne.value,onClick:Fe},{default:y(()=>[N(` 全选筛选结果 (`+p(D(l))+`) `,1)]),_:1},8,[`disabled`,`loading`])])]),_:1}),X.value.size>0?(g(),A(C,{key:0,class:`mx-4 mb-2`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:y(()=>[M(W,{class:`d-flex align-center py-2`},{default:y(()=>[B(`span`,Et,`已选择 `+p(X.value.size)+` 台服务器`,1),M(b),M(S,{size:`small`,variant:`text`,onClick:Wn},{default:y(()=>[...r[47]||=[N(`修改分类`,-1)]]),_:1}),M(S,{size:`small`,variant:`text`,onClick:cr},{default:y(()=>[...r[48]||=[N(`健康检查`,-1)]]),_:1}),M(S,{size:`small`,variant:`text`,onClick:or},{default:y(()=>[...r[49]||=[N(`检测目标路径`,-1)]]),_:1}),M(S,{size:`small`,variant:`text`,onClick:ur,loading:Q.value},{default:y(()=>[...r[50]||=[N(`安装Agent`,-1)]]),_:1},8,[`loading`]),M(S,{size:`small`,variant:`text`,onClick:dr,loading:Q.value},{default:y(()=>[...r[51]||=[N(`升级Agent`,-1)]]),_:1},8,[`loading`]),M(S,{size:`small`,variant:`text`,color:`error`,onClick:fr,loading:Q.value},{default:y(()=>[...r[52]||=[N(`卸载Agent`,-1)]]),_:1},8,[`loading`]),M(S,{size:`small`,variant:`text`,color:`error`,onClick:lr},{default:y(()=>[...r[53]||=[N(`批量删除`,-1)]]),_:1}),M(S,{size:`small`,variant:`text`,onClick:r[3]||=e=>Y.value=[]},{default:y(()=>[...r[54]||=[N(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):j(``,!0),T.value===`table`?(g(),A(Ke,{key:1,items:D(c),headers:Fn,"items-length":D(l),loading:D(ee),page:D(te),"items-per-page":D(ne),"items-per-page-options":i,hover:``,density:`comfortable`,"item-value":`id`,"show-select":``,modelValue:Y.value,"onUpdate:modelValue":r[6]||=e=>Y.value=e,"sort-by":D(h),"onUpdate:sortBy":[r[7]||=e=>ve(h)?h.value=e:null,D(pe)],"onUpdate:page":D(le),"onUpdate:itemsPerPage":D(de),"onClick:row":r[8]||=(e,{item:t})=>wr(t)},{"item.status":y(({item:e})=>[M(_,{color:D(Qe)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:y(()=>[N(p(D(Xe)(e.status)),1)]),_:2},1032,[`color`])]),"item.name":y(({item:e})=>[B(`span`,Dt,p(e.name),1)]),"item.domain":y(({item:e})=>[B(`span`,Ot,p(e.domain)+`:`+p(e.port),1)]),"item.category":y(({item:e})=>[e.category?(g(),A(_,{key:0,color:`primary`,variant:`tonal`,size:`small`,label:``},{default:y(()=>[N(p(e.category),1)]),_:2},1024)):(g(),L(`span`,kt,`—`))]),"item.target_path":y(({item:e})=>[Zn.value===e.id?(g(),L(`div`,{key:0,class:`d-flex align-center ga-1`,onClick:r[5]||=I(()=>{},[`stop`])},[M(z,{modelValue:Qn.value,"onUpdate:modelValue":r[4]||=e=>Qn.value=e,density:`compact`,variant:`outlined`,"hide-details":``,placeholder:`/www/wwwroot`,style:{"max-width":`140px`},onKeyup:[Oe(t=>ar(e.id),[`enter`]),Oe(ir,[`esc`])]},null,8,[`modelValue`,`onKeyup`]),M(S,{icon:`mdi-check`,size:`x-small`,variant:`text`,color:`primary`,loading:$n.value===e.id,onClick:t=>ar(e.id)},null,8,[`loading`,`onClick`]),M(S,{icon:`mdi-close`,size:`x-small`,variant:`text`,onClick:ir})])):(g(),L(`div`,At,[B(`span`,{class:`text-caption text-medium-emphasis text-truncate d-inline-block`,style:{"max-width":`140px`},title:e.target_path||`未配置`},p(e.target_path?.trim()||`—`),9,jt),M(S,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑目标路径`,onClick:I(t=>rr(e),[`stop`])},null,8,[`onClick`])]))]),"item.agent_version":y(({item:e})=>[B(`span`,Mt,p(e.agent_version||`—`),1)]),"item.last_heartbeat":y(({item:e})=>[B(`span`,Nt,p(D(Ze)(e.last_heartbeat)),1)]),"item.actions":y(({item:e})=>[B(`div`,Pt,[M(S,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:I(t=>Rn(e),[`stop`])},{default:y(()=>[...r[55]||=[N(`终端`,-1)]]),_:1},8,[`onClick`]),M(S,{variant:`text`,size:`x-small`,density:`compact`,onClick:I(t=>zn(e),[`stop`])},{default:y(()=>[...r[56]||=[N(`文件`,-1)]]),_:1},8,[`onClick`]),M(S,{variant:`text`,size:`x-small`,density:`compact`,onClick:I(t=>Tr(e),[`stop`])},{default:y(()=>[...r[57]||=[N(`编辑`,-1)]]),_:1},8,[`onClick`]),M(S,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:I(t=>Er(e),[`stop`])},{default:y(()=>[...r[58]||=[N(`删除`,-1)]]),_:1},8,[`onClick`])])]),"no-data":y(()=>[...r[59]||=[B(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无服务器数据`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`,`items-per-page`,`modelValue`,`sort-by`,`onUpdate:sortBy`,`onUpdate:page`,`onUpdate:itemsPerPage`])):(g(),L(`div`,Ft,[we.value?(g(),L(`div`,It,[M(F,{indeterminate:``,size:`32`}),r[60]||=B(`div`,{class:`text-caption text-medium-emphasis mt-2`},`按分类加载中…`,-1)])):ke.value.length===0?(g(),L(`div`,Lt,` 暂无服务器数据 `)):(g(),A(st,{key:2,modelValue:Te.value,"onUpdate:modelValue":r[11]||=e=>Te.value=e,multiple:``,variant:`accordion`},{default:y(()=>[(g(!0),L(R,null,Pe(ke.value,t=>(g(),A(at,{key:t.category},{default:y(()=>[M(ot,null,{default:y(()=>[B(`div`,Rt,[M(_,{color:`primary`,variant:`tonal`,size:`small`,label:``},{default:y(()=>[N(p(t.label),1)]),_:2},1024),B(`span`,zt,p(t.servers.length)+` 台`,1),M(b),M(S,{size:`x-small`,variant:`text`,onClick:I(e=>Le(t.servers),[`stop`])},{default:y(()=>[N(p(Ie(t.servers)?`取消本组`:`全选本组`),1)]),_:2},1032,[`onClick`])])]),_:2},1024),M(it,null,{default:y(()=>[M(e,{density:`compact`,hover:``},{default:y(()=>[r[62]||=B(`thead`,null,[B(`tr`,null,[B(`th`,{style:{width:`40px`}}),B(`th`,null,`状态`),B(`th`,null,`名称`),B(`th`,null,`地址`),B(`th`,null,`目标路径`),B(`th`,{class:`text-end`},`操作`)])],-1),B(`tbody`,null,[(g(!0),L(R,null,Pe(t.servers,e=>(g(),L(`tr`,{key:e.id,class:`cursor-pointer`,onClick:t=>wr(e)},[B(`td`,{onClick:r[9]||=I(()=>{},[`stop`])},[M(a,{"model-value":X.value.has(e.id),density:`compact`,"hide-details":``,"onUpdate:modelValue":t=>je(e.id,t)},null,8,[`model-value`,`onUpdate:modelValue`])]),B(`td`,null,[M(_,{color:D(Qe)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:y(()=>[N(p(D(Xe)(e.status)),1)]),_:2},1032,[`color`])]),B(`td`,Vt,p(e.name),1),B(`td`,Ht,p(e.domain)+`:`+p(e.port),1),B(`td`,Ut,p(e.target_path?.trim()||`—`),1),B(`td`,{class:`text-end`,onClick:r[10]||=I(()=>{},[`stop`])},[M(S,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>Tr(e)},{default:y(()=>[...r[61]||=[N(`编辑`,-1)]]),_:1},8,[`onClick`])])],8,Bt))),128))])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1},8,[`modelValue`]))]))]),_:1}),M(C,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:y(()=>[M(m,{class:`d-flex align-center`},{default:y(()=>[r[64]||=N(` 连接失败列表 `,-1),U.value.length?(g(),A(_,{key:0,size:`small`,class:`ml-2`,color:`error`,variant:`tonal`,label:``},{default:y(()=>[N(p(U.value.length),1)]),_:1})):j(``,!0),M(b),M(S,{variant:`text`,size:`small`,"prepend-icon":`mdi-refresh`,loading:K.value,onClick:sn},{default:y(()=>[...r[63]||=[N(` 刷新 `,-1)]]),_:1},8,[`loading`])]),_:1}),M(t,{items:U.value,headers:xt,loading:K.value,hover:``,density:`comfortable`,"items-per-page":10},{"item.address":y(({item:e})=>[B(`span`,Wt,p(e.domain)+`:`+p(e.port),1)]),"item.last_attempt_at":y(({item:e})=>[B(`span`,Gt,p(D(Ze)(e.last_attempt_at)),1)]),"item.last_error":y(({item:e})=>[B(`span`,{class:`text-caption text-error text-truncate d-inline-block`,style:{"max-width":`320px`},title:e.last_error},p(e.last_error||`—`),9,Kt)]),"item.actions":y(({item:e})=>[M(S,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,loading:ut.value===e.id,onClick:t=>ln(e)},{default:y(()=>[...r[65]||=[N(` 重试 `,-1)]]),_:1},8,[`loading`,`onClick`]),M(S,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>un(e)},{default:y(()=>[...r[66]||=[N(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":y(()=>[...r[67]||=[B(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无连接失败记录`,-1)]]),_:1},8,[`items`,`loading`])]),_:1}),M(se,null,{default:y(()=>[Z.value?(g(),A(C,{key:0,class:`mt-4`,elevation:`0`,border:``,rounded:`lg`},{default:y(()=>[M(m,{class:`d-flex align-center`},{default:y(()=>[M(Ue,{class:`mr-2`},{default:y(()=>[...r[68]||=[N(`mdi-information-outline`,-1)]]),_:1}),N(` `+p(Z.value.name)+` `,1),M(_,{color:D(Qe)(Z.value.status),size:`small`,variant:`tonal`,label:``,class:`ml-2`},{default:y(()=>[N(p(D(Xe)(Z.value.status)),1)]),_:1},8,[`color`]),M(b),M(S,{icon:`mdi-close`,size:`small`,variant:`text`,onClick:r[12]||=e=>Z.value=null})]),_:1}),M(me),M(nt,{modelValue:On.value,"onUpdate:modelValue":r[13]||=e=>On.value=e,density:`compact`},{default:y(()=>[M(J,{value:`info`},{default:y(()=>[...r[69]||=[N(`系统信息`,-1)]]),_:1}),M(J,{value:`logs`},{default:y(()=>[...r[70]||=[N(`同步日志`,-1)]]),_:1})]),_:1},8,[`modelValue`]),M(tt,{modelValue:On.value,"onUpdate:modelValue":r[14]||=e=>On.value=e},{default:y(()=>[M(et,{value:`info`},{default:y(()=>[M(W,null,{default:y(()=>[M(f,{dense:``},{default:y(()=>[M(d,{cols:`6`,md:`3`},{default:y(()=>[r[71]||=B(`div`,{class:`text-caption text-medium-emphasis`},`CPU`,-1),B(`div`,qt,p(Z.value.system_info?.cpu_usage??`—`)+`%`,1)]),_:1}),M(d,{cols:`6`,md:`3`},{default:y(()=>[r[72]||=B(`div`,{class:`text-caption text-medium-emphasis`},`内存`,-1),B(`div`,Jt,p(Z.value.system_info?.mem_usage??`—`)+`%`,1)]),_:1}),M(d,{cols:`6`,md:`3`},{default:y(()=>[r[73]||=B(`div`,{class:`text-caption text-medium-emphasis`},`磁盘`,-1),B(`div`,Yt,p(Z.value.system_info?.disk_usage??`—`)+`%`,1)]),_:1}),M(d,{cols:`6`,md:`3`},{default:y(()=>[r[74]||=B(`div`,{class:`text-caption text-medium-emphasis`},`Agent`,-1),B(`div`,Xt,p(Z.value.agent_version||`未安装`),1)]),_:1}),M(d,{cols:`12`,md:`6`},{default:y(()=>[r[75]||=B(`div`,{class:`text-caption text-medium-emphasis`},`目标路径`,-1),B(`div`,Zt,p(Z.value.target_path?.trim()||`未配置(推送页留空时无法推送到此机)`),1)]),_:1})]),_:1})]),_:1})]),_:1}),M(et,{value:`logs`},{default:y(()=>[M(W,null,{default:y(()=>[An.value?(g(),L(`div`,Qt,[M(F,{indeterminate:``,size:`24`})])):kn.value.length===0?(g(),L(`div`,$t,`暂无同步日志`)):(g(),A(be,{key:2,density:`compact`},{default:y(()=>[(g(!0),L(R,null,Pe(kn.value,e=>(g(),A(ie,{key:e.id,subtitle:Nn(e),title:`${e.source_path}${e.target_path}`},{append:y(()=>[M(_,{size:`x-small`,color:jn(e.status),variant:`tonal`,label:``},{default:y(()=>[N(p(Mn(e.status)),1)]),_:2},1032,[`color`])]),_:2},1032,[`subtitle`,`title`]))),128))]),_:1}))]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1})):j(``,!0)]),_:1}),M(mt,{modelValue:D(fn),"onUpdate:modelValue":r[15]||=e=>ve(fn)?fn.value=e:null,form:D(pn),"is-editing":D(mn),saving:D(hn),"lookups-loading":D(gn),"password-presets":D(_n),"ssh-key-presets":D(vn),"category-options":D(yn),platforms:D(bn),nodes:D(xn),"edit-hints":D(Sn),"files-elevation-items":D(Cn),onSave:D(Dn)},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(q,{modelValue:Re.value,"onUpdate:modelValue":r[17]||=e=>Re.value=e,"max-width":`400`},{default:y(()=>[M(C,{border:``},{default:y(()=>[M(m,null,{default:y(()=>[...r[76]||=[N(`确认删除`,-1)]]),_:1}),M(W,null,{default:y(()=>[r[77]||=N(`确定要删除服务器 `,-1),B(`strong`,null,p(He.value?.name),1),r[78]||=N(` 吗?`,-1)]),_:1}),M(v,null,{default:y(()=>[M(b),M(S,{variant:`text`,onClick:r[16]||=e=>Re.value=!1},{default:y(()=>[...r[79]||=[N(`取消`,-1)]]),_:1}),M(S,{color:`error`,variant:`flat`,onClick:Dr,loading:ze.value},{default:y(()=>[...r[80]||=[N(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(q,{modelValue:We.value,"onUpdate:modelValue":r[22]||=e=>We.value=e,"max-width":`480`,persistent:``},{default:y(()=>[M(C,{border:``},{default:y(()=>[M(m,null,{default:y(()=>[...r[81]||=[N(`快速添加服务器(仅 IP`,-1)]]),_:1}),M(W,null,{default:y(()=>[r[82]||=B(`p`,{class:`text-body-2 text-medium-emphasis mb-3`},` 将按顺序轮询凭据管理中的全部密码预设与 SSH 密钥预设尝试登录,首个成功即加入服务器列表。 `,-1),M(z,{modelValue:H.value.domain,"onUpdate:modelValue":r[18]||=e=>H.value.domain=e,label:`IP 或域名`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`192.168.1.10`,rules:[e=>!!e?.trim()||`必填`]},null,8,[`modelValue`,`rules`]),M(z,{modelValue:H.value.port,"onUpdate:modelValue":r[19]||=e=>H.value.port=e,modelModifiers:{number:!0},label:`SSH 端口`,variant:`outlined`,density:`compact`,type:`number`,class:`mb-2`},null,8,[`modelValue`]),M(z,{modelValue:H.value.name,"onUpdate:modelValue":r[20]||=e=>H.value.name=e,label:`显示名称(可选)`,variant:`outlined`,density:`compact`,hint:`留空则使用 IP`,"persistent-hint":``},null,8,[`modelValue`])]),_:1}),M(v,null,{default:y(()=>[M(b),M(S,{variant:`text`,disabled:V.value,onClick:r[21]||=e=>We.value=!1},{default:y(()=>[...r[83]||=[N(`取消`,-1)]]),_:1},8,[`disabled`]),M(S,{color:`primary`,variant:`flat`,loading:V.value,onClick:cn},{default:y(()=>[...r[84]||=[N(`开始轮询`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(q,{modelValue:ft.value,"onUpdate:modelValue":r[24]||=e=>ft.value=e,"max-width":`560`},{default:y(()=>[M(C,{border:``},{default:y(()=>[M(m,{class:`text-error`},{default:y(()=>[...r[85]||=[N(`SSH 连接失败`,-1)]]),_:1}),M(W,null,{default:y(()=>[r[86]||=B(`p`,{class:`text-body-2 mb-3`},`已尝试全部凭据预设,均未登录成功。该服务器已加入「连接失败列表」,可稍后重试。`,-1),ht.value.length?(g(),A(be,{key:0,density:`compact`,class:`bg-grey-lighten-4 rounded`},{default:y(()=>[(g(!0),L(R,null,Pe(ht.value,(e,t)=>(g(),A(ie,{key:t},{default:y(()=>[M(Me,{class:`text-body-2`},{default:y(()=>[N(` [`+p(e.preset_type===`password`?`密码`:e.preset_type===`system`?`系统`:`密钥`)+`] `+p(e.preset_name)+` (`+p(e.username)+`) `,1)]),_:2},1024),M(ue,{class:`text-error`},{default:y(()=>[N(p(e.error),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})):(g(),L(`p`,en,p(gt.value),1))]),_:1}),M(v,null,{default:y(()=>[M(b),M(S,{color:`primary`,variant:`flat`,onClick:r[23]||=e=>ft.value=!1},{default:y(()=>[...r[87]||=[N(`知道了`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(q,{modelValue:_t.value,"onUpdate:modelValue":r[26]||=e=>_t.value=e,"max-width":`400`},{default:y(()=>[M(C,{border:``},{default:y(()=>[M(m,null,{default:y(()=>[...r[88]||=[N(`确认删除`,-1)]]),_:1}),M(W,null,{default:y(()=>[r[89]||=N(`从失败列表移除 `,-1),B(`strong`,null,p(vt.value?.domain),1),r[90]||=N(``,-1)]),_:1}),M(v,null,{default:y(()=>[M(b),M(S,{variant:`text`,onClick:r[25]||=e=>_t.value=!1},{default:y(()=>[...r[91]||=[N(`取消`,-1)]]),_:1}),M(S,{color:`error`,variant:`flat`,loading:yt.value,onClick:dn},{default:y(()=>[...r[92]||=[N(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(q,{modelValue:Kn.value,"onUpdate:modelValue":r[28]||=e=>Kn.value=e,"max-width":`480`},{default:y(()=>[M(C,{border:``},{default:y(()=>[M(m,null,{default:y(()=>[...r[93]||=[N(`自动检测目标路径`,-1)]]),_:1}),M(W,null,{default:y(()=>[B(`p`,tn,[r[94]||=N(` 将对选中的 `,-1),B(`strong`,null,p(X.value.size),1),r[95]||=N(` 台服务器执行 SSH 检测。 `,-1)]),r[96]||=B(`p`,{class:`text-body-2 text-medium-emphasis mb-0`},[N(` 在远程 `),B(`code`,null,`/www/wwwroot`),N(` 下搜索 `),B(`code`,null,`workerman.bat`),N(`,找到后将所在目录写入各服务器的 `),B(`strong`,null,`target_path`),N(`(找到第一个即停止)。 `)],-1)]),_:1}),M(v,null,{default:y(()=>[M(b),M(S,{variant:`text`,onClick:r[27]||=e=>Kn.value=!1},{default:y(()=>[...r[97]||=[N(`取消`,-1)]]),_:1}),M(S,{color:`primary`,variant:`flat`,onClick:sr},{default:y(()=>[...r[98]||=[N(`开始检测`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(bt,{modelValue:qn.value,"onUpdate:modelValue":r[29]||=e=>qn.value=e,title:Yn.value,loading:Jn.value,results:Xn.value},null,8,[`modelValue`,`title`,`loading`,`results`]),M(q,{modelValue:Bn.value,"onUpdate:modelValue":r[32]||=e=>Bn.value=e,"max-width":`420`},{default:y(()=>[M(C,{border:``},{default:y(()=>[M(m,null,{default:y(()=>[...r[99]||=[N(`批量修改分类`,-1)]]),_:1}),M(W,null,{default:y(()=>[B(`div`,nn,` 已选择 `+p(X.value.size)+` 台服务器,将统一设置为以下分类(留空表示清除分类)。 `,1),M(pt,{modelValue:Vn.value,"onUpdate:modelValue":r[30]||=e=>Vn.value=e,items:Un.value,label:`分类`,variant:`outlined`,density:`compact`,clearable:``,"hide-details":``,placeholder:`输入或选择分类`},null,8,[`modelValue`,`items`])]),_:1}),M(v,null,{default:y(()=>[M(b),M(S,{variant:`text`,onClick:r[31]||=e=>Bn.value=!1},{default:y(()=>[...r[100]||=[N(`取消`,-1)]]),_:1}),M(S,{color:`primary`,variant:`flat`,loading:Hn.value,onClick:Gn},{default:y(()=>[...r[101]||=[N(` 确认 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),M(q,{modelValue:mr.value,"onUpdate:modelValue":r[37]||=e=>mr.value=e,"max-width":`560`},{default:y(()=>[M(C,{border:``},{default:y(()=>[M(m,null,{default:y(()=>[...r[102]||=[N(`批量添加服务器`,-1)]]),_:1}),M(W,null,{default:y(()=>[r[103]||=B(`div`,{class:`text-body-2 text-medium-emphasis mb-3`},` 每行一个 IP 或域名;也可使用「名称 + Tab + IP」附带显示名称。空白行自动忽略,重复地址自动去重(不区分大小写)。SSH 凭据从「凭据管理」预设轮询匹配;连接失败将进入下方「连接失败列表」。 `,-1),M(Je,{modelValue:hr.value,"onUpdate:modelValue":r[33]||=e=>hr.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`]),xr.value.unique>0?(g(),L(`div`,rn,[N(` 将添加 `+p(xr.value.unique)+` 台 `,1),xr.value.deduped>0?(g(),L(`span`,an,`(已去重 `+p(xr.value.deduped)+` 个重复)`,1)):j(``,!0)])):j(``,!0),M(f,{dense:``,class:`mt-1`},{default:y(()=>[M(d,{cols:`6`},{default:y(()=>[M(z,{modelValue:gr.value,"onUpdate:modelValue":r[34]||=e=>gr.value=e,modelModifiers:{number:!0},label:`SSH 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1}),M(d,{cols:`6`},{default:y(()=>[M(z,{modelValue:_r.value,"onUpdate:modelValue":r[35]||=e=>_r.value=e,modelModifiers:{number:!0},label:`Agent 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1})]),_:1}),$.value?(g(),A(Ce,{key:1,type:$.value.pending>0?`warning`:`success`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:y(()=>[N(` 共 `+p($.value.total)+` 台:成功 `+p($.value.created)+`,待连接 `+p($.value.pending)+`,跳过 `+p($.value.skipped)+` `,1),($.value.duplicates_removed??0)>0?(g(),L(`span`,on,` (输入 `+p($.value.input_lines)+` 行,去重 `+p($.value.duplicates_removed)+` 个) `,1)):j(``,!0)]),_:1},8,[`type`])):j(``,!0)]),_:1}),M(v,null,{default:y(()=>[M(b),M(S,{variant:`text`,onClick:r[36]||=e=>mr.value=!1},{default:y(()=>[...r[104]||=[N(`关闭`,-1)]]),_:1}),M(S,{color:`primary`,variant:`flat`,onClick:Cr,loading:vr.value,disabled:!hr.value.trim()},{default:y(()=>[...r[105]||=[N(` 开始添加 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{sn as default};