diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json
index 0569de71067..f98f7a16fa9 100644
--- a/oxlint-suppressions.json
+++ b/oxlint-suppressions.json
@@ -3634,11 +3634,6 @@
"count": 1
}
},
- "web/app/components/rag-pipeline/hooks/index.ts": {
- "no-barrel-files/no-barrel-files": {
- "count": 9
- }
- },
"web/app/components/rag-pipeline/hooks/use-DSL.ts": {
"typescript/no-explicit-any": {
"count": 1
@@ -3891,11 +3886,6 @@
"count": 3
}
},
- "web/app/components/workflow-app/hooks/index.ts": {
- "no-barrel-files/no-barrel-files": {
- "count": 13
- }
- },
"web/app/components/workflow-app/hooks/use-DSL.ts": {
"typescript/no-explicit-any": {
"count": 1
@@ -4035,11 +4025,6 @@
"count": 1
}
},
- "web/app/components/workflow/hooks/index.ts": {
- "no-barrel-files/no-barrel-files": {
- "count": 25
- }
- },
"web/app/components/workflow/hooks/use-checklist.ts": {
"typescript/no-empty-object-type": {
"count": 1
@@ -4068,11 +4053,6 @@
"count": 1
}
},
- "web/app/components/workflow/hooks/use-workflow-run-event/index.ts": {
- "no-barrel-files/no-barrel-files": {
- "count": 19
- }
- },
"web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts": {
"typescript/no-explicit-any": {
"count": 1
diff --git a/web/app/components/app/configuration/config/automatic/instruction-editor-in-workflow.tsx b/web/app/components/app/configuration/config/automatic/instruction-editor-in-workflow.tsx
index d6e0724ee2e..b3d27f30e2a 100644
--- a/web/app/components/app/configuration/config/automatic/instruction-editor-in-workflow.tsx
+++ b/web/app/components/app/configuration/config/automatic/instruction-editor-in-workflow.tsx
@@ -4,7 +4,7 @@ import type { GeneratorType } from './types'
import type { ValueSelector, Var } from '@/app/components/workflow/types'
import * as React from 'react'
import { useCallback } from 'react'
-import { useWorkflowVariableType } from '@/app/components/workflow/hooks'
+import { useWorkflowVariableType } from '@/app/components/workflow/hooks/use-workflow-variables'
import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { VarType } from '@/app/components/workflow/types'
diff --git a/web/app/components/rag-pipeline/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/__tests__/index.spec.tsx
index 47219cca7dd..aee7f2c13a2 100644
--- a/web/app/components/rag-pipeline/__tests__/index.spec.tsx
+++ b/web/app/components/rag-pipeline/__tests__/index.spec.tsx
@@ -9,7 +9,7 @@ vi.mock('@/context/dataset-detail', () => ({
selector({ dataset: pipelineId ? { pipeline_id: pipelineId } : undefined }),
}))
-vi.mock('../hooks', () => ({
+vi.mock('../hooks/use-pipeline-init', () => ({
usePipelineInit: () => pipelineInit,
}))
diff --git a/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-children.spec.tsx b/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-children.spec.tsx
index 6614faa0d17..4eb05f9f445 100644
--- a/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-children.spec.tsx
+++ b/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-children.spec.tsx
@@ -60,11 +60,14 @@ vi.mock('@/app/components/workflow/hooks-store', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-DSL', () => ({
useDSL: () => ({
exportCheck: mockExportCheck,
handleExportDSL: mockHandleExportDSL,
}),
+}))
+
+vi.mock('@/app/components/workflow/hooks/use-panel-interactions', () => ({
usePanelInteractions: () => ({
handlePaneContextmenuCancel: mockHandlePaneContextmenuCancel,
}),
@@ -74,7 +77,7 @@ vi.mock('../../hooks/use-rag-pipeline-search', () => ({
useRagPipelineSearch: mockUseRagPipelineSearch,
}))
-vi.mock('../../../workflow/plugin-dependency', () => ({
+vi.mock('@/app/components/workflow/plugin-dependency', () => ({
default: () =>
,
}))
diff --git a/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-main.spec.tsx b/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-main.spec.tsx
index e384f581b1f..d089b483292 100644
--- a/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-main.spec.tsx
+++ b/web/app/components/rag-pipeline/components/__tests__/rag-pipeline-main.spec.tsx
@@ -17,19 +17,24 @@ vi.mock('@/context/workspace-state', async () => {
}))
})
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-available-nodes-meta-data', () => ({
useAvailableNodesMetaData: () => ({ nodes: [], nodesMap: {} }),
- useDSL: () => ({
- exportCheck: vi.fn(),
- handleExportDSL: vi.fn(),
- }),
+}))
+
+vi.mock('../../hooks/use-DSL', () => ({
useDSLByCanEdit: () => ({
exportCheck: vi.fn(),
handleExportDSL: vi.fn(),
}),
+}))
+
+vi.mock('../../hooks/use-get-run-and-trace-url', () => ({
useGetRunAndTraceUrl: () => ({
getWorkflowRunAndTraceUrl: vi.fn(),
}),
+}))
+
+vi.mock('../../hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
doSyncWorkflowDraft: vi.fn(),
syncWorkflowDraftWhenPageClose: vi.fn(),
@@ -38,16 +43,15 @@ vi.mock('../../hooks', () => ({
doSyncWorkflowDraft: vi.fn(),
syncWorkflowDraftWhenPageClose: vi.fn(),
}),
+}))
+
+vi.mock('../../hooks/use-pipeline-refresh-draft', () => ({
usePipelineRefreshDraft: () => ({
handleRefreshWorkflowDraft: vi.fn(),
}),
- usePipelineRun: () => ({
- handleBackupDraft: vi.fn(),
- handleLoadBackupDraft: vi.fn(),
- handleRestoreFromPublishedWorkflow: vi.fn(),
- handleRun: vi.fn(),
- handleStopRun: vi.fn(),
- }),
+}))
+
+vi.mock('../../hooks/use-pipeline-run', () => ({
usePipelineRunByCanEdit: () => ({
handleBackupDraft: vi.fn(),
handleLoadBackupDraft: vi.fn(),
@@ -55,10 +59,9 @@ vi.mock('../../hooks', () => ({
handleRun: vi.fn(),
handleStopRun: vi.fn(),
}),
- usePipelineStartRun: () => ({
- handleStartWorkflowRun: vi.fn(),
- handleWorkflowStartRunInWorkflow: vi.fn(),
- }),
+}))
+
+vi.mock('../../hooks/use-pipeline-start-run', () => ({
usePipelineStartRunByCanEdit: () => ({
handleStartWorkflowRun: vi.fn(),
handleWorkflowStartRunInWorkflow: vi.fn(),
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/panel/input-field/__tests__/index.spec.tsx
index 84cc234ebb6..59918decc06 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/__tests__/index.spec.tsx
+++ b/web/app/components/rag-pipeline/components/panel/input-field/__tests__/index.spec.tsx
@@ -18,7 +18,7 @@ let mockIsPreviewing = false
let mockIsEditing = false
let mockCanEdit = true
-vi.mock('@/app/components/rag-pipeline/hooks', () => ({
+vi.mock('../../../../hooks/use-input-field-panel', () => ({
useInputFieldPanel: () => ({
closeAllInputFieldPanels: mockCloseAllInputFieldPanels,
toggleInputFieldPreviewPanel: mockToggleInputFieldPreviewPanel,
@@ -61,7 +61,7 @@ vi.mock('@/app/components/workflow/store', () => ({
const mockHandleSyncWorkflowDraft = vi.fn()
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft,
}),
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/field-list/__tests__/hooks.spec.ts b/web/app/components/rag-pipeline/components/panel/input-field/field-list/__tests__/hooks.spec.ts
index 3876c2d535d..25f62b86f38 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/field-list/__tests__/hooks.spec.ts
+++ b/web/app/components/rag-pipeline/components/panel/input-field/field-list/__tests__/hooks.spec.ts
@@ -5,7 +5,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { useFieldList } from '../hooks'
const mockToggleInputFieldEditPanel = vi.fn()
-vi.mock('@/app/components/rag-pipeline/hooks', () => ({
+vi.mock('../../../../../hooks/use-input-field-panel', () => ({
useInputFieldPanel: () => ({
toggleInputFieldEditPanel: mockToggleInputFieldEditPanel,
}),
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/field-list/hooks.ts b/web/app/components/rag-pipeline/components/panel/input-field/field-list/hooks.ts
index a85c90f7025..e7a99b0e46c 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/field-list/hooks.ts
+++ b/web/app/components/rag-pipeline/components/panel/input-field/field-list/hooks.ts
@@ -6,8 +6,8 @@ import { useBoolean } from 'ahooks'
import { produce } from 'immer'
import { useCallback, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks'
import { ChangeType } from '@/app/components/workflow/types'
+import { useInputFieldPanel } from '../../../../hooks/use-input-field-panel'
import { usePipeline } from '../../../../hooks/use-pipeline'
const VARIABLE_PREFIX = 'rag'
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/index.tsx b/web/app/components/rag-pipeline/components/panel/input-field/index.tsx
index a59bae24638..a1544fbb702 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/index.tsx
+++ b/web/app/components/rag-pipeline/components/panel/input-field/index.tsx
@@ -9,11 +9,11 @@ import { useTranslation } from 'react-i18next'
import { useNodes } from 'reactflow'
import Divider from '@/app/components/base/divider'
import { Infotip } from '@/app/components/base/infotip'
-import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks'
-import { useNodesSyncDraft } from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
+import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft'
import { useStore } from '@/app/components/workflow/store'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useInputFieldPanel } from '../../../hooks/use-input-field-panel'
import FieldList from './field-list'
import FooterTip from './footer-tip'
import Datasource from './label-right-content/datasource'
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/__tests__/datasource.spec.tsx b/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/__tests__/datasource.spec.tsx
index b0ab5d53125..5a15d0e035f 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/__tests__/datasource.spec.tsx
+++ b/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/__tests__/datasource.spec.tsx
@@ -2,7 +2,7 @@ import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-so
import { render, screen } from '@testing-library/react'
import Datasource from '../datasource'
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({
useToolIcon: () => 'tool-icon',
}))
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/datasource.tsx b/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/datasource.tsx
index 4c16a1b1af8..1455efc2451 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/datasource.tsx
+++ b/web/app/components/rag-pipeline/components/panel/input-field/label-right-content/datasource.tsx
@@ -1,7 +1,7 @@
import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-source/types'
import * as React from 'react'
import BlockIcon from '@/app/components/workflow/block-icon'
-import { useToolIcon } from '@/app/components/workflow/hooks'
+import { useToolIcon } from '@/app/components/workflow/hooks/use-tool-icon'
import { BlockEnum } from '@/app/components/workflow/types'
type DatasourceProps = {
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/form.spec.tsx b/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/form.spec.tsx
index e721b44984b..292e6572173 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/form.spec.tsx
+++ b/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/form.spec.tsx
@@ -27,7 +27,7 @@ vi.mock('@/app/components/base/form/form-scenarios/base/field', () => ({
default: mockBaseField,
}))
-vi.mock('@/app/components/rag-pipeline/hooks/use-input-fields', () => ({
+vi.mock('../../../../../hooks/use-input-fields', () => ({
useInitialData: mockUseInitialData,
useConfigurations: mockUseConfigurations,
}))
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/index.spec.tsx
index c27ddd72c7a..c34c535c3f9 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/index.spec.tsx
+++ b/web/app/components/rag-pipeline/components/panel/input-field/preview/__tests__/index.spec.tsx
@@ -19,7 +19,7 @@ vi.mock('../../hooks', () => ({
}))
const mockToggleInputFieldPreviewPanel = vi.fn()
-vi.mock('@/app/components/rag-pipeline/hooks', () => ({
+vi.mock('../../../../../hooks/use-input-field-panel', () => ({
useInputFieldPanel: () => ({
toggleInputFieldPreviewPanel: mockToggleInputFieldPreviewPanel,
isPreviewing: true,
@@ -108,7 +108,7 @@ const mapOptionToObject = (option: string) => ({
value: option,
})
-vi.mock('@/app/components/rag-pipeline/hooks/use-input-fields', () => ({
+vi.mock('../../../../../hooks/use-input-fields', () => ({
useInitialData: (variables: RAGPipelineVariables) => {
return React.useMemo(() => {
return variables.reduce(
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/preview/form.tsx b/web/app/components/rag-pipeline/components/panel/input-field/preview/form.tsx
index fda2715f2eb..388bd091e21 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/preview/form.tsx
+++ b/web/app/components/rag-pipeline/components/panel/input-field/preview/form.tsx
@@ -1,10 +1,7 @@
import type { RAGPipelineVariables } from '@/models/pipeline'
import { useAppForm } from '@/app/components/base/form'
import BaseField from '@/app/components/base/form/form-scenarios/base/field'
-import {
- useConfigurations,
- useInitialData,
-} from '@/app/components/rag-pipeline/hooks/use-input-fields'
+import { useConfigurations, useInitialData } from '../../../../hooks/use-input-fields'
type FormProps = {
variables: RAGPipelineVariables
diff --git a/web/app/components/rag-pipeline/components/panel/input-field/preview/index.tsx b/web/app/components/rag-pipeline/components/panel/input-field/preview/index.tsx
index 1b64009f8fb..e00d022d401 100644
--- a/web/app/components/rag-pipeline/components/panel/input-field/preview/index.tsx
+++ b/web/app/components/rag-pipeline/components/panel/input-field/preview/index.tsx
@@ -5,7 +5,7 @@ import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
import Badge from '@/app/components/base/badge'
import Divider from '@/app/components/base/divider'
-import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks'
+import { useInputFieldPanel } from '../../../../hooks/use-input-field-panel'
import { useFloatingRight } from '../hooks'
import DataSource from './data-source'
import ProcessDocuments from './process-documents'
diff --git a/web/app/components/rag-pipeline/components/panel/test-run/__tests__/header.spec.tsx b/web/app/components/rag-pipeline/components/panel/test-run/__tests__/header.spec.tsx
index c420646e8d1..e4e4e69f8c9 100644
--- a/web/app/components/rag-pipeline/components/panel/test-run/__tests__/header.spec.tsx
+++ b/web/app/components/rag-pipeline/components/panel/test-run/__tests__/header.spec.tsx
@@ -17,7 +17,7 @@ vi.mock('@/app/components/workflow/store', () => ({
useWorkflowStore: () => mockWorkflowStore,
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({
useWorkflowInteractions: () => ({
handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel,
}),
diff --git a/web/app/components/rag-pipeline/components/panel/test-run/header.tsx b/web/app/components/rag-pipeline/components/panel/test-run/header.tsx
index a9714da31b6..6521e91495a 100644
--- a/web/app/components/rag-pipeline/components/panel/test-run/header.tsx
+++ b/web/app/components/rag-pipeline/components/panel/test-run/header.tsx
@@ -2,7 +2,7 @@ import { RiCloseLine } from '@remixicon/react'
import * as React from 'react'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
-import { useWorkflowInteractions } from '@/app/components/workflow/hooks'
+import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions'
import { useWorkflowStore } from '@/app/components/workflow/store'
const Header = () => {
diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/__tests__/index.spec.tsx
index dd3f6468be3..0e55689be05 100644
--- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/__tests__/index.spec.tsx
+++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/__tests__/index.spec.tsx
@@ -102,10 +102,13 @@ vi.mock('@/app/components/workflow/store', () => ({
const mockHandleRun = vi.fn()
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({
handleRun: mockHandleRun,
}),
+}))
+
+vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({
useToolIcon: () => ({ type: 'icon', icon: 'test-icon' }),
}))
diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/__tests__/option-card.spec.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/__tests__/option-card.spec.tsx
index 81edc1ab73c..4c10ee9fe08 100644
--- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/__tests__/option-card.spec.tsx
+++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/__tests__/option-card.spec.tsx
@@ -2,7 +2,7 @@ import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-so
import { fireEvent, render, screen } from '@testing-library/react'
import OptionCard from '../option-card'
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({
useToolIcon: () => 'source-icon',
}))
diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/option-card.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/option-card.tsx
index a15f5d05b3b..48aecf54a94 100644
--- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/option-card.tsx
+++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/data-source-options/option-card.tsx
@@ -3,7 +3,7 @@ import { cn } from '@langgenius/dify-ui/cn'
import * as React from 'react'
import { useCallback } from 'react'
import BlockIcon from '@/app/components/workflow/block-icon'
-import { useToolIcon } from '@/app/components/workflow/hooks'
+import { useToolIcon } from '@/app/components/workflow/hooks/use-tool-icon'
import { BlockEnum } from '@/app/components/workflow/types'
type OptionCardProps = {
diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/__tests__/index.spec.tsx
index 066e830fe78..6ab4683fb43 100644
--- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/__tests__/index.spec.tsx
+++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/__tests__/index.spec.tsx
@@ -48,7 +48,7 @@ vi.mock('@/service/use-pipeline', () => ({
const mockUseInitialData = vi.fn()
const mockUseConfigurations = vi.fn()
-vi.mock('@/app/components/rag-pipeline/hooks/use-input-fields', () => ({
+vi.mock('../../../../../../hooks/use-input-fields', () => ({
useInitialData: (variables: RAGPipelineVariables) => mockUseInitialData(variables),
useConfigurations: (variables: RAGPipelineVariables) => mockUseConfigurations(variables),
}))
diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/index.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/index.tsx
index a22d1d7edf9..677847204cb 100644
--- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/index.tsx
+++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/index.tsx
@@ -2,10 +2,7 @@ import type { CustomActionsProps } from '@/app/components/base/form/components/f
import * as React from 'react'
import { useCallback } from 'react'
import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils'
-import {
- useConfigurations,
- useInitialData,
-} from '@/app/components/rag-pipeline/hooks/use-input-fields'
+import { useConfigurations, useInitialData } from '../../../../../hooks/use-input-fields'
import Actions from './actions'
import { useInputVariables } from './hooks'
import Options from './options'
diff --git a/web/app/components/rag-pipeline/components/panel/test-run/preparation/index.tsx b/web/app/components/rag-pipeline/components/panel/test-run/preparation/index.tsx
index 533af1fe847..bbd65538715 100644
--- a/web/app/components/rag-pipeline/components/panel/test-run/preparation/index.tsx
+++ b/web/app/components/rag-pipeline/components/panel/test-run/preparation/index.tsx
@@ -11,7 +11,7 @@ import {
useDataSourceStoreWithSelector,
} from '@/app/components/datasets/documents/create-from-pipeline/data-source/store'
import WebsiteCrawl from '@/app/components/datasets/documents/create-from-pipeline/data-source/website-crawl'
-import { useWorkflowRun } from '@/app/components/workflow/hooks'
+import { useWorkflowRun } from '@/app/components/workflow/hooks/use-workflow-run'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { DatasourceType } from '@/models/pipeline'
import { TransferMethod } from '@/types/app'
diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-children.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-children.tsx
index 066f035ff88..38dd6103808 100644
--- a/web/app/components/rag-pipeline/components/rag-pipeline-children.tsx
+++ b/web/app/components/rag-pipeline/components/rag-pipeline-children.tsx
@@ -2,11 +2,12 @@ import type { EnvironmentVariable } from '@/app/components/workflow/types'
import { memo, useState } from 'react'
import { DSL_EXPORT_CHECK } from '@/app/components/workflow/constants'
import DSLExportConfirmModal from '@/app/components/workflow/dsl-export-confirm-modal'
-import { useDSL, usePanelInteractions } from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
+import { useDSL } from '@/app/components/workflow/hooks/use-DSL'
+import { usePanelInteractions } from '@/app/components/workflow/hooks/use-panel-interactions'
+import PluginDependency from '@/app/components/workflow/plugin-dependency'
+import { useStore } from '@/app/components/workflow/store'
import { useEventEmitterContextContext } from '@/context/event-emitter'
-import PluginDependency from '../../workflow/plugin-dependency'
-import { useStore } from '../../workflow/store'
import { useRagPipelineSearch } from '../hooks/use-rag-pipeline-search'
import RagPipelinePanel from './panel'
import PublishToast from './publish-toast'
diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/run-mode.spec.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/run-mode.spec.tsx
index 205fa856edd..aeadb735879 100644
--- a/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/run-mode.spec.tsx
+++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/__tests__/run-mode.spec.tsx
@@ -33,10 +33,13 @@ vi.mock('@tanstack/react-hotkeys', async (importOriginal) => {
let mockWorkflowRunningData: { task_id: string; result: { status: string } } | undefined
let mockIsPreparingDataSource = false
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({
handleStopRun: mockHandleStopRun,
}),
+}))
+
+vi.mock('@/app/components/workflow/hooks/use-workflow-start-run', () => ({
useWorkflowStartRun: () => ({
handleWorkflowStartRunInWorkflow: mockHandleWorkflowStartRunInWorkflow,
}),
diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx
index 521b3bf1533..1f424db1a38 100644
--- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx
+++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/index.spec.tsx
@@ -100,10 +100,13 @@ vi.mock('@/next/link', () => ({
const mockHandleSyncWorkflowDraft = vi.fn()
const mockHandleCheckBeforePublish = vi.fn().mockResolvedValue(true)
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft,
}),
+}))
+
+vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({
useChecklistBeforePublish: () => ({
handleCheckBeforePublish: mockHandleCheckBeforePublish,
}),
diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx
index 946230c46ce..afa24f487aa 100644
--- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx
+++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/__tests__/popup.spec.tsx
@@ -173,7 +173,7 @@ vi.mock('@/config', async (importOriginal) => ({
MARKETPLACE_API_PREFIX: '/marketplace/api',
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({
useChecklistBeforePublish: () => ({
handleCheckBeforePublish: mockHandleCheckBeforePublish,
}),
diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/index.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/index.tsx
index d6222a20f1e..5757cf6fdbd 100644
--- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/index.tsx
+++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/index.tsx
@@ -7,8 +7,8 @@ import { RiArrowDownSLine } from '@remixicon/react'
import { useBoolean } from 'ahooks'
import { memo, useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { useNodesSyncDraft } from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
+import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft'
import { useStore } from '@/app/components/workflow/store'
import { useDocLink } from '@/context/i18n'
import Link from '@/next/link'
diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx
index 32039faf5e9..b414e3eb394 100644
--- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx
+++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx
@@ -23,7 +23,7 @@ import { trackEvent } from '@/app/components/base/amplitude'
import Divider from '@/app/components/base/divider'
import { SparklesSoft } from '@/app/components/base/icons/src/public/common'
import PremiumBadge from '@/app/components/base/premium-badge'
-import { useChecklistBeforePublish } from '@/app/components/workflow/hooks'
+import { useChecklistBeforePublish } from '@/app/components/workflow/hooks/use-checklist'
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
import { userProfileIdAtom } from '@/context/account-state'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/run-mode.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/run-mode.tsx
index 26ec0765d9d..273b7cd8567 100644
--- a/web/app/components/rag-pipeline/components/rag-pipeline-header/run-mode.tsx
+++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/run-mode.tsx
@@ -5,8 +5,9 @@ import { formatForDisplay, useHotkey } from '@tanstack/react-hotkeys'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import { StopCircle } from '@/app/components/base/icons/src/vender/line/mediaAndDevices'
-import { useWorkflowRun, useWorkflowStartRun } from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
+import { useWorkflowRun } from '@/app/components/workflow/hooks/use-workflow-run'
+import { useWorkflowStartRun } from '@/app/components/workflow/hooks/use-workflow-start-run'
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
import { WorkflowRunningStatus } from '@/app/components/workflow/types'
import { EVENT_WORKFLOW_STOP } from '@/app/components/workflow/variable-inspect/types'
diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx
index 6700c4ea744..c6a2b53fd88 100644
--- a/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx
+++ b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx
@@ -9,17 +9,15 @@ import { userProfileIdAtom } from '@/context/account-state'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
import { workspacePermissionKeysAtom } from '@/context/permission-state'
import { getDatasetACLCapabilities } from '@/utils/permission'
-import {
- useAvailableNodesMetaData,
- useDSLByCanEdit,
- useGetRunAndTraceUrl,
- useNodesSyncDraftByCanEdit,
- usePipelineRefreshDraft,
- usePipelineRunByCanEdit,
- usePipelineStartRunByCanEdit,
-} from '../hooks'
+import { useAvailableNodesMetaData } from '../hooks/use-available-nodes-meta-data'
import { useConfigsMap } from '../hooks/use-configs-map'
+import { useDSLByCanEdit } from '../hooks/use-DSL'
+import { useGetRunAndTraceUrl } from '../hooks/use-get-run-and-trace-url'
import { useInspectVarsCrud } from '../hooks/use-inspect-vars-crud'
+import { useNodesSyncDraftByCanEdit } from '../hooks/use-nodes-sync-draft'
+import { usePipelineRefreshDraft } from '../hooks/use-pipeline-refresh-draft'
+import { usePipelineRunByCanEdit } from '../hooks/use-pipeline-run'
+import { usePipelineStartRunByCanEdit } from '../hooks/use-pipeline-start-run'
import RagPipelineChildren from './rag-pipeline-children'
type RagPipelineMainProps = Pick
diff --git a/web/app/components/rag-pipeline/hooks/__tests__/index.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/index.spec.ts
deleted file mode 100644
index 1828399211c..00000000000
--- a/web/app/components/rag-pipeline/hooks/__tests__/index.spec.ts
+++ /dev/null
@@ -1,489 +0,0 @@
-import type { RAGPipelineVariables, VAR_TYPE_MAP } from '@/models/pipeline'
-import { act } from 'react'
-import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-import { BlockEnum } from '@/app/components/workflow/types'
-import { renderHookWithConsoleQuery as renderHook } from '@/test/console/query-data'
-import { Resolution, TransferMethod } from '@/types/app'
-import { FlowType } from '@/types/common'
-import {
- useAvailableNodesMetaData,
- useGetRunAndTraceUrl,
- useInputFieldPanel,
- useNodesSyncDraft,
- usePipelineInit,
- usePipelineRefreshDraft,
-} from '../index'
-import { useConfigsMap } from '../use-configs-map'
-import { useConfigurations, useInitialData } from '../use-input-fields'
-import { usePipelineTemplate } from '../use-pipeline-template'
-
-const _mockGetState = vi.fn()
-const mockUseStore = vi.fn()
-const mockUseWorkflowStore = vi.fn()
-const toastMocks = vi.hoisted(() => ({
- error: vi.fn(),
-}))
-
-vi.mock('@/app/components/workflow/store', () => ({
- useStore: (selector: (state: Record) => unknown) => mockUseStore(selector),
- useWorkflowStore: () => mockUseWorkflowStore(),
-}))
-
-vi.mock('@langgenius/dify-ui/toast', () => ({
- toast: {
- error: toastMocks.error,
- },
-}))
-
-const mockEventEmit = vi.fn()
-vi.mock('@/context/event-emitter', () => ({
- useEventEmitterContextContext: () => ({
- eventEmitter: {
- emit: mockEventEmit,
- },
- }),
-}))
-
-vi.mock('@/app/components/workflow/constants', () => ({
- DSL_EXPORT_CHECK: 'DSL_EXPORT_CHECK',
- WORKFLOW_DATA_UPDATE: 'WORKFLOW_DATA_UPDATE',
- START_INITIAL_POSITION: { x: 100, y: 100 },
-}))
-
-vi.mock('@/app/components/workflow/constants/node', () => ({
- WORKFLOW_COMMON_NODES: [
- {
- metaData: { type: BlockEnum.Start },
- defaultValue: { type: BlockEnum.Start },
- },
- {
- metaData: { type: BlockEnum.End },
- defaultValue: { type: BlockEnum.End },
- },
- ],
-}))
-
-vi.mock('@/app/components/workflow/nodes/data-source-empty/default', () => ({
- default: {
- metaData: { type: BlockEnum.DataSourceEmpty },
- defaultValue: { type: BlockEnum.DataSourceEmpty },
- },
-}))
-
-vi.mock('@/app/components/workflow/nodes/data-source/default', () => ({
- default: {
- metaData: { type: BlockEnum.DataSource },
- defaultValue: { type: BlockEnum.DataSource },
- },
-}))
-
-vi.mock('@/app/components/workflow/nodes/knowledge-base/default', () => ({
- default: {
- metaData: { type: BlockEnum.KnowledgeBase },
- defaultValue: { type: BlockEnum.KnowledgeBase },
- },
-}))
-
-vi.mock('@/app/components/workflow/utils', async (importOriginal) => {
- const actual = (await importOriginal()) as Record
- return {
- ...actual,
- generateNewNode: ({
- id,
- data,
- position,
- }: {
- id: string
- data: object
- position: { x: number; y: number }
- }) => ({
- newNode: { id, data, position, type: 'custom' },
- }),
- }
-})
-
-const mockExportPipelineConfig = vi.fn()
-vi.mock('@/service/use-pipeline', () => ({
- useExportPipelineDSL: () => ({
- mutateAsync: mockExportPipelineConfig,
- }),
-}))
-
-vi.mock('@/service/workflow', () => ({
- fetchWorkflowDraft: vi.fn().mockResolvedValue({
- graph: { nodes: [], edges: [], viewport: {} },
- environment_variables: [],
- }),
-}))
-
-describe('useConfigsMap', () => {
- beforeEach(() => {
- vi.clearAllMocks()
- mockUseStore.mockImplementation((selector: (state: Record) => unknown) => {
- const state = {
- pipelineId: 'test-pipeline-id',
- fileUploadConfig: { max_file_size: 10 },
- }
- return selector(state)
- })
- })
-
- it('should return config map with correct flowId', () => {
- const { result } = renderHook(() => useConfigsMap())
-
- expect(result.current.flowId).toBe('test-pipeline-id')
- })
-
- it('should return config map with correct flowType', () => {
- const { result } = renderHook(() => useConfigsMap())
-
- expect(result.current.flowType).toBe(FlowType.ragPipeline)
- })
-
- it('should return file settings with image config', () => {
- const { result } = renderHook(() => useConfigsMap())
-
- expect(result.current.fileSettings.image).toEqual({
- enabled: false,
- detail: Resolution.high,
- number_limits: 3,
- transfer_methods: [TransferMethod.local_file, TransferMethod.remote_url],
- })
- })
-
- it('should include fileUploadConfig from store', () => {
- const { result } = renderHook(() => useConfigsMap())
-
- expect(result.current.fileSettings.fileUploadConfig).toEqual({ max_file_size: 10 })
- })
-})
-
-describe('useGetRunAndTraceUrl', () => {
- beforeEach(() => {
- vi.clearAllMocks()
- mockUseWorkflowStore.mockReturnValue({
- getState: () => ({
- pipelineId: 'pipeline-123',
- }),
- })
- })
-
- it('should return getWorkflowRunAndTraceUrl function', () => {
- const { result } = renderHook(() => useGetRunAndTraceUrl())
-
- expect(result.current.getWorkflowRunAndTraceUrl).toBeDefined()
- expect(typeof result.current.getWorkflowRunAndTraceUrl).toBe('function')
- })
-
- it('should generate correct run URL', () => {
- const { result } = renderHook(() => useGetRunAndTraceUrl())
-
- const { runUrl } = result.current.getWorkflowRunAndTraceUrl('run-456')
-
- expect(runUrl).toBe('/rag/pipelines/pipeline-123/workflow-runs/run-456')
- })
-
- it('should generate correct trace URL', () => {
- const { result } = renderHook(() => useGetRunAndTraceUrl())
-
- const { traceUrl } = result.current.getWorkflowRunAndTraceUrl('run-456')
-
- expect(traceUrl).toBe('/rag/pipelines/pipeline-123/workflow-runs/run-456/node-executions')
- })
-})
-
-describe('useInputFieldPanel', () => {
- const mockSetShowInputFieldPanel = vi.fn()
- const mockSetShowInputFieldPreviewPanel = vi.fn()
- const mockSetInputFieldEditPanelProps = vi.fn()
-
- beforeEach(() => {
- vi.clearAllMocks()
- mockUseStore.mockImplementation((selector: (state: Record) => unknown) => {
- const state = {
- showInputFieldPreviewPanel: false,
- inputFieldEditPanelProps: null,
- }
- return selector(state)
- })
- mockUseWorkflowStore.mockReturnValue({
- getState: () => ({
- showInputFieldPreviewPanel: false,
- setShowInputFieldPanel: mockSetShowInputFieldPanel,
- setShowInputFieldPreviewPanel: mockSetShowInputFieldPreviewPanel,
- setInputFieldEditPanelProps: mockSetInputFieldEditPanelProps,
- }),
- })
- })
-
- it('should return isPreviewing as false when showInputFieldPreviewPanel is false', () => {
- const { result } = renderHook(() => useInputFieldPanel())
-
- expect(result.current.isPreviewing).toBe(false)
- })
-
- it('should return isPreviewing as true when showInputFieldPreviewPanel is true', () => {
- mockUseStore.mockImplementation((selector: (state: Record) => unknown) => {
- const state = {
- showInputFieldPreviewPanel: true,
- inputFieldEditPanelProps: null,
- }
- return selector(state)
- })
-
- const { result } = renderHook(() => useInputFieldPanel())
-
- expect(result.current.isPreviewing).toBe(true)
- })
-
- it('should return isEditing as false when inputFieldEditPanelProps is null', () => {
- const { result } = renderHook(() => useInputFieldPanel())
-
- expect(result.current.isEditing).toBe(false)
- })
-
- it('should return isEditing as true when inputFieldEditPanelProps exists', () => {
- mockUseStore.mockImplementation((selector: (state: Record) => unknown) => {
- const state = {
- showInputFieldPreviewPanel: false,
- inputFieldEditPanelProps: { some: 'props' },
- }
- return selector(state)
- })
-
- const { result } = renderHook(() => useInputFieldPanel())
-
- expect(result.current.isEditing).toBe(true)
- })
-
- it('should call all setters when closeAllInputFieldPanels is called', () => {
- const { result } = renderHook(() => useInputFieldPanel())
-
- act(() => {
- result.current.closeAllInputFieldPanels()
- })
-
- expect(mockSetShowInputFieldPanel).toHaveBeenCalledWith(false)
- expect(mockSetShowInputFieldPreviewPanel).toHaveBeenCalledWith(false)
- expect(mockSetInputFieldEditPanelProps).toHaveBeenCalledWith(null)
- })
-
- it('should toggle preview panel when toggleInputFieldPreviewPanel is called', () => {
- const { result } = renderHook(() => useInputFieldPanel())
-
- act(() => {
- result.current.toggleInputFieldPreviewPanel()
- })
-
- expect(mockSetShowInputFieldPreviewPanel).toHaveBeenCalledWith(true)
- })
-
- it('should set edit panel props when toggleInputFieldEditPanel is called', () => {
- const { result } = renderHook(() => useInputFieldPanel())
- const editContent = { onClose: vi.fn(), onSubmit: vi.fn() }
-
- act(() => {
- result.current.toggleInputFieldEditPanel(editContent)
- })
-
- expect(mockSetInputFieldEditPanelProps).toHaveBeenCalledWith(editContent)
- })
-})
-
-describe('useInitialData', () => {
- it('should return empty object for empty variables', () => {
- const { result } = renderHook(() => useInitialData([], undefined))
-
- expect(result.current).toEqual({})
- })
-
- it('should handle text input type with default value', () => {
- const variables: RAGPipelineVariables = [
- {
- type: 'text-input' as keyof typeof VAR_TYPE_MAP,
- variable: 'textVar',
- label: 'Text',
- required: false,
- default_value: 'default text',
- belong_to_node_id: 'node-1',
- },
- ]
-
- const { result } = renderHook(() => useInitialData(variables, undefined))
-
- expect(result.current.textVar).toBe('default text')
- })
-
- it('should use lastRunInputData over default value', () => {
- const variables: RAGPipelineVariables = [
- {
- type: 'text-input' as keyof typeof VAR_TYPE_MAP,
- variable: 'textVar',
- label: 'Text',
- required: false,
- default_value: 'default text',
- belong_to_node_id: 'node-1',
- },
- ]
-
- const { result } = renderHook(() => useInitialData(variables, { textVar: 'last run value' }))
-
- expect(result.current.textVar).toBe('last run value')
- })
-
- it('should handle number input type with default 0', () => {
- const variables: RAGPipelineVariables = [
- {
- type: 'number' as keyof typeof VAR_TYPE_MAP,
- variable: 'numVar',
- label: 'Number',
- required: false,
- belong_to_node_id: 'node-1',
- },
- ]
-
- const { result } = renderHook(() => useInitialData(variables, undefined))
-
- expect(result.current.numVar).toBe(0)
- })
-
- it('should handle file type with default empty array', () => {
- const variables: RAGPipelineVariables = [
- {
- type: 'file' as keyof typeof VAR_TYPE_MAP,
- variable: 'fileVar',
- label: 'File',
- required: false,
- belong_to_node_id: 'node-1',
- },
- ]
-
- const { result } = renderHook(() => useInitialData(variables, undefined))
-
- expect(result.current.fileVar).toEqual([])
- })
-})
-
-describe('useConfigurations', () => {
- it('should return empty array for empty variables', () => {
- const { result } = renderHook(() => useConfigurations([]))
-
- expect(result.current).toEqual([])
- })
-
- it('should transform variables to configurations', () => {
- const variables: RAGPipelineVariables = [
- {
- type: 'text-input' as keyof typeof VAR_TYPE_MAP,
- variable: 'textVar',
- label: 'Text Label',
- required: true,
- max_length: 100,
- placeholder: 'Enter text',
- tooltips: 'Help text',
- belong_to_node_id: 'node-1',
- },
- ]
-
- const { result } = renderHook(() => useConfigurations(variables))
-
- expect(result.current.length).toBe(1)
- expect(result.current[0]!.variable).toBe('textVar')
- expect(result.current[0]!.label).toBe('Text Label')
- expect(result.current[0]!.required).toBe(true)
- expect(result.current[0]!.maxLength).toBe(100)
- expect(result.current[0]!.placeholder).toBe('Enter text')
- expect(result.current[0]!.tooltip).toBe('Help text')
- })
-
- it('should transform options correctly', () => {
- const variables: RAGPipelineVariables = [
- {
- type: 'select' as keyof typeof VAR_TYPE_MAP,
- variable: 'selectVar',
- label: 'Select',
- required: false,
- options: ['option1', 'option2', 'option3'],
- belong_to_node_id: 'node-1',
- },
- ]
-
- const { result } = renderHook(() => useConfigurations(variables))
-
- expect(result.current[0]!.options).toEqual([
- { label: 'option1', value: 'option1' },
- { label: 'option2', value: 'option2' },
- { label: 'option3', value: 'option3' },
- ])
- })
-})
-
-describe('useAvailableNodesMetaData', () => {
- beforeEach(() => {
- vi.clearAllMocks()
- })
-
- it('should return nodes array', () => {
- const { result } = renderHook(() => useAvailableNodesMetaData())
-
- expect(result.current.nodes).toBeDefined()
- expect(Array.isArray(result.current.nodes)).toBe(true)
- })
-
- it('should return nodesMap object', () => {
- const { result } = renderHook(() => useAvailableNodesMetaData())
-
- expect(result.current.nodesMap).toBeDefined()
- expect(typeof result.current.nodesMap).toBe('object')
- })
-})
-
-describe('usePipelineTemplate', () => {
- beforeEach(() => {
- vi.clearAllMocks()
- })
-
- it('should return nodes array with knowledge base node', () => {
- const { result } = renderHook(() => usePipelineTemplate())
-
- expect(result.current.nodes).toBeDefined()
- expect(Array.isArray(result.current.nodes)).toBe(true)
- expect(result.current.nodes.length).toBe(1)
- })
-
- it('should return empty edges array', () => {
- const { result } = renderHook(() => usePipelineTemplate())
-
- expect(result.current.edges).toEqual([])
- })
-})
-
-describe('exports', () => {
- it('should export useAvailableNodesMetaData', () => {
- expect(useAvailableNodesMetaData).toBeDefined()
- })
-
- it('should export useGetRunAndTraceUrl', () => {
- expect(useGetRunAndTraceUrl).toBeDefined()
- })
-
- it('should export useInputFieldPanel', () => {
- expect(useInputFieldPanel).toBeDefined()
- })
-
- it('should export useNodesSyncDraft', () => {
- expect(useNodesSyncDraft).toBeDefined()
- })
-
- it('should export usePipelineInit', () => {
- expect(usePipelineInit).toBeDefined()
- })
-
- it('should export usePipelineRefreshDraft', () => {
- expect(usePipelineRefreshDraft).toBeDefined()
- })
-})
-
-afterEach(() => {
- vi.clearAllMocks()
-})
diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-inspect-vars-crud.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-inspect-vars-crud.spec.ts
index 691d168a751..71322e3f3e9 100644
--- a/web/app/components/rag-pipeline/hooks/__tests__/use-inspect-vars-crud.spec.ts
+++ b/web/app/components/rag-pipeline/hooks/__tests__/use-inspect-vars-crud.spec.ts
@@ -21,7 +21,7 @@ const mockApis = {
}
const mockUseInspectVarsCrudCommon = vi.fn(() => mockApis)
-vi.mock('../../../workflow/hooks/use-inspect-vars-crud-common', () => ({
+vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud-common', () => ({
useInspectVarsCrudCommon: (...args: Parameters) =>
mockUseInspectVarsCrudCommon(...args),
}))
diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-nodes-sync-draft.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-nodes-sync-draft.spec.ts
index f03700c20ee..b92978860c8 100644
--- a/web/app/components/rag-pipeline/hooks/__tests__/use-nodes-sync-draft.spec.ts
+++ b/web/app/components/rag-pipeline/hooks/__tests__/use-nodes-sync-draft.spec.ts
@@ -42,7 +42,7 @@ vi.mock('@/service/workflow', () => ({
}))
const mockHandleRefreshWorkflowDraft = vi.fn()
-vi.mock('@/app/components/rag-pipeline/hooks', () => ({
+vi.mock('../use-pipeline-refresh-draft', () => ({
usePipelineRefreshDraft: () => ({
handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft,
}),
diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-refresh-draft.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-refresh-draft.spec.ts
index 40978e324a2..e98976f1acc 100644
--- a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-refresh-draft.spec.ts
+++ b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-refresh-draft.spec.ts
@@ -11,7 +11,7 @@ vi.mock('@/app/components/workflow/store', () => ({
}))
const mockHandleUpdateWorkflowCanvas = vi.fn()
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({
useWorkflowUpdate: () => ({
handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas,
}),
diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-run.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-run.spec.ts
index cef721bce08..2c7378493bb 100644
--- a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-run.spec.ts
+++ b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-run.spec.ts
@@ -41,7 +41,7 @@ vi.mock('@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars', () =>
}))
const mockHandleUpdateWorkflowCanvas = vi.fn()
-vi.mock('@/app/components/workflow/hooks/use-workflow-interactions', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({
useWorkflowUpdate: () => ({
handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas,
}),
diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-start-run.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-start-run.spec.ts
index f84203a957a..68b7f3abac4 100644
--- a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-start-run.spec.ts
+++ b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline-start-run.spec.ts
@@ -14,17 +14,20 @@ vi.mock('@/app/components/workflow/store', () => ({
}))
const mockHandleCancelDebugAndPreviewPanel = vi.fn()
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({
useWorkflowInteractions: () => ({
handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel,
}),
}))
const mockDoSyncWorkflowDraft = vi.fn()
-vi.mock('@/app/components/rag-pipeline/hooks', () => ({
+vi.mock('../use-nodes-sync-draft', () => ({
useNodesSyncDraftByCanEdit: () => ({
doSyncWorkflowDraft: mockDoSyncWorkflowDraft,
}),
+}))
+
+vi.mock('../use-input-field-panel', () => ({
useInputFieldPanel: () => ({
closeAllInputFieldPanels: vi.fn(),
}),
diff --git a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline.spec.ts b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline.spec.ts
index 514576382c9..6fe02495f03 100644
--- a/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline.spec.ts
+++ b/web/app/components/rag-pipeline/hooks/__tests__/use-pipeline.spec.ts
@@ -26,12 +26,12 @@ vi.mock('reactflow', () => ({
const mockFindUsedVarNodes = vi.fn()
const mockUpdateNodeVars = vi.fn()
-vi.mock('../../../workflow/nodes/_base/components/variable/utils', () => ({
+vi.mock('@/app/components/workflow/nodes/_base/components/variable/utils', () => ({
findUsedVarNodes: (...args: unknown[]) => mockFindUsedVarNodes(...args),
updateNodeVars: (...args: unknown[]) => mockUpdateNodeVars(...args),
}))
-vi.mock('../../../workflow/types', () => ({
+vi.mock('@/app/components/workflow/types', () => ({
BlockEnum: {
DataSource: 'data-source',
},
diff --git a/web/app/components/rag-pipeline/hooks/index.ts b/web/app/components/rag-pipeline/hooks/index.ts
deleted file mode 100644
index c7ad7f6f92a..00000000000
--- a/web/app/components/rag-pipeline/hooks/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-export * from './use-available-nodes-meta-data'
-export * from './use-DSL'
-export * from './use-get-run-and-trace-url'
-export * from './use-input-field-panel'
-export * from './use-nodes-sync-draft'
-export * from './use-pipeline-init'
-export * from './use-pipeline-refresh-draft'
-export * from './use-pipeline-run'
-export * from './use-pipeline-start-run'
diff --git a/web/app/components/rag-pipeline/hooks/use-inspect-vars-crud.ts b/web/app/components/rag-pipeline/hooks/use-inspect-vars-crud.ts
index 48c65e6b301..d35d84fa86e 100644
--- a/web/app/components/rag-pipeline/hooks/use-inspect-vars-crud.ts
+++ b/web/app/components/rag-pipeline/hooks/use-inspect-vars-crud.ts
@@ -1,4 +1,4 @@
-import { useInspectVarsCrudCommon } from '../../workflow/hooks/use-inspect-vars-crud-common'
+import { useInspectVarsCrudCommon } from '@/app/components/workflow/hooks/use-inspect-vars-crud-common'
import { useConfigsMap } from './use-configs-map'
export const useInspectVarsCrud = () => {
diff --git a/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts b/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts
index cf4ff6a8817..0c52fe4abc3 100644
--- a/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts
+++ b/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts
@@ -11,7 +11,7 @@ import { useWorkflowStore } from '@/app/components/workflow/store'
import { API_PREFIX } from '@/config'
import { postWithKeepalive } from '@/service/fetch'
import { syncWorkflowDraft } from '@/service/workflow'
-import { usePipelineRefreshDraft } from '.'
+import { usePipelineRefreshDraft } from './use-pipeline-refresh-draft'
const useNodesSyncDraftBase = (getNodesReadOnly: () => boolean) => {
const store = useStoreApi()
diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline-refresh-draft.ts b/web/app/components/rag-pipeline/hooks/use-pipeline-refresh-draft.ts
index e02a21d7a22..3e7c5bcbd32 100644
--- a/web/app/components/rag-pipeline/hooks/use-pipeline-refresh-draft.ts
+++ b/web/app/components/rag-pipeline/hooks/use-pipeline-refresh-draft.ts
@@ -1,6 +1,6 @@
import type { WorkflowDataUpdater } from '@/app/components/workflow/types'
import { useCallback } from 'react'
-import { useWorkflowUpdate } from '@/app/components/workflow/hooks'
+import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { fetchWorkflowDraft } from '@/service/workflow'
import { processNodesWithoutDataSource } from '../utils'
diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts b/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts
index 7652d62209e..e26a24f2a92 100644
--- a/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts
+++ b/web/app/components/rag-pipeline/hooks/use-pipeline-run.ts
@@ -5,8 +5,8 @@ import { produce } from 'immer'
import { useCallback, useRef } from 'react'
import { useReactFlow, useStoreApi } from 'reactflow'
import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars'
-import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions'
import { useWorkflowRunEvent } from '@/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event'
+import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update'
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
import { WorkflowRunningStatus } from '@/app/components/workflow/types'
import { ssePost } from '@/service/base'
diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline-start-run.tsx b/web/app/components/rag-pipeline/hooks/use-pipeline-start-run.tsx
index b7a5de93a6e..79a47adb54b 100644
--- a/web/app/components/rag-pipeline/hooks/use-pipeline-start-run.tsx
+++ b/web/app/components/rag-pipeline/hooks/use-pipeline-start-run.tsx
@@ -1,9 +1,10 @@
-import type { useNodesSyncDraft } from '.'
+import type { useNodesSyncDraft } from './use-nodes-sync-draft'
import { useCallback } from 'react'
-import { useWorkflowInteractions } from '@/app/components/workflow/hooks'
+import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { WorkflowRunningStatus } from '@/app/components/workflow/types'
-import { useInputFieldPanel, useNodesSyncDraftByCanEdit } from '.'
+import { useInputFieldPanel } from './use-input-field-panel'
+import { useNodesSyncDraftByCanEdit } from './use-nodes-sync-draft'
type DoSyncWorkflowDraft = ReturnType['doSyncWorkflowDraft']
diff --git a/web/app/components/rag-pipeline/hooks/use-pipeline.tsx b/web/app/components/rag-pipeline/hooks/use-pipeline.tsx
index 42c610c4238..a4e54d1752c 100644
--- a/web/app/components/rag-pipeline/hooks/use-pipeline.tsx
+++ b/web/app/components/rag-pipeline/hooks/use-pipeline.tsx
@@ -1,13 +1,13 @@
-import type { DataSourceNodeType } from '../../workflow/nodes/data-source/types'
-import type { Node, ValueSelector } from '../../workflow/types'
+import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-source/types'
+import type { Node, ValueSelector } from '@/app/components/workflow/types'
import { uniqBy } from 'es-toolkit/compat'
import { useCallback } from 'react'
import { getOutgoers, useStoreApi } from 'reactflow'
import {
findUsedVarNodes,
updateNodeVars,
-} from '../../workflow/nodes/_base/components/variable/utils'
-import { BlockEnum } from '../../workflow/types'
+} from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import { BlockEnum } from '@/app/components/workflow/types'
export const usePipeline = () => {
const store = useStoreApi()
diff --git a/web/app/components/rag-pipeline/index.tsx b/web/app/components/rag-pipeline/index.tsx
index dd50fa25e7c..75c7e9bdfc8 100644
--- a/web/app/components/rag-pipeline/index.tsx
+++ b/web/app/components/rag-pipeline/index.tsx
@@ -7,7 +7,7 @@ import { initialEdges, initialNodes } from '@/app/components/workflow/utils'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
import Conversion from './components/conversion'
import RagPipelineMain from './components/rag-pipeline-main'
-import { usePipelineInit } from './hooks'
+import { usePipelineInit } from './hooks/use-pipeline-init'
import { createRagPipelineSliceSlice } from './store'
import { processNodesWithoutDataSource } from './utils'
diff --git a/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx b/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx
index a488e1b86b0..b9cb9c000cf 100644
--- a/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx
+++ b/web/app/components/snippets/components/__tests__/snippet-main.spec.tsx
@@ -82,7 +82,7 @@ vi.mock('@/service/use-snippet-workflows', () => ({
}),
}))
-vi.mock('@/app/components/snippets/hooks/use-configs-map', () => ({
+vi.mock('../../hooks/use-configs-map', () => ({
useConfigsMap: () => ({
flowId: 'snippet-1',
flowType: 'snippet',
@@ -102,15 +102,15 @@ vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({
}),
}))
-vi.mock('@/app/components/workflow-app/hooks', () => ({
+vi.mock('@/app/components/workflow-app/hooks/use-available-nodes-meta-data', () => ({
useAvailableNodesMetaData: () => mockUseAvailableNodesMetaData(),
}))
-vi.mock('@/app/components/snippets/hooks/use-inspect-vars-crud', () => ({
+vi.mock('../../hooks/use-inspect-vars-crud', () => ({
useInspectVarsCrud: () => mockInspectVarsCrud,
}))
-vi.mock('@/app/components/snippets/hooks/use-nodes-sync-draft', () => ({
+vi.mock('../../hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
doSyncWorkflowDraft: mockDoSyncWorkflowDraft,
syncInputFieldsDraft: mockSyncInputFieldsDraft,
@@ -118,13 +118,13 @@ vi.mock('@/app/components/snippets/hooks/use-nodes-sync-draft', () => ({
}),
}))
-vi.mock('@/app/components/snippets/hooks/use-snippet-refresh-draft', () => ({
+vi.mock('../../hooks/use-snippet-refresh-draft', () => ({
useSnippetRefreshDraft: () => ({
handleRefreshWorkflowDraft: vi.fn(),
}),
}))
-vi.mock('@/app/components/snippets/hooks/use-snippet-run', () => ({
+vi.mock('../../hooks/use-snippet-run', () => ({
useSnippetRun: () => ({
handleBackupDraft: mockHandleBackupDraft,
handleLoadBackupDraft: mockHandleLoadBackupDraft,
@@ -134,7 +134,7 @@ vi.mock('@/app/components/snippets/hooks/use-snippet-run', () => ({
}),
}))
-vi.mock('@/app/components/snippets/hooks/use-snippet-start-run', () => ({
+vi.mock('../../hooks/use-snippet-start-run', () => ({
useSnippetStartRun: () => ({
handleStartWorkflowRun: mockHandleStartWorkflowRun,
handleWorkflowStartRunInWorkflow: mockHandleWorkflowStartRunInWorkflow,
diff --git a/web/app/components/snippets/components/__tests__/snippet-run-panel.spec.tsx b/web/app/components/snippets/components/__tests__/snippet-run-panel.spec.tsx
index 36f214d5452..baad1550a05 100644
--- a/web/app/components/snippets/components/__tests__/snippet-run-panel.spec.tsx
+++ b/web/app/components/snippets/components/__tests__/snippet-run-panel.spec.tsx
@@ -35,10 +35,13 @@ vi.mock('@/app/components/base/chat/chat/check-input-forms-hooks', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({
useWorkflowInteractions: () => ({
handleCancelDebugAndPreviewPanel: workflowHookMocks.handleCancelDebugAndPreviewPanel,
}),
+}))
+
+vi.mock('@/app/components/workflow/hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({
handleRun: workflowHookMocks.handleRun,
}),
diff --git a/web/app/components/snippets/components/snippet-header/__tests__/run-mode.spec.tsx b/web/app/components/snippets/components/snippet-header/__tests__/run-mode.spec.tsx
index b29f0f6d182..d1c75ce93a2 100644
--- a/web/app/components/snippets/components/snippet-header/__tests__/run-mode.spec.tsx
+++ b/web/app/components/snippets/components/snippet-header/__tests__/run-mode.spec.tsx
@@ -21,15 +21,18 @@ const runningResult = {
outputs_truncated: false,
}
-vi.mock('@/app/components/workflow/hooks', () => ({
- useWorkflowStartRun: () => ({
- handleWorkflowStartRunInWorkflow: workflowHookMocks.handleWorkflowStartRunInWorkflow,
- }),
+vi.mock('@/app/components/workflow/hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({
handleStopRun: workflowHookMocks.handleStopRun,
}),
}))
+vi.mock('@/app/components/workflow/hooks/use-workflow-start-run', () => ({
+ useWorkflowStartRun: () => ({
+ handleWorkflowStartRunInWorkflow: workflowHookMocks.handleWorkflowStartRunInWorkflow,
+ }),
+}))
+
vi.mock('@/context/event-emitter', () => ({
useEventEmitterContextContext: () => ({
eventEmitter: {
diff --git a/web/app/components/snippets/components/snippet-header/run-mode.tsx b/web/app/components/snippets/components/snippet-header/run-mode.tsx
index 8da34b4ac4a..bce7af0988c 100644
--- a/web/app/components/snippets/components/snippet-header/run-mode.tsx
+++ b/web/app/components/snippets/components/snippet-header/run-mode.tsx
@@ -4,7 +4,8 @@ import { cn } from '@langgenius/dify-ui/cn'
import * as React from 'react'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
-import { useWorkflowRun, useWorkflowStartRun } from '@/app/components/workflow/hooks'
+import { useWorkflowRun } from '@/app/components/workflow/hooks/use-workflow-run'
+import { useWorkflowStartRun } from '@/app/components/workflow/hooks/use-workflow-start-run'
import { TEST_RUN_MENU_HOTKEY } from '@/app/components/workflow/hotkeys'
import { ShortcutKbd } from '@/app/components/workflow/shortcuts/shortcut-kbd'
import { useStore } from '@/app/components/workflow/store'
diff --git a/web/app/components/snippets/components/snippet-main.tsx b/web/app/components/snippets/components/snippet-main.tsx
index ef954aafd7c..84d3a7ee542 100644
--- a/web/app/components/snippets/components/snippet-main.tsx
+++ b/web/app/components/snippets/components/snippet-main.tsx
@@ -10,7 +10,7 @@ import { useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'reac
import { useTranslation } from 'react-i18next'
import { useShallow } from 'zustand/react/shallow'
import { WorkflowWithInnerContext } from '@/app/components/workflow'
-import { useAvailableNodesMetaData } from '@/app/components/workflow-app/hooks'
+import { useAvailableNodesMetaData } from '@/app/components/workflow-app/hooks/use-available-nodes-meta-data'
import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars'
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
import { BlockEnum } from '@/app/components/workflow/types'
diff --git a/web/app/components/snippets/components/snippet-run-panel.tsx b/web/app/components/snippets/components/snippet-run-panel.tsx
index d04f4351a81..718a4e6c28c 100644
--- a/web/app/components/snippets/components/snippet-run-panel.tsx
+++ b/web/app/components/snippets/components/snippet-run-panel.tsx
@@ -11,7 +11,8 @@ import { useTranslation } from 'react-i18next'
import { useCheckInputsForms } from '@/app/components/base/chat/chat/check-input-forms-hooks'
import { getProcessedInputs } from '@/app/components/base/chat/chat/utils'
import Loading from '@/app/components/base/loading'
-import { useWorkflowInteractions, useWorkflowRun } from '@/app/components/workflow/hooks'
+import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions'
+import { useWorkflowRun } from '@/app/components/workflow/hooks/use-workflow-run'
import FormItem from '@/app/components/workflow/nodes/_base/components/before-run-form/form-item'
import ResultPanel from '@/app/components/workflow/run/result-panel'
import ResultText from '@/app/components/workflow/run/result-text'
diff --git a/web/app/components/snippets/hooks/__tests__/use-inspect-vars-crud.spec.ts b/web/app/components/snippets/hooks/__tests__/use-inspect-vars-crud.spec.ts
index 0110c837ad4..26719bc3a70 100644
--- a/web/app/components/snippets/hooks/__tests__/use-inspect-vars-crud.spec.ts
+++ b/web/app/components/snippets/hooks/__tests__/use-inspect-vars-crud.spec.ts
@@ -20,7 +20,7 @@ const mockApis = {
}
const mockUseInspectVarsCrudCommon = vi.fn(() => mockApis)
-vi.mock('../../../workflow/hooks/use-inspect-vars-crud-common', () => ({
+vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud-common', () => ({
useInspectVarsCrudCommon: (...args: Parameters) =>
mockUseInspectVarsCrudCommon(...args),
}))
diff --git a/web/app/components/snippets/hooks/__tests__/use-snippet-refresh-draft.spec.ts b/web/app/components/snippets/hooks/__tests__/use-snippet-refresh-draft.spec.ts
index 580783ed2f2..a7522ec0c37 100644
--- a/web/app/components/snippets/hooks/__tests__/use-snippet-refresh-draft.spec.ts
+++ b/web/app/components/snippets/hooks/__tests__/use-snippet-refresh-draft.spec.ts
@@ -19,7 +19,7 @@ vi.mock('@/service/use-snippet-workflows', () => ({
fetchSnippetDraftWorkflow: (...args: unknown[]) => mockFetchSnippetDraftWorkflow(...args),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({
useWorkflowUpdate: () => ({
handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas,
}),
diff --git a/web/app/components/snippets/hooks/__tests__/use-snippet-run.spec.ts b/web/app/components/snippets/hooks/__tests__/use-snippet-run.spec.ts
index 1511430ece3..6c0edfe37ae 100644
--- a/web/app/components/snippets/hooks/__tests__/use-snippet-run.spec.ts
+++ b/web/app/components/snippets/hooks/__tests__/use-snippet-run.spec.ts
@@ -82,7 +82,7 @@ vi.mock('@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars', () =>
}),
}))
-vi.mock('@/app/components/workflow/hooks/use-workflow-interactions', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({
useWorkflowUpdate: () => ({
handleUpdateWorkflowCanvas: mocks.mockHandleUpdateWorkflowCanvas,
}),
diff --git a/web/app/components/snippets/hooks/__tests__/use-snippet-start-run.spec.ts b/web/app/components/snippets/hooks/__tests__/use-snippet-start-run.spec.ts
index cc789a7d5c1..03597494ee1 100644
--- a/web/app/components/snippets/hooks/__tests__/use-snippet-start-run.spec.ts
+++ b/web/app/components/snippets/hooks/__tests__/use-snippet-start-run.spec.ts
@@ -15,7 +15,7 @@ vi.mock('@/app/components/workflow/store', () => ({
}))
const mockHandleCancelDebugAndPreviewPanel = vi.fn()
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({
useWorkflowInteractions: () => ({
handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel,
}),
diff --git a/web/app/components/snippets/hooks/use-inspect-vars-crud.ts b/web/app/components/snippets/hooks/use-inspect-vars-crud.ts
index 71ae6df0681..290e4761380 100644
--- a/web/app/components/snippets/hooks/use-inspect-vars-crud.ts
+++ b/web/app/components/snippets/hooks/use-inspect-vars-crud.ts
@@ -1,4 +1,4 @@
-import { useInspectVarsCrudCommon } from '../../workflow/hooks/use-inspect-vars-crud-common'
+import { useInspectVarsCrudCommon } from '@/app/components/workflow/hooks/use-inspect-vars-crud-common'
import { useConfigsMap } from './use-configs-map'
export const useInspectVarsCrud = (snippetId: string) => {
diff --git a/web/app/components/snippets/hooks/use-snippet-refresh-draft.ts b/web/app/components/snippets/hooks/use-snippet-refresh-draft.ts
index f2192178358..348fe361d57 100644
--- a/web/app/components/snippets/hooks/use-snippet-refresh-draft.ts
+++ b/web/app/components/snippets/hooks/use-snippet-refresh-draft.ts
@@ -2,7 +2,7 @@ import type { WorkflowDataUpdater } from '@/app/components/workflow/types'
import type { SnippetInputField } from '@/models/snippet'
import type { SnippetWorkflow } from '@/types/snippet'
import { useCallback } from 'react'
-import { useWorkflowUpdate } from '@/app/components/workflow/hooks'
+import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { fetchSnippetDraftWorkflow } from '@/service/use-snippet-workflows'
import { useSnippetDraftStore } from '../draft-store'
diff --git a/web/app/components/snippets/hooks/use-snippet-run.ts b/web/app/components/snippets/hooks/use-snippet-run.ts
index e999ed80e44..b3fb9c18a47 100644
--- a/web/app/components/snippets/hooks/use-snippet-run.ts
+++ b/web/app/components/snippets/hooks/use-snippet-run.ts
@@ -5,8 +5,8 @@ import { produce } from 'immer'
import { useCallback, useRef } from 'react'
import { useReactFlow, useStoreApi } from 'reactflow'
import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars'
-import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions'
import { useWorkflowRunEvent } from '@/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event'
+import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { WorkflowRunningStatus } from '@/app/components/workflow/types'
import { ssePost } from '@/service/base'
diff --git a/web/app/components/snippets/hooks/use-snippet-start-run.ts b/web/app/components/snippets/hooks/use-snippet-start-run.ts
index a9ddf381921..91e3f734ffe 100644
--- a/web/app/components/snippets/hooks/use-snippet-start-run.ts
+++ b/web/app/components/snippets/hooks/use-snippet-start-run.ts
@@ -1,6 +1,6 @@
import type { SnippetDraftRunPayload } from '@/types/snippet'
import { useCallback } from 'react'
-import { useWorkflowInteractions } from '@/app/components/workflow/hooks'
+import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { WorkflowRunningStatus } from '@/app/components/workflow/types'
import { useSnippetDraftStore } from '../draft-store'
diff --git a/web/app/components/workflow-app/__tests__/index.spec.tsx b/web/app/components/workflow-app/__tests__/index.spec.tsx
index e7b99a0f57f..c0ffd014d50 100644
--- a/web/app/components/workflow-app/__tests__/index.spec.tsx
+++ b/web/app/components/workflow-app/__tests__/index.spec.tsx
@@ -127,11 +127,11 @@ vi.mock('@/service/use-tools', () => ({
useAppTriggers: () => appTriggersState,
}))
-vi.mock('@/app/components/workflow-app/hooks/use-workflow-init', () => ({
+vi.mock('../hooks/use-workflow-init', () => ({
useWorkflowInit: () => workflowInitState,
}))
-vi.mock('@/app/components/workflow-app/hooks/use-get-run-and-trace-url', () => ({
+vi.mock('../hooks/use-get-run-and-trace-url', () => ({
useGetRunAndTraceUrl: () => ({
getWorkflowRunAndTraceUrl: mockGetWorkflowRunAndTraceUrl,
}),
diff --git a/web/app/components/workflow-app/components/__tests__/workflow-children.spec.tsx b/web/app/components/workflow-app/components/__tests__/workflow-children.spec.tsx
index 7b0a350ca1a..ec01ea95da5 100644
--- a/web/app/components/workflow-app/components/__tests__/workflow-children.spec.tsx
+++ b/web/app/components/workflow-app/components/__tests__/workflow-children.spec.tsx
@@ -86,23 +86,37 @@ vi.mock('@/context/event-emitter', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-DSL', () => ({
useAutoGenerateWebhookUrl: () => mockAutoGenerateWebhookUrl,
useDSL: () => ({
exportCheck: mockExportCheck,
handleExportDSL: mockHandleExportDSL,
}),
+}))
+
+vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({
usePanelInteractions: () => ({
handlePaneContextmenuCancel: mockHandlePaneContextmenuCancel,
}),
}))
+vi.mock('@/app/components/workflow/hooks/use-panel-interactions', () => ({
+ usePanelInteractions: () => ({
+ handlePaneContextmenuCancel: mockHandlePaneContextmenuCancel,
+ handlePaneContextMenu: vi.fn(),
+ }),
+}))
+
vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft,
}),
}))
+vi.mock('@/app/components/workflow/hooks/use-auto-generate-webhook-url', () => ({
+ useAutoGenerateWebhookUrl: () => mockAutoGenerateWebhookUrl,
+}))
+
vi.mock('@/app/components/workflow/utils', async (importOriginal) => {
const actual = await importOriginal()
return {
@@ -120,7 +134,7 @@ vi.mock('@/app/components/workflow/utils', async (importOriginal) => {
}
})
-vi.mock('@/app/components/workflow-app/hooks', () => ({
+vi.mock('../../hooks/use-available-nodes-meta-data', () => ({
useAvailableNodesMetaData: () => ({
nodesMap: {
[BlockEnum.Start]: {
@@ -145,7 +159,7 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({
}),
}))
-vi.mock('@/app/components/workflow-app/hooks/use-auto-onboarding', () => ({
+vi.mock('../../hooks/use-auto-onboarding', () => ({
useAutoOnboarding: () => ({
handleOnboardingClose: mockHandleOnboardingClose,
}),
diff --git a/web/app/components/workflow-app/components/__tests__/workflow-main.spec.tsx b/web/app/components/workflow-app/components/__tests__/workflow-main.spec.tsx
index 810dc214b17..72f9db49c6b 100644
--- a/web/app/components/workflow-app/components/__tests__/workflow-main.spec.tsx
+++ b/web/app/components/workflow-app/components/__tests__/workflow-main.spec.tsx
@@ -141,7 +141,7 @@ vi.mock('@/app/components/workflow/collaboration/hooks/use-collaboration', () =>
}),
}))
-vi.mock('@/app/components/workflow/hooks/use-workflow-interactions', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({
useWorkflowUpdate: () => ({
handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas,
}),
@@ -274,18 +274,30 @@ vi.mock('@/app/components/workflow', () => ({
},
}))
-vi.mock('@/app/components/workflow-app/hooks', () => ({
+vi.mock('../../hooks/use-available-nodes-meta-data', () => ({
useAvailableNodesMetaData: () => ({
nodes: [{ id: 'start' }],
nodesMap: { start: { id: 'start' } },
}),
+}))
+
+vi.mock('../../hooks/use-configs-map', () => ({
useConfigsMap: () => ({ flowId: 'app-1', flowType: 'app-flow', fileSettings: { enabled: true } }),
+}))
+
+vi.mock('../../hooks/use-DSL', () => ({
useDSL: () => ({ exportCheck: hookFns.exportCheck, handleExportDSL: hookFns.handleExportDSL }),
useDSLByCanEdit: () => ({
exportCheck: hookFns.exportCheck,
handleExportDSL: hookFns.handleExportDSL,
}),
+}))
+
+vi.mock('../../hooks/use-get-run-and-trace-url', () => ({
useGetRunAndTraceUrl: () => ({ getWorkflowRunAndTraceUrl: hookFns.getWorkflowRunAndTraceUrl }),
+}))
+
+vi.mock('../../hooks/use-inspect-vars-crud', () => ({
useInspectVarsCrud: () => ({
hasNodeInspectVars: hookFns.hasNodeInspectVars,
hasSetInspectVar: hookFns.hasSetInspectVar,
@@ -302,6 +314,9 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({
resetConversationVar: hookFns.resetConversationVar,
invalidateConversationVarValues: hookFns.invalidateConversationVarValues,
}),
+}))
+
+vi.mock('../../hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
doSyncWorkflowDraft: hookFns.doSyncWorkflowDraft,
syncWorkflowDraftWhenPageClose: hookFns.syncWorkflowDraftWhenPageClose,
@@ -310,12 +325,15 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({
doSyncWorkflowDraft: hookFns.doSyncWorkflowDraft,
syncWorkflowDraftWhenPageClose: hookFns.syncWorkflowDraftWhenPageClose,
}),
- useSetWorkflowVarsWithValue: () => ({
- fetchInspectVars: hookFns.fetchInspectVars,
- }),
+}))
+
+vi.mock('../../hooks/use-workflow-refresh-draft', () => ({
useWorkflowRefreshDraft: () => ({
handleRefreshWorkflowDraft: hookFns.handleRefreshWorkflowDraft,
}),
+}))
+
+vi.mock('../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({
handleBackupDraft: hookFns.handleBackupDraft,
handleLoadBackupDraft: hookFns.handleLoadBackupDraft,
@@ -330,6 +348,9 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({
handleRun: hookFns.handleRun,
handleStopRun: hookFns.handleStopRun,
}),
+}))
+
+vi.mock('../../hooks/use-workflow-start-run', () => ({
useWorkflowStartRun: () => ({
handleStartWorkflowRun: hookFns.handleStartWorkflowRun,
handleWorkflowStartRunInChatflow: hookFns.handleWorkflowStartRunInChatflow,
@@ -350,7 +371,13 @@ vi.mock('@/app/components/workflow-app/hooks', () => ({
}),
}))
-vi.mock('@/app/components/workflow-app/hooks/use-workflow-draft-graph-for-canvas', () => ({
+vi.mock('@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars', () => ({
+ useSetWorkflowVarsWithValue: () => ({
+ fetchInspectVars: hookFns.fetchInspectVars,
+ }),
+}))
+
+vi.mock('../../hooks/use-workflow-draft-graph-for-canvas', () => ({
useWorkflowDraftGraphForCanvas: () => ({
getWorkflowDraftGraphForCanvas: (graph?: {
nodes?: unknown[]
@@ -366,7 +393,7 @@ vi.mock('@/app/components/workflow-app/hooks/use-workflow-draft-graph-for-canvas
}),
}))
-vi.mock('@/app/components/workflow-app/hooks/use-workflow-draft-graph-for-canvas', () => ({
+vi.mock('../../hooks/use-workflow-draft-graph-for-canvas', () => ({
useWorkflowDraftGraphForCanvas: () => ({
getWorkflowDraftGraphForCanvas: (graph?: {
nodes?: unknown[]
diff --git a/web/app/components/workflow-app/components/__tests__/workflow-panel.spec.tsx b/web/app/components/workflow-app/components/__tests__/workflow-panel.spec.tsx
index cb569cc02db..61d1712e409 100644
--- a/web/app/components/workflow-app/components/__tests__/workflow-panel.spec.tsx
+++ b/web/app/components/workflow-app/components/__tests__/workflow-panel.spec.tsx
@@ -130,7 +130,7 @@ vi.mock('@/app/components/workflow/panel/global-variable-panel', () => ({
default: () => global-variable
,
}))
-vi.mock('@/app/components/workflow-app/hooks', () => ({
+vi.mock('../../hooks/use-is-chat-mode', () => ({
useIsChatMode: () => mockUseIsChatMode(),
}))
diff --git a/web/app/components/workflow-app/components/workflow-children.tsx b/web/app/components/workflow-app/components/workflow-children.tsx
index 89f09314786..d4558ed1f1f 100644
--- a/web/app/components/workflow-app/components/workflow-children.tsx
+++ b/web/app/components/workflow-app/components/workflow-children.tsx
@@ -6,21 +6,19 @@ import type { EnvironmentVariable } from '@/app/components/workflow/types'
import { memo, useCallback, useState } from 'react'
import { useStoreApi } from 'reactflow'
import { DSL_EXPORT_CHECK, START_INITIAL_POSITION } from '@/app/components/workflow/constants'
-import {
- useAutoGenerateWebhookUrl,
- useDSL,
- usePanelInteractions,
-} from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
+import { useAutoGenerateWebhookUrl } from '@/app/components/workflow/hooks/use-auto-generate-webhook-url'
+import { useDSL } from '@/app/components/workflow/hooks/use-DSL'
import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft'
+import { usePanelInteractions } from '@/app/components/workflow/hooks/use-panel-interactions'
+import PluginDependency from '@/app/components/workflow/plugin-dependency'
import { useStore } from '@/app/components/workflow/store'
import { BlockEnum } from '@/app/components/workflow/types'
import { generateNewNode } from '@/app/components/workflow/utils'
import { useEventEmitterContextContext } from '@/context/event-emitter'
import dynamic from '@/next/dynamic'
-import PluginDependency from '../../workflow/plugin-dependency'
-import { useAvailableNodesMetaData } from '../hooks'
import { useAutoOnboarding } from '../hooks/use-auto-onboarding'
+import { useAvailableNodesMetaData } from '../hooks/use-available-nodes-meta-data'
import WorkflowHeader from './workflow-header'
import WorkflowPanel from './workflow-panel'
diff --git a/web/app/components/workflow-app/components/workflow-header/__tests__/chat-variable-trigger.spec.tsx b/web/app/components/workflow-app/components/workflow-header/__tests__/chat-variable-trigger.spec.tsx
index 4d17f459759..343a6d26314 100644
--- a/web/app/components/workflow-app/components/workflow-header/__tests__/chat-variable-trigger.spec.tsx
+++ b/web/app/components/workflow-app/components/workflow-header/__tests__/chat-variable-trigger.spec.tsx
@@ -4,11 +4,11 @@ import ChatVariableTrigger from '../chat-variable-trigger'
const mockUseNodesReadOnly = vi.fn()
const mockUseIsChatMode = vi.fn()
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow', () => ({
useNodesReadOnly: () => mockUseNodesReadOnly(),
}))
-vi.mock('../../../hooks', () => ({
+vi.mock('../../../hooks/use-is-chat-mode', () => ({
useIsChatMode: () => mockUseIsChatMode(),
}))
diff --git a/web/app/components/workflow-app/components/workflow-header/__tests__/features-trigger.spec.tsx b/web/app/components/workflow-app/components/workflow-header/__tests__/features-trigger.spec.tsx
index 9005f2f50dd..b81b513f48e 100644
--- a/web/app/components/workflow-app/components/workflow-header/__tests__/features-trigger.spec.tsx
+++ b/web/app/components/workflow-app/components/workflow-header/__tests__/features-trigger.spec.tsx
@@ -75,12 +75,18 @@ const mockWorkflowStore = {
setState: mockWorkflowStoreSetState,
}
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow', () => ({
+ useNodesReadOnly: () => mockUseNodesReadOnly(),
+ useIsChatMode: () => mockUseIsChatMode(),
+}))
+
+vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({
useChecklist: (...args: unknown[]) => mockUseChecklist(...args),
useChecklistBeforePublish: () => mockUseChecklistBeforePublish(),
- useNodesReadOnly: () => mockUseNodesReadOnly(),
+}))
+
+vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => mockUseNodesSyncDraft(),
- useIsChatMode: () => mockUseIsChatMode(),
}))
vi.mock('@/app/components/workflow/store', () => ({
diff --git a/web/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx b/web/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx
index 92840d74a2d..e2709e2074e 100644
--- a/web/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx
+++ b/web/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx
@@ -1,7 +1,7 @@
import { memo } from 'react'
import ChatVariableButton from '@/app/components/workflow/header/chat-variable-button'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
-import { useIsChatMode } from '../../hooks'
+import { useNodesReadOnly } from '@/app/components/workflow/hooks/use-workflow'
+import { useIsChatMode } from '../../hooks/use-is-chat-mode'
const ChatVariableTrigger = () => {
const { nodesReadOnly } = useNodesReadOnly()
diff --git a/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx b/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx
index 43b1828b73b..604d02fcb37 100644
--- a/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx
+++ b/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx
@@ -13,15 +13,14 @@ import { AppPublisher } from '@/app/components/app/app-publisher'
import { useStore as useAppStore } from '@/app/components/app/store'
import { useFeatures } from '@/app/components/base/features/hooks'
import { Plan } from '@/app/components/billing/type'
+// useWorkflowRunValidation,
+import { useHooksStore } from '@/app/components/workflow/hooks-store'
import {
useChecklist,
useChecklistBeforePublish,
- useIsChatMode,
- useNodesReadOnly,
- useNodesSyncDraft,
- // useWorkflowRunValidation,
-} from '@/app/components/workflow/hooks'
-import { useHooksStore } from '@/app/components/workflow/hooks-store'
+} from '@/app/components/workflow/hooks/use-checklist'
+import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft'
+import { useIsChatMode, useNodesReadOnly } from '@/app/components/workflow/hooks/use-workflow'
import { isAgentV2NodeData } from '@/app/components/workflow/nodes/agent-v2/types'
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
diff --git a/web/app/components/workflow-app/components/workflow-header/index.tsx b/web/app/components/workflow-app/components/workflow-header/index.tsx
index da2434f1ac2..2fe6b6325cf 100644
--- a/web/app/components/workflow-app/components/workflow-header/index.tsx
+++ b/web/app/components/workflow-app/components/workflow-header/index.tsx
@@ -4,7 +4,7 @@ import { useShallow } from 'zustand/react/shallow'
import { useStore as useAppStore } from '@/app/components/app/store'
import Header from '@/app/components/workflow/header'
import { useResetWorkflowVersionHistory } from '@/service/use-workflow'
-import { useIsChatMode } from '../../hooks'
+import { useIsChatMode } from '../../hooks/use-is-chat-mode'
import ChatVariableTrigger from './chat-variable-trigger'
import FeaturesTrigger from './features-trigger'
diff --git a/web/app/components/workflow-app/components/workflow-main.tsx b/web/app/components/workflow-app/components/workflow-main.tsx
index 449f4f66e27..c218d14cac8 100644
--- a/web/app/components/workflow-app/components/workflow-main.tsx
+++ b/web/app/components/workflow-app/components/workflow-main.tsx
@@ -12,28 +12,26 @@ import { useStore as useAppStore } from '@/app/components/app/store'
import { useFeaturesStore } from '@/app/components/base/features/hooks'
import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
import { WorkflowWithInnerContext } from '@/app/components/workflow'
-import { useWorkflowDraftGraphForCanvas } from '@/app/components/workflow-app/hooks/use-workflow-draft-graph-for-canvas'
import { collaborationManager } from '@/app/components/workflow/collaboration/core/collaboration-manager'
import { useCollaboration } from '@/app/components/workflow/collaboration/hooks/use-collaboration'
-import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions'
+import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars'
+import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update'
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
import { SupportUploadFileTypes } from '@/app/components/workflow/types'
import { userProfileIdAtom } from '@/context/account-state'
import { workspacePermissionKeysAtom } from '@/context/permission-state'
import { fetchWorkflowDraft } from '@/service/workflow'
import { getAppACLCapabilities } from '@/utils/permission'
-import {
- useAvailableNodesMetaData,
- useConfigsMap,
- useDSLByCanEdit,
- useGetRunAndTraceUrl,
- useInspectVarsCrud,
- useNodesSyncDraftByCanEdit,
- useSetWorkflowVarsWithValue,
- useWorkflowRefreshDraft,
- useWorkflowRunByCanEdit,
- useWorkflowStartRunByCanEdit,
-} from '../hooks'
+import { useAvailableNodesMetaData } from '../hooks/use-available-nodes-meta-data'
+import { useConfigsMap } from '../hooks/use-configs-map'
+import { useDSLByCanEdit } from '../hooks/use-DSL'
+import { useGetRunAndTraceUrl } from '../hooks/use-get-run-and-trace-url'
+import { useInspectVarsCrud } from '../hooks/use-inspect-vars-crud'
+import { useNodesSyncDraftByCanEdit } from '../hooks/use-nodes-sync-draft'
+import { useWorkflowDraftGraphForCanvas } from '../hooks/use-workflow-draft-graph-for-canvas'
+import { useWorkflowRefreshDraft } from '../hooks/use-workflow-refresh-draft'
+import { useWorkflowRunByCanEdit } from '../hooks/use-workflow-run'
+import { useWorkflowStartRunByCanEdit } from '../hooks/use-workflow-start-run'
import WorkflowChildren from './workflow-children'
type WorkflowMainProps = Pick
diff --git a/web/app/components/workflow-app/components/workflow-panel.tsx b/web/app/components/workflow-app/components/workflow-panel.tsx
index 4e7abbfef84..2636a24a87b 100644
--- a/web/app/components/workflow-app/components/workflow-panel.tsx
+++ b/web/app/components/workflow-app/components/workflow-panel.tsx
@@ -6,7 +6,7 @@ import Panel from '@/app/components/workflow/panel'
import CommentsPanel from '@/app/components/workflow/panel/comments-panel'
import { useStore } from '@/app/components/workflow/store'
import dynamic from '@/next/dynamic'
-import { useIsChatMode } from '../hooks'
+import { useIsChatMode } from '../hooks/use-is-chat-mode'
const MessageLogModal = dynamic(() => import('@/app/components/base/message-log-modal'), {
ssr: false,
diff --git a/web/app/components/workflow-app/hooks/__tests__/use-available-nodes-meta-data.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-available-nodes-meta-data.spec.ts
index e6e0927a6bf..2354776da63 100644
--- a/web/app/components/workflow-app/hooks/__tests__/use-available-nodes-meta-data.spec.ts
+++ b/web/app/components/workflow-app/hooks/__tests__/use-available-nodes-meta-data.spec.ts
@@ -5,7 +5,7 @@ import { useAvailableNodesMetaData } from '../use-available-nodes-meta-data'
const mockUseIsChatMode = vi.fn()
const mockIsAgentV2Enabled = vi.hoisted(() => vi.fn(() => true))
-vi.mock('@/app/components/workflow-app/hooks/use-is-chat-mode', () => ({
+vi.mock('../use-is-chat-mode', () => ({
useIsChatMode: () => mockUseIsChatMode(),
}))
diff --git a/web/app/components/workflow-app/hooks/__tests__/use-nodes-sync-draft.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-nodes-sync-draft.spec.ts
index 90e9c27cc48..27a475f093e 100644
--- a/web/app/components/workflow-app/hooks/__tests__/use-nodes-sync-draft.spec.ts
+++ b/web/app/components/workflow-app/hooks/__tests__/use-nodes-sync-draft.spec.ts
@@ -93,7 +93,7 @@ vi.mock('@/config', async (importOriginal) => {
})
const mockHandleRefreshWorkflowDraft = vi.fn()
-vi.mock('@/app/components/workflow-app/hooks', () => ({
+vi.mock('../use-workflow-refresh-draft', () => ({
useWorkflowRefreshDraft: () => ({ handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft }),
}))
diff --git a/web/app/components/workflow-app/hooks/__tests__/use-workflow-refresh-draft.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-workflow-refresh-draft.spec.ts
index f94134b8b4a..db94d06d73c 100644
--- a/web/app/components/workflow-app/hooks/__tests__/use-workflow-refresh-draft.spec.ts
+++ b/web/app/components/workflow-app/hooks/__tests__/use-workflow-refresh-draft.spec.ts
@@ -40,7 +40,7 @@ vi.mock('@/app/components/app/store', () => ({
useStore: (selector: (state: typeof appStoreState) => T): T => selector(appStoreState),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({
useWorkflowUpdate: () => ({ handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas }),
}))
diff --git a/web/app/components/workflow-app/hooks/__tests__/use-workflow-run.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-workflow-run.spec.ts
index 230ad3ea63b..74c24c9ac83 100644
--- a/web/app/components/workflow-app/hooks/__tests__/use-workflow-run.spec.ts
+++ b/web/app/components/workflow-app/hooks/__tests__/use-workflow-run.spec.ts
@@ -154,7 +154,7 @@ vi.mock('@/app/components/base/features/hooks', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks/use-workflow-interactions', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-update', () => ({
useWorkflowUpdate: () => ({
handleUpdateWorkflowCanvas: mocks.mockHandleUpdateWorkflowCanvas,
}),
diff --git a/web/app/components/workflow-app/hooks/__tests__/use-workflow-start-run.spec.tsx b/web/app/components/workflow-app/hooks/__tests__/use-workflow-start-run.spec.tsx
index 6943f8b9aa0..30339007207 100644
--- a/web/app/components/workflow-app/hooks/__tests__/use-workflow-start-run.spec.tsx
+++ b/web/app/components/workflow-app/hooks/__tests__/use-workflow-start-run.spec.tsx
@@ -37,7 +37,7 @@ vi.mock('@/app/components/base/features/hooks', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow-panel-interactions', () => ({
useWorkflowInteractions: () => ({
handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel,
}),
@@ -49,11 +49,17 @@ vi.mock('@/app/components/workflow/store', () => ({
}),
}))
-vi.mock('@/app/components/workflow-app/hooks', () => ({
+vi.mock('@/app/components/workflow/hooks/use-workflow', () => ({
useIsChatMode: () => mockUseIsChatMode(),
+}))
+
+vi.mock('../use-nodes-sync-draft', () => ({
useNodesSyncDraftByCanEdit: () => ({
doSyncWorkflowDraft: mockDoSyncWorkflowDraft,
}),
+}))
+
+vi.mock('../use-workflow-run', () => ({
useWorkflowRunByCanEdit: () => ({
handleRun: mockHandleRun,
}),
diff --git a/web/app/components/workflow-app/hooks/__tests__/use-workflow-template.spec.ts b/web/app/components/workflow-app/hooks/__tests__/use-workflow-template.spec.ts
index 930c8e66971..bb96a226665 100644
--- a/web/app/components/workflow-app/hooks/__tests__/use-workflow-template.spec.ts
+++ b/web/app/components/workflow-app/hooks/__tests__/use-workflow-template.spec.ts
@@ -10,7 +10,7 @@ let appStoreState: {
}
}
-vi.mock('@/app/components/workflow-app/hooks/use-is-chat-mode', () => ({
+vi.mock('../use-is-chat-mode', () => ({
useIsChatMode: () => mockUseIsChatMode(),
}))
diff --git a/web/app/components/workflow-app/hooks/index.ts b/web/app/components/workflow-app/hooks/index.ts
deleted file mode 100644
index 2a8c8068596..00000000000
--- a/web/app/components/workflow-app/hooks/index.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export * from '../../workflow/hooks/use-fetch-workflow-inspect-vars'
-export * from './use-available-nodes-meta-data'
-export * from './use-configs-map'
-export * from './use-DSL'
-export * from './use-get-run-and-trace-url'
-export * from './use-inspect-vars-crud'
-export * from './use-is-chat-mode'
-export * from './use-nodes-sync-draft'
-export * from './use-workflow-init'
-export * from './use-workflow-refresh-draft'
-export * from './use-workflow-run'
-export * from './use-workflow-start-run'
-export * from './use-workflow-template'
diff --git a/web/app/components/workflow-app/hooks/use-inspect-vars-crud.ts b/web/app/components/workflow-app/hooks/use-inspect-vars-crud.ts
index 48c65e6b301..d35d84fa86e 100644
--- a/web/app/components/workflow-app/hooks/use-inspect-vars-crud.ts
+++ b/web/app/components/workflow-app/hooks/use-inspect-vars-crud.ts
@@ -1,4 +1,4 @@
-import { useInspectVarsCrudCommon } from '../../workflow/hooks/use-inspect-vars-crud-common'
+import { useInspectVarsCrudCommon } from '@/app/components/workflow/hooks/use-inspect-vars-crud-common'
import { useConfigsMap } from './use-configs-map'
export const useInspectVarsCrud = () => {
diff --git a/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts b/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts
index 6767f77c628..028907cba4a 100644
--- a/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts
+++ b/web/app/components/workflow-app/hooks/use-nodes-sync-draft.ts
@@ -25,7 +25,7 @@ import { API_PREFIX } from '@/config'
import { systemFeaturesQueryOptions } from '@/features/system-features/client'
import { postWithKeepalive } from '@/service/fetch'
import { syncWorkflowDraft } from '@/service/workflow'
-import { useWorkflowRefreshDraft } from '.'
+import { useWorkflowRefreshDraft } from './use-workflow-refresh-draft'
const useNodesSyncDraftBase = (getNodesReadOnly: () => boolean) => {
const store = useStoreApi()
diff --git a/web/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts b/web/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts
index 834a43eebea..d68d3c4cc37 100644
--- a/web/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts
+++ b/web/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts
@@ -1,6 +1,6 @@
import { useCallback, useRef } from 'react'
import { useStore as useAppStore } from '@/app/components/app/store'
-import { useWorkflowUpdate } from '@/app/components/workflow/hooks'
+import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { fetchWorkflowDraft } from '@/service/workflow'
import { useWorkflowDraftGraphForCanvas } from './use-workflow-draft-graph-for-canvas'
diff --git a/web/app/components/workflow-app/hooks/use-workflow-run.ts b/web/app/components/workflow-app/hooks/use-workflow-run.ts
index ae199e8cd9c..30626962983 100644
--- a/web/app/components/workflow-app/hooks/use-workflow-run.ts
+++ b/web/app/components/workflow-app/hooks/use-workflow-run.ts
@@ -13,15 +13,15 @@ import { trackEvent } from '@/app/components/base/amplitude'
import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager'
import { useFeaturesStore } from '@/app/components/base/features/hooks'
import { TriggerType } from '@/app/components/workflow/header/test-run-menu'
-import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions'
+import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars'
import { useWorkflowRunEvent } from '@/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event'
+import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-update'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { usePathname } from '@/next/navigation'
import { ssePost } from '@/service/base'
import { useInvalidAllLastRun, useInvalidateWorkflowRunHistory } from '@/service/use-workflow'
import { stopWorkflowRun } from '@/service/workflow'
import { AppModeEnum } from '@/types/app'
-import { useSetWorkflowVarsWithValue } from '../../workflow/hooks/use-fetch-workflow-inspect-vars'
import { useConfigsMap } from './use-configs-map'
import { useNodesSyncDraft, useNodesSyncDraftByCanEdit } from './use-nodes-sync-draft'
import {
diff --git a/web/app/components/workflow-app/hooks/use-workflow-start-run.tsx b/web/app/components/workflow-app/hooks/use-workflow-start-run.tsx
index 0e8440791aa..7f85ef37f5b 100644
--- a/web/app/components/workflow-app/hooks/use-workflow-start-run.tsx
+++ b/web/app/components/workflow-app/hooks/use-workflow-start-run.tsx
@@ -1,12 +1,15 @@
-import type { useNodesSyncDraft, useWorkflowRun } from '.'
+import type { useNodesSyncDraft } from './use-nodes-sync-draft'
+import type { useWorkflowRun } from './use-workflow-run'
import { useCallback } from 'react'
import { useStoreApi } from 'reactflow'
import { useFeaturesStore } from '@/app/components/base/features/hooks'
import { TriggerType } from '@/app/components/workflow/header/test-run-menu'
-import { useWorkflowInteractions } from '@/app/components/workflow/hooks'
+import { useIsChatMode } from '@/app/components/workflow/hooks/use-workflow'
+import { useWorkflowInteractions } from '@/app/components/workflow/hooks/use-workflow-panel-interactions'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { BlockEnum, WorkflowRunningStatus } from '@/app/components/workflow/types'
-import { useIsChatMode, useNodesSyncDraftByCanEdit, useWorkflowRunByCanEdit } from '.'
+import { useNodesSyncDraftByCanEdit } from './use-nodes-sync-draft'
+import { useWorkflowRunByCanEdit } from './use-workflow-run'
type HandleRun = ReturnType['handleRun']
type DoSyncWorkflowDraft = ReturnType['doSyncWorkflowDraft']
diff --git a/web/app/components/workflow/__tests__/candidate-node-main.spec.tsx b/web/app/components/workflow/__tests__/candidate-node-main.spec.tsx
index 3e8aafa489d..09bd67c188e 100644
--- a/web/app/components/workflow/__tests__/candidate-node-main.spec.tsx
+++ b/web/app/components/workflow/__tests__/candidate-node-main.spec.tsx
@@ -47,11 +47,20 @@ vi.mock('@/app/components/workflow/store', () => ({
useWorkflowStore: () => mockUseWorkflowStore(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesInteractions: () => mockUseHooks().useNodesInteractions(),
- useNodesSyncDraft: () => mockUseHooks().useNodesSyncDraft(),
- useWorkflowHistory: () => mockUseHooks().useWorkflowHistory(),
+vi.mock('../hooks/use-auto-generate-webhook-url', () => ({
useAutoGenerateWebhookUrl: () => mockUseHooks().useAutoGenerateWebhookUrl(),
+}))
+
+vi.mock('../hooks/use-nodes-interactions', () => ({
+ useNodesInteractions: () => mockUseHooks().useNodesInteractions(),
+}))
+
+vi.mock('../hooks/use-nodes-sync-draft', () => ({
+ useNodesSyncDraft: () => mockUseHooks().useNodesSyncDraft(),
+}))
+
+vi.mock('../hooks/use-workflow-history', () => ({
+ useWorkflowHistory: () => mockUseHooks().useWorkflowHistory(),
WorkflowHistoryEvent: {
NodeAdd: 'NodeAdd',
NoteAdd: 'NoteAdd',
diff --git a/web/app/components/workflow/__tests__/custom-edge.spec.tsx b/web/app/components/workflow/__tests__/custom-edge.spec.tsx
index b7459679245..eaff72bfe0c 100644
--- a/web/app/components/workflow/__tests__/custom-edge.spec.tsx
+++ b/web/app/components/workflow/__tests__/custom-edge.spec.tsx
@@ -41,10 +41,23 @@ vi.mock('reactflow', () => ({
},
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useAvailableBlocks: (...args: unknown[]) => mockUseAvailableBlocks(...args),
- useNodesInteractions: () => mockUseNodesInteractions(),
-}))
+vi.mock('../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useAvailableBlocks: (...args: unknown[]) => mockUseAvailableBlocks(...args),
+ }
+})
+
+vi.mock('../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesInteractions: () => mockUseNodesInteractions(),
+ }
+})
vi.mock('@/app/components/workflow/block-selector', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/__tests__/edge-contextmenu.spec.tsx b/web/app/components/workflow/__tests__/edge-contextmenu.spec.tsx
index dbb8e33ca6b..879f93fce7a 100644
--- a/web/app/components/workflow/__tests__/edge-contextmenu.spec.tsx
+++ b/web/app/components/workflow/__tests__/edge-contextmenu.spec.tsx
@@ -35,16 +35,6 @@ vi.mock('../utils', async (importOriginal) => {
}
})
-vi.mock('../hooks', async () => {
- const { useEdgesInteractions } = await import('../hooks/use-edges-interactions')
- const { usePanelInteractions } = await import('../hooks/use-panel-interactions')
-
- return {
- useEdgesInteractions,
- usePanelInteractions,
- }
-})
-
type EdgeRuntimeState = {
_hovering?: boolean
_isBundled?: boolean
diff --git a/web/app/components/workflow/__tests__/features.spec.tsx b/web/app/components/workflow/__tests__/features.spec.tsx
index 5dee84b1e28..5d9da98e74c 100644
--- a/web/app/components/workflow/__tests__/features.spec.tsx
+++ b/web/app/components/workflow/__tests__/features.spec.tsx
@@ -31,8 +31,8 @@ const mockFeaturesStore = {
let mockIsChatMode = true
let mockNodesReadOnly = false
-vi.mock('../hooks', async () => {
- const actual = await vi.importActual('../hooks')
+vi.mock('../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
return {
...actual,
useIsChatMode: () => mockIsChatMode,
diff --git a/web/app/components/workflow/__tests__/panel-contextmenu.spec.tsx b/web/app/components/workflow/__tests__/panel-contextmenu.spec.tsx
index 478d722104c..1a6fdf7ca4d 100644
--- a/web/app/components/workflow/__tests__/panel-contextmenu.spec.tsx
+++ b/web/app/components/workflow/__tests__/panel-contextmenu.spec.tsx
@@ -24,17 +24,78 @@ vi.mock('react-i18next', () => ({
useTranslation: () => mockUseTranslation(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useAvailableBlocks: () => mockUseAvailableBlocks(),
- useDSL: () => mockUseDSL(),
- useIsChatMode: () => mockUseIsChatMode(),
- useNodesInteractions: () => mockUseNodesInteractions(),
- useNodesMetaData: () => mockUseNodesMetaData(),
- useNodesReadOnly: () => mockUseNodesReadOnly(),
- usePanelInteractions: () => mockUsePanelInteractions(),
- useWorkflowMoveMode: () => mockUseWorkflowMoveMode(),
- useWorkflowStartRun: () => mockUseWorkflowStartRun(),
-}))
+vi.mock('../hooks/use-DSL', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useDSL: () => mockUseDSL(),
+ }
+})
+
+vi.mock('../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useAvailableBlocks: () => mockUseAvailableBlocks(),
+ }
+})
+
+vi.mock('../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesInteractions: () => mockUseNodesInteractions(),
+ }
+})
+
+vi.mock('../hooks/use-nodes-meta-data', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesMetaData: () => mockUseNodesMetaData(),
+ }
+})
+
+vi.mock('../hooks/use-panel-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ usePanelInteractions: () => mockUsePanelInteractions(),
+ }
+})
+
+vi.mock('../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => mockUseIsChatMode(),
+ useNodesReadOnly: () => mockUseNodesReadOnly(),
+ }
+})
+
+vi.mock('../hooks/use-workflow-panel-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowMoveMode: () => mockUseWorkflowMoveMode(),
+ }
+})
+
+vi.mock('../hooks/use-workflow-start-run', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowStartRun: () => mockUseWorkflowStartRun(),
+ }
+})
vi.mock('@/app/components/workflow/operator/hooks', () => ({
useOperator: () => mockUseOperator(),
diff --git a/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx b/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx
index 39b0dd3a93c..105f9089f1c 100644
--- a/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx
+++ b/web/app/components/workflow/__tests__/selection-contextmenu.spec.tsx
@@ -65,13 +65,20 @@ vi.mock('@/app/components/snippets/create-snippet-dialog', () => ({
},
}))
-vi.mock('../hooks', async () => {
- const actual = await vi.importActual('../hooks')
+vi.mock('../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
return {
...actual,
useNodesReadOnly: () => ({
getNodesReadOnly: mockGetNodesReadOnly,
}),
+ }
+})
+
+vi.mock('../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+ return {
+ ...actual,
useNodesInteractions: () => ({
handleNodesCopy: mockHandleNodesCopy,
handleNodesDuplicate: mockHandleNodesDuplicate,
diff --git a/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx b/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx
index 6e188a05b80..ac8e4c9ef29 100644
--- a/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx
+++ b/web/app/components/workflow/__tests__/workflow-edge-events.spec.tsx
@@ -374,13 +374,16 @@ vi.mock('../shortcuts/use-workflow-hotkeys', () => ({
useWorkflowHotkeys: workflowHookMocks.useShortcuts,
}))
-vi.mock('../hooks', () => ({
+vi.mock('../hooks/use-edges-interactions', () => ({
useEdgesInteractions: () => ({
handleEdgeEnter: workflowHookMocks.handleEdgeEnter,
handleEdgeLeave: workflowHookMocks.handleEdgeLeave,
handleEdgesChange: workflowHookMocks.handleEdgesChange,
handleEdgeContextMenu: workflowHookMocks.handleEdgeContextMenu,
}),
+}))
+
+vi.mock('../hooks/use-nodes-interactions', () => ({
useNodesInteractions: () => ({
handleNodesCopy: vi.fn(),
handleNodesDelete: vi.fn(),
@@ -399,43 +402,69 @@ vi.mock('../hooks', () => ({
handleHistoryBack: workflowHookMocks.handleHistoryBack,
handleHistoryForward: workflowHookMocks.handleHistoryForward,
}),
+}))
+
+vi.mock('../hooks/use-workflow', () => ({
useNodesReadOnly: () => ({
nodesReadOnly: false,
getNodesReadOnly: () => false,
}),
- useNodesSyncDraft: () => ({
- handleSyncWorkflowDraft: workflowHookMocks.handleSyncWorkflowDraft,
- syncWorkflowDraftWhenPageClose: vi.fn(),
- }),
- usePanelInteractions: () => ({
- handlePaneContextMenu: workflowHookMocks.handlePaneContextMenu,
- }),
- useDSL: () => ({
- exportCheck: vi.fn(),
- }),
useIsChatMode: () => false,
- useSelectionInteractions: () => ({
- handleSelectionStart: workflowHookMocks.handleSelectionStart,
- handleSelectionChange: workflowHookMocks.handleSelectionChange,
- handleSelectionDrag: workflowHookMocks.handleSelectionDrag,
- handleSelectionContextMenu: workflowHookMocks.handleSelectionContextMenu,
- }),
- useSetWorkflowVarsWithValue: () => ({
- fetchInspectVars: workflowHookMocks.fetchInspectVars,
- }),
- useShortcuts: workflowHookMocks.useShortcuts,
useWorkflow: () => ({
isValidConnection: workflowHookMocks.isValidConnection,
}),
useWorkflowReadOnly: () => ({
workflowReadOnly: false,
}),
+}))
+
+vi.mock('../hooks/use-nodes-sync-draft', () => ({
+ useNodesSyncDraft: () => ({
+ handleSyncWorkflowDraft: workflowHookMocks.handleSyncWorkflowDraft,
+ syncWorkflowDraftWhenPageClose: vi.fn(),
+ }),
+}))
+
+vi.mock('../hooks/use-panel-interactions', () => ({
+ usePanelInteractions: () => ({
+ handlePaneContextMenu: workflowHookMocks.handlePaneContextMenu,
+ }),
+}))
+
+vi.mock('../hooks/use-DSL', () => ({
+ useDSL: () => ({
+ exportCheck: vi.fn(),
+ }),
+}))
+
+vi.mock('../hooks/use-selection-interactions', () => ({
+ useSelectionInteractions: () => ({
+ handleSelectionStart: workflowHookMocks.handleSelectionStart,
+ handleSelectionChange: workflowHookMocks.handleSelectionChange,
+ handleSelectionDrag: workflowHookMocks.handleSelectionDrag,
+ handleSelectionContextMenu: workflowHookMocks.handleSelectionContextMenu,
+ }),
+}))
+
+vi.mock('../hooks/use-set-workflow-vars-with-value', () => ({
+ useSetWorkflowVarsWithValue: () => ({
+ fetchInspectVars: workflowHookMocks.fetchInspectVars,
+ }),
+}))
+
+vi.mock('../hooks/use-workflow-panel-interactions', () => ({
useWorkflowMoveMode: () => ({
isCommentModeAvailable: false,
}),
+}))
+
+vi.mock('../hooks/use-workflow-refresh-draft', () => ({
useWorkflowRefreshDraft: () => ({
handleRefreshWorkflowDraft: vi.fn(),
}),
+}))
+
+vi.mock('../hooks/use-workflow-start-run', () => ({
useWorkflowStartRun: () => ({
handleStartWorkflowRun: vi.fn(),
handleWorkflowStartRunInChatflow: vi.fn(),
diff --git a/web/app/components/workflow/block-selector/__tests__/all-start-blocks.spec.tsx b/web/app/components/workflow/block-selector/__tests__/all-start-blocks.spec.tsx
index f4c769df7b5..ecb901cc0e6 100644
--- a/web/app/components/workflow/block-selector/__tests__/all-start-blocks.spec.tsx
+++ b/web/app/components/workflow/block-selector/__tests__/all-start-blocks.spec.tsx
@@ -5,13 +5,13 @@ import userEvent from '@testing-library/user-event'
import { useMarketplacePlugins } from '@/app/components/plugins/marketplace/query'
import { PluginCategoryEnum } from '@/app/components/plugins/types'
import { CollectionType } from '@/app/components/tools/types'
+import { useAvailableNodesMetaData } from '@/app/components/workflow-app/hooks/use-available-nodes-meta-data'
import { useGetLanguage, useLocale } from '@/context/i18n'
import useTheme from '@/hooks/use-theme'
import { useFeaturedTriggersRecommendations } from '@/service/use-plugins'
import { useAllTriggerPlugins, useInvalidateAllTriggerPlugins } from '@/service/use-triggers'
import { renderWithConsoleQuery } from '@/test/console/query-data'
import { Theme } from '@/types/app'
-import { useAvailableNodesMetaData } from '../../../workflow-app/hooks'
import useNodes from '../../store/workflow/use-nodes'
import { BlockEnum } from '../../types'
import AllStartBlocks from '../all-start-blocks'
@@ -43,7 +43,7 @@ vi.mock('../../store/workflow/use-nodes', () => ({
default: vi.fn(),
}))
-vi.mock('../../../workflow-app/hooks', () => ({
+vi.mock('@/app/components/workflow-app/hooks/use-available-nodes-meta-data', () => ({
useAvailableNodesMetaData: vi.fn(),
}))
diff --git a/web/app/components/workflow/block-selector/__tests__/start-blocks.spec.tsx b/web/app/components/workflow/block-selector/__tests__/start-blocks.spec.tsx
index 7ec86860008..bf757ae1a05 100644
--- a/web/app/components/workflow/block-selector/__tests__/start-blocks.spec.tsx
+++ b/web/app/components/workflow/block-selector/__tests__/start-blocks.spec.tsx
@@ -1,8 +1,8 @@
import type { CommonNodeType } from '../../types'
import { render, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
+import { useAvailableNodesMetaData } from '@/app/components/workflow-app/hooks/use-available-nodes-meta-data'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
-import { useAvailableNodesMetaData } from '../../../workflow-app/hooks'
import { BlockEnum } from '../../types'
import StartBlocks from '../start-blocks'
@@ -10,7 +10,7 @@ vi.mock('@/app/components/workflow/store/workflow/use-nodes', () => ({
default: vi.fn(),
}))
-vi.mock('../../../workflow-app/hooks', () => ({
+vi.mock('@/app/components/workflow-app/hooks/use-available-nodes-meta-data', () => ({
useAvailableNodesMetaData: vi.fn(),
}))
diff --git a/web/app/components/workflow/block-selector/snippets/__tests__/use-insert-snippet.spec.tsx b/web/app/components/workflow/block-selector/snippets/__tests__/use-insert-snippet.spec.tsx
index be5559e79f3..9ec90476499 100644
--- a/web/app/components/workflow/block-selector/snippets/__tests__/use-insert-snippet.spec.tsx
+++ b/web/app/components/workflow/block-selector/snippets/__tests__/use-insert-snippet.spec.tsx
@@ -59,10 +59,13 @@ vi.mock('reactflow', () => ({
}),
}))
-vi.mock('../../../hooks', () => ({
+vi.mock('../../../hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft,
}),
+}))
+
+vi.mock('../../../hooks/use-workflow-history', () => ({
useWorkflowHistory: () => ({
saveStateToHistory: mockSaveStateToHistory,
}),
diff --git a/web/app/components/workflow/block-selector/snippets/use-insert-snippet.ts b/web/app/components/workflow/block-selector/snippets/use-insert-snippet.ts
index fc7ed250ab7..0e2e5b5de98 100644
--- a/web/app/components/workflow/block-selector/snippets/use-insert-snippet.ts
+++ b/web/app/components/workflow/block-selector/snippets/use-insert-snippet.ts
@@ -7,7 +7,8 @@ import { useStoreApi } from 'reactflow'
import { consoleQuery } from '@/service/client'
import { useIncrementSnippetUseCountMutation } from '@/service/use-snippets'
import { CUSTOM_EDGE, NESTED_ELEMENT_Z_INDEX, NODE_WIDTH_X_OFFSET, X_OFFSET } from '../../constants'
-import { useNodesSyncDraft, useWorkflowHistory, WorkflowHistoryEvent } from '../../hooks'
+import { useNodesSyncDraft } from '../../hooks/use-nodes-sync-draft'
+import { useWorkflowHistory, WorkflowHistoryEvent } from '../../hooks/use-workflow-history'
import { BlockEnum } from '../../types'
import { getNodesConnectedSourceOrTargetHandleIdsMap } from '../../utils'
diff --git a/web/app/components/workflow/candidate-node-main.tsx b/web/app/components/workflow/candidate-node-main.tsx
index 2d4af22960c..79ac1184cd0 100644
--- a/web/app/components/workflow/candidate-node-main.tsx
+++ b/web/app/components/workflow/candidate-node-main.tsx
@@ -4,15 +4,12 @@ import { useEventListener } from 'ahooks'
import { produce } from 'immer'
import { memo } from 'react'
import { useReactFlow, useViewport } from 'reactflow'
-import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow'
import { CUSTOM_NODE } from './constants'
-import {
- useAutoGenerateWebhookUrl,
- useNodesInteractions,
- useNodesSyncDraft,
- useWorkflowHistory,
- WorkflowHistoryEvent,
-} from './hooks'
+import { useAutoGenerateWebhookUrl } from './hooks/use-auto-generate-webhook-url'
+import { useCollaborativeWorkflow } from './hooks/use-collaborative-workflow'
+import { useNodesInteractions } from './hooks/use-nodes-interactions'
+import { useNodesSyncDraft } from './hooks/use-nodes-sync-draft'
+import { useWorkflowHistory, WorkflowHistoryEvent } from './hooks/use-workflow-history'
import CustomNode from './nodes'
import { useCreateInlineAgentBinding } from './nodes/agent-v2/hooks'
import { isAgentV2NodeData, needsInlineAgentBindingCreation } from './nodes/agent-v2/types'
diff --git a/web/app/components/workflow/custom-edge.tsx b/web/app/components/workflow/custom-edge.tsx
index 871b0b4f7c4..f5803064c00 100644
--- a/web/app/components/workflow/custom-edge.tsx
+++ b/web/app/components/workflow/custom-edge.tsx
@@ -7,7 +7,8 @@ import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/compo
import BlockSelector from './block-selector'
import { NESTED_ELEMENT_Z_INDEX } from './constants'
import CustomEdgeLinearGradientRender from './custom-edge-linear-gradient-render'
-import { useAvailableBlocks, useNodesInteractions } from './hooks'
+import { useAvailableBlocks } from './hooks/use-available-blocks'
+import { useNodesInteractions } from './hooks/use-nodes-interactions'
import { NodeRunningStatus } from './types'
import { getEdgeColor } from './utils'
diff --git a/web/app/components/workflow/edge-contextmenu.tsx b/web/app/components/workflow/edge-contextmenu.tsx
index ff351020f7c..8c87472a2e9 100644
--- a/web/app/components/workflow/edge-contextmenu.tsx
+++ b/web/app/components/workflow/edge-contextmenu.tsx
@@ -1,7 +1,7 @@
import { ContextMenuContent, ContextMenuItem } from '@langgenius/dify-ui/context-menu'
import { useTranslation } from 'react-i18next'
import { useEdges } from 'reactflow'
-import { useEdgesInteractions } from './hooks'
+import { useEdgesInteractions } from './hooks/use-edges-interactions'
import { ShortcutKbd } from './shortcuts/shortcut-kbd'
import { useStore } from './store'
diff --git a/web/app/components/workflow/features.tsx b/web/app/components/workflow/features.tsx
index f466ab1a580..91150b44f88 100644
--- a/web/app/components/workflow/features.tsx
+++ b/web/app/components/workflow/features.tsx
@@ -8,7 +8,7 @@ import { useFeaturesStore } from '@/app/components/base/features/hooks'
import NewFeaturePanel from '@/app/components/base/features/new-feature-panel'
import { webSocketClient } from '@/app/components/workflow/collaboration/core/websocket-manager'
import { updateFeatures } from '@/service/workflow'
-import { useIsChatMode, useNodesReadOnly } from './hooks'
+import { useIsChatMode, useNodesReadOnly } from './hooks/use-workflow'
import useConfig from './nodes/start/use-config'
import { useStore } from './store'
import { InputVarType } from './types'
diff --git a/web/app/components/workflow/header/__tests__/env-button.spec.tsx b/web/app/components/workflow/header/__tests__/env-button.spec.tsx
index 0f579d37a0f..beae77fa277 100644
--- a/web/app/components/workflow/header/__tests__/env-button.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/env-button.spec.tsx
@@ -11,7 +11,7 @@ vi.mock('@/hooks/use-theme', () => ({
}),
}))
-vi.mock('@/app/components/rag-pipeline/hooks', () => ({
+vi.mock('@/app/components/rag-pipeline/hooks/use-input-field-panel', () => ({
useInputFieldPanel: () => ({
closeAllInputFieldPanels: mockCloseAllInputFieldPanels,
}),
diff --git a/web/app/components/workflow/header/__tests__/global-variable-button.spec.tsx b/web/app/components/workflow/header/__tests__/global-variable-button.spec.tsx
index 33df5bc4d8b..a5010bd6ce2 100644
--- a/web/app/components/workflow/header/__tests__/global-variable-button.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/global-variable-button.spec.tsx
@@ -11,7 +11,7 @@ vi.mock('@/hooks/use-theme', () => ({
}),
}))
-vi.mock('@/app/components/rag-pipeline/hooks', () => ({
+vi.mock('@/app/components/rag-pipeline/hooks/use-input-field-panel', () => ({
useInputFieldPanel: () => ({
closeAllInputFieldPanels: mockCloseAllInputFieldPanels,
}),
diff --git a/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx b/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx
index a08079b708e..06d5070759b 100644
--- a/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/header-in-restoring.spec.tsx
@@ -58,10 +58,13 @@ vi.mock('@/service/use-workflow', () => ({
}),
}))
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({
handleLoadBackupDraft: mockHandleLoadBackupDraft,
}),
+}))
+
+vi.mock('../../hooks/use-workflow-refresh-draft', () => ({
useWorkflowRefreshDraft: () => ({
handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft,
}),
diff --git a/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx b/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx
index cf999af8fcd..1c63792f9bb 100644
--- a/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/header-layouts.spec.tsx
@@ -41,22 +41,34 @@ vi.mock('reactflow', () => ({
useNodes: () => mockUseNodes(),
}))
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-workflow', () => ({
useNodesReadOnly: () => ({ nodesReadOnly: mockNodesReadOnly }),
+}))
+
+vi.mock('../../hooks/use-nodes-interactions', () => ({
useNodesInteractions: () => ({ handleNodeSelect: mockHandleNodeSelect }),
+}))
+
+vi.mock('../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({
handleBackupDraft: mockHandleBackupDraft,
handleLoadBackupDraft: mockHandleLoadBackupDraft,
}),
+}))
+
+vi.mock('../../hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
handleSyncWorkflowDraft: vi.fn(),
}),
+}))
+
+vi.mock('../../hooks/use-workflow-refresh-draft', () => ({
useWorkflowRefreshDraft: () => ({
handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft,
}),
}))
-vi.mock('@/app/components/rag-pipeline/hooks', () => ({
+vi.mock('@/app/components/rag-pipeline/hooks/use-input-field-panel', () => ({
useInputFieldPanel: () => ({
closeAllInputFieldPanels: mockCloseAllInputFieldPanels,
}),
diff --git a/web/app/components/workflow/header/__tests__/index.spec.tsx b/web/app/components/workflow/header/__tests__/index.spec.tsx
index aeb5fd13478..759a4714f24 100644
--- a/web/app/components/workflow/header/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/index.spec.tsx
@@ -27,7 +27,7 @@ function DynamicHeaderRestoring(props: Record) {
)
}
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-workflow-mode', () => ({
useWorkflowMode: () => mockWorkflowMode,
}))
diff --git a/web/app/components/workflow/header/__tests__/run-and-history.spec.tsx b/web/app/components/workflow/header/__tests__/run-and-history.spec.tsx
index f75637df96b..eb817564b31 100644
--- a/web/app/components/workflow/header/__tests__/run-and-history.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/run-and-history.spec.tsx
@@ -8,8 +8,11 @@ const mockState = vi.hoisted(() => ({
const mockRunMode = vi.hoisted(() => vi.fn())
const mockHandleWorkflowStartRunInChatflow = vi.hoisted(() => vi.fn())
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-workflow', () => ({
useNodesReadOnly: () => ({ nodesReadOnly: mockState.nodesReadOnly }),
+}))
+
+vi.mock('../../hooks/use-workflow-start-run', () => ({
useWorkflowStartRun: () => ({
handleWorkflowStartRunInChatflow: mockHandleWorkflowStartRunInChatflow,
}),
diff --git a/web/app/components/workflow/header/__tests__/run-mode.spec.tsx b/web/app/components/workflow/header/__tests__/run-mode.spec.tsx
index 6544d93f874..2e3c6720656 100644
--- a/web/app/components/workflow/header/__tests__/run-mode.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/run-mode.spec.tsx
@@ -33,21 +33,42 @@ let mockIsListening = false
let mockCanRun = true
let mockDynamicOptions = [{ type: TriggerType.UserInput, nodeId: 'start-node' }]
-vi.mock('@/app/components/workflow/hooks', () => ({
- useWorkflowStartRun: () => ({
- handleWorkflowStartRunInWorkflow: mockHandleWorkflowStartRunInWorkflow,
- handleWorkflowTriggerScheduleRunInWorkflow: mockHandleWorkflowTriggerScheduleRunInWorkflow,
- handleWorkflowTriggerWebhookRunInWorkflow: mockHandleWorkflowTriggerWebhookRunInWorkflow,
- handleWorkflowTriggerPluginRunInWorkflow: mockHandleWorkflowTriggerPluginRunInWorkflow,
- handleWorkflowRunAllTriggersInWorkflow: mockHandleWorkflowRunAllTriggersInWorkflow,
- }),
- useWorkflowRun: () => ({
- handleStopRun: mockHandleStopRun,
- }),
- useWorkflowRunValidation: () => ({
- warningNodes: mockWarningNodes,
- }),
-}))
+vi.mock('../../hooks/use-checklist', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowRunValidation: () => ({
+ warningNodes: mockWarningNodes,
+ }),
+ }
+})
+
+vi.mock('../../hooks/use-workflow-run', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowRun: () => ({
+ handleStopRun: mockHandleStopRun,
+ }),
+ }
+})
+
+vi.mock('../../hooks/use-workflow-start-run', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowStartRun: () => ({
+ handleWorkflowStartRunInWorkflow: mockHandleWorkflowStartRunInWorkflow,
+ handleWorkflowTriggerScheduleRunInWorkflow: mockHandleWorkflowTriggerScheduleRunInWorkflow,
+ handleWorkflowTriggerWebhookRunInWorkflow: mockHandleWorkflowTriggerWebhookRunInWorkflow,
+ handleWorkflowTriggerPluginRunInWorkflow: mockHandleWorkflowTriggerPluginRunInWorkflow,
+ handleWorkflowRunAllTriggersInWorkflow: mockHandleWorkflowRunAllTriggersInWorkflow,
+ }),
+ }
+})
vi.mock('@/app/components/workflow/store/workflow', () => ({
useStore: (
diff --git a/web/app/components/workflow/header/__tests__/running-title.spec.tsx b/web/app/components/workflow/header/__tests__/running-title.spec.tsx
index 7d904ed74a2..bdc62573a2c 100644
--- a/web/app/components/workflow/header/__tests__/running-title.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/running-title.spec.tsx
@@ -4,7 +4,7 @@ import RunningTitle from '../running-title'
let mockIsChatMode = false
const mockFormatWorkflowRunIdentifier = vi.fn()
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-workflow', () => ({
useIsChatMode: () => mockIsChatMode,
}))
diff --git a/web/app/components/workflow/header/__tests__/undo-redo.spec.tsx b/web/app/components/workflow/header/__tests__/undo-redo.spec.tsx
index 4f3b6616760..18a4f79b38d 100644
--- a/web/app/components/workflow/header/__tests__/undo-redo.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/undo-redo.spec.tsx
@@ -15,11 +15,16 @@ vi.mock('@/app/components/workflow/header/view-workflow-history', () => ({
default: () => ,
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({
- nodesReadOnly: mockNodesReadOnly,
- }),
-}))
+vi.mock('../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({
+ nodesReadOnly: mockNodesReadOnly,
+ }),
+ }
+})
vi.mock('@/app/components/workflow/workflow-history-store', () => ({
useWorkflowHistoryStore: () => ({
diff --git a/web/app/components/workflow/header/__tests__/view-history.spec.tsx b/web/app/components/workflow/header/__tests__/view-history.spec.tsx
index 1d8dec6beeb..e2b4553fef3 100644
--- a/web/app/components/workflow/header/__tests__/view-history.spec.tsx
+++ b/web/app/components/workflow/header/__tests__/view-history.spec.tsx
@@ -17,20 +17,27 @@ const mockFormatWorkflowRunIdentifier = vi.fn(
let mockIsChatMode = false
-vi.mock('../../hooks', () => {
- return {
- useIsChatMode: () => mockIsChatMode,
- useNodesInteractions: () => ({
- handleNodesCancelSelected: mockHandleNodesCancelSelected,
- }),
- useWorkflowInteractions: () => ({
- handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel,
- }),
- useWorkflowRun: () => ({
- handleBackupDraft: mockHandleBackupDraft,
- }),
- }
-})
+vi.mock('../../hooks/use-workflow', () => ({
+ useIsChatMode: () => mockIsChatMode,
+}))
+
+vi.mock('../../hooks/use-nodes-interactions', () => ({
+ useNodesInteractions: () => ({
+ handleNodesCancelSelected: mockHandleNodesCancelSelected,
+ }),
+}))
+
+vi.mock('../../hooks/use-workflow-panel-interactions', () => ({
+ useWorkflowInteractions: () => ({
+ handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel,
+ }),
+}))
+
+vi.mock('../../hooks/use-workflow-run', () => ({
+ useWorkflowRun: () => ({
+ handleBackupDraft: mockHandleBackupDraft,
+ }),
+}))
vi.mock('@/service/use-workflow', () => ({
useWorkflowRunHistory: (url?: string, enabled?: boolean) =>
@@ -43,7 +50,7 @@ vi.mock('@/hooks/use-format-time-from-now', () => ({
}),
}))
-vi.mock('@/app/components/rag-pipeline/hooks', () => ({
+vi.mock('@/app/components/rag-pipeline/hooks/use-input-field-panel', () => ({
useInputFieldPanel: () => ({
closeAllInputFieldPanels: mockCloseAllInputFieldPanels,
}),
diff --git a/web/app/components/workflow/header/checklist/__tests__/index.spec.tsx b/web/app/components/workflow/header/checklist/__tests__/index.spec.tsx
index fcafc724c11..9255d13bd3b 100644
--- a/web/app/components/workflow/header/checklist/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/header/checklist/__tests__/index.spec.tsx
@@ -40,8 +40,11 @@ vi.mock('@/app/components/workflow/store/workflow/use-nodes', () => ({
default: () => [],
}))
-vi.mock('../../../hooks', () => ({
+vi.mock('../../../hooks/use-checklist', () => ({
useChecklist: () => mockChecklistItems,
+}))
+
+vi.mock('../../../hooks/use-nodes-interactions', () => ({
useNodesInteractions: () => ({
handleNodeSelect: mockHandleNodeSelect,
}),
diff --git a/web/app/components/workflow/header/checklist/index.tsx b/web/app/components/workflow/header/checklist/index.tsx
index bad1fc3162e..da1e1b4ee80 100644
--- a/web/app/components/workflow/header/checklist/index.tsx
+++ b/web/app/components/workflow/header/checklist/index.tsx
@@ -13,8 +13,9 @@ import { memo, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useEdges } from 'reactflow'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
-import { useChecklist, useNodesInteractions } from '../../hooks'
import { useHooksStore } from '../../hooks-store/store'
+import { useChecklist } from '../../hooks/use-checklist'
+import { useNodesInteractions } from '../../hooks/use-nodes-interactions'
import { ChecklistNodeGroup } from './node-group'
import { ChecklistPluginGroup } from './plugin-group'
diff --git a/web/app/components/workflow/header/env-button.tsx b/web/app/components/workflow/header/env-button.tsx
index 9859abfebee..1d52b04fe6e 100644
--- a/web/app/components/workflow/header/env-button.tsx
+++ b/web/app/components/workflow/header/env-button.tsx
@@ -2,7 +2,7 @@ import { Button } from '@langgenius/dify-ui/button'
import { cn } from '@langgenius/dify-ui/cn'
import { memo } from 'react'
import { Env } from '@/app/components/base/icons/src/vender/line/others'
-import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks'
+import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks/use-input-field-panel'
import { useStore } from '@/app/components/workflow/store'
import useTheme from '@/hooks/use-theme'
diff --git a/web/app/components/workflow/header/global-variable-button.tsx b/web/app/components/workflow/header/global-variable-button.tsx
index 091aca99b97..ec335c7a9f5 100644
--- a/web/app/components/workflow/header/global-variable-button.tsx
+++ b/web/app/components/workflow/header/global-variable-button.tsx
@@ -2,7 +2,7 @@ import { Button } from '@langgenius/dify-ui/button'
import { cn } from '@langgenius/dify-ui/cn'
import { memo } from 'react'
import { GlobalVariable } from '@/app/components/base/icons/src/vender/line/others'
-import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks'
+import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks/use-input-field-panel'
import { useStore } from '@/app/components/workflow/store'
import useTheme from '@/hooks/use-theme'
diff --git a/web/app/components/workflow/header/header-in-normal.tsx b/web/app/components/workflow/header/header-in-normal.tsx
index 643265d6d4f..132984cc3fa 100644
--- a/web/app/components/workflow/header/header-in-normal.tsx
+++ b/web/app/components/workflow/header/header-in-normal.tsx
@@ -2,10 +2,12 @@ import type { StartNodeType } from '../nodes/start/types'
import type { RunAndHistoryProps } from './run-and-history'
import { useCallback } from 'react'
import { useNodes } from 'reactflow'
-import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks'
+import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks/use-input-field-panel'
import Divider from '../../base/divider'
-import { useNodesInteractions, useNodesReadOnly, useWorkflowRun } from '../hooks'
import { useHooksStore } from '../hooks-store'
+import { useNodesInteractions } from '../hooks/use-nodes-interactions'
+import { useNodesReadOnly } from '../hooks/use-workflow'
+import { useWorkflowRun } from '../hooks/use-workflow-run'
import { useStore, useWorkflowStore } from '../store'
import EditingTitle from './editing-title'
import EnvButton from './env-button'
diff --git a/web/app/components/workflow/header/header-in-restoring.tsx b/web/app/components/workflow/header/header-in-restoring.tsx
index 2c6418fcd01..0d699a19a79 100644
--- a/web/app/components/workflow/header/header-in-restoring.tsx
+++ b/web/app/components/workflow/header/header-in-restoring.tsx
@@ -16,8 +16,9 @@ import {
useRestoreWorkflow,
} from '@/service/use-workflow'
import { FlowType } from '@/types/common'
-import { useWorkflowRefreshDraft, useWorkflowRun } from '../hooks'
import { useHooksStore } from '../hooks-store'
+import { useWorkflowRefreshDraft } from '../hooks/use-workflow-refresh-draft'
+import { useWorkflowRun } from '../hooks/use-workflow-run'
import { useStore, useWorkflowStore } from '../store'
import { WorkflowVersion } from '../types'
import RestoringTitle from './restoring-title'
diff --git a/web/app/components/workflow/header/header-in-view-history.tsx b/web/app/components/workflow/header/header-in-view-history.tsx
index f89ce3ccd2c..d130e91d2ec 100644
--- a/web/app/components/workflow/header/header-in-view-history.tsx
+++ b/web/app/components/workflow/header/header-in-view-history.tsx
@@ -4,7 +4,7 @@ import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows'
import Divider from '../../base/divider'
-import { useWorkflowRun } from '../hooks'
+import { useWorkflowRun } from '../hooks/use-workflow-run'
import { useWorkflowStore } from '../store'
import RunningTitle from './running-title'
import ViewHistory from './view-history'
diff --git a/web/app/components/workflow/header/index.tsx b/web/app/components/workflow/header/index.tsx
index a460821ae71..9e9c08ea3b2 100644
--- a/web/app/components/workflow/header/index.tsx
+++ b/web/app/components/workflow/header/index.tsx
@@ -2,7 +2,7 @@ import type { HeaderInNormalProps } from './header-in-normal'
import type { HeaderInRestoringProps } from './header-in-restoring'
import type { HeaderInHistoryProps } from './header-in-view-history'
import dynamic from '@/next/dynamic'
-import { useWorkflowMode } from '../hooks'
+import { useWorkflowMode } from '../hooks/use-workflow-mode'
import HeaderInNormal from './header-in-normal'
const HeaderInHistory = dynamic(() => import('./header-in-view-history'), {
diff --git a/web/app/components/workflow/header/run-and-history.tsx b/web/app/components/workflow/header/run-and-history.tsx
index 2c98874e5cd..6f330ef8eca 100644
--- a/web/app/components/workflow/header/run-and-history.tsx
+++ b/web/app/components/workflow/header/run-and-history.tsx
@@ -2,8 +2,9 @@ import type { ViewHistoryProps } from './view-history'
import { cn } from '@langgenius/dify-ui/cn'
import { memo } from 'react'
import { useTranslation } from 'react-i18next'
-import { useNodesReadOnly, useWorkflowStartRun } from '../hooks'
import { useHooksStore } from '../hooks-store'
+import { useNodesReadOnly } from '../hooks/use-workflow'
+import { useWorkflowStartRun } from '../hooks/use-workflow-start-run'
import Checklist from './checklist'
import RunMode from './run-mode'
import ViewHistory from './view-history'
diff --git a/web/app/components/workflow/header/run-mode.tsx b/web/app/components/workflow/header/run-mode.tsx
index e3433d68ee9..a3b0d964b89 100644
--- a/web/app/components/workflow/header/run-mode.tsx
+++ b/web/app/components/workflow/header/run-mode.tsx
@@ -7,18 +7,16 @@ import * as React from 'react'
import { useCallback, useRef } from 'react'
import { useTranslation } from 'react-i18next'
import { trackEvent } from '@/app/components/base/amplitude'
-import {
- useWorkflowRun,
- useWorkflowRunValidation,
- useWorkflowStartRun,
-} from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
import { ShortcutKbd } from '@/app/components/workflow/shortcuts/shortcut-kbd'
import { useStore } from '@/app/components/workflow/store/workflow'
import { WorkflowRunningStatus } from '@/app/components/workflow/types'
import { EVENT_WORKFLOW_STOP } from '@/app/components/workflow/variable-inspect/types'
import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { useWorkflowRunValidation } from '../hooks/use-checklist'
import { useDynamicTestRunOptions } from '../hooks/use-dynamic-test-run-options'
+import { useWorkflowRun } from '../hooks/use-workflow-run'
+import { useWorkflowStartRun } from '../hooks/use-workflow-start-run'
import { TEST_RUN_MENU_HOTKEY } from '../hotkeys'
import TestRunMenu, { TriggerType } from './test-run-menu'
diff --git a/web/app/components/workflow/header/running-title.tsx b/web/app/components/workflow/header/running-title.tsx
index 63c3279396a..2a663b4f89e 100644
--- a/web/app/components/workflow/header/running-title.tsx
+++ b/web/app/components/workflow/header/running-title.tsx
@@ -1,7 +1,7 @@
import { memo } from 'react'
import { useTranslation } from 'react-i18next'
import { ClockPlay } from '@/app/components/base/icons/src/vender/line/time'
-import { useIsChatMode } from '../hooks'
+import { useIsChatMode } from '../hooks/use-workflow'
import { useStore } from '../store'
import { formatWorkflowRunIdentifier } from '../utils'
diff --git a/web/app/components/workflow/header/undo-redo.tsx b/web/app/components/workflow/header/undo-redo.tsx
index 3aeaef9adf6..90be74c86ef 100644
--- a/web/app/components/workflow/header/undo-redo.tsx
+++ b/web/app/components/workflow/header/undo-redo.tsx
@@ -3,9 +3,9 @@ import { cn } from '@langgenius/dify-ui/cn'
import { memo, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import ViewWorkflowHistory from '@/app/components/workflow/header/view-workflow-history'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import { useWorkflowHistoryStore } from '@/app/components/workflow/workflow-history-store'
import Divider from '../../base/divider'
+import { useNodesReadOnly } from '../hooks/use-workflow'
import TipPopup from '../operator/tip-popup'
type UndoRedoProps = { handleUndo: () => void; handleRedo: () => void }
diff --git a/web/app/components/workflow/header/view-history.tsx b/web/app/components/workflow/header/view-history.tsx
index 3b52c3a5e45..98f1ac8dccb 100644
--- a/web/app/components/workflow/header/view-history.tsx
+++ b/web/app/components/workflow/header/view-history.tsx
@@ -4,16 +4,14 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@langgenius/dify-ui/too
import { memo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import Loading from '@/app/components/base/loading'
-import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks'
+import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks/use-input-field-panel'
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now'
import { useWorkflowRunHistory } from '@/service/use-workflow'
-import {
- useIsChatMode,
- useNodesInteractions,
- useWorkflowInteractions,
- useWorkflowRun,
-} from '../hooks'
+import { useNodesInteractions } from '../hooks/use-nodes-interactions'
+import { useIsChatMode } from '../hooks/use-workflow'
+import { useWorkflowInteractions } from '../hooks/use-workflow-panel-interactions'
+import { useWorkflowRun } from '../hooks/use-workflow-run'
import { ControlMode, WorkflowRunningStatus } from '../types'
import { formatWorkflowRunIdentifier } from '../utils'
diff --git a/web/app/components/workflow/header/view-workflow-history.tsx b/web/app/components/workflow/header/view-workflow-history.tsx
index 285866aa842..fbf27def6fd 100644
--- a/web/app/components/workflow/header/view-workflow-history.tsx
+++ b/web/app/components/workflow/header/view-workflow-history.tsx
@@ -8,8 +8,9 @@ import { useShallow } from 'zustand/react/shallow'
import { useStore as useAppStore } from '@/app/components/app/store'
import Divider from '../../base/divider'
import { collaborationManager } from '../collaboration/core/collaboration-manager'
-import { useNodesReadOnly, useWorkflowHistory } from '../hooks'
import { useCollaborativeWorkflow } from '../hooks/use-collaborative-workflow'
+import { useNodesReadOnly } from '../hooks/use-workflow'
+import { useWorkflowHistory } from '../hooks/use-workflow-history'
import TipPopup from '../operator/tip-popup'
type ChangeHistoryEntry = {
diff --git a/web/app/components/workflow/hooks/__tests__/use-nodes-available-var-list.spec.ts b/web/app/components/workflow/hooks/__tests__/use-nodes-available-var-list.spec.ts
index 9201ec39f5e..c2b6d41b2f6 100644
--- a/web/app/components/workflow/hooks/__tests__/use-nodes-available-var-list.spec.ts
+++ b/web/app/components/workflow/hooks/__tests__/use-nodes-available-var-list.spec.ts
@@ -15,16 +15,29 @@ const mockFlowType = vi.hoisted(() => ({
value: undefined as FlowType | undefined,
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => true,
- useWorkflow: () => ({
- getTreeLeafNodes: mockGetTreeLeafNodes,
- getBeforeNodesInSameBranchIncludeParent: mockGetBeforeNodesInSameBranchIncludeParent,
- }),
- useWorkflowVariables: () => ({
- getNodeAvailableVars: mockGetNodeAvailableVars,
- }),
-}))
+vi.mock('../use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => true,
+ useWorkflow: () => ({
+ getTreeLeafNodes: mockGetTreeLeafNodes,
+ getBeforeNodesInSameBranchIncludeParent: mockGetBeforeNodesInSameBranchIncludeParent,
+ }),
+ }
+})
+
+vi.mock('../use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => ({
+ getNodeAvailableVars: mockGetNodeAvailableVars,
+ }),
+ }
+})
vi.mock('@/app/components/workflow/hooks-store/store', () => ({
useHooksStore: (selector: (state: { configsMap?: { flowType?: FlowType } }) => unknown) =>
diff --git a/web/app/components/workflow/hooks/index.ts b/web/app/components/workflow/hooks/index.ts
deleted file mode 100644
index 8dc5def829e..00000000000
--- a/web/app/components/workflow/hooks/index.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-export * from './use-auto-generate-webhook-url'
-export * from './use-available-blocks'
-export * from './use-checklist'
-export * from './use-DSL'
-export * from './use-edges-interactions'
-export * from './use-inspect-vars-crud'
-export * from './use-node-data-update'
-export * from './use-nodes-interactions'
-export * from './use-nodes-meta-data'
-export * from './use-nodes-sync-draft'
-export * from './use-panel-interactions'
-export * from './use-selection-interactions'
-export * from './use-serial-async-callback'
-export * from './use-set-workflow-vars-with-value'
-export * from './use-tool-icon'
-export * from './use-workflow'
-export * from './use-workflow-comment'
-export * from './use-workflow-history'
-export * from './use-workflow-interactions'
-export * from './use-workflow-mode'
-export * from './use-workflow-refresh-draft'
-export * from './use-workflow-run'
-export * from './use-workflow-search'
-export * from './use-workflow-start-run'
-export * from './use-workflow-variables'
diff --git a/web/app/components/workflow/hooks/use-checklist.ts b/web/app/components/workflow/hooks/use-checklist.ts
index c1f4587467e..ea9ebb9d45b 100644
--- a/web/app/components/workflow/hooks/use-checklist.ts
+++ b/web/app/components/workflow/hooks/use-checklist.ts
@@ -44,7 +44,6 @@ import { AppModeEnum } from '@/types/app'
import { FlowType } from '@/types/common'
import { CUSTOM_NODE } from '../constants'
import { useDatasetsDetailStore } from '../datasets-detail-store/store'
-import { useGetToolIcon, useNodesMetaData } from '../hooks'
import { useHooksStore } from '../hooks-store/store'
import { getNodeUsedVars, isSpecialVar } from '../nodes/_base/components/variable/utils'
import { hasValidInlineAgentBinding, isAgentV2NodeData } from '../nodes/agent-v2/types'
@@ -68,6 +67,8 @@ import { getTriggerCheckParams } from '../utils/trigger'
import useNodesAvailableVarList, {
useGetNodesAvailableVarList,
} from './use-nodes-available-var-list'
+import { useNodesMetaData } from './use-nodes-meta-data'
+import { useGetToolIcon } from './use-tool-icon'
export type ChecklistItem = {
id: string
diff --git a/web/app/components/workflow/hooks/use-fetch-workflow-inspect-vars.ts b/web/app/components/workflow/hooks/use-fetch-workflow-inspect-vars.ts
index 6a84508e480..e5f30df4438 100644
--- a/web/app/components/workflow/hooks/use-fetch-workflow-inspect-vars.ts
+++ b/web/app/components/workflow/hooks/use-fetch-workflow-inspect-vars.ts
@@ -4,7 +4,6 @@ import type { FlowType } from '@/types/common'
import type { NodeWithVar, VarInInspect } from '@/types/workflow'
import { useCallback, useMemo } from 'react'
import { useStoreApi } from 'reactflow'
-import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync'
import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
import {
useAllBuiltInTools,
@@ -19,6 +18,7 @@ import {
import { fetchAllInspectVars } from '@/service/workflow'
import useMatchSchemaType from '../nodes/_base/components/variable/use-match-schema-type'
import { toNodeOutputVars } from '../nodes/_base/components/variable/utils'
+import { useNodesInteractionsWithoutSync } from './use-nodes-interactions-without-sync'
type Params = {
flowType: FlowType
diff --git a/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts b/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts
index b3c8a4ea4a0..d8913d5a5fc 100644
--- a/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts
+++ b/web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts
@@ -5,8 +5,6 @@ import type { VarInInspect } from '@/types/workflow'
import { produce } from 'immer'
import { useCallback } from 'react'
import { useStoreApi } from 'reactflow'
-import { useEdgesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-edges-interactions-without-sync'
-import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync'
import {
isConversationVar,
isENV,
@@ -23,6 +21,8 @@ import {
} from '@/service/use-tools'
import { fetchNodeInspectVars } from '@/service/workflow'
import { VarInInspectType } from '@/types/workflow'
+import { useEdgesInteractionsWithoutSync } from './use-edges-interactions-without-sync'
+import { useNodesInteractionsWithoutSync } from './use-nodes-interactions-without-sync'
type Params = {
flowId: string
diff --git a/web/app/components/workflow/hooks/use-nodes-available-var-list.ts b/web/app/components/workflow/hooks/use-nodes-available-var-list.ts
index 38030ec1109..6ea5e52a315 100644
--- a/web/app/components/workflow/hooks/use-nodes-available-var-list.ts
+++ b/web/app/components/workflow/hooks/use-nodes-available-var-list.ts
@@ -2,7 +2,6 @@ import type { Node, NodeOutPutVar, ValueSelector, Var } from '@/app/components/w
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import { useSnippetDraftStore } from '@/app/components/snippets/draft-store'
-import { useIsChatMode, useWorkflow, useWorkflowVariables } from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store/store'
import {
appendSnippetInputFieldVars,
@@ -11,6 +10,8 @@ import {
} from '@/app/components/workflow/nodes/_base/hooks/snippet-input-field-vars'
import { BlockEnum } from '@/app/components/workflow/types'
import { FlowType } from '@/types/common'
+import { useIsChatMode, useWorkflow } from './use-workflow'
+import { useWorkflowVariables } from './use-workflow-variables'
type Params = {
onlyLeafNodeVar?: boolean
diff --git a/web/app/components/workflow/hooks/use-workflow-interactions.ts b/web/app/components/workflow/hooks/use-workflow-interactions.ts
deleted file mode 100644
index b75771c836a..00000000000
--- a/web/app/components/workflow/hooks/use-workflow-interactions.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-/* oxlint-disable no-barrel-files/no-barrel-files */
-export { useWorkflowOrganize } from './use-workflow-organize'
-export { useWorkflowInteractions, useWorkflowMoveMode } from './use-workflow-panel-interactions'
-export { useWorkflowUpdate } from './use-workflow-update'
diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/__tests__/use-workflow-run-event.spec.ts b/web/app/components/workflow/hooks/use-workflow-run-event/__tests__/use-workflow-run-event.spec.ts
index 62c45551d81..e886445230c 100644
--- a/web/app/components/workflow/hooks/use-workflow-run-event/__tests__/use-workflow-run-event.spec.ts
+++ b/web/app/components/workflow/hooks/use-workflow-run-event/__tests__/use-workflow-run-event.spec.ts
@@ -24,43 +24,79 @@ const handlers = vi.hoisted(() => ({
handleWorkflowNodeHumanInputFormTimeout: vi.fn(),
}))
-vi.mock('..', () => ({
+vi.mock('../use-workflow-started', () => ({
useWorkflowStarted: () => ({ handleWorkflowStarted: handlers.handleWorkflowStarted }),
+}))
+vi.mock('../use-workflow-finished', () => ({
useWorkflowFinished: () => ({ handleWorkflowFinished: handlers.handleWorkflowFinished }),
+}))
+vi.mock('../use-workflow-failed', () => ({
useWorkflowFailed: () => ({ handleWorkflowFailed: handlers.handleWorkflowFailed }),
+}))
+vi.mock('../use-workflow-node-started', () => ({
useWorkflowNodeStarted: () => ({ handleWorkflowNodeStarted: handlers.handleWorkflowNodeStarted }),
+}))
+vi.mock('../use-workflow-node-finished', () => ({
useWorkflowNodeFinished: () => ({
handleWorkflowNodeFinished: handlers.handleWorkflowNodeFinished,
}),
+}))
+vi.mock('../use-workflow-node-iteration-started', () => ({
useWorkflowNodeIterationStarted: () => ({
handleWorkflowNodeIterationStarted: handlers.handleWorkflowNodeIterationStarted,
}),
+}))
+vi.mock('../use-workflow-node-iteration-next', () => ({
useWorkflowNodeIterationNext: () => ({
handleWorkflowNodeIterationNext: handlers.handleWorkflowNodeIterationNext,
}),
+}))
+vi.mock('../use-workflow-node-iteration-finished', () => ({
useWorkflowNodeIterationFinished: () => ({
handleWorkflowNodeIterationFinished: handlers.handleWorkflowNodeIterationFinished,
}),
+}))
+vi.mock('../use-workflow-node-loop-started', () => ({
useWorkflowNodeLoopStarted: () => ({
handleWorkflowNodeLoopStarted: handlers.handleWorkflowNodeLoopStarted,
}),
+}))
+vi.mock('../use-workflow-node-loop-next', () => ({
useWorkflowNodeLoopNext: () => ({
handleWorkflowNodeLoopNext: handlers.handleWorkflowNodeLoopNext,
}),
+}))
+vi.mock('../use-workflow-node-loop-finished', () => ({
useWorkflowNodeLoopFinished: () => ({
handleWorkflowNodeLoopFinished: handlers.handleWorkflowNodeLoopFinished,
}),
+}))
+vi.mock('../use-workflow-node-retry', () => ({
useWorkflowNodeRetry: () => ({ handleWorkflowNodeRetry: handlers.handleWorkflowNodeRetry }),
+}))
+vi.mock('../use-workflow-text-chunk', () => ({
useWorkflowTextChunk: () => ({ handleWorkflowTextChunk: handlers.handleWorkflowTextChunk }),
+}))
+vi.mock('../use-workflow-text-replace', () => ({
useWorkflowTextReplace: () => ({ handleWorkflowTextReplace: handlers.handleWorkflowTextReplace }),
+}))
+vi.mock('../use-workflow-agent-log', () => ({
useWorkflowAgentLog: () => ({ handleWorkflowAgentLog: handlers.handleWorkflowAgentLog }),
+}))
+vi.mock('../use-workflow-paused', () => ({
useWorkflowPaused: () => ({ handleWorkflowPaused: handlers.handleWorkflowPaused }),
+}))
+vi.mock('../use-workflow-node-human-input-required', () => ({
useWorkflowNodeHumanInputRequired: () => ({
handleWorkflowNodeHumanInputRequired: handlers.handleWorkflowNodeHumanInputRequired,
}),
+}))
+vi.mock('../use-workflow-node-human-input-form-filled', () => ({
useWorkflowNodeHumanInputFormFilled: () => ({
handleWorkflowNodeHumanInputFormFilled: handlers.handleWorkflowNodeHumanInputFormFilled,
}),
+}))
+vi.mock('../use-workflow-node-human-input-form-timeout', () => ({
useWorkflowNodeHumanInputFormTimeout: () => ({
handleWorkflowNodeHumanInputFormTimeout: handlers.handleWorkflowNodeHumanInputFormTimeout,
}),
diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/index.ts b/web/app/components/workflow/hooks/use-workflow-run-event/index.ts
deleted file mode 100644
index 43486873339..00000000000
--- a/web/app/components/workflow/hooks/use-workflow-run-event/index.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-export * from './use-workflow-agent-log'
-export * from './use-workflow-failed'
-export * from './use-workflow-finished'
-export * from './use-workflow-node-finished'
-export * from './use-workflow-node-human-input-form-filled'
-export * from './use-workflow-node-human-input-form-timeout'
-export * from './use-workflow-node-human-input-required'
-export * from './use-workflow-node-iteration-finished'
-export * from './use-workflow-node-iteration-next'
-export * from './use-workflow-node-iteration-started'
-export * from './use-workflow-node-loop-finished'
-export * from './use-workflow-node-loop-next'
-export * from './use-workflow-node-loop-started'
-export * from './use-workflow-node-retry'
-export * from './use-workflow-node-started'
-export * from './use-workflow-paused'
-export * from './use-workflow-started'
-export * from './use-workflow-text-chunk'
-export * from './use-workflow-text-replace'
diff --git a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts
index 2366fdd9684..ff3f5cb1965 100644
--- a/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts
+++ b/web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts
@@ -1,25 +1,23 @@
-import {
- useWorkflowAgentLog,
- useWorkflowFailed,
- useWorkflowFinished,
- useWorkflowNodeFinished,
- useWorkflowNodeHumanInputFormFilled,
- useWorkflowNodeHumanInputFormTimeout,
- useWorkflowNodeHumanInputRequired,
- useWorkflowNodeIterationFinished,
- useWorkflowNodeIterationNext,
- useWorkflowNodeIterationStarted,
- useWorkflowNodeLoopFinished,
- useWorkflowNodeLoopNext,
- useWorkflowNodeLoopStarted,
- useWorkflowNodeRetry,
- useWorkflowNodeStarted,
- useWorkflowPaused,
- useWorkflowStarted,
- useWorkflowTextChunk,
- useWorkflowTextReplace,
-} from '.'
+import { useWorkflowAgentLog } from './use-workflow-agent-log'
+import { useWorkflowFailed } from './use-workflow-failed'
+import { useWorkflowFinished } from './use-workflow-finished'
+import { useWorkflowNodeFinished } from './use-workflow-node-finished'
+import { useWorkflowNodeHumanInputFormFilled } from './use-workflow-node-human-input-form-filled'
+import { useWorkflowNodeHumanInputFormTimeout } from './use-workflow-node-human-input-form-timeout'
+import { useWorkflowNodeHumanInputRequired } from './use-workflow-node-human-input-required'
+import { useWorkflowNodeIterationFinished } from './use-workflow-node-iteration-finished'
+import { useWorkflowNodeIterationNext } from './use-workflow-node-iteration-next'
+import { useWorkflowNodeIterationStarted } from './use-workflow-node-iteration-started'
+import { useWorkflowNodeLoopFinished } from './use-workflow-node-loop-finished'
+import { useWorkflowNodeLoopNext } from './use-workflow-node-loop-next'
+import { useWorkflowNodeLoopStarted } from './use-workflow-node-loop-started'
+import { useWorkflowNodeRetry } from './use-workflow-node-retry'
+import { useWorkflowNodeStarted } from './use-workflow-node-started'
+import { useWorkflowPaused } from './use-workflow-paused'
import { useWorkflowReasoning } from './use-workflow-reasoning'
+import { useWorkflowStarted } from './use-workflow-started'
+import { useWorkflowTextChunk } from './use-workflow-text-chunk'
+import { useWorkflowTextReplace } from './use-workflow-text-replace'
export const useWorkflowRunEvent = () => {
const { handleWorkflowStarted } = useWorkflowStarted()
diff --git a/web/app/components/workflow/hooks/use-workflow.ts b/web/app/components/workflow/hooks/use-workflow.ts
index e957ed467f5..dd4127f8472 100644
--- a/web/app/components/workflow/hooks/use-workflow.ts
+++ b/web/app/components/workflow/hooks/use-workflow.ts
@@ -6,11 +6,9 @@ import { uniqBy } from 'es-toolkit/compat'
import { useCallback } from 'react'
import { getIncomers, getOutgoers } from 'reactflow'
import { useStore as useAppStore } from '@/app/components/app/store'
-import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow'
import { CUSTOM_ITERATION_START_NODE } from '@/app/components/workflow/nodes/iteration-start/constants'
import { CUSTOM_LOOP_START_NODE } from '@/app/components/workflow/nodes/loop-start/constants'
import { AppModeEnum } from '@/types/app'
-import { useNodesMetaData } from '.'
import { SUPPORT_OUTPUT_VARS_NODE } from '../constants'
import { useHooksStore } from '../hooks-store'
import {
@@ -24,6 +22,8 @@ import { WorkflowRunningStatus } from '../types'
import { getNodeCatalogType } from '../utils'
import { getWorkflowEntryNode, isWorkflowEntryNode } from '../utils/workflow-entry'
import { useAvailableBlocks } from './use-available-blocks'
+import { useCollaborativeWorkflow } from './use-collaborative-workflow'
+import { useNodesMetaData } from './use-nodes-meta-data'
export const useIsChatMode = () => {
const appDetail = useAppStore((s) => s.appDetail)
diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx
index aae1f8bf018..30fb9578b13 100644
--- a/web/app/components/workflow/index.tsx
+++ b/web/app/components/workflow/index.tsx
@@ -67,21 +67,17 @@ import CustomConnectionLine from './custom-connection-line'
import CustomEdge from './custom-edge'
import DatasetsDetailProvider from './datasets-detail-store/provider'
import HelpLine from './help-line'
-import {
- useEdgesInteractions,
- useNodesInteractions,
- useNodesReadOnly,
- useNodesSyncDraft,
- usePanelInteractions,
- useSelectionInteractions,
- useSetWorkflowVarsWithValue,
- useWorkflow,
- useWorkflowReadOnly,
- useWorkflowRefreshDraft,
-} from './hooks'
import { HooksStoreContextProvider, useHooksStore } from './hooks-store'
+import { useEdgesInteractions } from './hooks/use-edges-interactions'
import { useLocateNode } from './hooks/use-locate-node'
+import { useNodesInteractions } from './hooks/use-nodes-interactions'
+import { useNodesSyncDraft } from './hooks/use-nodes-sync-draft'
+import { usePanelInteractions } from './hooks/use-panel-interactions'
+import { useSelectionInteractions } from './hooks/use-selection-interactions'
+import { useSetWorkflowVarsWithValue } from './hooks/use-set-workflow-vars-with-value'
+import { useNodesReadOnly, useWorkflow, useWorkflowReadOnly } from './hooks/use-workflow'
import { useWorkflowComment } from './hooks/use-workflow-comment'
+import { useWorkflowRefreshDraft } from './hooks/use-workflow-refresh-draft'
import { useWorkflowSearch } from './hooks/use-workflow-search'
import { shouldPreventWorkflowBrowserDefault } from './hotkeys'
import CustomNode from './nodes'
diff --git a/web/app/components/workflow/node-actions-menu/__tests__/details.spec.tsx b/web/app/components/workflow/node-actions-menu/__tests__/details.spec.tsx
index 4ffb14f12ee..1bedad990da 100644
--- a/web/app/components/workflow/node-actions-menu/__tests__/details.spec.tsx
+++ b/web/app/components/workflow/node-actions-menu/__tests__/details.spec.tsx
@@ -7,18 +7,15 @@ import {
import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env'
-import {
- useAvailableBlocks,
- useIsChatMode,
- useNodeMetaData,
- useNodesInteractions,
- useNodesReadOnly,
-} from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
import { BlockEnum, NodeRunningStatus } from '@/app/components/workflow/types'
import { useAllWorkflowTools } from '@/service/use-tools'
import { FlowType } from '@/types/common'
+import { useAvailableBlocks } from '../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../hooks/use-nodes-interactions'
+import { useNodeMetaData } from '../../hooks/use-nodes-meta-data'
+import { useIsChatMode, useNodesReadOnly } from '../../hooks/use-workflow'
import { ChangeBlockMenuTrigger } from '../change-block-menu-trigger'
import { NodeActionsDropdownContent } from '../dropdown-content'
@@ -48,14 +45,39 @@ vi.mock('@/app/components/workflow/block-selector', () => ({
),
}))
-vi.mock('@/app/components/workflow/hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
return {
...actual,
useAvailableBlocks: vi.fn(),
- useIsChatMode: vi.fn(),
- useNodeMetaData: vi.fn(),
+ }
+})
+
+vi.mock('../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
useNodesInteractions: vi.fn(),
+ }
+})
+
+vi.mock('../../hooks/use-nodes-meta-data', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodeMetaData: vi.fn(),
+ }
+})
+
+vi.mock('../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: vi.fn(),
useNodesReadOnly: vi.fn(),
}
})
diff --git a/web/app/components/workflow/node-actions-menu/__tests__/index.spec.tsx b/web/app/components/workflow/node-actions-menu/__tests__/index.spec.tsx
index 99927fa9a73..d5a595881ff 100644
--- a/web/app/components/workflow/node-actions-menu/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/node-actions-menu/__tests__/index.spec.tsx
@@ -3,21 +3,36 @@ import type { ToolWithProvider } from '@/app/components/workflow/types'
import { screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env'
-import {
- useNodeMetaData,
- useNodesInteractions,
- useNodesReadOnly,
-} from '@/app/components/workflow/hooks'
import { BlockEnum } from '@/app/components/workflow/types'
import { useAllWorkflowTools } from '@/service/use-tools'
+import { useNodesInteractions } from '../../hooks/use-nodes-interactions'
+import { useNodeMetaData } from '../../hooks/use-nodes-meta-data'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import { NodeActionsDropdown } from '../index'
-vi.mock('@/app/components/workflow/hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesInteractions: vi.fn(),
+ }
+})
+
+vi.mock('../../hooks/use-nodes-meta-data', async (importOriginal) => {
+ const actual = await importOriginal()
+
return {
...actual,
useNodeMetaData: vi.fn(),
- useNodesInteractions: vi.fn(),
+ }
+})
+
+vi.mock('../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
useNodesReadOnly: vi.fn(),
}
})
diff --git a/web/app/components/workflow/node-actions-menu/change-block-menu-trigger.tsx b/web/app/components/workflow/node-actions-menu/change-block-menu-trigger.tsx
index a9e9ba82faf..51f60f4bbff 100644
--- a/web/app/components/workflow/node-actions-menu/change-block-menu-trigger.tsx
+++ b/web/app/components/workflow/node-actions-menu/change-block-menu-trigger.tsx
@@ -3,16 +3,14 @@ import { intersection } from 'es-toolkit/array'
import { useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import BlockSelector from '@/app/components/workflow/block-selector'
-import {
- useAvailableBlocks,
- useIsChatMode,
- useNodesInteractions,
-} from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
import useNodes from '@/app/components/workflow/store/workflow/use-nodes'
import { BlockEnum, isTriggerNode } from '@/app/components/workflow/types'
import { getNodeCatalogType } from '@/app/components/workflow/utils'
import { FlowType } from '@/types/common'
+import { useAvailableBlocks } from '../hooks/use-available-blocks'
+import { useNodesInteractions } from '../hooks/use-nodes-interactions'
+import { useIsChatMode } from '../hooks/use-workflow'
type ChangeBlockMenuTriggerProps = {
nodeId: string
diff --git a/web/app/components/workflow/node-actions-menu/use-node-actions-menu-model.ts b/web/app/components/workflow/node-actions-menu/use-node-actions-menu-model.ts
index affd9e63460..a0c46f95440 100644
--- a/web/app/components/workflow/node-actions-menu/use-node-actions-menu-model.ts
+++ b/web/app/components/workflow/node-actions-menu/use-node-actions-menu-model.ts
@@ -2,17 +2,15 @@ import type { Node } from '@/app/components/workflow/types'
import { useCallback, useMemo } from 'react'
import { useEdges } from 'reactflow'
import { CollectionType } from '@/app/components/tools/types'
-import {
- useNodeMetaData,
- useNodesInteractions,
- useNodesReadOnly,
-} from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { BlockEnum, NodeRunningStatus } from '@/app/components/workflow/types'
import { canRunBySingle } from '@/app/components/workflow/utils'
import { useAllWorkflowTools } from '@/service/use-tools'
import { canFindTool } from '@/utils'
+import { useNodesInteractions } from '../hooks/use-nodes-interactions'
+import { useNodeMetaData } from '../hooks/use-nodes-meta-data'
+import { useNodesReadOnly } from '../hooks/use-workflow'
type UseNodeActionsMenuModelParams = {
id: string
diff --git a/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx
index 5d963a9f550..5c495c7fa56 100644
--- a/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/__tests__/node.spec.tsx
@@ -26,22 +26,35 @@ vi.mock('@/context/account-state', async () => {
return createAccountStateModuleMock(() => mockConsoleState)
})
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({ nodesReadOnly: false }),
- useToolIcon: () => undefined,
-}))
+vi.mock('../../../hooks/use-tool-icon', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useToolIcon: () => undefined,
+ }
+})
+
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({ nodesReadOnly: false }),
+ }
+})
vi.mock('@/app/components/workflow/collaboration/hooks/use-collaboration', () => ({
useCollaboration: (...args: unknown[]) => mockUseCollaboration(...args),
}))
-vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({
+vi.mock('../../../hooks/use-inspect-vars-crud', () => ({
default: () => ({
hasNodeInspectVars: mockHasNodeInspectVars,
}),
}))
-vi.mock('@/app/components/workflow/hooks/use-node-plugin-installation', () => ({
+vi.mock('../../../hooks/use-node-plugin-installation', () => ({
useNodePluginInstallation: (...args: unknown[]) => mockUseNodePluginInstallation(...args),
}))
diff --git a/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.branches.spec.tsx b/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.branches.spec.tsx
index 68484a67b1e..164e7e2489d 100644
--- a/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.branches.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.branches.spec.tsx
@@ -34,17 +34,30 @@ vi.mock('@/service/use-triggers', () => ({
useTriggerPluginDynamicOptions: () => mockTriggerDynamicOptionsState,
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => false,
- useWorkflow: () => ({
- getTreeLeafNodes: () => [],
- getNodeById: () => undefined,
- getBeforeNodesInSameBranchIncludeParent: () => [],
- }),
- useWorkflowVariables: () => ({
- getNodeAvailableVars: () => [],
- }),
-}))
+vi.mock('../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => false,
+ useWorkflow: () => ({
+ getTreeLeafNodes: () => [],
+ getNodeById: () => undefined,
+ getBeforeNodesInSameBranchIncludeParent: () => [],
+ }),
+ }
+})
+
+vi.mock('../../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => ({
+ getNodeAvailableVars: () => [],
+ }),
+ }
+})
vi.mock('@/app/components/plugins/plugin-detail-panel/app-selector', () => ({
AppSelector: ({ onSelect }: { onSelect: (value: AppSelectorValue) => void }) => (
diff --git a/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.spec.tsx b/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.spec.tsx
index 73b2b888673..167d396ef25 100644
--- a/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/__tests__/form-input-item.spec.tsx
@@ -9,17 +9,30 @@ import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__
import { VarKindType } from '../../types'
import FormInputItem from '../form-input-item'
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => false,
- useWorkflow: () => ({
- getTreeLeafNodes: () => [],
- getNodeById: () => undefined,
- getBeforeNodesInSameBranchIncludeParent: () => [],
- }),
- useWorkflowVariables: () => ({
- getNodeAvailableVars: () => [],
- }),
-}))
+vi.mock('../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => false,
+ useWorkflow: () => ({
+ getTreeLeafNodes: () => [],
+ getNodeById: () => undefined,
+ getBeforeNodesInSameBranchIncludeParent: () => [],
+ }),
+ }
+})
+
+vi.mock('../../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => ({
+ getNodeAvailableVars: () => [],
+ }),
+ }
+})
const createSchema = (
overrides: Partial<
diff --git a/web/app/components/workflow/nodes/_base/components/__tests__/node-control.spec.tsx b/web/app/components/workflow/nodes/_base/components/__tests__/node-control.spec.tsx
index fc6494a3fb5..478ffc576dc 100644
--- a/web/app/components/workflow/nodes/_base/components/__tests__/node-control.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/__tests__/node-control.spec.tsx
@@ -14,13 +14,20 @@ const { mockHandleNodeSelect, mockCanRunBySingle, mockUseNodesReadOnly } = vi.ho
let mockPluginInstallLocked = false
-vi.mock('../../../../hooks', async () => {
- const actual = await vi.importActual('../../../../hooks')
+vi.mock('../../../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
return {
...actual,
useNodesInteractions: () => ({
handleNodeSelect: mockHandleNodeSelect,
}),
+ }
+})
+
+vi.mock('../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+ return {
+ ...actual,
useNodesReadOnly: mockUseNodesReadOnly,
}
})
diff --git a/web/app/components/workflow/nodes/_base/components/__tests__/node-handle.spec.tsx b/web/app/components/workflow/nodes/_base/components/__tests__/node-handle.spec.tsx
index e7e0e08d461..17032d49034 100644
--- a/web/app/components/workflow/nodes/_base/components/__tests__/node-handle.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/__tests__/node-handle.spec.tsx
@@ -104,19 +104,40 @@ vi.mock('@/app/components/workflow/block-selector', () => ({
),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useAvailableBlocks: () => ({
- availablePrevBlocks: mockHooksState.availablePrevBlocks,
- availableNextBlocks: mockHooksState.availableNextBlocks,
- }),
- useIsChatMode: () => mockHooksState.isChatMode,
- useNodesInteractions: () => ({
- handleNodeAdd: mockHandleNodeAdd,
- }),
- useNodesReadOnly: () => ({
- getNodesReadOnly: () => mockHooksState.isReadOnly,
- }),
-}))
+vi.mock('../../../../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useAvailableBlocks: () => ({
+ availablePrevBlocks: mockHooksState.availablePrevBlocks,
+ availableNextBlocks: mockHooksState.availableNextBlocks,
+ }),
+ }
+})
+
+vi.mock('../../../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesInteractions: () => ({
+ handleNodeAdd: mockHandleNodeAdd,
+ }),
+ }
+})
+
+vi.mock('../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => mockHooksState.isChatMode,
+ useNodesReadOnly: () => ({
+ getNodesReadOnly: () => mockHooksState.isReadOnly,
+ }),
+ }
+})
vi.mock('@/app/components/workflow/store', () => ({
useStore: (selector: (state: MockStoreState) => T) => selector(mockStoreState),
diff --git a/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx b/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx
index 14804583920..6db6d22be37 100644
--- a/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx
+++ b/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx
@@ -1,7 +1,9 @@
import type { ValueSelector, Var, VarType } from '../../../types'
import { useClickAway } from 'ahooks'
import { memo, useCallback, useMemo, useRef } from 'react'
-import { useIsChatMode, useNodeDataUpdate, useWorkflow, useWorkflowVariables } from '../../../hooks'
+import { useNodeDataUpdate } from '../../../hooks/use-node-data-update'
+import { useIsChatMode, useWorkflow } from '../../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../../hooks/use-workflow-variables'
import { useStore } from '../../../store'
import { useVariableAssigner } from '../../variable-assigner/hooks'
import { filterVar } from '../../variable-assigner/utils'
diff --git a/web/app/components/workflow/nodes/_base/components/error-handle/hooks.ts b/web/app/components/workflow/nodes/_base/components/error-handle/hooks.ts
index 07186480b02..84424bade49 100644
--- a/web/app/components/workflow/nodes/_base/components/error-handle/hooks.ts
+++ b/web/app/components/workflow/nodes/_base/components/error-handle/hooks.ts
@@ -1,7 +1,8 @@
import type { DefaultValueForm } from './types'
import type { CommonNodeType } from '@/app/components/workflow/types'
import { useCallback, useMemo, useState } from 'react'
-import { useEdgesInteractions, useNodeDataUpdate } from '@/app/components/workflow/hooks'
+import { useEdgesInteractions } from '../../../../hooks/use-edges-interactions'
+import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update'
import { ErrorHandleTypeEnum } from './types'
import { getDefaultValue } from './utils'
diff --git a/web/app/components/workflow/nodes/_base/components/next-step/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/_base/components/next-step/__tests__/index.spec.tsx
index 6e9317bcd49..773568142c2 100644
--- a/web/app/components/workflow/nodes/_base/components/next-step/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/next-step/__tests__/index.spec.tsx
@@ -3,14 +3,12 @@ import type { Edge, Node } from '@/app/components/workflow/types'
import { screen } from '@testing-library/react'
import { createEdge, createNode } from '@/app/components/workflow/__tests__/fixtures'
import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env'
-import {
- useAvailableBlocks,
- useNodesInteractions,
- useNodesReadOnly,
- useToolIcon,
-} from '@/app/components/workflow/hooks'
import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useAvailableBlocks } from '../../../../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../../../../hooks/use-nodes-interactions'
+import { useToolIcon } from '../../../../../hooks/use-tool-icon'
+import { useNodesReadOnly } from '../../../../../hooks/use-workflow'
import NextStep from '../index'
vi.mock('@/app/components/workflow/block-selector', () => ({
@@ -23,17 +21,43 @@ vi.mock('@/app/components/workflow/block-selector', () => ({
},
}))
-vi.mock('@/app/components/workflow/hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../../../../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
return {
...actual,
useAvailableBlocks: vi.fn(),
+ }
+})
+
+vi.mock('../../../../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual =
+ await importOriginal()
+
+ return {
+ ...actual,
useNodesInteractions: vi.fn(),
- useNodesReadOnly: vi.fn(),
+ }
+})
+
+vi.mock('../../../../../hooks/use-tool-icon', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
useToolIcon: vi.fn(),
}
})
+vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: vi.fn(),
+ }
+})
+
const mockUseAvailableBlocks = vi.mocked(useAvailableBlocks)
const mockUseNodesInteractions = vi.mocked(useNodesInteractions)
const mockUseNodesReadOnly = vi.mocked(useNodesReadOnly)
diff --git a/web/app/components/workflow/nodes/_base/components/next-step/__tests__/operator.spec.tsx b/web/app/components/workflow/nodes/_base/components/next-step/__tests__/operator.spec.tsx
index 0846cc69b61..bfec891cd70 100644
--- a/web/app/components/workflow/nodes/_base/components/next-step/__tests__/operator.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/next-step/__tests__/operator.spec.tsx
@@ -3,8 +3,9 @@ import type { CommonNodeType } from '@/app/components/workflow/types'
import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { useState } from 'react'
-import { useAvailableBlocks, useNodesInteractions } from '@/app/components/workflow/hooks'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useAvailableBlocks } from '../../../../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../../../../hooks/use-nodes-interactions'
import Operator from '../operator'
vi.mock('@langgenius/dify-ui/dropdown-menu', async () => {
@@ -96,11 +97,21 @@ vi.mock('@/app/components/workflow/block-selector', () => ({
),
}))
-vi.mock('@/app/components/workflow/hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../../../../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
return {
...actual,
useAvailableBlocks: vi.fn(),
+ }
+})
+
+vi.mock('../../../../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual =
+ await importOriginal()
+
+ return {
+ ...actual,
useNodesInteractions: vi.fn(),
}
})
diff --git a/web/app/components/workflow/nodes/_base/components/next-step/add.tsx b/web/app/components/workflow/nodes/_base/components/next-step/add.tsx
index 568b3c8ec1a..e478f8ecd46 100644
--- a/web/app/components/workflow/nodes/_base/components/next-step/add.tsx
+++ b/web/app/components/workflow/nodes/_base/components/next-step/add.tsx
@@ -4,12 +4,10 @@ import { RiAddLine } from '@remixicon/react'
import { memo, useCallback, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import BlockSelector from '@/app/components/workflow/block-selector'
-import {
- useAvailableBlocks,
- useNodesInteractions,
- useNodesReadOnly,
-} from '@/app/components/workflow/hooks'
import { getNodeCatalogType } from '@/app/components/workflow/utils'
+import { useAvailableBlocks } from '../../../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../../../hooks/use-nodes-interactions'
+import { useNodesReadOnly } from '../../../../hooks/use-workflow'
type AddProps = {
nodeId: string
diff --git a/web/app/components/workflow/nodes/_base/components/next-step/index.tsx b/web/app/components/workflow/nodes/_base/components/next-step/index.tsx
index 6d9424e1b36..6b3d7497728 100644
--- a/web/app/components/workflow/nodes/_base/components/next-step/index.tsx
+++ b/web/app/components/workflow/nodes/_base/components/next-step/index.tsx
@@ -6,7 +6,7 @@ import { getConnectedEdges, getOutgoers, useStore } from 'reactflow'
import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'
import { hasErrorHandleNode } from '@/app/components/workflow/utils'
import BlockIcon from '../../../../block-icon'
-import { useToolIcon } from '../../../../hooks'
+import { useToolIcon } from '../../../../hooks/use-tool-icon'
import { BlockEnum } from '../../../../types'
import Container from './container'
import Line from './line'
diff --git a/web/app/components/workflow/nodes/_base/components/next-step/item.tsx b/web/app/components/workflow/nodes/_base/components/next-step/item.tsx
index 49de337b509..dd2a9739edb 100644
--- a/web/app/components/workflow/nodes/_base/components/next-step/item.tsx
+++ b/web/app/components/workflow/nodes/_base/components/next-step/item.tsx
@@ -4,11 +4,9 @@ import { cn } from '@langgenius/dify-ui/cn'
import { memo, useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
import BlockIcon from '@/app/components/workflow/block-icon'
-import {
- useNodesInteractions,
- useNodesReadOnly,
- useToolIcon,
-} from '@/app/components/workflow/hooks'
+import { useNodesInteractions } from '../../../../hooks/use-nodes-interactions'
+import { useToolIcon } from '../../../../hooks/use-tool-icon'
+import { useNodesReadOnly } from '../../../../hooks/use-workflow'
import Operator from './operator'
type ItemProps = {
diff --git a/web/app/components/workflow/nodes/_base/components/next-step/operator.tsx b/web/app/components/workflow/nodes/_base/components/next-step/operator.tsx
index 1683e4258d6..2d3bdfc939f 100644
--- a/web/app/components/workflow/nodes/_base/components/next-step/operator.tsx
+++ b/web/app/components/workflow/nodes/_base/components/next-step/operator.tsx
@@ -9,8 +9,9 @@ import { intersection } from 'es-toolkit/array'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import BlockSelector from '@/app/components/workflow/block-selector'
-import { useAvailableBlocks, useNodesInteractions } from '@/app/components/workflow/hooks'
import { getNodeCatalogType } from '@/app/components/workflow/utils'
+import { useAvailableBlocks } from '../../../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../../../hooks/use-nodes-interactions'
type ChangeItemProps = {
data: CommonNodeType
diff --git a/web/app/components/workflow/nodes/_base/components/node-control.tsx b/web/app/components/workflow/nodes/_base/components/node-control.tsx
index 7e530f3ffaf..13699a140c5 100644
--- a/web/app/components/workflow/nodes/_base/components/node-control.tsx
+++ b/web/app/components/workflow/nodes/_base/components/node-control.tsx
@@ -8,7 +8,8 @@ import { Stop } from '@/app/components/base/icons/src/vender/line/mediaAndDevice
import { useHooksStore } from '@/app/components/workflow/hooks-store'
import { NodeActionsDropdown } from '@/app/components/workflow/node-actions-menu'
import { useWorkflowStore } from '@/app/components/workflow/store'
-import { useNodesInteractions, useNodesReadOnly } from '../../../hooks'
+import { useNodesInteractions } from '../../../hooks/use-nodes-interactions'
+import { useNodesReadOnly } from '../../../hooks/use-workflow'
import { NodeRunningStatus } from '../../../types'
import { canRunBySingle } from '../../../utils'
diff --git a/web/app/components/workflow/nodes/_base/components/node-handle.tsx b/web/app/components/workflow/nodes/_base/components/node-handle.tsx
index 549676132c0..324ea9d7b0c 100644
--- a/web/app/components/workflow/nodes/_base/components/node-handle.tsx
+++ b/web/app/components/workflow/nodes/_base/components/node-handle.tsx
@@ -6,12 +6,9 @@ import { memo, useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Handle, Position } from 'reactflow'
import BlockSelector from '../../../block-selector'
-import {
- useAvailableBlocks,
- useIsChatMode,
- useNodesInteractions,
- useNodesReadOnly,
-} from '../../../hooks'
+import { useAvailableBlocks } from '../../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../../hooks/use-nodes-interactions'
+import { useIsChatMode, useNodesReadOnly } from '../../../hooks/use-workflow'
import { useStore, useWorkflowStore } from '../../../store'
import { BlockEnum, NodeRunningStatus } from '../../../types'
import { getNodeCatalogType } from '../../../utils'
diff --git a/web/app/components/workflow/nodes/_base/components/node-resizer.tsx b/web/app/components/workflow/nodes/_base/components/node-resizer.tsx
index ce1df3d2e34..eb7b00520e0 100644
--- a/web/app/components/workflow/nodes/_base/components/node-resizer.tsx
+++ b/web/app/components/workflow/nodes/_base/components/node-resizer.tsx
@@ -3,7 +3,7 @@ import type { CommonNodeType } from '../../../types'
import { cn } from '@langgenius/dify-ui/cn'
import { memo, useCallback } from 'react'
import { NodeResizeControl } from 'reactflow'
-import { useNodesInteractions } from '../../../hooks'
+import { useNodesInteractions } from '../../../hooks/use-nodes-interactions'
const Icon = () => {
return (
diff --git a/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx b/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx
index a853be7373f..08c8dd127b9 100644
--- a/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx
+++ b/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx
@@ -17,12 +17,12 @@ import { Variable02 } from '@/app/components/base/icons/src/vender/solid/develop
import { Jinja } from '@/app/components/base/icons/src/vender/workflow'
import PromptEditor from '@/app/components/base/prompt-editor'
import { PROMPT_EDITOR_INSERT_QUICKLY } from '@/app/components/base/prompt-editor/plugins/update-block'
-import { useWorkflowVariableType } from '@/app/components/workflow/hooks'
import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars'
import ToggleExpandBtn from '@/app/components/workflow/nodes/_base/components/toggle-expand-btn'
import useToggleExpend from '@/app/components/workflow/nodes/_base/hooks/use-toggle-expend'
import { useStore } from '@/app/components/workflow/store'
import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { useWorkflowVariableType } from '../../../../hooks/use-workflow-variables'
import { BlockEnum, EditionType } from '../../../../types'
import { CodeLanguage } from '../../../code/types'
import PromptGeneratorBtn from '../../../llm/components/prompt-generator-btn'
diff --git a/web/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx b/web/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx
index 6b72fd99141..e0827e93085 100644
--- a/web/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx
+++ b/web/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx
@@ -3,7 +3,7 @@ import type { FC } from 'react'
import { cn } from '@langgenius/dify-ui/cn'
import * as React from 'react'
import { VariableLabelInText } from '@/app/components/workflow/nodes/_base/components/variable/variable-label'
-import { useWorkflow } from '../../../hooks'
+import { useWorkflow } from '../../../hooks/use-workflow'
import { BlockEnum } from '../../../types'
import { getNodeInfoById, isSystemVar } from './variable/utils'
diff --git a/web/app/components/workflow/nodes/_base/components/retry/hooks.ts b/web/app/components/workflow/nodes/_base/components/retry/hooks.ts
index 17dba94a249..25b2942801c 100644
--- a/web/app/components/workflow/nodes/_base/components/retry/hooks.ts
+++ b/web/app/components/workflow/nodes/_base/components/retry/hooks.ts
@@ -1,6 +1,6 @@
import type { WorkflowRetryConfig } from './types'
import { useCallback } from 'react'
-import { useNodeDataUpdate } from '@/app/components/workflow/hooks'
+import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update'
export const useRetryConfig = (id: string) => {
const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate()
diff --git a/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.branches.spec.tsx b/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.branches.spec.tsx
index 3bc81767863..875763a3d1c 100644
--- a/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.branches.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.branches.spec.tsx
@@ -22,18 +22,32 @@ vi.mock('@/service/use-plugins', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => false,
- useWorkflow: () => ({
- getTreeLeafNodes: () => [],
- getNodeById: () => undefined,
- getBeforeNodesInSameBranchIncludeParent: () => [],
- }),
- useWorkflowVariables: () => ({
- getNodeAvailableVars: () => [],
- getCurrentVariableType: () => undefined,
- }),
-}))
+vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => false,
+ useWorkflow: () => ({
+ getTreeLeafNodes: () => [],
+ getNodeById: () => undefined,
+ getBeforeNodesInSameBranchIncludeParent: () => [],
+ }),
+ }
+})
+
+vi.mock('../../../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual =
+ await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => ({
+ getNodeAvailableVars: () => [],
+ getCurrentVariableType: () => undefined,
+ }),
+ }
+})
vi.mock('../var-reference-popup', () => ({
default: ({
diff --git a/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.spec.tsx b/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.spec.tsx
index 2a76386b33e..8f4248fc90e 100644
--- a/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/variable/__tests__/var-reference-picker.spec.tsx
@@ -10,18 +10,32 @@ import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__
import { BlockEnum, InputVarType, VarType } from '@/app/components/workflow/types'
import VarReferencePicker from '../var-reference-picker'
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => false,
- useWorkflow: () => ({
- getTreeLeafNodes: () => [],
- getNodeById: () => undefined,
- getBeforeNodesInSameBranchIncludeParent: () => [],
- }),
- useWorkflowVariables: () => ({
- getNodeAvailableVars: () => [],
- getCurrentVariableType: () => undefined,
- }),
-}))
+vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => false,
+ useWorkflow: () => ({
+ getTreeLeafNodes: () => [],
+ getNodeById: () => undefined,
+ getBeforeNodesInSameBranchIncludeParent: () => [],
+ }),
+ }
+})
+
+vi.mock('../../../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual =
+ await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => ({
+ getNodeAvailableVars: () => [],
+ getCurrentVariableType: () => undefined,
+ }),
+ }
+})
describe('VarReferencePicker', () => {
const startNode = createStartNode({
diff --git a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx
index ae932f7f2f5..dc778b85427 100644
--- a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx
+++ b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx
@@ -25,13 +25,14 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useNodes, useReactFlow, useStoreApi } from 'reactflow'
import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
-import { useIsChatMode, useWorkflowVariables } from '@/app/components/workflow/hooks'
// import type { BaseResource, BaseResourceProvider } from '@/app/components/workflow/nodes/_base/types'
import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
import { useStore as useWorkflowStore } from '@/app/components/workflow/store'
import { BlockEnum } from '@/app/components/workflow/types'
import { isExceptionVariable } from '@/app/components/workflow/utils'
import { useFetchDynamicOptions } from '@/service/use-plugins'
+import { useIsChatMode } from '../../../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../../../hooks/use-workflow-variables'
import useAvailableVarList from '../../hooks/use-available-var-list'
import { removeFileVars, varTypeToStructType } from './utils'
import VarFullPathPanel from './var-full-path-panel'
diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/_base/components/workflow-panel/__tests__/index.spec.tsx
index 7aebb57ca17..dc530886182 100644
--- a/web/app/components/workflow/nodes/_base/components/workflow-panel/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/__tests__/index.spec.tsx
@@ -104,36 +104,99 @@ vi.mock('@/app/components/plugins/plugin-detail-panel/store', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useAvailableBlocks: () => ({ availableNextBlocks: [] }),
- useEdgesInteractions: () => ({
- handleEdgeDeleteByDeleteBranch: vi.fn(),
- }),
- useNodeDataUpdate: () => ({
- handleNodeDataUpdate: mockHandleNodeDataUpdate,
- handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft,
- }),
- useNodesInteractions: () => ({
- handleNodeSelect: mockHandleNodeSelect,
- }),
- useNodesMetaData: () => ({
- nodesMap: {
- [BlockEnum.Tool]: { defaultRunInputData: {}, metaData: { helpLinkUri: '' } },
- [BlockEnum.DataSource]: { defaultRunInputData: {}, metaData: { helpLinkUri: '' } },
+vi.mock('../../../../../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useAvailableBlocks: () => ({ availableNextBlocks: [] }),
+ }
+})
+
+vi.mock('../../../../../hooks/use-edges-interactions', async (importOriginal) => {
+ const actual =
+ await importOriginal()
+
+ return {
+ ...actual,
+ useEdgesInteractions: () => ({
+ handleEdgeDeleteByDeleteBranch: vi.fn(),
+ }),
+ }
+})
+
+vi.mock('../../../../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodeDataUpdate: () => ({
+ handleNodeDataUpdate: mockHandleNodeDataUpdate,
+ handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft,
+ }),
+ }
+})
+
+vi.mock('../../../../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual =
+ await importOriginal()
+
+ return {
+ ...actual,
+ useNodesInteractions: () => ({
+ handleNodeSelect: mockHandleNodeSelect,
+ }),
+ }
+})
+
+vi.mock('../../../../../hooks/use-nodes-meta-data', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesMetaData: () => ({
+ nodesMap: {
+ [BlockEnum.Tool]: { defaultRunInputData: {}, metaData: { helpLinkUri: '' } },
+ [BlockEnum.DataSource]: { defaultRunInputData: {}, metaData: { helpLinkUri: '' } },
+ },
+ }),
+ }
+})
+
+vi.mock('../../../../../hooks/use-tool-icon', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useToolIcon: () => undefined,
+ }
+})
+
+vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({
+ nodesReadOnly: mockNodesReadOnly,
+ }),
+ }
+})
+
+vi.mock('../../../../../hooks/use-workflow-history', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowHistory: () => ({
+ saveStateToHistory: mockSaveStateToHistory,
+ }),
+ WorkflowHistoryEvent: {
+ NodeTitleChange: 'NodeTitleChange',
+ NodeDescriptionChange: 'NodeDescriptionChange',
},
- }),
- useNodesReadOnly: () => ({
- nodesReadOnly: mockNodesReadOnly,
- }),
- useToolIcon: () => undefined,
- useWorkflowHistory: () => ({
- saveStateToHistory: mockSaveStateToHistory,
- }),
- WorkflowHistoryEvent: {
- NodeTitleChange: 'NodeTitleChange',
- NodeDescriptionChange: 'NodeDescriptionChange',
- },
-}))
+ }
+})
vi.mock('@/app/components/workflow/hooks-store', () => ({
useHooksStore: (
@@ -153,7 +216,7 @@ vi.mock('@/app/components/workflow/hooks-store', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({
+vi.mock('../../../../../hooks/use-inspect-vars-crud', () => ({
default: () => ({
appendNodeInspectVars: vi.fn(),
}),
diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx
index 8a714bb1b4e..0cab2f85aee 100644
--- a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx
+++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx
@@ -29,18 +29,7 @@ import { ReadmeEntrance } from '@/app/components/plugins/readme-panel/entrance'
import BlockIcon from '@/app/components/workflow/block-icon'
import { collaborationManager } from '@/app/components/workflow/collaboration/core/collaboration-manager'
import { useCollaboration } from '@/app/components/workflow/collaboration/hooks/use-collaboration'
-import {
- useAvailableBlocks,
- useNodeDataUpdate,
- useNodesInteractions,
- useNodesMetaData,
- useNodesReadOnly,
- useToolIcon,
- useWorkflowHistory,
- WorkflowHistoryEvent,
-} from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
-import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud'
import { NodeActionsDropdown } from '@/app/components/workflow/node-actions-menu'
import Split from '@/app/components/workflow/nodes/_base/components/split'
import { useSetWorkflowNodePanelWidth } from '@/app/components/workflow/persistence/local-storage-options'
@@ -59,6 +48,14 @@ import { userProfileAtom } from '@/context/account-state'
import { useAllBuiltInTools } from '@/service/use-tools'
import { useAllTriggerPlugins } from '@/service/use-triggers'
import { FlowType } from '@/types/common'
+import { useAvailableBlocks } from '../../../../hooks/use-available-blocks'
+import useInspectVarsCrud from '../../../../hooks/use-inspect-vars-crud'
+import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update'
+import { useNodesInteractions } from '../../../../hooks/use-nodes-interactions'
+import { useNodesMetaData } from '../../../../hooks/use-nodes-meta-data'
+import { useToolIcon } from '../../../../hooks/use-tool-icon'
+import { useNodesReadOnly } from '../../../../hooks/use-workflow'
+import { useWorkflowHistory, WorkflowHistoryEvent } from '../../../../hooks/use-workflow-history'
import { useResizePanel } from '../../hooks/use-resize-panel'
import BeforeRunForm from '../before-run-form'
import PanelWrap from '../before-run-form/panel-wrap'
diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/__tests__/use-last-run.spec.ts b/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/__tests__/use-last-run.spec.ts
index 8f3c660211a..03e5445de37 100644
--- a/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/__tests__/use-last-run.spec.ts
+++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/__tests__/use-last-run.spec.ts
@@ -8,19 +8,25 @@ const mockHandleSyncWorkflowDraft = vi.fn()
const mockShowSingleRun = vi.fn()
const mockHandleRun = vi.fn()
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesSyncDraft: () => ({
- handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft,
- }),
-}))
+vi.mock('../../../../../../hooks/use-nodes-sync-draft', async (importOriginal) => {
+ const actual =
+ await importOriginal()
-vi.mock('@/app/components/workflow/hooks/use-checklist', () => ({
+ return {
+ ...actual,
+ useNodesSyncDraft: () => ({
+ handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft,
+ }),
+ }
+})
+
+vi.mock('../../../../../../hooks/use-checklist', () => ({
useWorkflowRunValidation: () => ({
warningNodes: [],
}),
}))
-vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({
+vi.mock('../../../../../../hooks/use-inspect-vars-crud', () => ({
default: () => ({
conversationVars: [],
systemVars: [],
diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/use-last-run.ts b/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/use-last-run.ts
index 8840435f021..df98ce1cee7 100644
--- a/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/use-last-run.ts
+++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/use-last-run.ts
@@ -4,9 +4,6 @@ import type { Params as OneStepRunParams } from '@/app/components/workflow/nodes
import type { CommonNodeType, ValueSelector } from '@/app/components/workflow/types'
import { toast } from '@langgenius/dify-ui/toast'
import { useCallback, useEffect, useState } from 'react'
-import { useNodesSyncDraft } from '@/app/components/workflow/hooks'
-import { useWorkflowRunValidation } from '@/app/components/workflow/hooks/use-checklist'
-import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud'
import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
import useVariableAssignerSingleRunFormParams from '@/app/components/workflow/nodes/assigner/use-single-run-form-params'
import useCodeSingleRunFormParams from '@/app/components/workflow/nodes/code/use-single-run-form-params'
@@ -32,6 +29,9 @@ import { BlockEnum } from '@/app/components/workflow/types'
import { isSupportCustomRunForm } from '@/app/components/workflow/utils'
import { VALUE_SELECTOR_DELIMITER as DELIMITER } from '@/config'
import { useInvalidLastRun } from '@/service/use-workflow'
+import { useWorkflowRunValidation } from '../../../../../hooks/use-checklist'
+import useInspectVarsCrud from '../../../../../hooks/use-inspect-vars-crud'
+import { useNodesSyncDraft } from '../../../../../hooks/use-nodes-sync-draft'
import { TabType } from '../types'
const singleRunFormParamsHooks: Record = {
diff --git a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-available-var-list.spec.ts b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-available-var-list.spec.ts
index 015d8e02ddc..547f84779a7 100644
--- a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-available-var-list.spec.ts
+++ b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-available-var-list.spec.ts
@@ -17,17 +17,30 @@ vi.mock('@/app/components/snippets/draft-store', () => ({
selector({ inputFields: [] }),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => true,
- useWorkflow: () => ({
- getTreeLeafNodes: mockGetTreeLeafNodes,
- getBeforeNodesInSameBranchIncludeParent: mockGetBeforeNodesInSameBranchIncludeParent,
- getNodeById: mockGetNodeById,
- }),
- useWorkflowVariables: () => ({
- getNodeAvailableVars: mockGetNodeAvailableVars,
- }),
-}))
+vi.mock('../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => true,
+ useWorkflow: () => ({
+ getTreeLeafNodes: mockGetTreeLeafNodes,
+ getBeforeNodesInSameBranchIncludeParent: mockGetBeforeNodesInSameBranchIncludeParent,
+ getNodeById: mockGetNodeById,
+ }),
+ }
+})
+
+vi.mock('../../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => ({
+ getNodeAvailableVars: mockGetNodeAvailableVars,
+ }),
+ }
+})
vi.mock('@/app/components/workflow/store', () => ({
useStore: (selector: (state: { ragPipelineVariables: unknown[] }) => unknown) =>
diff --git a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-node-crud.spec.ts b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-node-crud.spec.ts
index ca8558df528..e2ae05ca07f 100644
--- a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-node-crud.spec.ts
+++ b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-node-crud.spec.ts
@@ -7,11 +7,16 @@ const mockHandleNodeDataUpdateWithSyncDraft = vi.hoisted(() => ({
current: vi.fn(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodeDataUpdate: () => ({
- handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft.current,
- }),
-}))
+vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodeDataUpdate: () => ({
+ handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft.current,
+ }),
+ }
+})
type TestNodeData = CommonNodeType<{
value: string
diff --git a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-one-step-run.spec.ts b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-one-step-run.spec.ts
index 7d6c37bae88..43d36571549 100644
--- a/web/app/components/workflow/nodes/_base/hooks/__tests__/use-one-step-run.spec.ts
+++ b/web/app/components/workflow/nodes/_base/hooks/__tests__/use-one-step-run.spec.ts
@@ -26,36 +26,49 @@ vi.mock('@/app/components/base/amplitude', () => ({
trackEvent: vi.fn(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => false,
- useNodeDataUpdate: () => ({
- handleNodeDataUpdate: vi.fn(),
- }),
- useWorkflow: () => ({
- getBeforeNodesInSameBranch: () => [
- {
- id: 'start',
- data: {
- type: 'start',
- title: 'Start',
- variables: [],
- },
- },
- ],
- getBeforeNodesInSameBranchIncludeParent: () => [
- {
- id: 'start',
- data: {
- type: 'start',
- title: 'Start',
- variables: [],
- },
- },
- ],
- }),
-}))
+vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
-vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({
+ return {
+ ...actual,
+ useNodeDataUpdate: () => ({
+ handleNodeDataUpdate: vi.fn(),
+ }),
+ }
+})
+
+vi.mock('../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => false,
+ useWorkflow: () => ({
+ getBeforeNodesInSameBranch: () => [
+ {
+ id: 'start',
+ data: {
+ type: 'start',
+ title: 'Start',
+ variables: [],
+ },
+ },
+ ],
+ getBeforeNodesInSameBranchIncludeParent: () => [
+ {
+ id: 'start',
+ data: {
+ type: 'start',
+ title: 'Start',
+ variables: [],
+ },
+ },
+ ],
+ }),
+ }
+})
+
+vi.mock('../../../../hooks/use-inspect-vars-crud', () => ({
default: () => ({
appendNodeInspectVars: vi.fn(),
invalidateSysVarValues: vi.fn(),
diff --git a/web/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts b/web/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts
index 7687a5f5502..bdd628d7459 100644
--- a/web/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts
+++ b/web/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts
@@ -1,11 +1,12 @@
import type { Node, NodeOutPutVar, ValueSelector, Var } from '@/app/components/workflow/types'
import { useTranslation } from 'react-i18next'
import { useSnippetDraftStore } from '@/app/components/snippets/draft-store'
-import { useIsChatMode, useWorkflow, useWorkflowVariables } from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store/store'
import { useStore as useWorkflowStore } from '@/app/components/workflow/store'
import { BlockEnum } from '@/app/components/workflow/types'
import { FlowType } from '@/types/common'
+import { useIsChatMode, useWorkflow } from '../../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../../hooks/use-workflow-variables'
import { inputVarTypeToVarType } from '../../data-source/utils'
import {
appendSnippetInputFieldVars,
diff --git a/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts b/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts
index 7dcf6c237d9..7164803998e 100644
--- a/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts
+++ b/web/app/components/workflow/nodes/_base/hooks/use-node-crud.ts
@@ -1,6 +1,6 @@
import type { CommonNodeType } from '@/app/components/workflow/types'
import { useCallback, useEffect, useRef } from 'react'
-import { useNodeDataUpdate } from '@/app/components/workflow/hooks'
+import { useNodeDataUpdate } from '../../../hooks/use-node-data-update'
const useNodeCrud = (id: string, data: CommonNodeType) => {
const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate()
diff --git a/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts b/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts
index d97a87bfba0..a52d1efb8c8 100644
--- a/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts
+++ b/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts
@@ -1,6 +1,6 @@
import type { BlockEnum } from '@/app/components/workflow/types'
import { useMemo } from 'react'
-import { useNodesMetaData } from '@/app/components/workflow/hooks'
+import { useNodesMetaData } from '../../../hooks/use-nodes-meta-data'
export const useNodeHelpLink = (nodeType: BlockEnum) => {
const availableNodesMetaData = useNodesMetaData()
diff --git a/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts b/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts
index a1172a9181e..feab26bb1df 100644
--- a/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts
+++ b/web/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts
@@ -17,8 +17,6 @@ import { useTranslation } from 'react-i18next'
import { useStoreApi } from 'reactflow'
import { trackEvent } from '@/app/components/base/amplitude'
import { getInputVars as doGetInputVars } from '@/app/components/base/prompt-editor/constants'
-import { useIsChatMode, useNodeDataUpdate, useWorkflow } from '@/app/components/workflow/hooks'
-import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud'
import {
getNodeInfoById,
isConversationVar,
@@ -65,6 +63,9 @@ import {
getLoopSingleNodeRunUrl,
singleNodeRun,
} from '@/service/workflow'
+import useInspectVarsCrud from '../../../hooks/use-inspect-vars-crud'
+import { useNodeDataUpdate } from '../../../hooks/use-node-data-update'
+import { useIsChatMode, useWorkflow } from '../../../hooks/use-workflow'
import useMatchSchemaType from '../components/variable/use-match-schema-type'
const { checkValid: checkLLMValid } = LLMDefault
diff --git a/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts b/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts
index 589448e24fa..20727d2bdec 100644
--- a/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts
+++ b/web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts
@@ -3,11 +3,11 @@ import type { ValueSelector } from '@/app/components/workflow/types'
import { useBoolean, useDebounceFn } from 'ahooks'
import { produce } from 'immer'
import { useCallback, useRef, useState } from 'react'
-import { useWorkflow } from '@/app/components/workflow/hooks'
import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'
import { getDefaultValue } from '@/app/components/workflow/nodes/_base/components/error-handle/utils'
import { BlockEnum, VarType } from '@/app/components/workflow/types'
import useInspectVarsCrud from '../../../hooks/use-inspect-vars-crud'
+import { useWorkflow } from '../../../hooks/use-workflow'
type Params = {
id: string
diff --git a/web/app/components/workflow/nodes/_base/node.tsx b/web/app/components/workflow/nodes/_base/node.tsx
index fc317f89b93..7f129e531c3 100644
--- a/web/app/components/workflow/nodes/_base/node.tsx
+++ b/web/app/components/workflow/nodes/_base/node.tsx
@@ -9,9 +9,6 @@ import { UserAvatarList } from '@/app/components/base/user-avatar-list'
import BlockIcon from '@/app/components/workflow/block-icon'
import { ToolType } from '@/app/components/workflow/block-selector/types'
import { useCollaboration } from '@/app/components/workflow/collaboration/hooks/use-collaboration'
-import { useNodesReadOnly, useToolIcon } from '@/app/components/workflow/hooks'
-import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud'
-import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation'
import { useNodeIterationInteractions } from '@/app/components/workflow/nodes/iteration/use-interactions'
import { useNodeLoopInteractions } from '@/app/components/workflow/nodes/loop/use-interactions'
import CopyID from '@/app/components/workflow/nodes/tool/components/copy-id'
@@ -19,6 +16,10 @@ import { useStore } from '@/app/components/workflow/store'
import { BlockEnum, ControlMode, NodeRunningStatus } from '@/app/components/workflow/types'
import { hasErrorHandleNode, hasRetryNode } from '@/app/components/workflow/utils'
import { userProfileAtom } from '@/context/account-state'
+import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud'
+import { useNodePluginInstallation } from '../../hooks/use-node-plugin-installation'
+import { useToolIcon } from '../../hooks/use-tool-icon'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import { selectWorkflowNode } from '../../utils/node-navigation'
import AddVariablePopupWithPosition from './components/add-variable-popup-with-position'
import EntryNodeContainer, { StartNodeTypeEnum } from './components/entry-node-container'
diff --git a/web/app/components/workflow/nodes/agent-v2/__tests__/panel.spec.tsx b/web/app/components/workflow/nodes/agent-v2/__tests__/panel.spec.tsx
index aba83d5bc83..6a722f72abb 100644
--- a/web/app/components/workflow/nodes/agent-v2/__tests__/panel.spec.tsx
+++ b/web/app/components/workflow/nodes/agent-v2/__tests__/panel.spec.tsx
@@ -309,13 +309,26 @@ vi.mock('../../_base/hooks/use-available-var-list', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodeDataUpdate: () => ({
- handleNodeDataUpdate: mockHandleNodeDataUpdate,
- handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft,
- }),
- useWorkflowVariableType: () => vi.fn(),
-}))
+vi.mock('../../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodeDataUpdate: () => ({
+ handleNodeDataUpdate: mockHandleNodeDataUpdate,
+ handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft,
+ }),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariableType: () => vi.fn(),
+ }
+})
vi.mock('@/app/components/workflow/hooks-store', () => ({
useHooksStore: (selector: (state: { configsMap: typeof mockConfigsMap }) => unknown) =>
diff --git a/web/app/components/workflow/nodes/agent-v2/agent-soul-config.ts b/web/app/components/workflow/nodes/agent-v2/agent-soul-config.ts
index 4360a719a59..64fef972ff5 100644
--- a/web/app/components/workflow/nodes/agent-v2/agent-soul-config.ts
+++ b/web/app/components/workflow/nodes/agent-v2/agent-soul-config.ts
@@ -9,7 +9,6 @@ import isEqual from 'fast-deep-equal'
import { useStore as useJotaiStore, useSetAtom } from 'jotai'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
-import { useSerialAsyncCallback } from '@/app/components/workflow/hooks/use-serial-async-callback'
import {
agentSoulConfigToFormState,
formStateToAgentSoulConfig,
@@ -22,6 +21,7 @@ import {
} from '@/features/agent-v2/agent-composer/store'
import { consoleQuery } from '@/service/client'
import { FlowType } from '@/types/common'
+import { useSerialAsyncCallback } from '../../hooks/use-serial-async-callback'
const DRAFT_AUTOSAVE_WAIT = 5000
diff --git a/web/app/components/workflow/nodes/agent-v2/components/agent-task-field.tsx b/web/app/components/workflow/nodes/agent-v2/components/agent-task-field.tsx
index 9df4317ffb4..86457d4e12b 100644
--- a/web/app/components/workflow/nodes/agent-v2/components/agent-task-field.tsx
+++ b/web/app/components/workflow/nodes/agent-v2/components/agent-task-field.tsx
@@ -12,7 +12,7 @@ import { useTranslation } from 'react-i18next'
import { Infotip } from '@/app/components/base/infotip'
import PromptEditor from '@/app/components/base/prompt-editor'
import { $createCustomTextNode } from '@/app/components/base/prompt-editor/plugins/custom-text/node'
-import { useWorkflowVariableType } from '../../../hooks'
+import { useWorkflowVariableType } from '../../../hooks/use-workflow-variables'
import { BlockEnum } from '../../../types'
import useAvailableVarList from '../../_base/hooks/use-available-var-list'
diff --git a/web/app/components/workflow/nodes/agent-v2/panel.tsx b/web/app/components/workflow/nodes/agent-v2/panel.tsx
index ced3ebdf092..893b1abf1b7 100644
--- a/web/app/components/workflow/nodes/agent-v2/panel.tsx
+++ b/web/app/components/workflow/nodes/agent-v2/panel.tsx
@@ -17,11 +17,11 @@ import {
extractAgentOutputNames,
replaceAgentOutputName,
} from '@/app/components/base/prompt-editor/plugins/agent-output-block/utils'
-import { useNodeDataUpdate } from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
import { useStore } from '@/app/components/workflow/store'
import { consoleQuery } from '@/service/client'
import { FlowType } from '@/types/common'
+import { useNodeDataUpdate } from '../../hooks/use-node-data-update'
import useNodeCrud from '../_base/hooks/use-node-crud'
import {
WorkflowInlineAgentConfigureWorkspace,
diff --git a/web/app/components/workflow/nodes/agent/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/agent/__tests__/use-config.spec.ts
index e6efc7981a2..4013aa34dd6 100644
--- a/web/app/components/workflow/nodes/agent/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/agent/__tests__/use-config.spec.ts
@@ -17,10 +17,15 @@ const mockUseCheckInstalled = vi.hoisted(() => vi.fn())
const mockGenerateAgentToolValue = vi.hoisted(() => vi.fn())
const mockToolParametersToFormSchemas = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: (...args: unknown[]) => mockUseNodesReadOnly(...args),
- useIsChatMode: (...args: unknown[]) => mockUseIsChatMode(...args),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: (...args: unknown[]) => mockUseNodesReadOnly(...args),
+ useIsChatMode: (...args: unknown[]) => mockUseIsChatMode(...args),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/agent/use-config.ts b/web/app/components/workflow/nodes/agent/use-config.ts
index 790fc9d9fae..138e7e9589e 100644
--- a/web/app/components/workflow/nodes/agent/use-config.ts
+++ b/web/app/components/workflow/nodes/agent/use-config.ts
@@ -8,9 +8,9 @@ import {
generateAgentToolValue,
toolParametersToFormSchemas,
} from '@/app/components/tools/utils/to-form-schema'
-import { useIsChatMode, useNodesReadOnly } from '@/app/components/workflow/hooks'
import { useCheckInstalled, useFetchPluginsInMarketPlaceByIds } from '@/service/use-plugins'
import { useStrategyProviderDetail } from '@/service/use-strategy'
+import { useIsChatMode, useNodesReadOnly } from '../../hooks/use-workflow'
import { VarType as VarKindType } from '../../types'
import useAvailableVarList from '../_base/hooks/use-available-var-list'
import useNodeCrud from '../_base/hooks/use-node-crud'
diff --git a/web/app/components/workflow/nodes/answer/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/answer/__tests__/node.spec.tsx
index a2ecc6cf429..0c3eb3ccfd6 100644
--- a/web/app/components/workflow/nodes/answer/__tests__/node.spec.tsx
+++ b/web/app/components/workflow/nodes/answer/__tests__/node.spec.tsx
@@ -2,12 +2,13 @@ import type { AnswerNodeType } from '../types'
import { screen } from '@testing-library/react'
import { createNode } from '@/app/components/workflow/__tests__/fixtures'
import { renderNodeComponent } from '@/app/components/workflow/__tests__/workflow-test-env'
-import { useWorkflow } from '@/app/components/workflow/hooks'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useWorkflow } from '../../../hooks/use-workflow'
import Node from '../node'
-vi.mock('@/app/components/workflow/hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
return {
...actual,
useWorkflow: vi.fn(),
diff --git a/web/app/components/workflow/nodes/answer/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/answer/__tests__/use-config.spec.ts
index f0b0b074ae3..fdb531bc553 100644
--- a/web/app/components/workflow/nodes/answer/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/answer/__tests__/use-config.spec.ts
@@ -7,9 +7,14 @@ const mockUseNodesReadOnly = vi.hoisted(() => vi.fn())
const mockUseNodeCrud = vi.hoisted(() => vi.fn())
const mockUseVarList = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => mockUseNodesReadOnly(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => mockUseNodesReadOnly(),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/answer/use-config.ts b/web/app/components/workflow/nodes/answer/use-config.ts
index e62e17354b7..59c0f0a4083 100644
--- a/web/app/components/workflow/nodes/answer/use-config.ts
+++ b/web/app/components/workflow/nodes/answer/use-config.ts
@@ -2,8 +2,8 @@ import type { Var } from '../../types'
import type { AnswerNodeType } from './types'
import { produce } from 'immer'
import { useCallback } from 'react'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import { VarType } from '../../types'
import useVarList from '../_base/hooks/use-var-list'
diff --git a/web/app/components/workflow/nodes/assigner/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/assigner/__tests__/use-config.spec.tsx
index 3a97d63731c..8a94ecb4f5a 100644
--- a/web/app/components/workflow/nodes/assigner/__tests__/use-config.spec.tsx
+++ b/web/app/components/workflow/nodes/assigner/__tests__/use-config.spec.tsx
@@ -9,18 +9,31 @@ const mockSetInputs = vi.hoisted(() => vi.fn())
const mockGetAvailableVars = vi.hoisted(() => vi.fn())
const mockGetCurrentVariableType = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({ nodesReadOnly: false }),
- useIsChatMode: () => false,
- useWorkflow: () => ({
- getBeforeNodesInSameBranchIncludeParent: () => [
- { id: 'start-node', data: { title: 'Start', type: BlockEnum.Start } },
- ],
- }),
- useWorkflowVariables: () => ({
- getCurrentVariableType: (...args: unknown[]) => mockGetCurrentVariableType(...args),
- }),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({ nodesReadOnly: false }),
+ useIsChatMode: () => false,
+ useWorkflow: () => ({
+ getBeforeNodesInSameBranchIncludeParent: () => [
+ { id: 'start-node', data: { title: 'Start', type: BlockEnum.Start } },
+ ],
+ }),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => ({
+ getCurrentVariableType: (...args: unknown[]) => mockGetCurrentVariableType(...args),
+ }),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
...createNodeCrudModuleMock(mockSetInputs),
diff --git a/web/app/components/workflow/nodes/assigner/components/var-list/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/assigner/components/var-list/__tests__/index.spec.tsx
index d05a9a83881..e8401c19d33 100644
--- a/web/app/components/workflow/nodes/assigner/components/var-list/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/nodes/assigner/components/var-list/__tests__/index.spec.tsx
@@ -7,18 +7,32 @@ import { BlockEnum, VarType } from '@/app/components/workflow/types'
import { AssignerNodeInputType, WriteMode } from '../../../types'
import VarList from '../index'
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => false,
- useWorkflow: () => ({
- getTreeLeafNodes: () => [],
- getNodeById: () => undefined,
- getBeforeNodesInSameBranchIncludeParent: () => [],
- }),
- useWorkflowVariables: () => ({
- getNodeAvailableVars: () => [],
- getCurrentVariableType: () => undefined,
- }),
-}))
+vi.mock('../../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => false,
+ useWorkflow: () => ({
+ getTreeLeafNodes: () => [],
+ getNodeById: () => undefined,
+ getBeforeNodesInSameBranchIncludeParent: () => [],
+ }),
+ }
+})
+
+vi.mock('../../../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual =
+ await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => ({
+ getNodeAvailableVars: () => [],
+ getCurrentVariableType: () => undefined,
+ }),
+ }
+})
const sourceNode = createNode({
id: 'node-a',
diff --git a/web/app/components/workflow/nodes/assigner/hooks.ts b/web/app/components/workflow/nodes/assigner/hooks.ts
index e2d5508492f..9fa942064d4 100644
--- a/web/app/components/workflow/nodes/assigner/hooks.ts
+++ b/web/app/components/workflow/nodes/assigner/hooks.ts
@@ -2,7 +2,8 @@ import type { Node, Var } from '../../types'
import { uniqBy } from 'es-toolkit/compat'
import { useCallback } from 'react'
import { useNodes } from 'reactflow'
-import { useIsChatMode, useWorkflow, useWorkflowVariables } from '../../hooks'
+import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../hooks/use-workflow-variables'
import { AssignerNodeInputType, WriteMode } from './types'
export const useGetAvailableVars = () => {
diff --git a/web/app/components/workflow/nodes/assigner/use-config.ts b/web/app/components/workflow/nodes/assigner/use-config.ts
index 50015be77c1..c582fcaefb8 100644
--- a/web/app/components/workflow/nodes/assigner/use-config.ts
+++ b/web/app/components/workflow/nodes/assigner/use-config.ts
@@ -2,13 +2,9 @@ import type { ValueSelector, Var } from '../../types'
import type { AssignerNodeOperation, AssignerNodeType } from './types'
import { useCallback, useMemo } from 'react'
import { useStoreApi } from 'reactflow'
-import {
- useIsChatMode,
- useNodesReadOnly,
- useWorkflow,
- useWorkflowVariables,
-} from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../hooks/use-workflow-variables'
import { useGetAvailableVars } from './hooks'
import { WriteMode, writeModeTypesNum } from './types'
import {
diff --git a/web/app/components/workflow/nodes/code/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/code/__tests__/use-config.spec.ts
index b77f7ad26d7..3f1dc0a4c0e 100644
--- a/web/app/components/workflow/nodes/code/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/code/__tests__/use-config.spec.ts
@@ -1,19 +1,24 @@
import type { CodeNodeType, OutputVar } from '../types'
import type { Var, Variable } from '@/app/components/workflow/types'
import { act, renderHook, waitFor } from '@testing-library/react'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useStore } from '@/app/components/workflow/store'
import { BlockEnum, VarType } from '@/app/components/workflow/types'
import { fetchNodeDefault, fetchPipelineNodeDefault } from '@/service/workflow'
+import { useNodesReadOnly } from '../../../hooks/use-workflow'
import useOutputVarList from '../../_base/hooks/use-output-var-list'
import useVarList from '../../_base/hooks/use-var-list'
import { CodeLanguage } from '../types'
import useConfig from '../use-config'
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: vi.fn(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: vi.fn(),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/code/use-config.ts b/web/app/components/workflow/nodes/code/use-config.ts
index c413696f320..ea56af2c2bb 100644
--- a/web/app/components/workflow/nodes/code/use-config.ts
+++ b/web/app/components/workflow/nodes/code/use-config.ts
@@ -2,9 +2,9 @@ import type { Var, Variable } from '../../types'
import type { CodeNodeType, OutputVar } from './types'
import { produce } from 'immer'
import { useCallback, useEffect, useState } from 'react'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { fetchNodeDefault, fetchPipelineNodeDefault } from '@/service/workflow'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import { useStore } from '../../store'
import { BlockEnum, VarType } from '../../types'
import useOutputVarList from '../_base/hooks/use-output-var-list'
diff --git a/web/app/components/workflow/nodes/data-source-empty/hooks.ts b/web/app/components/workflow/nodes/data-source-empty/hooks.ts
index 6973e94b143..a69bb5a0909 100644
--- a/web/app/components/workflow/nodes/data-source-empty/hooks.ts
+++ b/web/app/components/workflow/nodes/data-source-empty/hooks.ts
@@ -1,9 +1,9 @@
import type { OnSelectBlock } from '@/app/components/workflow/types'
import { produce } from 'immer'
import { useCallback } from 'react'
-import { useNodesMetaData } from '@/app/components/workflow/hooks'
-import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow'
import { generateNewNode } from '@/app/components/workflow/utils'
+import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow'
+import { useNodesMetaData } from '../../hooks/use-nodes-meta-data'
export const useReplaceDataSourceNode = (id: string) => {
const collaborativeWorkflow = useCollaborativeWorkflow()
diff --git a/web/app/components/workflow/nodes/data-source/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/data-source/__tests__/node.spec.tsx
index a7b708d1d16..3f2b90798a7 100644
--- a/web/app/components/workflow/nodes/data-source/__tests__/node.spec.tsx
+++ b/web/app/components/workflow/nodes/data-source/__tests__/node.spec.tsx
@@ -1,7 +1,7 @@
import type { DataSourceNodeType } from '../types'
import { render, screen } from '@testing-library/react'
-import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useNodePluginInstallation } from '../../../hooks/use-node-plugin-installation'
import Node from '../node'
const mockInstallPluginButton = vi.hoisted(() =>
@@ -10,7 +10,7 @@ const mockInstallPluginButton = vi.hoisted(() =>
)),
)
-vi.mock('@/app/components/workflow/hooks/use-node-plugin-installation', () => ({
+vi.mock('../../../hooks/use-node-plugin-installation', () => ({
useNodePluginInstallation: vi.fn(),
}))
diff --git a/web/app/components/workflow/nodes/data-source/__tests__/panel.spec.tsx b/web/app/components/workflow/nodes/data-source/__tests__/panel.spec.tsx
index 93484f38bd2..cce6f97fdd3 100644
--- a/web/app/components/workflow/nodes/data-source/__tests__/panel.spec.tsx
+++ b/web/app/components/workflow/nodes/data-source/__tests__/panel.spec.tsx
@@ -3,9 +3,9 @@ import type { DataSourceNodeType } from '../types'
import type { NodePanelProps } from '@/app/components/workflow/types'
import { fireEvent, render, screen } from '@testing-library/react'
import { toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import { useStore } from '@/app/components/workflow/store'
import { BlockEnum, VarType } from '@/app/components/workflow/types'
+import { useNodesReadOnly } from '../../../hooks/use-workflow'
import useMatchSchemaType, {
getMatchedSchemaType,
} from '../../_base/components/variable/use-match-schema-type'
@@ -36,9 +36,14 @@ vi.mock('@/app/components/tools/utils/to-form-schema', () => ({
toolParametersToFormSchemas: vi.fn(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: vi.fn(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: vi.fn(),
+ }
+})
vi.mock('@/app/components/workflow/store', () => ({
useStore: vi.fn(),
diff --git a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.branches.spec.tsx b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.branches.spec.tsx
index bb72164938a..bb05f8dc2a3 100644
--- a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.branches.spec.tsx
+++ b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.branches.spec.tsx
@@ -12,7 +12,8 @@ import { useDatasourceSingleRun } from '@/service/use-pipeline'
import { useInvalidLastRun } from '@/service/use-workflow'
import { fetchNodeInspectVars } from '@/service/workflow'
import { FlowType } from '@/types/common'
-import { useNodeDataUpdate, useNodesSyncDraft } from '../../../../hooks'
+import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update'
+import { useNodesSyncDraft } from '../../../../hooks/use-nodes-sync-draft'
import useBeforeRunForm from '../use-before-run-form'
type DataSourceStoreState = {
@@ -58,10 +59,23 @@ vi.mock('reactflow', async () => {
}
})
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodeDataUpdate: vi.fn(),
- useNodesSyncDraft: vi.fn(),
-}))
+vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodeDataUpdate: vi.fn(),
+ }
+})
+
+vi.mock('../../../../hooks/use-nodes-sync-draft', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesSyncDraft: vi.fn(),
+ }
+})
vi.mock('@/service/use-pipeline', () => ({
useDatasourceSingleRun: vi.fn(),
diff --git a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.spec.tsx b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.spec.tsx
index 971601a6ba6..9c73404978a 100644
--- a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.spec.tsx
+++ b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-before-run-form.spec.tsx
@@ -13,7 +13,8 @@ import { useInvalidLastRun } from '@/service/use-workflow'
import { fetchNodeInspectVars } from '@/service/workflow'
import { TransferMethod } from '@/types/app'
import { FlowType } from '@/types/common'
-import { useNodeDataUpdate, useNodesSyncDraft } from '../../../../hooks'
+import { useNodeDataUpdate } from '../../../../hooks/use-node-data-update'
+import { useNodesSyncDraft } from '../../../../hooks/use-nodes-sync-draft'
import useBeforeRunForm from '../use-before-run-form'
type DataSourceStoreState = {
@@ -59,10 +60,23 @@ vi.mock('reactflow', async () => {
}
})
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodeDataUpdate: vi.fn(),
- useNodesSyncDraft: vi.fn(),
-}))
+vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodeDataUpdate: vi.fn(),
+ }
+})
+
+vi.mock('../../../../hooks/use-nodes-sync-draft', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesSyncDraft: vi.fn(),
+ }
+})
vi.mock('@/service/use-pipeline', () => ({
useDatasourceSingleRun: vi.fn(),
diff --git a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-config.spec.ts
index 7c9b58ca5f7..73937c024bd 100644
--- a/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/data-source/hooks/__tests__/use-config.spec.ts
@@ -10,9 +10,14 @@ vi.mock('reactflow', () => ({
useStoreApi: () => mockUseStoreApi(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodeDataUpdate: () => mockUseNodeDataUpdate(),
-}))
+vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodeDataUpdate: () => mockUseNodeDataUpdate(),
+ }
+})
const createNode = (
overrides: Partial = {},
diff --git a/web/app/components/workflow/nodes/data-source/hooks/use-before-run-form.ts b/web/app/components/workflow/nodes/data-source/hooks/use-before-run-form.ts
index 7db7f958257..9489071ff44 100644
--- a/web/app/components/workflow/nodes/data-source/hooks/use-before-run-form.ts
+++ b/web/app/components/workflow/nodes/data-source/hooks/use-before-run-form.ts
@@ -13,7 +13,8 @@ import { useInvalidLastRun } from '@/service/use-workflow'
import { fetchNodeInspectVars } from '@/service/workflow'
import { TransferMethod } from '@/types/app'
import { FlowType } from '@/types/common'
-import { useNodeDataUpdate, useNodesSyncDraft } from '../../../hooks'
+import { useNodeDataUpdate } from '../../../hooks/use-node-data-update'
+import { useNodesSyncDraft } from '../../../hooks/use-nodes-sync-draft'
import { NodeRunningStatus } from '../../../types'
const useBeforeRunForm = ({
diff --git a/web/app/components/workflow/nodes/data-source/hooks/use-config.ts b/web/app/components/workflow/nodes/data-source/hooks/use-config.ts
index 0f4484d2bf0..b4904b37612 100644
--- a/web/app/components/workflow/nodes/data-source/hooks/use-config.ts
+++ b/web/app/components/workflow/nodes/data-source/hooks/use-config.ts
@@ -1,7 +1,7 @@
import type { DataSourceNodeType, ToolVarInputs } from '../types'
import { useCallback, useEffect, useMemo } from 'react'
import { useStoreApi } from 'reactflow'
-import { useNodeDataUpdate } from '@/app/components/workflow/hooks'
+import { useNodeDataUpdate } from '../../../hooks/use-node-data-update'
export const useConfig = (id: string, dataSourceList?: any[]) => {
const store = useStoreApi()
diff --git a/web/app/components/workflow/nodes/data-source/node.tsx b/web/app/components/workflow/nodes/data-source/node.tsx
index c2c430402f9..9d5aa65a7c7 100644
--- a/web/app/components/workflow/nodes/data-source/node.tsx
+++ b/web/app/components/workflow/nodes/data-source/node.tsx
@@ -2,8 +2,8 @@ import type { FC } from 'react'
import type { DataSourceNodeType } from './types'
import type { NodeProps } from '@/app/components/workflow/types'
import { memo } from 'react'
-import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation'
import { InstallPluginButton } from '@/app/components/workflow/nodes/_base/components/install-plugin-button'
+import { useNodePluginInstallation } from '../../hooks/use-node-plugin-installation'
const Node: FC> = ({ data }) => {
const { isChecking, isMissing, uniqueIdentifier, canInstall, onInstallSuccess } =
diff --git a/web/app/components/workflow/nodes/data-source/panel.tsx b/web/app/components/workflow/nodes/data-source/panel.tsx
index 9d9f10dc016..8a9abf4d7a3 100644
--- a/web/app/components/workflow/nodes/data-source/panel.tsx
+++ b/web/app/components/workflow/nodes/data-source/panel.tsx
@@ -5,12 +5,12 @@ import { memo, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import TagInput from '@/app/components/base/tag-input'
import { toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import { BoxGroupField } from '@/app/components/workflow/nodes/_base/components/layout'
import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
import StructureOutputItem from '@/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show'
import { useStore } from '@/app/components/workflow/store'
import { wrapStructuredVarItem } from '@/app/components/workflow/utils/tool'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import useMatchSchemaType, {
getMatchedSchemaType,
} from '../_base/components/variable/use-match-schema-type'
diff --git a/web/app/components/workflow/nodes/document-extractor/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/document-extractor/__tests__/use-config.spec.ts
index a86e9c194ea..e181164fa73 100644
--- a/web/app/components/workflow/nodes/document-extractor/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/document-extractor/__tests__/use-config.spec.ts
@@ -1,14 +1,10 @@
import type { DocExtractorNodeType } from '../types'
import { renderHook } from '@testing-library/react'
import { useStoreApi } from 'reactflow'
-import {
- useIsChatMode,
- useNodesReadOnly,
- useWorkflow,
- useWorkflowVariables,
-} from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { BlockEnum, VarType } from '@/app/components/workflow/types'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../../hooks/use-workflow-variables'
import useConfig from '../use-config'
const mockUseStoreApi = vi.mocked(useStoreApi)
@@ -26,12 +22,25 @@ vi.mock('reactflow', async () => {
}
})
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: vi.fn(),
- useNodesReadOnly: vi.fn(),
- useWorkflow: vi.fn(),
- useWorkflowVariables: vi.fn(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: vi.fn(),
+ useNodesReadOnly: vi.fn(),
+ useWorkflow: vi.fn(),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: vi.fn(),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/document-extractor/use-config.ts b/web/app/components/workflow/nodes/document-extractor/use-config.ts
index 9ad307cbd94..a54a310f132 100644
--- a/web/app/components/workflow/nodes/document-extractor/use-config.ts
+++ b/web/app/components/workflow/nodes/document-extractor/use-config.ts
@@ -3,13 +3,9 @@ import type { DocExtractorNodeType } from './types'
import { produce } from 'immer'
import { useCallback, useMemo } from 'react'
import { useStoreApi } from 'reactflow'
-import {
- useIsChatMode,
- useNodesReadOnly,
- useWorkflow,
- useWorkflowVariables,
-} from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../hooks/use-workflow-variables'
import { VarType } from '../../types'
const useConfig = (id: string, payload: DocExtractorNodeType) => {
diff --git a/web/app/components/workflow/nodes/end/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/end/__tests__/node.spec.tsx
index 988143b7c0e..87c1050eda2 100644
--- a/web/app/components/workflow/nodes/end/__tests__/node.spec.tsx
+++ b/web/app/components/workflow/nodes/end/__tests__/node.spec.tsx
@@ -2,20 +2,30 @@ import type { EndNodeType } from '../types'
import { screen } from '@testing-library/react'
import { createNode, createStartNode } from '@/app/components/workflow/__tests__/fixtures'
import { renderNodeComponent } from '@/app/components/workflow/__tests__/workflow-test-env'
-import { useIsChatMode, useWorkflow, useWorkflowVariables } from '@/app/components/workflow/hooks'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useIsChatMode, useWorkflow } from '../../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../../hooks/use-workflow-variables'
import Node from '../node'
-vi.mock('@/app/components/workflow/hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
return {
...actual,
useWorkflow: vi.fn(),
- useWorkflowVariables: vi.fn(),
useIsChatMode: vi.fn(),
}
})
+vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: vi.fn(),
+ }
+})
+
const mockUseWorkflow = vi.mocked(useWorkflow)
const mockUseWorkflowVariables = vi.mocked(useWorkflowVariables)
const mockUseIsChatMode = vi.mocked(useIsChatMode)
diff --git a/web/app/components/workflow/nodes/end/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/end/__tests__/use-config.spec.ts
index 1ea561177e6..479296bb08d 100644
--- a/web/app/components/workflow/nodes/end/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/end/__tests__/use-config.spec.ts
@@ -7,9 +7,14 @@ const mockUseNodesReadOnly = vi.hoisted(() => vi.fn())
const mockUseNodeCrud = vi.hoisted(() => vi.fn())
const mockUseVarList = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => mockUseNodesReadOnly(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => mockUseNodesReadOnly(),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/end/node.tsx b/web/app/components/workflow/nodes/end/node.tsx
index 95374c96312..cc93492ce15 100644
--- a/web/app/components/workflow/nodes/end/node.tsx
+++ b/web/app/components/workflow/nodes/end/node.tsx
@@ -2,9 +2,10 @@ import type { FC } from 'react'
import type { EndNodeType } from './types'
import type { NodeProps, Variable } from '@/app/components/workflow/types'
import * as React from 'react'
-import { useIsChatMode, useWorkflow, useWorkflowVariables } from '@/app/components/workflow/hooks'
import { VariableLabelInNode } from '@/app/components/workflow/nodes/_base/components/variable/variable-label'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../hooks/use-workflow-variables'
const Node: FC> = ({ id, data }) => {
const { getBeforeNodesInSameBranch } = useWorkflow()
diff --git a/web/app/components/workflow/nodes/end/use-config.ts b/web/app/components/workflow/nodes/end/use-config.ts
index 93a60e620b7..6aeb96daa7f 100644
--- a/web/app/components/workflow/nodes/end/use-config.ts
+++ b/web/app/components/workflow/nodes/end/use-config.ts
@@ -1,6 +1,6 @@
import type { EndNodeType } from './types'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import useVarList from '../_base/hooks/use-var-list'
const useConfig = (id: string, payload: EndNodeType) => {
diff --git a/web/app/components/workflow/nodes/http/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/http/__tests__/use-config.spec.ts
index 6105326ab2d..cf134b7f16e 100644
--- a/web/app/components/workflow/nodes/http/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/http/__tests__/use-config.spec.ts
@@ -1,17 +1,22 @@
import type { HttpNodeType } from '../types'
import { act, renderHook, waitFor } from '@testing-library/react'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useStore } from '@/app/components/workflow/store'
import { BlockEnum, VarType } from '@/app/components/workflow/types'
+import { useNodesReadOnly } from '../../../hooks/use-workflow'
import useVarList from '../../_base/hooks/use-var-list'
import useKeyValueList from '../hooks/use-key-value-list'
import { APIType, AuthorizationType, BodyPayloadValueType, BodyType, Method } from '../types'
import useConfig from '../use-config'
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: vi.fn(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: vi.fn(),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/http/components/__tests__/curl-panel.spec.tsx b/web/app/components/workflow/nodes/http/components/__tests__/curl-panel.spec.tsx
index b31e2e7840a..f71af79238a 100644
--- a/web/app/components/workflow/nodes/http/components/__tests__/curl-panel.spec.tsx
+++ b/web/app/components/workflow/nodes/http/components/__tests__/curl-panel.spec.tsx
@@ -10,11 +10,16 @@ const { mockHandleNodeSelect, mockToastError } = vi.hoisted(() => ({
mockToastError: vi.fn(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesInteractions: () => ({
- handleNodeSelect: mockHandleNodeSelect,
- }),
-}))
+vi.mock('../../../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesInteractions: () => ({
+ handleNodeSelect: mockHandleNodeSelect,
+ }),
+ }
+})
vi.mock('@langgenius/dify-ui/toast', () => ({
toast: {
diff --git a/web/app/components/workflow/nodes/http/components/curl-panel.tsx b/web/app/components/workflow/nodes/http/components/curl-panel.tsx
index e23a374f2ea..d1740095147 100644
--- a/web/app/components/workflow/nodes/http/components/curl-panel.tsx
+++ b/web/app/components/workflow/nodes/http/components/curl-panel.tsx
@@ -8,7 +8,7 @@ import { toast } from '@langgenius/dify-ui/toast'
import * as React from 'react'
import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { useNodesInteractions } from '@/app/components/workflow/hooks'
+import { useNodesInteractions } from '../../../hooks/use-nodes-interactions'
import { parseCurl } from './curl-parser'
type Props = Readonly<{
diff --git a/web/app/components/workflow/nodes/http/use-config.ts b/web/app/components/workflow/nodes/http/use-config.ts
index 8e745fa4192..7718f5ead61 100644
--- a/web/app/components/workflow/nodes/http/use-config.ts
+++ b/web/app/components/workflow/nodes/http/use-config.ts
@@ -3,8 +3,8 @@ import type { Authorization, Body, HttpNodeType, Method, Timeout } from './types
import { useBoolean } from 'ahooks'
import { produce } from 'immer'
import { useCallback, useEffect, useState } from 'react'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import { useStore } from '../../store'
import { VarType } from '../../types'
import useVarList from '../_base/hooks/use-var-list'
diff --git a/web/app/components/workflow/nodes/human-input/__tests__/human-input.spec.tsx b/web/app/components/workflow/nodes/human-input/__tests__/human-input.spec.tsx
index f1b59ba8f40..ed1a366a114 100644
--- a/web/app/components/workflow/nodes/human-input/__tests__/human-input.spec.tsx
+++ b/web/app/components/workflow/nodes/human-input/__tests__/human-input.spec.tsx
@@ -48,20 +48,41 @@ vi.mock('@/app/components/workflow/store', () => ({
}))
// Mock workflow hooks barrel (used by NodeSourceHandle via ../../../hooks)
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesInteractions: () => ({
- handleNodeAdd: vi.fn(),
- }),
- useNodesReadOnly: () => ({
- getNodesReadOnly: () => false,
- nodesReadOnly: false,
- }),
- useAvailableBlocks: () => ({
- availableNextBlocks: [],
- availablePrevBlocks: [],
- }),
- useIsChatMode: () => false,
-}))
+vi.mock('../../../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useAvailableBlocks: () => ({
+ availableNextBlocks: [],
+ availablePrevBlocks: [],
+ }),
+ }
+})
+
+vi.mock('../../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesInteractions: () => ({
+ handleNodeAdd: vi.fn(),
+ }),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({
+ getNodesReadOnly: () => false,
+ nodesReadOnly: false,
+ }),
+ useIsChatMode: () => false,
+ }
+})
// ── Factory: Build a realistic human-input node as it would appear after DSL import ──
const createHumanInputNode = (overrides?: Partial): Node => ({
diff --git a/web/app/components/workflow/nodes/human-input/components/__tests__/form-content.spec.tsx b/web/app/components/workflow/nodes/human-input/components/__tests__/form-content.spec.tsx
index d1eeb072942..c20f48cfd89 100644
--- a/web/app/components/workflow/nodes/human-input/components/__tests__/form-content.spec.tsx
+++ b/web/app/components/workflow/nodes/human-input/components/__tests__/form-content.spec.tsx
@@ -27,9 +27,14 @@ vi.mock('react-i18next', async () => {
}
})
-vi.mock('@/app/components/workflow/hooks', () => ({
- useWorkflowVariableType: () => mockUseWorkflowVariableType(),
-}))
+vi.mock('../../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariableType: () => mockUseWorkflowVariableType(),
+ }
+})
vi.mock('@tanstack/react-hotkeys', async (importOriginal) => {
const actual = await importOriginal()
diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/index.spec.tsx
index 3aad1dd33db..45980de8b39 100644
--- a/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/__tests__/index.spec.tsx
@@ -11,9 +11,14 @@ vi.mock('react-i18next', () => ({
useTranslation: () => mockUseTranslation(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesSyncDraft: () => mockUseNodesSyncDraft(),
-}))
+vi.mock('../../../../../hooks/use-nodes-sync-draft', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesSyncDraft: () => mockUseNodesSyncDraft(),
+ }
+})
vi.mock('../method-selector', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/human-input/components/delivery-method/index.tsx b/web/app/components/workflow/nodes/human-input/components/delivery-method/index.tsx
index 771c4e8cc7d..8a2c0fd301b 100644
--- a/web/app/components/workflow/nodes/human-input/components/delivery-method/index.tsx
+++ b/web/app/components/workflow/nodes/human-input/components/delivery-method/index.tsx
@@ -4,7 +4,7 @@ import { produce } from 'immer'
import * as React from 'react'
import { useTranslation } from 'react-i18next'
import { Infotip } from '@/app/components/base/infotip'
-import { useNodesSyncDraft } from '@/app/components/workflow/hooks'
+import { useNodesSyncDraft } from '../../../../hooks/use-nodes-sync-draft'
import MethodItem from './method-item'
import MethodSelector from './method-selector'
import { UpgradeModal } from './upgrade-modal'
diff --git a/web/app/components/workflow/nodes/human-input/components/form-content.tsx b/web/app/components/workflow/nodes/human-input/components/form-content.tsx
index bdc4c2b1ed7..1b9e92b7b93 100644
--- a/web/app/components/workflow/nodes/human-input/components/form-content.tsx
+++ b/web/app/components/workflow/nodes/human-input/components/form-content.tsx
@@ -13,7 +13,7 @@ import { useCallback, useEffect, useMemo, useRef } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import PromptEditor from '@/app/components/base/prompt-editor'
import { INSERT_HITL_INPUT_BLOCK_COMMAND } from '@/app/components/base/prompt-editor/plugins/hitl-input-block'
-import { useWorkflowVariableType } from '../../../hooks'
+import { useWorkflowVariableType } from '../../../hooks/use-workflow-variables'
import { BlockEnum } from '../../../types'
import AddInputField from './add-input-field'
diff --git a/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-config.spec.ts
index 075136860bc..8f4d4bafebb 100644
--- a/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-config.spec.ts
@@ -13,11 +13,16 @@ vi.mock('reactflow', () => ({
useUpdateNodeInternals: () => mockUseUpdateNodeInternals(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => mockUseNodesReadOnly(),
-}))
+vi.mock('../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
-vi.mock('@/app/components/workflow/hooks/use-edges-interactions', () => ({
+ return {
+ ...actual,
+ useNodesReadOnly: () => mockUseNodesReadOnly(),
+ }
+})
+
+vi.mock('../../../../hooks/use-edges-interactions', () => ({
useEdgesInteractions: () => mockUseEdgesInteractions(),
}))
diff --git a/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-form-content.spec.ts b/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-form-content.spec.ts
index 7478b789aac..2f90ef8c09a 100644
--- a/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-form-content.spec.ts
+++ b/web/app/components/workflow/nodes/human-input/hooks/__tests__/use-form-content.spec.ts
@@ -6,9 +6,14 @@ import useFormContent from '../use-form-content'
const mockUseWorkflow = vi.hoisted(() => vi.fn())
const mockUseNodeCrud = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks', () => ({
- useWorkflow: () => mockUseWorkflow(),
-}))
+vi.mock('../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflow: () => mockUseWorkflow(),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/human-input/hooks/use-config.ts b/web/app/components/workflow/nodes/human-input/hooks/use-config.ts
index 13fd18eae53..64dfdcf2083 100644
--- a/web/app/components/workflow/nodes/human-input/hooks/use-config.ts
+++ b/web/app/components/workflow/nodes/human-input/hooks/use-config.ts
@@ -2,9 +2,9 @@ import type { DeliveryMethod, HumanInputNodeType, UserAction } from '../types'
import { produce } from 'immer'
import { useState } from 'react'
import { useUpdateNodeInternals } from 'reactflow'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
-import { useEdgesInteractions } from '@/app/components/workflow/hooks/use-edges-interactions'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { useEdgesInteractions } from '../../../hooks/use-edges-interactions'
+import { useNodesReadOnly } from '../../../hooks/use-workflow'
import useFormContent from './use-form-content'
const useConfig = (id: string, payload: HumanInputNodeType) => {
diff --git a/web/app/components/workflow/nodes/human-input/hooks/use-form-content.ts b/web/app/components/workflow/nodes/human-input/hooks/use-form-content.ts
index 8317285473a..eaf659933f4 100644
--- a/web/app/components/workflow/nodes/human-input/hooks/use-form-content.ts
+++ b/web/app/components/workflow/nodes/human-input/hooks/use-form-content.ts
@@ -1,7 +1,7 @@
import type { FormInputItem, HumanInputNodeType } from '../types'
import { produce } from 'immer'
import { useCallback, useEffect, useRef, useState } from 'react'
-import { useWorkflow } from '@/app/components/workflow/hooks'
+import { useWorkflow } from '../../../hooks/use-workflow'
import useNodeCrud from '../../_base/hooks/use-node-crud'
const useFormContent = (id: string, payload: HumanInputNodeType) => {
diff --git a/web/app/components/workflow/nodes/if-else/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/if-else/__tests__/use-config.spec.tsx
index 64708ec4362..326178dc5e1 100644
--- a/web/app/components/workflow/nodes/if-else/__tests__/use-config.spec.tsx
+++ b/web/app/components/workflow/nodes/if-else/__tests__/use-config.spec.tsx
@@ -26,13 +26,26 @@ vi.mock('reactflow', async () => {
}
})
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({ nodesReadOnly: false }),
- useEdgesInteractions: () => ({
- handleEdgeDeleteByDeleteBranch: (...args: unknown[]) =>
- mockHandleEdgeDeleteByDeleteBranch(...args),
- }),
-}))
+vi.mock('../../../hooks/use-edges-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useEdgesInteractions: () => ({
+ handleEdgeDeleteByDeleteBranch: (...args: unknown[]) =>
+ mockHandleEdgeDeleteByDeleteBranch(...args),
+ }),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({ nodesReadOnly: false }),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
...createNodeCrudModuleMock(mockSetInputs),
diff --git a/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx b/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx
index b83f8983482..99dd1c3d559 100644
--- a/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx
+++ b/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx
@@ -22,7 +22,6 @@ import { produce } from 'immer'
import { useCallback, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
-import { useIsChatMode } from '@/app/components/workflow/hooks/use-workflow'
import { getVarType } from '@/app/components/workflow/nodes/_base/components/variable/utils'
import BoolValue from '@/app/components/workflow/panel/chat-variable-panel/components/bool-value'
import { useWorkflowStore } from '@/app/components/workflow/store'
@@ -33,6 +32,7 @@ import {
useAllMCPTools,
useAllWorkflowTools,
} from '@/service/use-tools'
+import { useIsChatMode } from '../../../../hooks/use-workflow'
import useMatchSchemaType from '../../../_base/components/variable/use-match-schema-type'
import { FILE_TYPE_OPTIONS, SUB_VARIABLES, TRANSFER_METHOD } from '../../../constants'
import { ComparisonOperator } from '../../types'
diff --git a/web/app/components/workflow/nodes/if-else/use-config.ts b/web/app/components/workflow/nodes/if-else/use-config.ts
index 252345f160d..47303ef345e 100644
--- a/web/app/components/workflow/nodes/if-else/use-config.ts
+++ b/web/app/components/workflow/nodes/if-else/use-config.ts
@@ -12,9 +12,10 @@ import type {
} from './types'
import { useCallback, useMemo, useRef } from 'react'
import { useUpdateNodeInternals } from 'reactflow'
-import { useEdgesInteractions, useNodesReadOnly } from '@/app/components/workflow/hooks'
import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { useEdgesInteractions } from '../../hooks/use-edges-interactions'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import {
addCase,
addCondition,
diff --git a/web/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts b/web/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts
index 1dd60325163..635ef55b51e 100644
--- a/web/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts
+++ b/web/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts
@@ -1,7 +1,8 @@
import type { ValueSelector } from '../../types'
import { useMemo } from 'react'
import { useStoreApi } from 'reactflow'
-import { useIsChatMode, useWorkflow, useWorkflowVariables } from '../../hooks'
+import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../hooks/use-workflow-variables'
import { VarType } from '../../types'
type Params = {
diff --git a/web/app/components/workflow/nodes/iteration-start/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/iteration-start/__tests__/index.spec.tsx
index f7a95fa61e6..dbfef5c8d13 100644
--- a/web/app/components/workflow/nodes/iteration-start/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/nodes/iteration-start/__tests__/index.spec.tsx
@@ -3,21 +3,35 @@ import type { CommonNodeType } from '@/app/components/workflow/types'
import { render, waitFor } from '@testing-library/react'
import { createNode } from '@/app/components/workflow/__tests__/fixtures'
import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env'
-import {
- useAvailableBlocks,
- useIsChatMode,
- useNodesInteractions,
- useNodesReadOnly,
-} from '@/app/components/workflow/hooks'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useAvailableBlocks } from '../../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../../hooks/use-nodes-interactions'
+import { useIsChatMode, useNodesReadOnly } from '../../../hooks/use-workflow'
import IterationStartNode, { IterationStartNodeDumb } from '../index'
-vi.mock('@/app/components/workflow/hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
return {
...actual,
useAvailableBlocks: vi.fn(),
+ }
+})
+
+vi.mock('../../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
useNodesInteractions: vi.fn(),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
useNodesReadOnly: vi.fn(),
useIsChatMode: vi.fn(),
}
diff --git a/web/app/components/workflow/nodes/iteration/__tests__/integration.spec.tsx b/web/app/components/workflow/nodes/iteration/__tests__/integration.spec.tsx
index ea8518fb233..1ccae5d382a 100644
--- a/web/app/components/workflow/nodes/iteration/__tests__/integration.spec.tsx
+++ b/web/app/components/workflow/nodes/iteration/__tests__/integration.spec.tsx
@@ -70,13 +70,19 @@ vi.mock('../use-interactions', () => ({
}),
}))
-vi.mock('../../../hooks', () => ({
+vi.mock('../../../hooks/use-available-blocks', () => ({
useAvailableBlocks: () => ({
availableNextBlocks: [BlockEnum.Code],
}),
+}))
+
+vi.mock('../../../hooks/use-nodes-interactions', () => ({
useNodesInteractions: () => ({
handleNodeAdd: mockHandleNodeAdd,
}),
+}))
+
+vi.mock('../../../hooks/use-workflow', () => ({
useNodesReadOnly: () => ({
nodesReadOnly: mockNodesReadOnly,
}),
diff --git a/web/app/components/workflow/nodes/iteration/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/iteration/__tests__/use-config.spec.ts
index 728ab58077d..e0b19e6fb10 100644
--- a/web/app/components/workflow/nodes/iteration/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/iteration/__tests__/use-config.spec.ts
@@ -17,16 +17,21 @@ const mockUseAllWorkflowTools = vi.hoisted(() => vi.fn())
const mockUseAllMCPTools = vi.hoisted(() => vi.fn())
const mockToNodeOutputVars = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({
+vi.mock('../../../hooks/use-inspect-vars-crud', () => ({
__esModule: true,
default: (...args: unknown[]) => mockUseInspectVarsCrud(...args),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => mockUseNodesReadOnly(),
- useIsChatMode: () => mockUseIsChatMode(),
- useWorkflow: () => mockUseWorkflow(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => mockUseNodesReadOnly(),
+ useIsChatMode: () => mockUseIsChatMode(),
+ useWorkflow: () => mockUseWorkflow(),
+ }
+})
vi.mock('@/app/components/workflow/store', () => ({
useStore: (selector: (state: { dataSourceList: unknown[] }) => unknown) =>
diff --git a/web/app/components/workflow/nodes/iteration/__tests__/use-interactions.spec.tsx b/web/app/components/workflow/nodes/iteration/__tests__/use-interactions.spec.tsx
index e5adb792066..0c3ecac0bef 100644
--- a/web/app/components/workflow/nodes/iteration/__tests__/use-interactions.spec.tsx
+++ b/web/app/components/workflow/nodes/iteration/__tests__/use-interactions.spec.tsx
@@ -21,18 +21,23 @@ vi.mock('reactflow', async () => {
}),
}
})
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesMetaData: () => ({
- nodesMap: {
- [BlockEnum.Code]: {
- defaultValue: {
- title: 'Code',
- desc: '',
+vi.mock('../../../hooks/use-nodes-meta-data', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesMetaData: () => ({
+ nodesMap: {
+ [BlockEnum.Code]: {
+ defaultValue: {
+ title: 'Code',
+ desc: '',
+ },
},
},
- },
- }),
-}))
+ }),
+ }
+})
vi.mock('@/app/components/workflow/utils', () => ({
generateNewNode: (...args: unknown[]) => mockGenerateNewNode(...args),
diff --git a/web/app/components/workflow/nodes/iteration/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/iteration/__tests__/use-single-run-form-params.spec.ts
index 657adc1d8e5..48baecee7d0 100644
--- a/web/app/components/workflow/nodes/iteration/__tests__/use-single-run-form-params.spec.ts
+++ b/web/app/components/workflow/nodes/iteration/__tests__/use-single-run-form-params.spec.ts
@@ -13,10 +13,15 @@ const mockGetNodeUsedVarPassToServerKey = vi.hoisted(() => vi.fn())
const mockGetNodeInfoById = vi.hoisted(() => vi.fn())
const mockIsSystemVar = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsNodeInIteration: (...args: unknown[]) => mockUseIsNodeInIteration(...args),
- useWorkflow: () => mockUseWorkflow(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsNodeInIteration: (...args: unknown[]) => mockUseIsNodeInIteration(...args),
+ useWorkflow: () => mockUseWorkflow(),
+ }
+})
vi.mock('@/app/components/workflow/run/utils/format-log', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/iteration/add-block.tsx b/web/app/components/workflow/nodes/iteration/add-block.tsx
index 0bfa5b3a55b..3870cf1d5d3 100644
--- a/web/app/components/workflow/nodes/iteration/add-block.tsx
+++ b/web/app/components/workflow/nodes/iteration/add-block.tsx
@@ -7,7 +7,9 @@ import { memo, useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import BlockSelector from '@/app/components/workflow/block-selector'
import { BlockEnum } from '@/app/components/workflow/types'
-import { useAvailableBlocks, useNodesInteractions, useNodesReadOnly } from '../../hooks'
+import { useAvailableBlocks } from '../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../hooks/use-nodes-interactions'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
type AddBlockProps = {
iterationNodeId: string
diff --git a/web/app/components/workflow/nodes/iteration/use-config.ts b/web/app/components/workflow/nodes/iteration/use-config.ts
index fca9b95fe4a..05edb30c935 100644
--- a/web/app/components/workflow/nodes/iteration/use-config.ts
+++ b/web/app/components/workflow/nodes/iteration/use-config.ts
@@ -10,8 +10,8 @@ import {
useAllMCPTools,
useAllWorkflowTools,
} from '@/service/use-tools'
-import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks'
import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
import { useStore } from '../../store'
import { VarType } from '../../types'
import { toNodeOutputVars } from '../_base/components/variable/utils'
diff --git a/web/app/components/workflow/nodes/iteration/use-interactions.ts b/web/app/components/workflow/nodes/iteration/use-interactions.ts
index e07a219bf3e..2506370f554 100644
--- a/web/app/components/workflow/nodes/iteration/use-interactions.ts
+++ b/web/app/components/workflow/nodes/iteration/use-interactions.ts
@@ -2,8 +2,8 @@ import type { BlockEnum, ChildNodeTypeCount, Node } from '../../types'
import { produce } from 'immer'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
-import { useNodesMetaData } from '@/app/components/workflow/hooks'
-import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow'
+import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow'
+import { useNodesMetaData } from '../../hooks/use-nodes-meta-data'
import { generateNewNode, getNodeCustomTypeByNodeDataType } from '../../utils'
import {
buildIterationChildCopy,
diff --git a/web/app/components/workflow/nodes/iteration/use-single-run-form-params.ts b/web/app/components/workflow/nodes/iteration/use-single-run-form-params.ts
index c95068ade95..971fa35cbe8 100644
--- a/web/app/components/workflow/nodes/iteration/use-single-run-form-params.ts
+++ b/web/app/components/workflow/nodes/iteration/use-single-run-form-params.ts
@@ -7,7 +7,7 @@ import { useTranslation } from 'react-i18next'
import formatTracing from '@/app/components/workflow/run/utils/format-log'
import { InputVarType, VarType } from '@/app/components/workflow/types'
import { VALUE_SELECTOR_DELIMITER as DELIMITER } from '@/config'
-import { useIsNodeInIteration, useWorkflow } from '../../hooks'
+import { useIsNodeInIteration, useWorkflow } from '../../hooks/use-workflow'
import {
getNodeInfoById,
getNodeUsedVarPassToServerKey,
diff --git a/web/app/components/workflow/nodes/knowledge-base/__tests__/panel.spec.tsx b/web/app/components/workflow/nodes/knowledge-base/__tests__/panel.spec.tsx
index b30dd0c5df1..2b84b8c9b1e 100644
--- a/web/app/components/workflow/nodes/knowledge-base/__tests__/panel.spec.tsx
+++ b/web/app/components/workflow/nodes/knowledge-base/__tests__/panel.spec.tsx
@@ -54,9 +54,14 @@ vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', ()
useModelList: mockUseModelList,
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({ nodesReadOnly: false }),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({ nodesReadOnly: false }),
+ }
+})
vi.mock('../hooks/use-config', () => ({
useConfig: () => ({
diff --git a/web/app/components/workflow/nodes/knowledge-base/hooks/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/knowledge-base/hooks/__tests__/use-config.spec.tsx
index 8b230ca3d46..0ab46d1b580 100644
--- a/web/app/components/workflow/nodes/knowledge-base/hooks/__tests__/use-config.spec.tsx
+++ b/web/app/components/workflow/nodes/knowledge-base/hooks/__tests__/use-config.spec.tsx
@@ -14,11 +14,16 @@ import { useConfig } from '../use-config'
const mockHandleNodeDataUpdateWithSyncDraft = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodeDataUpdate: () => ({
- handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft,
- }),
-}))
+vi.mock('../../../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodeDataUpdate: () => ({
+ handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft,
+ }),
+ }
+})
const createNodeData = createNodeDataFactory({
title: 'Knowledge Base',
diff --git a/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts b/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts
index 649d50831f2..350b52568ea 100644
--- a/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts
+++ b/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts
@@ -3,8 +3,8 @@ import type { ValueSelector } from '@/app/components/workflow/types'
import { produce } from 'immer'
import { useCallback } from 'react'
import { useStoreApi } from 'reactflow'
-import { useNodeDataUpdate } from '@/app/components/workflow/hooks'
import { DEFAULT_WEIGHTED_SCORE, RerankingModeEnum } from '@/models/datasets'
+import { useNodeDataUpdate } from '../../../hooks/use-node-data-update'
import {
ChunkStructureEnum,
HybridSearchModeEnum,
diff --git a/web/app/components/workflow/nodes/knowledge-base/panel.tsx b/web/app/components/workflow/nodes/knowledge-base/panel.tsx
index 23c8f0d6bbd..312c4216d45 100644
--- a/web/app/components/workflow/nodes/knowledge-base/panel.tsx
+++ b/web/app/components/workflow/nodes/knowledge-base/panel.tsx
@@ -9,7 +9,6 @@ import { checkShowMultiModalTip } from '@/app/components/datasets/settings/utils
import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
import { useModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
import { normalizeModelProviderModelsResponse } from '@/app/components/header/account-setting/model-provider-page/utils'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import {
BoxGroup,
BoxGroupField,
@@ -18,6 +17,7 @@ import {
import VarReferencePicker from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker'
import { systemFeaturesQueryOptions } from '@/features/system-features/client'
import { consoleQuery } from '@/service/client'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import Split from '../_base/components/split'
import ChunkStructure from './components/chunk-structure'
import EmbeddingModel from './components/embedding-model'
diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/use-config.spec.ts
index 851afde5731..3f97777611b 100644
--- a/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/knowledge-retrieval/__tests__/use-config.spec.ts
@@ -8,7 +8,6 @@ import {
useModelListAndDefaultModelAndCurrentProviderAndModel,
} from '@/app/components/header/account-setting/model-provider-page/hooks'
import { useDatasetsDetailStore } from '@/app/components/workflow/datasets-detail-store/store'
-import { useIsChatMode, useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks'
import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { BlockEnum, VarType } from '@/app/components/workflow/types'
@@ -16,6 +15,7 @@ import { DATASET_DEFAULT } from '@/config'
import { ChunkingMode, DatasetPermission, DataSourceType } from '@/models/datasets'
import { fetchDatasets } from '@/service/datasets'
import { AppModeEnum, RETRIEVE_METHOD, RETRIEVE_TYPE } from '@/types/app'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../../hooks/use-workflow'
import {
ComparisonOperator,
LogicalOperator,
@@ -33,11 +33,16 @@ vi.mock('uuid', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: vi.fn(),
- useIsChatMode: vi.fn(),
- useWorkflow: vi.fn(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: vi.fn(),
+ useIsChatMode: vi.fn(),
+ useWorkflow: vi.fn(),
+ }
+})
vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', () => ({
useModelListAndDefaultModelAndCurrentProviderAndModel: vi.fn(),
diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts
index a95eac3d97f..c3d824e9000 100644
--- a/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts
+++ b/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts
@@ -9,7 +9,7 @@ import {
} from '@/app/components/header/account-setting/model-provider-page/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useDatasetsDetailStore } from '../../datasets-detail-store/store'
-import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
import { BlockEnum } from '../../types'
import useKnowledgeDatasetSelection from './hooks/use-knowledge-dataset-selection'
import useKnowledgeInputManager from './hooks/use-knowledge-input-manager'
diff --git a/web/app/components/workflow/nodes/list-operator/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/list-operator/__tests__/use-config.spec.tsx
index 8e7eda14cdb..3c96c472cd6 100644
--- a/web/app/components/workflow/nodes/list-operator/__tests__/use-config.spec.tsx
+++ b/web/app/components/workflow/nodes/list-operator/__tests__/use-config.spec.tsx
@@ -26,16 +26,29 @@ vi.mock('reactflow', async () => {
}
})
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({ nodesReadOnly: mockNodesReadOnly }),
- useIsChatMode: () => mockIsChatMode,
- useWorkflow: () => ({
- getBeforeNodesInSameBranch: (...args: unknown[]) => mockGetBeforeNodesInSameBranch(...args),
- }),
- useWorkflowVariables: () => ({
- getCurrentVariableType: (...args: unknown[]) => mockGetCurrentVariableType(...args),
- }),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({ nodesReadOnly: mockNodesReadOnly }),
+ useIsChatMode: () => mockIsChatMode,
+ useWorkflow: () => ({
+ getBeforeNodesInSameBranch: (...args: unknown[]) => mockGetBeforeNodesInSameBranch(...args),
+ }),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => ({
+ getCurrentVariableType: (...args: unknown[]) => mockGetCurrentVariableType(...args),
+ }),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
...createNodeCrudModuleMock(mockSetInputs),
diff --git a/web/app/components/workflow/nodes/list-operator/use-config.ts b/web/app/components/workflow/nodes/list-operator/use-config.ts
index ff3cca24095..f76bc047de8 100644
--- a/web/app/components/workflow/nodes/list-operator/use-config.ts
+++ b/web/app/components/workflow/nodes/list-operator/use-config.ts
@@ -2,13 +2,9 @@ import type { ValueSelector, Var } from '../../types'
import type { Condition, Limit, ListFilterNodeType, OrderBy } from './types'
import { useCallback, useMemo } from 'react'
import { useStoreApi } from 'reactflow'
-import {
- useIsChatMode,
- useNodesReadOnly,
- useWorkflow,
- useWorkflowVariables,
-} from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../hooks/use-workflow-variables'
import {
canFilterVariable,
getItemVarType,
diff --git a/web/app/components/workflow/nodes/llm/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/llm/__tests__/use-config.spec.ts
index a78753db44e..9cac2d3f5e7 100644
--- a/web/app/components/workflow/nodes/llm/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/llm/__tests__/use-config.spec.ts
@@ -2,30 +2,35 @@ import type { MutableRefObject } from 'react'
import type { LLMNodeType } from '../types'
import { act, renderHook, waitFor } from '@testing-library/react'
import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
-import { useIsChatMode, useNodesReadOnly } from '@/app/components/workflow/hooks'
-import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useStore } from '@/app/components/workflow/store'
import { BlockEnum } from '@/app/components/workflow/types'
import { AppModeEnum, Resolution } from '@/types/app'
import useConfigVision from '../../../hooks/use-config-vision'
+import useInspectVarsCrud from '../../../hooks/use-inspect-vars-crud'
+import { useIsChatMode, useNodesReadOnly } from '../../../hooks/use-workflow'
import useAvailableVarList from '../../_base/hooks/use-available-var-list'
import useLLMInputManager from '../hooks/use-llm-input-manager'
import useLLMPromptConfig from '../hooks/use-llm-prompt-config'
import useLLMStructuredOutputConfig from '../hooks/use-llm-structured-output-config'
import useConfig from '../use-config'
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: vi.fn(),
- useIsChatMode: vi.fn(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: vi.fn(),
+ useIsChatMode: vi.fn(),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
default: vi.fn(),
}))
-vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({
+vi.mock('../../../hooks/use-inspect-vars-crud', () => ({
__esModule: true,
default: vi.fn(),
}))
diff --git a/web/app/components/workflow/nodes/llm/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/llm/__tests__/use-single-run-form-params.spec.ts
index 6c305a53002..38c02d712f2 100644
--- a/web/app/components/workflow/nodes/llm/__tests__/use-single-run-form-params.spec.ts
+++ b/web/app/components/workflow/nodes/llm/__tests__/use-single-run-form-params.spec.ts
@@ -30,9 +30,14 @@ vi.mock('../../_base/hooks/use-node-crud', () => ({
default: vi.fn(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => true,
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => true,
+ }
+})
const mockFlowType = vi.hoisted(() => ({
value: undefined as FlowType | undefined,
diff --git a/web/app/components/workflow/nodes/llm/use-config.ts b/web/app/components/workflow/nodes/llm/use-config.ts
index 38ce1bef8f9..c748b8131f3 100644
--- a/web/app/components/workflow/nodes/llm/use-config.ts
+++ b/web/app/components/workflow/nodes/llm/use-config.ts
@@ -4,11 +4,11 @@ import { produce } from 'immer'
import { useCallback, useEffect, useState } from 'react'
import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
-import useInspectVarsCrud from '@/app/components/workflow/hooks/use-inspect-vars-crud'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { AppModeEnum } from '@/types/app'
-import { useIsChatMode, useNodesReadOnly } from '../../hooks'
import useConfigVision from '../../hooks/use-config-vision'
+import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud'
+import { useIsChatMode, useNodesReadOnly } from '../../hooks/use-workflow'
import { useStore } from '../../store'
import useAvailableVarList from '../_base/hooks/use-available-var-list'
import useLLMInputManager from './hooks/use-llm-input-manager'
diff --git a/web/app/components/workflow/nodes/llm/use-single-run-form-params.ts b/web/app/components/workflow/nodes/llm/use-single-run-form-params.ts
index b83dfc510dc..fb49995c3f8 100644
--- a/web/app/components/workflow/nodes/llm/use-single-run-form-params.ts
+++ b/web/app/components/workflow/nodes/llm/use-single-run-form-params.ts
@@ -9,8 +9,8 @@ import { useHooksStore } from '@/app/components/workflow/hooks-store/store'
import { InputVarType, VarType } from '@/app/components/workflow/types'
import { AppModeEnum } from '@/types/app'
import { FlowType } from '@/types/common'
-import { useIsChatMode } from '../../hooks'
import useConfigVision from '../../hooks/use-config-vision'
+import { useIsChatMode } from '../../hooks/use-workflow'
import { EditionType } from '../../types'
import useAvailableVarList from '../_base/hooks/use-available-var-list'
import useNodeCrud from '../_base/hooks/use-node-crud'
diff --git a/web/app/components/workflow/nodes/loop-start/__tests__/index.spec.tsx b/web/app/components/workflow/nodes/loop-start/__tests__/index.spec.tsx
index 61ed49ccc55..25506393cc7 100644
--- a/web/app/components/workflow/nodes/loop-start/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/nodes/loop-start/__tests__/index.spec.tsx
@@ -3,21 +3,35 @@ import type { CommonNodeType } from '@/app/components/workflow/types'
import { render, waitFor } from '@testing-library/react'
import { createNode } from '@/app/components/workflow/__tests__/fixtures'
import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env'
-import {
- useAvailableBlocks,
- useIsChatMode,
- useNodesInteractions,
- useNodesReadOnly,
-} from '@/app/components/workflow/hooks'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useAvailableBlocks } from '../../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../../hooks/use-nodes-interactions'
+import { useIsChatMode, useNodesReadOnly } from '../../../hooks/use-workflow'
import LoopStartNode, { LoopStartNodeDumb } from '../index'
-vi.mock('@/app/components/workflow/hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../../hooks/use-available-blocks', async (importOriginal) => {
+ const actual = await importOriginal()
+
return {
...actual,
useAvailableBlocks: vi.fn(),
+ }
+})
+
+vi.mock('../../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
useNodesInteractions: vi.fn(),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
useNodesReadOnly: vi.fn(),
useIsChatMode: vi.fn(),
}
diff --git a/web/app/components/workflow/nodes/loop/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/loop/__tests__/use-config.spec.tsx
index 6d85fa1aedd..84261702a96 100644
--- a/web/app/components/workflow/nodes/loop/__tests__/use-config.spec.tsx
+++ b/web/app/components/workflow/nodes/loop/__tests__/use-config.spec.tsx
@@ -34,13 +34,18 @@ vi.mock('@/service/use-tools', () => ({
useAllMCPTools: () => ({ data: [] }),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({ nodesReadOnly: false }),
- useIsChatMode: () => false,
- useWorkflow: () => ({
- getLoopNodeChildren: (...args: unknown[]) => mockGetLoopNodeChildren(...args),
- }),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({ nodesReadOnly: false }),
+ useIsChatMode: () => false,
+ useWorkflow: () => ({
+ getLoopNodeChildren: (...args: unknown[]) => mockGetLoopNodeChildren(...args),
+ }),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
...createNodeCrudModuleMock(mockSetInputs),
diff --git a/web/app/components/workflow/nodes/loop/__tests__/use-interactions.spec.tsx b/web/app/components/workflow/nodes/loop/__tests__/use-interactions.spec.tsx
index 37ba944daee..4cd69deffe7 100644
--- a/web/app/components/workflow/nodes/loop/__tests__/use-interactions.spec.tsx
+++ b/web/app/components/workflow/nodes/loop/__tests__/use-interactions.spec.tsx
@@ -22,17 +22,22 @@ vi.mock('reactflow', async () => {
}
})
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesMetaData: () => ({
- nodesMap: {
- [BlockEnum.Code]: {
- defaultValue: {
- title: 'Code',
+vi.mock('../../../hooks/use-nodes-meta-data', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesMetaData: () => ({
+ nodesMap: {
+ [BlockEnum.Code]: {
+ defaultValue: {
+ title: 'Code',
+ },
},
},
- },
- }),
-}))
+ }),
+ }
+})
vi.mock('@/app/components/workflow/utils', () => ({
generateNewNode: (...args: unknown[]) => mockGenerateNewNode(...args),
diff --git a/web/app/components/workflow/nodes/loop/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/loop/__tests__/use-single-run-form-params.spec.ts
index ba404f70527..bb69323d058 100644
--- a/web/app/components/workflow/nodes/loop/__tests__/use-single-run-form-params.spec.ts
+++ b/web/app/components/workflow/nodes/loop/__tests__/use-single-run-form-params.spec.ts
@@ -20,7 +20,7 @@ const mockGetNodeUsedVarPassToServerKey = vi.hoisted(() => vi.fn())
const mockGetNodeInfoById = vi.hoisted(() => vi.fn())
const mockIsSystemVar = vi.hoisted(() => vi.fn())
-vi.mock('../../../hooks', () => ({
+vi.mock('../../../hooks/use-workflow', () => ({
useIsNodeInLoop: (...args: unknown[]) => mockUseIsNodeInLoop(...args),
useWorkflow: () => mockUseWorkflow(),
}))
diff --git a/web/app/components/workflow/nodes/loop/add-block.tsx b/web/app/components/workflow/nodes/loop/add-block.tsx
index 565d8fd80b5..ae761cf741d 100644
--- a/web/app/components/workflow/nodes/loop/add-block.tsx
+++ b/web/app/components/workflow/nodes/loop/add-block.tsx
@@ -7,7 +7,9 @@ import { memo, useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import BlockSelector from '@/app/components/workflow/block-selector'
import { BlockEnum } from '@/app/components/workflow/types'
-import { useAvailableBlocks, useNodesInteractions, useNodesReadOnly } from '../../hooks'
+import { useAvailableBlocks } from '../../hooks/use-available-blocks'
+import { useNodesInteractions } from '../../hooks/use-nodes-interactions'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
type AddBlockProps = {
loopNodeId: string
diff --git a/web/app/components/workflow/nodes/loop/use-config.ts b/web/app/components/workflow/nodes/loop/use-config.ts
index b0f76f8232e..118e3095053 100644
--- a/web/app/components/workflow/nodes/loop/use-config.ts
+++ b/web/app/components/workflow/nodes/loop/use-config.ts
@@ -17,7 +17,7 @@ import {
useAllMCPTools,
useAllWorkflowTools,
} from '@/service/use-tools'
-import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
import { toNodeOutputVars } from '../_base/components/variable/utils'
import useNodeCrud from '../_base/hooks/use-node-crud'
import {
diff --git a/web/app/components/workflow/nodes/loop/use-interactions.ts b/web/app/components/workflow/nodes/loop/use-interactions.ts
index 214e9c7f9c1..aa728b62b3d 100644
--- a/web/app/components/workflow/nodes/loop/use-interactions.ts
+++ b/web/app/components/workflow/nodes/loop/use-interactions.ts
@@ -1,8 +1,8 @@
import type { BlockEnum, Node } from '../../types'
import { produce } from 'immer'
import { useCallback } from 'react'
-import { useNodesMetaData } from '@/app/components/workflow/hooks'
-import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow'
+import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow'
+import { useNodesMetaData } from '../../hooks/use-nodes-meta-data'
import { generateNewNode, getNodeCustomTypeByNodeDataType } from '../../utils'
import {
buildLoopChildCopy,
diff --git a/web/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts b/web/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts
index 7315cda65cd..c868e95db9d 100644
--- a/web/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts
+++ b/web/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts
@@ -1,6 +1,7 @@
import type { ValueSelector } from '../../types'
import { useMemo } from 'react'
-import { useIsChatMode, useWorkflow, useWorkflowVariables } from '../../hooks'
+import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../hooks/use-workflow-variables'
import { VarType } from '../../types'
type Params = {
diff --git a/web/app/components/workflow/nodes/loop/use-single-run-form-params.ts b/web/app/components/workflow/nodes/loop/use-single-run-form-params.ts
index c4fde98a70a..d38a202e1e4 100644
--- a/web/app/components/workflow/nodes/loop/use-single-run-form-params.ts
+++ b/web/app/components/workflow/nodes/loop/use-single-run-form-params.ts
@@ -5,7 +5,7 @@ import { useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import formatTracing from '@/app/components/workflow/run/utils/format-log'
import { ValueType } from '@/app/components/workflow/types'
-import { useIsNodeInLoop, useWorkflow } from '../../hooks'
+import { useIsNodeInLoop, useWorkflow } from '../../hooks/use-workflow'
import {
buildUsedOutVars,
createInputVarValues,
diff --git a/web/app/components/workflow/nodes/parameter-extractor/use-config.ts b/web/app/components/workflow/nodes/parameter-extractor/use-config.ts
index 2a0e6a64f7c..d79d6d79e4e 100644
--- a/web/app/components/workflow/nodes/parameter-extractor/use-config.ts
+++ b/web/app/components/workflow/nodes/parameter-extractor/use-config.ts
@@ -12,9 +12,9 @@ import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { AppModeEnum } from '@/types/app'
import { supportFunctionCall } from '@/utils/tool-call'
-import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks'
import useConfigVision from '../../hooks/use-config-vision'
import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
import { useStore } from '../../store'
import { ChangeType, VarType } from '../../types'
diff --git a/web/app/components/workflow/nodes/question-classifier/__tests__/integration.spec.tsx b/web/app/components/workflow/nodes/question-classifier/__tests__/integration.spec.tsx
index 7301a0a72b8..ac53a5a7d09 100644
--- a/web/app/components/workflow/nodes/question-classifier/__tests__/integration.spec.tsx
+++ b/web/app/components/workflow/nodes/question-classifier/__tests__/integration.spec.tsx
@@ -6,7 +6,7 @@ import userEvent from '@testing-library/user-event'
import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
import { renderWorkflowFlowComponent } from '@/app/components/workflow/__tests__/workflow-test-env'
import { BlockEnum, VarType } from '@/app/components/workflow/types'
-import { useEdgesInteractions } from '../../../hooks'
+import { useEdgesInteractions } from '../../../hooks/use-edges-interactions'
import AdvancedSetting from '../components/advanced-setting'
import ClassItem from '../components/class-item'
import ClassList from '../components/class-list'
@@ -43,8 +43,8 @@ vi.mock('../../_base/hooks/use-available-var-list', () => ({
})),
}))
-vi.mock('../../../hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../../hooks/use-edges-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
return {
...actual,
useEdgesInteractions: vi.fn(),
diff --git a/web/app/components/workflow/nodes/question-classifier/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/question-classifier/__tests__/use-config.spec.ts
index ad0ec634959..c27d5c336ed 100644
--- a/web/app/components/workflow/nodes/question-classifier/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/question-classifier/__tests__/use-config.spec.ts
@@ -1,21 +1,26 @@
import type { QuestionClassifierNodeType } from '../types'
import { act, renderHook, waitFor } from '@testing-library/react'
import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
-import { useIsChatMode, useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks'
-import useConfigVision from '@/app/components/workflow/hooks/use-config-vision'
import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useStore } from '@/app/components/workflow/store'
import { BlockEnum } from '@/app/components/workflow/types'
import { AppModeEnum } from '@/types/app'
import { FlowType } from '@/types/common'
+import useConfigVision from '../../../hooks/use-config-vision'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../../hooks/use-workflow'
import useConfig from '../use-config'
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: vi.fn(),
- useIsChatMode: vi.fn(),
- useWorkflow: vi.fn(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: vi.fn(),
+ useIsChatMode: vi.fn(),
+ useWorkflow: vi.fn(),
+ }
+})
vi.mock('reactflow', () => ({
useUpdateNodeInternals: vi.fn(() => vi.fn()),
@@ -47,7 +52,7 @@ vi.mock('@/app/components/workflow/hooks-store/store', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks/use-config-vision', () => ({
+vi.mock('../../../hooks/use-config-vision', () => ({
__esModule: true,
default: vi.fn(),
}))
diff --git a/web/app/components/workflow/nodes/question-classifier/components/__tests__/class-list.spec.tsx b/web/app/components/workflow/nodes/question-classifier/components/__tests__/class-list.spec.tsx
index 846a8faeb39..657a673ed07 100644
--- a/web/app/components/workflow/nodes/question-classifier/components/__tests__/class-list.spec.tsx
+++ b/web/app/components/workflow/nodes/question-classifier/components/__tests__/class-list.spec.tsx
@@ -1,7 +1,7 @@
import type { Topic } from '../../types'
import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
-import { useEdgesInteractions } from '../../../../hooks'
+import { useEdgesInteractions } from '../../../../hooks/use-edges-interactions'
import ClassList from '../class-list'
vi.mock('react-sortablejs', () => ({
@@ -9,8 +9,8 @@ vi.mock('react-sortablejs', () => ({
ReactSortable: ({ children }: { children: React.ReactNode }) => {children}
,
}))
-vi.mock('../../../../hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../../../hooks/use-edges-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
return {
...actual,
useEdgesInteractions: vi.fn(),
diff --git a/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx b/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx
index 6655e4908cc..151e946b671 100644
--- a/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx
+++ b/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx
@@ -11,7 +11,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { ReactSortable } from 'react-sortablejs'
import { ArrowDownRoundFill } from '@/app/components/base/icons/src/vender/solid/general'
-import { useEdgesInteractions } from '../../../hooks'
+import { useEdgesInteractions } from '../../../hooks/use-edges-interactions'
import AddButton from '../../_base/components/add-button'
import { useInlineLabelHintDismissed } from '../storage'
import Item from './class-item'
diff --git a/web/app/components/workflow/nodes/question-classifier/use-config.ts b/web/app/components/workflow/nodes/question-classifier/use-config.ts
index 074af92eed5..a2c8f9c2434 100644
--- a/web/app/components/workflow/nodes/question-classifier/use-config.ts
+++ b/web/app/components/workflow/nodes/question-classifier/use-config.ts
@@ -10,8 +10,8 @@ import { useHooksStore } from '@/app/components/workflow/hooks-store/store'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { AppModeEnum } from '@/types/app'
import { FlowType } from '@/types/common'
-import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks'
import useConfigVision from '../../hooks/use-config-vision'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
import { useStore } from '../../store'
import { BlockEnum, VarType } from '../../types'
import useAvailableVarList from '../_base/hooks/use-available-var-list'
diff --git a/web/app/components/workflow/nodes/start-placeholder/__tests__/panel.spec.tsx b/web/app/components/workflow/nodes/start-placeholder/__tests__/panel.spec.tsx
index 70b5ce390fe..28e5e04b630 100644
--- a/web/app/components/workflow/nodes/start-placeholder/__tests__/panel.spec.tsx
+++ b/web/app/components/workflow/nodes/start-placeholder/__tests__/panel.spec.tsx
@@ -34,9 +34,15 @@ vi.mock('@/app/components/workflow/block-selector/all-start-blocks', () => ({
),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useAutoGenerateWebhookUrl: () => mocks.autoGenerateWebhookUrl,
-}))
+vi.mock('../../../hooks/use-auto-generate-webhook-url', async (importOriginal) => {
+ const actual =
+ await importOriginal()
+
+ return {
+ ...actual,
+ useAutoGenerateWebhookUrl: () => mocks.autoGenerateWebhookUrl,
+ }
+})
vi.mock('@/app/components/workflow/hooks-store', () => ({
useHooksStore: (selector: (state: unknown) => unknown) =>
@@ -55,7 +61,7 @@ vi.mock('@/app/components/workflow/hooks-store', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({
+vi.mock('../../../hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
handleSyncWorkflowDraft: mocks.handleSyncWorkflowDraft,
}),
diff --git a/web/app/components/workflow/nodes/start-placeholder/panel.tsx b/web/app/components/workflow/nodes/start-placeholder/panel.tsx
index 0f775e60afa..5c396a48a3f 100644
--- a/web/app/components/workflow/nodes/start-placeholder/panel.tsx
+++ b/web/app/components/workflow/nodes/start-placeholder/panel.tsx
@@ -11,11 +11,11 @@ import { useTranslation } from 'react-i18next'
import { useStoreApi } from 'reactflow'
import SearchBox from '@/app/components/plugins/marketplace/search-box'
import AllStartBlocks from '@/app/components/workflow/block-selector/all-start-blocks'
-import { useAutoGenerateWebhookUrl } from '@/app/components/workflow/hooks'
import { useHooksStore } from '@/app/components/workflow/hooks-store'
-import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft'
import { useStore as useWorkflowStore } from '@/app/components/workflow/store'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useAutoGenerateWebhookUrl } from '../../hooks/use-auto-generate-webhook-url'
+import { useNodesSyncDraft } from '../../hooks/use-nodes-sync-draft'
const getTriggerPluginNodeData = (
triggerConfig: TriggerDefaultValue,
diff --git a/web/app/components/workflow/nodes/start/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/start/__tests__/use-config.spec.ts
index a615d551b42..27b0e224e80 100644
--- a/web/app/components/workflow/nodes/start/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/start/__tests__/use-config.spec.ts
@@ -17,18 +17,23 @@ vi.mock('react-i18next', () => ({
useTranslation: () => mockUseTranslation(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => mockUseNodesReadOnly(),
- useWorkflow: () => mockUseWorkflow(),
- useIsChatMode: () => mockUseIsChatMode(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => mockUseNodesReadOnly(),
+ useWorkflow: () => mockUseWorkflow(),
+ useIsChatMode: () => mockUseIsChatMode(),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
default: (...args: unknown[]) => mockUseNodeCrud(...args),
}))
-vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({
+vi.mock('../../../hooks/use-inspect-vars-crud', () => ({
__esModule: true,
default: (...args: unknown[]) => mockUseInspectVarsCrud(...args),
}))
diff --git a/web/app/components/workflow/nodes/start/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/start/__tests__/use-single-run-form-params.spec.ts
index 938a79a4226..b3f3d783c56 100644
--- a/web/app/components/workflow/nodes/start/__tests__/use-single-run-form-params.spec.ts
+++ b/web/app/components/workflow/nodes/start/__tests__/use-single-run-form-params.spec.ts
@@ -11,9 +11,14 @@ vi.mock('react-i18next', () => ({
useTranslation: () => mockUseTranslation(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useIsChatMode: () => mockUseIsChatMode(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useIsChatMode: () => mockUseIsChatMode(),
+ }
+})
const createPayload = (overrides: Partial = {}): StartNodeType => ({
title: 'Start',
diff --git a/web/app/components/workflow/nodes/start/use-config.ts b/web/app/components/workflow/nodes/start/use-config.ts
index 7dbbd012a86..1abbc48db7d 100644
--- a/web/app/components/workflow/nodes/start/use-config.ts
+++ b/web/app/components/workflow/nodes/start/use-config.ts
@@ -5,11 +5,11 @@ import { useBoolean } from 'ahooks'
import { produce } from 'immer'
import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { useIsChatMode, useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { ChangeType } from '@/app/components/workflow/types'
import { hasDuplicateStr } from '@/utils/var'
import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud'
+import { useIsChatMode, useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
const useConfig = (id: string, payload: StartNodeType) => {
const { t } = useTranslation()
diff --git a/web/app/components/workflow/nodes/start/use-single-run-form-params.ts b/web/app/components/workflow/nodes/start/use-single-run-form-params.ts
index 0bbef15ddef..5b94fec5a8f 100644
--- a/web/app/components/workflow/nodes/start/use-single-run-form-params.ts
+++ b/web/app/components/workflow/nodes/start/use-single-run-form-params.ts
@@ -4,7 +4,7 @@ import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/c
import type { InputVar, ValueSelector, Variable } from '@/app/components/workflow/types'
import { useTranslation } from 'react-i18next'
import { InputVarType } from '@/app/components/workflow/types'
-import { useIsChatMode } from '../../hooks'
+import { useIsChatMode } from '../../hooks/use-workflow'
type Params = {
id: string
diff --git a/web/app/components/workflow/nodes/template-transform/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/template-transform/__tests__/use-config.spec.ts
index a1cce3cd890..ab1bc9db52c 100644
--- a/web/app/components/workflow/nodes/template-transform/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/template-transform/__tests__/use-config.spec.ts
@@ -1,17 +1,22 @@
import type { TemplateTransformNodeType } from '../types'
import type { Variable } from '@/app/components/workflow/types'
import { renderHook, waitFor } from '@testing-library/react'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useStore } from '@/app/components/workflow/store'
import { BlockEnum, VarType } from '@/app/components/workflow/types'
+import { useNodesReadOnly } from '../../../hooks/use-workflow'
import useVarList from '../../_base/hooks/use-var-list'
import useConfig from '../use-config'
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: vi.fn(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: vi.fn(),
+ }
+})
vi.mock('@/app/components/workflow/store', () => ({
useStore: vi.fn(),
diff --git a/web/app/components/workflow/nodes/template-transform/use-config.ts b/web/app/components/workflow/nodes/template-transform/use-config.ts
index dd227abf76d..2b8c572fc93 100644
--- a/web/app/components/workflow/nodes/template-transform/use-config.ts
+++ b/web/app/components/workflow/nodes/template-transform/use-config.ts
@@ -2,9 +2,9 @@ import type { Var, Variable } from '../../types'
import type { TemplateTransformNodeType } from './types'
import { produce } from 'immer'
import { useCallback, useEffect, useRef } from 'react'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import { useStore } from '../../store'
import { VarType } from '../../types'
import useVarList from '../_base/hooks/use-var-list'
diff --git a/web/app/components/workflow/nodes/tool/__tests__/node.spec.tsx b/web/app/components/workflow/nodes/tool/__tests__/node.spec.tsx
index 6b411922922..896b72c9a66 100644
--- a/web/app/components/workflow/nodes/tool/__tests__/node.spec.tsx
+++ b/web/app/components/workflow/nodes/tool/__tests__/node.spec.tsx
@@ -7,7 +7,7 @@ import Node from '../node'
const mockUseNodePluginInstallation = vi.hoisted(() => vi.fn())
const mockUseCurrentToolCollection = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks/use-node-plugin-installation', () => ({
+vi.mock('../../../hooks/use-node-plugin-installation', () => ({
useNodePluginInstallation: mockUseNodePluginInstallation,
}))
diff --git a/web/app/components/workflow/nodes/tool/hooks/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/tool/hooks/__tests__/use-config.spec.tsx
index 6a83496c95b..7b26283adc0 100644
--- a/web/app/components/workflow/nodes/tool/hooks/__tests__/use-config.spec.tsx
+++ b/web/app/components/workflow/nodes/tool/hooks/__tests__/use-config.spec.tsx
@@ -15,9 +15,14 @@ vi.mock('@/app/components/header/account-setting/model-provider-page/hooks', ()
useLanguage: () => 'en_US',
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({ nodesReadOnly: false }),
-}))
+vi.mock('../../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({ nodesReadOnly: false }),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/tool/hooks/__tests__/use-single-run-form-params.spec.ts b/web/app/components/workflow/nodes/tool/hooks/__tests__/use-single-run-form-params.spec.ts
index 4621199c74e..bbf936925ee 100644
--- a/web/app/components/workflow/nodes/tool/hooks/__tests__/use-single-run-form-params.spec.ts
+++ b/web/app/components/workflow/nodes/tool/hooks/__tests__/use-single-run-form-params.spec.ts
@@ -10,9 +10,14 @@ const mockUseToolIcon = vi.hoisted(() => vi.fn())
const mockUseNodeCrud = vi.hoisted(() => vi.fn())
const mockFormatToTracingNodeList = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks', () => ({
- useToolIcon: (...args: unknown[]) => mockUseToolIcon(...args),
-}))
+vi.mock('../../../../hooks/use-tool-icon', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useToolIcon: (...args: unknown[]) => mockUseToolIcon(...args),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/tool/hooks/use-config.ts b/web/app/components/workflow/nodes/tool/hooks/use-config.ts
index c3657210a22..ebc9660c626 100644
--- a/web/app/components/workflow/nodes/tool/hooks/use-config.ts
+++ b/web/app/components/workflow/nodes/tool/hooks/use-config.ts
@@ -12,11 +12,11 @@ import {
getConfiguredValue,
toolParametersToFormSchemas,
} from '@/app/components/tools/utils/to-form-schema'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { updateBuiltInToolCredential } from '@/service/tools'
import { useInvalidToolsByType } from '@/service/use-tools'
+import { useNodesReadOnly } from '../../../hooks/use-workflow'
import { isToolAuthorizationRequired } from '../auth'
import { normalizeJsonSchemaType } from '../output-schema-utils'
import useCurrentToolCollection from './use-current-tool-collection'
diff --git a/web/app/components/workflow/nodes/tool/hooks/use-single-run-form-params.ts b/web/app/components/workflow/nodes/tool/hooks/use-single-run-form-params.ts
index 14d0111131d..c55e2872272 100644
--- a/web/app/components/workflow/nodes/tool/hooks/use-single-run-form-params.ts
+++ b/web/app/components/workflow/nodes/tool/hooks/use-single-run-form-params.ts
@@ -6,9 +6,9 @@ import type { NodeTracing } from '@/types/workflow'
import { produce } from 'immer'
import { useCallback, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { useToolIcon } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import formatToTracingNodeList from '@/app/components/workflow/run/utils/format-log'
+import { useToolIcon } from '../../../hooks/use-tool-icon'
import { VarType } from '../types'
type Params = {
diff --git a/web/app/components/workflow/nodes/tool/node.tsx b/web/app/components/workflow/nodes/tool/node.tsx
index b41b1a0f940..3d006020213 100644
--- a/web/app/components/workflow/nodes/tool/node.tsx
+++ b/web/app/components/workflow/nodes/tool/node.tsx
@@ -4,8 +4,8 @@ import type { NodeProps } from '@/app/components/workflow/types'
import * as React from 'react'
import { useTranslation } from 'react-i18next'
import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
-import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation'
import { InstallPluginButton } from '@/app/components/workflow/nodes/_base/components/install-plugin-button'
+import { useNodePluginInstallation } from '../../hooks/use-node-plugin-installation'
import { isToolAuthorizationRequired } from './auth'
import useCurrentToolCollection from './hooks/use-current-tool-collection'
diff --git a/web/app/components/workflow/nodes/trigger-plugin/node.tsx b/web/app/components/workflow/nodes/trigger-plugin/node.tsx
index d87b0f46453..d6c0fb01787 100644
--- a/web/app/components/workflow/nodes/trigger-plugin/node.tsx
+++ b/web/app/components/workflow/nodes/trigger-plugin/node.tsx
@@ -5,8 +5,8 @@ import * as React from 'react'
import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import NodeStatus, { NodeStatusEnum } from '@/app/components/base/node-status'
-import { useNodePluginInstallation } from '@/app/components/workflow/hooks/use-node-plugin-installation'
import { InstallPluginButton } from '@/app/components/workflow/nodes/_base/components/install-plugin-button'
+import { useNodePluginInstallation } from '../../hooks/use-node-plugin-installation'
import useConfig from './use-config'
const formatConfigValue = (rawValue: any): string => {
diff --git a/web/app/components/workflow/nodes/trigger-plugin/use-config.ts b/web/app/components/workflow/nodes/trigger-plugin/use-config.ts
index 5627e7b1b30..1e24c6e2921 100644
--- a/web/app/components/workflow/nodes/trigger-plugin/use-config.ts
+++ b/web/app/components/workflow/nodes/trigger-plugin/use-config.ts
@@ -8,9 +8,9 @@ import {
getConfiguredValue,
toolParametersToFormSchemas,
} from '@/app/components/tools/utils/to-form-schema'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useAllTriggerPlugins, useTriggerSubscriptions } from '@/service/use-triggers'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import { VarKindType } from '../_base/types'
const normalizeEventParameters = (
diff --git a/web/app/components/workflow/nodes/trigger-schedule/__tests__/use-config.spec.ts b/web/app/components/workflow/nodes/trigger-schedule/__tests__/use-config.spec.ts
index 783b4276f7d..5498c8c3488 100644
--- a/web/app/components/workflow/nodes/trigger-schedule/__tests__/use-config.spec.ts
+++ b/web/app/components/workflow/nodes/trigger-schedule/__tests__/use-config.spec.ts
@@ -1,16 +1,21 @@
import type { ScheduleTriggerNodeType } from '../types'
import { renderHook } from '@testing-library/react'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { createAccountProfileQueryWrapper } from '@/test/console/account-profile'
+import { useNodesReadOnly } from '../../../hooks/use-workflow'
import { BlockEnum } from '../../../types'
import useConfig from '../use-config'
const mockConsoleStateReader = vi.hoisted(() => vi.fn())
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: vi.fn(),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: vi.fn(),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/nodes/trigger-schedule/use-config.ts b/web/app/components/workflow/nodes/trigger-schedule/use-config.ts
index dbd8a853001..accfa526a11 100644
--- a/web/app/components/workflow/nodes/trigger-schedule/use-config.ts
+++ b/web/app/components/workflow/nodes/trigger-schedule/use-config.ts
@@ -1,9 +1,9 @@
import type { ScheduleFrequency, ScheduleMode, ScheduleTriggerNodeType } from './types'
import { useQuery } from '@tanstack/react-query'
import { useCallback, useMemo } from 'react'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { userProfileQueryOptions } from '@/features/account-profile/client'
+import { useNodesReadOnly } from '../../hooks/use-workflow'
import { getDefaultVisualConfig } from './constants'
const useConfig = (id: string, payload: ScheduleTriggerNodeType) => {
diff --git a/web/app/components/workflow/nodes/trigger-webhook/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/trigger-webhook/__tests__/use-config.spec.tsx
index ec7f7288ca5..3cf1530b045 100644
--- a/web/app/components/workflow/nodes/trigger-webhook/__tests__/use-config.spec.tsx
+++ b/web/app/components/workflow/nodes/trigger-webhook/__tests__/use-config.spec.tsx
@@ -28,13 +28,18 @@ vi.mock('@langgenius/dify-ui/toast', () => ({
},
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => mockUseNodesReadOnly(),
- useWorkflow: () => ({
- isVarUsedInNodes: (...args: unknown[]) => mockIsVarUsedInNodes(...args),
- removeUsedVarInNodes: (...args: unknown[]) => mockRemoveUsedVarInNodes(...args),
- }),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => mockUseNodesReadOnly(),
+ useWorkflow: () => ({
+ isVarUsedInNodes: (...args: unknown[]) => mockIsVarUsedInNodes(...args),
+ removeUsedVarInNodes: (...args: unknown[]) => mockRemoveUsedVarInNodes(...args),
+ }),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
...createNodeCrudModuleMock(mockSetInputs),
diff --git a/web/app/components/workflow/nodes/trigger-webhook/use-config.ts b/web/app/components/workflow/nodes/trigger-webhook/use-config.ts
index 10ef38ecd1e..a87e165a5d6 100644
--- a/web/app/components/workflow/nodes/trigger-webhook/use-config.ts
+++ b/web/app/components/workflow/nodes/trigger-webhook/use-config.ts
@@ -4,9 +4,9 @@ import { toast } from '@langgenius/dify-ui/toast'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import { useStore as useAppStore } from '@/app/components/app/store'
-import { useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { fetchWebhookUrl } from '@/service/apps'
+import { useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
import {
updateContentType,
updateMethod,
diff --git a/web/app/components/workflow/nodes/variable-assigner/__tests__/hooks.spec.ts b/web/app/components/workflow/nodes/variable-assigner/__tests__/hooks.spec.ts
index a635389c0fc..2a2cd77df0f 100644
--- a/web/app/components/workflow/nodes/variable-assigner/__tests__/hooks.spec.ts
+++ b/web/app/components/workflow/nodes/variable-assigner/__tests__/hooks.spec.ts
@@ -19,12 +19,33 @@ vi.mock('reactflow', () => ({
useNodes: () => mockUseNodes(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodeDataUpdate: () => mockUseNodeDataUpdate(),
- useWorkflow: () => mockUseWorkflow(),
- useWorkflowVariables: () => mockUseWorkflowVariables(),
- useIsChatMode: () => mockUseIsChatMode(),
-}))
+vi.mock('../../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodeDataUpdate: () => mockUseNodeDataUpdate(),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflow: () => mockUseWorkflow(),
+ useIsChatMode: () => mockUseIsChatMode(),
+ }
+})
+
+vi.mock('../../../hooks/use-workflow-variables', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowVariables: () => mockUseWorkflowVariables(),
+ }
+})
vi.mock('@/app/components/workflow/store', () => ({
useWorkflowStore: () => mockUseWorkflowStore(),
diff --git a/web/app/components/workflow/nodes/variable-assigner/__tests__/use-config.spec.tsx b/web/app/components/workflow/nodes/variable-assigner/__tests__/use-config.spec.tsx
index 467f8040036..c795ba8bcaf 100644
--- a/web/app/components/workflow/nodes/variable-assigner/__tests__/use-config.spec.tsx
+++ b/web/app/components/workflow/nodes/variable-assigner/__tests__/use-config.spec.tsx
@@ -40,20 +40,25 @@ vi.mock('ahooks', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({ nodesReadOnly: false }),
- useWorkflow: () => ({
- handleOutVarRenameChange: (...args: unknown[]) => mockHandleOutVarRenameChange(...args),
- isVarUsedInNodes: (...args: unknown[]) => mockIsVarUsedInNodes(...args),
- removeUsedVarInNodes: (...args: unknown[]) => mockRemoveUsedVarInNodes(...args),
- }),
-}))
+vi.mock('../../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({ nodesReadOnly: false }),
+ useWorkflow: () => ({
+ handleOutVarRenameChange: (...args: unknown[]) => mockHandleOutVarRenameChange(...args),
+ isVarUsedInNodes: (...args: unknown[]) => mockIsVarUsedInNodes(...args),
+ removeUsedVarInNodes: (...args: unknown[]) => mockRemoveUsedVarInNodes(...args),
+ }),
+ }
+})
vi.mock('@/app/components/workflow/nodes/_base/hooks/use-node-crud', () => ({
...createNodeCrudModuleMock(mockSetInputs),
}))
-vi.mock('@/app/components/workflow/hooks/use-inspect-vars-crud', () => ({
+vi.mock('../../../hooks/use-inspect-vars-crud', () => ({
__esModule: true,
default: () => ({
deleteNodeInspectorVars: (...args: unknown[]) => mockDeleteNodeInspectorVars(...args),
diff --git a/web/app/components/workflow/nodes/variable-assigner/hooks.ts b/web/app/components/workflow/nodes/variable-assigner/hooks.ts
index a4dde1bf183..9ebcee4d8a7 100644
--- a/web/app/components/workflow/nodes/variable-assigner/hooks.ts
+++ b/web/app/components/workflow/nodes/variable-assigner/hooks.ts
@@ -5,8 +5,10 @@ import { produce } from 'immer'
import { useCallback } from 'react'
import { useNodes, useStoreApi } from 'reactflow'
import { FlowType } from '@/types/common'
-import { useIsChatMode, useNodeDataUpdate, useWorkflow, useWorkflowVariables } from '../../hooks'
import { useHooksStore } from '../../hooks-store/store'
+import { useNodeDataUpdate } from '../../hooks/use-node-data-update'
+import { useIsChatMode, useWorkflow } from '../../hooks/use-workflow'
+import { useWorkflowVariables } from '../../hooks/use-workflow-variables'
import { useWorkflowStore } from '../../store'
import { filterSnippetSystemVars, isSnippetCanvas } from '../_base/hooks/snippet-input-field-vars'
diff --git a/web/app/components/workflow/nodes/variable-assigner/use-config.ts b/web/app/components/workflow/nodes/variable-assigner/use-config.ts
index e535d9c453d..749c477aa0f 100644
--- a/web/app/components/workflow/nodes/variable-assigner/use-config.ts
+++ b/web/app/components/workflow/nodes/variable-assigner/use-config.ts
@@ -2,9 +2,9 @@ import type { ValueSelector } from '../../types'
import type { VarGroupItem, VariableAssignerNodeType } from './types'
import { useBoolean, useDebounceFn } from 'ahooks'
import { useCallback, useRef, useState } from 'react'
-import { useNodesReadOnly, useWorkflow } from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud'
+import { useNodesReadOnly, useWorkflow } from '../../hooks/use-workflow'
import { useGetAvailableVars } from './hooks'
import {
addGroup,
diff --git a/web/app/components/workflow/note-node/__tests__/hooks.spec.tsx b/web/app/components/workflow/note-node/__tests__/hooks.spec.tsx
index f31e5502849..478a93ab9d6 100644
--- a/web/app/components/workflow/note-node/__tests__/hooks.spec.tsx
+++ b/web/app/components/workflow/note-node/__tests__/hooks.spec.tsx
@@ -5,10 +5,13 @@ import { useNote } from '../hooks'
const mockHandleNodeDataUpdateWithSyncDraft = vi.hoisted(() => vi.fn())
const mockSaveStateToHistory = vi.hoisted(() => vi.fn())
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-node-data-update', () => ({
useNodeDataUpdate: () => ({
handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft,
}),
+}))
+
+vi.mock('../../hooks/use-workflow-history', () => ({
useWorkflowHistory: () => ({
saveStateToHistory: mockSaveStateToHistory,
}),
diff --git a/web/app/components/workflow/note-node/__tests__/index.spec.tsx b/web/app/components/workflow/note-node/__tests__/index.spec.tsx
index 9f501b63435..083bbeaa863 100644
--- a/web/app/components/workflow/note-node/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/note-node/__tests__/index.spec.tsx
@@ -24,13 +24,20 @@ const {
mockHandleThemeChange: vi.fn(),
}))
-vi.mock('../../hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../hooks/use-node-data-update', async (importOriginal) => {
+ const actual = await importOriginal()
return {
...actual,
useNodeDataUpdate: () => ({
handleNodeDataUpdateWithSyncDraft: mockHandleNodeDataUpdateWithSyncDraft,
}),
+ }
+})
+
+vi.mock('../../hooks/use-nodes-interactions', async (importOriginal) => {
+ const actual = await importOriginal()
+ return {
+ ...actual,
useNodesInteractions: () => ({
handleNodesCopy: mockHandleNodesCopy,
handleNodesDuplicate: mockHandleNodesDuplicate,
diff --git a/web/app/components/workflow/note-node/hooks.ts b/web/app/components/workflow/note-node/hooks.ts
index 602a57ef5c0..7daa2ddbd88 100644
--- a/web/app/components/workflow/note-node/hooks.ts
+++ b/web/app/components/workflow/note-node/hooks.ts
@@ -1,7 +1,8 @@
import type { EditorState } from 'lexical'
import type { NoteTheme } from './types'
import { useCallback } from 'react'
-import { useNodeDataUpdate, useWorkflowHistory, WorkflowHistoryEvent } from '../hooks'
+import { useNodeDataUpdate } from '../hooks/use-node-data-update'
+import { useWorkflowHistory, WorkflowHistoryEvent } from '../hooks/use-workflow-history'
import { useSetWorkflowNoteShowAuthor } from '../persistence/local-storage-options'
export const useNote = (id: string) => {
diff --git a/web/app/components/workflow/note-node/index.tsx b/web/app/components/workflow/note-node/index.tsx
index 411a182a980..31a8c2b3d22 100644
--- a/web/app/components/workflow/note-node/index.tsx
+++ b/web/app/components/workflow/note-node/index.tsx
@@ -4,7 +4,8 @@ import { cn } from '@langgenius/dify-ui/cn'
import { useClickAway } from 'ahooks'
import { memo, useRef } from 'react'
import { useTranslation } from 'react-i18next'
-import { useNodeDataUpdate, useNodesInteractions } from '../hooks'
+import { useNodeDataUpdate } from '../hooks/use-node-data-update'
+import { useNodesInteractions } from '../hooks/use-nodes-interactions'
import NodeResizer from '../nodes/_base/components/node-resizer'
import { useStore } from '../store/workflow'
import { THEME_MAP } from './constants'
diff --git a/web/app/components/workflow/operator/__tests__/add-block.spec.tsx b/web/app/components/workflow/operator/__tests__/add-block.spec.tsx
index fe9f03bda31..29b08a4c0b9 100644
--- a/web/app/components/workflow/operator/__tests__/add-block.spec.tsx
+++ b/web/app/components/workflow/operator/__tests__/add-block.spec.tsx
@@ -88,17 +88,26 @@ vi.mock('@/app/components/workflow/block-selector', () => ({
},
}))
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-available-blocks', () => ({
useAvailableBlocks: () => ({
availableNextBlocks: mockAvailableNextBlocks,
}),
+}))
+
+vi.mock('../../hooks/use-workflow', () => ({
useIsChatMode: () => mockIsChatMode,
- useNodesMetaData: () => ({
- nodesMap: mockNodesMetaDataMap,
- }),
useNodesReadOnly: () => ({
nodesReadOnly: mockNodesReadOnly,
}),
+}))
+
+vi.mock('../../hooks/use-nodes-meta-data', () => ({
+ useNodesMetaData: () => ({
+ nodesMap: mockNodesMetaDataMap,
+ }),
+}))
+
+vi.mock('../../hooks/use-panel-interactions', () => ({
usePanelInteractions: () => ({
handlePaneContextmenuCancel: mockHandlePaneContextmenuCancel,
}),
diff --git a/web/app/components/workflow/operator/__tests__/control.spec.tsx b/web/app/components/workflow/operator/__tests__/control.spec.tsx
index 8a92d57e6ee..1b6c7bc272a 100644
--- a/web/app/components/workflow/operator/__tests__/control.spec.tsx
+++ b/web/app/components/workflow/operator/__tests__/control.spec.tsx
@@ -27,11 +27,14 @@ let mockCanUseCommentMode = true
let mockIsCommentModeAvailable = true
let mockStoreState: WorkflowStoreState
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-workflow', () => ({
useNodesReadOnly: () => ({
nodesReadOnly: mockNodesReadOnly,
getNodesReadOnly: () => mockNodesReadOnly,
}),
+}))
+
+vi.mock('../../hooks/use-workflow-panel-interactions', () => ({
useWorkflowMoveMode: () => ({
handleModePointer: mockHandleModePointer,
handleModeHand: mockHandleModeHand,
@@ -39,6 +42,9 @@ vi.mock('../../hooks', () => ({
isCommentModeAvailable: mockIsCommentModeAvailable,
canUseCommentMode: mockCanUseCommentMode,
}),
+}))
+
+vi.mock('../../hooks/use-workflow-organize', () => ({
useWorkflowOrganize: () => ({
handleLayout: mockHandleLayout,
}),
diff --git a/web/app/components/workflow/operator/__tests__/index.spec.tsx b/web/app/components/workflow/operator/__tests__/index.spec.tsx
index bb045b63712..adb109b4cd8 100644
--- a/web/app/components/workflow/operator/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/operator/__tests__/index.spec.tsx
@@ -7,13 +7,20 @@ import Operator from '../index'
const mockEmit = vi.fn()
const mockDeleteAllInspectorVars = vi.fn()
-vi.mock('../../hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../hooks/use-nodes-sync-draft', async (importOriginal) => {
+ const actual = await importOriginal()
return {
...actual,
useNodesSyncDraft: () => ({
handleSyncWorkflowDraft: vi.fn(),
}),
+ }
+})
+
+vi.mock('../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+ return {
+ ...actual,
useWorkflowReadOnly: () => ({
workflowReadOnly: false,
getWorkflowReadOnly: () => false,
diff --git a/web/app/components/workflow/operator/__tests__/more-actions.spec.tsx b/web/app/components/workflow/operator/__tests__/more-actions.spec.tsx
index a31c6afd4a8..48e40bd4c71 100644
--- a/web/app/components/workflow/operator/__tests__/more-actions.spec.tsx
+++ b/web/app/components/workflow/operator/__tests__/more-actions.spec.tsx
@@ -135,11 +135,16 @@ vi.mock('@/app/components/workflow/store', () => ({
useStore: (selector: (state: typeof mockWorkflowState) => unknown) => selector(mockWorkflowState),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({
- getNodesReadOnly: mockGetNodesReadOnly,
- }),
-}))
+vi.mock('../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({
+ getNodesReadOnly: mockGetNodesReadOnly,
+ }),
+ }
+})
vi.mock('@/utils/download', () => ({
downloadUrl: (...args: unknown[]) => mockDownloadUrl(...args),
diff --git a/web/app/components/workflow/operator/__tests__/zoom-in-out.spec.tsx b/web/app/components/workflow/operator/__tests__/zoom-in-out.spec.tsx
index c0f2f112616..5c77e7e091b 100644
--- a/web/app/components/workflow/operator/__tests__/zoom-in-out.spec.tsx
+++ b/web/app/components/workflow/operator/__tests__/zoom-in-out.spec.tsx
@@ -37,15 +37,28 @@ vi.mock('reactflow', () => ({
useViewport: () => mockViewport,
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesSyncDraft: () => ({
- handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft,
- }),
- useWorkflowReadOnly: () => ({
- workflowReadOnly,
- getWorkflowReadOnly: () => workflowReadOnly,
- }),
-}))
+vi.mock('../../hooks/use-nodes-sync-draft', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesSyncDraft: () => ({
+ handleSyncWorkflowDraft: mockHandleSyncWorkflowDraft,
+ }),
+ }
+})
+
+vi.mock('../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowReadOnly: () => ({
+ workflowReadOnly,
+ getWorkflowReadOnly: () => workflowReadOnly,
+ }),
+ }
+})
vi.mock('../tip-popup', () => ({
default: ({ children }: { children: React.ReactNode }) => <>{children}>,
diff --git a/web/app/components/workflow/operator/add-block.tsx b/web/app/components/workflow/operator/add-block.tsx
index 2f589b01cda..171f095b865 100644
--- a/web/app/components/workflow/operator/add-block.tsx
+++ b/web/app/components/workflow/operator/add-block.tsx
@@ -9,14 +9,11 @@ import { useStoreApi } from 'reactflow'
import BlockSelector from '@/app/components/workflow/block-selector'
import { BlockEnum } from '@/app/components/workflow/types'
import { FlowType } from '@/types/common'
-import {
- useAvailableBlocks,
- useIsChatMode,
- useNodesMetaData,
- useNodesReadOnly,
- usePanelInteractions,
-} from '../hooks'
import { useHooksStore } from '../hooks-store'
+import { useAvailableBlocks } from '../hooks/use-available-blocks'
+import { useNodesMetaData } from '../hooks/use-nodes-meta-data'
+import { usePanelInteractions } from '../hooks/use-panel-interactions'
+import { useIsChatMode, useNodesReadOnly } from '../hooks/use-workflow'
import { useWorkflowStore } from '../store'
import {
generateNewNode,
diff --git a/web/app/components/workflow/operator/control.tsx b/web/app/components/workflow/operator/control.tsx
index 1fdbaf976ab..757f841847b 100644
--- a/web/app/components/workflow/operator/control.tsx
+++ b/web/app/components/workflow/operator/control.tsx
@@ -4,7 +4,9 @@ import { cn } from '@langgenius/dify-ui/cn'
import { memo } from 'react'
import { useTranslation } from 'react-i18next'
import Divider from '../../base/divider'
-import { useNodesReadOnly, useWorkflowMoveMode, useWorkflowOrganize } from '../hooks'
+import { useNodesReadOnly } from '../hooks/use-workflow'
+import { useWorkflowOrganize } from '../hooks/use-workflow-organize'
+import { useWorkflowMoveMode } from '../hooks/use-workflow-panel-interactions'
import { useStore } from '../store'
import { ControlMode } from '../types'
import AddBlock from './add-block'
diff --git a/web/app/components/workflow/operator/more-actions.tsx b/web/app/components/workflow/operator/more-actions.tsx
index f902fa46d36..2ae242fbbb9 100644
--- a/web/app/components/workflow/operator/more-actions.tsx
+++ b/web/app/components/workflow/operator/more-actions.tsx
@@ -14,7 +14,7 @@ import { getNodesBounds, useReactFlow } from 'reactflow'
import ImagePreview from '@/app/components/base/image-uploader/image-preview'
import { useStore } from '@/app/components/workflow/store'
import { downloadUrl } from '@/utils/download'
-import { useNodesReadOnly } from '../hooks'
+import { useNodesReadOnly } from '../hooks/use-workflow'
import TipPopup from './tip-popup'
function MoreActions() {
diff --git a/web/app/components/workflow/operator/zoom-in-out.tsx b/web/app/components/workflow/operator/zoom-in-out.tsx
index 6fa10732f67..c07427714d5 100644
--- a/web/app/components/workflow/operator/zoom-in-out.tsx
+++ b/web/app/components/workflow/operator/zoom-in-out.tsx
@@ -11,7 +11,8 @@ import { Fragment, memo } from 'react'
import { useTranslation } from 'react-i18next'
import { useReactFlow, useViewport } from 'reactflow'
import { systemFeaturesQueryOptions } from '@/features/system-features/client'
-import { useNodesSyncDraft, useWorkflowReadOnly } from '../hooks'
+import { useNodesSyncDraft } from '../hooks/use-nodes-sync-draft'
+import { useWorkflowReadOnly } from '../hooks/use-workflow'
import { ShortcutKbd } from '../shortcuts/shortcut-kbd'
import TipPopup from './tip-popup'
diff --git a/web/app/components/workflow/panel-contextmenu.tsx b/web/app/components/workflow/panel-contextmenu.tsx
index 74564c6eafb..9ea0141a75d 100644
--- a/web/app/components/workflow/panel-contextmenu.tsx
+++ b/web/app/components/workflow/panel-contextmenu.tsx
@@ -8,14 +8,12 @@ import {
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import { FlowType } from '@/types/common'
-import {
- useDSL,
- useIsChatMode,
- useNodesInteractions,
- useWorkflowMoveMode,
- useWorkflowStartRun,
-} from './hooks'
import { useHooksStore } from './hooks-store'
+import { useDSL } from './hooks/use-DSL'
+import { useNodesInteractions } from './hooks/use-nodes-interactions'
+import { useIsChatMode } from './hooks/use-workflow'
+import { useWorkflowMoveMode } from './hooks/use-workflow-panel-interactions'
+import { useWorkflowStartRun } from './hooks/use-workflow-start-run'
import { TEST_RUN_MENU_HOTKEY } from './hotkeys'
import { isSnippetCanvas } from './nodes/_base/hooks/snippet-input-field-vars'
import AddBlock from './operator/add-block'
diff --git a/web/app/components/workflow/panel/__tests__/record.spec.tsx b/web/app/components/workflow/panel/__tests__/record.spec.tsx
index 04edb0e2196..37d88ed3e0e 100644
--- a/web/app/components/workflow/panel/__tests__/record.spec.tsx
+++ b/web/app/components/workflow/panel/__tests__/record.spec.tsx
@@ -11,11 +11,16 @@ const mockFormatWorkflowRunIdentifier = vi.fn((finishedAt?: number) =>
let latestGetResultCallback: ((res: WorkflowRunDetailResponse) => void) | undefined
-vi.mock('@/app/components/workflow/hooks', () => ({
- useWorkflowUpdate: () => ({
- handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas,
- }),
-}))
+vi.mock('../../hooks/use-workflow-update', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowUpdate: () => ({
+ handleUpdateWorkflowCanvas: mockHandleUpdateWorkflowCanvas,
+ }),
+ }
+})
vi.mock('@/app/components/workflow/run', () => ({
default: ({
diff --git a/web/app/components/workflow/panel/__tests__/workflow-preview.spec.tsx b/web/app/components/workflow/panel/__tests__/workflow-preview.spec.tsx
index 78ac2309b6f..b13fa7ee6da 100644
--- a/web/app/components/workflow/panel/__tests__/workflow-preview.spec.tsx
+++ b/web/app/components/workflow/panel/__tests__/workflow-preview.spec.tsx
@@ -30,11 +30,17 @@ vi.mock('@/service/workflow', () => ({
submitHumanInputForm: vi.fn(),
}))
-vi.mock('@/app/components/workflow/hooks', () => ({
- useWorkflowInteractions: () => ({
- handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel,
- }),
-}))
+vi.mock('../../hooks/use-workflow-panel-interactions', async (importOriginal) => {
+ const actual =
+ await importOriginal()
+
+ return {
+ ...actual,
+ useWorkflowInteractions: () => ({
+ handleCancelDebugAndPreviewPanel: mockHandleCancelDebugAndPreviewPanel,
+ }),
+ }
+})
vi.mock('@/app/components/workflow/run/result-panel', () => ({
default: ({ status, onOpenTracingTab }: { status?: string; onOpenTracingTab?: () => void }) => (
diff --git a/web/app/components/workflow/panel/chat-record/index.tsx b/web/app/components/workflow/panel/chat-record/index.tsx
index be892c72db6..0d1d92fc371 100644
--- a/web/app/components/workflow/panel/chat-record/index.tsx
+++ b/web/app/components/workflow/panel/chat-record/index.tsx
@@ -8,7 +8,7 @@ import { buildChatItemTree, getThreadMessages } from '@/app/components/base/chat
import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils'
import Loading from '@/app/components/base/loading'
import { fetchConversationMessages } from '@/service/debug'
-import { useWorkflowRun } from '../../hooks'
+import { useWorkflowRun } from '../../hooks/use-workflow-run'
import { useStore, useWorkflowStore } from '../../store'
import { formatWorkflowRunIdentifier } from '../../utils'
import UserInput from './user-input'
diff --git a/web/app/components/workflow/panel/chat-variable-panel/index.tsx b/web/app/components/workflow/panel/chat-variable-panel/index.tsx
index 599b3159fc6..e22e0198899 100644
--- a/web/app/components/workflow/panel/chat-variable-panel/index.tsx
+++ b/web/app/components/workflow/panel/chat-variable-panel/index.tsx
@@ -11,7 +11,6 @@ import {
} from '@/app/components/base/icons/src/vender/line/others'
import BlockIcon from '@/app/components/workflow/block-icon'
import { webSocketClient } from '@/app/components/workflow/collaboration/core/websocket-manager'
-import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow'
import RemoveEffectVarConfirm from '@/app/components/workflow/nodes/_base/components/remove-effect-var-confirm'
import {
findUsedVarNodes,
@@ -22,6 +21,7 @@ import VariableModalTrigger from '@/app/components/workflow/panel/chat-variable-
import { useStore } from '@/app/components/workflow/store'
import { BlockEnum } from '@/app/components/workflow/types'
import { updateConversationVariables } from '@/service/workflow'
+import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow'
import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud'
const ChatVariablePanel = () => {
diff --git a/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx
index 3ac8345f50c..fbd7286f182 100644
--- a/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/panel/comments-panel/__tests__/index.spec.tsx
@@ -81,7 +81,7 @@ vi.mock('@/app/components/workflow/store', () => ({
}),
}))
-vi.mock('@/app/components/workflow/hooks/use-workflow-comment', () => ({
+vi.mock('../../../hooks/use-workflow-comment', () => ({
useWorkflowComment: () => ({
comments: commentFixtures,
loading: false,
diff --git a/web/app/components/workflow/panel/comments-panel/index.tsx b/web/app/components/workflow/panel/comments-panel/index.tsx
index 5be4f6eaf57..b237effb736 100644
--- a/web/app/components/workflow/panel/comments-panel/index.tsx
+++ b/web/app/components/workflow/panel/comments-panel/index.tsx
@@ -13,11 +13,11 @@ import { memo, useCallback, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import Divider from '@/app/components/base/divider'
import { UserAvatarList } from '@/app/components/base/user-avatar-list'
-import { useWorkflowComment } from '@/app/components/workflow/hooks/use-workflow-comment'
import { useStore } from '@/app/components/workflow/store'
import { ControlMode } from '@/app/components/workflow/types'
import { userProfileIdAtom } from '@/context/account-state'
import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now'
+import { useWorkflowComment } from '../../hooks/use-workflow-comment'
const CommentsPanel = () => {
const { t } = useTranslation()
diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks.spec.ts
index a6dbda9e4a8..870188d243d 100644
--- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks.spec.ts
+++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks.spec.ts
@@ -45,8 +45,11 @@ vi.mock('reactflow', () => ({
}),
}))
-vi.mock('../../../hooks', () => ({
+vi.mock('../../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({ handleRun: mockHandleRun }),
+}))
+
+vi.mock('../../../hooks/use-set-workflow-vars-with-value', () => ({
useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }),
}))
diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-resume.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-resume.spec.ts
index f680189e937..1809a7f79a1 100644
--- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-resume.spec.ts
+++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-resume.spec.ts
@@ -44,8 +44,11 @@ vi.mock('reactflow', () => ({
}),
}))
-vi.mock('../../../../hooks', () => ({
+vi.mock('../../../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({ handleRun: mockHandleRun }),
+}))
+
+vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({
useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }),
}))
diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-send.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-send.spec.ts
index c594a0a511b..e8215fc0320 100644
--- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-send.spec.ts
+++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-send.spec.ts
@@ -46,8 +46,11 @@ vi.mock('reactflow', () => ({
}),
}))
-vi.mock('../../../../hooks', () => ({
+vi.mock('../../../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({ handleRun: mockHandleRun }),
+}))
+
+vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({
useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }),
}))
diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-stop-restart.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-stop-restart.spec.ts
index 8a44eb4936f..8027d92b393 100644
--- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-stop-restart.spec.ts
+++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/handle-stop-restart.spec.ts
@@ -44,8 +44,11 @@ vi.mock('reactflow', () => ({
}),
}))
-vi.mock('../../../../hooks', () => ({
+vi.mock('../../../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({ handleRun: mockHandleRun }),
+}))
+
+vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({
useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }),
}))
diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/misc.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/misc.spec.ts
index 567f3d1c3b5..206a33ad511 100644
--- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/misc.spec.ts
+++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/misc.spec.ts
@@ -44,8 +44,11 @@ vi.mock('reactflow', () => ({
}),
}))
-vi.mock('../../../../hooks', () => ({
+vi.mock('../../../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({ handleRun: mockHandleRun }),
+}))
+
+vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({
useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }),
}))
diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/opening-statement.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/opening-statement.spec.ts
index 294ad2e572d..c9016fc15c3 100644
--- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/opening-statement.spec.ts
+++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/opening-statement.spec.ts
@@ -44,8 +44,11 @@ vi.mock('reactflow', () => ({
}),
}))
-vi.mock('../../../../hooks', () => ({
+vi.mock('../../../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({ handleRun: mockHandleRun }),
+}))
+
+vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({
useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }),
}))
diff --git a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/sse-callbacks.spec.ts b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/sse-callbacks.spec.ts
index 613ee45b5ff..ae8325e9f62 100644
--- a/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/sse-callbacks.spec.ts
+++ b/web/app/components/workflow/panel/debug-and-preview/__tests__/hooks/sse-callbacks.spec.ts
@@ -43,8 +43,11 @@ vi.mock('reactflow', () => ({
}),
}))
-vi.mock('../../../../hooks', () => ({
+vi.mock('../../../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({ handleRun: mockHandleRun }),
+}))
+
+vi.mock('../../../../hooks/use-set-workflow-vars-with-value', () => ({
useSetWorkflowVarsWithValue: () => ({ fetchInspectVars: mockFetchInspectVars }),
}))
diff --git a/web/app/components/workflow/panel/debug-and-preview/hooks.ts b/web/app/components/workflow/panel/debug-and-preview/hooks.ts
index 00b261eddb3..69c91d2c397 100644
--- a/web/app/components/workflow/panel/debug-and-preview/hooks.ts
+++ b/web/app/components/workflow/panel/debug-and-preview/hooks.ts
@@ -23,8 +23,9 @@ import { useInvalidAllLastRun } from '@/service/use-workflow'
import { submitHumanInputForm } from '@/service/workflow'
import { TransferMethod } from '@/types/app'
import { DEFAULT_ITER_TIMES, DEFAULT_LOOP_TIMES } from '../../constants'
-import { useSetWorkflowVarsWithValue, useWorkflowRun } from '../../hooks'
import { useHooksStore } from '../../hooks-store'
+import { useSetWorkflowVarsWithValue } from '../../hooks/use-set-workflow-vars-with-value'
+import { useWorkflowRun } from '../../hooks/use-workflow-run'
import { useWorkflowStore } from '../../store'
import { NodeRunningStatus, WorkflowRunningStatus } from '../../types'
diff --git a/web/app/components/workflow/panel/debug-and-preview/index.tsx b/web/app/components/workflow/panel/debug-and-preview/index.tsx
index 1226e147b1f..119036618f8 100644
--- a/web/app/components/workflow/panel/debug-and-preview/index.tsx
+++ b/web/app/components/workflow/panel/debug-and-preview/index.tsx
@@ -9,10 +9,10 @@ import { useTranslation } from 'react-i18next'
import { useNodes } from 'reactflow'
import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
import { RefreshCcw01 } from '@/app/components/base/icons/src/vender/line/arrows'
-import { useEdgesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-edges-interactions-without-sync'
-import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync'
import { useStore } from '@/app/components/workflow/store'
-import { useWorkflowInteractions } from '../../hooks'
+import { useEdgesInteractionsWithoutSync } from '../../hooks/use-edges-interactions-without-sync'
+import { useNodesInteractionsWithoutSync } from '../../hooks/use-nodes-interactions-without-sync'
+import { useWorkflowInteractions } from '../../hooks/use-workflow-panel-interactions'
import { useResizePanel } from '../../nodes/_base/hooks/use-resize-panel'
import { useSetDebugPreviewPanelWidth } from '../../persistence/local-storage-options'
import { BlockEnum } from '../../types'
diff --git a/web/app/components/workflow/panel/env-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/env-panel/__tests__/index.spec.tsx
index ff83dc858b4..4afc4a470c6 100644
--- a/web/app/components/workflow/panel/env-panel/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/panel/env-panel/__tests__/index.spec.tsx
@@ -48,7 +48,7 @@ const {
>(() => null),
}))
-vi.mock('@/app/components/workflow/hooks/use-nodes-sync-draft', () => ({
+vi.mock('../../../hooks/use-nodes-sync-draft', () => ({
useNodesSyncDraft: () => ({
doSyncWorkflowDraft: mockDoSyncWorkflowDraft,
}),
diff --git a/web/app/components/workflow/panel/env-panel/index.tsx b/web/app/components/workflow/panel/env-panel/index.tsx
index f3c3bc0d3f3..26872f3d4ce 100644
--- a/web/app/components/workflow/panel/env-panel/index.tsx
+++ b/web/app/components/workflow/panel/env-panel/index.tsx
@@ -3,8 +3,6 @@ import { cn } from '@langgenius/dify-ui/cn'
import { RiCloseLine } from '@remixicon/react'
import { memo, useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow'
-import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft'
import RemoveEffectVarConfirm from '@/app/components/workflow/nodes/_base/components/remove-effect-var-confirm'
import {
findUsedVarNodes,
@@ -13,6 +11,8 @@ import {
import EnvItem from '@/app/components/workflow/panel/env-panel/env-item'
import VariableTrigger from '@/app/components/workflow/panel/env-panel/variable-trigger'
import { useStore } from '@/app/components/workflow/store'
+import { useCollaborativeWorkflow } from '../../hooks/use-collaborative-workflow'
+import { useNodesSyncDraft } from '../../hooks/use-nodes-sync-draft'
const HIDDEN_SECRET_VALUE = '[__HIDDEN__]'
type DoSyncWorkflowDraft = ReturnType['doSyncWorkflowDraft']
diff --git a/web/app/components/workflow/panel/global-variable-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/global-variable-panel/__tests__/index.spec.tsx
index 1b95d76180e..8bd1db550ef 100644
--- a/web/app/components/workflow/panel/global-variable-panel/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/panel/global-variable-panel/__tests__/index.spec.tsx
@@ -19,7 +19,7 @@ vi.mock('../../../constants', () => ({
isInWorkflowPage: () => mockIsWorkflowPage,
}))
-vi.mock('../../../hooks', () => ({
+vi.mock('../../../hooks/use-workflow', () => ({
useIsChatMode: () => mockIsChatMode,
}))
diff --git a/web/app/components/workflow/panel/global-variable-panel/index.tsx b/web/app/components/workflow/panel/global-variable-panel/index.tsx
index 736e3ef9093..3d97b8de0ff 100644
--- a/web/app/components/workflow/panel/global-variable-panel/index.tsx
+++ b/web/app/components/workflow/panel/global-variable-panel/index.tsx
@@ -5,7 +5,7 @@ import { memo } from 'react'
import { useTranslation } from 'react-i18next'
import { useStore } from '@/app/components/workflow/store'
import { isInWorkflowPage } from '../../constants'
-import { useIsChatMode } from '../../hooks'
+import { useIsChatMode } from '../../hooks/use-workflow'
import Item from './item'
const Panel = () => {
diff --git a/web/app/components/workflow/panel/inputs-panel.tsx b/web/app/components/workflow/panel/inputs-panel.tsx
index 0aed00193e7..f023f1125b4 100644
--- a/web/app/components/workflow/panel/inputs-panel.tsx
+++ b/web/app/components/workflow/panel/inputs-panel.tsx
@@ -6,8 +6,8 @@ import { useNodes } from 'reactflow'
import { useCheckInputsForms } from '@/app/components/base/chat/chat/check-input-forms-hooks'
import { getProcessedInputs } from '@/app/components/base/chat/chat/utils'
import { TransferMethod } from '../../base/text-generation/types'
-import { useWorkflowRun } from '../hooks'
import { useHooksStore } from '../hooks-store'
+import { useWorkflowRun } from '../hooks/use-workflow-run'
import FormItem from '../nodes/_base/components/before-run-form/form-item'
import { useStore, useWorkflowStore } from '../store'
import { BlockEnum, InputVarType, WorkflowRunningStatus } from '../types'
diff --git a/web/app/components/workflow/panel/record.tsx b/web/app/components/workflow/panel/record.tsx
index 14bc2b2af95..b01ead287b8 100644
--- a/web/app/components/workflow/panel/record.tsx
+++ b/web/app/components/workflow/panel/record.tsx
@@ -1,7 +1,7 @@
import type { WorkflowRunDetailResponse } from '@/models/log'
import { memo, useCallback } from 'react'
-import { useWorkflowUpdate } from '../hooks'
import { useHooksStore } from '../hooks-store'
+import { useWorkflowUpdate } from '../hooks/use-workflow-update'
import Run from '../run'
import { useStore } from '../store'
import { formatWorkflowRunIdentifier } from '../utils'
diff --git a/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx b/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx
index b004638db36..b339f4c4280 100644
--- a/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/panel/version-history-panel/__tests__/index.spec.tsx
@@ -112,9 +112,15 @@ vi.mock('@/service/use-workflow', () => ({
}),
}))
-vi.mock('../../../hooks', () => ({
+vi.mock('../../../hooks/use-DSL', () => ({
useDSL: () => ({ handleExportDSL: mockHandleExportDSL }),
+}))
+
+vi.mock('../../../hooks/use-workflow-refresh-draft', () => ({
useWorkflowRefreshDraft: () => ({ handleRefreshWorkflowDraft: mockHandleRefreshWorkflowDraft }),
+}))
+
+vi.mock('../../../hooks/use-workflow-run', () => ({
useWorkflowRun: () => ({
handleRestoreFromPublishedWorkflow: mockHandleRestoreFromPublishedWorkflow,
handleLoadBackupDraft: mockHandleLoadBackupDraft,
diff --git a/web/app/components/workflow/panel/version-history-panel/index.tsx b/web/app/components/workflow/panel/version-history-panel/index.tsx
index ab9528f7086..9cfb4b65ef7 100644
--- a/web/app/components/workflow/panel/version-history-panel/index.tsx
+++ b/web/app/components/workflow/panel/version-history-panel/index.tsx
@@ -21,8 +21,10 @@ import {
useUpdateWorkflow,
useWorkflowVersionHistory,
} from '@/service/use-workflow'
-import { useDSL, useWorkflowRefreshDraft, useWorkflowRun } from '../../hooks'
import { useHooksStore } from '../../hooks-store'
+import { useDSL } from '../../hooks/use-DSL'
+import { useWorkflowRefreshDraft } from '../../hooks/use-workflow-refresh-draft'
+import { useWorkflowRun } from '../../hooks/use-workflow-run'
import { useStore, useWorkflowStore } from '../../store'
import {
VersionHistoryContextMenuOptions,
diff --git a/web/app/components/workflow/panel/workflow-preview.tsx b/web/app/components/workflow/panel/workflow-preview.tsx
index 00b463a5f36..2d1be46dc99 100644
--- a/web/app/components/workflow/panel/workflow-preview.tsx
+++ b/web/app/components/workflow/panel/workflow-preview.tsx
@@ -8,7 +8,7 @@ import { useTranslation } from 'react-i18next'
import ReasoningPanel from '@/app/components/base/chat/chat/answer/reasoning-panel'
import Loading from '@/app/components/base/loading'
import { submitHumanInputForm } from '@/service/workflow'
-import { useWorkflowInteractions } from '../hooks'
+import { useWorkflowInteractions } from '../hooks/use-workflow-panel-interactions'
import ResultPanel from '../run/result-panel'
import ResultText from '../run/result-text'
import TracingPanel from '../run/tracing-panel'
diff --git a/web/app/components/workflow/selection-contextmenu.tsx b/web/app/components/workflow/selection-contextmenu.tsx
index 688cd5aa0d9..b7ad0d07982 100644
--- a/web/app/components/workflow/selection-contextmenu.tsx
+++ b/web/app/components/workflow/selection-contextmenu.tsx
@@ -14,9 +14,11 @@ import { useTranslation } from 'react-i18next'
import { useStore as useReactFlowStore } from 'reactflow'
import { useCreateSnippetFromSelection } from '@/app/components/snippets/hooks/use-create-snippet-from-selection'
import { canCreateAndModifySnippets } from '@/app/components/snippets/utils/permission'
-import { useCollaborativeWorkflow } from '@/app/components/workflow/hooks/use-collaborative-workflow'
import { workspacePermissionKeysAtom } from '@/context/permission-state'
-import { useNodesInteractions, useNodesReadOnly, useNodesSyncDraft } from './hooks'
+import { useCollaborativeWorkflow } from './hooks/use-collaborative-workflow'
+import { useNodesInteractions } from './hooks/use-nodes-interactions'
+import { useNodesSyncDraft } from './hooks/use-nodes-sync-draft'
+import { useNodesReadOnly } from './hooks/use-workflow'
import { useWorkflowHistory, WorkflowHistoryEvent } from './hooks/use-workflow-history'
import { ShortcutKbd } from './shortcuts/shortcut-kbd'
import { useStore, useWorkflowStore } from './store'
diff --git a/web/app/components/workflow/simple-node/__tests__/index.spec.tsx b/web/app/components/workflow/simple-node/__tests__/index.spec.tsx
index bf0e4034e89..50490d1ba78 100644
--- a/web/app/components/workflow/simple-node/__tests__/index.spec.tsx
+++ b/web/app/components/workflow/simple-node/__tests__/index.spec.tsx
@@ -4,11 +4,16 @@ import SimpleNode from '../index'
let mockNodesReadOnly = false
-vi.mock('@/app/components/workflow/hooks', () => ({
- useNodesReadOnly: () => ({
- nodesReadOnly: mockNodesReadOnly,
- }),
-}))
+vi.mock('../../hooks/use-workflow', async (importOriginal) => {
+ const actual = await importOriginal()
+
+ return {
+ ...actual,
+ useNodesReadOnly: () => ({
+ nodesReadOnly: mockNodesReadOnly,
+ }),
+ }
+})
vi.mock('@/app/components/workflow/block-icon', () => ({
__esModule: true,
diff --git a/web/app/components/workflow/simple-node/index.tsx b/web/app/components/workflow/simple-node/index.tsx
index 64f6f44cc9f..9aee353d578 100644
--- a/web/app/components/workflow/simple-node/index.tsx
+++ b/web/app/components/workflow/simple-node/index.tsx
@@ -9,10 +9,10 @@ import {
} from '@remixicon/react'
import { memo, useMemo } from 'react'
import BlockIcon from '@/app/components/workflow/block-icon'
-import { useNodesReadOnly } from '@/app/components/workflow/hooks'
import NodeControl from '@/app/components/workflow/nodes/_base/components/node-control'
import { NodeTargetHandle } from '@/app/components/workflow/nodes/_base/components/node-handle'
import { NodeRunningStatus } from '@/app/components/workflow/types'
+import { useNodesReadOnly } from '../hooks/use-workflow'
type SimpleNodeProps = NodeProps
diff --git a/web/app/components/workflow/store/workflow/node-slice.ts b/web/app/components/workflow/store/workflow/node-slice.ts
index c1427e987b4..383a30eb224 100644
--- a/web/app/components/workflow/store/workflow/node-slice.ts
+++ b/web/app/components/workflow/store/workflow/node-slice.ts
@@ -1,5 +1,5 @@
import type { StateCreator } from 'zustand'
-import type { ChecklistItem } from '@/app/components/workflow/hooks/use-checklist'
+import type { ChecklistItem } from '../../hooks/use-checklist'
import type { VariableAssignerNodeType } from '@/app/components/workflow/nodes/variable-assigner/types'
import type { Node } from '@/app/components/workflow/types'
import type { NodeTracing } from '@/types/workflow'
diff --git a/web/app/components/workflow/variable-inspect/__tests__/group.spec.tsx b/web/app/components/workflow/variable-inspect/__tests__/group.spec.tsx
index 642bb80e6c9..c954badaf73 100644
--- a/web/app/components/workflow/variable-inspect/__tests__/group.spec.tsx
+++ b/web/app/components/workflow/variable-inspect/__tests__/group.spec.tsx
@@ -6,8 +6,8 @@ import Group from '../group'
const mockUseToolIcon = vi.fn(() => '')
-vi.mock('../../hooks', async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../../hooks/use-tool-icon', async (importOriginal) => {
+ const actual = await importOriginal()
return {
...actual,
useToolIcon: () => mockUseToolIcon(),
diff --git a/web/app/components/workflow/variable-inspect/__tests__/listening.spec.tsx b/web/app/components/workflow/variable-inspect/__tests__/listening.spec.tsx
index cde78a099ee..dccdf240519 100644
--- a/web/app/components/workflow/variable-inspect/__tests__/listening.spec.tsx
+++ b/web/app/components/workflow/variable-inspect/__tests__/listening.spec.tsx
@@ -10,7 +10,7 @@ vi.mock('copy-to-clipboard', () => ({
default: (...args: unknown[]) => mockCopy(...args),
}))
-vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({
+vi.mock('../../hooks/use-tool-icon', () => ({
useGetToolIcon: () => () => 'tool-icon',
}))
diff --git a/web/app/components/workflow/variable-inspect/__tests__/panel.spec.tsx b/web/app/components/workflow/variable-inspect/__tests__/panel.spec.tsx
index 1483effddc6..47c1d29e915 100644
--- a/web/app/components/workflow/variable-inspect/__tests__/panel.spec.tsx
+++ b/web/app/components/workflow/variable-inspect/__tests__/panel.spec.tsx
@@ -57,14 +57,14 @@ vi.mock('../../hooks/use-nodes-interactions', () => ({
}),
}))
-vi.mock('../../hooks', () => ({
+vi.mock('../../hooks/use-nodes-interactions', () => ({
useNodesInteractions: () => ({
handleNodeSelect: mockHandleNodeSelect,
}),
- useToolIcon: () => '',
}))
-vi.mock('@/app/components/workflow/hooks/use-tool-icon', () => ({
+vi.mock('../../hooks/use-tool-icon', () => ({
+ useToolIcon: () => '',
useGetToolIcon: () => () => '',
}))
diff --git a/web/app/components/workflow/variable-inspect/group.tsx b/web/app/components/workflow/variable-inspect/group.tsx
index 094171c58d7..39611a977c8 100644
--- a/web/app/components/workflow/variable-inspect/group.tsx
+++ b/web/app/components/workflow/variable-inspect/group.tsx
@@ -16,7 +16,7 @@ import ActionButton from '@/app/components/base/action-button'
import BlockIcon from '@/app/components/workflow/block-icon'
import { VariableIconWithColor } from '@/app/components/workflow/nodes/_base/components/variable/variable-label'
import { VarInInspectType } from '@/types/workflow'
-import { useToolIcon } from '../hooks'
+import { useToolIcon } from '../hooks/use-tool-icon'
type Props = Readonly<{
nodeData?: NodeWithVar
diff --git a/web/app/components/workflow/variable-inspect/listening.tsx b/web/app/components/workflow/variable-inspect/listening.tsx
index 3f1caaf1dbb..f658105a92f 100644
--- a/web/app/components/workflow/variable-inspect/listening.tsx
+++ b/web/app/components/workflow/variable-inspect/listening.tsx
@@ -11,9 +11,9 @@ import { useTranslation } from 'react-i18next'
import { useStoreApi } from 'reactflow'
import { StopCircle } from '@/app/components/base/icons/src/vender/line/mediaAndDevices'
import BlockIcon from '@/app/components/workflow/block-icon'
-import { useGetToolIcon } from '@/app/components/workflow/hooks/use-tool-icon'
import { getNextExecutionTime } from '@/app/components/workflow/nodes/trigger-schedule/utils/execution-time-calculator'
import { BlockEnum } from '@/app/components/workflow/types'
+import { useGetToolIcon } from '../hooks/use-tool-icon'
import { useStore } from '../store'
const resolveListeningDescription = (
diff --git a/web/app/components/workflow/variable-inspect/right.tsx b/web/app/components/workflow/variable-inspect/right.tsx
index 2e07a1cc910..cce7a711209 100644
--- a/web/app/components/workflow/variable-inspect/right.tsx
+++ b/web/app/components/workflow/variable-inspect/right.tsx
@@ -25,9 +25,10 @@ import { AppModeEnum } from '@/types/app'
import { VarInInspectType } from '@/types/workflow'
import GetCodeGeneratorResModal from '../../app/configuration/config/code-generator/get-code-generator-res'
import { PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER } from '../../base/prompt-editor/plugins/update-block'
-import { useNodesInteractions, useToolIcon } from '../hooks'
import { useHooksStore } from '../hooks-store'
import useCurrentVars from '../hooks/use-inspect-vars-crud'
+import { useNodesInteractions } from '../hooks/use-nodes-interactions'
+import { useToolIcon } from '../hooks/use-tool-icon'
import useNodeCrud from '../nodes/_base/hooks/use-node-crud'
import useNodeInfo from '../nodes/_base/hooks/use-node-info'
import { CodeLanguage } from '../nodes/code/types'