diff --git a/src/store/workflowStore.ts b/src/store/workflowStore.ts index e97e3478..2029e900 100644 --- a/src/store/workflowStore.ts +++ b/src/store/workflowStore.ts @@ -1525,7 +1525,9 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ return; } - set({ isRunning: true, currentNodeIds: [nodeId] }); + // Create AbortController so stopWorkflow() can cancel regeneration + const abortController = new AbortController(); + set({ isRunning: true, currentNodeIds: [nodeId], _abortController: abortController }); await logger.startSession(); logger.info('node.execution', 'Regenerating node', { @@ -1534,7 +1536,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ }); try { - const executionCtx = get()._buildExecutionContext(node); + const executionCtx = get()._buildExecutionContext(node, abortController.signal); const regenOptions = { useStoredFallback: true }; @@ -1559,27 +1561,27 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ await executeSplitGrid(executionCtx); } else if (node.type === "videoStitch") { await executeVideoStitch(executionCtx); - set({ isRunning: false, currentNodeIds: [] }); + set({ isRunning: false, currentNodeIds: [], _abortController: null }); await logger.endSession(); return; } else if (node.type === "easeCurve") { await executeEaseCurve(executionCtx); - set({ isRunning: false, currentNodeIds: [] }); + set({ isRunning: false, currentNodeIds: [], _abortController: null }); await logger.endSession(); return; } else if (node.type === "videoTrim") { await executeVideoTrim(executionCtx); - set({ isRunning: false, currentNodeIds: [] }); + set({ isRunning: false, currentNodeIds: [], _abortController: null }); await logger.endSession(); return; } else if (node.type === "videoFrameGrab") { await executeVideoFrameGrab(executionCtx); - set({ isRunning: false, currentNodeIds: [] }); + set({ isRunning: false, currentNodeIds: [], _abortController: null }); await logger.endSession(); return; } else if (node.type === "output") { await executeOutput(executionCtx); - set({ isRunning: false, currentNodeIds: [] }); + set({ isRunning: false, currentNodeIds: [], _abortController: null }); await logger.endSession(); return; } @@ -1609,7 +1611,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ } logger.info('node.execution', 'Node regeneration completed successfully', { nodeId }); - set({ isRunning: false, currentNodeIds: [] }); + set({ isRunning: false, currentNodeIds: [], _abortController: null }); saveLogSession(); await logger.endSession(); @@ -1621,7 +1623,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({ status: "error", error: error instanceof Error ? error.message : "Regeneration failed", }); - set({ isRunning: false, currentNodeIds: [] }); + set({ isRunning: false, currentNodeIds: [], _abortController: null }); saveLogSession(); await logger.endSession();