From 00779800f650c8b875f0f9ab6f08fa33531e6494 Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Wed, 24 Jun 2026 19:18:29 -0500 Subject: [PATCH] fix(desktop): hide platform/internal toolsets from the Skills & Tools list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GET /api/tools/toolsets returns the full CONFIGURABLE_TOOLSETS set with no desktop curation, so the Skills & Tools → Toolsets list shows entries that don't belong in a flat per-user toggle: platform-coupled toolsets (discord, discord_admin, yuanbao — which `hermes tools` already platform-restricts off the CLI) and internal plumbing (context_engine, moa). `hermes tools` curates these out; the desktop didn't. Add a small documented block-list + predicate (mirroring desktop-slash-commands.ts) and apply it in the toolset list filter. Hiding a row is cosmetic — enabled state and runtime gating are untouched. --- apps/desktop/src/app/skills/index.tsx | 5 ++++ apps/desktop/src/lib/desktop-toolsets.test.ts | 17 +++++++++++++ apps/desktop/src/lib/desktop-toolsets.ts | 24 +++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 apps/desktop/src/lib/desktop-toolsets.test.ts create mode 100644 apps/desktop/src/lib/desktop-toolsets.ts diff --git a/apps/desktop/src/app/skills/index.tsx b/apps/desktop/src/app/skills/index.tsx index 90aa4a24357..f8d196d9b14 100644 --- a/apps/desktop/src/app/skills/index.tsx +++ b/apps/desktop/src/app/skills/index.tsx @@ -9,6 +9,7 @@ import { Switch } from '@/components/ui/switch' import { TextTab, TextTabMeta } from '@/components/ui/text-tab' import { getSkills, getToolsets, toggleSkill, toggleToolset } from '@/hermes' import { useI18n } from '@/i18n' +import { isDesktopToolsetVisible } from '@/lib/desktop-toolsets' import { cn } from '@/lib/utils' import { notify, notifyError } from '@/store/notifications' import type { SkillInfo, ToolsetInfo } from '@/types/hermes' @@ -52,6 +53,10 @@ function filteredToolsets(toolsets: ToolsetInfo[], query: string): ToolsetInfo[] return toolsets .filter(toolset => { + if (!isDesktopToolsetVisible(toolset.name)) { + return false + } + if (!q) { return true } diff --git a/apps/desktop/src/lib/desktop-toolsets.test.ts b/apps/desktop/src/lib/desktop-toolsets.test.ts new file mode 100644 index 00000000000..5e77333de9e --- /dev/null +++ b/apps/desktop/src/lib/desktop-toolsets.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest' + +import { isDesktopToolsetVisible } from './desktop-toolsets' + +describe('isDesktopToolsetVisible', () => { + it('hides platform-coupled and internal toolsets', () => { + for (const name of ['discord', 'discord_admin', 'yuanbao', 'context_engine', 'moa']) { + expect(isDesktopToolsetVisible(name)).toBe(false) + } + }) + + it('keeps ordinary user-facing toolsets', () => { + for (const name of ['web', 'browser', 'terminal', 'file', 'memory', 'vision', 'image_gen']) { + expect(isDesktopToolsetVisible(name)).toBe(true) + } + }) +}) diff --git a/apps/desktop/src/lib/desktop-toolsets.ts b/apps/desktop/src/lib/desktop-toolsets.ts new file mode 100644 index 00000000000..31bc2328eea --- /dev/null +++ b/apps/desktop/src/lib/desktop-toolsets.ts @@ -0,0 +1,24 @@ +// Curation for the desktop "Skills & Tools → Toolsets" list. +// +// `GET /api/tools/toolsets` returns the full CONFIGURABLE_TOOLSETS set with no +// desktop-specific filter — so it surfaces entries that don't belong in a flat +// per-user toggle list on the desktop: platform-coupled toolsets (which +// `hermes tools` already platform-restricts on the CLI) and internal plumbing +// that isn't a user-facing capability. Mirror the curation approach used for +// slash commands (`desktop-slash-commands.ts`): one documented block-list, one +// predicate. Hiding a toolset only removes its row — its enabled state and +// runtime gating are untouched. +const DESKTOP_HIDDEN_TOOLSETS = new Set([ + // Platform-coupled — only meaningful when that platform is the active + // adapter; `hermes tools` restricts these off the CLI too. + 'discord', + 'discord_admin', + 'yuanbao', + // Internal plumbing, not a user capability toggle. + 'context_engine', + 'moa' +]) + +export function isDesktopToolsetVisible(name: string): boolean { + return !DESKTOP_HIDDEN_TOOLSETS.has(name) +}