From 2f2e4ad8d091ef6558568324ec6b6d805fe072a2 Mon Sep 17 00:00:00 2001 From: mlogclub Date: Thu, 25 Jun 2026 19:18:25 +0800 Subject: [PATCH] feat: add workflow restoration functionality and enhance workflow editor actions --- .../_components/config-workbench.tsx | 71 ++++++----- .../_components/workflow-editor.tsx | 111 ++++++++++++++++++ 2 files changed, 145 insertions(+), 37 deletions(-) diff --git a/web/app/dashboard/ai-agents/_components/config-workbench.tsx b/web/app/dashboard/ai-agents/_components/config-workbench.tsx index 4858ac3..61f6da7 100644 --- a/web/app/dashboard/ai-agents/_components/config-workbench.tsx +++ b/web/app/dashboard/ai-agents/_components/config-workbench.tsx @@ -6,7 +6,6 @@ import { ArrowUpIcon, BotMessageSquareIcon, BrainCircuitIcon, - CheckCircle2Icon, DatabaseIcon, GitBranchIcon, HistoryIcon, @@ -165,6 +164,7 @@ export function AIAgentConfigWorkbench({ const [directTools, setDirectTools] = useState([]) const [definition, setDefinition] = useState(fallbackDefinition) + const [workflowEditorKey, setWorkflowEditorKey] = useState(0) const [aiConfigs, setAIConfigs] = useState([]) const [knowledgeBases, setKnowledgeBases] = useState([]) @@ -181,6 +181,11 @@ export function AIAgentConfigWorkbench({ setCurrentAgentId(agentId ?? null) }, [agentId]) + const replaceWorkflowDefinition = useCallback((nextDefinition: AIWorkflowDefinition) => { + setDefinition(nextDefinition) + setWorkflowEditorKey((current) => current + 1) + }, []) + const loadData = useCallback(async () => { setLoading(true) try { @@ -227,7 +232,7 @@ export function AIAgentConfigWorkbench({ setSelectedTeamIds([]) setSelectedSkillIds([]) setDirectTools([]) - setDefinition(defaultDefinition ?? fallbackDefinition) + replaceWorkflowDefinition(defaultDefinition ?? fallbackDefinition) setValidation(null) return } @@ -259,14 +264,14 @@ export function AIAgentConfigWorkbench({ setSelectedTeamIds((agentDetail.teams ?? []).map((team) => team.id)) setSelectedSkillIds(agentDetail.skillIds ?? []) setDirectTools(agentDetail.directTools ?? []) - setDefinition(workflowDetail.draftDefinition ?? defaultDefinition ?? fallbackDefinition) + replaceWorkflowDefinition(workflowDetail.draftDefinition ?? defaultDefinition ?? fallbackDefinition) setValidation(null) } catch (error) { toast.error(error instanceof Error ? error.message : "Failed to load Agent config") } finally { setLoading(false) } - }, [currentAgentId]) + }, [currentAgentId, replaceWorkflowDefinition]) useEffect(() => { void loadData() @@ -463,6 +468,21 @@ export function AIAgentConfigWorkbench({ } } + async function restoreDefaultWorkflow() { + if (savingWorkflow || loading) return + setSavingWorkflow(true) + try { + const defaultDefinition = await fetchAIWorkflowDefaultDefinition() + replaceWorkflowDefinition(defaultDefinition ?? fallbackDefinition) + setValidation(null) + toast.success("已恢复默认流程,保存草稿或发布后生效") + } catch (error) { + toast.error(error instanceof Error ? error.message : "恢复默认流程失败") + } finally { + setSavingWorkflow(false) + } + } + async function publishWorkflow() { if (!currentAgentId) return setSavingWorkflow(true) @@ -539,39 +559,7 @@ export function AIAgentConfigWorkbench({
{activeSection === "workflow" ? ( - <> - {validation ? ( - - {validation.valid ? "校验通过" : `${validation.errors.length} 个问题`} - - ) : null} - - - - + null ) : ( <> + ) : null} + {onSaveDraft ? ( + + ) : null} + {onPublish ? ( + + ) : null} +
+ ) +} + function WorkflowHistoryControls({ canUndo, canRedo, onUndo, onRedo, + onRestoreDefault, + restoreDefaultDisabled, }: { canUndo: boolean canRedo: boolean onUndo: () => void onRedo: () => void + onRestoreDefault?: () => void + restoreDefaultDisabled?: boolean }) { return (
@@ -1646,6 +1743,20 @@ function WorkflowHistoryControls({ > + {onRestoreDefault ? ( + + ) : null}
) }