Skip to content

Operator Commands

The agent exposes its operational surface as Telegram slash commands. This page is the single reference for what each command does, who can run it, and which underlying surface it inspects. The Telegram bot also publishes a native command menu via setMyCommands — start typing / in any chat for the live in-app list.

Three layers gate the commands. A command may pass through one, two, or all three:

GateWhereEffect
requireAdminPer-handlerOnly operators on the admin allow-list run it
requireOpsChatPer-handler (write/destructive only)Only the configured ops chat may invoke it
Per-chat overridesgroup.jailConfig (registered groups)Per-chat model/provider overrides

Read-only commands (/status, /disk, /report, /testreport, etc.) are admin-gated but not ops-chat-gated — admins can run them from any chat. Destructive commands (/budgetreset, /clearcooldown) require the ops chat.

CommandPurposeSurface
/pingConfirm the bot process is responsiveDirect reply
/chatidPrint the current chat’s JIDUseful for .env registration
/whoamiShow your Telegram identityConfirms admin-allowlist match
/statusCompact system summary (jails, ZFS pools, PF, budget)src/system-state.ts snapshot

All structured reports follow the same Observed / Interpretation / Operator Notes template. See Structured Reports for the design pattern.

CommandReportSource
/reportSystem & auth — services, jails, PF, controlplanehostd probes + probeControlplaneAuth()
/diskZFS pools and snapshotszpool list -H + zfs list -H -o name,usedsnap
/tasksControlplane task queuegetAllTasks() (Postgres)
/budgetreportToken budgets and burn analyticsgetAllBudgets() + getAgentTokenAnalytics()
/publishreportTenant publish/content stateloadTenantRegistry() + webroot inspection
/testreportBuild and test pass/failtmp/status/build-status.json + tmp/status/test-status.json

/testreport is fed by scripts/write-test-build-status.sh — see Structured Reports for the write/read contract.

CommandPurpose
/policyActive runtime policy (default model, overrides, cooldowns, budget state)
/budgetAlias for /policy
/usageToken budget per agent
/tokensRuntime token burn per agent (last-N analytics)
/modelSet provider/model for this chat (per-chat override)
/activationSet trigger mode (always-respond vs mention-only)
/ttsToggle voice replies (on / off / status)

/policy shows the Provider fallback cooldown line when one is active.

CommandPurpose
/newReset this chat’s session
/compactCompact the session (summarize old, keep recent)
/stopStop a running agent for this chat
/resumeResume a budget-paused chat
CommandPurpose
/budgetreset <id>Reset an agent’s token budget. all requires confirm second arg.
/clearcooldown [id]Clear a provider fallback cooldown
/auditPlatform ownership audit (which jail/dataset/service belongs to which)
/snapshots [dataset]List ZFS snapshots
/scrub <pool> [op]ZFS scrub controls (status / start / stop)
/updatesFreeBSD base + ports update status
/scheduleManage scheduled agent tasks (list / add / cancel / done)

The bot recognizes bot-addressed ops-flavored phrasings without requiring a slash command. Examples that route to structured reports instead of the LLM path:

PhraseRouted to
disk usage, how much disk/disk
task report, active tasks/tasks
budget report, how many tokens/budgetreport
are the tests passing, build status/testreport
system report, report please/report

This keeps memory or narrative recall from drifting into a stale answer when fresh structured data is available. The full pattern set lives in classifyReportIntent() in src/report-intent.ts.

A broader isOpsFlavored() matcher also suppresses memory injection on any ops-flavored prompt (services, jails, deploy, auth, controlplane terms), even when no specific report matches — so the LLM answers from live tools rather than narrative recall.

/help prints the in-bot command list. The list is generated from the same constants that drive the Telegram menu publication, so it reflects whatever is currently registered.