From 139c1f02c2b43bde983d1a35740f8ebb275f59a2 Mon Sep 17 00:00:00 2001 From: shrimbly Date: Sat, 28 Mar 2026 21:51:08 +1300 Subject: [PATCH] fix: restore skippedNodeIds to store for canvas visual feedback The rebase dropped the commit that re-added skippedNodeIds to the store interface since develop had already extracted it to a local variable. However, WorkflowCanvas.tsx needs to observe skippedNodeIds from the store to apply visual dimming during execution. Co-Authored-By: Claude Opus 4.6 --- src/store/workflowStore.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/store/workflowStore.ts b/src/store/workflowStore.ts index 17458d33..67bdd75d 100644 --- a/src/store/workflowStore.ts +++ b/src/store/workflowStore.ts @@ -373,6 +373,9 @@ interface WorkflowStore { // Switch dimming state dimmedNodeIds: Set; + // Skip propagation state (optional empty inputs) + skippedNodeIds: Set; + // Switch dimming actions recomputeDimmedNodes: () => void; @@ -507,6 +510,9 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ // Switch dimming initial state dimmedNodeIds: new Set(), + // Skip propagation initial state + skippedNodeIds: new Set(), + setEdgeStyle: (style: EdgeStyle) => { set({ edgeStyle: style }); }, @@ -1007,7 +1013,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ } } }; - set({ isRunning: true, pausedAtNodeId: null, currentNodeIds: [], _abortController: abortController }); + set({ isRunning: true, pausedAtNodeId: null, currentNodeIds: [], skippedNodeIds: new Set(), _abortController: abortController }); // Start logging session await logger.startSession(); @@ -1089,6 +1095,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ (node.type === "prompt" && !(nodeData.prompt as string)?.trim()); if (isEmpty) { skippedNodeIds.add(node.id); + set({ skippedNodeIds: new Set(skippedNodeIds) }); logger.info('node.execution', 'Node skipped (optional input empty)', { nodeId: node.id, nodeType: node.type, @@ -1102,6 +1109,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ const hasSkippedSource = incomingEdgesForSkip.some((e) => skippedNodeIds.has(e.source)); if (hasSkippedSource) { skippedNodeIds.add(node.id); + set({ skippedNodeIds: new Set(skippedNodeIds) }); if (nodeData.status !== undefined) { get().updateNodeData(node.id, { status: "skipped" } as Partial); } @@ -1257,7 +1265,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ resetSkippedNodes(); - set({ isRunning: false, currentNodeIds: [], _abortController: null }); + set({ isRunning: false, currentNodeIds: [], skippedNodeIds: new Set(), _abortController: null }); saveLogSession(); await logger.endSession(); @@ -1274,7 +1282,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ ); } resetSkippedNodes(); - set({ isRunning: false, currentNodeIds: [], _abortController: null }); + set({ isRunning: false, currentNodeIds: [], skippedNodeIds: new Set(), _abortController: null }); saveLogSession(); await logger.endSession(); @@ -1287,7 +1295,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ if (controller) { controller.abort("user-cancelled"); } - set({ isRunning: false, currentNodeIds: [], _abortController: null }); + set({ isRunning: false, currentNodeIds: [], skippedNodeIds: new Set(), _abortController: null }); }, setMaxConcurrentCalls: (value: number) => { @@ -1822,6 +1830,8 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ viewedCommentNodeIds: new Set(), // Reset dimmed nodes dimmedNodeIds: new Set(), + // Reset skipped nodes + skippedNodeIds: new Set(), }); get().clearSnapshot(); },