|
@@ -4,6 +4,7 @@ import { agent } from '@repo/api-service'
|
|
|
import type { IWorkflowNode } from '@repo/workflow'
|
|
import type { IWorkflowNode } from '@repo/workflow'
|
|
|
|
|
|
|
|
import { useI18n } from '@/composables/useI18n'
|
|
import { useI18n } from '@/composables/useI18n'
|
|
|
|
|
+import { useRunnerStore, type RunnerNodeState } from '@/store/modules/runner.store'
|
|
|
|
|
|
|
|
interface Props {
|
|
interface Props {
|
|
|
node: IWorkflowNode | undefined
|
|
node: IWorkflowNode | undefined
|
|
@@ -16,11 +17,101 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
active: false
|
|
active: false
|
|
|
})
|
|
})
|
|
|
const { t } = useI18n()
|
|
const { t } = useI18n()
|
|
|
|
|
+const runnerStore = useRunnerStore()
|
|
|
const loading = ref(false)
|
|
const loading = ref(false)
|
|
|
const errorMessage = ref('')
|
|
const errorMessage = ref('')
|
|
|
const nodeLog = ref<NodeLastRunnerLog | null>(null)
|
|
const nodeLog = ref<NodeLastRunnerLog | null>(null)
|
|
|
let latestRequestId = 0
|
|
let latestRequestId = 0
|
|
|
|
|
|
|
|
|
|
+const toNodeLastRunnerLog = (node: RunnerNodeState): NodeLastRunnerLog => {
|
|
|
|
|
+ const track = node.track || null
|
|
|
|
|
+ const isSuccess =
|
|
|
|
|
+ typeof track?.is_success === 'boolean'
|
|
|
|
|
+ ? track.is_success
|
|
|
|
|
+ : node.status === 'success'
|
|
|
|
|
+
|
|
|
|
|
+ return {
|
|
|
|
|
+ appAgentId: '',
|
|
|
|
|
+ appAgentNodeId: node.nodeId,
|
|
|
|
|
+ appAgentRunnerId: runnerStore.currentRunnerKey || '',
|
|
|
|
|
+ creationTime: node.lastUpdateTime || '',
|
|
|
|
|
+ errorMsg: node.status === 'failed' ? String(track?.errorMsg || track?.error || '') : '',
|
|
|
|
|
+ id: '',
|
|
|
|
|
+ isDeleted: false,
|
|
|
|
|
+ raw: track
|
|
|
|
|
+ ? {
|
|
|
|
|
+ ...track,
|
|
|
|
|
+ agent_node_id: track.agent_node_id || node.nodeId,
|
|
|
|
|
+ is_success: isSuccess,
|
|
|
|
|
+ node_name: track.node_name || node.nodeName,
|
|
|
|
|
+ node_type: track.node_type || node.nodeType
|
|
|
|
|
+ }
|
|
|
|
|
+ : null,
|
|
|
|
|
+ status: node.status,
|
|
|
|
|
+ updateTime: node.lastUpdateTime || '',
|
|
|
|
|
+ useTime: Number(track?.use_time ?? track?.useTime ?? 0)
|
|
|
|
|
+ } as NodeLastRunnerLog
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const findRunnerNodeState = (nodeId: string) => {
|
|
|
|
|
+ const currentExecution = runnerStore.currentRunnerKey
|
|
|
|
|
+ ? runnerStore.executions.find((item) => item.runnerKey === runnerStore.currentRunnerKey)
|
|
|
|
|
+ : null
|
|
|
|
|
+
|
|
|
|
|
+ return (
|
|
|
|
|
+ currentExecution?.nodes.find((item) => item.nodeId === nodeId) ||
|
|
|
|
|
+ runnerStore.nodes.find((item) => item.nodeId === nodeId) ||
|
|
|
|
|
+ runnerStore.executions.find((execution) =>
|
|
|
|
|
+ execution.nodes.some((item) => item.nodeId === nodeId)
|
|
|
|
|
+ )?.nodes.find((item) => item.nodeId === nodeId) ||
|
|
|
|
|
+ null
|
|
|
|
|
+ )
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const isCurrentNodeRunning = (nodeId: string) => {
|
|
|
|
|
+ const runnerRunning = runnerStore.status === 'connecting' || runnerStore.status === 'running'
|
|
|
|
|
+ if (!runnerRunning) return false
|
|
|
|
|
+
|
|
|
|
|
+ const runnerNodeState = findRunnerNodeState(nodeId)
|
|
|
|
|
+ if (runnerNodeState) return runnerNodeState.status === 'running'
|
|
|
|
|
+
|
|
|
|
|
+ return runnerStore.currentStartNodeId === nodeId
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const createRunningNodeLog = (nodeId: string): NodeLastRunnerLog =>
|
|
|
|
|
+ ({
|
|
|
|
|
+ appAgentId: '',
|
|
|
|
|
+ appAgentNodeId: nodeId,
|
|
|
|
|
+ appAgentRunnerId: runnerStore.currentRunnerKey || '',
|
|
|
|
|
+ creationTime: '',
|
|
|
|
|
+ errorMsg: '',
|
|
|
|
|
+ id: '',
|
|
|
|
|
+ isDeleted: false,
|
|
|
|
|
+ raw: null,
|
|
|
|
|
+ status: 'running',
|
|
|
|
|
+ updateTime: '',
|
|
|
|
|
+ useTime: 0
|
|
|
|
|
+ }) as NodeLastRunnerLog
|
|
|
|
|
+
|
|
|
|
|
+const runnerNodesVersion = computed(() =>
|
|
|
|
|
+ runnerStore.nodes
|
|
|
|
|
+ .map((item) => `${item.nodeId}:${item.status}:${item.lastUpdateTime || ''}`)
|
|
|
|
|
+ .join('|')
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+const runnerExecutionsVersion = computed(() =>
|
|
|
|
|
+ runnerStore.executions
|
|
|
|
|
+ .map((execution) =>
|
|
|
|
|
+ execution.nodes
|
|
|
|
|
+ .map(
|
|
|
|
|
+ (item) =>
|
|
|
|
|
+ `${execution.runnerKey}:${item.nodeId}:${item.status}:${item.lastUpdateTime || ''}`
|
|
|
|
|
+ )
|
|
|
|
|
+ .join(',')
|
|
|
|
|
+ )
|
|
|
|
|
+ .join('|')
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
const loadNodeLog = async (nodeId?: string) => {
|
|
const loadNodeLog = async (nodeId?: string) => {
|
|
|
if (!nodeId) {
|
|
if (!nodeId) {
|
|
|
latestRequestId += 1
|
|
latestRequestId += 1
|
|
@@ -31,6 +122,21 @@ const loadNodeLog = async (nodeId?: string) => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const requestId = ++latestRequestId
|
|
const requestId = ++latestRequestId
|
|
|
|
|
+ if (isCurrentNodeRunning(nodeId)) {
|
|
|
|
|
+ nodeLog.value = createRunningNodeLog(nodeId)
|
|
|
|
|
+ errorMessage.value = ''
|
|
|
|
|
+ loading.value = false
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const runnerNodeState = findRunnerNodeState(nodeId)
|
|
|
|
|
+ if (runnerNodeState) {
|
|
|
|
|
+ nodeLog.value = toNodeLastRunnerLog(runnerNodeState)
|
|
|
|
|
+ errorMessage.value = ''
|
|
|
|
|
+ loading.value = false
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
loading.value = true
|
|
loading.value = true
|
|
|
errorMessage.value = ''
|
|
errorMessage.value = ''
|
|
|
nodeLog.value = null
|
|
nodeLog.value = null
|
|
@@ -54,7 +160,16 @@ const loadNodeLog = async (nodeId?: string) => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
watch(
|
|
watch(
|
|
|
- () => [props.node?.id, props.active] as const,
|
|
|
|
|
|
|
+ () =>
|
|
|
|
|
+ [
|
|
|
|
|
+ props.node?.id,
|
|
|
|
|
+ props.active,
|
|
|
|
|
+ runnerStore.currentRunnerKey,
|
|
|
|
|
+ runnerStore.currentStartNodeId,
|
|
|
|
|
+ runnerStore.status,
|
|
|
|
|
+ runnerNodesVersion.value,
|
|
|
|
|
+ runnerExecutionsVersion.value
|
|
|
|
|
+ ] as const,
|
|
|
([nodeId, active]) => {
|
|
([nodeId, active]) => {
|
|
|
if (!nodeId) {
|
|
if (!nodeId) {
|
|
|
loadNodeLog()
|
|
loadNodeLog()
|
|
@@ -80,7 +195,12 @@ const normalizedStatus = computed(() => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const hasLog = computed(
|
|
const hasLog = computed(
|
|
|
- () => !!nodeLog.value && (!!nodeLog.value.raw || !!nodeLog.value.updateTime || !!nodeLog.value.creationTime)
|
|
|
|
|
|
|
+ () =>
|
|
|
|
|
+ !!nodeLog.value &&
|
|
|
|
|
+ (!!nodeLog.value.raw ||
|
|
|
|
|
+ !!nodeLog.value.updateTime ||
|
|
|
|
|
+ !!nodeLog.value.creationTime ||
|
|
|
|
|
+ normalizedStatus.value !== 'idle')
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
const statusText = computed(() => {
|
|
const statusText = computed(() => {
|