Files
Nexus/web/app/assets/FilesPage-DtYCvGJs.js
T
Your Name 51948469c2 build(frontend): track Vite output in Git for Gitea deploy
- Stop ignoring web/app/index.html and web/app/assets/
- Bundle index-DBKIQT7H.js from current vite build (~101MB assets)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 00:52:44 +08:00

2 lines
59 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.
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/FileEditorWorkbench-D9KoMn0T.js","assets/_plugin-vue_export-helper-BDNMzG2s.js","assets/editor.api2-CLbMfXfG.js","assets/editor-DX2BVZF3.css","assets/index-DM5fgc0K.js","assets/index-DBjsRXm1.css","assets/workers-DM14Vrt9.js","assets/monaco.contribution-DNFFjdaV.js","assets/VSelect-BD1gxzRI.js","assets/VChip-DfCr64Er.js","assets/VChip-DNKJRTa0.css","assets/VSelectionControl-CX9CvN0B.js","assets/VSelectionControl-CH0_Bcm2.css","assets/VSelect-ALpjlDrA.css","assets/VDialog-B8IU_wll.js","assets/VDialog-DP-kc9Gx.css","assets/VSpacer-BqRIMQa-.js","assets/VSpacer-DfbUir7X.css","assets/VTabs-sPC5ZShb.js","assets/VTabs-DjRHpLZ2.css","assets/useSnackbar-D7YOfKok.js","assets/remotePath-BY9H9-d2.js","assets/FileEditorWorkbench-BbQnTmJ9.css"])))=>i.map(i=>d[i]);
import{t as e}from"./VDataTable-wEFscPPF.js";import{At as t,B as n,Bt as r,Ct as i,F as a,Fn as o,Fr as s,Gn as c,It as l,Jn as u,Kn as d,L as f,Lt as p,M as m,Mt as h,N as g,Nr as _,O as v,Or as y,P as b,Pn as x,Pr as S,Pt as C,Qn as w,Qt as T,Rt as E,St as D,Tr as O,V as k,Vt as A,Wn as j,Xn as M,Y as N,Yn as P,Zn as F,_ as I,_r as ee,ar as te,b as ne,br as L,bt as re,cn as ie,cr as ae,dn as oe,en as se,er as R,fr as z,j as ce,jr as B,k as V,mr as le,nr as ue,or as de,ot as fe,pr as pe,q as me,rr as H,sn as he,sr as ge,st as _e,t as U,tn as ve,tr as W,un as ye,ur as be,v as xe,vr as Se,vt as Ce,w as we,wt as Te,x as Ee,xt as De,y as Oe,yt as ke,zt as G}from"./index-DM5fgc0K.js";import{t as Ae}from"./fileBrowse-D87Kx7nu.js";import{a as je,i as K,n as Me,o as Ne,r as q,t as Pe}from"./remotePath-BY9H9-d2.js";import{a as Fe}from"./VSelectionControl-CX9CvN0B.js";import{n as Ie,t as Le}from"./VRow-Ble-HhHb.js";import{t as J}from"./VSpacer-BqRIMQa-.js";import{t as Re}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as ze}from"./useSnackbar-D7YOfKok.js";import{t as Be}from"./VChip-DfCr64Er.js";import{t as Y}from"./VDialog-B8IU_wll.js";import{t as Ve}from"./VSelect-BD1gxzRI.js";import{t as He}from"./VCheckbox-X9lEcY5I.js";import{t as Ue}from"./useServerList-BBrOmDmd.js";import{i as We}from"./validation-DMwOxx4a.js";import{t as Ge}from"./VAlert-ClSfFjhV.js";import{n as Ke,t as qe}from"./apiError-DVM1Q01f.js";var Je=Symbol(`filesPage`);function Ye(e){pe(Je,e)}function X(){let e=te(Je);if(!e)throw Error(`useFilesPageContext() must be used inside FilesPage`);return e}var Xe=oe({divider:[Number,String],...ye()},`VBreadcrumbsDivider`),Ze=he()({name:`VBreadcrumbsDivider`,props:Xe(),setup(e,{slots:t}){return ve(()=>P(`li`,{"aria-hidden":`true`,class:_([`v-breadcrumbs-divider`,e.class]),style:S(e.style)},[t?.default?.()??e.divider])),{}}}),Qe=oe({active:Boolean,activeClass:String,activeColor:String,color:String,disabled:Boolean,title:String,...ye(),...o(D(),[`width`,`maxWidth`]),...n(),...t({tag:`li`})},`VBreadcrumbsItem`),$e=he()({name:`VBreadcrumbsItem`,props:Qe(),setup(e,{slots:t,attrs:n}){let r=k(e,n),a=u(()=>e.active||r.isActive?.value),{dimensionStyles:o}=i(e),{textColorClasses:s,textColorStyles:c}=De(()=>a.value?e.activeColor:e.color);return ve(()=>W(e.tag,{class:_([`v-breadcrumbs-item`,{"v-breadcrumbs-item--active":a.value,"v-breadcrumbs-item--disabled":e.disabled,[`${e.activeClass}`]:a.value&&e.activeClass},s.value,e.class]),style:S([c.value,o.value,e.style]),"aria-current":a.value?`page`:void 0},{default:()=>[r.isLink.value?P(`a`,de({class:`v-breadcrumbs-item--link`,onClick:r.navigate.value},r.linkProps),[t.default?.()??e.title]):t.default?.()??e.title]})),{}}}),et=oe({activeClass:String,activeColor:String,bgColor:String,color:String,disabled:Boolean,divider:{type:String,default:`/`},icon:se,items:{type:Array,default:()=>[]},...ye(),...fe(),...Ce(),...t({tag:`ul`})},`VBreadcrumbs`),tt=he()({name:`VBreadcrumbs`,props:et(),setup(e,{slots:t}){let{backgroundColorClasses:n,backgroundColorStyles:r}=re(()=>e.bgColor),{densityClasses:i}=_e(e),{roundedClasses:a}=ke(e);ie({VBreadcrumbsDivider:{divider:y(()=>e.divider)},VBreadcrumbsItem:{activeClass:y(()=>e.activeClass),activeColor:y(()=>e.activeColor),color:y(()=>e.color),disabled:y(()=>e.disabled)}});let o=u(()=>e.items.map(e=>typeof e==`string`?{item:{title:e},raw:e}:{item:e,raw:e}));return ve(()=>{let s=!!(t.prepend||e.icon);return W(e.tag,{class:_([`v-breadcrumbs`,n.value,i.value,a.value,e.class]),style:S([r.value,e.style])},{default:()=>[s&&P(`li`,{key:`prepend`,class:`v-breadcrumbs__prepend`},[t.prepend?W(Te,{key:`prepend-defaults`,disabled:!e.icon,defaults:{VIcon:{icon:e.icon,start:!0}}},t.prepend):W(N,{key:`prepend-icon`,start:!0,icon:e.icon},null)]),o.value.map(({item:e,raw:n},r,i)=>P(d,null,[t.item?.({item:e,index:r})??W($e,de({key:r,disabled:r>=i.length-1},typeof e==`string`?{title:e}:e),{default:t.title?()=>t.title?.({item:e,index:r}):void 0}),r<i.length-1&&W(Ze,null,{default:t.divider?()=>t.divider?.({item:n,index:r}):void 0})])),t.default?.()]})}),{}}}),nt={class:`text-body-2 mr-4`},rt=H({__name:`FilesBreadcrumb`,setup(e){let t=X();return(e,n)=>(z(),w(d,null,[W(tt,{items:B(t).breadcrumbs,class:`pa-0 mb-2`},{item:L(({item:e,index:n})=>[W($e,{disabled:e.disabled,class:_({"text-primary":!e.disabled,"cursor-pointer":!e.disabled}),onClick:e=>B(t).onBreadcrumbClick(n)},{default:L(()=>[R(s(e.title),1)]),_:2},1032,[`disabled`,`class`,`onClick`])]),divider:L(()=>[...n[1]||=[R(`/`,-1)]]),_:1},8,[`items`]),B(t).selectedFileCount>0?(z(),M(m,{key:0,class:`mb-4`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:L(()=>[W(g,{class:`d-flex align-center py-2`},{default:L(()=>[P(`span`,nt,`已选择 `+s(B(t).selectedFileCount)+` 个文件`,1),W(J),W(f,{size:`small`,variant:`text`,color:`error`,onClick:B(t).batchDelete},{default:L(()=>[...n[2]||=[R(`批量删除`,-1)]]),_:1},8,[`onClick`]),W(f,{size:`small`,variant:`text`,onClick:n[0]||=e=>B(t).selectedFiles=[]},{default:L(()=>[...n[3]||=[R(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):F(``,!0)],64))}});function it(e){if(e.type===`symlink`)return`—`;let t=(e.owner??``).trim(),n=(e.group??``).trim();return t?!n||n===t?t:`${t}:${n}`:`—`}function at(e){if(e===`root`)return`warning`}function ot(e){let t=[];e.permissions&&t.push(e.permissions),e.mode_octal&&t.push(e.mode_octal);let n=(e.owner??``).trim(),r=(e.group??``).trim();return n&&t.push(r&&r!==n?`${n}:${r}`:n),t.join(` · `)||`—`}var st=[{label:`文件 644`,mode:`644`,for:`file`},{label:`目录 755`,mode:`755`,for:`directory`},{label:`私密 600`,mode:`600`,for:`file`},{label:`协作 775`,mode:`775`,for:`directory`},{label:`可执行 755`,mode:`755`,for:`file`}],ct=`docs/deploy/nexus-files-sudoers.example`;function lt(e){let t=e.toLowerCase();return t.includes(`permission denied`)||t.includes(`operation not permitted`)||t.includes(`无法访问`)||t.includes(`无权限`)||t.includes(`无写入权限`)||t.includes(`读取失败`)||t.includes(`chmod 失败`)}function ut(e,t){if(!t||t===`root`||e.type!==`file`)return!1;let n=e.permissions??``;if(n.length<10)return!1;let r=(e.owner??``).trim(),i=(e.group??``).trim(),a=n.slice(1,4),o=n.slice(4,7),s=n.slice(7,10);return r===t?!a.includes(`r`):(i&&i===t||!s.includes(`r`))&&!o.includes(`r`)}function dt(){return`目标机安装示例:${ct}(复制到 /etc/sudoers.d/nexus-files 后执行 visudo -cf 校验)`}function ft(e){if(e.isRootSsh)return null;let t=[],n=e.unreadableCount??0;if(e.lastReadDeniedPath&&t.push(`无法读取「${e.lastReadDeniedPath}」:当前 SSH 用户无权限。`),n>0&&e.sshUser&&t.push(`当前目录约 ${n} 个文件对 SSH 用户「${e.sshUser}」不可读。`),t.length>0&&(e.filesElevation===`off`?t.push(`此服务器「文件提权」已关闭,不会自动 sudo。`):e.canSudo?e.whitelistOk?t.push(`系统已自动尝试 sudo -n 提权,如仍失败请检查 sudoers 白名单。`):t.push(`已有 sudo 但白名单不完整(须含 bash、chmod、chown、tee、cat 等)。`):t.push(`请配置免密 sudo(NOPASSWD)或使用「一键配置」,或改用 root SSH 用户。`)),!t.length)return null;let r=e.filesElevation===`off`||!e.canSudo||!e.whitelistOk?` ${dt()}`:``;return{type:!e.canSudo||e.filesElevation===`off`?`error`:`warning`,text:`${t.join(` `)}${r}`}}var pt={key:0,class:`text-body-2 mb-3 text-medium-emphasis`},mt={key:1,class:`text-caption mb-4`},ht={class:`d-flex flex-wrap ga-2 mb-4`},gt={class:`d-flex align-center flex-wrap ga-2 mb-2`},_t={class:`text-body-2`},vt={key:0,class:`text-caption mt-1`},yt={class:`text-caption text-medium-emphasis mb-0`},bt=H({__name:`FilePermissionDialog`,props:{modelValue:{type:Boolean},file:{},serverId:{},loading:{type:Boolean}},emits:[`update:modelValue`,`apply`],setup(e,{emit:t}){let n=e,r=t,i=O(``),o=O(``),c=O(``),l=O(null),h=O(!1),_=O(!1),v=u(()=>n.file?.type===`directory`),y=u(()=>n.file?.name??``),x=u(()=>n.file?ot(n.file):``),S=u(()=>{let e=n.file?.type===`directory`?`directory`:`file`;return st.filter(t=>t.for===e||t.for===`file`)}),C=u(()=>l.value?l.value.is_root||l.value.can_sudo_nopasswd&&l.value.whitelist_ok?`success`:l.value.can_sudo_nopasswd?`warning`:`error`:`info`);Se(()=>[n.modelValue,n.file],([e,t])=>{!e||!t||(i.value=t.mode_octal||``,o.value=t.owner||``,c.value=t.group&&t.group!==t.owner?t.group:``,_.value=!1,l.value=null,n.serverId&&E())});function T(e){return e===`off`?`关闭提权`:e===`always_sudo`?`始终 sudo`:`自动 sudo`}async function E(){if(n.serverId){h.value=!0;try{l.value=await p.get(`/servers/${n.serverId}/files-capability`)}catch(e){l.value={ssh_user:``,is_root:!1,files_elevation:`auto_sudo`,can_sudo_nopasswd:!1,whitelist_ok:!1,message:e instanceof Error?e.message:`检测失败`,docs_path:`docs/deploy/nexus-files-sudoers.example`}}finally{h.value=!1}}}function D(e){return t=>!!String(t||``).trim()||`${e}不能为空`}function k(e){return/^[0-7]{3,4}$/.test(String(e||``).trim())||`格式: 34 位八进制`}let A=/^[a-zA-Z0-9_.-]+$/;function N(e){let t=String(e||``).trim();return t?A.test(t)||`仅允许字母、数字、._-`:!0}function I(e){let t=String(e||``).trim();return t?o.value.trim()?A.test(t)||`仅允许字母、数字、._-`:`请先填写属主`:!0}function ee(e){i.value=e}function te(){let e=i.value.trim();if(!/^[0-7]{3,4}$/.test(e))return;let t=o.value.trim(),a=c.value.trim(),s=v.value&&_.value;if(s){let t=n.file?.name??`该目录`;if(!window.confirm(`确认对目录「${t}」及其全部子项递归应用权限 ${e}?此操作影响范围大且不可自动撤销。`))return}r(`apply`,{mode:e,owner:t||void 0,group:a||void 0,recursive:s||void 0})}return(t,n)=>(z(),M(Y,{"model-value":e.modelValue,"max-width":`520`,"onUpdate:modelValue":n[5]||=e=>r(`update:modelValue`,e)},{default:L(()=>[W(m,{border:``},{default:L(()=>[W(b,null,{default:L(()=>[...n[6]||=[R(`修改权限`,-1)]]),_:1}),W(g,null,{default:L(()=>[y.value?(z(),w(`p`,pt,s(y.value),1)):F(``,!0),x.value?(z(),w(`p`,mt,` 当前:`+s(x.value),1)):F(``,!0),P(`div`,ht,[(z(!0),w(d,null,le(S.value,e=>(z(),M(Be,{key:e.mode+e.label,size:`small`,variant:`tonal`,color:`primary`,onClick:t=>ee(e.mode)},{default:L(()=>[R(s(e.label),1)]),_:2},1032,[`onClick`]))),128))]),W(U,{modelValue:i.value,"onUpdate:modelValue":n[0]||=e=>i.value=e,label:`八进制权限`,variant:`outlined`,density:`compact`,placeholder:`644 / 755`,rules:[D(`权限`),k],class:`mb-2`,onKeydown:j(te,[`enter`])},null,8,[`modelValue`,`rules`]),W(U,{modelValue:o.value,"onUpdate:modelValue":n[1]||=e=>o.value=e,label:`属主(可选)`,variant:`outlined`,density:`compact`,placeholder:`www`,rules:[N],class:`mb-2`},null,8,[`modelValue`,`rules`]),W(U,{modelValue:c.value,"onUpdate:modelValue":n[2]||=e=>c.value=e,label:`属组(可选)`,variant:`outlined`,density:`compact`,placeholder:`www`,rules:[I],class:`mb-2`},null,8,[`modelValue`,`rules`]),v.value?(z(),M(He,{key:2,modelValue:_.value,"onUpdate:modelValue":n[3]||=e=>_.value=e,label:`同时修改子项(递归 chmod/chown`,density:`compact`,"hide-details":``,color:`warning`,class:`mb-2`},null,8,[`modelValue`])):F(``,!0),W(ce,{class:`my-4`}),P(`div`,gt,[n[8]||=P(`span`,{class:`text-caption text-medium-emphasis`},`提权能力`,-1),W(f,{size:`small`,variant:`tonal`,loading:h.value,disabled:!e.serverId,onClick:E},{default:L(()=>[...n[7]||=[R(` 检测提权能力 `,-1)]]),_:1},8,[`loading`,`disabled`])]),l.value?(z(),M(Ge,{key:3,type:C.value,variant:`tonal`,density:`compact`,class:`mb-2`},{default:L(()=>[P(`div`,_t,s(l.value.message),1),l.value.ssh_user?(z(),w(`div`,vt,` SSH 用户:`+s(l.value.ssh_user)+` · 策略:`+s(T(l.value.files_elevation)),1)):F(``,!0)]),_:1},8,[`type`])):F(``,!0),P(`p`,yt,[n[9]||=R(` 非 root 用户写/chmod 失败时将按服务器策略尝试 `,-1),n[10]||=P(`code`,null,`sudo -n`,-1),R(`。 `+s(B(dt)()),1)])]),_:1}),W(a,null,{default:L(()=>[W(J),W(f,{variant:`text`,onClick:n[4]||=e=>r(`update:modelValue`,!1)},{default:L(()=>[...n[11]||=[R(`取消`,-1)]]),_:1}),W(f,{color:`primary`,variant:`flat`,loading:e.loading,onClick:te},{default:L(()=>[...n[12]||=[R(`应用`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),xt={class:`text-body-2 mb-3`},St={class:`text-body-2 mb-2 text-truncate`},Ct={class:`text-truncate`},wt={key:1,class:`files-preview-body text-body-2`},Tt=Re(H({__name:`FilesDialogs`,setup(e){let t=X();return(e,n)=>(z(),w(d,null,[W(Y,{modelValue:B(t).showUpload,"onUpdate:modelValue":n[2]||=e=>B(t).showUpload=e,"max-width":`500`},{default:L(()=>[W(m,{border:``},{default:L(()=>[W(b,null,{default:L(()=>[...n[25]||=[R(`上传文件`,-1)]]),_:1}),W(g,null,{default:L(()=>[W(Ke,{modelValue:B(t).uploadFiles,"onUpdate:modelValue":n[0]||=e=>B(t).uploadFiles=e,label:`选择文件`,variant:`outlined`,multiple:``,"show-size":``},null,8,[`modelValue`])]),_:1}),W(a,null,{default:L(()=>[W(J),W(f,{variant:`text`,onClick:n[1]||=e=>B(t).showUpload=!1},{default:L(()=>[...n[26]||=[R(`取消`,-1)]]),_:1}),W(f,{color:`primary`,variant:`flat`,loading:B(t).uploading,onClick:B(t).doUpload},{default:L(()=>[...n[27]||=[R(`上传`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),W(Y,{modelValue:B(t).showNewFile,"onUpdate:modelValue":n[5]||=e=>B(t).showNewFile=e,"max-width":`400`},{default:L(()=>[W(m,{border:``},{default:L(()=>[W(b,null,{default:L(()=>[...n[28]||=[R(`新建文件`,-1)]]),_:1}),W(g,null,{default:L(()=>[W(U,{modelValue:B(t).newFileName,"onUpdate:modelValue":n[3]||=e=>B(t).newFileName=e,label:`文件名`,variant:`outlined`,density:`compact`,rules:[B(t).validatePathSegment],placeholder:`example.conf`,autofocus:``,onKeydown:j(B(t).doNewFile,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),W(a,null,{default:L(()=>[W(J),W(f,{variant:`text`,onClick:n[4]||=e=>B(t).showNewFile=!1},{default:L(()=>[...n[29]||=[R(`取消`,-1)]]),_:1}),W(f,{color:`primary`,variant:`flat`,loading:B(t).actionLoading,onClick:B(t).doNewFile},{default:L(()=>[...n[30]||=[R(`创建`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),W(Y,{modelValue:B(t).showMkdir,"onUpdate:modelValue":n[8]||=e=>B(t).showMkdir=e,"max-width":`400`},{default:L(()=>[W(m,{border:``},{default:L(()=>[W(b,null,{default:L(()=>[...n[31]||=[R(`新建目录`,-1)]]),_:1}),W(g,null,{default:L(()=>[W(U,{modelValue:B(t).mkdirName,"onUpdate:modelValue":n[6]||=e=>B(t).mkdirName=e,label:`目录名`,variant:`outlined`,density:`compact`,rules:[B(t).validatePathSegment],onKeydown:j(B(t).doMkdir,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),W(a,null,{default:L(()=>[W(J),W(f,{variant:`text`,onClick:n[7]||=e=>B(t).showMkdir=!1},{default:L(()=>[...n[32]||=[R(`取消`,-1)]]),_:1}),W(f,{color:`primary`,variant:`flat`,onClick:B(t).doMkdir},{default:L(()=>[...n[33]||=[R(`创建`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),W(Y,{modelValue:B(t).showFileDelete,"onUpdate:modelValue":n[10]||=e=>B(t).showFileDelete=e,"max-width":`400`},{default:L(()=>[W(m,{border:``},{default:L(()=>[W(b,null,{default:L(()=>[...n[34]||=[R(`确认删除`,-1)]]),_:1}),W(g,null,{default:L(()=>[n[35]||=R(` 确定要删除 `,-1),P(`strong`,null,s(B(t).deletingFile?.name),1),n[36]||=R(` 吗? `,-1)]),_:1}),W(a,null,{default:L(()=>[W(J),W(f,{variant:`text`,onClick:n[9]||=e=>B(t).showFileDelete=!1},{default:L(()=>[...n[37]||=[R(`取消`,-1)]]),_:1}),W(f,{color:`error`,variant:`flat`,onClick:B(t).doDeleteFile},{default:L(()=>[...n[38]||=[R(`删除`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),W(Y,{modelValue:B(t).showRename,"onUpdate:modelValue":n[13]||=e=>B(t).showRename=e,"max-width":`400`},{default:L(()=>[W(m,{border:``},{default:L(()=>[W(b,null,{default:L(()=>[...n[39]||=[R(`重命名`,-1)]]),_:1}),W(g,null,{default:L(()=>[W(U,{modelValue:B(t).newName,"onUpdate:modelValue":n[11]||=e=>B(t).newName=e,label:`新名称`,variant:`outlined`,density:`compact`,rules:[B(t).required(`名称`)],autofocus:``,onKeydown:j(B(t).doRename,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),W(a,null,{default:L(()=>[W(J),W(f,{variant:`text`,onClick:n[12]||=e=>B(t).showRename=!1},{default:L(()=>[...n[40]||=[R(`取消`,-1)]]),_:1}),W(f,{color:`primary`,variant:`flat`,onClick:B(t).doRename},{default:L(()=>[...n[41]||=[R(`确定`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),W(bt,{modelValue:B(t).showChmod,"onUpdate:modelValue":n[14]||=e=>B(t).showChmod=e,file:B(t).chmodFile,"server-id":B(t).selectedServer,loading:B(t).chmodLoading,onApply:B(t).doChmod},null,8,[`modelValue`,`file`,`server-id`,`loading`,`onApply`]),W(Y,{modelValue:B(t).showCompress,"onUpdate:modelValue":n[18]||=e=>B(t).showCompress=e,"max-width":`440`},{default:L(()=>[W(m,{border:``},{default:L(()=>[W(b,null,{default:L(()=>[...n[42]||=[R(`压缩`,-1)]]),_:1}),W(g,null,{default:L(()=>[P(`p`,xt,`将压缩 `+s(B(t).compressPaths.length)+` 项到当前目录`,1),W(U,{modelValue:B(t).compressDest,"onUpdate:modelValue":n[15]||=e=>B(t).compressDest=e,label:`压缩包路径`,variant:`outlined`,density:`compact`},null,8,[`modelValue`]),W(Ve,{modelValue:B(t).compressFormat,"onUpdate:modelValue":n[16]||=e=>B(t).compressFormat=e,items:[{title:`tar.gz`,value:`tar.gz`},{title:`zip`,value:`zip`}],"item-title":`title`,"item-value":`value`,label:`格式`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),W(a,null,{default:L(()=>[W(J),W(f,{variant:`text`,onClick:n[17]||=e=>B(t).showCompress=!1},{default:L(()=>[...n[43]||=[R(`取消`,-1)]]),_:1}),W(f,{color:`primary`,variant:`flat`,loading:B(t).actionLoading,onClick:B(t).doCompress},{default:L(()=>[...n[44]||=[R(`压缩`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),W(Y,{modelValue:B(t).showDecompress,"onUpdate:modelValue":n[21]||=e=>B(t).showDecompress=e,"max-width":`440`},{default:L(()=>[W(m,{border:``},{default:L(()=>[W(b,null,{default:L(()=>[...n[45]||=[R(`解压`,-1)]]),_:1}),W(g,null,{default:L(()=>[P(`p`,St,s(B(t).decompressSource),1),W(U,{modelValue:B(t).decompressDest,"onUpdate:modelValue":n[19]||=e=>B(t).decompressDest=e,label:`解压到目录`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),W(a,null,{default:L(()=>[W(J),W(f,{variant:`text`,onClick:n[20]||=e=>B(t).showDecompress=!1},{default:L(()=>[...n[46]||=[R(`取消`,-1)]]),_:1}),W(f,{color:`primary`,variant:`flat`,loading:B(t).actionLoading,onClick:B(t).doDecompress},{default:L(()=>[...n[47]||=[R(`解压`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),W(Y,{modelValue:B(t).showPreview,"onUpdate:modelValue":n[24]||=e=>B(t).showPreview=e,"max-width":`900`,scrollable:``},{default:L(()=>[W(m,{border:``},{default:L(()=>[W(b,{class:`d-flex align-center`},{default:L(()=>[P(`span`,Ct,s(B(t).previewTitle),1),W(J),W(f,{icon:`mdi-close`,variant:`text`,onClick:n[22]||=e=>B(t).showPreview=!1})]),_:1}),W(ce),W(g,{style:{"max-height":`70vh`}},{default:L(()=>[B(t).previewLoading?(z(),M(me,{key:0,indeterminate:``,class:`mb-2`})):(z(),w(`pre`,wt,s(B(t).previewContent),1))]),_:1}),W(a,null,{default:L(()=>[W(J),W(f,{variant:`text`,onClick:n[23]||=e=>B(t).showPreview=!1},{default:L(()=>[...n[48]||=[R(`关闭`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-2d690974`]]),Et=oe({id:String,interactive:Boolean,text:String,...x(ne({closeOnBack:!1,location:`end`,locationStrategy:`connected`,eager:!0,minWidth:0,offset:10,openOnClick:!1,openOnHover:!0,origin:`auto`,scrim:!1,scrollStrategy:`reposition`,transition:null}),[`absolute`,`retainFocus`,`captureFocus`,`disableInitialFocus`])},`VTooltip`),Dt=he()({name:`VTooltip`,props:Et(),emits:{"update:modelValue":e=>!0},setup(e,{slots:t}){let n=T(e,`modelValue`),{scopeId:r}=Ee(),i=ee(),a=y(()=>e.id||`v-tooltip-${i}`),o=O(),s=u(()=>e.location.split(` `).length>1?e.location:e.location+` center`),c=u(()=>e.origin===`auto`||e.origin===`overlap`||e.origin.split(` `).length>1||e.location.split(` `).length>1?e.origin:e.origin+` center`),l=y(()=>e.transition==null?n.value?`scale-transition`:`fade-transition`:e.transition),d=u(()=>de({"aria-describedby":a.value},e.activatorProps));return ve(()=>{let i=Oe.filterProps(e);return W(Oe,de({ref:o,class:[`v-tooltip`,{"v-tooltip--interactive":e.interactive},e.class],style:e.style,id:a.value},i,{modelValue:n.value,"onUpdate:modelValue":e=>n.value=e,transition:l.value,absolute:!0,location:s.value,origin:c.value,role:`tooltip`,activatorProps:d.value,_disableGlobalStack:!0},r),{activator:t.activator,default:(...n)=>t.default?.(...n)??e.text})}),xe({},o)}}),Ot={class:`d-flex align-center ga-2 min-w-0`},kt={class:`min-w-0`},At={key:0,class:`text-caption text-medium-emphasis text-truncate`},jt={class:`text-medium-emphasis`},Mt={class:`text-medium-emphasis`},Nt={class:`d-flex ga-1`},Pt={key:0,class:`text-center text-medium-emphasis py-8`},Ft={key:0,class:`text-caption mt-2 text-disabled`},It=Re(H({__name:`FilesList`,setup(t){let n=X();return(t,r)=>(z(),w(d,null,[W(m,{elevation:`0`,border:``,rounded:`lg`,class:_([`position-relative`,{"files-drop-active":B(n).dropActive}]),onDragenter:r[1]||=c(e=>B(n).dropActive=!0,[`prevent`]),onDragover:r[2]||=c(e=>B(n).dropActive=!0,[`prevent`]),onDragleave:r[3]||=c(e=>B(n).dropActive=!1,[`prevent`]),onDrop:c(B(n).onDropFiles,[`prevent`])},{default:L(()=>[B(n).loadingVisible?(z(),M(me,{key:0,indeterminate:``,color:`primary`,height:`2`,class:`files-table-progress`})):F(``,!0),W(e,{modelValue:B(n).selectedFiles,"onUpdate:modelValue":r[0]||=e=>B(n).selectedFiles=e,items:B(n).displayedFiles,headers:B(n).fileHeaders,loading:B(n).loadingVisible,"show-select":``,"return-object":``,hover:``,density:`comfortable`,"item-value":`name`,"row-props":B(n).fileRowProps},{"item.name":L(({item:e})=>[P(`div`,Ot,[W(N,{color:B(n).entryIconColor(e),size:`20`},{default:L(()=>[R(s(B(n).entryIcon(e)),1)]),_:2},1032,[`color`]),B(n).isEntryLikelyUnreadable(e,B(n).sshUserForFiles)?(z(),M(N,{key:0,size:`18`,color:`warning`,title:`当前 SSH 用户可能无法读取`},{default:L(()=>[...r[20]||=[R(` mdi-shield-lock `,-1)]]),_:1})):F(``,!0),P(`div`,kt,[P(`span`,{class:_({"font-weight-medium":e.type===`directory`})},s(e.name),3),e.type===`symlink`&&e.link_target?(z(),w(`div`,At,` → `+s(e.link_target),1)):F(``,!0)])])]),"item.owner":L(({item:e})=>[W(Dt,{text:B(n).permissionTooltip(e),location:`top`},{activator:L(({props:t})=>[W(Be,de(t,{size:`small`,variant:`tonal`,color:B(n).ownerChipColor(e.owner||``),class:`text-none`}),{default:L(()=>[R(s(B(n).formatOwnerChip(e)),1)]),_:2},1040,[`color`])]),_:2},1032,[`text`])]),"item.size":L(({item:e})=>[P(`span`,jt,s(e.type===`directory`?`—`:B(n).formatSize(e.size)),1)]),"item.modified":L(({item:e})=>[P(`span`,Mt,s(e.modified||`—`),1)]),"item.actions":L(({item:e})=>[P(`div`,Nt,[B(n).isRegularFile(e)?(z(),M(f,{key:0,variant:`text`,size:`x-small`,density:`compact`,color:`primary`,onClick:c(t=>B(n).editFile(e),[`stop`])},{default:L(()=>[...r[21]||=[R(` 编辑 `,-1)]]),_:1},8,[`onClick`])):F(``,!0),B(n).isRegularFile(e)?(z(),M(f,{key:1,variant:`text`,size:`x-small`,density:`compact`,onClick:c(t=>B(n).previewFile(e),[`stop`])},{default:L(()=>[...r[22]||=[R(` 查看 `,-1)]]),_:1},8,[`onClick`])):F(``,!0),B(n).isRegularFile(e)?(z(),M(f,{key:2,variant:`text`,size:`x-small`,density:`compact`,onClick:c(t=>B(n).downloadFile(e),[`stop`])},{default:L(()=>[...r[23]||=[R(` 下载 `,-1)]]),_:1},8,[`onClick`])):F(``,!0),W(f,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:c(t=>B(n).confirmDeleteFile(e),[`stop`])},{default:L(()=>[...r[24]||=[R(` 删除 `,-1)]]),_:1},8,[`onClick`])])]),"no-data":L(()=>[B(n).pageReady&&!B(n).loading&&!B(n).loadingVisible&&B(n).files.length===0?(z(),w(`div`,Pt,[W(N,{size:`40`,class:`mb-2`},{default:L(()=>[...r[25]||=[R(`mdi-folder-open-outline`,-1)]]),_:1}),P(`div`,null,s(B(n).emptyHint),1),B(n).selectedServer?(z(),w(`div`,Ft,` 单击目录进入 · 双击文件编辑 · Ctrl+A 全选 · Ctrl+C/V 复制粘贴 `)):F(``,!0)])):F(``,!0)]),_:1},8,[`modelValue`,`items`,`headers`,`loading`,`row-props`])]),_:1},8,[`class`,`onDrop`]),W(I,{modelValue:B(n).showContextMenu,"onUpdate:modelValue":r[19]||=e=>B(n).showContextMenu=e,target:[B(n).contextX,B(n).contextY],location:`bottom start`},{default:L(()=>[W(we,{density:`compact`,nav:``},{default:L(()=>[B(n).contextFile&&B(n).contextFile.type===`directory`?(z(),M(v,{key:0,"prepend-icon":`mdi-folder-open`,onClick:r[4]||=e=>B(n).contextAction(`open`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[26]||=[R(`打开`,-1)]]),_:1})]),_:1})):F(``,!0),B(n).contextFile&&B(n).isRegularFile(B(n).contextFile)?(z(),M(v,{key:1,"prepend-icon":`mdi-pencil`,onClick:r[5]||=e=>B(n).contextAction(`edit`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[27]||=[R(`编辑`,-1)]]),_:1})]),_:1})):F(``,!0),B(n).contextFile&&B(n).isRegularFile(B(n).contextFile)?(z(),M(v,{key:2,"prepend-icon":`mdi-eye`,onClick:r[6]||=e=>B(n).contextAction(`preview`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[28]||=[R(`查看`,-1)]]),_:1})]),_:1})):F(``,!0),B(n).contextFile&&B(n).isRegularFile(B(n).contextFile)?(z(),M(v,{key:3,"prepend-icon":`mdi-download`,onClick:r[7]||=e=>B(n).contextAction(`download`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[29]||=[R(`下载`,-1)]]),_:1})]),_:1})):F(``,!0),B(n).contextFile?(z(),M(v,{key:4,"prepend-icon":`mdi-content-copy`,onClick:r[8]||=e=>B(n).contextAction(`copy`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[30]||=[R(`复制 (Ctrl+C)`,-1)]]),_:1})]),_:1})):F(``,!0),B(n).contextFile?(z(),M(v,{key:5,"prepend-icon":`mdi-content-cut`,onClick:r[9]||=e=>B(n).contextAction(`cut`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[31]||=[R(`剪切 (Ctrl+X)`,-1)]]),_:1})]),_:1})):F(``,!0),W(v,{"prepend-icon":`mdi-content-paste`,disabled:!B(n).canPasteHere,onClick:r[10]||=e=>B(n).contextAction(`paste`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[32]||=[R(`粘贴到当前目录 (Ctrl+V)`,-1)]]),_:1})]),_:1},8,[`disabled`]),B(n).contextFile?.type===`directory`&&B(n).canPasteHere?(z(),M(v,{key:6,"prepend-icon":`mdi-folder-arrow-down`,onClick:r[11]||=e=>B(n).contextAction(`pasteInto`)},{default:L(()=>[W(V,null,{default:L(()=>[R(`粘贴到「`+s(B(n).contextFile.name)+`」`,1)]),_:1})]),_:1})):F(``,!0),W(v,{"prepend-icon":`mdi-link-variant`,onClick:r[12]||=e=>B(n).contextAction(`copyPath`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[33]||=[R(`复制路径`,-1)]]),_:1})]),_:1}),W(v,{"prepend-icon":`mdi-console`,onClick:r[13]||=e=>B(n).contextAction(`terminal`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[34]||=[R(`终端`,-1)]]),_:1})]),_:1}),W(ce),B(n).contextFile&&(B(n).isRegularFile(B(n).contextFile)||B(n).contextFile.type===`directory`)?(z(),M(v,{key:7,"prepend-icon":`mdi-zip-box`,onClick:r[14]||=e=>B(n).contextAction(`compress`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[35]||=[R(`压缩`,-1)]]),_:1})]),_:1})):F(``,!0),B(n).contextFile&&B(n).isArchiveName(B(n).contextFile.name)?(z(),M(v,{key:8,"prepend-icon":`mdi-package-up`,onClick:r[15]||=e=>B(n).contextAction(`decompress`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[36]||=[R(`解压`,-1)]]),_:1})]),_:1})):F(``,!0),W(ce),W(v,{"prepend-icon":`mdi-file-rename-box`,onClick:r[16]||=e=>B(n).contextAction(`rename`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[37]||=[R(`重命名`,-1)]]),_:1})]),_:1}),W(v,{"prepend-icon":`mdi-lock`,onClick:r[17]||=e=>B(n).contextAction(`chmod`)},{default:L(()=>[W(V,null,{default:L(()=>[...r[38]||=[R(`修改权限`,-1)]]),_:1})]),_:1}),W(ce),W(v,{"prepend-icon":`mdi-delete`,onClick:r[18]||=e=>B(n).contextAction(`delete`)},{default:L(()=>[W(V,{class:`text-error`},{default:L(()=>[...r[39]||=[R(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`,`target`])],64))}}),[[`__scopeId`,`data-v-af3d7de3`]]),Lt={class:`d-flex flex-wrap align-center justify-space-between ga-2`},Rt=H({__name:`FilesPermissionAlert`,setup(e){let t=X();return(e,n)=>B(t).filesAccessHint?(z(),M(Ge,{key:0,type:B(t).filesAccessHint.type,variant:`tonal`,closable:``,prominent:``,density:`comfortable`,class:`mb-4`,icon:`mdi-shield-lock-outline`,"onClick:close":B(t).dismissFilesAccessHint},{default:L(()=>[P(`div`,Lt,[P(`span`,null,s(B(t).filesAccessHint.text.split(`目标机安装示例`)[0].trim()),1),B(t).sshUserForFiles&&B(t).sshUserForFiles!==`root`?(z(),M(f,{key:0,size:`small`,variant:`flat`,color:`primary`,"prepend-icon":`mdi-auto-fix`,loading:B(t).setupSudoLoading,disabled:B(t).setupSudoDone,onClick:c(B(t).setupFilesSudo,[`stop`])},{default:L(()=>[R(s(B(t).setupSudoDone?`已配置`:`一键配置 sudo 权限`),1)]),_:1},8,[`loading`,`disabled`,`onClick`])):F(``,!0)])]),_:1},8,[`type`,`onClick:close`])):F(``,!0)}}),zt={class:`text-caption text-medium-emphasis mb-2 d-flex flex-wrap align-center ga-2`},Bt=H({__name:`FilesStatusBar`,setup(e){let t=X();return(e,n)=>(z(),w(`div`,zt,[P(`span`,null,s(B(t).statusSummary),1),B(t).browseError?(z(),M(Be,{key:0,size:`x-small`,color:`warning`,variant:`tonal`},{default:L(()=>[R(s(B(t).browseError),1)]),_:1})):F(``,!0),B(t).hasClipboard?(z(),M(Be,{key:1,size:`x-small`,color:`info`,variant:`tonal`,class:`cursor-pointer`,onClick:n[0]||=()=>B(t).pasteClipboard()},{default:L(()=>[R(s(B(t).clipboardSummary)+` → `+s(B(t).pasteDestLabel)+` · Ctrl+V 粘贴 `,1)]),_:1})):F(``,!0)]))}}),Vt=H({__name:`FilesToolbar`,setup(e){let t=X();return(e,n)=>(z(),M(m,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4 pa-4`},{default:L(()=>[W(Le,{align:`center`,dense:``},{default:L(()=>[W(Ie,{cols:`12`,sm:`4`},{default:L(()=>[W(Ve,{modelValue:B(t).selectedServer,"onUpdate:modelValue":[n[0]||=e=>B(t).selectedServer=e,B(t).onServerChange],items:B(t).serverList,"item-title":`name`,"item-value":`id`,label:`选择服务器`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-server`},null,8,[`modelValue`,`items`,`onUpdate:modelValue`])]),_:1}),W(Ie,{cols:`12`,sm:`4`},{default:L(()=>[W(U,{modelValue:B(t).currentPath,"onUpdate:modelValue":n[1]||=e=>B(t).currentPath=e,label:`路径`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder`,"append-inner-icon":`mdi-arrow-right`,"onClick:appendInner":B(t).browseCurrent,onKeydown:j(B(t).browseCurrent,[`enter`])},null,8,[`modelValue`,`onClick:appendInner`,`onKeydown`])]),_:1}),W(Ie,{cols:`12`,sm:`3`},{default:L(()=>[W(U,{modelValue:B(t).fileFilter,"onUpdate:modelValue":n[2]||=e=>B(t).fileFilter=e,label:`筛选文件名`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-magnify`,clearable:``,"hide-details":``},null,8,[`modelValue`])]),_:1}),W(Ie,{cols:`12`,sm:`3`},{default:L(()=>[W(Ve,{modelValue:B(t).extFilter,"onUpdate:modelValue":n[3]||=e=>B(t).extFilter=e,items:B(t).FILE_EXT_FILTERS,"item-title":`title`,"item-value":`value`,label:`类型`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``},null,8,[`modelValue`,`items`])]),_:1}),W(Ie,{cols:`12`,sm:`2`},{default:L(()=>[W(Ve,{modelValue:B(t).sortBy,"onUpdate:modelValue":n[4]||=e=>B(t).sortBy=e,items:B(t).sortOptions,"item-title":`title`,"item-value":`value`,label:`排序`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`,`items`])]),_:1}),W(Ie,{cols:`12`,class:`d-flex ga-2 flex-wrap justify-end`},{default:L(()=>[W(f,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-upload`,onClick:n[5]||=e=>B(t).showUpload=!0},{default:L(()=>[...n[10]||=[R(` 上传 `,-1)]]),_:1}),W(f,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-file-plus`,disabled:!B(t).selectedServer,onClick:n[6]||=e=>B(t).showNewFile=!0},{default:L(()=>[...n[11]||=[R(` 新建文件 `,-1)]]),_:1},8,[`disabled`]),W(f,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-folder-plus`,onClick:n[7]||=e=>B(t).showMkdir=!0},{default:L(()=>[...n[12]||=[R(` 新建目录 `,-1)]]),_:1}),W(f,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-zip-box`,disabled:!B(t).selectedServer||!B(t).selectedFileCount,onClick:n[8]||=e=>B(t).openCompressDialog()},{default:L(()=>[...n[13]||=[R(` 压缩 `,-1)]]),_:1},8,[`disabled`]),W(f,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-paste`,disabled:!B(t).canPasteHere,onClick:n[9]||=()=>B(t).pasteClipboard()},{default:L(()=>[...n[14]||=[R(` 粘贴 `,-1)]]),_:1},8,[`disabled`]),W(f,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-arrow-up`,disabled:!B(t).canGoUp,onClick:B(t).goUp},{default:L(()=>[...n[15]||=[R(` 上级 `,-1)]]),_:1},8,[`disabled`,`onClick`]),W(f,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-refresh`,onClick:B(t).browseCurrent},{default:L(()=>[...n[16]||=[R(`刷新`,-1)]]),_:1},8,[`onClick`]),W(f,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-console`,disabled:!B(t).selectedServer,onClick:B(t).openInTerminal},{default:L(()=>[...n[17]||=[R(` 终端 `,-1)]]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1})]),_:1}))}}),Z=O(null);function Ht(){let e=u(()=>Z.value!==null),t=u(()=>Z.value?`${Z.value.mode===`cut`?`已剪切`:`已复制`} ${Z.value.paths.length} 项`:``);function n(e,t,n){if(!n.length)return!1;let r=[...new Set(n.map(e=>K(e)))];return Z.value={mode:e,serverId:t,paths:r,label:r.map(e=>e.split(`/`).pop()||e).join(`, `)},!0}function r(){Z.value=null}function i(e){return!!(Z.value&&e&&Z.value.serverId===e)}function a(e,t){let n=K(t);for(let t of e){let e=K(t);if(n===e)return`「${e.split(`/`).pop()||e}」与目标路径相同,无需粘贴`;if(n.startsWith(`${e}/`))return`不能粘贴到源目录「${e}」的内部`}return null}async function o(e){let t=Z.value;if(!t)throw Error(`剪贴板为空`);let n=K(e),i=a(t.paths,n);if(i)throw Error(i);let o=t.mode===`cut`?`move`:`copy`;await p.post(`/sync/file-clipboard`,{server_id:t.serverId,mode:o,sources:t.paths,dest_dir:n}),t.mode===`cut`&&r()}return{clipboard:Z,hasClipboard:e,clipboardSummary:t,setFromSelection:n,clear:r,canPasteOnServer:i,validatePasteTarget:a,pasteToDirectory:o}}function Ut(e){if(!(e instanceof HTMLElement))return!1;let t=e.tagName;return t===`INPUT`||t===`TEXTAREA`||e.isContentEditable}function Wt(e,t,n){function r(r){if(!Ut(r.target)){if(r.key===`F5`){r.preventDefault(),e.refresh();return}if(r.key===`Backspace`){r.preventDefault(),e.goUp();return}if(r.key===`F2`&&t.value.length===1){r.preventDefault(),e.renameSelection();return}if(r.key===`Delete`&&t.value.length>0&&(r.preventDefault(),e.deleteSelection()),(r.ctrlKey||r.metaKey)&&r.key.toLowerCase()===`a`){r.preventDefault(),e.selectAll();return}if((r.ctrlKey||r.metaKey)&&r.key.toLowerCase()===`c`){t.value.length>0&&(r.preventDefault(),e.copySelection());return}if((r.ctrlKey||r.metaKey)&&r.key.toLowerCase()===`x`){t.value.length>0&&(r.preventDefault(),e.cutSelection());return}(r.ctrlKey||r.metaKey)&&r.key.toLowerCase()===`v`&&n.value&&(r.preventDefault(),e.pasteClipboard())}}be(()=>window.addEventListener(`keydown`,r)),ae(()=>window.removeEventListener(`keydown`,r))}var Gt=`nexus:files:last_server_id`,Kt=`nexus:files-hint-dismissed`,qt=5e3;function Jt(e,t){return`${e}:${t}`}var Q=E(`files`,()=>{let e=O(null),t=O(Pe),n=O([]),r=O(!1),i=O(!1),a=O(``),o=O(null),s=O(null),c=O(!1),l=O(!1),u=O(!1),d=O(!1),f=O(!1),p=O(!1),m=new Map;function h(e){return Date.now()-e.at<=qt}function g(e,t){return m.get(Jt(e,t))??null}function _(e,t){let n=g(e,t);return!n||!h(n)?null:n.items}function v(e,t){return g(e,t)?.etag}function y(e,t){let n=g(e,t);n&&(n.at=Date.now())}function b(e,t,n,r){let i=Jt(e,t),a=m.get(i);if(m.set(i,{items:n,at:Date.now(),etag:r??a?.etag}),m.size>50){let e=[...m.entries()].sort((e,t)=>e[1].at-t[1].at)[0];e&&m.delete(e[0])}}function x(e,t){if(e==null){m.clear();return}if(t==null){let t=`${e}:`;for(let e of[...m.keys()])e.startsWith(t)&&m.delete(e);return}m.delete(Jt(e,t))}function S(){s.value=null,c.value=!1,u.value=!1}return{selectedServer:e,currentPath:t,files:n,loading:r,loadingVisible:i,browseError:a,filesCapability:o,lastReadDeniedPath:s,accessHintDismissed:c,setupSudoLoading:l,setupSudoDone:u,pageReady:d,routeReady:f,initing:p,getCacheEntry:g,getCached:_,getCachedEtag:v,touchCache:y,setCached:b,invalidateCache:x,resetForServerChange:S}}),Yt={directory:0,symlink:1,file:2};function Xt(e,t,n){let r=n===`asc`?1:-1;return[...e].sort((e,n)=>{let i=Yt[e.type]??9,a=Yt[n.type]??9;if(i!==a)return i-a;let o=0;return o=t===`name`?e.name.localeCompare(n.name):t===`size`?(e.size??0)-(n.size??0):(e.modified??``).localeCompare(n.modified??``),o*r})}var Zt=[{title:`全部`,value:``},{title:`.conf / .ini`,value:`conf,ini`},{title:`.log`,value:`log`},{title:`.sh`,value:`sh`},{title:`.py`,value:`py`},{title:`.json`,value:`json`},{title:`.yml / .yaml`,value:`yml,yaml`},{title:`.txt`,value:`txt`},{title:`.php`,value:`php`},{title:`.js / .ts`,value:`js,ts`}];function Qt(e,t){if(!t)return!0;let n=e.toLowerCase();return t.split(`,`).some(e=>n.endsWith(`.${e.trim()}`))}function $t(e){let t=e.toLowerCase();return t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`)||t.endsWith(`.zip`)}var en=300*1024,tn=2*1024*1024,nn=40,rn=4,$=new Map;function an(e,t){return`${e}:${K(t)}`}function on(e){let t=K(e),n=t.lastIndexOf(`/`);return n<=0?`/`:t.slice(0,n)||`/`}function sn(){$.clear()}function cn(e,t){let n=K(t);for(let t of[...$.keys()]){if(!t.startsWith(`${e}:`)){$.delete(t);continue}on(t.slice(`${e}:`.length))!==n&&$.delete(t)}}function ln(e,t){$.delete(an(e,t))}function un(e){if(e.type!==`file`)return!1;let t=e.size??0;return t>0&&t<=307200}function dn(e){return e!=null&&e>0&&e>2097152}function fn(e){return typeof e==`string`?e:e.content??JSON.stringify(e,null,2)}async function pn(e,t,n=en){let r=an(e,t),i=$.get(r);if(i!==void 0)return i;let a=fn(await p.post(`/sync/read-file`,{server_id:e,path:K(t),max_size:n}));return $.set(r,a),a}function mn(e,t,n){let r=n.filter(un).sort((e,t)=>(e.size??0)-(t.size??0)).slice(0,nn);if(!r.length)return;let i=0,a=async()=>{for(;i<r.length;){let n=r[i++],a=q(t,n.name),o=an(e,a);if(!$.has(o))try{await pn(e,a)}catch{}}},o=Math.min(rn,r.length);Promise.all(Array.from({length:o},()=>a()))}function hn(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.rel=`noopener`,document.body.appendChild(r),r.click(),r.remove(),URL.revokeObjectURL(n)}function gn(e){let t=ze(),{selectedServer:n,currentPath:r}=G(Q()),{selectedFiles:i,selectedAbsolutePaths:a,clearSelection:o}=e.selection,{setFromSelection:s,canPasteOnServer:c,pasteToDirectory:l}=Ht(),d=O(!1),f=O(!1),m=O(!1),h=O(``),g=O(!1),_=O(!1),v=O(``),y=O(`tar.gz`),b=O([]),x=O(!1),S=O(``),C=O(`.`),w=O(!1),T=O([]),E=O(!1),D=O(``),k=e.actionLoading??O(!1),A=O(null),j=O(!1),M=O(``),N=O(null),P=O(!1),F=O(!1),I=O(null),ee=O(!1),te=O(0),ne=O(0),L=O(null);function re(e){if(e)return K(e);let t=i.value.filter(e=>e.type===`directory`);return t.length===1&&i.value.length===1?q(r.value,t[0].name):K(r.value)}let ie=u(()=>{let e=re();return e===K(r.value)?`当前目录`:e});function ae(e){if(!n.value)return;let r=a(e);if(!r.length){t(`请先选择文件或目录`,`warning`);return}s(`copy`,n.value,r)&&t(`已复制 ${r.length} 项`)}function oe(e){if(!n.value)return;let r=a(e);if(!r.length){t(`请先选择文件或目录`,`warning`);return}s(`cut`,n.value,r)&&t(`已剪切 ${r.length} 项`)}async function se(r){if(!n.value){t(`请先选择服务器`,`warning`);return}if(!c(n.value)){t(`剪贴板为空或服务器不一致`,`warning`);return}let i=re(r);k.value=!0;try{await l(i),o(),e.invalidateAfterMutation(i),await e.browse({force:!0}),t(`已粘贴到 ${i}`)}catch(e){t(e instanceof Error?e.message:`粘贴失败`,`error`)}finally{k.value=!1}}async function R(e){if(d.value=!1,!n.value){t(`请先选择服务器`,`warning`);return}let r=e.dataTransfer?.files;r?.length&&(T.value=Array.from(r),await ye())}function z(t){if(ee.value=!1,!L.value)return;let n=L.value;switch(t){case`open`:e.openEntry(n);break;case`copy`:ae([n]);break;case`cut`:oe([n]);break;case`paste`:se();break;case`pasteInto`:n.type===`directory`&&se(q(r.value,n.name));break;case`edit`:e.editFile(n);break;case`preview`:e.previewFile(n);break;case`download`:_e(n);break;case`copyPath`:ce(n);break;case`terminal`:e.openInTerminal();break;case`compress`:B([n]);break;case`decompress`:V(n);break;case`rename`:fe(n);break;case`chmod`:me(n);break;case`delete`:U(n);break}}async function ce(e){let n=q(r.value,e.name);try{await navigator.clipboard.writeText(n),t(`路径已复制`)}catch{t(`复制失败`,`error`)}}function B(e){if(!n.value)return;let a=e?.length?e:i.value.length?i.value:[];if(!a.length){t(`请选择要压缩的文件或目录`,`warning`);return}b.value=a.map(e=>q(r.value,e.name));let o=a.length===1?a[0].name.replace(/\.[^.]+$/,``):`archive`;v.value=q(r.value,`${o}.tar.gz`),y.value=`tar.gz`,_.value=!0}function V(e){if(n.value){if(!$t(e.name)){t(`仅支持 .tar.gz / .tgz / .zip`,`warning`);return}S.value=q(r.value,e.name),C.value=r.value,x.value=!0}}async function le(){if(!(!n.value||!b.value.length||!v.value)){k.value=!0;try{let r=v.value;y.value===`zip`&&!r.endsWith(`.zip`)&&(r=r.replace(/\.tar\.gz$/i,`.zip`),r.endsWith(`.zip`)||(r+=`.zip`)),await p.post(`/sync/compress`,{server_id:n.value,paths:b.value,dest:r,format:y.value}),_.value=!1,o(),e.invalidateAfterMutation(),await e.browse({force:!0}),t(`压缩完成`)}catch(e){t(e instanceof Error?e.message:`压缩失败`,`error`)}finally{k.value=!1}}}async function ue(){if(!(!n.value||!S.value)){k.value=!0;try{await p.post(`/sync/decompress`,{server_id:n.value,path:S.value,dest:C.value||`.`}),x.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`解压完成`)}catch(e){t(e instanceof Error?e.message:`解压失败`,`error`)}finally{k.value=!1}}}async function de(){if(!n.value||!h.value)return;let i=Ne(h.value);if(i!==!0){t(i,`warning`);return}let a=h.value,o=q(r.value,a);k.value=!0;try{await p.post(`/sync/write-file`,{server_id:n.value,path:o,content:``}),m.value=!1,h.value=``,ln(n.value,o),e.invalidateAfterMutation(),await e.browse({force:!0}),t(`文件已创建`),await ge(),e.editorWorkbench.value?.openFile({path:o,name:a,content:``})}catch(e){t(e instanceof Error?e.message:`创建失败`,`error`)}finally{k.value=!1}}function fe(e){N.value=e,M.value=e.name,j.value=!0}async function pe(){if(!(!n.value||!N.value||!M.value))try{await p.post(`/sync/file-ops`,{server_id:n.value,operation:`rename`,path:q(r.value,N.value.name),new_path:q(r.value,M.value)}),j.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`重命名成功`)}catch(e){t(e instanceof Error?e.message:`重命名失败`,`error`)}}function me(e){I.value=e,P.value=!0}async function H(i){if(!(!n.value||!I.value)){F.value=!0;try{await p.post(`/sync/chmod`,{server_id:n.value,path:q(r.value,I.value.name),mode:i.mode,owner:i.owner,group:i.group,recursive:i.recursive??!1}),P.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`权限已修改`)}catch(e){t(e instanceof Error?e.message:`修改权限失败`,`error`)}finally{F.value=!1}}}async function he(){if(!n.value||!i.value.length||!confirm(`确定删除 ${i.value.length} 个文件?`))return;let a=0,s=0;for(let e of i.value)try{await p.post(`/sync/file-ops`,{server_id:n.value,operation:`delete`,path:q(r.value,e.name)}),a++}catch{s++}o(),e.invalidateAfterMutation(),await e.browse({force:!0}),s===0?t(`已删除 ${a} 项`):t(`删除完成:成功 ${a},失败 ${s}`,s>0?`warning`:`success`)}async function _e(e){if(n.value)try{let i=q(r.value,e.name),{blob:a,filename:o}=await p.download(`/sync/download`,{server_id:n.value,path:i});hn(a,o),t(`已下载 ${o}`)}catch(e){t(e instanceof Error?e.message:`下载失败`,`error`)}}async function U(e){A.value=e,w.value=!0}async function ve(){if(!(!n.value||!A.value)){k.value=!0;try{await p.post(`/sync/file-ops`,{server_id:n.value,operation:`delete`,path:q(r.value,A.value.name)}),w.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`已删除`)}catch(e){t(e instanceof Error?e.message:`删除失败`,`error`)}finally{k.value=!1}}}async function W(){if(!n.value||!D.value)return;let i=Ne(D.value);if(i!==!0){t(i,`warning`);return}k.value=!0;try{await p.post(`/sync/file-ops`,{server_id:n.value,operation:`mkdir`,path:q(r.value,D.value)}),g.value=!1,D.value=``,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`目录已创建`)}catch(e){t(e instanceof Error?e.message:`创建失败`,`error`)}finally{k.value=!1}}async function ye(){if(!(!n.value||!T.value.length)){E.value=!0;try{let i=new FormData;for(let e of T.value)i.append(`files`,e);i.append(`server_id`,String(n.value)),i.append(`remote_path`,r.value),await p.upload(`/sync/upload`,i),f.value=!1,T.value=[],e.invalidateAfterMutation(),await e.browse({force:!0}),t(`上传成功`)}catch(e){t(e instanceof Error?e.message:`上传失败`,`error`)}finally{E.value=!1}}}function be(e){return e instanceof HTMLElement?!!e.closest(`button, a, input, .v-checkbox, .v-selection-control`):!1}function xe(e){let t=e.item;return{class:t.type===`directory`?`files-row--dir`:void 0,style:{cursor:t.type===`directory`||t.type===`symlink`?`pointer`:`default`},onClick:e=>{be(e.target)||e.detail===1&&Se(e,{item:t})},onDblclick:e=>{be(e.target)||Ce(e,{item:t})},onContextmenu:e=>{be(e.target)||we(e,{item:t})}}}function Se(t,{item:n}){(n.type===`directory`||n.type===`symlink`)&&e.openEntry(n)}function Ce(t,{item:n}){n.type===`file`&&e.editFile(n)}function we(e,{item:t}){e.preventDefault(),L.value=t,te.value=e.clientX,ne.value=e.clientY,ee.value=!0}return{dropActive:d,showUpload:f,showNewFile:m,newFileName:h,showMkdir:g,showCompress:_,compressDest:v,compressFormat:y,compressPaths:b,showDecompress:x,decompressSource:S,decompressDest:C,showFileDelete:w,uploadFiles:T,uploading:E,mkdirName:D,actionLoading:k,deletingFile:A,showRename:j,newName:M,renamingFile:N,showChmod:P,chmodLoading:F,chmodFile:I,showContextMenu:ee,contextX:te,contextY:ne,contextFile:L,copyToClipboard:ae,cutToClipboard:oe,pasteClipboard:se,onDropFiles:R,contextAction:z,openCompressDialog:B,openDecompressDialog:V,doCompress:le,doDecompress:ue,doNewFile:de,startRename:fe,doRename:pe,startChmod:me,doChmod:H,batchDelete:he,downloadFile:_e,confirmDeleteFile:U,doDeleteFile:ve,doMkdir:W,doUpload:ye,fileRowProps:xe,pasteDestLabel:ie}}var _n=200,vn=0,yn=null,bn=``,xn=null;function Sn(e){return e.includes(`No such file or directory`)||e.includes(`not a directory`)}function Cn(e,t){return Sn(e)?`路径不存在:${t},请检查服务器「target_path」设置`:e.includes(`Permission denied`)||e.includes(`Operation not permitted`)?`无读取权限(${t}`:e.includes(`connection_error`)||e.includes(`SSH pool at capacity`)?`SSH 连接失败或连接池繁忙,请稍后点「刷新」重试`:e.includes(`timed out`)||e.includes(`timeout`)?`远程命令超时(${t}),请检查目标机负载或网络`:e}function wn(e){e.loading=!0,!xn&&(xn=setTimeout(()=>{xn=null,e.loading&&(e.loadingVisible=!0)},_n))}function Tn(e){e.loading=!1,xn&&=(clearTimeout(xn),null),e.loadingVisible=!1}async function En(e,t,n){let r={};n&&(r[`If-None-Match`]=n);try{return await l(`/files/browse`,{method:`GET`,params:{server_id:e,path:t},headers:r})}catch(n){if(!(n instanceof C&&(n.status>=500||n.status===404||n.status===405)))throw n;return{status:200,data:await p.post(`/sync/browse`,{server_id:e,path:t}),etag:null}}}function Dn(e){let t=ze(),n=r(),i=A(),a=Q(),{selectedServer:o,currentPath:s,files:c,loading:l,loadingVisible:d,browseError:f,pageReady:p,filesCapability:m}=G(a);function h(){let e={...n.query};o.value?(e.server_id=String(o.value),e.path=s.value===`/www/wwwroot`?void 0:s.value):(delete e.server_id,delete e.path),i.replace({query:e})}let g=u(()=>p.value?o.value?f.value?f.value:e?.value.trim()?`无匹配文件`:m.value?.is_root?`目录为空(${s.value}),可在上方修改路径或到「服务器」核对 target_path`:`目录为空(${s.value}`:`请先选择服务器`:`正在加载…`);function _(e,n,r,i,o){if(o!==vn)return!1;let{items:l,error:u}=Ae(r??{items:[]});if(u&&Sn(u)&&n!==`/`){f.value=``;let e=je(n);if(e)return t(`路径 "${n}" 不存在,已自动跳转到上级目录`,`info`),s.value=e,v(),!0}return f.value=u?Cn(u,n):``,u&&!Sn(u)&&t(Cn(u,n),`warning`),c.value=l,u||a.setCached(e,n,l,i??void 0),e&&l.length&&(cn(e,n),mn(e,n,l)),!0}async function v(e){if(!o.value)return;let n=K(s.value),r=o.value,i=`${r}:${n}`;if(!e?.force){let e=a.getCached(r,n);if(e){c.value=e,f.value=``,Tn(a),h();return}}if(yn&&bn===i)return yn;bn=i;let l=++vn;wn(a),s.value=n;let u=e?.force?void 0:a.getCachedEtag(r,n);return yn=(async()=>{try{let e=await En(r,n,u);if(l!==vn)return;if(e.status===304){let t=a.getCacheEntry(r,n);if(t){c.value=t.items,a.touchCache(r,n),f.value=``;return}if(e=await En(r,n),l!==vn)return}_(r,n,e.data,e.etag,l)}catch(e){if(l!==vn)return;let n=qe(e,`浏览目录失败`);f.value=n,t(n,`error`)}finally{l===vn&&(Tn(a),h()),bn===i&&(yn=null,bn=``)}})(),yn}function y(){if(!o.value){t(`请先选择服务器`,`warning`);return}s.value=K(s.value),a.invalidateCache(o.value,s.value),v({force:!0})}function b(e){if(!o.value)return;let t=e??s.value;a.invalidateCache(o.value,K(t)),sn()}return{emptyHint:g,browse:v,browseCurrent:y,invalidateAfterMutation:b,loadingVisible:d}}function On(e){return e?e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`:`—`}function kn(e){let t=ze(),{selectedServer:n,currentPath:r,lastReadDeniedPath:i,accessHintDismissed:a}=G(Q()),o=O(!1),s=O(``),c=O(``),l=O(!1),u=O(null);function d(e,n){return dn(e.size)?(t(`文件超过 2MB${On(e.size)}),无法${n},请下载或使用终端`,`warning`),!0):!1}function f(t){n.value&&t&&ln(n.value,t),e.invalidateAfterMutation(),e.browse({force:!0})}async function p(e){if(!n.value||d(e,`查看`))return;let u=q(r.value,e.name);s.value=e.name,c.value=``,l.value=!0,o.value=!0,(e.size??0)>307200&&t(`文件较大(${On(e.size)}),正在加载…`,`info`);try{c.value=await pn(n.value,u,2097152)||`(空文件)`}catch(n){let r=n instanceof Error?n.message:`读取失败`;c.value=r,lt(r)&&(i.value=e.name,a.value=!1),t(r,`error`)}finally{l.value=!1}}async function m(o){if(n.value&&!d(o,`编辑`)){(o.size??0)>307200&&t(`文件较大(${On(o.size)}),正在加载…`,`info`),e.actionLoading.value=!0;try{let e=q(r.value,o.name),t=await pn(n.value,e,tn);await ge(),u.value?.openFile({path:e,name:o.name,content:t})}catch(e){let n=e instanceof Error?e.message:`读取失败`;lt(n)&&(i.value=o.name,a.value=!1),t(n,`error`)}finally{e.actionLoading.value=!1}}}return{showPreview:o,previewTitle:s,previewContent:c,previewLoading:l,editorWorkbench:u,previewFile:p,editFile:m,onEditorSaved:f,formatSize:On}}function An(e){let t=ze(),n=r(),i=A(),{servers:a,loadServers:o}=Ue(),s=Q(),{selectedServer:c,currentPath:l,pageReady:d,routeReady:f,initing:p,accessHintDismissed:m}=G(s),h=u(()=>Me(l.value)),g=u(()=>je(l.value)!==null);function _(e){if(e==null)return Pe;let t=a.value.find(t=>t.id===e)?.target_path?.trim();return t?K(t):Pe}function v(){let e=n.query.path;return typeof e==`string`&&e.trim()?K(e):_(c.value)}function y(){let e=n.query.server_id;if(e){let t=Number(e);if(Number.isFinite(t)&&a.value.some(e=>e.id===t))return t}let t=sessionStorage.getItem(Gt);if(t){let e=Number(t);if(Number.isFinite(e)&&a.value.some(t=>t.id===e))return e}return a.value[0]?.id??null}function b(n){if(!c.value){t(`请先选择服务器`,`warning`);return}l.value=K(n),e.clearSelection(),e.browse()}function x(e){if(e.type===`directory`){b(q(l.value,e.name));return}if(e.type===`symlink`){let n=e.link_target?.trim();n?.startsWith(`/`)?b(n):t(n?`符号链接 → ${n}`:`相对符号链接(请在终端中打开)`,`info`)}}function S(){let e=je(l.value);e!=null&&b(e)}function C(e){let t=h.value[e];t&&!t.disabled&&b(t.path)}function w(){c.value&&i.push({path:`/terminal`,query:{server_id:String(c.value),path:l.value||`/`}})}function T(){p.value||(c.value&&sessionStorage.setItem(Gt,String(c.value)),s.invalidateCache(),l.value=_(c.value),e.clearSelection(),s.resetForServerChange(),sessionStorage.removeItem(Kt),(async()=>{await e.refreshFilesCapability(),await e.browse({force:!0})})())}return be(async()=>{p.value=!0;try{if(await o(),sessionStorage.getItem(`nexus:files-hint-dismissed`)&&(m.value=!0),!a.value.length){t(`暂无可用服务器,请先在「服务器」页添加`,`warning`),d.value=!0;return}let r=y();if(r==null){d.value=!0;return}c.value=r;let i=n.query.path;l.value=typeof i==`string`&&i?K(i):_(r),await e.refreshFilesCapability(),await e.browse(),d.value=!0,f.value=!0}finally{p.value=!1}}),Se(()=>n.query.server_id,t=>{f.value&&t&&Number(t)!==c.value&&(c.value=Number(t),l.value=v(),s.resetForServerChange(),(async()=>{await e.refreshFilesCapability(),await e.browse({force:!0})})())}),Se(()=>n.query.path,()=>{if(!f.value||!c.value)return;let t=v();t!==K(l.value)&&(l.value=t,e.clearSelection(),e.browse())}),{serverList:a,breadcrumbs:h,canGoUp:g,navigateToPath:b,openEntry:x,goUp:S,onBreadcrumbClick:C,openInTerminal:w,onServerChange:T,defaultPathForServer:_}}function jn(e){let t=ze(),{selectedServer:n,files:r,browseError:i,filesCapability:a,lastReadDeniedPath:o,accessHintDismissed:s,setupSudoLoading:c,setupSudoDone:l}=G(Q()),d=u(()=>a.value?.ssh_user??null),f=u(()=>{let e=d.value;return e?r.value.filter(t=>ut(t,e)).length:0}),m=u(()=>{if(s.value||!n.value||i.value&&Sn(i.value))return null;let e=a.value;return ft({sshUser:e?.ssh_user,canSudo:e?.can_sudo_nopasswd??!1,whitelistOk:e?.whitelist_ok??!1,isRootSsh:e?.is_root??!1,filesElevation:e?.files_elevation,capabilityMessage:e?.message,lastReadDeniedPath:o.value,unreadableCount:f.value})});function h(){s.value=!0,sessionStorage.setItem(Kt,`1`)}async function g(){if(!n.value){a.value=null;return}try{a.value=await p.get(`/servers/${n.value}/files-capability`)}catch{a.value=null}}async function _(){if(n.value){c.value=!0;try{let r=await p.post(`/servers/${n.value}/setup-files-sudo`,{});l.value=!0,t(r.message||`sudoers 配置成功,文件管理器现在可自动提权`,`success`),h(),await g(),await e.browse({force:!0})}catch(e){t(`一键配置失败:${e instanceof Error?e.message:`配置失败`}`,`error`)}finally{c.value=!1}}}return{sshUserForFiles:d,filesAccessHint:m,dismissFilesAccessHint:h,refreshFilesCapability:g,setupFilesSudo:_}}function Mn(){let{currentPath:e}=G(Q()),t=O([]),n=u(()=>t.value.length);function r(){t.value=[]}function i(n){return(n?.length?n:t.value).map(t=>q(e.value,t.name))}return{selectedFiles:t,selectedFileCount:n,clearSelection:r,selectedAbsolutePaths:i}}function Nn(){let e=O(``),t=O(``),n=O(`name`),r=[{title:`名称`,value:`name`},{title:`大小`,value:`size`},{title:`修改时间`,value:`modified`}],{selectedServer:i,currentPath:a,files:o,loading:s,browseError:c,pageReady:l,setupSudoLoading:d,setupSudoDone:f}=G(Q()),p=Mn(),{selectedFiles:m,selectedFileCount:h,clearSelection:g}=p,{emptyHint:_,browse:v,browseCurrent:y,invalidateAfterMutation:b,loadingVisible:x}=Dn(e),S=jn({browse:v}),{sshUserForFiles:C,filesAccessHint:w,dismissFilesAccessHint:T,setupFilesSudo:E}=S,D=An({browse:v,refreshFilesCapability:S.refreshFilesCapability,clearSelection:g}),k=O(!1),A=kn({browse:v,invalidateAfterMutation:b,actionLoading:k}),j=gn({browse:v,invalidateAfterMutation:b,selection:p,openEntry:D.openEntry,editFile:A.editFile,previewFile:A.previewFile,openInTerminal:D.openInTerminal,editorWorkbench:A.editorWorkbench,actionLoading:k}),{hasClipboard:M,clipboardSummary:N,canPasteOnServer:P}=Ht(),F=u(()=>P(i.value)),I=u(()=>{let r=Xt(o.value,n.value,`asc`),i=t.value;i&&(r=r.filter(e=>Qt(e.name,i)));let a=e.value.trim().toLowerCase();return a&&(r=r.filter(e=>e.name.toLowerCase().includes(a))),r}),ee=u(()=>{let e=o.value.filter(e=>e.type===`directory`).length,t=o.value.filter(e=>e.type===`file`).length,n=o.value.filter(e=>e.type===`symlink`).length,r=o.value.filter(un).length,i=[`${e} 个目录`,`${t} 个文件`];return n&&i.push(`${n} 个链接`),r&&i.push(`${r} 个 ≤300KB 可预加载`),`${i.join(``)} · ${a.value}`});function te(e){return $t(e)}function ne(e){return e.type===`directory`?`mdi-folder`:e.type===`symlink`?`mdi-link-variant`:`mdi-file-outline`}function L(e){return e.type===`directory`?`amber`:e.type===`symlink`?`teal`:`blue`}function re(e){return e.type===`file`}return Wt({refresh:y,goUp:D.goUp,renameSelection:()=>{m.value.length===1&&j.startRename(m.value[0])},deleteSelection:()=>{m.value.length>0&&j.batchDelete()},selectAll:()=>{m.value=[...I.value]},copySelection:()=>j.copyToClipboard(),cutSelection:()=>j.cutToClipboard(),pasteClipboard:()=>{j.pasteClipboard()}},m,F),{FILE_EXT_FILTERS:Zt,validatePathSegment:Ne,required:We,fileFilter:e,extFilter:t,sortBy:n,sortOptions:r,selectedServer:i,currentPath:a,files:o,loading:s,loadingVisible:x,browseError:c,pageReady:l,setupSudoLoading:d,setupSudoDone:f,serverList:D.serverList,onServerChange:D.onServerChange,browseCurrent:y,filesAccessHint:w,dismissFilesAccessHint:T,setupFilesSudo:E,sshUserForFiles:C,statusSummary:ee,hasClipboard:M,clipboardSummary:N,pasteDestLabel:j.pasteDestLabel,canPasteHere:F,breadcrumbs:D.breadcrumbs,onBreadcrumbClick:D.onBreadcrumbClick,canGoUp:D.canGoUp,goUp:D.goUp,selectedFiles:m,selectedFileCount:h,displayedFiles:I,fileHeaders:[{title:`名称`,key:`name`},{title:`归属`,key:`owner`,width:110,sortable:!1},{title:`大小`,key:`size`,width:120},{title:`修改时间`,key:`modified`,width:180},{title:`操作`,key:`actions`,width:200,align:`end`}],fileRowProps:j.fileRowProps,dropActive:j.dropActive,onDropFiles:j.onDropFiles,emptyHint:_,entryIcon:ne,entryIconColor:L,isEntryLikelyUnreadable:ut,formatOwnerChip:it,ownerChipColor:at,permissionTooltip:ot,formatSize:A.formatSize,isRegularFile:re,isArchiveName:te,showUpload:j.showUpload,uploadFiles:j.uploadFiles,uploading:j.uploading,doUpload:j.doUpload,showNewFile:j.showNewFile,newFileName:j.newFileName,doNewFile:j.doNewFile,showMkdir:j.showMkdir,mkdirName:j.mkdirName,doMkdir:j.doMkdir,showFileDelete:j.showFileDelete,deletingFile:j.deletingFile,doDeleteFile:j.doDeleteFile,showRename:j.showRename,newName:j.newName,doRename:j.doRename,showChmod:j.showChmod,chmodFile:j.chmodFile,chmodLoading:j.chmodLoading,doChmod:j.doChmod,showCompress:j.showCompress,compressDest:j.compressDest,compressFormat:j.compressFormat,compressPaths:j.compressPaths,doCompress:j.doCompress,showDecompress:j.showDecompress,decompressSource:j.decompressSource,decompressDest:j.decompressDest,doDecompress:j.doDecompress,showContextMenu:j.showContextMenu,contextX:j.contextX,contextY:j.contextY,contextFile:j.contextFile,contextAction:j.contextAction,actionLoading:k,batchDelete:j.batchDelete,openCompressDialog:j.openCompressDialog,showPreview:A.showPreview,previewTitle:A.previewTitle,previewContent:A.previewContent,previewLoading:A.previewLoading,editorWorkbench:A.editorWorkbench,onEditorSaved:A.onEditorSaved,navigateToPath:D.navigateToPath,pasteClipboard:j.pasteClipboard,editFile:A.editFile,previewFile:A.previewFile,downloadFile:j.downloadFile,confirmDeleteFile:j.confirmDeleteFile,openInTerminal:D.openInTerminal}}var Pn=H({__name:`FilesPage`,setup(e){let t=ue(()=>h(()=>import(`./FileEditorWorkbench-D9KoMn0T.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]))),n=Nn();Ye(n);let{editorWorkbench:r}=n;return(e,i)=>(z(),M(Fe,{fluid:``,class:`pa-6`},{default:L(()=>[W(Vt),W(Rt),W(Bt),W(rt),W(It),W(Tt),W(B(t),{ref_key:`editorWorkbench`,ref:r,"server-id":B(n).selectedServer??0,"current-path":B(n).currentPath,onSaved:i[0]||=e=>B(n).onEditorSaved(e),onPathChange:B(n).navigateToPath,onPasteTarget:B(n).pasteClipboard},null,8,[`server-id`,`current-path`,`onPathChange`,`onPasteTarget`])]),_:1}))}});export{Pn as default};