From 052d5320c0b991c67ec0a3b87934a60423ea9008 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Wed, 23 Jul 2025 17:53:04 -0700 Subject: [PATCH] Revert PRs #4506 and #4507 - Fix execution output issues (#4508) --- .../widgets/useImageUploadWidget.ts | 6 ++-- src/stores/executionStore.ts | 24 ++------------- src/stores/imagePreviewStore.ts | 30 ++++--------------- src/utils/executionUtil.ts | 10 ------- 4 files changed, 11 insertions(+), 59 deletions(-) diff --git a/src/composables/widgets/useImageUploadWidget.ts b/src/composables/widgets/useImageUploadWidget.ts index 355b83ca9..137b2f42c 100644 --- a/src/composables/widgets/useImageUploadWidget.ts +++ b/src/composables/widgets/useImageUploadWidget.ts @@ -100,8 +100,7 @@ export const useImageUploadWidget = () => { // Add our own callback to the combo widget to render an image when it changes fileComboWidget.callback = function () { nodeOutputStore.setNodeOutputs(node, fileComboWidget.value, { - isAnimated, - isInitialLoad: true + isAnimated }) node.graph?.setDirtyCanvas(true) } @@ -111,8 +110,7 @@ export const useImageUploadWidget = () => { // No change callbacks seem to be fired on initial setting of the value requestAnimationFrame(() => { nodeOutputStore.setNodeOutputs(node, fileComboWidget.value, { - isAnimated, - isInitialLoad: true + isAnimated }) showPreview({ block: false }) }) diff --git a/src/stores/executionStore.ts b/src/stores/executionStore.ts index b46d3f13b..377528769 100644 --- a/src/stores/executionStore.ts +++ b/src/stores/executionStore.ts @@ -1,4 +1,4 @@ -import type { LGraph, LGraphNode, Subgraph } from '@comfyorg/litegraph' +import type { LGraph, Subgraph } from '@comfyorg/litegraph' import { defineStore } from 'pinia' import { computed, ref } from 'vue' @@ -24,7 +24,7 @@ import type { } from '@/schemas/comfyWorkflowSchema' import { api } from '@/scripts/api' import { app } from '@/scripts/app' -import type { NodeExecutionId, NodeLocatorId } from '@/types/nodeIdentification' +import type { NodeLocatorId } from '@/types/nodeIdentification' import { createNodeLocatorId } from '@/types/nodeIdentification' import { useCanvasStore } from './graphStore' @@ -54,22 +54,6 @@ export const useExecutionStore = defineStore('execution', () => { // This is the progress of all nodes in the currently executing workflow const nodeProgressStates = ref>({}) - /** - * @deprecated Workaround for Subgraph phase 1 - execution IDs may share locator IDs. - * The most recently executed execution ID for each node locator ID. - */ - const locatorIdToExecutionIdMap = new Map() - - /** - * Get the NodeLocatorId for a node. - * @param node The node - * @returns The NodeLocatorId - */ - const getNodeLocatorId = (node: LGraphNode): NodeLocatorId => - node.graph?.isRootGraph - ? node.id.toString() - : [node.graph?.id, node.id].join(':') - /** * Convert execution context node IDs to NodeLocatorIds * @param nodeId The node ID from execution context (could be execution ID) @@ -484,8 +468,6 @@ export const useExecutionStore = defineStore('execution', () => { _executingNodeProgress, // NodeLocatorId conversion helpers executionIdToNodeLocatorId, - nodeLocatorIdToExecutionId, - locatorIdToExecutionIdMap, - getNodeLocatorId + nodeLocatorIdToExecutionId } }) diff --git a/src/stores/imagePreviewStore.ts b/src/stores/imagePreviewStore.ts index b14a34b9a..b6d88c9bb 100644 --- a/src/stores/imagePreviewStore.ts +++ b/src/stores/imagePreviewStore.ts @@ -8,12 +8,9 @@ import { } from '@/schemas/apiSchema' import { api } from '@/scripts/api' import { app } from '@/scripts/app' -import type { NodeExecutionId } from '@/types' import { parseFilePath } from '@/utils/formatUtil' import { isVideoNode } from '@/utils/litegraphUtil' -import { useExecutionStore } from './executionStore' - const createOutputs = ( filenames: string[], type: ResultItemType, @@ -26,20 +23,16 @@ const createOutputs = ( } export const useNodeOutputStore = defineStore('nodeOutput', () => { - const executionStore = useExecutionStore() - const getMostRecentExecutionId = (node: LGraphNode): NodeExecutionId => - executionStore.locatorIdToExecutionIdMap.get( - executionStore.getNodeLocatorId(node) - ) ?? node.id.toString() + const getNodeId = (node: LGraphNode): string => node.id.toString() function getNodeOutputs( node: LGraphNode ): ExecutedWsMessage['output'] | undefined { - return app.nodeOutputs[getMostRecentExecutionId(node)] + return app.nodeOutputs[getNodeId(node)] } function getNodePreviews(node: LGraphNode): string[] | undefined { - return app.nodePreviewImages[getMostRecentExecutionId(node)] + return app.nodePreviewImages[getNodeId(node)] } /** @@ -98,23 +91,12 @@ export const useNodeOutputStore = defineStore('nodeOutput', () => { filenames: string | string[] | ResultItem, { folder = 'input', - isAnimated = false, - isInitialLoad = false - }: { - folder?: ResultItemType - isAnimated?: boolean - isInitialLoad?: boolean - } = {} + isAnimated = false + }: { folder?: ResultItemType; isAnimated?: boolean } = {} ) { if (!filenames || !node) return - const nodeId = isInitialLoad - ? executionStore.getNodeLocatorId(node) - : getMostRecentExecutionId(node) - - if (isInitialLoad) { - executionStore.locatorIdToExecutionIdMap.set(nodeId, nodeId) - } + const nodeId = getNodeId(node) if (typeof filenames === 'string') { app.nodeOutputs[nodeId] = createOutputs([filenames], folder, isAnimated) diff --git a/src/utils/executionUtil.ts b/src/utils/executionUtil.ts index 2f77a66c1..a0047d716 100644 --- a/src/utils/executionUtil.ts +++ b/src/utils/executionUtil.ts @@ -14,7 +14,6 @@ import type { ComfyApiWorkflow, ComfyWorkflowJSON } from '@/schemas/comfyWorkflowSchema' -import { useExecutionStore } from '@/stores/executionStore' import { ExecutableGroupNodeDTO, isGroupNode } from './executableGroupNodeDto' import { compressWidgetInputSlots } from './litegraphUtil' @@ -59,8 +58,6 @@ export const graphToPrompt = async ( options: { sortNodes?: boolean; queueNodeIds?: NodeId[] } = {} ): Promise<{ workflow: ComfyWorkflowJSON; output: ComfyApiWorkflow }> => { const { sortNodes = false, queueNodeIds } = options - const executionStore = useExecutionStore() - executionStore.locatorIdToExecutionIdMap.clear() for (const node of graph.computeExecutionOrder(false)) { const innerNodes = node.getInnerNodes @@ -162,13 +159,6 @@ export const graphToPrompt = async ( ] } - // Temporary workaround for Subgraph phase 1. Overwrites the ID, but keeps the image. - const baseNodeId = node.id.split(':').at(-1) - executionStore.locatorIdToExecutionIdMap.set( - `${node.subgraphId}:${baseNodeId}`, - node.id - ) - output[String(node.id)] = { inputs, // TODO(huchenlei): Filter out all nodes that cannot be mapped to a