diff --git a/js/friendly_pipe.js b/js/friendly_pipe.js index 27d786f..7a407a7 100644 --- a/js/friendly_pipe.js +++ b/js/friendly_pipe.js @@ -117,29 +117,42 @@ function findOriginalSource(node, slotIndex, depth = 0) { return currentNode; } - // Handle Subgraph nodes - need to enter the subgraph and find the graph/output + // Handle Subgraph nodes - need to enter the subgraph and find the source connected to the output if (currentNode.subgraph) { console.log("[FriendlyPipe] findOriginalSource: Entering subgraph node, outputSlot:", currentSlot); const subgraph = currentNode.subgraph; const outputSlot = currentSlot; - const subgraphNodes = subgraph._nodes || []; - console.log("[FriendlyPipe] findOriginalSource: Subgraph has", subgraphNodes.length, "nodes"); - console.log("[FriendlyPipe] findOriginalSource: subgraph.outputs:", subgraph.outputs); - console.log("[FriendlyPipe] findOriginalSource: subgraph._outputs:", subgraph._outputs); - console.log("[FriendlyPipe] findOriginalSource: currentNode.outputs:", currentNode.outputs); - console.log("[FriendlyPipe] findOriginalSource: subgraph keys:", Object.keys(subgraph)); - // Check if subgraph.outputs defines the output mappings + // Check if subgraph.outputs defines the output mappings (ComfyUI style) if (subgraph.outputs && subgraph.outputs[outputSlot]) { const outputDef = subgraph.outputs[outputSlot]; console.log("[FriendlyPipe] findOriginalSource: outputDef:", outputDef); - // The output definition might have a link to the internal node + + // SubgraphOutput has linkIds array containing internal link IDs + const linkIds = outputDef.linkIds || outputDef.links || []; + console.log("[FriendlyPipe] findOriginalSource: linkIds:", linkIds); + + if (linkIds.length > 0) { + const innerLinkId = linkIds[0]; // Take the first link + const innerLink = subgraph.links[innerLinkId]; + console.log("[FriendlyPipe] findOriginalSource: inner link:", innerLink); + if (innerLink) { + const innerSource = subgraph.getNodeById(innerLink.origin_id); + console.log("[FriendlyPipe] findOriginalSource: inner source:", innerSource?.type, innerSource?.id); + if (innerSource) { + const result = findOriginalSource(innerSource, innerLink.origin_slot, depth + 1); + console.log("[FriendlyPipe] findOriginalSource: recursive result:", result?.type, result?.id); + if (result) return result; + } + } + } + + // Also check for a single 'link' property if (outputDef.link !== undefined && outputDef.link !== null) { const innerLink = subgraph.links[outputDef.link]; - console.log("[FriendlyPipe] findOriginalSource: inner link from output def:", innerLink); + console.log("[FriendlyPipe] findOriginalSource: inner link from .link:", innerLink); if (innerLink) { const innerSource = subgraph.getNodeById(innerLink.origin_id); - console.log("[FriendlyPipe] findOriginalSource: inner source from output def:", innerSource?.type, innerSource?.id); if (innerSource) { const result = findOriginalSource(innerSource, innerLink.origin_slot, depth + 1); if (result) return result; @@ -148,28 +161,21 @@ function findOriginalSource(node, slotIndex, depth = 0) { } } - // Find the graph/output node that corresponds to this output slot + // Fallback: search for graph/output nodes (LiteGraph style) + const subgraphNodes = subgraph._nodes || []; for (const innerNode of subgraphNodes) { - console.log("[FriendlyPipe] findOriginalSource: Checking inner node:", innerNode.type, innerNode.id); if (innerNode.type === "graph/output" || innerNode.type === "GraphOutput") { const outputIndex = innerNode.properties?.slot_index ?? innerNode.properties?.index ?? innerNode.slot_index ?? 0; - console.log("[FriendlyPipe] findOriginalSource: graph/output node, outputIndex:", outputIndex, "looking for:", outputSlot); if (outputIndex === outputSlot) { - // Found the matching graph/output, trace back from its input const graphOutputInput = innerNode.inputs?.[0]; - console.log("[FriendlyPipe] findOriginalSource: graph/output input:", graphOutputInput); if (graphOutputInput && graphOutputInput.link) { const innerLink = subgraph.links[graphOutputInput.link]; - console.log("[FriendlyPipe] findOriginalSource: innerLink:", innerLink); if (innerLink) { const innerSource = subgraph.getNodeById(innerLink.origin_id); - console.log("[FriendlyPipe] findOriginalSource: innerSource:", innerSource?.type, innerSource?.id); if (innerSource) { - // Recursively search inside the subgraph const result = findOriginalSource(innerSource, innerLink.origin_slot, depth + 1); - console.log("[FriendlyPipe] findOriginalSource: recursive result:", result?.type, result?.id); if (result) return result; } }