Browse Source

refactor: remove dual-tracked skippedNodeIds local variable

Replace the local Set variable in executeWorkflow() with direct
reads/writes to the Zustand store field. The dual tracking was
redundant since get() is synchronous and Set.has() is O(1).
Extract a resetSkippedNodes() helper to DRY up the two cleanup blocks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
handoff-20260429-1057
shrimbly 4 months ago
parent
commit
d5133f0f7d
  1. 13
      src/store/workflowStore.ts

13
src/store/workflowStore.ts

@ -1004,9 +1004,8 @@ const workflowStoreImpl: StateCreator<WorkflowStore> = (set, get) => ({
// Create AbortController for this execution run // Create AbortController for this execution run
const abortController = new AbortController(); const abortController = new AbortController();
const isResuming = startFromNodeId === get().pausedAtNodeId; const isResuming = startFromNodeId === get().pausedAtNodeId;
const skippedNodeIds = new Set<string>();
const resetSkippedNodes = () => { const resetSkippedNodes = () => {
for (const skippedId of skippedNodeIds) { for (const skippedId of get().skippedNodeIds) {
const skippedNode = get().nodes.find((n) => n.id === skippedId); const skippedNode = get().nodes.find((n) => n.id === skippedId);
if (skippedNode && (skippedNode.data as Record<string, unknown>).status !== undefined) { if (skippedNode && (skippedNode.data as Record<string, unknown>).status !== undefined) {
get().updateNodeData(skippedId, { status: "idle" } as Partial<WorkflowNodeData>); get().updateNodeData(skippedId, { status: "idle" } as Partial<WorkflowNodeData>);
@ -1094,8 +1093,7 @@ const workflowStoreImpl: StateCreator<WorkflowStore> = (set, get) => ({
(node.type === "audioInput" && !nodeData.audioFile) || (node.type === "audioInput" && !nodeData.audioFile) ||
(node.type === "prompt" && !(nodeData.prompt as string)?.trim()); (node.type === "prompt" && !(nodeData.prompt as string)?.trim());
if (isEmpty) { if (isEmpty) {
skippedNodeIds.add(node.id); set({ skippedNodeIds: new Set([...get().skippedNodeIds, node.id]) });
set({ skippedNodeIds: new Set(skippedNodeIds) });
logger.info('node.execution', 'Node skipped (optional input empty)', { logger.info('node.execution', 'Node skipped (optional input empty)', {
nodeId: node.id, nodeId: node.id,
nodeType: node.type, nodeType: node.type,
@ -1106,10 +1104,9 @@ const workflowStoreImpl: StateCreator<WorkflowStore> = (set, get) => ({
// Check 2: Any source node is skipped → propagate skip // Check 2: Any source node is skipped → propagate skip
const incomingEdgesForSkip = edges.filter((e) => e.target === node.id); const incomingEdgesForSkip = edges.filter((e) => e.target === node.id);
const hasSkippedSource = incomingEdgesForSkip.some((e) => skippedNodeIds.has(e.source)); const hasSkippedSource = incomingEdgesForSkip.some((e) => get().skippedNodeIds.has(e.source));
if (hasSkippedSource) { if (hasSkippedSource) {
skippedNodeIds.add(node.id); set({ skippedNodeIds: new Set([...get().skippedNodeIds, node.id]) });
set({ skippedNodeIds: new Set(skippedNodeIds) });
if (nodeData.status !== undefined) { if (nodeData.status !== undefined) {
get().updateNodeData(node.id, { status: "skipped" } as Partial<WorkflowNodeData>); get().updateNodeData(node.id, { status: "skipped" } as Partial<WorkflowNodeData>);
} }
@ -1263,6 +1260,7 @@ const workflowStoreImpl: StateCreator<WorkflowStore> = (set, get) => ({
logger.info('workflow.end', 'Workflow execution completed successfully'); logger.info('workflow.end', 'Workflow execution completed successfully');
} }
// Reset skipped nodes' status back to idle
resetSkippedNodes(); resetSkippedNodes();
set({ isRunning: false, currentNodeIds: [], skippedNodeIds: new Set(), _abortController: null }); set({ isRunning: false, currentNodeIds: [], skippedNodeIds: new Set(), _abortController: null });
@ -1281,6 +1279,7 @@ const workflowStoreImpl: StateCreator<WorkflowStore> = (set, get) => ({
"error" "error"
); );
} }
// Reset skipped nodes' status back to idle
resetSkippedNodes(); resetSkippedNodes();
set({ isRunning: false, currentNodeIds: [], skippedNodeIds: new Set(), _abortController: null }); set({ isRunning: false, currentNodeIds: [], skippedNodeIds: new Set(), _abortController: null });

Loading…
Cancel
Save