From b86061bb1720ab7160bea61b8d4a1eec1c4ae822 Mon Sep 17 00:00:00 2001 From: yovinchen Date: Mon, 7 Sep 2026 00:58:59 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(sidebar):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E7=AE=A1=E7=90=86=E5=85=A5=E5=8F=A3=E5=B9=B6?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BF=AB=E6=8D=B7=E5=85=A5=E5=8F=A3=E5=BC=80?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 复用 Skills、MCP、记忆与定时任务管理页面,在系统设置中提供本机侧栏入口开关,并统一桌面端与 WebUI 的内容切换和紧凑布局。 Refs #767 --- .../pr-assets/sidebar-resource-navigation.png | Bin 0 -> 46298 bytes .../pr-assets/sidebar-resource-settings.png | Bin 0 -> 88231 bytes .../agent-gateway/web/src/app/GatewayApp.tsx | 6 +- .../web/src/app/GatewayAppView.tsx | 9 +-- .../web/src/app/gatewayConversationActions.ts | 6 +- .../app/hooks/useGatewayChatPresentation.tsx | 4 +- .../web/src/app/hooks/usePendingUploads.ts | 3 +- .../web/src/pages/settings/types.ts | 2 + .../web/test/resource-hub-navigation.test.mjs | 25 ++++++ crates/agent-gui/src/lib/settings/storage.ts | 2 + crates/agent-gui/src/pages/ChatPage.tsx | 12 +-- .../chat/composer/useComposerDraftCache.ts | 3 +- .../chat/workspace/useWorkspaceProjects.ts | 3 +- crates/agent-gui/src/pages/settings/types.ts | 2 + .../test/chat/search-sidebar-reveal.test.mjs | 2 + .../test/settings/normalization.test.mjs | 24 ++++++ .../agent-gui/test/settings/storage.test.mjs | 29 +++++++ .../src/application/ApplicationView.tsx | 12 ++- .../components/chat/ChatHistorySidebar.tsx | 73 +++++++----------- .../chat/ChatHistorySidebarTypes.ts | 19 +++-- .../agent-ui/src/components/hub/HubChrome.tsx | 65 ++++++++-------- .../src/i18n/translations/enUSSettings.ts | 6 +- .../src/i18n/translations/zhCNSettings.ts | 6 +- crates/agent-ui/src/lib/settings/index.ts | 2 + .../src/lib/settings/sidebarShortcuts.ts | 20 +++++ crates/agent-ui/src/lib/settings/sync.ts | 2 + crates/agent-ui/src/lib/settings/types.ts | 3 + .../agent-ui/src/pages/mcp-hub/McpHubPage.tsx | 10 ++- .../resources/ResourceManagementPage.tsx | 40 ++++++++++ .../src/pages/settings/ResourceHubSection.tsx | 19 +++++ .../src/pages/settings/SettingsPage.tsx | 42 +++++++--- .../settings/SidebarShortcutsSection.tsx | 37 +++++++++ .../src/pages/settings/SystemSettingsForm.tsx | 4 + .../src/pages/skills-hub/SkillsHubPage.tsx | 10 ++- docs/features/skills-and-mcp.md | 10 +++ 35 files changed, 389 insertions(+), 123 deletions(-) create mode 100644 .github/pr-assets/sidebar-resource-navigation.png create mode 100644 .github/pr-assets/sidebar-resource-settings.png create mode 100644 crates/agent-gateway/web/test/resource-hub-navigation.test.mjs create mode 100644 crates/agent-ui/src/lib/settings/sidebarShortcuts.ts create mode 100644 crates/agent-ui/src/pages/resources/ResourceManagementPage.tsx create mode 100644 crates/agent-ui/src/pages/settings/ResourceHubSection.tsx create mode 100644 crates/agent-ui/src/pages/settings/SidebarShortcutsSection.tsx diff --git a/.github/pr-assets/sidebar-resource-navigation.png b/.github/pr-assets/sidebar-resource-navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..ccd5c6e1d8027fb78abb7c218e61a16fee663c4a GIT binary patch literal 46298 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�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%0AgyDc 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%0AiYd%%Y3_`WF) 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 TCVUtC4}pw?!riRf`p^FjOPFm= literal 0 HcmV?d00001 diff --git a/crates/agent-gateway/web/src/app/GatewayApp.tsx b/crates/agent-gateway/web/src/app/GatewayApp.tsx index 687d90af6..096ab2b49 100644 --- a/crates/agent-gateway/web/src/app/GatewayApp.tsx +++ b/crates/agent-gateway/web/src/app/GatewayApp.tsx @@ -1134,8 +1134,7 @@ function useGatewayAppController() { handleSidebarConversationsRemoved, handleSidebarLocalDraftDeleted, handleSidebarNewConversation, - handleSidebarOpenMcpHub, - handleSidebarOpenSkillsHub, + handleSidebarOpenResourceHub, handleSidebarSelectConversation, startNewConversation, } = createGatewayConversationActions({ @@ -2072,8 +2071,7 @@ function useGatewayAppController() { handleSidebarConversationsRemoved: handleSidebarConversationsRemovedWithWorkbench, handleSidebarLocalDraftDeleted: handleSidebarLocalDraftDeletedWithWorkbench, handleSidebarNewConversation, - handleSidebarOpenMcpHub, - handleSidebarOpenSkillsHub, + handleSidebarOpenResourceHub, handleSidebarProjectsCollapsedChange, handleSidebarRecentCollapsedChange, handleSidebarSelectConversation, diff --git a/crates/agent-gateway/web/src/app/GatewayAppView.tsx b/crates/agent-gateway/web/src/app/GatewayAppView.tsx index cf523b9d0..9236dffa1 100644 --- a/crates/agent-gateway/web/src/app/GatewayAppView.tsx +++ b/crates/agent-gateway/web/src/app/GatewayAppView.tsx @@ -245,8 +245,7 @@ export function GatewayAppView({ viewModel }: { viewModel: GatewayAppViewModel } handleSidebarConversationsRemoved, handleSidebarLocalDraftDeleted, handleSidebarNewConversation, - handleSidebarOpenMcpHub, - handleSidebarOpenSkillsHub, + handleSidebarOpenResourceHub, handleSidebarProjectsCollapsedChange, handleSidebarRecentCollapsedChange, handleSidebarSelectConversation, @@ -1328,9 +1327,9 @@ export function GatewayAppView({ viewModel }: { viewModel: GatewayAppViewModel } onLocalDraftDeleted={handleSidebarLocalDraftDeleted} onConversationsRemoved={handleSidebarConversationsRemoved} onCloseSidebar={() => setSidebarOpen(false)} - onOpenSettings={() => openSettings()} - onOpenSkillsHub={handleSidebarOpenSkillsHub} - onOpenMcpHub={handleSidebarOpenMcpHub} + sidebarShortcuts={settings.customSettings.sidebarShortcuts} + onOpenSettings={openSettings} + onOpenResourceHub={handleSidebarOpenResourceHub} /> {shareConversation ? ( diff --git a/crates/agent-gateway/web/src/app/gatewayConversationActions.ts b/crates/agent-gateway/web/src/app/gatewayConversationActions.ts index d4e314916..e85fa511a 100644 --- a/crates/agent-gateway/web/src/app/gatewayConversationActions.ts +++ b/crates/agent-gateway/web/src/app/gatewayConversationActions.ts @@ -6,6 +6,7 @@ import type { import { createTextComposerDraft } from "@liveagent/ui/lib/chat/composerDraft"; import type { ConversationMentionReference } from "@liveagent/ui/lib/chat/mentionReferences"; import type { PendingUploadedFile } from "@liveagent/ui/lib/chat/uploadedFiles"; +import type { SidebarShortcutId } from "@liveagent/ui/lib/settings/sidebarShortcuts"; import type { ConversationOpenOptions } from "@liveagent/ui/lib/sidebar/openController"; import type { SidebarStore } from "@liveagent/ui/lib/sidebar/store"; import type { Dispatch, MutableRefObject, SetStateAction } from "react"; @@ -208,7 +209,7 @@ export function createGatewayConversationActions(options: CreateGatewayConversat }); } }; - const openHub = (view: "skills-hub" | "mcp-hub") => { + const openHub = (view: Exclude) => { options.setRightDockOpen(false); if (isMobileSidebarLayout()) options.setSidebarOpen(false); options.cacheVisibleComposerDraft(); @@ -284,8 +285,7 @@ export function createGatewayConversationActions(options: CreateGatewayConversat handleSidebarConversationsRemoved, handleSidebarLocalDraftDeleted, handleSidebarNewConversation, - handleSidebarOpenMcpHub: () => openHub("mcp-hub"), - handleSidebarOpenSkillsHub: () => openHub("skills-hub"), + handleSidebarOpenResourceHub: (resource: SidebarShortcutId) => openHub(`${resource}-hub`), handleSidebarSelectConversation, startNewConversation, }; diff --git a/crates/agent-gateway/web/src/app/hooks/useGatewayChatPresentation.tsx b/crates/agent-gateway/web/src/app/hooks/useGatewayChatPresentation.tsx index a11b6be9b..4d7456978 100644 --- a/crates/agent-gateway/web/src/app/hooks/useGatewayChatPresentation.tsx +++ b/crates/agent-gateway/web/src/app/hooks/useGatewayChatPresentation.tsx @@ -145,8 +145,10 @@ export function useGatewayChatPresentation({ if (!token.trim()) return DEFAULT_BROWSER_TITLE; if (activeView === "skills-hub") return SKILLS_HUB_BROWSER_TITLE; if (activeView === "mcp-hub") return MCP_HUB_BROWSER_TITLE; + if (activeView === "memory-hub") return translate("settings.navMemory", settings.locale); + if (activeView === "cron-hub") return translate("settings.navCron", settings.locale); return displayedConversationTitle || DEFAULT_BROWSER_TITLE; - }, [activeView, displayedConversationTitle, historyShareToken, token]); + }, [activeView, displayedConversationTitle, historyShareToken, token, settings.locale]); useEffect(() => { if (typeof document !== "undefined") document.title = browserTitle; }, [browserTitle]); diff --git a/crates/agent-gateway/web/src/app/hooks/usePendingUploads.ts b/crates/agent-gateway/web/src/app/hooks/usePendingUploads.ts index 8bc2fedd1..d4f3b06e0 100644 --- a/crates/agent-gateway/web/src/app/hooks/usePendingUploads.ts +++ b/crates/agent-gateway/web/src/app/hooks/usePendingUploads.ts @@ -1,3 +1,4 @@ +import type { ApplicationViewId } from "@liveagent/ui/application/ApplicationView"; import type { MentionComposerHandle } from "@liveagent/ui/components/chat/MentionComposer"; import type { NotifyItem } from "@liveagent/ui/components/chat/NotifyToast"; import { t as translate } from "@liveagent/ui/i18n/index"; @@ -38,7 +39,7 @@ type UsePendingUploadsParams = { historyShareToken: string | null; settingsSyncReady: boolean; settingsOpen: boolean; - activeView: "chat" | "skills-hub" | "mcp-hub"; + activeView: ApplicationViewId; locale: AppSettings["locale"]; executionMode: AppSettings["system"]["executionMode"]; conversationId: string; diff --git a/crates/agent-gateway/web/src/pages/settings/types.ts b/crates/agent-gateway/web/src/pages/settings/types.ts index eb0dba68f..d8bedffa6 100644 --- a/crates/agent-gateway/web/src/pages/settings/types.ts +++ b/crates/agent-gateway/web/src/pages/settings/types.ts @@ -6,6 +6,8 @@ export type SetSettingsFn = (updater: (prev: AppSettings) => AppSettings) => voi export type SectionId = | "system" + | "skills" + | "mcp" | "systemTools" | "stt" | "providers" diff --git a/crates/agent-gateway/web/test/resource-hub-navigation.test.mjs b/crates/agent-gateway/web/test/resource-hub-navigation.test.mjs new file mode 100644 index 000000000..381cbc48d --- /dev/null +++ b/crates/agent-gateway/web/test/resource-hub-navigation.test.mjs @@ -0,0 +1,25 @@ +import assert from "node:assert/strict"; +import { fileURLToPath } from "node:url"; +import test from "node:test"; +import { createWebModuleLoader } from "../../test/helpers/load-web-module.mjs"; + +const loader = createWebModuleLoader({ + rootDir: fileURLToPath(new URL("../", import.meta.url)), +}); +const { createGatewayConversationActions } = loader.loadModule("src/app/gatewayConversationActions.ts"); + +for (const resource of ["skills", "mcp", "memory", "cron"]) { + test(`${resource} opens in the content area while preserving the desktop sidebar and composer draft`, () => { + const calls = []; + const actions = createGatewayConversationActions({ + setRightDockOpen: (open) => calls.push(["rightDock", open]), + setSidebarOpen: () => assert.fail("Desktop sidebar must stay open"), + cacheVisibleComposerDraft: () => calls.push(["cacheDraft"]), + setActiveView: (view) => calls.push(["view", view]), + setSettingsOpen: () => assert.fail("Resource navigation must not open settings"), + clearCachedComposerDraft: () => assert.fail("Draft must be retained"), + }); + actions.handleSidebarOpenResourceHub(resource); + assert.deepEqual(calls, [["rightDock", false], ["cacheDraft"], ["view", `${resource}-hub`]]); + }); +} diff --git a/crates/agent-gui/src/lib/settings/storage.ts b/crates/agent-gui/src/lib/settings/storage.ts index d0825910f..8ba3c31e5 100644 --- a/crates/agent-gui/src/lib/settings/storage.ts +++ b/crates/agent-gui/src/lib/settings/storage.ts @@ -1,3 +1,4 @@ +import { normalizeSidebarShortcuts } from "@liveagent/ui/lib/settings/sidebarShortcuts"; import { buildGatewaySettingsSyncPayload, buildGatewaySettingsSyncUpdatePayload, @@ -126,6 +127,7 @@ function readLocalUiSettings(): { projectsCollapsed: chatSidebar.projectsCollapsed === true, recentCollapsed: chatSidebar.recentCollapsed === true, }, + sidebarShortcuts: normalizeSidebarShortcuts(obj.sidebarShortcuts), chatTranscript: normalizeChatTranscriptSettings(obj.chatTranscript), rightDock: normalizeRightDockSettings(obj.rightDock), // 三档枚举(与 normalizeCustomSettings 同口径):脏值/缺省落回统计状态栏。 diff --git a/crates/agent-gui/src/pages/ChatPage.tsx b/crates/agent-gui/src/pages/ChatPage.tsx index 0894fa0bc..b555e650c 100644 --- a/crates/agent-gui/src/pages/ChatPage.tsx +++ b/crates/agent-gui/src/pages/ChatPage.tsx @@ -3978,17 +3978,13 @@ export function ChatPage(props: ChatPageProps) { onShareConversation={handleOpenShareModal} onOpenSharedConversations={handleOpenSharedHistoryManager} onCloseSidebar={handleCloseSidebar} - onOpenSettings={() => onOpenSettings()} + sidebarShortcuts={settings.customSettings.sidebarShortcuts} + onOpenSettings={onOpenSettings} appUpdate={appUpdate} - onOpenSkillsHub={() => { - cacheActiveComposerDraft(); - setRightDockOpen(false); - setActiveView("skills-hub"); - }} - onOpenMcpHub={() => { + onOpenResourceHub={(resource) => { cacheActiveComposerDraft(); setRightDockOpen(false); - setActiveView("mcp-hub"); + setActiveView(`${resource}-hub`); }} /> diff --git a/crates/agent-gui/src/pages/chat/composer/useComposerDraftCache.ts b/crates/agent-gui/src/pages/chat/composer/useComposerDraftCache.ts index 33d4c6256..1b83f7ff1 100644 --- a/crates/agent-gui/src/pages/chat/composer/useComposerDraftCache.ts +++ b/crates/agent-gui/src/pages/chat/composer/useComposerDraftCache.ts @@ -1,3 +1,4 @@ +import type { ApplicationViewId } from "@liveagent/ui/application/ApplicationView"; import type { MentionComposerHandle } from "@liveagent/ui/components/chat/MentionComposer"; import { type MutableRefObject, useCallback, useEffect, useRef } from "react"; import type { ConversationDraftStore } from "../conversations/conversationDraftStore"; @@ -5,7 +6,7 @@ import type { ConversationDraftStore } from "../conversations/conversationDraftS type UseComposerDraftCacheParams = { composerRef: MutableRefObject; currentConversationIdRef: MutableRefObject; - activeView: "chat" | "skills-hub" | "mcp-hub"; + activeView: ApplicationViewId; currentConversationId: string; draftStore: ConversationDraftStore; }; diff --git a/crates/agent-gui/src/pages/chat/workspace/useWorkspaceProjects.ts b/crates/agent-gui/src/pages/chat/workspace/useWorkspaceProjects.ts index 2c1d9c161..fda26c9a5 100644 --- a/crates/agent-gui/src/pages/chat/workspace/useWorkspaceProjects.ts +++ b/crates/agent-gui/src/pages/chat/workspace/useWorkspaceProjects.ts @@ -1,3 +1,4 @@ +import type { ApplicationViewId } from "@liveagent/ui/application/ApplicationView"; import { createUuid } from "@liveagent/ui/lib/shared/id"; import { sidebarScopeKey } from "@liveagent/ui/lib/sidebar/scope"; import type { SidebarStore } from "@liveagent/ui/lib/sidebar/store"; @@ -45,7 +46,7 @@ type UseWorkspaceProjectsParams = { workdir: string; t: (key: string) => string; setErrorMessage: Dispatch>; - setActiveView: Dispatch>; + setActiveView: Dispatch>; setRightDockOpen: Dispatch>; startNewConversationActionRef: MutableRefObject<(options?: { workdir?: string }) => string>; prepareComposerForConversationChangeActionRef: MutableRefObject<() => void>; diff --git a/crates/agent-gui/src/pages/settings/types.ts b/crates/agent-gui/src/pages/settings/types.ts index c969bf54f..92a79c6c8 100644 --- a/crates/agent-gui/src/pages/settings/types.ts +++ b/crates/agent-gui/src/pages/settings/types.ts @@ -8,6 +8,8 @@ export type SetSettingsFn = (updater: (prev: AppSettings) => AppSettings) => voi export type SectionId = | "system" | "shortcuts" + | "skills" + | "mcp" | "systemTools" | "stt" | "providers" diff --git a/crates/agent-gui/test/chat/search-sidebar-reveal.test.mjs b/crates/agent-gui/test/chat/search-sidebar-reveal.test.mjs index 342614385..c07679de6 100644 --- a/crates/agent-gui/test/chat/search-sidebar-reveal.test.mjs +++ b/crates/agent-gui/test/chat/search-sidebar-reveal.test.mjs @@ -14,10 +14,12 @@ const virtualizer = { const icons = [ "AlertCircle", "Blend", + "Brain", "Cable", "Check", "ChevronRight", "CirclePlus", + "Clock3", "Folder", "FolderClosed", "FolderOpen", diff --git a/crates/agent-gui/test/settings/normalization.test.mjs b/crates/agent-gui/test/settings/normalization.test.mjs index d8b14e8d2..a61fccaff 100644 --- a/crates/agent-gui/test/settings/normalization.test.mjs +++ b/crates/agent-gui/test/settings/normalization.test.mjs @@ -3542,3 +3542,27 @@ test("workspace resource overflow uses locale-independent Unicode code-point ord assert.ok(normalized["/repo/a"]); assert.equal(normalized["/repo/ä"], undefined); }); + + +test("sidebar shortcut migration tolerates partial and malformed preferences", () => { + for (const input of [null, [], "hidden", {}]) { + assert.deepEqual(settings.normalizeCustomSettings({ sidebarShortcuts: input }, []).sidebarShortcuts, + { skills: true, mcp: true, cron: true, memory: true }); + } + assert.deepEqual(settings.normalizeCustomSettings({ sidebarShortcuts: { + skills: false, mcp: "false", cron: null, memory: true, + } }, []).sidebarShortcuts, { skills: false, mcp: true, cron: true, memory: true }); +}); + +test("gateway sync preserves each device's sidebar shortcuts including legacy peers", () => { + const local = settings.normalizeSettings({ customSettings: { + sidebarShortcuts: { skills: false, mcp: false, cron: false, memory: false }, + } }); + const outgoing = sync.buildGatewaySettingsSyncPayload(local); + assert.deepEqual(outgoing.customSettings.sidebarShortcuts, + { skills: true, mcp: true, cron: true, memory: true }); + for (const incoming of [outgoing, { customSettings: {} }]) { + const applied = sync.applyGatewaySettingsSyncPayload(local, incoming); + assert.deepEqual(applied.customSettings.sidebarShortcuts, local.customSettings.sidebarShortcuts); + } +}); diff --git a/crates/agent-gui/test/settings/storage.test.mjs b/crates/agent-gui/test/settings/storage.test.mjs index f8197ebfe..bb465cdcf 100644 --- a/crates/agent-gui/test/settings/storage.test.mjs +++ b/crates/agent-gui/test/settings/storage.test.mjs @@ -128,3 +128,32 @@ test("a missing retryErrorSettings field falls back to all presets (legacy snaps }); }); }); + + +test("sidebar shortcuts survive a local save and reload without changing resource activation", async () => { + await withGlobal("localStorage", createMemoryLocalStorage(), async () => { + const commands = []; + const loader = createTsModuleLoader({ + mocks: { "@tauri-apps/api/core": { invoke: async (command) => { + commands.push(command); + return {}; + } } }, + }); + const storage = loader.loadModule("src/lib/settings/storage.ts"); + const settings = loader.loadModule("src/lib/settings/index.ts"); + const initial = await storage.loadPersistedSettings(); + assert.deepEqual(initial.customSettings.sidebarShortcuts, { + skills: true, mcp: true, cron: true, memory: true, + }); + const hidden = { skills: false, mcp: true, cron: false, memory: false }; + const next = settings.updateCustomSettings(initial, { sidebarShortcuts: hidden }); + commands.length = 0; + await storage.persistSettings(initial, next); + assert.deepEqual(commands, []); + const loaded = await storage.loadPersistedSettings(); + assert.deepEqual(loaded.customSettings.sidebarShortcuts, hidden); + for (const key of ["skills", "mcp", "memory"]) { + assert.deepEqual(loaded[key], initial[key]); + } + }); +}); diff --git a/crates/agent-ui/src/application/ApplicationView.tsx b/crates/agent-ui/src/application/ApplicationView.tsx index 880158596..0690b20cb 100644 --- a/crates/agent-ui/src/application/ApplicationView.tsx +++ b/crates/agent-ui/src/application/ApplicationView.tsx @@ -1,11 +1,13 @@ import type { AppSettings } from "@liveagent/app/lib/settings"; import type { CSSProperties, HTMLAttributes, ReactNode } from "react"; +import type { SidebarShortcutId } from "../lib/settings/sidebarShortcuts"; import { cn } from "../lib/shared/utils"; import type { SkillSummary } from "../lib/skills/index"; import { McpHubPage } from "../pages/mcp-hub/McpHubPage"; +import { ResourceManagementPage } from "../pages/resources/ResourceManagementPage"; import { SkillsHubPage } from "../pages/skills-hub/SkillsHubPage"; -export type ApplicationViewId = "chat" | "skills-hub" | "mcp-hub"; +export type ApplicationViewId = "chat" | `${SidebarShortcutId}-hub`; type ApplicationChatViewProps = { containerProps?: Omit, "children">; @@ -56,6 +58,14 @@ export function ApplicationView(props: ApplicationViewProps) { content = ( ); + } else if (activeView === "memory-hub" || activeView === "cron-hub") { + content = ( + + ); } else { const { containerProps, content: chatContent } = chat; content = ( diff --git a/crates/agent-ui/src/components/chat/ChatHistorySidebar.tsx b/crates/agent-ui/src/components/chat/ChatHistorySidebar.tsx index 12f0380b3..9b3a69ab4 100644 --- a/crates/agent-ui/src/components/chat/ChatHistorySidebar.tsx +++ b/crates/agent-ui/src/components/chat/ChatHistorySidebar.tsx @@ -2,10 +2,12 @@ import { type WorkspaceProject, workspaceProjectPathKey } from "@liveagent/app/l import { AlertCircle, Blend, + Brain, Cable, Check, ChevronRight, CirclePlus, + Clock3, Folder, FolderClosed, FolderOpen, @@ -50,6 +52,7 @@ import { useRef, useState, } from "react"; +import { normalizeSidebarShortcuts, SIDEBAR_SHORTCUTS } from "../../lib/settings/sidebarShortcuts"; import type { ConversationOpenOptions } from "../../lib/sidebar/openController"; import type { SidebarConversation } from "../../lib/sidebar/types"; import { @@ -235,9 +238,9 @@ export const ChatHistorySidebar = memo(function ChatHistorySidebar(props: ChatHi onDeleteConversations, onLoadMore, onCloseSidebar, + sidebarShortcuts = normalizeSidebarShortcuts(undefined), onOpenSettings, - onOpenSkillsHub, - onOpenMcpHub, + onOpenResourceHub, headerTop, brand, hideCloseButton = false, @@ -1377,46 +1380,30 @@ export const ChatHistorySidebar = memo(function ChatHistorySidebar(props: ChatHi {t("chat.searchConversations")} - - + {SIDEBAR_SHORTCUTS.filter(({ id }) => sidebarShortcuts[id]).map(({ id, labelKey }) => { + const Icon = { skills: Blend, mcp: Cable, cron: Clock3, memory: Brain }[id]; + const active = activeView === `${id}-hub`; + return ( + + ); + })} @@ -2157,7 +2144,7 @@ export const ChatHistorySidebar = memo(function ChatHistorySidebar(props: ChatHi // 不必靠文案或坐标去猜。可读名走 i18n——屏幕阅读器念给用户听的 // 东西不该为了脚本方便固定成英文。 data-testid="open-settings" - onClick={onOpenSettings} + onClick={() => onOpenSettings()} className="h-8 w-full justify-start gap-2.5 rounded-lg px-2.5 text-[calc(13px*var(--zone-font-scale,1))] font-normal text-foreground/85 shadow-none hover:bg-foreground/[0.08] hover:text-foreground" title={t("tooltip.settings")} > diff --git a/crates/agent-ui/src/components/chat/ChatHistorySidebarTypes.ts b/crates/agent-ui/src/components/chat/ChatHistorySidebarTypes.ts index f2b8721f3..63469c7f8 100644 --- a/crates/agent-ui/src/components/chat/ChatHistorySidebarTypes.ts +++ b/crates/agent-ui/src/components/chat/ChatHistorySidebarTypes.ts @@ -1,9 +1,11 @@ import type { WorkspaceProject } from "@liveagent/app/lib/settings"; +import type { ApplicationViewId } from "@liveagent/ui/application/ApplicationView"; import type { SidebarBatchDeleteOptions, SidebarBatchDeleteResult, } from "@liveagent/ui/lib/sidebar/batchDelete"; import type { ReactNode } from "react"; +import type { SidebarShortcutId, SidebarShortcuts } from "../../lib/settings/sidebarShortcuts"; import type { ConversationOpenOptions } from "../../lib/sidebar/openController"; import type { SidebarConversation } from "../../lib/sidebar/types"; import type { WorkspaceProjectGroup } from "../../lib/workspaceProjectTypes"; @@ -57,7 +59,7 @@ export type ChatHistorySidebarProps = { fontScale?: number; /** Incremented by the desktop host when its configured search shortcut fires. */ conversationSearchRequestKey?: number; - activeView?: "chat" | "skills-hub" | "mcp-hub"; + activeView?: ApplicationViewId; showProjects?: boolean; // Pre-sorted by the container (pinned/running/activity); rendered as-is. projects?: WorkspaceProject[]; @@ -140,9 +142,9 @@ export type ChatHistorySidebarProps = { ) => Promise; onLoadMore: () => void; onCloseSidebar: () => void; + sidebarShortcuts?: SidebarShortcuts; onOpenSettings: () => void; - onOpenSkillsHub?: () => void; - onOpenMcpHub?: () => void; + onOpenResourceHub: (resource: SidebarShortcutId) => void; headerTop?: ReactNode; brand?: ReactNode; hideCloseButton?: boolean; @@ -211,9 +213,10 @@ export type ChatHistorySidebarContainerSource = Required< | "onShareConversation" | "onOpenSharedConversations" | "onCloseSidebar" + | "sidebarShortcuts" | "onOpenSettings" > & - Required> & { + Required> & { projects: WorkspaceProject[]; }; @@ -226,9 +229,9 @@ type ChatHistorySidebarConversationSource = Pick< | "onShareConversation" | "onOpenSharedConversations" | "onCloseSidebar" + | "sidebarShortcuts" | "onOpenSettings" - | "onOpenSkillsHub" - | "onOpenMcpHub" + | "onOpenResourceHub" >; type ChatHistorySidebarConversationHandlers = Pick< @@ -310,8 +313,8 @@ export function buildChatHistorySidebarConversationProps( onOpenSharedConversations: source.onOpenSharedConversations, onCloseSidebar: source.onCloseSidebar, onOpenSettings: source.onOpenSettings, - onOpenSkillsHub: source.onOpenSkillsHub, - onOpenMcpHub: source.onOpenMcpHub, + sidebarShortcuts: source.sidebarShortcuts, + onOpenResourceHub: source.onOpenResourceHub, }; } diff --git a/crates/agent-ui/src/components/hub/HubChrome.tsx b/crates/agent-ui/src/components/hub/HubChrome.tsx index 3580ff6d0..68421b17f 100644 --- a/crates/agent-ui/src/components/hub/HubChrome.tsx +++ b/crates/agent-ui/src/components/hub/HubChrome.tsx @@ -1,4 +1,3 @@ -import { HubTitleBar } from "@liveagent/adapters/hubChrome"; import type { ReactNode } from "react"; import { cn } from "../../lib/shared/utils"; @@ -32,6 +31,7 @@ export function HubBackdrop(props: { tone?: "amber" | "violet" | "neutral" }) { // 侧栏开关不在这里渲染:AppWorkbenchChrome(ChatHeader)常驻于所有视图之上, // 侧栏收起时已经提供了同一个按钮。Hub 自己再画一个就会在窄屏上叠出两枚 // PanelLeft(#501 之前 Hub 页面没有顶栏,才需要自带一枚)。 +// 顶栏也已预留 macOS 窗口控件空间,Hub 内容无需再次添加标题栏占位。 export function HubHeader(props: { icon?: ReactNode; title: string; @@ -39,29 +39,30 @@ export function HubHeader(props: { tone?: "amber" | "violet" | "neutral"; actions?: ReactNode; prominent?: boolean; + embedded?: boolean; }) { - const { icon, title, subtitle, actions, prominent = false } = props; + const { icon, title, subtitle, actions, prominent = false, embedded = false } = props; return ( - <> - +
-
- {icon ? ( -
- {icon} -
- ) : null} -
+ {icon ? ( +
+ {icon} +
+ ) : null} +
+ {!embedded ? (

{title}

- {subtitle ? ( -

- {subtitle} -

- ) : null} -
- {actions ?
{actions}
: null} + ) : null} + {subtitle ? ( +

+ {subtitle} +

+ ) : null}
+ {actions ?
{actions}
: null}
- +
); } diff --git a/crates/agent-ui/src/i18n/translations/enUSSettings.ts b/crates/agent-ui/src/i18n/translations/enUSSettings.ts index 62a54c508..3aaec7d1b 100644 --- a/crates/agent-ui/src/i18n/translations/enUSSettings.ts +++ b/crates/agent-ui/src/i18n/translations/enUSSettings.ts @@ -1,4 +1,8 @@ export const EN_US_SETTINGS_TRANSLATIONS = { + "settings.navMcp": "MCP", + "settings.groupResources": "Resources & automation", + "settings.sidebarShortcuts": "Sidebar shortcuts", + "settings.showSidebarShortcut": "Show {name} in sidebar", "settings.navSystem": "System", "settings.navSystemTools": "System Tools", "settings.navStt": "Speech to Text", @@ -10,7 +14,7 @@ export const EN_US_SETTINGS_TRANSLATIONS = { "settings.navHooks": "Hooks", "settings.navAgents": "Prompt Templates", "settings.navSsh": "SSH", - "settings.navCron": "Cron", + "settings.navCron": "Scheduled tasks", "settings.navRemote": "Remote", "settings.navSkills": "Skills", "settings.navMemory": "Memory", diff --git a/crates/agent-ui/src/i18n/translations/zhCNSettings.ts b/crates/agent-ui/src/i18n/translations/zhCNSettings.ts index ab9e98876..3456a9346 100644 --- a/crates/agent-ui/src/i18n/translations/zhCNSettings.ts +++ b/crates/agent-ui/src/i18n/translations/zhCNSettings.ts @@ -1,4 +1,8 @@ export const ZH_CN_SETTINGS_TRANSLATIONS = { + "settings.navMcp": "MCP", + "settings.groupResources": "资源与自动化", + "settings.sidebarShortcuts": "侧栏快捷入口", + "settings.showSidebarShortcut": "在侧栏显示 {name}", "settings.navSystem": "系统设置", "settings.navSystemTools": "系统工具", "settings.navStt": "语音输入", @@ -10,7 +14,7 @@ export const ZH_CN_SETTINGS_TRANSLATIONS = { "settings.navHooks": "Hooks", "settings.navAgents": "提示词模板", "settings.navSsh": "SSH", - "settings.navCron": "Cron", + "settings.navCron": "定时任务", "settings.navRemote": "Remote", "settings.navSkills": "Skills", "settings.navMemory": "记忆", diff --git a/crates/agent-ui/src/lib/settings/index.ts b/crates/agent-ui/src/lib/settings/index.ts index 61ff9d485..ba0080a29 100644 --- a/crates/agent-ui/src/lib/settings/index.ts +++ b/crates/agent-ui/src/lib/settings/index.ts @@ -52,6 +52,7 @@ import { normalizeRightDockSettings, RIGHT_DOCK_SINGLETON_TAB_IDS, } from "./rightDockNormalization"; +import { normalizeSidebarShortcuts } from "./sidebarShortcuts"; import { computeNextMemoryOrganizerRunAt, normalizeMemoryOrganizerMode, @@ -1620,6 +1621,7 @@ export function normalizeCustomSettings( projectsCollapsed: chatSidebar.projectsCollapsed === true, recentCollapsed: chatSidebar.recentCollapsed === true, }, + sidebarShortcuts: normalizeSidebarShortcuts(obj.sidebarShortcuts), chatTranscript: normalizeChatTranscriptSettings(obj.chatTranscript), rightDock: normalizeRightDockSettings(obj.rightDock), // 三档枚举:历史配置无此字段或值不合法(含曾设想过的 "auto")一律落回默认的统计状态栏。 diff --git a/crates/agent-ui/src/lib/settings/sidebarShortcuts.ts b/crates/agent-ui/src/lib/settings/sidebarShortcuts.ts new file mode 100644 index 000000000..590b7e634 --- /dev/null +++ b/crates/agent-ui/src/lib/settings/sidebarShortcuts.ts @@ -0,0 +1,20 @@ +/** Navigation visibility only; these switches never disable the underlying resources. */ +export const SIDEBAR_SHORTCUTS = [ + { id: "skills", labelKey: "settings.navSkills" }, + { id: "mcp", labelKey: "settings.navMcp" }, + { id: "cron", labelKey: "settings.navCron" }, + { id: "memory", labelKey: "settings.navMemory" }, +] as const; + +export type SidebarShortcutId = (typeof SIDEBAR_SHORTCUTS)[number]["id"]; +export type SidebarShortcuts = Record; + +export function normalizeSidebarShortcuts(input: unknown): SidebarShortcuts { + const value = (input && typeof input === "object" ? input : {}) as Record; + return { + skills: value.skills !== false, + mcp: value.mcp !== false, + cron: value.cron !== false, + memory: value.memory !== false, + }; +} diff --git a/crates/agent-ui/src/lib/settings/sync.ts b/crates/agent-ui/src/lib/settings/sync.ts index 39507bbb3..43f9abc2c 100644 --- a/crates/agent-ui/src/lib/settings/sync.ts +++ b/crates/agent-ui/src/lib/settings/sync.ts @@ -498,6 +498,7 @@ function syncableCustomSettings( ): GatewaySettingsSyncCustomSettings { return { ...customSettings, + sidebarShortcuts: { skills: true, mcp: true, cron: true, memory: true }, chatSidebar: { projectsCollapsed: false, recentCollapsed: false, @@ -1328,6 +1329,7 @@ export function applyGatewaySettingsSyncPayload( ) : current.customSettings.rightDock, chatSidebar: current.customSettings.chatSidebar, + sidebarShortcuts: current.customSettings.sidebarShortcuts, // 展示样式是全局偏好,随同步走;老对端的 payload 没有该字段时保留本地值, // 不得被重置回默认。 composerContextDisplay: diff --git a/crates/agent-ui/src/lib/settings/types.ts b/crates/agent-ui/src/lib/settings/types.ts index 458c1188c..25332decf 100644 --- a/crates/agent-ui/src/lib/settings/types.ts +++ b/crates/agent-ui/src/lib/settings/types.ts @@ -2,6 +2,8 @@ import type { Locale } from "@liveagent/app/i18n/config"; import type { ThinkingLevel } from "@liveagent/ui/lib/models/modelThinking"; import type { WorkspaceProjectGroup } from "@liveagent/ui/lib/workspaceProjectTypes"; +import type { SidebarShortcuts } from "./sidebarShortcuts"; + export type ProviderId = "codex" | "claude_code" | "gemini" | "xai" | "deepseek"; export type ExecutionMode = "text" | "tools" | "agent-dev"; @@ -162,6 +164,7 @@ export type ChatTranscriptSettings = { export type ComposerContextDisplayMode = "statsBar" | "both" | "ring"; export type CustomSettings = { + sidebarShortcuts: SidebarShortcuts; conversationTitleModel?: SelectedModel; // AI commit-message generation in the Git review dock. Unset means "follow // the current conversation model"; a stored selection whose provider/model diff --git a/crates/agent-ui/src/pages/mcp-hub/McpHubPage.tsx b/crates/agent-ui/src/pages/mcp-hub/McpHubPage.tsx index dff931683..957abb39e 100644 --- a/crates/agent-ui/src/pages/mcp-hub/McpHubPage.tsx +++ b/crates/agent-ui/src/pages/mcp-hub/McpHubPage.tsx @@ -17,6 +17,7 @@ type McpHubPageProps = { settings: AppSettings; setSettings: (updater: (prev: AppSettings) => AppSettings) => void; isAgentMode: boolean; + embedded?: boolean; }; type McpHubView = "installed" | "store" | "import"; @@ -81,6 +82,7 @@ export function McpHubPage(props: McpHubPageProps) {
-
+
+ +
+
+ {memory ? ( + + ) : ( + + )} +
+
+
+ ); +} diff --git a/crates/agent-ui/src/pages/settings/ResourceHubSection.tsx b/crates/agent-ui/src/pages/settings/ResourceHubSection.tsx new file mode 100644 index 000000000..f7c347d69 --- /dev/null +++ b/crates/agent-ui/src/pages/settings/ResourceHubSection.tsx @@ -0,0 +1,19 @@ +import type { SettingsSectionProps } from "@liveagent/app/pages/settings/types"; +import { McpHubPage } from "../mcp-hub/McpHubPage"; +import { SkillsHubPage } from "../skills-hub/SkillsHubPage"; + +export function ResourceHubSection({ + resource, + settings, + setSettings, +}: SettingsSectionProps & { resource: "skills" | "mcp" }) { + const Hub = resource === "skills" ? SkillsHubPage : McpHubPage; + return ( + + ); +} diff --git a/crates/agent-ui/src/pages/settings/SettingsPage.tsx b/crates/agent-ui/src/pages/settings/SettingsPage.tsx index 20699dca5..99a03dbf7 100644 --- a/crates/agent-ui/src/pages/settings/SettingsPage.tsx +++ b/crates/agent-ui/src/pages/settings/SettingsPage.tsx @@ -2,8 +2,10 @@ import { createSettingsExtension } from "@liveagent/adapters/settingsExtension"; import type { SttProviderId } from "@liveagent/app/lib/settings"; import type { SettingsPageProps } from "@liveagent/app/pages/settings/types"; import { + Blend, BookOpen, Brain, + Cable, Clock3, Cloud, Cpu, @@ -23,6 +25,7 @@ import { HooksSection } from "./HooksSection"; import { MemoryPanel } from "./memory/MemoryPanel"; import { ProvidersSection } from "./ProvidersSection"; import { RemoteSection } from "./RemoteSection"; +import { ResourceHubSection } from "./ResourceHubSection"; import { SettingsShell } from "./SettingsShell"; import { SshSection } from "./SshSection"; import { SttSection } from "./SttSection"; @@ -111,11 +114,28 @@ export function SettingsPage(props: SettingsPageProps) { icon: , render: () => , }, + ...(["skills", "mcp"] as const).map((id, index) => ({ + id, + groupKey: "settings.groupResources", + groupOrder: 20, + order: (index + 1) * 10, + labelKey: id === "skills" ? "settings.navSkills" : "settings.navMcp", + icon: + id === "skills" ? ( + + ) : ( + + ), + contentMode: "fill" as const, + render: () => ( + + ), + })), { id: "memory", - groupKey: "settings.groupIntelligence", + groupKey: "settings.groupResources", groupOrder: 20, - order: 10, + order: 40, labelKey: "settings.navMemory", icon: , contentMode: "fill", @@ -130,7 +150,7 @@ export function SettingsPage(props: SettingsPageProps) { { id: "systemTools", groupKey: "settings.groupIntelligence", - groupOrder: 20, + groupOrder: 25, order: 20, labelKey: "settings.navSystemTools", icon: , @@ -142,7 +162,7 @@ export function SettingsPage(props: SettingsPageProps) { // 在桌面主机那台机器上完成的动作在 web 面收起——判定交给组件的 surface。 id: "cua", groupKey: "settings.groupIntelligence", - groupOrder: 20, + groupOrder: 25, order: 25, labelKey: "settings.navCua", icon: , @@ -157,7 +177,7 @@ export function SettingsPage(props: SettingsPageProps) { { id: "stt", groupKey: "settings.groupIntelligence", - groupOrder: 20, + groupOrder: 25, order: 30, labelKey: "settings.navStt", icon: , @@ -173,9 +193,9 @@ export function SettingsPage(props: SettingsPageProps) { }, { id: "hooks", - groupKey: "settings.groupAutomation", - groupOrder: 30, - order: 10, + groupKey: "settings.groupResources", + groupOrder: 20, + order: 50, labelKey: "settings.navHooks", icon: , contentMode: "fill", @@ -183,9 +203,9 @@ export function SettingsPage(props: SettingsPageProps) { }, { id: "cron", - groupKey: "settings.groupAutomation", - groupOrder: 30, - order: 20, + groupKey: "settings.groupResources", + groupOrder: 20, + order: 30, labelKey: "settings.navCron", icon: , render: () => , diff --git a/crates/agent-ui/src/pages/settings/SidebarShortcutsSection.tsx b/crates/agent-ui/src/pages/settings/SidebarShortcutsSection.tsx new file mode 100644 index 000000000..fbf56b640 --- /dev/null +++ b/crates/agent-ui/src/pages/settings/SidebarShortcutsSection.tsx @@ -0,0 +1,37 @@ +import { updateCustomSettings } from "@liveagent/app/lib/settings"; +import type { SettingsSectionProps } from "@liveagent/app/pages/settings/types"; +import { useLocale } from "@liveagent/ui/i18n"; +import { SIDEBAR_SHORTCUTS } from "../../lib/settings/sidebarShortcuts"; +import { AgentActivationSwitch, SettingsGroup, SettingsRow } from "./shared"; + +export function SidebarShortcutsSection({ settings, setSettings }: SettingsSectionProps) { + const { t } = useLocale(); + return ( +
+ + {SIDEBAR_SHORTCUTS.map(({ id, labelKey }) => ( + + setSettings((prev) => + updateCustomSettings(prev, { + sidebarShortcuts: { + ...prev.customSettings.sidebarShortcuts, + [id]: !prev.customSettings.sidebarShortcuts[id], + }, + }), + ) + } + /> + } + /> + ))} + +
+ ); +} diff --git a/crates/agent-ui/src/pages/settings/SystemSettingsForm.tsx b/crates/agent-ui/src/pages/settings/SystemSettingsForm.tsx index d28da3938..bd7a33804 100644 --- a/crates/agent-ui/src/pages/settings/SystemSettingsForm.tsx +++ b/crates/agent-ui/src/pages/settings/SystemSettingsForm.tsx @@ -49,6 +49,8 @@ import { } from "@liveagent/ui/pages/settings/shared"; import { type ComponentProps, type ReactNode, useEffect, useMemo, useState } from "react"; +import { SidebarShortcutsSection } from "./SidebarShortcutsSection"; + const FONT_SCALE_OPTIONS = [0.9, 1, 1.1, 1.2] as const; type FontFamilySettingKey = "interfaceFontFamily" | "chatFontFamily" | "codeFontFamily"; @@ -437,6 +439,8 @@ export function SystemSettingsForm(props: SettingsSectionProps) {
+ +
-
+
Date: Wed, 9 Sep 2026 00:30:59 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(settings):=20=E5=90=8C=E6=AD=A5=20Web?= =?UTF-8?q?=20=E4=B8=8E=E6=A1=8C=E9=9D=A2=E7=AB=AF=E4=BE=A7=E6=A0=8F?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E5=85=A5=E5=8F=A3=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 让入口可见性参与 Gateway 设置快照和增量更新,保留旧版本缺失字段时的兼容行为,并补充双向同步回归测试。 Refs #767 --- .../test/settings/normalization.test.mjs | 52 ++++++++++++++++--- crates/agent-ui/src/lib/settings/sync.ts | 5 +- docs/features/skills-and-mcp.md | 2 +- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/crates/agent-gui/test/settings/normalization.test.mjs b/crates/agent-gui/test/settings/normalization.test.mjs index a61fccaff..3a7ff567d 100644 --- a/crates/agent-gui/test/settings/normalization.test.mjs +++ b/crates/agent-gui/test/settings/normalization.test.mjs @@ -3554,15 +3554,51 @@ test("sidebar shortcut migration tolerates partial and malformed preferences", ( } }, []).sidebarShortcuts, { skills: false, mcp: true, cron: true, memory: true }); }); -test("gateway sync preserves each device's sidebar shortcuts including legacy peers", () => { - const local = settings.normalizeSettings({ customSettings: { +test("desktop snapshots synchronize sidebar shortcuts to WebUI", () => { + const desktop = settings.normalizeSettings({ customSettings: { + sidebarShortcuts: { skills: false, mcp: true, cron: false, memory: true }, + } }); + const web = settings.normalizeSettings({ customSettings: { + sidebarShortcuts: { skills: true, mcp: false, cron: true, memory: false }, + } }); + const snapshot = sync.buildGatewaySettingsSyncPayload(desktop); + assert.deepEqual(snapshot.customSettings.sidebarShortcuts, desktop.customSettings.sidebarShortcuts); + const hydrated = sync.applyGatewaySettingsSyncPayload(web, snapshot); + assert.deepEqual(hydrated.customSettings.sidebarShortcuts, desktop.customSettings.sidebarShortcuts); + assert.equal(sync.buildGatewaySettingsSyncUpdatePayload(desktop, hydrated).customSettings, undefined); +}); + +for (const resource of ["skills", "mcp", "cron", "memory"]) { + test(`WebUI ${resource} shortcut edits synchronize in both directions without changing resources`, () => { + let desktop = settings.normalizeSettings({}); + let web = sync.applyGatewaySettingsSyncPayload( + settings.normalizeSettings({}), sync.buildGatewaySettingsSyncPayload(desktop), + ); + for (const enabled of [false, true]) { + const edited = settings.updateCustomSettings(web, { + sidebarShortcuts: { ...web.customSettings.sidebarShortcuts, [resource]: enabled }, + }); + const update = sync.buildGatewaySettingsSyncUpdatePayload(web, edited); + assert.deepEqual(Object.keys(update), ["customSettings"]); + assert.equal(update.customSettings.sidebarShortcuts[resource], enabled); + const received = sync.applyGatewaySettingsSyncPayload(desktop, update); + assert.deepEqual(received.customSettings.sidebarShortcuts, edited.customSettings.sidebarShortcuts); + for (const key of ["skills", "mcp", "memory"]) { + assert.deepEqual(received[key], desktop[key]); + } + desktop = received; + web = sync.applyGatewaySettingsSyncPayload(edited, sync.buildGatewaySettingsSyncPayload(desktop)); + assert.deepEqual(sync.buildGatewaySettingsSyncUpdatePayload(edited, web), {}); + } + }); +} + +test("legacy gateway messages without sidebar shortcuts preserve the current preference", () => { + const current = settings.normalizeSettings({ customSettings: { sidebarShortcuts: { skills: false, mcp: false, cron: false, memory: false }, } }); - const outgoing = sync.buildGatewaySettingsSyncPayload(local); - assert.deepEqual(outgoing.customSettings.sidebarShortcuts, - { skills: true, mcp: true, cron: true, memory: true }); - for (const incoming of [outgoing, { customSettings: {} }]) { - const applied = sync.applyGatewaySettingsSyncPayload(local, incoming); - assert.deepEqual(applied.customSettings.sidebarShortcuts, local.customSettings.sidebarShortcuts); + for (const incoming of [{}, { customSettings: {} }, { customSettings: { promptClarifyEnabled: false } }]) { + const applied = sync.applyGatewaySettingsSyncPayload(current, incoming); + assert.deepEqual(applied.customSettings.sidebarShortcuts, current.customSettings.sidebarShortcuts); } }); diff --git a/crates/agent-ui/src/lib/settings/sync.ts b/crates/agent-ui/src/lib/settings/sync.ts index 43f9abc2c..4de1ffef8 100644 --- a/crates/agent-ui/src/lib/settings/sync.ts +++ b/crates/agent-ui/src/lib/settings/sync.ts @@ -498,7 +498,6 @@ function syncableCustomSettings( ): GatewaySettingsSyncCustomSettings { return { ...customSettings, - sidebarShortcuts: { skills: true, mcp: true, cron: true, memory: true }, chatSidebar: { projectsCollapsed: false, recentCollapsed: false, @@ -1329,7 +1328,9 @@ export function applyGatewaySettingsSyncPayload( ) : current.customSettings.rightDock, chatSidebar: current.customSettings.chatSidebar, - sidebarShortcuts: current.customSettings.sidebarShortcuts, + // 入口可见性跨端同步;旧端未携带此字段时保留当前状态。 + sidebarShortcuts: + incomingCustomSettings.sidebarShortcuts ?? current.customSettings.sidebarShortcuts, // 展示样式是全局偏好,随同步走;老对端的 payload 没有该字段时保留本地值, // 不得被重置回默认。 composerContextDisplay: diff --git a/docs/features/skills-and-mcp.md b/docs/features/skills-and-mcp.md index 1d351e298..715bf6074 100644 --- a/docs/features/skills-and-mcp.md +++ b/docs/features/skills-and-mcp.md @@ -8,7 +8,7 @@ 从主侧栏打开这四类资源时,只切换右侧内容区域,保留桌面侧栏与当前聊天草稿;窄屏沿用原有的侧栏自动收起行为。四个页面共用紧凑的顶部布局。 -可见性保存在本机 `customSettings.sidebarShortcuts`(`skills`、`mcp`、`cron`、`memory`)中,不随 Gateway 设置同步覆盖其他设备;旧配置中缺少字段时按显示处理。 +可见性保存在 `customSettings.sidebarShortcuts`(`skills`、`mcp`、`cron`、`memory`)中,经 Gateway 在桌面端与连接该桌面 Agent 的 WebUI 间双向同步,并写入各端本地存储以便刷新后恢复。旧配置中缺少字段时按显示处理;旧版本同步消息未携带该字段时保留当前状态。 ## Skills 架构