From 532231d2eff8f7be62098b960820c5c9c5da0114 Mon Sep 17 00:00:00 2001 From: shrimbly Date: Thu, 12 Mar 2026 20:47:26 +1300 Subject: [PATCH] fix: cache router/switch passthrough results to fix multi-type data loss When a router node had multiple output edges to the same downstream node (e.g., passing both text and image), only the first edge type received data. The shared _visited set prevented the router from being traversed a second time, causing subsequent edge types to get empty results. Co-Authored-By: Claude Opus 4.6 --- src/store/utils/connectedInputs.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/store/utils/connectedInputs.ts b/src/store/utils/connectedInputs.ts index 3e28a254..a848a380 100644 --- a/src/store/utils/connectedInputs.ts +++ b/src/store/utils/connectedInputs.ts @@ -166,6 +166,11 @@ export function getConnectedInputsPure( }); } + // Cache passthrough node results so multiple edges from the same router/switch + // all receive correct data (the _visited set prevents re-traversal, so we cache + // the result from the first traversal and reuse it for subsequent edges). + const passthroughCache = new Map(); + edges .filter((edge) => edge.target === nodeId) .forEach((edge) => { @@ -177,7 +182,9 @@ export function getConnectedInputsPure( // Router passthrough — traverse upstream to find actual data source if (sourceNode.type === "router") { - const routerInputs = getConnectedInputsPure(sourceNode.id, nodes, edges, _visited, dimmedNodeIds); + const routerInputs = passthroughCache.get(sourceNode.id) + ?? getConnectedInputsPure(sourceNode.id, nodes, edges, _visited, dimmedNodeIds); + passthroughCache.set(sourceNode.id, routerInputs); // Determine which type this edge carries based on the source handle const edgeType = edge.sourceHandle; // Will be "image", "text", "video", "audio", "3d", or "easeCurve" @@ -210,7 +217,9 @@ export function getConnectedInputsPure( } // Enabled switch: recursively get upstream data (same pattern as router) - const switchInputs = getConnectedInputsPure(sourceNode.id, nodes, edges, _visited, dimmedNodeIds); + const switchInputs = passthroughCache.get(sourceNode.id) + ?? getConnectedInputsPure(sourceNode.id, nodes, edges, _visited, dimmedNodeIds); + passthroughCache.set(sourceNode.id, switchInputs); const edgeType = switchData.inputType; if (edgeType === "image") {