From f182e166dcf719ed783b0a04dbd1ad4bcaa3122b Mon Sep 17 00:00:00 2001 From: chiguyong Date: Tue, 2 Jun 2026 08:11:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20U7=20=E2=80=94=20citation=20export,=20a?= =?UTF-8?q?gent=20config=20panel,=20trends=20insight=20page,=20schema=20su?= =?UTF-8?q?ggestion=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/(dashboard)/dashboard/agents/page.tsx | 113 ++++- .../(dashboard)/dashboard/citations/page.tsx | 64 ++- .../app/(dashboard)/dashboard/schema/page.tsx | 400 +++++++++++++++++ .../app/(dashboard)/dashboard/trends/page.tsx | 402 ++++++++++++++++++ frontend/app/(dashboard)/layout.tsx | 14 + 5 files changed, 987 insertions(+), 6 deletions(-) create mode 100644 frontend/app/(dashboard)/dashboard/schema/page.tsx create mode 100644 frontend/app/(dashboard)/dashboard/trends/page.tsx diff --git a/frontend/app/(dashboard)/dashboard/agents/page.tsx b/frontend/app/(dashboard)/dashboard/agents/page.tsx index 5091bbe..5565f37 100644 --- a/frontend/app/(dashboard)/dashboard/agents/page.tsx +++ b/frontend/app/(dashboard)/dashboard/agents/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useMemo } from "react"; import { useSession } from "next-auth/react"; -import { agentsApi, type AgentTask, type TaskLog } from "@/lib/api/agents"; +import { agentsApi, type AgentTask, type TaskLog, type Agent } from "@/lib/api/agents"; import { MetricCard } from "@/components/business/metric-card"; import { Table, @@ -21,8 +21,11 @@ import { } from "@/components/ui/dialog"; import { Badge } from "@/components/ui/badge"; import { Skeleton } from "@/components/ui/skeleton"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; import { cn } from "@/lib/utils"; -import { Bot, CheckCircle2, XCircle, Clock, Loader2, AlertCircle } from "lucide-react"; +import { Bot, CheckCircle2, XCircle, Clock, Loader2, AlertCircle, Settings2, Save } from "lucide-react"; type TaskStatus = "pending" | "running" | "completed" | "failed" | "cancelled"; type FilterStatus = "all" | TaskStatus; @@ -76,6 +79,10 @@ export default function AgentsPage() { const [selectedTask, setSelectedTask] = useState(null); const [taskLogs, setTaskLogs] = useState([]); const [loadingLogs, setLoadingLogs] = useState(false); + const [agents, setAgents] = useState([]); + const [configAgent, setConfigAgent] = useState(null); + const [configJson, setConfigJson] = useState(""); + const [savingConfig, setSavingConfig] = useState(false); // 获取执行记录 useEffect(() => { @@ -98,6 +105,11 @@ export default function AgentsPage() { fetchTasks(); }, [token, filterStatus]); + useEffect(() => { + if (!token) return; + agentsApi.list(token).then(setAgents).catch(() => {}); + }, [token]); + // 获取任务日志 const fetchTaskLogs = async (taskId: string) => { if (!token) return; @@ -147,6 +159,27 @@ export default function AgentsPage() { await fetchTaskLogs(task.id); }; + const openConfig = (agent: Agent) => { + setConfigAgent(agent); + setConfigJson(JSON.stringify(agent.config ?? {}, null, 2)); + }; + + const saveConfig = async () => { + if (!token || !configAgent) return; + try { + setSavingConfig(true); + const parsed = JSON.parse(configJson); + await agentsApi.updateConfig(token, configAgent.id, parsed); + setConfigAgent(null); + const updated = await agentsApi.list(token); + setAgents(updated); + } catch (err) { + console.error("保存配置失败:", err); + } finally { + setSavingConfig(false); + } + }; + const filterButtons: { status: FilterStatus; label: string }[] = [ { status: "all", label: "全部" }, { status: "running", label: "运行中" }, @@ -187,6 +220,46 @@ export default function AgentsPage() { /> + + + + + Agent 配置 + + + + {agents.length === 0 ? ( +

暂无 Agent

+ ) : ( +
+ {agents.map((agent) => ( +
+
+

{agent.name}

+

{agent.type}

+
+ + {agent.status} + + +
+ ))} +
+ )} +
+
+ {/* 状态筛选 */}
{filterButtons.map(({ status, label }) => ( @@ -362,6 +435,42 @@ export default function AgentsPage() { )} + + setConfigAgent(null)}> + + + + + 配置 — {configAgent?.name} + + + {configAgent && ( +
+
+ +