Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
<!-- 展开或收起终端输出 -->
<MkCollapse
class="w-full"
:expanded="expanded"
v-model:expanded="expanded"
trigger-class="group w-fit max-w-full overflow-hidden py-[3px] text-N500 hover:text-N900 transition-colors"
@update:expanded="$emit('toggle')"
>
<template #indicator="{ expanded }">
<svg class="tc-chevron" :class="{ open: expanded }" viewBox="0 0 16 16" fill="none">
Expand Down Expand Up @@ -33,11 +32,14 @@

<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import type { ChatContent } from '@/api/types'
import Loading from '@/conversation-panel/loading/index.vue'
import { extractPartialJsonField } from './extract-partial-json'

const props = defineProps<{ content: any; loading: boolean; expanded: boolean }>()
defineEmits<{ toggle: [] }>()
defineOptions({ name: 'ConversationTerminalContent' })

const props = defineProps<{ content: ChatContent; loading: boolean }>()
const expanded = defineModel<boolean>('expanded', { required: true })

const commandText = computed(() => {
const raw = props.content.arguments
Expand All @@ -48,7 +50,7 @@ const commandText = computed(() => {
// 展开后定位到终端输出底部。
const terminalBlock = ref<HTMLElement>()
watch(
() => props.expanded,
expanded,
(expanded) => {
if (expanded && terminalBlock.value) {
terminalBlock.value.scrollTop = terminalBlock.value.scrollHeight
Expand Down
38 changes: 21 additions & 17 deletions ui/src/conversation-panel/components/content/items/tool/index.vue
Original file line number Diff line number Diff line change
@@ -1,17 +1,6 @@
<template>
<component
v-if="toolRenderers[toolName]"
:is="toolRenderers[toolName]"
:content="content"
:loading="loading"
:expanded="isExpanded"
@toggle="isExpanded = !isExpanded"
/>
<DefaultTool v-else :content="content" />
</template>

<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import { computed, ref, watch, type Component } from 'vue'
import type { ChatContent, Dict } from '@/api/types'
import Terminal from './Terminal.vue'
import Patch from './Patch.vue'
import ReadFile from './ReadFile.vue'
Expand All @@ -24,19 +13,21 @@ import DownloadSkills from './DownloadSkills.vue'
import RunSkill from './RunSkill.vue'
import DefaultTool from './tool.vue'

/** TOOL 内容项按工具名分发到专用渲染器,未匹配的工具沿用原有 tool.vue 展示。 */
const props = defineProps<{ content: any }>()
defineOptions({ name: 'ConversationToolContent' })

const props = defineProps<{ content: ChatContent }>()

// 工具执行状态与展开状态。
const loading = computed(() => props.content.status === 'RUNNING')
const toolName = computed(() => (props.content.name || '').toLowerCase())
const isExpanded = ref(props.content.status === 'RUNNING')

// 工具执行完成自动收起
watch(loading, (current, previous) => {
if (previous && !current) isExpanded.value = false
})

const toolRenderers: Record<string, any> = {
// 按工具名选择渲染组件,未匹配时使用默认展示。
const toolRenderers: Dict<Component> = {
run_command: Terminal,
apply_patch: Patch,
read_file: ReadFile,
Expand All @@ -48,4 +39,17 @@ const toolRenderers: Record<string, any> = {
download_skills: DownloadSkills,
run_skill: RunSkill,
}
const toolRenderer = computed(() => toolRenderers[(props.content.name || '').toLowerCase()])
</script>

<template>
<component
v-if="toolRenderer"
:is="toolRenderer"
:content="content"
:loading="loading"
v-model:expanded="isExpanded"
@toggle="isExpanded = !isExpanded"
/>
<DefaultTool v-else :content="content" />
</template>
3 changes: 2 additions & 1 deletion ui/src/views/workflow/tool/debug/ResultDrawer.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<script setup lang="ts">
import { computed, onBeforeUnmount, provide, ref } from 'vue'
import { cloneDeep } from 'lodash'
import { v4 as uuidv4 } from 'uuid'
import WorkflowApi from '@/api/admin/workspace/tool/workflow'
import type { ToolExecutionRecordDetail } from '@/api/types'
import { MsgError } from '@/utils/message'
Expand Down Expand Up @@ -100,7 +101,7 @@ function open(parameters: Record<string, unknown>) {
blocks.value = []
record.value = undefined
inputParameters = cloneDeep(parameters)
recordId = crypto.randomUUID()
recordId = uuidv4()
activeTab.value = 'output'
visible.value = true
return execute()
Expand Down
Loading