* fix(hooks): pass workspaceDir in gateway session reset internal hook context The gateway path (performGatewaySessionReset) omitted workspaceDir when creating the internal hook event, while the plugin hook path (emitGatewayBeforeResetPluginHook) in the same file correctly resolved and passed it. This caused the session-memory handler to fall back to resolveAgentWorkspaceDir from the session key, which for default-agent keys resolves to the shared default workspace instead of the per-agent workspace. Daily notes and memory files were written to the wrong workspace in multi-agent setups. Closes #64528 * docs(changelog): add session-memory workspace reset note * fix(changelog): remove conflict markers --------- Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Bundled Hooks
This directory contains hooks that ship with OpenClaw. These hooks are automatically discovered and can be enabled/disabled via CLI or configuration.
Available Hooks
💾 session-memory
Automatically saves session context to memory when you issue /new or /reset.
Events: command:new, command:reset
What it does: Creates a dated memory file with LLM-generated slug based on conversation content.
Output: <workspace>/memory/YYYY-MM-DD-slug.md (defaults to ~/.openclaw/workspace)
Enable:
openclaw hooks enable session-memory
📎 bootstrap-extra-files
Injects extra bootstrap files (for example monorepo AGENTS.md/TOOLS.md) during prompt assembly.
Events: agent:bootstrap
What it does: Expands configured workspace glob/path patterns and appends matching bootstrap files to injected context.
Output: No files written; context is modified in-memory only.
Enable:
openclaw hooks enable bootstrap-extra-files
📝 command-logger
Logs all command events to a centralized audit file.
Events: command (all commands)
What it does: Appends JSONL entries to command log file.
Output: ~/.openclaw/logs/commands.log
Enable:
openclaw hooks enable command-logger
🚀 boot-md
Runs BOOT.md whenever the gateway starts (after channels start).
Events: gateway:startup
What it does: Executes BOOT.md instructions via the agent runner.
Output: Whatever the instructions request (for example, outbound messages).
Enable:
openclaw hooks enable boot-md
Hook Structure
Each hook is a directory containing:
- HOOK.md: Metadata and documentation in YAML frontmatter + Markdown
- handler.ts: The hook handler function (default export)
Example structure:
session-memory/
├── HOOK.md # Metadata + docs
└── handler.ts # Handler implementation
HOOK.md Format
---
name: my-hook
description: "Short description"
homepage: https://docs.openclaw.ai/automation/hooks#my-hook
metadata:
{ "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---
# Hook Title
Documentation goes here...
Metadata Fields
- emoji: Display emoji for CLI
- events: Array of events to listen for (e.g.,
["command:new", "session:start"]) - requires: Optional requirements
- bins: Required binaries on PATH
- anyBins: At least one of these binaries must be present
- env: Required environment variables
- config: Required config paths (e.g.,
["workspace.dir"]) - os: Required platforms (e.g.,
["darwin", "linux"])
- install: Installation methods (for bundled hooks:
[{"id":"bundled","kind":"bundled"}])
Creating Custom Hooks
To create your own hooks, place them in:
- Workspace hooks:
<workspace>/hooks/(highest precedence) - Managed hooks:
~/.openclaw/hooks/(shared across workspaces)
Custom hooks follow the same structure as bundled hooks.
Managing Hooks
List all hooks:
openclaw hooks list
Show hook details:
openclaw hooks info session-memory
Check hook status:
openclaw hooks check
Enable/disable:
openclaw hooks enable session-memory
openclaw hooks disable command-logger
Configuration
Hooks can be configured in ~/.openclaw/openclaw.json:
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"session-memory": {
"enabled": true
},
"command-logger": {
"enabled": false
}
}
}
}
}
Event Types
Currently supported events:
- command: All command events
- command:new:
/newcommand specifically - command:reset:
/resetcommand - command:stop:
/stopcommand - agent:bootstrap: Before workspace bootstrap files are injected
- gateway:startup: Gateway startup (after channels start)
More event types coming soon (session lifecycle, agent errors, etc.).
Handler API
Hook handlers receive an InternalHookEvent object:
interface InternalHookEvent {
type: "command" | "session" | "agent" | "gateway";
action: string; // e.g., 'new', 'reset', 'stop'
sessionKey: string;
context: Record<string, unknown>;
timestamp: Date;
messages: string[]; // Push messages here to send to user
}
Example handler:
import type { HookHandler } from "../../src/hooks/hooks.js";
const myHandler: HookHandler = async (event) => {
if (event.type !== "command" || event.action !== "new") {
return;
}
// Your logic here
console.log("New command triggered!");
// Optionally send message to user
event.messages.push("✨ Hook executed!");
};
export default myHandler;
Testing
Test your hooks by:
- Place hook in workspace hooks directory
- Restart gateway:
pkill -9 -f 'openclaw.*gateway' && pnpm openclaw gateway - Enable the hook:
openclaw hooks enable my-hook - Trigger the event (e.g., send
/newcommand) - Check gateway logs for hook execution
Documentation
Full documentation: https://docs.openclaw.ai/automation/hooks