mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
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.
This commit is contained in:
parent
f975837054
commit
3198ed7cc3
7 changed files with 26 additions and 26 deletions
|
|
@ -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 ? (
|
||||
<DropdownMenuItem className={dropdownMenuRow} onSelect={event => event.preventDefault()}>
|
||||
{copy.fast}
|
||||
<Switch checked={fastOn} className="ml-auto" onCheckedChange={toggleFast} size="xs" />
|
||||
<Switch checked={fastOn} className="ml-auto" onCheckedChange={setFast} size="xs" />
|
||||
</DropdownMenuItem>
|
||||
) : null}
|
||||
{reasoning ? (
|
||||
|
|
|
|||
|
|
@ -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<typeof HermesApi>()),
|
||||
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 () => {
|
||||
|
|
|
|||
|
|
@ -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)}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
/>
|
||||
</button>
|
||||
<Checkbox checked={checkState} onCheckedChange={next => toggleProvider(provider, next !== false)} />
|
||||
<Checkbox checked={checkState} onCheckedChange={next => setProviderVisible(provider, next !== false)} />
|
||||
</div>
|
||||
{!collapsed &&
|
||||
models.map(family => {
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
</ContextMenuItem>
|
||||
{minimizable && (
|
||||
<ContextMenuItem onSelect={() => toggleTreeGroupMinimized(nodeId, !minimized)}>
|
||||
<ContextMenuItem onSelect={() => setTreeGroupMinimized(nodeId, !minimized)}>
|
||||
{minimized ? t.zones.restore : t.zones.minimize}
|
||||
</ContextMenuItem>
|
||||
)}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<ToolsetInfo[]> {
|
|||
})
|
||||
}
|
||||
|
||||
export function toggleToolset(
|
||||
export function setToolsetEnabled(
|
||||
name: string,
|
||||
enabled: boolean
|
||||
): Promise<{ ok: boolean; name: string; enabled: boolean }> {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue