Files
Nexus/web/app/assets/FilesPage-BXehTSm9.js
T
Nexus Agent dfb0ea2d8f fix(frontend): 脚本库与推送调度对齐设计文档
修复 ScriptsPage 执行契约(script_id/command、历史过滤、长任务/凭据)及 SchedulesPage 缺失能力(target_path、next_run、push/script、cron/once、sync_mode);后端补迁移与 schedule_runner 传参。
2026-06-08 02:39:18 +08:00

5 lines
83 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/initMonaco-BdSPub4l.js","assets/index-BihgjXCy.js","assets/index-BGzIPEZO.css","assets/initMonaco-DX2BVZF3.css"])))=>i.map(i=>d[i]);
import{a as e,i as t,n,t as r}from"./initMonaco-BdSPub4l.js";import{t as i}from"./VDataTable-CynA26OW.js";import{$n as a,A as o,Bn as s,Br as c,Bt as l,Ct as u,Dr as d,Et as f,F as p,H as m,Ht as ee,It as h,L as g,Lr as _,M as v,Mr as y,Mt as b,N as x,P as S,Pr as C,Pt as te,Qn as ne,Rt as w,Sr as T,St as E,Tt as D,U as O,Ut as k,Vr as A,Vt as re,X as ie,Xn as j,Y as ae,Yn as M,Z as N,Zn as oe,_ as se,_r as ce,ar as P,b as le,bt as ue,ct as de,dr as fe,en as pe,er as F,fn as I,fr as me,gr as L,jr as R,k as z,kr as B,ln as he,lr as ge,lt as _e,mr as ve,nn as V,nr as H,or as U,pn as W,rn as G,rr as K,sr as ye,t as be,tr as q,un as xe,ur as Se,v as Ce,vr as we,w as Te,wr as J,wt as Ee,x as De,xr as Oe,xt as ke,y as Ae,z as Y,zn as je,zr as Me,zt as X}from"./index-BihgjXCy.js";import{o as Ne,t as Pe}from"./VContainer-V_R05OUP.js";import{t as Fe}from"./VChip-FKNgTWw3.js";import{t as Ie}from"./VSelect-CGF0mOJJ.js";import{t as Le}from"./VCheckbox-C4OWnQkf.js";import{n as Re,t as ze}from"./VRow-D6NnUZV_.js";import{t as Z}from"./VSpacer-2YW4-MQQ.js";import{t as Be}from"./apiError-BFaYYBmC.js";import{t as Ve}from"./useServerList-B6ZsiiQ2.js";import{i as He}from"./validation-DMwOxx4a.js";import{t as Ue}from"./VDialog-C6lmIorM.js";import{t as We}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{a as Ge,n as Ke,t as qe}from"./VFileInput-BbCjN3dl.js";import{t as Je}from"./VAlert-Dm_0fgK_.js";var Ye=Symbol(`filesPage`);function Xe(e){ce(Ye,B(e))}function Ze(){let e=ge(Ye);if(!e)throw Error(`useFilesPageContext() must be used inside FilesPage`);return e}var Qe=W({divider:[Number,String],...I()},`VBreadcrumbsDivider`),$e=he()({name:`VBreadcrumbsDivider`,props:Qe(),setup(e,{slots:t}){return G(()=>F(`li`,{"aria-hidden":`true`,class:Me([`v-breadcrumbs-divider`,e.class]),style:c(e.style)},[t?.default?.()??e.divider])),{}}}),et=W({active:Boolean,activeClass:String,activeColor:String,color:String,disabled:Boolean,title:String,...I(),...s(Ee(),[`width`,`maxWidth`]),...m(),...b({tag:`li`})},`VBreadcrumbsItem`),tt=he()({name:`VBreadcrumbsItem`,props:et(),setup(e,{slots:t,attrs:n}){let r=O(e,n),i=a(()=>e.active||r.isActive?.value),{dimensionStyles:o}=D(e),{textColorClasses:s,textColorStyles:l}=u(()=>i.value?e.activeColor:e.color);return G(()=>U(e.tag,{class:Me([`v-breadcrumbs-item`,{"v-breadcrumbs-item--active":i.value,"v-breadcrumbs-item--disabled":e.disabled,[`${e.activeClass}`]:i.value&&e.activeClass},s.value,e.class]),style:c([l.value,o.value,e.style]),"aria-current":i.value?`page`:void 0},{default:()=>[r.isLink.value?F(`a`,Se({class:`v-breadcrumbs-item--link`,onClick:r.navigate.value},r.linkProps),[t.default?.()??e.title]):t.default?.()??e.title]})),{}}}),nt=W({activeClass:String,activeColor:String,bgColor:String,color:String,disabled:Boolean,divider:{type:String,default:`/`},icon:V,items:{type:Array,default:()=>[]},...I(),...de(),...ue(),...b({tag:`ul`})},`VBreadcrumbs`),rt=he()({name:`VBreadcrumbs`,props:nt(),setup(e,{slots:t}){let{backgroundColorClasses:n,backgroundColorStyles:r}=E(()=>e.bgColor),{densityClasses:i}=_e(e),{roundedClasses:o}=ke(e);xe({VBreadcrumbsDivider:{divider:C(()=>e.divider)},VBreadcrumbsItem:{activeClass:C(()=>e.activeClass),activeColor:C(()=>e.activeColor),color:C(()=>e.color),disabled:C(()=>e.disabled)}});let s=a(()=>e.items.map(e=>typeof e==`string`?{item:{title:e},raw:e}:{item:e,raw:e}));return G(()=>{let a=!!(t.prepend||e.icon);return U(e.tag,{class:Me([`v-breadcrumbs`,n.value,i.value,o.value,e.class]),style:c([r.value,e.style])},{default:()=>[a&&F(`li`,{key:`prepend`,class:`v-breadcrumbs__prepend`},[t.prepend?U(f,{key:`prepend-defaults`,disabled:!e.icon,defaults:{VIcon:{icon:e.icon,start:!0}}},t.prepend):U(N,{key:`prepend-icon`,start:!0,icon:e.icon},null)]),s.value.map(({item:e,raw:n},r,i)=>F(oe,null,[t.item?.({item:e,index:r})??U(tt,Se({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&&U($e,null,{default:t.divider?()=>t.divider?.({item:n,index:r}):void 0})])),t.default?.()]})}),{}}}),it={class:`text-body-2 mr-4`},at=ye({__name:`FilesBreadcrumb`,setup(e){let t=Ze();return(e,n)=>(L(),K(oe,null,[U(rt,{items:_(t).breadcrumbs,class:`pa-0 mb-2`},{item:J(({item:e,index:n})=>[U(tt,{disabled:e.disabled,class:Me({"text-primary":!e.disabled,"cursor-pointer":!e.disabled}),onClick:e=>_(t).onBreadcrumbClick(n)},{default:J(()=>[P(A(e.title),1)]),_:2},1032,[`disabled`,`class`,`onClick`])]),divider:J(()=>[...n[1]||=[P(`/`,-1)]]),_:1},8,[`items`]),_(t).selectedFileCount>0?(L(),q(x,{key:0,class:`mb-4`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:J(()=>[U(S,{class:`d-flex align-center py-2`},{default:J(()=>[F(`span`,it,`已选择 `+A(_(t).selectedFileCount)+` 个文件`,1),U(Z),U(Y,{size:`small`,variant:`text`,color:`error`,onClick:_(t).batchDelete},{default:J(()=>[...n[2]||=[P(`批量删除`,-1)]]),_:1},8,[`onClick`]),U(Y,{size:`small`,variant:`text`,onClick:n[0]||=e=>_(t).selectedFiles=[]},{default:J(()=>[...n[3]||=[P(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):H(``,!0)],64))}});function ot(e){return e.filter(e=>e.name&&e.name!==`.`&&e.name!==`..`).map(e=>{let t=e.type===`directory`||!!e.is_dir,n=e.type===`symlink`||!!e.is_link,r=0;if(!t&&!n&&e.size!=null){let t=typeof e.size==`number`?e.size:parseInt(String(e.size),10);r=Number.isFinite(t)?t:0}let i=`file`;return t?i=`directory`:n&&(i=`symlink`),{name:e.name,type:i,size:r,modified:e.modified??``,permissions:e.permissions??e.perms??``,owner:e.owner??``,group:e.group??``,mode_octal:e.mode_octal??``,link_target:e.link_target??null}})}function st(e){if(Array.isArray(e))return{items:e};let t=e;return Array.isArray(t.items)?{items:t.items,error:t.error}:t.entries?.length?{items:ot(t.entries),error:t.error}:{items:t.items??[],error:t.error}}var ct=`/www/wwwroot`;function lt(e){if(e==null)return``;if(typeof e==`string`)return e;if(typeof e==`object`&&`value`in e){let t=e.value;if(typeof t==`string`)return t}return String(e)}function Q(e){let t=lt(e).trim().replace(/\\/g,`/`);if(!t||t===`.`)return`/`;let n=t.startsWith(`/`)?t:`/${t}`;return n=n.replace(/\/+/g,`/`),n.length>1&&n.endsWith(`/`)&&(n=n.slice(0,-1)),n}function ut(e){return Q(e).split(`/`).filter(Boolean)}function $(e,t){let n=Q(e),r=t.replace(/\/+/g,``).trim();if(!r||r===`.`)return n;if(r===`..`){let e=ut(n);return e.pop(),e.length?`/${e.join(`/`)}`:`/`}return n===`/`?`/${r}`:`${n}/${r}`}function dt(e){let t=ut(e);return t.length?(t.pop(),t.length?`/${t.join(`/`)}`:`/`):null}function ft(e){let t=e.trim();return t?t.includes(`/`)||t.includes(`\\`)||t.includes(`\0`)?`名称不能包含路径分隔符`:t===`.`||t===`..`?`非法名称`:!0:`名称不能为空`}function pt(e){let t=ut(Q(e)),n=[{title:`/`,path:`/`,disabled:t.length===0}],r=``;for(let e=0;e<t.length;e++)r=$(r||`/`,t[e]),n.push({title:t[e],path:r,disabled:e===t.length-1});return n}var mt={key:1,class:`file-dir-tree-embedded-bar d-flex align-center px-2 py-1`},ht={key:0,class:`text-caption text-medium-emphasis pa-3`},gt={key:2,class:`text-caption text-medium-emphasis pa-3`},_t=[`onClick`],vt=[`onClick`,`onContextmenu`],yt=We(ye({__name:`FileDirectoryTree`,props:{serverId:{},currentPath:{},rootPath:{},embedded:{type:Boolean}},emits:[`navigate`,`paste-target`],setup(e,{emit:t}){let n=e,r=Ne(),i=a(()=>Q(n.rootPath||`/www/wwwroot`)),o=t,s=R(!1),l=R(null),u=R(new Set),d=R(new Map);function f(e){let t=new Set(u.value);e(t),u.value=t}function m(e){let t=new Map(d.value);e(t),d.value=t}function ee(){u.value=new Set([i.value])}let h=a(()=>{let e=[],t=(n,r)=>{let i=d.value.get(n)??[];for(let n of i)e.push({...n,depth:r}),u.value.has(n.path)&&t(n.path,r+1)};return t(i.value,0),e});async function g(e){if(!n.serverId)return[];let{items:t}=st(await X.post(`/sync/browse`,{server_id:n.serverId,path:Q(e)}));return t.filter(e=>e.type===`directory`).sort((e,t)=>e.name.localeCompare(t.name)).map(t=>({path:$(e,t.name),name:t.name,depth:0,hasChildren:!0,loaded:!1}))}async function y(e){if(n.serverId){l.value=e;try{let t=await g(e);m(n=>{n.set(e,t);for(let e of t)n.has(e.path)||n.set(e.path,[])})}catch(e){r(e instanceof Error?e.message:`加载目录失败`,`error`)}finally{l.value=null}}}async function b(){if(!n.serverId)return;s.value=!0,d.value=new Map,ee();let e=i.value;try{await y(e),m(t=>{for(let n of t.get(e)??[])t.has(n.path)||t.set(n.path,[])})}finally{s.value=!1}}async function C(e){if(u.value.has(e.path)){f(t=>{t.delete(e.path)});return}d.value.has(e.path)||await y(e.path),f(t=>{t.add(e.path)})}function te(e){let t=Q(e),n=i.value;t!==n&&f(e=>{if(e.add(n),!t.startsWith(n))return;let r=t.slice(n.length).replace(/^\//,``);if(!r)return;let i=n;for(let t of r.split(`/`).filter(Boolean))i=$(i,t),e.add(i)})}T(()=>[n.serverId,i.value],([e])=>{e?b():(d.value=new Map,u.value=new Set)},{immediate:!0});async function ne(e){if(!n.serverId)return;let t=Q(e),r=i.value;if(te(t),d.value.has(r)||await y(r),t===r||!t.startsWith(r))return;let a=t.slice(r.length).replace(/^\//,``).split(`/`).filter(Boolean),o=r;for(let e of a)d.value.has(o)||await y(o),o=$(o,e)}return T(()=>n.currentPath,e=>{e&&ne(e)},{immediate:!0}),(t,n)=>(L(),q(x,{border:``,rounded:`lg`,class:Me([`file-dir-tree d-flex flex-column`,{"file-dir-tree--embedded":e.embedded}])},{default:J(()=>[e.embedded?(L(),K(`div`,mt,[U(N,{size:`16`,class:`mr-1 text-medium-emphasis`},{default:J(()=>[...n[2]||=[P(`mdi-file-tree`,-1)]]),_:1}),n[3]||=F(`span`,{class:`text-caption text-medium-emphasis`},`目录`,-1),U(Z),U(Y,{icon:`mdi-refresh`,size:`x-small`,variant:`text`,disabled:!e.serverId,onClick:b},null,8,[`disabled`])])):(L(),q(p,{key:0,class:`text-subtitle-2 py-2 px-3 d-flex align-center`},{default:J(()=>[U(N,{size:`18`,class:`mr-1`},{default:J(()=>[...n[0]||=[P(`mdi-file-tree`,-1)]]),_:1}),n[1]||=P(` 目录 `,-1),U(Z),U(Y,{icon:`mdi-refresh`,size:`x-small`,variant:`text`,disabled:!e.serverId,onClick:b},null,8,[`disabled`])]),_:1})),U(v),U(S,{class:`file-dir-tree-body pa-0 flex-grow-1`},{default:J(()=>[e.serverId?s.value?(L(),q(ae,{key:1,indeterminate:``})):h.value.length===0?(L(),K(`div`,gt,` 暂无子目录(可点刷新) `)):(L(),q(Te,{key:3,density:`compact`,nav:``,class:`py-0`},{default:J(()=>[(L(!0),K(oe,null,we(h.value,t=>(L(),K(`div`,{key:t.path,class:`file-dir-tree-row d-flex align-center`,style:c({paddingLeft:`${8+t.depth*14}px`})},[F(`button`,{type:`button`,class:`file-dir-tree-toggle`,onClick:j(e=>C(t),[`stop`])},[l.value===t.path?(L(),q(ie,{key:0,indeterminate:``,size:`14`,width:`2`})):(L(),q(N,{key:1,size:`16`},{default:J(()=>[P(A(u.value.has(t.path)?`mdi-chevron-down`:`mdi-chevron-right`),1)]),_:2},1024))],8,_t),F(`button`,{type:`button`,class:Me([`file-dir-tree-label text-body-2 text-truncate`,{"file-dir-tree-label--active":_(Q)(e.currentPath)===t.path}]),onClick:e=>o(`navigate`,t.path),onContextmenu:j(e=>o(`paste-target`,t.path),[`prevent`])},[U(N,{size:`14`,class:`mr-1`},{default:J(()=>[...n[4]||=[P(`mdi-folder-outline`,-1)]]),_:1}),P(` `+A(t.name),1)],42,vt)],4))),128))]),_:1})):(L(),K(`div`,ht,`请先选择服务器`))]),_:1})]),_:1},8,[`class`]))}}),[[`__scopeId`,`data-v-d76d91c6`]]);function bt(e,t){try{let n=localStorage.getItem(e);if(!n)return t;let r=JSON.parse(n);if(typeof r.x==`number`&&typeof r.y==`number`&&typeof r.w==`number`&&typeof r.h==`number`)return r}catch{}return t}function xt(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch{}}function St(e,t){let n=R(bt(e,t)),r={px:0,py:0,rx:0,ry:0},i=!1,o={px:0,py:0,rw:0,rh:0},s=a(()=>({left:`${n.value.x}px`,top:`${n.value.y}px`,width:`${n.value.w}px`,height:`${n.value.h}px`}));function c(){let e=Math.min(window.innerWidth-16,1400),t=Math.min(window.innerHeight-16,900);n.value.w=Math.max(480,Math.min(n.value.w,e)),n.value.h=Math.max(320,Math.min(n.value.h,t)),n.value.x=Math.max(8,Math.min(n.value.x,window.innerWidth-n.value.w-8)),n.value.y=Math.max(8,Math.min(n.value.y,window.innerHeight-n.value.h-8))}function l(e){if(i){n.value.w=Math.max(480,o.rw+e.clientX-o.px),n.value.h=Math.max(320,o.rh+e.clientY-o.py),c();return}n.value.x=r.rx+e.clientX-r.px,n.value.y=r.ry+e.clientY-r.py,c()}function u(){i=!1,window.removeEventListener(`mousemove`,l),window.removeEventListener(`mouseup`,u),xt(e,n.value)}function d(e){e.button===0&&(r={px:e.clientX,py:e.clientY,rx:n.value.x,ry:n.value.y},window.addEventListener(`mousemove`,l),window.addEventListener(`mouseup`,u))}function f(e){e.button===0&&(e.stopPropagation(),i=!0,o={px:e.clientX,py:e.clientY,rw:n.value.w,rh:n.value.h},window.addEventListener(`mousemove`,l),window.addEventListener(`mouseup`,u))}function p(){n.value.x=Math.max(16,(window.innerWidth-n.value.w)/2),n.value.y=Math.max(16,(window.innerHeight-n.value.h)/2),xt(e,n.value)}return me(()=>{window.removeEventListener(`mousemove`,l),window.removeEventListener(`mouseup`,u)}),{rect:n,panelStyle:s,startDrag:d,startResize:f,centerOnScreen:p,clampToViewport:c}}var Ct={js:`javascript`,mjs:`javascript`,cjs:`javascript`,jsx:`javascript`,ts:`typescript`,mts:`typescript`,cts:`typescript`,tsx:`typescript`,vue:`html`,py:`python`,pyw:`python`,rb:`ruby`,sh:`shell`,bash:`shell`,zsh:`shell`,fish:`shell`,php:`php`,phtml:`php`,java:`java`,go:`go`,rs:`rust`,c:`c`,cpp:`cpp`,cc:`cpp`,cxx:`cpp`,h:`c`,hpp:`cpp`,cs:`csharp`,swift:`swift`,kt:`kotlin`,kts:`kotlin`,html:`html`,htm:`html`,xhtml:`html`,css:`css`,scss:`scss`,sass:`scss`,less:`less`,json:`json`,jsonc:`json`,xml:`xml`,xsl:`xml`,xsd:`xml`,svg:`xml`,yaml:`yaml`,yml:`yaml`,toml:`toml`,md:`markdown`,mdx:`mdx`,sql:`sql`,graphql:`graphql`,gql:`graphql`,dockerfile:`dockerfile`,conf:`ini`,cfg:`ini`,cnf:`ini`,ini:`ini`,properties:`ini`,env:`ini`,tpl:`html`,twig:`twig`,blade:`php`,lua:`lua`,pl:`perl`,pm:`perl`,ps1:`powershell`,psm1:`powershell`,bat:`bat`,cmd:`bat`,r:`r`,dart:`dart`,scala:`scala`,clj:`clojure`,ex:`elixir`,exs:`elixir`,erl:`elixir`,hs:`haskell`,ml:`fsharp`,fs:`fsharp`,fsx:`fsharp`,vb:`vb`,pas:`pascal`,dockerignore:`plaintext`,gitignore:`plaintext`,gitattributes:`plaintext`,editorconfig:`ini`,htaccess:`shell`,service:`ini`,socket:`ini`,timer:`ini`,mount:`ini`,fstab:`ini`,crt:`plaintext`,pem:`plaintext`,key:`plaintext`,pub:`plaintext`,log:`plaintext`,lock:`json`},wt={dockerfile:`dockerfile`,makefile:`makefile`,gnumakefile:`makefile`,"cmakelists.txt":`plaintext`,gemfile:`ruby`,rakefile:`ruby`,vagrantfile:`ruby`,nginx:`nginx`,"nginx.conf":`nginx`,".env":`ini`,".env.example":`ini`,".env.local":`ini`,".gitignore":`plaintext`,".dockerignore":`plaintext`,".htaccess":`shell`,hosts:`plaintext`,crontab:`shell`,"supervisord.conf":`ini`,"php.ini":`ini`,"my.cnf":`ini`},Tt=[{title:`自动`,value:`auto`},{title:`Plain Text`,value:`plaintext`},{title:`PHP`,value:`php`},{title:`JavaScript`,value:`javascript`},{title:`TypeScript`,value:`typescript`},{title:`JSON`,value:`json`},{title:`HTML`,value:`html`},{title:`CSS`,value:`css`},{title:`SCSS`,value:`scss`},{title:`Shell`,value:`shell`},{title:`Python`,value:`python`},{title:`Go`,value:`go`},{title:`Rust`,value:`rust`},{title:`Java`,value:`java`},{title:`C`,value:`c`},{title:`C++`,value:`cpp`},{title:`C#`,value:`csharp`},{title:`SQL`,value:`sql`},{title:`YAML`,value:`yaml`},{title:`TOML`,value:`toml`},{title:`INI / Config`,value:`ini`},{title:`Markdown`,value:`markdown`},{title:`Dockerfile`,value:`dockerfile`},{title:`Nginx`,value:`nginx`},{title:`XML`,value:`xml`},{title:`Vue (HTML)`,value:`html`},{title:`Ruby`,value:`ruby`},{title:`Perl`,value:`perl`},{title:`PowerShell`,value:`powershell`}];function Et(e,t){let n=e.toLowerCase(),r=(t?.split(`/`).pop()??e).toLowerCase();if(wt[r])return wt[r];if(wt[n])return wt[n];if(n.endsWith(`.blade.php`))return`php`;let i=n.split(`.`);if(i.length>2&&i[i.length-1]===`php`&&i.slice(-2).join(`.`)===`blade.php`)return`php`;let a=n.includes(`.`)?n.split(`.`).pop()??``:``;return a&&Ct[a]?Ct[a]:r.includes(`nginx`)&&(r.endsWith(`.conf`)||r===`nginx.conf`)?`nginx`:`plaintext`}function Dt(e,t,n){return n&&n!==`auto`?n:Et(e,t)}var Ot={class:`text-truncate`,style:{"max-width":`130px`}},kt={key:0,class:`text-warning ml-1`,style:{"font-size":`10px`}},At={class:`file-editor-main d-flex flex-grow-1 min-h-0`},jt={class:`file-editor-content d-flex flex-column flex-grow-1 min-w-0 min-h-0`},Mt={class:`file-editor-body flex-grow-1 position-relative min-h-0`},Nt={class:`file-editor-status text-caption px-3 py-1 d-flex flex-wrap align-center ga-3`},Pt={class:`text-mono`},Ft={key:0,class:`text-primary`,style:{"font-size":`11px`}},It={class:`text-truncate flex-grow-1 text-medium-emphasis`},Lt={key:2,class:`text-warning`},Rt={key:0,class:`text-warning ml-1`},zt=`nexus_file_editor_float`,Bt=We(ye({__name:`FileEditorWorkbench`,props:{serverId:{},currentPath:{}},emits:[`saved`,`closed`,`path-change`,`paste-target`],setup(e,{expose:i,emit:o}){let s=n(),l=e,u=o,f=Ne(),m=Math.min(1120,Math.round(window.innerWidth*.88)),ee=Math.min(760,Math.round(window.innerHeight*.82)),{panelStyle:b,startDrag:C,startResize:te,clampToViewport:w}=St(zt,{x:Math.max(24,(window.innerWidth-m)/2),y:Math.max(24,(window.innerHeight-ee)/2),w:m,h:ee}),E=y([]),D=R(null),O=R(!1),k=R(!1),re=R(!1),ie=R(!1),M=R(!1),se=R(1),ce=R(1),le=R(l.currentPath||`/www/wwwroot`),ue=a(()=>{let e=Q(l.currentPath||`/www/wwwroot`);return e===`/`||e.startsWith(`/www/wwwroot`)?ct:e}),de=R(!0),pe=R(!1),I=R(null),z=R(),B=null,he=null,ge=0;function _e(){E.value=E.value.slice()}function ve(e,t){e.modified!==t&&(e.modified=t,_e())}let V=R(null),W=R(!1),G=a(()=>E.value.find(e=>e.id===D.value)??null),ye=a(()=>G.value?Dt(G.value.name,G.value.path,G.value.languageId):`plaintext`),be=a({get:()=>{let e=G.value?.languageId;return e==null||e===``?`auto`:String(e)},set:e=>{if(!G.value)return;let t=e==null?`auto`:String(e);G.value.languageId=t===`auto`?null:t}}),xe=a(()=>k.value?void 0:b.value),Se=a(()=>W.value?`关闭编辑器`:`关闭文件`),Ce=a(()=>{let e=(V.value?E.value.find(e=>e.id===V.value):E.value.find(e=>e.modified))?.name??`文件`;return W.value?`「${e}」等未保存的更改将丢失,确定吗?`:`「${e}」已修改但未保存,确定要关闭吗?`}),Te=a(()=>I.value?E.value.find(e=>e.id===I.value)?.name??``:``);function Ee(e){return e.replace(/\r\n/g,`
`).replace(/\r/g,`
`)}function De(e,t){let n=Ee(e);return t===`CRLF`?n.replace(/\n/g,`\r
`):n}function Oe(e){return Dt(e.name,e.path,e.languageId)}function ke(e){return`${l.serverId}:${Q(e)}`}function Ae(e){let t=dt(Q(e));t&&(le.value=t)}function je(e){le.value=Q(e),u(`path-change`,le.value)}function Pe(e){k.value||e.target.closest(`button, .v-tab, .v-btn, input, a`)||C(e)}function Le(){if(!B)return;let e=B.getPosition();se.value=e?.lineNumber??1,ce.value=e?.column??1}function Re(e=!1){if(!B||!G.value)return;let t=G.value,n=B.saveViewState();t.viewState=n?d(n):null;let r=()=>{!B||G.value?.id!==t.id||(t.content=Ee(B.getValue()),ve(t,t.content!==t.originalContent))};if(e){he&&=(clearTimeout(he),null),r();return}he&&clearTimeout(he),he=setTimeout(r,250)}async function ze(){let e=++ge;if(await fe(),await fe(),e!==ge||!G.value)return;qe();let t=(n=0)=>{if(e!==ge||!B)return;B.layout();let r=z.value;r&&(r.clientWidth<2||r.clientHeight<2)&&n<12&&setTimeout(()=>t(n+1),50)};requestAnimationFrame(()=>t())}function Be(){ge++,he&&=(clearTimeout(he),null),B?.dispose(),B=null,ie.value=!1}function Ve(){for(let e of E.value)e.model?.dispose();E.value=[],D.value=null,Be(),k.value=!1,O.value=!1}function He(e){let t=G.value;!t||!t.model||(t.languageId=e===`auto`||!e?null:e,s.editor.setModelLanguage(t.model,Oe(t)))}function We(e){if(B){if(!e.model){let t=Oe(e),n=Ee(e.content);e.model=d(s.editor.createModel(n,t,s.Uri.parse(`nexus://${l.serverId}${e.path}`)))}B.setModel(e.model),e.viewState&&B.restoreViewState(e.viewState),s.editor.setModelLanguage(e.model,Oe(e)),Ae(e.path),Le()}}function qe(){if(!z.value||!G.value)return;Be(),ie.value=!1;let e=G.value;if(!e.model){let t=Oe(e),n=Ee(e.content);e.model=d(s.editor.createModel(n,t,s.Uri.parse(`nexus://${l.serverId}${e.path}`)))}B=s.editor.create(z.value,{...r(),model:e.model,wordWrap:de.value?`on`:`off`,automaticLayout:!0}),e.viewState&&B.restoreViewState(e.viewState),B.onDidChangeModelContent(()=>{Re(),Le()}),B.onDidChangeCursorPosition(()=>{Le()}),B.addCommand(s.KeyMod.CtrlCmd|s.KeyCode.KeyS,()=>{it()}),B.addCommand(s.KeyCode.Escape,()=>{k.value&&=!1}),B.addCommand(s.KeyMod.Alt|s.KeyCode.KeyZ,()=>{rt()}),Ae(e.path),t(s),ie.value=!0,Le()}function Je(e){if(typeof e!=`string`||!e)return;Re(!0),D.value=e;let t=E.value.find(t=>t.id===e);t&&(B?We(t):ze())}function Ye(e){D.value=e,O.value=!1,fe(()=>{w();let t=E.value.find(t=>t.id===e);t&&(B?We(t):ze())})}function Xe(e){let t=ke(e.path),n=E.value.find(e=>e.id===t);if(n){D.value=t,O.value=!1,ze().then(()=>{B&&We(n)});return}try{let n=Ee(e.content),r=Dt(e.name,e.path,null),i=s.Uri.parse(`nexus://${l.serverId}${e.path}`),a=s.editor.getModel(i);a&&a.dispose();let o=d(s.editor.createModel(n,r,i));E.value=[...E.value,{id:t,path:e.path,name:e.name,content:n,originalContent:n,modified:!1,languageId:null,eol:e.eol,etag:e.etag,mtime:e.mtime,model:o,viewState:null}],D.value=t,O.value=!1,Ae(e.path),ze()}catch(e){f(e instanceof Error?e.message:`无法打开编辑器`,`error`),console.error(`[FileEditorWorkbench] openFile failed`,e)}}function Ze(e){let t=E.value.findIndex(t=>t.id===e);if(!(t<0)){if(E.value[t].model?.dispose(),E.value=E.value.filter(t=>t.id!==e),E.value.length===0){D.value=null,Be(),k.value=!1,O.value=!1,u(`closed`);return}if(D.value===e){let e=E.value[Math.min(t,E.value.length-1)];D.value=e.id,ze().then(()=>{let t=E.value.find(t=>t.id===e.id);t&&B&&We(t)})}}}function Qe(e){let t=E.value.find(t=>t.id===e);if(!t)return;if(D.value===e&&Re(!0),t.modified){V.value=e,W.value=!1,M.value=!0;return}let n=D.value===e;n&&Be(),Ze(e),n&&D.value&&ze()}function $e(){if(Re(!0),E.value.some(e=>e.modified)){V.value=null,W.value=!0,M.value=!0;return}Ve(),u(`closed`)}function et(){M.value=!1,V.value=null,W.value=!1}function tt(){if(M.value=!1,W.value)Ve(),u(`closed`);else if(V.value){let e=V.value,t=D.value===e;t&&Be(),Ze(e),t&&D.value&&ze()}V.value=null,W.value=!1}async function nt(){let e=W.value,t=V.value;if(await it(),M.value=!1,W.value=!1,V.value=null,e){E.value.some(e=>e.modified)||(Ve(),u(`closed`));return}if(t){let e=E.value.find(e=>e.id===t);if(e&&!e.modified){let e=D.value===t;e&&Be(),Ze(t),e&&D.value&&ze()}}}function rt(){de.value=!de.value,B?.updateOptions({wordWrap:de.value?`on`:`off`})}async function it(e=!1){if(!l.serverId){f(`请先选择服务器`,`error`);return}Re(!0);let t=G.value;if(!t||!t.modified)return;let n=De(B?.getValue()??t.content,t.eol);re.value=!0;try{let r=await X.post(`/sync/write-file`,{server_id:l.serverId,path:t.path,content:n,etag:e?null:t.etag}),i=Ee(n);t.content=i,t.originalContent=i,ve(t,!1),t.etag=r?.etag??null,_e(),f(`文件已保存`),u(`saved`,t.path)}catch(e){if(e instanceof h&&e.status===409){I.value=t.id,pe.value=!0;return}f(e instanceof h||e instanceof Error?e.message:`保存失败`,`error`)}finally{re.value=!1}}function at(){pe.value=!1,I.value=null}async function ot(){pe.value=!1;let e=I.value;I.value=null,!(!e||D.value!==e)&&await it(!0)}function st(){pe.value=!1;let e=I.value;if(I.value=null,!e)return;let t=E.value.find(t=>t.id===e);if(t){if(t.content=t.originalContent,ve(t,!1),t.model){let e=De(t.originalContent,t.eol);t.model.setValue(Ee(e))}_e(),f(`已放弃本地修改`,`info`)}}T(()=>l.currentPath,e=>{e&&(le.value=Q(e))}),T(k,()=>{fe(()=>B?.layout())}),T(O,e=>{e||fe(()=>B?.layout())});function lt(){return E.value.length>0}return i({openFile:Xe,hasOpenTabs:lt}),me(()=>{for(let e of E.value)e.model?.dispose();Be()}),(t,n)=>(L(),K(oe,null,[(L(),q(ne,{to:`body`},[E.value.length>0&&!O.value&&G.value?(L(),K(`div`,{key:0,class:Me([`file-editor-float`,{"file-editor-float--maximized":k.value}]),style:c(xe.value)},[U(x,{border:``,rounded:`lg`,class:`file-editor-panel d-flex flex-column h-100`},{default:J(()=>[F(`div`,{class:Me([`file-editor-toolbar d-flex align-center flex-shrink-0`,{"file-editor-toolbar--draggable":!k.value}]),onMousedown:Pe},[k.value?H(``,!0):(L(),q(N,{key:0,size:`16`,class:`ml-2 mr-1 text-disabled file-editor-drag-hint`,onMousedown:n[0]||=j(()=>{},[`stop`])},{default:J(()=>[...n[19]||=[P(` mdi-drag `,-1)]]),_:1})),U(Ke,{"model-value":D.value??void 0,density:`compact`,"show-arrows":``,class:`file-editor-tabs flex-grow-1 min-w-0`,"onUpdate:modelValue":Je,onMousedown:n[1]||=j(()=>{},[`stop`])},{default:J(()=>[(L(!0),K(oe,null,we(E.value,e=>(L(),q(Ge,{key:e.id,value:e.id,class:`text-none px-2`},{default:J(()=>[F(`span`,Ot,A(e.name),1),e.modified?(L(),K(`span`,kt,`●`)):H(``,!0),U(Y,{icon:`mdi-close`,size:`x-small`,variant:`text`,class:`ml-1 opacity-60`,density:`compact`,onClick:j(t=>Qe(e.id),[`stop`])},null,8,[`onClick`])]),_:2},1032,[`value`]))),128))]),_:1},8,[`model-value`]),U(v,{vertical:``,class:`mx-1`,style:{height:`20px`,"align-self":`center`},onMousedown:n[2]||=j(()=>{},[`stop`])}),U(Ie,{modelValue:be.value,"onUpdate:modelValue":[n[3]||=e=>be.value=e,He],items:_(Tt),"item-title":`title`,"item-value":`value`,density:`compact`,variant:`plain`,"hide-details":``,class:`file-editor-lang-select flex-shrink-0`,onMousedown:n[4]||=j(()=>{},[`stop`])},null,8,[`modelValue`,`items`]),U(Y,{size:`small`,variant:`text`,color:de.value?`primary`:void 0,title:de.value?`关闭自动换行 (Alt+Z)`:`开启自动换行 (Alt+Z)`,density:`compact`,class:`flex-shrink-0 text-none px-2`,onMousedown:n[5]||=j(()=>{},[`stop`]),onClick:rt},{default:J(()=>[...n[20]||=[P(` 自动换行 `,-1)]]),_:1},8,[`color`,`title`]),U(v,{vertical:``,class:`mx-1`,style:{height:`20px`,"align-self":`center`},onMousedown:n[6]||=j(()=>{},[`stop`])}),U(Y,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-save`,loading:re.value,disabled:!G.value?.modified||!ie.value,class:`flex-shrink-0 mr-1`,onMousedown:n[7]||=j(()=>{},[`stop`]),onClick:it},{default:J(()=>[...n[21]||=[P(` 保存 `,-1)]]),_:1},8,[`loading`,`disabled`]),U(Y,{size:`small`,variant:`text`,icon:k.value?`mdi-fullscreen-exit`:`mdi-fullscreen`,title:k.value?`退出全屏 (Esc)`:`全屏`,density:`compact`,onMousedown:n[8]||=j(()=>{},[`stop`]),onClick:n[9]||=e=>k.value=!k.value},null,8,[`icon`,`title`]),U(Y,{size:`small`,variant:`text`,icon:`mdi-window-minimize`,title:`最小化`,density:`compact`,onMousedown:n[10]||=j(()=>{},[`stop`]),onClick:n[11]||=e=>O.value=!0}),U(Y,{size:`small`,variant:`text`,icon:`mdi-close`,title:`关闭编辑器`,density:`compact`,class:`mr-1`,onMousedown:n[12]||=j(()=>{},[`stop`]),onClick:$e})],34),F(`div`,At,[F(`aside`,{class:`file-editor-sidebar flex-shrink-0`,onMousedown:n[14]||=j(()=>{},[`stop`])},[U(yt,{embedded:``,"server-id":e.serverId||null,"root-path":ue.value,"current-path":le.value,onNavigate:je,onPasteTarget:n[13]||=e=>u(`paste-target`,e)},null,8,[`server-id`,`root-path`,`current-path`])],32),F(`div`,jt,[F(`div`,Mt,[ie.value?H(``,!0):(L(),q(ae,{key:0,indeterminate:``,absolute:``,class:`file-editor-progress`})),F(`div`,{ref_key:`editorHost`,ref:z,class:`file-editor-host`},null,512)]),F(`div`,Nt,[F(`span`,Pt,A(se.value)+`:`+A(ce.value),1),U(v,{vertical:``,style:{height:`12px`}}),F(`span`,null,A(ye.value),1),U(v,{vertical:``,style:{height:`12px`}}),de.value?(L(),K(`span`,Ft,`换行`)):H(``,!0),de.value?(L(),q(v,{key:1,vertical:``,style:{height:`12px`}})):H(``,!0),F(`span`,It,A(G.value?.path??``),1),G.value?.modified?(L(),K(`span`,Lt,`未保存`)):H(``,!0)])])]),k.value?H(``,!0):(L(),K(`div`,{key:0,class:`file-editor-resize`,title:`拖动调整大小`,onMousedown:n[15]||=j((...e)=>_(te)&&_(te)(...e),[`stop`])},null,32))]),_:1})],6)):H(``,!0),E.value.length>0&&O.value?(L(),q(x,{key:1,border:``,rounded:`lg`,class:`file-editor-dock`},{default:J(()=>[n[22]||=F(`span`,{class:`text-caption text-medium-emphasis mr-2`},`编辑器`,-1),(L(!0),K(oe,null,we(E.value,e=>(L(),q(Fe,{key:e.id,size:`small`,color:e.id===D.value?`primary`:void 0,variant:`tonal`,class:`cursor-pointer`,onClick:t=>Ye(e.id)},{default:J(()=>[P(A(e.name)+` `,1),e.modified?(L(),K(`span`,Rt,`●`)):H(``,!0)]),_:2},1032,[`color`,`onClick`]))),128)),U(Z),U(Y,{size:`x-small`,variant:`text`,icon:`mdi-dock-window`,title:`展开`,onClick:n[16]||=e=>O.value=!1}),U(Y,{size:`x-small`,variant:`text`,icon:`mdi-close`,title:`关闭全部`,onClick:$e})]),_:1})):H(``,!0)])),U(Ue,{modelValue:M.value,"onUpdate:modelValue":n[17]||=e=>M.value=e,"max-width":`400`},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,null,{default:J(()=>[P(A(Se.value),1)]),_:1}),U(S,null,{default:J(()=>[P(A(Ce.value),1)]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:et},{default:J(()=>[...n[23]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`error`,variant:`flat`,onClick:tt},{default:J(()=>[...n[24]||=[P(`不保存`,-1)]]),_:1}),U(Y,{color:`primary`,variant:`flat`,onClick:nt},{default:J(()=>[...n[25]||=[P(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),U(Ue,{modelValue:pe.value,"onUpdate:modelValue":n[18]||=e=>pe.value=e,"max-width":`440`,persistent:``},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,{class:`text-warning`},{default:J(()=>[U(N,{start:``},{default:J(()=>[...n[26]||=[P(`mdi-alert-outline`,-1)]]),_:1}),n[27]||=P(` 文件冲突 `,-1)]),_:1}),U(S,null,{default:J(()=>[P(` 「`+A(Te.value)+`」已被外部修改。`,1),n[28]||=F(`br`,null,null,-1),n[29]||=F(`strong`,null,`覆盖`,-1),n[30]||=P(`会以当前编辑内容覆盖服务器版本;`,-1),n[31]||=F(`strong`,null,`放弃`,-1),n[32]||=P(`会丢弃本地修改。 `,-1)]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:at},{default:J(()=>[...n[33]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`error`,variant:`flat`,onClick:st},{default:J(()=>[...n[34]||=[P(`放弃本地修改`,-1)]]),_:1}),U(Y,{color:`warning`,variant:`flat`,onClick:ot},{default:J(()=>[...n[35]||=[P(`强制覆盖`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-509107ff`]]);function Vt(e){return e==null?``:String(e).trim()}function Ht(e){if(e.type===`symlink`)return`—`;let t=Vt(e.owner),n=Vt(e.group);return t?!n||n===t?t:`${t}:${n}`:`—`}function Ut(e){if(e===`root`)return`warning`}function Wt(e){let t=[];e.permissions&&t.push(e.permissions),e.mode_octal&&t.push(e.mode_octal);let n=Vt(e.owner),r=Vt(e.group);return n&&t.push(r&&r!==n?`${n}:${r}`:n),t.join(` · `)||`—`}var Gt=[{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`}],Kt=`docs/deploy/nexus-files-sudoers.example`;function qt(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 Jt(e,t){if(!t||t===`root`||e.type!==`file`)return!1;let n=e.permissions??``;if(n.length<10)return!1;let r=Vt(e.owner),i=Vt(e.group),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 Yt(){return`目标机安装示例:${Kt}(复制到 /etc/sudoers.d/nexus-files 后执行 visudo -cf 校验)`}function Xt(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?` ${Yt()}`:``;return{type:!e.canSudo||e.filesElevation===`off`?`error`:`warning`,text:`${t.join(` `)}${r}`}}var Zt={key:0,class:`text-body-2 mb-3 text-medium-emphasis`},Qt={key:1,class:`text-caption mb-4`},$t={class:`d-flex flex-wrap ga-2 mb-4`},en={class:`d-flex align-center flex-wrap ga-2 mb-2`},tn={class:`text-body-2`},nn={key:0,class:`text-caption mt-1`},rn={class:`text-caption text-medium-emphasis mb-0`},an=ye({__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=R(``),o=R(``),s=R(``),c=R(null),l=R(!1),u=R(!1),d=a(()=>n.file?.type===`directory`),f=a(()=>n.file?.name??``),m=a(()=>n.file?Wt(n.file):``),ee=a(()=>{let e=n.file?.type===`directory`?`directory`:`file`;return Gt.filter(t=>t.for===e||t.for===`file`)}),h=a(()=>c.value?c.value.is_root||c.value.can_sudo_nopasswd&&c.value.whitelist_ok?`success`:c.value.can_sudo_nopasswd?`warning`:`error`:`info`);T(()=>[n.modelValue,n.file],([e,t])=>{!e||!t||(i.value=t.mode_octal||``,o.value=t.owner||``,s.value=t.group&&t.group!==t.owner?t.group:``,u.value=!1,c.value=null,n.serverId&&b())});function y(e){return e===`off`?`关闭提权`:e===`always_sudo`?`始终 sudo`:`自动 sudo`}async function b(){if(n.serverId){l.value=!0;try{c.value=await X.get(`/servers/${n.serverId}/files-capability`)}catch(e){c.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{l.value=!1}}}function C(e){return t=>!!String(t||``).trim()||`${e}不能为空`}function te(e){return/^[0-7]{3,4}$/.test(String(e||``).trim())||`格式: 34 位八进制`}let ne=/^[a-zA-Z0-9_.-]+$/;function w(e){let t=String(e||``).trim();return t?ne.test(t)||`仅允许字母、数字、._-`:!0}function E(e){let t=String(e||``).trim();return t?o.value.trim()?ne.test(t)||`仅允许字母、数字、._-`:`请先填写属主`:!0}function D(e){i.value=e}function O(){let e=i.value.trim();if(!/^[0-7]{3,4}$/.test(e))return;let t=o.value.trim(),a=s.value.trim(),c=d.value&&u.value;if(c){let t=n.file?.name??`该目录`;if(!window.confirm(`确认对目录「${t}」及其全部子项递归应用权限 ${e}?此操作影响范围大且不可自动撤销。`))return}r(`apply`,{mode:e,owner:t||void 0,group:a||void 0,recursive:c||void 0})}return(t,n)=>(L(),q(Ue,{"model-value":e.modelValue,"max-width":`520`,"onUpdate:modelValue":n[5]||=e=>r(`update:modelValue`,e)},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,null,{default:J(()=>[...n[6]||=[P(`修改权限`,-1)]]),_:1}),U(S,null,{default:J(()=>[f.value?(L(),K(`p`,Zt,A(f.value),1)):H(``,!0),m.value?(L(),K(`p`,Qt,` 当前:`+A(m.value),1)):H(``,!0),F(`div`,$t,[(L(!0),K(oe,null,we(ee.value,e=>(L(),q(Fe,{key:e.mode+e.label,size:`small`,variant:`tonal`,color:`primary`,onClick:t=>D(e.mode)},{default:J(()=>[P(A(e.label),1)]),_:2},1032,[`onClick`]))),128))]),U(be,{modelValue:i.value,"onUpdate:modelValue":n[0]||=e=>i.value=e,label:`八进制权限`,variant:`outlined`,density:`compact`,placeholder:`644 / 755`,rules:[C(`权限`),te],class:`mb-2`,onKeydown:M(O,[`enter`])},null,8,[`modelValue`,`rules`]),U(be,{modelValue:o.value,"onUpdate:modelValue":n[1]||=e=>o.value=e,label:`属主(可选)`,variant:`outlined`,density:`compact`,placeholder:`www`,rules:[w],class:`mb-2`},null,8,[`modelValue`,`rules`]),U(be,{modelValue:s.value,"onUpdate:modelValue":n[2]||=e=>s.value=e,label:`属组(可选)`,variant:`outlined`,density:`compact`,placeholder:`www`,rules:[E],class:`mb-2`},null,8,[`modelValue`,`rules`]),d.value?(L(),q(Le,{key:2,modelValue:u.value,"onUpdate:modelValue":n[3]||=e=>u.value=e,label:`同时修改子项(递归 chmod/chown`,density:`compact`,"hide-details":``,color:`warning`,class:`mb-2`},null,8,[`modelValue`])):H(``,!0),U(v,{class:`my-4`}),F(`div`,en,[n[8]||=F(`span`,{class:`text-caption text-medium-emphasis`},`提权能力`,-1),U(Y,{size:`small`,variant:`tonal`,loading:l.value,disabled:!e.serverId,onClick:b},{default:J(()=>[...n[7]||=[P(` 检测提权能力 `,-1)]]),_:1},8,[`loading`,`disabled`])]),c.value?(L(),q(Je,{key:3,type:h.value,variant:`tonal`,density:`compact`,class:`mb-2`},{default:J(()=>[F(`div`,tn,A(c.value.message),1),c.value.ssh_user?(L(),K(`div`,nn,` SSH 用户:`+A(c.value.ssh_user)+` · 策略:`+A(y(c.value.files_elevation)),1)):H(``,!0)]),_:1},8,[`type`])):H(``,!0),F(`p`,rn,[n[9]||=P(` 非 root 用户写/chmod 失败时将按服务器策略尝试 `,-1),n[10]||=F(`code`,null,`sudo -n`,-1),P(`。 `+A(_(Yt)()),1)])]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:n[4]||=e=>r(`update:modelValue`,!1)},{default:J(()=>[...n[11]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`primary`,variant:`flat`,loading:e.loading,onClick:O},{default:J(()=>[...n[12]||=[P(`应用`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),on={class:`text-body-2 mb-3`},sn={class:`text-body-2 mb-2 text-truncate`},cn={class:`text-truncate`},ln={key:1,class:`files-preview-body text-body-2`},un=We(ye({__name:`FilesDialogs`,setup(e){let t=Ze();return(e,n)=>(L(),K(oe,null,[U(Ue,{modelValue:_(t).showUpload,"onUpdate:modelValue":n[2]||=e=>_(t).showUpload=e,"max-width":`500`},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,null,{default:J(()=>[...n[25]||=[P(`上传文件`,-1)]]),_:1}),U(S,null,{default:J(()=>[U(qe,{modelValue:_(t).uploadFiles,"onUpdate:modelValue":n[0]||=e=>_(t).uploadFiles=e,label:`选择文件`,variant:`outlined`,multiple:``,"show-size":``},null,8,[`modelValue`])]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:n[1]||=e=>_(t).showUpload=!1},{default:J(()=>[...n[26]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`primary`,variant:`flat`,loading:_(t).uploading,onClick:_(t).doUpload},{default:J(()=>[...n[27]||=[P(`上传`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),U(Ue,{modelValue:_(t).showNewFile,"onUpdate:modelValue":n[5]||=e=>_(t).showNewFile=e,"max-width":`400`},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,null,{default:J(()=>[...n[28]||=[P(`新建文件`,-1)]]),_:1}),U(S,null,{default:J(()=>[U(be,{modelValue:_(t).newFileName,"onUpdate:modelValue":n[3]||=e=>_(t).newFileName=e,label:`文件名`,variant:`outlined`,density:`compact`,rules:[_(t).validatePathSegment],placeholder:`example.conf`,autofocus:``,onKeydown:M(_(t).doNewFile,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:n[4]||=e=>_(t).showNewFile=!1},{default:J(()=>[...n[29]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`primary`,variant:`flat`,loading:_(t).actionLoading,onClick:_(t).doNewFile},{default:J(()=>[...n[30]||=[P(`创建`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),U(Ue,{modelValue:_(t).showMkdir,"onUpdate:modelValue":n[8]||=e=>_(t).showMkdir=e,"max-width":`400`},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,null,{default:J(()=>[...n[31]||=[P(`新建目录`,-1)]]),_:1}),U(S,null,{default:J(()=>[U(be,{modelValue:_(t).mkdirName,"onUpdate:modelValue":n[6]||=e=>_(t).mkdirName=e,label:`目录名`,variant:`outlined`,density:`compact`,rules:[_(t).validatePathSegment],onKeydown:M(_(t).doMkdir,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:n[7]||=e=>_(t).showMkdir=!1},{default:J(()=>[...n[32]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`primary`,variant:`flat`,onClick:_(t).doMkdir},{default:J(()=>[...n[33]||=[P(`创建`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),U(Ue,{modelValue:_(t).showFileDelete,"onUpdate:modelValue":n[10]||=e=>_(t).showFileDelete=e,"max-width":`400`},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,null,{default:J(()=>[...n[34]||=[P(`确认删除`,-1)]]),_:1}),U(S,null,{default:J(()=>[n[35]||=P(` 确定要删除 `,-1),F(`strong`,null,A(_(t).deletingFile?.name),1),n[36]||=P(` 吗? `,-1)]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:n[9]||=e=>_(t).showFileDelete=!1},{default:J(()=>[...n[37]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`error`,variant:`flat`,onClick:_(t).doDeleteFile},{default:J(()=>[...n[38]||=[P(`删除`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),U(Ue,{modelValue:_(t).showRename,"onUpdate:modelValue":n[13]||=e=>_(t).showRename=e,"max-width":`400`},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,null,{default:J(()=>[...n[39]||=[P(`重命名`,-1)]]),_:1}),U(S,null,{default:J(()=>[U(be,{modelValue:_(t).newName,"onUpdate:modelValue":n[11]||=e=>_(t).newName=e,label:`新名称`,variant:`outlined`,density:`compact`,rules:[_(t).required(`名称`)],autofocus:``,onKeydown:M(_(t).doRename,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:n[12]||=e=>_(t).showRename=!1},{default:J(()=>[...n[40]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`primary`,variant:`flat`,onClick:_(t).doRename},{default:J(()=>[...n[41]||=[P(`确定`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),U(an,{modelValue:_(t).showChmod,"onUpdate:modelValue":n[14]||=e=>_(t).showChmod=e,file:_(t).chmodFile,"server-id":_(t).selectedServer,loading:_(t).chmodLoading,onApply:_(t).doChmod},null,8,[`modelValue`,`file`,`server-id`,`loading`,`onApply`]),U(Ue,{modelValue:_(t).showCompress,"onUpdate:modelValue":n[18]||=e=>_(t).showCompress=e,"max-width":`440`},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,null,{default:J(()=>[...n[42]||=[P(`压缩`,-1)]]),_:1}),U(S,null,{default:J(()=>[F(`p`,on,`将压缩 `+A(_(t).compressPaths.length)+` 项到当前目录`,1),U(be,{modelValue:_(t).compressDest,"onUpdate:modelValue":n[15]||=e=>_(t).compressDest=e,label:`压缩包路径`,variant:`outlined`,density:`compact`},null,8,[`modelValue`]),U(Ie,{modelValue:_(t).compressFormat,"onUpdate:modelValue":n[16]||=e=>_(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}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:n[17]||=e=>_(t).showCompress=!1},{default:J(()=>[...n[43]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`primary`,variant:`flat`,loading:_(t).actionLoading,onClick:_(t).doCompress},{default:J(()=>[...n[44]||=[P(`压缩`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),U(Ue,{modelValue:_(t).showDecompress,"onUpdate:modelValue":n[21]||=e=>_(t).showDecompress=e,"max-width":`440`},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,null,{default:J(()=>[...n[45]||=[P(`解压`,-1)]]),_:1}),U(S,null,{default:J(()=>[F(`p`,sn,A(_(t).decompressSource),1),U(be,{modelValue:_(t).decompressDest,"onUpdate:modelValue":n[19]||=e=>_(t).decompressDest=e,label:`解压到目录`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:n[20]||=e=>_(t).showDecompress=!1},{default:J(()=>[...n[46]||=[P(`取消`,-1)]]),_:1}),U(Y,{color:`primary`,variant:`flat`,loading:_(t).actionLoading,onClick:_(t).doDecompress},{default:J(()=>[...n[47]||=[P(`解压`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),U(Ue,{modelValue:_(t).showPreview,"onUpdate:modelValue":n[24]||=e=>_(t).showPreview=e,"max-width":`900`,scrollable:``},{default:J(()=>[U(x,{border:``},{default:J(()=>[U(p,{class:`d-flex align-center`},{default:J(()=>[F(`span`,cn,A(_(t).previewTitle),1),U(Z),U(Y,{icon:`mdi-close`,variant:`text`,onClick:n[22]||=e=>_(t).showPreview=!1})]),_:1}),U(v),U(S,{style:{"max-height":`70vh`}},{default:J(()=>[_(t).previewLoading?(L(),q(ae,{key:0,indeterminate:``,class:`mb-2`})):(L(),K(`pre`,ln,A(_(t).previewContent),1))]),_:1}),U(g,null,{default:J(()=>[U(Z),U(Y,{variant:`text`,onClick:n[23]||=e=>_(t).showPreview=!1},{default:J(()=>[...n[48]||=[P(`关闭`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-110ea120`]]),dn=`nexus:files:last_server_id`,fn=`nexus:files-hint-dismissed`,pn=[25,50,100,250,-1],mn=5e3,hn=W({id:String,interactive:Boolean,text:String,...je(le({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`),gn=he()({name:`VTooltip`,props:hn(),emits:{"update:modelValue":e=>!0},setup(e,{slots:t}){let n=pe(e,`modelValue`),{scopeId:r}=De(),i=Oe(),o=C(()=>e.id||`v-tooltip-${i}`),s=R(),c=a(()=>e.location.split(` `).length>1?e.location:e.location+` center`),l=a(()=>e.origin===`auto`||e.origin===`overlap`||e.origin.split(` `).length>1||e.location.split(` `).length>1?e.origin:e.origin+` center`),u=C(()=>e.transition==null?n.value?`scale-transition`:`fade-transition`:e.transition),d=a(()=>Se({"aria-describedby":o.value},e.activatorProps));return G(()=>{let i=Ae.filterProps(e);return U(Ae,Se({ref:s,class:[`v-tooltip`,{"v-tooltip--interactive":e.interactive},e.class],style:e.style,id:o.value},i,{modelValue:n.value,"onUpdate:modelValue":e=>n.value=e,transition:u.value,absolute:!0,location:c.value,origin:l.value,role:`tooltip`,activatorProps:d.value,_disableGlobalStack:!0},r),{activator:t.activator,default:(...n)=>t.default?.(...n)??e.text})}),Ce({},s)}}),_n={class:`d-flex align-center ga-2 min-w-0`},vn={class:`min-w-0`},yn={key:0,class:`text-caption text-medium-emphasis text-truncate`},bn={class:`text-medium-emphasis`},xn={class:`text-medium-emphasis`},Sn={class:`files-row-actions`},Cn={key:0,class:`text-center text-medium-emphasis py-8`},wn={key:0,class:`text-caption mt-2 text-disabled`},Tn=We(ye({__name:`FilesList`,setup(e){let t=Ze();return(e,n)=>(L(),K(oe,null,[U(x,{elevation:`0`,border:``,rounded:`lg`,class:Me([`position-relative`,{"files-drop-active":_(t).dropActive}]),onDragenter:n[1]||=j(e=>_(t).dropActive=!0,[`prevent`]),onDragover:n[2]||=j(e=>_(t).dropActive=!0,[`prevent`]),onDragleave:n[3]||=j(e=>_(t).dropActive=!1,[`prevent`]),onDrop:j(_(t).onDropFiles,[`prevent`])},{default:J(()=>[_(t).loadingVisible?(L(),q(ae,{key:0,indeterminate:``,color:`primary`,height:`2`,class:`files-table-progress`})):H(``,!0),U(i,{modelValue:_(t).selectedFiles,"onUpdate:modelValue":n[0]||=e=>_(t).selectedFiles=e,items:_(t).displayedFiles,headers:_(t).fileHeaders,loading:_(t).loadingVisible,"items-per-page":_(50),"items-per-page-options":[..._(pn)],"show-select":``,"return-object":``,hover:``,density:`comfortable`,"item-value":`name`,"row-props":_(t).fileRowProps},{"item.name":J(({item:e})=>[F(`div`,_n,[U(N,{color:_(t).entryIconColor(e),size:`20`},{default:J(()=>[P(A(_(t).entryIcon(e)),1)]),_:2},1032,[`color`]),_(t).isEntryLikelyUnreadable(e,_(t).sshUserForFiles)?(L(),q(N,{key:0,size:`18`,color:`warning`,title:`当前 SSH 用户可能无法读取`},{default:J(()=>[...n[20]||=[P(` mdi-shield-lock `,-1)]]),_:1})):H(``,!0),F(`div`,vn,[F(`span`,{class:Me({"font-weight-medium":e.type===`directory`})},A(e.name),3),e.type===`symlink`&&e.link_target?(L(),K(`div`,yn,` → `+A(e.link_target),1)):H(``,!0)])])]),"item.owner":J(({item:e})=>[U(gn,{text:_(t).permissionTooltip(e),location:`top`},{activator:J(({props:n})=>[U(Fe,Se(n,{size:`small`,variant:`tonal`,color:_(t).ownerChipColor(e.owner||``),class:`text-none`}),{default:J(()=>[P(A(_(t).formatOwnerChip(e)),1)]),_:2},1040,[`color`])]),_:2},1032,[`text`])]),"item.size":J(({item:e})=>[F(`span`,bn,A(e.type===`directory`?`—`:_(t).formatSize(e.size)),1)]),"item.modified":J(({item:e})=>[F(`span`,xn,A(e.modified||`—`),1)]),"item.actions":J(({item:e})=>[F(`div`,Sn,[_(t).isRegularFile(e)?(L(),q(Y,{key:0,variant:`outlined`,size:`small`,color:`primary`,class:`files-action-btn`,"prepend-icon":`mdi-pencil-outline`,onClick:j(n=>_(t).editFile(e),[`stop`])},{default:J(()=>[...n[21]||=[P(` 编辑 `,-1)]]),_:1},8,[`onClick`])):H(``,!0),_(t).isRegularFile(e)?(L(),q(Y,{key:1,variant:`outlined`,size:`small`,class:`files-action-btn`,"prepend-icon":`mdi-eye-outline`,onClick:j(n=>_(t).previewFile(e),[`stop`])},{default:J(()=>[...n[22]||=[P(` 查看 `,-1)]]),_:1},8,[`onClick`])):H(``,!0),_(t).isRegularFile(e)?(L(),q(Y,{key:2,variant:`outlined`,size:`small`,class:`files-action-btn`,"prepend-icon":`mdi-download-outline`,onClick:j(n=>_(t).downloadFile(e),[`stop`])},{default:J(()=>[...n[23]||=[P(` 下载 `,-1)]]),_:1},8,[`onClick`])):H(``,!0),U(Y,{variant:`outlined`,size:`small`,color:`error`,class:`files-action-btn`,"prepend-icon":`mdi-delete-outline`,onClick:j(n=>_(t).confirmDeleteFile(e),[`stop`])},{default:J(()=>[...n[24]||=[P(` 删除 `,-1)]]),_:1},8,[`onClick`])])]),"no-data":J(()=>[_(t).pageReady&&!_(t).loading&&!_(t).loadingVisible&&_(t).files.length===0?(L(),K(`div`,Cn,[U(N,{size:`40`,class:`mb-2`},{default:J(()=>[...n[25]||=[P(`mdi-folder-open-outline`,-1)]]),_:1}),F(`div`,null,A(_(t).emptyHint),1),_(t).selectedServer?(L(),K(`div`,wn,` 单击目录进入 · 双击文件编辑 · Ctrl+A 全选 · Ctrl+C/V 复制粘贴 `)):H(``,!0)])):H(``,!0)]),_:1},8,[`modelValue`,`items`,`headers`,`loading`,`items-per-page`,`items-per-page-options`,`row-props`])]),_:1},8,[`class`,`onDrop`]),U(se,{modelValue:_(t).showContextMenu,"onUpdate:modelValue":n[19]||=e=>_(t).showContextMenu=e,target:[_(t).contextX,_(t).contextY],location:`bottom start`},{default:J(()=>[U(Te,{density:`compact`,nav:``},{default:J(()=>[_(t).contextFile&&_(t).contextFile.type===`directory`?(L(),q(z,{key:0,"prepend-icon":`mdi-folder-open`,onClick:n[4]||=e=>_(t).contextAction(`open`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[26]||=[P(`打开`,-1)]]),_:1})]),_:1})):H(``,!0),_(t).contextFile&&_(t).isRegularFile(_(t).contextFile)?(L(),q(z,{key:1,"prepend-icon":`mdi-pencil`,onClick:n[5]||=e=>_(t).contextAction(`edit`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[27]||=[P(`编辑`,-1)]]),_:1})]),_:1})):H(``,!0),_(t).contextFile&&_(t).isRegularFile(_(t).contextFile)?(L(),q(z,{key:2,"prepend-icon":`mdi-eye`,onClick:n[6]||=e=>_(t).contextAction(`preview`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[28]||=[P(`查看`,-1)]]),_:1})]),_:1})):H(``,!0),_(t).contextFile&&_(t).isRegularFile(_(t).contextFile)?(L(),q(z,{key:3,"prepend-icon":`mdi-download`,onClick:n[7]||=e=>_(t).contextAction(`download`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[29]||=[P(`下载`,-1)]]),_:1})]),_:1})):H(``,!0),_(t).contextFile?(L(),q(z,{key:4,"prepend-icon":`mdi-content-copy`,onClick:n[8]||=e=>_(t).contextAction(`copy`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[30]||=[P(`复制 (Ctrl+C)`,-1)]]),_:1})]),_:1})):H(``,!0),_(t).contextFile?(L(),q(z,{key:5,"prepend-icon":`mdi-content-cut`,onClick:n[9]||=e=>_(t).contextAction(`cut`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[31]||=[P(`剪切 (Ctrl+X)`,-1)]]),_:1})]),_:1})):H(``,!0),U(z,{"prepend-icon":`mdi-content-paste`,disabled:!_(t).canPasteHere,onClick:n[10]||=e=>_(t).contextAction(`paste`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[32]||=[P(`粘贴到当前目录 (Ctrl+V)`,-1)]]),_:1})]),_:1},8,[`disabled`]),_(t).contextFile?.type===`directory`&&_(t).canPasteHere?(L(),q(z,{key:6,"prepend-icon":`mdi-folder-arrow-down`,onClick:n[11]||=e=>_(t).contextAction(`pasteInto`)},{default:J(()=>[U(o,null,{default:J(()=>[P(`粘贴到「`+A(_(t).contextFile.name)+`」`,1)]),_:1})]),_:1})):H(``,!0),U(z,{"prepend-icon":`mdi-link-variant`,onClick:n[12]||=e=>_(t).contextAction(`copyPath`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[33]||=[P(`复制路径`,-1)]]),_:1})]),_:1}),U(z,{"prepend-icon":`mdi-console`,onClick:n[13]||=e=>_(t).contextAction(`terminal`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[34]||=[P(`终端`,-1)]]),_:1})]),_:1}),U(v),_(t).contextFile&&(_(t).isRegularFile(_(t).contextFile)||_(t).contextFile.type===`directory`)?(L(),q(z,{key:7,"prepend-icon":`mdi-zip-box`,onClick:n[14]||=e=>_(t).contextAction(`compress`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[35]||=[P(`压缩`,-1)]]),_:1})]),_:1})):H(``,!0),_(t).contextFile&&_(t).isArchiveName(_(t).contextFile.name)?(L(),q(z,{key:8,"prepend-icon":`mdi-package-up`,onClick:n[15]||=e=>_(t).contextAction(`decompress`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[36]||=[P(`解压`,-1)]]),_:1})]),_:1})):H(``,!0),U(v),U(z,{"prepend-icon":`mdi-file-rename-box`,onClick:n[16]||=e=>_(t).contextAction(`rename`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[37]||=[P(`重命名`,-1)]]),_:1})]),_:1}),U(z,{"prepend-icon":`mdi-lock`,onClick:n[17]||=e=>_(t).contextAction(`chmod`)},{default:J(()=>[U(o,null,{default:J(()=>[...n[38]||=[P(`修改权限`,-1)]]),_:1})]),_:1}),U(v),U(z,{"prepend-icon":`mdi-delete`,onClick:n[18]||=e=>_(t).contextAction(`delete`)},{default:J(()=>[U(o,{class:`text-error`},{default:J(()=>[...n[39]||=[P(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`,`target`])],64))}}),[[`__scopeId`,`data-v-964388ad`]]),En={class:`d-flex flex-wrap align-center justify-space-between ga-2`},Dn=ye({__name:`FilesPermissionAlert`,setup(e){let t=Ze();return(e,n)=>_(t).filesAccessHint?(L(),q(Je,{key:0,type:_(t).filesAccessHint.type,variant:`tonal`,closable:``,prominent:``,density:`comfortable`,class:`mb-4`,icon:`mdi-shield-lock-outline`,"onClick:close":_(t).dismissFilesAccessHint},{default:J(()=>[F(`div`,En,[F(`span`,null,A(_(t).filesAccessHint.text.split(`目标机安装示例`)[0].trim()),1),_(t).sshUserForFiles&&_(t).sshUserForFiles!==`root`?(L(),q(Y,{key:0,size:`small`,variant:`flat`,color:`primary`,"prepend-icon":`mdi-auto-fix`,loading:_(t).setupSudoLoading,disabled:_(t).setupSudoDone,onClick:j(_(t).setupFilesSudo,[`stop`])},{default:J(()=>[P(A(_(t).setupSudoDone?`已配置`:`一键配置 sudo 权限`),1)]),_:1},8,[`loading`,`disabled`,`onClick`])):H(``,!0)])]),_:1},8,[`type`,`onClick:close`])):H(``,!0)}}),On={class:`text-caption text-medium-emphasis mb-2 d-flex flex-wrap align-center ga-2`},kn=ye({__name:`FilesStatusBar`,setup(e){let t=Ze();return(e,n)=>(L(),K(`div`,On,[F(`span`,null,A(_(t).statusSummary),1),_(t).browseError?(L(),q(Fe,{key:0,size:`x-small`,color:`warning`,variant:`tonal`},{default:J(()=>[P(A(_(t).browseError),1)]),_:1})):H(``,!0),_(t).hasClipboard?(L(),q(Fe,{key:1,size:`x-small`,color:`info`,variant:`tonal`,class:`cursor-pointer`,onClick:n[0]||=()=>_(t).pasteClipboard()},{default:J(()=>[P(A(_(t).clipboardSummary)+` → `+A(_(t).pasteDestLabel)+` · Ctrl+V 粘贴 `,1)]),_:1})):H(``,!0)]))}}),An=ye({__name:`FilesToolbar`,setup(e){let t=Ze();return(e,n)=>(L(),q(x,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4 pa-4`},{default:J(()=>[U(ze,{align:`center`,dense:``},{default:J(()=>[U(Re,{cols:`12`,sm:`4`},{default:J(()=>[U(Ie,{modelValue:_(t).selectedServer,"onUpdate:modelValue":[n[0]||=e=>_(t).selectedServer=e,_(t).onServerChange],items:_(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}),U(Re,{cols:`12`,sm:`4`},{default:J(()=>[U(be,{modelValue:_(t).currentPath,"onUpdate:modelValue":n[1]||=e=>_(t).currentPath=e,label:`路径`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder`,"append-inner-icon":`mdi-arrow-right`,"onClick:appendInner":_(t).browseCurrent,onKeydown:M(_(t).browseCurrent,[`enter`])},null,8,[`modelValue`,`onClick:appendInner`,`onKeydown`])]),_:1}),U(Re,{cols:`12`,sm:`3`},{default:J(()=>[U(be,{modelValue:_(t).fileFilter,"onUpdate:modelValue":n[2]||=e=>_(t).fileFilter=e,label:`筛选文件名`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-magnify`,clearable:``,"hide-details":``},null,8,[`modelValue`])]),_:1}),U(Re,{cols:`12`,sm:`3`},{default:J(()=>[U(Ie,{modelValue:_(t).extFilter,"onUpdate:modelValue":n[3]||=e=>_(t).extFilter=e,items:_(t).FILE_EXT_FILTERS,"item-title":`title`,"item-value":`value`,label:`类型`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``},null,8,[`modelValue`,`items`])]),_:1}),U(Re,{cols:`12`,sm:`2`},{default:J(()=>[U(Ie,{modelValue:_(t).sortBy,"onUpdate:modelValue":n[4]||=e=>_(t).sortBy=e,items:_(t).sortOptions,"item-title":`title`,"item-value":`value`,label:`排序`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`,`items`])]),_:1}),U(Re,{cols:`12`,class:`d-flex ga-2 flex-wrap justify-end`},{default:J(()=>[U(Y,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-upload`,onClick:n[5]||=e=>_(t).showUpload=!0},{default:J(()=>[...n[10]||=[P(` 上传 `,-1)]]),_:1}),U(Y,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-file-plus`,disabled:!_(t).selectedServer,onClick:n[6]||=e=>_(t).showNewFile=!0},{default:J(()=>[...n[11]||=[P(` 新建文件 `,-1)]]),_:1},8,[`disabled`]),U(Y,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-folder-plus`,onClick:n[7]||=e=>_(t).showMkdir=!0},{default:J(()=>[...n[12]||=[P(` 新建目录 `,-1)]]),_:1}),U(Y,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-zip-box`,disabled:!_(t).selectedServer||!_(t).selectedFileCount,onClick:n[8]||=e=>_(t).openCompressDialog()},{default:J(()=>[...n[13]||=[P(` 压缩 `,-1)]]),_:1},8,[`disabled`]),U(Y,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-paste`,disabled:!_(t).canPasteHere,onClick:n[9]||=()=>_(t).pasteClipboard()},{default:J(()=>[...n[14]||=[P(` 粘贴 `,-1)]]),_:1},8,[`disabled`]),U(Y,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-arrow-up`,disabled:!_(t).canGoUp,onClick:_(t).goUp},{default:J(()=>[...n[15]||=[P(` 上级 `,-1)]]),_:1},8,[`disabled`,`onClick`]),U(Y,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-refresh`,onClick:_(t).browseCurrent},{default:J(()=>[...n[16]||=[P(`刷新`,-1)]]),_:1},8,[`onClick`]),U(Y,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-console`,disabled:!_(t).selectedServer,onClick:_(t).openInTerminal},{default:J(()=>[...n[17]||=[P(` 终端 `,-1)]]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1})]),_:1}))}}),jn=R(null);function Mn(){let e=a(()=>jn.value!==null),t=a(()=>jn.value?`${jn.value.mode===`cut`?`已剪切`:`已复制`} ${jn.value.paths.length} 项`:``);function n(e,t,n){if(!n.length)return!1;let r=[...new Set(n.map(e=>Q(e)))];return jn.value={mode:e,serverId:t,paths:r,label:r.map(e=>e.split(`/`).pop()||e).join(`, `)},!0}function r(){jn.value=null}function i(e){return!!(jn.value&&e&&jn.value.serverId===e)}function o(e,t){let n=Q(t);for(let t of e){let e=Q(t);if(n===e)return`「${e.split(`/`).pop()||e}」与目标路径相同,无需粘贴`;if(n.startsWith(`${e}/`))return`不能粘贴到源目录「${e}」的内部`}return null}async function s(e){let t=jn.value;if(!t)throw Error(`剪贴板为空`);let n=Q(e),i=o(t.paths,n);if(i)throw Error(i);let a=t.mode===`cut`?`move`:`copy`;await X.post(`/sync/file-clipboard`,{server_id:t.serverId,mode:a,sources:t.paths,dest_dir:n}),t.mode===`cut`&&r()}return{clipboard:jn,hasClipboard:e,clipboardSummary:t,setFromSelection:n,clear:r,canPasteOnServer:i,validatePasteTarget:o,pasteToDirectory:s}}function Nn(e){if(!(e instanceof HTMLElement))return!1;let t=e.tagName;return t===`INPUT`||t===`TEXTAREA`||e.isContentEditable}function Pn(e,t,n){function r(r){if(!Nn(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())}}ve(()=>window.addEventListener(`keydown`,r)),me(()=>window.removeEventListener(`keydown`,r))}function Fn(e,t){return`${e}:${t}`}var In=l(`files`,()=>{let e=R(null),t=R(ct),n=R([]),r=R(!1),i=R(!1),a=R(``),o=R(null),s=R(null),c=R(!1),l=R(!1),u=R(!1),d=R(!1),f=R(!1),p=R(!1),m=new Map;function ee(e){return Date.now()-e.at<=mn}function h(e,t){return m.get(Fn(e,t))??null}function g(e,t){let n=h(e,t);return!n||!ee(n)?null:n.items}function _(e,t){return h(e,t)?.etag}function v(e,t){let n=h(e,t);n&&(n.at=Date.now())}function y(e,t,n,r){let i=Fn(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 b(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(Fn(e,t))}function x(){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:h,getCached:g,getCachedEtag:_,touchCache:v,setCached:y,invalidateCache:b,resetForServerChange:x}}),Ln={directory:0,symlink:1,file:2};function Rn(e,t,n){let r=n===`asc`?1:-1;return[...e].sort((e,n)=>{let i=Ln[e.type]??9,a=Ln[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 zn=[{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 Bn(e,t){if(!t)return!0;let n=e.toLowerCase();return t.split(`,`).some(e=>n.endsWith(`.${e.trim()}`))}function Vn(e){let t=e.toLowerCase();return t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`)||t.endsWith(`.zip`)}var Hn=300*1024,Un=2*1024*1024,Wn=40,Gn=4,Kn=new Map;function qn(e,t){return`${e}:${Q(t)}`}function Jn(e){let t=Q(e),n=t.lastIndexOf(`/`);return n<=0?`/`:t.slice(0,n)||`/`}function Yn(){Kn.clear()}function Xn(e,t){let n=Q(t);for(let t of[...Kn.keys()]){if(!t.startsWith(`${e}:`)){Kn.delete(t);continue}Jn(t.slice(`${e}:`.length))!==n&&Kn.delete(t)}}function Zn(e,t){Kn.delete(qn(e,t))}function Qn(e){if(e.type!==`file`)return!1;let t=e.size??0;return t>0&&t<=307200}function $n(e){return e!=null&&e>0&&e>2097152}function er(e){return typeof e==`string`?{content:e,mtime:null,etag:null,eol:`LF`}:{content:e.content??JSON.stringify(e,null,2),mtime:e.mtime??null,etag:e.etag??null,eol:e.eol??`LF`}}async function tr(e,t,n=Hn){let r=qn(e,t),i=Kn.get(r);if(i!==void 0)return i;let a=er(await X.post(`/sync/read-file`,{server_id:e,path:Q(t),max_size:n}));return Kn.set(r,a),a}function nr(e,t,n){let r=n.filter(Qn).sort((e,t)=>(e.size??0)-(t.size??0)).slice(0,Wn);if(!r.length)return;let i=0,a=async()=>{for(;i<r.length;){let n=r[i++],a=$(t,n.name),o=qn(e,a);if(!Kn.has(o))try{await tr(e,a)}catch{}}},o=Math.min(Gn,r.length);Promise.all(Array.from({length:o},()=>a()))}function rr(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 ir(e){let t=Ne(),{selectedServer:n,currentPath:r}=re(In()),{selectedFiles:i,selectedAbsolutePaths:o,clearSelection:s}=e.selection,{setFromSelection:c,canPasteOnServer:l,pasteToDirectory:u}=Mn(),d=R(!1),f=R(!1),p=R(!1),m=R(``),ee=R(!1),h=R(!1),g=R(``),_=R(`tar.gz`),v=R([]),y=R(!1),b=R(``),x=R(`.`),S=R(!1),C=R([]),te=R(!1),ne=R(``),w=e.actionLoading??R(!1),T=R(null),E=R(!1),D=R(``),O=R(null),k=R(!1),A=R(!1),ie=R(null),j=R(!1),ae=R(0),M=R(0),N=R(null);function oe(e){if(e)return Q(e);let t=i.value.filter(e=>e.type===`directory`);return t.length===1&&i.value.length===1?$(r.value,t[0].name):Q(r.value)}let se=a(()=>{let e=oe();return e===Q(r.value)?`当前目录`:e});function ce(e){if(!n.value)return;let r=o(e);if(!r.length){t(`请先选择文件或目录`,`warning`);return}c(`copy`,n.value,r)&&t(`已复制 ${r.length} 项`)}function P(e){if(!n.value)return;let r=o(e);if(!r.length){t(`请先选择文件或目录`,`warning`);return}c(`cut`,n.value,r)&&t(`已剪切 ${r.length} 项`)}async function le(r){if(!n.value){t(`请先选择服务器`,`warning`);return}if(!l(n.value)){t(`剪贴板为空或服务器不一致`,`warning`);return}let i=oe(r);w.value=!0;try{await u(i),s(),e.invalidateAfterMutation(i),await e.browse({force:!0}),t(`已粘贴到 ${i}`)}catch(e){t(e instanceof Error?e.message:`粘贴失败`,`error`)}finally{w.value=!1}}async function ue(e){if(d.value=!1,!n.value){t(`请先选择服务器`,`warning`);return}let r=e.dataTransfer?.files;r?.length&&(C.value=Array.from(r),await G())}function de(t){if(j.value=!1,!N.value)return;let n=N.value;switch(t){case`open`:e.openEntry(n);break;case`copy`:ce([n]);break;case`cut`:P([n]);break;case`paste`:le();break;case`pasteInto`:n.type===`directory`&&le($(r.value,n.name));break;case`edit`:e.editFile(n);break;case`preview`:e.previewFile(n);break;case`download`:V(n);break;case`copyPath`:pe(n);break;case`terminal`:e.openInTerminal();break;case`compress`:F([n]);break;case`decompress`:I(n);break;case`rename`:B(n);break;case`chmod`:ge(n);break;case`delete`:H(n);break}}async function pe(e){let n=$(r.value,e.name);try{await navigator.clipboard.writeText(n),t(`路径已复制`)}catch{t(`复制失败`,`error`)}}function F(e){if(!n.value)return;let a=e?.length?e:i.value.length?i.value:[];if(!a.length){t(`请选择要压缩的文件或目录`,`warning`);return}v.value=a.map(e=>$(r.value,e.name));let o=a.length===1?a[0].name.replace(/\.[^.]+$/,``):`archive`;g.value=$(r.value,`${o}.tar.gz`),_.value=`tar.gz`,h.value=!0}function I(e){if(n.value){if(!Vn(e.name)){t(`仅支持 .tar.gz / .tgz / .zip`,`warning`);return}b.value=$(r.value,e.name),x.value=r.value,y.value=!0}}async function me(){if(!(!n.value||!v.value.length||!g.value)){w.value=!0;try{let r=g.value;_.value===`zip`&&!r.endsWith(`.zip`)&&(r=r.replace(/\.tar\.gz$/i,`.zip`),r.endsWith(`.zip`)||(r+=`.zip`)),await X.post(`/sync/compress`,{server_id:n.value,paths:v.value,dest:r,format:_.value}),h.value=!1,s(),e.invalidateAfterMutation(),await e.browse({force:!0}),t(`压缩完成`)}catch(e){t(e instanceof Error?e.message:`压缩失败`,`error`)}finally{w.value=!1}}}async function L(){if(!(!n.value||!b.value)){w.value=!0;try{await X.post(`/sync/decompress`,{server_id:n.value,path:b.value,dest:x.value||`.`}),y.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`解压完成`)}catch(e){t(e instanceof Error?e.message:`解压失败`,`error`)}finally{w.value=!1}}}async function z(){if(!n.value||!m.value)return;let i=ft(m.value);if(i!==!0){t(i,`warning`);return}let a=m.value,o=$(r.value,a);w.value=!0;try{await X.post(`/sync/write-file`,{server_id:n.value,path:o,content:``}),p.value=!1,m.value=``,Zn(n.value,o),e.invalidateAfterMutation(),await e.browse({force:!0}),t(`文件已创建`),await fe(),e.editorWorkbench.value?.openFile({path:o,name:a,content:``,eol:`LF`,etag:null,mtime:null})}catch(e){t(e instanceof Error?e.message:`创建失败`,`error`)}finally{w.value=!1}}function B(e){O.value=e,D.value=e.name,E.value=!0}async function he(){if(!(!n.value||!O.value||!D.value))try{await X.post(`/sync/file-ops`,{server_id:n.value,operation:`rename`,path:$(r.value,O.value.name),new_path:$(r.value,D.value)}),E.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`重命名成功`)}catch(e){t(e instanceof Error?e.message:`重命名失败`,`error`)}}function ge(e){ie.value=e,k.value=!0}async function _e(i){if(!(!n.value||!ie.value)){A.value=!0;try{await X.post(`/sync/chmod`,{server_id:n.value,path:$(r.value,ie.value.name),mode:i.mode,owner:i.owner,group:i.group,recursive:i.recursive??!1}),k.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`权限已修改`)}catch(e){t(e instanceof Error?e.message:`修改权限失败`,`error`)}finally{A.value=!1}}}async function ve(){if(!n.value||!i.value.length||!confirm(`确定删除 ${i.value.length} 个文件?`))return;let a=0,o=0;for(let e of i.value)try{await X.post(`/sync/file-ops`,{server_id:n.value,operation:`delete`,path:$(r.value,e.name)}),a++}catch{o++}s(),e.invalidateAfterMutation(),await e.browse({force:!0}),o===0?t(`已删除 ${a} 项`):t(`删除完成:成功 ${a},失败 ${o}`,o>0?`warning`:`success`)}async function V(e){if(n.value)try{let i=$(r.value,e.name),{blob:a,filename:o}=await X.download(`/sync/download`,{server_id:n.value,path:i});rr(a,o),t(`已下载 ${o}`)}catch(e){t(e instanceof Error?e.message:`下载失败`,`error`)}}async function H(e){T.value=e,S.value=!0}async function U(){if(!(!n.value||!T.value)){w.value=!0;try{await X.post(`/sync/file-ops`,{server_id:n.value,operation:`delete`,path:$(r.value,T.value.name)}),S.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`已删除`)}catch(e){t(e instanceof Error?e.message:`删除失败`,`error`)}finally{w.value=!1}}}async function W(){if(!n.value||!ne.value)return;let i=ft(ne.value);if(i!==!0){t(i,`warning`);return}w.value=!0;try{await X.post(`/sync/file-ops`,{server_id:n.value,operation:`mkdir`,path:$(r.value,ne.value)}),ee.value=!1,ne.value=``,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`目录已创建`)}catch(e){t(e instanceof Error?e.message:`创建失败`,`error`)}finally{w.value=!1}}async function G(){if(!(!n.value||!C.value.length)){te.value=!0;try{let i=new FormData;for(let e of C.value)i.append(`file`,e);i.append(`server_id`,String(n.value)),i.append(`remote_path`,r.value),await X.upload(`/sync/upload`,i),f.value=!1,C.value=[],e.invalidateAfterMutation(),await e.browse({force:!0}),t(`上传成功`)}catch(e){t(e instanceof Error?e.message:`上传失败`,`error`)}finally{te.value=!1}}}function K(e){return e instanceof HTMLElement?!!e.closest(`button, a, input, .v-checkbox, .v-selection-control`):!1}function ye(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=>{K(e.target)||e.detail===1&&be(e,{item:t})},onDblclick:e=>{K(e.target)||q(e,{item:t})},onContextmenu:e=>{K(e.target)||xe(e,{item:t})}}}function be(t,{item:n}){(n.type===`directory`||n.type===`symlink`)&&e.openEntry(n)}function q(t,{item:n}){n.type===`file`&&e.editFile(n)}function xe(e,{item:t}){e.preventDefault(),N.value=t,ae.value=e.clientX,M.value=e.clientY,j.value=!0}return{dropActive:d,showUpload:f,showNewFile:p,newFileName:m,showMkdir:ee,showCompress:h,compressDest:g,compressFormat:_,compressPaths:v,showDecompress:y,decompressSource:b,decompressDest:x,showFileDelete:S,uploadFiles:C,uploading:te,mkdirName:ne,actionLoading:w,deletingFile:T,showRename:E,newName:D,renamingFile:O,showChmod:k,chmodLoading:A,chmodFile:ie,showContextMenu:j,contextX:ae,contextY:M,contextFile:N,copyToClipboard:ce,cutToClipboard:P,pasteClipboard:le,onDropFiles:ue,contextAction:de,openCompressDialog:F,openDecompressDialog:I,doCompress:me,doDecompress:L,doNewFile:z,startRename:B,doRename:he,startChmod:ge,doChmod:_e,batchDelete:ve,downloadFile:V,confirmDeleteFile:H,doDeleteFile:U,doMkdir:W,doUpload:G,fileRowProps:ye,pasteDestLabel:se}}var ar=!1;function or(){te(async()=>{let{initMonaco:e}=await import(`./initMonaco-BdSPub4l.js`).then(e=>e.r);return{initMonaco:e}},__vite__mapDeps([0,1,2,3])).then(({initMonaco:t})=>{t(),e()})}function sr(){ar||(ar=!0,typeof requestIdleCallback==`function`?requestIdleCallback(or,{timeout:3e3}):setTimeout(or,300))}var cr=200,lr=0,ur=null,dr=``,fr=null;function pr(e){return e.includes(`No such file or directory`)||e.includes(`not a directory`)}function mr(e,t){return pr(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 hr(e){e.loading=!0,!fr&&(fr=setTimeout(()=>{fr=null,e.loading&&(e.loadingVisible=!0)},cr))}function gr(e){e.loading=!1,fr&&=(clearTimeout(fr),null),e.loadingVisible=!1}async function _r(e,t,n){let r={};n&&(r[`If-None-Match`]=n);try{return await w(`/files/browse`,{method:`GET`,params:{server_id:e,path:t},headers:r})}catch(n){if(!(n instanceof h&&(n.status>=500||n.status===404||n.status===405)))throw n;return{status:200,data:await X.post(`/sync/browse`,{server_id:e,path:t}),etag:null}}}function vr(e){let t=Ne(),n=ee(),r=k(),i=In(),{selectedServer:o,currentPath:s,files:c,loading:l,loadingVisible:u,browseError:d,pageReady:f,filesCapability:p}=re(i);function m(){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),r.replace({query:e})}let h=a(()=>f.value?o.value?d.value?d.value:e?.value.trim()?`无匹配文件`:p.value?.is_root?`目录为空(${s.value}),可在上方修改路径或到「服务器」核对 target_path`:`目录为空(${s.value}`:`请先选择服务器`:`正在加载…`);function g(e,n,r,a,o){if(o!==lr)return!1;let{items:l,error:u}=st(r??{items:[]});if(u&&pr(u)&&n!==`/`){d.value=``;let e=dt(n);if(e)return t(`路径 "${n}" 不存在,已自动跳转到上级目录`,`info`),s.value=e,_(),!0}return d.value=u?mr(u,n):``,u&&!pr(u)&&t(mr(u,n),`warning`),c.value=l,u||i.setCached(e,n,l,a??void 0),e&&l.length&&(Xn(e,n),nr(e,n,l),sr()),!0}async function _(e){if(!o.value)return;let n=Q(s.value),r=o.value,a=`${r}:${n}`,l=e?.force?null:i.getCached(r,n);if(l&&(c.value=l,d.value=``),ur&&dr===a)return ur;dr=a;let u=++lr;hr(i),s.value=n;let f=e?.force?void 0:i.getCachedEtag(r,n);return ur=(async()=>{try{let e=await _r(r,n,f);if(u!==lr)return;if(e.status===304){let t=i.getCacheEntry(r,n);if(t){c.value=t.items,i.touchCache(r,n),d.value=``;return}if(e=await _r(r,n),u!==lr)return}g(r,n,e.data,e.etag,u)}catch(e){if(u!==lr)return;let n=Be(e,`浏览目录失败`);d.value=n,t(n,`error`)}finally{u===lr&&(gr(i),m()),dr===a&&(ur=null,dr=``)}})(),ur}function v(){if(!o.value){t(`请先选择服务器`,`warning`);return}s.value=Q(s.value),i.invalidateCache(o.value,s.value),_({force:!0})}function y(e){if(!o.value)return;let t=e??s.value;i.invalidateCache(o.value,Q(t)),Yn()}return{emptyHint:h,browse:_,browseCurrent:v,invalidateAfterMutation:y,loadingVisible:u}}function yr(e){return e?e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`:`—`}function br(e){let t=Ne(),{selectedServer:n,currentPath:r,lastReadDeniedPath:i,accessHintDismissed:a}=re(In()),o=R(!1),s=R(``),c=R(``),l=R(!1),u=R(null);async function d(){let e=Date.now()+8e3;for(;Date.now()<e;){if(u.value?.openFile)return u.value;await new Promise(e=>setTimeout(e,40)),await fe()}return u.value}function f(e,n){return $n(e.size)?(t(`文件超过 2MB${yr(e.size)}),无法${n},请下载或使用终端`,`warning`),!0):!1}function p(t){n.value&&t&&Zn(n.value,t),e.invalidateAfterMutation(),e.browse({force:!0})}async function m(e){if(!n.value||f(e,`查看`))return;let u=$(r.value,e.name);s.value=e.name,c.value=``,l.value=!0,o.value=!0,(e.size??0)>307200&&t(`文件较大(${yr(e.size)}),正在加载…`,`info`);try{c.value=(await tr(n.value,u,2097152)).content||`(空文件)`}catch(n){let r=n instanceof Error?n.message:`读取失败`;c.value=r,qt(r)&&(i.value=e.name,a.value=!1),t(r,`error`)}finally{l.value=!1}}async function ee(o){if(n.value&&!f(o,`编辑`)){(o.size??0)>307200&&t(`文件较大(${yr(o.size)}),正在加载…`,`info`),e.actionLoading.value=!0;try{let e=$(r.value,o.name),i=await tr(n.value,e,Un),a=await d();if(!a){t(`编辑器尚未就绪,请稍后重试`,`error`);return}a.openFile({path:e,name:o.name,content:i.content,eol:i.eol,etag:i.etag,mtime:i.mtime})}catch(e){let n=e instanceof Error?e.message:`读取失败`;qt(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:m,editFile:ee,onEditorSaved:p,formatSize:yr}}function xr(e){let t=Ne(),n=ee(),r=k(),{servers:i,loadServers:o}=Ve(),s=In(),{selectedServer:c,currentPath:l,pageReady:u,routeReady:d,initing:f,accessHintDismissed:p}=re(s),m=a(()=>pt(l.value)),h=a(()=>dt(l.value)!==null);function g(e){if(e==null)return ct;let t=i.value.find(t=>t.id===e)?.target_path?.trim();return t?Q(t):ct}function _(){let e=n.query.path;return typeof e==`string`&&e.trim()?Q(e):g(c.value)}function v(){let e=n.query.server_id;if(e){let t=Number(e);if(Number.isFinite(t)&&i.value.some(e=>e.id===t))return t}let t=sessionStorage.getItem(dn);if(t){let e=Number(t);if(Number.isFinite(e)&&i.value.some(t=>t.id===e))return e}return i.value[0]?.id??null}function y(n){if(!c.value){t(`请先选择服务器`,`warning`);return}l.value=Q(n),e.clearSelection(),e.browse()}function b(e){if(e.type===`directory`){y($(l.value,e.name));return}if(e.type===`symlink`){let n=e.link_target?.trim();n?.startsWith(`/`)?y(n):t(n?`符号链接 → ${n}`:`相对符号链接(请在终端中打开)`,`info`)}}function x(){let e=dt(l.value);e!=null&&y(e)}function S(e){let t=m.value[e];t&&!t.disabled&&y(t.path)}function C(){c.value&&r.push({path:`/terminal`,query:{server_id:String(c.value),path:l.value||`/`}})}function te(){f.value||(c.value&&sessionStorage.setItem(dn,String(c.value)),s.invalidateCache(),l.value=g(c.value),e.clearSelection(),s.resetForServerChange(),sessionStorage.removeItem(fn),(async()=>{await e.refreshFilesCapability(),await e.browse({force:!0})})())}return ve(async()=>{f.value=!0;try{if(await o(),sessionStorage.getItem(`nexus:files-hint-dismissed`)&&(p.value=!0),!i.value.length){t(`暂无可用服务器,请先在「服务器」页添加`,`warning`),u.value=!0;return}let r=v();if(r==null){u.value=!0;return}c.value=r;let a=n.query.path;l.value=typeof a==`string`&&a?Q(a):g(r),await e.refreshFilesCapability(),await e.browse(),u.value=!0,d.value=!0}finally{f.value=!1}}),T(()=>n.query.server_id,t=>{d.value&&t&&Number(t)!==c.value&&(c.value=Number(t),l.value=_(),s.resetForServerChange(),(async()=>{await e.refreshFilesCapability(),await e.browse({force:!0})})())}),T(()=>n.query.path,()=>{if(!d.value||!c.value)return;let t=_();t!==Q(l.value)&&(l.value=t,e.clearSelection(),e.browse())}),{serverList:i,breadcrumbs:m,canGoUp:h,navigateToPath:y,openEntry:b,goUp:x,onBreadcrumbClick:S,openInTerminal:C,onServerChange:te,defaultPathForServer:g}}function Sr(e){let t=Ne(),{selectedServer:n,files:r,browseError:i,filesCapability:o,lastReadDeniedPath:s,accessHintDismissed:c,setupSudoLoading:l,setupSudoDone:u}=re(In()),d=a(()=>o.value?.ssh_user??null),f=a(()=>{let e=d.value;return e?r.value.filter(t=>Jt(t,e)).length:0}),p=a(()=>{if(c.value||!n.value||i.value&&pr(i.value))return null;let e=o.value;return Xt({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:s.value,unreadableCount:f.value})});function m(){c.value=!0,sessionStorage.setItem(fn,`1`)}async function ee(){if(!n.value){o.value=null;return}try{o.value=await X.get(`/servers/${n.value}/files-capability`)}catch{o.value=null}}async function h(){if(n.value){l.value=!0;try{let r=await X.post(`/servers/${n.value}/setup-files-sudo`,{});u.value=!0,t(r.message||`sudoers 配置成功,文件管理器现在可自动提权`,`success`),m(),await ee(),await e.browse({force:!0})}catch(e){t(`一键配置失败:${e instanceof Error?e.message:`配置失败`}`,`error`)}finally{l.value=!1}}}return{sshUserForFiles:d,filesAccessHint:p,dismissFilesAccessHint:m,refreshFilesCapability:ee,setupFilesSudo:h}}function Cr(){let{currentPath:e}=re(In()),t=R([]),n=a(()=>t.value.length);function r(){t.value=[]}function i(n){return(n?.length?n:t.value).map(t=>$(e.value,t.name))}return{selectedFiles:t,selectedFileCount:n,clearSelection:r,selectedAbsolutePaths:i}}function wr(){let e=R(``),t=R(``),n=R(`name`),r=[{title:`名称`,value:`name`},{title:`大小`,value:`size`},{title:`修改时间`,value:`modified`}],{selectedServer:i,currentPath:o,files:s,loading:c,browseError:l,pageReady:u,setupSudoLoading:d,setupSudoDone:f}=re(In()),p=Cr(),{selectedFiles:m,selectedFileCount:ee,clearSelection:h}=p,{emptyHint:g,browse:_,browseCurrent:v,invalidateAfterMutation:y,loadingVisible:b}=vr(e),x=Sr({browse:_}),{sshUserForFiles:S,filesAccessHint:C,dismissFilesAccessHint:te,setupFilesSudo:ne}=x,w=xr({browse:_,refreshFilesCapability:x.refreshFilesCapability,clearSelection:h}),T=R(!1),E=br({browse:_,invalidateAfterMutation:y,actionLoading:T}),D=ir({browse:_,invalidateAfterMutation:y,selection:p,openEntry:w.openEntry,editFile:E.editFile,previewFile:E.previewFile,openInTerminal:w.openInTerminal,editorWorkbench:E.editorWorkbench,actionLoading:T}),{hasClipboard:O,clipboardSummary:k,canPasteOnServer:A}=Mn(),ie=a(()=>A(i.value)),j=a(()=>{let r=Rn(s.value,n.value,`asc`),i=t.value;i&&(r=r.filter(e=>Bn(e.name,i)));let a=e.value.trim().toLowerCase();return a&&(r=r.filter(e=>e.name.toLowerCase().includes(a))),r}),ae=a(()=>{let e=s.value.filter(e=>e.type===`directory`).length,t=s.value.filter(e=>e.type===`file`).length,n=s.value.filter(e=>e.type===`symlink`).length,r=s.value.filter(Qn).length,i=[`${e} 个目录`,`${t} 个文件`];return n&&i.push(`${n} 个链接`),r&&i.push(`${r} 个 ≤300KB 可预加载`),`${i.join(``)} · ${o.value}`});function M(e){return Vn(e)}function N(e){return e.type===`directory`?`mdi-folder`:e.type===`symlink`?`mdi-link-variant`:`mdi-file-outline`}function oe(e){return e.type===`directory`?`amber`:e.type===`symlink`?`teal`:`blue`}function se(e){return e.type===`file`}return Pn({refresh:v,goUp:w.goUp,renameSelection:()=>{m.value.length===1&&D.startRename(m.value[0])},deleteSelection:()=>{m.value.length>0&&D.batchDelete()},selectAll:()=>{m.value=[...j.value]},copySelection:()=>D.copyToClipboard(),cutSelection:()=>D.cutToClipboard(),pasteClipboard:()=>{D.pasteClipboard()}},m,ie),{FILE_EXT_FILTERS:zn,validatePathSegment:ft,required:He,fileFilter:e,extFilter:t,sortBy:n,sortOptions:r,selectedServer:i,currentPath:o,files:s,loading:c,loadingVisible:b,browseError:l,pageReady:u,setupSudoLoading:d,setupSudoDone:f,serverList:w.serverList,onServerChange:w.onServerChange,browseCurrent:v,filesAccessHint:C,dismissFilesAccessHint:te,setupFilesSudo:ne,sshUserForFiles:S,statusSummary:ae,hasClipboard:O,clipboardSummary:k,pasteDestLabel:D.pasteDestLabel,canPasteHere:ie,breadcrumbs:w.breadcrumbs,onBreadcrumbClick:w.onBreadcrumbClick,canGoUp:w.canGoUp,goUp:w.goUp,selectedFiles:m,selectedFileCount:ee,displayedFiles:j,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:300,sortable:!1,align:`end`}],fileRowProps:D.fileRowProps,dropActive:D.dropActive,onDropFiles:D.onDropFiles,emptyHint:g,entryIcon:N,entryIconColor:oe,isEntryLikelyUnreadable:Jt,formatOwnerChip:Ht,ownerChipColor:Ut,permissionTooltip:Wt,formatSize:E.formatSize,isRegularFile:se,isArchiveName:M,showUpload:D.showUpload,uploadFiles:D.uploadFiles,uploading:D.uploading,doUpload:D.doUpload,showNewFile:D.showNewFile,newFileName:D.newFileName,doNewFile:D.doNewFile,showMkdir:D.showMkdir,mkdirName:D.mkdirName,doMkdir:D.doMkdir,showFileDelete:D.showFileDelete,deletingFile:D.deletingFile,doDeleteFile:D.doDeleteFile,showRename:D.showRename,newName:D.newName,doRename:D.doRename,showChmod:D.showChmod,chmodFile:D.chmodFile,chmodLoading:D.chmodLoading,doChmod:D.doChmod,showCompress:D.showCompress,compressDest:D.compressDest,compressFormat:D.compressFormat,compressPaths:D.compressPaths,doCompress:D.doCompress,showDecompress:D.showDecompress,decompressSource:D.decompressSource,decompressDest:D.decompressDest,doDecompress:D.doDecompress,showContextMenu:D.showContextMenu,contextX:D.contextX,contextY:D.contextY,contextFile:D.contextFile,contextAction:D.contextAction,actionLoading:T,batchDelete:D.batchDelete,openCompressDialog:D.openCompressDialog,showPreview:E.showPreview,previewTitle:E.previewTitle,previewContent:E.previewContent,previewLoading:E.previewLoading,editorWorkbench:E.editorWorkbench,onEditorSaved:E.onEditorSaved,navigateToPath:w.navigateToPath,pasteClipboard:D.pasteClipboard,editFile:E.editFile,previewFile:E.previewFile,downloadFile:D.downloadFile,confirmDeleteFile:D.confirmDeleteFile,openInTerminal:w.openInTerminal}}var Tr=ye({__name:`FilesPage`,setup(e){let t=wr();Xe(t);let{editorWorkbench:n}=t,{selectedServer:r,currentPath:i}=re(In());return(e,a)=>(L(),q(Pe,{fluid:``,class:`pa-6`},{default:J(()=>[U(An),U(Dn),U(kn),U(at),U(Tn),U(un),U(Bt,{ref_key:`editorWorkbench`,ref:n,"server-id":_(r)??0,"current-path":_(i),onSaved:a[0]||=e=>_(t).onEditorSaved(e),onPathChange:_(t).navigateToPath,onPasteTarget:_(t).pasteClipboard},null,8,[`server-id`,`current-path`,`onPathChange`,`onPasteTarget`])]),_:1}))}});export{Tr as default};