123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- 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, Map<string, NodeTracing[]>>
- setIterParallelLogMap: (iterParallelLogMap: Map<string, 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, 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)!
- }
|