From f0f705d3ca18da0d1e69e179fd91e348837b6d12 Mon Sep 17 00:00:00 2001 From: Sandy Tao Date: Tue, 20 Jan 2026 13:00:43 -0800 Subject: [PATCH] feat(core): unify agent enabled and disabled flags (#17127) --- packages/cli/src/config/settingsSchema.ts | 4 ---- .../cli/src/ui/commands/agentsCommand.test.ts | 4 ++-- packages/cli/src/ui/commands/agentsCommand.ts | 10 ++++---- packages/cli/src/utils/agentSettings.ts | 23 +++++++++---------- packages/core/src/agents/registry.test.ts | 6 ++--- packages/core/src/agents/registry.ts | 12 ++++------ packages/core/src/config/config.ts | 1 - schemas/settings.schema.json | 4 ---- 8 files changed, 25 insertions(+), 39 deletions(-) diff --git a/packages/cli/src/config/settingsSchema.ts b/packages/cli/src/config/settingsSchema.ts index 9a87327ef4..779e86cee5 100644 --- a/packages/cli/src/config/settingsSchema.ts +++ b/packages/cli/src/config/settingsSchema.ts @@ -2117,10 +2117,6 @@ export const SETTINGS_SCHEMA_DEFINITIONS: Record< type: 'boolean', description: 'Whether to enable the agent.', }, - disabled: { - type: 'boolean', - description: 'Whether to disable the agent.', - }, }, }, CustomTheme: { diff --git a/packages/cli/src/ui/commands/agentsCommand.test.ts b/packages/cli/src/ui/commands/agentsCommand.test.ts index e8d2568f60..3070e4d779 100644 --- a/packages/cli/src/ui/commands/agentsCommand.test.ts +++ b/packages/cli/src/ui/commands/agentsCommand.test.ts @@ -149,7 +149,7 @@ describe('agentsCommand', () => { }); // Add agent to disabled overrides so validation passes mockContext.services.settings.merged.agents.overrides['test-agent'] = { - disabled: true, + enabled: false, }; vi.mocked(enableAgent).mockReturnValue({ @@ -264,7 +264,7 @@ describe('agentsCommand', () => { it('should show info message if agent is already disabled', async () => { mockConfig.getAgentRegistry().getAllAgentNames.mockReturnValue([]); mockContext.services.settings.merged.agents.overrides['test-agent'] = { - disabled: true, + enabled: false, }; const disableCommand = agentsCommand.subCommands?.find( diff --git a/packages/cli/src/ui/commands/agentsCommand.ts b/packages/cli/src/ui/commands/agentsCommand.ts index 345d66bb24..cd1f7eb78c 100644 --- a/packages/cli/src/ui/commands/agentsCommand.ts +++ b/packages/cli/src/ui/commands/agentsCommand.ts @@ -85,10 +85,10 @@ async function enableAction( const allAgents = agentRegistry.getAllAgentNames(); const overrides = settings.merged.agents.overrides; const disabledAgents = Object.keys(overrides).filter( - (name) => overrides[name]?.disabled === true, + (name) => overrides[name]?.enabled === false, ); - if (allAgents.includes(agentName)) { + if (allAgents.includes(agentName) && !disabledAgents.includes(agentName)) { return { type: 'message', messageType: 'info', @@ -96,7 +96,7 @@ async function enableAction( }; } - if (!disabledAgents.includes(agentName)) { + if (!disabledAgents.includes(agentName) && !allAgents.includes(agentName)) { return { type: 'message', messageType: 'error', @@ -155,7 +155,7 @@ async function disableAction( const allAgents = agentRegistry.getAllAgentNames(); const overrides = settings.merged.agents.overrides; const disabledAgents = Object.keys(overrides).filter( - (name) => overrides[name]?.disabled === true, + (name) => overrides[name]?.enabled === false, ); if (disabledAgents.includes(agentName)) { @@ -206,7 +206,7 @@ function completeAgentsToEnable(context: CommandContext, partialArg: string) { const overrides = settings.merged.agents.overrides; const disabledAgents = Object.entries(overrides) - .filter(([_, override]) => override?.disabled === true) + .filter(([_, override]) => override?.enabled === false) .map(([name]) => name); return disabledAgents.filter((name) => name.startsWith(partialArg)); diff --git a/packages/cli/src/utils/agentSettings.ts b/packages/cli/src/utils/agentSettings.ts index adb1c946cf..e063e96536 100644 --- a/packages/cli/src/utils/agentSettings.ts +++ b/packages/cli/src/utils/agentSettings.ts @@ -29,8 +29,8 @@ export interface AgentActionResult { } /** - * Enables an agent by ensuring it is not disabled in any writable scope (User and Workspace). - * It sets `agents.overrides..disabled` to `false` if it was found to be `true`. + * Enables an agent by ensuring it is enabled in any writable scope (User and Workspace). + * It sets `agents.overrides..enabled` to `true`. */ export function enableAgent( settings: LoadedSettings, @@ -45,9 +45,9 @@ export function enableAgent( const scopePath = settings.forScope(scope).path; const agentOverrides = settings.forScope(scope).settings.agents?.overrides; - const isDisabled = agentOverrides?.[agentName]?.disabled === true; + const isEnabled = agentOverrides?.[agentName]?.enabled === true; - if (isDisabled) { + if (!isEnabled) { foundInDisabledScopes.push({ scope, path: scopePath }); } else { alreadyEnabledScopes.push({ scope, path: scopePath }); @@ -68,9 +68,8 @@ export function enableAgent( const modifiedScopes: ModifiedScope[] = []; for (const { scope, path } of foundInDisabledScopes) { if (isLoadableSettingScope(scope)) { - // Explicitly enable it to override any lower-precedence disables, or just clear the disable. - // Setting to false ensures it is enabled. - settings.setValue(scope, `agents.overrides.${agentName}.disabled`, false); + // Explicitly enable it. + settings.setValue(scope, `agents.overrides.${agentName}.enabled`, true); modifiedScopes.push({ scope, path }); } } @@ -85,7 +84,7 @@ export function enableAgent( } /** - * Disables an agent by setting `agents.overrides..disabled` to `true` in the specified scope. + * Disables an agent by setting `agents.overrides..enabled` to `false` in the specified scope. */ export function disableAgent( settings: LoadedSettings, @@ -105,9 +104,9 @@ export function disableAgent( const scopePath = settings.forScope(scope).path; const agentOverrides = settings.forScope(scope).settings.agents?.overrides; - const isDisabled = agentOverrides?.[agentName]?.disabled === true; + const isEnabled = agentOverrides?.[agentName]?.enabled !== false; - if (isDisabled) { + if (!isEnabled) { return { status: 'no-op', agentName, @@ -127,7 +126,7 @@ export function disableAgent( if (isLoadableSettingScope(otherScope)) { const otherOverrides = settings.forScope(otherScope).settings.agents?.overrides; - if (otherOverrides?.[agentName]?.disabled === true) { + if (otherOverrides?.[agentName]?.enabled === false) { alreadyDisabledInOther.push({ scope: otherScope, path: settings.forScope(otherScope).path, @@ -135,7 +134,7 @@ export function disableAgent( } } - settings.setValue(scope, `agents.overrides.${agentName}.disabled`, true); + settings.setValue(scope, `agents.overrides.${agentName}.enabled`, false); return { status: 'success', diff --git a/packages/core/src/agents/registry.test.ts b/packages/core/src/agents/registry.test.ts index b35a62ea9b..c02d0758de 100644 --- a/packages/core/src/agents/registry.test.ts +++ b/packages/core/src/agents/registry.test.ts @@ -309,7 +309,7 @@ describe('AgentRegistry', () => { const config = makeMockedConfig({ agents: { overrides: { - generalist: { enabled: true, disabled: true }, + generalist: { enabled: false }, }, }, }); @@ -704,7 +704,7 @@ describe('AgentRegistry', () => { const config = makeMockedConfig({ agents: { overrides: { - MockAgent: { disabled: true }, + MockAgent: { enabled: false }, }, }, }); @@ -719,7 +719,7 @@ describe('AgentRegistry', () => { const config = makeMockedConfig({ agents: { overrides: { - RemoteAgent: { disabled: true }, + RemoteAgent: { enabled: false }, }, }, }); diff --git a/packages/core/src/agents/registry.ts b/packages/core/src/agents/registry.ts index 82fccb05cc..2ef396b0d3 100644 --- a/packages/core/src/agents/registry.ts +++ b/packages/core/src/agents/registry.ts @@ -152,7 +152,7 @@ export class AgentRegistry { // Only register the agent if it's enabled in the settings and not explicitly disabled via overrides. if ( investigatorSettings?.enabled && - !agentsOverrides[CodebaseInvestigatorAgent.name]?.disabled + agentsOverrides[CodebaseInvestigatorAgent.name]?.enabled !== false ) { let model; const settingsModel = investigatorSettings.model; @@ -200,7 +200,7 @@ export class AgentRegistry { // Register the CLI help agent if it's explicitly enabled and not explicitly disabled via overrides. if ( cliHelpSettings.enabled && - !agentsOverrides[CliHelpAgent.name]?.disabled + agentsOverrides[CliHelpAgent.name]?.enabled !== false ) { this.registerLocalAgent(CliHelpAgent(this.config)); } @@ -280,12 +280,8 @@ export class AgentRegistry { const isExperimental = definition.experimental === true; let isEnabled = !isExperimental; - if (overrides) { - if (overrides.disabled !== undefined) { - isEnabled = !overrides.disabled; - } else if (overrides.enabled !== undefined) { - isEnabled = overrides.enabled; - } + if (overrides && overrides.enabled !== undefined) { + isEnabled = overrides.enabled; } return isEnabled; diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index 3183077556..bc6de83988 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -177,7 +177,6 @@ export interface AgentRunConfig { export interface AgentOverride { modelConfig?: ModelConfig; runConfig?: AgentRunConfig; - disabled?: boolean; enabled?: boolean; } diff --git a/schemas/settings.schema.json b/schemas/settings.schema.json index 9656c218bc..adcd3b8fb1 100644 --- a/schemas/settings.schema.json +++ b/schemas/settings.schema.json @@ -1946,10 +1946,6 @@ "enabled": { "type": "boolean", "description": "Whether to enable the agent." - }, - "disabled": { - "type": "boolean", - "description": "Whether to disable the agent." } } },