Skip to main content

Hooks de sesión

Con hooks puedes insertar lógica en cada punto del ciclo de vida de una sesión de Copilot.
Puedes añadir control de ejecución de herramientas, log de auditoría, enriquecimiento de prompts, manejo de errores, etc., sin tocar la implementación principal. Esta función es distinta de los hooks declarativos dentro de la definición de un agente personalizado y de la carga de hooks basados en archivos. Para la configuración por agente, consulta Agentes personalizados.

Detección de hooks basados en archivos

En hookDirectories puedes indicar raíces explícitas donde detectar hooks basados en archivos. Solo sirve para la detección y no otorga al agente permisos generales de acceso a archivos. Las raíces explícitas se pueden usar aunque enableConfigDiscovery o enableFileHooks estén deshabilitados. Las rutas relativas se resuelven una sola vez tomando como base el workingDirectory vigente en el momento de indicarlas.
  • Omitido o null: no cambia las demás fuentes de detección
  • []: borra solo las raíces del SDK indicadas explícitamente
Los ajustes de deshabilitación por fuente de hooks y los Managed Settings siguen aplicándose. enableFileHooks controla los hooks de archivo procedentes del repositorio (.github/hooks/ y las raíces de la configuración de repositorios de confianza). No deshabilita los hookDirectories explícitos ni los hooks con callbacks de PHP.

Flujo de los hooks

Uso básico

Hooks disponibles

Si devuelves null, se mantiene el comportamiento por defecto.

Bloquear prompts

onUserPromptSubmitted puede rechazar un prompt devolviendo decision: 'block'. Si se rechaza, no se inicia el turn del modelo ni se registra el mensaje del usuario. Si indicas reason, su contenido se incluye en un evento session.warning temporal con warningType: "policy_blocked".

Casos de uso típicos

1) Permission control (control de ejecución)

  • Convierte las herramientas permitidas en una allow-list con onPreToolUse
  • Para operaciones destructivas, requiere aprobación humana con permissionDecision: 'ask'
  • Explicita el motivo del rechazo con permissionDecisionReason
  • Consulta los posibles toolName en el listado de Tools (por ejemplo view, glob, bash)

2) Auditing / compliance (auditoría)

  • Combina los hooks del ciclo de vida para recolectar eventos de auditoría
  • Persiste los datos recolectados por session ID

3) Prompt enrichment (enriquecer entradas)

  • En onSessionStart añade a additionalContext información del proyecto (lenguaje, framework, convenciones)
  • En onUserPromptSubmitted expande atajos como /fix o /test

4) Result filtering (formatear resultados)

  • En onPostToolUse enmascara API keys, tokens, contraseñas, etc.
  • Resume resultados demasiado largos y devuelve detalles solo cuando sea necesario

5) Error recovery (recuperación ante fallos)

  • En onErrorOccurred, haz retry solo si model_call y recoverable=true
  • Para errores no recuperables, notifica al usuario de forma concisa con userNotification

6) Session metrics (medición)

  • Registra la hora de inicio en onSessionStart
  • Incrementa contadores en onPreToolUse / onUserPromptSubmitted
  • Emite duración, número de herramientas y razón de finalización en onSessionEnd

Tipos de input / output de los hooks

Input común (BaseHookInput)

agentId / agentType / parentAgentId están disponibles en los hooks en los que un subagente es el actor. No se incluyen en los hooks del agente raíz. En runtimes antiguos, los campos se omiten por completo cuando no hay información. Por eso, cualquiera de ellos puede ser null.

PreToolUseHookInput

PreToolUseHookOutput

PostToolUseHookInput

PostToolUseHookOutput

UserPromptSubmittedHookInput

UserPromptSubmittedHookOutput

SessionStartHookInput

SessionStartHookOutput

SessionEndHookInput

SessionEndHookOutput

ErrorOccurredHookInput

ErrorOccurredHookOutput

ToolResultObject

Objeto estándar del resultado de ejecución de una herramienta.

Buenas prácticas

  1. No ejecutes directamente en el hook procesos síncronos pesados. Hazlos asíncronos cuando sea necesario.
  2. Cuando no necesites cambiar nada, devuelve null y deja que actúe el comportamiento por defecto.
  3. Explicita permissionDecision siempre que puedas.
  4. No silencies en exceso los errores críticos; ten una vía de log/notificación.
  5. Gestiona el estado por sesión basándote en el session id y límpialo en onSessionEnd.
Consulta la información más reciente en el repositorio de GitHub.
Última modificación el 19 de octubre de 2026