f127f07ab2
rdp_hosts 表与专用 API,在 3389远程页添加/连接,不再依赖子机列表。 Co-authored-by: Cursor <cursoragent@cursor.com>
5 lines
98 KiB
JavaScript
5 lines
98 KiB
JavaScript
import{a as e,t}from"./VDataTable-xIamJ7nl.js";import{n,t as r}from"./useSnackbar-yP7apGY8.js";import{n as i,t as a}from"./VRow-DQSkwKSy.js";import{$r as o,Cr as s,Ct as c,Er as l,F as u,Hn as d,I as f,In as p,Ir as m,It as ee,Jn as h,K as g,Kn as _,Kr as v,Mr as y,Nr as b,Or as x,Pt as te,Q as ne,Qr as S,Rr as C,S as re,Sr as w,St as ie,Tr as T,Ur as E,Vn as ae,Vr as D,Yr as O,Z as oe,Zr as k,_ as A,an as se,ar as ce,br as j,bt as le,ci as ue,d as de,di as M,en as N,et as fe,f as pe,g as me,gr as P,h as F,hi as I,hn as he,hr as L,ii as R,in as ge,kn as z,l as _e,m as ve,mi as ye,mr as be,n as xe,nr as Se,oi as Ce,or as we,p as Te,pi as Ee,pn as De,pr as Oe,qt as ke,r as Ae,rr as je,sr as Me,t as Ne,tt as Pe,ut as Fe,v as B,vn as Ie,wn as V,xn as H,xr as U,y as W,yr as G,zr as Le}from"./index-_6O5JL4W.js";import{a as Re,c as ze,i as Be,l as Ve,n as He,o as Ue,p as We,r as Ge,s as Ke,t as qe}from"./StatCardsRow-BGQi59My.js";import{t as K}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as Je}from"./usePageActivateRefresh-CzjzBWP4.js";import{n as Ye,t as Xe}from"./dataTable-esDY4cOk.js";import{n as Ze}from"./paginatedFetch-BvAUiQXI.js";import{S as Qe,_ as q,b as J,h as $e,n as et,p as tt,t as Y,v as X}from"./VTextField-CD7WwKb1.js";import{a as nt,c as rt,d as it,i as at,l as ot,n as st,o as ct,r as lt,s as ut,t as dt,u as ft}from"./VSelect-CDx3fXFa.js";import{t as pt}from"./VDataTableServer-lHUUBg35.js";import{t as Z}from"./apiError-cM_GzSSg.js";import{t as mt}from"./labels-C-A2d08W.js";import{t as ht}from"./VSkeletonLoader-dGuFYK7d.js";import{t as gt}from"./VDialog-DEJqI2_G.js";import{t as _t}from"./VFileInput-B15eM8mB.js";import{r as vt}from"./validation-BMzYTJL4.js";import{n as yt,t as bt}from"./useServerCategories-PByuvSRp.js";import{t as xt}from"./VTextarea-Chu9xRUJ.js";import{t as St}from"./usePageAutoRefresh-DLhUSsyH.js";import{i as Ct,n as wt,r as Tt,t as Et}from"./VExpansionPanels-D4bNYoOX.js";var Dt={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 Ot(e){if(!e.length)return{};let t=Dt[e[0].key];return t?{sort_by:t,sort_order:e[0].order}:{}}function kt(e){let t=e?.targetPathUnset,n=R([]),r=R(!1),i=R(1),a=R(20),o=R(0),s=R(``),c=R(``),l=R(null),u=R([]);function d(){let e=s.value.trim(),n=t!==void 0&&!e;return{search:e||void 0,...!e&&c.value?{category:c.value}:{},...!e&&l.value!==null?{is_online:l.value}:{},...Ot(u.value),...n?{target_path_unset:t}:{}}}async function f(e){e?.silent||(r.value=!0);try{let e=await Ze(`/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;Le(()=>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){c.value=e,i.value=1,f()}function _(e){l.value=e,i.value=1,f()}function v(){l.value!==null&&(l.value=null,i.value=1,f())}O(u,()=>{i.value=1,f()},{deep:!0});async function y(){return(await Ze(`/servers/`,d(),1,-1)).items}return{servers:n,loading:r,page:i,itemsPerPage:a,total:o,search:s,categoryFilter:c,isOnlineFilter:l,sortBy:u,loadServers:f,onSearch:m,onPageChange:ee,onItemsPerPageChange:h,onCategoryChange:g,onOnlineFilterChange:_,clearOnlineFilter:v,loadAllServers:y,listQueryParams:d}}function At(e){let t=(e??``).trim();return t===``||t===`/www/wwwroot`}function jt(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 Mt(e){let t=[];for(let n of e){let e=jt(typeof n==`object`&&n&&`id`in n?n.id:n);e!==null&&t.push(e)}return[...new Set(t)]}var Nt=z({alwaysFilter:Boolean,autoSelectFirst:{type:[Boolean,String]},clearOnSelect:{type:Boolean,default:!0},delimiters:Array,...nt({filterKeys:[`title`]}),...st({hideNoData:!0,returnObject:!0}),...je(et({modelValue:null,role:`combobox`}),[`validationValue`,`dirty`])},`VCombobox`),Pt=V()({name:`VCombobox`,props:Nt(),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}=De(),i=R(),a=Ce(!1),o=Ce(!0),s=Ce(!1),c=R(),u=R(),f=Ce(-1),m=!1,{items:ee,transformIn:g,transformOut:_}=pe(e),{textColorClasses:v,textColorStyles:x}=Fe(()=>i.value?.color),{InputIcon:te}=$e(e),S=he(e,`modelValue`,[],e=>g(ce(e)),t=>{let n=_(t);return e.multiple?n:n[0]??null}),C=tt(e),w=ue(()=>e.closableChips&&!C.isReadonly.value&&!C.isDisabled.value),ie=G(()=>!!(e.chips||n.chip)),E=G(()=>ie.value||!!n.selection),D=Ce(!e.multiple&&!E.value?S.value[0]?.title??``:``),oe=Ce(null),k=G({get:()=>D.value,set:async t=>{if(D.value=t??``,t===null||t===``&&!e.multiple&&!E.value?S.value=[]:!e.multiple&&!E.value&&(S.value=[de(e,t)],b(()=>u.value?.scrollToIndex(0))),t&&e.multiple&&e.delimiters?.length){let e=Ke(t);e.length>1&&(qe(e),D.value=``)}t||(f.value=-1),o.value=!t}}),A=G(()=>typeof e.counterValue==`function`?e.counterValue(S.value):typeof e.counterValue==`number`?e.counterValue:e.multiple?S.value.length:k.value.length),{filteredItems:se,getMatches:le}=ct(e,ee,()=>oe.value??(e.alwaysFilter||!o.value?k.value:``)),M=G(()=>e.hideSelected&&oe.value===null?se.value.filter(e=>!S.value.some(t=>t.value===e.value)):se.value),N=G(()=>e.hideNoData&&!M.value.length||C.isReadonly.value||C.isDisabled.value),me=he(e,`menu`),F=G({get:()=>me.value,set:e=>{me.value&&!e&&c.value?.ΨopenChildren.size||e&&N.value||(me.value=e)}}),{menuId:I,ariaExpanded:L,ariaControls:ge}=lt(e,F);O(D,e=>{m?b(()=>m=!1):a.value&&!F.value&&(F.value=!0),t(`update:search`,e)}),O(S,t=>{!e.multiple&&!E.value&&(D.value=t[0]?.title??``)});let z=G(()=>S.value.map(e=>e.value)),be=G(()=>M.value.find(e=>e.type===`item`&&!e.props.disabled)),Oe=G(()=>(e.autoSelectFirst===!0||e.autoSelectFirst===`exact`&&k.value===be.value?.title)&&M.value.length>0&&!o.value&&!s.value),ke=R(),je=R(),Me=R(),Pe=rt(ke,i),V=ot(F,()=>c.value?.contentEl,()=>i.value?.controlRef),{onTabKeydown:U}=ut({groups:[{type:`element`,contentRef:je},{type:`list`,contentRef:ke,displayItemsCount:()=>M.value.length},{type:`element`,contentRef:Me}],onLeave:()=>{F.value=!1,i.value?.focus()}});function Le(t){m=!0,b(()=>m=!1),e.openOnClear&&(F.value=!0)}function Re(){N.value||(F.value=!0)}function ze(e){N.value||(a.value&&(e.preventDefault(),e.stopPropagation()),F.value=!F.value)}function Be(e){e.key===`Tab`&&U(e),ke.value?.$el.contains(e.target)&&(p(e)||e.key===`Backspace`)&&i.value?.focus()}function Ve(t){if(h(t)||C.isReadonly.value)return;let n=i.value?.selectionStart,r=S.value.length;if([`Enter`,`ArrowDown`,`ArrowUp`].includes(t.key)&&t.preventDefault(),[`Enter`,`ArrowDown`].includes(t.key)&&(F.value=!0),[`Escape`].includes(t.key)&&(F.value=!1),Oe.value&&[`Enter`,`Tab`].includes(t.key)&&be.value&&!S.value.some(({value:e})=>e===be.value.value)&&Ge(be.value),t.key===`ArrowDown`&&Oe.value&&ke.value?.focus(`next`),t.key===`Enter`&&k.value&&(Ge(de(e,k.value),!0,!0),E.value&&(D.value=``)),[`Backspace`,`Delete`].includes(t.key)){if(!e.multiple&&E.value&&S.value.length>0&&!k.value)return Ge(S.value[0],!1);if(~f.value){t.preventDefault();let e=f.value;Ge(S.value[f.value],!1),f.value=e>=r-1?r-2:e}else t.key===`Backspace`&&!k.value&&(f.value=r-1);return}if(e.multiple)if(t.key===`ArrowLeft`){if(f.value<0&&n&&n>0)return;let e=f.value>-1?f.value-1:r-1;S.value[e]?f.value=e:(f.value=-1,i.value?.setSelectionRange(k.value.length,k.value.length))}else if(t.key===`ArrowRight`){if(f.value<0)return;let e=f.value+1;S.value[e]?f.value=e:(f.value=-1,i.value?.setSelectionRange(0,0))}else ~f.value&&p(t)&&(f.value=-1)}function He(t){let n=Ke(t?.clipboardData?.getData(`Text`)??``);n.length>1&&e.multiple&&(t.preventDefault(),qe(n))}function Ue(){e.eager&&u.value?.calculateVisibleItems()}function We(){a.value&&(c.value?.contentEl?._clickOutside?.lastMousedownWasOutside?a.value=!1:i.value?.focus()),o.value=!0,oe.value=null}function Ge(t,n=!0,r=!1){if(!(!t||t.props.disabled))if(e.multiple){let r=S.value.findIndex(n=>(e.valueComparator||H)(n.value,t.value)),i=n??!~r;if(~r){let e=i?[...S.value,t]:[...S.value];e.splice(r,1),S.value=e}else i&&(S.value=[...S.value,t]);e.clearOnSelect&&(k.value=``)}else{let i=n!==!1;S.value=i?[t]:[],(!o.value||e.alwaysFilter)&&D.value&&(oe.value=D.value),D.value=i&&!E.value?t.title:``,b(()=>{F.value=r,o.value=!0})}}function Ke(t){let n=[`
|
||
`,...e.delimiters??[]].map(d).join(`|`);return t.split(RegExp(`(?:${n})+`))}async function qe(t){for(let n of t)n=n.trim(),n&&(Ge(de(e,n)),await b())}function K(e){a.value=!0,setTimeout(()=>{s.value=!0})}function Je(e){if(s.value=!1,!i.value?.$el.contains(e.relatedTarget)){if(V(e))return;a.value=!1}}let Ye=0;function Xe(){Ye=performance.now()}function Ze(e){let t=e.relatedTarget;((c.value?.contentEl)?.contains(t)||!t&&performance.now()-Ye<10)&&(a.value=!0)}return O(a,(t,n)=>{if(!(t||t===n)&&(f.value=-1,F.value=!1,k.value)){if(e.multiple){Ge(de(e,k.value));return}if(!E.value)return;S.value.some(({title:e})=>e===k.value)?D.value=``:Ge(de(e,k.value))}}),O(F,t=>{if(!e.hideSelected&&t&&S.value.length&&o.value){let t=M.value.findIndex(t=>S.value.some(n=>(e.valueComparator||H)(n.value,t.value)));we&&window.requestAnimationFrame(()=>{t>=0&&u.value?.scrollToIndex(t)})}t&&(oe.value=null)}),O(ee,(e,t)=>{F.value||a.value&&!t.length&&e.length&&(F.value=!0)}),Ie(()=>{let t=!!(!e.hideNoData||M.value.length||n[`prepend-item`]||n[`append-item`]||n[`no-data`]),s=S.value.length>0,d=Y.filterProps(e),p={search:k,filteredItems:se.value};return l(Y,y({ref:i},d,{modelValue:k.value,"onUpdate:modelValue":e=>k.value=e,focused:a.value,"onUpdate:focused":e=>a.value=e,validationValue:S.externalValue,counterValue:A.value,dirty:s,class:[`v-combobox`,{"v-combobox--active-menu":F.value,"v-combobox--chips":!!e.chips,"v-combobox--selection-slot":!!E.value,"v-combobox--selecting-index":f.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":Le,"onMousedown:control":Re,onKeydown:Ve,onPaste:He,onBlur:Ze,"aria-expanded":L.value,"aria-controls":ge.value}),{...n,default:({id:i})=>j(P,null,[l(xe,y({id:I.value,ref:c,modelValue:F.value,"onUpdate:modelValue":e=>F.value=e,activator:`parent`,disabled:N.value,eager:e.eager,maxHeight:310,openOnClick:!1,closeOnContentClick:!1,onAfterEnter:Ue,onAfterLeave:We},e.menuProps,{contentClass:[`v-combobox__content`,e.menuProps?.contentClass]}),{default:()=>[l(Ne,{elevation:e.menuElevation,onFocusin:K,onKeydown:Be,onMousedown:Xe},{default:()=>[n[`menu-header`]&&j(`header`,{ref:je},[n[`menu-header`](p)]),t&&l(_e,y({key:`combobox-list`,ref:ke,filterable:!0,selected:z.value,selectStrategy:e.multiple?`independent`:`single-independent`,onMousedown:e=>e.preventDefault(),selectable:!!M.value.length,onFocusout:Je,tabindex:`-1`,"aria-live":`polite`,"aria-labelledby":`${i.value}-label`,"aria-multiselectable":e.multiple,color:e.itemColor??e.color},Pe,e.listProps),{default:()=>[n[`prepend-item`]?.(),!M.value.length&&!e.hideNoData&&(n[`no-data`]?.()??l(ve,{key:`no-data`,title:r(e.noDataText)},null)),l(ft,{ref:u,renderless:!0,items:M.value,itemKey:`value`},{default:({item:t,index:r,itemRef:i})=>{let a=y(t.props,{ref:i,key:t.value,active:Oe.value&&t===be.value?!0:void 0,onClick:()=>Ge(t,null),"aria-posinset":r+1,"aria-setsize":M.value.length});return t.type===`divider`?n.divider?.({props:t.raw,index:r})??l(B,y(t.props,{key:`divider-${r}`}),null):t.type===`subheader`?n.subheader?.({props:t.raw,index:r})??l(Te,y(t.props,{key:`subheader-${r}`}),null):n.item?.({item:t.raw,internalItem:t,index:r,props:a})??l(ve,y(a,{role:`option`}),{prepend:({isSelected:n})=>j(P,null,[e.multiple&&!e.hideSelected?l(it,{key:t.value,modelValue:n,ripple:!1,tabindex:`-1`,"aria-hidden":!0,onClick:e=>e.preventDefault()},null):void 0,t.props.prependAvatar&&l(re,{image:t.props.prependAvatar},null),t.props.prependIcon&&l(ne,{icon:t.props.prependIcon},null)]),title:()=>o.value?t.title:at(`v-combobox`,t.title,le(t)?.title)})}}),n[`append-item`]?.()]}),n[`menu-footer`]&&j(`footer`,{ref:Me},[n[`menu-footer`](p)])]})]}),S.value.map((t,r)=>{function i(e){e.stopPropagation(),e.preventDefault(),Ge(t,!1)}let a=y(W.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=ie.value?!!n.chip:!!n.selection,s=o?ae(ie.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:Ee([`v-combobox__selection`,r===f.value&&[`v-combobox__selection--selected`,v.value]]),style:ye(r===f.value?x.value:{})},[ie.value?n.chip?l(fe,{key:`chip-defaults`,defaults:{VChip:{closable:w.value,size:`small`,text:t.title}}},{default:()=>[s]}):l(W,y({key:`chip`,closable:w.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<S.value.length-1&&j(`span`,{class:`v-combobox__selection-comma`},[T(`,`)])])])})]),"append-inner":(...t)=>j(P,null,[n[`append-inner`]?.(...t),(!e.hideNoData||e.items.length)&&e.menuIcon?l(ne,{class:`v-combobox__menu-icon`,color:i.value?.fieldIconColor,icon:e.menuIcon,onMousedown:ze,onClick:Se,"aria-hidden":!0,tabindex:`-1`},null):void 0,e.appendInnerIcon&&l(te,{key:`append-icon`,name:`appendInner`,color:t[0].iconColor.value},null)])})}),Ae({isFocused:a,isPristine:o,menu:F,search:k,selectionIndex:f,filteredItems:se,select:Ge},i)}}),Ft=x({__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,o=G(()=>n.form.preset_id||n.isEditing?[]:[vt(`SSH 密码或选择密码预设`)]),c=G(()=>n.form.ssh_key_preset_id||n.isEditing?[]:[vt(`私钥或选择 SSH 密钥预设`)]);return(t,n)=>(D(),U(gt,{"model-value":e.modelValue,"max-width":`720`,scrollable:``,persistent:``,"onUpdate:modelValue":n[18]||=e=>r(`update:modelValue`,e)},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,{class:`d-flex align-center`},{default:k(()=>[T(I(e.isEditing?`编辑服务器`:`添加服务器`)+` `,1),l(A),l(f,{icon:`mdi-close`,variant:`text`,size:`small`,disabled:e.saving,onClick:n[0]||=e=>r(`update:modelValue`,!1)},null,8,[`disabled`])]),_:1}),l(B),l(X,{class:`pt-4`},{default:k(()=>[e.lookupsLoading?(D(),U(g,{key:0,indeterminate:``,color:`primary`,class:`mb-3`})):w(``,!0),n[21]||=j(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`基本信息`,-1),l(a,{dense:``},{default:k(()=>[l(i,{cols:`12`,sm:`6`},{default:k(()=>[l(Y,{modelValue:e.form.name,"onUpdate:modelValue":n[1]||=t=>e.form.name=t,label:`名称`,variant:`outlined`,density:`compact`,rules:[M(vt)(`服务器名称`)]},null,8,[`modelValue`,`rules`])]),_:1}),l(i,{cols:`12`,sm:`6`},{default:k(()=>[l(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:[M(vt)(`域名或 IP`)]},null,8,[`modelValue`,`rules`])]),_:1}),l(i,{cols:`6`,sm:`4`},{default:k(()=>[l(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}),l(i,{cols:`6`,sm:`8`},{default:k(()=>[l(Y,{modelValue:e.form.username,"onUpdate:modelValue":n[4]||=t=>e.form.username=t,label:`SSH 用户名`,variant:`outlined`,density:`compact`,placeholder:`root`,rules:[M(vt)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`])]),_:1})]),_:1}),l(B,{class:`my-4`}),n[22]||=j(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`认证方式`,-1),l(Pe,{modelValue:e.form.auth_method,"onUpdate:modelValue":n[5]||=t=>e.form.auth_method=t,mandatory:``,density:`compact`,variant:`outlined`,class:`mb-3`},{default:k(()=>[l(f,{value:`password`,size:`small`},{default:k(()=>[...n[19]||=[T(`密码`,-1)]]),_:1}),l(f,{value:`key`,size:`small`},{default:k(()=>[...n[20]||=[T(`SSH 密钥`,-1)]]),_:1})]),_:1},8,[`modelValue`]),e.form.auth_method===`password`?(D(),s(P,{key:1},[l(dt,{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?w(``,!0):(D(),U(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:o.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)):(D(),s(P,{key:2},[l(dt,{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`]),l(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?w(``,!0):(D(),U(xt,{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)),l(B,{class:`my-4`}),n[23]||=j(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`部署`,-1),l(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:[M(vt)(`目标路径`)]},null,8,[`modelValue`,`rules`]),l(Pt,{modelValue:e.form.category,"onUpdate:modelValue":n[12]||=t=>e.form.category=t,items:e.categoryOptions,label:`分类`,variant:`outlined`,density:`compact`,clearable:``,hint:`可从已有分类选择或输入新分类`,"persistent-hint":``},null,8,[`modelValue`,`items`]),l(Et,{variant:`accordion`,class:`mt-4`},{default:k(()=>[l(wt,{title:`高级选项`},{default:k(()=>[l(Ct,null,{default:k(()=>[l(dt,{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`]),l(dt,{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`]),l(dt,{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":``,class:`mb-4`},null,8,[`modelValue`,`items`])]),_:1})]),_:1})]),_:1})]),_:1}),l(B),l(Qe,{class:`pa-4`},{default:k(()=>[l(A),l(f,{variant:`text`,disabled:e.saving,onClick:n[16]||=e=>r(`update:modelValue`,!1)},{default:k(()=>[...n[24]||=[T(`取消`,-1)]]),_:1},8,[`disabled`]),l(f,{color:`primary`,variant:`flat`,loading:e.saving,onClick:n[17]||=e=>r(`save`)},{default:k(()=>[...n[25]||=[T(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),It={class:`text-body-2 mr-4`},Lt=x({__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(),U(q,{key:0,class:`mx-4 mb-2`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:k(()=>[l(X,{class:`d-flex align-center py-2 flex-wrap ga-1`},{default:k(()=>[j(`span`,It,`已选择 `+I(e.count)+` 台服务器`,1),l(A),l(f,{size:`small`,variant:`text`,onClick:n[0]||=e=>t.$emit(`batch-category`)},{default:k(()=>[...n[8]||=[T(`修改分类`,-1)]]),_:1}),l(f,{size:`small`,variant:`text`,onClick:n[1]||=e=>t.$emit(`health-check`)},{default:k(()=>[...n[9]||=[T(`健康检查`,-1)]]),_:1}),l(f,{size:`small`,variant:`text`,onClick:n[2]||=e=>t.$emit(`detect-path`)},{default:k(()=>[...n[10]||=[T(`检测目标路径`,-1)]]),_:1}),l(f,{size:`small`,variant:`text`,onClick:n[3]||=e=>t.$emit(`install-agent`)},{default:k(()=>[...n[11]||=[T(`安装Agent`,-1)]]),_:1}),l(f,{size:`small`,variant:`text`,onClick:n[4]||=e=>t.$emit(`upgrade-agent`)},{default:k(()=>[...n[12]||=[T(`升级Agent`,-1)]]),_:1}),l(f,{size:`small`,variant:`text`,color:`error`,onClick:n[5]||=e=>t.$emit(`uninstall-agent`)},{default:k(()=>[...n[13]||=[T(`卸载Agent`,-1)]]),_:1}),l(f,{size:`small`,variant:`text`,color:`error`,onClick:n[6]||=e=>t.$emit(`batch-delete`)},{default:k(()=>[...n[14]||=[T(`批量删除`,-1)]]),_:1}),l(f,{size:`small`,variant:`text`,onClick:n[7]||=e=>t.$emit(`clear`)},{default:k(()=>[...n[15]||=[T(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):w(``,!0)}}),Q=z({autoDraw:Boolean,autoDrawDuration:[Number,String],autoDrawEasing:{type:String,default:`ease`},color:String,gradient:{type:Array,default:()=>[]},gradientDirection:{type:String,validator:e=>[`top`,`bottom`,`left`,`right`].includes(e),default:`top`},height:{type:[String,Number],default:75},labels:{type:Array,default:()=>[]},labelSize:{type:[Number,String],default:7},lineWidth:{type:[String,Number],default:4},id:String,itemValue:{type:String,default:`value`},modelValue:{type:Array,default:()=>[]},min:[String,Number],max:[String,Number],padding:{type:[String,Number],default:8},showLabels:Boolean,smooth:[Boolean,String,Number],width:{type:[Number,String],default:300}},`Line`),Rt=z({autoLineWidth:Boolean,...Q()},`VBarline`),zt=V()({name:`VBarline`,props:Rt(),setup(e,{slots:t}){let n=v(),r=G(()=>e.id||`barline-${n}`),i=G(()=>Number(e.autoDrawDuration)||500),a=G(()=>!!(e.showLabels||e.labels.length>0||t?.label)),o=G(()=>parseFloat(e.lineWidth)||4),s=G(()=>Math.max(e.modelValue.length*o.value,Number(e.width))),c=G(()=>({minX:0,maxX:s.value,minY:0,maxY:parseInt(e.height,10)})),l=G(()=>e.modelValue.map(t=>_(t,e.itemValue,t)));function u(t,n){let{minX:r,maxX:i,minY:a,maxY:o}=n,s=t.length,c=e.max==null?Math.max(...t):Number(e.max),l=e.min==null?Math.min(...t):Number(e.min);l>0&&e.min==null&&(l=0),c<0&&e.max==null&&(c=0);let u=i/(s===1?2:s),d=(o-a)/(c-l||1),f=o-Math.abs(l*d);return t.map((e,t)=>{let n=Math.abs(d*e);return{x:r+t*u,y:f-n+Number(e<0)*n,height:n,value:e}})}let d=G(()=>{let t=[],n=u(l.value,c.value),r=n.length;for(let i=0;t.length<r;i++){let r=n[i],a=e.labels[i];a||=typeof r==`object`?r.value:r,t.push({x:r.x,value:String(a)})}return t}),f=G(()=>u(l.value,c.value)),p=G(()=>f.value.length===1?(c.value.maxX-o.value)/2:(Math.abs(f.value[0].x-f.value[1].x)-o.value)/2),m=G(()=>typeof e.smooth==`boolean`?e.smooth?2:0:Number(e.smooth));Ie(()=>{let n=e.gradient.slice().length?e.gradient.slice().reverse():[``];return j(`svg`,{display:`block`},[j(`defs`,null,[j(`linearGradient`,{id:r.value,gradientUnits:`userSpaceOnUse`,x1:e.gradientDirection===`left`?`100%`:`0`,y1:e.gradientDirection===`top`?`100%`:`0`,x2:e.gradientDirection===`right`?`100%`:`0`,y2:e.gradientDirection===`bottom`?`100%`:`0`},[n.map((e,t)=>j(`stop`,{offset:t/Math.max(n.length-1,1),"stop-color":e||`currentColor`},null))])]),j(`clipPath`,{id:`${r.value}-clip`},[f.value.map(t=>j(`rect`,{x:t.x+p.value,y:t.y,width:o.value,height:t.height,rx:m.value,ry:m.value},[e.autoDraw&&!Me()&&j(P,null,[j(`animate`,{attributeName:`y`,from:t.y+t.height,to:t.y,dur:`${i.value}ms`,fill:`freeze`},null),j(`animate`,{attributeName:`height`,from:`0`,to:t.height,dur:`${i.value}ms`,fill:`freeze`},null)])]))]),a.value&&j(`g`,{key:`labels`,style:{textAnchor:`middle`,dominantBaseline:`mathematical`,fill:`currentColor`}},[d.value.map((n,r)=>j(`text`,{x:n.x+p.value+o.value/2,y:parseInt(e.height,10)-2+(parseInt(e.labelSize,10)||7*.75),"font-size":Number(e.labelSize)||7},[t.label?.({index:r,value:n.value})??n.value]))]),j(`g`,{"clip-path":`url(#${r.value}-clip)`,fill:`url(#${r.value})`},[j(`rect`,{x:0,y:0,width:Math.max(e.modelValue.length*o.value,Number(e.width)),height:e.height},null)])])})}});function Bt(e,t,n=!1,r=75){if(e.length===0)return``;let i=e.shift(),a=e[e.length-1];return(n?`M${i.x} ${r-i.x+2} L${i.x} ${i.y}`:`M${i.x} ${i.y}`)+e.map((n,r)=>{let a=e[r+1],o=e[r-1]||i,s=a&&Vt(a,n,o);if(!a||s)return`L${n.x} ${n.y}`;let c=Math.min(Ht(o,n),Ht(a,n)),l=c/2<t?c/2:t,u=Ut(o,n,l),d=Ut(a,n,l);return`L${u.x} ${u.y}S${n.x} ${n.y} ${d.x} ${d.y}`}).join(``)+(n?`L${a.x} ${r-i.x+2} Z`:``)}function $(e){return parseInt(e,10)}function Vt(e,t,n){return $(e.x+n.x)===$(2*t.x)&&$(e.y+n.y)===$(2*t.y)}function Ht(e,t){return Math.sqrt((t.x-e.x)**2+(t.y-e.y)**2)}function Ut(e,t,n){let r={x:e.x-t.x,y:e.y-t.y},i=Math.sqrt(r.x*r.x+r.y*r.y),a={x:r.x/i,y:r.y/i};return{x:t.x+a.x*n,y:t.y+a.y*n}}var Wt=z({fill:Boolean,...Q()},`VTrendline`),Gt=V()({name:`VTrendline`,props:Wt(),setup(e,{slots:t}){let n=v(),r=G(()=>e.id||`trendline-${n}`),i=G(()=>Number(e.autoDrawDuration)||(e.fill?500:2e3)),a=R(0),o=R(null);function s(t,n){let{minX:r,maxX:i,minY:a,maxY:o}=n;t.length===1&&(t=[t[0],t[0]]);let s=t.length,c=e.max==null?Math.max(...t):Number(e.max),l=e.min==null?Math.min(...t):Number(e.min),u=(i-r)/(s-1),d=(o-a)/(c-l||1);return t.map((e,t)=>({x:r+t*u,y:o-(e-l)*d,value:e}))}let c=G(()=>!!(e.showLabels||e.labels.length>0||t?.label)),l=G(()=>parseFloat(e.lineWidth)||4),u=G(()=>Number(e.width)),d=G(()=>{let t=Number(e.padding);return{minX:t,maxX:u.value-t,minY:t,maxY:parseInt(e.height,10)-t}}),f=G(()=>e.modelValue.map(t=>_(t,e.itemValue,t))),p=G(()=>{let t=[],n=s(f.value,d.value),r=n.length;for(let i=0;t.length<r;i++){let r=n[i],a=e.labels[i];a||=typeof r==`object`?r.value:r,t.push({x:r.x,value:String(a)})}return t});O(()=>e.modelValue,async()=>{if(await b(),!e.autoDraw||!o.value||Me())return;let t=o.value,n=t.getTotalLength();e.fill?(t.style.transformOrigin=`bottom center`,t.style.transition=`none`,t.style.transform=`scaleY(0)`,t.getBoundingClientRect(),t.style.transition=`transform ${i.value}ms ${e.autoDrawEasing}`,t.style.transform=`scaleY(1)`):(t.style.strokeDasharray=`${n}`,t.style.strokeDashoffset=`${n}`,t.getBoundingClientRect(),t.style.transition=`stroke-dashoffset ${i.value}ms ${e.autoDrawEasing}`,t.style.strokeDashoffset=`0`),a.value=n},{immediate:!0});function m(t){let n=typeof e.smooth==`boolean`?e.smooth?8:0:Number(e.smooth);return Bt(s(f.value,d.value),n,t,parseInt(e.height,10))}Ie(()=>{let n=e.gradient.slice().length?e.gradient.slice().reverse():[``];return j(`svg`,{display:`block`,"stroke-width":parseFloat(e.lineWidth)??4},[j(`defs`,null,[j(`linearGradient`,{id:r.value,gradientUnits:`userSpaceOnUse`,x1:e.gradientDirection===`left`?`100%`:`0`,y1:e.gradientDirection===`top`?`100%`:`0`,x2:e.gradientDirection===`right`?`100%`:`0`,y2:e.gradientDirection===`bottom`?`100%`:`0`},[n.map((e,t)=>j(`stop`,{offset:t/Math.max(n.length-1,1),"stop-color":e||`currentColor`},null))])]),c.value&&j(`g`,{key:`labels`,style:{textAnchor:`middle`,dominantBaseline:`mathematical`,fill:`currentColor`}},[p.value.map((n,r)=>j(`text`,{x:n.x+l.value/2+l.value/2,y:parseInt(e.height,10)-4+(parseInt(e.labelSize,10)||7*.75),"font-size":Number(e.labelSize)||7},[t.label?.({index:r,value:n.value})??n.value]))]),j(`path`,{ref:o,d:m(e.fill),fill:e.fill?`url(#${r.value})`:`none`,stroke:e.fill?`none`:`url(#${r.value})`},null),e.fill&&j(`path`,{d:m(!1),fill:`none`,stroke:e.color??e.gradient?.[0]},null)])})}}),Kt=z({type:{type:String,default:`trend`},...Rt(),...Wt()},`VSparkline`),qt=V()({name:`VSparkline`,props:Kt(),setup(e,{slots:t}){let{textColorClasses:n,textColorStyles:r}=Fe(()=>e.color),i=G(()=>!!(e.showLabels||e.labels.length>0||t?.label)),a=G(()=>{let t=parseInt(e.height,10);return i.value&&(t+=parseInt(e.labelSize,10)*1.5),t});Ie(()=>{let i=e.type===`trend`?Gt:zt,o=e.type===`trend`?Gt.filterProps(e):zt.filterProps(e);return l(i,y({key:e.type,class:n.value,style:r.value,viewBox:`0 0 ${e.width} ${parseInt(a.value,10)}`},o),t)})}}),Jt={class:`server-metric-sparklines`},Yt={class:`d-flex align-center justify-space-between mb-2`},Xt={class:`text-caption text-medium-emphasis`},Zt={key:1,class:`text-caption text-error py-1 mb-2`},Qt={key:2,class:`text-caption text-medium-emphasis py-1 mb-2`},$t={class:`d-flex justify-space-between text-caption mb-1`},en={class:`d-flex justify-space-between text-caption mb-1`},tn={key:0,class:`d-flex flex-wrap ga-1 mt-2`},nn=x({__name:`ServerMetricSparklines`,props:{points:{},offlineSegments:{},intervalMinutes:{},loading:{type:Boolean},error:{}},emits:[`retry`],setup(e){let t=e,n=G(()=>t.points.length>0),r=G(()=>t.points.filter(e=>e.is_online&&(e.cpu_pct!=null||e.mem_pct!=null))),o=G(()=>r.value.map(e=>We(e.recorded_at))),c=G(()=>r.value.map(e=>e.cpu_pct??0)),u=G(()=>r.value.map(e=>e.mem_pct??0)),d=G(()=>{let e=[...t.points].reverse().find(e=>e.is_online&&e.cpu_pct!=null);return e?.cpu_pct==null?`—`:`${e.cpu_pct}%`}),p=G(()=>{let e=[...t.points].reverse().find(e=>e.is_online&&e.mem_pct!=null);return e?.mem_pct==null?`—`:`${e.mem_pct}%`});function m(e){return`${We(e.from)} – ${We(e.to)}`}return(t,r)=>(D(),s(`div`,Jt,[j(`div`,Yt,[j(`span`,Xt,` 24h 趋势(每 `+I(e.intervalMinutes)+` 分钟采样) `,1),e.error?(D(),U(f,{key:0,variant:`text`,size:`x-small`,color:`primary`,onClick:r[0]||=e=>t.$emit(`retry`)},{default:k(()=>[...r[1]||=[T(` 重试 `,-1)]]),_:1})):w(``,!0)]),e.loading?(D(),U(ht,{key:0,type:`image`,height:`120`,class:`rounded mb-2`})):e.error?(D(),s(`div`,Zt,I(e.error),1)):n.value?(D(),s(P,{key:3},[l(a,{dense:``},{default:k(()=>[l(i,{cols:`12`,md:`6`},{default:k(()=>[j(`div`,$t,[r[2]||=j(`span`,{class:`text-medium-emphasis`},`CPU`,-1),j(`span`,null,I(d.value),1)]),l(qt,{"model-value":c.value,labels:o.value,color:`primary`,height:`48`,smooth:``,interactive:``,"auto-draw":``},null,8,[`model-value`,`labels`])]),_:1}),l(i,{cols:`12`,md:`6`},{default:k(()=>[j(`div`,en,[r[3]||=j(`span`,{class:`text-medium-emphasis`},`内存`,-1),j(`span`,null,I(p.value),1)]),l(qt,{"model-value":u.value,labels:o.value,color:`secondary`,height:`48`,smooth:``,interactive:``,"auto-draw":``},null,8,[`model-value`,`labels`])]),_:1})]),_:1}),e.offlineSegments.length?(D(),s(`div`,tn,[(D(!0),s(P,null,E(e.offlineSegments,(e,t)=>(D(),U(W,{key:`${e.from}-${e.to}-${t}`,size:`x-small`,variant:`tonal`,color:`grey`,label:``},{default:k(()=>[T(` 离线 `+I(m(e)),1)]),_:2},1024))),128))])):w(``,!0)],64)):(D(),s(`div`,Qt,` 暂无历史数据(部署后约 10 分钟起陆续有采样) `))]))}}),rn={class:`server-inline-detail pa-3 rounded-b-lg`},an={class:`d-flex flex-wrap align-center ga-2 mb-3`},on={class:`text-caption text-medium-emphasis`},sn={key:1,class:`d-flex flex-wrap ga-4 mb-3 text-body-2`},cn={key:2,class:`text-caption text-warning mb-2`},ln={class:`d-flex align-center ga-2 mb-2`},un={class:`text-body-2 text-truncate`},dn={key:4,class:`text-caption text-error py-1`},fn={key:5,class:`text-caption text-medium-emphasis py-1`},pn=K(x({__name:`ServerInlineDetail`,props:{server:{},active:{type:Boolean}},emits:[`edit-path`],setup(e){let t=e,n=R(null),r=R(!1),i=R(``),a=R(!1),c=R(``),u=R(null),d=R(!1),p=R(``),ee=R([]),h=R([]),g=R(10),_=0,v=G(()=>n.value??t.server);function y(e){switch(e){case`success`:return`success`;case`failed`:return`error`;case`running`:return`warning`;case`cancelled`:return`grey`;default:return`default`}}function b(e){switch(e){case`success`:return`成功`;case`failed`:return`失败`;case`running`:return`进行中`;case`cancelled`:return`已取消`;default:return e}}function x(e){let t=[];return e.started_at&&t.push(ke(e.started_at)),e.sync_mode&&t.push(e.sync_mode),e.trigger_type&&t.push(e.trigger_type),e.push_permission&&t.push(`权限 ${mt(e.push_permission)}`),t.join(` · `)||`—`}function te(e){return Array.isArray(e)?e:e&&typeof e==`object`&&Array.isArray(e.items)?e.items:[]}async function ne(e){try{let r=await N.get(`/servers/${t.server.id}`);if(e!==_)return;n.value=r,i.value=``}catch(t){if(e!==_)return;n.value=null,i.value=Z(t,`加载实时状态失败`)}}async function S(e){a.value=!0,c.value=``,u.value=null;try{let n=await N.get(`/servers/${t.server.id}/logs`,{limit:1});if(e!==_)return;u.value=te(n)[0]??null}catch(t){if(e!==_)return;c.value=Z(t,`加载同步日志失败`),u.value=null}finally{e===_&&(a.value=!1)}}async function C(e){d.value=!0,p.value=``,ee.value=[],h.value=[];try{let n=await N.get(`/servers/${t.server.id}/metrics`,{hours:24});if(e!==_)return;ee.value=n.points??[],h.value=n.offline_segments??[],g.value=n.interval_minutes??10}catch(t){if(e!==_)return;p.value=Z(t,`加载历史趋势失败`)}finally{e===_&&(d.value=!1)}}async function re(){let e=++_;r.value=!0,i.value=``;try{await Promise.all([ne(e),S(e),C(e)])}finally{e===_&&(r.value=!1)}}return O(()=>t.active,e=>{e&&re()}),O(()=>t.server.id,()=>{n.value=null,ee.value=[],h.value=[],u.value=null,t.active&&re()}),m(()=>{_+=1}),(e,t)=>(D(),s(`div`,rn,[j(`div`,an,[l(W,{color:M(Ge)(v.value.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:k(()=>[T(I(M(Be)(v.value.status)),1)]),_:1},8,[`color`]),j(`span`,on,` 心跳 `+I(M(He)(v.value.last_heartbeat)),1),l(A),i.value?(D(),U(f,{key:0,variant:`text`,size:`x-small`,color:`primary`,loading:r.value,onClick:t[0]||=()=>re()},{default:k(()=>[...t[3]||=[T(` 重试 `,-1)]]),_:1},8,[`loading`])):w(``,!0)]),r.value&&!n.value?(D(),U(ht,{key:0,type:`article`,class:`mb-3`})):(D(),s(`div`,sn,[j(`div`,null,[t[4]||=j(`span`,{class:`text-caption text-medium-emphasis`},`CPU`,-1),T(` `+I(v.value.system_info?.cpu_usage??`—`)+`% `,1)]),j(`div`,null,[t[5]||=j(`span`,{class:`text-caption text-medium-emphasis`},`内存`,-1),T(` `+I(v.value.system_info?.mem_usage??`—`)+`% `,1)]),j(`div`,null,[t[6]||=j(`span`,{class:`text-caption text-medium-emphasis`},`磁盘`,-1),T(` `+I(v.value.system_info?.disk_usage??`—`)+`% `,1)]),j(`div`,null,[t[7]||=j(`span`,{class:`text-caption text-medium-emphasis`},`Agent`,-1),T(` `+I(v.value.agent_version||`未安装`),1)])])),i.value&&n.value?(D(),s(`div`,cn,` 实时数据可能滞后:`+I(i.value),1)):w(``,!0),l(nn,{class:`mb-3`,points:ee.value,"offline-segments":h.value,"interval-minutes":g.value,loading:d.value,error:p.value,onRetry:t[1]||=()=>{C(o(_)?++_.value:++_)}},null,8,[`points`,`offline-segments`,`interval-minutes`,`loading`,`error`]),j(`div`,ln,[t[8]||=j(`span`,{class:`text-caption text-medium-emphasis shrink-0`},`目标路径`,-1),j(`span`,un,I(v.value.target_path?.trim()||`未配置(推送页留空时无法推送到此机)`),1),l(f,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑目标路径`,onClick:t[2]||=L(t=>e.$emit(`edit-path`),[`stop`])})]),t[9]||=j(`div`,{class:`text-caption text-medium-emphasis mb-1`},`同步日志`,-1),a.value?(D(),U(ht,{key:3,type:`list-item-two-line`})):c.value?(D(),s(`div`,dn,I(c.value),1)):u.value?(D(),U(ve,{key:6,density:`compact`,class:`bg-transparent pa-0`,subtitle:x(u.value),title:`${u.value.source_path} → ${u.value.target_path}`},{append:k(()=>[l(W,{size:`x-small`,color:y(u.value.status),variant:`tonal`,label:``},{default:k(()=>[T(I(b(u.value.status)),1)]),_:1},8,[`color`])]),_:1},8,[`subtitle`,`title`])):(D(),s(`div`,fn,`暂无同步日志`))]))}}),[[`__scopeId`,`data-v-c2b9afab`]]),mn=[`onClick`],hn={class:`font-weight-medium`},gn={class:`text-medium-emphasis`},_n={key:1,class:`text-medium-emphasis`},vn={key:1,class:`d-flex align-center ga-1`},yn=[`title`],bn={class:`text-medium-emphasis`},xn={class:`text-caption text-medium-emphasis`},Sn={class:`d-flex ga-1`},Cn=[`colspan`],wn=K(x({__name:`ServerUnsetPathPanel`,props:{highlight:{type:Boolean},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.agent-diagnose.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`.split(`.`),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=G(()=>Mt(n.selectedItems).length),o=G({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)=>(D(),U(q,{id:`unset-path-panel`,elevation:`0`,rounded:`lg`,class:Ee([`my-5 unset-path-panel`,{"unset-path-panel--highlight":e.highlight}]),border:``},{default:k(()=>[l(J,{class:`d-flex align-center flex-wrap ga-2`},{default:k(()=>[n[20]||=T(` 未设置路径服务器 `,-1),e.total>0?(D(),U(W,{key:0,size:`small`,color:`warning`,variant:`tonal`,label:``},{default:k(()=>[T(I(e.total),1)]),_:1})):w(``,!0),l(A),l(f,{size:`small`,variant:`tonal`,disabled:e.total===0,loading:e.selectAllLoading,onClick:n[0]||=e=>t.$emit(`select-all-filtered`)},{default:k(()=>[T(` 全选筛选结果 (`+I(e.total)+`) `,1)]),_:1},8,[`disabled`,`loading`]),l(f,{variant:`text`,size:`small`,"prepend-icon":`mdi-refresh`,loading:e.loading,onClick:n[1]||=e=>t.$emit(`refresh`)},{default:k(()=>[...n[19]||=[T(` 刷新 `,-1)]]),_:1},8,[`loading`])]),_:1}),l(Lt,{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`]),l(pt,{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":k(()=>[...n[21]||=[]]),"item.status":k(({item:e})=>[l(W,{color:M(Ge)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:k(()=>[T(I(M(Be)(e.status)),1)]),_:2},1032,[`color`])]),"item.name":k(({item:e})=>[j(`div`,{class:`d-flex align-center cursor-pointer text-primary`,onClick:L(n=>t.$emit(`toggle-expand`,e),[`stop`])},[l(ne,{size:`small`,class:`mr-1`},{default:k(()=>[T(I(c(e.id)?`mdi-chevron-down`:`mdi-chevron-right`),1)]),_:2},1024),j(`span`,hn,I(e.name),1)],8,mn)]),"item.domain":k(({item:e})=>[j(`span`,gn,I(e.domain)+`:`+I(e.port),1)]),"item.category":k(({item:e})=>[e.category?(D(),U(W,{key:0,color:`primary`,variant:`tonal`,size:`small`,label:``},{default:k(()=>[T(I(e.category),1)]),_:2},1024)):(D(),s(`span`,_n,`—`))]),"item.target_path":k(({item:r})=>[e.editingPathId===r.id?(D(),s(`div`,{key:0,class:`d-flex align-center ga-1`,onClick:n[13]||=L(()=>{},[`stop`])},[l(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:[be(e=>t.$emit(`save-path`,r.id),[`enter`]),n[11]||=be(e=>t.$emit(`cancel-edit-path`),[`esc`])]},null,8,[`model-value`,`onKeyup`]),l(f,{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`]),l(f,{icon:`mdi-close`,size:`x-small`,variant:`text`,onClick:n[12]||=e=>t.$emit(`cancel-edit-path`)})])):(D(),s(`div`,vn,[j(`span`,{class:`text-caption text-medium-emphasis text-truncate d-inline-block`,style:{"max-width":`140px`},title:r.target_path||`未配置`},I(r.target_path?.trim()||`—`),9,yn),l(f,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑目标路径`,onClick:L(e=>t.$emit(`edit-path`,r),[`stop`])},null,8,[`onClick`])]))]),"item.agent_version":k(({item:e})=>[j(`span`,bn,I(e.agent_version||`—`),1)]),"item.last_heartbeat":k(({item:e})=>[j(`span`,xn,I(M(He)(e.last_heartbeat)),1)]),"item.actions":k(({item:e})=>[j(`div`,Sn,[l(f,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:L(n=>t.$emit(`terminal`,e),[`stop`])},{default:k(()=>[...n[22]||=[T(` 终端 `,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:L(n=>t.$emit(`files`,e),[`stop`])},{default:k(()=>[...n[23]||=[T(` 文件 `,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:L(n=>t.$emit(`detect-path-single`,e),[`stop`])},{default:k(()=>[...n[24]||=[T(` 检测路径 `,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:L(n=>t.$emit(`agent-diagnose`,e),[`stop`])},{default:k(()=>[...n[25]||=[T(` 诊断 `,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:L(n=>t.$emit(`edit`,e),[`stop`])},{default:k(()=>[...n[26]||=[T(` 编辑 `,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:L(n=>t.$emit(`delete`,e),[`stop`])},{default:k(()=>[...n[27]||=[T(` 删除 `,-1)]]),_:1},8,[`onClick`])])]),"expanded-row":k(({columns:e,item:n})=>[j(`tr`,null,[j(`td`,{colspan:e.length,class:`pa-0`},[l(pn,{server:n,active:c(n.id),onEditPath:e=>t.$emit(`edit-path`,n)},null,8,[`server`,`active`,`onEditPath`])],8,Cn)])]),"no-data":k(()=>[...n[28]||=[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},8,[`class`]))}}),[[`__scopeId`,`data-v-b445ac4d`]]),Tn={class:`credentials-manager`},En={class:`d-flex align-center flex-wrap ga-2 mb-3`},Dn={class:`text-caption text-medium-emphasis`},On=`127.0.0.1`,kn=x({name:`CredentialsManager`,__name:`CredentialsManager`,props:{active:{type:Boolean}},setup(e){let n=e,i=[...Xe],a=r(),o=R(!1),c=R(`passwords`),u=R(null),d=R(1),p=R(0),m=R(20),ee=R([]),h=R(!1),g=R({name:``,username:`root`,password:``}),_=Ye([{title:`预设名称`,key:`name`},{title:`用户名`,key:`username`,width:120},{title:`创建时间`,key:`created_at`,width:180},{title:`操作`,key:`actions`,width:150,align:`end`}]),v=R([]),y=R(!1),b=R({name:``,username:`root`}),x=R(null),te=Ye([{title:`名称`,key:`name`},{title:`用户名`,key:`username`,width:120},{title:`私钥`,key:`private_key_set`,width:120},{title:`操作`,key:`actions`,width:150,align:`end`}]),ne=R([]),S=R(!1),C=R({name:``,host:On,port:3306,username:``,password:``,database:``}),re=Ye([{title:`名称`,key:`name`},{title:`主机`,key:`host`},{title:`端口`,key:`port`,width:80},{title:`用户名`,key:`username`},{title:`数据库`,key:`database`},{title:`操作`,key:`actions`,width:150,align:`end`}]),w=R(!1),ie=R(``),E=R(null);function ae(e){m.value=e,d.value=1,c.value===`db`&&le()}function oe(e){return ke(e)}async function se(e=!1){e||(o.value=!0);try{let e=await N.getList(`/presets/`);ee.value=e.items,p.value=e.total}catch(e){ee.value=[],a(Z(e,`加载密码预设失败`),`error`)}finally{e||(o.value=!1)}}async function ce(e=!1){e||(o.value=!0);try{let e=await N.getList(`/ssh-key-presets/`);v.value=e.items,p.value=e.total}catch(e){v.value=[],a(Z(e,`加载 SSH 密钥失败`),`error`)}finally{e||(o.value=!1)}}async function le(e=!1){e||(o.value=!0);try{let e=await Ze(`/scripts/credentials`,{},d.value,m.value);ne.value=e.items,p.value=e.total,m.value===-1&&(d.value=1)}catch(e){ne.value=[],a(Z(e,`加载数据库凭据失败`),`error`)}finally{e||(o.value=!1)}}function ue(e=!1){switch(c.value){case`passwords`:se(e);break;case`sshkeys`:ce(e);break;case`db`:le(e);break}}O(c,()=>{d.value=1,ue()}),O(()=>n.active,e=>{e&&ue()},{immediate:!0});function de(e){u.value=e.id,g.value={name:e.name,username:e.username||`root`,password:``},h.value=!0}async function fe(){let e=g.value.name.trim(),t=g.value.password;if(!e){a(`请填写预设名称`,`error`);return}if(!u.value&&!t){a(`请填写 SSH 密码`,`error`);return}try{let n=g.value.username.trim()||`root`;if(u.value){let r={name:e,username:n};t&&(r.encrypted_pw=t),await N.put(`/presets/${u.value}`,r)}else await N.post(`/presets/`,{name:e,username:n,encrypted_pw:t});h.value=!1,se(),a(`保存成功`)}catch(e){a(Z(e,`保存失败`),`error`)}}function pe(e){return e?Array.isArray(e)?e[0]??null:e:null}function me(e){if(u.value||b.value.name.trim())return;let t=pe(e);if(!t?.name)return;let n=t.name.replace(/\.(pem|key|ppk)$/i,``).trim();n&&(b.value.name=n)}async function F(){let e=pe(x.value);if(!e)return``;let t=(await e.text()).trim();if(!t.includes(`PRIVATE KEY`))throw Error(`不是有效的 PEM 私钥文件`);return t}function he(){b.value={name:``,username:`root`},x.value=null}function L(e){u.value=e.id,b.value={name:e.name,username:e.username||`root`},x.value=null,y.value=!0}async function ge(){let e=b.value.name.trim(),t=b.value.username.trim()||`root`;if(!e){a(`请填写名称`,`error`);return}let n=``;try{n=await F()}catch(e){a(e instanceof Error?e.message:`读取私钥文件失败`,`error`);return}if(!u.value&&!n){a(`请选择私钥文件`,`error`);return}try{if(u.value){let r={name:e,username:t};n&&(r.private_key=n),await N.put(`/ssh-key-presets/${u.value}`,r)}else await N.post(`/ssh-key-presets/`,{name:e,username:t,private_key:n});y.value=!1,ce(),a(`保存成功`)}catch(e){a(Z(e,`保存失败`),`error`)}}function z(e){u.value=e.id,C.value={name:e.name,host:e.host||On,port:e.port||3306,username:e.username||``,password:``,database:e.database||``},S.value=!0}async function _e(){try{u.value?await N.put(`/scripts/credentials/${u.value}`,C.value):await N.post(`/scripts/credentials`,C.value),S.value=!1,le(),a(`保存成功`)}catch(e){a(Z(e,`保存失败`),`error`)}}function ve(){u.value=null,c.value===`passwords`?(g.value={name:``,username:`root`,password:``},h.value=!0):c.value===`sshkeys`?(he(),y.value=!0):(C.value={name:``,host:On,port:3306,username:``,password:``,database:``},S.value=!0)}function ye(e,t){ie.value=e,E.value=t.id,w.value=!0}async function be(){try{ie.value===`password`?await N.delete(`/presets/${E.value}`):ie.value===`sshkey`?await N.delete(`/ssh-key-presets/${E.value}`):await N.delete(`/scripts/credentials/${E.value}`),w.value=!1,ue(),a(`已删除`)}catch(e){a(Z(e,`删除失败`),`error`)}}return(e,n)=>(D(),s(`div`,Tn,[j(`div`,En,[l(Pe,{modelValue:c.value,"onUpdate:modelValue":n[0]||=e=>c.value=e,mandatory:``,density:`compact`,variant:`outlined`},{default:k(()=>[l(f,{size:`small`,value:`passwords`},{default:k(()=>[...n[22]||=[T(`密码预设`,-1)]]),_:1}),l(f,{size:`small`,value:`sshkeys`},{default:k(()=>[...n[23]||=[T(`SSH 密钥`,-1)]]),_:1}),l(f,{size:`small`,value:`db`},{default:k(()=>[...n[24]||=[T(`数据库凭据`,-1)]]),_:1})]),_:1},8,[`modelValue`]),l(A),l(f,{color:`primary`,variant:`flat`,size:`small`,"prepend-icon":`mdi-plus`,onClick:ve},{default:k(()=>[...n[25]||=[T(`添加`,-1)]]),_:1})]),c.value===`passwords`?(D(),s(P,{key:0},[n[29]||=j(`p`,{class:`text-body-2 text-medium-emphasis mb-2`},` 保存常用 SSH 账号+密码模板;快速添加服务器时将按顺序轮询所有预设尝试登录。 `,-1),l(t,{items:ee.value,headers:M(_),loading:o.value,hover:``,density:`comfortable`,"items-per-page":20,"items-per-page-options":i},{"item.created_at":k(({item:e})=>[j(`span`,Dn,I(oe(e.created_at)),1)]),"item.actions":k(({item:e})=>[l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>de(e)},{default:k(()=>[...n[26]||=[T(`编辑`,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>ye(`password`,e)},{default:k(()=>[...n[27]||=[T(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":k(()=>[...n[28]||=[j(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无密码预设`,-1)]]),_:1},8,[`items`,`headers`,`loading`])],64)):c.value===`sshkeys`?(D(),s(P,{key:1},[n[33]||=j(`p`,{class:`text-body-2 text-medium-emphasis mb-2`},` 上传本地 PEM 私钥文件(如 id_rsa、.pem);公钥由系统从私钥自动推导。 `,-1),l(t,{items:v.value,headers:M(te),loading:o.value,hover:``,density:`comfortable`,"items-per-page":20,"items-per-page-options":i},{"item.private_key_set":k(({item:e})=>[l(W,{color:e.private_key_set?`success`:`grey`,size:`small`,variant:`tonal`,label:``},{default:k(()=>[T(I(e.private_key_set?`已设置`:`未设置`),1)]),_:2},1032,[`color`])]),"item.actions":k(({item:e})=>[l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>L(e)},{default:k(()=>[...n[30]||=[T(`编辑`,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>ye(`sshkey`,e)},{default:k(()=>[...n[31]||=[T(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":k(()=>[...n[32]||=[j(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无 SSH 密钥`,-1)]]),_:1},8,[`items`,`headers`,`loading`])],64)):(D(),U(pt,{key:2,items:ne.value,headers:M(re),"items-length":p.value,loading:o.value,page:d.value,"items-per-page":m.value,"items-per-page-options":i,hover:``,density:`comfortable`,"onUpdate:page":n[1]||=e=>{d.value=e,le()},"onUpdate:itemsPerPage":ae},{"item.actions":k(({item:e})=>[l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>z(e)},{default:k(()=>[...n[34]||=[T(`编辑`,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>ye(`db`,e)},{default:k(()=>[...n[35]||=[T(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":k(()=>[...n[36]||=[j(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无凭据`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`,`items-per-page`])),l(gt,{modelValue:h.value,"onUpdate:modelValue":n[6]||=e=>h.value=e,"max-width":`500`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[T(I(u.value?`编辑密码预设`:`新建密码预设`),1)]),_:1}),l(X,null,{default:k(()=>[l(Y,{modelValue:g.value.name,"onUpdate:modelValue":n[2]||=e=>g.value.name=e,label:`预设名称`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`如:生产环境 root 密码`,rules:[M(vt)(`预设名称`)]},null,8,[`modelValue`,`rules`]),l(Y,{modelValue:g.value.username,"onUpdate:modelValue":n[3]||=e=>g.value.username=e,label:`SSH 用户名`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`root`,rules:[M(vt)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`]),l(Y,{modelValue:g.value.password,"onUpdate:modelValue":n[4]||=e=>g.value.password=e,label:`SSH 密码`,variant:`outlined`,density:`compact`,type:`password`,placeholder:u.value?`留空表示不修改`:`必填`,rules:u.value?[]:[M(vt)(`SSH 密码`)]},null,8,[`modelValue`,`placeholder`,`rules`])]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:n[5]||=e=>h.value=!1},{default:k(()=>[...n[37]||=[T(`取消`,-1)]]),_:1}),l(f,{color:`primary`,variant:`flat`,onClick:fe},{default:k(()=>[...n[38]||=[T(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(gt,{modelValue:y.value,"onUpdate:modelValue":n[11]||=e=>y.value=e,"max-width":`500`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[T(I(u.value?`编辑 SSH 密钥`:`新建 SSH 密钥`),1)]),_:1}),l(X,null,{default:k(()=>[l(Y,{modelValue:b.value.name,"onUpdate:modelValue":n[7]||=e=>b.value.name=e,label:`名称`,variant:`outlined`,density:`compact`,class:`mb-2`,rules:[M(vt)(`名称`)]},null,8,[`modelValue`,`rules`]),l(Y,{modelValue:b.value.username,"onUpdate:modelValue":n[8]||=e=>b.value.username=e,label:`SSH 用户名`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`root`,rules:[M(vt)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`]),l(_t,{modelValue:x.value,"onUpdate:modelValue":[n[9]||=e=>x.value=e,me],label:`私钥文件`,variant:`outlined`,density:`compact`,class:`mb-2`,"prepend-icon":`mdi-file-key`,"show-size":``,clearable:!0,hint:u.value?`留空表示不更换私钥`:`选择 PEM 私钥文件(id_rsa、.pem、.key 等)`,"persistent-hint":``},null,8,[`modelValue`,`hint`])]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:n[10]||=e=>y.value=!1},{default:k(()=>[...n[39]||=[T(`取消`,-1)]]),_:1}),l(f,{color:`primary`,variant:`flat`,onClick:ge},{default:k(()=>[...n[40]||=[T(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(gt,{modelValue:S.value,"onUpdate:modelValue":n[19]||=e=>S.value=e,"max-width":`500`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[T(I(u.value?`编辑数据库凭据`:`新建数据库凭据`),1)]),_:1}),l(X,null,{default:k(()=>[l(Y,{modelValue:C.value.name,"onUpdate:modelValue":n[12]||=e=>C.value.name=e,label:`名称`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),l(Y,{modelValue:C.value.host,"onUpdate:modelValue":n[13]||=e=>C.value.host=e,label:`数据库主机`,variant:`outlined`,density:`compact`,class:`mb-2`,hint:`脚本 $DB_HOST;子机本机 MySQL 一般为 127.0.0.1`,"persistent-hint":``},null,8,[`modelValue`]),l(Y,{modelValue:C.value.port,"onUpdate:modelValue":n[14]||=e=>C.value.port=e,label:`端口`,variant:`outlined`,density:`compact`,type:`number`,class:`mb-2`},null,8,[`modelValue`]),l(Y,{modelValue:C.value.username,"onUpdate:modelValue":n[15]||=e=>C.value.username=e,label:`用户名`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),l(Y,{modelValue:C.value.password,"onUpdate:modelValue":n[16]||=e=>C.value.password=e,label:`密码`,variant:`outlined`,density:`compact`,type:`password`,class:`mb-2`},null,8,[`modelValue`]),l(Y,{modelValue:C.value.database,"onUpdate:modelValue":n[17]||=e=>C.value.database=e,label:`数据库`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:n[18]||=e=>S.value=!1},{default:k(()=>[...n[41]||=[T(`取消`,-1)]]),_:1}),l(f,{color:`primary`,variant:`flat`,onClick:_e},{default:k(()=>[...n[42]||=[T(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(gt,{modelValue:w.value,"onUpdate:modelValue":n[21]||=e=>w.value=e,"max-width":`400`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[...n[43]||=[T(`确认删除`,-1)]]),_:1}),l(X,null,{default:k(()=>[...n[44]||=[T(`确定要删除此凭据吗?`,-1)]]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:n[20]||=e=>w.value=!1},{default:k(()=>[...n[45]||=[T(`取消`,-1)]]),_:1}),l(f,{color:`error`,variant:`flat`,onClick:be},{default:k(()=>[...n[46]||=[T(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])]))}}),An=x({__name:`CredentialsDialog`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`],setup(e,{emit:t}){let n=t;return(t,r)=>(D(),U(gt,{"model-value":e.modelValue,"max-width":`960`,scrollable:``,"onUpdate:modelValue":r[1]||=e=>n(`update:modelValue`,e)},{default:k(()=>[l(q,{border:``,rounded:`lg`},{default:k(()=>[l(J,{class:`d-flex align-center`},{default:k(()=>[r[2]||=T(` 凭据管理 `,-1),l(A),l(f,{icon:`mdi-close`,variant:`text`,size:`small`,onClick:r[0]||=e=>n(`update:modelValue`,!1)})]),_:1}),l(B),l(X,{class:`pa-4`},{default:k(()=>[e.modelValue?(D(),U(kn,{key:0,active:e.modelValue},null,8,[`active`])):w(``,!0)]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),jn={class:`text-caption agent-diag-log`},Mn=K(x({__name:`AgentDiagnoseDialog`,props:{modelValue:{type:Boolean},loading:{type:Boolean},result:{},targetName:{}},emits:[`update:modelValue`],setup(e){function t(e){return e===`online`?`success`:e===`offline`?`error`:`default`}function n(e){return e===`online`?`在线`:e===`offline`?`离线`:`未知`}return(r,i)=>(D(),U(gt,{"model-value":e.modelValue,"max-width":`640`,scrollable:``,"onUpdate:modelValue":i[1]||=e=>r.$emit(`update:modelValue`,e)},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[T(`Agent 诊断 — `+I(e.targetName),1)]),_:1}),l(X,null,{default:k(()=>[e.loading?(D(),U(g,{key:0,indeterminate:``,class:`mb-3`})):e.result?(D(),s(P,{key:1},[l(_e,{density:`compact`},{default:k(()=>[l(ve,{title:`中心侧状态`},{append:k(()=>[l(W,{size:`x-small`,variant:`tonal`,color:t(e.result.central_status),label:``},{default:k(()=>[T(I(n(e.result.central_status)),1)]),_:1},8,[`color`])]),_:1}),e.result.last_heartbeat_redis?(D(),U(ve,{key:0,title:`Redis 心跳: ${e.result.last_heartbeat_redis}`},null,8,[`title`])):w(``,!0),e.result.last_heartbeat_db?(D(),U(ve,{key:1,title:`MySQL 心跳: ${e.result.last_heartbeat_db}`},null,8,[`title`])):w(``,!0),l(ve,{title:`Agent 版本(库): ${e.result.agent_version_db||`—`}`},null,8,[`title`]),e.result.remote?(D(),s(P,{key:2},[l(B,{class:`my-2`}),l(ve,{title:`SSH 连接`},{append:k(()=>[l(ne,{color:e.result.remote.ssh_ok?`success`:`error`},{default:k(()=>[T(I(e.result.remote.ssh_ok?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1}),e.result.remote.systemctl_active?(D(),U(ve,{key:0,title:`systemctl: ${e.result.remote.systemctl_active}`,subtitle:e.result.remote.systemctl_detail||void 0},null,8,[`title`,`subtitle`])):w(``,!0),e.result.remote.central_health_http_code==null?w(``,!0):(D(),U(ve,{key:1,title:`/health HTTP: ${e.result.remote.central_health_http_code}`},null,8,[`title`]))],64)):w(``,!0)]),_:1}),(D(!0),s(P,null,E(e.result.errors,(e,t)=>(D(),U(u,{key:t,type:`warning`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:k(()=>[T(I(e),1)]),_:2},1024))),128)),e.result.errors.length===0?(D(),U(u,{key:0,type:`success`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:k(()=>[...i[2]||=[T(` 未发现明显异常 `,-1)]]),_:1})):w(``,!0),e.result.remote?.log_errors?(D(),U(Et,{key:1,class:`mt-3`,variant:`accordion`},{default:k(()=>[l(wt,null,{default:k(()=>[l(Tt,null,{default:k(()=>[...i[3]||=[T(`错误日志摘录`,-1)]]),_:1}),l(Ct,null,{default:k(()=>[j(`pre`,jn,I(e.result.remote.log_errors),1)]),_:1})]),_:1})]),_:1})):w(``,!0)],64)):w(``,!0)]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:i[0]||=e=>r.$emit(`update:modelValue`,!1)},{default:k(()=>[...i[4]||=[T(`关闭`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),[[`__scopeId`,`data-v-a369f18c`]]);function Nn(){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 Pn(e){return e===`uncategorized`?``:e}function Fn(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 In(e){let t=r(),n=R(!1),i=R(null),a=R(!1),o=R(Nn()),s=R({password_set:!1,ssh_key_private_set:!1}),c=R([]),l=R([]),u=R([]),d=R([]),f=R([]),p=R(!1),m=G(()=>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([N.get(`/servers/categories`),N.getList(`/presets/`,{per_page:500}),N.getList(`/ssh-key-presets/`,{per_page:500}),N.get(`/assets/nodes`)]),i=new Set;for(let t of e.categories||[]){let e=Pn(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=Nn(),s.value={password_set:!1,ssh_key_private_set:!1},n.value=!0,await h()}async function _(e){i.value=e.id,o.value=Fn(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 v(){n.value=!1,i.value=null,o.value=Nn(),s.value={password_set:!1,ssh_key_private_set:!1}}function y(){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 b(){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 x(){let n=y();if(n){t(n,`error`);return}a.value=!0;try{let n=b();m.value&&i.value!=null?await N.put(`/servers/${i.value}`,n):await N.post(`/servers/`,n),v(),e(),t(`保存成功`)}catch(e){t(Z(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:_,close:v,save:x}}var Ln={key:0,class:`d-flex align-center flex-wrap ga-2 mb-3`},Rn={class:`d-flex align-center flex-wrap ga-2`},zn=[`onClick`],Bn={class:`font-weight-medium`},Vn={class:`text-medium-emphasis`},Hn={key:1,class:`text-medium-emphasis`},Un={key:1,class:`d-flex align-center ga-1`},Wn=[`title`],Gn={class:`text-medium-emphasis`},Kn={class:`text-caption text-medium-emphasis`},qn={class:`d-flex ga-1`},Jn=[`colspan`],Yn={key:2,class:`px-4 pb-4`},Xn={key:0,class:`text-center py-8`},Zn={key:1,class:`text-center text-medium-emphasis py-6`},Qn={class:`d-flex align-center ga-2 flex-grow-1`},$n={class:`text-caption text-medium-emphasis`},er={class:`font-weight-medium`},tr={class:`text-medium-emphasis`},nr={class:`text-caption text-medium-emphasis text-truncate`,style:{"max-width":`180px`}},rr={class:`text-medium-emphasis`},ir={class:`text-caption text-medium-emphasis`},ar=[`title`],or={key:1,class:`text-medium-emphasis`},sr={class:`text-body-2 mb-2`},cr={class:`text-body-2 text-medium-emphasis mb-3`},lr={key:0,class:`text-caption text-medium-emphasis mt-1`},ur={key:0},dr={key:0},fr=K(x({name:`ServersPage`,__name:`ServersPage`,setup(d){async function p(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 N.post(r,i);if(!a?.job_id)throw Error(`服务端未返回任务 ID,请确认已部署支持后台批量任务的新版本`);return ee(a.job_id,a.label,a.total,a.op||e,a.progress,a.status),c(`${a.label} 已提交`),a}C(()=>{h=te(e=>{e.taskKind===`server_batch`&&(ie(le.serverCategories),Promise.all([$(!0),st(!0),It(),Ar(!0)]))})});let h=null;m(()=>{h?.(),clearTimeout(Ae)});let g=[...Xe],_=r(),v=se(),y=ge(),x=R(!1);function re(){if(y.query.credentials===`1`){x.value=!0;let e={...y.query};delete e.credentials,v.replace({path:y.path,query:e})}}O(()=>y.query.credentials,()=>re(),{immediate:!0});let{servers:ae,loading:ce,page:ue,itemsPerPage:de,total:fe,search:pe,categoryFilter:he,isOnlineFilter:z,sortBy:ye,loadServers:xe,onPageChange:Se,onItemsPerPageChange:Ce,onCategoryChange:we,onOnlineFilterChange:Te,clearOnlineFilter:Ee,loadAllServers:De,listQueryParams:ke}=kt({targetPathUnset:!1}),Ae;function je(){clearTimeout(Ae),Ae=setTimeout(()=>{ue.value=1,B.value=1,$(),gn(!0)},300)}let Me=R([]),Ne=R(0),Fe=R(!1),B=R(1),Ie=R(10),V=R([]),H=R([]);function Le(e){return G({get:()=>e.value,set:t=>{e.value=t.map(e=>Number(e)).filter(e=>!Number.isNaN(e))}})}let We=Le(V),K=R([]),Ye=G(()=>new Set(Mt(K.value))),$e=R(!1),et=R(`main`);function tt(e){return e===`main`?{items:gr,ids:_r}:{items:K,ids:Ye}}let nt=G(()=>tt(et.value).ids.value.size);function rt(){return{search:pe.value||void 0,...Ot(ye.value),target_path_unset:!0}}async function at(){return(await Ze(`/servers/`,rt(),1,-1)).items}async function ot(){if(!(Ne.value<=0)){$e.value=!0;try{let e=await at();K.value=e.map(e=>e.id),_(`已选择未设路径筛选结果 ${e.length} 台`)}catch{_(`加载未设路径筛选结果失败`,`error`)}finally{$e.value=!1}}}async function st(e=!1){e||(Fe.value=!0);try{let e=await Ze(`/servers/`,rt(),B.value,Ie.value);Me.value=e.items,Ne.value=e.total}catch{Me.value=[],Ne.value=0,e||_(`加载未设置路径服务器失败`,`error`)}finally{e||(Fe.value=!1)}}function ct(e){V.value=V.value.includes(e.id)?[]:[e.id]}function lt(e){H.value=H.value.includes(e.id)?[]:[e.id]}function ut(e){V.value=[],Se(e)}function dt(e){V.value=[],Ce(e)}function ft(e){H.value=[],K.value=[],B.value=e,st()}function mt(e){H.value=[],K.value=[],Ie.value=e,B.value=1,st()}async function _t(e){try{await p(`detect-path`,[e.id])}catch(e){_(Z(e,`提交检测任务失败`),`error`)}}function vt(e,t){let n=At(t);V.value.includes(e)&&n&&(V.value=[]),H.value.includes(e)&&!n&&(H.value=[])}let{categories:Dt,loading:jt,totalCount:Nt,loadCategories:It}=yt(),Q=R(`table`),Rt=R([]),zt=R(!1),Bt=R([]);async function $(e=!1){try{await xe({silent:e}),await st(e),Q.value===`group`&&await Vt(e)}catch{e||_(`加载服务器列表失败`,`error`)}}async function Vt(e=!1){e||(zt.value=!0);try{Rt.value=await De(),Bt.value=Ut.value.map(e=>e.category)}catch{e||(Rt.value=[],_(`加载分类视图失败`,`error`))}finally{e||(zt.value=!1)}}async function Ht(){try{await xe({silent:!0}),await st(!0),Q.value===`group`&&await Vt(!0)}catch{}}St(Ht,3e4);let Ut=G(()=>{let e={};for(let t of Rt.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:bt(e),servers:t})).sort((e,t)=>e.category===`uncategorized`?1:t.category===`uncategorized`?-1:e.label.localeCompare(t.label,`zh`))});function Wt(e){we(e),Q.value===`group`&&Vt()}function Gt(e,t){let n=new Set(gr.value.map(e=>typeof e==`number`?e:e.id));t?n.add(e):n.delete(e),gr.value=[...n]}let Kt=R(!1);async function qt(){if(!(fe.value<=0)){Kt.value=!0;try{let e=await De();gr.value=e.map(e=>e.id),_(`已选择当前筛选结果 ${e.length} 台`)}catch{_(`加载筛选结果失败`,`error`)}finally{Kt.value=!1}}}function Jt(e){return e.length>0&&e.every(e=>_r.value.has(e.id))}function Yt(e){let t=Jt(e),n=new Set(_r.value);for(let r of e)t?n.delete(r.id):n.add(r.id);gr.value=[...n]}O(he,()=>{gr.value=[],V.value=[],$()}),O(ye,()=>{gr.value=[],K.value=[],V.value=[],H.value=[],B.value=1,Q.value===`group`&&Vt(),st()},{deep:!0}),O(pe,()=>{gr.value=[],K.value=[],V.value=[],H.value=[],B.value=1}),O(()=>[pe.value,fe.value,Ne.value,nn.value.length,ce.value],([e,t,n,r,i])=>{!e.trim()||i||t>0||n>0||r<=0||b(()=>{document.getElementById(`pending-servers-panel`)?.scrollIntoView({behavior:`smooth`,block:`start`})})}),O(Q,e=>{e===`group`&&Vt()});let Xt=R(!1),Zt=R(!1),Qt=R(null),$t=R(!1),en=R(!1),tn=R({domain:``,port:22,name:``}),nn=R([]),rn=R(!1),an=R(null),on=R(!1),sn=R([]),cn=R(``),ln=R(!1),un=R(null),dn=R(!1),fn=[{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(){tn.value={domain:``,port:22,name:``},$t.value=!0}function hn(e,t){sn.value=e,cn.value=t||``,on.value=!0}async function gn(e=!1){e||(rn.value=!0);try{let e=pe.value.trim();nn.value=(await N.get(`/servers/pending`,e?{search:e}:void 0)).items||[]}catch(e){nn.value=[],_(Z(e,`加载失败列表失败`),`error`)}finally{e||(rn.value=!1)}}async function _n(){let e=tn.value.domain.trim();if(!e){_(`请填写 IP 或域名`,`error`);return}en.value=!0;try{let t={domain:e,port:tn.value.port||22},n=tn.value.name.trim();n&&(t.name=n);let r=await N.post(`/servers/add-by-ip`,t);r.success&&r.server?($t.value=!1,_(`添加成功:${r.matched_preset} (${r.matched_username})`),$(),Ar()):($t.value=!1,hn(r.errors||[],r.message),gn())}catch(e){_(Z(e,`添加失败`),`error`)}finally{en.value=!1}}async function vn(e){an.value=e.id;try{let t=await N.post(`/servers/pending/${e.id}/retry`,{});t.success&&t.server?(_(`重试成功:${t.matched_preset} (${t.matched_username})`),$(),Ar(),gn()):(hn(t.errors||[],t.message),gn())}catch(e){_(Z(e,`重试失败`),`error`)}finally{an.value=null}}function yn(e){un.value=e,ln.value=!0}async function bn(){if(un.value){dn.value=!0;try{await N.delete(`/servers/pending/${un.value.id}`),ln.value=!1,_(`已从失败列表移除`),gn()}catch(e){_(Z(e,`删除失败`),`error`)}finally{dn.value=!1}}}let{visible:xn,form:Sn,isEditing:Cn,saving:Tn,lookupsLoading:En,passwordPresets:Dn,sshKeyPresets:On,categoryOptions:kn,platforms:jn,nodes:Nn,editHints:Pn,filesElevationItems:Fn,openAdd:fr,openEdit:pr,close:mr,save:hr}=In(()=>{$(),Ar(),It()});O(xn,(e,t)=>{t&&!e&&mr()});let gr=R([]),_r=G(()=>new Set(Mt(gr.value))),vr=[{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}],yr=R(!0),br=R(!1),{statItems:xr}=Ve(),Sr=R(!1),Cr=G(()=>xr.value.map((e,t)=>{let n=Re[t],r=!1;return n===`offline`?r=z.value===!1:n===`unset-path`&&(r=Sr.value),{...e,key:n,clickable:n!==`total`&&n!==`online`,active:r}})),wr=G(()=>z.value===!0?`筛选:在线服务器`:z.value===!1?`筛选:离线服务器`:``);function Tr(){b(()=>{document.getElementById(`unset-path-panel`)?.scrollIntoView({behavior:`smooth`,block:`start`})})}function Er(){let e=y.query.status;e===`offline`?(Sr.value=!1,z.value!==!1&&(z.value=!1,Q.value=`table`,$())):e===`online`&&(Sr.value=!1,z.value!==!0&&(z.value=!0,Q.value=`table`,$())),y.query.unset_path===`1`&&(Sr.value=!0,Tr())}O(()=>[y.query.status,y.query.unset_path],()=>Er(),{immediate:!0});function Dr(e){if(e===`alerts`){Sr.value=!1,v.push({path:`/alerts`});return}if(e===`unset-path`){Sr.value=!Sr.value;let e={...y.query};Sr.value?(e.unset_path=`1`,Tr()):delete e.unset_path,v.replace({path:y.path,query:e});return}if(Sr.value=!1,e===`offline`){let e=z.value===!1?null:!1;Te(e),Q.value=`table`;let t={...y.query};delete t.unset_path,e===!1?t.status=`offline`:delete t.status,v.replace({path:y.path,query:t})}}function Or(){if(Ee(),y.query.status){let e={...y.query};delete e.status,v.replace({path:y.path,query:e})}}function kr(){if(Sr.value=!1,y.query.unset_path){let e={...y.query};delete e.unset_path,v.replace({path:y.path,query:e})}}async function Ar(e=!1){e||(yr.value=!0);try{Ue(xr,await Ke())}catch{}finally{e||(yr.value=!1)}}async function jr(){br.value=!0;try{await ze(xr)}catch{_(`刷新统计数据失败`,`error`)}finally{br.value=!1}}function Mr(e){v.push({path:`/terminal`,query:{server_id:String(e.id)}})}function Nr(e){v.push({path:`/files`,query:{server_id:String(e.id)}})}let Pr=R(!1),Fr=R(!1),Ir=R(null),Lr=R(null),Rr=R(null);async function zr(e){Rr.value=e,Lr.value=null,Pr.value=!0,Fr.value=!0,Ir.value=e.id;try{Lr.value=await N.post(`/servers/${e.id}/agent-diagnose`,{})}catch(e){Pr.value=!1,_(Z(e,`Agent 诊断失败`),`error`)}finally{Fr.value=!1,Ir.value=null}}function Br(e){pr(e)}function Vr(e){Qt.value=e,Xt.value=!0}let Hr=R(!1),Ur=R(``),Wr=R(!1),Gr=G(()=>{let e=Dt.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 Kr(e){et.value=e;let{ids:t}=tt(e);if(t.value.size===0){_(`请先勾选至少一台服务器`,`error`);return}Ur.value=``,Hr.value=!0}async function qr(){let{items:e,ids:t}=tt(et.value),n=[...t.value];if(n.length!==0){Wr.value=!0;try{await p(`category`,n,{category:(Ur.value||``).trim()}),Hr.value=!1,e.value=[]}catch(e){_(Z(e,`批量修改分类失败`),`error`)}finally{Wr.value=!1}}}let Jr=R(!1),Yr=R(null),Xr=R(``),Zr=R(null);function Qr(e){et.value=e;let{ids:t}=tt(e);if(!t.value.size){_(`请先选择服务器`,`warning`);return}Jr.value=!0}async function $r(){let{items:e,ids:t}=tt(et.value),n=[...t.value];if(n.length){Jr.value=!1;try{await p(`detect-path`,n),e.value=[]}catch(e){_(Z(e,`提交检测任务失败`),`error`)}}}async function ei(e){et.value=e;let{items:t}=tt(e),n=Mt(t.value);if(!n.length){_(`请先选择服务器`,`warning`);return}try{await p(`health-check`,n)}catch(e){_(Z(e,`提交健康检查失败`),`error`)}}async function ti(e){et.value=e;let{items:t}=tt(e),n=Mt(t.value);if(!n.length){_(`请先选择服务器`,`warning`);return}try{await p(`install-agent`,n)}catch(e){_(Z(e,`提交安装任务失败`),`error`)}}async function ni(e){et.value=e;let{items:t}=tt(e),n=Mt(t.value);if(!n.length){_(`请先选择服务器`,`warning`);return}if(confirm(`确定对 ${n.length} 台服务器升级 Agent?`))try{await p(`upgrade-agent`,n)}catch(e){_(Z(e,`提交升级任务失败`),`error`)}}async function ri(e){et.value=e;let{items:t}=tt(e),n=Mt(t.value);if(!n.length){_(`请先选择服务器`,`warning`);return}if(confirm(`确定对 ${n.length} 台已安装 Agent 的服务器执行卸载?\n将停止服务、删除 /opt/nexus-agent 并清除 Agent 状态。`))try{await p(`uninstall-agent`,n)}catch(e){_(Z(e,`提交卸载任务失败`),`error`)}}function ii(e){Yr.value=e.id,Xr.value=e.target_path?.trim()||`/www/wwwroot`}function ai(){Yr.value=null,Xr.value=``,Zr.value=null}async function oi(e){let t=Xr.value.trim();if(!t){_(`目标路径不能为空`,`warning`);return}if(!t.startsWith(`/`)){_(`目标路径须为绝对路径(以 / 开头)`,`warning`);return}Zr.value=e;try{await N.put(`/servers/${e}`,{target_path:t}),_(`目标路径已更新`),ai(),await Promise.all([$(),st()]),vt(e,t)}catch(e){_(Z(e,`保存失败`),`error`)}finally{Zr.value=null}}async function si(e){et.value=e;let{items:t,ids:n}=tt(e);if(n.value.size&&confirm(`确定删除选中的 ${n.value.size} 台服务器?`)){for(let e of n.value)try{await N.delete(`/servers/${e}`)}catch{}t.value=[],_(`批量删除完成`),await Promise.all([$(),st()]),Ar()}}let ci=R(!1),li=R(``),ui=R(22),di=R(8601),fi=R(!1),pi=R(null);function mi(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 hi(e){let t=new Set,n=[],r=0;for(let i of e.split(`
|
||
`)){let e=mi(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 gi=G(()=>hi(li.value));function _i(){li.value=``,ui.value=22,di.value=8601,pi.value=null,ci.value=!0}async function vi(){let e=li.value.trim();if(!e){_(`请填写至少一个 IP 或域名`,`error`);return}fi.value=!0,pi.value=null;try{let t=await N.post(`/servers/add-by-ips-batch`,{text:e,port:ui.value||22,agent_port:di.value||8601});pi.value=t,t.created>0&&($(),Ar()),t.pending>0&&gn(),_(t.pending>0?`添加完成:${t.created} 台成功,${t.pending} 台进入连接失败列表`:`添加完成:${t.created} 台成功`,t.pending>0?`warning`:`success`)}catch(e){_(Z(e,`批量添加失败`),`error`)}finally{fi.value=!1}}async function yi(){if(!Qt.value)return;let e=Qt.value.id;Zt.value=!0;try{await N.delete(`/servers/${e}`),Xt.value=!1,V.value=V.value.filter(t=>t!==e),H.value=H.value.filter(t=>t!==e),await Promise.all([$(),st()]),Ar(),_(`已删除`)}catch(e){_(Z(e,`删除失败`),`error`)}finally{Zt.value=!1}}async function bi(e=!1){await Promise.all([Ar(e),It(e),$(e)]),e||await gn()}return Je(e=>bi(e)),(r,c)=>(D(),U(n,{fluid:``,class:`pa-4 pa-md-6`},{default:k(()=>[l(qe,{items:Cr.value,loading:yr.value,refreshing:br.value,onClick:Dr,onRefresh:jr},null,8,[`items`,`loading`,`refreshing`]),wr.value||Sr.value?(D(),s(`div`,Ln,[wr.value?(D(),U(W,{key:0,color:`primary`,variant:`tonal`,size:`small`,closable:``,label:``,"onClick:close":Or},{default:k(()=>[T(I(wr.value),1)]),_:1})):w(``,!0),Sr.value?(D(),U(W,{key:1,color:`warning`,variant:`tonal`,size:`small`,closable:``,label:``,"onClick:close":kr},{default:k(()=>[...c[58]||=[T(` 已定位:未设置路径服务器 `,-1)]]),_:1})):w(``,!0),c[59]||=j(`span`,{class:`text-caption text-medium-emphasis`},`点击顶部统计卡可切换筛选或定位`,-1)])):w(``,!0),l(q,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:k(()=>[l(J,{class:`d-flex align-center`},{default:k(()=>[c[67]||=T(` 服务器列表 `,-1),l(A),l(Y,{modelValue:M(pe),"onUpdate:modelValue":[c[0]||=e=>o(pe)?pe.value=e:null,je],"prepend-inner-icon":`mdi-magnify`,label:`搜索名称/IP(含未设路径)`,density:`compact`,"hide-details":``,rounded:``,style:{"max-width":`240px`},variant:`outlined`},null,8,[`modelValue`]),l(f,{color:`primary`,variant:`flat`,class:`ml-3`,"prepend-icon":`mdi-plus`,size:`small`,onClick:M(fr)},{default:k(()=>[...c[60]||=[T(` 添加 `,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-flash`,size:`small`,onClick:mn},{default:k(()=>[...c[61]||=[T(` 快速添加(IP) `,-1)]]),_:1}),l(f,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-ip-network`,size:`small`,onClick:_i},{default:k(()=>[...c[62]||=[T(` 批量添加 `,-1)]]),_:1}),l(f,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-key-outline`,size:`small`,onClick:c[1]||=e=>x.value=!0},{default:k(()=>[...c[63]||=[T(` 凭据 `,-1)]]),_:1}),l(f,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-folder-search`,size:`small`,disabled:_r.value.size===0,title:`请先勾选至少一台服务器`,onClick:c[2]||=e=>Qr(`main`)},{default:k(()=>[...c[64]||=[T(` 检测路径 `,-1)]]),_:1},8,[`disabled`]),l(Pe,{modelValue:Q.value,"onUpdate:modelValue":c[3]||=e=>Q.value=e,mandatory:``,density:`compact`,class:`ml-2`,color:`primary`,variant:`outlined`,divided:``},{default:k(()=>[l(f,{value:`table`,size:`small`,"prepend-icon":`mdi-table`},{default:k(()=>[...c[65]||=[T(`列表`,-1)]]),_:1}),l(f,{value:`group`,size:`small`,"prepend-icon":`mdi-folder-multiple`},{default:k(()=>[...c[66]||=[T(`分类`,-1)]]),_:1})]),_:1},8,[`modelValue`])]),_:1}),l(X,{class:`pt-0 pb-2`},{default:k(()=>[M(pe).trim()?(D(),U(W,{key:0,size:`small`,variant:`tonal`,color:`info`,label:``,class:`mb-2`},{default:k(()=>[...c[68]||=[T(` 全库搜索中(含未设路径与连接失败;已忽略分类/在线筛选) `,-1)]]),_:1})):w(``,!0),j(`div`,Rn,[c[69]||=j(`span`,{class:`text-caption text-medium-emphasis mr-1`},`分类筛选`,-1),l(W,{color:M(he)===``?`primary`:void 0,variant:M(he)===``?`flat`:`outlined`,size:`small`,label:``,onClick:c[4]||=e=>Wt(``)},{default:k(()=>[T(` 全部 `+I(M(Nt)),1)]),_:1},8,[`color`,`variant`]),(D(!0),s(P,null,E(M(Dt),e=>(D(),U(W,{key:e.name,color:M(he)===e.name?`primary`:void 0,variant:M(he)===e.name?`flat`:`outlined`,size:`small`,label:``,onClick:t=>Wt(e.name)},{default:k(()=>[T(I(e.label)+` `+I(e.count),1)]),_:2},1032,[`color`,`variant`,`onClick`]))),128)),M(jt)?(D(),U(oe,{key:0,indeterminate:``,size:`16`,width:`2`})):w(``,!0),l(A),l(f,{size:`small`,variant:`tonal`,disabled:M(fe)===0,loading:Kt.value,onClick:qt},{default:k(()=>[T(` 全选筛选结果 (`+I(M(fe))+`) `,1)]),_:1},8,[`disabled`,`loading`])])]),_:1}),l(Lt,{count:_r.value.size,onBatchCategory:c[5]||=e=>Kr(`main`),onHealthCheck:c[6]||=e=>ei(`main`),onDetectPath:c[7]||=e=>Qr(`main`),onInstallAgent:c[8]||=e=>ti(`main`),onUpgradeAgent:c[9]||=e=>ni(`main`),onUninstallAgent:c[10]||=e=>ri(`main`),onBatchDelete:c[11]||=e=>si(`main`),onClear:c[12]||=e=>gr.value=[]},null,8,[`count`]),Q.value===`table`&&M(ce)&&!M(ae).length?(D(),U(ht,{key:0,type:`table-heading, table-row-divider@8`,class:`mb-4`})):w(``,!0),Q.value===`table`?S((D(),U(pt,{key:1,items:M(ae),headers:vr,"items-length":M(fe),loading:M(ce),page:M(ue),"items-per-page":M(de),"items-per-page-options":g,hover:``,density:`comfortable`,"item-value":`id`,"show-select":``,modelValue:gr.value,"onUpdate:modelValue":c[15]||=e=>gr.value=e,"sort-by":M(ye),"onUpdate:sortBy":c[16]||=e=>o(ye)?ye.value=e:null,expanded:M(We),"onUpdate:expanded":c[17]||=e=>o(We)?We.value=e:null,"show-expand":``,class:`server-main-table`,"onUpdate:page":ut,"onUpdate:itemsPerPage":dt},{"item.data-table-expand":k(()=>[...c[70]||=[]]),"item.status":k(({item:e})=>[l(W,{color:M(Ge)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:k(()=>[T(I(M(Be)(e.status)),1)]),_:2},1032,[`color`])]),"item.name":k(({item:e})=>[j(`div`,{class:`d-flex align-center cursor-pointer text-primary`,onClick:L(t=>ct(e),[`stop`])},[l(ne,{size:`small`,class:`mr-1`},{default:k(()=>[T(I(V.value.includes(e.id)?`mdi-chevron-down`:`mdi-chevron-right`),1)]),_:2},1024),j(`span`,Bn,I(e.name),1)],8,zn)]),"item.domain":k(({item:e})=>[j(`span`,Vn,I(e.domain)+`:`+I(e.port),1)]),"item.category":k(({item:e})=>[e.category?(D(),U(W,{key:0,color:`primary`,variant:`tonal`,size:`small`,label:``},{default:k(()=>[T(I(e.category),1)]),_:2},1024)):(D(),s(`span`,Hn,`—`))]),"item.target_path":k(({item:e})=>[Yr.value===e.id?(D(),s(`div`,{key:0,class:`d-flex align-center ga-1`,onClick:c[14]||=L(()=>{},[`stop`])},[l(Y,{modelValue:Xr.value,"onUpdate:modelValue":c[13]||=e=>Xr.value=e,density:`compact`,variant:`outlined`,"hide-details":``,placeholder:`/www/wwwroot`,style:{"max-width":`140px`},onKeyup:[be(t=>oi(e.id),[`enter`]),be(ai,[`esc`])]},null,8,[`modelValue`,`onKeyup`]),l(f,{icon:`mdi-check`,size:`x-small`,variant:`text`,color:`primary`,loading:Zr.value===e.id,onClick:t=>oi(e.id)},null,8,[`loading`,`onClick`]),l(f,{icon:`mdi-close`,size:`x-small`,variant:`text`,onClick:ai})])):(D(),s(`div`,Un,[j(`span`,{class:`text-caption text-medium-emphasis text-truncate d-inline-block`,style:{"max-width":`140px`},title:e.target_path||`未配置`},I(e.target_path?.trim()||`—`),9,Wn),l(f,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑目标路径`,onClick:L(t=>ii(e),[`stop`])},null,8,[`onClick`])]))]),"item.agent_version":k(({item:e})=>[j(`span`,Gn,I(e.agent_version||`—`),1)]),"item.last_heartbeat":k(({item:e})=>[j(`span`,Kn,I(M(He)(e.last_heartbeat)),1)]),"item.actions":k(({item:e})=>[j(`div`,qn,[l(f,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:L(t=>Mr(e),[`stop`])},{default:k(()=>[...c[71]||=[T(`终端`,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:L(t=>Nr(e),[`stop`])},{default:k(()=>[...c[72]||=[T(`文件`,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,density:`compact`,loading:Ir.value===e.id,onClick:L(t=>zr(e),[`stop`])},{default:k(()=>[...c[73]||=[T(`诊断`,-1)]]),_:1},8,[`loading`,`onClick`]),l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:L(t=>Br(e),[`stop`])},{default:k(()=>[...c[74]||=[T(`编辑`,-1)]]),_:1},8,[`onClick`]),l(f,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:L(t=>Vr(e),[`stop`])},{default:k(()=>[...c[75]||=[T(`删除`,-1)]]),_:1},8,[`onClick`])])]),"expanded-row":k(({columns:e,item:t})=>[j(`tr`,null,[j(`td`,{colspan:e.length,class:`pa-0`},[l(pn,{server:t,active:V.value.includes(t.id),onEditPath:e=>ii(t)},null,8,[`server`,`active`,`onEditPath`])],8,Jn)])]),"no-data":k(()=>[...c[76]||=[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`])),[[Oe,!(M(ce)&&!M(ae).length)]]):(D(),s(`div`,Yn,[zt.value?(D(),s(`div`,Xn,[l(oe,{indeterminate:``,size:`32`}),c[77]||=j(`div`,{class:`text-caption text-medium-emphasis mt-2`},`按分类加载中…`,-1)])):Ut.value.length===0?(D(),s(`div`,Zn,` 暂无服务器数据 `)):(D(),U(Et,{key:2,modelValue:Bt.value,"onUpdate:modelValue":c[20]||=e=>Bt.value=e,multiple:``,variant:`accordion`,class:`servers-category-panels`},{default:k(()=>[(D(!0),s(P,null,E(Ut.value,t=>(D(),U(wt,{key:t.category},{default:k(()=>[l(Tt,null,{default:k(()=>[j(`div`,Qn,[l(W,{color:`primary`,variant:`tonal`,size:`small`,label:``},{default:k(()=>[T(I(t.label),1)]),_:2},1024),j(`span`,$n,I(t.servers.length)+` 台`,1),l(A),l(f,{size:`x-small`,variant:`text`,onClick:L(e=>Yt(t.servers),[`stop`])},{default:k(()=>[T(I(Jt(t.servers)?`取消本组`:`全选本组`),1)]),_:2},1032,[`onClick`])])]),_:2},1024),l(Ct,null,{default:k(()=>[l(e,{density:`compact`,hover:``},{default:k(()=>[c[79]||=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),s(P,null,E(t.servers,e=>(D(),s(`tr`,{key:e.id},[j(`td`,{onClick:c[18]||=L(()=>{},[`stop`])},[l(it,{"model-value":_r.value.has(e.id),density:`compact`,"hide-details":``,"onUpdate:modelValue":t=>Gt(e.id,t)},null,8,[`model-value`,`onUpdate:modelValue`])]),j(`td`,null,[l(W,{color:M(Ge)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:k(()=>[T(I(M(Be)(e.status)),1)]),_:2},1032,[`color`])]),j(`td`,er,I(e.name),1),j(`td`,tr,I(e.domain)+`:`+I(e.port),1),j(`td`,nr,I(e.target_path?.trim()||`—`),1),j(`td`,{class:`text-end`,onClick:c[19]||=L(()=>{},[`stop`])},[l(f,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>Br(e)},{default:k(()=>[...c[78]||=[T(`编辑`,-1)]]),_:1},8,[`onClick`])])]))),128))])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1},8,[`modelValue`]))]))]),_:1}),l(wn,{highlight:Sr.value,servers:Me.value,loading:Fe.value,total:Ne.value,page:B.value,"items-per-page":Ie.value,"items-per-page-options":g,"expanded-ids":H.value,"selected-items":K.value,"onUpdate:selectedItems":c[21]||=e=>K.value=e,"sort-by":M(ye),"onUpdate:sortBy":c[22]||=e=>o(ye)?ye.value=e:null,"select-all-loading":$e.value,"editing-path-id":Yr.value,"editing-path-value":Xr.value,"saving-path-id":Zr.value,onRefresh:c[23]||=e=>st(),"onUpdate:page":ft,"onUpdate:itemsPerPage":mt,"onUpdate:expandedIds":c[24]||=e=>H.value=e,"onUpdate:editingPathValue":c[25]||=e=>Xr.value=e,onSelectAllFiltered:ot,onToggleExpand:lt,onTerminal:Mr,onFiles:Nr,onDetectPathSingle:_t,onAgentDiagnose:zr,onEdit:Br,onDelete:Vr,onEditPath:ii,onSavePath:oi,onCancelEditPath:ai,onBatchCategory:c[26]||=e=>Kr(`unset`),onHealthCheck:c[27]||=e=>ei(`unset`),onDetectPath:c[28]||=e=>Qr(`unset`),onInstallAgent:c[29]||=e=>ti(`unset`),onUpgradeAgent:c[30]||=e=>ni(`unset`),onUninstallAgent:c[31]||=e=>ri(`unset`),onBatchDelete:c[32]||=e=>si(`unset`),onClearSelection:c[33]||=e=>K.value=[]},null,8,[`highlight`,`servers`,`loading`,`total`,`page`,`items-per-page`,`expanded-ids`,`selected-items`,`sort-by`,`select-all-loading`,`editing-path-id`,`editing-path-value`,`saving-path-id`]),l(q,{id:`pending-servers-panel`,elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:k(()=>[l(J,{class:`d-flex align-center`},{default:k(()=>[c[81]||=T(` 连接失败列表 `,-1),nn.value.length?(D(),U(W,{key:0,size:`small`,class:`ml-2`,color:`error`,variant:`tonal`,label:``},{default:k(()=>[T(I(nn.value.length),1)]),_:1})):w(``,!0),l(A),l(f,{variant:`text`,size:`small`,"prepend-icon":`mdi-refresh`,loading:rn.value,onClick:gn},{default:k(()=>[...c[80]||=[T(` 刷新 `,-1)]]),_:1},8,[`loading`])]),_:1}),l(t,{items:nn.value,headers:fn,loading:rn.value,hover:``,density:`comfortable`,"items-per-page":10},{"item.address":k(({item:e})=>[j(`span`,rr,I(e.domain)+`:`+I(e.port),1)]),"item.last_attempt_at":k(({item:e})=>[j(`span`,ir,I(M(He)(e.last_attempt_at)),1)]),"item.last_error":k(({item:e})=>[j(`span`,{class:`text-caption text-error text-truncate d-inline-block`,style:{"max-width":`320px`},title:e.last_error},I(e.last_error||`—`),9,ar)]),"item.actions":k(({item:e})=>[l(f,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,loading:an.value===e.id,onClick:t=>vn(e)},{default:k(()=>[...c[82]||=[T(` 重试 `,-1)]]),_:1},8,[`loading`,`onClick`]),l(f,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>yn(e)},{default:k(()=>[...c[83]||=[T(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":k(()=>[...c[84]||=[j(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无连接失败记录`,-1)]]),_:1},8,[`items`,`loading`])]),_:1}),l(Ft,{modelValue:M(xn),"onUpdate:modelValue":c[34]||=e=>o(xn)?xn.value=e:null,form:M(Sn),"is-editing":M(Cn),saving:M(Tn),"lookups-loading":M(En),"password-presets":M(Dn),"ssh-key-presets":M(On),"category-options":M(kn),platforms:M(jn),nodes:M(Nn),"edit-hints":M(Pn),"files-elevation-items":M(Fn),onSave:M(hr)},null,8,[`modelValue`,`form`,`is-editing`,`saving`,`lookups-loading`,`password-presets`,`ssh-key-presets`,`category-options`,`platforms`,`nodes`,`edit-hints`,`files-elevation-items`,`onSave`]),l(gt,{modelValue:Xt.value,"onUpdate:modelValue":c[36]||=e=>Xt.value=e,"max-width":`400`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[...c[85]||=[T(`确认删除`,-1)]]),_:1}),l(X,null,{default:k(()=>[c[86]||=T(`确定要删除服务器 `,-1),j(`strong`,null,I(Qt.value?.name),1),c[87]||=T(` 吗?`,-1)]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:c[35]||=e=>Xt.value=!1},{default:k(()=>[...c[88]||=[T(`取消`,-1)]]),_:1}),l(f,{color:`error`,variant:`flat`,onClick:yi,loading:Zt.value},{default:k(()=>[...c[89]||=[T(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(gt,{modelValue:$t.value,"onUpdate:modelValue":c[41]||=e=>$t.value=e,"max-width":`480`,persistent:``},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[...c[90]||=[T(`快速添加服务器(仅 IP)`,-1)]]),_:1}),l(X,null,{default:k(()=>[c[91]||=j(`p`,{class:`text-body-2 text-medium-emphasis mb-3`},` 将按顺序轮询凭据管理中的全部密码预设与 SSH 密钥预设尝试登录,首个成功即加入服务器列表。 `,-1),l(Y,{modelValue:tn.value.domain,"onUpdate:modelValue":c[37]||=e=>tn.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`]),l(Y,{modelValue:tn.value.port,"onUpdate:modelValue":c[38]||=e=>tn.value.port=e,modelModifiers:{number:!0},label:`SSH 端口`,variant:`outlined`,density:`compact`,type:`number`,class:`mb-2`},null,8,[`modelValue`]),l(Y,{modelValue:tn.value.name,"onUpdate:modelValue":c[39]||=e=>tn.value.name=e,label:`显示名称(可选)`,variant:`outlined`,density:`compact`,hint:`留空则使用 IP`,"persistent-hint":``},null,8,[`modelValue`])]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,disabled:en.value,onClick:c[40]||=e=>$t.value=!1},{default:k(()=>[...c[92]||=[T(`取消`,-1)]]),_:1},8,[`disabled`]),l(f,{color:`primary`,variant:`flat`,loading:en.value,onClick:_n},{default:k(()=>[...c[93]||=[T(`开始轮询`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(gt,{modelValue:on.value,"onUpdate:modelValue":c[43]||=e=>on.value=e,"max-width":`560`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,{class:`text-error`},{default:k(()=>[...c[94]||=[T(`SSH 连接失败`,-1)]]),_:1}),l(X,null,{default:k(()=>[c[95]||=j(`p`,{class:`text-body-2 mb-3`},`已尝试全部凭据预设,均未登录成功。该服务器已加入「连接失败列表」,可稍后重试。`,-1),sn.value.length?(D(),U(_e,{key:0,density:`compact`,class:`bg-grey-lighten-4 rounded`},{default:k(()=>[(D(!0),s(P,null,E(sn.value,(e,t)=>(D(),U(ve,{key:t},{default:k(()=>[l(F,{class:`text-body-2`},{default:k(()=>[T(` [`+I(e.preset_type===`password`?`密码`:e.preset_type===`system`?`系统`:`密钥`)+`] `+I(e.preset_name)+` (`+I(e.username)+`) `,1)]),_:2},1024),l(me,{class:`text-error`},{default:k(()=>[T(I(e.error),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})):(D(),s(`p`,or,I(cn.value),1))]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{color:`primary`,variant:`flat`,onClick:c[42]||=e=>on.value=!1},{default:k(()=>[...c[96]||=[T(`知道了`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(gt,{modelValue:ln.value,"onUpdate:modelValue":c[45]||=e=>ln.value=e,"max-width":`400`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[...c[97]||=[T(`确认删除`,-1)]]),_:1}),l(X,null,{default:k(()=>[c[98]||=T(`从失败列表移除 `,-1),j(`strong`,null,I(un.value?.domain),1),c[99]||=T(`?`,-1)]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:c[44]||=e=>ln.value=!1},{default:k(()=>[...c[100]||=[T(`取消`,-1)]]),_:1}),l(f,{color:`error`,variant:`flat`,loading:dn.value,onClick:bn},{default:k(()=>[...c[101]||=[T(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(gt,{modelValue:Jr.value,"onUpdate:modelValue":c[47]||=e=>Jr.value=e,"max-width":`480`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[...c[102]||=[T(`自动检测目标路径`,-1)]]),_:1}),l(X,null,{default:k(()=>[j(`p`,sr,[c[103]||=T(` 将对选中的 `,-1),j(`strong`,null,I(nt.value),1),c[104]||=T(` 台服务器执行 SSH 检测。 `,-1)]),c[105]||=j(`p`,{class:`text-body-2 text-medium-emphasis mb-0`},[T(` 在远程 `),j(`code`,null,`/www/wwwroot`),T(` 下搜索 `),j(`code`,null,`workerman.bat`),T(`,找到后将所在目录写入各服务器的 `),j(`strong`,null,`target_path`),T(`(找到第一个即停止)。 `)],-1)]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:c[46]||=e=>Jr.value=!1},{default:k(()=>[...c[106]||=[T(`取消`,-1)]]),_:1}),l(f,{color:`primary`,variant:`flat`,onClick:$r},{default:k(()=>[...c[107]||=[T(`开始检测`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(gt,{modelValue:Hr.value,"onUpdate:modelValue":c[50]||=e=>Hr.value=e,"max-width":`420`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[...c[108]||=[T(`批量修改分类`,-1)]]),_:1}),l(X,null,{default:k(()=>[j(`div`,cr,` 已选择 `+I(nt.value)+` 台服务器,将统一设置为以下分类(留空表示清除分类)。 `,1),l(Pt,{modelValue:Ur.value,"onUpdate:modelValue":c[48]||=e=>Ur.value=e,items:Gr.value,label:`分类`,variant:`outlined`,density:`compact`,clearable:``,"hide-details":``,placeholder:`输入或选择分类`},null,8,[`modelValue`,`items`])]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:c[49]||=e=>Hr.value=!1},{default:k(()=>[...c[109]||=[T(`取消`,-1)]]),_:1}),l(f,{color:`primary`,variant:`flat`,loading:Wr.value,onClick:qr},{default:k(()=>[...c[110]||=[T(` 确认 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(gt,{modelValue:ci.value,"onUpdate:modelValue":c[55]||=e=>ci.value=e,"max-width":`560`},{default:k(()=>[l(q,{border:``},{default:k(()=>[l(J,null,{default:k(()=>[...c[111]||=[T(`批量添加服务器`,-1)]]),_:1}),l(X,null,{default:k(()=>[c[112]||=j(`div`,{class:`text-body-2 text-medium-emphasis mb-3`},` 每行一个 IP 或域名;也可使用「名称 + Tab + IP」附带显示名称。空白行自动忽略,重复地址自动去重(不区分大小写)。SSH 凭据从「凭据」预设轮询匹配;连接失败将进入下方「连接失败列表」。 `,-1),l(xt,{modelValue:li.value,"onUpdate:modelValue":c[51]||=e=>li.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`]),gi.value.unique>0?(D(),s(`div`,lr,[T(` 将添加 `+I(gi.value.unique)+` 台 `,1),gi.value.deduped>0?(D(),s(`span`,ur,`(已去重 `+I(gi.value.deduped)+` 个重复)`,1)):w(``,!0)])):w(``,!0),l(a,{dense:``,class:`mt-1`},{default:k(()=>[l(i,{cols:`6`},{default:k(()=>[l(Y,{modelValue:ui.value,"onUpdate:modelValue":c[52]||=e=>ui.value=e,modelModifiers:{number:!0},label:`SSH 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1}),l(i,{cols:`6`},{default:k(()=>[l(Y,{modelValue:di.value,"onUpdate:modelValue":c[53]||=e=>di.value=e,modelModifiers:{number:!0},label:`Agent 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1})]),_:1}),pi.value?(D(),U(u,{key:1,type:pi.value.pending>0?`warning`:`success`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:k(()=>[T(` 共 `+I(pi.value.total)+` 台:成功 `+I(pi.value.created)+`,待连接 `+I(pi.value.pending)+`,跳过 `+I(pi.value.skipped)+` `,1),(pi.value.duplicates_removed??0)>0?(D(),s(`span`,dr,` (输入 `+I(pi.value.input_lines)+` 行,去重 `+I(pi.value.duplicates_removed)+` 个) `,1)):w(``,!0)]),_:1},8,[`type`])):w(``,!0)]),_:1}),l(Qe,null,{default:k(()=>[l(A),l(f,{variant:`text`,onClick:c[54]||=e=>ci.value=!1},{default:k(()=>[...c[113]||=[T(`关闭`,-1)]]),_:1}),l(f,{color:`primary`,variant:`flat`,onClick:vi,loading:fi.value,disabled:!li.value.trim()},{default:k(()=>[...c[114]||=[T(` 开始添加 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(An,{modelValue:x.value,"onUpdate:modelValue":c[56]||=e=>x.value=e},null,8,[`modelValue`]),l(Mn,{modelValue:Pr.value,"onUpdate:modelValue":c[57]||=e=>Pr.value=e,loading:Fr.value,result:Lr.value,"target-name":Rr.value?.name},null,8,[`modelValue`,`loading`,`result`,`target-name`])]),_:1}))}}),[[`__scopeId`,`data-v-b090730d`]]);export{fr as default}; |