Files
Nexus/web/app/assets/PushPage-BJ3wve2K.js
T
Nexus Agent 0b2d7ac50d feat(scripts): 异步执行、全局进度看板与完成提示音设置
脚本 exec 立即返回 running 并在后台跑批次;/ws/alerts 推送 script_progress/complete;
新增 ScriptRunsPage、Telegram 汇总通知与可配置的浏览器完成提示音。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 07:07:02 +08:00

1 line
41 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{a as e}from"./VDataTable-CtdZOMV6.js";import{$n as t,$t as n,Ar as r,Br as i,Cr as a,F as o,I as s,Ir as c,J as l,Jn as u,M as d,N as f,P as p,Pt as m,Qn as h,R as g,Rn as _,Rr as v,Rt as y,X as b,Xn as x,Yn as S,_r as C,ar as w,br as T,cn as E,er as D,fn as O,h as ee,hr as k,ir as A,k as j,kr as M,lr as N,mr as te,nn as P,nr as F,o as I,or as L,pr as ne,rr as re,s as ie,t as R,tn as z,tr as B,v as ae,w as V,wn as oe,xr as se}from"./index-1vc2lwKY.js";import{a as ce,i as le,n as H,o as U,r as ue,t as de}from"./VContainer-Cyz28tn8.js";import{t as W}from"./VChip-DxlrSIbY.js";import{t as G}from"./VSelect-bmHFJ0Qw.js";import{t as fe}from"./VCheckbox-BIRqCFTE.js";import{t as pe}from"./VDataTableServer-BgrY7CII.js";import{n as K,t as q}from"./VRow-DWRsOC56.js";import{t as J}from"./VSpacer-DTN9CH1q.js";import{t as Y}from"./VDialog-CnVIUGEQ.js";import{t as X}from"./VAlert-CdLqcwfN.js";import{t as me}from"./wsUrl-CqmqkTTE.js";var he=[[/rsync:\s*connection unexpectedly closed/gi,`rsync:连接意外关闭`],[/rsync error:\s*some files\/attrs were not transferred/gi,`rsync 错误:部分文件或属性未能传输`],[/rsync error:\s*error in rsync protocol data stream/gi,`rsync 错误:协议数据流异常`],[/rsync error:\s*/gi,`rsync 错误:`],[/rsync:\s*/gi,`rsync`],[/Host key verification failed/gi,`SSH 主机密钥验证失败`],[/Could not resolve hostname/gi,`无法解析主机名`],[/Permission denied,\s*please try again/gi,`权限被拒绝,请重试`],[/Permission denied\s*\(publickey/gi,`公钥认证失败,权限被拒绝`],[/Permission denied/gi,`权限被拒绝`],[/No such file or directory/gi,`文件或目录不存在`],[/Connection refused/gi,`连接被拒绝`],[/Connection timed out/gi,`连接超时`],[/Connection reset by peer/gi,`连接被对端重置`],[/Network is unreachable/gi,`网络不可达`],[/No route to host/gi,`无法路由到主机`],[/No space left on device/gi,`磁盘空间不足`],[/Read-only file system/gi,`文件系统为只读`],[/Operation timed out/gi,`操作超时`],[/Operation not permitted/gi,`操作不允许`],[/Authentication failed/gi,`认证失败`],[/Broken pipe/gi,`连接中断(管道破裂)`],[/Protocol error/gi,`协议错误`],[/Too many open files/gi,`打开的文件过多`],[/Name or service not known/gi,`无法解析主机名或服务名`],[/ssh:\s*connect to host/gi,`ssh:无法连接到主机`],[/ssh:\s*/gi,`ssh`],[/Command failed\s*\(exit\s*(\d+)\)/gi,`命令失败(退出码 $1`],[/rsync exited with code\s*(\d+)/gi,`rsync 退出码 $1`],[/\bexit code\s*(\d+)/gi,`退出码 $1`],[/Server not found/gi,`服务器不存在`],[/failed to set times on/gi,`无法设置文件时间戳:`],[/\bsender\b/gi,`发送端`],[/\breceiver\b/gi,`接收端`]],ge=/[\u4e00-\u9fff\u3400-\u4dbf]/g;function _e(e){let t=e.match(ge);if(!t?.length)return!1;let n=e.replace(/\s+/g,``);return n.length?t.length/n.length>=.2:!1}function Z(e){if(e==null)return``;let t=e.trim();if(!t)return``;if(_e(t))return e;let n=t;for(let[e,t]of he)n=n.replace(e,t);return n}function Q(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function ve(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(`zh-CN`,{hour12:!1})}function ye(e){switch(e){case`success`:return`成功`;case`failed`:return`失败`;case`running`:return`进行中`;case`cancelled`:return`已取消`;default:return e}}function be(e){switch(e){case`success`:return`success`;case`failed`:return`error`;case`cancelled`:return`grey`;case`running`:return`info`;default:return`warning`}}function xe(e){switch(e){case`incremental`:return`增量`;case`full`:return`全量`;case`checksum`:return`校验和`;case`overwrite`:return`覆盖`;default:return e||`—`}}function Se(e){return e===`成功`?`success`:e===`失败`?`error`:e===`已取消`?`grey`:`warning`}function Ce(e){return e?`success`:`error`}var we=L({__name:`PushDiagnoseDialog`,props:{modelValue:{type:Boolean},loading:{type:Boolean},result:{},targetName:{}},emits:[`update:modelValue`],setup(e){return(t,n)=>(k(),D(Y,{"model-value":e.modelValue,"max-width":`520`,"onUpdate:modelValue":n[1]||=e=>t.$emit(`update:modelValue`,e)},{default:a(()=>[w(f,{border:``},{default:a(()=>[w(o,null,{default:a(()=>[A(`推送失败诊断 — `+i(e.targetName),1)]),_:1}),w(p,null,{default:a(()=>[e.loading?(k(),D(l,{key:0,indeterminate:``,class:`mb-3`})):e.result?(k(),F(x,{key:1},[w(V,{density:`compact`},{default:a(()=>[w(j,{title:`SSH 连接`},{append:a(()=>[w(b,{color:e.result.ssh_ok?`success`:`error`},{default:a(()=>[A(i(e.result.ssh_ok?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1}),e.result.disk_avail?(k(),D(j,{key:0,title:`磁盘可用: ${e.result.disk_avail}`},null,8,[`title`])):B(``,!0),e.result.disk_used_pct==null?B(``,!0):(k(),D(j,{key:1,title:`磁盘使用率: ${e.result.disk_used_pct}%`},null,8,[`title`])),w(j,{title:`目标路径存在`},{append:a(()=>[w(b,{color:e.result.path_exists?`success`:`error`},{default:a(()=>[A(i(e.result.path_exists?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1}),e.result.path_perms?(k(),D(j,{key:2,subtitle:e.result.path_perms,title:`权限`},null,8,[`subtitle`])):B(``,!0),w(j,{title:`目标路径可写`},{append:a(()=>[w(b,{color:e.result.path_writable?`success`:`error`},{default:a(()=>[A(i(e.result.path_writable?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1})]),_:1}),(k(!0),F(x,null,C(e.result.errors,(e,t)=>(k(),D(X,{key:t,type:`error`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:a(()=>[A(i(c(Z)(e)),1)]),_:2},1024))),128))],64)):B(``,!0)]),_:1}),w(s,null,{default:a(()=>[w(J),w(g,{variant:`text`,onClick:n[0]||=e=>t.$emit(`update:modelValue`,!1)},{default:a(()=>[...n[2]||=[A(`关闭`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),Te={class:`text-caption`},Ee={class:`text-caption text-medium-emphasis`},De=[`title`],Oe={key:1,class:`text-caption text-medium-emphasis`},ke=L({__name:`PushHistoryTable`,props:{items:{},headers:{},total:{},loading:{type:Boolean},page:{},statusFilter:{},syncModeFilter:{},serverFilter:{},statusOptions:{},syncModeOptions:{},serverOptions:{},reconciling:{type:Boolean}},emits:[`update:page`,`update:statusFilter`,`update:syncModeFilter`,`update:serverFilter`,`filter-change`,`page-change`,`reconcile`,`diagnose`],setup(e){return(n,r)=>(k(),D(f,{elevation:`0`,border:``,rounded:`lg`},{default:a(()=>[w(o,{class:`d-flex flex-wrap align-center ga-2`},{default:a(()=>[r[6]||=t(`span`,null,`推送历史`,-1),w(J),w(G,{"model-value":e.statusFilter,items:e.statusOptions,"item-title":`label`,"item-value":`value`,label:`状态`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``,style:{"max-width":`120px`},"onUpdate:modelValue":r[0]||=e=>{n.$emit(`update:statusFilter`,e),n.$emit(`filter-change`)}},null,8,[`model-value`,`items`]),w(G,{"model-value":e.syncModeFilter,items:e.syncModeOptions,"item-title":`label`,"item-value":`value`,label:`模式`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``,style:{"max-width":`120px`},"onUpdate:modelValue":r[1]||=e=>{n.$emit(`update:syncModeFilter`,e),n.$emit(`filter-change`)}},null,8,[`model-value`,`items`]),w(G,{"model-value":e.serverFilter,items:e.serverOptions,"item-title":`title`,"item-value":`value`,label:`服务器`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``,style:{"max-width":`180px`},"onUpdate:modelValue":r[2]||=e=>{n.$emit(`update:serverFilter`,e),n.$emit(`filter-change`)}},null,8,[`model-value`,`items`]),w(g,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-wrench`,loading:e.reconciling,onClick:r[3]||=e=>n.$emit(`reconcile`)},{default:a(()=>[...r[5]||=[A(` 修复卡住记录 `,-1)]]),_:1},8,[`loading`])]),_:1}),w(pe,{items:e.items,headers:e.headers,"items-length":e.total,loading:e.loading,page:e.page,"items-per-page":15,hover:``,density:`comfortable`,"onUpdate:page":r[4]||=e=>{n.$emit(`update:page`,e),n.$emit(`page-change`)}},{"item.status":a(({item:e})=>[w(W,{color:c(be)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:a(()=>[A(i(c(ye)(e.status)),1)]),_:2},1032,[`color`])]),"item.sync_mode":a(({item:e})=>[t(`span`,Te,i(c(xe)(e.sync_mode)),1)]),"item.started_at":a(({item:e})=>[t(`span`,Ee,i(c(ve)(e.started_at)),1)]),"item.error_message":a(({item:e})=>[e.error_message?(k(),F(`span`,{key:0,class:`text-caption text-error text-truncate d-inline-block`,style:{"max-width":`200px`},title:c(Z)(e.error_message)},i(c(Z)(e.error_message)),9,De)):(k(),F(`span`,Oe,`—`))]),"item.actions":a(({item:e})=>[e.status===`failed`?(k(),D(g,{key:0,size:`x-small`,variant:`tonal`,"prepend-icon":`mdi-stethoscope`,onClick:t=>n.$emit(`diagnose`,e)},{default:a(()=>[...r[7]||=[A(` 诊断 `,-1)]]),_:1},8,[`onClick`])):B(``,!0)]),"no-data":a(()=>[...r[8]||=[t(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无数据`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`])]),_:1}))}}),Ae={class:`text-caption text-medium-emphasis`},je={key:2,class:`mb-2 text-body-2`},Me={key:0,class:`text-error text-caption`},Ne={key:1,class:`text-warning text-caption`},Pe={key:2,class:`text-caption text-medium-emphasis`},Fe=L({__name:`PushPreviewDialog`,props:{modelValue:{type:Boolean},loading:{type:Boolean},results:{},selectedCount:{},previewDone:{},previewTotal:{},largeBatch:{type:Boolean},warnThreshold:{},errorCount:{},syncMode:{}},emits:[`update:modelValue`,`confirm-push`],setup(n){return(r,u)=>(k(),D(Y,{"model-value":n.modelValue,"max-width":`800`,"onUpdate:modelValue":u[2]||=e=>r.$emit(`update:modelValue`,e)},{default:a(()=>[w(f,{border:``},{default:a(()=>[w(o,{class:`d-flex align-center`},{default:a(()=>[u[3]||=A(` 推送预览 `,-1),w(J),t(`span`,Ae,[n.loading?(k(),F(x,{key:0},[A(i(n.previewDone)+` / `+i(n.previewTotal)+` 台`,1)],64)):(k(),F(x,{key:1},[A(i(n.results.length)+` 台`,1)],64))])]),_:1}),w(p,null,{default:a(()=>[n.loading?(k(),D(l,{key:0,"model-value":n.previewTotal?Math.round(n.previewDone/n.previewTotal*100):0,class:`mb-3`},null,8,[`model-value`])):B(``,!0),n.largeBatch&&!n.loading?(k(),D(X,{key:1,type:`info`,density:`compact`,variant:`tonal`,class:`mb-2`},{default:a(()=>[A(` 已预览 `+i(n.results.length)+` 台服务器(超过 `+i(n.warnThreshold)+` 台时推送耗时可能较长) `,1)]),_:1})):B(``,!0),n.loading?B(``,!0):(k(),F(`div`,je,[u[4]||=A(` 将推送到 `,-1),t(`strong`,null,i(n.selectedCount),1),u[5]||=A(` 台服务器 `,-1)])),n.results.length?(k(),D(e,{key:3,density:`compact`},{default:a(()=>[u[6]||=t(`thead`,null,[t(`tr`,null,[t(`th`,null,`服务器`),t(`th`,null,`文件数`),t(`th`,null,`预计传输`),t(`th`,null,`大小`),t(`th`,null,`备注`)])],-1),t(`tbody`,null,[(k(!0),F(x,null,C(n.results,e=>(k(),F(`tr`,{key:e.server_id},[t(`td`,null,i(e.server_name),1),t(`td`,null,i(e.stats?.files_total??`—`),1),t(`td`,null,i(e.stats?.files_transferred??`—`),1),t(`td`,null,i(e.stats?c(Q)(e.stats.transfer_size_bytes??0):`—`),1),t(`td`,null,[e.error?(k(),F(`span`,Me,i(c(Z)(e.error)),1)):n.syncMode===`full`&&(e.stats?.files_deleted??0)>0?(k(),F(`span`,Ne,`将删除 `+i(e.stats?.files_deleted)+` 个远端文件`,1)):(k(),F(`span`,Pe,`—`))])]))),128))])]),_:1})):B(``,!0),n.errorCount>0&&!n.loading?(k(),D(X,{key:4,type:`warning`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:a(()=>[A(i(n.errorCount)+` 台预览失败,推送时这些服务器可能仍会失败 `,1)]),_:1})):B(``,!0)]),_:1}),w(s,null,{default:a(()=>[w(J),w(g,{variant:`text`,onClick:u[0]||=e=>r.$emit(`update:modelValue`,!1)},{default:a(()=>[...u[7]||=[A(`关闭`,-1)]]),_:1}),w(g,{color:`primary`,variant:`flat`,disabled:n.loading,onClick:u[1]||=e=>r.$emit(`confirm-push`)},{default:a(()=>[...u[8]||=[A(`确认推送`,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),Ie={key:1,class:`text-caption text-medium-emphasis mb-2`},Le={key:0},Re=L({__name:`PushProgressList`,props:{items:{},batchId:{},pushing:{type:Boolean},cancelling:{type:Boolean},retryingAll:{type:Boolean},failedRetryCount:{},doneCount:{},totalProgress:{}},emits:[`cancel`,`retry-all`],setup(e){return(n,r)=>e.items.length>0?(k(),D(f,{key:0,class:`mb-4`,elevation:`0`,border:``,rounded:`lg`},{default:a(()=>[w(o,{class:`d-flex align-center text-subtitle-1`},{default:a(()=>[r[3]||=A(` 推送进度 `,-1),w(J),e.failedRetryCount>0&&!e.pushing?(k(),D(g,{key:0,size:`small`,variant:`tonal`,color:`warning`,class:`mr-2`,"prepend-icon":`mdi-refresh`,loading:e.retryingAll,onClick:r[0]||=e=>n.$emit(`retry-all`)},{default:a(()=>[A(` 重试全部失败 (`+i(e.failedRetryCount)+`) `,1)]),_:1},8,[`loading`])):B(``,!0),e.batchId&&e.items.some(e=>e.status===`running`||e.status===`pending`)&&e.pushing?(k(),D(g,{key:1,size:`small`,variant:`tonal`,color:`error`,class:`mr-2`,loading:e.cancelling,onClick:r[1]||=e=>n.$emit(`cancel`)},{default:a(()=>[...r[2]||=[A(` 取消推送 `,-1)]]),_:1},8,[`loading`])):B(``,!0),w(W,{size:`small`,variant:`tonal`,color:`primary`},{default:a(()=>[A(i(e.items.filter(e=>e.status===`success`).length)+`/`+i(e.items.length)+` 完成 `,1)]),_:1})]),_:1}),w(d),w(p,null,{default:a(()=>[e.pushing||e.totalProgress>0?(k(),D(l,{key:0,"model-value":e.totalProgress,color:`primary`,height:`8`,rounded:``,class:`mb-3`},null,8,[`model-value`])):B(``,!0),e.items.length?(k(),F(`div`,Ie,[A(i(e.doneCount)+` / `+i(e.items.length)+` 台已结束 `,1),e.items.some(e=>e.status===`failed`)?(k(),F(`span`,Le,` · `+i(e.items.filter(e=>e.status===`failed`).length)+` 失败 `,1)):B(``,!0)])):B(``,!0),w(V,{density:`compact`},{default:a(()=>[(k(!0),F(x,null,C(e.items,e=>(k(),D(j,{key:e.id,title:e.name},re({append:a(()=>[e.status===`pending`?(k(),D(b,{key:0,color:`grey`},{default:a(()=>[...r[4]||=[A(`mdi-clock-outline`,-1)]]),_:1})):e.status===`running`?(k(),D(b,{key:1,color:`blue`,class:`mdi-spin`},{default:a(()=>[...r[5]||=[A(`mdi-loading`,-1)]]),_:1})):e.status===`success`?(k(),D(b,{key:2,color:`green`},{default:a(()=>[...r[6]||=[A(`mdi-check-circle`,-1)]]),_:1})):e.status===`cancelled`?(k(),D(b,{key:3,color:`grey`},{default:a(()=>[...r[7]||=[A(`mdi-cancel`,-1)]]),_:1})):(k(),D(b,{key:4,color:`red`},{default:a(()=>[...r[8]||=[A(`mdi-alert-circle`,-1)]]),_:1}))]),_:2},[e.detail?{name:`subtitle`,fn:a(()=>[t(`span`,{class:v(e.status===`failed`?`text-error`:`text-medium-emphasis`)},i(e.detail),3)]),key:`0`}:void 0]),1032,[`title`]))),128))]),_:1})]),_:1})]),_:1})):B(``,!0)}}),ze={key:0,class:`text-center text-medium-emphasis py-6`},Be={class:`d-flex align-center px-2 mb-2`},Ve={class:`text-caption text-medium-emphasis ml-1`},He={class:`d-flex align-center ga-2`},Ue={class:`text-body-2 font-weight-medium text-truncate`},We={class:`text-caption text-medium-emphasis text-truncate`},Ge=[`title`],Ke={key:0,class:`text-caption mt-1`},qe=L({__name:`PushServerGrid`,props:{selectAll:{type:Boolean},serverSearch:{},serversLoading:{type:Boolean},serversByCategory:{},selectedIds:{},pushStatus:{},isCategoryAllSelected:{type:Function}},emits:[`update:serverSearch`,`toggle-all`,`refresh`,`toggle-category`,`toggle-server`],setup(e){return(n,r)=>(k(),D(f,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:a(()=>[w(o,{class:`d-flex align-center`},{default:a(()=>[w(fe,{"model-value":e.selectAll,label:`全选`,density:`compact`,"hide-details":``,class:`mr-4`,"onUpdate:modelValue":r[0]||=e=>n.$emit(`toggle-all`)},null,8,[`model-value`]),w(R,{"model-value":e.serverSearch,"prepend-inner-icon":`mdi-magnify`,label:`搜索服务器...`,density:`compact`,"hide-details":``,variant:`outlined`,rounded:``,style:{"max-width":`240px`},"onUpdate:modelValue":r[1]||=e=>n.$emit(`update:serverSearch`,e)},null,8,[`model-value`]),w(g,{icon:`mdi-refresh`,variant:`text`,size:`small`,loading:e.serversLoading,title:`刷新在线状态`,onClick:r[2]||=e=>n.$emit(`refresh`)},null,8,[`loading`])]),_:1}),w(d),w(p,{class:`pa-2`},{default:a(()=>[e.serversByCategory.length===0?(k(),F(`div`,ze,`暂无服务器`)):(k(!0),F(x,{key:1},C(e.serversByCategory,o=>(k(),F(`div`,{key:o.category,class:`mb-4`},[t(`div`,Be,[w(g,{size:`x-small`,variant:`text`,color:e.isCategoryAllSelected(o.category)?`primary`:`default`,onClick:e=>n.$emit(`toggle-category`,o.category)},{default:a(()=>[w(b,{size:`16`,class:`mr-1`},{default:a(()=>[A(i(e.isCategoryAllSelected(o.category)?`mdi-checkbox-marked`:`mdi-checkbox-blank-outline`),1)]),_:2},1024),A(` `+i(o.category),1)]),_:2},1032,[`color`,`onClick`]),t(`span`,Ve,` (`+i(o.servers.filter(t=>e.selectedIds.has(t.id)).length)+`/`+i(o.servers.length)+`) `,1)]),w(q,{dense:``},{default:a(()=>[(k(!0),F(x,null,C(o.servers,o=>(k(),D(K,{key:o.id,cols:`6`,sm:`4`,md:`3`,lg:`2`},{default:a(()=>[w(f,{color:e.selectedIds.has(o.id)?`primary`:void 0,variant:e.selectedIds.has(o.id)?`tonal`:`outlined`,rounded:`lg`,class:`pa-3 cursor-pointer`,onClick:e=>n.$emit(`toggle-server`,o.id)},{default:a(()=>[t(`div`,He,[w(b,{color:c(Ce)(o.is_online),size:`12`},{default:a(()=>[...r[3]||=[A(`mdi-circle`,-1)]]),_:1},8,[`color`]),t(`span`,Ue,i(o.name),1)]),t(`div`,We,i(o.domain),1),t(`div`,{class:`text-caption text-medium-emphasis text-truncate`,title:o.target_path||`未配置目标路径`},` → `+i(o.target_path?.trim()||`未配置`),9,Ge),e.pushStatus[o.id]?(k(),F(`div`,Ke,[w(W,{color:c(Se)(e.pushStatus[o.id]),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:a(()=>[A(i(e.pushStatus[o.id]),1)]),_:2},1032,[`color`])])):B(``,!0)]),_:2},1032,[`color`,`variant`,`onClick`])]),_:2},1024))),128))]),_:2},1024)]))),128))]),_:1})]),_:1}))}}),Je=O({...ue({falseIcon:`$radioOff`,trueIcon:`$radioOn`})},`VRadio`),$=E()({name:`VRadio`,props:Je(),setup(e,{slots:t}){return P(()=>w(H,N(H.filterProps(e),{class:[`v-radio`,e.class],style:e.style,type:`radio`}),t)),{}}}),Ye=O({height:{type:[Number,String],default:`auto`},..._(ie(),[`direction`]),..._(ce(),[`multiple`]),trueIcon:{type:z,default:`$radioOn`},falseIcon:{type:z,default:`$radioOff`},type:{type:String,default:`radio`}},`VRadioGroup`),Xe=E()({name:`VRadioGroup`,inheritAttrs:!1,props:Ye(),emits:{"update:modelValue":e=>!0},setup(e,{attrs:i,slots:a}){let o=T(),s=h(()=>e.id||`radio-group-${o}`),c=n(e,`modelValue`),l=r();return P(()=>{let[n,r]=oe(i),o=I.filterProps(e),u=H.filterProps(e),d=a.label?a.label({label:e.label,props:{for:s.value}}):e.label;return w(I,N({ref:l,class:[`v-radio-group`,e.class],style:e.style},n,o,{modelValue:c.value,"onUpdate:modelValue":e=>c.value=e,id:s.value}),{...a,default:({id:n,messagesId:i,isDisabled:o,isReadonly:s})=>t(x,null,[d&&w(ee,{id:n.value},{default:()=>[d]}),w(le,N(u,{id:n.value,"aria-describedby":i.value,defaultsTarget:`VRadio`,trueIcon:e.trueIcon,falseIcon:e.falseIcon,type:e.type,disabled:o.value,readonly:s.value,"aria-labelledby":d?n.value:void 0,multiple:!1},r,{modelValue:c.value,"onUpdate:modelValue":e=>c.value=e}),a)])})}),ae({},l)}}),Ze={class:`text-caption text-medium-emphasis mt-1`},Qe=L({__name:`PushSyncModeCard`,props:{syncMode:{},syncModeDesc:{}},emits:[`update:syncMode`],setup(e,{emit:n}){let r=n;function s(e){e!=null&&r(`update:syncMode`,e)}return(n,r)=>(k(),D(f,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:a(()=>[w(o,{class:`text-subtitle-1`},{default:a(()=>[...r[0]||=[A(`同步模式`,-1)]]),_:1}),w(p,null,{default:a(()=>[w(Xe,{"model-value":e.syncMode,inline:``,density:`compact`,"onUpdate:modelValue":s},{default:a(()=>[w($,{label:`增量同步`,value:`incremental`}),w($,{label:`全量同步`,value:`full`}),w($,{label:`校验和同步`,value:`checksum`})]),_:1},8,[`model-value`]),e.syncMode===`full`?(k(),D(X,{key:0,type:`warning`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:a(()=>[...r[1]||=[A(` 全量同步会删除目标目录中不存在于源目录的文件 `,-1)]]),_:1})):B(``,!0),t(`div`,Ze,i(e.syncModeDesc),1)]),_:1})]),_:1}))}}),$e=L({__name:`PushToolbar`,props:{targetPath:{},pushing:{type:Boolean}},emits:[`update:targetPath`,`preview`,`push`],setup(e){return(t,n)=>(k(),D(f,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4 pa-4`},{default:a(()=>[w(q,{align:`center`,dense:``},{default:a(()=>[w(K,{cols:`12`,sm:`8`},{default:a(()=>[w(R,{"model-value":e.targetPath,label:`目标路径`,placeholder:`/www/wwwroot`,hint:`留空则使用下方各服务器配置的路径;填写则统一覆盖所有选中服务器`,"persistent-hint":``,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder-marker`,clearable:``,"onUpdate:modelValue":n[0]||=e=>t.$emit(`update:targetPath`,e??``)},null,8,[`model-value`])]),_:1}),w(K,{cols:`12`,sm:`4`,class:`d-flex ga-2 justify-end`},{default:a(()=>[w(g,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-eye`,onClick:n[1]||=e=>t.$emit(`preview`)},{default:a(()=>[...n[3]||=[A(`预览`,-1)]]),_:1}),w(g,{size:`small`,color:`primary`,variant:`flat`,"prepend-icon":`mdi-upload`,loading:e.pushing,onClick:n[2]||=e=>t.$emit(`push`)},{default:a(()=>[...n[4]||=[A(` 推送 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1}))}}),et={key:0},tt={key:1,class:`d-flex align-center flex-wrap ga-2`},nt={class:`d-flex align-center flex-wrap ga-2`},rt={class:`text-body-2`},it={key:3},at={class:`d-flex ga-2 align-start flex-wrap`},ot={key:4,class:`text-caption text-medium-emphasis mt-2`},st=L({__name:`PushZipUpload`,props:{uploadedSource:{},validatedSource:{},sourcePath:{},sourcePathValidating:{type:Boolean},isDragging:{type:Boolean},sourceUploading:{type:Boolean}},emits:[`dragover`,`dragleave`,`drop`,`file-select`,`clear`,`clear-validated`,`update:sourcePath`,`validate`],setup(e){let n=r(null);return(r,s)=>(k(),D(f,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:a(()=>[w(o,{class:`text-subtitle-1`},{default:a(()=>[...s[10]||=[A(`源文件`,-1)]]),_:1}),w(p,null,{default:a(()=>[e.validatedSource?(k(),D(X,{key:1,type:`success`,variant:`tonal`,density:`compact`,class:`mb-0`},{default:a(()=>[t(`div`,nt,[w(b,null,{default:a(()=>[...s[15]||=[A(`mdi-folder-check`,-1)]]),_:1}),t(`span`,rt,i(e.validatedSource.path)+` (`+i(e.validatedSource.fileCount)+` 个文件, `+i(c(Q)(e.validatedSource.sizeBytes))+`) `,1),w(J),w(g,{size:`small`,variant:`text`,color:`error`,onClick:s[6]||=e=>r.$emit(`clear-validated`)},{default:a(()=>[...s[16]||=[A(`清除`,-1)]]),_:1})])]),_:1})):(k(),F(x,{key:0},[e.uploadedSource?(k(),F(`div`,tt,[w(b,{class:`mr-1`},{default:a(()=>[A(i(e.uploadedSource.kind===`zip`?`mdi-folder-zip`:`mdi-file-multiple`),1)]),_:1}),t(`span`,null,i(e.uploadedSource.name)+` (`+i(e.uploadedSource.fileCount)+` 个文件, `+i(c(Q)(e.uploadedSource.size))+`) `,1),w(J),w(g,{size:`small`,variant:`text`,color:`error`,onClick:s[5]||=e=>r.$emit(`clear`)},{default:a(()=>[...s[14]||=[A(`清除`,-1)]]),_:1})])):(k(),F(`div`,et,[t(`div`,{class:v([`border-dashed border rounded pa-6 text-center cursor-pointer`,{"border-primary bg-primary-lighten-5":e.isDragging}]),onDragover:s[0]||=S(e=>r.$emit(`dragover`),[`prevent`]),onDragleave:s[1]||=e=>r.$emit(`dragleave`),onDrop:s[2]||=S(e=>r.$emit(`drop`,e),[`prevent`]),onClick:s[3]||=e=>n.value?.click()},[w(b,{size:`48`,color:`grey`},{default:a(()=>[...s[11]||=[A(`mdi-cloud-upload-outline`,-1)]]),_:1}),s[12]||=t(`div`,{class:`text-body-2 mt-2`},`拖拽文件到此处,或点击选择`,-1),s[13]||=t(`div`,{class:`text-caption text-medium-emphasis`},` 支持普通文件(可多选)或 .zip 压缩包 `,-1)],34),t(`input`,{ref_key:`fileInputRef`,ref:n,type:`file`,multiple:``,hidden:``,onChange:s[4]||=e=>r.$emit(`file-select`,e)},null,544)])),e.sourceUploading?(k(),D(l,{key:2,indeterminate:``,class:`mt-2`})):B(``,!0)],64)),e.validatedSource?B(``,!0):(k(),D(d,{key:2,class:`my-4`})),!e.validatedSource&&!e.uploadedSource?(k(),F(`div`,it,[s[18]||=t(`div`,{class:`text-caption text-medium-emphasis mb-2`},`或输入 Nexus 主机源路径(容器内绝对路径)`,-1),t(`div`,at,[w(R,{"model-value":e.sourcePath,placeholder:`/path/to/files`,variant:`outlined`,density:`compact`,"hide-details":``,"prepend-inner-icon":`mdi-folder`,class:`flex-grow-1`,style:{"min-width":`240px`},"onUpdate:modelValue":s[7]||=e=>r.$emit(`update:sourcePath`,e),onKeydown:s[8]||=u(S(e=>r.$emit(`validate`),[`prevent`]),[`enter`])},null,8,[`model-value`]),w(g,{variant:`tonal`,color:`primary`,loading:e.sourcePathValidating,disabled:!e.sourcePath.trim(),onClick:s[9]||=e=>r.$emit(`validate`)},{default:a(()=>[...s[17]||=[A(` 验证路径 `,-1)]]),_:1},8,[`loading`,`disabled`])])])):e.uploadedSource?(k(),F(`div`,ot,` 已使用上传暂存目录作为源;清除后可改用主机源路径 `)):B(``,!0)]),_:1})]),_:1}))}}),ct=[`success`,`failed`,`cancelled`];function lt(e){let t=[],n=[];for(let r of e)r.name.toLowerCase().endsWith(`.zip`)?t.push(r):n.push(r);return{zips:t,others:n}}function ut(){let e=U(),t=r(``),n=r(null),i=r(``),a=r(!1),o=r(``),s=r(`incremental`),c=r(!1),l=r(null),u=r(!1);se(t,e=>{n.value&&e.trim()!==i.value&&(n.value=null)});let d=h(()=>{switch(s.value){case`incremental`:return`仅传输新增或修改的文件`;case`full`:return`使目标目录与源目录完全一致,会删除不存在于源的文件`;case`checksum`:return`通过文件内容校验和判断是否需要传输`;default:return``}});function f(){return l.value?.sourcePath||n.value?.path||``}function p(){return o.value.trim()||void 0}function m(r,i=[]){return f()?!p()&&i.filter(e=>!(e.target_path||``).trim()).length>0?(e(`目标路径留空时,所选服务器须已在「服务器管理」中配置目标路径`,`warning`),!1):r===0?(e(`请选择至少一台服务器`,`warning`),!1):!0:(t.value.trim()&&!n.value?e(`请先点击「验证路径」确认 Nexus 主机上的源目录`,`warning`):e(`请上传文件/ZIP 或验证 Nexus 主机源路径`,`warning`),!1)}async function g(){let r=t.value.trim();if(!r){e(`请输入 Nexus 主机上的源目录路径`,`warning`);return}if(l.value){e(`请先清除已上传的源文件`,`warning`);return}a.value=!0;try{let a=await y.post(`/sync/validate-source-path`,{path:r});n.value={path:a.path,fileCount:a.file_count,sizeBytes:a.size_bytes},i.value=a.path,t.value=a.path,e(`路径验证通过:${a.file_count} 个文件`)}catch(t){n.value=null,e(t instanceof Error?t.message:`路径验证失败`,`error`)}finally{a.value=!1}}function _(){n.value=null,i.value=``,t.value=``}function v(){l.value=null}async function b(t){if(!t.length)return;if(n.value){e(`请先清除已验证的源路径`,`warning`);return}let{zips:r,others:i}=lt(t);if(r.length&&i.length){e(`请勿同时上传 ZIP 与普通文件`,`warning`);return}if(r.length>1){e(`一次只能上传一个 ZIP 文件`,`warning`);return}if(r.length===1){await C(r[0]);return}await w(i)}async function x(e){c.value=!1,await b(Array.from(e.dataTransfer?.files??[]))}function S(e){let t=e.target,n=Array.from(t.files??[]);t.value=``,b(n)}async function C(t){u.value=!0;try{let n=new FormData;n.append(`file`,t);let r=await y.upload(`/sync/upload-zip`,n);l.value={kind:`zip`,name:t.name,sourcePath:r.source_path,fileCount:r.file_count,size:r.size},e(`ZIP 上传成功`)}catch(t){e(t instanceof Error?t.message:`上传失败`,`error`)}finally{u.value=!1}}async function w(t){if(t.length){u.value=!0;try{let n=new FormData;for(let e of t)n.append(`files`,e);let r=await y.upload(`/sync/upload-files`,n);l.value={kind:`files`,name:t.length===1?t[0].name:`${t.length} 个文件`,sourcePath:r.source_path,fileCount:r.file_count,size:r.size},e(`已上传 ${r.file_count} 个文件`)}catch(t){e(t instanceof Error?t.message:`上传失败`,`error`)}finally{u.value=!1}}}return{sourcePath:t,validatedSource:n,sourcePathValidating:a,targetPath:o,syncMode:s,syncModeDesc:d,isDragging:c,uploadedSource:l,sourceUploading:u,effectiveSourcePath:f,effectiveTargetPath:p,validateForm:m,validateSourcePath:g,clearValidatedSource:_,clearUploadedSource:v,handleFileDrop:x,handleFileSelect:S}}function dt(e){let t=r([]),n=r(!1),i=r(``),a=r(new Set),o=null;async function s(){n.value=!0;try{t.value=(await y.get(`/servers/`,{per_page:200})).items||[]}catch{t.value=[]}finally{n.value=!1}}function c(e){l(),o=setInterval(()=>{e()||s()},6e4)}function l(){o&&=(clearInterval(o),null)}let u=h(()=>{if(!i.value)return t.value;let e=i.value.toLowerCase();return t.value.filter(t=>t.name.toLowerCase().includes(e)||(t.domain||``).toLowerCase().includes(e)||(t.target_path||``).toLowerCase().includes(e))}),d=h(()=>{let e=u.value;return e.length>0&&e.every(e=>a.value.has(e.id))}),f=h(()=>{let e={};for(let t of u.value){let n=t.category||`未分类`;e[n]||(e[n]=[]),e[n].push(t)}return Object.entries(e).map(([e,t])=>({category:e,servers:t}))});function p(e){let t=f.value.find(t=>t.category===e);return!t||t.servers.length===0?!1:t.servers.every(e=>a.value.has(e.id))}function m(e){let t=f.value.find(t=>t.category===e);if(!t)return;let n=new Set(a.value),r=t.servers.every(e=>n.has(e.id));for(let e of t.servers)r?n.delete(e.id):n.add(e.id);a.value=n}function g(e){let t=new Set(a.value);t.has(e)?t.delete(e):t.add(e),a.value=t}function _(){let e=u.value,t=e.length>0&&e.every(e=>a.value.has(e.id)),n=new Set(a.value);for(let r of e)t?n.delete(r.id):n.add(r.id);a.value=n}return{servers:t,serversLoading:n,serverSearch:i,selectedIds:a,pushStatus:e,filteredServers:u,selectAll:d,serversByCategory:f,loadServers:s,startAutoRefresh:c,stopAutoRefresh:l,isCategoryAllSelected:p,toggleCategory:m,toggleServer:g,toggleAll:_}}function ft(){return crypto.randomUUID().replace(/-/g,``).slice(0,12)}function pt(e,t,n){let i=U(),a=m(),o=r(!1),s=r(!1),c=r(!1),l=r([]),u=r(``),d=r(null),f=[],p=h(()=>l.value.filter(e=>ct.includes(e.status)).length),g=h(()=>{let e=l.value.length;return e?Math.round(p.value/e*100):0});function _(){f.forEach(e=>clearTimeout(e)),f.length=0}function v(){let e=l.value.length;if(!e||!o.value||l.value.filter(e=>ct.includes(e.status)).length<e)return;o.value=!1,C(),n();let t=l.value.filter(e=>e.status===`failed`).length,r=l.value.filter(e=>e.status===`cancelled`).length,a=l.value.filter(e=>e.status===`success`).length;i(`推送完成:${a} 成功,${t} 失败${r?`${r} 取消`:``}`)}function b(e){if(e.type!==`sync_progress`||e.batch_id!==u.value||e.server_id==null)return;let n=l.value.findIndex(t=>t.id===e.server_id);if(n===-1)return;let r=l.value[n],i=e.status;if(i===`running`)r.status=`running`,r.detail=`同步中...`;else if(i===`success`){r.status=`success`;let n=e.duration_seconds;r.detail=n==null?`完成`:`完成(${n}s`,t.pushStatus.value[e.server_id]=`成功`}else i===`failed`?(r.status=`failed`,r.detail=Z(e.error_message)||`失败`,e.retry_job_id!=null&&(r.retryJobId=e.retry_job_id),t.pushStatus.value[e.server_id]=`失败`):i===`cancelled`&&(r.status=`cancelled`,r.detail=Z(e.error_message)||`已取消`,t.pushStatus.value[e.server_id]=`已取消`);v()}function x(e){let n=e.results;if(n){for(let[e,r]of Object.entries(n)){let n=Number(e);if(!Number.isFinite(n))continue;let i=l.value.findIndex(e=>e.id===n);if(i===-1)continue;let a=l.value[i],o=r.status;if(o===`success`){a.status=`success`;let e=r.duration_seconds;a.detail=e==null?`完成`:`完成(${e}s`,t.pushStatus.value[n]=`成功`}else o===`failed`?(a.status=`failed`,a.detail=Z(r.error_message)||`失败`,r.retry_job_id!=null&&(a.retryJobId=r.retry_job_id),t.pushStatus.value[n]=`失败`):o===`cancelled`&&(a.status=`cancelled`,a.detail=Z(r.error_message)||`已取消`,t.pushStatus.value[n]=`已取消`)}v()}}function S(){if(!a.token)return Promise.reject(Error(`未登录,无法连接推送进度`));C();let e=me(`/ws/sync`,{token:a.token}),r=new WebSocket(e);return new Promise((e,s)=>{r.onopen=()=>e(),r.onerror=()=>s(Error(`推送进度 WebSocket 连接失败`)),r.onmessage=e=>{if(e.data!==`pong`)try{let t=JSON.parse(e.data);if(t.type===`ping`){r.send(`pong`);return}b(t)}catch{}},r.onclose=e=>{if(d.value=null,e.code===4001||e.code===4401){a.forceLogout();return}e.code!==1e3&&o.value&&(l.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`failed`,e.detail=`连接中断`,t.pushStatus.value[e.id]=`失败`)}),o.value=!1,i(`推送进度连接中断,部分服务器状态未知`,`warning`),n())},d.value=r})}function C(){d.value&&=(d.value.close(1e3),null)}async function w(){if(u.value){s.value=!0;try{await y.post(`/sync/cancel`,{batch_id:u.value}),l.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`cancelled`,e.detail=`已取消`,t.pushStatus.value[e.id]=`已取消`)}),o.value=!1,C(),n(),i(`推送已取消`)}catch(e){i(e instanceof Error?e.message:`取消失败`,`error`)}finally{s.value=!1}}}async function T(){if(o.value)return;let r=[...t.selectedIds.value].map(e=>t.servers.value.find(t=>t.id===e)).filter(e=>e!=null);if(!e.validateForm(r.length,r))return;_(),C(),u.value=``,t.pushStatus.value={};let a=r.map(e=>e.id);l.value=a.map(e=>({id:e,name:t.servers.value.find(t=>t.id===e)?.name||`#${e}`,status:`pending`})),o.value=!0,u.value=ft();try{await S();let t=await y.post(`/sync/files`,{source_path:e.effectiveSourcePath(),target_path:e.effectiveTargetPath(),server_ids:a,sync_mode:e.syncMode.value,batch_id:u.value});t.batch_id&&t.batch_id!==u.value&&(u.value=t.batch_id),x(t)}catch(e){C();let t=e instanceof Error?e.message:`推送请求失败`;l.value.forEach(e=>{e.status=`failed`,e.detail=t}),o.value=!1,i(t,`error`),n();return}let s=setTimeout(()=>{o.value&&(l.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`failed`,e.detail=`等待超时`,t.pushStatus.value[e.id]=`失败`)}),o.value=!1,C(),n(),i(`推送超时,${p.value}/${l.value.length} 台已有结果`,`warning`))},3e5);f.push(s)}let E=h(()=>l.value.filter(e=>e.status===`failed`&&e.retryJobId!=null).length);async function D(){let e=l.value.filter(e=>e.status===`failed`&&e.retryJobId!=null).map(e=>e.retryJobId);if(!e.length){i(`没有可重试的失败任务(重试任务可能尚未创建)`,`warning`);return}c.value=!0;let t=0,n=0;try{for(let r of e)try{await y.post(`/retries/${r}/retry`),t++}catch{n++}i(n>0?`已提交 ${t} 个重试,${n} 个提交失败`:`已提交 ${t} 个失败服务器的重试任务`)}finally{c.value=!1}}function O(){C(),_()}return{pushing:o,cancelling:s,retryingAll:c,wsProgressItems:l,pushBatchId:u,doneCount:p,totalProgress:g,failedRetryCount:E,doPush:T,cancelPush:w,retryAllFailed:D,dispose:O}}function mt(e,t){let n=r(!1),i=r([]),a=r(!1),o=r(0),s=r(0),c=h(()=>o.value>30),l=h(()=>i.value.filter(e=>e.error).length);async function u(t,n){try{let r=await y.post(`/sync/preview`,{source_path:e.effectiveSourcePath(),target_path:e.effectiveTargetPath(),server_id:t,sync_mode:e.syncMode.value});return r.error?{server_id:t,server_name:n,error:r.error}:{server_id:t,server_name:r.server_name||n,stats:r.stats}}catch(e){return{server_id:t,server_name:n,error:e instanceof Error?e.message:`预览失败`}}}async function d(){let r=[...t.selectedIds.value].map(e=>t.servers.value.find(t=>t.id===e)).filter(e=>e!=null);if(!e.validateForm(r.length,r))return;let c=r.map(e=>e.id);o.value=c.length,s.value=0,n.value=!0,a.value=!0,i.value=[];let l=c.map(e=>({id:e,name:t.servers.value.find(t=>t.id===e)?.name||`#${e}`}));for(let e=0;e<l.length;e+=4){let t=l.slice(e,e+4),n=await Promise.all(t.map(e=>u(e.id,e.name)));i.value=[...i.value,...n],s.value=i.value.length}a.value=!1}function f(){n.value=!1}function p(e){n.value=!1,e()}return{showPreview:n,previewResults:i,previewLoading:a,previewTotal:o,previewDone:s,previewLargeBatch:c,previewWarnThreshold:30,previewErrorCount:l,doPreview:d,closePreview:f,confirmAndPush:p}}var ht=[{label:`成功`,value:`success`},{label:`失败`,value:`failed`},{label:`进行中`,value:`running`},{label:`已取消`,value:`cancelled`}],gt=[{label:`增量`,value:`incremental`},{label:`全量`,value:`full`},{label:`校验和`,value:`checksum`}],_t=[{title:`时间`,key:`started_at`,width:170},{title:`服务器`,key:`server_name`,width:120},{title:`状态`,key:`status`,width:88},{title:`模式`,key:`sync_mode`,width:88},{title:`源路径`,key:`source_path`},{title:`目标路径`,key:`target_path`},{title:`错误`,key:`error_message`,width:200},{title:`操作`,key:`actions`,width:88,sortable:!1}];function vt(e,t){let n=U(),i=r([]),a=r(0),o=r(!1),s=r(1),c=r(null),l=r(null),u=r(null),d=r(!1),f=r(!1),p=r(!1),m=r(null),g=r(null),_=h(()=>t.servers.value.map(e=>({title:e.name,value:e.id})));function v(){s.value=1,b()}async function b(){o.value=!0;try{let e={page:s.value,per_page:15};c.value&&(e.status=c.value),l.value&&(e.sync_mode=l.value),u.value!=null&&(e.server_id=u.value);let t=await y.get(`/servers/logs`,e);i.value=t.items||[],a.value=t.total||0}catch{i.value=[],a.value=0}finally{o.value=!1}}async function x(){d.value=!0;try{let e=(await y.post(`/sync/reconcile-stale-logs`,{max_age_minutes:120})).reconciled??0;n(e>0?`已订正 ${e} 条卡住的推送记录`:`没有需要订正的记录`),await b()}catch(e){n(e instanceof Error?e.message:`订正失败`,`error`)}finally{d.value=!1}}async function S(t){g.value=t,m.value=null,f.value=!0,p.value=!0;try{m.value=await y.post(`/sync/diagnose`,{server_id:t.server_id,target_path:t.target_path||e.targetPath.value||void 0})}catch(e){n(e instanceof Error?e.message:`诊断失败`,`error`),f.value=!1}finally{p.value=!1}}function C(){f.value=!1}return{logs:i,logTotal:a,logLoading:o,logPage:s,logStatusFilter:c,logSyncModeFilter:l,logServerFilter:u,reconcilingLogs:d,logStatusOptions:ht,logSyncModeOptions:gt,logHeaders:_t,logServerOptions:_,showDiagnose:f,diagnoseLoading:p,diagnoseResult:m,diagnoseTarget:g,onLogFilterChange:v,loadLogs:b,reconcileStaleLogs:x,openDiagnose:S,closeDiagnose:C}}function yt(){let e=ut(),t=dt(r({})),n=vt(e,t),i=pt(e,t,()=>n.loadLogs()),a=mt(e,t);function o(){a.confirmAndPush(()=>i.doPush())}return ne(()=>{t.loadServers(),n.loadLogs(),t.startAutoRefresh(()=>i.pushing.value)}),te(()=>{i.dispose(),t.stopAutoRefresh()}),{form:M(e),servers:M(t),progress:M(i),preview:M(a),logs:M(n),onConfirmAndPush:o}}var bt=L({__name:`PushPage`,setup(e){let{form:t,servers:n,progress:r,preview:i,logs:o,onConfirmAndPush:s}=yt();return(e,l)=>(k(),D(de,{fluid:``,class:`pa-6`},{default:a(()=>[w(st,{"uploaded-source":c(t).uploadedSource,"validated-source":c(t).validatedSource,"source-path":c(t).sourcePath,"onUpdate:sourcePath":l[0]||=e=>c(t).sourcePath=e,"source-path-validating":c(t).sourcePathValidating,"is-dragging":c(t).isDragging,"source-uploading":c(t).sourceUploading,onDragover:l[1]||=e=>c(t).isDragging=!0,onDragleave:l[2]||=e=>c(t).isDragging=!1,onDrop:c(t).handleFileDrop,onFileSelect:c(t).handleFileSelect,onClear:c(t).clearUploadedSource,onClearValidated:c(t).clearValidatedSource,onValidate:c(t).validateSourcePath},null,8,[`uploaded-source`,`validated-source`,`source-path`,`source-path-validating`,`is-dragging`,`source-uploading`,`onDrop`,`onFileSelect`,`onClear`,`onClearValidated`,`onValidate`]),w($e,{"target-path":c(t).targetPath,"onUpdate:targetPath":l[3]||=e=>c(t).targetPath=e,pushing:c(r).pushing,onPreview:c(i).doPreview,onPush:c(r).doPush},null,8,[`target-path`,`pushing`,`onPreview`,`onPush`]),w(qe,{"select-all":c(n).selectAll,"server-search":c(n).serverSearch,"onUpdate:serverSearch":l[4]||=e=>c(n).serverSearch=e,"servers-loading":c(n).serversLoading,"servers-by-category":c(n).serversByCategory,"selected-ids":c(n).selectedIds,"push-status":c(n).pushStatus,"is-category-all-selected":c(n).isCategoryAllSelected,onToggleAll:c(n).toggleAll,onRefresh:c(n).loadServers,onToggleCategory:c(n).toggleCategory,onToggleServer:c(n).toggleServer},null,8,[`select-all`,`server-search`,`servers-loading`,`servers-by-category`,`selected-ids`,`push-status`,`is-category-all-selected`,`onToggleAll`,`onRefresh`,`onToggleCategory`,`onToggleServer`]),w(Qe,{"sync-mode":c(t).syncMode,"onUpdate:syncMode":l[5]||=e=>c(t).syncMode=e,"sync-mode-desc":c(t).syncModeDesc},null,8,[`sync-mode`,`sync-mode-desc`]),w(Re,{items:c(r).wsProgressItems,"batch-id":c(r).pushBatchId,pushing:c(r).pushing,cancelling:c(r).cancelling,"retrying-all":c(r).retryingAll,"failed-retry-count":c(r).failedRetryCount,"done-count":c(r).doneCount,"total-progress":c(r).totalProgress,onCancel:c(r).cancelPush,onRetryAll:c(r).retryAllFailed},null,8,[`items`,`batch-id`,`pushing`,`cancelling`,`retrying-all`,`failed-retry-count`,`done-count`,`total-progress`,`onCancel`,`onRetryAll`]),w(Fe,{modelValue:c(i).showPreview,"onUpdate:modelValue":l[6]||=e=>c(i).showPreview=e,loading:c(i).previewLoading,results:c(i).previewResults,"selected-count":c(n).selectedIds.size,"preview-done":c(i).previewDone,"preview-total":c(i).previewTotal,"large-batch":c(i).previewLargeBatch,"warn-threshold":c(i).previewWarnThreshold,"error-count":c(i).previewErrorCount,"sync-mode":c(t).syncMode,onConfirmPush:c(s)},null,8,[`modelValue`,`loading`,`results`,`selected-count`,`preview-done`,`preview-total`,`large-batch`,`warn-threshold`,`error-count`,`sync-mode`,`onConfirmPush`]),w(we,{modelValue:c(o).showDiagnose,"onUpdate:modelValue":l[7]||=e=>c(o).showDiagnose=e,loading:c(o).diagnoseLoading,result:c(o).diagnoseResult,"target-name":c(o).diagnoseTarget?.server_name??void 0},null,8,[`modelValue`,`loading`,`result`,`target-name`]),w(ke,{items:c(o).logs,headers:c(o).logHeaders,total:c(o).logTotal,loading:c(o).logLoading,page:c(o).logPage,"onUpdate:page":l[8]||=e=>c(o).logPage=e,"status-filter":c(o).logStatusFilter,"onUpdate:statusFilter":l[9]||=e=>c(o).logStatusFilter=e,"sync-mode-filter":c(o).logSyncModeFilter,"onUpdate:syncModeFilter":l[10]||=e=>c(o).logSyncModeFilter=e,"server-filter":c(o).logServerFilter,"onUpdate:serverFilter":l[11]||=e=>c(o).logServerFilter=e,"status-options":c(o).logStatusOptions,"sync-mode-options":c(o).logSyncModeOptions,"server-options":c(o).logServerOptions,reconciling:c(o).reconcilingLogs,onFilterChange:c(o).onLogFilterChange,onPageChange:c(o).loadLogs,onReconcile:c(o).reconcileStaleLogs,onDiagnose:c(o).openDiagnose},null,8,[`items`,`headers`,`total`,`loading`,`page`,`status-filter`,`sync-mode-filter`,`server-filter`,`status-options`,`sync-mode-options`,`server-options`,`reconciling`,`onFilterChange`,`onPageChange`,`onReconcile`,`onDiagnose`])]),_:1}))}});export{bt as default};