Files
Nexus/web/app/assets/FilesPage-CsQVyi1z.js
T
Nexus Agent f127f07ab2 feat(rdp): 3389 页独立管理 RDP 主机
rdp_hosts 表与专用 API,在 3389远程页添加/连接,不再依赖子机列表。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-10 20:58:46 +08:00

5 lines
95 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-D1bUcg_U.js","assets/chunk-DK3Fl9T5.js","assets/index-_6O5JL4W.js","assets/index-DUUkodzN.css","assets/initMonaco-DX2BVZF3.css"])))=>i.map(i=>d[i]);
import{t as e}from"./VDataTable-xIamJ7nl.js";import{n as t,t as n}from"./useSnackbar-yP7apGY8.js";import{n as r,t as i}from"./VRow-DQSkwKSy.js";import{$t as a,An as o,Ar as s,B as c,C as l,Cr as u,D as d,Er as f,F as p,Hr as m,I as h,Ir as g,K as _,Kr as v,L as y,Mr as b,Nr as x,On as S,Or as C,Pr as w,Q as T,Qr as E,Rn as D,Rr as O,Sr as k,Tn as ee,Tr as A,Ur as te,Vr as j,X as ne,Xn as re,Y as M,Yr as N,Yt as ie,Z as P,Zr as F,Zt as ae,_ as I,_n as oe,_r as se,_t as L,a as ce,an as le,at as ue,b as de,bn as fe,br as R,c as pe,ci as z,cn as me,di as B,dt as he,ei as ge,en as V,er as _e,et as ve,ft as ye,gr as be,gt as xe,h as H,hi as U,hn as Se,hr as W,i as Ce,ii as G,in as we,ir as Te,it as Ee,kn as De,l as Oe,lt as ke,m as K,mi as Ae,mn as je,mr as Me,n as Ne,ni as Pe,nn as Fe,nt as Ie,o as Le,oi as Re,or as ze,pi as q,pn as Be,pr as Ve,pt as He,r as Ue,rn as We,rr as Ge,s as Ke,sn as qe,sr as Je,ut as Ye,v as Xe,vn as Ze,wn as Qe,x as $e,xr as J,y as et,yn as tt,yr as Y,z as nt}from"./index-_6O5JL4W.js";import{a as rt,i as it,n as at,t as ot}from"./initMonaco-D1bUcg_U.js";import{t as st}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as ct}from"./dataTable-esDY4cOk.js";import{S as lt,_ as X,b as ut,t as dt,v as Z}from"./VTextField-CD7WwKb1.js";import{t as ft}from"./VSelect-CDx3fXFa.js";import{t as pt}from"./VCheckbox-CjcHGgQY.js";import{t as mt}from"./apiError-cM_GzSSg.js";import{t as ht}from"./useServerList-C-O2e1dF.js";import{t as gt}from"./VDialog-DEJqI2_G.js";import{t as _t}from"./VFileInput-B15eM8mB.js";import{r as vt}from"./validation-BMzYTJL4.js";var yt=Symbol(`filesPage`);function bt(e){m(yt,Pe(e))}function xt(){let e=s(yt);if(!e)throw Error(`useFilesPageContext() must be used inside FilesPage`);return e}var St=De({divider:[Number,String],...S()},`VBreadcrumbsDivider`),Ct=Qe()({name:`VBreadcrumbsDivider`,props:St(),setup(e,{slots:t}){return Ze(()=>R(`li`,{"aria-hidden":`true`,class:q([`v-breadcrumbs-divider`,e.class]),style:Ae(e.style)},[t?.default?.()??e.divider])),{}}}),wt=De({active:Boolean,activeClass:String,activeColor:String,color:String,disabled:Boolean,title:String,...S(),...Te(M(),[`width`,`maxWidth`]),...nt(),...he({tag:`li`})},`VBreadcrumbsItem`),Tt=Qe()({name:`VBreadcrumbsItem`,props:wt(),setup(e,{slots:t,attrs:n}){let r=c(e,n),i=Y(()=>e.active||r.isActive?.value),{dimensionStyles:a}=ne(e),{textColorClasses:o,textColorStyles:s}=Ye(()=>i.value?e.activeColor:e.color);return Ze(()=>f(e.tag,{class:q([`v-breadcrumbs-item`,{"v-breadcrumbs-item--active":i.value,"v-breadcrumbs-item--disabled":e.disabled,[`${e.activeClass}`]:i.value&&e.activeClass},o.value,e.class]),style:Ae([s.value,a.value,e.style]),"aria-current":i.value?`page`:void 0},{default:()=>[r.isLink.value?R(`a`,b({class:`v-breadcrumbs-item--link`,onClick:r.navigate.value},r.linkProps),[t.default?.()??e.title]):t.default?.()??e.title]})),{}}}),Et=De({activeClass:String,activeColor:String,bgColor:String,color:String,disabled:Boolean,divider:{type:String,default:`/`},icon:oe,items:{type:Array,default:()=>[]},...S(),...xe(),...ye(),...he({tag:`ul`})},`VBreadcrumbs`),Dt=Qe()({name:`VBreadcrumbs`,props:Et(),setup(e,{slots:t}){let{backgroundColorClasses:n,backgroundColorStyles:r}=ke(()=>e.bgColor),{densityClasses:i}=L(e),{roundedClasses:a}=He(e);ee({VBreadcrumbsDivider:{divider:z(()=>e.divider)},VBreadcrumbsItem:{activeClass:z(()=>e.activeClass),activeColor:z(()=>e.activeColor),color:z(()=>e.color),disabled:z(()=>e.disabled)}});let o=Y(()=>e.items.map(e=>typeof e==`string`?{item:{title:e},raw:e}:{item:e,raw:e}));return Ze(()=>{let s=!!(t.prepend||e.icon);return f(e.tag,{class:q([`v-breadcrumbs`,n.value,i.value,a.value,e.class]),style:Ae([r.value,e.style])},{default:()=>[s&&R(`li`,{key:`prepend`,class:`v-breadcrumbs__prepend`},[t.prepend?f(ve,{key:`prepend-defaults`,disabled:!e.icon,defaults:{VIcon:{icon:e.icon,start:!0}}},t.prepend):f(T,{key:`prepend-icon`,start:!0,icon:e.icon},null)]),o.value.map(({item:e,raw:n},r,i)=>R(be,null,[t.item?.({item:e,index:r})??f(Tt,b({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&&f(Ct,null,{default:t.divider?()=>t.divider?.({item:n,index:r}):void 0})])),t.default?.()]})}),{}}}),Ot={class:`text-body-2 mr-4`},kt=C({__name:`FilesBreadcrumb`,setup(e){let t=xt();return(e,n)=>(j(),u(be,null,[f(Dt,{items:B(t).breadcrumbs,class:`pa-0 mb-2`},{item:F(({item:e,index:n})=>[f(Tt,{disabled:e.disabled,class:q({"text-primary":!e.disabled,"cursor-pointer":!e.disabled}),onClick:e=>B(t).onBreadcrumbClick(n)},{default:F(()=>[A(U(e.title),1)]),_:2},1032,[`disabled`,`class`,`onClick`])]),divider:F(()=>[...n[1]||=[A(`/`,-1)]]),_:1},8,[`items`]),B(t).selectedFileCount>0?(j(),J(X,{key:0,class:`mb-4`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:F(()=>[f(Z,{class:`d-flex align-center py-2`},{default:F(()=>[R(`span`,Ot,`已选择 `+U(B(t).selectedFileCount)+` 个文件`,1),f(I),f(h,{size:`small`,variant:`text`,color:`error`,onClick:B(t).batchDelete},{default:F(()=>[...n[2]||=[A(`批量删除`,-1)]]),_:1},8,[`onClick`]),f(h,{size:`small`,variant:`text`,onClick:n[0]||=e=>B(t).selectedFiles=[]},{default:F(()=>[...n[3]||=[A(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):k(``,!0)],64))}});function At(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 jt(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:At(t.entries),error:t.error}:{items:t.items??[],error:t.error}}var Mt=`/www/wwwroot`;function Nt(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=Nt(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 Pt(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=Pt(n);return e.pop(),e.length?`/${e.join(`/`)}`:`/`}return n===`/`?`/${r}`:`${n}/${r}`}function Ft(e){let t=Pt(e);return t.length?(t.pop(),t.length?`/${t.join(`/`)}`:`/`):null}function It(e){let t=e.trim();return t?t.includes(`/`)||t.includes(`\\`)||t.includes(`\0`)?`名称不能包含路径分隔符`:t===`.`||t===`..`?`非法名称`:!0:`名称不能为空`}function Lt(e){let t=Pt(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 Rt={key:1,class:`file-dir-tree-embedded-bar d-flex align-center px-2 py-1`},zt={key:0,class:`text-caption text-medium-emphasis pa-3`},Bt={key:2,class:`text-caption text-medium-emphasis pa-3`},Vt=[`onClick`],Ht=[`onClick`,`onContextmenu`],Ut=st(C({__name:`FileDirectoryTree`,props:{serverId:{},currentPath:{},rootPath:{},embedded:{type:Boolean}},emits:[`navigate`,`paste-target`],setup(e,{emit:t}){let r=e,i=n(),a=Y(()=>Q(r.rootPath||`/www/wwwroot`)),o=t,s=G(!1),c=G(null),l=G(new Set),d=G(new Map);function p(e){let t=new Set(l.value);e(t),l.value=t}function m(e){let t=new Map(d.value);e(t),d.value=t}function g(){l.value=new Set([a.value])}let v=Y(()=>{let e=[],t=(n,r)=>{let i=d.value.get(n)??[];for(let n of i)e.push({...n,depth:r}),l.value.has(n.path)&&t(n.path,r+1)};return t(a.value,0),e});async function y(e){if(!r.serverId)return[];let{items:t}=jt(await V.post(`/sync/browse`,{server_id:r.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 b(e){if(r.serverId){c.value=e;try{let t=await y(e);m(n=>{n.set(e,t);for(let e of t)n.has(e.path)||n.set(e.path,[])})}catch(e){i(e instanceof Error?e.message:`加载目录失败`,`error`)}finally{c.value=null}}}async function x(){if(!r.serverId)return;s.value=!0,d.value=new Map,g();let e=a.value;try{await b(e),m(t=>{for(let n of t.get(e)??[])t.has(n.path)||t.set(n.path,[])})}finally{s.value=!1}}async function S(e){if(l.value.has(e.path)){p(t=>{t.delete(e.path)});return}d.value.has(e.path)||await b(e.path),p(t=>{t.add(e.path)})}function C(e){let t=Q(e),n=a.value;t!==n&&p(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)})}N(()=>[r.serverId,a.value],([e])=>{e?x():(d.value=new Map,l.value=new Set)},{immediate:!0});async function w(e){if(!r.serverId)return;let t=Q(e),n=a.value;if(C(t),d.value.has(n)||await b(n),t===n||!t.startsWith(n))return;let i=t.slice(n.length).replace(/^\//,``).split(`/`).filter(Boolean),o=n;for(let e of i)d.value.has(o)||await b(o),o=$(o,e)}return N(()=>r.currentPath,e=>{e&&w(e)},{immediate:!0}),(t,n)=>(j(),J(X,{border:``,rounded:`lg`,class:q([`file-dir-tree d-flex flex-column`,{"file-dir-tree--embedded":e.embedded}])},{default:F(()=>[e.embedded?(j(),u(`div`,Rt,[f(T,{size:`16`,class:`mr-1 text-medium-emphasis`},{default:F(()=>[...n[2]||=[A(`mdi-file-tree`,-1)]]),_:1}),n[3]||=R(`span`,{class:`text-caption text-medium-emphasis`},`目录`,-1),f(I),f(h,{icon:`mdi-refresh`,size:`x-small`,variant:`text`,disabled:!e.serverId,onClick:x},null,8,[`disabled`])])):(j(),J(ut,{key:0,class:`text-subtitle-2 py-2 px-3 d-flex align-center`},{default:F(()=>[f(T,{size:`18`,class:`mr-1`},{default:F(()=>[...n[0]||=[A(`mdi-file-tree`,-1)]]),_:1}),n[1]||=A(` 目录 `,-1),f(I),f(h,{icon:`mdi-refresh`,size:`x-small`,variant:`text`,disabled:!e.serverId,onClick:x},null,8,[`disabled`])]),_:1})),f(Xe),f(Z,{class:`file-dir-tree-body pa-0 flex-grow-1`},{default:F(()=>[e.serverId?s.value?(j(),J(_,{key:1,indeterminate:``})):v.value.length===0?(j(),u(`div`,Bt,` 暂无子目录(可点刷新) `)):(j(),J(Oe,{key:3,density:`compact`,nav:``,class:`py-0`},{default:F(()=>[(j(!0),u(be,null,te(v.value,t=>(j(),u(`div`,{key:t.path,class:`file-dir-tree-row d-flex align-center`,style:Ae({paddingLeft:`${8+t.depth*14}px`})},[R(`button`,{type:`button`,class:`file-dir-tree-toggle`,onClick:W(e=>S(t),[`stop`])},[c.value===t.path?(j(),J(P,{key:0,indeterminate:``,size:`14`,width:`2`})):(j(),J(T,{key:1,size:`16`},{default:F(()=>[A(U(l.value.has(t.path)?`mdi-chevron-down`:`mdi-chevron-right`),1)]),_:2},1024))],8,Vt),R(`button`,{type:`button`,class:q([`file-dir-tree-label text-body-2 text-truncate`,{"file-dir-tree-label--active":B(Q)(e.currentPath)===t.path}]),onClick:e=>o(`navigate`,t.path),onContextmenu:W(e=>o(`paste-target`,t.path),[`prevent`])},[f(T,{size:`14`,class:`mr-1`},{default:F(()=>[...n[4]||=[A(`mdi-folder-outline`,-1)]]),_:1}),A(` `+U(t.name),1)],42,Ht)],4))),128))]),_:1})):(j(),u(`div`,zt,`请先选择服务器`))]),_:1})]),_:1},8,[`class`]))}}),[[`__scopeId`,`data-v-d76d91c6`]]);function Wt(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 Gt(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch{}}function Kt(e,t){let n=G(Wt(e,t)),r={px:0,py:0,rx:0,ry:0},i=!1,a={px:0,py:0,rw:0,rh:0},o=Y(()=>({left:`${n.value.x}px`,top:`${n.value.y}px`,width:`${n.value.w}px`,height:`${n.value.h}px`}));function s(){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 c(e){if(i){n.value.w=Math.max(480,a.rw+e.clientX-a.px),n.value.h=Math.max(320,a.rh+e.clientY-a.py),s();return}n.value.x=r.rx+e.clientX-r.px,n.value.y=r.ry+e.clientY-r.py,s()}function l(){i=!1,window.removeEventListener(`mousemove`,c),window.removeEventListener(`mouseup`,l),Gt(e,n.value)}function u(e){e.button===0&&(r={px:e.clientX,py:e.clientY,rx:n.value.x,ry:n.value.y},window.addEventListener(`mousemove`,c),window.addEventListener(`mouseup`,l))}function d(e){e.button===0&&(e.stopPropagation(),i=!0,a={px:e.clientX,py:e.clientY,rw:n.value.w,rh:n.value.h},window.addEventListener(`mousemove`,c),window.addEventListener(`mouseup`,l))}function f(){n.value.x=Math.max(16,(window.innerWidth-n.value.w)/2),n.value.y=Math.max(16,(window.innerHeight-n.value.h)/2),Gt(e,n.value)}return g(()=>{window.removeEventListener(`mousemove`,c),window.removeEventListener(`mouseup`,l)}),{rect:n,panelStyle:o,startDrag:u,startResize:d,centerOnScreen:f,clampToViewport:s}}var qt={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`},Jt={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`},Yt=[{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 Xt(e,t){let n=e.toLowerCase(),r=(t?.split(`/`).pop()??e).toLowerCase();if(Jt[r])return Jt[r];if(Jt[n])return Jt[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&&qt[a]?qt[a]:r.includes(`nginx`)&&(r.endsWith(`.conf`)||r===`nginx.conf`)?`nginx`:`plaintext`}function Zt(e,t,n){return n&&n!==`auto`?n:Xt(e,t)}var Qt=Symbol.for(`vuetify:v-tabs`),$t=De({fixed:Boolean,sliderColor:String,sliderTransition:String,sliderTransitionDuration:[String,Number],hideSlider:Boolean,inset:Boolean,direction:{type:String,default:`horizontal`},...Ge(y({selectedClass:`v-tab--selected`,variant:`text`}),[`active`,`block`,`flat`,`location`,`position`,`symbol`])},`VTab`),en=Qe()({name:`VTab`,props:$t(),setup(e,{slots:t,attrs:n}){let{textColorClasses:r,textColorStyles:i}=Ye(()=>e.sliderColor),{backgroundColorClasses:a,backgroundColorStyles:s}=ke(()=>e.sliderColor),c=G(),l=G(),u=Y(()=>e.direction===`horizontal`),d=Y(()=>c.value?.group?.isSelected.value??!1);function p(e,t){return{opacity:[0,1]}}function m(t,n){return e.direction===`vertical`?{transform:[`scaleY(0)`,`scaleY(1)`]}:{transform:[`scaleX(0)`,`scaleX(1)`]}}function g(e,t){let n=t.getBoundingClientRect(),r=e.getBoundingClientRect(),i=u.value?`x`:`y`,a=u.value?`X`:`Y`,o=u.value?`right`:`bottom`,s=u.value?`width`:`height`,c=n[i]>r[i]?n[o]-r[o]:n[i]-r[i],l=Math.sign(c)>0?u.value?`right`:`bottom`:Math.sign(c)<0?u.value?`left`:`top`:`center`,d=(Math.abs(c)+(Math.sign(c)<0?n[s]:r[s]))/Math.max(n[s],r[s])||0,f=n[s]/r[s]||0,p=1.5;return{transform:[`translate${a}(${c}px) scale${a}(${f})`,`translate${a}(${c/p}px) scale${a}(${(d-1)/p+1})`,`none`],transformOrigin:[,,,].fill(l)}}function _({value:t}){if(t){let t=c.value?.$el.parentElement?.querySelector(`.v-tab--selected .v-tab__slider`),n=l.value;if(!t||!n)return;let r=getComputedStyle(t).backgroundColor,i={fade:p,grow:m,shift:g}[e.sliderTransition??`shift`]??g,a=Number(e.sliderTransitionDuration)||({fade:400,grow:350,shift:225}[e.sliderTransition??`shift`]??225);o(n,{backgroundColor:[r,r],...i(n,t)},{duration:a,easing:fe})}}return Ze(()=>{let o=h.filterProps(e);return f(h,b({symbol:Qt,ref:c,class:[`v-tab`,e.class,d.value&&e.inset?a.value:[]],style:[e.style,d.value&&e.inset?s.value:[],{backgroundColor:d.value&&e.inset?`transparent !important`:void 0}],tabindex:d.value?0:-1,role:`tab`,"aria-selected":String(d.value),active:!1},o,n,{block:e.fixed,maxWidth:e.fixed?300:void 0,"onGroup:selected":_}),{...t,default:()=>R(be,null,[t.default?.()??e.text,!e.hideSlider&&R(`div`,{ref:l,class:q([`v-tab__slider`,e.inset?a.value:r.value]),style:Ae([i.value,e.inset?s.value:r.value])},null)])})}),Ue({},c)}}),tn=e=>{let{touchstartX:t,touchendX:n,touchstartY:r,touchendY:i}=e,a=.5;e.offsetX=n-t,e.offsetY=i-r,Math.abs(e.offsetY)<a*Math.abs(e.offsetX)&&(e.left&&n<t-16&&e.left(e),e.right&&n>t+16&&e.right(e)),Math.abs(e.offsetX)<a*Math.abs(e.offsetY)&&(e.up&&i<r-16&&e.up(e),e.down&&i>r+16&&e.down(e))};function nn(e,t){let n=e.changedTouches[0];t.touchstartX=n.clientX,t.touchstartY=n.clientY,t.start?.({originalEvent:e,...t})}function rn(e,t){let n=e.changedTouches[0];t.touchendX=n.clientX,t.touchendY=n.clientY,t.end?.({originalEvent:e,...t}),tn(t)}function an(e,t){let n=e.changedTouches[0];t.touchmoveX=n.clientX,t.touchmoveY=n.clientY,t.move?.({originalEvent:e,...t})}function on(e={}){let t={touchstartX:0,touchstartY:0,touchendX:0,touchendY:0,touchmoveX:0,touchmoveY:0,offsetX:0,offsetY:0,left:e.left,right:e.right,up:e.up,down:e.down,start:e.start,move:e.move,end:e.end};return{touchstart:e=>nn(e,t),touchend:e=>rn(e,t),touchmove:e=>an(e,t)}}function sn(e,t){let n=t.value,r=n?.parent?e.parentElement:e,i=n?.options??{passive:!0},a=t.instance?.$.uid;if(!r||a===void 0)return;let o=on(t.value);r._touchHandlers=r._touchHandlers??Object.create(null),r._touchHandlers[a]=o,_e(o).forEach(e=>{r.addEventListener(e,o[e],i)})}function cn(e,t){let n=t.value?.parent?e.parentElement:e,r=t.instance?.$.uid;if(!n?._touchHandlers||r===void 0)return;let i=n._touchHandlers[r];_e(i).forEach(e=>{n.removeEventListener(e,i[e])}),delete n._touchHandlers[r]}var ln={mounted:sn,unmounted:cn},un=Symbol.for(`vuetify:v-window`),dn=Symbol.for(`vuetify:v-window-group`),fn=De({continuous:Boolean,nextIcon:{type:[Boolean,String,Function,Object],default:`$next`},prevIcon:{type:[Boolean,String,Function,Object],default:`$prev`},reverse:Boolean,showArrows:{type:[Boolean,String],validator:e=>typeof e==`boolean`||e===`hover`},verticalArrows:[Boolean,String],touch:{type:[Object,Boolean],default:void 0},direction:{type:String,default:`horizontal`},modelValue:null,disabled:Boolean,selectedClass:{type:String,default:`v-window-item--active`},mandatory:{type:[Boolean,String],default:`force`},crossfade:Boolean,transitionDuration:Number,...S(),...he(),...qe()},`VWindow`),pn=Qe()({name:`VWindow`,directives:{vTouch:ln},props:fn(),emits:{"update:modelValue":e=>!0},setup(e,{slots:t}){let{themeClasses:n}=me(e),{isRtl:r}=je(),{t:i}=Be(),a=Ee(e,dn),o=G(),s=Y(()=>r.value?!e.reverse:e.reverse),c=Re(!1),l=Y(()=>e.crossfade?`v-window-crossfade-transition`:`v-window-${e.direction===`vertical`?`y`:`x`}${(s.value?!c.value:c.value)?`-reverse`:``}-transition`),u=Re(0),d=G(void 0),p=Y(()=>a.items.value.findIndex(e=>a.selected.value.includes(e.id)));N(p,(e,t)=>{let n,r={left:0,top:0};ze&&t>=0&&(n=tt(o.value),r.left=n?.scrollLeft,r.top=n?.scrollTop);let i=a.items.value.length,s=i-1;i<=2?c.value=e<t:e===s&&t===0?c.value=!1:e===0&&t===s?c.value=!0:c.value=e<t,x(()=>{!ze||!n||(n.scrollTop!==r.top&&n.scrollTo({...r,behavior:`instant`}),requestAnimationFrame(()=>{n&&n.scrollTop!==r.top&&n.scrollTo({...r,behavior:`instant`})}))})},{flush:`sync`}),m(un,{transition:l,isReversed:c,transitionCount:u,transitionHeight:d,rootRef:o});let g=z(()=>e.continuous||p.value!==0),_=z(()=>e.continuous||p.value!==a.items.value.length-1);function v(){g.value&&a.prev()}function y(){_.value&&a.next()}let b=Y(()=>{let n=[],o={icon:r.value?e.nextIcon:e.prevIcon,class:`v-window__${s.value?`right`:`left`}`,onClick:a.prev,"aria-label":i(`$vuetify.carousel.prev`)};n.push(g.value?t.prev?t.prev({props:o}):f(h,o,null):R(`div`,null,null));let c={icon:r.value?e.prevIcon:e.nextIcon,class:`v-window__${s.value?`left`:`right`}`,onClick:a.next,"aria-label":i(`$vuetify.carousel.next`)};return n.push(_.value?t.next?t.next({props:c}):f(h,c,null):R(`div`,null,null)),n}),S=Y(()=>e.touch===!1?e.touch:{left:()=>{s.value?v():y()},right:()=>{s.value?y():v()},start:({originalEvent:e})=>{e.stopPropagation()},...e.touch===!0?{}:e.touch});function C(t){(e.direction===`horizontal`&&t.key===`ArrowLeft`||e.direction===`vertical`&&t.key===`ArrowUp`)&&(t.preventDefault(),v(),x(()=>{g.value?w(0):w(1)})),(e.direction===`horizontal`&&t.key===`ArrowRight`||e.direction===`vertical`&&t.key===`ArrowDown`)&&(t.preventDefault(),y(),x(()=>{_.value?w(1):w(0)}))}function w(e){let t=b.value[e];t&&(Array.isArray(t)?t[0]:t).el?.focus()}return Ze(()=>E(f(e.tag,{ref:o,class:q([`v-window`,{"v-window--show-arrows-on-hover":e.showArrows===`hover`,"v-window--vertical-arrows":!!e.verticalArrows,"v-window--crossfade":!!e.crossfade},n.value,e.class]),style:Ae([e.style,{"--v-window-transition-duration":Je()?null:D(e.transitionDuration,`ms`)}])},{default:()=>[R(`div`,{class:`v-window__container`,style:{height:d.value}},[t.default?.({group:a}),e.showArrows!==!1&&R(`div`,{class:q([`v-window__controls`,{"v-window__controls--left":e.verticalArrows===`left`||e.verticalArrows===!0},{"v-window__controls--right":e.verticalArrows===`right`}]),onKeydown:C},[b.value])]),t.additional?.({group:a})]}),[[ln,S.value]])),{group:a}}}),mn=De({...Ge(fn(),[`continuous`,`nextIcon`,`prevIcon`,`showArrows`,`touch`,`mandatory`])},`VTabsWindow`),hn=Qe()({name:`VTabsWindow`,props:mn(),emits:{"update:modelValue":e=>!0},setup(e,{slots:t}){let n=s(Qt,null),r=Se(e,`modelValue`),i=Y({get(){return r.value!=null||!n?r.value:n.items.value.find(e=>n.selected.value.includes(e.id))?.value},set(e){r.value=e}});return Ze(()=>f(pn,b({_as:`VTabsWindow`},pn.filterProps(e),{modelValue:i.value,"onUpdate:modelValue":e=>i.value=e,class:[`v-tabs-window`,e.class],style:e.style,mandatory:!1,touch:!1}),t)),{}}}),gn=De({reverseTransition:{type:[Boolean,String],default:void 0},transition:{type:[Boolean,String],default:void 0},...S(),...Ie(),...Ke()},`VWindowItem`),_n=Qe()({name:`VWindowItem`,directives:{vTouch:ln},props:gn(),emits:{"group:selected":e=>!0},setup(e,{slots:t}){let n=s(un),r=ue(e,dn),{isBooted:i}=l();if(!n||!r)throw Error(`[Vuetify] VWindowItem must be used inside VWindow`);let a=Re(!1),o=Y(()=>i.value&&(n.isReversed.value?e.reverseTransition!==!1:e.transition!==!1));function c(){!a.value||!n||(a.value=!1,n.transitionCount.value>0&&(--n.transitionCount.value,n.transitionCount.value===0&&(n.transitionHeight.value=void 0)))}function u(){a.value||!n||(a.value=!0,n.transitionCount.value===0&&(n.transitionHeight.value=D(n.rootRef.value?.clientHeight)),n.transitionCount.value+=1)}function p(){c()}function m(e){a.value&&x(()=>{!o.value||!a.value||!n||(n.transitionHeight.value=D(e.clientHeight))})}let h=Y(()=>{let t=n.isReversed.value?e.reverseTransition:e.transition;return o.value?{name:typeof t==`string`?t:n.transition.value,onBeforeEnter:u,onAfterEnter:c,onEnterCancelled:p,onBeforeLeave:u,onAfterLeave:c,onLeaveCancelled:p,onEnter:m}:!1}),{hasContent:g}=pe(e,r.isSelected);return Ze(()=>f(d,{transition:h.value,disabled:!i.value},{default:()=>[E(R(`div`,{class:q([`v-window-item`,r.selectedClass.value,e.class]),style:Ae(e.style)},[g.value&&t.default?.()]),[[Ve,r.isSelected.value]])]})),{groupItem:r}}}),vn=De({...gn()},`VTabsWindowItem`),yn=Qe()({name:`VTabsWindowItem`,props:vn(),setup(e,{slots:t}){return Ze(()=>f(_n,b({_as:`VTabsWindowItem`},_n.filterProps(e),{class:[`v-tabs-window-item`,e.class],style:e.style}),t)),{}}});function bn(e){return e?e.map(e=>re(e)?e:{text:e,value:e}):[]}var xn=De({alignTabs:{type:String,default:`start`},color:String,fixedTabs:Boolean,items:{type:Array,default:()=>[]},stacked:Boolean,bgColor:String,grow:Boolean,height:{type:[Number,String],default:void 0},hideSlider:Boolean,inset:Boolean,insetPadding:[String,Number],insetRadius:[String,Number],sliderColor:String,...Te($t(),[`spaced`,`sliderTransition`,`sliderTransitionDuration`]),...$e({mandatory:`force`,selectedClass:`v-tab-item--selected`}),...xe(),...he()},`VTabs`),Sn=Qe()({name:`VTabs`,props:xn(),emits:{"update:modelValue":e=>!0},setup(e,{attrs:t,slots:n}){let r=Se(e,`modelValue`),i=Y(()=>bn(e.items)),{densityClasses:a}=L(e),{backgroundColorClasses:o,backgroundColorStyles:s}=ke(()=>e.bgColor),{scopeId:c}=Le();return ee({VTab:{color:z(e,`color`),direction:z(e,`direction`),stacked:z(e,`stacked`),fixed:z(e,`fixedTabs`),inset:z(e,`inset`),sliderColor:z(e,`sliderColor`),sliderTransition:z(e,`sliderTransition`),sliderTransitionDuration:z(e,`sliderTransitionDuration`),hideSlider:z(e,`hideSlider`)}}),Ze(()=>{let l=de.filterProps(e),u=!!(n.window||e.items.length>0);return R(be,null,[f(de,b(l,{modelValue:r.value,"onUpdate:modelValue":e=>r.value=e,class:[`v-tabs`,`v-tabs--${e.direction}`,`v-tabs--align-tabs-${e.alignTabs}`,{"v-tabs--fixed-tabs":e.fixedTabs,"v-tabs--grow":e.grow,"v-tabs--inset":e.inset,"v-tabs--stacked":e.stacked},a.value,o.value,e.class],style:[{"--v-tabs-height":D(e.height),"--v-tabs-inset-padding":e.inset?D(e.insetPadding):void 0,"--v-tabs-inset-radius":e.inset?D(e.insetRadius):void 0},s.value,e.style],role:`tablist`,symbol:Qt},c,t),{default:n.default??(()=>i.value.map(t=>n.tab?.({item:t})??f(en,b(t,{key:t.text,value:t.value,spaced:e.spaced}),{default:n[`tab.${t.value}`]?()=>n[`tab.${t.value}`]?.({item:t}):void 0}))),prev:n.prev,next:n.next}),u&&f(hn,b({modelValue:r.value,"onUpdate:modelValue":e=>r.value=e,key:`tabs-window`},c),{default:()=>[i.value.map(e=>n.item?.({item:e})??f(yn,{value:e.value},{default:()=>n[`item.${e.value}`]?.({item:e})})),n.window?.()]})])}),{}}}),Cn={class:`text-truncate`,style:{"max-width":`130px`}},wn={key:0,class:`text-warning ml-1`,style:{"font-size":`10px`}},Tn={class:`file-editor-main d-flex flex-grow-1 min-h-0`},En={class:`file-editor-content d-flex flex-column flex-grow-1 min-w-0 min-h-0`},Dn={class:`file-editor-body flex-grow-1 position-relative min-h-0`},On={class:`file-editor-status text-caption px-3 py-1 d-flex flex-wrap align-center ga-3`},kn={class:`text-mono`},An={key:0,class:`text-primary`,style:{"font-size":`11px`}},jn={class:`text-truncate flex-grow-1 text-medium-emphasis`},Mn={key:2,class:`text-warning`},Nn={key:0,class:`text-warning ml-1`},Pn=`nexus_file_editor_float`,Fn=st(C({__name:`FileEditorWorkbench`,props:{serverId:{},currentPath:{}},emits:[`saved`,`closed`,`path-change`,`paste-target`],setup(e,{expose:t,emit:r}){let i=at(),a=e,o=r,s=n(),c=Math.min(1120,Math.round(window.innerWidth*.88)),l=Math.min(760,Math.round(window.innerHeight*.82)),{panelStyle:d,startDrag:p,startResize:m,clampToViewport:v}=Kt(Pn,{x:Math.max(24,(window.innerWidth-c)/2),y:Math.max(24,(window.innerHeight-l)/2),w:c,h:l}),y=Re([]),b=G(null),S=G(!1),C=G(!1),w=G(!1),E=G(!1),D=G(!1),O=G(1),ee=G(1),ne=G(a.currentPath||`/www/wwwroot`),re=Y(()=>{let e=Q(a.currentPath||`/www/wwwroot`);return e===`/`||e.startsWith(`/www/wwwroot`)?Mt:e}),M=G(!0),ie=G(!1),P=G(null),oe=G(),L=null,ce=null,le=0;function ue(){y.value=y.value.slice()}function de(e,t){e.modified!==t&&(e.modified=t,ue())}let fe=G(null),pe=G(!1),z=Y(()=>y.value.find(e=>e.id===b.value)??null),me=Y(()=>z.value?Zt(z.value.name,z.value.path,z.value.languageId):`plaintext`),he=Y({get:()=>{let e=z.value?.languageId;return e==null||e===``?`auto`:String(e)},set:e=>{if(!z.value)return;let t=e==null?`auto`:String(e);z.value.languageId=t===`auto`?null:t}}),_e=Y(()=>C.value?void 0:d.value),ve=Y(()=>pe.value?`关闭编辑器`:`关闭文件`),ye=Y(()=>{let e=(fe.value?y.value.find(e=>e.id===fe.value):y.value.find(e=>e.modified))?.name??`文件`;return pe.value?`「${e}」等未保存的更改将丢失,确定吗?`:`「${e}」已修改但未保存,确定要关闭吗?`}),xe=Y(()=>P.value?y.value.find(e=>e.id===P.value)?.name??``:``);function H(e){return e.replace(/\r\n/g,`
`).replace(/\r/g,`
`)}function Se(e,t){let n=H(e);return t===`CRLF`?n.replace(/\n/g,`\r
`):n}function Ce(e){return Zt(e.name,e.path,e.languageId)}function we(e){return`${a.serverId}:${Q(e)}`}function Te(e){let t=Ft(Q(e));t&&(ne.value=t)}function Ee(e){ne.value=Q(e),o(`path-change`,ne.value)}function De(e){C.value||e.target.closest(`button, .v-tab, .v-btn, input, a`)||p(e)}function Oe(){if(!L)return;let e=L.getPosition();O.value=e?.lineNumber??1,ee.value=e?.column??1}function ke(e=!1){if(!L||!z.value)return;let t=z.value,n=L.saveViewState();t.viewState=n?ge(n):null;let r=()=>{!L||z.value?.id!==t.id||(t.content=H(L.getValue()),de(t,t.content!==t.originalContent))};if(e){ce&&=(clearTimeout(ce),null),r();return}ce&&clearTimeout(ce),ce=setTimeout(r,250)}async function K(){let e=++le;if(await x(),await x(),e!==le||!z.value)return;Fe();let t=(n=0)=>{if(e!==le||!L)return;L.layout();let r=oe.value;r&&(r.clientWidth<2||r.clientHeight<2)&&n<12&&setTimeout(()=>t(n+1),50)};requestAnimationFrame(()=>t())}function je(){le++,ce&&=(clearTimeout(ce),null),L?.dispose(),L=null,E.value=!1}function Me(){for(let e of y.value)e.model?.dispose();y.value=[],b.value=null,je(),C.value=!1,S.value=!1}function Ne(e){let t=z.value;!t||!t.model||(t.languageId=e===`auto`||!e?null:e,i.editor.setModelLanguage(t.model,Ce(t)))}function Pe(e){if(L){if(!e.model){let t=Ce(e),n=H(e.content);e.model=ge(i.editor.createModel(n,t,i.Uri.parse(`nexus://${a.serverId}${e.path}`)))}L.setModel(e.model),e.viewState&&L.restoreViewState(e.viewState),i.editor.setModelLanguage(e.model,Ce(e)),Te(e.path),Oe()}}function Fe(){if(!oe.value||!z.value)return;je(),E.value=!1;let e=z.value;if(!e.model){let t=Ce(e),n=H(e.content);e.model=ge(i.editor.createModel(n,t,i.Uri.parse(`nexus://${a.serverId}${e.path}`)))}L=i.editor.create(oe.value,{...ot(),model:e.model,wordWrap:M.value?`on`:`off`,automaticLayout:!0}),e.viewState&&L.restoreViewState(e.viewState),L.onDidChangeModelContent(()=>{ke(),Oe()}),L.onDidChangeCursorPosition(()=>{Oe()}),L.addCommand(i.KeyMod.CtrlCmd|i.KeyCode.KeyS,()=>{qe()}),L.addCommand(i.KeyCode.Escape,()=>{C.value&&=!1}),L.addCommand(i.KeyMod.Alt|i.KeyCode.KeyZ,()=>{Ke()}),Te(e.path),it(i),E.value=!0,Oe()}function Ie(e){if(typeof e!=`string`||!e)return;ke(!0),b.value=e;let t=y.value.find(t=>t.id===e);t&&(L?Pe(t):K())}function Le(e){b.value=e,S.value=!1,x(()=>{v();let t=y.value.find(t=>t.id===e);t&&(L?Pe(t):K())})}function ze(e){let t=we(e.path),n=y.value.find(e=>e.id===t);if(n){b.value=t,S.value=!1,K().then(()=>{L&&Pe(n)});return}try{let n=H(e.content),r=Zt(e.name,e.path,null),o=i.Uri.parse(`nexus://${a.serverId}${e.path}`),s=i.editor.getModel(o);s&&s.dispose();let c=ge(i.editor.createModel(n,r,o));y.value=[...y.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:c,viewState:null}],b.value=t,S.value=!1,Te(e.path),K()}catch(e){s(e instanceof Error?e.message:`无法打开编辑器`,`error`),console.error(`[FileEditorWorkbench] openFile failed`,e)}}function Be(e){let t=y.value.findIndex(t=>t.id===e);if(!(t<0)){if(y.value[t].model?.dispose(),y.value=y.value.filter(t=>t.id!==e),y.value.length===0){b.value=null,je(),C.value=!1,S.value=!1,o(`closed`);return}if(b.value===e){let e=y.value[Math.min(t,y.value.length-1)];b.value=e.id,K().then(()=>{let t=y.value.find(t=>t.id===e.id);t&&L&&Pe(t)})}}}function Ve(e){let t=y.value.find(t=>t.id===e);if(!t)return;if(b.value===e&&ke(!0),t.modified){fe.value=e,pe.value=!1,D.value=!0;return}let n=b.value===e;n&&je(),Be(e),n&&b.value&&K()}function He(){if(ke(!0),y.value.some(e=>e.modified)){fe.value=null,pe.value=!0,D.value=!0;return}Me(),o(`closed`)}function Ue(){D.value=!1,fe.value=null,pe.value=!1}function We(){if(D.value=!1,pe.value)Me(),o(`closed`);else if(fe.value){let e=fe.value,t=b.value===e;t&&je(),Be(e),t&&b.value&&K()}fe.value=null,pe.value=!1}async function Ge(){let e=pe.value,t=fe.value;if(await qe(),D.value=!1,pe.value=!1,fe.value=null,e){y.value.some(e=>e.modified)||(Me(),o(`closed`));return}if(t){let e=y.value.find(e=>e.id===t);if(e&&!e.modified){let e=b.value===t;e&&je(),Be(t),e&&b.value&&K()}}}function Ke(){M.value=!M.value,L?.updateOptions({wordWrap:M.value?`on`:`off`})}async function qe(e=!1){if(!a.serverId){s(`请先选择服务器`,`error`);return}ke(!0);let t=z.value;if(!t||!t.modified)return;let n=Se(L?.getValue()??t.content,t.eol);w.value=!0;try{let r=await V.post(`/sync/write-file`,{server_id:a.serverId,path:t.path,content:n,etag:e?null:t.etag}),i=H(n);t.content=i,t.originalContent=i,de(t,!1),t.etag=r?.etag??null,ue(),s(`文件已保存`),o(`saved`,t.path)}catch(e){if(e instanceof ae&&e.status===409){P.value=t.id,ie.value=!0;return}s(e instanceof ae||e instanceof Error?e.message:`保存失败`,`error`)}finally{w.value=!1}}function Je(){ie.value=!1,P.value=null}async function Ye(){ie.value=!1;let e=P.value;P.value=null,!(!e||b.value!==e)&&await qe(!0)}function Ze(){ie.value=!1;let e=P.value;if(P.value=null,!e)return;let t=y.value.find(t=>t.id===e);if(t){if(t.content=t.originalContent,de(t,!1),t.model){let e=Se(t.originalContent,t.eol);t.model.setValue(H(e))}ue(),s(`已放弃本地修改`,`info`)}}N(()=>a.currentPath,e=>{e&&(ne.value=Q(e))}),N(C,()=>{x(()=>L?.layout())}),N(S,e=>{e||x(()=>L?.layout())});function Qe(){return y.value.length>0}return t({openFile:ze,hasOpenTabs:Qe}),g(()=>{for(let e of y.value)e.model?.dispose();je()}),(t,n)=>(j(),u(be,null,[(j(),J(se,{to:`body`},[y.value.length>0&&!S.value&&z.value?(j(),u(`div`,{key:0,class:q([`file-editor-float`,{"file-editor-float--maximized":C.value}]),style:Ae(_e.value)},[f(X,{border:``,rounded:`lg`,class:`file-editor-panel d-flex flex-column h-100`},{default:F(()=>[R(`div`,{class:q([`file-editor-toolbar d-flex align-center flex-shrink-0`,{"file-editor-toolbar--draggable":!C.value}]),onMousedown:De},[C.value?k(``,!0):(j(),J(T,{key:0,size:`16`,class:`ml-2 mr-1 text-disabled file-editor-drag-hint`,onMousedown:n[0]||=W(()=>{},[`stop`])},{default:F(()=>[...n[19]||=[A(` mdi-drag `,-1)]]),_:1})),f(Sn,{"model-value":b.value??void 0,density:`compact`,"show-arrows":``,class:`file-editor-tabs flex-grow-1 min-w-0`,"onUpdate:modelValue":Ie,onMousedown:n[1]||=W(()=>{},[`stop`])},{default:F(()=>[(j(!0),u(be,null,te(y.value,e=>(j(),J(en,{key:e.id,value:e.id,class:`text-none px-2`},{default:F(()=>[R(`span`,Cn,U(e.name),1),e.modified?(j(),u(`span`,wn,`●`)):k(``,!0),f(h,{icon:`mdi-close`,size:`x-small`,variant:`text`,class:`ml-1 opacity-60`,density:`compact`,onClick:W(t=>Ve(e.id),[`stop`])},null,8,[`onClick`])]),_:2},1032,[`value`]))),128))]),_:1},8,[`model-value`]),f(Xe,{vertical:``,class:`mx-1`,style:{height:`20px`,"align-self":`center`},onMousedown:n[2]||=W(()=>{},[`stop`])}),f(ft,{modelValue:he.value,"onUpdate:modelValue":[n[3]||=e=>he.value=e,Ne],items:B(Yt),"item-title":`title`,"item-value":`value`,density:`compact`,variant:`plain`,"hide-details":``,class:`file-editor-lang-select flex-shrink-0`,onMousedown:n[4]||=W(()=>{},[`stop`])},null,8,[`modelValue`,`items`]),f(h,{size:`small`,variant:`text`,color:M.value?`primary`:void 0,title:M.value?`关闭自动换行 (Alt+Z)`:`开启自动换行 (Alt+Z)`,density:`compact`,class:`flex-shrink-0 text-none px-2`,onMousedown:n[5]||=W(()=>{},[`stop`]),onClick:Ke},{default:F(()=>[...n[20]||=[A(` 自动换行 `,-1)]]),_:1},8,[`color`,`title`]),f(Xe,{vertical:``,class:`mx-1`,style:{height:`20px`,"align-self":`center`},onMousedown:n[6]||=W(()=>{},[`stop`])}),f(h,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-save`,loading:w.value,disabled:!z.value?.modified||!E.value,class:`flex-shrink-0 mr-1`,onMousedown:n[7]||=W(()=>{},[`stop`]),onClick:qe},{default:F(()=>[...n[21]||=[A(` 保存 `,-1)]]),_:1},8,[`loading`,`disabled`]),f(h,{size:`small`,variant:`text`,icon:C.value?`mdi-fullscreen-exit`:`mdi-fullscreen`,title:C.value?`退出全屏 (Esc)`:`全屏`,density:`compact`,onMousedown:n[8]||=W(()=>{},[`stop`]),onClick:n[9]||=e=>C.value=!C.value},null,8,[`icon`,`title`]),f(h,{size:`small`,variant:`text`,icon:`mdi-window-minimize`,title:`最小化`,density:`compact`,onMousedown:n[10]||=W(()=>{},[`stop`]),onClick:n[11]||=e=>S.value=!0}),f(h,{size:`small`,variant:`text`,icon:`mdi-close`,title:`关闭编辑器`,density:`compact`,class:`mr-1`,onMousedown:n[12]||=W(()=>{},[`stop`]),onClick:He})],34),R(`div`,Tn,[R(`aside`,{class:`file-editor-sidebar flex-shrink-0`,onMousedown:n[14]||=W(()=>{},[`stop`])},[f(Ut,{embedded:``,"server-id":e.serverId||null,"root-path":re.value,"current-path":ne.value,onNavigate:Ee,onPasteTarget:n[13]||=e=>o(`paste-target`,e)},null,8,[`server-id`,`root-path`,`current-path`])],32),R(`div`,En,[R(`div`,Dn,[E.value?k(``,!0):(j(),J(_,{key:0,indeterminate:``,absolute:``,class:`file-editor-progress`})),R(`div`,{ref_key:`editorHost`,ref:oe,class:`file-editor-host`},null,512)]),R(`div`,On,[R(`span`,kn,U(O.value)+`:`+U(ee.value),1),f(Xe,{vertical:``,style:{height:`12px`}}),R(`span`,null,U(me.value),1),f(Xe,{vertical:``,style:{height:`12px`}}),M.value?(j(),u(`span`,An,`换行`)):k(``,!0),M.value?(j(),J(Xe,{key:1,vertical:``,style:{height:`12px`}})):k(``,!0),R(`span`,jn,U(z.value?.path??``),1),z.value?.modified?(j(),u(`span`,Mn,`未保存`)):k(``,!0)])])]),C.value?k(``,!0):(j(),u(`div`,{key:0,class:`file-editor-resize`,title:`拖动调整大小`,onMousedown:n[15]||=W((...e)=>B(m)&&B(m)(...e),[`stop`])},null,32))]),_:1})],6)):k(``,!0),y.value.length>0&&S.value?(j(),J(X,{key:1,border:``,rounded:`lg`,class:`file-editor-dock`},{default:F(()=>[n[22]||=R(`span`,{class:`text-caption text-medium-emphasis mr-2`},`编辑器`,-1),(j(!0),u(be,null,te(y.value,e=>(j(),J(et,{key:e.id,size:`small`,color:e.id===b.value?`primary`:void 0,variant:`tonal`,class:`cursor-pointer`,onClick:t=>Le(e.id)},{default:F(()=>[A(U(e.name)+` `,1),e.modified?(j(),u(`span`,Nn,`●`)):k(``,!0)]),_:2},1032,[`color`,`onClick`]))),128)),f(I),f(h,{size:`x-small`,variant:`text`,icon:`mdi-dock-window`,title:`展开`,onClick:n[16]||=e=>S.value=!1}),f(h,{size:`x-small`,variant:`text`,icon:`mdi-close`,title:`关闭全部`,onClick:He})]),_:1})):k(``,!0)])),f(gt,{modelValue:D.value,"onUpdate:modelValue":n[17]||=e=>D.value=e,"max-width":`400`},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,null,{default:F(()=>[A(U(ve.value),1)]),_:1}),f(Z,null,{default:F(()=>[A(U(ye.value),1)]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:Ue},{default:F(()=>[...n[23]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`error`,variant:`flat`,onClick:We},{default:F(()=>[...n[24]||=[A(`不保存`,-1)]]),_:1}),f(h,{color:`primary`,variant:`flat`,onClick:Ge},{default:F(()=>[...n[25]||=[A(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),f(gt,{modelValue:ie.value,"onUpdate:modelValue":n[18]||=e=>ie.value=e,"max-width":`440`,persistent:``},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,{class:`text-warning`},{default:F(()=>[f(T,{start:``},{default:F(()=>[...n[26]||=[A(`mdi-alert-outline`,-1)]]),_:1}),n[27]||=A(` 文件冲突 `,-1)]),_:1}),f(Z,null,{default:F(()=>[A(` 「`+U(xe.value)+`」已被外部修改。`,1),n[28]||=R(`br`,null,null,-1),n[29]||=R(`strong`,null,`覆盖`,-1),n[30]||=A(`会以当前编辑内容覆盖服务器版本;`,-1),n[31]||=R(`strong`,null,`放弃`,-1),n[32]||=A(`会丢弃本地修改。 `,-1)]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:Je},{default:F(()=>[...n[33]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`error`,variant:`flat`,onClick:Ze},{default:F(()=>[...n[34]||=[A(`放弃本地修改`,-1)]]),_:1}),f(h,{color:`warning`,variant:`flat`,onClick:Ye},{default:F(()=>[...n[35]||=[A(`强制覆盖`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-509107ff`]]);function In(e){return e==null?``:String(e).trim()}function Ln(e){if(e.type===`symlink`)return`—`;let t=In(e.owner),n=In(e.group);return t?!n||n===t?t:`${t}:${n}`:`—`}function Rn(e){if(e===`root`)return`warning`}function zn(e){let t=[];e.permissions&&t.push(e.permissions),e.mode_octal&&t.push(e.mode_octal);let n=In(e.owner),r=In(e.group);return n&&t.push(r&&r!==n?`${n}:${r}`:n),t.join(` · `)||`—`}var Bn=[{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`}],Vn=`docs/deploy/nexus-files-sudoers.example`;function Hn(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 Un(e,t){if(!t||t===`root`||e.type!==`file`)return!1;let n=e.permissions??``;if(n.length<10)return!1;let r=In(e.owner),i=In(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 Wn(){return`目标机安装示例:${Vn}(复制到 /etc/sudoers.d/nexus-files 后执行 visudo -cf 校验)`}function Gn(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?` ${Wn()}`:``;return{type:!e.canSudo||e.filesElevation===`off`?`error`:`warning`,text:`${t.join(` `)}${r}`}}var Kn={key:0,class:`text-body-2 mb-3 text-medium-emphasis`},qn={key:1,class:`text-caption mb-4`},Jn={class:`d-flex flex-wrap ga-2 mb-4`},Yn={class:`d-flex align-center flex-wrap ga-2 mb-2`},Xn={class:`text-body-2`},Zn={key:0,class:`text-caption mt-1`},Qn={class:`text-caption text-medium-emphasis mb-0`},$n=C({__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=G(``),a=G(``),o=G(``),s=G(null),c=G(!1),l=G(!1),d=Y(()=>n.file?.type===`directory`),m=Y(()=>n.file?.name??``),g=Y(()=>n.file?zn(n.file):``),_=Y(()=>{let e=n.file?.type===`directory`?`directory`:`file`;return Bn.filter(t=>t.for===e||t.for===`file`)}),v=Y(()=>s.value?s.value.is_root||s.value.can_sudo_nopasswd&&s.value.whitelist_ok?`success`:s.value.can_sudo_nopasswd?`warning`:`error`:`info`);N(()=>[n.modelValue,n.file],([e,t])=>{!e||!t||(i.value=t.mode_octal||``,a.value=t.owner||``,o.value=t.group&&t.group!==t.owner?t.group:``,l.value=!1,s.value=null,n.serverId&&b())});function y(e){return e===`off`?`关闭提权`:e===`always_sudo`?`始终 sudo`:`自动 sudo`}async function b(){if(n.serverId){c.value=!0;try{s.value=await V.get(`/servers/${n.serverId}/files-capability`)}catch(e){s.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{c.value=!1}}}function x(e){return t=>!!String(t||``).trim()||`${e}不能为空`}function S(e){return/^[0-7]{3,4}$/.test(String(e||``).trim())||`格式: 34 位八进制`}let C=/^[a-zA-Z0-9_.-]+$/;function w(e){let t=String(e||``).trim();return t?C.test(t)||`仅允许字母、数字、._-`:!0}function T(e){let t=String(e||``).trim();return t?a.value.trim()?C.test(t)||`仅允许字母、数字、._-`:`请先填写属主`:!0}function E(e){i.value=e}function D(){let e=i.value.trim();if(!/^[0-7]{3,4}$/.test(e))return;let t=a.value.trim(),s=o.value.trim(),c=d.value&&l.value;if(c){let t=n.file?.name??`该目录`;if(!window.confirm(`确认对目录「${t}」及其全部子项递归应用权限 ${e}?此操作影响范围大且不可自动撤销。`))return}r(`apply`,{mode:e,owner:t||void 0,group:s||void 0,recursive:c||void 0})}return(t,n)=>(j(),J(gt,{"model-value":e.modelValue,"max-width":`520`,"onUpdate:modelValue":n[5]||=e=>r(`update:modelValue`,e)},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,null,{default:F(()=>[...n[6]||=[A(`修改权限`,-1)]]),_:1}),f(Z,null,{default:F(()=>[m.value?(j(),u(`p`,Kn,U(m.value),1)):k(``,!0),g.value?(j(),u(`p`,qn,` 当前:`+U(g.value),1)):k(``,!0),R(`div`,Jn,[(j(!0),u(be,null,te(_.value,e=>(j(),J(et,{key:e.mode+e.label,size:`small`,variant:`tonal`,color:`primary`,onClick:t=>E(e.mode)},{default:F(()=>[A(U(e.label),1)]),_:2},1032,[`onClick`]))),128))]),f(dt,{modelValue:i.value,"onUpdate:modelValue":n[0]||=e=>i.value=e,label:`八进制权限`,variant:`outlined`,density:`compact`,placeholder:`644 / 755`,rules:[x(`权限`),S],class:`mb-2`,onKeydown:Me(D,[`enter`])},null,8,[`modelValue`,`rules`]),f(dt,{modelValue:a.value,"onUpdate:modelValue":n[1]||=e=>a.value=e,label:`属主(可选)`,variant:`outlined`,density:`compact`,placeholder:`www`,rules:[w],class:`mb-2`},null,8,[`modelValue`,`rules`]),f(dt,{modelValue:o.value,"onUpdate:modelValue":n[2]||=e=>o.value=e,label:`属组(可选)`,variant:`outlined`,density:`compact`,placeholder:`www`,rules:[T],class:`mb-2`},null,8,[`modelValue`,`rules`]),d.value?(j(),J(pt,{key:2,modelValue:l.value,"onUpdate:modelValue":n[3]||=e=>l.value=e,label:`同时修改子项(递归 chmod/chown`,density:`compact`,"hide-details":``,color:`warning`,class:`mb-2`},null,8,[`modelValue`])):k(``,!0),f(Xe,{class:`my-4`}),R(`div`,Yn,[n[8]||=R(`span`,{class:`text-caption text-medium-emphasis`},`提权能力`,-1),f(h,{size:`small`,variant:`tonal`,loading:c.value,disabled:!e.serverId,onClick:b},{default:F(()=>[...n[7]||=[A(` 检测提权能力 `,-1)]]),_:1},8,[`loading`,`disabled`])]),s.value?(j(),J(p,{key:3,type:v.value,variant:`tonal`,density:`compact`,class:`mb-2`},{default:F(()=>[R(`div`,Xn,U(s.value.message),1),s.value.ssh_user?(j(),u(`div`,Zn,` SSH 用户:`+U(s.value.ssh_user)+` · 策略:`+U(y(s.value.files_elevation)),1)):k(``,!0)]),_:1},8,[`type`])):k(``,!0),R(`p`,Qn,[n[9]||=A(` 非 root 用户写/chmod 失败时将按服务器策略尝试 `,-1),n[10]||=R(`code`,null,`sudo -n`,-1),A(`。 `+U(B(Wn)()),1)])]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:n[4]||=e=>r(`update:modelValue`,!1)},{default:F(()=>[...n[11]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`primary`,variant:`flat`,loading:e.loading,onClick:D},{default:F(()=>[...n[12]||=[A(`应用`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),er={class:`text-body-2 mb-3`},tr={class:`text-body-2 mb-2 text-truncate`},nr={class:`text-truncate`},rr={key:1,class:`files-preview-body text-body-2`},ir=st(C({__name:`FilesDialogs`,setup(e){let t=xt();return(e,n)=>(j(),u(be,null,[f(gt,{modelValue:B(t).showUpload,"onUpdate:modelValue":n[2]||=e=>B(t).showUpload=e,"max-width":`500`},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,null,{default:F(()=>[...n[25]||=[A(`上传文件`,-1)]]),_:1}),f(Z,null,{default:F(()=>[f(_t,{modelValue:B(t).uploadFiles,"onUpdate:modelValue":n[0]||=e=>B(t).uploadFiles=e,label:`选择文件`,variant:`outlined`,multiple:``,"show-size":``},null,8,[`modelValue`])]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:n[1]||=e=>B(t).showUpload=!1},{default:F(()=>[...n[26]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`primary`,variant:`flat`,loading:B(t).uploading,onClick:B(t).doUpload},{default:F(()=>[...n[27]||=[A(`上传`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),f(gt,{modelValue:B(t).showNewFile,"onUpdate:modelValue":n[5]||=e=>B(t).showNewFile=e,"max-width":`400`},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,null,{default:F(()=>[...n[28]||=[A(`新建文件`,-1)]]),_:1}),f(Z,null,{default:F(()=>[f(dt,{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:Me(B(t).doNewFile,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:n[4]||=e=>B(t).showNewFile=!1},{default:F(()=>[...n[29]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`primary`,variant:`flat`,loading:B(t).actionLoading,onClick:B(t).doNewFile},{default:F(()=>[...n[30]||=[A(`创建`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),f(gt,{modelValue:B(t).showMkdir,"onUpdate:modelValue":n[8]||=e=>B(t).showMkdir=e,"max-width":`400`},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,null,{default:F(()=>[...n[31]||=[A(`新建目录`,-1)]]),_:1}),f(Z,null,{default:F(()=>[f(dt,{modelValue:B(t).mkdirName,"onUpdate:modelValue":n[6]||=e=>B(t).mkdirName=e,label:`目录名`,variant:`outlined`,density:`compact`,rules:[B(t).validatePathSegment],onKeydown:Me(B(t).doMkdir,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:n[7]||=e=>B(t).showMkdir=!1},{default:F(()=>[...n[32]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`primary`,variant:`flat`,onClick:B(t).doMkdir},{default:F(()=>[...n[33]||=[A(`创建`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),f(gt,{modelValue:B(t).showFileDelete,"onUpdate:modelValue":n[10]||=e=>B(t).showFileDelete=e,"max-width":`400`},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,null,{default:F(()=>[...n[34]||=[A(`确认删除`,-1)]]),_:1}),f(Z,null,{default:F(()=>[n[35]||=A(` 确定要删除 `,-1),R(`strong`,null,U(B(t).deletingFile?.name),1),n[36]||=A(` 吗? `,-1)]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:n[9]||=e=>B(t).showFileDelete=!1},{default:F(()=>[...n[37]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`error`,variant:`flat`,onClick:B(t).doDeleteFile},{default:F(()=>[...n[38]||=[A(`删除`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),f(gt,{modelValue:B(t).showRename,"onUpdate:modelValue":n[13]||=e=>B(t).showRename=e,"max-width":`400`},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,null,{default:F(()=>[...n[39]||=[A(`重命名`,-1)]]),_:1}),f(Z,null,{default:F(()=>[f(dt,{modelValue:B(t).newName,"onUpdate:modelValue":n[11]||=e=>B(t).newName=e,label:`新名称`,variant:`outlined`,density:`compact`,rules:[B(t).required(`名称`)],autofocus:``,onKeydown:Me(B(t).doRename,[`enter`])},null,8,[`modelValue`,`rules`,`onKeydown`])]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:n[12]||=e=>B(t).showRename=!1},{default:F(()=>[...n[40]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`primary`,variant:`flat`,onClick:B(t).doRename},{default:F(()=>[...n[41]||=[A(`确定`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),f($n,{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`]),f(gt,{modelValue:B(t).showCompress,"onUpdate:modelValue":n[18]||=e=>B(t).showCompress=e,"max-width":`440`},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,null,{default:F(()=>[...n[42]||=[A(`压缩`,-1)]]),_:1}),f(Z,null,{default:F(()=>[R(`p`,er,`将压缩 `+U(B(t).compressPaths.length)+` 项到当前目录`,1),f(dt,{modelValue:B(t).compressDest,"onUpdate:modelValue":n[15]||=e=>B(t).compressDest=e,label:`压缩包路径`,variant:`outlined`,density:`compact`},null,8,[`modelValue`]),f(ft,{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}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:n[17]||=e=>B(t).showCompress=!1},{default:F(()=>[...n[43]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`primary`,variant:`flat`,loading:B(t).actionLoading,onClick:B(t).doCompress},{default:F(()=>[...n[44]||=[A(`压缩`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),f(gt,{modelValue:B(t).showDecompress,"onUpdate:modelValue":n[21]||=e=>B(t).showDecompress=e,"max-width":`440`},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,null,{default:F(()=>[...n[45]||=[A(`解压`,-1)]]),_:1}),f(Z,null,{default:F(()=>[R(`p`,tr,U(B(t).decompressSource),1),f(dt,{modelValue:B(t).decompressDest,"onUpdate:modelValue":n[19]||=e=>B(t).decompressDest=e,label:`解压到目录`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:n[20]||=e=>B(t).showDecompress=!1},{default:F(()=>[...n[46]||=[A(`取消`,-1)]]),_:1}),f(h,{color:`primary`,variant:`flat`,loading:B(t).actionLoading,onClick:B(t).doDecompress},{default:F(()=>[...n[47]||=[A(`解压`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),f(gt,{modelValue:B(t).showPreview,"onUpdate:modelValue":n[24]||=e=>B(t).showPreview=e,"max-width":`900`,scrollable:``},{default:F(()=>[f(X,{border:``},{default:F(()=>[f(ut,{class:`d-flex align-center`},{default:F(()=>[R(`span`,nr,U(B(t).previewTitle),1),f(I),f(h,{icon:`mdi-close`,variant:`text`,onClick:n[22]||=e=>B(t).showPreview=!1})]),_:1}),f(Xe),f(Z,{style:{"max-height":`70vh`}},{default:F(()=>[B(t).previewLoading?(j(),J(_,{key:0,indeterminate:``,class:`mb-2`})):(j(),u(`pre`,rr,U(B(t).previewContent),1))]),_:1}),f(lt,null,{default:F(()=>[f(I),f(h,{variant:`text`,onClick:n[23]||=e=>B(t).showPreview=!1},{default:F(()=>[...n[48]||=[A(`关闭`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-110ea120`]]),ar=`nexus:files:last_server_id`,or=`nexus:files-hint-dismissed`,sr=[{value:25,title:`25`},{value:50,title:`50`},{value:100,title:`100`},{value:250,title:`250`},...ct.filter(e=>e.value===-1)],cr=5e3,lr=De({id:String,interactive:Boolean,text:String,...Ge(ce({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`),ur=Qe()({name:`VTooltip`,props:lr(),emits:{"update:modelValue":e=>!0},setup(e,{slots:t}){let n=Se(e,`modelValue`),{scopeId:r}=Le(),i=v(),a=z(()=>e.id||`v-tooltip-${i}`),o=G(),s=Y(()=>e.location.split(` `).length>1?e.location:e.location+` center`),c=Y(()=>e.origin===`auto`||e.origin===`overlap`||e.origin.split(` `).length>1||e.location.split(` `).length>1?e.origin:e.origin+` center`),l=z(()=>e.transition==null?n.value?`scale-transition`:`fade-transition`:e.transition),u=Y(()=>b({"aria-describedby":a.value},e.activatorProps));return Ze(()=>{let i=Ce.filterProps(e);return f(Ce,b({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:u.value,_disableGlobalStack:!0},r),{activator:t.activator,default:(...n)=>t.default?.(...n)??e.text})}),Ue({},o)}}),dr={class:`d-flex align-center ga-2 min-w-0`},fr={class:`min-w-0`},pr={key:0,class:`text-caption text-medium-emphasis text-truncate`},mr={class:`text-medium-emphasis`},hr={class:`text-medium-emphasis`},gr={class:`files-row-actions`},_r={key:0,class:`text-center text-medium-emphasis py-8`},vr={key:0,class:`text-caption mt-2 text-disabled`},yr=st(C({__name:`FilesList`,setup(t){let n=xt();return(t,r)=>(j(),u(be,null,[f(X,{elevation:`0`,border:``,rounded:`lg`,class:q([`position-relative`,{"files-drop-active":B(n).dropActive}]),onDragenter:r[1]||=W(e=>B(n).dropActive=!0,[`prevent`]),onDragover:r[2]||=W(e=>B(n).dropActive=!0,[`prevent`]),onDragleave:r[3]||=W(e=>B(n).dropActive=!1,[`prevent`]),onDrop:W(B(n).onDropFiles,[`prevent`])},{default:F(()=>[B(n).loadingVisible?(j(),J(_,{key:0,indeterminate:``,color:`primary`,height:`2`,class:`files-table-progress`})):k(``,!0),f(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,"items-per-page":B(50),"items-per-page-options":[...B(sr)],"show-select":``,"return-object":``,hover:``,density:`comfortable`,"item-value":`name`,"row-props":B(n).fileRowProps},{"item.name":F(({item:e})=>[R(`div`,dr,[f(T,{color:B(n).entryIconColor(e),size:`20`},{default:F(()=>[A(U(B(n).entryIcon(e)),1)]),_:2},1032,[`color`]),B(n).isEntryLikelyUnreadable(e,B(n).sshUserForFiles)?(j(),J(T,{key:0,size:`18`,color:`warning`,title:`当前 SSH 用户可能无法读取`},{default:F(()=>[...r[20]||=[A(` mdi-shield-lock `,-1)]]),_:1})):k(``,!0),R(`div`,fr,[R(`span`,{class:q({"font-weight-medium":e.type===`directory`})},U(e.name),3),e.type===`symlink`&&e.link_target?(j(),u(`div`,pr,` → `+U(e.link_target),1)):k(``,!0)])])]),"item.owner":F(({item:e})=>[f(ur,{text:B(n).permissionTooltip(e),location:`top`},{activator:F(({props:t})=>[f(et,b(t,{size:`small`,variant:`tonal`,color:B(n).ownerChipColor(e.owner||``),class:`text-none`}),{default:F(()=>[A(U(B(n).formatOwnerChip(e)),1)]),_:2},1040,[`color`])]),_:2},1032,[`text`])]),"item.size":F(({item:e})=>[R(`span`,mr,U(e.type===`directory`?`—`:B(n).formatSize(e.size)),1)]),"item.modified":F(({item:e})=>[R(`span`,hr,U(e.modified||`—`),1)]),"item.actions":F(({item:e})=>[R(`div`,gr,[B(n).isRegularFile(e)?(j(),J(h,{key:0,variant:`outlined`,size:`small`,color:`primary`,class:`files-action-btn`,"prepend-icon":`mdi-pencil-outline`,onClick:W(t=>B(n).editFile(e),[`stop`])},{default:F(()=>[...r[21]||=[A(` 编辑 `,-1)]]),_:1},8,[`onClick`])):k(``,!0),B(n).isRegularFile(e)?(j(),J(h,{key:1,variant:`outlined`,size:`small`,class:`files-action-btn`,"prepend-icon":`mdi-eye-outline`,onClick:W(t=>B(n).previewFile(e),[`stop`])},{default:F(()=>[...r[22]||=[A(` 查看 `,-1)]]),_:1},8,[`onClick`])):k(``,!0),B(n).isRegularFile(e)?(j(),J(h,{key:2,variant:`outlined`,size:`small`,class:`files-action-btn`,"prepend-icon":`mdi-download-outline`,onClick:W(t=>B(n).downloadFile(e),[`stop`])},{default:F(()=>[...r[23]||=[A(` 下载 `,-1)]]),_:1},8,[`onClick`])):k(``,!0),f(h,{variant:`outlined`,size:`small`,color:`error`,class:`files-action-btn`,"prepend-icon":`mdi-delete-outline`,onClick:W(t=>B(n).confirmDeleteFile(e),[`stop`])},{default:F(()=>[...r[24]||=[A(` 删除 `,-1)]]),_:1},8,[`onClick`])])]),"no-data":F(()=>[B(n).pageReady&&!B(n).loading&&!B(n).loadingVisible&&B(n).files.length===0?(j(),u(`div`,_r,[f(T,{size:`40`,class:`mb-2`},{default:F(()=>[...r[25]||=[A(`mdi-folder-open-outline`,-1)]]),_:1}),R(`div`,null,U(B(n).emptyHint),1),B(n).selectedServer?(j(),u(`div`,vr,` 单击目录进入 · 双击文件编辑 · Ctrl+A 全选 · Ctrl+C/V 复制粘贴 `)):k(``,!0)])):k(``,!0)]),_:1},8,[`modelValue`,`items`,`headers`,`loading`,`items-per-page`,`items-per-page-options`,`row-props`])]),_:1},8,[`class`,`onDrop`]),f(Ne,{modelValue:B(n).showContextMenu,"onUpdate:modelValue":r[19]||=e=>B(n).showContextMenu=e,target:[B(n).contextX,B(n).contextY],location:`bottom start`},{default:F(()=>[f(Oe,{density:`compact`,nav:``},{default:F(()=>[B(n).contextFile&&B(n).contextFile.type===`directory`?(j(),J(K,{key:0,"prepend-icon":`mdi-folder-open`,onClick:r[4]||=e=>B(n).contextAction(`open`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[26]||=[A(`打开`,-1)]]),_:1})]),_:1})):k(``,!0),B(n).contextFile&&B(n).isRegularFile(B(n).contextFile)?(j(),J(K,{key:1,"prepend-icon":`mdi-pencil`,onClick:r[5]||=e=>B(n).contextAction(`edit`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[27]||=[A(`编辑`,-1)]]),_:1})]),_:1})):k(``,!0),B(n).contextFile&&B(n).isRegularFile(B(n).contextFile)?(j(),J(K,{key:2,"prepend-icon":`mdi-eye`,onClick:r[6]||=e=>B(n).contextAction(`preview`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[28]||=[A(`查看`,-1)]]),_:1})]),_:1})):k(``,!0),B(n).contextFile&&B(n).isRegularFile(B(n).contextFile)?(j(),J(K,{key:3,"prepend-icon":`mdi-download`,onClick:r[7]||=e=>B(n).contextAction(`download`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[29]||=[A(`下载`,-1)]]),_:1})]),_:1})):k(``,!0),B(n).contextFile?(j(),J(K,{key:4,"prepend-icon":`mdi-content-copy`,onClick:r[8]||=e=>B(n).contextAction(`copy`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[30]||=[A(`复制 (Ctrl+C)`,-1)]]),_:1})]),_:1})):k(``,!0),B(n).contextFile?(j(),J(K,{key:5,"prepend-icon":`mdi-content-cut`,onClick:r[9]||=e=>B(n).contextAction(`cut`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[31]||=[A(`剪切 (Ctrl+X)`,-1)]]),_:1})]),_:1})):k(``,!0),f(K,{"prepend-icon":`mdi-content-paste`,disabled:!B(n).canPasteHere,onClick:r[10]||=e=>B(n).contextAction(`paste`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[32]||=[A(`粘贴到当前目录 (Ctrl+V)`,-1)]]),_:1})]),_:1},8,[`disabled`]),B(n).contextFile?.type===`directory`&&B(n).canPasteHere?(j(),J(K,{key:6,"prepend-icon":`mdi-folder-arrow-down`,onClick:r[11]||=e=>B(n).contextAction(`pasteInto`)},{default:F(()=>[f(H,null,{default:F(()=>[A(`粘贴到「`+U(B(n).contextFile.name)+`」`,1)]),_:1})]),_:1})):k(``,!0),f(K,{"prepend-icon":`mdi-link-variant`,onClick:r[12]||=e=>B(n).contextAction(`copyPath`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[33]||=[A(`复制路径`,-1)]]),_:1})]),_:1}),f(K,{"prepend-icon":`mdi-console`,onClick:r[13]||=e=>B(n).contextAction(`terminal`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[34]||=[A(`终端`,-1)]]),_:1})]),_:1}),f(Xe),B(n).contextFile&&(B(n).isRegularFile(B(n).contextFile)||B(n).contextFile.type===`directory`)?(j(),J(K,{key:7,"prepend-icon":`mdi-zip-box`,onClick:r[14]||=e=>B(n).contextAction(`compress`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[35]||=[A(`压缩`,-1)]]),_:1})]),_:1})):k(``,!0),B(n).contextFile&&B(n).isArchiveName(B(n).contextFile.name)?(j(),J(K,{key:8,"prepend-icon":`mdi-package-up`,onClick:r[15]||=e=>B(n).contextAction(`decompress`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[36]||=[A(`解压`,-1)]]),_:1})]),_:1})):k(``,!0),f(Xe),f(K,{"prepend-icon":`mdi-file-rename-box`,onClick:r[16]||=e=>B(n).contextAction(`rename`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[37]||=[A(`重命名`,-1)]]),_:1})]),_:1}),f(K,{"prepend-icon":`mdi-lock`,onClick:r[17]||=e=>B(n).contextAction(`chmod`)},{default:F(()=>[f(H,null,{default:F(()=>[...r[38]||=[A(`修改权限`,-1)]]),_:1})]),_:1}),f(Xe),f(K,{"prepend-icon":`mdi-delete`,onClick:r[18]||=e=>B(n).contextAction(`delete`)},{default:F(()=>[f(H,{class:`text-error`},{default:F(()=>[...r[39]||=[A(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`,`target`])],64))}}),[[`__scopeId`,`data-v-964388ad`]]),br={class:`d-flex flex-wrap align-center justify-space-between ga-2`},xr=C({__name:`FilesPermissionAlert`,setup(e){let t=xt();return(e,n)=>B(t).filesAccessHint?(j(),J(p,{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:F(()=>[R(`div`,br,[R(`span`,null,U(B(t).filesAccessHint.text.split(`目标机安装示例`)[0].trim()),1),B(t).sshUserForFiles&&B(t).sshUserForFiles!==`root`?(j(),J(h,{key:0,size:`small`,variant:`flat`,color:`primary`,"prepend-icon":`mdi-auto-fix`,loading:B(t).setupSudoLoading,disabled:B(t).setupSudoDone,onClick:W(B(t).setupFilesSudo,[`stop`])},{default:F(()=>[A(U(B(t).setupSudoDone?`已配置`:`一键配置 sudo 权限`),1)]),_:1},8,[`loading`,`disabled`,`onClick`])):k(``,!0)])]),_:1},8,[`type`,`onClick:close`])):k(``,!0)}}),Sr={class:`text-caption text-medium-emphasis mb-2 d-flex flex-wrap align-center ga-2`},Cr=C({__name:`FilesStatusBar`,setup(e){let t=xt();return(e,n)=>(j(),u(`div`,Sr,[R(`span`,null,U(B(t).statusSummary),1),B(t).browseError?(j(),J(et,{key:0,size:`x-small`,color:`warning`,variant:`tonal`},{default:F(()=>[A(U(B(t).browseError),1)]),_:1})):k(``,!0),B(t).hasClipboard?(j(),J(et,{key:1,size:`x-small`,color:`info`,variant:`tonal`,class:`cursor-pointer`,onClick:n[0]||=()=>B(t).pasteClipboard()},{default:F(()=>[A(U(B(t).clipboardSummary)+` → `+U(B(t).pasteDestLabel)+` · Ctrl+V 粘贴 `,1)]),_:1})):k(``,!0)]))}}),wr=C({__name:`FilesToolbar`,setup(e){let t=xt();return(e,n)=>(j(),J(X,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4 pa-4`},{default:F(()=>[f(i,{align:`center`,dense:``},{default:F(()=>[f(r,{cols:`12`,sm:`4`},{default:F(()=>[f(ft,{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}),f(r,{cols:`12`,sm:`4`},{default:F(()=>[f(dt,{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:Me(B(t).browseCurrent,[`enter`])},null,8,[`modelValue`,`onClick:appendInner`,`onKeydown`])]),_:1}),f(r,{cols:`12`,sm:`3`},{default:F(()=>[f(dt,{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}),f(r,{cols:`12`,sm:`3`},{default:F(()=>[f(ft,{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}),f(r,{cols:`12`,sm:`2`},{default:F(()=>[f(ft,{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}),f(r,{cols:`12`,class:`d-flex ga-2 flex-wrap justify-end`},{default:F(()=>[f(h,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-upload`,onClick:n[5]||=e=>B(t).showUpload=!0},{default:F(()=>[...n[10]||=[A(` 上传 `,-1)]]),_:1}),f(h,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-file-plus`,disabled:!B(t).selectedServer,onClick:n[6]||=e=>B(t).showNewFile=!0},{default:F(()=>[...n[11]||=[A(` 新建文件 `,-1)]]),_:1},8,[`disabled`]),f(h,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-folder-plus`,onClick:n[7]||=e=>B(t).showMkdir=!0},{default:F(()=>[...n[12]||=[A(` 新建目录 `,-1)]]),_:1}),f(h,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-zip-box`,disabled:!B(t).selectedServer||!B(t).selectedFileCount,onClick:n[8]||=e=>B(t).openCompressDialog()},{default:F(()=>[...n[13]||=[A(` 压缩 `,-1)]]),_:1},8,[`disabled`]),f(h,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-paste`,disabled:!B(t).canPasteHere,onClick:n[9]||=()=>B(t).pasteClipboard()},{default:F(()=>[...n[14]||=[A(` 粘贴 `,-1)]]),_:1},8,[`disabled`]),f(h,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-arrow-up`,disabled:!B(t).canGoUp,onClick:B(t).goUp},{default:F(()=>[...n[15]||=[A(` 上级 `,-1)]]),_:1},8,[`disabled`,`onClick`]),f(h,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-refresh`,onClick:B(t).browseCurrent},{default:F(()=>[...n[16]||=[A(`刷新`,-1)]]),_:1},8,[`onClick`]),f(h,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-console`,disabled:!B(t).selectedServer,onClick:B(t).openInTerminal},{default:F(()=>[...n[17]||=[A(` 终端 `,-1)]]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1})]),_:1}))}}),Tr=G(null);function Er(){let e=Y(()=>Tr.value!==null),t=Y(()=>Tr.value?`${Tr.value.mode===`cut`?`已剪切`:`已复制`} ${Tr.value.paths.length} 项`:``);function n(e,t,n){if(!n.length)return!1;let r=[...new Set(n.map(e=>Q(e)))];return Tr.value={mode:e,serverId:t,paths:r,label:r.map(e=>e.split(`/`).pop()||e).join(`, `)},!0}function r(){Tr.value=null}function i(e){return!!(Tr.value&&e&&Tr.value.serverId===e)}function a(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 o(e){let t=Tr.value;if(!t)throw Error(`剪贴板为空`);let n=Q(e),i=a(t.paths,n);if(i)throw Error(i);let o=t.mode===`cut`?`move`:`copy`;await V.post(`/sync/file-clipboard`,{server_id:t.serverId,mode:o,sources:t.paths,dest_dir:n}),t.mode===`cut`&&r()}return{clipboard:Tr,hasClipboard:e,clipboardSummary:t,setFromSelection:n,clear:r,canPasteOnServer:i,validatePasteTarget:a,pasteToDirectory:o}}function Dr(e){if(!(e instanceof HTMLElement))return!1;let t=e.tagName;return t===`INPUT`||t===`TEXTAREA`||e.isContentEditable}function Or(e,t,n){function r(r){if(!Dr(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())}}O(()=>window.addEventListener(`keydown`,r)),g(()=>window.removeEventListener(`keydown`,r))}function kr(e,t){return`${e}:${t}`}var Ar=Fe(`files`,()=>{let e=G(null),t=G(Mt),n=G([]),r=G(!1),i=G(!1),a=G(``),o=G(null),s=G(null),c=G(!1),l=G(!1),u=G(!1),d=G(!1),f=G(!1),p=G(!1),m=new Map;function h(e){return Date.now()-e.at<=cr}function g(e,t){return m.get(kr(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=kr(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(kr(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}}),jr={directory:0,symlink:1,file:2};function Mr(e,t,n){let r=n===`asc`?1:-1;return[...e].sort((e,n)=>{let i=jr[e.type]??9,a=jr[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 Nr=[{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 Pr(e,t){if(!t)return!0;let n=e.toLowerCase();return t.split(`,`).some(e=>n.endsWith(`.${e.trim()}`))}function Fr(e){let t=e.toLowerCase();return t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`)||t.endsWith(`.zip`)}var Ir=300*1024,Lr=2*1024*1024,Rr=40,zr=4,Br=new Map;function Vr(e,t){return`${e}:${Q(t)}`}function Hr(e){let t=Q(e),n=t.lastIndexOf(`/`);return n<=0?`/`:t.slice(0,n)||`/`}function Ur(){Br.clear()}function Wr(e,t){let n=Q(t);for(let t of[...Br.keys()]){if(!t.startsWith(`${e}:`)){Br.delete(t);continue}Hr(t.slice(`${e}:`.length))!==n&&Br.delete(t)}}function Gr(e,t){Br.delete(Vr(e,t))}function Kr(e){if(e.type!==`file`)return!1;let t=e.size??0;return t>0&&t<=307200}function qr(e){return e!=null&&e>0&&e>2097152}function Jr(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 Yr(e,t,n=Ir){let r=Vr(e,t),i=Br.get(r);if(i!==void 0)return i;let a=Jr(await V.post(`/sync/read-file`,{server_id:e,path:Q(t),max_size:n}));return Br.set(r,a),a}function Xr(e,t,n){let r=n.filter(Kr).sort((e,t)=>(e.size??0)-(t.size??0)).slice(0,Rr);if(!r.length)return;let i=0,a=async()=>{for(;i<r.length;){let n=r[i++],a=$(t,n.name),o=Vr(e,a);if(!Br.has(o))try{await Yr(e,a)}catch{}}},o=Math.min(zr,r.length);Promise.all(Array.from({length:o},()=>a()))}function Zr(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 Qr(e){let t=n(),{selectedServer:r,currentPath:i}=We(Ar()),{selectedFiles:a,selectedAbsolutePaths:o,clearSelection:s}=e.selection,{setFromSelection:c,canPasteOnServer:l,pasteToDirectory:u}=Er(),d=G(!1),f=G(!1),p=G(!1),m=G(``),h=G(!1),g=G(!1),_=G(``),v=G(`tar.gz`),y=G([]),b=G(!1),S=G(``),C=G(`.`),w=G(!1),T=G([]),E=G(!1),D=G(``),O=e.actionLoading??G(!1),k=G(null),ee=G(!1),A=G(``),te=G(null),j=G(!1),ne=G(!1),re=G(null),M=G(!1),N=G(0),ie=G(0),P=G(null);function F(e){if(e)return Q(e);let t=a.value.filter(e=>e.type===`directory`);return t.length===1&&a.value.length===1?$(i.value,t[0].name):Q(i.value)}let ae=Y(()=>{let e=F();return e===Q(i.value)?`当前目录`:e});function I(e){if(!r.value)return;let n=o(e);if(!n.length){t(`请先选择文件或目录`,`warning`);return}c(`copy`,r.value,n)&&t(`已复制 ${n.length} 项`)}function oe(e){if(!r.value)return;let n=o(e);if(!n.length){t(`请先选择文件或目录`,`warning`);return}c(`cut`,r.value,n)&&t(`已剪切 ${n.length} 项`)}async function se(n){if(!r.value){t(`请先选择服务器`,`warning`);return}if(!l(r.value)){t(`剪贴板为空或服务器不一致`,`warning`);return}let i=F(n);O.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{O.value=!1}}async function L(e){if(d.value=!1,!r.value){t(`请先选择服务器`,`warning`);return}let n=e.dataTransfer?.files;n?.length&&(T.value=Array.from(n),await xe())}function ce(t){if(M.value=!1,!P.value)return;let n=P.value;switch(t){case`open`:e.openEntry(n);break;case`copy`:I([n]);break;case`cut`:oe([n]);break;case`paste`:se();break;case`pasteInto`:n.type===`directory`&&se($(i.value,n.name));break;case`edit`:e.editFile(n);break;case`preview`:e.previewFile(n);break;case`download`:_e(n);break;case`copyPath`:le(n);break;case`terminal`:e.openInTerminal();break;case`compress`:ue([n]);break;case`decompress`:de(n);break;case`rename`:z(n);break;case`chmod`:B(n);break;case`delete`:ve(n);break}}async function le(e){let n=$(i.value,e.name);try{await navigator.clipboard.writeText(n),t(`路径已复制`)}catch{t(`复制失败`,`error`)}}function ue(e){if(!r.value)return;let n=e?.length?e:a.value.length?a.value:[];if(!n.length){t(`请选择要压缩的文件或目录`,`warning`);return}y.value=n.map(e=>$(i.value,e.name));let o=n.length===1?n[0].name.replace(/\.[^.]+$/,``):`archive`;_.value=$(i.value,`${o}.tar.gz`),v.value=`tar.gz`,g.value=!0}function de(e){if(r.value){if(!Fr(e.name)){t(`仅支持 .tar.gz / .tgz / .zip`,`warning`);return}S.value=$(i.value,e.name),C.value=i.value,b.value=!0}}async function fe(){if(!(!r.value||!y.value.length||!_.value)){O.value=!0;try{let n=_.value;v.value===`zip`&&!n.endsWith(`.zip`)&&(n=n.replace(/\.tar\.gz$/i,`.zip`),n.endsWith(`.zip`)||(n+=`.zip`)),await V.post(`/sync/compress`,{server_id:r.value,paths:y.value,dest:n,format:v.value}),g.value=!1,s(),e.invalidateAfterMutation(),await e.browse({force:!0}),t(`压缩完成`)}catch(e){t(e instanceof Error?e.message:`压缩失败`,`error`)}finally{O.value=!1}}}async function R(){if(!(!r.value||!S.value)){O.value=!0;try{await V.post(`/sync/decompress`,{server_id:r.value,path:S.value,dest:C.value||`.`}),b.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`解压完成`)}catch(e){t(e instanceof Error?e.message:`解压失败`,`error`)}finally{O.value=!1}}}async function pe(){if(!r.value||!m.value)return;let n=It(m.value);if(n!==!0){t(n,`warning`);return}let a=m.value,o=$(i.value,a);O.value=!0;try{await V.post(`/sync/write-file`,{server_id:r.value,path:o,content:``}),p.value=!1,m.value=``,Gr(r.value,o),e.invalidateAfterMutation(),await e.browse({force:!0}),t(`文件已创建`),await x(),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{O.value=!1}}function z(e){te.value=e,A.value=e.name,ee.value=!0}async function me(){if(!(!r.value||!te.value||!A.value))try{await V.post(`/sync/file-ops`,{server_id:r.value,operation:`rename`,path:$(i.value,te.value.name),new_path:$(i.value,A.value)}),ee.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`重命名成功`)}catch(e){t(e instanceof Error?e.message:`重命名失败`,`error`)}}function B(e){re.value=e,j.value=!0}async function he(n){if(!(!r.value||!re.value)){ne.value=!0;try{await V.post(`/sync/chmod`,{server_id:r.value,path:$(i.value,re.value.name),mode:n.mode,owner:n.owner,group:n.group,recursive:n.recursive??!1}),j.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`权限已修改`)}catch(e){t(e instanceof Error?e.message:`修改权限失败`,`error`)}finally{ne.value=!1}}}async function ge(){if(!r.value||!a.value.length||!confirm(`确定删除 ${a.value.length} 个文件?`))return;let n=0,o=0;for(let e of a.value)try{await V.post(`/sync/file-ops`,{server_id:r.value,operation:`delete`,path:$(i.value,e.name)}),n++}catch{o++}s(),e.invalidateAfterMutation(),await e.browse({force:!0}),o===0?t(`已删除 ${n} 项`):t(`删除完成:成功 ${n},失败 ${o}`,o>0?`warning`:`success`)}async function _e(e){if(r.value)try{let n=$(i.value,e.name),{blob:a,filename:o}=await V.download(`/sync/download`,{server_id:r.value,path:n});Zr(a,o),t(`已下载 ${o}`)}catch(e){t(e instanceof Error?e.message:`下载失败`,`error`)}}async function ve(e){k.value=e,w.value=!0}async function ye(){if(!(!r.value||!k.value)){O.value=!0;try{await V.post(`/sync/file-ops`,{server_id:r.value,operation:`delete`,path:$(i.value,k.value.name)}),w.value=!1,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`已删除`)}catch(e){t(e instanceof Error?e.message:`删除失败`,`error`)}finally{O.value=!1}}}async function be(){if(!r.value||!D.value)return;let n=It(D.value);if(n!==!0){t(n,`warning`);return}O.value=!0;try{await V.post(`/sync/file-ops`,{server_id:r.value,operation:`mkdir`,path:$(i.value,D.value)}),h.value=!1,D.value=``,e.invalidateAfterMutation(),await e.browse({force:!0}),t(`目录已创建`)}catch(e){t(e instanceof Error?e.message:`创建失败`,`error`)}finally{O.value=!1}}async function xe(){if(!(!r.value||!T.value.length)){E.value=!0;try{let n=new FormData;for(let e of T.value)n.append(`file`,e);n.append(`server_id`,String(r.value)),n.append(`remote_path`,i.value),await V.upload(`/sync/upload`,n),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 H(e){return e instanceof HTMLElement?!!e.closest(`button, a, input, .v-checkbox, .v-selection-control`):!1}function U(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=>{H(e.target)||e.detail===1&&Se(e,{item:t})},onDblclick:e=>{H(e.target)||W(e,{item:t})},onContextmenu:e=>{H(e.target)||Ce(e,{item:t})}}}function Se(t,{item:n}){(n.type===`directory`||n.type===`symlink`)&&e.openEntry(n)}function W(t,{item:n}){n.type===`file`&&e.editFile(n)}function Ce(e,{item:t}){e.preventDefault(),P.value=t,N.value=e.clientX,ie.value=e.clientY,M.value=!0}return{dropActive:d,showUpload:f,showNewFile:p,newFileName:m,showMkdir:h,showCompress:g,compressDest:_,compressFormat:v,compressPaths:y,showDecompress:b,decompressSource:S,decompressDest:C,showFileDelete:w,uploadFiles:T,uploading:E,mkdirName:D,actionLoading:O,deletingFile:k,showRename:ee,newName:A,renamingFile:te,showChmod:j,chmodLoading:ne,chmodFile:re,showContextMenu:M,contextX:N,contextY:ie,contextFile:P,copyToClipboard:I,cutToClipboard:oe,pasteClipboard:se,onDropFiles:L,contextAction:ce,openCompressDialog:ue,openDecompressDialog:de,doCompress:fe,doDecompress:R,doNewFile:pe,startRename:z,doRename:me,startChmod:B,doChmod:he,batchDelete:ge,downloadFile:_e,confirmDeleteFile:ve,doDeleteFile:ye,doMkdir:be,doUpload:xe,fileRowProps:U,pasteDestLabel:ae}}var $r=!1;function ei(){ie(async()=>{let{initMonaco:e}=await import(`./initMonaco-D1bUcg_U.js`).then(e=>e.r);return{initMonaco:e}},__vite__mapDeps([0,1,2,3,4])).then(({initMonaco:e})=>{e(),rt()})}function ti(){$r||($r=!0,typeof requestIdleCallback==`function`?requestIdleCallback(ei,{timeout:3e3}):setTimeout(ei,300))}var ni=200,ri=0,ii=null,ai=``,oi=null;function si(e){return e.includes(`No such file or directory`)||e.includes(`not a directory`)}function ci(e,t){return si(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 li(e){e.loading=!0,!oi&&(oi=setTimeout(()=>{oi=null,e.loading&&(e.loadingVisible=!0)},ni))}function ui(e){e.loading=!1,oi&&=(clearTimeout(oi),null),e.loadingVisible=!1}async function di(e,t,n){let r={};n&&(r[`If-None-Match`]=n);try{return await a(`/files/browse`,{method:`GET`,params:{server_id:e,path:t},headers:r})}catch(n){if(!(n instanceof ae&&(n.status>=500||n.status===404||n.status===405)))throw n;return{status:200,data:await V.post(`/sync/browse`,{server_id:e,path:t}),etag:null}}}function fi(e){let t=n(),r=we(),i=le(),a=Ar(),{selectedServer:o,currentPath:s,files:c,loading:l,loadingVisible:u,browseError:d,pageReady:f,filesCapability:p}=We(a);function m(){let e={...r.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 h=Y(()=>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,i,o){if(o!==ri)return!1;let{items:l,error:u}=jt(r??{items:[]});if(u&&si(u)&&n!==`/`){d.value=``;let e=Ft(n);if(e)return t(`路径 "${n}" 不存在,已自动跳转到上级目录`,`info`),s.value=e,_(),!0}return d.value=u?ci(u,n):``,u&&!si(u)&&t(ci(u,n),`warning`),c.value=l,u||a.setCached(e,n,l,i??void 0),e&&l.length&&(Wr(e,n),Xr(e,n,l),ti()),!0}async function _(e){if(!o.value)return;let n=Q(s.value),r=o.value,i=`${r}:${n}`,l=e?.force?null:a.getCached(r,n);if(l&&(c.value=l,d.value=``),ii&&ai===i)return ii;ai=i;let u=++ri;e?.silent||li(a),s.value=n;let f=e?.force?void 0:a.getCachedEtag(r,n);return ii=(async()=>{try{let e=await di(r,n,f);if(u!==ri)return;if(e.status===304){let t=a.getCacheEntry(r,n);if(t){c.value=t.items,a.touchCache(r,n),d.value=``;return}if(e=await di(r,n),u!==ri)return}g(r,n,e.data,e.etag,u)}catch(e){if(u!==ri)return;let n=mt(e,`浏览目录失败`);d.value=n,t(n,`error`)}finally{u===ri&&(e?.silent?(a.loading=!1,a.loadingVisible=!1):ui(a),m()),ai===i&&(ii=null,ai=``)}})(),ii}function v(){if(!o.value){t(`请先选择服务器`,`warning`);return}s.value=Q(s.value),a.invalidateCache(o.value,s.value),_({force:!0})}function y(e){if(!o.value)return;let t=e??s.value;a.invalidateCache(o.value,Q(t)),Ur()}return{emptyHint:h,browse:_,browseCurrent:v,invalidateAfterMutation:y,loadingVisible:u}}function pi(e){return e?e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`:`—`}function mi(e){let t=n(),{selectedServer:r,currentPath:i,lastReadDeniedPath:a,accessHintDismissed:o}=We(Ar()),s=G(!1),c=G(``),l=G(``),u=G(!1),d=G(null);async function f(){let e=Date.now()+8e3;for(;Date.now()<e;){if(d.value?.openFile)return d.value;await new Promise(e=>setTimeout(e,40)),await x()}return d.value}function p(e,n){return qr(e.size)?(t(`文件超过 2MB${pi(e.size)}),无法${n},请下载或使用终端`,`warning`),!0):!1}function m(t){r.value&&t&&Gr(r.value,t),e.invalidateAfterMutation(),e.browse({force:!0})}async function h(e){if(!r.value||p(e,`查看`))return;let n=$(i.value,e.name);c.value=e.name,l.value=``,u.value=!0,s.value=!0,(e.size??0)>307200&&t(`文件较大(${pi(e.size)}),正在加载…`,`info`);try{l.value=(await Yr(r.value,n,2097152)).content||`(空文件)`}catch(n){let r=n instanceof Error?n.message:`读取失败`;l.value=r,Hn(r)&&(a.value=e.name,o.value=!1),t(r,`error`)}finally{u.value=!1}}async function g(n){if(r.value&&!p(n,`编辑`)){(n.size??0)>307200&&t(`文件较大(${pi(n.size)}),正在加载…`,`info`),e.actionLoading.value=!0;try{let e=$(i.value,n.name),a=await Yr(r.value,e,Lr),o=await f();if(!o){t(`编辑器尚未就绪,请稍后重试`,`error`);return}o.openFile({path:e,name:n.name,content:a.content,eol:a.eol,etag:a.etag,mtime:a.mtime})}catch(e){let r=e instanceof Error?e.message:`读取失败`;Hn(r)&&(a.value=n.name,o.value=!1),t(r,`error`)}finally{e.actionLoading.value=!1}}}return{showPreview:s,previewTitle:c,previewContent:l,previewLoading:u,editorWorkbench:d,previewFile:h,editFile:g,onEditorSaved:m,formatSize:pi}}function hi(e){let t=n(),r=we(),i=le(),{servers:a,loadServers:o}=ht(),s=Ar(),{selectedServer:c,currentPath:l,pageReady:u,routeReady:d,initing:f,accessHintDismissed:p}=We(s),m=Y(()=>Lt(l.value)),h=Y(()=>Ft(l.value)!==null);function g(e){if(e==null)return Mt;let t=a.value.find(t=>t.id===e)?.target_path?.trim();return t?Q(t):Mt}function _(){let e=r.query.path;return typeof e==`string`&&e.trim()?Q(e):g(c.value)}function v(){let e=r.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(ar);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 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=Ft(l.value);e!=null&&y(e)}function S(e){let t=m.value[e];t&&!t.disabled&&y(t.path)}function C(){c.value&&i.push({path:`/terminal`,query:{server_id:String(c.value),path:l.value||`/`}})}function T(){f.value||(c.value&&sessionStorage.setItem(ar,String(c.value)),s.invalidateCache(),l.value=g(c.value),e.clearSelection(),s.resetForServerChange(),sessionStorage.removeItem(or),(async()=>{await e.refreshFilesCapability(),await e.browse({force:!0})})())}let E=!1;return O(async()=>{f.value=!0;try{if(await o(),sessionStorage.getItem(`nexus:files-hint-dismissed`)&&(p.value=!0),!a.value.length){t(`暂无可用服务器,请先在「服务器」页添加`,`warning`),u.value=!0;return}let n=v();if(n==null){u.value=!0;return}c.value=n;let i=r.query.path;l.value=typeof i==`string`&&i?Q(i):g(n),await e.refreshFilesCapability(),await e.browse(),u.value=!0,d.value=!0}finally{f.value=!1,E=!0}}),w(()=>{!E||!u.value||!c.value||e.browse({silent:!0})}),N(()=>r.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})})())}),N(()=>r.query.path,()=>{if(!d.value||!c.value)return;let t=_();t!==Q(l.value)&&(l.value=t,e.clearSelection(),e.browse())}),{serverList:a,breadcrumbs:m,canGoUp:h,navigateToPath:y,openEntry:b,goUp:x,onBreadcrumbClick:S,openInTerminal:C,onServerChange:T,defaultPathForServer:g}}function gi(e){let t=n(),{selectedServer:r,files:i,browseError:a,filesCapability:o,lastReadDeniedPath:s,accessHintDismissed:c,setupSudoLoading:l,setupSudoDone:u}=We(Ar()),d=Y(()=>o.value?.ssh_user??null),f=Y(()=>{let e=d.value;return e?i.value.filter(t=>Un(t,e)).length:0}),p=Y(()=>{if(c.value||!r.value||a.value&&si(a.value))return null;let e=o.value;return Gn({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(or,`1`)}async function h(){if(!r.value){o.value=null;return}try{o.value=await V.get(`/servers/${r.value}/files-capability`)}catch{o.value=null}}async function g(){if(r.value){l.value=!0;try{let n=await V.post(`/servers/${r.value}/setup-files-sudo`,{});u.value=!0,t(n.message||`sudoers 配置成功,文件管理器现在可自动提权`,`success`),m(),await h(),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:h,setupFilesSudo:g}}function _i(){let{currentPath:e}=We(Ar()),t=G([]),n=Y(()=>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 vi(){let e=G(``),t=G(``),n=G(`name`),r=[{title:`名称`,value:`name`},{title:`大小`,value:`size`},{title:`修改时间`,value:`modified`}],{selectedServer:i,currentPath:a,files:o,loading:s,browseError:c,pageReady:l,setupSudoLoading:u,setupSudoDone:d}=We(Ar()),f=_i(),{selectedFiles:p,selectedFileCount:m,clearSelection:h}=f,{emptyHint:g,browse:_,browseCurrent:v,invalidateAfterMutation:y,loadingVisible:b}=fi(e),x=gi({browse:_}),{sshUserForFiles:S,filesAccessHint:C,dismissFilesAccessHint:w,setupFilesSudo:T}=x,E=hi({browse:_,refreshFilesCapability:x.refreshFilesCapability,clearSelection:h}),D=G(!1),O=mi({browse:_,invalidateAfterMutation:y,actionLoading:D}),k=Qr({browse:_,invalidateAfterMutation:y,selection:f,openEntry:E.openEntry,editFile:O.editFile,previewFile:O.previewFile,openInTerminal:E.openInTerminal,editorWorkbench:O.editorWorkbench,actionLoading:D}),{hasClipboard:ee,clipboardSummary:A,canPasteOnServer:te}=Er(),j=Y(()=>te(i.value)),ne=Y(()=>{let r=Mr(o.value,n.value,`asc`),i=t.value;i&&(r=r.filter(e=>Pr(e.name,i)));let a=e.value.trim().toLowerCase();return a&&(r=r.filter(e=>e.name.toLowerCase().includes(a))),r}),re=Y(()=>{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(Kr).length,i=[`${e} 个目录`,`${t} 个文件`];return n&&i.push(`${n} 个链接`),r&&i.push(`${r} 个 ≤300KB 可预加载`),`${i.join(``)} · ${a.value}`});function M(e){return Fr(e)}function N(e){return e.type===`directory`?`mdi-folder`:e.type===`symlink`?`mdi-link-variant`:`mdi-file-outline`}function ie(e){return e.type===`directory`?`amber`:e.type===`symlink`?`teal`:`blue`}function P(e){return e.type===`file`}return Or({refresh:v,goUp:E.goUp,renameSelection:()=>{p.value.length===1&&k.startRename(p.value[0])},deleteSelection:()=>{p.value.length>0&&k.batchDelete()},selectAll:()=>{p.value=[...ne.value]},copySelection:()=>k.copyToClipboard(),cutSelection:()=>k.cutToClipboard(),pasteClipboard:()=>{k.pasteClipboard()}},p,j),{FILE_EXT_FILTERS:Nr,validatePathSegment:It,required:vt,fileFilter:e,extFilter:t,sortBy:n,sortOptions:r,selectedServer:i,currentPath:a,files:o,loading:s,loadingVisible:b,browseError:c,pageReady:l,setupSudoLoading:u,setupSudoDone:d,serverList:E.serverList,onServerChange:E.onServerChange,browseCurrent:v,filesAccessHint:C,dismissFilesAccessHint:w,setupFilesSudo:T,sshUserForFiles:S,statusSummary:re,hasClipboard:ee,clipboardSummary:A,pasteDestLabel:k.pasteDestLabel,canPasteHere:j,breadcrumbs:E.breadcrumbs,onBreadcrumbClick:E.onBreadcrumbClick,canGoUp:E.canGoUp,goUp:E.goUp,selectedFiles:p,selectedFileCount:m,displayedFiles:ne,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:k.fileRowProps,dropActive:k.dropActive,onDropFiles:k.onDropFiles,emptyHint:g,entryIcon:N,entryIconColor:ie,isEntryLikelyUnreadable:Un,formatOwnerChip:Ln,ownerChipColor:Rn,permissionTooltip:zn,formatSize:O.formatSize,isRegularFile:P,isArchiveName:M,showUpload:k.showUpload,uploadFiles:k.uploadFiles,uploading:k.uploading,doUpload:k.doUpload,showNewFile:k.showNewFile,newFileName:k.newFileName,doNewFile:k.doNewFile,showMkdir:k.showMkdir,mkdirName:k.mkdirName,doMkdir:k.doMkdir,showFileDelete:k.showFileDelete,deletingFile:k.deletingFile,doDeleteFile:k.doDeleteFile,showRename:k.showRename,newName:k.newName,doRename:k.doRename,showChmod:k.showChmod,chmodFile:k.chmodFile,chmodLoading:k.chmodLoading,doChmod:k.doChmod,showCompress:k.showCompress,compressDest:k.compressDest,compressFormat:k.compressFormat,compressPaths:k.compressPaths,doCompress:k.doCompress,showDecompress:k.showDecompress,decompressSource:k.decompressSource,decompressDest:k.decompressDest,doDecompress:k.doDecompress,showContextMenu:k.showContextMenu,contextX:k.contextX,contextY:k.contextY,contextFile:k.contextFile,contextAction:k.contextAction,actionLoading:D,batchDelete:k.batchDelete,openCompressDialog:k.openCompressDialog,showPreview:O.showPreview,previewTitle:O.previewTitle,previewContent:O.previewContent,previewLoading:O.previewLoading,editorWorkbench:O.editorWorkbench,onEditorSaved:O.onEditorSaved,navigateToPath:E.navigateToPath,pasteClipboard:k.pasteClipboard,editFile:O.editFile,previewFile:O.previewFile,downloadFile:k.downloadFile,confirmDeleteFile:k.confirmDeleteFile,openInTerminal:E.openInTerminal}}var yi=C({name:`FilesPage`,__name:`FilesPage`,setup(e){let n=vi();bt(n);let{editorWorkbench:r}=n,{selectedServer:i,currentPath:a}=We(Ar());return(e,o)=>(j(),J(t,{fluid:``,class:`pa-6`},{default:F(()=>[f(wr),f(xr),f(Cr),f(kt),f(yr),f(ir),f(Fn,{ref_key:`editorWorkbench`,ref:r,"server-id":B(i)??0,"current-path":B(a),onSaved:o[0]||=e=>B(n).onEditorSaved(e),onPathChange:B(n).navigateToPath,onPasteTarget:B(n).pasteClipboard},null,8,[`server-id`,`current-path`,`onPathChange`,`onPasteTarget`])]),_:1}))}});export{yi as default};