dockscope 0.2.3 → 0.2.4

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.
package/README.md CHANGED
@@ -42,11 +42,12 @@ Requires Docker to be running. Opens a browser at `http://localhost:4681`.
42
42
  ```
43
43
  dockscope up [options]
44
44
 
45
- -p, --port <port> Server port (default: 4681)
46
- -f, --file <path> Docker Compose file path (default: auto-detect)
45
+ -p, --port <port> Server port (default: 4681, auto-increments if in use)
47
46
  --no-open Don't open browser automatically
48
47
  ```
49
48
 
49
+ Docker Compose files are auto-detected (`compose.yml`, `docker-compose.yml`, etc.) and dependencies are read from container labels at runtime — no configuration needed.
50
+
50
51
  ### Scan Mode
51
52
 
52
53
  Output the container graph as JSON (no UI):
package/dist/cli.js CHANGED
@@ -1,29 +1,67 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
+ import { readFileSync } from 'fs';
4
+ import { fileURLToPath } from 'url';
5
+ import path from 'path';
6
+ import { createConnection } from 'net';
3
7
  import { startServer } from './server/index.js';
4
8
  import { buildGraph, checkConnection } from './docker/client.js';
9
+ function isPortInUse(port) {
10
+ return new Promise((resolve) => {
11
+ const conn = createConnection({ port, host: '127.0.0.1' });
12
+ const timeout = setTimeout(() => {
13
+ conn.destroy();
14
+ resolve(false);
15
+ }, 500);
16
+ conn.on('connect', () => {
17
+ clearTimeout(timeout);
18
+ conn.destroy();
19
+ resolve(true);
20
+ });
21
+ conn.on('error', () => {
22
+ clearTimeout(timeout);
23
+ resolve(false);
24
+ });
25
+ });
26
+ }
27
+ async function findAvailablePort(start) {
28
+ let port = start;
29
+ while (await isPortInUse(port)) {
30
+ console.log(` Port ${port} is in use, trying ${port + 1}...`);
31
+ port++;
32
+ if (port > start + 20) {
33
+ console.error(` No available port found in range ${start}-${port}`);
34
+ process.exit(1);
35
+ }
36
+ }
37
+ return port;
38
+ }
39
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
40
+ const pkg = JSON.parse(readFileSync(path.resolve(__dirname, '../package.json'), 'utf-8'));
41
+ const VERSION = pkg.version;
5
42
  const program = new Command();
6
43
  program
7
44
  .name('dockscope')
8
45
  .description('Visual, interactive Docker infrastructure debugger')
9
- .version('0.1.0');
46
+ .version(VERSION);
10
47
  program
11
- .command('up')
48
+ .command('up', { isDefault: true })
12
49
  .description('Start the DockScope dashboard')
13
50
  .option('-p, --port <port>', 'Server port', '4681')
14
- .option('-f, --file <path>', 'Docker Compose file path', 'docker-compose.yml')
15
51
  .option('--no-open', "Don't open browser automatically")
52
+ .option('--no-port-check', 'Skip port conflict detection')
16
53
  .action(async (opts) => {
17
- const port = parseInt(opts.port, 10);
54
+ const requestedPort = parseInt(opts.port, 10);
55
+ const port = opts.portCheck === false ? requestedPort : await findAvailablePort(requestedPort);
18
56
  console.log(`
19
57
  ____ _ ____
20
58
  | _ \\ ___ ___| | _/ ___| ___ ___ _ __ ___
21
59
  | | | |/ _ \\ / __| |/ \\___ \\ / __/ _ \\| '_ \\ / _ \\
22
60
  | |_| | (_) | (__| < ___) | (_| (_) | |_) | __/
23
61
  |____/ \\___/ \\___|_|\\_\\____/ \\___\\___/| .__/ \\___|
24
- |_| v0.1.0
62
+ |_| v${VERSION}
25
63
  `);
26
- await startServer({ port, composeFile: opts.file, open: opts.open !== false });
64
+ await startServer({ port, open: opts.open !== false });
27
65
  const url = `http://localhost:${port}`;
28
66
  console.log(` Dashboard: ${url}`);
29
67
  console.log(` API: ${url}/api/graph`);
@@ -38,14 +76,13 @@ program
38
76
  program
39
77
  .command('scan')
40
78
  .description('Scan Docker environment and output graph data as JSON')
41
- .option('-f, --file <path>', 'Docker Compose file path', 'docker-compose.yml')
42
- .action(async (opts) => {
79
+ .action(async () => {
43
80
  const connected = await checkConnection();
44
81
  if (!connected) {
45
82
  console.error('Cannot connect to Docker daemon. Is Docker running?');
46
83
  process.exit(1);
47
84
  }
48
- const graph = await buildGraph(opts.file);
85
+ const graph = await buildGraph();
49
86
  console.log(JSON.stringify(graph, null, 2));
50
87
  });
51
88
  program.parse();
@@ -22,12 +22,28 @@ export async function startServer(opts) {
22
22
  const metricHistory = new Map();
23
23
  // REST routes
24
24
  setupRoutes(app, opts, metricHistory);
25
- // Serve built frontend in production
26
- const webDir = path.resolve(__dirname, '../web');
27
- app.use(express.static(webDir));
28
- app.get('*', (_req, res) => {
29
- res.sendFile(path.join(webDir, 'index.html'));
30
- });
25
+ // Frontend: Vite dev server (HMR) or static files (production)
26
+ if (process.env.DOCKSCOPE_DEV === '1') {
27
+ try {
28
+ const { createServer: createVite } = await import('vite');
29
+ const vite = await createVite({
30
+ server: { middlewareMode: true, hmr: { server } },
31
+ appType: 'spa',
32
+ });
33
+ app.use(vite.middlewares);
34
+ }
35
+ catch {
36
+ console.error('Vite not found — install devDependencies for dev mode');
37
+ process.exit(1);
38
+ }
39
+ }
40
+ else {
41
+ const webDir = path.resolve(__dirname, '../web');
42
+ app.use(express.static(webDir));
43
+ app.get('*', (_req, res) => {
44
+ res.sendFile(path.join(webDir, 'index.html'));
45
+ });
46
+ }
31
47
  // --- WebSocket ---
32
48
  const broadcast = (msg) => {
33
49
  const data = JSON.stringify(msg);
@@ -39,7 +55,7 @@ export async function startServer(opts) {
39
55
  let cachedGraph = { nodes: [], links: [] };
40
56
  const refreshGraph = async () => {
41
57
  try {
42
- cachedGraph = await buildGraph(opts.composeFile);
58
+ cachedGraph = await buildGraph();
43
59
  broadcast({ type: 'graph', data: cachedGraph });
44
60
  }
45
61
  catch {
@@ -2,7 +2,7 @@ import { buildGraph, checkConnection, composeAction, containerAction, getContain
2
2
  export function setupRoutes(app, opts, metricHistory) {
3
3
  app.get('/api/graph', async (_req, res) => {
4
4
  try {
5
- const graph = await buildGraph(opts.composeFile);
5
+ const graph = await buildGraph();
6
6
  res.json(graph);
7
7
  }
8
8
  catch (err) {
package/dist/types.d.ts CHANGED
@@ -88,6 +88,5 @@ export interface MetricPoint {
88
88
  }
89
89
  export interface ServerOptions {
90
90
  port: number;
91
- composeFile: string;
92
91
  open: boolean;
93
92
  }
@@ -4829,6 +4829,6 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
4829
4829
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function qw(i,e){var t=Object.keys(i);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(i);e&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(i,r).enumerable})),t.push.apply(t,n)}return t}function Zf(i){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?arguments[e]:{};e%2?qw(Object(t),!0).forEach(function(n){wd(i,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(i,Object.getOwnPropertyDescriptors(t)):qw(Object(t)).forEach(function(n){Object.defineProperty(i,n,Object.getOwnPropertyDescriptor(t,n))})}return i}function eg(i){return tY(i)||nY(i)||oY(i)||iY()}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(e==="string"?String:Number)(i)}function sY(i){var e=rY(i,"string");return typeof e=="symbol"?e:e+""}function oY(i,e){if(i){if(typeof i=="string")return Dy(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)?Dy(i,e):void 0}}function GN(i,e){var t=new e;return t._destructor&&t._destructor(),{linkProp:function(r){return{default:t[r](),onChange:function(o,a){a[i][r](o)},triggerUpdate:!1}},linkMethod:function(r){return function(s){for(var o=s[i],a=arguments.length,l=new Array(a>1?a-1:0),c=1;c<a;c++)l[c-1]=arguments[c];var u=o[r].apply(o,l);return u===o?this:u}}}}var mv=window.THREE?window.THREE:{AmbientLight:E3,DirectionalLight:w3,REVISION:vm},aY=170,VN=GN("forceGraph",DA),lY=Object.assign.apply(Object,eg(["jsonUrl","graphData","numDimensions","dagMode","dagLevelDistance","dagNodeFilter","onDagError","nodeRelSize","nodeId","nodeVal","nodeResolution","nodeColor","nodeAutoColorBy","nodeOpacity","nodeVisibility","nodeThreeObject","nodeThreeObjectExtend","nodePositionUpdate","linkSource","linkTarget","linkVisibility","linkColor","linkAutoColorBy","linkOpacity","linkWidth","linkResolution","linkCurvature","linkCurveRotation","linkMaterial","linkThreeObject","linkThreeObjectExtend","linkPositionUpdate","linkDirectionalArrowLength","linkDirectionalArrowColor","linkDirectionalArrowRelPos","linkDirectionalArrowResolution","linkDirectionalParticles","linkDirectionalParticleSpeed","linkDirectionalParticleOffset","linkDirectionalParticleWidth","linkDirectionalParticleColor","linkDirectionalParticleResolution","linkDirectionalParticleThreeObject","forceEngine","d3AlphaDecay","d3VelocityDecay","d3AlphaMin","ngraphPhysics","warmupTicks","cooldownTicks","cooldownTime","onEngineTick","onEngineStop"].map(function(i){return wd({},i,VN.linkProp(i))}))),cY=Object.assign.apply(Object,eg(["refresh","getGraphBbox","d3Force","d3ReheatSimulation","emitParticle"].map(function(i){return wd({},i,VN.linkMethod(i))}))),Ap=GN("renderObjs",zN),uY=Object.assign.apply(Object,eg(["width","height","backgroundColor","showNavInfo","enablePointerInteraction"].map(function(i){return wd({},i,Ap.linkProp(i))}))),hY=Object.assign.apply(Object,eg(["lights","cameraPosition","postProcessingComposer"].map(function(i){return wd({},i,Ap.linkMethod(i))})).concat([{graph2ScreenCoords:Ap.linkMethod("getScreenCoords"),screen2GraphCoords:Ap.linkMethod("getSceneCoords")}])),dY=Pm({props:Zf(Zf({nodeLabel:{default:"name",triggerUpdate:!1},linkLabel:{default:"name",triggerUpdate:!1},linkHoverPrecision:{default:1,onChange:function(e,t){return t.renderObjs.lineHoverPrecision(e)},triggerUpdate:!1},enableNavigationControls:{default:!0,onChange:function(e,t){var n=t.renderObjs.controls();n&&(n.enabled=e,e&&n.domElement&&n.domElement.dispatchEvent(new PointerEvent("pointerup")))},triggerUpdate:!1},enableNodeDrag:{default:!0,triggerUpdate:!1},onNodeDrag:{default:function(){},triggerUpdate:!1},onNodeDragEnd:{default:function(){},triggerUpdate:!1},onNodeClick:{triggerUpdate:!1},onNodeRightClick:{triggerUpdate:!1},onNodeHover:{triggerUpdate:!1},onLinkClick:{triggerUpdate:!1},onLinkRightClick:{triggerUpdate:!1},onLinkHover:{triggerUpdate:!1},onBackgroundClick:{triggerUpdate:!1},onBackgroundRightClick:{triggerUpdate:!1},showPointerCursor:{default:!0,triggerUpdate:!1}},lY),uY),methods:Zf(Zf({zoomToFit:function(e,t,n){for(var r,s=arguments.length,o=new Array(s>3?s-3:0),a=3;a<s;a++)o[a-3]=arguments[a];return e.renderObjs.fitToBbox((r=e.forceGraph).getGraphBbox.apply(r,o),t,n),this},pauseAnimation:function(e){return e.animationFrameRequestId!==null&&(cancelAnimationFrame(e.animationFrameRequestId),e.animationFrameRequestId=null),this},resumeAnimation:function(e){return e.animationFrameRequestId===null&&this._animationCycle(),this},_animationCycle:function(e){e.enablePointerInteraction&&(this.renderer().domElement.style.cursor=null),e.forceGraph.tickFrame(),e.renderObjs.tick(),e.animationFrameRequestId=requestAnimationFrame(this._animationCycle)},scene:function(e){return e.renderObjs.scene()},camera:function(e){return e.renderObjs.camera()},renderer:function(e){return e.renderObjs.renderer()},controls:function(e){return e.renderObjs.controls()},tbControls:function(e){return e.renderObjs.tbControls()},_destructor:function(){this.pauseAnimation(),this.graphData({nodes:[],links:[]})}},cY),hY),stateInit:function(e){var t=e.controlType,n=e.rendererConfig,r=e.extraRenderers,s=new DA;return{forceGraph:s,renderObjs:zN({controlType:t,rendererConfig:n,extraRenderers:r}).objects([s]).lights([new mv.AmbientLight(13421772,Math.PI),new mv.DirectionalLight(16777215,.6*Math.PI)])}},init:function(e,t){e.innerHTML="",e.appendChild(t.container=document.createElement("div")),t.container.style.position="relative";var n=document.createElement("div");t.container.appendChild(n),t.renderObjs(n);var r=t.renderObjs.camera(),s=t.renderObjs.renderer(),o=t.renderObjs.controls();o.enabled=!!t.enableNavigationControls,t.lastSetCameraZ=r.position.z;var a;t.container.appendChild(a=document.createElement("div")),a.className="graph-info-msg",a.textContent="",t.forceGraph.onLoading(function(){a.textContent="Loading..."}).onFinishLoading(function(){a.textContent=""}).onUpdate(function(){t.graphData=t.forceGraph.graphData(),r.position.x===0&&r.position.y===0&&r.position.z===t.lastSetCameraZ&&t.graphData.nodes.length&&(r.lookAt(t.forceGraph.position),t.lastSetCameraZ=r.position.z=Math.cbrt(t.graphData.nodes.length)*aY)}).onFinishUpdate(function(){if(t._dragControls){var l=t.graphData.nodes.find(function(u){return u.__initialFixedPos&&!u.__disposeControlsAfterDrag});l?l.__disposeControlsAfterDrag=!0:t._dragControls.dispose(),t._dragControls=void 0}if(t.enableNodeDrag&&t.enablePointerInteraction&&t.forceEngine==="d3"){var c=t._dragControls=new A3(t.graphData.nodes.map(function(u){return u.__threeObj}).filter(function(u){return u}),r,s.domElement);c.addEventListener("dragstart",function(u){var h=Us(u.object);if(h){o.enabled=!1,u.object.__initialPos=u.object.position.clone(),u.object.__prevPos=u.object.position.clone();var d=h.__data;!d.__initialFixedPos&&(d.__initialFixedPos={fx:d.fx,fy:d.fy,fz:d.fz}),!d.__initialPos&&(d.__initialPos={x:d.x,y:d.y,z:d.z}),["x","y","z"].forEach(function(f){return d["f".concat(f)]=d[f]}),s.domElement.classList.add("grabbable")}}),c.addEventListener("drag",function(u){var h=Us(u.object);if(h){if(!u.object.hasOwnProperty("__graphObjType")){var d=u.object.__initialPos,f=u.object.__prevPos,p=u.object.position;h.position.add(p.clone().sub(f)),f.copy(p),p.copy(d)}var _=h.__data,g=h.position,m={x:g.x-_.x,y:g.y-_.y,z:g.z-_.z};["x","y","z"].forEach(function(v){return _["f".concat(v)]=_[v]=g[v]}),t.forceGraph.d3AlphaTarget(.3).resetCountdown(),_.__dragged=!0,t.onNodeDrag(_,m)}}),c.addEventListener("dragend",function(u){var h=Us(u.object);if(h){delete u.object.__initialPos,delete u.object.__prevPos;var d=h.__data;d.__disposeControlsAfterDrag&&(c.dispose(),delete d.__disposeControlsAfterDrag);var f=d.__initialFixedPos,p=d.__initialPos,_={x:p.x-d.x,y:p.y-d.y,z:p.z-d.z};if(f&&(["x","y","z"].forEach(function(m){var v="f".concat(m);f[v]===void 0&&delete d[v]}),delete d.__initialFixedPos,delete d.__initialPos,d.__dragged&&(delete d.__dragged,t.onNodeDragEnd(d,_))),t.forceGraph.d3AlphaTarget(0).resetCountdown(),t.enableNavigationControls){var g;o.enabled=!0,o._status&&((g=o._onPointerCancel)===null||g===void 0||g.call(o)),o.domElement&&o.domElement.ownerDocument&&o.domElement.ownerDocument.dispatchEvent(new PointerEvent("pointerup",{pointerType:"touch"}))}s.domElement.classList.remove("grabbable")}})}}),mv.REVISION<155&&(t.renderObjs.renderer().useLegacyLights=!1),t.renderObjs.hoverOrderComparator(function(l,c){var u=Us(l);if(!u)return 1;var h=Us(c);if(!h)return-1;var d=function(p){return p.__graphObjType==="node"};return d(h)-d(u)}).tooltipContent(function(l){var c=Us(l);return c&&bt(t["".concat(c.__graphObjType,"Label")])(c.__data)||""}).hoverDuringDrag(!1).onHover(function(l){var c=Us(l);if(c!==t.hoverObj){var u=t.hoverObj?t.hoverObj.__graphObjType:null,h=t.hoverObj?t.hoverObj.__data:null,d=c?c.__graphObjType:null,f=c?c.__data:null;if(u&&u!==d){var p=t["on".concat(u==="node"?"Node":"Link","Hover")];p&&p(null,h)}if(d){var _=t["on".concat(d==="node"?"Node":"Link","Hover")];_&&_(f,u===d?h:null)}s.domElement.classList[(c&&t["on".concat(d==="node"?"Node":"Link","Click")]||!c&&t.onBackgroundClick)&&bt(t.showPointerCursor)(f)?"add":"remove"]("clickable"),t.hoverObj=c}}).clickAfterDrag(!1).onClick(function(l,c){var u=Us(l);if(u){var h=t["on".concat(u.__graphObjType==="node"?"Node":"Link","Click")];h&&h(u.__data,c)}else t.onBackgroundClick&&t.onBackgroundClick(c)}).onRightClick(function(l,c){var u=Us(l);if(u){var h=t["on".concat(u.__graphObjType==="node"?"Node":"Link","RightClick")];h&&h(u.__data,c)}else t.onBackgroundRightClick&&t.onBackgroundRightClick(c)}),this._animationCycle()}});function Us(i){for(var e=i;e&&!e.hasOwnProperty("__graphObjType");)e=e.parent;return e}const Fa=nu.importance;function Qf(i,e){const t=i[e];return typeof t=="object"?t.id:t}function fY(i,e){var g;const t=new Map;if(i.length===0)return t;const n=new Map;for(const m of e){if(m.type!=="depends_on")continue;const v=Qf(m,"source"),y=Qf(m,"target");n.has(y)||n.set(y,new Set),n.get(y).add(v)}function r(m){const v=new Set,y=[m];for(;y.length>0;){const x=y.pop(),w=n.get(x);if(w)for(const T of w)v.has(T)||(v.add(T),y.push(T))}return v.size}const s=new Map;for(const m of e){const v=Qf(m,"source"),y=Qf(m,"target");s.set(v,(s.get(v)||0)+1),s.set(y,(s.get(y)||0)+1)}let o=1,a=1,l=1,c=1,u=1,h=1;const d=[];for(const m of i){const v=m.ports.some(M=>M.includes(":")),y=s.get(m.id)||0,x=r(m.id),w=(m.networkRxRate||0)+(m.networkTxRate||0),T=m.cpu||0,S=m.memoryLimit>0?(m.memory||0)/m.memoryLimit:0,E=((g=m.networks)==null?void 0:g.length)||0;y>o&&(o=y),x>a&&(a=x),w>l&&(l=w),T>c&&(c=T),S>u&&(u=S),E>h&&(h=E),d.push({id:m.id,ports:v?1:0,links:y,chain:x,netIO:w,cpu:T,mem:S,nets:E})}const f=d.map(m=>({id:m.id,score:m.ports*Fa.ports+m.links/o*Fa.connections+m.chain/a*Fa.chainDepth+m.netIO/l*Fa.networkIO+m.cpu/c*Fa.cpu+m.mem/u*Fa.memory+m.nets/h*Fa.networks})),p=f.reduce((m,v)=>m+v.score,0)/(f.length||1),_=Math.max(...f.map(m=>Math.abs(m.score-p)),.01);for(const m of f){const v=.5+(m.score-p)/_*.5;t.set(m.id,Math.max(0,Math.min(1,v)))}return t}function Iy(i,e){(e==null||e>i.length)&&(e=i.length);for(var t=0,n=Array(e);t<e;t++)n[t]=i[t];return n}function pY(i){if(Array.isArray(i))return i}function mY(i){if(Array.isArray(i))return Iy(i)}function gY(i){if(i===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return i}function _Y(i,e,t){return e=um(e),EY(i,HN()?Reflect.construct(e,t||[],um(i).constructor):e.apply(i,t))}function vY(i,e){if(!(i instanceof e))throw new TypeError("Cannot call a class as a function")}function yY(i,e){for(var t=0;t<e.length;t++){var n=e[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(i,CY(n.key),n)}}function xY(i,e,t){return e&&yY(i.prototype,e),Object.defineProperty(i,"prototype",{writable:!1}),i}function um(i){return um=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},um(i)}function bY(i,e){if(typeof e!="function"&&e!==null)throw new TypeError("Super expression must either be null or a function");i.prototype=Object.create(e&&e.prototype,{constructor:{value:i,writable:!0,configurable:!0}}),Object.defineProperty(i,"prototype",{writable:!1}),e&&Ly(i,e)}function HN(){try{var i=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(HN=function(){return!!i})()}function SY(i){if(typeof Symbol<"u"&&i[Symbol.iterator]!=null||i["@@iterator"]!=null)return Array.from(i)}function MY(i,e){var t=i==null?null:typeof Symbol<"u"&&i[Symbol.iterator]||i["@@iterator"];if(t!=null){var n,r,s,o,a=[],l=!0,c=!1;try{if(s=(t=t.call(i)).next,e===0){if(Object(t)!==t)return;l=!1}else for(;!(l=(n=s.call(t)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(u){c=!0,r=u}finally{try{if(!l&&t.return!=null&&(o=t.return(),Object(o)!==o))return}finally{if(c)throw r}}return a}}function TY(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
4830
4830
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function wY(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
4831
4831
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function EY(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 gY(i)}function Ly(i,e){return Ly=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,n){return t.__proto__=n,t},Ly(i,e)}function jw(i,e){return pY(i)||MY(i,e)||WN(i,e)||TY()}function lh(i){return mY(i)||SY(i)||WN(i)||wY()}function AY(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 CY(i){var e=AY(i,"string");return typeof e=="symbol"?e:e+""}function WN(i,e){if(i){if(typeof i=="string")return Iy(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)?Iy(i,e):void 0}}var ch=typeof window<"u"&&window.THREE?window.THREE:{CanvasTexture:WE,Sprite:VE,SpriteMaterial:ax,SRGBColorSpace:Si},$N=(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 vY(this,e),t=_Y(this,e,[new ch.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 bY(e,i),xY(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
- `),_="".concat(this.fontWeight," ").concat(this.fontSize,"px ").concat(this.fontFace);s.font=_;var g=Math.max.apply(Math,lh(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,lh(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 T=Math.max.apply(Math,lh(l)),S=T/2;s.lineWidth=T,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 D=jw(A,4),N=D[0],P=D[1],O=D[2],B=D[3];s.moveTo(N,O),s.quadraticCurveTo(P,O,P,B)}),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 D=jw(A,6),N=D[0],P=D[1],O=D[2],B=D[3],L=D[4],F=D[5];s.quadraticCurveTo(N,B,P,L),s.lineTo(O,F)}),s.closePath(),s.fill()):s.fillRect(l[0],l[1],v-l[0]*2,y-l[1]*2)),s.translate.apply(s,lh(l)),s.translate.apply(s,lh(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,D){var N=(g-s.measureText(A).width)/2,P=(D+1)*n.fontSize;E&&s.strokeText(A,N,P),s.fillText(A,N,P)}),this.material.map&&this.material.map.dispose();var M=this.material.map=new ch.CanvasTexture(r);M.colorSpace=ch.SRGBColorSpace;var b=this.textHeight*p.length+a[1]*2+h[1]*2+Math.abs(this.offsetY);this.scale.set(b*r.width/r.height,b,0)}},{key:"clone",value:function(){return new this.constructor(this.text,this.textHeight,this.color).copy(this)}},{key:"copy",value:function(n){return ch.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}}])})(ch.Sprite);const Zr=nu.node,gv={"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 RY(i){return i.status==="running"?gv[`running:${i.health}`]||gv["running:none"]:gv[i.status]||"#2a3040"}function Xw(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 WE(s);u.needsUpdate=!0;const h=new ax({map:u,transparent:!0,opacity:n,depthWrite:!1}),d=new VE(h);return d.scale.set(r,r,1),d}function Yw(i,e,t,n){const r=new Ja,s=RY(i),o=i.status==="running",a=1+e*Zr.importanceScale,c=(o?Zr.baseRadius.running:Zr.baseRadius.stopped)*a,u=new Cm(c,Zr.sphereSegments.w,Zr.sphereSegments.h),h=o?.25+e*.3:.1,d=new _3({color:s,emissive:s,emissiveIntensity:h,transparent:!0,opacity:o?.88:.4}),f=new wi(u,d);if(r.add(f),r.__coreMat=d,r.__baseEmissive=h,o){const _=c+Zr.ringGap,g=Zr.ringThicknessBase+e*Zr.ringThicknessScale,m=.06+e*.14;r.add(Xw(s,_,_+g,m))}if(o&&t){const _=Xw("#ff8a2b",c+3.5,c+5.5,.25);r.add(_),n.push(_)}const p=new $N(i.name);return p.color="#c8cede",p.textHeight=Zr.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+Zr.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 qN=new Cm(1,20,14),$c=new Map;function NY(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 PY(i){const e=new Tm({color:i,transparent:!0,opacity:.035,depthWrite:!1,side:si}),t=new wi(qN,e);return t.renderOrder=-1,t}function DY(i,e){const t=new $N(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 Fy(i,e){const t=$c.get(e);t&&(i.remove(t.mesh),i.remove(t.label),t.mesh.material.dispose(),$c.delete(e))}function IY(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){Fy(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=Ub[s.get(o)%Ub.length];let p=$c.get(o);if(!p){const _=PY(f),g=DY(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)&&Fy(i,o)}function LY(i){for(const[e]of $c)Fy(i,e);qN.dispose()}const Cp=[],Kw=new Set;let FY=0;function Zw(i,e){if(Kw.has(i))return;Kw.add(i);const t=FY++;e.scale.setScalar(.01),setTimeout(()=>{Cp.push({obj:e,start:performance.now(),dur:nu.node.deployDuration})},t*nu.node.deployStagger)}function UY(){const i=performance.now();for(let e=Cp.length-1;e>=0;e--){const t=Cp[e],n=Math.min((i-t.start)/t.dur,1);t.obj.scale.setScalar(1-Math.pow(1-n,3)),n>=1&&Cp.splice(e,1)}}function BY(i){const e=.12+Math.sin(performance.now()*.004)*.12;for(const t of i)t.material.opacity=e}var OY=Xe('<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>'),kY=Xe('<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 zY(i,e){gr(e,!0);let t=ap(e,"statusbarHeight",3,170),n=ri(()=>fY(e.data.nodes,e.data.links));function r(N){for(const P of e.data.links){if(P.type!=="depends_on")continue;const O=typeof P.source=="object"?P.source.id:P.source,B=typeof P.target=="object"?P.target.id:P.target;if(O!==N)continue;const L=e.data.nodes.find(F=>F.id===B);if(L&&(L.status!=="running"||L.health==="unhealthy"))return!0}return!1}const s=[];function o(N){var P,O;if(e.statusFilter.size>0&&!(e.statusFilter.has("running")&&N.status==="running"||e.statusFilter.has("stopped")&&N.status!=="running"||e.statusFilter.has("unhealthy")&&N.health==="unhealthy"))return!1;if(e.searchQuery){const B=e.searchQuery.toLowerCase();if(!((P=N.name)!=null&&P.toLowerCase().includes(B))&&!((O=N.image)!=null&&O.toLowerCase().includes(B)))return!1}return!0}let a=null,l=null,c=null;function u(N){const P=typeof N.source=="object"?N.source:null,O=typeof N.target=="object"?N.target:null,B=a&&((P==null?void 0:P.id)===a||(O==null?void 0:O.id)===a);return N.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 h(N){const P=typeof N.source=="object"?N.source:null,O=typeof N.target=="object"?N.target:null,B=a&&((P==null?void 0:P.id)===a||(O==null?void 0:O.id)===a),L=N.type==="depends_on"?.3:.5;return B?L+1:L}let d,f=null,p=null;fd(()=>{var V,ie,j,se,ye,Q,U,Y;const N=nu.force,P=nu.controls;f=dY()(d).backgroundColor("rgba(0,0,0,0)").nodeId("id").nodeThreeObject(X=>{const ve=Z(n).get(X.id)||0,Ee=Yw(X,ve,r(X.id),s);return Zw(X.id,Ee),Ee}).nodeThreeObjectExtend(!1).linkColor(u).linkWidth(h).linkDirectionalArrowLength(X=>X.type==="depends_on"?3:0).linkDirectionalArrowRelPos(1).linkDirectionalArrowColor(X=>X.type==="depends_on"?"rgba(255,138,43,0.25)":void 0).linkOpacity(.7).linkLabel(X=>X.type==="depends_on"?"depends_on":X.label||"").cooldownTicks(100).d3AlphaDecay(.08).d3VelocityDecay(.6).warmupTicks(80).onNodeClick(X=>e.onNodeClick(X)).onNodeHover((X,ve)=>{d.style.cursor=X?"pointer":"default",ve&&ve.id!==c&&Jf(ve,!1),X&&Jf(X,!0)}).graphData(e.data),(V=f.d3Force("charge"))==null||V.strength(N.charge.strength).distanceMax(N.charge.distanceMax),(ie=f.d3Force("link"))==null||ie.distance(N.link.distance),(j=f.d3Force("center"))==null||j.strength(N.center.strength),(se=f.d3Force("x"))==null||se.strength(N.position.strength),(ye=f.d3Force("y"))==null||ye.strength(N.position.strength),(Q=f.d3Force("z"))==null||Q.strength(N.position.strength),f.d3Force("cluster",NY(N.cluster.strength));const O=(U=f.controls)==null?void 0:U.call(f);O&&(O.zoomSpeed=P.zoomSpeed,O.rotateSpeed=P.rotateSpeed,O.panSpeed=P.panSpeed);const B=(Y=f.renderer)==null?void 0:Y.call(f);B&&B.setClearColor(263182,1);const L=new ResizeObserver(([X])=>{const{width:ve,height:Ee}=X.contentRect;f==null||f.width(ve).height(Ee)});L.observe(d);function F(){f&&IY(f.scene(),f.graphData().nodes,o),UY(),BY(s),p=requestAnimationFrame(F)}return p=requestAnimationFrame(F),()=>{var X;p!==null&&cancelAnimationFrame(p),f&&LY(f.scene()),L.disconnect(),(X=f==null?void 0:f._destructor)==null||X.call(f)}});function _(N){const P=new Map;for(const F of N){const V=F.project||"";P.has(V)||P.set(V,[]),P.get(V).push(F)}if(P.size<=1)return;const O=[...P.entries()],B=20*Math.sqrt(N.length),L=2*Math.PI/O.length;O.forEach(([F,V],ie)=>{const j=L*ie,se=Math.cos(j)*B,ye=Math.sin(j)*B,Q=8*Math.sqrt(V.length);V.forEach((U,Y)=>{if(U.x!==void 0)return;const X=2*Math.PI*Y/V.length;U.x=se+Math.cos(X)*Q,U.y=(Math.random()-.5)*Q*.5,U.z=ye+Math.sin(X)*Q})})}let g="";io(()=>{if(!f||e.data.nodes.length===0)return;const N=e.data.nodes.map(P=>`${P.id}:${P.status}:${P.health}`).sort().join(",");if(N!==g){const P=g===""||e.data.nodes.map(O=>O.id).sort().join(",")!==g.replace(/:[^,]*/g,"").replace(/:/g,"");g=N,P&&_(e.data.nodes),s.length=0,f.nodeThreeObject(O=>{const B=Z(n).get(O.id)||0,L=Yw(O,B,r(O.id),s);return Zw(O.id,L),L}),f.graphData(e.data)}}),io(()=>{const N=e.selectedNode;ma(()=>{if(!f)return;const P=f.graphData().nodes;if(l){const O=P.find(B=>B.id===l);O&&Jf(O,!1)}if(N){const O=P.find(B=>B.id===N.id);Jf(O,!0)}l=(N==null?void 0:N.id)||null,a=(N==null?void 0:N.id)||null,c=(N==null?void 0:N.id)||null,f.linkColor(u).linkWidth(h)})}),io(()=>{if(!f)return;if(!(e.searchQuery||e.statusFilter.size>0))f.nodeVisibility(()=>!0),f.linkVisibility(()=>!0);else if(f.nodeVisibility(P=>o(P)),f.linkVisibility(P=>{const O=typeof P.source=="object"?P.source:null,B=typeof P.target=="object"?P.target:null;return(O?o(O):!0)&&(B?o(B):!0)}),e.searchQuery){const P=e.searchQuery.toLowerCase(),O=e.data.nodes.filter(B=>B.name.toLowerCase().includes(P)||B.image.toLowerCase().includes(P));if(O.length===1){const B=O[0];if(B.x!==void 0){const F=1+120/Math.hypot(B.x||1,B.y||1,B.z||1);f.cameraPosition({x:B.x*F,y:B.y*F,z:B.z*F},B,800)}}}});function m(){f==null||f.zoomToFit(400)}function v(){f==null||f.cameraPosition({x:0,y:0,z:300},{x:0,y:0,z:0},800)}function y(N){const P=e.data.nodes.find(O=>O.id===N.id);if((P==null?void 0:P.x)!==void 0&&f){const B=1+120/Math.hypot(P.x||1,P.y||1,P.z||1);f.cameraPosition({x:P.x*B,y:P.y*B,z:P.z*B},P,800)}}var x={zoomToFit:m,resetCamera:v,centerOnNode:y},w=kY(),T=fe(w);Np(T,N=>d=N,()=>d);var S=ge(T,2),E=fe(S),M=ge(E,2),b=ge(M,2);{var A=N=>{var P=OY();Et("click",P,()=>y(e.selectedNode)),We(N,P)};At(b,N=>{e.selectedNode&&N(A)})}var D=ge(b,4);return St(()=>Ic(S,`bottom: ${t()+16}px;`)),Et("click",E,m),Et("click",M,v),Et("click",D,function(...N){var P;(P=e.onHelpClick)==null||P.apply(this,N)}),We(i,w),_r(x)}ga(["click"]);function GY(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 VY(i){return new Date(i*1e3).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function HY(i){return(i/1024/1024/1024).toFixed(1)}async function Qw(i,e){try{await navigator.clipboard.writeText(i),na(`Copied ${e}`,"info")}catch{na("Failed to copy","error")}}var WY=Xe('<span class="sparkline-label svelte-1apk6lc"> </span>'),$Y=J1('<path></path><path fill="none" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><circle r="2.5"></circle>',1),qY=J1('<text text-anchor="middle" fill="#3e4a5c" font-size="9">collecting...</text>'),jY=Xe('<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 Jw(i,e){gr(e,!0);let t=ap(e,"width",3,200),n=ap(e,"height",3,32),r=ap(e,"label",3,""),s=ri(()=>{if(e.data.length<2)return"";const w=Math.max(...e.data,1),T=Math.min(...e.data,0),S=w-T||1,E=t()/(e.data.length-1),M=2,b=n()-M*2;return e.data.map((A,D)=>{const N=D*E,P=M+b-(A-T)/S*b;return`${D===0?"M":"L"}${N.toFixed(1)},${P.toFixed(1)}`}).join(" ")}),o=ri(()=>{if(!Z(s))return"";const w=t()/(e.data.length-1);return`${Z(s)} L${((e.data.length-1)*w).toFixed(1)},${n()} L0,${n()} Z`}),a=ri(()=>e.data.length>0?e.data[e.data.length-1]:0),l=ri(()=>{if(e.data.length<2)return{x:0,y:n()/2};const w=Math.max(...e.data,1),T=Math.min(...e.data,0),S=w-T||1,E=2,M=n()-E*2;return{x:t(),y:E+M-(Z(a)-T)/S*M}});const c=`spark-${Math.random().toString(36).slice(2,8)}`;var u=jY(),h=fe(u);{var d=w=>{var T=WY(),S=fe(T);St(()=>rt(S,r())),We(w,T)};At(h,w=>{r()&&w(d)})}var f=ge(h,2),p=fe(f),_=fe(p),g=fe(_),m=ge(g),v=ge(p);{var y=w=>{var T=$Y(),S=qr(T),E=ge(S),M=ge(E);St(()=>{ai(S,"d",Z(o)),ai(S,"fill",`url(#${c})`),ai(E,"d",Z(s)),ai(E,"stroke",e.color),ai(M,"cx",Z(l).x),ai(M,"cy",Z(l).y),ai(M,"fill",e.color)}),We(w,T)},x=w=>{var T=qY();St(()=>{ai(T,"x",t()/2),ai(T,"y",n()/2+4)}),We(w,T)};At(v,w=>{e.data.length>=2?w(y):w(x,-1)})}St(()=>{ai(f,"width",t()),ai(f,"height",n()),ai(f,"viewBox",`0 0 ${t()??""} ${n()??""}`),ai(_,"id",c),ai(g,"stop-color",e.color),ai(m,"stop-color",e.color)}),We(i,u),_r()}var XY=Xe('<div class="info-section"><span class="field-label">Created</span> <span class="mono"> </span></div>'),YY=Xe('<div class="info-section"><span class="field-label">Restart Policy</span> <span class="tag"> </span></div>'),KY=Xe('<span class="tag"> </span>'),ZY=Xe('<div class="info-section"><span class="field-label">Ports</span> <div></div></div>'),QY=Xe('<span class="tag"> </span>'),JY=Xe('<div class="info-section"><span class="field-label">Networks</span> <div></div></div>'),eK=Xe('<div class="info-section sparkline-row"><!></div> <div class="info-section sparkline-row"><!></div>',1),tK=Xe('<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),nK=Xe('<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 iK(i,e){gr(e,!0);let t=ri(()=>e.stats?(e.stats.memory/e.stats.memoryLimit*100).toFixed(1):"0"),n=ri(()=>e.history.map(M=>M.cpu)),r=ri(()=>e.history.map(M=>{var b;return M.memory/(((b=e.stats)==null?void 0:b.memoryLimit)||1)*100}));var s=nK(),o=fe(s),a=ge(fe(o),2),l=fe(a),c=ge(o,2),u=ge(fe(c),2),h=fe(u),d=ge(c,2),f=ge(fe(d),2),p=fe(f),_=ge(d,2);{var g=M=>{var b=XY(),A=ge(fe(b),2),D=fe(A);St(N=>rt(D,N),[()=>GY(e.inspect.created)]),We(M,b)};At(_,M=>{var b;(b=e.inspect)!=null&&b.created&&M(g)})}var m=ge(_,2);{var v=M=>{var b=YY(),A=ge(fe(b),2),D=fe(A);St(()=>rt(D,e.inspect.restartPolicy)),We(M,b)};At(m,M=>{var b;(b=e.inspect)!=null&&b.restartPolicy&&e.inspect.restartPolicy!=="no"&&M(v)})}var y=ge(m,2);{var x=M=>{var b=ZY(),A=ge(fe(b),2);ro(A,21,()=>e.node.ports,al,(D,N)=>{var P=KY(),O=fe(P);St(()=>rt(O,Z(N))),We(D,P)}),We(M,b)};At(y,M=>{e.node.ports.length>0&&M(x)})}var w=ge(y,2);{var T=M=>{var b=JY(),A=ge(fe(b),2);ro(A,21,()=>e.node.networks,al,(D,N)=>{var P=QY(),O=fe(P);St(()=>rt(O,Z(N))),We(D,P)}),We(M,b)};At(w,M=>{e.node.networks.length>0&&M(T)})}var S=ge(w,2);{var E=M=>{var b=tK(),A=qr(b),D=ge(fe(A),2),N=fe(D),P=fe(N),O=ge(N,2),B=fe(O),L=ge(A,2),F=ge(fe(L),2),V=fe(F),ie=fe(V),j=ge(V,2),se=fe(j),ye=ge(F,2),Q=fe(ye),U=ge(L,2),Y=ge(fe(U),2),X=fe(Y),ve=ge(U,2);{var Ee=de=>{var Fe=eK(),ze=qr(Fe),at=fe(ze);Jw(at,{get data(){return Z(n)},color:"#00e4ff",label:"CPU History"});var G=ge(ze,2),Wt=fe(G);Jw(Wt,{get data(){return Z(r)},color:"#a855f7",label:"Memory History"}),We(de,Fe)};At(ve,de=>{Z(n).length>=2&&de(Ee)})}St((de,Fe,ze,at,G,Wt)=>{Ic(P,`width: ${de??""}%`),rt(B,`${Fe??""}%`),Ic(ie,`width: ${Z(t)??""}%`),rt(se,`${Z(t)??""}%`),rt(Q,`${ze??""} / ${at??""}`),rt(X,`${G??""} rx · ${Wt??""} 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)]),We(M,b)};At(S,M=>{e.stats&&e.node.status==="running"&&M(E)})}St(()=>{rt(l,e.node.image),Ti(u,1,`status-text ${e.node.status??""}`),rt(h,`${e.node.status??""}${e.node.health!=="none"?` (${e.node.health})`:""}`),rt(p,e.node.id)}),Et("click",a,()=>Qw(e.node.image,"image")),Et("click",f,()=>Qw(e.node.containerId,"container ID")),We(i,s),_r()}ga(["click"]);const rK=/password|secret|token|key|api_key|apikey|auth|credential/i;function sK(i,e){const t=i.indexOf("=");if(t===-1)return i;const n=i.substring(0,t),r=i.substring(t+1);return rK.test(n)&&!e?`${n}=${"*".repeat(Math.min(r.length,16))}`:i}var oK=Xe('<div class="env-row mono"> </div>'),aK=Xe('<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>'),lK=Xe('<div class="env-row mono"><span style="color: var(--accent-cyan)"> </span> </div>'),cK=Xe('<div class="info-section"><span class="field-label">Labels</span> <div class="env-list"></div></div>'),uK=Xe('<div class="mount-row"><span class="tag"> </span> <span class="mono" style="font-size: 10px;"> <span style="color: var(--text-dim)"> </span></span></div>'),hK=Xe('<div class="info-section"><span class="field-label">Mounts</span> <!></div>'),dK=Xe('<div class="info-section"><span class="field-label">Command</span> <span class="mono"> </span></div>'),fK=Xe('<div class="info-section"><span class="field-label">Working Directory</span> <span class="mono"> </span></div>'),pK=Xe("<!> <!> <!> <!> <!>",1),mK=Xe('<div class="env-loading">Loading configuration...</div>'),gK=Xe('<div class="sidebar-content"><!></div>');function _K(i,e){gr(e,!0);let t=Tt(!1);var n=gK(),r=fe(n);{var s=a=>{var l=pK(),c=qr(l);{var u=x=>{var w=aK(),T=fe(w),S=ge(fe(T),2),E=fe(S),M=ge(T,2);ro(M,21,()=>e.inspect.env,al,(b,A)=>{var D=oK(),N=fe(D);St(P=>rt(N,P),[()=>sK(Z(A),Z(t))]),We(b,D)}),St(()=>rt(E,Z(t)?"Hide":"Reveal")),Et("click",S,()=>Ue(t,!Z(t))),We(x,w)};At(c,x=>{e.inspect.env.length>0&&x(u)})}var h=ge(c,2);{var d=x=>{var w=cK(),T=ge(fe(w),2);ro(T,21,()=>Object.entries(e.inspect.labels),al,(S,E)=>{var M=ri(()=>s2(Z(E),2));let b=()=>Z(M)[0],A=()=>Z(M)[1];var D=lK(),N=fe(D),P=fe(N),O=ge(N);St(()=>{rt(P,b()),rt(O,`=${A()??""}`)}),We(S,D)}),We(x,w)},f=ri(()=>Object.keys(e.inspect.labels).length>0);At(h,x=>{Z(f)&&x(d)})}var p=ge(h,2);{var _=x=>{var w=hK(),T=ge(fe(w),2);ro(T,17,()=>e.inspect.mounts,al,(S,E)=>{var M=uK(),b=fe(M),A=fe(b),D=ge(b,2),N=fe(D),P=ge(N),O=fe(P);St(()=>{rt(A,Z(E).type),rt(N,`${Z(E).source??""} → ${Z(E).destination??""} `),rt(O,`(${Z(E).mode??""})`)}),We(S,M)}),We(x,w)};At(p,x=>{e.inspect.mounts.length>0&&x(_)})}var g=ge(p,2);{var m=x=>{var w=dK(),T=ge(fe(w),2),S=fe(T);St(E=>rt(S,E),[()=>e.inspect.cmd.join(" ")]),We(x,w)};At(g,x=>{e.inspect.cmd&&x(m)})}var v=ge(g,2);{var y=x=>{var w=fK(),T=ge(fe(w),2),S=fe(T);St(()=>rt(S,e.inspect.workingDir)),We(x,w)};At(v,x=>{e.inspect.workingDir&&e.inspect.workingDir!=="/"&&x(y)})}We(a,l)},o=a=>{var l=mK();We(a,l)};At(r,a=>{e.inspect?a(s):a(o,-1)})}We(i,n),_r()}ga(["click"]);const e1={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"},t1={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 _v(i){return i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}const vK=/\d{4}-\d{2}-\d{2}T(\d{2}:\d{2}:\d{2})\.\d+Z/g;function yK(i){return i.replace(vK,'<span style="color:#5a6578">$1</span>')}function xK(i){if(!i)return"";if(!i.includes("\x1B")&&!i.includes("\x1B"))return _v(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(_v(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=e1[_]||null;else if(_>=90&&_<=97)t=e1[_]||null;else if(_>=40&&_<=47)n=t1[_]||null;else if(_>=100&&_<=107)n=t1[_]||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(_v(i.slice(h))),l&&e.push("</span>"),SK(yK(e.join("")))}const bK=[[/^(.*(?: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 SK(i){return i.split(`
4832
+ `),_="".concat(this.fontWeight," ").concat(this.fontSize,"px ").concat(this.fontFace);s.font=_;var g=Math.max.apply(Math,lh(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,lh(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 T=Math.max.apply(Math,lh(l)),S=T/2;s.lineWidth=T,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 D=jw(A,4),N=D[0],P=D[1],O=D[2],B=D[3];s.moveTo(N,O),s.quadraticCurveTo(P,O,P,B)}),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 D=jw(A,6),N=D[0],P=D[1],O=D[2],B=D[3],L=D[4],F=D[5];s.quadraticCurveTo(N,B,P,L),s.lineTo(O,F)}),s.closePath(),s.fill()):s.fillRect(l[0],l[1],v-l[0]*2,y-l[1]*2)),s.translate.apply(s,lh(l)),s.translate.apply(s,lh(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,D){var N=(g-s.measureText(A).width)/2,P=(D+1)*n.fontSize;E&&s.strokeText(A,N,P),s.fillText(A,N,P)}),this.material.map&&this.material.map.dispose();var M=this.material.map=new ch.CanvasTexture(r);M.colorSpace=ch.SRGBColorSpace;var b=this.textHeight*p.length+a[1]*2+h[1]*2+Math.abs(this.offsetY);this.scale.set(b*r.width/r.height,b,0)}},{key:"clone",value:function(){return new this.constructor(this.text,this.textHeight,this.color).copy(this)}},{key:"copy",value:function(n){return ch.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}}])})(ch.Sprite);const Zr=nu.node,gv={"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 RY(i){return i.status==="running"?gv[`running:${i.health}`]||gv["running:none"]:gv[i.status]||"#2a3040"}function Xw(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 WE(s);u.needsUpdate=!0;const h=new ax({map:u,transparent:!0,opacity:n,depthWrite:!1}),d=new VE(h);return d.scale.set(r,r,1),d}function Yw(i,e,t,n){const r=new Ja,s=RY(i),o=i.status==="running",a=1+e*Zr.importanceScale,c=(o?Zr.baseRadius.running:Zr.baseRadius.stopped)*a,u=new Cm(c,Zr.sphereSegments.w,Zr.sphereSegments.h),h=o?.25+e*.3:.1,d=new _3({color:s,emissive:s,emissiveIntensity:h,transparent:!0,opacity:o?.88:.4}),f=new wi(u,d);if(r.add(f),r.__coreMat=d,r.__baseEmissive=h,o){const _=c+Zr.ringGap,g=Zr.ringThicknessBase+e*Zr.ringThicknessScale,m=.06+e*.14;r.add(Xw(s,_,_+g,m))}if(o&&t){const _=Xw("#ff8a2b",c+3.5,c+5.5,.25);r.add(_),n.push(_)}const p=new $N(i.name);return p.color="#c8cede",p.textHeight=Zr.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+Zr.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 qN=new Cm(1,20,14),$c=new Map;function NY(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 PY(i){const e=new Tm({color:i,transparent:!0,opacity:.035,depthWrite:!1,side:si}),t=new wi(qN,e);return t.renderOrder=-1,t}function DY(i,e){const t=new $N(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 Fy(i,e){const t=$c.get(e);t&&(i.remove(t.mesh),i.remove(t.label),t.mesh.material.dispose(),$c.delete(e))}function IY(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){Fy(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=Ub[s.get(o)%Ub.length];let p=$c.get(o);if(!p){const _=PY(f),g=DY(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)&&Fy(i,o)}function LY(i){for(const[e]of $c)Fy(i,e);qN.dispose()}const Cp=[],Kw=new Set;let FY=0;function Zw(i,e){if(Kw.has(i))return;Kw.add(i);const t=FY++;e.scale.setScalar(.01),setTimeout(()=>{Cp.push({obj:e,start:performance.now(),dur:nu.node.deployDuration})},t*nu.node.deployStagger)}function UY(){const i=performance.now();for(let e=Cp.length-1;e>=0;e--){const t=Cp[e],n=Math.min((i-t.start)/t.dur,1);t.obj.scale.setScalar(1-Math.pow(1-n,3)),n>=1&&Cp.splice(e,1)}}function BY(i){const e=.12+Math.sin(performance.now()*.004)*.12;for(const t of i)t.material.opacity=e}var OY=Xe('<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>'),kY=Xe('<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 zY(i,e){gr(e,!0);let t=ap(e,"statusbarHeight",3,170),n=ri(()=>fY(e.data.nodes,e.data.links));function r(N){for(const P of e.data.links){if(P.type!=="depends_on")continue;const O=typeof P.source=="object"?P.source.id:P.source,B=typeof P.target=="object"?P.target.id:P.target;if(O!==N)continue;const L=e.data.nodes.find(F=>F.id===B);if(L&&(L.status!=="running"||L.health==="unhealthy"))return!0}return!1}const s=[];function o(N){var P,O;if(e.statusFilter.size>0&&!(e.statusFilter.has("running")&&N.status==="running"||e.statusFilter.has("stopped")&&N.status!=="running"||e.statusFilter.has("unhealthy")&&N.health==="unhealthy"))return!1;if(e.searchQuery){const B=e.searchQuery.toLowerCase();if(!((P=N.name)!=null&&P.toLowerCase().includes(B))&&!((O=N.image)!=null&&O.toLowerCase().includes(B)))return!1}return!0}let a=null,l=null,c=null;function u(N){const P=typeof N.source=="object"?N.source:null,O=typeof N.target=="object"?N.target:null,B=a&&((P==null?void 0:P.id)===a||(O==null?void 0:O.id)===a);return N.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 h(N){const P=typeof N.source=="object"?N.source:null,O=typeof N.target=="object"?N.target:null,B=a&&((P==null?void 0:P.id)===a||(O==null?void 0:O.id)===a),L=N.type==="depends_on"?.3:.5;return B?L+1:L}let d,f=null,p=null;fd(()=>{var V,ie,j,se,ye,Q,U,Y;const N=nu.force,P=nu.controls;f=dY()(d).backgroundColor("rgba(0,0,0,0)").nodeId("id").nodeThreeObject(X=>{const ve=Z(n).get(X.id)||0,Ee=Yw(X,ve,r(X.id),s);return Zw(X.id,Ee),Ee}).nodeThreeObjectExtend(!1).linkColor(u).linkWidth(h).linkDirectionalArrowLength(X=>X.type==="depends_on"?3:0).linkDirectionalArrowRelPos(1).linkDirectionalArrowColor(X=>X.type==="depends_on"?"rgba(255,138,43,0.25)":void 0).linkOpacity(.7).linkLabel(X=>X.type==="depends_on"?"depends_on":X.label||"").cooldownTicks(100).d3AlphaDecay(.08).d3VelocityDecay(.6).warmupTicks(80).onNodeClick(X=>e.onNodeClick(X)).onNodeHover((X,ve)=>{d.style.cursor=X?"pointer":"default",ve&&ve.id!==c&&Jf(ve,!1),X&&Jf(X,!0)}).graphData(e.data),(V=f.d3Force("charge"))==null||V.strength(N.charge.strength).distanceMax(N.charge.distanceMax),(ie=f.d3Force("link"))==null||ie.distance(N.link.distance),(j=f.d3Force("center"))==null||j.strength(N.center.strength),(se=f.d3Force("x"))==null||se.strength(N.position.strength),(ye=f.d3Force("y"))==null||ye.strength(N.position.strength),(Q=f.d3Force("z"))==null||Q.strength(N.position.strength),f.d3Force("cluster",NY(N.cluster.strength));const O=(U=f.controls)==null?void 0:U.call(f);O&&(O.zoomSpeed=P.zoomSpeed,O.rotateSpeed=P.rotateSpeed,O.panSpeed=P.panSpeed);const B=(Y=f.renderer)==null?void 0:Y.call(f);B&&B.setClearColor(263182,1);const L=new ResizeObserver(([X])=>{const{width:ve,height:Ee}=X.contentRect;f==null||f.width(ve).height(Ee)});L.observe(d);function F(){f&&IY(f.scene(),f.graphData().nodes,o),UY(),BY(s),p=requestAnimationFrame(F)}return p=requestAnimationFrame(F),()=>{var X;p!==null&&cancelAnimationFrame(p),f&&LY(f.scene()),L.disconnect(),(X=f==null?void 0:f._destructor)==null||X.call(f)}});function _(N){const P=new Map;for(const F of N){const V=F.project||"";P.has(V)||P.set(V,[]),P.get(V).push(F)}if(P.size<=1)return;const O=[...P.entries()],B=20*Math.sqrt(N.length),L=2*Math.PI/O.length;O.forEach(([F,V],ie)=>{const j=L*ie,se=Math.cos(j)*B,ye=Math.sin(j)*B,Q=8*Math.sqrt(V.length);V.forEach((U,Y)=>{if(U.x!==void 0)return;const X=2*Math.PI*Y/V.length;U.x=se+Math.cos(X)*Q,U.y=(Math.random()-.5)*Q*.5,U.z=ye+Math.sin(X)*Q})})}let g="";io(()=>{if(!f)return;if(e.data.nodes.length===0){g!==""&&(g="",s.length=0,f.graphData({nodes:[],links:[]}));return}const N=e.data.nodes.map(P=>`${P.id}:${P.status}:${P.health}`).sort().join(",");if(N!==g){const P=g===""||e.data.nodes.map(O=>O.id).sort().join(",")!==g.replace(/:[^,]*/g,"").replace(/:/g,"");g=N,P&&_(e.data.nodes),s.length=0,f.nodeThreeObject(O=>{const B=Z(n).get(O.id)||0,L=Yw(O,B,r(O.id),s);return Zw(O.id,L),L}),f.graphData(e.data)}}),io(()=>{const N=e.selectedNode;ma(()=>{if(!f)return;const P=f.graphData().nodes;if(l){const O=P.find(B=>B.id===l);O&&Jf(O,!1)}if(N){const O=P.find(B=>B.id===N.id);Jf(O,!0)}l=(N==null?void 0:N.id)||null,a=(N==null?void 0:N.id)||null,c=(N==null?void 0:N.id)||null,f.linkColor(u).linkWidth(h)})}),io(()=>{if(!f)return;if(!(e.searchQuery||e.statusFilter.size>0))f.nodeVisibility(()=>!0),f.linkVisibility(()=>!0);else if(f.nodeVisibility(P=>o(P)),f.linkVisibility(P=>{const O=typeof P.source=="object"?P.source:null,B=typeof P.target=="object"?P.target:null;return(O?o(O):!0)&&(B?o(B):!0)}),e.searchQuery){const P=e.searchQuery.toLowerCase(),O=e.data.nodes.filter(B=>B.name.toLowerCase().includes(P)||B.image.toLowerCase().includes(P));if(O.length===1){const B=O[0];if(B.x!==void 0){const F=1+120/Math.hypot(B.x||1,B.y||1,B.z||1);f.cameraPosition({x:B.x*F,y:B.y*F,z:B.z*F},B,800)}}}});function m(){f==null||f.zoomToFit(400)}function v(){f==null||f.cameraPosition({x:0,y:0,z:300},{x:0,y:0,z:0},800)}function y(N){const P=e.data.nodes.find(O=>O.id===N.id);if((P==null?void 0:P.x)!==void 0&&f){const B=1+120/Math.hypot(P.x||1,P.y||1,P.z||1);f.cameraPosition({x:P.x*B,y:P.y*B,z:P.z*B},P,800)}}var x={zoomToFit:m,resetCamera:v,centerOnNode:y},w=kY(),T=fe(w);Np(T,N=>d=N,()=>d);var S=ge(T,2),E=fe(S),M=ge(E,2),b=ge(M,2);{var A=N=>{var P=OY();Et("click",P,()=>y(e.selectedNode)),We(N,P)};At(b,N=>{e.selectedNode&&N(A)})}var D=ge(b,4);return St(()=>Ic(S,`bottom: ${t()+16}px;`)),Et("click",E,m),Et("click",M,v),Et("click",D,function(...N){var P;(P=e.onHelpClick)==null||P.apply(this,N)}),We(i,w),_r(x)}ga(["click"]);function GY(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 VY(i){return new Date(i*1e3).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function HY(i){return(i/1024/1024/1024).toFixed(1)}async function Qw(i,e){try{await navigator.clipboard.writeText(i),na(`Copied ${e}`,"info")}catch{na("Failed to copy","error")}}var WY=Xe('<span class="sparkline-label svelte-1apk6lc"> </span>'),$Y=J1('<path></path><path fill="none" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><circle r="2.5"></circle>',1),qY=J1('<text text-anchor="middle" fill="#3e4a5c" font-size="9">collecting...</text>'),jY=Xe('<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 Jw(i,e){gr(e,!0);let t=ap(e,"width",3,200),n=ap(e,"height",3,32),r=ap(e,"label",3,""),s=ri(()=>{if(e.data.length<2)return"";const w=Math.max(...e.data,1),T=Math.min(...e.data,0),S=w-T||1,E=t()/(e.data.length-1),M=2,b=n()-M*2;return e.data.map((A,D)=>{const N=D*E,P=M+b-(A-T)/S*b;return`${D===0?"M":"L"}${N.toFixed(1)},${P.toFixed(1)}`}).join(" ")}),o=ri(()=>{if(!Z(s))return"";const w=t()/(e.data.length-1);return`${Z(s)} L${((e.data.length-1)*w).toFixed(1)},${n()} L0,${n()} Z`}),a=ri(()=>e.data.length>0?e.data[e.data.length-1]:0),l=ri(()=>{if(e.data.length<2)return{x:0,y:n()/2};const w=Math.max(...e.data,1),T=Math.min(...e.data,0),S=w-T||1,E=2,M=n()-E*2;return{x:t(),y:E+M-(Z(a)-T)/S*M}});const c=`spark-${Math.random().toString(36).slice(2,8)}`;var u=jY(),h=fe(u);{var d=w=>{var T=WY(),S=fe(T);St(()=>rt(S,r())),We(w,T)};At(h,w=>{r()&&w(d)})}var f=ge(h,2),p=fe(f),_=fe(p),g=fe(_),m=ge(g),v=ge(p);{var y=w=>{var T=$Y(),S=qr(T),E=ge(S),M=ge(E);St(()=>{ai(S,"d",Z(o)),ai(S,"fill",`url(#${c})`),ai(E,"d",Z(s)),ai(E,"stroke",e.color),ai(M,"cx",Z(l).x),ai(M,"cy",Z(l).y),ai(M,"fill",e.color)}),We(w,T)},x=w=>{var T=qY();St(()=>{ai(T,"x",t()/2),ai(T,"y",n()/2+4)}),We(w,T)};At(v,w=>{e.data.length>=2?w(y):w(x,-1)})}St(()=>{ai(f,"width",t()),ai(f,"height",n()),ai(f,"viewBox",`0 0 ${t()??""} ${n()??""}`),ai(_,"id",c),ai(g,"stop-color",e.color),ai(m,"stop-color",e.color)}),We(i,u),_r()}var XY=Xe('<div class="info-section"><span class="field-label">Created</span> <span class="mono"> </span></div>'),YY=Xe('<div class="info-section"><span class="field-label">Restart Policy</span> <span class="tag"> </span></div>'),KY=Xe('<span class="tag"> </span>'),ZY=Xe('<div class="info-section"><span class="field-label">Ports</span> <div></div></div>'),QY=Xe('<span class="tag"> </span>'),JY=Xe('<div class="info-section"><span class="field-label">Networks</span> <div></div></div>'),eK=Xe('<div class="info-section sparkline-row"><!></div> <div class="info-section sparkline-row"><!></div>',1),tK=Xe('<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),nK=Xe('<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 iK(i,e){gr(e,!0);let t=ri(()=>e.stats?(e.stats.memory/e.stats.memoryLimit*100).toFixed(1):"0"),n=ri(()=>e.history.map(M=>M.cpu)),r=ri(()=>e.history.map(M=>{var b;return M.memory/(((b=e.stats)==null?void 0:b.memoryLimit)||1)*100}));var s=nK(),o=fe(s),a=ge(fe(o),2),l=fe(a),c=ge(o,2),u=ge(fe(c),2),h=fe(u),d=ge(c,2),f=ge(fe(d),2),p=fe(f),_=ge(d,2);{var g=M=>{var b=XY(),A=ge(fe(b),2),D=fe(A);St(N=>rt(D,N),[()=>GY(e.inspect.created)]),We(M,b)};At(_,M=>{var b;(b=e.inspect)!=null&&b.created&&M(g)})}var m=ge(_,2);{var v=M=>{var b=YY(),A=ge(fe(b),2),D=fe(A);St(()=>rt(D,e.inspect.restartPolicy)),We(M,b)};At(m,M=>{var b;(b=e.inspect)!=null&&b.restartPolicy&&e.inspect.restartPolicy!=="no"&&M(v)})}var y=ge(m,2);{var x=M=>{var b=ZY(),A=ge(fe(b),2);ro(A,21,()=>e.node.ports,al,(D,N)=>{var P=KY(),O=fe(P);St(()=>rt(O,Z(N))),We(D,P)}),We(M,b)};At(y,M=>{e.node.ports.length>0&&M(x)})}var w=ge(y,2);{var T=M=>{var b=JY(),A=ge(fe(b),2);ro(A,21,()=>e.node.networks,al,(D,N)=>{var P=QY(),O=fe(P);St(()=>rt(O,Z(N))),We(D,P)}),We(M,b)};At(w,M=>{e.node.networks.length>0&&M(T)})}var S=ge(w,2);{var E=M=>{var b=tK(),A=qr(b),D=ge(fe(A),2),N=fe(D),P=fe(N),O=ge(N,2),B=fe(O),L=ge(A,2),F=ge(fe(L),2),V=fe(F),ie=fe(V),j=ge(V,2),se=fe(j),ye=ge(F,2),Q=fe(ye),U=ge(L,2),Y=ge(fe(U),2),X=fe(Y),ve=ge(U,2);{var Ee=de=>{var Fe=eK(),ze=qr(Fe),at=fe(ze);Jw(at,{get data(){return Z(n)},color:"#00e4ff",label:"CPU History"});var G=ge(ze,2),Wt=fe(G);Jw(Wt,{get data(){return Z(r)},color:"#a855f7",label:"Memory History"}),We(de,Fe)};At(ve,de=>{Z(n).length>=2&&de(Ee)})}St((de,Fe,ze,at,G,Wt)=>{Ic(P,`width: ${de??""}%`),rt(B,`${Fe??""}%`),Ic(ie,`width: ${Z(t)??""}%`),rt(se,`${Z(t)??""}%`),rt(Q,`${ze??""} / ${at??""}`),rt(X,`${G??""} rx · ${Wt??""} 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)]),We(M,b)};At(S,M=>{e.stats&&e.node.status==="running"&&M(E)})}St(()=>{rt(l,e.node.image),Ti(u,1,`status-text ${e.node.status??""}`),rt(h,`${e.node.status??""}${e.node.health!=="none"?` (${e.node.health})`:""}`),rt(p,e.node.id)}),Et("click",a,()=>Qw(e.node.image,"image")),Et("click",f,()=>Qw(e.node.containerId,"container ID")),We(i,s),_r()}ga(["click"]);const rK=/password|secret|token|key|api_key|apikey|auth|credential/i;function sK(i,e){const t=i.indexOf("=");if(t===-1)return i;const n=i.substring(0,t),r=i.substring(t+1);return rK.test(n)&&!e?`${n}=${"*".repeat(Math.min(r.length,16))}`:i}var oK=Xe('<div class="env-row mono"> </div>'),aK=Xe('<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>'),lK=Xe('<div class="env-row mono"><span style="color: var(--accent-cyan)"> </span> </div>'),cK=Xe('<div class="info-section"><span class="field-label">Labels</span> <div class="env-list"></div></div>'),uK=Xe('<div class="mount-row"><span class="tag"> </span> <span class="mono" style="font-size: 10px;"> <span style="color: var(--text-dim)"> </span></span></div>'),hK=Xe('<div class="info-section"><span class="field-label">Mounts</span> <!></div>'),dK=Xe('<div class="info-section"><span class="field-label">Command</span> <span class="mono"> </span></div>'),fK=Xe('<div class="info-section"><span class="field-label">Working Directory</span> <span class="mono"> </span></div>'),pK=Xe("<!> <!> <!> <!> <!>",1),mK=Xe('<div class="env-loading">Loading configuration...</div>'),gK=Xe('<div class="sidebar-content"><!></div>');function _K(i,e){gr(e,!0);let t=Tt(!1);var n=gK(),r=fe(n);{var s=a=>{var l=pK(),c=qr(l);{var u=x=>{var w=aK(),T=fe(w),S=ge(fe(T),2),E=fe(S),M=ge(T,2);ro(M,21,()=>e.inspect.env,al,(b,A)=>{var D=oK(),N=fe(D);St(P=>rt(N,P),[()=>sK(Z(A),Z(t))]),We(b,D)}),St(()=>rt(E,Z(t)?"Hide":"Reveal")),Et("click",S,()=>Ue(t,!Z(t))),We(x,w)};At(c,x=>{e.inspect.env.length>0&&x(u)})}var h=ge(c,2);{var d=x=>{var w=cK(),T=ge(fe(w),2);ro(T,21,()=>Object.entries(e.inspect.labels),al,(S,E)=>{var M=ri(()=>s2(Z(E),2));let b=()=>Z(M)[0],A=()=>Z(M)[1];var D=lK(),N=fe(D),P=fe(N),O=ge(N);St(()=>{rt(P,b()),rt(O,`=${A()??""}`)}),We(S,D)}),We(x,w)},f=ri(()=>Object.keys(e.inspect.labels).length>0);At(h,x=>{Z(f)&&x(d)})}var p=ge(h,2);{var _=x=>{var w=hK(),T=ge(fe(w),2);ro(T,17,()=>e.inspect.mounts,al,(S,E)=>{var M=uK(),b=fe(M),A=fe(b),D=ge(b,2),N=fe(D),P=ge(N),O=fe(P);St(()=>{rt(A,Z(E).type),rt(N,`${Z(E).source??""} → ${Z(E).destination??""} `),rt(O,`(${Z(E).mode??""})`)}),We(S,M)}),We(x,w)};At(p,x=>{e.inspect.mounts.length>0&&x(_)})}var g=ge(p,2);{var m=x=>{var w=dK(),T=ge(fe(w),2),S=fe(T);St(E=>rt(S,E),[()=>e.inspect.cmd.join(" ")]),We(x,w)};At(g,x=>{e.inspect.cmd&&x(m)})}var v=ge(g,2);{var y=x=>{var w=fK(),T=ge(fe(w),2),S=fe(T);St(()=>rt(S,e.inspect.workingDir)),We(x,w)};At(v,x=>{e.inspect.workingDir&&e.inspect.workingDir!=="/"&&x(y)})}We(a,l)},o=a=>{var l=mK();We(a,l)};At(r,a=>{e.inspect?a(s):a(o,-1)})}We(i,n),_r()}ga(["click"]);const e1={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"},t1={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 _v(i){return i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}const vK=/\d{4}-\d{2}-\d{2}T(\d{2}:\d{2}:\d{2})\.\d+Z/g;function yK(i){return i.replace(vK,'<span style="color:#5a6578">$1</span>')}function xK(i){if(!i)return"";if(!i.includes("\x1B")&&!i.includes("\x1B"))return _v(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(_v(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=e1[_]||null;else if(_>=90&&_<=97)t=e1[_]||null;else if(_>=40&&_<=47)n=t1[_]||null;else if(_>=100&&_<=107)n=t1[_]||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(_v(i.slice(h))),l&&e.push("</span>"),SK(yK(e.join("")))}const bK=[[/^(.*(?: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 SK(i){return i.split(`
4833
4833
  `).map(e=>{for(const[t,n]of bK)if(t.lastIndex=0,t.test(e))return t.lastIndex=0,e.replace(t,n);return e}).join(`
4834
- `)}function MK(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 TK=Xe('<span class="log-match-count"> </span>'),wK=Xe('<div class="log-search-bar"><input type="text" class="log-search-input" placeholder="Search logs..."/> <!></div> <div class="sidebar-logs"><pre><!><div></div></pre></div>',1);function EK(i,e){gr(e,!0);const t=iE();let n=Tt(null),r=Tt(""),s=ri(()=>xK(t.streamingLogs)),o=ri(()=>Z(r)?MK(Z(s),Z(r)):{html:Z(s),count:0});io(()=>{t.streamingLogs&&Z(n)&&Z(n).scrollIntoView({behavior:"smooth"})});var a=wK(),l=qr(a),c=fe(l),u=ge(c,2);{var h=g=>{var m=TK(),v=fe(m);St(()=>rt(v,`${Z(o).count??""} match${Z(o).count!==1?"es":""}`)),We(g,m)};At(u,g=>{Z(r)&&g(h)})}var d=ge(l,2),f=fe(d),p=fe(f);MP(p,()=>Z(o).html||'<span style="color:var(--text-dim);font-style:italic">Connecting to log stream...</span>');var _=ge(p);Np(_,g=>Ue(n,g),()=>Z(n)),eE(c,()=>Z(r),g=>Ue(r,g)),We(i,a),_r()}var AK=Xe('<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>'),CK=Xe('<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),RK=Xe('<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>'),NK=Xe('<div class="sidebar-header"><div class="sidebar-title"><span></span> <h3> </h3></div> <div class="header-right"><!> <span class="header-sep"></span> <button class="close-btn">&times;</button></div></div> <div class="sidebar-tabs"><button>Info</button> <button>Env</button> <button>Logs</button></div> <!>',1),PK=Xe('<div class="sidebar"><!></div>');function DK(i,e){gr(e,!0);let t=Tt(null),n=Tt(null),r=Tt(Zi([])),s=Tt("info"),o=Tt(!1);async function a(d){if(!(!e.node||Z(o))){Ue(o,!0);try{const f=await fetch(`/api/containers/${e.node.containerId}/${d}`,{method:"POST"});if(f.ok)na(`Container ${d}ed`,"success");else{const p=await f.json();na(`Failed to ${d}: ${p.error}`,"error")}}catch{na(`Failed to ${d}`,"error")}finally{Ue(o,!1)}}}io(()=>{e.node&&(Ue(s,"info"),Ue(n,null),Ue(r,[],!0),e.node.status==="running"?(fetch(`/api/containers/${e.node.containerId}/stats`).then(d=>d.json()).then(d=>Ue(t,d,!0)).catch(()=>Ue(t,null)),fetch(`/api/containers/${e.node.containerId}/history`).then(d=>d.json()).then(d=>Ue(r,d,!0)).catch(()=>Ue(r,[],!0))):Ue(t,null),fetch(`/api/containers/${e.node.containerId}/inspect`).then(d=>d.json()).then(d=>Ue(n,d,!0)).catch(()=>Ue(n,null)))}),io(()=>{const d=Z(s),f=e.node;ma(()=>{d==="logs"&&f?BP(f.containerId):Fv()})}),PP(()=>Fv());var l=PK(),c=fe(l);{var u=d=>{var f=AK();We(d,f)},h=d=>{var f=NK(),p=qr(f),_=fe(p),g=fe(_),m=ge(g,2),v=fe(m),y=ge(_,2),x=fe(y);{var w=B=>{var L=CK(),F=qr(L);let V;var ie=ge(F,2);St(()=>{V=Ti(F,1,"act-icon",null,V,{spinning:Z(o)}),F.disabled=Z(o),ie.disabled=Z(o)}),Et("click",F,()=>a("restart")),Et("click",ie,()=>a("stop")),We(B,L)},T=B=>{var L=RK();St(()=>L.disabled=Z(o)),Et("click",L,()=>a("start")),We(B,L)};At(x,B=>{e.node.status==="running"?B(w):B(T,-1)})}var S=ge(x,4),E=ge(p,2),M=fe(E),b=ge(M,2),A=ge(b,2),D=ge(E,2);{var N=B=>{iK(B,{get node(){return e.node},get stats(){return Z(t)},get inspect(){return Z(n)},get history(){return Z(r)}})},P=B=>{_K(B,{get inspect(){return Z(n)}})},O=B=>{EK(B,{})};At(D,B=>{Z(s)==="info"?B(N):Z(s)==="env"?B(P,1):B(O,-1)})}St(()=>{Ti(g,1,`status-dot ${e.node.status==="running"?e.node.health==="unhealthy"?"unhealthy":"running":"exited"}`),rt(v,e.node.name),Ti(M,1,`tab ${Z(s)==="info"?"active":""}`),Ti(b,1,`tab ${Z(s)==="env"?"active":""}`),Ti(A,1,`tab ${Z(s)==="logs"?"active":""}`)}),Et("click",S,function(...B){var L;(L=e.onClose)==null||L.apply(this,B)}),Et("click",M,()=>Ue(s,"info")),Et("click",b,()=>Ue(s,"env")),Et("click",A,()=>Ue(s,"logs")),We(d,f)};At(c,d=>{e.node?d(h,-1):d(u)})}We(i,l),_r()}ga(["click"]);var IK=Xe('<span class="status-chip svelte-1rygals"><span class="dot gray"></span> </span>'),LK=Xe('<span class="status-chip svelte-1rygals"><span class="dot red"></span> </span>'),FK=Xe('<span class="status-chip svelte-1rygals"><span class="dot green"></span> </span> <!> <!>',1),UK=Xe('<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),BK=Xe('<div class="event-empty svelte-1rygals">Listening for Docker events...</div>'),OK=Xe('<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>'),kK=Xe('<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 zK(i,e){gr(e,!0);let t=Tt(null),n=Tt(!0),r=ri(()=>e.graph.nodes.filter(E=>E.status==="running").length),s=ri(()=>e.graph.nodes.filter(E=>E.status!=="running").length),o=ri(()=>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(M=>E.startsWith(M))}let c=ri(()=>Z(n)?e.events.filter(E=>!l(E.action)):e.events);fd(()=>{fetch("/api/system").then(E=>E.json()).then(E=>Ue(t,E,!0)).catch(()=>{})});var u=kK(),h=fe(u),d=fe(h),f=fe(d);{var p=E=>{var M=FK(),b=qr(M),A=ge(fe(b)),D=ge(b,2);{var N=B=>{var L=IK(),F=ge(fe(L));St(()=>rt(F,` ${Z(s)??""} stopped`)),We(B,L)};At(D,B=>{Z(s)>0&&B(N)})}var P=ge(D,2);{var O=B=>{var L=LK(),F=ge(fe(L));St(()=>rt(F,` ${Z(o)??""} unhealthy`)),We(B,L)};At(P,B=>{Z(o)>0&&B(O)})}St(()=>rt(A,` ${Z(r)??""} running`)),We(E,M)};At(f,E=>{e.graph.nodes.length>0&&E(p)})}var _=ge(f,2);{var g=E=>{var M=UK(),b=ge(qr(M),2),A=fe(b),D=ge(b,2),N=fe(D),P=ge(D,2),O=fe(P);St(B=>{rt(A,`Docker ${Z(t).dockerVersion??""}`),rt(N,`${Z(t).cpus??""} CPUs`),rt(O,`${B??""} GB`)},[()=>HY(Z(t).totalMemory)]),We(E,M)};At(_,E=>{Z(t)&&E(g)})}var m=ge(d,2),v=fe(m);let y;var x=ge(h,2),w=fe(x);{var T=E=>{var M=BK();We(E,M)};At(w,E=>{Z(c).length===0&&E(T)})}var S=ge(w,2);ro(S,19,()=>Z(c).slice(0,50),(E,M)=>E.time+"-"+M,(E,M)=>{var b=OK(),A=fe(b),D=fe(A),N=ge(A,2),P=fe(N),O=ge(N,2),B=fe(O),L=ge(O,2),F=fe(L);St(V=>{rt(D,V),Ti(N,1,`event-action ${Z(M).action??""}`,"svelte-1rygals"),rt(P,Z(M).action),rt(B,Z(M).actor),rt(F,Z(M).type)},[()=>VY(Z(M).time)]),We(E,b)}),St(()=>y=Ti(v,1,"healthcheck-toggle svelte-1rygals",null,y,{active:Z(n)})),Et("click",v,()=>Ue(n,!Z(n))),We(i,u),_r()}ga(["click"]);var GK=Xe('<div class="kbd-row svelte-c0hob1"><kbd class="svelte-c0hob1"> </kbd> <span> </span></div>'),VK=Xe('<div class="kbd-overlay svelte-c0hob1"><div class="kbd-panel svelte-c0hob1"><div class="kbd-title svelte-c0hob1">Keyboard Shortcuts</div> <!></div></div>');function HK(i,e){gr(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=VK(),r=fe(n),s=ge(fe(r),2);ro(s,17,()=>t,al,(o,a)=>{var l=GK(),c=fe(l),u=fe(c),h=ge(c,2),d=fe(h);St(()=>{rt(u,Z(a).key),rt(d,Z(a).desc)}),We(o,l)}),Et("click",n,function(...o){var a;(a=e.onClose)==null||a.apply(this,o)}),Et("keydown",n,o=>o.key==="Escape"&&e.onClose()),Et("click",r,o=>o.stopPropagation()),Et("keydown",r,()=>{}),We(i,n),_r()}ga(["click","keydown"]);var WK=Xe('<div class="pm-loading svelte-ucg24v">Loading projects...</div>'),$K=Xe('<div class="pm-empty svelte-ucg24v">No compose projects found</div>'),qK=Xe('<span class="pm-count running svelte-ucg24v"> </span>'),jK=Xe('<span class="pm-count stopped svelte-ucg24v"> </span>'),XK=Xe('<button class="pm-btn up svelte-ucg24v" title="Up (start all)"> </button>'),YK=Xe('<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),KK=Xe('<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>'),ZK=Xe('<div class="pm-list svelte-ucg24v"></div>'),QK=Xe('<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">&times;</button></div> <!></div></div>');function JK(i,e){gr(e,!0);let t=Tt(Zi([])),n=Tt(!0),r=Tt(null);fd(()=>{s()});async function s(){Ue(n,!0);try{const g=await fetch("/api/projects");Ue(t,await g.json(),!0)}catch{Ue(t,[],!0)}finally{Ue(n,!1)}}async function o(g,m){Ue(r,`${g}:${m}`);try{const v=await fetch(`/api/projects/${g}/${m}`,{method:"POST"});if(v.ok)na(`${g}: ${m} done`,"success"),setTimeout(s,1500);else{const y=await v.json();na(`${g}: ${y.error}`,"error")}}catch{na(`${g}: ${m} failed`,"error")}finally{Ue(r,null)}}function a(g,m){return Z(r)===`${g}:${m}`}var l=QK(),c=fe(l),u=fe(c),h=ge(fe(u),2),d=ge(u,2);{var f=g=>{var m=WK();We(g,m)},p=g=>{var m=$K();We(g,m)},_=g=>{var m=ZK();ro(m,21,()=>Z(t),al,(v,y)=>{var x=KK(),w=fe(x),T=fe(w),S=fe(T),E=ge(T,2),M=fe(E);{var b=F=>{var V=qK(),ie=fe(V);St(()=>rt(ie,`${Z(y).running??""} up`)),We(F,V)};At(M,F=>{Z(y).running>0&&F(b)})}var A=ge(M,2);{var D=F=>{var V=jK(),ie=fe(V);St(()=>rt(ie,`${Z(y).stopped??""} down`)),We(F,V)};At(A,F=>{Z(y).stopped>0&&F(D)})}var N=ge(w,2),P=fe(N);{var O=F=>{var V=XK(),ie=fe(V);St(j=>{V.disabled=!!Z(r),rt(ie,j)},[()=>a(Z(y).name,"up")?"...":"Up"]),Et("click",V,()=>o(Z(y).name,"up")),We(F,V)};At(P,F=>{Z(y).running===0&&F(O)})}var B=ge(P,2);{var L=F=>{var V=YK(),ie=qr(V),j=fe(ie),se=ge(ie,2),ye=fe(se),Q=ge(se,2),U=fe(Q);St((Y,X,ve)=>{ie.disabled=!!Z(r),rt(j,Y),se.disabled=!!Z(r),rt(ye,X),Q.disabled=!!Z(r),rt(U,ve)},[()=>a(Z(y).name,"restart")?"...":"Restart",()=>a(Z(y).name,"stop")?"...":"Stop",()=>a(Z(y).name,"down")?"...":"Down"]),Et("click",ie,()=>o(Z(y).name,"restart")),Et("click",se,()=>o(Z(y).name,"stop")),Et("click",Q,()=>o(Z(y).name,"down")),We(F,V)};At(B,F=>{Z(y).running>0&&F(L)})}St(()=>rt(S,Z(y).name)),We(v,x)}),We(g,m)};At(d,g=>{Z(n)?g(f):Z(t).length===0?g(p,1):g(_,-1)})}Et("click",l,function(...g){var m;(m=e.onClose)==null||m.apply(this,g)}),Et("keydown",l,g=>g.key==="Escape"&&e.onClose()),Et("click",c,g=>g.stopPropagation()),Et("keydown",c,()=>{}),Et("click",h,function(...g){var m;(m=e.onClose)==null||m.apply(this,g)}),We(i,l),_r()}ga(["click","keydown"]);C2();var eZ=Xe('<div><span class="toast-dot svelte-1eookdc"></span> <span class="toast-msg"> </span></div>'),tZ=Xe('<div class="toast-container svelte-1eookdc"></div>');function nZ(i,e){gr(e,!1);const t=FP();NP();var n=mP(),r=qr(n);{var s=o=>{var a=tZ();ro(a,5,()=>t.list,l=>l.id,(l,c)=>{var u=eZ(),h=ge(fe(u),2),d=fe(h);St(()=>{Ti(u,1,`toast toast-${Z(c).type??""}`,"svelte-1eookdc"),rt(d,Z(c).message)}),We(l,u)}),We(o,a)};At(r,o=>{t.list.length>0&&o(s)})}We(i,n),_r()}var iZ=Xe('<button class="search-clear">&times;</button>'),rZ=Xe('<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>'),sZ=Xe('<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>'),oZ=Xe('<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 aZ(i,e){gr(e,!0);const t=iE();let n=Tt(null),r=Tt(""),s=Tt(Zi(new Set)),o=Tt(!1),a=Tt(!1),l=Tt(null),c,u=Tt(Zi(Il.sidebar.default)),h=Tt(Zi(Il.statusbar.default)),d=Tt(null);fd(()=>UP());function f(de){var at,G,Wt;const Fe=(at=de.target)==null?void 0:at.tagName,ze=Fe==="INPUT"||Fe==="TEXTAREA";if(de.key==="Escape"){if(Z(o)){Ue(o,!1);return}if(Z(r)){Ue(r,""),(G=Z(l))==null||G.blur();return}if(Z(n)){Ue(n,null);return}}ze||(de.key==="/"||de.key==="k"&&(de.metaKey||de.ctrlKey)?(de.preventDefault(),(Wt=Z(l))==null||Wt.focus()):de.key==="f"||de.key==="F"?c==null||c.zoomToFit():de.key==="r"||de.key==="R"?c==null||c.resetCamera():de.key==="?"&&Ue(o,!Z(o)))}function p(de){Ue(d,de,!0);const Fe=at=>{if(de==="sidebar"){const G=window.innerWidth-at.clientX;Ue(u,Math.max(Il.sidebar.min,Math.min(Il.sidebar.max,G)),!0)}else{const G=window.innerHeight-at.clientY;Ue(h,Math.max(Il.statusbar.min,Math.min(Il.statusbar.max,G)),!0)}},ze=()=>{Ue(d,null),window.removeEventListener("mousemove",Fe),window.removeEventListener("mouseup",ze)};window.addEventListener("mousemove",Fe),window.addEventListener("mouseup",ze)}var _=oZ();dP("keydown",Cv,f);let g;var m=fe(_),v=fe(m);Np(zY(v,{get data(){return t.graph},onNodeClick:de=>Ue(n,de,!0),get selectedNode(){return Z(n)},get searchQuery(){return Z(r)},get statusFilter(){return Z(s)},onHelpClick:()=>Ue(o,!Z(o)),get statusbarHeight(){return Z(h)}}),de=>c=de,()=>c);var y=ge(m,2),x=fe(y),w=ge(fe(x),2);w.textContent="v0.2.3";var T=ge(x,2),S=fe(T),E=ge(fe(S)),M=ge(S,2),b=ge(T,2),A=fe(b),D=ge(fe(A),2);Np(D,de=>Ue(l,de),()=>Z(l));var N=ge(D,2);{var P=de=>{var Fe=iZ();Et("click",Fe,()=>{var ze;Ue(r,""),(ze=Z(l))==null||ze.blur()}),We(de,Fe)};At(N,de=>{Z(r)&&de(P)})}var O=ge(b,2);{var B=de=>{var Fe=rZ(),ze=fe(Fe);let at;var G=ge(ze,2);let Wt;var nt=ge(G,2);let Je;St((Re,jt,Ye)=>{at=Ti(ze,1,"filter-chip",null,at,Re),Wt=Ti(G,1,"filter-chip",null,Wt,jt),Je=Ti(nt,1,"filter-chip",null,Je,Ye)},[()=>({active:Z(s).has("running")}),()=>({active:Z(s).has("stopped")}),()=>({active:Z(s).has("unhealthy")})]),Et("click",ze,()=>{const Re=new Set(Z(s));Re.has("running")?Re.delete("running"):Re.add("running"),Ue(s,Re,!0)}),Et("click",G,()=>{const Re=new Set(Z(s));Re.has("stopped")?Re.delete("stopped"):Re.add("stopped"),Ue(s,Re,!0)}),Et("click",nt,()=>{const Re=new Set(Z(s));Re.has("unhealthy")?Re.delete("unhealthy"):Re.add("unhealthy"),Ue(s,Re,!0)}),We(de,Fe)};At(O,de=>{t.graph.nodes.length>0&&de(B)})}var L=ge(y,2);{var F=de=>{var Fe=sZ();We(de,Fe)};At(L,de=>{t.connected&&t.graph.nodes.length===0&&de(F)})}var V=ge(L,2),ie=fe(V),j=ge(ie,2);DK(j,{get node(){return Z(n)},onClose:()=>Ue(n,null)});var se=ge(V,2),ye=fe(se),Q=ge(ye,2);zK(Q,{get events(){return t.events},get graph(){return t.graph}});var U=ge(se,2);nZ(U,{});var Y=ge(U,2);{var X=de=>{HK(de,{onClose:()=>Ue(o,!1)})};At(Y,de=>{Z(o)&&de(X)})}var ve=ge(Y,2);{var Ee=de=>{JK(de,{onClose:()=>Ue(a,!1)})};At(ve,de=>{Z(a)&&de(Ee)})}St(()=>{g=Ti(_,1,"app",null,g,{"is-dragging":Z(d)!==null}),Ic(_,`--sidebar-w: ${Z(u)??""}px; --statusbar-h: ${Z(h)??""}px;`),Ti(S,1,`hud-connection ${t.connected?"active":"disconnected"}`),rt(E,` ${t.connected?"Live":"Offline"}`),Ic(V,`width: ${Z(u)??""}px;`),Ic(se,`height: ${Z(h)??""}px; right: ${Z(u)??""}px;`)}),Et("click",M,()=>Ue(a,!0)),eE(D,()=>Z(r),de=>Ue(r,de)),Et("mousedown",ie,()=>p("sidebar")),Et("mousedown",ye,()=>p("statusbar")),We(i,_),_r()}ga(["click","mousedown"]);gP(aZ,{target:document.getElementById("root")});
4834
+ `)}function MK(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 TK=Xe('<span class="log-match-count"> </span>'),wK=Xe('<div class="log-search-bar"><input type="text" class="log-search-input" placeholder="Search logs..."/> <!></div> <div class="sidebar-logs"><pre><!><div></div></pre></div>',1);function EK(i,e){gr(e,!0);const t=iE();let n=Tt(null),r=Tt(""),s=ri(()=>xK(t.streamingLogs)),o=ri(()=>Z(r)?MK(Z(s),Z(r)):{html:Z(s),count:0});io(()=>{t.streamingLogs&&Z(n)&&Z(n).scrollIntoView({behavior:"smooth"})});var a=wK(),l=qr(a),c=fe(l),u=ge(c,2);{var h=g=>{var m=TK(),v=fe(m);St(()=>rt(v,`${Z(o).count??""} match${Z(o).count!==1?"es":""}`)),We(g,m)};At(u,g=>{Z(r)&&g(h)})}var d=ge(l,2),f=fe(d),p=fe(f);MP(p,()=>Z(o).html||'<span style="color:var(--text-dim);font-style:italic">Connecting to log stream...</span>');var _=ge(p);Np(_,g=>Ue(n,g),()=>Z(n)),eE(c,()=>Z(r),g=>Ue(r,g)),We(i,a),_r()}var AK=Xe('<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>'),CK=Xe('<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),RK=Xe('<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>'),NK=Xe('<div class="sidebar-header"><div class="sidebar-title"><span></span> <h3> </h3></div> <div class="header-right"><!> <span class="header-sep"></span> <button class="close-btn">&times;</button></div></div> <div class="sidebar-tabs"><button>Info</button> <button>Env</button> <button>Logs</button></div> <!>',1),PK=Xe('<div class="sidebar"><!></div>');function DK(i,e){gr(e,!0);let t=Tt(null),n=Tt(null),r=Tt(Zi([])),s=Tt("info"),o=Tt(!1);async function a(d){if(!(!e.node||Z(o))){Ue(o,!0);try{const f=await fetch(`/api/containers/${e.node.containerId}/${d}`,{method:"POST"});if(f.ok)na(`Container ${d}ed`,"success");else{const p=await f.json();na(`Failed to ${d}: ${p.error}`,"error")}}catch{na(`Failed to ${d}`,"error")}finally{Ue(o,!1)}}}io(()=>{e.node&&(Ue(s,"info"),Ue(n,null),Ue(r,[],!0),e.node.status==="running"?(fetch(`/api/containers/${e.node.containerId}/stats`).then(d=>d.json()).then(d=>Ue(t,d,!0)).catch(()=>Ue(t,null)),fetch(`/api/containers/${e.node.containerId}/history`).then(d=>d.json()).then(d=>Ue(r,d,!0)).catch(()=>Ue(r,[],!0))):Ue(t,null),fetch(`/api/containers/${e.node.containerId}/inspect`).then(d=>d.json()).then(d=>Ue(n,d,!0)).catch(()=>Ue(n,null)))}),io(()=>{const d=Z(s),f=e.node;ma(()=>{d==="logs"&&f?BP(f.containerId):Fv()})}),PP(()=>Fv());var l=PK(),c=fe(l);{var u=d=>{var f=AK();We(d,f)},h=d=>{var f=NK(),p=qr(f),_=fe(p),g=fe(_),m=ge(g,2),v=fe(m),y=ge(_,2),x=fe(y);{var w=B=>{var L=CK(),F=qr(L);let V;var ie=ge(F,2);St(()=>{V=Ti(F,1,"act-icon",null,V,{spinning:Z(o)}),F.disabled=Z(o),ie.disabled=Z(o)}),Et("click",F,()=>a("restart")),Et("click",ie,()=>a("stop")),We(B,L)},T=B=>{var L=RK();St(()=>L.disabled=Z(o)),Et("click",L,()=>a("start")),We(B,L)};At(x,B=>{e.node.status==="running"?B(w):B(T,-1)})}var S=ge(x,4),E=ge(p,2),M=fe(E),b=ge(M,2),A=ge(b,2),D=ge(E,2);{var N=B=>{iK(B,{get node(){return e.node},get stats(){return Z(t)},get inspect(){return Z(n)},get history(){return Z(r)}})},P=B=>{_K(B,{get inspect(){return Z(n)}})},O=B=>{EK(B,{})};At(D,B=>{Z(s)==="info"?B(N):Z(s)==="env"?B(P,1):B(O,-1)})}St(()=>{Ti(g,1,`status-dot ${e.node.status==="running"?e.node.health==="unhealthy"?"unhealthy":"running":"exited"}`),rt(v,e.node.name),Ti(M,1,`tab ${Z(s)==="info"?"active":""}`),Ti(b,1,`tab ${Z(s)==="env"?"active":""}`),Ti(A,1,`tab ${Z(s)==="logs"?"active":""}`)}),Et("click",S,function(...B){var L;(L=e.onClose)==null||L.apply(this,B)}),Et("click",M,()=>Ue(s,"info")),Et("click",b,()=>Ue(s,"env")),Et("click",A,()=>Ue(s,"logs")),We(d,f)};At(c,d=>{e.node?d(h,-1):d(u)})}We(i,l),_r()}ga(["click"]);var IK=Xe('<span class="status-chip svelte-1rygals"><span class="dot gray"></span> </span>'),LK=Xe('<span class="status-chip svelte-1rygals"><span class="dot red"></span> </span>'),FK=Xe('<span class="status-chip svelte-1rygals"><span class="dot green"></span> </span> <!> <!>',1),UK=Xe('<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),BK=Xe('<div class="event-empty svelte-1rygals">Listening for Docker events...</div>'),OK=Xe('<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>'),kK=Xe('<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 zK(i,e){gr(e,!0);let t=Tt(null),n=Tt(!0),r=ri(()=>e.graph.nodes.filter(E=>E.status==="running").length),s=ri(()=>e.graph.nodes.filter(E=>E.status!=="running").length),o=ri(()=>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(M=>E.startsWith(M))}let c=ri(()=>Z(n)?e.events.filter(E=>!l(E.action)):e.events);fd(()=>{fetch("/api/system").then(E=>E.json()).then(E=>Ue(t,E,!0)).catch(()=>{})});var u=kK(),h=fe(u),d=fe(h),f=fe(d);{var p=E=>{var M=FK(),b=qr(M),A=ge(fe(b)),D=ge(b,2);{var N=B=>{var L=IK(),F=ge(fe(L));St(()=>rt(F,` ${Z(s)??""} stopped`)),We(B,L)};At(D,B=>{Z(s)>0&&B(N)})}var P=ge(D,2);{var O=B=>{var L=LK(),F=ge(fe(L));St(()=>rt(F,` ${Z(o)??""} unhealthy`)),We(B,L)};At(P,B=>{Z(o)>0&&B(O)})}St(()=>rt(A,` ${Z(r)??""} running`)),We(E,M)};At(f,E=>{e.graph.nodes.length>0&&E(p)})}var _=ge(f,2);{var g=E=>{var M=UK(),b=ge(qr(M),2),A=fe(b),D=ge(b,2),N=fe(D),P=ge(D,2),O=fe(P);St(B=>{rt(A,`Docker ${Z(t).dockerVersion??""}`),rt(N,`${Z(t).cpus??""} CPUs`),rt(O,`${B??""} GB`)},[()=>HY(Z(t).totalMemory)]),We(E,M)};At(_,E=>{Z(t)&&E(g)})}var m=ge(d,2),v=fe(m);let y;var x=ge(h,2),w=fe(x);{var T=E=>{var M=BK();We(E,M)};At(w,E=>{Z(c).length===0&&E(T)})}var S=ge(w,2);ro(S,19,()=>Z(c).slice(0,50),(E,M)=>E.time+"-"+M,(E,M)=>{var b=OK(),A=fe(b),D=fe(A),N=ge(A,2),P=fe(N),O=ge(N,2),B=fe(O),L=ge(O,2),F=fe(L);St(V=>{rt(D,V),Ti(N,1,`event-action ${Z(M).action??""}`,"svelte-1rygals"),rt(P,Z(M).action),rt(B,Z(M).actor),rt(F,Z(M).type)},[()=>VY(Z(M).time)]),We(E,b)}),St(()=>y=Ti(v,1,"healthcheck-toggle svelte-1rygals",null,y,{active:Z(n)})),Et("click",v,()=>Ue(n,!Z(n))),We(i,u),_r()}ga(["click"]);var GK=Xe('<div class="kbd-row svelte-c0hob1"><kbd class="svelte-c0hob1"> </kbd> <span> </span></div>'),VK=Xe('<div class="kbd-overlay svelte-c0hob1"><div class="kbd-panel svelte-c0hob1"><div class="kbd-title svelte-c0hob1">Keyboard Shortcuts</div> <!></div></div>');function HK(i,e){gr(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=VK(),r=fe(n),s=ge(fe(r),2);ro(s,17,()=>t,al,(o,a)=>{var l=GK(),c=fe(l),u=fe(c),h=ge(c,2),d=fe(h);St(()=>{rt(u,Z(a).key),rt(d,Z(a).desc)}),We(o,l)}),Et("click",n,function(...o){var a;(a=e.onClose)==null||a.apply(this,o)}),Et("keydown",n,o=>o.key==="Escape"&&e.onClose()),Et("click",r,o=>o.stopPropagation()),Et("keydown",r,()=>{}),We(i,n),_r()}ga(["click","keydown"]);var WK=Xe('<div class="pm-loading svelte-ucg24v">Loading projects...</div>'),$K=Xe('<div class="pm-empty svelte-ucg24v">No compose projects found</div>'),qK=Xe('<span class="pm-count running svelte-ucg24v"> </span>'),jK=Xe('<span class="pm-count stopped svelte-ucg24v"> </span>'),XK=Xe('<button class="pm-btn up svelte-ucg24v" title="Up (start all)"> </button>'),YK=Xe('<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),KK=Xe('<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>'),ZK=Xe('<div class="pm-list svelte-ucg24v"></div>'),QK=Xe('<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">&times;</button></div> <!></div></div>');function JK(i,e){gr(e,!0);let t=Tt(Zi([])),n=Tt(!0),r=Tt(null);fd(()=>{s()});async function s(){Ue(n,!0);try{const g=await fetch("/api/projects");Ue(t,await g.json(),!0)}catch{Ue(t,[],!0)}finally{Ue(n,!1)}}async function o(g,m){Ue(r,`${g}:${m}`);try{const v=await fetch(`/api/projects/${g}/${m}`,{method:"POST"});if(v.ok)na(`${g}: ${m} done`,"success"),setTimeout(s,1500);else{const y=await v.json();na(`${g}: ${y.error}`,"error")}}catch{na(`${g}: ${m} failed`,"error")}finally{Ue(r,null)}}function a(g,m){return Z(r)===`${g}:${m}`}var l=QK(),c=fe(l),u=fe(c),h=ge(fe(u),2),d=ge(u,2);{var f=g=>{var m=WK();We(g,m)},p=g=>{var m=$K();We(g,m)},_=g=>{var m=ZK();ro(m,21,()=>Z(t),al,(v,y)=>{var x=KK(),w=fe(x),T=fe(w),S=fe(T),E=ge(T,2),M=fe(E);{var b=F=>{var V=qK(),ie=fe(V);St(()=>rt(ie,`${Z(y).running??""} up`)),We(F,V)};At(M,F=>{Z(y).running>0&&F(b)})}var A=ge(M,2);{var D=F=>{var V=jK(),ie=fe(V);St(()=>rt(ie,`${Z(y).stopped??""} down`)),We(F,V)};At(A,F=>{Z(y).stopped>0&&F(D)})}var N=ge(w,2),P=fe(N);{var O=F=>{var V=XK(),ie=fe(V);St(j=>{V.disabled=!!Z(r),rt(ie,j)},[()=>a(Z(y).name,"up")?"...":"Up"]),Et("click",V,()=>o(Z(y).name,"up")),We(F,V)};At(P,F=>{Z(y).running===0&&F(O)})}var B=ge(P,2);{var L=F=>{var V=YK(),ie=qr(V),j=fe(ie),se=ge(ie,2),ye=fe(se),Q=ge(se,2),U=fe(Q);St((Y,X,ve)=>{ie.disabled=!!Z(r),rt(j,Y),se.disabled=!!Z(r),rt(ye,X),Q.disabled=!!Z(r),rt(U,ve)},[()=>a(Z(y).name,"restart")?"...":"Restart",()=>a(Z(y).name,"stop")?"...":"Stop",()=>a(Z(y).name,"down")?"...":"Down"]),Et("click",ie,()=>o(Z(y).name,"restart")),Et("click",se,()=>o(Z(y).name,"stop")),Et("click",Q,()=>o(Z(y).name,"down")),We(F,V)};At(B,F=>{Z(y).running>0&&F(L)})}St(()=>rt(S,Z(y).name)),We(v,x)}),We(g,m)};At(d,g=>{Z(n)?g(f):Z(t).length===0?g(p,1):g(_,-1)})}Et("click",l,function(...g){var m;(m=e.onClose)==null||m.apply(this,g)}),Et("keydown",l,g=>g.key==="Escape"&&e.onClose()),Et("click",c,g=>g.stopPropagation()),Et("keydown",c,()=>{}),Et("click",h,function(...g){var m;(m=e.onClose)==null||m.apply(this,g)}),We(i,l),_r()}ga(["click","keydown"]);C2();var eZ=Xe('<div><span class="toast-dot svelte-1eookdc"></span> <span class="toast-msg"> </span></div>'),tZ=Xe('<div class="toast-container svelte-1eookdc"></div>');function nZ(i,e){gr(e,!1);const t=FP();NP();var n=mP(),r=qr(n);{var s=o=>{var a=tZ();ro(a,5,()=>t.list,l=>l.id,(l,c)=>{var u=eZ(),h=ge(fe(u),2),d=fe(h);St(()=>{Ti(u,1,`toast toast-${Z(c).type??""}`,"svelte-1eookdc"),rt(d,Z(c).message)}),We(l,u)}),We(o,a)};At(r,o=>{t.list.length>0&&o(s)})}We(i,n),_r()}var iZ=Xe('<button class="search-clear">&times;</button>'),rZ=Xe('<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>'),sZ=Xe('<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>'),oZ=Xe('<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 aZ(i,e){gr(e,!0);const t=iE();let n=Tt(null),r=Tt(""),s=Tt(Zi(new Set)),o=Tt(!1),a=Tt(!1),l=Tt(null),c,u=Tt(Zi(Il.sidebar.default)),h=Tt(Zi(Il.statusbar.default)),d=Tt(null);fd(()=>UP());function f(de){var at,G,Wt;const Fe=(at=de.target)==null?void 0:at.tagName,ze=Fe==="INPUT"||Fe==="TEXTAREA";if(de.key==="Escape"){if(Z(o)){Ue(o,!1);return}if(Z(r)){Ue(r,""),(G=Z(l))==null||G.blur();return}if(Z(n)){Ue(n,null);return}}ze||(de.key==="/"||de.key==="k"&&(de.metaKey||de.ctrlKey)?(de.preventDefault(),(Wt=Z(l))==null||Wt.focus()):de.key==="f"||de.key==="F"?c==null||c.zoomToFit():de.key==="r"||de.key==="R"?c==null||c.resetCamera():de.key==="?"&&Ue(o,!Z(o)))}function p(de){Ue(d,de,!0);const Fe=at=>{if(de==="sidebar"){const G=window.innerWidth-at.clientX;Ue(u,Math.max(Il.sidebar.min,Math.min(Il.sidebar.max,G)),!0)}else{const G=window.innerHeight-at.clientY;Ue(h,Math.max(Il.statusbar.min,Math.min(Il.statusbar.max,G)),!0)}},ze=()=>{Ue(d,null),window.removeEventListener("mousemove",Fe),window.removeEventListener("mouseup",ze)};window.addEventListener("mousemove",Fe),window.addEventListener("mouseup",ze)}var _=oZ();dP("keydown",Cv,f);let g;var m=fe(_),v=fe(m);Np(zY(v,{get data(){return t.graph},onNodeClick:de=>Ue(n,de,!0),get selectedNode(){return Z(n)},get searchQuery(){return Z(r)},get statusFilter(){return Z(s)},onHelpClick:()=>Ue(o,!Z(o)),get statusbarHeight(){return Z(h)}}),de=>c=de,()=>c);var y=ge(m,2),x=fe(y),w=ge(fe(x),2);w.textContent="v0.2.4";var T=ge(x,2),S=fe(T),E=ge(fe(S)),M=ge(S,2),b=ge(T,2),A=fe(b),D=ge(fe(A),2);Np(D,de=>Ue(l,de),()=>Z(l));var N=ge(D,2);{var P=de=>{var Fe=iZ();Et("click",Fe,()=>{var ze;Ue(r,""),(ze=Z(l))==null||ze.blur()}),We(de,Fe)};At(N,de=>{Z(r)&&de(P)})}var O=ge(b,2);{var B=de=>{var Fe=rZ(),ze=fe(Fe);let at;var G=ge(ze,2);let Wt;var nt=ge(G,2);let Je;St((Re,jt,Ye)=>{at=Ti(ze,1,"filter-chip",null,at,Re),Wt=Ti(G,1,"filter-chip",null,Wt,jt),Je=Ti(nt,1,"filter-chip",null,Je,Ye)},[()=>({active:Z(s).has("running")}),()=>({active:Z(s).has("stopped")}),()=>({active:Z(s).has("unhealthy")})]),Et("click",ze,()=>{const Re=new Set(Z(s));Re.has("running")?Re.delete("running"):Re.add("running"),Ue(s,Re,!0)}),Et("click",G,()=>{const Re=new Set(Z(s));Re.has("stopped")?Re.delete("stopped"):Re.add("stopped"),Ue(s,Re,!0)}),Et("click",nt,()=>{const Re=new Set(Z(s));Re.has("unhealthy")?Re.delete("unhealthy"):Re.add("unhealthy"),Ue(s,Re,!0)}),We(de,Fe)};At(O,de=>{t.graph.nodes.length>0&&de(B)})}var L=ge(y,2);{var F=de=>{var Fe=sZ();We(de,Fe)};At(L,de=>{t.connected&&t.graph.nodes.length===0&&de(F)})}var V=ge(L,2),ie=fe(V),j=ge(ie,2);DK(j,{get node(){return Z(n)},onClose:()=>Ue(n,null)});var se=ge(V,2),ye=fe(se),Q=ge(ye,2);zK(Q,{get events(){return t.events},get graph(){return t.graph}});var U=ge(se,2);nZ(U,{});var Y=ge(U,2);{var X=de=>{HK(de,{onClose:()=>Ue(o,!1)})};At(Y,de=>{Z(o)&&de(X)})}var ve=ge(Y,2);{var Ee=de=>{JK(de,{onClose:()=>Ue(a,!1)})};At(ve,de=>{Z(a)&&de(Ee)})}St(()=>{g=Ti(_,1,"app",null,g,{"is-dragging":Z(d)!==null}),Ic(_,`--sidebar-w: ${Z(u)??""}px; --statusbar-h: ${Z(h)??""}px;`),Ti(S,1,`hud-connection ${t.connected?"active":"disconnected"}`),rt(E,` ${t.connected?"Live":"Offline"}`),Ic(V,`width: ${Z(u)??""}px;`),Ic(se,`height: ${Z(h)??""}px; right: ${Z(u)??""}px;`)}),Et("click",M,()=>Ue(a,!0)),eE(D,()=>Z(r),de=>Ue(r,de)),Et("mousedown",ie,()=>p("sidebar")),Et("mousedown",ye,()=>p("statusbar")),We(i,_),_r()}ga(["click","mousedown"]);gP(aZ,{target:document.getElementById("root")});
@@ -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-Cp-E9A8v.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-BoYZlhe7.js"></script>
14
14
  <link rel="stylesheet" crossorigin href="/assets/index-BVIqjCgJ.css">
15
15
  </head>
16
16
  <body>
package/package.json CHANGED
@@ -1,15 +1,13 @@
1
1
  {
2
2
  "name": "dockscope",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "Visual, interactive Docker infrastructure debugger — 3D dependency graph with live health, logs, and metrics",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "dockscope": "dist/cli.js"
8
8
  },
9
9
  "scripts": {
10
- "dev": "concurrently -n server,client -c blue,green \"tsx watch src/cli.ts up --no-open\" \"vite\"",
11
- "dev:server": "tsx watch src/cli.ts up --no-open",
12
- "dev:client": "vite",
10
+ "dev": "DOCKSCOPE_DEV=1 tsx watch src/cli.ts up --no-port-check",
13
11
  "build": "tsc -p tsconfig.server.json && vite build",
14
12
  "start": "node dist/cli.js up",
15
13
  "typecheck": "tsc --noEmit",