docs/tools/slash-commands.md
Commands are handled by the Gateway. Most commands must be sent as a standalone message that starts with /. The host-only bash chat command uses ! <cmd> (with /bash <cmd> as an alias).
When a conversation or thread is bound to an ACP session, normal follow-up text routes to that ACP harness. Gateway management commands still stay local: /acp ... always reaches the OpenClaw ACP command handler, and /status plus /unfocus stay local whenever command handling is enabled for the surface.
There are two related systems:
<AccordionGroup> <Accordion title="Commands"> Standalone `/...` messages. </Accordion> <Accordion title="Directives"> `/think`, `/fast`, `/verbose`, `/trace`, `/reasoning`, `/elevated`, `/exec`, `/model`, `/queue`.- Directives are stripped from the message before the model sees it.
- In normal chat messages (not directive-only), they are treated as "inline hints" and do **not** persist session settings.
- In directive-only messages (the message contains only directives), they persist to the session and reply with an acknowledgement.
- Directives are only applied for **authorized senders**. If `commands.allowFrom` is set, it is the only allowlist used; otherwise authorization comes from channel allowlists/pairing plus `commands.useAccessGroups`. Unauthorized senders see directives treated as plain text.
They run immediately, are stripped before the model sees the message, and the remaining text continues through the normal flow.
{
commands: {
native: "auto",
nativeSkills: "auto",
text: true,
bash: false,
bashForegroundMs: 2000,
config: false,
mcp: false,
plugins: false,
debug: false,
restart: true,
ownerAllowFrom: ["discord:123456789012345678"],
ownerDisplay: "raw",
ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}",
allowFrom: {
"*": ["user1"],
discord: ["user:123"],
},
useAccessGroups: true,
},
}
Current source-of-truth:
src/auto-reply/commands-registry.shared.tssrc/auto-reply/commands-registry.data.tsregisterCommand() callsDock commands switch the current session's reply route to another linked channel. See Channel docking for setup, examples, and troubleshooting.
Dock commands are generated from channel plugins with native-command support. Current bundled set:
/dock-discord (alias: /dock_discord)/dock-mattermost (alias: /dock_mattermost)/dock-slack (alias: /dock_slack)/dock-telegram (alias: /dock_telegram)Use dock commands from a direct chat to switch the current session's reply route to another linked channel. The agent keeps the same session context, but future replies for that session are delivered to the selected channel peer.
Dock commands require session.identityLinks. The source sender and target peer must be in the same identity group, for example ["telegram:123", "discord:456"]. If a Telegram user with id 123 sends /dock_discord, OpenClaw stores lastChannel: "discord" and lastTo: "456" on the active session. If the sender is not linked to a Discord peer, the command replies with a setup hint instead of falling through to normal chat.
Docking changes the active session route only. It does not create channel accounts, grant access, bypass channel allowlists, or move transcript history to another session. Use /dock-telegram, /dock-slack, /dock-mattermost, or another generated dock command to switch the route again.
Bundled plugins can add more slash commands. Current bundled commands in this repo:
/dreaming [on|off|status|help] toggles memory dreaming. See Dreaming./pair [qr|status|pending|approve|cleanup|notify] manages device pairing/setup flow. See Pairing./phone status|arm <camera|screen|writes|all> [duration]|disarm temporarily arms high-risk phone node commands./voice status|list [limit]|set <voiceId|name> manages Talk voice config. On Discord, the native command name is /talkvoice./card ... sends LINE rich card presets. See LINE./codex status|models|threads|resume|compact|review|diagnostics|account|mcp|skills inspects and controls the bundled Codex app-server harness. See Codex harness./bot-ping/bot-version/bot-help/bot-upgrade/bot-logsUser-invocable skills are also exposed as slash commands:
/skill <name> [input] always works as the generic entrypoint./prose when the skill/plugin registers them.commands.nativeSkills and channels.<provider>.commands.nativeSkills.descriptionLocalizations for native surfaces that support localized descriptions, including Discord./tools/tools answers a runtime question, not a config question: what this agent can use right now in this conversation.
/tools is compact and optimized for quick scanning./tools verbose adds short descriptions.compact|verbose./tools includes tools that are actually reachable at runtime, including core tools, connected plugin tools, and channel-owned tools.For profile and override editing, use the Control UI Tools panel or config/catalog surfaces instead of treating /tools as a static catalog.
/status for the current model provider when usage tracking is enabled. OpenClaw normalizes provider windows to % left; for MiniMax, remaining-only percent fields are inverted before display, and model_remains responses prefer the chat-model entry plus a model-tagged plan label./status can fall back to the latest transcript usage entry when the live session snapshot is sparse. Existing nonzero live values still win, and transcript fallback can also recover the active runtime model label plus a larger prompt-oriented total when stored totals are missing or smaller./status reports Execution for the effective sandbox path and Runtime for who is actually running the session: OpenClaw Pi Default, OpenAI Codex, a CLI backend, or an ACP backend./usage off|tokens|full (appended to normal replies)./model status is about models/auth/endpoints, not usage./model)/model is implemented as a directive.
Examples:
/model
/model list
/model 3
/model openai/gpt-5.4
/model opus@anthropic:default
/model status
Notes:
/model and /model list show a compact, numbered picker (model family + available providers)./model and /models open an interactive picker with provider and model dropdowns plus a Submit step./model <#> selects from that picker (and prefers the current provider when possible)./model status shows the detailed view, including configured provider endpoint (baseUrl) and API mode (api) when available./debug lets you set runtime-only config overrides (memory, not disk). Owner-only. Disabled by default; enable with commands.debug: true.
Examples:
/debug show
/debug set messages.responsePrefix="[openclaw]"
/debug set channels.whatsapp.allowFrom=["+1555","+4477"]
/debug unset messages.responsePrefix
/debug reset
/trace lets you toggle session-scoped plugin trace/debug lines without turning on full verbose mode.
Examples:
/trace
/trace on
/trace off
Notes:
/trace with no argument shows the current session trace state./trace on enables plugin trace lines for the current session./trace off disables them again./status and as a follow-up diagnostic message after the normal assistant reply./trace does not replace /debug; /debug still manages runtime-only config overrides./trace does not replace /verbose; normal verbose tool/status output still belongs to /verbose./config writes to your on-disk config (openclaw.json). Owner-only. Disabled by default; enable with commands.config: true.
Examples:
/config show
/config show messages.responsePrefix
/config get messages.responsePrefix
/config set messages.responsePrefix="[openclaw]"
/config unset messages.responsePrefix
/mcp writes OpenClaw-managed MCP server definitions under mcp.servers. Owner-only. Disabled by default; enable with commands.mcp: true.
Examples:
/mcp show
/mcp show context7
/mcp set context7={"command":"uvx","args":["context7-mcp"]}
/mcp unset context7
/plugins lets operators inspect discovered plugins and toggle enablement in config. Read-only flows can use /plugin as an alias. Disabled by default; enable with commands.plugins: true.
Examples:
/plugins
/plugins list
/plugin show context7
/plugins enable context7
/plugins disable context7
Slack native exception: register `/agentstatus` (not `/status`) because Slack reserves `/status`. Text `/status` still works in Slack messages.
/btw is a quick side question about the current session. /side is an alias.
Unlike normal chat:
That makes /btw useful when you want a temporary clarification while the main task keeps going.
Example:
/btw what are we doing right now?
/side what changed while the main run continued?
See BTW Side Questions for the full behavior and client UX details.