* Merge new cross-file edges with replace-on-conflict behavior * Newer edges (by timestamp) replace older ones, preserving latest labels
(newEdges: CrossFileEdge[])
| 714 | * Newer edges (by timestamp) replace older ones, preserving latest labels |
| 715 | */ |
| 716 | private mergeCrossFileEdges(newEdges: CrossFileEdge[]) { |
| 717 | const edgeKey = (e: CrossFileEdge) => |
| 718 | `${e.sourceFile}:${e.sourceNodeId}->${e.targetFile}:${e.targetNodeId}`; |
| 719 | |
| 720 | // Build map from existing edges |
| 721 | const edgeMap = new Map<string, CrossFileEdge>(); |
| 722 | for (const edge of this.crossFileEdges) { |
| 723 | edgeMap.set(edgeKey(edge), edge); |
| 724 | } |
| 725 | |
| 726 | // Merge new edges - replace if newer timestamp |
| 727 | for (const edge of newEdges) { |
| 728 | const key = edgeKey(edge); |
| 729 | const existing = edgeMap.get(key); |
| 730 | if (!existing || edge.timestamp > existing.timestamp) { |
| 731 | edgeMap.set(key, edge); |
| 732 | } |
| 733 | } |
| 734 | |
| 735 | // Convert back to array |
| 736 | this.crossFileEdges = Array.from(edgeMap.values()); |
| 737 | } |
| 738 | |
| 739 | // ========================================================================= |
| 740 | // Retrieve & Merge |
no test coverage detected