Major changes: - Config-driven adapters: all channels (Slack, Discord, Telegram, WebChat, Webhooks) controlled via config.json with enabled flags and token auto-detection, no CLI flags required - Runtime engine field: runtime.engine selects opencode/claude from config - Interactive install script: 8-phase setup wizard with AI runtime detection/installation, token setup, identity file personalization (personality presets), aetheel CLI command, background service (launchd/systemd) - Live runtime switching: /engine, /model, /provider commands hot-swap the AI runtime from chat without restart, changes persisted to config.json - Usage tracking: per-request cost extraction from Claude Code JSON output, cumulative stats via /usage command - Auto-failover: rate limit detection on both runtimes, automatic switch to other engine on quota errors with user notification - Chat commands work without / prefix (Slack intercepts / in channels), commands: engine, model, provider, config, usage, reload, cron, subagents, status, help - /config set for editing config.json from chat with dotted key notation - Security audit saved to docs/security-audit.md - Full command reference in docs/commands.md - Future changes doc with NanoClaw agent teams analysis - Logo added to README and WebChat UI - README fully rewritten with all features documented
178 lines
5.8 KiB
Markdown
178 lines
5.8 KiB
Markdown
# Aetheel Commands Reference
|
|
|
|
All commands work across every adapter (Slack, Discord, Telegram, WebChat).
|
|
|
|
## Chat Commands
|
|
|
|
Type these as regular messages in any channel or DM. No `/` prefix needed — just send the word as a message. The `/` prefix also works in DMs and on platforms that don't intercept it (Discord, Telegram, WebChat).
|
|
|
|
> In Slack channels, Slack intercepts `/` as a native slash command and blocks it. Use the prefix-free form instead (e.g. `engine claude` not `/engine claude`). In Slack DMs with the bot, both forms work.
|
|
|
|
### General
|
|
|
|
| Command | Description |
|
|
|---|---|
|
|
| `status` | Show bot status, engine, model, sessions |
|
|
| `help` | Show all available commands |
|
|
| `time` | Current server time |
|
|
| `sessions` | Active session count + cleanup stale |
|
|
| `reload` | Reload config.json and skills |
|
|
| `subagents` | List active background tasks |
|
|
|
|
### Runtime Switching (live, no restart needed)
|
|
|
|
| Command | Description |
|
|
|---|---|
|
|
| `engine` | Show current engine (opencode/claude) |
|
|
| `engine opencode` | Switch to OpenCode runtime |
|
|
| `engine claude` | Switch to Claude Code runtime |
|
|
| `model` | Show current model |
|
|
| `model <name>` | Switch model (e.g. `model anthropic/claude-sonnet-4-20250514`) |
|
|
| `provider` | Show current provider (OpenCode only) |
|
|
| `provider <name>` | Switch provider (e.g. `provider anthropic`, `provider openai`) |
|
|
| `usage` | Show LLM usage stats, costs, and rate limit history |
|
|
|
|
Engine, model, and provider changes take effect immediately and are persisted to `config.json` so they survive restarts.
|
|
|
|
#### Examples
|
|
|
|
```
|
|
engine claude
|
|
model claude-sonnet-4-20250514
|
|
|
|
engine opencode
|
|
model anthropic/claude-sonnet-4-20250514
|
|
provider anthropic
|
|
|
|
model openai/gpt-4o
|
|
provider openai
|
|
|
|
model google/gemini-2.5-pro
|
|
provider google
|
|
```
|
|
|
|
### Configuration
|
|
|
|
| Command | Description |
|
|
|---|---|
|
|
| `config` | Show config summary (engine, model, adapters) |
|
|
| `config show` | Dump full config.json |
|
|
| `config set <key> <value>` | Edit a config value (dotted notation) |
|
|
|
|
#### Config Set Examples
|
|
|
|
```
|
|
config set runtime.timeout_seconds 300
|
|
config set claude.max_turns 5
|
|
config set webchat.enabled true
|
|
config set discord.enabled true
|
|
config set webhooks.token my-secret-token
|
|
config set heartbeat.silent true
|
|
```
|
|
|
|
After `config set`, run `reload` to apply changes that don't auto-apply (adapter changes require a restart).
|
|
|
|
### Scheduler
|
|
|
|
| Command | Description |
|
|
|---|---|
|
|
| `cron list` | List all scheduled jobs |
|
|
| `cron remove <id>` | Remove a scheduled job by ID |
|
|
|
|
### AI Chat
|
|
|
|
Any message that isn't a command is sent to the AI. The AI can also trigger actions by including tags in its response:
|
|
|
|
| AI Action Tag | What It Does |
|
|
|---|---|
|
|
| `[ACTION:remind\|<minutes>\|<message>]` | Schedule a one-shot reminder |
|
|
| `[ACTION:cron\|<cron_expr>\|<prompt>]` | Schedule a recurring cron job |
|
|
| `[ACTION:spawn\|<task>]` | Spawn a background subagent |
|
|
|
|
---
|
|
|
|
## Terminal Commands
|
|
|
|
After installation, the `aetheel` command is available in your shell.
|
|
|
|
### Service Management
|
|
|
|
| Command | Description |
|
|
|---|---|
|
|
| `aetheel start` | Start Aetheel in the foreground |
|
|
| `aetheel stop` | Stop the background service |
|
|
| `aetheel restart` | Restart the background service |
|
|
| `aetheel status` | Show install and service status |
|
|
| `aetheel logs` | Tail the live log file |
|
|
|
|
### Setup & Maintenance
|
|
|
|
| Command | Description |
|
|
|---|---|
|
|
| `aetheel setup` | Re-run the interactive setup wizard |
|
|
| `aetheel update` | Pull latest code + update dependencies |
|
|
| `aetheel doctor` | Run diagnostics (config, tokens, runtimes) |
|
|
| `aetheel config` | Open config.json in your `$EDITOR` |
|
|
|
|
### Pass-Through
|
|
|
|
Any other arguments are passed directly to `main.py`:
|
|
|
|
```bash
|
|
aetheel --test # Echo mode, no AI
|
|
aetheel --claude # Override: use Claude engine
|
|
aetheel --model gpt-4o # Override: specific model
|
|
aetheel --log DEBUG # Override: debug logging
|
|
```
|
|
|
|
These flags are optional overrides. All settings come from `~/.aetheel/config.json` by default.
|
|
|
|
---
|
|
|
|
## Config File Reference
|
|
|
|
All features are controlled by `~/.aetheel/config.json`. No flags required.
|
|
|
|
```jsonc
|
|
{
|
|
"runtime": {
|
|
"engine": "opencode", // "opencode" or "claude"
|
|
"mode": "cli", // "cli" or "sdk"
|
|
"model": null, // e.g. "anthropic/claude-sonnet-4-20250514"
|
|
"provider": null, // e.g. "anthropic", "openai", "google"
|
|
"timeout_seconds": 120
|
|
},
|
|
"claude": {
|
|
"model": null, // e.g. "claude-sonnet-4-20250514"
|
|
"max_turns": 3,
|
|
"no_tools": false
|
|
},
|
|
"slack": { "enabled": true },
|
|
"telegram": { "enabled": false },
|
|
"discord": { "enabled": false, "listen_channels": [] },
|
|
"webchat": { "enabled": false, "port": 8080 },
|
|
"webhooks": { "enabled": false, "port": 8090, "token": "" },
|
|
"heartbeat": { "enabled": true },
|
|
"hooks": { "enabled": true }
|
|
}
|
|
```
|
|
|
|
Adapters auto-enable when their token is set in `.env`, even if `enabled` is `false` in config.
|
|
|
|
---
|
|
|
|
## Auto-Failover & Rate Limit Handling
|
|
|
|
When a rate limit or quota error is detected from the active engine:
|
|
|
|
1. Aetheel notifies you in the channel with the error details
|
|
2. Automatically attempts to failover to the other engine (claude → opencode or vice versa)
|
|
3. If failover succeeds, the response is delivered and the active engine is switched
|
|
4. If failover also fails, both errors are reported
|
|
|
|
Rate limit detection covers: HTTP 429, "rate limit", "quota exceeded", "too many requests", "usage limit", "credit balance", "overloaded", and similar patterns from both Claude Code and OpenCode.
|
|
|
|
Use `usage` to see cumulative stats including rate limit hits and failover count.
|
|
|
|
Note: Claude Code's `--output-format json` returns `cost_usd` per request. OpenCode does not currently expose per-request cost in its CLI output, so cost tracking is only available for the Claude engine.
|