0b2d7ac50d
脚本 exec 立即返回 running 并在后台跑批次;/ws/alerts 推送 script_progress/complete; 新增 ScriptRunsPage、Telegram 汇总通知与可配置的浏览器完成提示音。 Co-authored-by: Cursor <cursoragent@cursor.com>
1 line
25 KiB
JavaScript
1 line
25 KiB
JavaScript
import{n as e,t}from"./initMonaco-CICXLTJS.js";import{a as n,x as r}from"./VDataTable-DZ_DOyb1.js";import{$n as i,Dt as ee,F as a,Jn as te,L as o,Lr as s,M as c,N as l,P as u,Sr as ne,Tr as re,Vr as d,Xn as ie,Y as ae,Yn as oe,Z as f,Zn as p,_ as se,ar as m,dr as ce,er as h,fr as le,gr as g,hr as ue,jr as _,k as v,mr as de,nr as y,or as b,rr as x,sr as fe,t as pe,tr as S,ur as me,vr as C,w as he,wr as w,z as T,zt as E}from"./index-gfOrpdmy.js";import{o as ge,t as _e}from"./VContainer-DoAVnyqr.js";import{t as D}from"./VChip-sW1zi7V6.js";import{t as O}from"./VSelect-KxRF8W0i.js";import{t as ve}from"./VDataTableServer-LfNDokVe.js";import{n as k,t as ye}from"./VRow-AEPVE_-F.js";import{t as A}from"./VSpacer-ChMx8Hym.js";import{t as j}from"./apiError-B3-51aZ3.js";import{t as be}from"./useServerList-MD-fsor6.js";import{i as xe}from"./validation-DMwOxx4a.js";import{t as Se}from"./VDialog-C6bIHmqL.js";import{t as Ce}from"./VTextarea-DI-xxV2k.js";import{t as we}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as Te}from"./VSwitch-CvbXwVzt.js";var Ee=we(fe({__name:`ScriptContentEditor`,props:{modelValue:{},readonly:{type:Boolean}},emits:[`update:modelValue`],setup(n,{emit:r}){let i=n,ee=r,a=e(),te=_(),o=null,s=!1;function c(){te.value&&(o?.dispose(),o=a.editor.create(te.value,{...t({language:`shell`,readOnly:i.readonly??!1}),value:i.modelValue||``}),o.onDidChangeModelContent(()=>{s||!o||ee(`update:modelValue`,o.getValue())}))}return ne(()=>i.modelValue,e=>{o&&o.getValue()!==e&&(s=!0,o.setValue(e||``),s=!1)}),ne(()=>i.readonly,e=>{o?.updateOptions({readOnly:e??!1})}),de(()=>{c()}),le(()=>{o?.dispose(),o=null}),(e,t)=>(g(),x(`div`,{ref_key:`host`,ref:te,class:`script-content-editor`},null,512))}}),[[`__scopeId`,`data-v-8c9e5994`]]),De={class:`text-body-1 font-weight-medium`},Oe={class:`text-body-2 text-medium-emphasis`},ke={class:`text-caption text-medium-emphasis mt-2`},Ae={key:3,class:`d-flex justify-center mt-4`},je={class:`text-caption`},Me={key:2,class:`text-center text-medium-emphasis py-6`},Ne={class:`text-body-2`},Pe={class:`text-caption text-medium-emphasis`},Fe={class:`text-caption`},Ie={key:0,class:`ml-1`},Le={class:`d-flex align-center flex-wrap ga-1 justify-end`},Re={class:`text-caption text-medium-emphasis mb-3`},ze={class:`text-body-2 mb-4 pa-3 rounded bg-surface-variant overflow-auto`,style:{"max-height":`120px`}},Be={class:`text-truncate`,style:{"max-width":`360px`}},M=fe({__name:`ScriptsPage`,setup(e){let t=ge(),{servers:le,loadServers:fe}=be(),we=[{label:`运维`,value:`ops`},{label:`部署`,value:`deploy`},{label:`检查`,value:`check`},{label:`清理`,value:`cleanup`}],M=_(!1),Ve=_(``),N=_([]),P=_(null),He=_([]),Ue=_(1),We=_(20),F=_(!1),Ge=_(null),Ke=_(!1),I=_({name:``,category:`ops`,description:``,content:``}),L=_(!1),R=_(null),z=_([]),qe=_(300),Je=_(!1),Ye=_(null),Xe=_(!1),B=_(!1),Ze=_(null),Qe=_(null),V=_([]),H=_(!1),$e=_([]),et=_(0),U=_(1),tt=_(20),nt=_(!1),W=_(null),rt=_(!1),G=_(``),K=_([]),it=_(60),at=_(!1),ot=_(null),st=_(!1),q=_([]),ct=null,J=_(!1),Y=_(null),lt=_(!1),ut=_(null),dt=i(()=>He.value.map(e=>({title:e.name,value:e.id}))),ft=i(()=>{let e=Ve.value.trim().toLowerCase();return e?N.value.filter(t=>t.name.toLowerCase().includes(e)||(t.category||``).toLowerCase().includes(e)||(t.description||``).toLowerCase().includes(e)):N.value}),pt=i(()=>ft.value.length),mt=i(()=>{let e=(Ue.value-1)*We.value;return ft.value.slice(e,e+We.value)});ne(Ve,()=>{Ue.value=1});let ht=[{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,sortable:!1}],gt=i(()=>W.value?N.value.find(e=>e.id===W.value)?.name||`脚本 #${W.value}`:``),_t={started:`开始`,batch_progress:`批次进度`,execution_finished:`结束`,stopped:`停止`,retry_requested:`重试`,stuck_marked:`标记卡住`,server_auto_stuck:`子机超时`,auto_stuck:`自动卡住`,job_completed:`回调完成`},vt=i(()=>Y.value?.results?Object.entries(Y.value.results).filter(([e])=>e!==`_meta`&&/^\d+$/.test(e)).map(([e,t])=>({serverId:e,status:String(t.status||t.phase||`—`),exitCode:t.exit_code??null,summary:(t.stdout||t.stderr||t.message||``).slice(0,200)||`—`})):[]);function yt(e){return we.find(t=>t.value===e)?.label||e}function bt(e){if(!e)return`—`;let t=e.startsWith(`[long_task] `)?e.slice(12):e;return t.length>60?`${t.slice(0,60)}…`:t}function xt(e){return e.script_id?N.value.find(t=>t.id===e.script_id)?.name||`脚本 #${e.script_id}`:`临时命令`}function St(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 Ct(e){let t=e.events||[];return t.length?t.slice(-3).map(e=>{let t=_t[e.action||``]||e.action||`事件`,n=St(e.at),r=e.detail||``;return`${n} · ${t}${r?` — ${r}`:``}`}):[]}async function wt(){H.value=!0;try{V.value=(await E.get(`/scripts/executions`,{limit:5})).items||[]}catch{V.value=[]}finally{H.value=!1}}async function X(){nt.value=!0;try{let e=(U.value-1)*tt.value,t={limit:tt.value,offset:e};W.value&&(t.script_id=W.value);let n=await E.get(`/scripts/executions`,t);$e.value=n.items||[],et.value=n.total||0}catch{$e.value=[],et.value=0}finally{nt.value=!1}}function Z(){wt(),X()}function Tt(e){U.value=e,X()}function Et(e){tt.value=e,U.value=1,X()}function Dt(){W.value=null,U.value=1,X()}async function Ot(e){W.value=e.id,U.value=1,await X(),await ce(),Qe.value?.$el?.scrollIntoView?.({behavior:`smooth`,block:`start`})??Qe.value?.scrollIntoView?.({behavior:`smooth`,block:`start`})}function kt(e){return e||`—`}function Q(e){if(!e)return 0;try{let t=JSON.parse(e);return Array.isArray(t)?t.length:0}catch{return 0}}function At(e){let t=e.id??e.execution_id;if(t==null)throw Error(`执行响应缺少 id`);return t}async function jt(){M.value=!0;try{N.value=(await E.getList(`/scripts/`)).items}catch(e){N.value=[],t(j(e,`加载脚本列表失败`),`error`)}finally{M.value=!1}}async function Mt(){try{P.value=await E.get(`/scripts/exec-config`)}catch{P.value=null}}async function Nt(){try{He.value=await E.getList(`/scripts/credentials`).then(e=>e.items)}catch{He.value=[]}}function Pt(e){Ge.value=e,e?I.value={name:e.name,category:e.category||`ops`,description:e.description||``,content:e.content||``}:I.value={name:``,category:`ops`,description:``,content:``},F.value=!0}async function Ft(){if(!I.value.name.trim()||!I.value.content.trim()){t(`请填写名称与脚本内容`,`warning`);return}Ke.value=!0;try{let e={name:I.value.name.trim(),category:I.value.category,description:I.value.description.trim()||null,content:I.value.content};Ge.value?await E.put(`/scripts/${Ge.value.id}`,e):await E.post(`/scripts/`,e),F.value=!1,await jt(),t(`保存成功`)}catch(e){t(j(e,`保存失败`),`error`)}finally{Ke.value=!1}}function It(e){R.value=e,z.value=[],Je.value=!1,Ye.value=null,L.value=!0}async function Lt(e,t,n){let r=await E.post(`/scripts/exec`,e);return Ht(t,At(r),n,!!e.long_task,r.progress,r.status),r}async function Rt(){if(!R.value||!z.value.length){t(`请选择服务器`,`warning`);return}Xe.value=!0;try{await Lt({script_id:R.value.id,server_ids:z.value,timeout:qe.value,long_task:Je.value,credential_id:Ye.value??void 0},R.value.name,z.value.length),L.value=!1,t(`脚本已提交执行`),Z()}catch(e){t(j(e,`执行失败`),`error`)}finally{Xe.value=!1}}function zt(e){Ze.value=e,B.value=!0}async function Bt(){if(Ze.value)try{await E.delete(`/scripts/${Ze.value.id}`),B.value=!1,await jt(),t(`已删除`)}catch(e){t(j(e,`删除失败`),`error`)}}async function Vt(){if(!(!G.value.trim()||K.value.length===0)){st.value=!0;try{await Lt({command:G.value.trim(),server_ids:K.value,timeout:it.value,long_task:at.value,credential_id:ot.value??void 0},`临时命令`,K.value.length),t(`已在 ${K.value.length} 台服务器上执行`),Z()}catch(e){t(j(e,`执行失败`),`error`)}finally{st.value=!1}}}function Ht(e,t,n,r,i,ee){q.value.some(e=>e.id===t)||(q.value.unshift({id:t,name:e,status:ee||`running`,totalServers:n,progress:i||`0/${n}`,longTask:r,refreshing:!1}),Ut())}function Ut(){ct||=setInterval(async()=>{let e=q.value.filter(e=>e.status===`running`||e.status===`partial`);if(e.length===0){Wt();return}for(let t of e)await Gt(t)},1e4)}function Wt(){ct&&=(clearInterval(ct),null)}async function Gt(e){e.refreshing=!0;try{let t=await E.get(`/scripts/executions/${e.id}`);e.status=t.status,e.progress=kt(t.progress),e.longTask=!!t.long_task,t.status!==`running`&&t.status!==`partial`&&Z()}catch{}finally{e.refreshing=!1}}async function Kt(e){try{await E.post(`/scripts/executions/${e.id}/stop`),await Gt(e),t(`已发送停止指令`)}catch(e){t(j(e,`停止失败`),`error`)}}async function qt(e){try{await E.post(`/scripts/executions/${e.id}/mark-stuck`,{detail:`用户在脚本库标记可能卡住`}),t(`已标记`)}catch(e){t(j(e,`标记失败`),`error`)}}async function Jt(e){try{let n=await E.post(`/scripts/executions/${e.id}/retry`,{}),r=At(n);Ht(`${e.name}(重试)`,r,e.totalServers,e.longTask,n.progress,n.status),t(`已创建重试任务 #${r}`)}catch(e){t(j(e,`重试失败`),`error`)}}async function Yt(e){try{await E.post(`/scripts/executions/${e.id}/stop`),Z(),t(`已发送停止指令`)}catch(e){t(j(e,`停止失败`),`error`)}}async function Xt(e){try{let n=await E.post(`/scripts/executions/${e.id}/retry`,{});Ht(`${xt(e)}(重试)`,At(n),Q(e.server_ids)||Q(n.server_ids),!!e.long_task,n.progress,n.status),Z(),t(`重试已提交`)}catch(e){t(j(e,`重试失败`),`error`)}}async function Zt(e){ut.value=e,J.value=!0,await Qt(!1)}async function Qt(e){if(ut.value!=null){lt.value=!0;try{Y.value=await E.get(`/scripts/executions/${ut.value}`,{fetch_logs:e,log_lines:100})}catch(e){t(j(e,`加载详情失败`),`error`),J.value=!1}finally{lt.value=!1}}}function $t(e){return e===`running`?`blue`:e===`completed`?`green`:e===`failed`?`red`:e===`partial`?`orange`:e===`cancelled`?`grey`:`info`}function $(e){return{running:`执行中`,completed:`已完成`,failed:`失败`,partial:`部分成功`,cancelled:`已取消`}[e]||e}return de(()=>{jt(),fe(),Mt(),Nt(),Z()}),ue(()=>{Wt()}),(e,t)=>(g(),S(_e,{fluid:``,class:`pa-6`},{default:w(()=>[b(l,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:w(()=>[b(a,{class:`d-flex flex-wrap align-center ga-2`},{default:w(()=>[t[28]||=m(` 脚本库 `,-1),P.value?(g(),S(D,{key:0,size:`small`,variant:`tonal`,label:``,class:`ml-1`},{default:w(()=>[m(` 分批 `+d(P.value.batch_size)+` 台 · 并发 `+d(P.value.concurrency),1)]),_:1})):y(``,!0),b(A),b(pe,{modelValue:Ve.value,"onUpdate:modelValue":t[0]||=e=>Ve.value=e,"prepend-inner-icon":`mdi-magnify`,label:`搜索...`,density:`compact`,"hide-details":``,variant:`outlined`,rounded:``,style:{"max-width":`240px`}},null,8,[`modelValue`]),b(T,{color:`primary`,variant:`flat`,class:`ml-1`,"prepend-icon":`mdi-plus`,size:`small`,onClick:t[1]||=e=>Pt(null)},{default:w(()=>[...t[27]||=[m(` 新建脚本 `,-1)]]),_:1})]),_:1})]),_:1}),b(l,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:w(()=>[b(a,{class:`d-flex align-center`,style:{cursor:`pointer`},onClick:t[2]||=e=>rt.value=!rt.value},{default:w(()=>[b(f,{class:`mr-2`},{default:w(()=>[...t[29]||=[m(`mdi-console`,-1)]]),_:1}),t[30]||=m(` 临时命令执行 `,-1),b(A),b(f,null,{default:w(()=>[m(d(rt.value?`mdi-chevron-up`:`mdi-chevron-down`),1)]),_:1})]),_:1}),b(ee,null,{default:w(()=>[re(h(`div`,null,[b(c),b(u,null,{default:w(()=>[b(Ce,{modelValue:G.value,"onUpdate:modelValue":t[3]||=e=>G.value=e,label:`命令`,variant:`outlined`,density:`compact`,rows:`3`,placeholder:`输入要执行的命令... (Ctrl+Enter 执行)`,class:`mb-3 font-monospace`,onKeydown:oe(ie(Vt,[`ctrl`]),[`enter`]),rules:[s(xe)(`命令`)]},null,8,[`modelValue`,`onKeydown`,`rules`]),b(ye,{dense:``},{default:w(()=>[b(k,{cols:`12`,md:`5`},{default:w(()=>[b(O,{modelValue:K.value,"onUpdate:modelValue":t[4]||=e=>K.value=e,items:s(le),"item-title":`name`,"item-value":`id`,label:`目标服务器`,variant:`outlined`,density:`compact`,multiple:``,chips:``,"closable-chips":``},null,8,[`modelValue`,`items`])]),_:1}),b(k,{cols:`6`,md:`2`},{default:w(()=>[b(pe,{modelValue:it.value,"onUpdate:modelValue":t[5]||=e=>it.value=e,modelModifiers:{number:!0},label:`超时(秒)`,variant:`outlined`,density:`compact`,type:`number`,max:P.value?.max_timeout??600},null,8,[`modelValue`,`max`])]),_:1}),b(k,{cols:`6`,md:`3`},{default:w(()=>[b(O,{modelValue:ot.value,"onUpdate:modelValue":t[6]||=e=>ot.value=e,items:dt.value,"item-title":`title`,"item-value":`value`,label:`DB 凭据(可选)`,variant:`outlined`,density:`compact`,clearable:``,"hide-details":``},null,8,[`modelValue`,`items`])]),_:1}),b(k,{cols:`12`,md:`2`,class:`d-flex align-center ga-2`},{default:w(()=>[b(Te,{modelValue:at.value,"onUpdate:modelValue":t[7]||=e=>at.value=e,label:`长任务`,density:`compact`,"hide-details":``,color:`primary`},null,8,[`modelValue`]),b(T,{color:`primary`,variant:`flat`,onClick:Vt,loading:st.value,disabled:!G.value.trim()||K.value.length===0},{default:w(()=>[...t[31]||=[m(` 执行 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1})],512),[[te,rt.value]])]),_:1})]),_:1}),M.value?(g(),S(ae,{key:0,indeterminate:``,color:`primary`})):y(``,!0),mt.value.length?(g(),S(ye,{key:1},{default:w(()=>[(g(!0),x(p,null,C(mt.value,e=>(g(),S(k,{cols:`12`,sm:`6`,md:`4`,key:e.id},{default:w(()=>[b(l,{elevation:`0`,border:``,rounded:`lg`,class:`fill-height`},{default:w(()=>[b(a,{class:`d-flex align-center`},{default:w(()=>[b(f,{color:`primary`,class:`mr-2`},{default:w(()=>[...t[32]||=[m(`mdi-code-braces`,-1)]]),_:1}),h(`span`,De,d(e.name),1),b(A),b(se,null,{activator:w(({props:e})=>[b(T,me({icon:`mdi-dots-vertical`,variant:`text`,size:`small`},{ref_for:!0},e),null,16)]),default:w(()=>[b(he,{density:`compact`},{default:w(()=>[b(v,{title:`编辑`,onClick:t=>Pt(e)},{prepend:w(()=>[b(f,null,{default:w(()=>[...t[33]||=[m(`mdi-pencil`,-1)]]),_:1})]),_:1},8,[`onClick`]),b(v,{title:`执行`,onClick:t=>It(e)},{prepend:w(()=>[b(f,null,{default:w(()=>[...t[34]||=[m(`mdi-play`,-1)]]),_:1})]),_:1},8,[`onClick`]),b(v,{title:`删除`,onClick:t=>zt(e),class:`text-error`},{prepend:w(()=>[b(f,{color:`error`},{default:w(()=>[...t[35]||=[m(`mdi-delete`,-1)]]),_:1})]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024)]),_:2},1024),b(u,null,{default:w(()=>[e.category?(g(),S(D,{key:0,size:`small`,variant:`tonal`,label:``,class:`mb-2`},{default:w(()=>[m(d(yt(e.category)),1)]),_:2},1024)):y(``,!0),h(`div`,Oe,d(e.description||`无描述`),1),h(`div`,ke,` 更新于 `+d(e.updated_at||e.created_at||`—`),1)]),_:2},1024),b(o,null,{default:w(()=>[b(T,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-play`,color:`primary`,onClick:t=>It(e)},{default:w(()=>[...t[36]||=[m(` 执行 `,-1)]]),_:1},8,[`onClick`]),b(A),b(T,{size:`small`,variant:`text`,onClick:t=>Ot(e)},{default:w(()=>[...t[37]||=[m(`历史`,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1})):M.value?y(``,!0):(g(),S(l,{key:2,elevation:`0`,border:``,rounded:`lg`},{default:w(()=>[b(u,{class:`text-center text-medium-emphasis py-10`},{default:w(()=>[...t[38]||=[m(`暂无脚本,点击「新建脚本」添加`,-1)]]),_:1})]),_:1})),pt.value>We.value?(g(),x(`div`,Ae,[b(r,{modelValue:Ue.value,"onUpdate:modelValue":t[8]||=e=>Ue.value=e,length:Math.ceil(pt.value/We.value),rounded:``,density:`compact`},null,8,[`modelValue`,`length`])])):y(``,!0),h(`div`,{ref_key:`historySectionRef`,ref:Qe},[b(l,{elevation:`0`,border:``,rounded:`lg`,class:`mt-4`},{default:w(()=>[b(a,{class:`d-flex align-center text-subtitle-1`},{default:w(()=>[b(f,{class:`mr-2`},{default:w(()=>[...t[39]||=[m(`mdi-history`,-1)]]),_:1}),t[40]||=m(` 最近执行 `,-1),b(A),b(T,{size:`small`,variant:`text`,icon:`mdi-refresh`,loading:H.value,onClick:wt},null,8,[`loading`])]),_:1}),b(c),b(u,{class:`pa-0`},{default:w(()=>[H.value?(g(),S(ae,{key:0,indeterminate:``,color:`primary`})):y(``,!0),V.value.length?(g(),S(he,{key:1,density:`compact`,class:`py-0`},{default:w(()=>[(g(!0),x(p,null,C(V.value,e=>(g(),S(v,{key:e.id,title:`#${e.id} · ${xt(e)}`,onClick:t=>Zt(e.id),style:{cursor:`pointer`}},{subtitle:w(()=>[h(`div`,je,d($(e.status))+` · `+d(Q(e.server_ids))+` 台 · `+d(e.operator||`—`)+` · `+d(St(e.started_at)),1),(g(!0),x(p,null,C(Ct(e),(e,t)=>(g(),x(`div`,{key:t,class:`text-caption text-medium-emphasis font-monospace mt-1`},d(e),1))),128))]),append:w(()=>[b(D,{color:$t(e.status),size:`x-small`,variant:`tonal`,label:``},{default:w(()=>[m(d($(e.status)),1)]),_:2},1032,[`color`])]),_:2},1032,[`title`,`onClick`]))),128))]),_:1})):H.value?y(``,!0):(g(),x(`div`,Me,`暂无执行记录`))]),_:1})]),_:1}),b(l,{elevation:`0`,border:``,rounded:`lg`,class:`mt-4`},{default:w(()=>[b(a,{class:`d-flex flex-wrap align-center ga-2 text-subtitle-1`},{default:w(()=>[b(f,{class:`mr-1`},{default:w(()=>[...t[41]||=[m(`mdi-format-list-bulleted`,-1)]]),_:1}),t[42]||=m(` 全部执行历史 `,-1),W.value?(g(),S(D,{key:0,size:`small`,variant:`tonal`,closable:``,label:``,"onClick:close":Dt},{default:w(()=>[m(d(gt.value),1)]),_:1})):y(``,!0),b(A),b(T,{size:`small`,variant:`text`,icon:`mdi-refresh`,loading:nt.value,onClick:X},null,8,[`loading`])]),_:1}),b(c),b(ve,{items:$e.value,headers:ht,"items-length":et.value,loading:nt.value,page:U.value,"items-per-page":tt.value,density:`compact`,hover:``,"onUpdate:page":Tt,"onUpdate:itemsPerPage":Et},{"item.label":w(({item:e})=>[h(`div`,Ne,d(xt(e)),1),h(`code`,Pe,d(bt(e.command)),1)]),"item.status":w(({item:e})=>[b(D,{color:$t(e.status),size:`x-small`,variant:`tonal`,label:``},{default:w(()=>[m(d($(e.status)),1)]),_:2},1032,[`color`])]),"item.server_count":w(({item:e})=>[m(d(Q(e.server_ids)),1)]),"item.progress":w(({item:e})=>[m(d(kt(e.progress)),1)]),"item.started_at":w(({item:e})=>[m(d(St(e.started_at)),1)]),"item.actions":w(({item:e})=>[b(T,{size:`x-small`,variant:`text`,onClick:t=>Zt(e.id)},{default:w(()=>[...t[43]||=[m(`详情`,-1)]]),_:1},8,[`onClick`]),e.status===`running`||e.status===`partial`?(g(),S(T,{key:0,size:`x-small`,variant:`text`,color:`error`,onClick:t=>Yt(e)},{default:w(()=>[...t[44]||=[m(` 停止 `,-1)]]),_:1},8,[`onClick`])):y(``,!0),e.status===`failed`||e.status===`partial`?(g(),S(T,{key:1,size:`x-small`,variant:`text`,color:`primary`,onClick:t=>Xt(e)},{default:w(()=>[...t[45]||=[m(` 重试 `,-1)]]),_:1},8,[`onClick`])):y(``,!0)]),"no-data":w(()=>[...t[46]||=[h(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无执行记录`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`,`items-per-page`])]),_:1})],512),q.value.length>0?(g(),S(l,{key:4,elevation:`0`,border:``,rounded:`lg`,class:`mt-4`},{default:w(()=>[b(a,{class:`d-flex align-center text-subtitle-1`},{default:w(()=>[b(f,{class:`mr-2`},{default:w(()=>[...t[47]||=[m(`mdi-progress-clock`,-1)]]),_:1}),t[49]||=m(` 批量执行状态 `,-1),b(A),b(T,{size:`small`,variant:`text`,onClick:t[9]||=e=>q.value=[]},{default:w(()=>[...t[48]||=[m(`清除`,-1)]]),_:1})]),_:1}),b(c),b(u,null,{default:w(()=>[b(he,{density:`compact`},{default:w(()=>[(g(!0),x(p,null,C(q.value,e=>(g(),S(v,{key:e.id,title:e.name},{subtitle:w(()=>[h(`span`,Fe,[m(` #`+d(e.id)+` · `+d(e.progress||`—`)+` · `+d(e.totalServers)+` 台 `,1),e.longTask?(g(),x(`span`,Ie,`· 长任务`)):y(``,!0)])]),append:w(()=>[h(`div`,Le,[b(D,{color:$t(e.status),size:`x-small`,variant:`tonal`,label:``},{default:w(()=>[m(d($(e.status)),1)]),_:2},1032,[`color`]),b(T,{size:`x-small`,variant:`text`,onClick:t=>Zt(e.id)},{default:w(()=>[...t[50]||=[m(`详情`,-1)]]),_:1},8,[`onClick`]),b(T,{size:`x-small`,variant:`text`,onClick:t=>Gt(e),loading:e.refreshing},{default:w(()=>[...t[51]||=[m(` 刷新 `,-1)]]),_:1},8,[`onClick`,`loading`]),e.status===`running`?(g(),S(T,{key:0,size:`x-small`,variant:`text`,color:`warning`,onClick:t=>qt(e)},{default:w(()=>[...t[52]||=[m(` 卡住 `,-1)]]),_:1},8,[`onClick`])):y(``,!0),e.status===`running`||e.status===`partial`?(g(),S(T,{key:1,size:`x-small`,variant:`text`,color:`error`,onClick:t=>Kt(e)},{default:w(()=>[...t[53]||=[m(` 停止 `,-1)]]),_:1},8,[`onClick`])):y(``,!0),e.status===`failed`||e.status===`partial`?(g(),S(T,{key:2,size:`x-small`,variant:`text`,color:`primary`,onClick:t=>Jt(e)},{default:w(()=>[...t[54]||=[m(` 重试 `,-1)]]),_:1},8,[`onClick`])):y(``,!0)])]),_:2},1032,[`title`]))),128))]),_:1})]),_:1})]),_:1})):y(``,!0),b(Se,{modelValue:F.value,"onUpdate:modelValue":t[15]||=e=>F.value=e,"max-width":`900`,scrollable:``},{default:w(()=>[b(l,{border:``},{default:w(()=>[b(a,null,{default:w(()=>[m(d(Ge.value?`编辑脚本`:`新建脚本`),1)]),_:1}),b(c),b(u,null,{default:w(()=>[b(pe,{modelValue:I.value.name,"onUpdate:modelValue":t[10]||=e=>I.value.name=e,label:`脚本名称`,variant:`outlined`,density:`compact`,class:`mb-2`,rules:[s(xe)(`脚本名称`)]},null,8,[`modelValue`,`rules`]),b(O,{modelValue:I.value.category,"onUpdate:modelValue":t[11]||=e=>I.value.category=e,items:we,"item-title":`label`,"item-value":`value`,label:`分类`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),b(Ce,{modelValue:I.value.description,"onUpdate:modelValue":t[12]||=e=>I.value.description=e,label:`描述`,variant:`outlined`,density:`compact`,rows:`2`,class:`mb-2`},null,8,[`modelValue`]),t[55]||=h(`div`,{class:`text-caption text-medium-emphasis mb-1`},`脚本内容`,-1),b(Ee,{modelValue:I.value.content,"onUpdate:modelValue":t[13]||=e=>I.value.content=e},null,8,[`modelValue`])]),_:1}),b(c),b(o,null,{default:w(()=>[b(A),b(T,{variant:`text`,onClick:t[14]||=e=>F.value=!1},{default:w(()=>[...t[56]||=[m(`取消`,-1)]]),_:1}),b(T,{color:`primary`,variant:`flat`,onClick:Ft,loading:Ke.value,disabled:!I.value.content.trim()},{default:w(()=>[...t[57]||=[m(` 保存 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),b(Se,{modelValue:L.value,"onUpdate:modelValue":t[21]||=e=>L.value=e,"max-width":`640`},{default:w(()=>[b(l,{border:``},{default:w(()=>[b(a,null,{default:w(()=>[m(`执行脚本: `+d(R.value?.name),1)]),_:1}),b(u,null,{default:w(()=>[b(O,{modelValue:z.value,"onUpdate:modelValue":t[16]||=e=>z.value=e,items:s(le),"item-title":`name`,"item-value":`id`,label:`选择服务器`,variant:`outlined`,density:`compact`,multiple:``,chips:``,class:`mb-2`},null,8,[`modelValue`,`items`]),b(ye,{dense:``},{default:w(()=>[b(k,{cols:`6`},{default:w(()=>[b(pe,{modelValue:qe.value,"onUpdate:modelValue":t[17]||=e=>qe.value=e,modelModifiers:{number:!0},label:`超时(秒)`,variant:`outlined`,density:`compact`,type:`number`,max:P.value?.max_timeout??600},null,8,[`modelValue`,`max`])]),_:1}),b(k,{cols:`6`},{default:w(()=>[b(O,{modelValue:Ye.value,"onUpdate:modelValue":t[18]||=e=>Ye.value=e,items:dt.value,"item-title":`title`,"item-value":`value`,label:`DB 凭据(可选)`,variant:`outlined`,density:`compact`,clearable:``},null,8,[`modelValue`,`items`])]),_:1})]),_:1}),b(Te,{modelValue:Je.value,"onUpdate:modelValue":t[19]||=e=>Je.value=e,label:`长任务(nohup + Agent 回调,适合超时较长的脚本)`,density:`compact`,color:`primary`},null,8,[`modelValue`])]),_:1}),b(o,null,{default:w(()=>[b(A),b(T,{variant:`text`,onClick:t[20]||=e=>L.value=!1},{default:w(()=>[...t[58]||=[m(`取消`,-1)]]),_:1}),b(T,{color:`primary`,variant:`flat`,onClick:Rt,loading:Xe.value,disabled:!z.value.length},{default:w(()=>[...t[59]||=[m(` 执行 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),b(Se,{modelValue:B.value,"onUpdate:modelValue":t[23]||=e=>B.value=e,"max-width":`400`},{default:w(()=>[b(l,{border:``},{default:w(()=>[b(a,null,{default:w(()=>[...t[60]||=[m(`确认删除`,-1)]]),_:1}),b(u,null,{default:w(()=>[t[61]||=m(`确定要删除脚本 `,-1),h(`strong`,null,d(Ze.value?.name),1),t[62]||=m(` 吗?`,-1)]),_:1}),b(o,null,{default:w(()=>[b(A),b(T,{variant:`text`,onClick:t[22]||=e=>B.value=!1},{default:w(()=>[...t[63]||=[m(`取消`,-1)]]),_:1}),b(T,{color:`error`,variant:`flat`,onClick:Bt},{default:w(()=>[...t[64]||=[m(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),b(Se,{modelValue:J.value,"onUpdate:modelValue":t[26]||=e=>J.value=e,"max-width":`900`,scrollable:``},{default:w(()=>[b(l,{border:``},{default:w(()=>[b(a,{class:`d-flex align-center`},{default:w(()=>[m(` 执行详情 #`+d(Y.value?.id)+` `,1),b(A),Y.value?.long_task?(g(),S(T,{key:0,size:`small`,variant:`tonal`,loading:lt.value,onClick:t[24]||=e=>Qt(!0)},{default:w(()=>[...t[65]||=[m(` 拉取日志 `,-1)]]),_:1},8,[`loading`])):y(``,!0)]),_:1}),b(c),Y.value?(g(),S(u,{key:0},{default:w(()=>[h(`div`,Re,d($(Y.value.status))+` · `+d(kt(Y.value.progress))+` · 操作人 `+d(Y.value.operator||`—`),1),h(`pre`,ze,d(Y.value.command),1),b(n,{density:`compact`},{default:w(()=>[t[66]||=h(`thead`,null,[h(`tr`,null,[h(`th`,null,`服务器`),h(`th`,null,`状态`),h(`th`,null,`退出码`),h(`th`,null,`输出摘要`)])],-1),h(`tbody`,null,[(g(!0),x(p,null,C(vt.value,e=>(g(),x(`tr`,{key:e.serverId},[h(`td`,null,`#`+d(e.serverId),1),h(`td`,null,d(e.status),1),h(`td`,null,d(e.exitCode??`—`),1),h(`td`,Be,d(e.summary),1)]))),128))])]),_:1})]),_:1})):y(``,!0),Y.value?(g(),S(o,{key:1},{default:w(()=>[b(A),b(T,{variant:`text`,onClick:t[25]||=e=>J.value=!1},{default:w(()=>[...t[67]||=[m(`关闭`,-1)]]),_:1})]),_:1})):y(``,!0)]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{M as default}; |