From 2969a77b1590aeb8df2ab50b06f383acda287926 Mon Sep 17 00:00:00 2001 From: twwu Date: Fri, 26 Dec 2025 14:50:47 +0800 Subject: [PATCH] refactor: rename 'suspended' status to 'paused' across workflow components and update related styles --- web/app/components/app/workflow-log/list.tsx | 2 +- .../chat/chat/answer/workflow-process.tsx | 10 +++--- .../workflow-app/hooks/use-workflow-run.ts | 16 ++++----- .../hooks/use-workflow-run-event/index.ts | 2 +- .../use-workflow-node-human-input-required.ts | 6 ++-- ...ow-suspended.ts => use-workflow-paused.ts} | 8 ++--- .../use-workflow-run-event.ts | 6 ++-- .../components/workflow/nodes/_base/node.tsx | 33 +++++++++++++------ .../panel/debug-and-preview/chat-wrapper.tsx | 2 +- .../workflow/panel/debug-and-preview/hooks.ts | 11 +++++-- web/app/components/workflow/run/meta.tsx | 7 ++-- web/app/components/workflow/run/node.tsx | 8 ++--- .../workflow/run/status-container.tsx | 6 ++-- web/app/components/workflow/run/status.tsx | 14 ++++---- .../workflow/store/workflow/workflow-slice.ts | 2 +- web/app/components/workflow/types.ts | 4 +-- web/service/base.ts | 18 +++++----- web/tailwind-common-config.ts | 1 + web/themes/manual-dark.css | 2 +- web/themes/manual-light.css | 2 +- web/types/workflow.ts | 10 +++--- 21 files changed, 96 insertions(+), 74 deletions(-) rename web/app/components/workflow/hooks/use-workflow-run-event/{use-workflow-suspended.ts => use-workflow-paused.ts} (75%) diff --git a/web/app/components/app/workflow-log/list.tsx b/web/app/components/app/workflow-log/list.tsx index 3f347bc3e1..07311dcc8f 100644 --- a/web/app/components/app/workflow-log/list.tsx +++ b/web/app/components/app/workflow-log/list.tsx @@ -81,7 +81,7 @@ const WorkflowAppLogList: FC = ({ logs, appDetail, onRefresh }) => { ) } - if (status === 'suspended') { + if (status === 'paused') { return (
diff --git a/web/app/components/base/chat/chat/answer/workflow-process.tsx b/web/app/components/base/chat/chat/answer/workflow-process.tsx index dac3fb9e57..d879cff3b6 100644 --- a/web/app/components/base/chat/chat/answer/workflow-process.tsx +++ b/web/app/components/base/chat/chat/answer/workflow-process.tsx @@ -35,7 +35,7 @@ const WorkflowProcessItem = ({ const running = data.status === WorkflowRunningStatus.Running const succeeded = data.status === WorkflowRunningStatus.Succeeded const failed = data.status === WorkflowRunningStatus.Failed || data.status === WorkflowRunningStatus.Stopped - const suspended = data.status === WorkflowRunningStatus.Suspended + const paused = data.status === WorkflowRunningStatus.Paused const latestNode = data.tracing[data.tracing.length - 1] useEffect(() => { @@ -53,9 +53,9 @@ const WorkflowProcessItem = ({ running && !collapse && 'bg-background-section-burn', succeeded && !collapse && 'bg-state-success-hover', failed && !collapse && 'bg-state-destructive-hover', - suspended && !collapse && 'bg-state-warning-hover', - collapse && !failed && !suspended && 'bg-workflow-process-bg', - collapse && suspended && 'bg-workflow-process-suspended-bg', + paused && !collapse && 'bg-state-warning-hover', + collapse && !failed && !paused && 'bg-workflow-process-bg', + collapse && paused && 'bg-workflow-process-paused-bg', collapse && failed && 'bg-workflow-process-failed-bg', )} > @@ -79,7 +79,7 @@ const WorkflowProcessItem = ({ ) } { - suspended && ( + paused && ( ) } diff --git a/web/app/components/workflow-app/hooks/use-workflow-run.ts b/web/app/components/workflow-app/hooks/use-workflow-run.ts index f9ca560be2..f4531e0856 100644 --- a/web/app/components/workflow-app/hooks/use-workflow-run.ts +++ b/web/app/components/workflow-app/hooks/use-workflow-run.ts @@ -90,7 +90,7 @@ export const useWorkflowRun = () => { handleWorkflowAgentLog, handleWorkflowTextChunk, handleWorkflowTextReplace, - handleWorkflowSuspended, + handleWorkflowPaused, } = useWorkflowRunEvent() const handleBackupDraft = useCallback(() => { @@ -178,7 +178,7 @@ export const useWorkflowRun = () => { onNodeRetry, onAgentLog, onError, - onWorkflowSuspended, + onWorkflowPaused, onHumanInputRequired, onCompleted, ...restCallback @@ -609,7 +609,7 @@ export const useWorkflowRun = () => { baseSseOptions.onTextReplace, baseSseOptions.onAgentLog, baseSseOptions.onHumanInputRequired, - baseSseOptions.onWorkflowSuspended, + baseSseOptions.onWorkflowPaused, baseSseOptions.onDataSourceNodeProcessing, baseSseOptions.onDataSourceNodeCompleted, baseSseOptions.onDataSourceNodeError, @@ -780,10 +780,10 @@ export const useWorkflowRun = () => { onTTSEnd: (messageId: string, audio: string) => { player?.playAudioWithAudio(audio, false) }, - onWorkflowSuspended: (params) => { - handleWorkflowSuspended() - if (onWorkflowSuspended) - onWorkflowSuspended(params) + onWorkflowPaused: (params) => { + handleWorkflowPaused() + if (onWorkflowPaused) + onWorkflowPaused(params) }, onHumanInputRequired: (params) => { handleWorkflowNodeHumanInputRequired(params) @@ -793,7 +793,7 @@ export const useWorkflowRun = () => { ...restCallback, }, ) - }, [store, doSyncWorkflowDraft, workflowStore, pathname, handleWorkflowStarted, handleWorkflowFinished, fetchInspectVars, invalidAllLastRun, handleWorkflowFailed, handleWorkflowNodeStarted, handleWorkflowNodeFinished, handleWorkflowNodeIterationStarted, handleWorkflowNodeIterationNext, handleWorkflowNodeIterationFinished, handleWorkflowNodeLoopStarted, handleWorkflowNodeLoopNext, handleWorkflowNodeLoopFinished, handleWorkflowNodeRetry, handleWorkflowAgentLog, handleWorkflowTextChunk, handleWorkflowTextReplace]) + }, [store, doSyncWorkflowDraft, workflowStore, pathname, handleWorkflowFailed, flowId, handleWorkflowStarted, handleWorkflowFinished, fetchInspectVars, invalidAllLastRun, handleWorkflowNodeStarted, handleWorkflowNodeFinished, handleWorkflowNodeIterationStarted, handleWorkflowNodeIterationNext, handleWorkflowNodeIterationFinished, handleWorkflowNodeLoopStarted, handleWorkflowNodeLoopNext, handleWorkflowNodeLoopFinished, handleWorkflowNodeRetry, handleWorkflowAgentLog, handleWorkflowTextChunk, handleWorkflowTextReplace, handleWorkflowPaused, handleWorkflowNodeHumanInputRequired]) const handleStopRun = useCallback((taskId: string) => { const setStoppedState = () => { diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/index.ts b/web/app/components/workflow/hooks/use-workflow-run-event/index.ts index 924895e16c..b11587f6f7 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/index.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/index.ts @@ -11,7 +11,7 @@ export * from './use-workflow-node-loop-next' export * from './use-workflow-node-loop-started' export * from './use-workflow-node-retry' export * from './use-workflow-node-started' +export * from './use-workflow-paused' export * from './use-workflow-started' -export * from './use-workflow-suspended' export * from './use-workflow-text-chunk' export * from './use-workflow-text-replace' diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-human-input-required.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-human-input-required.ts index 2fcfd87d9f..9b21835ee2 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-human-input-required.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-human-input-required.ts @@ -25,7 +25,7 @@ export const useWorkflowNodeHumanInputRequired = () => { const nodes = getNodes() const currentNodeIndex = nodes.findIndex(node => node.id === data.node_id) const newNodes = produce(nodes, (draft) => { - draft[currentNodeIndex].data._runningStatus = NodeRunningStatus.Suspended + draft[currentNodeIndex].data._runningStatus = NodeRunningStatus.Paused // draft[currentNodeIndex].data._waitingRun = false // store form data & input form schema }) @@ -35,10 +35,10 @@ export const useWorkflowNodeHumanInputRequired = () => { setWorkflowRunningData(produce(workflowRunningData!, (draft) => { draft.result = { ...draft.result, - // status: WorkflowRunningStatus.Suspended, // human input required !== workflow 'Suspended' + // status: WorkflowRunningStatus.Paused, // human input required !== workflow 'Paused' } })) - }, [workflowStore]) + }, [store, workflowStore]) return { handleWorkflowNodeHumanInputRequired, diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-suspended.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-paused.ts similarity index 75% rename from web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-suspended.ts rename to web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-paused.ts index 82dfae5936..fc85d3d459 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-suspended.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-paused.ts @@ -3,10 +3,10 @@ import { useCallback } from 'react' import { useWorkflowStore } from '@/app/components/workflow/store' import { WorkflowRunningStatus } from '@/app/components/workflow/types' -export const useWorkflowSuspended = () => { +export const useWorkflowPaused = () => { const workflowStore = useWorkflowStore() - const handleWorkflowSuspended = useCallback(() => { + const handleWorkflowPaused = useCallback(() => { const { workflowRunningData, setWorkflowRunningData, @@ -15,12 +15,12 @@ export const useWorkflowSuspended = () => { setWorkflowRunningData(produce(workflowRunningData!, (draft) => { draft.result = { ...draft.result, - status: WorkflowRunningStatus.Suspended, + status: WorkflowRunningStatus.Paused, } })) }, [workflowStore]) return { - handleWorkflowSuspended, + handleWorkflowPaused, } } diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts index 42b0bb2f1f..1e570db75a 100644 --- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts +++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts @@ -12,8 +12,8 @@ import { useWorkflowNodeLoopStarted, useWorkflowNodeRetry, useWorkflowNodeStarted, + useWorkflowPaused, useWorkflowStarted, - useWorkflowSuspended, useWorkflowTextChunk, useWorkflowTextReplace, } from '.' @@ -34,7 +34,7 @@ export const useWorkflowRunEvent = () => { const { handleWorkflowTextChunk } = useWorkflowTextChunk() const { handleWorkflowTextReplace } = useWorkflowTextReplace() const { handleWorkflowAgentLog } = useWorkflowAgentLog() - const { handleWorkflowSuspended } = useWorkflowSuspended() + const { handleWorkflowPaused } = useWorkflowPaused() const { handleWorkflowNodeHumanInputRequired } = useWorkflowNodeHumanInputRequired() return { @@ -53,7 +53,7 @@ export const useWorkflowRunEvent = () => { handleWorkflowTextChunk, handleWorkflowTextReplace, handleWorkflowAgentLog, - handleWorkflowSuspended, + handleWorkflowPaused, handleWorkflowNodeHumanInputRequired, } } diff --git a/web/app/components/workflow/nodes/_base/node.tsx b/web/app/components/workflow/nodes/_base/node.tsx index 24ed4eb35a..e137f706d6 100644 --- a/web/app/components/workflow/nodes/_base/node.tsx +++ b/web/app/components/workflow/nodes/_base/node.tsx @@ -9,6 +9,7 @@ import { RiCheckboxCircleFill, RiErrorWarningFill, RiLoader2Line, + RiPauseCircleFill, } from '@remixicon/react' import { cloneElement, @@ -107,7 +108,7 @@ const BaseNode: FC = ({ showExceptionBorder, } = useMemo(() => { return { - showRunningBorder: data._runningStatus === NodeRunningStatus.Running && !showSelectedBorder, + showRunningBorder: (data._runningStatus === NodeRunningStatus.Running || data._runningStatus === NodeRunningStatus.Paused) && !showSelectedBorder, showSuccessBorder: (data._runningStatus === NodeRunningStatus.Succeeded || hasVarValue) && !showSelectedBorder, showFailedBorder: data._runningStatus === NodeRunningStatus.Failed && !showSelectedBorder, showExceptionBorder: data._runningStatus === NodeRunningStatus.Exception && !showSelectedBorder, @@ -287,15 +288,27 @@ const BaseNode: FC = ({ data.type === BlockEnum.Loop && data._loopIndex && LoopIndex } { - isLoading - ? - : data._runningStatus === NodeRunningStatus.Failed - ? - : data._runningStatus === NodeRunningStatus.Exception - ? - : (data._runningStatus === NodeRunningStatus.Succeeded || hasVarValue) - ? - : null + isLoading && + } + { + !isLoading && data._runningStatus === NodeRunningStatus.Failed && ( + + ) + } + { + !isLoading && data._runningStatus === NodeRunningStatus.Exception && ( + + ) + } + { + !isLoading && (data._runningStatus === NodeRunningStatus.Succeeded || hasVarValue) && ( + + ) + } + { + !isLoading && data._runningStatus === NodeRunningStatus.Paused && ( + + ) }
{ diff --git a/web/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx b/web/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx index d92ce91df1..b821d65f78 100644 --- a/web/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx +++ b/web/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx @@ -130,7 +130,7 @@ const ChatWrapper = ( const inputDisabled = useMemo(() => { const latestMessage = chatList[chatList.length - 1] - return latestMessage?.isAnswer && (latestMessage.workflowProcess?.status === WorkflowRunningStatus.Suspended) + return latestMessage?.isAnswer && (latestMessage.workflowProcess?.status === WorkflowRunningStatus.Paused) }, [chatList]) const { eventEmitter } = useEventEmitterContextContext() diff --git a/web/app/components/workflow/panel/debug-and-preview/hooks.ts b/web/app/components/workflow/panel/debug-and-preview/hooks.ts index c010df5d21..2dcd5fef8e 100644 --- a/web/app/components/workflow/panel/debug-and-preview/hooks.ts +++ b/web/app/components/workflow/panel/debug-and-preview/hooks.ts @@ -514,9 +514,14 @@ export const useChat = ( parentId: params.parent_message_id, }) }, - onWorkflowSuspended: ({ data }) => { - console.log(data.suspended_at_node_ids) - responseItem.workflowProcess!.status = WorkflowRunningStatus.Suspended + onWorkflowPaused: ({ data }) => { + responseItem.workflowProcess!.status = WorkflowRunningStatus.Paused + data.paused_nodes.forEach((nodeId) => { + const currentTracingIndex = responseItem.workflowProcess!.tracing!.findIndex(item => item.node_id === nodeId) + if (currentTracingIndex > -1) { + responseItem.workflowProcess!.tracing[currentTracingIndex].status = NodeRunningStatus.Paused + } + }) updateCurrentQAOnTree({ placeholderQuestionId, questionItem, diff --git a/web/app/components/workflow/run/meta.tsx b/web/app/components/workflow/run/meta.tsx index 20a03a2c5a..da983c4716 100644 --- a/web/app/components/workflow/run/meta.tsx +++ b/web/app/components/workflow/run/meta.tsx @@ -50,6 +50,9 @@ const MetaData: FC = ({ {status === 'stopped' && ( STOP )} + {status === 'paused' && ( + PENDING + )}
@@ -88,10 +91,10 @@ const MetaData: FC = ({
{t('runLog.meta.tokens')}
- {status === 'running' && ( + {['running', 'paused'].includes(status) && (
)} - {status !== 'running' && ( + {!['running', 'paused'].includes(status) && ( {`${tokens || 0} Tokens`} )}
diff --git a/web/app/components/workflow/run/node.tsx b/web/app/components/workflow/run/node.tsx index 5cf44a5bf2..c3a0d3d3c4 100644 --- a/web/app/components/workflow/run/node.tsx +++ b/web/app/components/workflow/run/node.tsx @@ -145,7 +145,7 @@ const NodePanel: FC = ({ {nodeInfo.title}
- {nodeInfo.status !== 'running' && !hideInfo && ( + {!['running', 'paused'].includes(nodeInfo.status) && !hideInfo && (
{nodeInfo.execution_metadata?.total_tokens ? `${getTokenCount(nodeInfo.execution_metadata?.total_tokens || 0)} tokens ยท ` : ''} {`${getTime(nodeInfo.elapsed_time || 0)}`} @@ -160,7 +160,7 @@ const NodePanel: FC = ({ {nodeInfo.status === 'stopped' && ( )} - {nodeInfo.status === 'suspended' && ( + {nodeInfo.status === 'paused' && ( )} {nodeInfo.status === 'exception' && ( @@ -233,8 +233,8 @@ const NodePanel: FC = ({ {nodeInfo.error} )} - {(nodeInfo.status === 'suspended') && ( - + {(nodeInfo.status === 'paused') && ( +
{t('workflow.nodes.humanInput.log.reasonContent')}
)} diff --git a/web/app/components/workflow/run/status-container.tsx b/web/app/components/workflow/run/status-container.tsx index 4733801f83..fc33bd46a7 100644 --- a/web/app/components/workflow/run/status-container.tsx +++ b/web/app/components/workflow/run/status-container.tsx @@ -28,9 +28,9 @@ const StatusContainer: FC = ({ status === 'failed' && 'border-[rgba(240,68,56,0.8)] bg-workflow-display-error-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-error.svg)] text-text-warning', status === 'failed' && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(240,68,56,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]', status === 'failed' && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(240,68,56,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]', - (status === 'stopped' || status === 'suspended') && 'border-[rgba(247,144,9,0.8)] bg-workflow-display-warning-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-warning.svg)] text-text-destructive', - (status === 'stopped' || status === 'suspended') && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(247,144,9,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]', - (status === 'stopped' || status === 'suspended') && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(247,144,9,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]', + (status === 'stopped' || status === 'paused') && 'border-[rgba(247,144,9,0.8)] bg-workflow-display-warning-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-warning.svg)] text-text-destructive', + (status === 'stopped' || status === 'paused') && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(247,144,9,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]', + (status === 'stopped' || status === 'paused') && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(247,144,9,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]', status === 'exception' && 'border-[rgba(247,144,9,0.8)] bg-workflow-display-warning-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-warning.svg)] text-text-destructive', status === 'exception' && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(247,144,9,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]', status === 'exception' && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(247,144,9,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]', diff --git a/web/app/components/workflow/run/status.tsx b/web/app/components/workflow/run/status.tsx index 09d3955ad8..f68506f41f 100644 --- a/web/app/components/workflow/run/status.tsx +++ b/web/app/components/workflow/run/status.tsx @@ -43,7 +43,7 @@ const StatusPanel: FC = ({ status === 'succeeded' && 'text-util-colors-green-green-600', status === 'partial-succeeded' && 'text-util-colors-green-green-600', status === 'failed' && 'text-util-colors-red-red-600', - (status === 'stopped' || status === 'suspended') && 'text-util-colors-warning-warning-600', + (status === 'stopped' || status === 'paused') && 'text-util-colors-warning-warning-600', status === 'running' && 'text-util-colors-blue-light-blue-light-600', )} > @@ -83,7 +83,7 @@ const StatusPanel: FC = ({ STOP )} - {status === 'suspended' && ( + {status === 'paused' && ( <> PENDING @@ -94,10 +94,10 @@ const StatusPanel: FC = ({
{t('runLog.resultPanel.time')}
- {(status === 'running' || status === 'suspended') && ( + {(status === 'running' || status === 'paused') && (
)} - {status !== 'running' && status !== 'suspended' && ( + {status !== 'running' && status !== 'paused' && ( {time ? `${time?.toFixed(3)}s` : '-'} )}
@@ -105,10 +105,10 @@ const StatusPanel: FC = ({
{t('runLog.resultPanel.tokens')}
- {(status === 'running' || status === 'suspended') && ( + {(status === 'running' || status === 'paused') && (
)} - {status !== 'running' && status !== 'suspended' && ( + {status !== 'running' && status !== 'paused' && ( {`${tokens || 0} Tokens`} )}
@@ -157,7 +157,7 @@ const StatusPanel: FC = ({ ) } - {status === 'suspended' && ( + {status === 'paused' && ( <>
diff --git a/web/app/components/workflow/store/workflow/workflow-slice.ts b/web/app/components/workflow/store/workflow/workflow-slice.ts index 3b9115c73b..5a479d3e44 100644 --- a/web/app/components/workflow/store/workflow/workflow-slice.ts +++ b/web/app/components/workflow/store/workflow/workflow-slice.ts @@ -9,7 +9,7 @@ import type { FileUploadConfigResponse } from '@/models/common' type PreviewRunningData = WorkflowRunningData & { resultTabActive?: boolean resultText?: string - // human input form schema or data cached when node is in 'Suspended' status + // human input form schema or data cached when node is in 'Paused' status extraContentAndFormData?: Record } diff --git a/web/app/components/workflow/types.ts b/web/app/components/workflow/types.ts index 14ba295a6f..6cd7395200 100644 --- a/web/app/components/workflow/types.ts +++ b/web/app/components/workflow/types.ts @@ -351,7 +351,7 @@ export enum WorkflowRunningStatus { Succeeded = 'succeeded', Failed = 'failed', Stopped = 'stopped', - Suspended = 'suspended', + Paused = 'paused', } export enum WorkflowVersion { @@ -369,7 +369,7 @@ export enum NodeRunningStatus { Exception = 'exception', Retry = 'retry', Stopped = 'stopped', - Suspended = 'suspended', + Paused = 'paused', } export type OnNodeAdd = ( diff --git a/web/service/base.ts b/web/service/base.ts index 0195dc5ed8..4b60a791e3 100644 --- a/web/service/base.ts +++ b/web/service/base.ts @@ -22,8 +22,8 @@ import type { TextChunkResponse, TextReplaceResponse, WorkflowFinishedResponse, + WorkflowPausedResponse, WorkflowStartedResponse, - WorkflowSuspendedResponse, } from '@/types/workflow' import Cookies from 'js-cookie' import Toast from '@/app/components/base/toast' @@ -73,7 +73,7 @@ export type IOnLoopFinished = (workflowFinished: LoopFinishedResponse) => void export type IOnAgentLog = (agentLog: AgentLogResponse) => void export type IOHumanInputRequired = (humanInputRequired: HumanInputRequiredResponse) => void -export type IOWorkflowSuspended = (workflowSuspended: WorkflowSuspendedResponse) => void +export type IOWorkflowPaused = (workflowPaused: WorkflowPausedResponse) => void export type IOnDataSourceNodeProcessing = (dataSourceNodeProcessing: DataSourceNodeProcessingResponse) => void export type IOnDataSourceNodeCompleted = (dataSourceNodeCompleted: DataSourceNodeCompletedResponse) => void export type IOnDataSourceNodeError = (dataSourceNodeError: DataSourceNodeErrorResponse) => void @@ -113,7 +113,7 @@ export type IOtherOptions = { onLoopFinish?: IOnLoopFinished onAgentLog?: IOnAgentLog onHumanInputRequired?: IOHumanInputRequired - onWorkflowSuspended?: IOWorkflowSuspended + onWorkflowPaused?: IOWorkflowPaused // Pipeline data source node run onDataSourceNodeProcessing?: IOnDataSourceNodeProcessing @@ -197,7 +197,7 @@ export const handleStream = ( onTextReplace?: IOnTextReplace, onAgentLog?: IOnAgentLog, onHumanInputRequired?: IOHumanInputRequired, - onWorkflowSuspended?: IOWorkflowSuspended, + onWorkflowPaused?: IOWorkflowPaused, onDataSourceNodeProcessing?: IOnDataSourceNodeProcessing, onDataSourceNodeCompleted?: IOnDataSourceNodeCompleted, onDataSourceNodeError?: IOnDataSourceNodeError, @@ -323,7 +323,7 @@ export const handleStream = ( onHumanInputRequired?.(bufferObj as HumanInputRequiredResponse) } else if (bufferObj.event === 'workflow_paused') { - onWorkflowSuspended?.(bufferObj as WorkflowSuspendedResponse) + onWorkflowPaused?.(bufferObj as WorkflowPausedResponse) } else if (bufferObj.event === 'datasource_processing') { onDataSourceNodeProcessing?.(bufferObj as DataSourceNodeProcessingResponse) @@ -448,7 +448,7 @@ export const ssePost = async ( onLoopNext, onLoopFinish, onHumanInputRequired, - onWorkflowSuspended, + onWorkflowPaused, onDataSourceNodeProcessing, onDataSourceNodeCompleted, onDataSourceNodeError, @@ -551,7 +551,7 @@ export const ssePost = async ( onTextReplace, onAgentLog, onHumanInputRequired, - onWorkflowSuspended, + onWorkflowPaused, onDataSourceNodeProcessing, onDataSourceNodeCompleted, onDataSourceNodeError, @@ -598,7 +598,7 @@ export const sseGet = async ( onLoopNext, onLoopFinish, onHumanInputRequired, - onWorkflowSuspended, + onWorkflowPaused, onDataSourceNodeProcessing, onDataSourceNodeCompleted, onDataSourceNodeError, @@ -694,7 +694,7 @@ export const sseGet = async ( onTextReplace, onAgentLog, onHumanInputRequired, - onWorkflowSuspended, + onWorkflowPaused, onDataSourceNodeProcessing, onDataSourceNodeCompleted, onDataSourceNodeError, diff --git a/web/tailwind-common-config.ts b/web/tailwind-common-config.ts index 6fd8c8fada..d9a77ca79d 100644 --- a/web/tailwind-common-config.ts +++ b/web/tailwind-common-config.ts @@ -103,6 +103,7 @@ const config = { 'chat-bubble-bg': 'var(--color-chat-bubble-bg)', 'chat-input-mask': 'var(--color-chat-input-mask)', 'workflow-process-bg': 'var(--color-workflow-process-bg)', + 'workflow-process-paused-bg': 'var(--color-workflow-process-paused-bg)', 'workflow-run-failed-bg': 'var(--color-workflow-run-failed-bg)', 'workflow-batch-failed-bg': 'var(--color-workflow-batch-failed-bg)', 'mask-top2bottom-gray-50-to-transparent': 'var(--mask-top2bottom-gray-50-to-transparent)', diff --git a/web/themes/manual-dark.css b/web/themes/manual-dark.css index 98bc5801fb..30ee93668e 100644 --- a/web/themes/manual-dark.css +++ b/web/themes/manual-dark.css @@ -11,7 +11,7 @@ html[data-theme="dark"] { --color-workflow-process-bg: linear-gradient(90deg, rgba(24, 24, 27, 0.25) 0%, rgba(24, 24, 27, 0.04) 100%); - --color-workflow-process-suspended-bg: linear-gradient(90deg, + --color-workflow-process-paused-bg: linear-gradient(90deg, rgba(247, 144, 9, 0.14) 0%, rgba(247, 144, 9, 0.00) 100%); --color-workflow-process-failed-bg: linear-gradient(90deg, diff --git a/web/themes/manual-light.css b/web/themes/manual-light.css index 86e8c7172d..74eff30892 100644 --- a/web/themes/manual-light.css +++ b/web/themes/manual-light.css @@ -11,7 +11,7 @@ html[data-theme="light"] { --color-workflow-process-bg: linear-gradient(90deg, rgba(200, 206, 218, 0.2) 0%, rgba(200, 206, 218, 0.04) 100%); - --color-workflow-process-suspended-bg: linear-gradient(90deg, + --color-workflow-process-paused-bg: linear-gradient(90deg, #FFFAEB 0%, rgba(255, 250, 235, 0.00) 100%); --color-workflow-process-failed-bg: linear-gradient(90deg, diff --git a/web/types/workflow.ts b/web/types/workflow.ts index aae5242a10..7e16f41209 100644 --- a/web/types/workflow.ts +++ b/web/types/workflow.ts @@ -168,15 +168,15 @@ export type WorkflowStartedResponse = { } } -export type WorkflowSuspendedResponse = { +export type WorkflowPausedResponse = { task_id: string workflow_run_id: string event: string data: { - id: string - workflow_id: string - created_at: number - suspended_at_node_ids: string[] + outputs: any // todo: remove any + paused_nodes: string[] + reasons: any[] // todo: remove any + workflow_run_id: string } }