Slash Commands
Slash commands
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).
There are two related systems:
- Commands: standalone
/...messages. - Directives:
/verbose,/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.allowFromis set, it is the only allowlist used; otherwise authorization comes from channel allowlists/pairing pluscommands.useAccessGroups. Unauthorized senders see directives treated as plain text.
There are also a few inline shortcuts (allowlisted/authorized senders only): /help, /commands, /status, /whoami (/id).
They run immediately, are stripped before the model sees the message, and the remaining text continues through the normal flow.
Config
{ commands: { native: "auto",
text: true, bash: false, bashForegroundMs: 2000, config: false, debug: false, restart: false, allowFrom: { "*": ["user1"], discord: ["user:123"], }, useAccessGroups: true, },}-
commands.text(defaulttrue) enables parsing/...in chat messages.- On surfaces without native commands (WhatsApp/WebChat/Signal/iMessage/Google Chat/MS Teams), text commands still work even if you set this to
false.
- On surfaces without native commands (WhatsApp/WebChat/Signal/iMessage/Google Chat/MS Teams), text commands still work even if you set this to
-
commands.native(default"auto") registers native commands.- Auto: on for Discord/Telegram; off for Slack (until you add slash commands); ignored for providers without native support.
- Set
channels.discord.commands.native,channels.telegram.commands.native, orchannels.slack.commands.nativeto override per provider (bool or"auto"). falseclears previously registered commands on Discord/Telegram at startup. Slack commands are managed in the Slack app and are not removed automatically.
-
commands.bash(defaultfalse) enables! <cmd>to run host shell commands (/bash <cmd>is an alias; requirestools.elevatedallowlists). -
commands.bashForegroundMs(default2000) controls how long bash waits before switching to background mode (0backgrounds immediately). -
commands.config(defaultfalse) enables/config(reads/writesremoteclaw.json). -
commands.debug(defaultfalse) enables/debug(runtime-only overrides). -
commands.allowFrom(optional) sets a per-provider allowlist for command authorization. When configured, it is the only authorization source for commands and directives (channel allowlists/pairing andcommands.useAccessGroupsare ignored). Use"*"for a global default; provider-specific keys override it. -
commands.useAccessGroups(defaulttrue) enforces allowlists/policies for commands whencommands.allowFromis not set.
Command list
Text + native (when enabled):
/help/commands/remoteclaw(show RemoteClaw middleware status)/status(show current status; includes provider usage/quota for the current model provider when available)/allowlist(list/add/remove allowlist entries)/export-session [path](alias:/export) (export current session to HTML)/whoami(show your sender id; alias:/id)/session ttl <duration|off>(manage session-level settings, such as TTL)/subagents list|kill|log|info|send|steer|spawn(inspect, control, or spawn sub-agent runs for the current session)/agents(list thread-bound agents for this session)/focus <target>(Discord: bind this thread, or a new thread, to a session/subagent target)/unfocus(Discord: remove the current thread binding)/kill <id|#|all>(immediately abort one or all running sub-agents for this session; no confirmation message)/steer <id|#> <message>(steer a running sub-agent immediately: in-run when possible, otherwise abort current work and restart on the steer message)/tell <id|#> <message>(alias for/steer)/config show|get|set|unset(persist config to disk, owner-only; requirescommands.config: true)/debug show|set|unset|reset(runtime overrides, owner-only; requirescommands.debug: true)/usage off|tokens|full|cost(per-response usage footer or local cost summary)/tts off|always|inbound|tagged|status|provider|limit|summary|audio(control TTS; see /tts)- Discord: native command is
/voice(Discord reserves/tts); text/ttsstill works.
- Discord: native command is
/stop/restart/dock-telegram(alias:/dock_telegram) (switch replies to Telegram)/dock-discord(alias:/dock_discord) (switch replies to Discord)/dock-slack(alias:/dock_slack) (switch replies to Slack)/activation mention|always(groups only)/send on|off|inherit(owner-only)/resetor/new(remainder is passed through)/verbose on|full|off(alias:/v)/queue <mode>(plus options likedebounce:2s cap:25 drop:summarize; send/queueto see current settings)
Text-only:
! <command>(host-only; one at a time; use!poll+!stopfor long-running jobs)!poll(check output / status; accepts optionalsessionId;/bash pollalso works)!stop(stop the running bash job; accepts optionalsessionId;/bash stopalso works)
Notes:
- Commands accept an optional
:between the command and args (e.g./send: on,/help:). /allowlist add|removerequirescommands.config=trueand honors channelconfigWrites./usagecontrols the per-response usage footer;/usage costprints a local cost summary from session logs./restartis enabled by default; setcommands.restart: falseto disable it.- Discord-only native command:
/vc join|leave|statuscontrols voice channels (requireschannels.discord.voiceand native commands; not available as text). - Discord thread-binding commands (
/focus,/unfocus,/agents,/session ttl) require effective thread bindings to be enabled (session.threadBindings.enabledand/orchannels.discord.threadBindings.enabled). /verboseis meant for debugging and extra visibility; keep it off in normal use.- Tool failure summaries are still shown when relevant, but detailed failure text is only included when
/verboseisonorfull. - Fast path: command-only messages from allowlisted senders are handled immediately (bypass queue + model).
- Group mention gating: command-only messages from allowlisted senders bypass mention requirements.
- Inline shortcuts (allowlisted senders only): certain commands also work when embedded in a normal message and are stripped before the model sees the remaining text.
- Example:
hey /statustriggers a status reply, and the remaining text continues through the normal flow.
- Example:
- Currently:
/help,/commands,/status,/whoami(/id). - Unauthorized command-only messages are silently ignored, and inline
/...tokens are treated as plain text. - Native command arguments: Discord uses autocomplete for dynamic options (and button menus when you omit required args). Telegram and Slack show a button menu when a command supports choices and you omit the arg.
Usage surfaces (what shows where)
- Provider usage/quota (example: “Claude 80% left”) shows up in
/statusfor the current model provider when usage tracking is enabled. - Per-response tokens/cost is controlled by
/usage off|tokens|full(appended to normal replies).
Debug overrides
/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="[remoteclaw]"/debug set channels.whatsapp.allowFrom=["+1555","+4477"]/debug unset messages.responsePrefix/debug resetNotes:
- Overrides apply immediately to new config reads, but do not write to
remoteclaw.json. - Use
/debug resetto clear all overrides and return to the on-disk config.
Config updates
/config writes to your on-disk config (remoteclaw.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="[remoteclaw]"/config unset messages.responsePrefixNotes:
- Config is validated before write; invalid changes are rejected.
/configupdates persist across restarts.
Surface notes
- Text commands run in the normal chat session (DMs share
main, groups have their own session). - Native commands use isolated sessions:
- Discord:
agent:<agentId>:discord:slash:<userId> - Slack:
agent:<agentId>:slack:slash:<userId>(prefix configurable viachannels.slack.slashCommand.sessionPrefix) - Telegram:
telegram:slash:<userId>(targets the chat session viaCommandTargetSessionKey)
- Discord:
/stoptargets the active chat session so it can abort the current run.- Slack:
channels.slack.slashCommandis still supported for a single/remoteclaw-style command. If you enablecommands.native, you must create one Slack slash command per built-in command (same names as/help). Command argument menus for Slack are delivered as ephemeral Block Kit buttons.