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

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

4 lines
31 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{n as e,t}from"./initMonaco-BQe_Vc01.js";import{a as n,x as r}from"./VDataTable-BKN9-AAM.js";import{n as i,t as a}from"./useSnackbar-knhbsEw2.js";import{n as o,t as s}from"./VRow-CzXFTsmH.js";import{$ as c,$r as l,Br as u,Bt as ee,Cr as te,Dr as d,Ft as ne,It as re,Jt as f,Lt as ie,N as ae,Nr as p,O as oe,P as m,Pt as se,Qt as ce,Rr as le,Rt as ue,Vr as de,Vt as fe,W as pe,X as h,_ as g,_r as _,ar as me,bt as he,cr as v,dr as y,fr as b,hr as x,jr as S,jt as ge,kr as _e,l as ve,m as ye,mr as C,n as be,or as xe,pr as w,qr as T,ri as E,sr as Se,ti as Ce,v as D,vr as O,wr as we,y as k,yr as A,zt as Te}from"./index-B-6ti5uq.js";import{t as Ee}from"./usePageActivateRefresh-C5hQgakB.js";import{n as De,t as Oe}from"./dataTable-esDY4cOk.js";import{a as j,n as M,r as N,t as P}from"./VCard-DG7tl1W3.js";import{t as ke}from"./VSelect-aldIHHnJ.js";import{t as Ae}from"./VTextField-zCSFfS1g.js";import{t as je}from"./VDataTableServer-CjBqC_8R.js";import{t as F}from"./apiError-tpp1zGzn.js";import{t as Me}from"./useServerList-OGSwHB-x.js";import{t as Ne}from"./paginatedFetch-C4g8n3XU.js";import{t as Pe}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as Fe}from"./VDialog-CY50SVhr.js";import{i as Ie}from"./validation-DMwOxx4a.js";import{t as Le}from"./ServerCategoryPicker-BEiEm8ez.js";import{t as Re}from"./VSwitch-C6ndRQTG.js";import{t as ze}from"./VTextarea-C7GrnoX1.js";import{n as Be,t as Ve}from"./execDetailGrouping-D6aWeQF2.js";import{i as He,n as Ue,r as We,t as Ge}from"./VExpansionPanels-rWLcYwq9.js";var Ke=Pe(A({__name:`ScriptContentEditor`,props:{modelValue:{},readonly:{type:Boolean}},emits:[`update:modelValue`],setup(n,{emit:r}){let i=n,a=r,o=e(),s=T(),c=null,l=!1;function u(){s.value&&(c?.dispose(),c=o.editor.create(s.value,{...t({language:`shell`,readOnly:i.readonly??!1}),value:i.modelValue||``}),c.onDidChangeModelContent(()=>{l||!c||a(`update:modelValue`,c.getValue())}))}return le(()=>i.modelValue,e=>{c&&c.getValue()!==e&&(l=!0,c.setValue(e||``),l=!1)}),le(()=>i.readonly,e=>{c?.updateOptions({readOnly:e??!1})}),_e(()=>{u()}),d(()=>{c?.dispose(),c=null}),(e,t)=>(S(),x(`div`,{ref_key:`host`,ref:s,class:`script-content-editor`},null,512))}}),[[`__scopeId`,`data-v-8c9e5994`]]),qe={class:`text-body-1 font-weight-medium`},Je={class:`text-body-2 text-medium-emphasis`},Ye={class:`text-caption text-medium-emphasis mt-2`},Xe={key:3,class:`d-flex justify-center mt-4`},Ze={class:`text-caption`},Qe={key:2,class:`text-center text-medium-emphasis py-6`},$e={class:`text-body-2`},et={class:`text-caption text-medium-emphasis`},tt={class:`d-flex align-center flex-wrap ga-1`},nt={class:`text-caption text-medium-emphasis mb-2`},rt={class:`text-body-2 mb-3 pa-3 rounded bg-surface-variant overflow-auto`,style:{"max-height":`100px`}},it={key:0,class:`d-flex flex-wrap ga-2 mb-3`},at={class:`text-body-2`},ot={class:`d-flex align-center flex-wrap ga-2 mb-3`},st=[`onClick`],ct={class:`font-weight-medium`},lt={key:0,class:`text-caption text-medium-emphasis`},ut=[`title`],dt={key:0},ft={class:`d-flex align-center ga-2 flex-grow-1 min-width-0`},pt=[`title`],mt=[`onClick`],ht={class:`font-weight-medium`},gt={key:0,class:`text-caption text-medium-emphasis`},_t={class:`text-error font-weight-medium`},vt={key:4,class:`text-center text-medium-emphasis py-4`},yt={class:`d-flex align-center flex-wrap ga-2 mb-2`},bt={class:`text-subtitle-2`},xt={key:0,class:`text-medium-emphasis`},St={class:`text-body-2 overflow-auto exec-detail-output`},Ct=Pe(A({name:`ScriptsPage`,__name:`ScriptsPage`,setup(e){let t=[...Oe],d=a(),_e=ce(),{servers:A,loading:Pe,loadServers:Ct}=Me(),wt=[{label:`运维`,value:`ops`},{label:`部署`,value:`deploy`},{label:`检查`,value:`check`},{label:`清理`,value:`cleanup`}],Tt=T(!1),Et=T(``),I=T([]),L=T(null),Dt=T([]),Ot=T(1),kt=T(20),R=T(!1),At=T(null),jt=T(!1),z=T({name:``,category:`ops`,description:``,content:``}),Mt=T(!1),Nt=T(null),B=T([]),Pt=T(300),Ft=T(!1),It=T(null),Lt=T(!1),Rt=T(!1),zt=T(null),Bt=T(null),Vt=T([]),Ht=T(!1),Ut=T([]),Wt=T(0),V=T(1),Gt=T(20),Kt=T(!1),H=T(null),qt=T(!1),U=T(``),W=T([]),Jt=T(60),Yt=T(!1),Xt=T(null),Zt=T(!1),G=T(!1),K=T(null),Qt=T(!1),$t=T(null),q=T(`all`),en=T(`list`),J=T(null),tn=T([]),nn=y(()=>Dt.value.map(e=>({title:e.name,value:e.id}))),rn=y(()=>{let e=Et.value.trim().toLowerCase();return e?I.value.filter(t=>t.name.toLowerCase().includes(e)||(t.category||``).toLowerCase().includes(e)||(t.description||``).toLowerCase().includes(e)):I.value}),an=y(()=>rn.value.length),on=y(()=>{let e=(Ot.value-1)*kt.value;return rn.value.slice(e,e+kt.value)});le(Et,()=>{Ot.value=1});let sn=De([{title:`ID`,key:`id`,width:72},{title:`脚本/命令`,key:`label`},{title:`状态`,key:`status`,width:100},{title:`进度`,key:`progress`,width:88},{title:`台数`,key:`server_count`,width:72},{title:`操作人`,key:`operator`,width:88},{title:`开始时间`,key:`started_at`,width:168},{title:`操作`,key:`actions`,width:180}]),cn=y(()=>H.value?I.value.find(e=>e.id===H.value)?.name||`脚本 #${H.value}`:``),ln={started:`开始`,batch_progress:`批次进度`,execution_finished:`结束`,stopped:`停止`,retry_requested:`重试`,stuck_marked:`标记卡住`,server_auto_stuck:`子机超时`,auto_stuck:`自动卡住`,job_completed:`回调完成`},un=y(()=>new Map(A.value.map(e=>[e.id,e])));function dn(e){let t=(e.stderr||``).trim(),n=(e.stdout||``).trim(),r=(e.message||``).trim(),i=t||n||r||`—`;return{summary:(t||r||n||``).slice(0,200)||`—`,full:i}}let Y=y(()=>{if(!K.value?.results)return[];let e=un.value;return Object.entries(K.value.results).filter(([e])=>e!==`_meta`&&/^\d+$/.test(e)).map(([t,n])=>{let r=Number(t),i=e.get(r),a=String(n.status||``),o=n.phase?String(n.phase):void 0,s=n.exit_code??null,c=dn(n),l=ue(a,o,s),u=Te(o);return{serverId:t,serverIdNum:r,serverName:ee(t,K.value?.server_names,i?.name),serverDomain:i?.domain||``,status:a,phase:o,exitCode:s,summary:c.summary,fullOutput:c.full,failed:l,pending:u}}).sort((e,t)=>e.failed===t.failed?e.pending===t.pending?e.serverName.localeCompare(t.serverName,`zh`):e.pending?1:-1:e.failed?-1:1)}),X=y(()=>fe(K.value?.results,K.value?.server_ids)),fn=y(()=>Y.value.filter(e=>e.failed).map(e=>e.serverName)),pn=y(()=>Ve(Y.value)),mn=y(()=>q.value===`failed`?Y.value.filter(e=>e.failed):q.value===`success`?Y.value.filter(e=>!e.failed&&!e.pending):Y.value),Z=y(()=>Y.value.find(e=>e.serverId===J.value)||null);function hn(e){return fe(e.results,e.server_ids)}function gn(e){return wt.find(t=>t.value===e)?.label||e}function _n(e){if(!e)return`—`;let t=e.startsWith(`[long_task] `)?e.slice(12):e;return t.length>60?`${t.slice(0,60)}…`:t}function vn(e){return e.script_id?I.value.find(t=>t.id===e.script_id)?.name||`脚本 #${e.script_id}`:`临时命令`}function yn(e){if(!e)return`—`;let t=new Date(e);if(Number.isNaN(t.getTime()))return e.replace(`T`,` `).slice(0,19);let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}function bn(e){let t=e.events||[];return t.length?t.slice(-3).map(e=>{let t=ln[e.action||``]||e.action||`事件`,n=yn(e.at),r=e.detail||``;return`${n} · ${t}${r?` — ${r}`:``}`}):[]}async function xn(e=!1){e||(Ht.value=!0);try{Vt.value=(await f.get(`/scripts/executions`,{limit:5})).items||[]}catch{e||(Vt.value=[])}finally{e||(Ht.value=!1)}}async function Q(e=!1){e||(Kt.value=!0);try{let e=await Ne(async(e,t)=>{let n={limit:e,offset:t};H.value&&(n.script_id=H.value);let r=await f.get(`/scripts/executions`,n);return{items:r.items||[],total:r.total||0}},V.value,Gt.value);Ut.value=e.items,Wt.value=e.total,Gt.value===-1&&(V.value=1)}catch{e||(Ut.value=[],Wt.value=0)}finally{e||(Kt.value=!1)}}function $(e=!1){xn(e),Q(e)}Be($);function Sn(e){V.value=e,Q()}function Cn(e){Gt.value=e,V.value=1,Q()}function wn(){H.value=null,V.value=1,Q()}async function Tn(e){H.value=e.id,V.value=1,await Q(),await we(),Bt.value?.scrollIntoView({behavior:`smooth`,block:`start`})}function En(e){return e||`—`}function Dn(e){if(!e)return 0;try{let t=JSON.parse(e);return Array.isArray(t)?t.length:0}catch{return 0}}function On(e){let t=e.id??e.execution_id;if(t==null)throw Error(`执行响应缺少 id`);return t}async function kn(){Tt.value=!0;try{I.value=(await f.getList(`/scripts/`)).items}catch(e){I.value=[],d(F(e,`加载脚本列表失败`),`error`)}finally{Tt.value=!1}}async function An(){try{L.value=await f.get(`/scripts/exec-config`)}catch{L.value=null}}async function jn(){try{Dt.value=await f.getList(`/scripts/credentials`).then(e=>e.items)}catch{Dt.value=[]}}function Mn(e){At.value=e,e?z.value={name:e.name,category:e.category||`ops`,description:e.description||``,content:e.content||``}:z.value={name:``,category:`ops`,description:``,content:``},R.value=!0}async function Nn(){if(!z.value.name.trim()||!z.value.content.trim()){d(`请填写名称与脚本内容`,`warning`);return}jt.value=!0;try{let e={name:z.value.name.trim(),category:z.value.category,description:z.value.description.trim()||null,content:z.value.content};At.value?await f.put(`/scripts/${At.value.id}`,e):await f.post(`/scripts/`,e),R.value=!1,await kn(),d(`保存成功`)}catch(e){d(F(e,`保存失败`),`error`)}finally{jt.value=!1}}function Pn(e){Nt.value=e,B.value=[],Ft.value=!1,It.value=null,Mt.value=!0}async function Fn(e,t,n){let r=await f.post(`/scripts/exec`,e);return ge(On(r),t,n,!!e.long_task,r.progress,r.status),r}async function In(){if(!Nt.value||!B.value.length){d(`请选择服务器`,`warning`);return}Lt.value=!0;try{await Fn({script_id:Nt.value.id,server_ids:B.value,timeout:Pt.value,long_task:Ft.value,credential_id:It.value??void 0},Nt.value.name,B.value.length),Mt.value=!1,he(`脚本已提交执行`),$()}catch(e){d(F(e,`执行失败`),`error`)}finally{Lt.value=!1}}function Ln(e){zt.value=e,Rt.value=!0}async function Rn(){if(zt.value)try{await f.delete(`/scripts/${zt.value.id}`),Rt.value=!1,await kn(),d(`已删除`)}catch(e){d(F(e,`删除失败`),`error`)}}async function zn(){if(!(!U.value.trim()||W.value.length===0)){Zt.value=!0;try{await Fn({command:U.value.trim(),server_ids:W.value,timeout:Jt.value,long_task:Yt.value,credential_id:Xt.value??void 0},`临时命令`,W.value.length),he(`已在 ${W.value.length} 台服务器上执行`),$()}catch(e){d(F(e,`执行失败`),`error`)}finally{Zt.value=!1}}}async function Bn(e){try{await f.post(`/scripts/executions/${e.id}/stop`),$(),d(`已发送停止指令`)}catch(e){d(F(e,`停止失败`),`error`)}}async function Vn(e){try{let t=await f.post(`/scripts/executions/${e.id}/retry`,{});ge(On(t),`${vn(e)}(重试)`,Dn(e.server_ids)||Dn(t.server_ids),!!e.long_task,t.progress,t.status),$(),he(`重试已提交`)}catch(e){d(F(e,`重试失败`),`error`)}}async function Hn(e){if($t.value=e,q.value=`all`,en.value=`list`,J.value=null,tn.value=[],G.value=!0,await Zn(!1),fe(K.value?.results,K.value?.server_ids).failed>0&&(K.value?.status===`failed`||K.value?.status===`partial`)){q.value=`failed`;let e=Y.value.find(e=>e.failed);e&&(J.value=e.serverId)}}function Un(e){let t=e.serverDomain?` (${e.serverDomain})`:``,n=e.exitCode==null?``:` · exit ${e.exitCode}`,r=e.summary.split(`
`)[0]?.trim()||e.summary,i=r&&r!==`—`?` · ${r.slice(0,120)}`:``;return`- ${e.serverName}${t}${n}${i}`}async function Wn(e,t){try{await navigator.clipboard.writeText(e),d(t)}catch{d(`复制失败`,`error`)}}async function Gn(){let e=Y.value.filter(e=>e.failed);e.length&&await Wn([`执行 #${K.value?.id??$t.value} · 失败 ${e.length} 台`,...e.map(Un)].join(`
`),`已复制失败清单`)}async function Kn(){let e=pn.value;if(!e.length)return;let t=[`执行 #${K.value?.id??$t.value} · 失败分组 ${e.length} 类`];for(let n of e){let e=n.rows.map(e=>e.serverName).join(`、`);t.push(`[${n.errorKey.slice(0,120)}] ${n.count} 台: ${e}`)}await Wn(t.join(`
`),`已复制分组摘要`)}function qn(e){J.value=J.value===e?null:e}async function Jn(e){if(!(!e.fullOutput||e.fullOutput===`—`))try{await navigator.clipboard.writeText(e.fullOutput),d(`已复制到剪贴板`)}catch{d(`复制失败`,`error`)}}function Yn(e){_e.push({path:`/terminal`,query:{server_id:String(e)}})}async function Xn(){K.value&&await Vn(K.value)}async function Zn(e){if($t.value!=null){Qt.value=!0;try{K.value=await f.get(`/scripts/executions/${$t.value}`,{fetch_logs:e,log_lines:100})}catch(e){d(F(e,`加载详情失败`),`error`),G.value=!1}finally{Qt.value=!1}}}async function Qn(e=!1){await Promise.all([kn(),Ct({all:!0}),An(),jn(),$(e)])}return Ee(e=>Qn(e)),(e,a)=>(S(),w(i,{fluid:``,class:`pa-6`},{default:u(()=>[O(P,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:u(()=>[O(N,{class:`d-flex flex-wrap align-center ga-2`},{default:u(()=>[a[34]||=_(` 脚本库 `,-1),L.value?(S(),w(k,{key:0,size:`small`,variant:`tonal`,label:``,class:`ml-1`},{default:u(()=>[_(` 分批 `+E(L.value.batch_size)+` 台 · 并发 `+E(L.value.concurrency),1)]),_:1})):C(``,!0),O(g),O(Ae,{modelValue:Et.value,"onUpdate:modelValue":a[0]||=e=>Et.value=e,"prepend-inner-icon":`mdi-magnify`,label:`搜索...`,density:`compact`,"hide-details":``,variant:`outlined`,rounded:``,style:{"max-width":`240px`}},null,8,[`modelValue`]),O(m,{color:`primary`,variant:`flat`,class:`ml-1`,"prepend-icon":`mdi-plus`,size:`small`,onClick:a[1]||=e=>Mn(null)},{default:u(()=>[...a[33]||=[_(` 新建脚本 `,-1)]]),_:1})]),_:1})]),_:1}),O(P,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:u(()=>[O(N,{class:`d-flex align-center`,style:{cursor:`pointer`},onClick:a[2]||=e=>qt.value=!qt.value},{default:u(()=>[O(h,{class:`mr-2`},{default:u(()=>[...a[35]||=[_(`mdi-console`,-1)]]),_:1}),a[36]||=_(` 临时命令执行 `,-1),O(g),O(h,null,{default:u(()=>[_(E(qt.value?`mdi-chevron-up`:`mdi-chevron-down`),1)]),_:1})]),_:1}),O(oe,null,{default:u(()=>[de(b(`div`,null,[O(D),O(M,null,{default:u(()=>[O(ze,{modelValue:U.value,"onUpdate:modelValue":a[3]||=e=>U.value=e,label:`命令`,variant:`outlined`,density:`compact`,rows:`3`,placeholder:`输入要执行的命令... (Ctrl+Enter 执行)`,class:`mb-3 font-monospace`,onKeydown:xe(Se(zn,[`ctrl`]),[`enter`]),rules:[l(Ie)(`命令`)]},null,8,[`modelValue`,`onKeydown`,`rules`]),a[38]||=b(`div`,{class:`text-caption text-medium-emphasis mb-1`},`目标服务器(按分类选择)`,-1),O(Le,{modelValue:W.value,"onUpdate:modelValue":a[4]||=e=>W.value=e,servers:l(A),loading:l(Pe),"max-height":`220px`,class:`mb-3`},null,8,[`modelValue`,`servers`,`loading`]),O(s,{dense:``},{default:u(()=>[O(o,{cols:`6`,md:`2`},{default:u(()=>[O(Ae,{modelValue:Jt.value,"onUpdate:modelValue":a[5]||=e=>Jt.value=e,modelModifiers:{number:!0},label:`超时(秒)`,variant:`outlined`,density:`compact`,type:`number`,max:L.value?.max_timeout??600},null,8,[`modelValue`,`max`])]),_:1}),O(o,{cols:`6`,md:`3`},{default:u(()=>[O(ke,{modelValue:Xt.value,"onUpdate:modelValue":a[6]||=e=>Xt.value=e,items:nn.value,"item-title":`title`,"item-value":`value`,label:`DB 凭据(可选)`,variant:`outlined`,density:`compact`,clearable:``,"hide-details":``},null,8,[`modelValue`,`items`])]),_:1}),O(o,{cols:`12`,md:`2`,class:`d-flex align-center ga-2`},{default:u(()=>[O(Re,{modelValue:Yt.value,"onUpdate:modelValue":a[7]||=e=>Yt.value=e,label:`长任务`,density:`compact`,"hide-details":``,color:`primary`},null,8,[`modelValue`]),O(m,{color:`primary`,variant:`flat`,onClick:zn,loading:Zt.value,disabled:!U.value.trim()||W.value.length===0},{default:u(()=>[...a[37]||=[_(` 执行 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1})],512),[[me,qt.value]])]),_:1})]),_:1}),Tt.value?(S(),w(pe,{key:0,indeterminate:``,color:`primary`})):C(``,!0),on.value.length?(S(),w(s,{key:1},{default:u(()=>[(S(!0),x(v,null,p(on.value,e=>(S(),w(o,{cols:`12`,sm:`6`,md:`4`,key:e.id},{default:u(()=>[O(P,{elevation:`0`,border:``,rounded:`lg`,class:`fill-height`},{default:u(()=>[O(N,{class:`d-flex align-center`},{default:u(()=>[O(h,{color:`primary`,class:`mr-2`},{default:u(()=>[...a[39]||=[_(`mdi-code-braces`,-1)]]),_:1}),b(`span`,qe,E(e.name),1),O(g),O(be,null,{activator:u(({props:e})=>[O(m,te({icon:`mdi-dots-vertical`,variant:`text`,size:`small`},{ref_for:!0},e),null,16)]),default:u(()=>[O(ve,{density:`compact`},{default:u(()=>[O(ye,{title:`编辑`,onClick:t=>Mn(e)},{prepend:u(()=>[O(h,null,{default:u(()=>[...a[40]||=[_(`mdi-pencil`,-1)]]),_:1})]),_:1},8,[`onClick`]),O(ye,{title:`执行`,onClick:t=>Pn(e)},{prepend:u(()=>[O(h,null,{default:u(()=>[...a[41]||=[_(`mdi-play`,-1)]]),_:1})]),_:1},8,[`onClick`]),O(ye,{title:`删除`,onClick:t=>Ln(e),class:`text-error`},{prepend:u(()=>[O(h,{color:`error`},{default:u(()=>[...a[42]||=[_(`mdi-delete`,-1)]]),_:1})]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024)]),_:2},1024),O(M,null,{default:u(()=>[e.category?(S(),w(k,{key:0,size:`small`,variant:`tonal`,label:``,class:`mb-2`},{default:u(()=>[_(E(gn(e.category)),1)]),_:2},1024)):C(``,!0),b(`div`,Je,E(e.description||`无描述`),1),b(`div`,Ye,` 更新于 `+E(e.updated_at||e.created_at||`—`),1)]),_:2},1024),O(j,null,{default:u(()=>[O(m,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-play`,color:`primary`,onClick:t=>Pn(e)},{default:u(()=>[...a[43]||=[_(` 执行 `,-1)]]),_:1},8,[`onClick`]),O(g),O(m,{size:`small`,variant:`text`,onClick:t=>Tn(e)},{default:u(()=>[...a[44]||=[_(`历史`,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1})):Tt.value?C(``,!0):(S(),w(P,{key:2,elevation:`0`,border:``,rounded:`lg`},{default:u(()=>[O(M,{class:`text-center text-medium-emphasis py-10`},{default:u(()=>[...a[45]||=[_(`暂无脚本,点击「新建脚本」添加`,-1)]]),_:1})]),_:1})),an.value>kt.value?(S(),x(`div`,Xe,[O(r,{modelValue:Ot.value,"onUpdate:modelValue":a[8]||=e=>Ot.value=e,length:Math.ceil(an.value/kt.value),rounded:``,density:`compact`},null,8,[`modelValue`,`length`])])):C(``,!0),b(`div`,{ref_key:`historySectionRef`,ref:Bt},[O(P,{elevation:`0`,border:``,rounded:`lg`,class:`mt-4`},{default:u(()=>[O(N,{class:`d-flex align-center text-subtitle-1`},{default:u(()=>[O(h,{class:`mr-2`},{default:u(()=>[...a[46]||=[_(`mdi-history`,-1)]]),_:1}),a[47]||=_(` 最近执行 `,-1),O(g),O(m,{size:`small`,variant:`text`,icon:`mdi-refresh`,loading:Ht.value,onClick:xn},null,8,[`loading`])]),_:1}),O(D),O(M,{class:`pa-0`},{default:u(()=>[Ht.value?(S(),w(pe,{key:0,indeterminate:``,color:`primary`})):C(``,!0),Vt.value.length?(S(),w(ve,{key:1,density:`compact`,class:`py-0`},{default:u(()=>[(S(!0),x(v,null,p(Vt.value,e=>(S(),w(ye,{key:e.id,title:`#${e.id} · ${vn(e)}`,onClick:t=>Hn(e.id),style:{cursor:`pointer`}},{subtitle:u(()=>[b(`div`,Ze,E(l(ie)(e.status))+` · `+E(Dn(e.server_ids))+` 台 · `+E(e.operator||`—`)+` · `+E(yn(e.started_at)),1),(S(!0),x(v,null,p(bn(e),(e,t)=>(S(),x(`div`,{key:t,class:`text-caption text-medium-emphasis font-monospace mt-1`},E(e),1))),128))]),append:u(()=>[O(k,{color:l(re)(e.status),size:`x-small`,variant:`tonal`,label:``},{default:u(()=>[_(E(l(ie)(e.status)),1)]),_:2},1032,[`color`])]),_:2},1032,[`title`,`onClick`]))),128))]),_:1})):Ht.value?C(``,!0):(S(),x(`div`,Qe,`暂无执行记录`))]),_:1})]),_:1}),O(P,{elevation:`0`,border:``,rounded:`lg`,class:`mt-4`},{default:u(()=>[O(N,{class:`d-flex flex-wrap align-center ga-2 text-subtitle-1`},{default:u(()=>[O(h,{class:`mr-1`},{default:u(()=>[...a[48]||=[_(`mdi-format-list-bulleted`,-1)]]),_:1}),a[49]||=_(` 全部执行历史 `,-1),H.value?(S(),w(k,{key:0,size:`small`,variant:`tonal`,closable:``,label:``,"onClick:close":wn},{default:u(()=>[_(E(cn.value),1)]),_:1})):C(``,!0),O(g),O(m,{size:`small`,variant:`text`,icon:`mdi-refresh`,loading:Kt.value,onClick:Q},null,8,[`loading`])]),_:1}),O(D),O(je,{items:Ut.value,headers:l(sn),"items-length":Wt.value,loading:Kt.value,page:V.value,"items-per-page":Gt.value,"items-per-page-options":t,density:`compact`,hover:``,"onUpdate:page":Sn,"onUpdate:itemsPerPage":Cn},{"item.label":u(({item:e})=>[b(`div`,$e,E(vn(e)),1),b(`code`,et,E(_n(e.command)),1)]),"item.status":u(({item:e})=>[O(k,{color:l(re)(e.status),size:`x-small`,variant:`tonal`,label:``},{default:u(()=>[_(E(l(ie)(e.status)),1)]),_:2},1032,[`color`])]),"item.server_count":u(({item:e})=>[_(E(Dn(e.server_ids)),1)]),"item.progress":u(({item:e})=>[b(`div`,tt,[b(`span`,null,E(En(e.progress)),1),hn(e).failed>0?(S(),w(k,{key:0,color:`error`,size:`x-small`,variant:`tonal`,label:``},{default:u(()=>[_(E(hn(e).failed)+` 台失败 `,1)]),_:2},1024)):C(``,!0)])]),"item.started_at":u(({item:e})=>[_(E(yn(e.started_at)),1)]),"item.actions":u(({item:e})=>[O(m,{size:`x-small`,variant:`text`,onClick:t=>Hn(e.id)},{default:u(()=>[...a[50]||=[_(`详情`,-1)]]),_:1},8,[`onClick`]),e.status===`running`||e.status===`partial`?(S(),w(m,{key:0,size:`x-small`,variant:`text`,color:`error`,onClick:t=>Bn(e)},{default:u(()=>[...a[51]||=[_(` 停止 `,-1)]]),_:1},8,[`onClick`])):C(``,!0),e.status===`failed`||e.status===`partial`?(S(),w(m,{key:1,size:`x-small`,variant:`text`,color:`primary`,onClick:t=>Vn(e)},{default:u(()=>[...a[52]||=[_(` 重试 `,-1)]]),_:1},8,[`onClick`])):C(``,!0)]),"no-data":u(()=>[...a[53]||=[b(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无执行记录`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`,`items-per-page`])]),_:1})],512),O(Fe,{modelValue:R.value,"onUpdate:modelValue":a[14]||=e=>R.value=e,"max-width":`900`,scrollable:``},{default:u(()=>[O(P,{border:``},{default:u(()=>[O(N,null,{default:u(()=>[_(E(At.value?`编辑脚本`:`新建脚本`),1)]),_:1}),O(D),O(M,null,{default:u(()=>[O(Ae,{modelValue:z.value.name,"onUpdate:modelValue":a[9]||=e=>z.value.name=e,label:`脚本名称`,variant:`outlined`,density:`compact`,class:`mb-2`,rules:[l(Ie)(`脚本名称`)]},null,8,[`modelValue`,`rules`]),O(ke,{modelValue:z.value.category,"onUpdate:modelValue":a[10]||=e=>z.value.category=e,items:wt,"item-title":`label`,"item-value":`value`,label:`分类`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),O(ze,{modelValue:z.value.description,"onUpdate:modelValue":a[11]||=e=>z.value.description=e,label:`描述`,variant:`outlined`,density:`compact`,rows:`2`,class:`mb-2`},null,8,[`modelValue`]),a[54]||=b(`div`,{class:`text-caption text-medium-emphasis mb-1`},`脚本内容`,-1),O(Ke,{modelValue:z.value.content,"onUpdate:modelValue":a[12]||=e=>z.value.content=e},null,8,[`modelValue`])]),_:1}),O(D),O(j,null,{default:u(()=>[O(g),O(m,{variant:`text`,onClick:a[13]||=e=>R.value=!1},{default:u(()=>[...a[55]||=[_(`取消`,-1)]]),_:1}),O(m,{color:`primary`,variant:`flat`,onClick:Nn,loading:jt.value,disabled:!z.value.content.trim()},{default:u(()=>[...a[56]||=[_(` 保存 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),O(Fe,{modelValue:Mt.value,"onUpdate:modelValue":a[20]||=e=>Mt.value=e,"max-width":`720`,scrollable:``},{default:u(()=>[O(P,{border:``},{default:u(()=>[O(N,null,{default:u(()=>[_(`执行脚本: `+E(Nt.value?.name),1)]),_:1}),O(M,null,{default:u(()=>[a[57]||=b(`div`,{class:`text-caption text-medium-emphasis mb-1`},`选择服务器(按分类勾选)`,-1),O(Le,{modelValue:B.value,"onUpdate:modelValue":a[15]||=e=>B.value=e,servers:l(A),loading:l(Pe),"max-height":`360px`,class:`mb-2`},null,8,[`modelValue`,`servers`,`loading`]),O(s,{dense:``},{default:u(()=>[O(o,{cols:`6`},{default:u(()=>[O(Ae,{modelValue:Pt.value,"onUpdate:modelValue":a[16]||=e=>Pt.value=e,modelModifiers:{number:!0},label:`超时(秒)`,variant:`outlined`,density:`compact`,type:`number`,max:L.value?.max_timeout??600},null,8,[`modelValue`,`max`])]),_:1}),O(o,{cols:`6`},{default:u(()=>[O(ke,{modelValue:It.value,"onUpdate:modelValue":a[17]||=e=>It.value=e,items:nn.value,"item-title":`title`,"item-value":`value`,label:`DB 凭据(可选)`,variant:`outlined`,density:`compact`,clearable:``},null,8,[`modelValue`,`items`])]),_:1})]),_:1}),O(Re,{modelValue:Ft.value,"onUpdate:modelValue":a[18]||=e=>Ft.value=e,label:`长任务(nohup + Agent 回调,适合超时较长的脚本)`,density:`compact`,color:`primary`},null,8,[`modelValue`])]),_:1}),O(j,null,{default:u(()=>[O(g),O(m,{variant:`text`,onClick:a[19]||=e=>Mt.value=!1},{default:u(()=>[...a[58]||=[_(`取消`,-1)]]),_:1}),O(m,{color:`primary`,variant:`flat`,onClick:In,loading:Lt.value,disabled:!B.value.length},{default:u(()=>[...a[59]||=[_(` 执行 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),O(Fe,{modelValue:Rt.value,"onUpdate:modelValue":a[22]||=e=>Rt.value=e,"max-width":`400`},{default:u(()=>[O(P,{border:``},{default:u(()=>[O(N,null,{default:u(()=>[...a[60]||=[_(`确认删除`,-1)]]),_:1}),O(M,null,{default:u(()=>[a[61]||=_(`确定要删除脚本 `,-1),b(`strong`,null,E(zt.value?.name),1),a[62]||=_(` 吗?`,-1)]),_:1}),O(j,null,{default:u(()=>[O(g),O(m,{variant:`text`,onClick:a[21]||=e=>Rt.value=!1},{default:u(()=>[...a[63]||=[_(`取消`,-1)]]),_:1}),O(m,{color:`error`,variant:`flat`,onClick:Rn},{default:u(()=>[...a[64]||=[_(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),O(Fe,{modelValue:G.value,"onUpdate:modelValue":a[32]||=e=>G.value=e,"max-width":`960`,scrollable:``},{default:u(()=>[O(P,{border:``},{default:u(()=>[O(N,{class:`d-flex align-center flex-wrap ga-2`},{default:u(()=>[b(`span`,null,`执行详情 #`+E(K.value?.id),1),K.value?(S(),w(k,{key:0,color:l(re)(K.value.status),size:`small`,variant:`tonal`,label:``},{default:u(()=>[_(E(l(ie)(K.value.status)),1)]),_:1},8,[`color`])):C(``,!0),O(g),K.value?.long_task?(S(),w(m,{key:1,size:`small`,variant:`tonal`,loading:Qt.value,onClick:a[23]||=e=>Zn(!0)},{default:u(()=>[...a[65]||=[_(` 拉取日志 `,-1)]]),_:1},8,[`loading`])):C(``,!0)]),_:1}),O(D),K.value?(S(),w(M,{key:0},{default:u(()=>[b(`div`,nt,E(En(K.value.progress))+` · 操作人 `+E(K.value.operator||`—`),1),b(`pre`,rt,E(K.value.command),1),X.value.total?(S(),x(`div`,it,[O(k,{size:`small`,variant:`tonal`,label:``},{default:u(()=>[_(`共 `+E(X.value.total)+` 台`,1)]),_:1}),X.value.success?(S(),w(k,{key:0,color:`success`,size:`small`,variant:`tonal`,label:``},{default:u(()=>[_(` 成功 `+E(X.value.success),1)]),_:1})):C(``,!0),X.value.failed?(S(),w(k,{key:1,color:`error`,size:`small`,variant:`tonal`,label:``},{default:u(()=>[_(` 失败 `+E(X.value.failed),1)]),_:1})):C(``,!0),X.value.pending?(S(),w(k,{key:2,color:`info`,size:`small`,variant:`tonal`,label:``},{default:u(()=>[_(` 进行中 `+E(X.value.pending),1)]),_:1})):C(``,!0)])):C(``,!0),fn.value.length?(S(),w(ae,{key:1,type:`error`,variant:`tonal`,density:`compact`,class:`mb-3`,title:`失败 ${fn.value.length} 台`},{default:u(()=>[b(`div`,at,E(fn.value.join(`、`)),1)]),_:1},8,[`title`])):C(``,!0),b(`div`,ot,[a[74]||=b(`span`,{class:`text-caption text-medium-emphasis`},`筛选`,-1),O(c,{modelValue:q.value,"onUpdate:modelValue":a[24]||=e=>q.value=e,mandatory:``,density:`compact`,color:`primary`,variant:`outlined`,divided:``},{default:u(()=>[O(m,{value:`all`,size:`small`},{default:u(()=>[...a[66]||=[_(`全部`,-1)]]),_:1}),O(m,{value:`failed`,size:`small`},{default:u(()=>[...a[67]||=[_(`仅失败`,-1)]]),_:1}),O(m,{value:`success`,size:`small`},{default:u(()=>[...a[68]||=[_(`仅成功`,-1)]]),_:1})]),_:1},8,[`modelValue`]),X.value.failed>0?(S(),x(v,{key:0},[O(D,{vertical:``,class:`mx-1`}),a[73]||=b(`span`,{class:`text-caption text-medium-emphasis`},`视图`,-1),O(c,{modelValue:en.value,"onUpdate:modelValue":a[25]||=e=>en.value=e,mandatory:``,density:`compact`,color:`primary`,variant:`outlined`,divided:``},{default:u(()=>[O(m,{value:`list`,size:`small`},{default:u(()=>[...a[69]||=[_(`列表`,-1)]]),_:1}),O(m,{value:`group`,size:`small`},{default:u(()=>[...a[70]||=[_(`按错误分组`,-1)]]),_:1})]),_:1},8,[`modelValue`]),O(m,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-copy`,onClick:Gn},{default:u(()=>[...a[71]||=[_(` 复制失败清单 `,-1)]]),_:1}),en.value===`group`?(S(),w(m,{key:0,size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-copy`,onClick:Kn},{default:u(()=>[...a[72]||=[_(` 复制分组摘要 `,-1)]]),_:1})):C(``,!0)],64)):C(``,!0)]),en.value===`list`?(S(),w(n,{key:2,density:`compact`,class:`exec-detail-table`},{default:u(()=>[a[76]||=b(`thead`,null,[b(`tr`,null,[b(`th`,null,`服务器`),b(`th`,null,`状态`),b(`th`,{style:{width:`72px`}},`退出码`),b(`th`,null,`错误摘要`),b(`th`,{style:{width:`120px`},class:`text-end`},`操作`)])],-1),b(`tbody`,null,[(S(!0),x(v,null,p(mn.value,e=>(S(),x(`tr`,{key:e.serverId,class:Ce([{"exec-detail-row--failed":e.failed,"exec-detail-row--active":J.value===e.serverId},`exec-detail-row cursor-pointer`]),onClick:t=>qn(e.serverId)},[b(`td`,null,[b(`div`,ct,E(e.serverName),1),e.serverDomain?(S(),x(`div`,lt,E(e.serverDomain),1)):C(``,!0)]),b(`td`,null,[O(k,{color:l(se)(e.status,e.phase,e.exitCode),size:`x-small`,variant:`tonal`,label:``},{default:u(()=>[_(E(l(ne)(e.status,e.phase)),1)]),_:2},1032,[`color`])]),b(`td`,{class:Ce({"text-error font-weight-medium":e.failed})},E(e.exitCode??`—`),3),b(`td`,{class:`text-truncate`,style:{"max-width":`280px`},title:e.summary},E(e.summary),9,ut),b(`td`,{class:`text-end`,onClick:a[26]||=Se(()=>{},[`stop`])},[e.fullOutput&&e.fullOutput!==`—`?(S(),w(m,{key:0,size:`x-small`,variant:`text`,icon:`mdi-content-copy`,title:`复制输出`,onClick:t=>Jn(e)},null,8,[`onClick`])):C(``,!0),O(m,{size:`x-small`,variant:`text`,icon:`mdi-console`,title:`打开终端`,onClick:t=>Yn(e.serverIdNum)},null,8,[`onClick`])])],10,st))),128)),mn.value.length===0?(S(),x(`tr`,dt,[...a[75]||=[b(`td`,{colspan:`5`,class:`text-center text-medium-emphasis py-4`},`当前筛选无记录`,-1)]])):C(``,!0)])]),_:1})):pn.value.length?(S(),w(Ge,{key:3,modelValue:tn.value,"onUpdate:modelValue":a[28]||=e=>tn.value=e,multiple:``,variant:`accordion`,class:`exec-detail-groups`},{default:u(()=>[(S(!0),x(v,null,p(pn.value,(e,t)=>(S(),w(Ue,{key:`${t}-${e.errorKey}`},{default:u(()=>[O(We,null,{default:u(()=>[b(`div`,ft,[b(`span`,{class:`text-body-2 text-truncate`,title:e.errorKey},E(e.errorKey),9,pt),O(k,{color:`error`,size:`x-small`,variant:`tonal`,label:``},{default:u(()=>[_(E(e.count)+` 台`,1)]),_:2},1024)])]),_:2},1024),O(He,null,{default:u(()=>[O(n,{density:`compact`},{default:u(()=>[a[77]||=b(`thead`,null,[b(`tr`,null,[b(`th`,null,`服务器`),b(`th`,{style:{width:`72px`}},`退出码`),b(`th`,{style:{width:`120px`},class:`text-end`},`操作`)])],-1),b(`tbody`,null,[(S(!0),x(v,null,p(e.rows,e=>(S(),x(`tr`,{key:e.serverId,class:Ce([{"exec-detail-row--active":J.value===e.serverId},`exec-detail-row cursor-pointer`]),onClick:t=>qn(e.serverId)},[b(`td`,null,[b(`div`,ht,E(e.serverName),1),e.serverDomain?(S(),x(`div`,gt,E(e.serverDomain),1)):C(``,!0)]),b(`td`,_t,E(e.exitCode??`—`),1),b(`td`,{class:`text-end`,onClick:a[27]||=Se(()=>{},[`stop`])},[e.fullOutput&&e.fullOutput!==`—`?(S(),w(m,{key:0,size:`x-small`,variant:`text`,icon:`mdi-content-copy`,title:`复制输出`,onClick:t=>Jn(e)},null,8,[`onClick`])):C(``,!0),O(m,{size:`x-small`,variant:`text`,icon:`mdi-console`,title:`打开终端`,onClick:t=>Yn(e.serverIdNum)},null,8,[`onClick`])])],10,mt))),128))])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1},8,[`modelValue`])):(S(),x(`div`,vt,`无失败记录可分组`)),Z.value?(S(),w(P,{key:5,variant:`tonal`,color:Z.value.failed?`error`:void 0,class:`mt-3 pa-3`},{default:u(()=>[b(`div`,yt,[b(`span`,bt,[_(E(Z.value.serverName)+` `,1),Z.value.serverDomain?(S(),x(`span`,xt,``+E(Z.value.serverDomain)+``,1)):C(``,!0)]),O(g),O(m,{size:`x-small`,variant:`text`,"prepend-icon":`mdi-content-copy`,onClick:a[29]||=e=>Jn(Z.value)},{default:u(()=>[...a[78]||=[_(` 复制 `,-1)]]),_:1}),O(m,{size:`x-small`,variant:`text`,"prepend-icon":`mdi-console`,onClick:a[30]||=e=>Yn(Z.value.serverIdNum)},{default:u(()=>[...a[79]||=[_(` 终端 `,-1)]]),_:1})]),b(`pre`,St,E(Z.value.fullOutput),1)]),_:1},8,[`color`])):C(``,!0)]),_:1})):C(``,!0),K.value?(S(),w(j,{key:1},{default:u(()=>[K.value.status===`failed`||K.value.status===`partial`?(S(),w(m,{key:0,color:`primary`,variant:`text`,onClick:Xn},{default:u(()=>[...a[80]||=[_(` 重试失败项 `,-1)]]),_:1})):C(``,!0),O(g),O(m,{variant:`text`,onClick:a[31]||=e=>G.value=!1},{default:u(()=>[...a[81]||=[_(`关闭`,-1)]]),_:1})]),_:1})):C(``,!0)]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}}),[[`__scopeId`,`data-v-064134c5`]]);export{Ct as default};