From 177d21c26b927b6cfbd5054419df4a04ee90cbbf Mon Sep 17 00:00:00 2001 From: root Date: Tue, 6 Oct 2026 17:56:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(agent):=20=E5=88=87=E6=8D=A2=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E4=B8=8D=E5=86=8D=E9=87=8D=E6=8C=82=E8=BD=BD=E6=95=B4?= =?UTF-8?q?=E9=A1=B5=E3=80=81=E4=B8=8D=E9=87=8D=E6=92=AD=E5=85=A5=E5=9C=BA?= =?UTF-8?q?=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 控制台主内容区按 pathname 重挂载,每换一个会话整页透明 + 模糊再淡入, 左栏滚动、分页、展开状态全部丢失。智能体列表页与会话页共用一个 key。 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei --- apps/web/app/components/agent/agent-nav.test.ts | 17 +++++++++++++++++ apps/web/app/components/agent/agent-store.ts | 11 +++++++++++ apps/web/app/routes/console/layout.tsx | 6 +++++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 apps/web/app/components/agent/agent-nav.test.ts diff --git a/apps/web/app/components/agent/agent-nav.test.ts b/apps/web/app/components/agent/agent-nav.test.ts new file mode 100644 index 00000000..27e5b37d --- /dev/null +++ b/apps/web/app/components/agent/agent-nav.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from "vitest"; +import { isAgentPage, outletKey } from "./agent-store.ts"; + +// 智能体页面切换的状态逻辑:整页重挂载 key、分栏与 URL、草稿、滚动策略、快捷键在智能体页面的行为。 + +describe("主内容区重挂载 key", () => { + it("列表页与各会话页共用一个 key,切换会话不重挂载", () => { + expect(outletKey("/console/agent")).toBe("/console/agent"); + expect(outletKey("/console/agent/0b1c")).toBe("/console/agent"); + expect(outletKey("/console/agent/9f2e")).toBe(outletKey("/console/agent/0b1c")); + }); + it("其它页面仍按路径重挂载", () => { + expect(outletKey("/console/library")).toBe("/console/library"); + expect(outletKey("/console/agents-x")).toBe("/console/agents-x"); + expect(isAgentPage("/console/agentx")).toBe(false); + }); +}); diff --git a/apps/web/app/components/agent/agent-store.ts b/apps/web/app/components/agent/agent-store.ts index 78919117..400736fb 100644 --- a/apps/web/app/components/agent/agent-store.ts +++ b/apps/web/app/components/agent/agent-store.ts @@ -123,6 +123,17 @@ export function contextFromPath(pathname: string): AgentContext | null { } } +/** 当前在不在智能体页面(列表页或会话页) */ +export const isAgentPage = (pathname: string) => /^\/console\/agent(\/|$)/.test(pathname); + +/** + * 控制台主内容区的重挂载 key:智能体列表页与各会话页共用一个 key, + * 切换会话不重挂载整页、不重播入场动画,左栏的分栏 / 滚动 / 展开状态保留。 + */ +export function outletKey(pathname: string): string { + return isAgentPage(pathname) ? "/console/agent" : pathname; +} + export function useAgentDrawer(): State { return useSyncExternalStore( (l) => { diff --git a/apps/web/app/routes/console/layout.tsx b/apps/web/app/routes/console/layout.tsx index 9c101a86..9651bcec 100644 --- a/apps/web/app/routes/console/layout.tsx +++ b/apps/web/app/routes/console/layout.tsx @@ -4,6 +4,7 @@ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react import { Link, Outlet, useLocation, useMatches } from "react-router"; import { useSession } from "~/api/auth.ts"; import { AgentDrawer, AgentDrawerTrigger } from "~/components/agent/agent-drawer.tsx"; +import { outletKey } from "~/components/agent/agent-store.ts"; import { AccountMenu } from "~/components/console/account-menu.tsx"; import { AgentLauncher, AgentNavEntry } from "~/components/console/agent-launcher.tsx"; import { ErrorState } from "~/components/console/empty-state.tsx"; @@ -248,7 +249,10 @@ function ConsoleShell({ session }: { session: SessionInfo }) { {/* 底部留出悬浮按钮的高度,页面末尾的内容能滚到它上面 */}
-
+