From b289e6a2b6bb617d3a61e3a0544ed41dcb26da16 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 9 Feb 2026 15:19:52 +0800 Subject: [PATCH] fix: basic app crash by llm editor use the workflow context --- .../components/base/prompt-editor/index.tsx | 69 +++++++++++++++++-- 1 file changed, 62 insertions(+), 7 deletions(-) diff --git a/web/app/components/base/prompt-editor/index.tsx b/web/app/components/base/prompt-editor/index.tsx index e4a97c163f..ded737f3f4 100644 --- a/web/app/components/base/prompt-editor/index.tsx +++ b/web/app/components/base/prompt-editor/index.tsx @@ -16,6 +16,7 @@ import type { VariableBlockType, WorkflowVariableBlockType, } from './types' +import type { Node as WorkflowNode } from '@/app/components/workflow/types' import type { EventPayload } from '@/context/event-emitter' import { CodeNode } from '@lexical/code' import { LexicalComposer } from '@lexical/react/LexicalComposer' @@ -34,6 +35,8 @@ import { import * as React from 'react' import { useEffect } from 'react' import { Trans } from 'react-i18next' +import { WorkflowContext } from '@/app/components/workflow/context' +import { HooksStoreContext } from '@/app/components/workflow/hooks-store/provider' import { FileReferenceNode } from '@/app/components/workflow/skill/editor/skill-editor/plugins/file-reference-block/node' import { FilePreviewContextProvider } from '@/app/components/workflow/skill/editor/skill-editor/plugins/file-reference-block/preview-context' import FileReferenceReplacementBlock from '@/app/components/workflow/skill/editor/skill-editor/plugins/file-reference-block/replacement-block' @@ -153,6 +156,30 @@ const EnterCommandPlugin: FC<{ onEnter?: (event: KeyboardEvent) => void }> = ({ return null } +type WorkflowAvailableNodesProps = { + nodeId?: string + isSupportSandbox?: boolean + children: (availableNodes: WorkflowNode[]) => React.ReactNode +} + +const WorkflowAvailableNodes: FC = ({ + nodeId, + isSupportSandbox, + children, +}) => { + const { getBeforeNodesInSameBranch } = useWorkflow() + const availableNodes = React.useMemo( + () => nodeId && isSupportSandbox ? getBeforeNodesInSameBranch(nodeId || '') : [], + [getBeforeNodesInSameBranch, isSupportSandbox, nodeId], + ) + + return ( + <> + {children(availableNodes)} + + ) +} + export type PromptEditorProps = { instanceId?: string nodeId?: string @@ -185,7 +212,11 @@ export type PromptEditorProps = { onEnter?: (event: KeyboardEvent) => void } -const PromptEditor: FC = ({ +type PromptEditorContentProps = PromptEditorProps & { + availableNodes: WorkflowNode[] +} + +const PromptEditorContent: FC = ({ instanceId, nodeId, compact, @@ -215,6 +246,7 @@ const PromptEditor: FC = ({ isSupportSandbox, disableToolBlocks, onEnter, + availableNodes, }) => { const { eventEmitter } = useEventEmitterContextContext() const initialConfig = { @@ -264,12 +296,6 @@ const PromptEditor: FC = ({ } as EventPayload) }, [eventEmitter, historyBlock?.history]) - const { getBeforeNodesInSameBranch } = useWorkflow() - const availableNodes = React.useMemo( - () => nodeId && isSupportSandbox ? getBeforeNodesInSameBranch(nodeId || '') : [], - [getBeforeNodesInSameBranch, isSupportSandbox, nodeId], - ) - const toolBlockContextValue = React.useMemo(() => { if (!onToolMetadataChange) return null @@ -491,4 +517,33 @@ const PromptEditor: FC = ({ ) } +const PromptEditor: FC = (props) => { + const workflowStore = React.useContext(WorkflowContext) + const hooksStore = React.useContext(HooksStoreContext) + const hasWorkflowContext = Boolean(workflowStore && hooksStore) + + if (!hasWorkflowContext) { + return ( + + ) + } + + return ( + + {availableNodes => ( + + )} + + ) +} + export default PromptEditor