diff --git a/packages/cli/src/config/settingsSchema.ts b/packages/cli/src/config/settingsSchema.ts index f9c043b3d..c8c69ec6a 100644 --- a/packages/cli/src/config/settingsSchema.ts +++ b/packages/cli/src/config/settingsSchema.ts @@ -105,6 +105,69 @@ export interface SettingsSchema { [key: string]: SettingDefinition; } +/** + * Common items schema for hook definitions. + * Used by both UserPromptSubmit and Stop hooks. + */ +const HOOK_DEFINITION_ITEMS: SettingItemDefinition = { + type: 'object', + description: + 'A hook definition with an optional matcher and a list of hook configurations.', + properties: { + matcher: { + type: 'string', + description: + 'An optional matcher pattern to filter when this hook definition applies.', + }, + sequential: { + type: 'boolean', + description: + 'Whether the hooks should be executed sequentially instead of in parallel.', + }, + hooks: { + type: 'object', + description: 'The list of hook configurations to execute.', + required: true, + items: { + type: 'object', + description: + 'A hook configuration entry that defines a command to execute.', + properties: { + type: { + type: 'string', + description: 'The type of hook.', + enum: ['command'], + required: true, + }, + command: { + type: 'string', + description: 'The command to execute when the hook is triggered.', + required: true, + }, + name: { + type: 'string', + description: 'An optional name for the hook.', + }, + description: { + type: 'string', + description: 'An optional description of what the hook does.', + }, + timeout: { + type: 'number', + description: 'Timeout in milliseconds for the hook execution.', + }, + env: { + type: 'object', + description: + 'Environment variables to set when executing the hook command.', + additionalProperties: { type: 'string' }, + }, + }, + }, + }, + }, +}; + export type MemoryImportFormat = 'tree' | 'flat'; export type DnsResolutionOrder = 'ipv4first' | 'verbatim'; @@ -1256,67 +1319,7 @@ const SETTINGS_SCHEMA = { 'Hooks that execute before agent processing. Can modify prompts or inject context.', showInDialog: false, mergeStrategy: MergeStrategy.CONCAT, - items: { - type: 'object', - description: - 'A hook definition with an optional matcher and a list of hook configurations.', - properties: { - matcher: { - type: 'string', - description: - 'An optional matcher pattern to filter when this hook definition applies.', - }, - sequential: { - type: 'boolean', - description: - 'Whether the hooks should be executed sequentially instead of in parallel.', - }, - hooks: { - type: 'object', - description: 'The list of hook configurations to execute.', - required: true, - items: { - type: 'object', - description: - 'A hook configuration entry that defines a command to execute.', - properties: { - type: { - type: 'string', - description: 'The type of hook.', - enum: ['command'], - required: true, - }, - command: { - type: 'string', - description: - 'The command to execute when the hook is triggered.', - required: true, - }, - name: { - type: 'string', - description: 'An optional name for the hook.', - }, - description: { - type: 'string', - description: - 'An optional description of what the hook does.', - }, - timeout: { - type: 'number', - description: - 'Timeout in milliseconds for the hook execution.', - }, - env: { - type: 'object', - description: - 'Environment variables to set when executing the hook command.', - additionalProperties: { type: 'string' }, - }, - }, - }, - }, - }, - }, + items: HOOK_DEFINITION_ITEMS, }, Stop: { type: 'array', @@ -1328,67 +1331,7 @@ const SETTINGS_SCHEMA = { 'Hooks that execute after agent processing. Can post-process responses or log interactions.', showInDialog: false, mergeStrategy: MergeStrategy.CONCAT, - items: { - type: 'object', - description: - 'A hook definition with an optional matcher and a list of hook configurations.', - properties: { - matcher: { - type: 'string', - description: - 'An optional matcher pattern to filter when this hook definition applies.', - }, - sequential: { - type: 'boolean', - description: - 'Whether the hooks should be executed sequentially instead of in parallel.', - }, - hooks: { - type: 'object', - description: 'The list of hook configurations to execute.', - required: true, - items: { - type: 'object', - description: - 'A hook configuration entry that defines a command to execute.', - properties: { - type: { - type: 'string', - description: 'The type of hook.', - enum: ['command'], - required: true, - }, - command: { - type: 'string', - description: - 'The command to execute when the hook is triggered.', - required: true, - }, - name: { - type: 'string', - description: 'An optional name for the hook.', - }, - description: { - type: 'string', - description: - 'An optional description of what the hook does.', - }, - timeout: { - type: 'number', - description: - 'Timeout in milliseconds for the hook execution.', - }, - env: { - type: 'object', - description: - 'Environment variables to set when executing the hook command.', - additionalProperties: { type: 'string' }, - }, - }, - }, - }, - }, - }, + items: HOOK_DEFINITION_ITEMS, }, }, },