From 3198ed7cc3d325cfc4b314d530c27d95fa742a26 Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Thu, 30 Jul 2026 02:41:41 -0500 Subject: [PATCH] refactor(desktop): name value-taking setters set*, not toggle* toggleSkill(name, enabled) is a setter wearing a toggle's name. A toggle takes no argument; anything handed an explicit value is a set. --- apps/desktop/src/app/shell/model-edit-submenu.tsx | 6 +++--- apps/desktop/src/app/skills/index.test.tsx | 12 ++++++------ apps/desktop/src/app/skills/mcp-tab.tsx | 6 +++--- .../src/components/model-visibility-dialog.tsx | 4 ++-- .../pane-shell/tree/renderer/tree-group.tsx | 6 +++--- .../src/components/pane-shell/tree/store.ts | 14 +++++++------- apps/desktop/src/hermes.ts | 4 ++-- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/apps/desktop/src/app/shell/model-edit-submenu.tsx b/apps/desktop/src/app/shell/model-edit-submenu.tsx index 417edd4d222..6fca3997a0c 100644 --- a/apps/desktop/src/app/shell/model-edit-submenu.tsx +++ b/apps/desktop/src/app/shell/model-edit-submenu.tsx @@ -150,7 +150,7 @@ function ModelEditSubmenuBody({ // Preset-only without a session: `isActive` holds for the global/default // row pre-session, and the gateway's `config.set` falls back to global // config when none matches — so don't reach it (preset + optimistic store - // are the whole effect). Same guard in applyModelPreset / toggleFast. + // are the whole effect). Same guard in applyModelPreset / setFast. if (!activeSessionId) { return } @@ -169,7 +169,7 @@ function ModelEditSubmenuBody({ } } - const toggleFast = (enabled: boolean) => { + const setFast = (enabled: boolean) => { if (fastControl.kind === 'variant') { // Fast is a separate model id. Record the choice on the base model's // preset (selectFamily picks the `-fast` sibling later when set), and @@ -245,7 +245,7 @@ function ModelEditSubmenuBody({ {hasFast ? ( event.preventDefault()}> {copy.fast} - + ) : null} {reasoning ? ( diff --git a/apps/desktop/src/app/skills/index.test.tsx b/apps/desktop/src/app/skills/index.test.tsx index 0c05bec75ad..2477f0c7746 100644 --- a/apps/desktop/src/app/skills/index.test.tsx +++ b/apps/desktop/src/app/skills/index.test.tsx @@ -10,8 +10,8 @@ import { queryClient } from '@/lib/query-client' const getSkills = vi.fn() const getToolsets = vi.fn() -const toggleSkill = vi.fn() -const toggleToolset = vi.fn() +const setSkillEnabled = vi.fn() +const setToolsetEnabled = vi.fn() const getToolsetConfig = vi.fn() const selectToolsetProvider = vi.fn() const getUsageAnalytics = vi.fn() @@ -23,8 +23,8 @@ vi.mock('@/hermes', async importOriginal => ({ ...(await importOriginal()), getSkills: () => getSkills(), getToolsets: () => getToolsets(), - toggleSkill: (name: string, enabled: boolean) => toggleSkill(name, enabled), - toggleToolset: (name: string, enabled: boolean) => toggleToolset(name, enabled), + setSkillEnabled: (name: string, enabled: boolean) => setSkillEnabled(name, enabled), + setToolsetEnabled: (name: string, enabled: boolean) => setToolsetEnabled(name, enabled), getToolsetConfig: (name: string) => getToolsetConfig(name), selectToolsetProvider: (toolset: string, provider: string) => selectToolsetProvider(toolset, provider), getUsageAnalytics: (days: number) => getUsageAnalytics(days) @@ -78,7 +78,7 @@ async function renderSkills() { beforeEach(() => { getSkills.mockResolvedValue([]) getToolsets.mockResolvedValue([toolset()]) - toggleToolset.mockResolvedValue({ ok: true, name: 'web', enabled: false }) + setToolsetEnabled.mockResolvedValue({ ok: true, name: 'web', enabled: false }) getToolsetConfig.mockResolvedValue({ has_category: true, active_provider: null, providers: [] }) getUsageAnalytics.mockResolvedValue({ tools: [] }) }) @@ -101,7 +101,7 @@ describe('SkillsView toolset management', () => { fireEvent.click(sw) }) - await waitFor(() => expect(toggleToolset).toHaveBeenCalledWith('web', false)) + await waitFor(() => expect(setToolsetEnabled).toHaveBeenCalledWith('web', false)) }) it('renders toolset titles without leading emoji', async () => { diff --git a/apps/desktop/src/app/skills/mcp-tab.tsx b/apps/desktop/src/app/skills/mcp-tab.tsx index cc7c335f3cd..c3041448601 100644 --- a/apps/desktop/src/app/skills/mcp-tab.tsx +++ b/apps/desktop/src/app/skills/mcp-tab.tsx @@ -730,7 +730,7 @@ export function McpTab({ gateway }: { gateway: HermesGateway | null }) { return next } - const toggleServer = async (serverName: string, enabled: boolean) => { + const setServerEnabled = async (serverName: string, enabled: boolean) => { if (profilePending) { return } @@ -978,7 +978,7 @@ export function McpTab({ gateway }: { gateway: HermesGateway | null }) { onBack={() => setCursor(0)} onProbe={() => void runProbe(selected)} onRemove={() => void removeServer(selected)} - onToggle={checked => void toggleServer(selected, checked)} + onToggle={checked => void setServerEnabled(selected, checked)} onToggleTool={toolName => void toggleTool(selected, toolName)} probe={probes[selected]} saved={savedEntry !== undefined} @@ -1019,7 +1019,7 @@ export function McpTab({ gateway }: { gateway: HermesGateway | null }) { onProbe={() => void runProbe(serverName)} onRemove={() => void removeServer(serverName)} onSelect={() => focusServer(serverName)} - onToggle={checked => void toggleServer(serverName, checked)} + onToggle={checked => void setServerEnabled(serverName, checked)} status={status} statusText={statusLine(m, status, probes[serverName], server)} /> diff --git a/apps/desktop/src/components/model-visibility-dialog.tsx b/apps/desktop/src/components/model-visibility-dialog.tsx index cc4d58bd11d..7c4a47c534e 100644 --- a/apps/desktop/src/components/model-visibility-dialog.tsx +++ b/apps/desktop/src/components/model-visibility-dialog.tsx @@ -67,7 +67,7 @@ export function ModelVisibilityDialog({ setVisibleModels(toggleModelVisibility($visibleModels.get(), providers, provider.slug, model)) } - const toggleProvider = (provider: ModelOptionProvider, next: boolean) => { + const setProviderVisible = (provider: ModelOptionProvider, next: boolean) => { setVisibleModels(setProviderVisibility($visibleModels.get(), providers, provider.slug, next)) } @@ -135,7 +135,7 @@ export function ModelVisibilityDialog({ size="0.625rem" /> - toggleProvider(provider, next !== false)} /> + setProviderVisible(provider, next !== false)} /> {!collapsed && models.map(family => { diff --git a/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.tsx b/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.tsx index 8c480dbefcd..a4ccc783cba 100644 --- a/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.tsx +++ b/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.tsx @@ -46,7 +46,7 @@ import { SESSION_TILE_DRAG, setTreeGroupHeaderHidden, splitTreeZone, - toggleTreeGroupMinimized + setTreeGroupMinimized } from '../store' import { type DoubleTapContext, startPaneDrag } from './drag-session' @@ -110,7 +110,7 @@ function ZoneMenu({ {headerHidden ? t.zones.showHeader : t.zones.hideHeader} {minimizable && ( - toggleTreeGroupMinimized(nodeId, !minimized)}> + setTreeGroupMinimized(nodeId, !minimized)}> {minimized ? t.zones.restore : t.zones.minimize} )} @@ -250,7 +250,7 @@ export function TreeGroup({ const hideHeaderDoubleTap: DoubleTapContext = { key: `hide-header-${node.id}`, onDoubleTap: () => { - toggleTreeGroupMinimized(node.id, false) + setTreeGroupMinimized(node.id, false) setTreeGroupHeaderHidden(node.id, true) } } diff --git a/apps/desktop/src/components/pane-shell/tree/store.ts b/apps/desktop/src/components/pane-shell/tree/store.ts index cf09dde33e0..bda6280ba39 100644 --- a/apps/desktop/src/components/pane-shell/tree/store.ts +++ b/apps/desktop/src/components/pane-shell/tree/store.ts @@ -798,7 +798,7 @@ export function revealTreePane(paneId: string) { // just front its tab behind a collapsed rail. Without this, a tool panel // (terminal/logs) in a shared zone stays minimized after its toggle opens // it: setPaneCollapsed's shared-zone branch calls revealTreePane instead - // of toggleTreeGroupMinimized, so the zone never un-minimizes and the + // of setTreeGroupMinimized, so the zone never un-minimizes and the // pane appears to "close but not open" on ctrl-` / tab click. let next = tree @@ -1217,7 +1217,7 @@ export function splitTreeZone(groupId: string, side: RootEdge, movePaneId: strin } } -export function toggleTreeGroupMinimized(groupId: string, minimized: boolean) { +export function setTreeGroupMinimized(groupId: string, minimized: boolean) { const tree = $layoutTree.get() if (tree) { @@ -1256,7 +1256,7 @@ export function setPaneCollapsed(paneId: string, collapsed: boolean) { activateTreePane(group.id, group.panes[at - 1] ?? group.panes[at + 1]) } else { - toggleTreeGroupMinimized(group.id, true) // pure tool zone folds as a unit + setTreeGroupMinimized(group.id, true) // pure tool zone folds as a unit } } else if (!collapsed) { revealTreePane(paneId) @@ -1266,7 +1266,7 @@ export function setPaneCollapsed(paneId: string, collapsed: boolean) { } if (Boolean(group.minimized) !== collapsed) { - toggleTreeGroupMinimized(group.id, collapsed) + setTreeGroupMinimized(group.id, collapsed) if (!collapsed) { revealTreePane(paneId) @@ -1290,7 +1290,7 @@ export function restoreTreePane(paneId: string) { const group = paneGroup(paneId) if (group?.minimized) { - toggleTreeGroupMinimized(group.id, false) + setTreeGroupMinimized(group.id, false) } revealTreePane(paneId) @@ -1301,7 +1301,7 @@ export function restoreTreePane(paneId: string) { const group = paneGroup(paneId) if (group) { - toggleTreeGroupMinimized(group.id, false) + setTreeGroupMinimized(group.id, false) activateTreePane(group.id, paneId) } } @@ -1321,7 +1321,7 @@ export function collapseTreePane(paneId: string) { const group = paneGroup(paneId) if (group) { - toggleTreeGroupMinimized(group.id, true) + setTreeGroupMinimized(group.id, true) } } diff --git a/apps/desktop/src/hermes.ts b/apps/desktop/src/hermes.ts index 9b85e04c277..71cb6efe6f9 100644 --- a/apps/desktop/src/hermes.ts +++ b/apps/desktop/src/hermes.ts @@ -960,7 +960,7 @@ export function editLearningNode(id: string, content: string): Promise<{ message }) } -export function toggleSkill(name: string, enabled: boolean): Promise<{ ok: boolean; name: string; enabled: boolean }> { +export function setSkillEnabled(name: string, enabled: boolean): Promise<{ ok: boolean; name: string; enabled: boolean }> { return window.hermesDesktop.api<{ ok: boolean; name: string; enabled: boolean }>({ ...profileScoped(), path: '/api/skills/toggle', @@ -1034,7 +1034,7 @@ export function getToolsets(): Promise { }) } -export function toggleToolset( +export function setToolsetEnabled( name: string, enabled: boolean ): Promise<{ ok: boolean; name: string; enabled: boolean }> {