From 4d4e1e198c068cf62c04b7356ad1431e6a2b8db4 Mon Sep 17 00:00:00 2001 From: Nico Date: Thu, 2 Apr 2026 19:08:50 +0200 Subject: [PATCH] Panel system: replace quad DevPanel with composable panel architecture - PanelShell layout: main content + stacked side panels (320px) - usePanels composable: role-based registry, localStorage persistence - Lazy-loaded panels: Graph (Cytoscape+Cola), Trace, Nodes, State - Fix HUD protocol: map assay node-level events to nyx tree format - Graph: edge filtering for missing nodes, Tailwind canvas opacity fix - Remove FramesPanel and TaskPanel (data merged into State panel) - Toolbar panel toggles with heroicon badges Co-Authored-By: Claude Opus 4.6 --- package-lock.json | 78 +++++ package.json | 2 + src/components/AppToolbar.vue | 31 +- src/components/PanelShell.vue | 159 ++++++++++ src/components/panels/AwarenessPanel.vue | 93 ++++++ src/components/panels/GraphPanel.vue | 380 +++++++++++++++++++++++ src/components/panels/NodesPanel.vue | 140 +++++++++ src/components/panels/TracePanel.vue | 114 +++++++ src/composables/sessionHistory.ts | 97 +++++- src/composables/usePanels.ts | 143 +++++++++ src/composables/ws.ts | 47 ++- src/views/AgentsView.vue | 3 + vite.config.ts | 7 +- 13 files changed, 1282 insertions(+), 12 deletions(-) create mode 100644 src/components/PanelShell.vue create mode 100644 src/components/panels/AwarenessPanel.vue create mode 100644 src/components/panels/GraphPanel.vue create mode 100644 src/components/panels/NodesPanel.vue create mode 100644 src/components/panels/TracePanel.vue create mode 100644 src/composables/usePanels.ts diff --git a/package-lock.json b/package-lock.json index a725f1c..d1d072f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "0.1.0", "dependencies": { "@heroicons/vue": "^2.2.0", + "cytoscape": "^3.33.1", + "cytoscape-cola": "^2.5.1", "marked": "^17.0.4", "overlayscrollbars": "^2.0.0", "overlayscrollbars-vue": "^0.5.9", @@ -1559,6 +1561,70 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cola": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/cytoscape-cola/-/cytoscape-cola-2.5.1.tgz", + "integrity": "sha512-4/2S9bW1LvdsEPmxXN1OEAPFPbk7DvCx2c9d+TblkQAAvptGaSgtPWCByTEGgT8UxCxcVqes2aFPO5pzwo7R2w==", + "license": "MIT", + "dependencies": { + "webcola": "^3.4.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "license": "BSD-3-Clause" + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2696,6 +2762,18 @@ "typescript": ">=5.0.0" } }, + "node_modules/webcola": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webcola/-/webcola-3.4.0.tgz", + "integrity": "sha512-4BiLXjXw3SJHo3Xd+rF+7fyClT6n7I+AR6TkBqyQ4kTsePSAMDLRCXY1f3B/kXJeP9tYn4G1TblxTO+jAt0gaw==", + "license": "MIT", + "dependencies": { + "d3-dispatch": "^1.0.3", + "d3-drag": "^1.0.4", + "d3-shape": "^1.3.5", + "d3-timer": "^1.0.5" + } + }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", diff --git a/package.json b/package.json index 1114746..5c5adac 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ }, "dependencies": { "@heroicons/vue": "^2.2.0", + "cytoscape": "^3.33.1", + "cytoscape-cola": "^2.5.1", "marked": "^17.0.4", "overlayscrollbars": "^2.0.0", "overlayscrollbars-vue": "^0.5.9", diff --git a/src/components/AppToolbar.vue b/src/components/AppToolbar.vue index b7267f1..cd5b578 100644 --- a/src/components/AppToolbar.vue +++ b/src/components/AppToolbar.vue @@ -20,6 +20,18 @@ + + +