diff --git a/web/app/components/base/chat/chat/answer/workflow-process.tsx b/web/app/components/base/chat/chat/answer/workflow-process.tsx
index 47ad5291db..c7e17d10d3 100644
--- a/web/app/components/base/chat/chat/answer/workflow-process.tsx
+++ b/web/app/components/base/chat/chat/answer/workflow-process.tsx
@@ -1,5 +1,4 @@
import {
- useCallback,
useEffect,
useMemo,
useState,
@@ -15,9 +14,8 @@ import TracingPanel from '@/app/components/workflow/run/tracing-panel'
import cn from '@/utils/classnames'
import { CheckCircle } from '@/app/components/base/icons/src/vender/solid/general'
import { WorkflowRunningStatus } from '@/app/components/workflow/types'
-import { useStore as useAppStore } from '@/app/components/app/store'
-interface WorkflowProcessProps {
+type WorkflowProcessProps = {
data: WorkflowProcess
item?: ChatItem
expand?: boolean
@@ -26,7 +24,6 @@ interface WorkflowProcessProps {
}
const WorkflowProcessItem = ({
data,
- item,
expand = false,
hideInfo = false,
hideProcessDetail = false,
@@ -54,22 +51,6 @@ const WorkflowProcessItem = ({
setCollapse(!expand)
}, [expand])
- const setCurrentLogItem = useAppStore(s => s.setCurrentLogItem)
- const setShowMessageLogModal = useAppStore(s => s.setShowMessageLogModal)
- const setCurrentLogModalActiveTab = useAppStore(s => s.setCurrentLogModalActiveTab)
-
- const showIterationDetail = useCallback(() => {
- setCurrentLogItem(item)
- setCurrentLogModalActiveTab('TRACING')
- setShowMessageLogModal(true)
- }, [item, setCurrentLogItem, setCurrentLogModalActiveTab, setShowMessageLogModal])
-
- const showRetryDetail = useCallback(() => {
- setCurrentLogItem(item)
- setCurrentLogModalActiveTab('TRACING')
- setShowMessageLogModal(true)
- }, [item, setCurrentLogItem, setCurrentLogModalActiveTab, setShowMessageLogModal])
-
return (
diff --git a/web/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx b/web/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx
index a3bb50076b..01c4d44bad 100644
--- a/web/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx
+++ b/web/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx
@@ -12,6 +12,7 @@ import { useInstallPackageFromMarketPlace, useUpdatePackageFromMarketPlace } fro
import checkTaskStatus from '../../base/check-task-status'
import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed'
import Version from '../../base/version'
+import { usePluginTaskList } from '@/service/use-plugins'
const i18nPrefix = 'plugin.installModal'
@@ -50,6 +51,7 @@ const Installed: FC = ({
check,
stop,
} = checkTaskStatus()
+ const { handleRefetch } = usePluginTaskList()
useEffect(() => {
if (hasInstalled && uniqueIdentifier === installedInfoPayload.uniqueIdentifier)
@@ -93,6 +95,9 @@ const Installed: FC = ({
onInstalled()
return
}
+
+ handleRefetch()
+
const { status, error } = await check({
taskId,
pluginUniqueIdentifier: uniqueIdentifier,
diff --git a/web/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx b/web/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx
index eb0ca15ee0..42c30df7cf 100644
--- a/web/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx
+++ b/web/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx
@@ -28,7 +28,7 @@ import {
import { useStore as useAppStore } from '@/app/components/app/store'
import { getLastAnswer } from '@/app/components/base/chat/utils'
-interface ChatWrapperProps {
+type ChatWrapperProps = {
showConversationVariableModal: boolean
onConversationModalHide: () => void
showInputsFieldsPanel: boolean
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 9dca8c0502..d91cf1082d 100644
--- a/web/app/components/workflow/panel/debug-and-preview/hooks.ts
+++ b/web/app/components/workflow/panel/debug-and-preview/hooks.ts
@@ -27,10 +27,9 @@ import {
getProcessedFilesFromResponse,
} from '@/app/components/base/file-uploader/utils'
import type { FileEntity } from '@/app/components/base/file-uploader/types'
-import type { NodeTracing } from '@/types/workflow'
type GetAbortController = (abortController: AbortController) => void
-interface SendCallback {
+type SendCallback = {
onGetSuggestedQuestions?: (responseItemId: string, getAbortController: GetAbortController) => Promise
}
export const useChat = (
@@ -276,6 +275,7 @@ export const useChat = (
)
setSuggestQuestions(data)
}
+ // eslint-disable-next-line unused-imports/no-unused-vars
catch (error) {
setSuggestQuestions([])
}
@@ -331,8 +331,7 @@ export const useChat = (
responseItem.workflowProcess!.tracing!.push({
...data,
status: NodeRunningStatus.Running,
- details: [],
- } as any)
+ })
handleUpdateChatList(produce(chatListRef.current, (draft) => {
const currentIndex = draft.findIndex(item => item.id === responseItem.id)
draft[currentIndex] = {
@@ -341,30 +340,21 @@ export const useChat = (
}
}))
},
- onIterationNext: ({ data }) => {
- const tracing = responseItem.workflowProcess!.tracing!
- const iterations = tracing.find(item => item.node_id === data.node_id
- && (item.execution_metadata?.parallel_id === data.execution_metadata?.parallel_id || item.parallel_id === data.execution_metadata?.parallel_id))!
- iterations.details!.push([])
-
- handleUpdateChatList(produce(chatListRef.current, (draft) => {
- const currentIndex = draft.length - 1
- draft[currentIndex] = responseItem
- }))
- },
onIterationFinish: ({ data }) => {
- const tracing = responseItem.workflowProcess!.tracing!
- const iterationsIndex = tracing.findIndex(item => item.node_id === data.node_id
- && (item.execution_metadata?.parallel_id === data.execution_metadata?.parallel_id || item.parallel_id === data.execution_metadata?.parallel_id))!
- tracing[iterationsIndex] = {
- ...tracing[iterationsIndex],
- ...data,
- status: NodeRunningStatus.Succeeded,
- } as any
- handleUpdateChatList(produce(chatListRef.current, (draft) => {
- const currentIndex = draft.length - 1
- draft[currentIndex] = responseItem
- }))
+ const currentTracingIndex = responseItem.workflowProcess!.tracing!.findIndex(item => item.id === data.id)
+ if (currentTracingIndex > -1) {
+ responseItem.workflowProcess!.tracing[currentTracingIndex] = {
+ ...responseItem.workflowProcess!.tracing[currentTracingIndex],
+ ...data,
+ }
+ handleUpdateChatList(produce(chatListRef.current, (draft) => {
+ const currentIndex = draft.findIndex(item => item.id === responseItem.id)
+ draft[currentIndex] = {
+ ...draft[currentIndex],
+ ...responseItem,
+ }
+ }))
+ }
},
onNodeStarted: ({ data }) => {
if (data.iteration_id)
@@ -386,16 +376,7 @@ export const useChat = (
if (data.iteration_id)
return
- const currentIndex = responseItem.workflowProcess!.tracing!.findIndex((item) => {
- if (!item.execution_metadata?.parallel_id)
- return item.node_id === data.node_id
- return item.node_id === data.node_id && (item.execution_metadata?.parallel_id === data.execution_metadata?.parallel_id || item.parallel_id === data.execution_metadata?.parallel_id)
- })
- if (responseItem.workflowProcess!.tracing[currentIndex].retryDetail)
- responseItem.workflowProcess!.tracing[currentIndex].retryDetail?.push(data as NodeTracing)
- else
- responseItem.workflowProcess!.tracing[currentIndex].retryDetail = [data as NodeTracing]
-
+ responseItem.workflowProcess!.tracing!.push(data)
handleUpdateChatList(produce(chatListRef.current, (draft) => {
const currentIndex = draft.findIndex(item => item.id === responseItem.id)
draft[currentIndex] = {
@@ -408,27 +389,20 @@ export const useChat = (
if (data.iteration_id)
return
- const currentIndex = responseItem.workflowProcess!.tracing!.findIndex((item) => {
- if (!item.execution_metadata?.parallel_id)
- return item.node_id === data.node_id
- return item.node_id === data.node_id && (item.execution_metadata?.parallel_id === data.execution_metadata?.parallel_id || item.parallel_id === data.execution_metadata?.parallel_id)
- })
- responseItem.workflowProcess!.tracing[currentIndex] = {
- ...(responseItem.workflowProcess!.tracing[currentIndex]?.extras
- ? { extras: responseItem.workflowProcess!.tracing[currentIndex].extras }
- : {}),
- ...(responseItem.workflowProcess!.tracing[currentIndex]?.retryDetail
- ? { retryDetail: responseItem.workflowProcess!.tracing[currentIndex].retryDetail }
- : {}),
- ...data,
- } as any
- handleUpdateChatList(produce(chatListRef.current, (draft) => {
- const currentIndex = draft.findIndex(item => item.id === responseItem.id)
- draft[currentIndex] = {
- ...draft[currentIndex],
- ...responseItem,
+ const currentTracingIndex = responseItem.workflowProcess!.tracing!.findIndex(item => item.id === data.id)
+ if (currentTracingIndex > -1) {
+ responseItem.workflowProcess!.tracing[currentTracingIndex] = {
+ ...responseItem.workflowProcess!.tracing[currentTracingIndex],
+ ...data,
}
- }))
+ handleUpdateChatList(produce(chatListRef.current, (draft) => {
+ const currentIndex = draft.findIndex(item => item.id === responseItem.id)
+ draft[currentIndex] = {
+ ...draft[currentIndex],
+ ...responseItem,
+ }
+ }))
+ }
},
},
)
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 1e74a5c27d..d4a3f24d4a 100644
--- a/web/app/components/workflow/panel/debug-and-preview/index.tsx
+++ b/web/app/components/workflow/panel/debug-and-preview/index.tsx
@@ -22,7 +22,7 @@ import Tooltip from '@/app/components/base/tooltip'
import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
import { useStore } from '@/app/components/workflow/store'
-export interface ChatWrapperRefType {
+export type ChatWrapperRefType = {
handleRestart: () => void
}
const DebugAndPreview = () => {
diff --git a/web/app/components/workflow/panel/workflow-preview.tsx b/web/app/components/workflow/panel/workflow-preview.tsx
index aa64229e30..b4e4d4c5d1 100644
--- a/web/app/components/workflow/panel/workflow-preview.tsx
+++ b/web/app/components/workflow/panel/workflow-preview.tsx
@@ -24,7 +24,6 @@ import Toast from '../../base/toast'
import InputsPanel from './inputs-panel'
import cn from '@/utils/classnames'
import Loading from '@/app/components/base/loading'
-import formatNodeList from '@/app/components/workflow/run/utils/format-log'
const WorkflowPreview = () => {
const { t } = useTranslation()
@@ -161,7 +160,7 @@ const WorkflowPreview = () => {
{currentTab === 'TRACING' && (
)}
{currentTab === 'TRACING' && !workflowRunningData?.tracing?.length && (
diff --git a/web/app/components/workflow/run/index.tsx b/web/app/components/workflow/run/index.tsx
index c1249f7224..eaa88d2df8 100644
--- a/web/app/components/workflow/run/index.tsx
+++ b/web/app/components/workflow/run/index.tsx
@@ -13,7 +13,6 @@ import { fetchRunDetail, fetchTracingList } from '@/service/log'
import type { NodeTracing } from '@/types/workflow'
import type { WorkflowRunDetailResponse } from '@/models/log'
import { useStore as useAppStore } from '@/app/components/app/store'
-import formatNodeList from './utils/format-log'
export type RunProps = {
hideResult?: boolean
activeTab?: 'RESULT' | 'DETAIL' | 'TRACING'
@@ -61,7 +60,7 @@ const RunPanel: FC = ({ hideResult, activeTab = 'RESULT', runID, getRe
const { data: nodeList } = await fetchTracingList({
url: `/apps/${appID}/workflow-runs/${runID}/node-executions`,
})
- setList(formatNodeList(nodeList, t))
+ setList(nodeList)
}
catch (err) {
notify({
diff --git a/web/app/components/workflow/run/tracing-panel.tsx b/web/app/components/workflow/run/tracing-panel.tsx
index 758e9cfcf8..7739c8f836 100644
--- a/web/app/components/workflow/run/tracing-panel.tsx
+++ b/web/app/components/workflow/run/tracing-panel.tsx
@@ -11,10 +11,12 @@ import {
RiArrowDownSLine,
RiMenu4Line,
} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
import { useLogs } from './hooks'
import NodePanel from './node'
import SpecialResultPanel from './special-result-panel'
import type { NodeTracing } from '@/types/workflow'
+import formatNodeList from '@/app/components/workflow/run/utils/format-log'
type TracingPanelProps = {
list: NodeTracing[]
@@ -29,7 +31,8 @@ const TracingPanel: FC = ({
hideNodeInfo = false,
hideNodeProcessDetail = false,
}) => {
- const treeNodes = list
+ const { t } = useTranslation()
+ const treeNodes = formatNodeList(list, t)
const [collapsedNodes, setCollapsedNodes] = useState>(new Set())
const [hoveredParallel, setHoveredParallel] = useState(null)
diff --git a/web/types/workflow.ts b/web/types/workflow.ts
index 9287cba471..b152c3615b 100644
--- a/web/types/workflow.ts
+++ b/web/types/workflow.ts
@@ -23,6 +23,7 @@ export type NodeTracing = {
index: number
predecessor_node_id: string
node_id: string
+ iteration_id?: string
node_type: BlockEnum
title: string
inputs: any