import { FlaskConical } from "lucide-react"; import { Outlet, useParams } from "react-router"; import { agentMockEnabled } from "~/api/agent.ts"; import { agentRunHref, pageListMemory, usePageListGroup, useRunGroup } from "~/components/agent/agent-nav.ts"; import { AgentSessionList } from "~/components/agent/agent-session-list.tsx"; import { PageHeader } from "~/components/console/page-header.tsx"; import { Button } from "~/components/ui/button.tsx"; import { cn } from "~/lib/utils.ts"; /** * 智能体页的外壳(AGUI-3):列表页与会话页共用。标题、演示提示与左栏会话列表在这里,只挂载一次; * 右栏是子路由(新对话输入框 / 某个会话)。切换会话、回到列表都不重挂载左栏,也不重播入场动画, * 标题与两栏的位置不跳。 */ export default function AgentLayout() { const { runId } = useParams(); const mock = agentMockEnabled(); const runGroupOf = useRunGroup(runId); // 列表页没有 tab 就是「对话」;会话页的左栏分栏跟随当前会话(巡检会话及其子会话在「自动巡检」),也可以手动切换(记在 URL) const [group, setGroup] = usePageListGroup(runId ? runGroupOf : undefined); return ( <> {mock ? (
演示模式:会话是本地假数据,不连接后端,不执行任何操作。
) : null}
{/* 窄屏:列表页把会话列表排在输入框下面;会话页不显示列表(顶部有「全部会话」返回) */}
); } export type AgentOutletContext = { group: ReturnType[0] };