Files
Nexus/web/app/assets/ServersPage-C8k0CwrR.js
T
Nexus Agent fe8b24ca0b fix(notify): 资源恢复 Telegram 联动 CPU/内存/磁盘开关
关闭分项告警后不再推送对应恢复消息;仪表盘移除服务器列表并更新设置页说明。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 13:22:38 +08:00

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