dockscope 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -4831,4 +4831,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
4831
4831
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function CY(i,e){if(e&&(typeof e=="object"||typeof e=="function"))return e;if(e!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return vY(i)}function I0(i,e){return I0=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,n){return t.__proto__=n,t},I0(i,e)}function Xw(i,e){return gY(i)||wY(i,e)||jN(i,e)||EY()}function ch(i){return _Y(i)||TY(i)||jN(i)||AY()}function RY(i,e){if(typeof i!="object"||!i)return i;var t=i[Symbol.toPrimitive];if(t!==void 0){var n=t.call(i,e);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(i)}function NY(i){var e=RY(i,"string");return typeof e=="symbol"?e:e+""}function jN(i,e){if(i){if(typeof i=="string")return L0(i,e);var t={}.toString.call(i).slice(8,-1);return t==="Object"&&i.constructor&&(t=i.constructor.name),t==="Map"||t==="Set"?Array.from(i):t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?L0(i,e):void 0}}var uh=typeof window<"u"&&window.THREE?window.THREE:{CanvasTexture:jE,Sprite:$E,SpriteMaterial:lx,SRGBColorSpace:Mi},XN=(function(i){function e(){var t,n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:10,s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"rgba(255, 255, 255, 1)";return xY(this,e),t=yY(this,e,[new uh.SpriteMaterial]),t._text="".concat(n),t._textHeight=r,t._color=s,t._backgroundColor=!1,t._padding=0,t._borderWidth=0,t._borderRadius=0,t._borderColor="white",t._offsetX=0,t._offsetY=0,t._strokeWidth=0,t._strokeColor="white",t._fontFace="system-ui",t._fontSize=90,t._fontWeight="normal",t._canvas=document.createElement("canvas"),t._genCanvas(),t}return MY(e,i),SY(e,[{key:"text",get:function(){return this._text},set:function(n){this._text=n,this._genCanvas()}},{key:"textHeight",get:function(){return this._textHeight},set:function(n){this._textHeight=n,this._genCanvas()}},{key:"color",get:function(){return this._color},set:function(n){this._color=n,this._genCanvas()}},{key:"backgroundColor",get:function(){return this._backgroundColor},set:function(n){this._backgroundColor=n,this._genCanvas()}},{key:"padding",get:function(){return this._padding},set:function(n){this._padding=n,this._genCanvas()}},{key:"borderWidth",get:function(){return this._borderWidth},set:function(n){this._borderWidth=n,this._genCanvas()}},{key:"borderRadius",get:function(){return this._borderRadius},set:function(n){this._borderRadius=n,this._genCanvas()}},{key:"borderColor",get:function(){return this._borderColor},set:function(n){this._borderColor=n,this._genCanvas()}},{key:"offsetX",get:function(){return this._offsetX},set:function(n){this._offsetX=n,this._genCanvas()}},{key:"offsetY",get:function(){return this._offsetY},set:function(n){this._offsetY=n,this._genCanvas()}},{key:"fontFace",get:function(){return this._fontFace},set:function(n){this._fontFace=n,this._genCanvas()}},{key:"fontSize",get:function(){return this._fontSize},set:function(n){this._fontSize=n,this._genCanvas()}},{key:"fontWeight",get:function(){return this._fontWeight},set:function(n){this._fontWeight=n,this._genCanvas()}},{key:"strokeWidth",get:function(){return this._strokeWidth},set:function(n){this._strokeWidth=n,this._genCanvas()}},{key:"strokeColor",get:function(){return this._strokeColor},set:function(n){this._strokeColor=n,this._genCanvas()}},{key:"_genCanvas",value:function(){var n=this,r=this._canvas,s=r.getContext("2d"),o=1/this.textHeight,a=Array.isArray(this.borderWidth)?this.borderWidth:[this.borderWidth,this.borderWidth],l=a.map(function(A){return A*n.fontSize*o}),c=Array.isArray(this.borderRadius)?this.borderRadius:[this.borderRadius,this.borderRadius,this.borderRadius,this.borderRadius],u=c.map(function(A){return A*n.fontSize*o}),h=Array.isArray(this.padding)?this.padding:[this.padding,this.padding],d=h.map(function(A){return A*n.fontSize*o}),f=[this.offsetX,this.offsetY].map(function(A){return A*n.fontSize*o}),p=this.text.split(`
|
|
4832
4832
|
`),_="".concat(this.fontWeight," ").concat(this.fontSize,"px ").concat(this.fontFace);s.font=_;var g=Math.max.apply(Math,ch(p.map(function(A){return s.measureText(A).width}))),m=this.fontSize*p.length,v=g+l[0]*2+d[0]*2,y=m+l[1]*2+d[1]*2;if(r.width=v+Math.abs(f[0]),r.height=y+Math.abs(f[1]),s.translate.apply(s,ch(f.map(function(A){return Math.max(0,A)}))),this.borderWidth){if(s.strokeStyle=this.borderColor,l[0]){var x=l[0]/2;s.lineWidth=l[0],s.beginPath(),s.moveTo(x,u[0]),s.lineTo(x,y-u[3]),s.moveTo(v-x,u[1]),s.lineTo(v-x,y-u[2]),s.stroke()}if(l[1]){var w=l[1]/2;s.lineWidth=l[1],s.beginPath(),s.moveTo(Math.max(l[0],u[0]),w),s.lineTo(v-Math.max(l[0],u[1]),w),s.moveTo(Math.max(l[0],u[3]),y-w),s.lineTo(v-Math.max(l[0],u[2]),y-w),s.stroke()}if(this.borderRadius){var b=Math.max.apply(Math,ch(l)),S=b/2;s.lineWidth=b,s.beginPath(),[!!u[0]&&[u[0],S,S,u[0]],!!u[1]&&[v-u[1],v-S,S,u[1]],!!u[2]&&[v-u[2],v-S,y-S,y-u[2]],!!u[3]&&[u[3],S,y-S,y-u[3]]].filter(function(A){return A}).forEach(function(A){var R=Xw(A,4),P=R[0],L=R[1],B=R[2],V=R[3];s.moveTo(P,B),s.quadraticCurveTo(L,B,L,V)}),s.stroke()}}this.backgroundColor&&(s.fillStyle=this.backgroundColor,this.borderRadius?(s.beginPath(),s.moveTo(l[0],u[0]),[[l[0],u[0],v-u[1],l[1],l[1],l[1]],[v-l[0],v-l[0],v-l[0],l[1],u[1],y-u[2]],[v-l[0],v-u[2],u[3],y-l[1],y-l[1],y-l[1]],[l[0],l[0],l[0],y-l[1],y-u[3],u[0]]].forEach(function(A){var R=Xw(A,6),P=R[0],L=R[1],B=R[2],V=R[3],F=R[4],I=R[5];s.quadraticCurveTo(P,V,L,F),s.lineTo(B,I)}),s.closePath(),s.fill()):s.fillRect(l[0],l[1],v-l[0]*2,y-l[1]*2)),s.translate.apply(s,ch(l)),s.translate.apply(s,ch(d)),s.font=_,s.fillStyle=this.color,s.textBaseline="bottom";var E=this.strokeWidth>0;E&&(s.lineWidth=this.strokeWidth*this.fontSize/10,s.strokeStyle=this.strokeColor),p.forEach(function(A,R){var P=(g-s.measureText(A).width)/2,L=(R+1)*n.fontSize;E&&s.strokeText(A,P,L),s.fillText(A,P,L)}),this.material.map&&this.material.map.dispose();var T=this.material.map=new uh.CanvasTexture(r);T.colorSpace=uh.SRGBColorSpace;var M=this.textHeight*p.length+a[1]*2+h[1]*2+Math.abs(this.offsetY);this.scale.set(M*r.width/r.height,M,0)}},{key:"clone",value:function(){return new this.constructor(this.text,this.textHeight,this.color).copy(this)}},{key:"copy",value:function(n){return uh.Sprite.prototype.copy.call(this,n),this.color=n.color,this.backgroundColor=n.backgroundColor,this.padding=n.padding,this.borderWidth=n.borderWidth,this.borderColor=n.borderColor,this.offsetX=n.offsetX,this.offsetY=n.offsetY,this.fontFace=n.fontFace,this.fontSize=n.fontSize,this.fontWeight=n.fontWeight,this.strokeWidth=n.strokeWidth,this.strokeColor=n.strokeColor,this}}])})(uh.Sprite);const Jr=nu.node,_v={"running:healthy":"#00ff6a","running:none":"#00e4ff","running:unhealthy":"#ff2b4e","running:starting":"#ff8a2b",exited:"#2a3040",paused:"#a855f7",restarting:"#ff8a2b",dead:"#ff2b4e",created:"#3e4a5c",removing:"#3e4a5c"};function PY(i){return i.status==="running"?_v[`running:${i.health}`]||_v["running:none"]:_v[i.status]||"#2a3040"}function Yw(i,e,t,n){const r=Math.ceil(t*2+4),s=document.createElement("canvas");s.width=r*4,s.height=r*4;const o=s.getContext("2d"),a=s.width/2,l=s.height/2,c=s.width/r;o.beginPath(),o.arc(a,l,t*c,0,Math.PI*2),o.arc(a,l,e*c,0,Math.PI*2,!0),o.fillStyle=i,o.fill();const u=new jE(s);u.needsUpdate=!0;const h=new lx({map:u,transparent:!0,opacity:n,depthWrite:!1}),d=new $E(h);return d.scale.set(r,r,1),d}function Kw(i,e,t,n){const r=new el,s=PY(i),o=i.status==="running",a=1+e*Jr.importanceScale,c=(o?Jr.baseRadius.running:Jr.baseRadius.stopped)*a,u=new Cm(c,Jr.sphereSegments.w,Jr.sphereSegments.h),h=o?.25+e*.3:.1,d=new yB({color:s,emissive:s,emissiveIntensity:h,transparent:!0,opacity:o?.88:.4}),f=new Ei(u,d);if(r.add(f),r.__coreMat=d,r.__baseEmissive=h,o){const _=c+Jr.ringGap,g=Jr.ringThicknessBase+e*Jr.ringThicknessScale,m=.06+e*.14;r.add(Yw(s,_,_+g,m))}if(o&&t){const _=Yw("#ff8a2b",c+3.5,c+5.5,.25);r.add(_),n.push(_)}const p=new XN(i.name);return p.color="#c8cede",p.textHeight=Jr.labelHeight,p.fontFace="'Fira Code', monospace",p.fontWeight="400",p.backgroundColor="rgba(4, 4, 14, 0.65)",p.padding=1,p.borderRadius=1.5,p.position.set(0,c+Jr.labelOffset,0),p.material.depthWrite=!1,r.add(p),r}function Jf(i,e){if(!(i!=null&&i.__threeObj))return;const t=i.__threeObj.__coreMat,n=i.__threeObj.__baseEmissive??.35;e?(i.__threeObj.scale.setScalar(1.25),t&&(t.emissiveIntensity=.9)):(i.__threeObj.scale.setScalar(1),t&&(t.emissiveIntensity=n))}const YN=new Cm(1,20,14),$c=new Map;function DY(i){let e=[];function t(n){const r=new Map;for(const s of e){const o=s.project||"";if(!o)continue;let a=r.get(o);a||(a={x:0,y:0,z:0,count:0},r.set(o,a)),a.x+=s.x,a.y+=s.y,a.z+=s.z,a.count++}for(const s of r.values())s.x/=s.count,s.y/=s.count,s.z/=s.count;for(const s of e){const o=r.get(s.project||"");!o||o.count<2||(s.vx+=(o.x-s.x)*i*n,s.vy+=(o.y-s.y)*i*n,s.vz+=(o.z-s.z)*i*n)}}return t.initialize=n=>{e=n},t}function LY(i){const e=new Tm({color:i,transparent:!0,opacity:.035,depthWrite:!1,side:ai}),t=new Ei(YN,e);return t.renderOrder=-1,t}function IY(i,e){const t=new XN(i);return t.color=e,t.textHeight=3,t.fontFace="'Fira Code', monospace",t.fontWeight="600",t.backgroundColor=!1,t.padding=0,t.material.depthWrite=!1,t.material.opacity=.5,t}function F0(i,e){const t=$c.get(e);t&&(i.remove(t.mesh),i.remove(t.label),t.mesh.material.dispose(),$c.delete(e))}function FY(i,e,t){const n=new Map;for(const o of e){if(o.x===void 0)continue;const a=o.project||"";a&&t(o)&&(n.has(a)||n.set(a,[]),n.get(a).push(o))}const r=[...n.keys()].sort(),s=new Map(r.map((o,a)=>[o,a]));for(const[o,a]of n){if(a.length<2){F0(i,o);continue}let l=0,c=0,u=0;for(const _ of a)l+=_.x,c+=_.y,u+=_.z;l/=a.length,c/=a.length,u/=a.length;let h=0;for(const _ of a){const g=Math.sqrt((_.x-l)**2+(_.y-c)**2+(_.z-u)**2);g>h&&(h=g)}const d=h+15,f=Bb[s.get(o)%Bb.length];let p=$c.get(o);if(!p){const _=LY(f),g=IY(o,f);i.add(_),i.add(g),p={mesh:_,label:g},$c.set(o,p)}p.mesh.position.set(l,c,u),p.mesh.scale.setScalar(d),p.label.position.set(l,c+d+5,u)}for(const[o]of $c)(!n.has(o)||n.get(o).length<2)&&F0(i,o)}function UY(i){for(const[e]of $c)F0(i,e);YN.dispose()}const Ap=[],Zw=new Set;let BY=0;function Qw(i,e){if(Zw.has(i))return;Zw.add(i);const t=BY++;e.scale.setScalar(.01),setTimeout(()=>{Ap.push({obj:e,start:performance.now(),dur:nu.node.deployDuration})},t*nu.node.deployStagger)}function OY(){const i=performance.now();for(let e=Ap.length-1;e>=0;e--){const t=Ap[e],n=Math.min((i-t.start)/t.dur,1);t.obj.scale.setScalar(1-Math.pow(1-n,3)),n>=1&&Ap.splice(e,1)}}function kY(i){const e=.12+Math.sin(performance.now()*.004)*.12;for(const t of i)t.material.opacity=e}var zY=ke('<button class="graph-ctrl-btn svelte-nmiszu" title="Center on selected"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"></circle><path d="M12 2v4M12 18v4M2 12h4M18 12h4"></path></svg></button>'),GY=ke('<div class="graph-wrapper svelte-nmiszu"><div style="width: 100%; height: 100%;"></div> <div class="graph-controls svelte-nmiszu"><button class="graph-ctrl-btn svelte-nmiszu" title="Zoom to fit (F)"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"></path></svg></button> <button class="graph-ctrl-btn svelte-nmiszu" title="Reset camera (R)"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path><path d="M3 3v5h5"></path></svg></button> <!> <span class="ctrl-divider svelte-nmiszu"></span> <button class="graph-ctrl-btn help-btn svelte-nmiszu" title="Keyboard shortcuts (?)"><span class="help-glyph svelte-nmiszu">?</span></button></div></div>');function VY(i,e){Ii(e,!0);let t=jn(()=>mY(e.data.nodes,e.data.links));function n(R){for(const P of e.data.links){if(P.type!=="depends_on")continue;const L=typeof P.source=="object"?P.source.id:P.source,B=typeof P.target=="object"?P.target.id:P.target;if(L!==R)continue;const V=e.data.nodes.find(F=>F.id===B);if(V&&(V.status!=="running"||V.health==="unhealthy"))return!0}return!1}const r=[];function s(R){var P,L;if(e.statusFilter.size>0&&!(e.statusFilter.has("running")&&R.status==="running"||e.statusFilter.has("stopped")&&R.status!=="running"||e.statusFilter.has("unhealthy")&&R.health==="unhealthy"))return!1;if(e.searchQuery){const B=e.searchQuery.toLowerCase();if(!((P=R.name)!=null&&P.toLowerCase().includes(B))&&!((L=R.image)!=null&&L.toLowerCase().includes(B)))return!1}return!0}let o=null,a=null,l=null;function c(R){const P=typeof R.source=="object"?R.source:null,L=typeof R.target=="object"?R.target:null,B=o&&((P==null?void 0:P.id)===o||(L==null?void 0:L.id)===o);return R.type==="depends_on"?B?"rgba(255,138,43,0.5)":"rgba(255,138,43,0.1)":B?"rgba(0,228,255,0.6)":"rgba(0,228,255,0.15)"}function u(R){const P=typeof R.source=="object"?R.source:null,L=typeof R.target=="object"?R.target:null,B=o&&((P==null?void 0:P.id)===o||(L==null?void 0:L.id)===o),V=R.type==="depends_on"?.3:.5;return B?V+1:V}let h,d=null,f=null;bu(()=>{var I,q,ie,Y,se,ye,Z,U;const R=nu.force,P=nu.controls;d=pY()(h).backgroundColor("rgba(0,0,0,0)").nodeId("id").nodeThreeObject(H=>{const J=G(t).get(H.id)||0,xe=Kw(H,J,n(H.id),r);return Qw(H.id,xe),xe}).nodeThreeObjectExtend(!1).linkColor(c).linkWidth(u).linkDirectionalArrowLength(H=>H.type==="depends_on"?3:0).linkDirectionalArrowRelPos(1).linkDirectionalArrowColor(H=>H.type==="depends_on"?"rgba(255,138,43,0.25)":void 0).linkOpacity(.7).linkLabel(H=>H.type==="depends_on"?"depends_on":H.label||"").cooldownTicks(100).d3AlphaDecay(.08).d3VelocityDecay(.6).warmupTicks(80).onNodeClick(H=>e.onNodeClick(H)).onNodeHover((H,J)=>{h.style.cursor=H?"pointer":"default",J&&J.id!==l&&Jf(J,!1),H&&Jf(H,!0)}).graphData(e.data),(I=d.d3Force("charge"))==null||I.strength(R.charge.strength).distanceMax(R.charge.distanceMax),(q=d.d3Force("link"))==null||q.distance(R.link.distance),(ie=d.d3Force("center"))==null||ie.strength(R.center.strength),(Y=d.d3Force("x"))==null||Y.strength(R.position.strength),(se=d.d3Force("y"))==null||se.strength(R.position.strength),(ye=d.d3Force("z"))==null||ye.strength(R.position.strength),d.d3Force("cluster",DY(R.cluster.strength));const L=(Z=d.controls)==null?void 0:Z.call(d);L&&(L.zoomSpeed=P.zoomSpeed,L.rotateSpeed=P.rotateSpeed,L.panSpeed=P.panSpeed);const B=(U=d.renderer)==null?void 0:U.call(d);B&&B.setClearColor(263182,1);const V=new ResizeObserver(([H])=>{const{width:J,height:xe}=H.contentRect;d==null||d.width(J).height(xe)});V.observe(h);function F(){d&&FY(d.scene(),d.graphData().nodes,s),OY(),kY(r),f=requestAnimationFrame(F)}return f=requestAnimationFrame(F),()=>{var H;f!==null&&cancelAnimationFrame(f),d&&UY(d.scene()),V.disconnect(),(H=d==null?void 0:d._destructor)==null||H.call(d)}});function p(R){const P=new Map;for(const F of R){const I=F.project||"";P.has(I)||P.set(I,[]),P.get(I).push(F)}if(P.size<=1)return;const L=[...P.entries()],B=20*Math.sqrt(R.length),V=2*Math.PI/L.length;L.forEach(([F,I],q)=>{const ie=V*q,Y=Math.cos(ie)*B,se=Math.sin(ie)*B,ye=8*Math.sqrt(I.length);I.forEach((Z,U)=>{if(Z.x!==void 0)return;const H=2*Math.PI*U/I.length;Z.x=Y+Math.cos(H)*ye,Z.y=(Math.random()-.5)*ye*.5,Z.z=se+Math.sin(H)*ye})})}let _="";fs(()=>{if(!d)return;if(e.data.nodes.length===0){_!==""&&(_="",r.length=0,d.graphData({nodes:[],links:[]}));return}const R=e.data.nodes.map(P=>`${P.id}:${P.status}:${P.health}`).sort().join(",");if(R!==_){const P=_===""||e.data.nodes.map(L=>L.id).sort().join(",")!==_.replace(/:[^,]*/g,"").replace(/:/g,"");_=R,P&&p(e.data.nodes),r.length=0,d.nodeThreeObject(L=>{const B=G(t).get(L.id)||0,V=Kw(L,B,n(L.id),r);return Qw(L.id,V),V}),d.graphData(e.data)}}),fs(()=>{const R=e.selectedNode;_a(()=>{if(!d)return;const P=d.graphData().nodes;if(a){const L=P.find(B=>B.id===a);L&&Jf(L,!1)}if(R){const L=P.find(B=>B.id===R.id);Jf(L,!0)}a=(R==null?void 0:R.id)||null,o=(R==null?void 0:R.id)||null,l=(R==null?void 0:R.id)||null,d.linkColor(c).linkWidth(u)})}),fs(()=>{if(!d)return;if(!(e.searchQuery||e.statusFilter.size>0))d.nodeVisibility(()=>!0),d.linkVisibility(()=>!0);else if(d.nodeVisibility(P=>s(P)),d.linkVisibility(P=>{const L=typeof P.source=="object"?P.source:null,B=typeof P.target=="object"?P.target:null;return(L?s(L):!0)&&(B?s(B):!0)}),e.searchQuery){const P=e.searchQuery.toLowerCase(),L=e.data.nodes.filter(B=>B.name.toLowerCase().includes(P)||B.image.toLowerCase().includes(P));if(L.length===1){const B=L[0];if(B.x!==void 0){const F=1+120/Math.hypot(B.x||1,B.y||1,B.z||1);d.cameraPosition({x:B.x*F,y:B.y*F,z:B.z*F},B,800)}}}});function g(){d==null||d.zoomToFit(400)}function m(){d==null||d.cameraPosition({x:0,y:0,z:300},{x:0,y:0,z:0},800)}function v(R){const P=e.data.nodes.find(L=>L.id===R.id);if((P==null?void 0:P.x)!==void 0&&d){const B=1+120/Math.hypot(P.x||1,P.y||1,P.z||1);d.cameraPosition({x:P.x*B,y:P.y*B,z:P.z*B},P,800)}}var y={zoomToFit:g,resetCamera:m,centerOnNode:v},x=GY(),w=oe(x);Np(w,R=>h=R,()=>h);var b=ue(w,2),S=oe(b),E=ue(S,2),T=ue(E,2);{var M=R=>{var P=zY();Ze("click",P,()=>v(e.selectedNode)),Fe(R,P)};gt(T,R=>{e.selectedNode&&R(M)})}var A=ue(T,4);return Ze("click",S,g),Ze("click",E,m),Ze("click",A,function(...R){var P;(P=e.onHelpClick)==null||P.apply(this,R)}),Fe(i,x),Fi(y)}Ts(["click"]);var HY=ke('<div class="confirm-type svelte-djr3lv"><span class="confirm-hint svelte-djr3lv">Type <strong class="svelte-djr3lv"> </strong> to confirm</span> <input type="text" class="confirm-input svelte-djr3lv"/></div>'),WY=ke('<div class="confirm-overlay svelte-djr3lv"><div class="confirm-panel svelte-djr3lv"><div> </div> <p class="confirm-msg svelte-djr3lv"> </p> <!> <div class="confirm-actions svelte-djr3lv"><button class="confirm-btn cancel svelte-djr3lv">Cancel</button> <button> </button></div></div></div>');function $Y(i,e){Ii(e,!0);let t=ht(""),n=jn(()=>!e.typeToConfirm||G(t)===e.typeToConfirm);var r=WY();tE("keydown",Rp,g=>g.key==="Escape"&&e.onCancel());var s=oe(r),o=oe(s),a=oe(o),l=ue(o,2),c=oe(l),u=ue(l,2);{var h=g=>{var m=HY(),v=oe(m),y=ue(oe(v)),x=oe(y),w=ue(v,2);ot(()=>{Qe(x,e.typeToConfirm),ri(w,"placeholder",e.typeToConfirm)}),X0(w,()=>G(t),b=>we(t,b)),Fe(g,m)};gt(u,g=>{e.typeToConfirm&&g(h)})}var d=ue(u,2),f=oe(d),p=ue(f,2),_=oe(p);ot(()=>{Un(o,1,`confirm-title ${e.variant??""}`,"svelte-djr3lv"),Qe(a,e.title),Qe(c,e.message),Un(p,1,`confirm-btn ${e.variant??""}`,"svelte-djr3lv"),p.disabled=!G(n),Qe(_,e.confirmLabel)}),Ze("click",r,function(...g){var m;(m=e.onCancel)==null||m.apply(this,g)}),Ze("keydown",r,()=>{}),Ze("click",s,g=>g.stopPropagation()),Ze("keydown",s,()=>{}),Ze("click",f,function(...g){var m;(m=e.onCancel)==null||m.apply(this,g)}),Ze("click",p,function(...g){var m;(m=e.onConfirm)==null||m.apply(this,g)}),Fe(i,r),Fi()}Ts(["click","keydown"]);function qY(i){const e=new Date(i),n=new Date().getTime()-e.getTime(),r=Math.floor(n/1e3);if(r<60)return`${r}s ago`;const s=Math.floor(r/60);if(s<60)return`${s}m ago`;const o=Math.floor(s/60);if(o<24)return`${o}h ago`;const a=Math.floor(o/24);return a<7?`${a}d ago`:e.toLocaleDateString("en-US",{month:"short",day:"numeric"})+" "+e.toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit"})}function ep(i){if(i===0)return"0 B";const e=1024,t=["B","KB","MB","GB"],n=Math.floor(Math.log(i)/Math.log(e));return`${(i/Math.pow(e,n)).toFixed(1)} ${t[n]}`}function jY(i){return new Date(i*1e3).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function XY(i){return(i/1024/1024/1024).toFixed(1)}async function Jw(i,e){try{await navigator.clipboard.writeText(i),Br(`Copied ${e}`,"info")}catch{Br("Failed to copy","error")}}var YY=ke('<span class="sparkline-label svelte-1apk6lc"> </span>'),KY=iE('<path></path><path fill="none" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><circle r="2.5"></circle>',1),ZY=iE('<text text-anchor="middle" fill="#3e4a5c" font-size="9">collecting...</text>'),QY=ke('<div class="sparkline-container svelte-1apk6lc"><!> <svg class="sparkline-svg svelte-1apk6lc"><defs><linearGradient x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-opacity="0.15"></stop><stop offset="100%" stop-opacity="0"></stop></linearGradient></defs><!></svg></div>');function e1(i,e){Ii(e,!0);let t=ag(e,"width",3,200),n=ag(e,"height",3,32),r=ag(e,"label",3,""),s=jn(()=>{if(e.data.length<2)return"";const w=Math.max(...e.data,1),b=Math.min(...e.data,0),S=w-b||1,E=t()/(e.data.length-1),T=2,M=n()-T*2;return e.data.map((A,R)=>{const P=R*E,L=T+M-(A-b)/S*M;return`${R===0?"M":"L"}${P.toFixed(1)},${L.toFixed(1)}`}).join(" ")}),o=jn(()=>{if(!G(s))return"";const w=t()/(e.data.length-1);return`${G(s)} L${((e.data.length-1)*w).toFixed(1)},${n()} L0,${n()} Z`}),a=jn(()=>e.data.length>0?e.data[e.data.length-1]:0),l=jn(()=>{if(e.data.length<2)return{x:0,y:n()/2};const w=Math.max(...e.data,1),b=Math.min(...e.data,0),S=w-b||1,E=2,T=n()-E*2;return{x:t(),y:E+T-(G(a)-b)/S*T}});const c=`spark-${Math.random().toString(36).slice(2,8)}`;var u=QY(),h=oe(u);{var d=w=>{var b=YY(),S=oe(b);ot(()=>Qe(S,r())),Fe(w,b)};gt(h,w=>{r()&&w(d)})}var f=ue(h,2),p=oe(f),_=oe(p),g=oe(_),m=ue(g),v=ue(p);{var y=w=>{var b=KY(),S=wi(b),E=ue(S),T=ue(E);ot(()=>{ri(S,"d",G(o)),ri(S,"fill",`url(#${c})`),ri(E,"d",G(s)),ri(E,"stroke",e.color),ri(T,"cx",G(l).x),ri(T,"cy",G(l).y),ri(T,"fill",e.color)}),Fe(w,b)},x=w=>{var b=ZY();ot(()=>{ri(b,"x",t()/2),ri(b,"y",n()/2+4)}),Fe(w,b)};gt(v,w=>{e.data.length>=2?w(y):w(x,-1)})}ot(()=>{ri(f,"width",t()),ri(f,"height",n()),ri(f,"viewBox",`0 0 ${t()??""} ${n()??""}`),ri(_,"id",c),ri(g,"stop-color",e.color),ri(m,"stop-color",e.color)}),Fe(i,u),Fi()}var JY=ke('<div class="info-section"><span class="field-label">Created</span> <span class="mono"> </span></div>'),eK=ke('<div class="info-section"><span class="field-label">Restart Policy</span> <span class="tag"> </span></div>'),tK=ke('<span class="tag"> </span>'),nK=ke('<div class="info-section"><span class="field-label">Ports</span> <div></div></div>'),iK=ke('<span class="tag"> </span>'),rK=ke('<div class="info-section"><span class="field-label">Networks</span> <div></div></div>'),sK=ke('<div class="info-section sparkline-row"><!></div> <div class="info-section sparkline-row"><!></div>',1),oK=ke('<div class="info-section"><span class="field-label">CPU</span> <div class="gauge"><div class="progress-bar"><div class="progress-fill cpu"></div></div> <span class="gauge-value"> </span></div></div> <div class="info-section"><span class="field-label">Memory</span> <div class="gauge"><div class="progress-bar"><div class="progress-fill memory"></div></div> <span class="gauge-value"> </span></div> <span class="mono" style="font-size: 10px; color: var(--text-dim); margin-top: 4px; display: block;"> </span></div> <div class="info-section"><span class="field-label">Network I/O</span> <span class="mono"> </span></div> <!>',1),aK=ke('<div class="sidebar-content"><div class="info-section"><span class="field-label">Image</span> <button class="copyable mono"> </button></div> <div class="info-section"><span class="field-label">Status</span> <span> </span></div> <div class="info-section"><span class="field-label">Container ID</span> <button class="copyable mono"> </button></div> <!> <!> <!> <!> <!></div>');function lK(i,e){Ii(e,!0);let t=jn(()=>e.stats?(e.stats.memory/e.stats.memoryLimit*100).toFixed(1):"0"),n=jn(()=>e.history.map(T=>T.cpu)),r=jn(()=>e.history.map(T=>{var M;return T.memory/(((M=e.stats)==null?void 0:M.memoryLimit)||1)*100}));var s=aK(),o=oe(s),a=ue(oe(o),2),l=oe(a),c=ue(o,2),u=ue(oe(c),2),h=oe(u),d=ue(c,2),f=ue(oe(d),2),p=oe(f),_=ue(d,2);{var g=T=>{var M=JY(),A=ue(oe(M),2),R=oe(A);ot(P=>Qe(R,P),[()=>qY(e.inspect.created)]),Fe(T,M)};gt(_,T=>{var M;(M=e.inspect)!=null&&M.created&&T(g)})}var m=ue(_,2);{var v=T=>{var M=eK(),A=ue(oe(M),2),R=oe(A);ot(()=>Qe(R,e.inspect.restartPolicy)),Fe(T,M)};gt(m,T=>{var M;(M=e.inspect)!=null&&M.restartPolicy&&e.inspect.restartPolicy!=="no"&&T(v)})}var y=ue(m,2);{var x=T=>{var M=nK(),A=ue(oe(M),2);pr(A,21,()=>e.node.ports,ps,(R,P)=>{var L=tK(),B=oe(L);ot(()=>Qe(B,G(P))),Fe(R,L)}),Fe(T,M)};gt(y,T=>{e.node.ports.length>0&&T(x)})}var w=ue(y,2);{var b=T=>{var M=rK(),A=ue(oe(M),2);pr(A,21,()=>e.node.networks,ps,(R,P)=>{var L=iK(),B=oe(L);ot(()=>Qe(B,G(P))),Fe(R,L)}),Fe(T,M)};gt(w,T=>{e.node.networks.length>0&&T(b)})}var S=ue(w,2);{var E=T=>{var M=oK(),A=wi(M),R=ue(oe(A),2),P=oe(R),L=oe(P),B=ue(P,2),V=oe(B),F=ue(A,2),I=ue(oe(F),2),q=oe(I),ie=oe(q),Y=ue(q,2),se=oe(Y),ye=ue(I,2),Z=oe(ye),U=ue(F,2),H=ue(oe(U),2),J=oe(H),xe=ue(U,2);{var Pe=de=>{var ve=sK(),Ae=wi(ve),Je=oe(Ae);e1(Je,{get data(){return G(n)},color:"#00e4ff",label:"CPU History"});var z=ue(Ae,2),Rt=oe(z);e1(Rt,{get data(){return G(r)},color:"#a855f7",label:"Memory History"}),Fe(de,ve)};gt(xe,de=>{G(n).length>=2&&de(Pe)})}ot((de,ve,Ae,Je,z,Rt)=>{Lc(L,`width: ${de??""}%`),Qe(V,`${ve??""}%`),Lc(ie,`width: ${G(t)??""}%`),Qe(se,`${G(t)??""}%`),Qe(Z,`${Ae??""} / ${Je??""}`),Qe(J,`${z??""} rx · ${Rt??""} tx`)},[()=>Math.min(e.stats.cpu,100),()=>e.stats.cpu.toFixed(1),()=>ep(e.stats.memory),()=>ep(e.stats.memoryLimit),()=>ep(e.stats.networkRx),()=>ep(e.stats.networkTx)]),Fe(T,M)};gt(S,T=>{e.stats&&e.node.status==="running"&&T(E)})}ot(()=>{Qe(l,e.node.image),Un(u,1,`status-text ${e.node.status??""}`),Qe(h,`${e.node.status??""}${e.node.health!=="none"?` (${e.node.health})`:""}`),Qe(p,e.node.id)}),Ze("click",a,()=>Jw(e.node.image,"image")),Ze("click",f,()=>Jw(e.node.containerId,"container ID")),Fe(i,s),Fi()}Ts(["click"]);const cK=/password|secret|token|key|api_key|apikey|auth|credential/i;function uK(i,e){const t=i.indexOf("=");if(t===-1)return i;const n=i.substring(0,t),r=i.substring(t+1);return cK.test(n)&&!e?`${n}=${"*".repeat(Math.min(r.length,16))}`:i}var hK=ke('<div class="env-row mono"> </div>'),dK=ke('<div class="info-section"><div class="field-label-row"><span class="field-label">Environment Variables</span> <button class="reveal-btn"> </button></div> <div class="env-list"></div></div>'),fK=ke('<div class="env-row mono"><span style="color: var(--accent-cyan)"> </span> </div>'),pK=ke('<div class="info-section"><span class="field-label">Labels</span> <div class="env-list"></div></div>'),mK=ke('<div class="mount-row"><span class="tag"> </span> <span class="mono" style="font-size: 10px;"> <span style="color: var(--text-dim)"> </span></span></div>'),gK=ke('<div class="info-section"><span class="field-label">Mounts</span> <!></div>'),_K=ke('<div class="info-section"><span class="field-label">Command</span> <span class="mono"> </span></div>'),vK=ke('<div class="info-section"><span class="field-label">Working Directory</span> <span class="mono"> </span></div>'),yK=ke("<!> <!> <!> <!> <!>",1),xK=ke('<div class="env-loading">Loading configuration...</div>'),bK=ke('<div class="sidebar-content"><!></div>');function SK(i,e){Ii(e,!0);let t=ht(!1);var n=bK(),r=oe(n);{var s=a=>{var l=yK(),c=wi(l);{var u=x=>{var w=dK(),b=oe(w),S=ue(oe(b),2),E=oe(S),T=ue(b,2);pr(T,21,()=>e.inspect.env,ps,(M,A)=>{var R=hK(),P=oe(R);ot(L=>Qe(P,L),[()=>uK(G(A),G(t))]),Fe(M,R)}),ot(()=>Qe(E,G(t)?"Hide":"Reveal")),Ze("click",S,()=>we(t,!G(t))),Fe(x,w)};gt(c,x=>{e.inspect.env.length>0&&x(u)})}var h=ue(c,2);{var d=x=>{var w=pK(),b=ue(oe(w),2);pr(b,21,()=>Object.entries(e.inspect.labels),ps,(S,E)=>{var T=jn(()=>l2(G(E),2));let M=()=>G(T)[0],A=()=>G(T)[1];var R=fK(),P=oe(R),L=oe(P),B=ue(P);ot(()=>{Qe(L,M()),Qe(B,`=${A()??""}`)}),Fe(S,R)}),Fe(x,w)},f=jn(()=>Object.keys(e.inspect.labels).length>0);gt(h,x=>{G(f)&&x(d)})}var p=ue(h,2);{var _=x=>{var w=gK(),b=ue(oe(w),2);pr(b,17,()=>e.inspect.mounts,ps,(S,E)=>{var T=mK(),M=oe(T),A=oe(M),R=ue(M,2),P=oe(R),L=ue(P),B=oe(L);ot(()=>{Qe(A,G(E).type),Qe(P,`${G(E).source??""} → ${G(E).destination??""} `),Qe(B,`(${G(E).mode??""})`)}),Fe(S,T)}),Fe(x,w)};gt(p,x=>{e.inspect.mounts.length>0&&x(_)})}var g=ue(p,2);{var m=x=>{var w=_K(),b=ue(oe(w),2),S=oe(b);ot(E=>Qe(S,E),[()=>e.inspect.cmd.join(" ")]),Fe(x,w)};gt(g,x=>{e.inspect.cmd&&x(m)})}var v=ue(g,2);{var y=x=>{var w=vK(),b=ue(oe(w),2),S=oe(b);ot(()=>Qe(S,e.inspect.workingDir)),Fe(x,w)};gt(v,x=>{e.inspect.workingDir&&e.inspect.workingDir!=="/"&&x(y)})}Fe(a,l)},o=a=>{var l=xK();Fe(a,l)};gt(r,a=>{e.inspect?a(s):a(o,-1)})}Fe(i,n),Fi()}Ts(["click"]);const t1={30:"#3e4a5c",31:"#ff2b4e",32:"#00ff6a",33:"#ff8a2b",34:"#00a0ff",35:"#a855f7",36:"#00e4ff",37:"#e2e8f0",90:"#5a6578",91:"#ff5c7a",92:"#44ff8e",93:"#ffaa55",94:"#44bbff",95:"#c084fc",96:"#44eeff",97:"#f8fafc"},n1={40:"#1a1a2e",41:"#3b0a15",42:"#0a2b15",43:"#2b1a05",44:"#0a1a2b",45:"#1f0a2b",46:"#0a2b2b",47:"#2b2b2b",100:"#2a2a3e",101:"#4b1a25",102:"#1a3b25",103:"#3b2a15",104:"#1a2a3b",105:"#2f1a3b",106:"#1a3b3b",107:"#3b3b3b"},hm=["#3e4a5c","#ff2b4e","#00ff6a","#ff8a2b","#00a0ff","#a855f7","#00e4ff","#e2e8f0","#5a6578","#ff5c7a","#44ff8e","#ffaa55","#44bbff","#c084fc","#44eeff","#f8fafc"];for(let i=0;i<6;i++)for(let e=0;e<6;e++)for(let t=0;t<6;t++)hm.push(`#${(i?i*40+55:0).toString(16).padStart(2,"0")}${(e?e*40+55:0).toString(16).padStart(2,"0")}${(t?t*40+55:0).toString(16).padStart(2,"0")}`);for(let i=0;i<24;i++){const e=(i*10+8).toString(16).padStart(2,"0");hm.push(`#${e}${e}${e}`)}function vv(i){return i.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}const MK=/\d{4}-\d{2}-\d{2}T(\d{2}:\d{2}:\d{2})\.\d+Z/g;function i1(i){return i.replace(MK,'<span style="color:#5a6578">$1</span>')}function TK(i){if(!i)return"";if(!i.includes("\x1B")&&!i.includes("\x1B"))return r1(i1(vv(i)));const e=[];let t=null,n=null,r=!1,s=!1,o=!1,a=!1,l=!1;const c=()=>{l&&e.push("</span>");const f=[];t&&f.push(`color:${t}`),n&&f.push(`background:${n}`),r&&f.push("font-weight:700"),s&&f.push("opacity:0.6"),o&&f.push("font-style:italic"),a&&f.push("text-decoration:underline"),f.length>0?(e.push(`<span style="${f.join(";")}">`),l=!0):l=!1},u=/\x1b\[([0-9;]*)m/g;let h=0,d;for(;(d=u.exec(i))!==null;){d.index>h&&e.push(vv(i.slice(h,d.index))),h=u.lastIndex;const f=d[1]?d[1].split(";").map(Number):[0];let p=0;for(;p<f.length;){const _=f[p];if(_===0)t=null,n=null,r=!1,s=!1,o=!1,a=!1;else if(_===1)r=!0;else if(_===2)s=!0;else if(_===3)o=!0;else if(_===4)a=!0;else if(_===22)r=!1,s=!1;else if(_===23)o=!1;else if(_===24)a=!1;else if(_===39)t=null;else if(_===49)n=null;else if(_>=30&&_<=37)t=t1[_]||null;else if(_>=90&&_<=97)t=t1[_]||null;else if(_>=40&&_<=47)n=n1[_]||null;else if(_>=100&&_<=107)n=n1[_]||null;else if(_===38&&f[p+1]===5){const g=f[p+2];t=g!==void 0&&hm[g]||null,p+=2}else if(_===48&&f[p+1]===5){const g=f[p+2];n=g!==void 0&&hm[g]||null,p+=2}else _===38&&f[p+1]===2?(t=`rgb(${f[p+2]??0},${f[p+3]??0},${f[p+4]??0})`,p+=4):_===48&&f[p+1]===2&&(n=`rgb(${f[p+2]??0},${f[p+3]??0},${f[p+4]??0})`,p+=4);p++}c()}return h<i.length&&e.push(vv(i.slice(h))),l&&e.push("</span>"),r1(i1(e.join("")))}const wK=[[/^(.*(?:ERROR|FATAL|PANIC|CRIT).*)$/gim,'<span class="log-level-error">$1</span>'],[/^(.*(?:WARN|WARNING).*)$/gim,'<span class="log-level-warn">$1</span>'],[/^(.*(?:DEBUG|TRACE).*)$/gim,'<span class="log-level-debug">$1</span>']];function r1(i){return i.split(`
|
|
4833
4833
|
`).map(e=>{for(const[t,n]of wK)if(t.lastIndex=0,t.test(e))return t.lastIndex=0,e.replace(t,n);return e}).join(`
|
|
4834
|
-
`)}function EK(i,e){if(!e||!i)return{html:i,count:0};let t=0;const n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return{html:i.replace(new RegExp("(>|^)([^<]*?)(<|$)","g"),(s,o,a,l)=>{const c=a.replace(new RegExp(n,"gi"),u=>(t++,`<mark class="log-highlight">${u}</mark>`));return`${o}${c}${l}`}),count:t}}var AK=ke('<span class="log-match-count"> </span>'),CK=ke('<div class="log-search-bar"><input type="text" class="log-search-input" placeholder="Search logs..."/> <!> <button class="log-export-btn" title="Export logs"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg></button></div> <div class="sidebar-logs"><pre><!><div></div></pre></div>',1);function RK(i,e){Ii(e,!0);const t=oE();let n=ht(null),r=ht(""),s=jn(()=>TK(t.streamingLogs)),o=jn(()=>G(r)?EK(G(s),G(r)):{html:G(s),count:0});fs(()=>{t.streamingLogs&&G(n)&&G(n).scrollIntoView({behavior:"smooth"})});function a(){const v=t.streamingLogs;if(!v)return;const y=new Blob([v],{type:"text/plain"}),x=URL.createObjectURL(y),w=document.createElement("a");w.href=x,w.download=`logs-${new Date().toISOString().slice(0,19).replace(/:/g,"-")}.txt`,w.click(),URL.revokeObjectURL(x)}var l=CK(),c=wi(l),u=oe(c),h=ue(u,2);{var d=v=>{var y=AK(),x=oe(y);ot(()=>Qe(x,`${G(o).count??""} match${G(o).count!==1?"es":""}`)),Fe(v,y)};gt(h,v=>{G(r)&&v(d)})}var f=ue(h,2),p=ue(c,2),_=oe(p),g=oe(_);wP(g,()=>G(o).html||'<span style="color:var(--text-dim);font-style:italic">Connecting to log stream...</span>');var m=ue(g);Np(m,v=>we(n,v),()=>G(n)),ot(()=>f.disabled=!t.streamingLogs),X0(u,()=>G(r),v=>we(r,v)),Ze("click",f,a),Fe(i,l),Fi()}Ts(["click"]);var NK=ke('<div class="top-empty svelte-9pnfc5"> </div>'),PK=ke('<div class="top-empty svelte-9pnfc5">Loading...</div>'),DK=ke('<th class="svelte-9pnfc5"> </th>'),LK=ke('<td class="svelte-9pnfc5"> </td>'),IK=ke('<tr class="svelte-9pnfc5"></tr>'),FK=ke('<div class="top-table-wrap svelte-9pnfc5"><table class="top-table svelte-9pnfc5"><thead><tr></tr></thead><tbody></tbody></table></div>'),UK=ke('<div class="sidebar-content"><!></div>');function BK(i,e){Ii(e,!0);let t=ht(null),n=ht("");async function r(){try{const u=await fetch(`/api/containers/${e.containerId}/top`);if(!u.ok)throw new Error("Not running");we(t,await u.json(),!0),we(n,"")}catch{we(t,null),we(n,"Container must be running to view processes")}}bu(()=>{r();const u=setInterval(r,5e3);return()=>clearInterval(u)}),fs(()=>{e.containerId,r()});var s=UK(),o=oe(s);{var a=u=>{var h=NK(),d=oe(h);ot(()=>Qe(d,G(n))),Fe(u,h)},l=u=>{var h=PK();Fe(u,h)},c=u=>{var h=FK(),d=oe(h),f=oe(d),p=oe(f);pr(p,21,()=>G(t).titles,ps,(g,m)=>{var v=DK(),y=oe(v);ot(()=>Qe(y,G(m))),Fe(g,v)});var _=ue(f);pr(_,21,()=>G(t).processes,ps,(g,m)=>{var v=IK();pr(v,21,()=>G(m),ps,(y,x)=>{var w=LK(),b=oe(w);ot(()=>Qe(b,G(x))),Fe(y,w)}),Fe(g,v)}),Fe(u,h)};gt(o,u=>{G(n)?u(a):G(t)?u(c,-1):u(l,1)})}Fe(i,s),Fi()}var OK=ke('<div class="sidebar-empty"><div class="brand">DockScope</div> <div class="brand-sub">Infrastructure Debugger</div> <div class="instruction">Select a container node in the graph to inspect its configuration, metrics, and live logs.</div> <div class="legend"><div class="legend-title">Legend</div> <div class="legend-item"><span class="status-dot running"></span> Running (healthy)</div> <div class="legend-item"><span class="status-dot cyan"></span> Running (no healthcheck)</div> <div class="legend-item"><span class="status-dot other"></span> Other</div> <div class="legend-item"><span class="status-dot unhealthy"></span> Unhealthy</div> <div class="legend-item"><span class="status-dot exited"></span> Stopped</div> <div class="legend-line"><span class="line depends"></span> depends_on</div> <div class="legend-line"><span class="line network"></span> shared network</div></div></div>'),kK=ke('<button class="act-icon warning" title="Pause"><svg width="11" height="11" viewBox="0 0 24 24" fill="currentColor"><rect x="5" y="4" width="4" height="16" rx="1"></rect><rect x="15" y="4" width="4" height="16" rx="1"></rect></svg></button> <button title="Restart"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path><path d="M3 3v5h5"></path></svg></button> <button class="act-icon danger" title="Stop"><svg width="11" height="11" viewBox="0 0 24 24" fill="currentColor"><rect x="4" y="4" width="16" height="16" rx="2"></rect></svg></button>',1),zK=ke('<button class="act-icon success" title="Unpause"><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><polygon points="6,3 20,12 6,21"></polygon></svg></button> <button title="Restart"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path><path d="M3 3v5h5"></path></svg></button>',1),GK=ke('<button class="act-icon success" title="Start"><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><polygon points="6,3 20,12 6,21"></polygon></svg></button>'),VK=ke("<button>Top</button>"),HK=ke('<div class="sidebar-header"><div class="sidebar-title"><span></span> <h3> </h3></div> <div class="header-right"><!> <button class="act-icon" title="More actions"><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="5" r="2"></circle><circle cx="12" cy="12" r="2"></circle><circle cx="12" cy="19" r="2"></circle></svg></button> <span class="header-sep"></span> <button class="close-btn">×</button></div></div> <div class="sidebar-tabs"><button>Info</button> <button>Env</button> <button>Logs</button> <!></div> <!>',1),WK=ke('<button class="more-item">Kill</button>'),$K=ke('<div class="more-backdrop"></div> <div class="more-menu"><!> <button class="more-item danger">Remove</button> <button class="more-item danger">Remove + Volumes</button></div>',1),qK=ke('<div class="sidebar"><!></div> <!> <!>',1);function jK(i,e){Ii(e,!0);let t=ht(null),n=ht(null),r=ht(er([])),s=ht("info"),o=ht(!1),a=ht(!1),l=ht(null),c=ht(null);async function u(b){if(!(!e.node||G(o))){we(o,!0);try{const S=await fetch(`/api/containers/${e.node.containerId}/${b}`,{method:"POST"});if(S.ok)Br(`Container ${b}ed`,"success");else{const E=await S.json();Br(`Failed to ${b}: ${E.error}`,"error")}}catch{Br(`Failed to ${b}`,"error")}finally{we(o,!1)}}}async function h(b){if(!(!e.node||G(o))){we(o,!0);try{const S=await fetch(`/api/containers/${e.node.containerId}?volumes=${b}`,{method:"DELETE"});if(S.ok)Br(`Container removed${b?" with volumes":""}`,"success"),e.onClose();else{const E=await S.json();Br(`Failed to remove: ${E.error}`,"error")}}catch{Br("Failed to remove","error")}finally{we(o,!1)}}}function d(b){we(a,!1),we(c,b,!0)}fs(()=>{e.node&&(we(s,"info"),we(n,null),we(r,[],!0),we(a,!1),e.node.status==="running"?(fetch(`/api/containers/${e.node.containerId}/stats`).then(b=>b.json()).then(b=>we(t,b,!0)).catch(()=>we(t,null)),fetch(`/api/containers/${e.node.containerId}/history`).then(b=>b.json()).then(b=>we(r,b,!0)).catch(()=>we(r,[],!0))):we(t,null),fetch(`/api/containers/${e.node.containerId}/inspect`).then(b=>b.json()).then(b=>we(n,b,!0)).catch(()=>we(n,null)))}),fs(()=>{const b=G(s),S=e.node;_a(()=>{b==="logs"&&S?kP(S.containerId):Fv()})}),LP(()=>Fv());var f=qK(),p=wi(f),_=oe(p);{var g=b=>{var S=OK();Fe(b,S)},m=b=>{var S=HK(),E=wi(S),T=oe(E),M=oe(T),A=ue(M,2),R=oe(A),P=ue(T,2),L=oe(P);{var B=ve=>{var Ae=kK(),Je=wi(Ae),z=ue(Je,2);let Rt;var nt=ue(z,2);ot(()=>{Je.disabled=G(o),Rt=Un(z,1,"act-icon",null,Rt,{spinning:G(o)}),z.disabled=G(o),nt.disabled=G(o)}),Ze("click",Je,()=>u("pause")),Ze("click",z,()=>u("restart")),Ze("click",nt,()=>d({title:"Stop Container",message:`Stop ${e.node.name}? The container will be gracefully terminated.`,confirmLabel:"Stop",variant:"warning",action:()=>u("stop")})),Fe(ve,Ae)},V=ve=>{var Ae=zK(),Je=wi(Ae),z=ue(Je,2);let Rt;ot(()=>{Je.disabled=G(o),Rt=Un(z,1,"act-icon",null,Rt,{spinning:G(o)}),z.disabled=G(o)}),Ze("click",Je,()=>u("unpause")),Ze("click",z,()=>u("restart")),Fe(ve,Ae)},F=ve=>{var Ae=GK();ot(()=>Ae.disabled=G(o)),Ze("click",Ae,()=>u("start")),Fe(ve,Ae)};gt(L,ve=>{e.node.status==="running"?ve(B):e.node.status==="paused"?ve(V,1):ve(F,-1)})}var I=ue(L,2),q=ue(I,4),ie=ue(E,2),Y=oe(ie),se=ue(Y,2),ye=ue(se,2),Z=ue(ye,2);{var U=ve=>{var Ae=VK();ot(()=>Un(Ae,1,`tab ${G(s)==="top"?"active":""}`)),Ze("click",Ae,()=>we(s,"top")),Fe(ve,Ae)};gt(Z,ve=>{(e.node.status==="running"||e.node.status==="paused")&&ve(U)})}var H=ue(ie,2);{var J=ve=>{lK(ve,{get node(){return e.node},get stats(){return G(t)},get inspect(){return G(n)},get history(){return G(r)}})},xe=ve=>{SK(ve,{get inspect(){return G(n)}})},Pe=ve=>{RK(ve,{})},de=ve=>{BK(ve,{get containerId(){return e.node.containerId}})};gt(H,ve=>{G(s)==="info"?ve(J):G(s)==="env"?ve(xe,1):G(s)==="logs"?ve(Pe,2):G(s)==="top"&&ve(de,3)})}ot(()=>{Un(M,1,`status-dot ${e.node.status==="running"?e.node.health==="unhealthy"?"unhealthy":"running":e.node.status==="paused"?"paused":"exited"}`),Qe(R,e.node.name),I.disabled=G(o),Un(Y,1,`tab ${G(s)==="info"?"active":""}`),Un(se,1,`tab ${G(s)==="env"?"active":""}`),Un(ye,1,`tab ${G(s)==="logs"?"active":""}`)}),Ze("click",I,ve=>{we(l,ve.currentTarget,!0),we(a,!G(a))}),Ze("click",q,function(...ve){var Ae;(Ae=e.onClose)==null||Ae.apply(this,ve)}),Ze("click",Y,()=>we(s,"info")),Ze("click",se,()=>we(s,"env")),Ze("click",ye,()=>we(s,"logs")),Fe(b,S)};gt(_,b=>{e.node?b(m,-1):b(g)})}var v=ue(p,2);{var y=b=>{var S=$K(),E=wi(S),T=ue(E,2),M=oe(T);{var A=L=>{var B=WK();Ze("click",B,()=>{we(a,!1),d({title:"Kill Container",message:`Forcefully terminate ${e.node.name}? This sends SIGKILL — no graceful shutdown.`,confirmLabel:"Kill",variant:"warning",action:()=>u("kill")})}),Fe(L,B)};gt(M,L=>{(e.node.status==="running"||e.node.status==="paused")&&L(A)})}var R=ue(M,2),P=ue(R,2);ot((L,B)=>Lc(T,`top: ${L??""}px; right: ${B??""}px;`),[()=>G(l).getBoundingClientRect().bottom+4,()=>window.innerWidth-G(l).getBoundingClientRect().right]),Ze("click",E,()=>we(a,!1)),Ze("keydown",E,()=>{}),Ze("click",R,()=>{we(a,!1),d({title:"Remove Container",message:`Permanently remove ${e.node.name}? This deletes the container.`,confirmLabel:"Remove",variant:"danger",typeToConfirm:e.node.name,action:()=>h(!1)})}),Ze("click",P,()=>{we(a,!1),d({title:"Remove with Volumes",message:`Remove ${e.node.name} and ALL its volumes? This is irreversible.`,confirmLabel:"Remove + Volumes",variant:"danger",typeToConfirm:e.node.name,action:()=>h(!0)})}),Fe(b,S)};gt(v,b=>{G(a)&&e.node&&G(l)&&b(y)})}var x=ue(v,2);{var w=b=>{$Y(b,{get title(){return G(c).title},get message(){return G(c).message},get confirmLabel(){return G(c).confirmLabel},get variant(){return G(c).variant},get typeToConfirm(){return G(c).typeToConfirm},onConfirm:()=>{var S;(S=G(c))==null||S.action(),we(c,null)},onCancel:()=>{we(c,null)}})};gt(x,b=>{G(c)&&b(w)})}Fe(i,f),Fi()}Ts(["click","keydown"]);var XK=ke('<span class="status-chip svelte-1rygals"><span class="dot gray"></span> </span>'),YK=ke('<span class="status-chip svelte-1rygals"><span class="dot red"></span> </span>'),KK=ke('<span class="status-chip svelte-1rygals"><span class="dot green"></span> </span> <!> <!>',1),ZK=ke('<span class="sys-info-divider svelte-1rygals"></span> <span class="sys-info svelte-1rygals"> </span> <span class="sys-info svelte-1rygals"> </span> <span class="sys-info svelte-1rygals"> </span>',1),QK=ke('<div class="event-empty svelte-1rygals">Listening for Docker events...</div>'),JK=ke('<div class="event-row svelte-1rygals"><span class="event-time svelte-1rygals"> </span> <span> </span> <span class="event-actor svelte-1rygals"> </span> <span class="event-type svelte-1rygals"> </span></div>'),eZ=ke('<div class="status-bar svelte-1rygals"><div class="status-bar-header svelte-1rygals"><div class="status-summary svelte-1rygals"><!> <!></div> <div class="event-header-right svelte-1rygals"><button title="Toggle health check events">HC</button> <span class="event-label svelte-1rygals">Event Stream</span></div></div> <div class="event-list svelte-1rygals"><!> <!></div></div>');function tZ(i,e){Ii(e,!0);let t=ht(null),n=ht(!0),r=jn(()=>e.graph.nodes.filter(E=>E.status==="running").length),s=jn(()=>e.graph.nodes.filter(E=>E.status!=="running").length),o=jn(()=>e.graph.nodes.filter(E=>E.health==="unhealthy").length);const a=["exec_create","exec_start","exec_die","health_status"];function l(E){return a.some(T=>E.startsWith(T))}let c=jn(()=>G(n)?e.events.filter(E=>!l(E.action)):e.events);bu(()=>{fetch("/api/system").then(E=>E.json()).then(E=>we(t,E,!0)).catch(()=>{})});var u=eZ(),h=oe(u),d=oe(h),f=oe(d);{var p=E=>{var T=KK(),M=wi(T),A=ue(oe(M)),R=ue(M,2);{var P=V=>{var F=XK(),I=ue(oe(F));ot(()=>Qe(I,` ${G(s)??""} stopped`)),Fe(V,F)};gt(R,V=>{G(s)>0&&V(P)})}var L=ue(R,2);{var B=V=>{var F=YK(),I=ue(oe(F));ot(()=>Qe(I,` ${G(o)??""} unhealthy`)),Fe(V,F)};gt(L,V=>{G(o)>0&&V(B)})}ot(()=>Qe(A,` ${G(r)??""} running`)),Fe(E,T)};gt(f,E=>{e.graph.nodes.length>0&&E(p)})}var _=ue(f,2);{var g=E=>{var T=ZK(),M=ue(wi(T),2),A=oe(M),R=ue(M,2),P=oe(R),L=ue(R,2),B=oe(L);ot(V=>{Qe(A,`Docker ${G(t).dockerVersion??""}`),Qe(P,`${G(t).cpus??""} CPUs`),Qe(B,`${V??""} GB`)},[()=>XY(G(t).totalMemory)]),Fe(E,T)};gt(_,E=>{G(t)&&E(g)})}var m=ue(d,2),v=oe(m);let y;var x=ue(h,2),w=oe(x);{var b=E=>{var T=QK();Fe(E,T)};gt(w,E=>{G(c).length===0&&E(b)})}var S=ue(w,2);pr(S,19,()=>G(c).slice(0,50),(E,T)=>E.time+"-"+T,(E,T)=>{var M=JK(),A=oe(M),R=oe(A),P=ue(A,2),L=oe(P),B=ue(P,2),V=oe(B),F=ue(B,2),I=oe(F);ot(q=>{Qe(R,q),Un(P,1,`event-action ${G(T).action??""}`,"svelte-1rygals"),Qe(L,G(T).action),Qe(V,G(T).actor),Qe(I,G(T).type)},[()=>jY(G(T).time)]),Fe(E,M)}),ot(()=>y=Un(v,1,"healthcheck-toggle svelte-1rygals",null,y,{active:G(n)})),Ze("click",v,()=>we(n,!G(n))),Fe(i,u),Fi()}Ts(["click"]);var nZ=ke('<div class="kbd-row svelte-c0hob1"><kbd class="svelte-c0hob1"> </kbd> <span> </span></div>'),iZ=ke('<div class="kbd-overlay svelte-c0hob1"><div class="kbd-panel svelte-c0hob1"><div class="kbd-title svelte-c0hob1">Keyboard Shortcuts</div> <!></div></div>');function rZ(i,e){Ii(e,!0);const t=[{key:"/",desc:"Search containers"},{key:"Esc",desc:"Close panel / Clear search"},{key:"F",desc:"Zoom to fit"},{key:"R",desc:"Reset camera"},{key:"?",desc:"Toggle this help"}];var n=iZ(),r=oe(n),s=ue(oe(r),2);pr(s,17,()=>t,ps,(o,a)=>{var l=nZ(),c=oe(l),u=oe(c),h=ue(c,2),d=oe(h);ot(()=>{Qe(u,G(a).key),Qe(d,G(a).desc)}),Fe(o,l)}),Ze("click",n,function(...o){var a;(a=e.onClose)==null||a.apply(this,o)}),Ze("keydown",n,o=>o.key==="Escape"&&e.onClose()),Ze("click",r,o=>o.stopPropagation()),Ze("keydown",r,()=>{}),Fe(i,n),Fi()}Ts(["click","keydown"]);var sZ=ke('<div class="pm-loading svelte-ucg24v">Loading projects...</div>'),oZ=ke('<div class="pm-empty svelte-ucg24v">No compose projects found</div>'),aZ=ke('<span class="pm-count running svelte-ucg24v"> </span>'),lZ=ke('<span class="pm-count stopped svelte-ucg24v"> </span>'),cZ=ke('<button class="pm-btn up svelte-ucg24v" title="Up (start all)"> </button>'),uZ=ke('<button class="pm-btn restart svelte-ucg24v" title="Restart all"> </button> <button class="pm-btn stop svelte-ucg24v" title="Stop all"> </button> <button class="pm-btn down svelte-ucg24v" title="Down (remove)"> </button>',1),hZ=ke('<div class="pm-project svelte-ucg24v"><div class="pm-project-info svelte-ucg24v"><span class="pm-project-name svelte-ucg24v"> </span> <span class="pm-project-counts svelte-ucg24v"><!> <!></span></div> <div class="pm-actions svelte-ucg24v"><!> <!></div></div>'),dZ=ke('<div class="pm-list svelte-ucg24v"></div>'),fZ=ke('<div class="pm-overlay svelte-ucg24v"><div class="pm-panel svelte-ucg24v"><div class="pm-header svelte-ucg24v"><span class="pm-title svelte-ucg24v">Compose Projects</span> <button class="pm-close svelte-ucg24v">×</button></div> <!></div></div>');function pZ(i,e){Ii(e,!0);let t=ht(er([])),n=ht(!0),r=ht(null);bu(()=>{s()});async function s(){we(n,!0);try{const g=await fetch("/api/projects");we(t,await g.json(),!0)}catch{we(t,[],!0)}finally{we(n,!1)}}async function o(g,m){we(r,`${g}:${m}`);try{const v=await fetch(`/api/projects/${g}/${m}`,{method:"POST"});if(v.ok)Br(`${g}: ${m} done`,"success"),setTimeout(s,1500);else{const y=await v.json();Br(`${g}: ${y.error}`,"error")}}catch{Br(`${g}: ${m} failed`,"error")}finally{we(r,null)}}function a(g,m){return G(r)===`${g}:${m}`}var l=fZ(),c=oe(l),u=oe(c),h=ue(oe(u),2),d=ue(u,2);{var f=g=>{var m=sZ();Fe(g,m)},p=g=>{var m=oZ();Fe(g,m)},_=g=>{var m=dZ();pr(m,21,()=>G(t),ps,(v,y)=>{var x=hZ(),w=oe(x),b=oe(w),S=oe(b),E=ue(b,2),T=oe(E);{var M=I=>{var q=aZ(),ie=oe(q);ot(()=>Qe(ie,`${G(y).running??""} up`)),Fe(I,q)};gt(T,I=>{G(y).running>0&&I(M)})}var A=ue(T,2);{var R=I=>{var q=lZ(),ie=oe(q);ot(()=>Qe(ie,`${G(y).stopped??""} down`)),Fe(I,q)};gt(A,I=>{G(y).stopped>0&&I(R)})}var P=ue(w,2),L=oe(P);{var B=I=>{var q=cZ(),ie=oe(q);ot(Y=>{q.disabled=!!G(r),Qe(ie,Y)},[()=>a(G(y).name,"up")?"...":"Up"]),Ze("click",q,()=>o(G(y).name,"up")),Fe(I,q)};gt(L,I=>{G(y).running===0&&I(B)})}var V=ue(L,2);{var F=I=>{var q=uZ(),ie=wi(q),Y=oe(ie),se=ue(ie,2),ye=oe(se),Z=ue(se,2),U=oe(Z);ot((H,J,xe)=>{ie.disabled=!!G(r),Qe(Y,H),se.disabled=!!G(r),Qe(ye,J),Z.disabled=!!G(r),Qe(U,xe)},[()=>a(G(y).name,"restart")?"...":"Restart",()=>a(G(y).name,"stop")?"...":"Stop",()=>a(G(y).name,"down")?"...":"Down"]),Ze("click",ie,()=>o(G(y).name,"restart")),Ze("click",se,()=>o(G(y).name,"stop")),Ze("click",Z,()=>o(G(y).name,"down")),Fe(I,q)};gt(V,I=>{G(y).running>0&&I(F)})}ot(()=>Qe(S,G(y).name)),Fe(v,x)}),Fe(g,m)};gt(d,g=>{G(n)?g(f):G(t).length===0?g(p,1):g(_,-1)})}Ze("click",l,function(...g){var m;(m=e.onClose)==null||m.apply(this,g)}),Ze("keydown",l,g=>g.key==="Escape"&&e.onClose()),Ze("click",c,g=>g.stopPropagation()),Ze("keydown",c,()=>{}),Ze("click",h,function(...g){var m;(m=e.onClose)==null||m.apply(this,g)}),Fe(i,l),Fi()}Ts(["click","keydown"]);P2();var mZ=ke('<div><span class="toast-dot svelte-1eookdc"></span> <span class="toast-msg"> </span></div>'),gZ=ke('<div class="toast-container svelte-1eookdc"></div>');function _Z(i,e){Ii(e,!1);const t=BP();DP();var n=_P(),r=wi(n);{var s=o=>{var a=gZ();pr(a,5,()=>t.list,l=>l.id,(l,c)=>{var u=mZ(),h=ue(oe(u),2),d=oe(h);ot(()=>{Un(u,1,`toast toast-${G(c).type??""}`,"svelte-1eookdc"),Qe(d,G(c).message)}),Fe(l,u)}),Fe(o,a)};gt(r,o=>{t.list.length>0&&o(s)})}Fe(i,n),Fi()}var vZ=ke('<button class="search-clear">×</button>'),yZ=ke('<div class="hud-group filter-group"><button title="Filter running"><span class="dot green"></span></button> <button title="Filter stopped"><span class="dot gray"></span></button> <button title="Filter unhealthy"><span class="dot red"></span></button></div>'),xZ=ke('<div class="empty-state"><h2>No containers detected</h2> <p>Launch a Docker stack and watch it materialize.</p> <code>docker compose up -d</code></div>'),bZ=ke('<div><div class="graph-layer"><!> <div class="graph-vignette"></div> <div class="graph-scanlines"></div></div> <div class="hud-bar"><div class="hud-group brand-group"><span class="hud-logo">DockScope</span> <span class="hud-version"></span></div> <div class="hud-group"><span><span class="pulse-dot"></span> </span> <button class="hud-icon-btn" title="Compose projects"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7"></rect><rect x="14" y="3" width="7" height="7"></rect><rect x="3" y="14" width="7" height="7"></rect><rect x="14" y="14" width="7" height="7"></rect></svg></button></div> <div class="hud-group search-group"><div class="search-container"><svg class="search-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><circle cx="11" cy="11" r="7"></circle><path d="m20 20-3.5-3.5"></path></svg> <input type="text" class="search-input" placeholder="Search /"/> <!></div></div> <!></div> <!> <div class="sidebar-wrap"><div class="resize-handle-v"></div> <!></div> <div class="statusbar-wrap"><div class="resize-handle-h"></div> <!></div> <!> <!> <!></div>');function SZ(i,e){Ii(e,!0);const t=oE();let n=ht(null),r=ht(""),s=ht(er(new Set)),o=ht(!1),a=ht(!1),l=ht(null),c,u=ht(er(Ll.sidebar.default)),h=ht(er(Ll.statusbar.default)),d=ht(null);bu(()=>OP());function f(de){var Je,z,Rt;const ve=(Je=de.target)==null?void 0:Je.tagName,Ae=ve==="INPUT"||ve==="TEXTAREA";if(de.key==="Escape"){if(G(o)){we(o,!1);return}if(G(r)){we(r,""),(z=G(l))==null||z.blur();return}if(G(n)){we(n,null);return}}Ae||(de.key==="/"||de.key==="k"&&(de.metaKey||de.ctrlKey)?(de.preventDefault(),(Rt=G(l))==null||Rt.focus()):de.key==="f"||de.key==="F"?c==null||c.zoomToFit():de.key==="r"||de.key==="R"?c==null||c.resetCamera():de.key==="?"&&we(o,!G(o)))}function p(de){we(d,de,!0);const ve=Je=>{if(de==="sidebar"){const z=window.innerWidth-Je.clientX;we(u,Math.max(Ll.sidebar.min,Math.min(Ll.sidebar.max,z)),!0)}else{const z=window.innerHeight-Je.clientY;we(h,Math.max(Ll.statusbar.min,Math.min(Ll.statusbar.max,z)),!0)}},Ae=()=>{we(d,null),window.removeEventListener("mousemove",ve),window.removeEventListener("mouseup",Ae)};window.addEventListener("mousemove",ve),window.addEventListener("mouseup",Ae)}var _=bZ();tE("keydown",Rp,f);let g;var m=oe(_),v=oe(m);Np(VY(v,{get data(){return t.graph},onNodeClick:de=>we(n,de,!0),get selectedNode(){return G(n)},get searchQuery(){return G(r)},get statusFilter(){return G(s)},onHelpClick:()=>we(o,!G(o))}),de=>c=de,()=>c);var y=ue(m,2),x=oe(y),w=ue(oe(x),2);w.textContent="v0.2.6";var b=ue(x,2),S=oe(b),E=ue(oe(S)),T=ue(S,2),M=ue(b,2),A=oe(M),R=ue(oe(A),2);Np(R,de=>we(l,de),()=>G(l));var P=ue(R,2);{var L=de=>{var ve=vZ();Ze("click",ve,()=>{var Ae;we(r,""),(Ae=G(l))==null||Ae.blur()}),Fe(de,ve)};gt(P,de=>{G(r)&&de(L)})}var B=ue(M,2);{var V=de=>{var ve=yZ(),Ae=oe(ve);let Je;var z=ue(Ae,2);let Rt;var nt=ue(z,2);let it;ot((De,jt,Ye)=>{Je=Un(Ae,1,"filter-chip",null,Je,De),Rt=Un(z,1,"filter-chip",null,Rt,jt),it=Un(nt,1,"filter-chip",null,it,Ye)},[()=>({active:G(s).has("running")}),()=>({active:G(s).has("stopped")}),()=>({active:G(s).has("unhealthy")})]),Ze("click",Ae,()=>{const De=new Set(G(s));De.has("running")?De.delete("running"):De.add("running"),we(s,De,!0)}),Ze("click",z,()=>{const De=new Set(G(s));De.has("stopped")?De.delete("stopped"):De.add("stopped"),we(s,De,!0)}),Ze("click",nt,()=>{const De=new Set(G(s));De.has("unhealthy")?De.delete("unhealthy"):De.add("unhealthy"),we(s,De,!0)}),Fe(de,ve)};gt(B,de=>{t.graph.nodes.length>0&&de(V)})}var F=ue(y,2);{var I=de=>{var ve=xZ();Fe(de,ve)};gt(F,de=>{t.connected&&t.graph.nodes.length===0&&de(I)})}var q=ue(F,2),ie=oe(q),Y=ue(ie,2);jK(Y,{get node(){return G(n)},onClose:()=>we(n,null)});var se=ue(q,2),ye=oe(se),Z=ue(ye,2);tZ(Z,{get events(){return t.events},get graph(){return t.graph}});var U=ue(se,2);_Z(U,{});var H=ue(U,2);{var J=de=>{rZ(de,{onClose:()=>we(o,!1)})};gt(H,de=>{G(o)&&de(J)})}var xe=ue(H,2);{var Pe=de=>{pZ(de,{onClose:()=>we(a,!1)})};gt(xe,de=>{G(a)&&de(Pe)})}ot(()=>{g=Un(_,1,"app",null,g,{"is-dragging":G(d)!==null}),Lc(_,`--sidebar-w: ${G(u)??""}px; --statusbar-h: ${G(h)??""}px;`),Un(S,1,`hud-connection ${t.connected?"active":"disconnected"}`),Qe(E,` ${t.connected?"Live":"Offline"}`),Lc(q,`width: ${G(u)??""}px;`),Lc(se,`height: ${G(h)??""}px; right: ${G(u)??""}px;`)}),Ze("click",T,()=>we(a,!0)),X0(R,()=>G(r),de=>we(r,de)),Ze("mousedown",ie,()=>p("sidebar")),Ze("mousedown",ye,()=>p("statusbar")),Fe(i,_),Fi()}Ts(["click","mousedown"]);vP(SZ,{target:document.getElementById("root")});
|
|
4834
|
+
`)}function EK(i,e){if(!e||!i)return{html:i,count:0};let t=0;const n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return{html:i.replace(new RegExp("(>|^)([^<]*?)(<|$)","g"),(s,o,a,l)=>{const c=a.replace(new RegExp(n,"gi"),u=>(t++,`<mark class="log-highlight">${u}</mark>`));return`${o}${c}${l}`}),count:t}}var AK=ke('<span class="log-match-count"> </span>'),CK=ke('<div class="log-search-bar"><input type="text" class="log-search-input" placeholder="Search logs..."/> <!> <button class="log-export-btn" title="Export logs"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg></button></div> <div class="sidebar-logs"><pre><!><div></div></pre></div>',1);function RK(i,e){Ii(e,!0);const t=oE();let n=ht(null),r=ht(""),s=jn(()=>TK(t.streamingLogs)),o=jn(()=>G(r)?EK(G(s),G(r)):{html:G(s),count:0});fs(()=>{t.streamingLogs&&G(n)&&G(n).scrollIntoView({behavior:"smooth"})});function a(){const v=t.streamingLogs;if(!v)return;const y=new Blob([v],{type:"text/plain"}),x=URL.createObjectURL(y),w=document.createElement("a");w.href=x,w.download=`logs-${new Date().toISOString().slice(0,19).replace(/:/g,"-")}.txt`,w.click(),URL.revokeObjectURL(x)}var l=CK(),c=wi(l),u=oe(c),h=ue(u,2);{var d=v=>{var y=AK(),x=oe(y);ot(()=>Qe(x,`${G(o).count??""} match${G(o).count!==1?"es":""}`)),Fe(v,y)};gt(h,v=>{G(r)&&v(d)})}var f=ue(h,2),p=ue(c,2),_=oe(p),g=oe(_);wP(g,()=>G(o).html||'<span style="color:var(--text-dim);font-style:italic">Connecting to log stream...</span>');var m=ue(g);Np(m,v=>we(n,v),()=>G(n)),ot(()=>f.disabled=!t.streamingLogs),X0(u,()=>G(r),v=>we(r,v)),Ze("click",f,a),Fe(i,l),Fi()}Ts(["click"]);var NK=ke('<div class="top-empty svelte-9pnfc5"> </div>'),PK=ke('<div class="top-empty svelte-9pnfc5">Loading...</div>'),DK=ke('<th class="svelte-9pnfc5"> </th>'),LK=ke('<td class="svelte-9pnfc5"> </td>'),IK=ke('<tr class="svelte-9pnfc5"></tr>'),FK=ke('<div class="top-table-wrap svelte-9pnfc5"><table class="top-table svelte-9pnfc5"><thead><tr></tr></thead><tbody></tbody></table></div>'),UK=ke('<div class="sidebar-content"><!></div>');function BK(i,e){Ii(e,!0);let t=ht(null),n=ht("");async function r(){try{const u=await fetch(`/api/containers/${e.containerId}/top`);if(!u.ok)throw new Error("Not running");we(t,await u.json(),!0),we(n,"")}catch{we(t,null),we(n,"Container must be running to view processes")}}bu(()=>{r();const u=setInterval(r,5e3);return()=>clearInterval(u)}),fs(()=>{e.containerId,r()});var s=UK(),o=oe(s);{var a=u=>{var h=NK(),d=oe(h);ot(()=>Qe(d,G(n))),Fe(u,h)},l=u=>{var h=PK();Fe(u,h)},c=u=>{var h=FK(),d=oe(h),f=oe(d),p=oe(f);pr(p,21,()=>G(t).titles,ps,(g,m)=>{var v=DK(),y=oe(v);ot(()=>Qe(y,G(m))),Fe(g,v)});var _=ue(f);pr(_,21,()=>G(t).processes,ps,(g,m)=>{var v=IK();pr(v,21,()=>G(m),ps,(y,x)=>{var w=LK(),b=oe(w);ot(()=>Qe(b,G(x))),Fe(y,w)}),Fe(g,v)}),Fe(u,h)};gt(o,u=>{G(n)?u(a):G(t)?u(c,-1):u(l,1)})}Fe(i,s),Fi()}var OK=ke('<div class="sidebar-empty"><div class="brand">DockScope</div> <div class="brand-sub">Infrastructure Debugger</div> <div class="instruction">Select a container node in the graph to inspect its configuration, metrics, and live logs.</div> <div class="legend"><div class="legend-title">Legend</div> <div class="legend-item"><span class="status-dot running"></span> Running (healthy)</div> <div class="legend-item"><span class="status-dot cyan"></span> Running (no healthcheck)</div> <div class="legend-item"><span class="status-dot other"></span> Other</div> <div class="legend-item"><span class="status-dot unhealthy"></span> Unhealthy</div> <div class="legend-item"><span class="status-dot exited"></span> Stopped</div> <div class="legend-line"><span class="line depends"></span> depends_on</div> <div class="legend-line"><span class="line network"></span> shared network</div></div></div>'),kK=ke('<button class="act-icon warning" title="Pause"><svg width="11" height="11" viewBox="0 0 24 24" fill="currentColor"><rect x="5" y="4" width="4" height="16" rx="1"></rect><rect x="15" y="4" width="4" height="16" rx="1"></rect></svg></button> <button title="Restart"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path><path d="M3 3v5h5"></path></svg></button> <button class="act-icon danger" title="Stop"><svg width="11" height="11" viewBox="0 0 24 24" fill="currentColor"><rect x="4" y="4" width="16" height="16" rx="2"></rect></svg></button>',1),zK=ke('<button class="act-icon success" title="Unpause"><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><polygon points="6,3 20,12 6,21"></polygon></svg></button> <button title="Restart"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path><path d="M3 3v5h5"></path></svg></button>',1),GK=ke('<button class="act-icon success" title="Start"><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><polygon points="6,3 20,12 6,21"></polygon></svg></button>'),VK=ke("<button>Top</button>"),HK=ke('<div class="sidebar-header"><div class="sidebar-title"><span></span> <h3> </h3></div> <div class="header-right"><!> <button class="act-icon" title="More actions"><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="5" r="2"></circle><circle cx="12" cy="12" r="2"></circle><circle cx="12" cy="19" r="2"></circle></svg></button> <span class="header-sep"></span> <button class="close-btn">×</button></div></div> <div class="sidebar-tabs"><button>Info</button> <button>Env</button> <button>Logs</button> <!></div> <!>',1),WK=ke('<button class="more-item">Kill</button>'),$K=ke('<div class="more-backdrop"></div> <div class="more-menu"><!> <button class="more-item danger">Remove</button> <button class="more-item danger">Remove + Volumes</button></div>',1),qK=ke('<div class="sidebar"><!></div> <!> <!>',1);function jK(i,e){Ii(e,!0);let t=ht(null),n=ht(null),r=ht(er([])),s=ht("info"),o=ht(!1),a=ht(!1),l=ht(null),c=ht(null);async function u(b){if(!(!e.node||G(o))){we(o,!0);try{const S=await fetch(`/api/containers/${e.node.containerId}/${b}`,{method:"POST"});if(S.ok)Br(`Container ${b}ed`,"success");else{const E=await S.json();Br(`Failed to ${b}: ${E.error}`,"error")}}catch{Br(`Failed to ${b}`,"error")}finally{we(o,!1)}}}async function h(b){if(!(!e.node||G(o))){we(o,!0);try{const S=await fetch(`/api/containers/${e.node.containerId}?volumes=${b}`,{method:"DELETE"});if(S.ok)Br(`Container removed${b?" with volumes":""}`,"success"),e.onClose();else{const E=await S.json();Br(`Failed to remove: ${E.error}`,"error")}}catch{Br("Failed to remove","error")}finally{we(o,!1)}}}function d(b){we(a,!1),we(c,b,!0)}fs(()=>{e.node&&(we(s,"info"),we(n,null),we(r,[],!0),we(a,!1),e.node.status==="running"?(fetch(`/api/containers/${e.node.containerId}/stats`).then(b=>b.json()).then(b=>we(t,b,!0)).catch(()=>we(t,null)),fetch(`/api/containers/${e.node.containerId}/history`).then(b=>b.json()).then(b=>we(r,b,!0)).catch(()=>we(r,[],!0))):we(t,null),fetch(`/api/containers/${e.node.containerId}/inspect`).then(b=>b.json()).then(b=>we(n,b,!0)).catch(()=>we(n,null)))}),fs(()=>{const b=G(s),S=e.node;_a(()=>{b==="logs"&&S?kP(S.containerId):Fv()})}),LP(()=>Fv());var f=qK(),p=wi(f),_=oe(p);{var g=b=>{var S=OK();Fe(b,S)},m=b=>{var S=HK(),E=wi(S),T=oe(E),M=oe(T),A=ue(M,2),R=oe(A),P=ue(T,2),L=oe(P);{var B=ve=>{var Ae=kK(),Je=wi(Ae),z=ue(Je,2);let Rt;var nt=ue(z,2);ot(()=>{Je.disabled=G(o),Rt=Un(z,1,"act-icon",null,Rt,{spinning:G(o)}),z.disabled=G(o),nt.disabled=G(o)}),Ze("click",Je,()=>u("pause")),Ze("click",z,()=>u("restart")),Ze("click",nt,()=>d({title:"Stop Container",message:`Stop ${e.node.name}? The container will be gracefully terminated.`,confirmLabel:"Stop",variant:"warning",action:()=>u("stop")})),Fe(ve,Ae)},V=ve=>{var Ae=zK(),Je=wi(Ae),z=ue(Je,2);let Rt;ot(()=>{Je.disabled=G(o),Rt=Un(z,1,"act-icon",null,Rt,{spinning:G(o)}),z.disabled=G(o)}),Ze("click",Je,()=>u("unpause")),Ze("click",z,()=>u("restart")),Fe(ve,Ae)},F=ve=>{var Ae=GK();ot(()=>Ae.disabled=G(o)),Ze("click",Ae,()=>u("start")),Fe(ve,Ae)};gt(L,ve=>{e.node.status==="running"?ve(B):e.node.status==="paused"?ve(V,1):ve(F,-1)})}var I=ue(L,2),q=ue(I,4),ie=ue(E,2),Y=oe(ie),se=ue(Y,2),ye=ue(se,2),Z=ue(ye,2);{var U=ve=>{var Ae=VK();ot(()=>Un(Ae,1,`tab ${G(s)==="top"?"active":""}`)),Ze("click",Ae,()=>we(s,"top")),Fe(ve,Ae)};gt(Z,ve=>{(e.node.status==="running"||e.node.status==="paused")&&ve(U)})}var H=ue(ie,2);{var J=ve=>{lK(ve,{get node(){return e.node},get stats(){return G(t)},get inspect(){return G(n)},get history(){return G(r)}})},xe=ve=>{SK(ve,{get inspect(){return G(n)}})},Pe=ve=>{RK(ve,{})},de=ve=>{BK(ve,{get containerId(){return e.node.containerId}})};gt(H,ve=>{G(s)==="info"?ve(J):G(s)==="env"?ve(xe,1):G(s)==="logs"?ve(Pe,2):G(s)==="top"&&ve(de,3)})}ot(()=>{Un(M,1,`status-dot ${e.node.status==="running"?e.node.health==="unhealthy"?"unhealthy":"running":e.node.status==="paused"?"paused":"exited"}`),Qe(R,e.node.name),I.disabled=G(o),Un(Y,1,`tab ${G(s)==="info"?"active":""}`),Un(se,1,`tab ${G(s)==="env"?"active":""}`),Un(ye,1,`tab ${G(s)==="logs"?"active":""}`)}),Ze("click",I,ve=>{we(l,ve.currentTarget,!0),we(a,!G(a))}),Ze("click",q,function(...ve){var Ae;(Ae=e.onClose)==null||Ae.apply(this,ve)}),Ze("click",Y,()=>we(s,"info")),Ze("click",se,()=>we(s,"env")),Ze("click",ye,()=>we(s,"logs")),Fe(b,S)};gt(_,b=>{e.node?b(m,-1):b(g)})}var v=ue(p,2);{var y=b=>{var S=$K(),E=wi(S),T=ue(E,2),M=oe(T);{var A=L=>{var B=WK();Ze("click",B,()=>{we(a,!1),d({title:"Kill Container",message:`Forcefully terminate ${e.node.name}? This sends SIGKILL — no graceful shutdown.`,confirmLabel:"Kill",variant:"warning",action:()=>u("kill")})}),Fe(L,B)};gt(M,L=>{(e.node.status==="running"||e.node.status==="paused")&&L(A)})}var R=ue(M,2),P=ue(R,2);ot((L,B)=>Lc(T,`top: ${L??""}px; right: ${B??""}px;`),[()=>G(l).getBoundingClientRect().bottom+4,()=>window.innerWidth-G(l).getBoundingClientRect().right]),Ze("click",E,()=>we(a,!1)),Ze("keydown",E,()=>{}),Ze("click",R,()=>{we(a,!1),d({title:"Remove Container",message:`Permanently remove ${e.node.name}? This deletes the container.`,confirmLabel:"Remove",variant:"danger",typeToConfirm:e.node.name,action:()=>h(!1)})}),Ze("click",P,()=>{we(a,!1),d({title:"Remove with Volumes",message:`Remove ${e.node.name} and ALL its volumes? This is irreversible.`,confirmLabel:"Remove + Volumes",variant:"danger",typeToConfirm:e.node.name,action:()=>h(!0)})}),Fe(b,S)};gt(v,b=>{G(a)&&e.node&&G(l)&&b(y)})}var x=ue(v,2);{var w=b=>{$Y(b,{get title(){return G(c).title},get message(){return G(c).message},get confirmLabel(){return G(c).confirmLabel},get variant(){return G(c).variant},get typeToConfirm(){return G(c).typeToConfirm},onConfirm:()=>{var S;(S=G(c))==null||S.action(),we(c,null)},onCancel:()=>{we(c,null)}})};gt(x,b=>{G(c)&&b(w)})}Fe(i,f),Fi()}Ts(["click","keydown"]);var XK=ke('<span class="status-chip svelte-1rygals"><span class="dot gray"></span> </span>'),YK=ke('<span class="status-chip svelte-1rygals"><span class="dot red"></span> </span>'),KK=ke('<span class="status-chip svelte-1rygals"><span class="dot green"></span> </span> <!> <!>',1),ZK=ke('<span class="sys-info-divider svelte-1rygals"></span> <span class="sys-info svelte-1rygals"> </span> <span class="sys-info svelte-1rygals"> </span> <span class="sys-info svelte-1rygals"> </span>',1),QK=ke('<div class="event-empty svelte-1rygals">Listening for Docker events...</div>'),JK=ke('<div class="event-row svelte-1rygals"><span class="event-time svelte-1rygals"> </span> <span> </span> <span class="event-actor svelte-1rygals"> </span> <span class="event-type svelte-1rygals"> </span></div>'),eZ=ke('<div class="status-bar svelte-1rygals"><div class="status-bar-header svelte-1rygals"><div class="status-summary svelte-1rygals"><!> <!></div> <div class="event-header-right svelte-1rygals"><button title="Toggle health check events">HC</button> <span class="event-label svelte-1rygals">Event Stream</span></div></div> <div class="event-list svelte-1rygals"><!> <!></div></div>');function tZ(i,e){Ii(e,!0);let t=ht(null),n=ht(!0),r=jn(()=>e.graph.nodes.filter(E=>E.status==="running").length),s=jn(()=>e.graph.nodes.filter(E=>E.status!=="running").length),o=jn(()=>e.graph.nodes.filter(E=>E.health==="unhealthy").length);const a=["exec_create","exec_start","exec_die","health_status"];function l(E){return a.some(T=>E.startsWith(T))}let c=jn(()=>G(n)?e.events.filter(E=>!l(E.action)):e.events);bu(()=>{fetch("/api/system").then(E=>E.json()).then(E=>we(t,E,!0)).catch(()=>{})});var u=eZ(),h=oe(u),d=oe(h),f=oe(d);{var p=E=>{var T=KK(),M=wi(T),A=ue(oe(M)),R=ue(M,2);{var P=V=>{var F=XK(),I=ue(oe(F));ot(()=>Qe(I,` ${G(s)??""} stopped`)),Fe(V,F)};gt(R,V=>{G(s)>0&&V(P)})}var L=ue(R,2);{var B=V=>{var F=YK(),I=ue(oe(F));ot(()=>Qe(I,` ${G(o)??""} unhealthy`)),Fe(V,F)};gt(L,V=>{G(o)>0&&V(B)})}ot(()=>Qe(A,` ${G(r)??""} running`)),Fe(E,T)};gt(f,E=>{e.graph.nodes.length>0&&E(p)})}var _=ue(f,2);{var g=E=>{var T=ZK(),M=ue(wi(T),2),A=oe(M),R=ue(M,2),P=oe(R),L=ue(R,2),B=oe(L);ot(V=>{Qe(A,`Docker ${G(t).dockerVersion??""}`),Qe(P,`${G(t).cpus??""} CPUs`),Qe(B,`${V??""} GB`)},[()=>XY(G(t).totalMemory)]),Fe(E,T)};gt(_,E=>{G(t)&&E(g)})}var m=ue(d,2),v=oe(m);let y;var x=ue(h,2),w=oe(x);{var b=E=>{var T=QK();Fe(E,T)};gt(w,E=>{G(c).length===0&&E(b)})}var S=ue(w,2);pr(S,19,()=>G(c).slice(0,50),(E,T)=>E.time+"-"+T,(E,T)=>{var M=JK(),A=oe(M),R=oe(A),P=ue(A,2),L=oe(P),B=ue(P,2),V=oe(B),F=ue(B,2),I=oe(F);ot(q=>{Qe(R,q),Un(P,1,`event-action ${G(T).action??""}`,"svelte-1rygals"),Qe(L,G(T).action),Qe(V,G(T).actor),Qe(I,G(T).type)},[()=>jY(G(T).time)]),Fe(E,M)}),ot(()=>y=Un(v,1,"healthcheck-toggle svelte-1rygals",null,y,{active:G(n)})),Ze("click",v,()=>we(n,!G(n))),Fe(i,u),Fi()}Ts(["click"]);var nZ=ke('<div class="kbd-row svelte-c0hob1"><kbd class="svelte-c0hob1"> </kbd> <span> </span></div>'),iZ=ke('<div class="kbd-overlay svelte-c0hob1"><div class="kbd-panel svelte-c0hob1"><div class="kbd-title svelte-c0hob1">Keyboard Shortcuts</div> <!></div></div>');function rZ(i,e){Ii(e,!0);const t=[{key:"/",desc:"Search containers"},{key:"Esc",desc:"Close panel / Clear search"},{key:"F",desc:"Zoom to fit"},{key:"R",desc:"Reset camera"},{key:"?",desc:"Toggle this help"}];var n=iZ(),r=oe(n),s=ue(oe(r),2);pr(s,17,()=>t,ps,(o,a)=>{var l=nZ(),c=oe(l),u=oe(c),h=ue(c,2),d=oe(h);ot(()=>{Qe(u,G(a).key),Qe(d,G(a).desc)}),Fe(o,l)}),Ze("click",n,function(...o){var a;(a=e.onClose)==null||a.apply(this,o)}),Ze("keydown",n,o=>o.key==="Escape"&&e.onClose()),Ze("click",r,o=>o.stopPropagation()),Ze("keydown",r,()=>{}),Fe(i,n),Fi()}Ts(["click","keydown"]);var sZ=ke('<div class="pm-loading svelte-ucg24v">Loading projects...</div>'),oZ=ke('<div class="pm-empty svelte-ucg24v">No compose projects found</div>'),aZ=ke('<span class="pm-count running svelte-ucg24v"> </span>'),lZ=ke('<span class="pm-count stopped svelte-ucg24v"> </span>'),cZ=ke('<button class="pm-btn up svelte-ucg24v" title="Up (start all)"> </button>'),uZ=ke('<button class="pm-btn restart svelte-ucg24v" title="Restart all"> </button> <button class="pm-btn stop svelte-ucg24v" title="Stop all"> </button> <button class="pm-btn down svelte-ucg24v" title="Down (remove)"> </button>',1),hZ=ke('<div class="pm-project svelte-ucg24v"><div class="pm-project-info svelte-ucg24v"><span class="pm-project-name svelte-ucg24v"> </span> <span class="pm-project-counts svelte-ucg24v"><!> <!></span></div> <div class="pm-actions svelte-ucg24v"><!> <!></div></div>'),dZ=ke('<div class="pm-list svelte-ucg24v"></div>'),fZ=ke('<div class="pm-overlay svelte-ucg24v"><div class="pm-panel svelte-ucg24v"><div class="pm-header svelte-ucg24v"><span class="pm-title svelte-ucg24v">Compose Projects</span> <button class="pm-close svelte-ucg24v">×</button></div> <!></div></div>');function pZ(i,e){Ii(e,!0);let t=ht(er([])),n=ht(!0),r=ht(null);bu(()=>{s()});async function s(){we(n,!0);try{const g=await fetch("/api/projects");we(t,await g.json(),!0)}catch{we(t,[],!0)}finally{we(n,!1)}}async function o(g,m){we(r,`${g}:${m}`);try{const v=await fetch(`/api/projects/${g}/${m}`,{method:"POST"});if(v.ok)Br(`${g}: ${m} done`,"success"),setTimeout(s,1500);else{const y=await v.json();Br(`${g}: ${y.error}`,"error")}}catch{Br(`${g}: ${m} failed`,"error")}finally{we(r,null)}}function a(g,m){return G(r)===`${g}:${m}`}var l=fZ(),c=oe(l),u=oe(c),h=ue(oe(u),2),d=ue(u,2);{var f=g=>{var m=sZ();Fe(g,m)},p=g=>{var m=oZ();Fe(g,m)},_=g=>{var m=dZ();pr(m,21,()=>G(t),ps,(v,y)=>{var x=hZ(),w=oe(x),b=oe(w),S=oe(b),E=ue(b,2),T=oe(E);{var M=I=>{var q=aZ(),ie=oe(q);ot(()=>Qe(ie,`${G(y).running??""} up`)),Fe(I,q)};gt(T,I=>{G(y).running>0&&I(M)})}var A=ue(T,2);{var R=I=>{var q=lZ(),ie=oe(q);ot(()=>Qe(ie,`${G(y).stopped??""} down`)),Fe(I,q)};gt(A,I=>{G(y).stopped>0&&I(R)})}var P=ue(w,2),L=oe(P);{var B=I=>{var q=cZ(),ie=oe(q);ot(Y=>{q.disabled=!!G(r),Qe(ie,Y)},[()=>a(G(y).name,"up")?"...":"Up"]),Ze("click",q,()=>o(G(y).name,"up")),Fe(I,q)};gt(L,I=>{G(y).running===0&&I(B)})}var V=ue(L,2);{var F=I=>{var q=uZ(),ie=wi(q),Y=oe(ie),se=ue(ie,2),ye=oe(se),Z=ue(se,2),U=oe(Z);ot((H,J,xe)=>{ie.disabled=!!G(r),Qe(Y,H),se.disabled=!!G(r),Qe(ye,J),Z.disabled=!!G(r),Qe(U,xe)},[()=>a(G(y).name,"restart")?"...":"Restart",()=>a(G(y).name,"stop")?"...":"Stop",()=>a(G(y).name,"down")?"...":"Down"]),Ze("click",ie,()=>o(G(y).name,"restart")),Ze("click",se,()=>o(G(y).name,"stop")),Ze("click",Z,()=>o(G(y).name,"down")),Fe(I,q)};gt(V,I=>{G(y).running>0&&I(F)})}ot(()=>Qe(S,G(y).name)),Fe(v,x)}),Fe(g,m)};gt(d,g=>{G(n)?g(f):G(t).length===0?g(p,1):g(_,-1)})}Ze("click",l,function(...g){var m;(m=e.onClose)==null||m.apply(this,g)}),Ze("keydown",l,g=>g.key==="Escape"&&e.onClose()),Ze("click",c,g=>g.stopPropagation()),Ze("keydown",c,()=>{}),Ze("click",h,function(...g){var m;(m=e.onClose)==null||m.apply(this,g)}),Fe(i,l),Fi()}Ts(["click","keydown"]);P2();var mZ=ke('<div><span class="toast-dot svelte-1eookdc"></span> <span class="toast-msg"> </span></div>'),gZ=ke('<div class="toast-container svelte-1eookdc"></div>');function _Z(i,e){Ii(e,!1);const t=BP();DP();var n=_P(),r=wi(n);{var s=o=>{var a=gZ();pr(a,5,()=>t.list,l=>l.id,(l,c)=>{var u=mZ(),h=ue(oe(u),2),d=oe(h);ot(()=>{Un(u,1,`toast toast-${G(c).type??""}`,"svelte-1eookdc"),Qe(d,G(c).message)}),Fe(l,u)}),Fe(o,a)};gt(r,o=>{t.list.length>0&&o(s)})}Fe(i,n),Fi()}var vZ=ke('<button class="search-clear">×</button>'),yZ=ke('<div class="hud-group filter-group"><button title="Filter running"><span class="dot green"></span></button> <button title="Filter stopped"><span class="dot gray"></span></button> <button title="Filter unhealthy"><span class="dot red"></span></button></div>'),xZ=ke('<div class="empty-state"><h2>No containers detected</h2> <p>Launch a Docker stack and watch it materialize.</p> <code>docker compose up -d</code></div>'),bZ=ke('<div><div class="graph-layer"><!> <div class="graph-vignette"></div> <div class="graph-scanlines"></div></div> <div class="hud-bar"><div class="hud-group brand-group"><span class="hud-logo">DockScope</span> <span class="hud-version"></span></div> <div class="hud-group"><span><span class="pulse-dot"></span> </span> <button class="hud-icon-btn" title="Compose projects"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7"></rect><rect x="14" y="3" width="7" height="7"></rect><rect x="3" y="14" width="7" height="7"></rect><rect x="14" y="14" width="7" height="7"></rect></svg></button></div> <div class="hud-group search-group"><div class="search-container"><svg class="search-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><circle cx="11" cy="11" r="7"></circle><path d="m20 20-3.5-3.5"></path></svg> <input type="text" class="search-input" placeholder="Search /"/> <!></div></div> <!></div> <!> <div class="sidebar-wrap"><div class="resize-handle-v"></div> <!></div> <div class="statusbar-wrap"><div class="resize-handle-h"></div> <!></div> <!> <!> <!></div>');function SZ(i,e){Ii(e,!0);const t=oE();let n=ht(null),r=ht(""),s=ht(er(new Set)),o=ht(!1),a=ht(!1),l=ht(null),c,u=ht(er(Ll.sidebar.default)),h=ht(er(Ll.statusbar.default)),d=ht(null);bu(()=>OP());function f(de){var Je,z,Rt;const ve=(Je=de.target)==null?void 0:Je.tagName,Ae=ve==="INPUT"||ve==="TEXTAREA";if(de.key==="Escape"){if(G(o)){we(o,!1);return}if(G(r)){we(r,""),(z=G(l))==null||z.blur();return}if(G(n)){we(n,null);return}}Ae||(de.key==="/"||de.key==="k"&&(de.metaKey||de.ctrlKey)?(de.preventDefault(),(Rt=G(l))==null||Rt.focus()):de.key==="f"||de.key==="F"?c==null||c.zoomToFit():de.key==="r"||de.key==="R"?c==null||c.resetCamera():de.key==="?"&&we(o,!G(o)))}function p(de){we(d,de,!0);const ve=Je=>{if(de==="sidebar"){const z=window.innerWidth-Je.clientX;we(u,Math.max(Ll.sidebar.min,Math.min(Ll.sidebar.max,z)),!0)}else{const z=window.innerHeight-Je.clientY;we(h,Math.max(Ll.statusbar.min,Math.min(Ll.statusbar.max,z)),!0)}},Ae=()=>{we(d,null),window.removeEventListener("mousemove",ve),window.removeEventListener("mouseup",Ae)};window.addEventListener("mousemove",ve),window.addEventListener("mouseup",Ae)}var _=bZ();tE("keydown",Rp,f);let g;var m=oe(_),v=oe(m);Np(VY(v,{get data(){return t.graph},onNodeClick:de=>we(n,de,!0),get selectedNode(){return G(n)},get searchQuery(){return G(r)},get statusFilter(){return G(s)},onHelpClick:()=>we(o,!G(o))}),de=>c=de,()=>c);var y=ue(m,2),x=oe(y),w=ue(oe(x),2);w.textContent="v0.2.7";var b=ue(x,2),S=oe(b),E=ue(oe(S)),T=ue(S,2),M=ue(b,2),A=oe(M),R=ue(oe(A),2);Np(R,de=>we(l,de),()=>G(l));var P=ue(R,2);{var L=de=>{var ve=vZ();Ze("click",ve,()=>{var Ae;we(r,""),(Ae=G(l))==null||Ae.blur()}),Fe(de,ve)};gt(P,de=>{G(r)&&de(L)})}var B=ue(M,2);{var V=de=>{var ve=yZ(),Ae=oe(ve);let Je;var z=ue(Ae,2);let Rt;var nt=ue(z,2);let it;ot((De,jt,Ye)=>{Je=Un(Ae,1,"filter-chip",null,Je,De),Rt=Un(z,1,"filter-chip",null,Rt,jt),it=Un(nt,1,"filter-chip",null,it,Ye)},[()=>({active:G(s).has("running")}),()=>({active:G(s).has("stopped")}),()=>({active:G(s).has("unhealthy")})]),Ze("click",Ae,()=>{const De=new Set(G(s));De.has("running")?De.delete("running"):De.add("running"),we(s,De,!0)}),Ze("click",z,()=>{const De=new Set(G(s));De.has("stopped")?De.delete("stopped"):De.add("stopped"),we(s,De,!0)}),Ze("click",nt,()=>{const De=new Set(G(s));De.has("unhealthy")?De.delete("unhealthy"):De.add("unhealthy"),we(s,De,!0)}),Fe(de,ve)};gt(B,de=>{t.graph.nodes.length>0&&de(V)})}var F=ue(y,2);{var I=de=>{var ve=xZ();Fe(de,ve)};gt(F,de=>{t.connected&&t.graph.nodes.length===0&&de(I)})}var q=ue(F,2),ie=oe(q),Y=ue(ie,2);jK(Y,{get node(){return G(n)},onClose:()=>we(n,null)});var se=ue(q,2),ye=oe(se),Z=ue(ye,2);tZ(Z,{get events(){return t.events},get graph(){return t.graph}});var U=ue(se,2);_Z(U,{});var H=ue(U,2);{var J=de=>{rZ(de,{onClose:()=>we(o,!1)})};gt(H,de=>{G(o)&&de(J)})}var xe=ue(H,2);{var Pe=de=>{pZ(de,{onClose:()=>we(a,!1)})};gt(xe,de=>{G(a)&&de(Pe)})}ot(()=>{g=Un(_,1,"app",null,g,{"is-dragging":G(d)!==null}),Lc(_,`--sidebar-w: ${G(u)??""}px; --statusbar-h: ${G(h)??""}px;`),Un(S,1,`hud-connection ${t.connected?"active":"disconnected"}`),Qe(E,` ${t.connected?"Live":"Offline"}`),Lc(q,`width: ${G(u)??""}px;`),Lc(se,`height: ${G(h)??""}px; right: ${G(u)??""}px;`)}),Ze("click",T,()=>we(a,!0)),X0(R,()=>G(r),de=>we(r,de)),Ze("mousedown",ie,()=>p("sidebar")),Ze("mousedown",ye,()=>p("statusbar")),Fe(i,_),Fi()}Ts(["click","mousedown"]);vP(SZ,{target:document.getElementById("root")});
|
package/dist/web/index.html
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<style>
|
|
11
11
|
body { margin: 0; background: #04040e; }
|
|
12
12
|
</style>
|
|
13
|
-
<script type="module" crossorigin src="/assets/index-
|
|
13
|
+
<script type="module" crossorigin src="/assets/index-BkwzBX9M.js"></script>
|
|
14
14
|
<link rel="stylesheet" crossorigin href="/assets/index-ChByk1Ol.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|