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