Files
aiops/backend/static/assets/PodFileBrowser-D_SJAX96.js
T
Logan.Li 5fad2db0c6 fix(k8s): 可视化编辑器 YAML 解析失败(managedFields 清理)
- 先解析原始 YAML 再对象级剥离,避免 cleanYAML 破坏结构
- managedFields 从 METADATA_LINE_KEYS 移除,改整块删除含数组项
- YamlViewer 同步使用 parseEditableManifest
2026-06-26 14:53:20 +08:00

15 lines
33 KiB
JavaScript

import{r as u,y as ce,E as W,j as e,R as U,o as G}from"./vendor-codemirror-C7mXSpXt.js";import{a8 as se,B as j,D as ie,a as le,m as J,c as de,d as me}from"./index-BBDEBVET.js";import{u as ne}from"./use-toast-CkA38LVP.js";import{k as D}from"./index-CoT9mL1C.js";import{w as K,aF as H,ay as I,L,$ as q,X as O,r as ue,ad as xe,aK as he,an as pe,ao as fe,H as be,m as we,f as ke,ah as ge,R as je,aL as ve,aM as Ne,v as Pe}from"./vendor-icons-Aso0-eeY.js";import{S as X,a as Z,b as Q,c as ee,d as te}from"./select-B_wPmYeS.js";import{x as ye,a as Se}from"./vendor-xterm-20M9KZE1.js";import{B as Ee}from"./badge-D4cmFHTS.js";function re(r){if(!r)return"";const s=r.replace(/\r\n/g,`
`).split(`
`),o=[];let n=0;const g=new Set(["uid","resourceVersion","creationTimestamp","generation","selfLink","clusterName","generateName"]),A=new Set(["managedFields","ownerReferences"]),R={dnsPolicy:["ClusterFirst"],restartPolicy:["Always"],schedulerName:["default-scheduler"],terminationGracePeriodSeconds:["30"],serviceAccountName:["default"],enableServiceLinks:["true"],progressDeadlineSeconds:["600"],revisionHistoryLimit:["10"]},E={imagePullPolicy:["Always","IfNotPresent"],terminationMessagePath:["/dev/termination-log"],terminationMessagePolicy:["File"]},M=new Set(["kubectl.kubernetes.io/last-applied-configuration","deployment.kubernetes.io/revision","kubectl.kubernetes.io/restartedAt","control-plane.alpha.kubernetes.io/leader","autoscaling.alpha.kubernetes.io/conditions"]),h=["kube-api-access-","default-token-","kube-"];let b=!1,S=!1,F=!1,Y=!1,w=!1,B=!1,v=!1,T=!1,N=0;function f(x){return x.length-x.trimStart().length}function P(x){const a=x.trimStart().match(/^([a-zA-Z_][a-zA-Z0-9_./-]*)\s*:/);return a?a[1]:null}function V(x){const a=x.trim().split(":").slice(1).join(":").trim();return a!==""&&!/^[>|]/.test(a)}function C(x){for(n++;n<s.length;){const a=s[n],i=a.trimStart();if(i===""||i.startsWith("#")){n++;continue}if(f(a)<=x)break;n++}}function k(x){const a=P(x);return a?h.some(i=>a.startsWith(i)):!1}for(;n<s.length;){const x=s[n],a=x.trimStart(),i=f(x),c=P(x);if(a===""||a.startsWith("#")){o.push(x),n++;continue}if(i===0&&c==="status"){C(0);continue}if(i===0&&c==="metadata"){b=!0,o.push(x),n++;continue}if(i===0&&c!=="metadata"&&(b=!1,S=!1),i===0&&c==="spec"){F=!0,o.push(x),n++;continue}if(i===0&&c!=="spec"&&(F=!1,Y=!1,w=!1,B=!1,T=!1),b){if(i===2&&c==="annotations"){S=!0,o.push(x),n++;continue}if(i<=2&&c!=="annotations"&&(S=!1),i>=2&&i<=4&&a.startsWith("pod-template-hash")&&a.includes(":")){n++;continue}if(i===2&&c&&g.has(c)){V(x)?n++:C(2);continue}if(i===2&&c&&A.has(c)){for(n++;n<s.length;){const l=s[n],t=l.trimStart();if(t===""||t.startsWith("#")){n++;continue}const d=f(l);if(d>2||d===2&&t.startsWith("-")){n++;continue}break}continue}if(S&&i>2&&c&&M.has(c)){if(V(x))n++;else{const l=a.split(":").slice(1).join(":").trim();/^[>|]/.test(l)?C(i):n++}continue}}if(F){if(i===2&&c==="template"){o.push(x),n++;continue}if(i===2&&c&&R[c]){const p=a.split(":").slice(1).join(":").trim();if(R[c].includes(p)){n++;continue}}if(i===2&&c==="nodeName"){n++;continue}if(i===2&&c==="spec"){Y=!0,N=i,o.push(x),n++;continue}}if(Y&&i>N){if(c==="containers"){w=!0,B=!1,o.push(x),n++;continue}if(c==="initContainers"){B=!0,w=!1,o.push(x),n++;continue}if(c==="volumes"){T=!0,o.push(x),n++;continue}if(c&&R[c]){const p=a.split(":").slice(1).join(":").trim();if(R[c].includes(p)){n++;continue}}if(c==="nodeName"){n++;continue}if(c==="serviceAccount"&&a.endsWith(":")){V(x)?n++:C(i);continue}}if((w||B)&&i>=6){if(c&&E[c]){const p=a.split(":").slice(1).join(":").trim();if(E[c].includes(p)){n++;continue}}if(c==="volumeMounts"&&(v=!0),v&&a.startsWith("- name:")){let p=[x],l=n+1,t=!1;for(;l<s.length;){const d=s[l].trimStart();if(d===""||d.startsWith("#")){p.push(s[l]),l++;continue}if(f(s[l])<=i)break;Fe(d)&&(t=!0),p.push(s[l]),l++}if(t){n=l;continue}v=!1}}if(T&&i>=4&&a.startsWith("- name:")&&k(a)){const p=i;for(n++;n<s.length;){const l=s[n],t=l.trimStart();if(t===""||t.startsWith("#")){n++;continue}if(f(l)<=p)break;n++}continue}if(a===""&&o.length>0&&o[o.length-1].trim()===""){n++;continue}o.push(x),n++}return o.join(`
`).replace(/\n{3,}/g,`
`).trimEnd()+`
`}function Fe(r){return r.includes("mountPath:")&&(r.includes("/var/run/secrets/kubernetes.io")||r.includes("/var/run/secrets/sa"))}const _={green:"#10b981",orange:"#f59e0b",red:"#ef4444",blue:"#326CE5"};function Ie(r){if(!r)return"#64748b";const s=r.toLowerCase();return["running","available","ready","active","completed","succeeded"].includes(s)?_.green:["pending","updating","progressing","containercreating"].includes(s)?_.orange:["failed","error","crashloopbackoff","imagepullbackoff","errimageneverpull"].includes(s)?_.red:_.blue}function _e(r){if(!r)return"-";const s=new Date(r);if(isNaN(s.getTime()))return r;const o=n=>String(n).padStart(2,"0");return`${s.getFullYear()}-${o(s.getMonth()+1)}-${o(s.getDate())} ${o(s.getHours())}:${o(s.getMinutes())}:${o(s.getSeconds())}`}function Oe(r,s){if(!r||!s)return null;const o=new Date(r).getTime(),n=new Date(s).getTime();return isNaN(o)||isNaN(n)||n<o?null:Math.max(0,Math.round((n-o)/1e3))}function We(r){if(r==null)return"-";if(r<60)return`${r}s`;if(r<3600)return`${Math.floor(r/60)}m${r%60}s`;const s=Math.floor(r/3600),o=Math.floor(r%3600/60);return`${s}h${o}m`}const Be=new Set(["kubectl.kubernetes.io/last-applied-configuration","deployment.kubernetes.io/revision","kubectl.kubernetes.io/restartedAt"]);function ae(r){const s=JSON.parse(JSON.stringify(r));if(delete s.status,s.metadata){if(delete s.metadata.managedFields,delete s.metadata.resourceVersion,delete s.metadata.uid,delete s.metadata.creationTimestamp,delete s.metadata.generation,delete s.metadata.selfLink,s.metadata.annotations){for(const o of Object.keys(s.metadata.annotations))Be.has(o)&&delete s.metadata.annotations[o];Object.keys(s.metadata.annotations).length===0&&delete s.metadata.annotations}s.metadata.labels&&(delete s.metadata.labels["pod-template-hash"],Object.keys(s.metadata.labels).length===0&&delete s.metadata.labels)}return s}async function Te(r){if(!r?.trim())return null;try{return JSON.parse(r)}catch{}try{const o=(await se(()=>import("./js-yaml-37NdyH6G.js"),[])).load(r);return o&&typeof o=="object"?o:null}catch{return null}}async function oe(r){return(await se(()=>import("./js-yaml-37NdyH6G.js"),[])).dump(r,{lineWidth:120,noRefs:!0})}async function Ce(r){const s=await Te(r);if(!s)return{manifest:null,yaml:r};const o=ae(s);return{manifest:o,yaml:await oe(o)}}async function Ue(r){const s=await oe(ae(r));return re(s)}function Ge({clusterCode:r,namespace:s,resource:o,name:n,onClose:g,onSaved:A,cleanBeforeEdit:R=!1,autoEdit:E=!1,inline:M=!1,initialYaml:h}){const{toast:b}=ne(),[S,F]=u.useState(h||""),[Y,w]=u.useState(""),[B,v]=u.useState(!h),[T,N]=u.useState(!1),[f,P]=u.useState(E),[V,C]=u.useState(!1),k=R||E,$=async m=>{if(!k)return m;const{yaml:z}=await Ce(m);return z},x=async()=>{if(h){F(h),w(await $(h)),v(!1);return}v(!0);try{const m=await D.getResourceYaml(r,s,o,n);F(m),w(await $(m))}catch(m){b({title:"获取YAML失败",description:m.message,variant:"destructive"});const z=`# Error: ${m.message}`;F(z),w(z)}finally{v(!1)}},a=async()=>{w(await $(S)),P(!0),k&&b({title:"已清理只读字段",description:"已剥离 status / managedFields / uid 等"})},[i,c]=u.useState(!1),p=async()=>{N(!0);try{await D.updateResourceYaml(r,s,o,n,Y),b({title:"YAML已应用",description:`${o}/${n} 更新成功`}),P(!1),F(Y),A?.()}catch(m){b({title:"保存失败",description:m.message,variant:"destructive"})}finally{N(!1)}},l=async()=>{const m=f?Y:S;await navigator.clipboard.writeText(m),C(!0),setTimeout(()=>C(!1),2e3)};u.useEffect(()=>{x()},[]);const t=f?Y:k&&!i?re(S):S,d=u.useMemo(()=>[ce(),W.lineWrapping,...f?[]:[W.editable.of(!1)]],[f]);return M?e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:119:7",className:"space-y-3",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:120:9",className:"flex items-center justify-between",children:[e.jsxs("p",{"code-path":"src/components/kubernetes/YamlViewer.tsx:121:11",className:"text-xs text-slate-500",children:[e.jsxs("code",{"code-path":"src/components/kubernetes/YamlViewer.tsx:122:13",className:"text-slate-400",children:[o,"/",n]})," · ",s," · ",r]}),e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:124:11",className:"flex items-center gap-2",children:[e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:125:13",variant:"outline",size:"sm",className:"h-7 border-slate-700 text-slate-300 text-xs",onClick:l,children:[V?e.jsx(K,{"code-path":"src/components/kubernetes/YamlViewer.tsx:126:25",className:"h-3 w-3 mr-1 text-emerald-400"}):e.jsx(H,{"code-path":"src/components/kubernetes/YamlViewer.tsx:126:79",className:"h-3 w-3 mr-1"}),V?"已复制":"复制"]}),k&&!f&&e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:130:15",variant:"outline",size:"sm",className:`h-7 text-xs ${i?"border-slate-700 text-slate-500":"border-emerald-700/50 text-emerald-400"}`,onClick:()=>c(m=>!m),title:"切换 精简/原始 视图",children:[e.jsx(I,{"code-path":"src/components/kubernetes/YamlViewer.tsx:132:17",className:"h-3 w-3 mr-1"}),i?"原始":"精简"]}),f?e.jsxs(e.Fragment,{children:[e.jsx(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:150:17",variant:"outline",size:"sm",className:"h-7 border-slate-700 text-slate-300 text-xs",onClick:()=>{P(!1),x()},children:"取消"}),e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:153:17",size:"sm",className:"h-7 bg-blue-600 hover:bg-blue-700 text-xs",onClick:p,disabled:T,children:[T?e.jsx(L,{"code-path":"src/components/kubernetes/YamlViewer.tsx:154:29",className:"h-3 w-3 animate-spin mr-1"}):e.jsx(q,{"code-path":"src/components/kubernetes/YamlViewer.tsx:154:81",className:"h-3 w-3 mr-1"}),"保存"]})]}):e.jsxs(e.Fragment,{children:[k&&e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:138:19",variant:"outline",size:"sm",className:"h-7 border-slate-700 text-slate-300 text-xs",onClick:a,title:"清理 status / managedFields 等只读字段后编辑",children:[e.jsx(I,{"code-path":"src/components/kubernetes/YamlViewer.tsx:139:19",className:"h-3 w-3 mr-1 text-amber-400"}),"编辑"]}),!k&&e.jsx(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:143:19",variant:"outline",size:"sm",className:"h-7 border-slate-700 text-slate-300 text-xs",onClick:()=>P(!0),children:"编辑"})]})]})]}),e.jsx("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:161:9",className:"border border-slate-700 rounded-lg overflow-hidden",children:B?e.jsx("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:163:13",className:"flex items-center justify-center h-96",children:e.jsx(L,{"code-path":"src/components/kubernetes/YamlViewer.tsx:163:68",className:"h-6 w-6 animate-spin text-slate-500"})}):e.jsx(U,{"code-path":"src/components/kubernetes/YamlViewer.tsx:165:13",value:t,height:"600px",theme:G,extensions:d,onChange:m=>f&&w(m),basicSetup:{lineNumbers:!0,foldGutter:!0,highlightActiveLine:f,highlightActiveLineGutter:f,autocompletion:!0,bracketMatching:!0,closeBrackets:!0,indentOnInput:!0},style:{fontSize:"12px"}})})]}):e.jsx("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:191:5",className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60",onClick:g,children:e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:192:7",className:"bg-slate-900 border border-slate-700 rounded-xl w-[92vw] max-w-5xl h-[88vh] flex flex-col shadow-2xl",onClick:m=>m.stopPropagation(),children:[e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:194:9",className:"flex items-center justify-between p-4 border-b border-slate-700",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:195:11",children:[e.jsxs("h2",{"code-path":"src/components/kubernetes/YamlViewer.tsx:196:13",className:"text-lg font-bold text-slate-100",children:[f?"YAML 编辑":"YAML 查看"," — ",o,"/",n]}),e.jsxs("p",{"code-path":"src/components/kubernetes/YamlViewer.tsx:197:13",className:"text-xs text-slate-500",children:[s," · ",r,f?" · 已清理只读字段":""]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:199:11",className:"flex items-center gap-2",children:[e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:200:13",variant:"outline",size:"sm",className:"h-8 border-slate-700 text-slate-300",onClick:l,children:[V?e.jsx(K,{"code-path":"src/components/kubernetes/YamlViewer.tsx:201:25",className:"h-3 w-3 mr-1 text-emerald-400"}):e.jsx(H,{"code-path":"src/components/kubernetes/YamlViewer.tsx:201:79",className:"h-3 w-3 mr-1"}),V?"已复制":"复制"]}),k&&!f&&e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:205:15",variant:"outline",size:"sm",className:`h-8 text-xs ${i?"border-slate-700 text-slate-500":"border-emerald-700/50 text-emerald-400"}`,onClick:()=>c(m=>!m),title:"切换 精简/原始 视图",children:[e.jsx(I,{"code-path":"src/components/kubernetes/YamlViewer.tsx:207:17",className:"h-3 w-3 mr-1"}),i?"原始":"精简"]}),f?e.jsxs(e.Fragment,{children:[e.jsx(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:225:17",variant:"outline",size:"sm",className:"h-8 border-slate-700 text-slate-300",onClick:()=>{P(!1),x()},children:"取消"}),e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:228:17",size:"sm",className:"h-8 bg-blue-600 hover:bg-blue-700",onClick:p,disabled:T,children:[T?e.jsx(L,{"code-path":"src/components/kubernetes/YamlViewer.tsx:229:29",className:"h-3 w-3 animate-spin mr-1"}):e.jsx(q,{"code-path":"src/components/kubernetes/YamlViewer.tsx:229:81",className:"h-3 w-3 mr-1"}),"保存"]})]}):e.jsxs(e.Fragment,{children:[k&&e.jsxs(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:213:19",variant:"outline",size:"sm",className:"h-8 border-slate-700 text-slate-300",onClick:a,title:"清理 status / managedFields 等只读字段后编辑",children:[e.jsx(I,{"code-path":"src/components/kubernetes/YamlViewer.tsx:214:21",className:"h-3 w-3 mr-1 text-amber-400"}),"清理并编辑"]}),!k&&e.jsx(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:218:19",variant:"outline",size:"sm",className:"h-8 border-slate-700 text-slate-300",onClick:()=>P(!0),children:"编辑"})]}),e.jsx(j,{"code-path":"src/components/kubernetes/YamlViewer.tsx:234:13",variant:"ghost",size:"icon",className:"h-8 w-8 text-slate-400",onClick:g,children:e.jsx(O,{"code-path":"src/components/kubernetes/YamlViewer.tsx:234:102",className:"h-4 w-4"})})]})]}),e.jsx("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:238:9",className:"flex-1 min-h-0 overflow-hidden p-4",children:B?e.jsx("div",{"code-path":"src/components/kubernetes/YamlViewer.tsx:240:13",className:"flex items-center justify-center h-full",children:e.jsx(L,{"code-path":"src/components/kubernetes/YamlViewer.tsx:240:70",className:"h-6 w-6 animate-spin text-slate-500"})}):e.jsx(U,{"code-path":"src/components/kubernetes/YamlViewer.tsx:242:13",value:t,height:"100%",theme:G,extensions:d,onChange:m=>f&&w(m),basicSetup:{lineNumbers:!0,foldGutter:!0,highlightActiveLine:f,highlightActiveLineGutter:f,autocompletion:!0,bracketMatching:!0,closeBrackets:!0,indentOnInput:!0},style:{fontSize:"13px",height:"100%"}})})]})})}const Ye=[{value:"sh",label:"/bin/sh"},{value:"bash",label:"/bin/bash"}];function Je({open:r,onOpenChange:s,clusterId:o,namespace:n,podName:g,containers:A=[],initialContainer:R}){const{toast:E}=ne(),M=u.useRef(null),h=u.useRef(null),b=u.useRef(null),S=u.useRef(null),F=u.useRef(!1),Y=u.useRef(!1),[w,B]=u.useState("idle"),[v,T]=u.useState(!1),[N,f]=u.useState(R||A[0]||""),[P,V]=u.useState("sh");u.useEffect(()=>{r||(T(!1),F.current=!1)},[r]),u.useEffect(()=>{r&&!N&&A.length>0&&f(R||A[0])},[r,A,R,N]);const C=u.useCallback(()=>{if(!h.current){console.error("[PodExec:connect] ABORT: termRef.current is null");return}const a=h.current;if(b.current){try{b.current.close()}catch{}b.current=null}B("connecting"),a.clear(),a.writeln(`\x1B[36m[正在连接 ${g}${N?"/"+N:""} shell=${P} ...]\x1B[0m`);const i=D.buildPodExecWsUrl(o,n,g,N||void 0,P),c=new WebSocket(i);b.current=c,c.onopen=()=>{B("connected"),a.reset();try{const{cols:l,rows:t}=a;c.send(JSON.stringify({status:1,cols:l,rows:t}))}catch(l){console.error("[PodExec:connect] resize error:",l)}const p=()=>{try{a.focus()}catch{}};p(),setTimeout(p,100),setTimeout(p,300)},c.onmessage=p=>{try{const l=JSON.parse(p.data);if(l.status===0&&typeof l.data=="string")a.write(l.data);else if(l.status===2||l.error){const t=l.data||l.message||l.error||"执行错误";if(t.includes("not found")&&P==="bash"){a.writeln(`\r
\x1B[33m⚠ bash 不可用,请切换 /bin/sh 后重连。\x1B[0m`),Y.current=!0;return}a.write(t.includes("\x1B")?t:`\r
\x1B[31m${t}\x1B[0m\r
`)}}catch{typeof p.data=="string"&&a.write(p.data)}},c.onclose=p=>{B(l=>l==="error"?l:"closed"),Y.current||a.write(`\r
\x1B[33m[连接已关闭]\x1B[0m\r
`)},c.onerror=p=>{console.error("[PodExec:connect] WS error event fired, readyState=",c.readyState,"type=",p.type),B("error"),a.write(`\r
\x1B[31m[连接发生错误]\x1B[0m\r
`)}},[o,n,g,N,P]);u.useEffect(()=>{if(!r)return;if(!o){console.error("[PodExec:initEffect] ABORT: clusterId is falsy:",o);return}if(!g){console.error("[PodExec:initEffect] ABORT: podName is falsy:",g);return}let a=!1,i=0;const c=performance.now(),p=()=>{if(a)return;const l=M.current;if(!l){i++,i<20?requestAnimationFrame(p):console.error("[PodExec:tryInit] FAILED: containerRef still null after 20 retries (",Math.round(performance.now()-c),"ms)");return}const t=new ye.Terminal({cursorBlink:!0,fontSize:14,fontFamily:'Menlo, Monaco, "Courier New", monospace',allowProposedApi:!0,scrollback:5e3,theme:{background:"#0f172a",foreground:"#e2e8f0",cursor:"#38bdf8",selectionBackground:"#1e40af",black:"#1e293b",red:"#ef4444",green:"#10b981",yellow:"#f59e0b",blue:"#3b82f6",magenta:"#a855f7",cyan:"#06b6d4",white:"#e2e8f0",brightBlack:"#475569",brightRed:"#f87171",brightGreen:"#34d399",brightYellow:"#fbbf24",brightBlue:"#60a5fa",brightMagenta:"#c084fc",brightCyan:"#22d3ee",brightWhite:"#f8fafc"}}),d=new Se.FitAddon;t.loadAddon(d),h.current=t,S.current=d,t.onData(m=>{b.current&&b.current.readyState===WebSocket.OPEN?b.current.send(JSON.stringify({status:0,data:m})):console.warn("[PodExec:term] TX dropped — WS not open, readyState=",b.current?.readyState)}),t.open(l),requestAnimationFrame(()=>{try{d.fit()}catch{}}),F.current=!0,C()};return requestAnimationFrame(p),()=>{a=!0}},[r,o,g]),u.useEffect(()=>{if(!r){try{b.current?.close()}catch{}try{h.current?.dispose()}catch{}h.current=null,b.current=null,S.current=null,F.current=!1,B("idle")}},[r]),u.useEffect(()=>{r&&h.current&&F.current&&C()},[N,P]),u.useEffect(()=>{if(!r)return;const a=M.current;if(!a)return;let i;const c=new ResizeObserver(()=>{clearTimeout(i),i=setTimeout(()=>{if(S.current&&h.current)try{S.current.fit(),h.current.focus();const{cols:p,rows:l}=h.current;b.current?.readyState===WebSocket.OPEN&&b.current.send(JSON.stringify({status:1,cols:p,rows:l}))}catch{}},60)});return c.observe(a),()=>{clearTimeout(i),c.disconnect()}},[r,v]);const k=w==="connected"?"bg-emerald-400":w==="error"?"bg-red-400":w==="closed"?"bg-slate-500":"bg-amber-400",$=w==="connected"?"已连接":w==="connecting"?"连接中":w==="error"?"连接错误":w==="closed"?"已断开":"空闲",x=u.useCallback(()=>{try{h.current?.focus()}catch{}},[]);return e.jsx(ie,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:279:5",open:r,onOpenChange:s,children:e.jsxs(le,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:280:7",showCloseButton:!1,className:J("bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] p-0 gap-0","!duration-0 !transition-none",v?"!max-w-none !w-screen !h-screen !rounded-none !translate-x-0 !translate-y-0 !left-0 !top-0":""),style:v?{maxWidth:"100vw",width:"100vw",height:"100vh"}:{maxWidth:"960px",width:"92vw"},children:[e.jsxs(de,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:289:9",className:"sr-only",children:["exec — ",g]}),e.jsx(me,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:290:9",className:"sr-only",children:"进入 Pod 容器执行命令"}),e.jsxs("div",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:293:9",className:"flex items-center justify-between gap-2 px-4 py-2 border-b border-[var(--dg-border)] flex-wrap",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:294:11",className:"flex items-center gap-2 text-sm min-w-0",children:[e.jsx("div",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:295:13",className:J("w-2 h-2 rounded-full shrink-0",k),title:$}),e.jsx(ue,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:296:13",className:"h-4 w-4 text-blue-400 shrink-0"}),e.jsxs("span",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:297:13",className:"text-[var(--dg-text-primary)] font-medium truncate",children:["exec — ",g]}),w==="connecting"&&e.jsx(L,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:298:44",className:"h-3 w-3 animate-spin text-[var(--dg-text-muted)]"}),e.jsx("span",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:299:13",className:"text-xs text-[var(--dg-text-muted)]",children:$})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:301:11",className:"flex items-center gap-2",children:[A.length>0&&e.jsxs(X,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:303:15",value:N,onValueChange:f,children:[e.jsxs(Z,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:304:17",className:"h-8 w-[150px] text-xs bg-[var(--dg-bg-hover)] border-[var(--dg-border)]",children:[e.jsx(xe,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:305:19",className:"h-3 w-3 mr-1 text-[var(--dg-text-muted)]"}),e.jsx(Q,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:306:19",placeholder:"容器"})]}),e.jsx(ee,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:308:17",children:A.map(a=>e.jsx(te,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:308:55",value:a,children:a},a))})]}),e.jsxs(X,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:311:13",value:P,onValueChange:V,children:[e.jsx(Z,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:312:15",className:"h-8 w-[110px] text-xs bg-[var(--dg-bg-hover)] border-[var(--dg-border)]",children:e.jsx(Q,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:313:17"})}),e.jsx(ee,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:315:15",children:Ye.map(a=>e.jsx(te,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:315:47",value:a.value,children:a.label},a.value))})]}),e.jsx(j,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:317:13",variant:"ghost",size:"sm",className:"h-8 px-2 text-[var(--dg-text-secondary)] hover:text-[var(--dg-text-primary)]",onClick:()=>{C(),E({title:"正在重连…"})},title:"重连",children:e.jsx(he,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:319:15",className:"h-3.5 w-3.5"})}),e.jsx("button",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:321:13",onClick:()=>T(!v),className:"p-1.5 rounded hover:bg-[var(--dg-bg-hover)] text-[var(--dg-text-secondary)]",title:v?"退出全屏":"全屏",children:v?e.jsx(pe,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:322:29",className:"h-4 w-4"}):e.jsx(fe,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:322:65",className:"h-4 w-4"})}),e.jsx("button",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:324:13",onClick:()=>s(!1),className:"p-1.5 rounded hover:bg-[var(--dg-bg-hover)] text-[var(--dg-text-secondary)]",title:"关闭",children:e.jsx(O,{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:325:15",className:"h-4 w-4"})})]})]}),e.jsx("div",{"code-path":"src/components/kubernetes/PodExecTerminal.tsx:331:9",ref:M,className:"bg-[#0f172a] cursor-text",style:{height:v?"calc(100vh - 49px)":"480px"},onClick:x})]})})}function Ke({open:r,onOpenChange:s,clusterCode:o,namespace:n,podName:g,containers:A=[],initialContainer:R}){const[E,M]=u.useState(R||A[0]||""),[h,b]=u.useState("/"),[S,F]=u.useState([]),[Y,w]=u.useState(!1),[B,v]=u.useState(""),[T,N]=u.useState(null),[f,P]=u.useState(!1),V=u.useRef(null),C=u.useRef(!1),k=u.useCallback(async t=>{w(!0),v(""),N(null);try{const d=await D.listPodFiles(o,n,g,t,E||void 0),z=(d?.entries||d?.files||d?.data?.entries||d?.data?.files||(Array.isArray(d)?d:[])).map(y=>({name:y.name??y.Name??"",isDir:!!(y.isDir??y.is_dir??y.IsDir??y.dir??y.directory),size:typeof y.size=="number"?y.size:y.Size?Number(y.Size):void 0,modTime:y.modTime??y.mod_time??y.ModTime??y.mtime??y.modified})).filter(y=>y.name&&y.name!==".");F(z),b(t)}catch(d){v(d.message||"加载文件列表失败"),F([])}finally{w(!1)}},[o,n,g,E]);u.useEffect(()=>{r?(async()=>{if(C.current){k(h);return}w(!0);try{const d=await D.execPod(o,n,g,["pwd"],E||void 0),m=(d?.stdout||d?.data?.stdout||"").trim(),z=m&&m.startsWith("/")?m:"/";C.current=!0,b(z),k(z)}catch{C.current=!0,k("/")}})():C.current=!1},[r,E]);const $=t=>{if(t.isDir){const d=h==="/"?`/${t.name}`:`${h}/${t.name}`;k(d)}else x(t.name)},x=async t=>{const d=h==="/"?`/${t}`:`${h}/${t}`;try{const m=await D.readPodFileText(o,n,g,d,E||void 0);N({file:t,content:m})}catch(m){N({file:t,content:`读取失败: ${m.message}`})}},a=t=>{const d=h==="/"?`/${t}`:`${h}/${t}`,m=D.buildPodFileDownloadUrl(o,n,g,d,E||void 0);window.open(m,"_blank")},i=async t=>{const d=t.target.files?.[0];if(d){P(!0);try{await D.uploadPodFile(o,n,g,h,d,E||void 0),k(h)}catch(m){v(`上传失败: ${m.message}`)}finally{P(!1),V.current&&(V.current.value="")}}},c=()=>{if(h==="/")return;const t=h.split("/").filter(Boolean);t.pop(),k(t.length===0?"/":`/${t.join("/")}`)},p=t=>t==null?"-":t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`,l=h.split("/").filter(Boolean);return r?e.jsx("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:163:5",className:"fixed inset-0 z-50 flex items-center justify-center bg-black/70",onClick:()=>s(!1),children:e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:164:7",className:"bg-slate-900 border border-slate-700 rounded-xl w-[90vw] max-w-5xl h-[80vh] flex flex-col shadow-2xl",onClick:t=>t.stopPropagation(),children:[e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:169:9",className:"flex items-center justify-between p-3 border-b border-slate-700 shrink-0",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:170:11",className:"flex items-center gap-2",children:[e.jsx(be,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:171:13",className:"h-4 w-4 text-amber-400"}),e.jsxs("span",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:172:13",className:"text-sm font-semibold text-slate-200",children:["文件浏览器: ",g]}),e.jsx(Ee,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:173:13",variant:"outline",className:"border-slate-700 text-slate-400 text-[10px]",children:n})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:175:11",className:"flex items-center gap-2",children:[A.length>0&&e.jsx("select",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:177:15",value:E,onChange:t=>{M(t.target.value)},className:"bg-slate-800 border border-slate-700 rounded text-xs text-slate-300 px-2 py-1",children:A.map(t=>e.jsx("option",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:182:40",value:t,children:t},t))}),e.jsx(j,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:185:13",variant:"ghost",size:"icon",className:"h-7 w-7 text-slate-400",onClick:()=>s(!1),children:e.jsx(O,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:186:15",className:"h-4 w-4"})})]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:192:9",className:"flex items-center justify-between p-2 border-b border-slate-800 shrink-0",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:193:11",className:"flex items-center gap-1 text-xs text-slate-400",children:[e.jsx(j,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:194:13",variant:"ghost",size:"icon",className:"h-6 w-6 text-slate-500",onClick:c,disabled:h==="/",children:e.jsx(we,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:195:15",className:"h-3.5 w-3.5"})}),e.jsx("button",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:197:13",className:"hover:text-slate-200",onClick:()=>k("/"),children:"root"}),l.map((t,d)=>{const m=`/${l.slice(0,d+1).join("/")}`;return e.jsxs("span",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:201:17",className:"flex items-center gap-1",children:[e.jsx(ke,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:202:19",className:"h-3 w-3"}),e.jsx("button",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:203:19",className:"hover:text-slate-200",onClick:()=>k(m),children:t})]},m)})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:208:11",className:"flex items-center gap-2",children:[e.jsx("input",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:209:13",type:"file",ref:V,className:"hidden",onChange:i}),e.jsxs(j,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:210:13",size:"sm",variant:"outline",className:"h-7 border-slate-700 text-slate-300 text-xs",onClick:()=>V.current?.click(),disabled:f,children:[f?e.jsx(L,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:211:28",className:"h-3 w-3 animate-spin mr-1"}):e.jsx(ge,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:211:80",className:"h-3 w-3 mr-1"}),"上传"]}),e.jsx(j,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:213:13",size:"sm",variant:"outline",className:"h-7 border-slate-700 text-slate-300 text-xs",onClick:()=>k(h),disabled:Y,children:Y?e.jsx(L,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:214:26",className:"h-3 w-3 animate-spin"}):e.jsx(je,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:214:73",className:"h-3 w-3"})})]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:220:9",className:"flex-1 overflow-hidden flex",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:222:11",className:`${T?"w-1/2":"w-full"} overflow-auto p-2 border-r border-slate-800`,children:[B&&e.jsx("p",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:223:23",className:"text-xs text-red-400 p-2",children:B}),Y?e.jsx("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:225:15",className:"flex items-center justify-center h-32",children:e.jsx(L,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:225:70",className:"h-5 w-5 animate-spin text-slate-500"})}):S.length===0?e.jsx("p",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:227:15",className:"text-xs text-slate-500 p-4 text-center",children:"空目录"}):e.jsx("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:229:15",className:"space-y-0.5",children:S.sort((t,d)=>t.isDir===d.isDir?t.name.localeCompare(d.name):t.isDir?-1:1).map(t=>e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:231:19",className:"flex items-center gap-2 px-2 py-1.5 rounded hover:bg-slate-800/50 cursor-pointer group",onClick:()=>$(t),children:[t.isDir?e.jsx(ve,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:237:23",className:"h-4 w-4 text-blue-400 shrink-0"}):e.jsx(Ne,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:239:23",className:"h-4 w-4 text-slate-500 shrink-0"}),e.jsx("span",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:241:21",className:`text-xs truncate ${t.isDir?"text-blue-300":"text-slate-300"}`,children:t.name}),!t.isDir&&e.jsx("span",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:245:23",className:"text-[10px] text-slate-600 ml-auto shrink-0",children:p(t.size)}),!t.isDir&&e.jsx(j,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:248:23",variant:"ghost",size:"icon",className:"h-5 w-5 opacity-0 group-hover:opacity-100 text-slate-400 hover:text-emerald-400 shrink-0",onClick:d=>{d.stopPropagation(),a(t.name)},title:"下载",children:e.jsx(Pe,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:253:25",className:"h-3 w-3"})})]},t.name))})]}),T&&e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:264:13",className:"w-1/2 flex flex-col overflow-hidden",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:265:15",className:"flex items-center justify-between p-2 border-b border-slate-800 shrink-0",children:[e.jsx("span",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:266:17",className:"text-xs text-slate-300 font-mono",children:T.file}),e.jsx(j,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:267:17",variant:"ghost",size:"icon",className:"h-6 w-6 text-slate-400",onClick:()=>N(null),children:e.jsx(O,{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:268:19",className:"h-3.5 w-3.5"})})]}),e.jsx("div",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:271:15",className:"flex-1 overflow-auto p-3",children:e.jsx("pre",{"code-path":"src/components/kubernetes/PodFileBrowser.tsx:272:17",className:"text-xs text-slate-300 font-mono whitespace-pre-wrap break-all bg-slate-950 rounded p-3",children:T.content||"(空文件)"})})]})]})]})}):null}export{Je as P,_ as S,Ge as Y,Ke as a,Te as b,re as c,oe as d,Ue as e,_e as f,Oe as g,We as h,Ce as p,Ie as s};