import type { NodeWithVar, VarInInspect } from '@/types/workflow' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { useStoreApi } from 'reactflow' import type { ToolWithProvider } from '@/app/components/workflow/types' import type { Node } from '@/app/components/workflow/types' import { fetchAllInspectVars } from '@/service/workflow' import { useInvalidateConversationVarValues, useInvalidateSysVarValues } from '@/service/use-workflow' import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync' import type { FlowType } from '@/types/common' import useMatchSchemaType, { getMatchedSchemaType } from '../nodes/_base/components/variable/use-match-schema-type' import { toNodeOutputVars } from '../nodes/_base/components/variable/utils' import type { SchemaTypeDefinition } from '@/service/use-common' import { useCallback } from 'react' type Params = { flowType: FlowType flowId: string } export const useSetWorkflowVarsWithValue = ({ flowType, flowId, }: Params) => { const workflowStore = useWorkflowStore() const store = useStoreApi() const invalidateConversationVarValues = useInvalidateConversationVarValues(flowType, flowId) const invalidateSysVarValues = useInvalidateSysVarValues(flowType, flowId) const { handleCancelAllNodeSuccessStatus } = useNodesInteractionsWithoutSync() const { schemaTypeDefinitions } = useMatchSchemaType() const buildInTools = useStore(s => s.buildInTools) const customTools = useStore(s => s.customTools) const workflowTools = useStore(s => s.workflowTools) const mcpTools = useStore(s => s.mcpTools) const dataSourceList = useStore(s => s.dataSourceList) const allPluginInfoList = { buildInTools, customTools, workflowTools, mcpTools, dataSourceList: dataSourceList ?? [], } const setInspectVarsToStore = (inspectVars: VarInInspect[], passedInAllPluginInfoList?: Record, passedInSchemaTypeDefinitions?: SchemaTypeDefinition[]) => { const { setNodesWithInspectVars } = workflowStore.getState() const { getNodes } = store.getState() const nodeArr = getNodes() const allNodesOutputVars = toNodeOutputVars(nodeArr, false, () => true, [], [], [], passedInAllPluginInfoList || allPluginInfoList, passedInSchemaTypeDefinitions || schemaTypeDefinitions) const nodesKeyValue: Record = {} nodeArr.forEach((node) => { nodesKeyValue[node.id] = node }) const withValueNodeIds: Record = {} inspectVars.forEach((varItem) => { const nodeId = varItem.selector[0] const node = nodesKeyValue[nodeId] if (!node) return withValueNodeIds[nodeId] = true }) const withValueNodes = Object.keys(withValueNodeIds).map((nodeId) => { return nodesKeyValue[nodeId] }) const res: NodeWithVar[] = withValueNodes.map((node) => { const nodeId = node.id const varsUnderTheNode = inspectVars.filter((varItem) => { return varItem.selector[0] === nodeId }) const nodeVar = allNodesOutputVars.find(item => item.nodeId === nodeId) const nodeWithVar = { nodeId, nodePayload: node.data, nodeType: node.data.type, title: node.data.title, vars: varsUnderTheNode.map((item) => { const schemaType = nodeVar ? nodeVar.vars.find(v => v.variable === item.name)?.schemaType : '' return { ...item, schemaType, } }), isSingRunRunning: false, isValueFetched: false, } return nodeWithVar }) setNodesWithInspectVars(res) } const fetchInspectVars = useCallback(async (params: { passInVars?: boolean, vars?: VarInInspect[], passedInAllPluginInfoList?: Record, passedInSchemaTypeDefinitions?: SchemaTypeDefinition[] }) => { const { passInVars, vars, passedInAllPluginInfoList, passedInSchemaTypeDefinitions } = params invalidateConversationVarValues() invalidateSysVarValues() const data = passInVars ? vars! : await fetchAllInspectVars(flowType, flowId) setInspectVarsToStore(data, passedInAllPluginInfoList, passedInSchemaTypeDefinitions) handleCancelAllNodeSuccessStatus() // to make sure clear node output show the unset status }, [invalidateConversationVarValues, invalidateSysVarValues, flowType, flowId, setInspectVarsToStore, handleCancelAllNodeSuccessStatus, schemaTypeDefinitions, getMatchedSchemaType]) return { fetchInspectVars, } }