feat(core): Decouple enabling hooks UI from subsystem. (#16074)

This commit is contained in:
joshualitt
2026-01-07 12:34:33 -08:00
committed by GitHub
parent 19bdd95eab
commit 4c961df313
5 changed files with 19 additions and 7 deletions
+3 -2
View File
@@ -53,7 +53,7 @@ import { requestConsentNonInteractive } from './extensions/consent.js';
import { promptForSetting } from './extensions/extensionSettings.js'; import { promptForSetting } from './extensions/extensionSettings.js';
import type { EventEmitter } from 'node:stream'; import type { EventEmitter } from 'node:stream';
import { runExitCleanup } from '../utils/cleanup.js'; import { runExitCleanup } from '../utils/cleanup.js';
import { getEnableHooks } from './settingsSchema.js'; import { getEnableHooks, getEnableHooksUI } from './settingsSchema.js';
export interface CliArgs { export interface CliArgs {
query: string | undefined; query: string | undefined;
@@ -292,7 +292,7 @@ export async function parseArguments(settings: Settings): Promise<CliArgs> {
} }
// Register hooks command if hooks are enabled // Register hooks command if hooks are enabled
if (getEnableHooks(settings)) { if (getEnableHooksUI(settings)) {
yargsInstance.command(hooksCommand); yargsInstance.command(hooksCommand);
} }
@@ -740,6 +740,7 @@ export async function loadCliConfig(
modelConfigServiceConfig: settings.modelConfigs, modelConfigServiceConfig: settings.modelConfigs,
// TODO: loading of hooks based on workspace trust // TODO: loading of hooks based on workspace trust
enableHooks: getEnableHooks(settings), enableHooks: getEnableHooks(settings),
enableHooksUI: getEnableHooksUI(settings),
hooks: settings.hooks || {}, hooks: settings.hooks || {},
projectHooks: projectHooks || {}, projectHooks: projectHooks || {},
onModelChange: (model: string) => saveModelChange(loadedSettings, model), onModelChange: (model: string) => saveModelChange(loadedSettings, model),
+6 -4
View File
@@ -2136,8 +2136,10 @@ type InferSettings<T extends SettingsSchema> = {
export type Settings = InferSettings<SettingsSchemaType>; export type Settings = InferSettings<SettingsSchemaType>;
export function getEnableHooks(settings: Settings): boolean { export function getEnableHooksUI(settings: Settings): boolean {
return ( return settings.tools?.enableHooks ?? true;
(settings.tools?.enableHooks ?? true) && (settings.hooks?.enabled ?? false) }
);
export function getEnableHooks(settings: Settings): boolean {
return getEnableHooksUI(settings) && (settings.hooks?.enabled ?? false);
} }
@@ -101,6 +101,7 @@ describe('BuiltinCommandLoader', () => {
getFolderTrust: vi.fn().mockReturnValue(true), getFolderTrust: vi.fn().mockReturnValue(true),
getEnableExtensionReloading: () => false, getEnableExtensionReloading: () => false,
getEnableHooks: () => false, getEnableHooks: () => false,
getEnableHooksUI: () => false,
isSkillsSupportEnabled: vi.fn().mockReturnValue(false), isSkillsSupportEnabled: vi.fn().mockReturnValue(false),
getMcpEnabled: vi.fn().mockReturnValue(true), getMcpEnabled: vi.fn().mockReturnValue(true),
getSkillManager: vi.fn().mockReturnValue({ getSkillManager: vi.fn().mockReturnValue({
@@ -199,6 +200,7 @@ describe('BuiltinCommandLoader profile', () => {
getCheckpointingEnabled: () => false, getCheckpointingEnabled: () => false,
getEnableExtensionReloading: () => false, getEnableExtensionReloading: () => false,
getEnableHooks: () => false, getEnableHooks: () => false,
getEnableHooksUI: () => false,
isSkillsSupportEnabled: vi.fn().mockReturnValue(false), isSkillsSupportEnabled: vi.fn().mockReturnValue(false),
getMcpEnabled: vi.fn().mockReturnValue(true), getMcpEnabled: vi.fn().mockReturnValue(true),
getSkillManager: vi.fn().mockReturnValue({ getSkillManager: vi.fn().mockReturnValue({
@@ -78,7 +78,7 @@ export class BuiltinCommandLoader implements ICommandLoader {
editorCommand, editorCommand,
extensionsCommand(this.config?.getEnableExtensionReloading()), extensionsCommand(this.config?.getEnableExtensionReloading()),
helpCommand, helpCommand,
...(this.config?.getEnableHooks() ? [hooksCommand] : []), ...(this.config?.getEnableHooksUI() ? [hooksCommand] : []),
await ideCommand(), await ideCommand(),
initCommand, initCommand,
...(this.config?.getMcpEnabled() === false ...(this.config?.getMcpEnabled() === false
+7
View File
@@ -344,6 +344,7 @@ export interface ConfigParameters {
disableYoloMode?: boolean; disableYoloMode?: boolean;
modelConfigServiceConfig?: ModelConfigServiceConfig; modelConfigServiceConfig?: ModelConfigServiceConfig;
enableHooks?: boolean; enableHooks?: boolean;
enableHooksUI?: boolean;
experiments?: Experiments; experiments?: Experiments;
hooks?: { [K in HookEventName]?: HookDefinition[] } & { disabled?: string[] }; hooks?: { [K in HookEventName]?: HookDefinition[] } & { disabled?: string[] };
projectHooks?: { [K in HookEventName]?: HookDefinition[] } & { projectHooks?: { [K in HookEventName]?: HookDefinition[] } & {
@@ -470,6 +471,7 @@ export class Config {
private readonly disableYoloMode: boolean; private readonly disableYoloMode: boolean;
private pendingIncludeDirectories: string[]; private pendingIncludeDirectories: string[];
private readonly enableHooks: boolean; private readonly enableHooks: boolean;
private readonly enableHooksUI: boolean;
private readonly hooks: private readonly hooks:
| { [K in HookEventName]?: HookDefinition[] } | { [K in HookEventName]?: HookDefinition[] }
| undefined; | undefined;
@@ -603,6 +605,7 @@ export class Config {
this.useWriteTodos = isPreviewModel(this.model) this.useWriteTodos = isPreviewModel(this.model)
? false ? false
: (params.useWriteTodos ?? true); : (params.useWriteTodos ?? true);
this.enableHooksUI = params.enableHooksUI ?? true;
this.enableHooks = params.enableHooks ?? false; this.enableHooks = params.enableHooks ?? false;
this.disabledHooks = this.disabledHooks =
(params.hooks && 'disabled' in params.hooks (params.hooks && 'disabled' in params.hooks
@@ -1671,6 +1674,10 @@ export class Config {
return this.enableHooks; return this.enableHooks;
} }
getEnableHooksUI(): boolean {
return this.enableHooksUI;
}
getCodebaseInvestigatorSettings(): CodebaseInvestigatorSettings { getCodebaseInvestigatorSettings(): CodebaseInvestigatorSettings {
return this.codebaseInvestigatorSettings; return this.codebaseInvestigatorSettings;
} }