Hooks¶
Les hooks fournissent un systĂšme extensible pilotĂ© par Ă©vĂ©nements pour automatiser des actions en rĂ©ponse aux commandes et aux Ă©vĂ©nements de lâagent. Les hooks sont automatiquement dĂ©couverts Ă partir de rĂ©pertoires et peuvent ĂȘtre gĂ©rĂ©s via des commandes CLI, de maniĂšre similaire au fonctionnement des Skills dans OpenClaw.
Prise en main¶
Les hooks sont de petits scripts qui sâexĂ©cutent lorsquâun Ă©vĂ©nement se produit. Il en existe deux types :
- Hooks (cette page) : sâexĂ©cutent Ă lâintĂ©rieur de la Gateway (passerelle) lorsque des Ă©vĂ©nements dâagent se dĂ©clenchent, comme
/new,/reset,/stop, ou des Ă©vĂ©nements du cycle de vie. - Webhooks : webhooks HTTP externes permettant Ă dâautres systĂšmes de dĂ©clencher du travail dans OpenClaw. Voir Webhook Hooks ou utiliser
openclaw webhookspour les commandes dâassistance Gmail.
Les hooks peuvent Ă©galement ĂȘtre regroupĂ©s dans des plugins ; voir Plugins.
Utilisations courantes :
- Enregistrer un instantané de mémoire lorsque vous réinitialisez une session
- Conserver une piste dâaudit des commandes pour le dĂ©pannage ou la conformitĂ©
- DĂ©clencher des automatisations de suivi lorsquâune session dĂ©marre ou se termine
- Ăcrire des fichiers dans lâespace de travail de lâagent ou appeler des API externes lorsque des Ă©vĂ©nements se produisent
Si vous savez écrire une petite fonction TypeScript, vous pouvez écrire un hook. Les hooks sont découverts automatiquement, et vous les activez ou désactivez via la CLI.
Vue dâensemble¶
Le systÚme de hooks vous permet de :
- Enregistrer le contexte de session en mémoire lorsque
/newest Ă©mis - Journaliser toutes les commandes Ă des fins dâaudit
- DĂ©clencher des automatisations personnalisĂ©es lors des Ă©vĂ©nements du cycle de vie de lâagent
- Ătendre le comportement dâOpenClaw sans modifier le code cĆur
Démarrage¶
Hooks inclus¶
OpenClaw est livré avec quatre hooks intégrés qui sont automatiquement découverts :
- đŸ session-memory : enregistre le contexte de session dans lâespace de travail de votre agent (par dĂ©faut
~/.openclaw/workspace/memory/) lorsque vous Ă©mettez/new - đ command-logger : journalise tous les Ă©vĂ©nements de commande dans
~/.openclaw/logs/commands.log - đ boot-md : exĂ©cute
BOOT.mdlorsque la gateway (passerelle) dĂ©marre (nĂ©cessite lâactivation des hooks internes) - đ soul-evil : remplace le contenu injectĂ©
SOUL.mdparSOUL_EVIL.mdpendant une fenĂȘtre de purge ou de maniĂšre alĂ©atoire
Lister les hooks disponibles :
openclaw hooks list
Activer un hook :
openclaw hooks enable session-memory
VĂ©rifier lâĂ©tat dâun hook :
openclaw hooks check
Obtenir des informations détaillées :
openclaw hooks info session-memory
Intégration initiale¶
Lors de la prise en main (openclaw onboard), il vous sera proposĂ© dâactiver les hooks recommandĂ©s. Lâassistant dĂ©couvre automatiquement les hooks Ă©ligibles et vous les prĂ©sente pour sĂ©lection.
Découverte des hooks¶
Les hooks sont automatiquement découverts à partir de trois répertoires (par ordre de priorité) :
- Hooks dâespace de travail :
<workspace>/hooks/(par agent, priorité la plus élevée) - Hooks gérés :
~/.openclaw/hooks/(installĂ©s par lâutilisateur, partagĂ©s entre les espaces de travail) - Hooks intĂ©grĂ©s :
<openclaw>/dist/hooks/bundled/(fournis avec OpenClaw)
Les rĂ©pertoires de hooks gĂ©rĂ©s peuvent ĂȘtre soit un hook unique, soit un pack de hooks (rĂ©pertoire de package).
Chaque hook est un répertoire contenant :
my-hook/
âââ HOOK.md # Metadata + documentation
âââ handler.ts # Handler implementation
Packs de hooks (npm/archives)¶
Les packs de hooks sont des packages npm standards qui exportent un ou plusieurs hooks via openclaw.hooks dans
package.json. Installez-les avec :
openclaw hooks install <path-or-spec>
Exemple de package.json :
{
"name": "@acme/my-hooks",
"version": "0.1.0",
"openclaw": {
"hooks": ["./hooks/my-hook", "./hooks/other-hook"]
}
}
Chaque entrée pointe vers un répertoire de hook contenant HOOK.md et handler.ts (ou index.ts).
Les packs de hooks peuvent inclure des dépendances ; elles seront installées sous ~/.openclaw/hooks/<id>.
Hook Structure¶
HOOK.md Format¶
Le fichier HOOK.md contient des métadonnées en frontmatter YAML ainsi que de la documentation Markdown :
---
name: my-hook
description: "Short description of what this hook does"
homepage: https://docs.openclaw.ai/hooks#my-hook
metadata:
{ "openclaw": { "emoji": "đ", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---
# My Hook
Detailed documentation goes here...
## What It Does
- Listens for `/new` commands
- Performs some action
- Logs the result
## Requirements
- Node.js must be installed
## Configuration
No configuration needed.
Metadata Fields¶
Lâobjet metadata.openclaw prend en charge :
emoji : emoji dâaffichage pour la CLI (par ex."đŸ")events : tableau dâĂ©vĂ©nements Ă Ă©couter (par ex.["command:new", "command:reset"])export : export nommĂ© Ă utiliser (par dĂ©faut"default")homepage : URL de documentationrequires : exigences optionnellesbins : binaires requis sur le PATH (par ex.["git", "node"])anyBins : au moins un de ces binaires doit ĂȘtre prĂ©sentenv : variables dâenvironnement requisesconfig : chemins de configuration requis (par ex.["workspace.dir"])os : plateformes requises (par ex.["darwin", "linux"])always : contourner les vĂ©rifications dâĂ©ligibilitĂ© (boolĂ©en)install : mĂ©thodes dâinstallation (pour les hooks intĂ©grĂ©s :[{"id":"bundled","kind":"bundled"}])
Handler Implementation¶
Le fichier handler.ts exporte une fonction HookHandler :
import type { HookHandler } from "../../src/hooks/hooks.js";
const myHandler: HookHandler = async (event) => {
// Only trigger on 'new' command
if (event.type !== "command" || event.action !== "new") {
return;
}
console.log(`[my-hook] New command triggered`);
console.log(` Session: ${event.sessionKey}`);
console.log(` Timestamp: ${event.timestamp.toISOString()}`);
// Your custom logic here
// Optionally send message to user
event.messages.push("âš My hook executed!");
};
export default myHandler;
Event Context¶
Chaque événement inclut :
{
type: 'command' | 'session' | 'agent' | 'gateway',
action: string, // e.g., 'new', 'reset', 'stop'
sessionKey: string, // Session identifier
timestamp: Date, // When the event occurred
messages: string[], // Push messages here to send to user
context: {
sessionEntry?: SessionEntry,
sessionId?: string,
sessionFile?: string,
commandSource?: string, // e.g., 'whatsapp', 'telegram'
senderId?: string,
workspaceDir?: string,
bootstrapFiles?: WorkspaceBootstrapFile[],
cfg?: OpenClawConfig
}
}
Event Types¶
Command Events¶
DĂ©clenchĂ©s lorsque des commandes de lâagent sont Ă©mises :
command : tous les événements de commande (écouteur général)command:new : lorsque la commande/newest émisecommand:reset : lorsque la commande/resetest émisecommand:stop : lorsque la commande/stopest émise
Agent Events¶
agent:bootstrap : avant que les fichiers de bootstrap de lâespace de travail ne soient injectĂ©s (les hooks peuvent modifiercontext.bootstrapFiles)
Gateway Events¶
Déclenchés lorsque la gateway (passerelle) démarre :
gateway:startup : aprÚs le démarrage des canaux et le chargement des hooks
Tool Result Hooks (Plugin API)¶
Ces hooks ne sont pas des Ă©couteurs de flux dâĂ©vĂ©nements ; ils permettent aux plugins dâajuster de maniĂšre synchrone les rĂ©sultats des outils avant quâOpenClaw ne les persiste.
tool_result_persist : transformer les rĂ©sultats des outils avant quâils ne soient Ă©crits dans la transcription de session. Doit ĂȘtre synchrone ; retourner la charge utile du rĂ©sultat dâoutil mise Ă jour ouundefinedpour la conserver telle quelle. Voir Agent Loop.
Future Events¶
Types dâĂ©vĂ©nements planifiĂ©s :
session:start : lorsquâune nouvelle session commencesession:end : lorsquâune session se termineagent:error : lorsquâun agent rencontre une erreurmessage:sent : lorsquâun message est envoyĂ©message:received : lorsquâun message est reçu
Creating Custom Hooks¶
1. Choose Location¶
- Hooks dâespace de travail (
<workspace>/hooks/) : par agent, priorité la plus élevée - Hooks gérés (
~/.openclaw/hooks/) : partagés entre les espaces de travail
2. Create Directory Structure¶
mkdir -p ~/.openclaw/hooks/my-hook
cd ~/.openclaw/hooks/my-hook
3. Create HOOK.md¶
---
name: my-hook
description: "Does something useful"
metadata: { "openclaw": { "emoji": "đŻ", "events": ["command:new"] } }
---
# My Custom Hook
This hook does something useful when you issue `/new`.
4. Create handler.ts¶
import type { HookHandler } from "../../src/hooks/hooks.js";
const handler: HookHandler = async (event) => {
if (event.type !== "command" || event.action !== "new") {
return;
}
console.log("[my-hook] Running!");
// Your logic here
};
export default handler;
5. Enable and Test¶
# Verify hook is discovered
openclaw hooks list
# Enable it
openclaw hooks enable my-hook
# Restart your gateway process (menu bar app restart on macOS, or restart your dev process)
# Trigger the event
# Send /new via your messaging channel
Configuration¶
New Config Format (Recommended)¶
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"session-memory": { "enabled": true },
"command-logger": { "enabled": false }
}
}
}
}
Per-Hook Configuration¶
Les hooks peuvent avoir une configuration personnalisée :
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"my-hook": {
"enabled": true,
"env": {
"MY_CUSTOM_VAR": "value"
}
}
}
}
}
}
Extra Directories¶
Charger des hooks depuis des répertoires supplémentaires :
{
"hooks": {
"internal": {
"enabled": true,
"load": {
"extraDirs": ["/path/to/more/hooks"]
}
}
}
}
Legacy Config Format (Still Supported)¶
Lâancien format de configuration fonctionne toujours pour assurer la rĂ©trocompatibilité :
{
"hooks": {
"internal": {
"enabled": true,
"handlers": [
{
"event": "command:new",
"module": "./hooks/handlers/my-handler.ts",
"export": "default"
}
]
}
}
}
Migration : utilisez le nouveau systÚme basé sur la découverte pour les nouveaux hooks. Les handlers hérités sont chargés aprÚs les hooks basés sur des répertoires.
CLI Commands¶
List Hooks¶
# List all hooks
openclaw hooks list
# Show only eligible hooks
openclaw hooks list --eligible
# Verbose output (show missing requirements)
openclaw hooks list --verbose
# JSON output
openclaw hooks list --json
Hook Information¶
# Show detailed info about a hook
openclaw hooks info session-memory
# JSON output
openclaw hooks info session-memory --json
Check Eligibility¶
# Show eligibility summary
openclaw hooks check
# JSON output
openclaw hooks check --json
Enable/Disable¶
# Enable a hook
openclaw hooks enable session-memory
# Disable a hook
openclaw hooks disable command-logger
Bundled hook reference¶
session-memory¶
Enregistre le contexte de session en mémoire lorsque vous émettez /new.
Events : command:new
Requirements : workspace.dir doit ĂȘtre configurĂ©
Output : <workspace>/memory/YYYY-MM-DD-slug.md (par défaut ~/.openclaw/workspace)
What it does :
- Utilise lâentrĂ©e de session prĂ©-rĂ©initialisation pour localiser la transcription correcte
- Extrait les 15 derniĂšres lignes de la conversation
- Utilise un LLM pour générer un slug de nom de fichier descriptif
- Enregistre les métadonnées de session dans un fichier de mémoire daté
Example output :
# Session: 2026-01-16 14:30:00 UTC
- **Session Key**: agent:main:main
- **Session ID**: abc123def456
- **Source**: telegram
Filename examples :
2026-01-16-vendor-pitch.md2026-01-16-api-design.md2026-01-16-1430.md(horodatage de secours si la génération du slug échoue)
Enable :
openclaw hooks enable session-memory
command-logger¶
Journalise tous les Ă©vĂ©nements de commande dans un fichier dâaudit centralisĂ©.
Events : command
Requirements : Aucun
Output : ~/.openclaw/logs/commands.log
What it does :
- Capture les dĂ©tails de lâĂ©vĂ©nement (action de commande, horodatage, clĂ© de session, ID de lâexpĂ©diteur, source)
- Ajoute au fichier de log au format JSONL
- SâexĂ©cute silencieusement en arriĂšre-plan
Example log entries :
{"timestamp":"2026-01-16T14:30:00.000Z","action":"new","sessionKey":"agent:main:main","senderId":"+1234567890","source":"telegram"}
{"timestamp":"2026-01-16T15:45:22.000Z","action":"stop","sessionKey":"agent:main:main","senderId":"user@example.com","source":"whatsapp"}
View logs :
# View recent commands
tail -n 20 ~/.openclaw/logs/commands.log
# Pretty-print with jq
cat ~/.openclaw/logs/commands.log | jq .
# Filter by action
grep '"action":"new"' ~/.openclaw/logs/commands.log | jq .
Enable :
openclaw hooks enable command-logger
soul-evil¶
Remplace le contenu injectĂ© SOUL.md par SOUL_EVIL.md pendant une fenĂȘtre de purge ou de maniĂšre alĂ©atoire.
Events : agent:bootstrap
Docs : SOUL Evil Hook
Output : Aucun fichier écrit ; les échanges se font uniquement en mémoire.
Enable :
openclaw hooks enable soul-evil
Config :
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"soul-evil": {
"enabled": true,
"file": "SOUL_EVIL.md",
"chance": 0.1,
"purge": { "at": "21:00", "duration": "15m" }
}
}
}
}
}
boot-md¶
Exécute BOOT.md lorsque la gateway (passerelle) démarre (aprÚs le démarrage des canaux).
Les hooks internes doivent ĂȘtre activĂ©s pour que cela sâexĂ©cute.
Events : gateway:startup
Requirements : workspace.dir doit ĂȘtre configurĂ©
What it does :
- Lit
BOOT.mddepuis votre espace de travail - ExĂ©cute les instructions via lâagent runner
- Envoie tout message sortant demandĂ© via lâoutil de messagerie
Enable :
openclaw hooks enable boot-md
Best Practices¶
Keep Handlers Fast¶
Les hooks sâexĂ©cutent pendant le traitement des commandes. Gardez-les lĂ©gers :
// â Good - async work, returns immediately
const handler: HookHandler = async (event) => {
void processInBackground(event); // Fire and forget
};
// â Bad - blocks command processing
const handler: HookHandler = async (event) => {
await slowDatabaseQuery(event);
await evenSlowerAPICall(event);
};
Handle Errors Gracefully¶
Encapsulez toujours les opérations risquées :
const handler: HookHandler = async (event) => {
try {
await riskyOperation(event);
} catch (err) {
console.error("[my-handler] Failed:", err instanceof Error ? err.message : String(err));
// Don't throw - let other handlers run
}
};
Filter Events Early¶
Retournez tĂŽt si lâĂ©vĂ©nement nâest pas pertinent :
const handler: HookHandler = async (event) => {
// Only handle 'new' commands
if (event.type !== "command" || event.action !== "new") {
return;
}
// Your logic here
};
Use Specific Event Keys¶
SpĂ©cifiez des Ă©vĂ©nements prĂ©cis dans les mĂ©tadonnĂ©es lorsque câest possible :
metadata: { "openclaw": { "events": ["command:new"] } } # Specific
PlutÎt que :
metadata: { "openclaw": { "events": ["command"] } } # General - more overhead
Debugging¶
Enable Hook Logging¶
La gateway (passerelle) journalise le chargement des hooks au démarrage :
Registered hook: session-memory -> command:new
Registered hook: command-logger -> command
Registered hook: boot-md -> gateway:startup
Check Discovery¶
Lister tous les hooks découverts :
openclaw hooks list --verbose
Check Registration¶
Dans votre handler, journalisez lorsquâil est appelé :
const handler: HookHandler = async (event) => {
console.log("[my-handler] Triggered:", event.type, event.action);
// Your logic
};
Verify Eligibility¶
VĂ©rifiez pourquoi un hook nâest pas Ă©ligible :
openclaw hooks info my-hook
Recherchez les exigences manquantes dans la sortie.
Testing¶
Gateway Logs¶
Surveillez les logs de la gateway pour voir lâexĂ©cution des hooks :
# macOS
./scripts/clawlog.sh -f
# Other platforms
tail -f ~/.openclaw/gateway.log
Test Hooks Directly¶
Testez vos handlers de maniÚre isolée :
import { test } from "vitest";
import { createHookEvent } from "./src/hooks/hooks.js";
import myHandler from "./hooks/my-hook/handler.js";
test("my handler works", async () => {
const event = createHookEvent("command", "new", "test-session", {
foo: "bar",
});
await myHandler(event);
// Assert side effects
});
Architecture¶
Core Components¶
src/hooks/types.ts : dĂ©finitions de typessrc/hooks/workspace.ts : analyse et chargement des rĂ©pertoiressrc/hooks/frontmatter.ts : analyse des mĂ©tadonnĂ©es HOOK.mdsrc/hooks/config.ts : vĂ©rification de lâĂ©ligibilitĂ©src/hooks/hooks-status.ts : reporting de statutsrc/hooks/loader.ts : chargeur de modules dynamiquesrc/cli/hooks-cli.ts : commandes CLIsrc/gateway/server-startup.ts : charge les hooks au dĂ©marrage de la gatewaysrc/auto-reply/reply/commands-core.ts : dĂ©clenche les Ă©vĂ©nements de commande
Discovery Flow¶
Gateway startup
â
Scan directories (workspace â managed â bundled)
â
Parse HOOK.md files
â
Check eligibility (bins, env, config, os)
â
Load handlers from eligible hooks
â
Register handlers for events
Event Flow¶
User sends /new
â
Command validation
â
Create hook event
â
Trigger hook (all registered handlers)
â
Command processing continues
â
Session reset
Troubleshooting¶
Hook Not Discovered¶
- Vérifiez la structure des répertoires :
bash
ls -la ~/.openclaw/hooks/my-hook/
# Should show: HOOK.md, handler.ts
- Vérifiez le format de HOOK.md :
bash
cat ~/.openclaw/hooks/my-hook/HOOK.md
# Should have YAML frontmatter with name and metadata
- Listez tous les hooks découverts :
bash
openclaw hooks list
Hook Not Eligible¶
Vérifiez les exigences :
openclaw hooks info my-hook
Recherche manquante :
- Binaires (vérifiez le PATH)
- Variables dâenvironnement
- Valeurs de configuration
- CompatibilitĂ© du systĂšme dâexploitation
Hook Not Executing¶
- Vérifiez que le hook est activé :
bash
openclaw hooks list
# Should show â next to enabled hooks
-
Redémarrez le processus de la gateway afin que les hooks soient rechargés.
-
Vérifiez les logs de la gateway pour des erreurs :
bash
./scripts/clawlog.sh | grep hook
Handler Errors¶
Vérifiez les erreurs TypeScript/import :
# Test import directly
node -e "import('./path/to/handler.ts').then(console.log)"
Migration Guide¶
From Legacy Config to Discovery¶
Avant :
{
"hooks": {
"internal": {
"enabled": true,
"handlers": [
{
"event": "command:new",
"module": "./hooks/handlers/my-handler.ts"
}
]
}
}
}
AprÚs :
- Créez le répertoire du hook :
bash
mkdir -p ~/.openclaw/hooks/my-hook
mv ./hooks/handlers/my-handler.ts ~/.openclaw/hooks/my-hook/handler.ts
- Créez HOOK.md :
```markdown
name: my-hook description: "My custom hook" metadata: { "openclaw": { "emoji": "đŻ", "events": ["command:new"] } }
# My Hook
Does something useful. ```
- Mettez à jour la configuration :
json
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"my-hook": { "enabled": true }
}
}
}
}
- Vérifiez et redémarrez le processus de la gateway :
bash
openclaw hooks list
# Should show: đŻ my-hook â
Avantages de la migration :
- Découverte automatique
- Gestion via la CLI
- VĂ©rification de lâĂ©ligibilitĂ©
- Meilleure documentation
- Structure cohérente