> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fased.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 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**: `/think`, `/verbose`, `/reasoning`, `/elevated`, `/exec`,
  `/model`, `/queue`.
  * Directives are stripped from the message before the model sees it.
  * In normal chat messages, they are treated as inline hints and do **not**
    persist session settings.
  * In directive-only messages, 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.

There are also a few **inline shortcuts** for allowlisted/authorized senders:
`/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

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  commands: {
    native: "auto",
    nativeSkills: "auto",
    text: true,
    bash: false,
    bashForegroundMs: 2000,
    config: false,
    debug: false,
    restart: false,
    allowFrom: {
      "*": ["user1"],
      discord: ["user:123"],
    },
    useAccessGroups: true,
  },
}
```

* `commands.text` (default `true`) enables parsing `/...` in chat messages.
  * On surfaces without native commands, text commands still work even if you
    set this to `false`: WhatsApp, WebChat, Signal, iMessage, Google Chat, and
    Microsoft Teams.
* `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.
  * Override per provider with `channels.discord.commands.native`,
    `channels.telegram.commands.native`, or `channels.slack.commands.native`.
    Values are boolean or `"auto"`.
  * `false` clears previously registered commands on Discord/Telegram at
    startup. Slack commands are managed in the Slack app and are not removed
    automatically.
* `commands.nativeSkills` (default `"auto"`) registers **skill** commands natively when supported.
  * Auto: on for Discord/Telegram; off for Slack (Slack requires creating a slash command per skill).
  * Override per provider with `channels.discord.commands.nativeSkills`,
    `channels.telegram.commands.nativeSkills`, or
    `channels.slack.commands.nativeSkills`. Values are boolean or `"auto"`.
* `commands.bash` (default `false`) enables `! <cmd>` to run host shell
  commands. `/bash <cmd>` is an alias and requires `tools.elevated` allowlists.
* `commands.bashForegroundMs` (default `2000`) controls how long bash waits
  before switching to background mode. `0` backgrounds immediately.
* `commands.config` (default `false`) enables `/config` (reads/writes `~/.fased/fased.json`).
* `commands.debug` (default `false`) 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 and
  `commands.useAccessGroups` are ignored.
* Use `"*"` for a global default; provider-specific keys override it.
* `commands.useAccessGroups` (default `true`) enforces allowlists/policies for
  commands when `commands.allowFrom` is not set.

## Command list

Text + native (when enabled):

* `/help`
* `/commands`
* `/skill <name> [input]` (run a skill by name)
* `/status` (show current status; includes provider usage/quota for the current model provider when available)
* `/allowlist` (list/add/remove allowlist entries)
* `/approve <id> allow-once|allow-always|deny` (resolve exec approval prompts)
* `/context [list|detail|json]` (explain “context”; `detail` shows per-file + per-tool + per-skill + system prompt size)
* `/export-session [path]` (alias: `/export`) (export current session to HTML with full system prompt)
* `/whoami` (show your sender id; alias: `/id`)
* `/agent list|current|switch <agent>` (show or change the Agent route for this channel chat)
* `/session list|new|switch|current` (create and move between named sessions for this channel chat)
* `/session idle <duration|off>` (manage inactivity auto-unfocus for focused thread bindings)
* `/session max-age <duration|off>` (manage hard max-age auto-unfocus for focused thread bindings)
* `/task new every <duration> [<name>:] <prompt>` creates a scheduled task for
  the current Agent/session.
  * Natural examples:
    * `/task new every 10 minutes Check provider health and send here.`
    * `/task new check docs updates hourly`
    * `/task new every 30m Service pulse: summarize gateway health.`
    * `/task new remind me every Friday to review open tasks.`
  * Common policy flags:
    * `--objective <text>`, `--success <text>`
    * `--mode agent-turn|skill-only|no-model|auto`
    * `--memory none|session-summary|pinned|search|agent`
    * `--skills wallet,search`, `--tool <name>`, `--input <json>`
    * `--model <provider/model>`, `--escalate <provider/model>`
    * `--max-tokens <n>`, `--max-cost <usd>`, `--max-runs-hour <n>`
    * `--stop-on-success`, `--stop-text done,complete`
    * `--max-successes <n>`, `--max-total-runs <n>`
    * `--auto-repair true|false`, `--auto-stop-optional true|false`
    * `--max-auto-repairs <n>`, `--primary-source-approval true|false`
* `/task edit <id> ...` edits schedule, prompt/name, delivery, objective,
  success, model, memory, skill, budget, and stop policy for a scheduled task.
  * Natural examples:
    * `/task edit <id> every 30m`
    * `/task edit <id> send here`
    * `/task edit <id> use cheap check`
    * `/task edit <id> use no model`
    * `/task edit <id> escalate to openrouter/z-ai/glm-5.1`
    * `/task edit <id> stop after success`
* `/task list|show <id>|runs <id>|last <id>|run-show <runId>|run <id>|pause <id>|resume <id>|cancel <id>`
  inspects, force-runs, pauses, resumes, or cancels scheduled tasks for the
  current Agent/session.
* `/task cancel-run <runId>|retry-run <runId>|clear-stale <runId>` controls one
  queued task run. These use run ids from `/task runs` or `/task last`, not task
  ids.
  * `/task list` shows plan, delivery, next run, and last result.
  * `/task show <id>` shows full task policy, delivery target, run counters, and evaluator state.
  * `/task runs <id>` lists recent runs with status, result source, delivery, duration, and summary/error.
  * `/task last <id>` expands the newest run with source, adapter/model,
    delivery, usage, evaluator, session key, and `/chat?session=...` transcript
    path.
  * `/task run-show <runId>` expands one queue run with checkpoint steps,
    attempt counts, lease owner/expiry, source/adapter/model, delivery,
    recommended recovery actions, and transcript path.
  * `/task resume <id>` re-runs task preflight. If access is still missing, it stays blocked and replies with the setup target.
  * `/task repair <id> configure|add-source|retry|stop-source` mirrors the Agent > Tasks and run-detail source recovery buttons.
  * `fased task sources list|add|show|enable|disable|forget` manages trusted
    source memory used by task repair and future source planning.
* `/subagents list|kill|log|info|send|steer|spawn` inspects, controls, or spawns
  sub-agent runs for the current session.
* `/acp spawn|cancel|steer|close|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|sessions`
  inspects and controls ACP runtime sessions.
* `/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>` steers a running sub-agent immediately. It uses
  in-run steering when possible; otherwise it aborts current work and restarts
  on the steer message.
* `/tell <id|#> <message>` (alias for `/steer`)
* `/config show|get|set|unset` (persist config to disk, owner-only; requires `commands.config: true`)
* `/debug show|set|unset|reset` (runtime overrides, owner-only; requires `commands.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](/tools/tts))
  * Discord: native command is `/voice` (Discord reserves `/tts`); text `/tts` still works.
* `/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)
* `/reset` or `/new [model]` (optional model hint; remainder is passed through)
* `/think <off|minimal|low|medium|high|xhigh>` (dynamic choices by model/provider; aliases: `/thinking`, `/t`)
* `/verbose on|full|off` (alias: `/v`)
* `/reasoning on|off|stream` (alias: `/reason`) sends a separate message
  prefixed `Reasoning:` when on. `stream` means Telegram draft only.
* `/elevated on|off|ask|full` (alias: `/elev`; `full` skips exec approvals)
* `/exec host=<sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>`
  sets exec routing defaults. Send `/exec` to show current settings.
* `/model <name>` (alias: `/models`; or `/<alias>` from `agents.defaults.models.*.alias`)
* `/queue <mode>` (plus options like `debounce:2s cap:25 drop:summarize`; send `/queue` to see current settings)
* `/bash <command>` (host-only; alias for `! <command>`; requires `commands.bash: true` + `tools.elevated` allowlists)

Text-only:

* `/compact [instructions]` (see [/concepts/compaction](/concepts/compaction))
* `! <command>` (host-only; one at a time; use `!poll` + `!stop` for long-running jobs)
* `!poll` (check output / status; accepts optional `sessionId`; `/bash poll` also works)
* `!stop` (stop the running bash job; accepts optional `sessionId`; `/bash stop` also works)

Notes:

* Commands accept an optional `:` between the command and args (e.g. `/think: high`, `/send: on`, `/help:`).
* `/new <model>` accepts a model alias, `provider/model`, or a provider name
  with fuzzy match. If no match is found, the text is treated as the message
  body.
* For full provider usage breakdown, use `fased status --usage`.
* `/allowlist add|remove` requires `commands.config=true` and honors channel `configWrites`.
* `/usage` controls the per-response usage footer; `/usage cost` prints a local cost summary from Fased session logs.
* `/restart` is enabled by default; set `commands.restart: false` to disable it.
* Discord-only native command: `/vc join|leave|status` controls voice channels.
  Requires `channels.discord.voice` and native commands; not available as text.
* Discord thread-binding commands require effective thread bindings to be
  enabled: `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`.
  Use `session.threadBindings.enabled` and/or
  `channels.discord.threadBindings.enabled`.
* ACP command reference and runtime behavior: [ACP Agents](/tools/acp-agents).
* `/verbose` is meant for debugging and extra visibility; keep it **off** in normal use.
* Tool failure summaries are still shown when relevant. Detailed failure text is
  only included when `/verbose` is `on` or `full`.
* `/reasoning` and `/verbose` are risky in group settings: they may reveal
  internal reasoning or tool output you did not intend to expose. Prefer leaving
  them off, especially in group chats.
* **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 /status` triggers a status reply, and the remaining text continues through the normal flow.
* Currently: `/help`, `/commands`, `/status`, `/whoami` (`/id`).
* Unauthorized command-only messages are silently ignored, and inline `/...` tokens are treated as plain text.
* **Skill commands:** `user-invocable` skills are exposed as slash commands.
  Names are sanitized to `a-z0-9_` with max 32 chars; collisions get numeric
  suffixes such as `_2`.
  * `/skill <name> [input]` runs a skill by name (useful when native command limits prevent per-skill commands).
  * By default, skill commands are forwarded to the model as a normal request.
  * Skills may optionally declare `command-dispatch: tool` to route the command directly to a tool (deterministic, no model).
  * Example: `/prose` (OpenProse plugin) — see [OpenProse](/plugins/open-prose).
* **Native command arguments:** Discord uses autocomplete for dynamic options and
  button menus when required args are omitted. 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 `/status`
  for the current model provider when usage tracking is enabled.
* **Per-response tokens/cost** is controlled by `/usage off|tokens|full` (appended to normal replies).
* `/model status` is about **models/auth/endpoints**, not usage.

## Model selection (`/model`)

`/model` is implemented as a directive.

Examples:

```
/model
/model list
/model 3
/model provider/model
/model opus@anthropic:default
/model status
```

Notes:

* `/model` and `/model list` show a compact, numbered picker (model family + available providers).
* On Discord, `/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 overrides

`/debug` lets you set **runtime-only** config overrides. They live in memory,
not on disk. Owner-only. Disabled by default; enable with
`commands.debug: true`.

Examples:

```
/debug show
/debug set messages.responsePrefix="[fased]"
/debug set channels.whatsapp.allowFrom=["+1555","+4477"]
/debug unset messages.responsePrefix
/debug reset
```

Notes:

* Overrides apply immediately to new config reads, but do **not** write to `~/.fased/fased.json`.
* Use `/debug reset` to clear all overrides and return to the on-disk config.

## Config updates

`/config` writes to your on-disk config (`~/.fased/fased.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="[fased]"
/config unset messages.responsePrefix
```

Notes:

* Config is validated before write; invalid changes are rejected.
* `/config` updates 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 via `channels.slack.slashCommand.sessionPrefix`)
  * Telegram: `telegram:slash:<userId>` (targets the chat session via `CommandTargetSessionKey`)
* **`/stop`** targets the active chat session so it can abort the current run.
* **Slack:** `channels.slack.slashCommand` is still supported for a single
  `/fased`-style command. If you enable `commands.native`, create one Slack
  slash command per built-in command using the same names as `/help`.
  Command argument menus are delivered as ephemeral Block Kit buttons.
  * Slack native exception: register `/agentstatus`, not `/status`, because
    Slack reserves `/status`. Text `/status` still works in Slack messages.
