Spaces:
Build error
Build error
import { useContext } from 'react' | |
import { | |
useStore as useZustandStore, | |
} from 'zustand' | |
import { createStore } from 'zustand/vanilla' | |
import { debounce } from 'lodash-es' | |
import type { Viewport } from 'reactflow' | |
import type { | |
HelpLineHorizontalPosition, | |
HelpLineVerticalPosition, | |
} from './help-line/types' | |
import type { VariableAssignerNodeType } from './nodes/variable-assigner/types' | |
import type { | |
ConversationVariable, | |
Edge, | |
EnvironmentVariable, | |
HistoryWorkflowData, | |
Node, | |
RunFile, | |
ToolWithProvider, | |
WorkflowRunningData, | |
} from './types' | |
import { WorkflowContext } from './context' | |
import type { NodeTracing } from '@/types/workflow' | |
// #TODO chatVar# | |
// const MOCK_DATA = [ | |
// { | |
// id: 'fjlaksdjflkjg-dfjlajfl0dnfkafjk-djfdkafj-djfak', | |
// name: 'chat_history', | |
// value_type: 'array[message]', | |
// value: [], | |
// description: 'The chat history of the conversation', | |
// }, | |
// { | |
// id: 'fljdaklfjl-dfjlafj0-dklajglje-eknglh', | |
// name: 'order_id', | |
// value: '123456', | |
// value_type: 'string', | |
// description: '', | |
// }, | |
// ] | |
type PreviewRunningData = WorkflowRunningData & { | |
resultTabActive?: boolean | |
resultText?: string | |
} | |
type Shape = { | |
appId: string | |
panelWidth: number | |
showSingleRunPanel: boolean | |
setShowSingleRunPanel: (showSingleRunPanel: boolean) => void | |
workflowRunningData?: PreviewRunningData | |
setWorkflowRunningData: (workflowData: PreviewRunningData) => void | |
historyWorkflowData?: HistoryWorkflowData | |
setHistoryWorkflowData: (historyWorkflowData?: HistoryWorkflowData) => void | |
showRunHistory: boolean | |
setShowRunHistory: (showRunHistory: boolean) => void | |
showFeaturesPanel: boolean | |
setShowFeaturesPanel: (showFeaturesPanel: boolean) => void | |
helpLineHorizontal?: HelpLineHorizontalPosition | |
setHelpLineHorizontal: (helpLineHorizontal?: HelpLineHorizontalPosition) => void | |
helpLineVertical?: HelpLineVerticalPosition | |
setHelpLineVertical: (helpLineVertical?: HelpLineVerticalPosition) => void | |
draftUpdatedAt: number | |
setDraftUpdatedAt: (draftUpdatedAt: number) => void | |
publishedAt: number | |
setPublishedAt: (publishedAt: number) => void | |
showInputsPanel: boolean | |
setShowInputsPanel: (showInputsPanel: boolean) => void | |
inputs: Record<string, string> | |
setInputs: (inputs: Record<string, string>) => void | |
toolPublished: boolean | |
setToolPublished: (toolPublished: boolean) => void | |
files: RunFile[] | |
setFiles: (files: RunFile[]) => void | |
backupDraft?: { | |
nodes: Node[] | |
edges: Edge[] | |
viewport: Viewport | |
features: Record<string, any> | |
environmentVariables: EnvironmentVariable[] | |
} | |
setBackupDraft: (backupDraft?: Shape['backupDraft']) => void | |
notInitialWorkflow: boolean | |
setNotInitialWorkflow: (notInitialWorkflow: boolean) => void | |
nodesDefaultConfigs: Record<string, any> | |
setNodesDefaultConfigs: (nodesDefaultConfigs: Record<string, any>) => void | |
nodeAnimation: boolean | |
setNodeAnimation: (nodeAnimation: boolean) => void | |
isRestoring: boolean | |
setIsRestoring: (isRestoring: boolean) => void | |
debouncedSyncWorkflowDraft: (fn: () => void) => void | |
buildInTools: ToolWithProvider[] | |
setBuildInTools: (tools: ToolWithProvider[]) => void | |
customTools: ToolWithProvider[] | |
setCustomTools: (tools: ToolWithProvider[]) => void | |
workflowTools: ToolWithProvider[] | |
setWorkflowTools: (tools: ToolWithProvider[]) => void | |
clipboardElements: Node[] | |
setClipboardElements: (clipboardElements: Node[]) => void | |
showDebugAndPreviewPanel: boolean | |
setShowDebugAndPreviewPanel: (showDebugAndPreviewPanel: boolean) => void | |
showEnvPanel: boolean | |
setShowEnvPanel: (showEnvPanel: boolean) => void | |
environmentVariables: EnvironmentVariable[] | |
setEnvironmentVariables: (environmentVariables: EnvironmentVariable[]) => void | |
envSecrets: Record<string, string> | |
setEnvSecrets: (envSecrets: Record<string, string>) => void | |
showChatVariablePanel: boolean | |
setShowChatVariablePanel: (showChatVariablePanel: boolean) => void | |
showGlobalVariablePanel: boolean | |
setShowGlobalVariablePanel: (showGlobalVariablePanel: boolean) => void | |
conversationVariables: ConversationVariable[] | |
setConversationVariables: (conversationVariables: ConversationVariable[]) => void | |
selection: null | { x1: number; y1: number; x2: number; y2: number } | |
setSelection: (selection: Shape['selection']) => void | |
bundleNodeSize: { width: number; height: number } | null | |
setBundleNodeSize: (bundleNodeSize: Shape['bundleNodeSize']) => void | |
controlMode: 'pointer' | 'hand' | |
setControlMode: (controlMode: Shape['controlMode']) => void | |
candidateNode?: Node | |
setCandidateNode: (candidateNode?: Node) => void | |
panelMenu?: { | |
top: number | |
left: number | |
} | |
setPanelMenu: (panelMenu: Shape['panelMenu']) => void | |
nodeMenu?: { | |
top: number | |
left: number | |
nodeId: string | |
} | |
setNodeMenu: (nodeMenu: Shape['nodeMenu']) => void | |
mousePosition: { pageX: number; pageY: number; elementX: number; elementY: number } | |
setMousePosition: (mousePosition: Shape['mousePosition']) => void | |
syncWorkflowDraftHash: string | |
setSyncWorkflowDraftHash: (hash: string) => void | |
showConfirm?: { title: string; desc?: string; onConfirm: () => void } | |
setShowConfirm: (showConfirm: Shape['showConfirm']) => void | |
showAssignVariablePopup?: { | |
nodeId: string | |
nodeData: Node['data'] | |
variableAssignerNodeId: string | |
variableAssignerNodeData: VariableAssignerNodeType | |
variableAssignerNodeHandleId: string | |
parentNode?: Node | |
x: number | |
y: number | |
} | |
setShowAssignVariablePopup: (showAssignVariablePopup: Shape['showAssignVariablePopup']) => void | |
hoveringAssignVariableGroupId?: string | |
setHoveringAssignVariableGroupId: (hoveringAssignVariableGroupId?: string) => void | |
connectingNodePayload?: { nodeId: string; nodeType: string; handleType: string; handleId: string | null } | |
setConnectingNodePayload: (startConnectingPayload?: Shape['connectingNodePayload']) => void | |
enteringNodePayload?: { | |
nodeId: string | |
nodeData: VariableAssignerNodeType | |
} | |
setEnteringNodePayload: (enteringNodePayload?: Shape['enteringNodePayload']) => void | |
isSyncingWorkflowDraft: boolean | |
setIsSyncingWorkflowDraft: (isSyncingWorkflowDraft: boolean) => void | |
controlPromptEditorRerenderKey: number | |
setControlPromptEditorRerenderKey: (controlPromptEditorRerenderKey: number) => void | |
showImportDSLModal: boolean | |
setShowImportDSLModal: (showImportDSLModal: boolean) => void | |
showTips: string | |
setShowTips: (showTips: string) => void | |
iterTimes: number | |
setIterTimes: (iterTimes: number) => void | |
iterParallelLogMap: Map<string, NodeTracing[]> | |
setIterParallelLogMap: (iterParallelLogMap: Map<string, NodeTracing[]>) => void | |
} | |
export const createWorkflowStore = () => { | |
const hideAllPanel = { | |
showDebugAndPreviewPanel: false, | |
showEnvPanel: false, | |
showChatVariablePanel: false, | |
showGlobalVariablePanel: false, | |
} | |
return createStore<Shape>(set => ({ | |
appId: '', | |
panelWidth: localStorage.getItem('workflow-node-panel-width') ? parseFloat(localStorage.getItem('workflow-node-panel-width')!) : 420, | |
showSingleRunPanel: false, | |
setShowSingleRunPanel: showSingleRunPanel => set(() => ({ showSingleRunPanel })), | |
workflowRunningData: undefined, | |
setWorkflowRunningData: workflowRunningData => set(() => ({ workflowRunningData })), | |
historyWorkflowData: undefined, | |
setHistoryWorkflowData: historyWorkflowData => set(() => ({ historyWorkflowData })), | |
showRunHistory: false, | |
setShowRunHistory: showRunHistory => set(() => ({ showRunHistory })), | |
showFeaturesPanel: false, | |
setShowFeaturesPanel: showFeaturesPanel => set(() => ({ showFeaturesPanel })), | |
helpLineHorizontal: undefined, | |
setHelpLineHorizontal: helpLineHorizontal => set(() => ({ helpLineHorizontal })), | |
helpLineVertical: undefined, | |
setHelpLineVertical: helpLineVertical => set(() => ({ helpLineVertical })), | |
draftUpdatedAt: 0, | |
setDraftUpdatedAt: draftUpdatedAt => set(() => ({ draftUpdatedAt: draftUpdatedAt ? draftUpdatedAt * 1000 : 0 })), | |
publishedAt: 0, | |
setPublishedAt: publishedAt => set(() => ({ publishedAt: publishedAt ? publishedAt * 1000 : 0 })), | |
showInputsPanel: false, | |
setShowInputsPanel: showInputsPanel => set(() => ({ showInputsPanel })), | |
inputs: {}, | |
setInputs: inputs => set(() => ({ inputs })), | |
toolPublished: false, | |
setToolPublished: toolPublished => set(() => ({ toolPublished })), | |
files: [], | |
setFiles: files => set(() => ({ files })), | |
backupDraft: undefined, | |
setBackupDraft: backupDraft => set(() => ({ backupDraft })), | |
notInitialWorkflow: false, | |
setNotInitialWorkflow: notInitialWorkflow => set(() => ({ notInitialWorkflow })), | |
nodesDefaultConfigs: {}, | |
setNodesDefaultConfigs: nodesDefaultConfigs => set(() => ({ nodesDefaultConfigs })), | |
nodeAnimation: false, | |
setNodeAnimation: nodeAnimation => set(() => ({ nodeAnimation })), | |
isRestoring: false, | |
setIsRestoring: isRestoring => set(() => ({ isRestoring })), | |
debouncedSyncWorkflowDraft: debounce((syncWorkflowDraft) => { | |
syncWorkflowDraft() | |
}, 5000), | |
buildInTools: [], | |
setBuildInTools: buildInTools => set(() => ({ buildInTools })), | |
customTools: [], | |
setCustomTools: customTools => set(() => ({ customTools })), | |
workflowTools: [], | |
setWorkflowTools: workflowTools => set(() => ({ workflowTools })), | |
clipboardElements: [], | |
setClipboardElements: clipboardElements => set(() => ({ clipboardElements })), | |
showDebugAndPreviewPanel: false, | |
setShowDebugAndPreviewPanel: showDebugAndPreviewPanel => set(() => ({ showDebugAndPreviewPanel })), | |
showEnvPanel: false, | |
setShowEnvPanel: showEnvPanel => set(() => ({ showEnvPanel })), | |
environmentVariables: [], | |
setEnvironmentVariables: environmentVariables => set(() => ({ environmentVariables })), | |
envSecrets: {}, | |
setEnvSecrets: envSecrets => set(() => ({ envSecrets })), | |
showChatVariablePanel: false, | |
setShowChatVariablePanel: showChatVariablePanel => set(() => ({ showChatVariablePanel })), | |
showGlobalVariablePanel: false, | |
setShowGlobalVariablePanel: showGlobalVariablePanel => set(() => { | |
if (showGlobalVariablePanel) | |
return { ...hideAllPanel, showGlobalVariablePanel: true } | |
else | |
return { showGlobalVariablePanel: false } | |
}), | |
conversationVariables: [], | |
setConversationVariables: conversationVariables => set(() => ({ conversationVariables })), | |
selection: null, | |
setSelection: selection => set(() => ({ selection })), | |
bundleNodeSize: null, | |
setBundleNodeSize: bundleNodeSize => set(() => ({ bundleNodeSize })), | |
controlMode: localStorage.getItem('workflow-operation-mode') === 'pointer' ? 'pointer' : 'hand', | |
setControlMode: (controlMode) => { | |
set(() => ({ controlMode })) | |
localStorage.setItem('workflow-operation-mode', controlMode) | |
}, | |
candidateNode: undefined, | |
setCandidateNode: candidateNode => set(() => ({ candidateNode })), | |
panelMenu: undefined, | |
setPanelMenu: panelMenu => set(() => ({ panelMenu })), | |
nodeMenu: undefined, | |
setNodeMenu: nodeMenu => set(() => ({ nodeMenu })), | |
mousePosition: { pageX: 0, pageY: 0, elementX: 0, elementY: 0 }, | |
setMousePosition: mousePosition => set(() => ({ mousePosition })), | |
syncWorkflowDraftHash: '', | |
setSyncWorkflowDraftHash: syncWorkflowDraftHash => set(() => ({ syncWorkflowDraftHash })), | |
showConfirm: undefined, | |
setShowConfirm: showConfirm => set(() => ({ showConfirm })), | |
showAssignVariablePopup: undefined, | |
setShowAssignVariablePopup: showAssignVariablePopup => set(() => ({ showAssignVariablePopup })), | |
hoveringAssignVariableGroupId: undefined, | |
setHoveringAssignVariableGroupId: hoveringAssignVariableGroupId => set(() => ({ hoveringAssignVariableGroupId })), | |
connectingNodePayload: undefined, | |
setConnectingNodePayload: connectingNodePayload => set(() => ({ connectingNodePayload })), | |
enteringNodePayload: undefined, | |
setEnteringNodePayload: enteringNodePayload => set(() => ({ enteringNodePayload })), | |
isSyncingWorkflowDraft: false, | |
setIsSyncingWorkflowDraft: isSyncingWorkflowDraft => set(() => ({ isSyncingWorkflowDraft })), | |
controlPromptEditorRerenderKey: 0, | |
setControlPromptEditorRerenderKey: controlPromptEditorRerenderKey => set(() => ({ controlPromptEditorRerenderKey })), | |
showImportDSLModal: false, | |
setShowImportDSLModal: showImportDSLModal => set(() => ({ showImportDSLModal })), | |
showTips: '', | |
setShowTips: showTips => set(() => ({ showTips })), | |
iterTimes: 1, | |
setIterTimes: iterTimes => set(() => ({ iterTimes })), | |
iterParallelLogMap: new Map<string, NodeTracing[]>(), | |
setIterParallelLogMap: iterParallelLogMap => set(() => ({ iterParallelLogMap })), | |
})) | |
} | |
export function useStore<T>(selector: (state: Shape) => T): T { | |
const store = useContext(WorkflowContext) | |
if (!store) | |
throw new Error('Missing WorkflowContext.Provider in the tree') | |
return useZustandStore(store, selector) | |
} | |
export const useWorkflowStore = () => { | |
return useContext(WorkflowContext)! | |
} | |