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