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
165 changes: 84 additions & 81 deletions packages/extension-agent/client/components/layout/agent-shell.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,80 +3,77 @@
<div class="main-content">
<el-scrollbar>
<div class="content-wrapper">
<Transition name="fade-slide" mode="out-in">
<div
v-if="activeTab === 'mcp'"
key="mcp"
class="view-container"
>
<mcp-page
:config="mcpCfg"
:status="mcpStatus"
:loading="loading"
@refresh="refreshData"
@save="saveMcp"
/>
</div>

<div
v-else-if="activeTab === 'skills'"
<div
v-if="activeTab === 'mcp'"
key="mcp"
class="view-container"
>
<mcp-page
:config="mcpCfg"
:status="mcpStatus"
:loading="loading"
@refresh="refreshData"
@save="saveMcp"
/>
</div>

<KeepAlive>
<skills-page
v-if="activeTab === 'skills'"
key="skills"
class="view-container"
>
<skills-page
:config="skillsCfg"
:status="skillsStatus"
:agents="subAgentStatus?.catalog"
:computer="computerStatus"
:loading="loading"
@refresh="refreshData"
@save="(value) => saveSection('skills', value)"
/>
</div>

<div
v-else-if="activeTab === 'computer'"
key="computer"
class="view-container"
>
<computer-page
:config="computerCfg"
:status="computerStatus"
:loading="loading"
/>
</div>

<div
v-else-if="activeTab === 'subAgent'"
:config="skillsCfg"
:status="skillsStatus"
:agents="subAgentStatus?.catalog"
:computer="computerStatus"
:loading="loading"
@refresh="refreshData"
@save="(value) => saveSection('skills', value)"
/>
</KeepAlive>

<div
v-if="activeTab === 'computer'"
key="computer"
class="view-container"
>
<computer-page
:config="computerCfg"
:status="computerStatus"
:loading="loading"
/>
</div>

<KeepAlive>
<sub-agent-page
v-if="activeTab === 'subAgent'"
key="sub-agent"
class="view-container"
>
<sub-agent-page
:config="subAgentCfg"
:status="subAgentStatus"
:skills="skillsStatus?.catalog"
:mcp="mcpStatus?.servers"
:computer="computerStatus"
:tools="toolStatus?.catalog"
:loading="loading"
@refresh="refreshData"
@save="
(value) => saveSection('subAgent', value)
"
/>
</div>

<div v-else key="tool" class="view-container">
<tool-page
:config="toolCfg"
:status="toolStatus"
:agents="subAgentStatus?.catalog"
:loading="loading"
@refresh="refreshData"
@save="(value) => saveSection('tool', value)"
/>
</div>
</Transition>
:config="subAgentCfg"
:status="subAgentStatus"
:skills="skillsStatus?.catalog"
:mcp="mcpStatus?.servers"
:computer="computerStatus"
:tools="toolStatus?.catalog"
:loading="loading"
@refresh="refreshData"
@save="(value) => saveSection('subAgent', value)"
/>
</KeepAlive>

<KeepAlive>
<tool-page
v-if="activeTab === 'tool'"
key="tool"
class="view-container"
:config="toolCfg"
:status="toolStatus"
:agents="subAgentStatus?.catalog"
:loading="loading"
@refresh="refreshData"
@save="(value) => saveSection('tool', value)"
/>
</KeepAlive>
</div>
</el-scrollbar>
</div>
Expand All @@ -99,10 +96,9 @@ import type { AgentConfig } from '../../../src/types'

const activeTab = ref('mcp')
const pending = ref(false)
let refreshId = 0
let refreshTask: Promise<void> | undefined
const data = computed(() => store.chatluna_agent_webui)
const config = computed(() => data.value?.config)
const status = computed(() => data.value?.status)
const mcpCfg = computed(() => data.value?.config?.mcp)
const skillsCfg = computed(() => data.value?.config?.skills)
const computerCfg = computed(() => data.value?.config?.computer)
Expand All @@ -116,17 +112,24 @@ const toolStatus = computed(() => data.value?.status?.tool)
const loading = computed(() => pending.value || !data.value)

const refreshData = async () => {
const id = ++refreshId
try {
pending.value = true
await send('chatluna-agent/refreshConsoleData')
} catch {
ElMessage.error('刷新 Agent 数据失败')
} finally {
if (id === refreshId) {
if (refreshTask) {
await refreshTask
return
}

refreshTask = (async () => {
try {
pending.value = true
await send('chatluna-agent/refreshConsoleData')
} catch {
ElMessage.error('刷新 Agent 数据失败')
} finally {
pending.value = false
refreshTask = undefined
}
}
})()

await refreshTask
}

const handleTabChange = (tab: string) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ async function importSkills() {
ElMessage.success(
result.replaced.length > 0
? `已导入 ${result.imported.length} 个 Skill,并覆盖 ${result.replaced.length} 个同名项。`
: `已导入 ${result.imported.length} 个 Skill,并默认启用。`
: `已导入 ${result.imported.length} 个 Skill。`
)
} catch {
ElMessage.error('导入失败,请稍后重试。')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ async function importSkills() {
ElMessage.success(
result.replaced.length > 0
? `已导入 ${result.imported.length} 个 Skill,并覆盖 ${result.replaced.length} 个同名项。`
: `已导入 ${result.imported.length} 个 Skill,并默认启用。`
: `已导入 ${result.imported.length} 个 Skill。`
)
} catch (error) {
ElMessage.error(formatError(error))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ async function importSkills() {
ElMessage.success(
result.replaced.length > 0
? `已导入 1 个 Skill,并覆盖同名项。`
: `已导入 1 个 Skill,并默认启用。`
: `已导入 1 个 Skill。`
)
} catch (error) {
ElMessage.error(`导入失败: ${formatError(error)}`)
Expand Down
Loading
Loading