feat: improve network topology — LLDP-authoritative, manual links, orphan handling (v0.11.6 Beta)

- Backend: 7-step pipeline — per-neighbor best-protocol dedup, bidirectional
  LLDP pair merging, LLDP-covered set suppression of noisy CDP/MNDP links,
  shared-segment heuristic limited to genuinely unresolved non-LLDP links
- Backend: manual_topology_links table + POST/DELETE endpoints for user-drawn connections
- Frontend: ManualEdge custom edge type (purple dashed + × delete button)
- Frontend: Connect Mode toggle — blue crosshair handles, onConnect creates DB-persisted link
- Frontend: orphan nodes in dedicated bottom row with orange warning banner
- Frontend: legend updated, canvas height increased

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2GT-Rich
2026-05-16 16:13:20 -07:00
co-authored by Claude Sonnet 4.6
parent 624c9bc1cc
commit 63a7f4d785
8 changed files with 625 additions and 489 deletions
File diff suppressed because it is too large Load Diff
+7
View File
@@ -400,8 +400,15 @@ export const topologyApi = {
devices: Device[];
links: import('../types').TopologyLink[];
externalNodes: import('../types').ExternalTopologyNode[];
segConns: { src: string; dst: string; port: string }[];
manualLinkIds: { id: number; from_device_id: number; to_device_id: number }[];
}>('/topology'),
discover: () => api.post('/topology/discover'),
createManualLink: (from_device_id: number, to_device_id: number, label?: string) =>
api.post<{ id: number; from_device_id: number; to_device_id: number; label: string | null }>(
'/topology/manual-links', { from_device_id, to_device_id, label }
),
deleteManualLink: (id: number) => api.delete(`/topology/manual-links/${id}`),
};
// ─── Search ──────────────────────────────────────────────────────────────────
+1 -1
View File
@@ -1 +1 @@
export const APP_VERSION = 'v0.11.5 Beta';
export const APP_VERSION = 'v0.11.6 Beta';