fix(desktop): hide platform/internal toolsets from the Skills & Tools list

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.
This commit is contained in:
Brooklyn Nicholson 2026-06-24 19:18:29 -05:00
parent d335164833
commit 00779800f6
3 changed files with 46 additions and 0 deletions

View file

@ -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
}

View file

@ -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)
}
})
})

View file

@ -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)
}